Merge remote-tracking branch 'origin/master' into HEAD
This commit is contained in:
commit
fe9b933b97
|
@ -1,77 +0,0 @@
|
||||||
// Default lump name for new map
|
|
||||||
defaultlumpname = "MAP01";
|
|
||||||
//GZDB specific. Don't try to load lumps that don't exist.
|
|
||||||
basegame = 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";
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Texture loading options
|
|
||||||
defaultwalltexture = "GFZROCK";
|
|
||||||
defaultfloortexture = "GFZFLR01";
|
|
||||||
defaultceilingtexture = "F_SKY1";
|
|
||||||
|
|
||||||
// Default texture sets
|
|
||||||
// (these are not required, but useful for new users)
|
|
||||||
texturesets
|
|
||||||
{
|
|
||||||
}
|
|
|
@ -1,309 +0,0 @@
|
||||||
common
|
|
||||||
{
|
|
||||||
// Some common settings
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Default testing parameters
|
|
||||||
testparameters = "-file \"%AP\" \"%F\" -warp %L";
|
|
||||||
testshortpaths = true;
|
|
||||||
|
|
||||||
// Action special help (mxd)
|
|
||||||
actionspecialhelp = "https://wiki.srb2.org/wiki/Linedef_type_%K";
|
|
||||||
|
|
||||||
// Default nodebuilder configurations
|
|
||||||
defaultsavecompiler = "zennode_normal";
|
|
||||||
defaulttestcompiler = "zennode_fast";
|
|
||||||
|
|
||||||
// Generalized actions
|
|
||||||
generalizedlinedefs = false;
|
|
||||||
generalizedsectors = true;
|
|
||||||
|
|
||||||
mixtexturesflats = true;
|
|
||||||
defaulttexturescale = 1.0f;
|
|
||||||
defaultflatscale = 1.0f;
|
|
||||||
scaledtextureoffsets = true;
|
|
||||||
|
|
||||||
// Thing number for start position in 3D Mode
|
|
||||||
start3dmode = 3328;
|
|
||||||
|
|
||||||
// Texture sources
|
|
||||||
textures
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "textures");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Patch sources
|
|
||||||
patches
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "patches");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sprite sources
|
|
||||||
sprites
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "sprites");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Flat sources
|
|
||||||
flats
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "flats");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mapformat_doom
|
|
||||||
{
|
|
||||||
// The format interface handles the map data format - DoomMapSetIO for SRB2DB2, SRB2MapSetIO for Zone Builder
|
|
||||||
formatinterface = "SRB2MapSetIO";
|
|
||||||
|
|
||||||
/*
|
|
||||||
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
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "doommaplumpnames");
|
|
||||||
}
|
|
||||||
|
|
||||||
// When this is set to true, sectors with the same tag will light up when a line is highlighted
|
|
||||||
linetagindicatesectors = true;
|
|
||||||
|
|
||||||
// Special linedefs
|
|
||||||
include("SRB222_misc.cfg", "speciallinedefs");
|
|
||||||
|
|
||||||
// Default flags for first new thing (As far as 2.2 goes, they're empty just like in 2.1)
|
|
||||||
defaultthingflags
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// DEFAULT SECTOR BRIGHTNESS LEVELS
|
|
||||||
sectorbrightness
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "sectorbrightness");
|
|
||||||
}
|
|
||||||
|
|
||||||
// SECTOR TYPES-----------------------------------------------------------------
|
|
||||||
sectortypes
|
|
||||||
{
|
|
||||||
include("SRB222_sectors.cfg", "sectortypes");
|
|
||||||
}
|
|
||||||
|
|
||||||
// GENERALISED SECTOR TYPES-----------------------------------------------------------------
|
|
||||||
gen_sectortypes
|
|
||||||
{
|
|
||||||
include("SRB222_sectors.cfg", "gen_sectortypes");
|
|
||||||
}
|
|
||||||
|
|
||||||
// LINEDEF FLAGS
|
|
||||||
linedefflags
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "linedefflags");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "linedefflagstranslation");
|
|
||||||
}
|
|
||||||
|
|
||||||
// LINEDEF ACTIVATIONS
|
|
||||||
linedefactivations
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// LINEDEF TYPES
|
|
||||||
linedeftypes
|
|
||||||
{
|
|
||||||
include("SRB222_linedefs.cfg", "doom");
|
|
||||||
}
|
|
||||||
|
|
||||||
// THING FLAGS
|
|
||||||
thingflags
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "thingflags");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "thingflagstranslation");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
mapformat_udmf
|
|
||||||
{
|
|
||||||
// The format interface handles the map data format
|
|
||||||
formatinterface = "UniversalMapSetIO";
|
|
||||||
|
|
||||||
// Enables support for long (> 8 chars) texture names
|
|
||||||
// WARNING: this should only be enabled for UDMF game configurations!
|
|
||||||
// WARNING: enabling this will make maps incompatible with Doom Builder 2 and can lead to problems in Slade 3!
|
|
||||||
longtexturenames = false;
|
|
||||||
|
|
||||||
// Default nodebuilder configurations
|
|
||||||
defaultsavecompiler = "zdbsp_udmf_normal";
|
|
||||||
defaulttestcompiler = "zdbsp_udmf_fast";
|
|
||||||
|
|
||||||
engine = "srb2"; // override that so that DB2 uses the correct namespace
|
|
||||||
|
|
||||||
maplumpnames
|
|
||||||
{
|
|
||||||
include("UDMF_misc.cfg", "udmfmaplumpnames_begin");
|
|
||||||
include("SRB222_misc.cfg", "udmfmaplumpnames");
|
|
||||||
include("UDMF_misc.cfg", "udmfmaplumpnames_end");
|
|
||||||
}
|
|
||||||
|
|
||||||
universalfields
|
|
||||||
{
|
|
||||||
// include("SRB222_misc.cfg", "universalfields");
|
|
||||||
}
|
|
||||||
|
|
||||||
// When this is set to true, sectors with the same tag will light up when a line is highlighted
|
|
||||||
linetagindicatesectors = false;
|
|
||||||
|
|
||||||
// Special linedefs
|
|
||||||
include("SRB222_misc.cfg", "speciallinedefs_udmf");
|
|
||||||
|
|
||||||
// Default flags for first new thing (As far as 2.2 goes, they're empty just like in 2.1)
|
|
||||||
defaultthingflags
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generalized actions
|
|
||||||
generalizedlinedefs = false;
|
|
||||||
|
|
||||||
// SECTOR FLAGS
|
|
||||||
sectorflags
|
|
||||||
{
|
|
||||||
// include("SRB222_misc.cfg", "sectorflags");
|
|
||||||
}
|
|
||||||
|
|
||||||
// DEFAULT SECTOR BRIGHTNESS LEVELS
|
|
||||||
sectorbrightness
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "sectorbrightness");
|
|
||||||
}
|
|
||||||
|
|
||||||
// SECTOR TYPES
|
|
||||||
sectortypes
|
|
||||||
{
|
|
||||||
include("SRB222_sectors.cfg", "sectortypes");
|
|
||||||
}
|
|
||||||
|
|
||||||
// SECTOR RENSERSTYLES
|
|
||||||
/* sectorrenderstyles
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "sectorrenderstyles");
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// LINEDEF FLAGS
|
|
||||||
linedefflags
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "linedefflags_udmf");
|
|
||||||
}
|
|
||||||
|
|
||||||
// LINEDEF ACTIVATIONS
|
|
||||||
linedefactivations
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "linedefactivations_udmf");
|
|
||||||
}
|
|
||||||
|
|
||||||
linedefflagstranslation
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// LINEDEF RENSERSTYLES
|
|
||||||
linedefrenderstyles
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "linedefrenderstyles");
|
|
||||||
}
|
|
||||||
|
|
||||||
//SIDEDEF FLAGS
|
|
||||||
/* sidedefflags
|
|
||||||
{
|
|
||||||
include("UDMF_misc.cfg", "sidedefflags");
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// THING FLAGS
|
|
||||||
thingflags
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "thingflags_udmf");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "thingflagstranslation");
|
|
||||||
}
|
|
||||||
|
|
||||||
// THING RENSERSTYLES
|
|
||||||
/* thingrenderstyles
|
|
||||||
{
|
|
||||||
include("SRB222_misc.cfg", "thingrenderstyles");
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// How to compare thing flags (for the stuck things error checker)
|
|
||||||
/* thingflagscompare
|
|
||||||
{
|
|
||||||
include("UDMF_misc.cfg", "thingflagscompare");
|
|
||||||
}*/
|
|
||||||
|
|
||||||
//mxd. 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
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// LINEDEF TYPES
|
|
||||||
linedeftypes
|
|
||||||
{
|
|
||||||
include("SRB222_linedefs.cfg", "udmf");
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,726 +0,0 @@
|
||||||
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 ACTIVATIONS
|
|
||||||
// Make sure these are in order from lowest value to highest value
|
|
||||||
linedefactivations
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 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 = "skewtd";
|
|
||||||
64 = "noclimb";
|
|
||||||
128 = "noskew";
|
|
||||||
256 = "midpeg";
|
|
||||||
512 = "midsolid";
|
|
||||||
1024 = "wrapmidtex";
|
|
||||||
2048 = "netonly";
|
|
||||||
4096 = "nonet";
|
|
||||||
8192 = "effect6";
|
|
||||||
16384 = "bouncy";
|
|
||||||
32768 = "transfer";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
linedefflags_udmf
|
|
||||||
{
|
|
||||||
blocking = "Impassable";
|
|
||||||
blockmonsters = "Block Enemies";
|
|
||||||
twosided = "Double-Sided";
|
|
||||||
dontpegtop = "Upper Unpegged";
|
|
||||||
dontpegbottom = "Lower Unpegged";
|
|
||||||
skewtd = "Slope Skew";
|
|
||||||
noclimb = "Not Climbable";
|
|
||||||
noskew = "No Midtexture Skew";
|
|
||||||
midpeg = "Peg Midtexture";
|
|
||||||
midsolid = "Solid Midtexture";
|
|
||||||
wrapmidtex = "Repeat Midtexture";
|
|
||||||
// netonly = "Netgame-Only special";
|
|
||||||
// nonet = "No netgame special";
|
|
||||||
// effect6 = "Effect 6";
|
|
||||||
bouncy = "Bouncy Wall";
|
|
||||||
// transfer = "Transfer Line";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
linedefactivations_udmf
|
|
||||||
{
|
|
||||||
notriggerorder = "Out of Order";
|
|
||||||
netonly = "Netgame-Only";
|
|
||||||
nonet = "No netgame";
|
|
||||||
}
|
|
||||||
|
|
||||||
sidedefflags
|
|
||||||
{
|
|
||||||
clipmidtex = "Clip middle texture";
|
|
||||||
wrapmidtex = "Wrap middle texture";
|
|
||||||
smoothlighting = "Smooth lighting";
|
|
||||||
nofakecontrast = "Even lighting";
|
|
||||||
nodecals = "No decals";
|
|
||||||
lightfog = "Use sidedef brightness on fogged walls";
|
|
||||||
}
|
|
||||||
|
|
||||||
//RENDER STYLES
|
|
||||||
thingrenderstyles
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
linedefrenderstyles
|
|
||||||
{
|
|
||||||
translucent = "Translucent";
|
|
||||||
fog = "Fog";
|
|
||||||
}
|
|
||||||
|
|
||||||
sectorrenderstyles
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
thingflags
|
|
||||||
{
|
|
||||||
1 = "[1] Extra";
|
|
||||||
2 = "[2] Flip";
|
|
||||||
4 = "[4] Special";
|
|
||||||
8 = "[8] Ambush";
|
|
||||||
}
|
|
||||||
|
|
||||||
// THING FLAGS
|
|
||||||
thingflags_udmf
|
|
||||||
{
|
|
||||||
extra = "Extra";
|
|
||||||
flip = "Flip";
|
|
||||||
special = "Special";
|
|
||||||
ambush = "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 = "extra";
|
|
||||||
2 = "flip";
|
|
||||||
4 = "special";
|
|
||||||
8 = "ambush";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
textures
|
|
||||||
{
|
|
||||||
zdoom1
|
|
||||||
{
|
|
||||||
start = "TX_START";
|
|
||||||
end = "TX_END";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
ADDITIONAL UNIVERSAL DOOM MAP FORMAT FIELD DEFINITIONS
|
|
||||||
Only add fields here that Doom Builder does not edit with its own user-interface!
|
|
||||||
The "default" field must match the UDMF specifications!
|
|
||||||
|
|
||||||
Field data types:
|
|
||||||
0 = integer *
|
|
||||||
1 = float
|
|
||||||
2 = string
|
|
||||||
3 = bool
|
|
||||||
4 = linedef action (integer) *
|
|
||||||
5 = sector effect (integer) *
|
|
||||||
6 = texture (string)
|
|
||||||
7 = flat (string)
|
|
||||||
8 = angle in degrees (integer)
|
|
||||||
9 = angle in radians (float)
|
|
||||||
10 = XXRRGGBB color (integer)
|
|
||||||
11 = enum option (integer) *
|
|
||||||
12 = enum bits (integer) *
|
|
||||||
13 = sector tag (integer) *
|
|
||||||
14 = thing tag (integer) *
|
|
||||||
15 = linedef tag (integer) *
|
|
||||||
16 = enum option (string)
|
|
||||||
17 = angle in degrees (float)
|
|
||||||
22 = byte angle (integer)
|
|
||||||
*/
|
|
||||||
universalfields
|
|
||||||
{
|
|
||||||
sector
|
|
||||||
{
|
|
||||||
friction
|
|
||||||
{
|
|
||||||
name = "Friction";
|
|
||||||
type = 1;
|
|
||||||
default = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
specialeffectplanes
|
|
||||||
{
|
|
||||||
type = 11;
|
|
||||||
enum = "floorceiling";
|
|
||||||
default = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
colormapbegin
|
|
||||||
{
|
|
||||||
type = 0;
|
|
||||||
default = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
colormapend
|
|
||||||
{
|
|
||||||
type = 0;
|
|
||||||
default = 33;
|
|
||||||
}
|
|
||||||
|
|
||||||
foglighting
|
|
||||||
{
|
|
||||||
type = 3;
|
|
||||||
default = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
teambase
|
|
||||||
{
|
|
||||||
type = 11;
|
|
||||||
enum = "ctfteam";
|
|
||||||
default = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
triggersector
|
|
||||||
{
|
|
||||||
type = 3;
|
|
||||||
default = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
triggerobject
|
|
||||||
{
|
|
||||||
type = 11;
|
|
||||||
enum = "triggerobjects";
|
|
||||||
default = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
triggersurface
|
|
||||||
{
|
|
||||||
type = 11;
|
|
||||||
enum = "triggersurfaces";
|
|
||||||
default = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ringdrain
|
|
||||||
{
|
|
||||||
type = 1;
|
|
||||||
default = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
linedef
|
|
||||||
{
|
|
||||||
executordelay
|
|
||||||
{
|
|
||||||
type = 0;
|
|
||||||
default = 0;
|
|
||||||
}
|
|
||||||
midtexrepetitions
|
|
||||||
{
|
|
||||||
type = 0;
|
|
||||||
default = 0;
|
|
||||||
}
|
|
||||||
arg5
|
|
||||||
{
|
|
||||||
type = 0;
|
|
||||||
default = 0;
|
|
||||||
}
|
|
||||||
arg1str
|
|
||||||
{
|
|
||||||
type = 2;
|
|
||||||
default = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
thing
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
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. (useful for lumps Doom Builder doesn't use)
|
|
||||||
nodebuild = The nodebuilder generates this lump.
|
|
||||||
allowempty = The nodebuilder is allowed to leave this lump empty.
|
|
||||||
scriptbuild = This lump is a text-based script, which should be compiled using current script compiler;
|
|
||||||
script = This lump is a text-based script. Specify the filename of the script configuration to use.
|
|
||||||
*/
|
|
||||||
|
|
||||||
doommaplumpnames
|
|
||||||
{
|
|
||||||
~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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
udmfmaplumpnames
|
|
||||||
{
|
|
||||||
ZNODES
|
|
||||||
{
|
|
||||||
required = false;
|
|
||||||
nodebuild = true;
|
|
||||||
allowempty = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
REJECT
|
|
||||||
{
|
|
||||||
required = false;
|
|
||||||
nodebuild = true;
|
|
||||||
allowempty = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
BLOCKMAP
|
|
||||||
{
|
|
||||||
required = false;
|
|
||||||
nodebuild = true;
|
|
||||||
allowempty = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ENUMERATIONS
|
|
||||||
// These are enumerated lists for linedef types and UDMF fields.
|
|
||||||
// Reserved names are: angledeg, anglerad, color, texture, flat
|
|
||||||
enums
|
|
||||||
{
|
|
||||||
falsetrue
|
|
||||||
{
|
|
||||||
0 = "False";
|
|
||||||
1 = "True";
|
|
||||||
}
|
|
||||||
|
|
||||||
yesno
|
|
||||||
{
|
|
||||||
0 = "Yes";
|
|
||||||
1 = "No";
|
|
||||||
}
|
|
||||||
|
|
||||||
noyes
|
|
||||||
{
|
|
||||||
0 = "No";
|
|
||||||
1 = "Yes";
|
|
||||||
}
|
|
||||||
|
|
||||||
onoff
|
|
||||||
{
|
|
||||||
0 = "On";
|
|
||||||
1 = "Off";
|
|
||||||
}
|
|
||||||
|
|
||||||
offon
|
|
||||||
{
|
|
||||||
0 = "Off";
|
|
||||||
1 = "On";
|
|
||||||
}
|
|
||||||
|
|
||||||
updown
|
|
||||||
{
|
|
||||||
0 = "Up";
|
|
||||||
1 = "Down";
|
|
||||||
}
|
|
||||||
|
|
||||||
downup
|
|
||||||
{
|
|
||||||
0 = "Down";
|
|
||||||
1 = "Up";
|
|
||||||
}
|
|
||||||
|
|
||||||
addset
|
|
||||||
{
|
|
||||||
0 = "Add";
|
|
||||||
1 = "Set";
|
|
||||||
}
|
|
||||||
|
|
||||||
floorceiling
|
|
||||||
{
|
|
||||||
0 = "Floor";
|
|
||||||
1 = "Ceiling";
|
|
||||||
2 = "Floor and ceiling";
|
|
||||||
}
|
|
||||||
|
|
||||||
triggertype
|
|
||||||
{
|
|
||||||
0 = "Continuous";
|
|
||||||
1 = "Each Time (Enter)";
|
|
||||||
2 = "Each Time (Enter and leave)";
|
|
||||||
3 = "Once";
|
|
||||||
}
|
|
||||||
|
|
||||||
frontback
|
|
||||||
{
|
|
||||||
0 = "None";
|
|
||||||
1 = "Front";
|
|
||||||
2 = "Back";
|
|
||||||
}
|
|
||||||
|
|
||||||
ctfteam
|
|
||||||
{
|
|
||||||
0 = "None";
|
|
||||||
1 = "Red";
|
|
||||||
2 = "Blue";
|
|
||||||
}
|
|
||||||
|
|
||||||
triggerobjects
|
|
||||||
{
|
|
||||||
0 = "Any player";
|
|
||||||
1 = "All players";
|
|
||||||
2 = "Pushable object";
|
|
||||||
3 = "Any object with thinker";
|
|
||||||
}
|
|
||||||
|
|
||||||
triggersurfaces
|
|
||||||
{
|
|
||||||
0 = "Floor touch";
|
|
||||||
1 = "Ceiling touch";
|
|
||||||
2 = "Floor or ceiling touch";
|
|
||||||
3 = "Anywhere in sector";
|
|
||||||
}
|
|
||||||
|
|
||||||
tangibility
|
|
||||||
{
|
|
||||||
1 = "Intangible from top";
|
|
||||||
2 = "Intangible from bottom";
|
|
||||||
4 = "Don't block players";
|
|
||||||
8 = "Don't block non-players";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
thingsfilters_udmf
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Special linedefs
|
|
||||||
speciallinedefs
|
|
||||||
{
|
|
||||||
soundlinedefflag = 64; // See linedefflags
|
|
||||||
singlesidedflag = 1; // See linedefflags
|
|
||||||
doublesidedflag = 4; // See linedefflags
|
|
||||||
impassableflag = 1;
|
|
||||||
upperunpeggedflag = 8;
|
|
||||||
lowerunpeggedflag = 16;
|
|
||||||
repeatmidtextureflag = 1024;
|
|
||||||
pegmidtextureflag = 256;
|
|
||||||
}
|
|
||||||
|
|
||||||
speciallinedefs_udmf
|
|
||||||
{
|
|
||||||
soundlinedefflag = "noclimb";
|
|
||||||
singlesidedflag = "blocking";
|
|
||||||
doublesidedflag = "twosided";
|
|
||||||
impassableflag = "blocking";
|
|
||||||
upperunpeggedflag = "dontpegtop";
|
|
||||||
lowerunpeggedflag = "dontpegbottom";
|
|
||||||
repeatmidtextureflag = "wrapmidtex";
|
|
||||||
pegmidtextureflag = "midpeg";
|
|
||||||
}
|
|
||||||
|
|
||||||
scriptlumpnames
|
|
||||||
{
|
|
||||||
MAINCFG
|
|
||||||
{
|
|
||||||
script = "SOC.cfg";
|
|
||||||
}
|
|
||||||
|
|
||||||
OBJCTCFG
|
|
||||||
{
|
|
||||||
script = "SOC.cfg";
|
|
||||||
}
|
|
||||||
|
|
||||||
SOC_
|
|
||||||
{
|
|
||||||
script = "SOC.cfg";
|
|
||||||
isprefix = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
LUA_
|
|
||||||
{
|
|
||||||
script = "Lua.cfg";
|
|
||||||
isprefix = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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";
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,109 +0,0 @@
|
||||||
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";
|
|
||||||
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)";
|
|
||||||
112 = "Trigger Line Ex. (NiGHTS Mare)";
|
|
||||||
128 = "Check for Linedef Executor on FOFs";
|
|
||||||
144 = "Egg Capsule";
|
|
||||||
160 = "Special Stage Time/Rings Parameters";
|
|
||||||
176 = "Custom Global Gravity";
|
|
||||||
512 = "Wind/Current";
|
|
||||||
1024 = "Conveyor Belt";
|
|
||||||
1280 = "Speed Pad";
|
|
||||||
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";
|
|
||||||
}
|
|
||||||
|
|
||||||
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";
|
|
||||||
}
|
|
||||||
|
|
||||||
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)";
|
|
||||||
112 = "Trigger Line Ex. (NiGHTS Mare)";
|
|
||||||
128 = "Check for Linedef Executor on FOFs";
|
|
||||||
144 = "Egg Capsule";
|
|
||||||
160 = "Special Stage Time/Rings Parameters";
|
|
||||||
176 = "Custom Global Gravity";
|
|
||||||
}
|
|
||||||
|
|
||||||
third
|
|
||||||
{
|
|
||||||
0 = "Normal";
|
|
||||||
512 = "Wind/Current";
|
|
||||||
1024 = "Conveyor Belt";
|
|
||||||
1280 = "Speed Pad";
|
|
||||||
}
|
|
||||||
|
|
||||||
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";
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
|
@ -435,7 +435,7 @@ sectortypes
|
||||||
112 = "Trigger Line Ex. (NiGHTS Mare)";
|
112 = "Trigger Line Ex. (NiGHTS Mare)";
|
||||||
128 = "Check for Linedef Executor on FOFs";
|
128 = "Check for Linedef Executor on FOFs";
|
||||||
144 = "Egg Capsule";
|
144 = "Egg Capsule";
|
||||||
160 = "Special Stage Time/Rings Parameters";
|
160 = "Special Stage Time/Spheres Parameters";
|
||||||
176 = "Custom Global Gravity";
|
176 = "Custom Global Gravity";
|
||||||
512 = "Wind/Current";
|
512 = "Wind/Current";
|
||||||
1024 = "Conveyor Belt";
|
1024 = "Conveyor Belt";
|
||||||
|
@ -490,7 +490,7 @@ gen_sectortypes
|
||||||
112 = "Trigger Line Ex. (NiGHTS Mare)";
|
112 = "Trigger Line Ex. (NiGHTS Mare)";
|
||||||
128 = "Check for Linedef Executor on FOFs";
|
128 = "Check for Linedef Executor on FOFs";
|
||||||
144 = "Egg Capsule";
|
144 = "Egg Capsule";
|
||||||
160 = "Special Stage Time/Rings Parameters";
|
160 = "Special Stage Time/Spheres Parameters";
|
||||||
176 = "Custom Global Gravity";
|
176 = "Custom Global Gravity";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -766,6 +766,7 @@ linedeftypes
|
||||||
{
|
{
|
||||||
title = "Parameters";
|
title = "Parameters";
|
||||||
prefix = "(22)";
|
prefix = "(22)";
|
||||||
|
flags32text = "[5] Render outer sides only";
|
||||||
flags64text = "[6] Trigger linedef executor";
|
flags64text = "[6] Trigger linedef executor";
|
||||||
flags128text = "[7] Intangible";
|
flags128text = "[7] Intangible";
|
||||||
flags256text = "[8] Stopped by pushables";
|
flags256text = "[8] Stopped by pushables";
|
||||||
|
@ -788,7 +789,6 @@ linedeftypes
|
||||||
{
|
{
|
||||||
title = "Angular Displacement by Front Sector";
|
title = "Angular Displacement by Front Sector";
|
||||||
prefix = "(32)";
|
prefix = "(32)";
|
||||||
flags8text = "[3] Set delay by backside sector";
|
|
||||||
flags64text = "[6] Don't turn players";
|
flags64text = "[6] Don't turn players";
|
||||||
flags512text = "[9] Turn all objects";
|
flags512text = "[9] Turn all objects";
|
||||||
}
|
}
|
||||||
|
@ -1136,7 +1136,6 @@ linedeftypes
|
||||||
{
|
{
|
||||||
title = "Goo Water, Translucent, No Sides";
|
title = "Goo Water, Translucent, No Sides";
|
||||||
prefix = "(125)";
|
prefix = "(125)";
|
||||||
flags8text = "[3] Slope skew sides";
|
|
||||||
flags64text = "[6] Use two light levels";
|
flags64text = "[6] Use two light levels";
|
||||||
flags512text = "[9] Use target light level";
|
flags512text = "[9] Use target light level";
|
||||||
flags1024text = "[10] Ripple effect";
|
flags1024text = "[10] Ripple effect";
|
||||||
|
@ -1227,6 +1226,18 @@ linedeftypes
|
||||||
3dfloorflags = "19F";
|
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
|
160
|
||||||
{
|
{
|
||||||
title = "Floating, Bobbing";
|
title = "Floating, Bobbing";
|
||||||
|
@ -1282,7 +1293,6 @@ linedeftypes
|
||||||
title = "Rising Platform, Solid, Invisible";
|
title = "Rising Platform, Solid, Invisible";
|
||||||
prefix = "(193)";
|
prefix = "(193)";
|
||||||
flags2text = "[1] Sink when stepped on";
|
flags2text = "[1] Sink when stepped on";
|
||||||
flags8text = "[3] Slope skew sides";
|
|
||||||
flags32text = "[5] Only block player";
|
flags32text = "[5] Only block player";
|
||||||
flags64text = "[6] Spindash to move";
|
flags64text = "[6] Spindash to move";
|
||||||
flags128text = "[7] Only block non-players";
|
flags128text = "[7] Only block non-players";
|
||||||
|
@ -1488,16 +1498,22 @@ linedeftypes
|
||||||
{
|
{
|
||||||
title = "Mario Block";
|
title = "Mario Block";
|
||||||
prefix = "(250)";
|
prefix = "(250)";
|
||||||
|
flags8text = "[3] Slope skew sides";
|
||||||
flags32text = "[5] Invisible block";
|
flags32text = "[5] Invisible block";
|
||||||
flags64text = "[6] Brick block";
|
flags64text = "[6] Brick block";
|
||||||
3dfloor = true;
|
3dfloor = true;
|
||||||
3dfloorflags = "40019F";
|
3dfloorflags = "40019F";
|
||||||
|
flags323dfloorflagsremove = "19E";
|
||||||
|
flags643dfloorflagsadd = "200000";
|
||||||
}
|
}
|
||||||
|
|
||||||
251
|
251
|
||||||
{
|
{
|
||||||
title = "Thwomp Block";
|
title = "Thwomp Block";
|
||||||
prefix = "(251)";
|
prefix = "(251)";
|
||||||
|
flags8text = "[3] Slope skew sides";
|
||||||
|
flags32text = "[5] Only block player";
|
||||||
|
flags128text = "[7] Only block non-players";
|
||||||
flags512text = "[9] Custom crushing sound";
|
flags512text = "[9] Custom crushing sound";
|
||||||
flags1024text = "[10] Custom speed";
|
flags1024text = "[10] Custom speed";
|
||||||
3dfloor = true;
|
3dfloor = true;
|
||||||
|
@ -1513,8 +1529,8 @@ linedeftypes
|
||||||
flags512text = "[9] Shattered by pushables";
|
flags512text = "[9] Shattered by pushables";
|
||||||
flags1024text = "[10] Trigger linedef executor";
|
flags1024text = "[10] Trigger linedef executor";
|
||||||
3dfloor = true;
|
3dfloor = true;
|
||||||
3dfloorflags = "8800019";
|
3dfloorflags = "880001D";
|
||||||
flags643dfloorflagsadd = "200006";
|
flags643dfloorflagsadd = "200002";
|
||||||
}
|
}
|
||||||
|
|
||||||
253
|
253
|
||||||
|
@ -1525,7 +1541,7 @@ linedeftypes
|
||||||
flags512text = "[9] Shattered by pushables";
|
flags512text = "[9] Shattered by pushables";
|
||||||
flags1024text = "[10] Trigger linedef executor";
|
flags1024text = "[10] Trigger linedef executor";
|
||||||
3dfloor = true;
|
3dfloor = true;
|
||||||
3dfloorflags = "8801019";
|
3dfloorflags = "880101D";
|
||||||
}
|
}
|
||||||
|
|
||||||
254
|
254
|
||||||
|
@ -1533,6 +1549,7 @@ linedeftypes
|
||||||
title = "Bustable Block";
|
title = "Bustable Block";
|
||||||
prefix = "(254)";
|
prefix = "(254)";
|
||||||
flags8text = "[3] Slope skew sides";
|
flags8text = "[3] Slope skew sides";
|
||||||
|
flags32text = "[5] Only block player";
|
||||||
flags64text = "[6] Strong characters only";
|
flags64text = "[6] Strong characters only";
|
||||||
flags128text = "[7] Only block non-players";
|
flags128text = "[7] Only block non-players";
|
||||||
flags512text = "[9] Shattered by pushables";
|
flags512text = "[9] Shattered by pushables";
|
||||||
|
@ -1593,6 +1610,7 @@ linedeftypes
|
||||||
{
|
{
|
||||||
title = "Custom FOF";
|
title = "Custom FOF";
|
||||||
prefix = "(259)";
|
prefix = "(259)";
|
||||||
|
flags8text = "[3] Slope skew sides";
|
||||||
flags32text = "[5] Only block player";
|
flags32text = "[5] Only block player";
|
||||||
flags128text = "[7] Only block non-players";
|
flags128text = "[7] Only block non-players";
|
||||||
flags512text = "[9] Shattered by pushables";
|
flags512text = "[9] Shattered by pushables";
|
||||||
|
@ -2161,6 +2179,14 @@ linedeftypes
|
||||||
flags8text = "[3] Set delay by backside sector";
|
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
|
457
|
||||||
{
|
{
|
||||||
title = "Track Object's Angle";
|
title = "Track Object's Angle";
|
||||||
|
@ -2180,12 +2206,14 @@ linedeftypes
|
||||||
{
|
{
|
||||||
title = "Award Rings";
|
title = "Award Rings";
|
||||||
prefix = "(460)";
|
prefix = "(460)";
|
||||||
|
flags8text = "[3] Set delay by backside sector";
|
||||||
}
|
}
|
||||||
|
|
||||||
461
|
461
|
||||||
{
|
{
|
||||||
title = "Spawn Object";
|
title = "Spawn Object";
|
||||||
prefix = "(461)";
|
prefix = "(461)";
|
||||||
|
flags8text = "[3] Set delay by backside sector";
|
||||||
flags64text = "[6] Spawn inside a range";
|
flags64text = "[6] Spawn inside a range";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2193,6 +2221,7 @@ linedeftypes
|
||||||
{
|
{
|
||||||
title = "Stop Timer/Exit Stage in Record Attack";
|
title = "Stop Timer/Exit Stage in Record Attack";
|
||||||
prefix = "(462)";
|
prefix = "(462)";
|
||||||
|
flags8text = "[3] Set delay by backside sector";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2206,7 +2235,7 @@ linedeftypes
|
||||||
prefix = "(413)";
|
prefix = "(413)";
|
||||||
flags2text = "[1] Keep after death";
|
flags2text = "[1] Keep after death";
|
||||||
flags8text = "[3] Set delay by backside sector";
|
flags8text = "[3] Set delay by backside sector";
|
||||||
flags32text = "[5] Seek to current song position";
|
flags32text = "[5] Seek from current position";
|
||||||
flags64text = "[6] For everyone";
|
flags64text = "[6] For everyone";
|
||||||
flags128text = "[7] Fade to custom volume";
|
flags128text = "[7] Fade to custom volume";
|
||||||
flags512text = "[9] Don't loop";
|
flags512text = "[9] Don't loop";
|
||||||
|
@ -2220,7 +2249,7 @@ linedeftypes
|
||||||
flags2text = "[1] From calling sector";
|
flags2text = "[1] From calling sector";
|
||||||
flags8text = "[3] Set delay by backside sector";
|
flags8text = "[3] Set delay by backside sector";
|
||||||
flags64text = "[6] From nowhere for triggerer";
|
flags64text = "[6] From nowhere for triggerer";
|
||||||
flags512text = "[9] For everyone";
|
flags512text = "[9] From nowhere for everyone";
|
||||||
flags1024text = "[10] From tagged sectors";
|
flags1024text = "[10] From tagged sectors";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2298,7 +2327,6 @@ linedeftypes
|
||||||
flags8text = "[3] Set delay by backside sector";
|
flags8text = "[3] Set delay by backside sector";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
445
|
445
|
||||||
{
|
{
|
||||||
title = "Make FOF Disappear/Reappear";
|
title = "Make FOF Disappear/Reappear";
|
||||||
|
@ -2325,8 +2353,8 @@ linedeftypes
|
||||||
flags32text = "[5] Subtract Red value";
|
flags32text = "[5] Subtract Red value";
|
||||||
flags64text = "[6] Subtract Green value";
|
flags64text = "[6] Subtract Green value";
|
||||||
flags128text = "[7] Subtract Blue value";
|
flags128text = "[7] Subtract Blue value";
|
||||||
flags256text = "[8] Calc relative values";
|
flags256text = "[8] Set relative to current";
|
||||||
flags32768text = "[15] Use back side colormap";
|
flags32768text = "[15] Use backside colormap";
|
||||||
}
|
}
|
||||||
|
|
||||||
448
|
448
|
||||||
|
@ -2359,7 +2387,7 @@ linedeftypes
|
||||||
prefix = "(452)";
|
prefix = "(452)";
|
||||||
flags8text = "[3] Set delay by backside sector";
|
flags8text = "[3] Set delay by backside sector";
|
||||||
flags64text = "[6] Do not handle FF_TRANS";
|
flags64text = "[6] Do not handle FF_TRANS";
|
||||||
flags256text = "[8] Set relative to current val";
|
flags256text = "[8] Set relative to current";
|
||||||
}
|
}
|
||||||
|
|
||||||
453
|
453
|
||||||
|
@ -2371,7 +2399,7 @@ linedeftypes
|
||||||
flags32text = "[5] No collision during fade";
|
flags32text = "[5] No collision during fade";
|
||||||
flags64text = "[6] Do not handle FF_TRANS";
|
flags64text = "[6] Do not handle FF_TRANS";
|
||||||
flags128text = "[7] Do not handle lighting";
|
flags128text = "[7] Do not handle lighting";
|
||||||
flags256text = "[8] Set relative to current val";
|
flags256text = "[8] Set relative to current";
|
||||||
flags512text = "[9] Speed = Tic Duration";
|
flags512text = "[9] Speed = Tic Duration";
|
||||||
flags1024text = "[10] Override existing fade";
|
flags1024text = "[10] Override existing fade";
|
||||||
flags16384text = "[14] Do not handle collision";
|
flags16384text = "[14] Do not handle collision";
|
||||||
|
@ -2395,11 +2423,11 @@ linedeftypes
|
||||||
flags32text = "[5] Subtract Red value";
|
flags32text = "[5] Subtract Red value";
|
||||||
flags64text = "[6] Subtract Green value";
|
flags64text = "[6] Subtract Green value";
|
||||||
flags128text = "[7] Subtract Blue value";
|
flags128text = "[7] Subtract Blue value";
|
||||||
flags256text = "[8] Calc relative values";
|
flags256text = "[8] Set relative to current";
|
||||||
flags512text = "[9] Speed = Tic Duration";
|
flags512text = "[9] Speed = Tic Duration";
|
||||||
flags1024text = "[10] Override existing fade";
|
flags1024text = "[10] Override existing fade";
|
||||||
flags16384text = "[14] Fade from invisible black";
|
flags16384text = "[14] Fade from invisible black";
|
||||||
flags32768text = "[15] Use back side colormap";
|
flags32768text = "[15] Use backside colormap";
|
||||||
}
|
}
|
||||||
|
|
||||||
456
|
456
|
||||||
|
@ -2416,9 +2444,7 @@ linedeftypes
|
||||||
flags2text = "[1] Close text prompt";
|
flags2text = "[1] Close text prompt";
|
||||||
flags8text = "[3] Set delay by backside sector";
|
flags8text = "[3] Set delay by backside sector";
|
||||||
flags32text = "[5] Run executor tag on close";
|
flags32text = "[5] Run executor tag on close";
|
||||||
flags64text = "[6] For everyone";
|
flags128text = "[7] Don't disable controls";
|
||||||
flags128text = "[7] Do not block controls";
|
|
||||||
flags256text = "[8] Do not freeze time";
|
|
||||||
flags32768text = "[15] Find prompt by name";
|
flags32768text = "[15] Find prompt by name";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2524,7 +2550,7 @@ linedeftypes
|
||||||
prefix = "(491)";
|
prefix = "(491)";
|
||||||
flags8text = "[3] Set delay by backside sector";
|
flags8text = "[3] Set delay by backside sector";
|
||||||
flags16text = "[4] Set raw alpha by Front X";
|
flags16text = "[4] Set raw alpha by Front X";
|
||||||
flags256text = "[8] Calc relative values";
|
flags256text = "[8] Set relative to current";
|
||||||
}
|
}
|
||||||
|
|
||||||
492
|
492
|
||||||
|
@ -2534,7 +2560,7 @@ linedeftypes
|
||||||
flags8text = "[3] Set delay by backside sector";
|
flags8text = "[3] Set delay by backside sector";
|
||||||
flags16text = "[4] Set raw alpha by Front X";
|
flags16text = "[4] Set raw alpha by Front X";
|
||||||
flags32text = "[5] No collision during fade";
|
flags32text = "[5] No collision during fade";
|
||||||
flags256text = "[8] Calc relative values";
|
flags256text = "[8] Set relative to current";
|
||||||
flags512text = "[9] Speed = Tic Duration";
|
flags512text = "[9] Speed = Tic Duration";
|
||||||
flags1024text = "[10] Override existing fade";
|
flags1024text = "[10] Override existing fade";
|
||||||
flags16384text = "[14] Do not handle collision";
|
flags16384text = "[14] Do not handle collision";
|
||||||
|
@ -2632,76 +2658,84 @@ linedeftypes
|
||||||
{
|
{
|
||||||
title = "Carry Objects on Floor";
|
title = "Carry Objects on Floor";
|
||||||
prefix = "(520)";
|
prefix = "(520)";
|
||||||
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
521
|
521
|
||||||
{
|
{
|
||||||
title = "Carry Objects on Floor (Accelerative)";
|
title = "Carry Objects on Floor (Accelerative)";
|
||||||
prefix = "(521)";
|
prefix = "(521)";
|
||||||
flags64text = "[6] Even across edges";
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
522
|
522
|
||||||
{
|
{
|
||||||
title = "Carry Objects on Floor (Displacement)";
|
title = "Carry Objects on Floor (Displacement)";
|
||||||
prefix = "(522)";
|
prefix = "(522)";
|
||||||
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
523
|
523
|
||||||
{
|
{
|
||||||
title = "Carry Objects on Ceiling";
|
title = "Carry Objects on Ceiling";
|
||||||
prefix = "(523)";
|
prefix = "(523)";
|
||||||
flags64text = "[6] Even across edges";
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
524
|
524
|
||||||
{
|
{
|
||||||
title = "Carry Objects on Ceiling (Accelerative)";
|
title = "Carry Objects on Ceiling (Accelerative)";
|
||||||
prefix = "(524)";
|
prefix = "(524)";
|
||||||
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
525
|
525
|
||||||
{
|
{
|
||||||
title = "Carry Objects on Ceiling (Displacement)";
|
title = "Carry Objects on Ceiling (Displacement)";
|
||||||
prefix = "(525)";
|
prefix = "(525)";
|
||||||
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
530
|
530
|
||||||
{
|
{
|
||||||
title = "Scroll Floor Texture and Carry Objects";
|
title = "Scroll Floor Texture and Carry Objects";
|
||||||
prefix = "(530)";
|
prefix = "(530)";
|
||||||
flags64text = "[6] Even across edges";
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
531
|
531
|
||||||
{
|
{
|
||||||
title = "Scroll Floor Texture and Carry Objects (Accelerative)";
|
title = "Scroll Floor Texture and Carry Objects (Accelerative)";
|
||||||
prefix = "(531)";
|
prefix = "(531)";
|
||||||
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
532
|
532
|
||||||
{
|
{
|
||||||
title = "Scroll Floor Texture and Carry Objects (Displacement)";
|
title = "Scroll Floor Texture and Carry Objects (Displacement)";
|
||||||
prefix = "(532)";
|
prefix = "(532)";
|
||||||
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
533
|
533
|
||||||
{
|
{
|
||||||
title = "Scroll Ceiling Texture and Carry Objects";
|
title = "Scroll Ceiling Texture and Carry Objects";
|
||||||
prefix = "(533)";
|
prefix = "(533)";
|
||||||
flags64text = "[6] Even across edges";
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
534
|
534
|
||||||
{
|
{
|
||||||
title = "Scroll Ceiling Texture and Carry Objects (Accelerative)";
|
title = "Scroll Ceiling Texture and Carry Objects (Accelerative)";
|
||||||
prefix = "(534)";
|
prefix = "(534)";
|
||||||
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
535
|
535
|
||||||
{
|
{
|
||||||
title = "Scroll Ceiling Texture and Carry Objects (Displacement)";
|
title = "Scroll Ceiling Texture and Carry Objects (Displacement)";
|
||||||
prefix = "(535)";
|
prefix = "(535)";
|
||||||
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2714,7 +2748,7 @@ linedeftypes
|
||||||
title = "Wind";
|
title = "Wind";
|
||||||
prefix = "(541)";
|
prefix = "(541)";
|
||||||
flags512text = "[9] Player slides";
|
flags512text = "[9] Player slides";
|
||||||
flags64text = "[6] Even across edges";
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
542
|
542
|
||||||
|
@ -2722,7 +2756,7 @@ linedeftypes
|
||||||
title = "Upwards Wind";
|
title = "Upwards Wind";
|
||||||
prefix = "(542)";
|
prefix = "(542)";
|
||||||
flags512text = "[9] Player slides";
|
flags512text = "[9] Player slides";
|
||||||
flags64text = "[6] Even across edges";
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
543
|
543
|
||||||
|
@ -2730,7 +2764,7 @@ linedeftypes
|
||||||
title = "Downwards Wind";
|
title = "Downwards Wind";
|
||||||
prefix = "(543)";
|
prefix = "(543)";
|
||||||
flags512text = "[9] Player slides";
|
flags512text = "[9] Player slides";
|
||||||
flags64text = "[6] Even across edges";
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
544
|
544
|
||||||
|
@ -2738,7 +2772,7 @@ linedeftypes
|
||||||
title = "Current";
|
title = "Current";
|
||||||
prefix = "(544)";
|
prefix = "(544)";
|
||||||
flags512text = "[9] Player slides";
|
flags512text = "[9] Player slides";
|
||||||
flags64text = "[6] Even across edges";
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
545
|
545
|
||||||
|
@ -2746,7 +2780,7 @@ linedeftypes
|
||||||
title = "Upwards Current";
|
title = "Upwards Current";
|
||||||
prefix = "(545)";
|
prefix = "(545)";
|
||||||
flags512text = "[9] Player slides";
|
flags512text = "[9] Player slides";
|
||||||
flags64text = "[6] Even across edges";
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
546
|
546
|
||||||
|
@ -2754,13 +2788,14 @@ linedeftypes
|
||||||
title = "Downwards Current";
|
title = "Downwards Current";
|
||||||
prefix = "(546)";
|
prefix = "(546)";
|
||||||
flags512text = "[9] Player slides";
|
flags512text = "[9] Player slides";
|
||||||
flags64text = "[6] Even across edges";
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
|
|
||||||
547
|
547
|
||||||
{
|
{
|
||||||
title = "Push/Pull";
|
title = "Push/Pull";
|
||||||
prefix = "(547)";
|
prefix = "(547)";
|
||||||
|
flags64text = "[6] Exclusive";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3407,8 +3442,8 @@ thingtypes
|
||||||
sprite = "ESHIA1";
|
sprite = "ESHIA1";
|
||||||
width = 16;
|
width = 16;
|
||||||
height = 48;
|
height = 48;
|
||||||
flags1text = "[1] 90 degrees counter-clockwise";
|
flags1text = "[1] 90 degrees clockwise";
|
||||||
flags4text = "[4] 90 degrees clockwise";
|
flags4text = "[4] 90 degrees counter-clockwise";
|
||||||
flags8text = "[8] Double speed";
|
flags8text = "[8] Double speed";
|
||||||
}
|
}
|
||||||
115
|
115
|
||||||
|
@ -3897,9 +3932,10 @@ thingtypes
|
||||||
title = "Monitors";
|
title = "Monitors";
|
||||||
width = 18;
|
width = 18;
|
||||||
height = 40;
|
height = 40;
|
||||||
flags1text = "[1] Run Linedef Executor on pop";
|
flags1text = "[1] Run linedef executor on pop";
|
||||||
flags4text = "[4] Random (Strong)";
|
flags4text = "[4] Random (Strong)";
|
||||||
flags8text = "[8] Random (Weak)";
|
flags8text = "[8] Random (Weak)";
|
||||||
|
angletext = "Tag";
|
||||||
|
|
||||||
400
|
400
|
||||||
{
|
{
|
||||||
|
@ -4029,7 +4065,8 @@ thingtypes
|
||||||
title = "Monitors (Respawning)";
|
title = "Monitors (Respawning)";
|
||||||
width = 20;
|
width = 20;
|
||||||
height = 44;
|
height = 44;
|
||||||
flags1text = "[1] Run Linedef Executor on pop";
|
flags1text = "[1] Run linedef executor on pop";
|
||||||
|
angletext = "Tag";
|
||||||
|
|
||||||
431
|
431
|
||||||
{
|
{
|
||||||
|
@ -4125,7 +4162,9 @@ thingtypes
|
||||||
sprite = "STPTA0M0";
|
sprite = "STPTA0M0";
|
||||||
width = 64;
|
width = 64;
|
||||||
height = 128;
|
height = 128;
|
||||||
|
flags4text = "[4] Respawn at center";
|
||||||
angletext = "Angle/Order";
|
angletext = "Angle/Order";
|
||||||
|
parametertext = "Order";
|
||||||
}
|
}
|
||||||
520
|
520
|
||||||
{
|
{
|
||||||
|
@ -4152,6 +4191,7 @@ thingtypes
|
||||||
sprite = "WSPKALAR";
|
sprite = "WSPKALAR";
|
||||||
width = 16;
|
width = 16;
|
||||||
height = 14;
|
height = 14;
|
||||||
|
arrow = 1;
|
||||||
flags1text = "[1] Start retracted";
|
flags1text = "[1] Start retracted";
|
||||||
flags4text = "[4] Retractable";
|
flags4text = "[4] Retractable";
|
||||||
flags8text = "[8] Intangible";
|
flags8text = "[8] Intangible";
|
||||||
|
@ -4558,6 +4598,7 @@ thingtypes
|
||||||
sprite = "TOADA0";
|
sprite = "TOADA0";
|
||||||
width = 32;
|
width = 32;
|
||||||
height = 16;
|
height = 16;
|
||||||
|
angletext = "Tag";
|
||||||
}
|
}
|
||||||
757
|
757
|
||||||
{
|
{
|
||||||
|
@ -5832,7 +5873,7 @@ thingtypes
|
||||||
sprite = "CAPSA0";
|
sprite = "CAPSA0";
|
||||||
width = 72;
|
width = 72;
|
||||||
height = 144;
|
height = 144;
|
||||||
angletext = "Rings";
|
angletext = "Spheres";
|
||||||
parametertext = "Mare";
|
parametertext = "Mare";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6273,7 +6314,7 @@ thingtypes
|
||||||
sprite = "PUMKA0";
|
sprite = "PUMKA0";
|
||||||
width = 16;
|
width = 16;
|
||||||
height = 40;
|
height = 40;
|
||||||
flags1text = "Don't flicker";
|
flags1text = "[1] Don't flicker";
|
||||||
}
|
}
|
||||||
2007
|
2007
|
||||||
{
|
{
|
||||||
|
@ -6281,7 +6322,7 @@ thingtypes
|
||||||
sprite = "PUMKB0";
|
sprite = "PUMKB0";
|
||||||
width = 16;
|
width = 16;
|
||||||
height = 40;
|
height = 40;
|
||||||
flags1text = "Don't flicker";
|
flags1text = "[1] Don't flicker";
|
||||||
}
|
}
|
||||||
2008
|
2008
|
||||||
{
|
{
|
||||||
|
@ -6289,7 +6330,7 @@ thingtypes
|
||||||
sprite = "PUMKC0";
|
sprite = "PUMKC0";
|
||||||
width = 16;
|
width = 16;
|
||||||
height = 40;
|
height = 40;
|
||||||
flags1text = "Don't flicker";
|
flags1text = "[1] Don't flicker";
|
||||||
}
|
}
|
||||||
2009
|
2009
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
/************************************************************************\
|
|
||||||
Zone Builder Game Configuration for Sonic Robo Blast 2 Version 2.2
|
|
||||||
\************************************************************************/
|
|
||||||
|
|
||||||
// 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 (Doom format)";
|
|
||||||
|
|
||||||
// This is the simplified game engine/sourceport name
|
|
||||||
engine = "zdoom";
|
|
||||||
|
|
||||||
// Settings common to all games and all map formats
|
|
||||||
include("Includes\\SRB222_common.cfg", "common");
|
|
||||||
|
|
||||||
// Settings common to Doom map format
|
|
||||||
include("Includes\\SRB222_common.cfg", "mapformat_doom");
|
|
||||||
|
|
||||||
include("Includes\\Game_SRB222.cfg");
|
|
||||||
|
|
||||||
// Script lumps detection
|
|
||||||
scriptlumpnames
|
|
||||||
{
|
|
||||||
include("Includes\\SRB222_misc.cfg", "scriptlumpnames");
|
|
||||||
}
|
|
||||||
|
|
||||||
// THING TYPES
|
|
||||||
thingtypes
|
|
||||||
{
|
|
||||||
include("Includes\\SRB222_things.cfg");
|
|
||||||
}
|
|
||||||
|
|
||||||
//Default things filters
|
|
||||||
thingsfilters
|
|
||||||
{
|
|
||||||
include("Includes\\SRB222_misc.cfg", "thingsfilters");
|
|
||||||
}
|
|
|
@ -1,47 +0,0 @@
|
||||||
/************************************************************************\
|
|
||||||
Zone Builder Game Configuration for Sonic Robo Blast 2 Version 2.2
|
|
||||||
\************************************************************************/
|
|
||||||
|
|
||||||
// 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 (UDMF)";
|
|
||||||
|
|
||||||
// This is the simplified game engine/sourceport name
|
|
||||||
engine = "zdoom";
|
|
||||||
|
|
||||||
// Settings common to all games and all map formats
|
|
||||||
include("Includes\\SRB222_common.cfg", "common");
|
|
||||||
|
|
||||||
// Settings common to Doom map format
|
|
||||||
include("Includes\\SRB222_common.cfg", "mapformat_udmf");
|
|
||||||
|
|
||||||
include("Includes\\Game_SRB222.cfg");
|
|
||||||
|
|
||||||
// Script lumps detection
|
|
||||||
scriptlumpnames
|
|
||||||
{
|
|
||||||
include("Includes\\SRB222_misc.cfg", "scriptlumpnames");
|
|
||||||
}
|
|
||||||
|
|
||||||
// THING TYPES
|
|
||||||
thingtypes
|
|
||||||
{
|
|
||||||
include("Includes\\SRB222_things.cfg");
|
|
||||||
}
|
|
||||||
|
|
||||||
//Default things filters
|
|
||||||
thingsfilters
|
|
||||||
{
|
|
||||||
include("Includes\\SRB222_misc.cfg", "thingsfilters");
|
|
||||||
}
|
|
||||||
|
|
||||||
// ENUMERATIONS
|
|
||||||
// Each engine has its own additional thing types
|
|
||||||
// These are enumerated lists for linedef types and UDMF fields.
|
|
||||||
enums
|
|
||||||
{
|
|
||||||
// Basic game enums
|
|
||||||
include("Includes\\SRB222_misc.cfg", "enums");
|
|
||||||
}
|
|
|
@ -120,6 +120,7 @@ set(SRB2_CORE_RENDER_SOURCES
|
||||||
r_main.c
|
r_main.c
|
||||||
r_plane.c
|
r_plane.c
|
||||||
r_segs.c
|
r_segs.c
|
||||||
|
r_skins.c
|
||||||
r_sky.c
|
r_sky.c
|
||||||
r_splats.c
|
r_splats.c
|
||||||
r_things.c
|
r_things.c
|
||||||
|
@ -134,6 +135,7 @@ set(SRB2_CORE_RENDER_SOURCES
|
||||||
r_main.h
|
r_main.h
|
||||||
r_plane.h
|
r_plane.h
|
||||||
r_segs.h
|
r_segs.h
|
||||||
|
r_skins.h
|
||||||
r_sky.h
|
r_sky.h
|
||||||
r_splats.h
|
r_splats.h
|
||||||
r_state.h
|
r_state.h
|
||||||
|
|
|
@ -466,6 +466,7 @@ OBJS:=$(i_main_o) \
|
||||||
$(OBJDIR)/r_main.o \
|
$(OBJDIR)/r_main.o \
|
||||||
$(OBJDIR)/r_plane.o \
|
$(OBJDIR)/r_plane.o \
|
||||||
$(OBJDIR)/r_segs.o \
|
$(OBJDIR)/r_segs.o \
|
||||||
|
$(OBJDIR)/r_skins.o \
|
||||||
$(OBJDIR)/r_sky.o \
|
$(OBJDIR)/r_sky.o \
|
||||||
$(OBJDIR)/r_splats.o \
|
$(OBJDIR)/r_splats.o \
|
||||||
$(OBJDIR)/r_things.o \
|
$(OBJDIR)/r_things.o \
|
||||||
|
|
|
@ -19,10 +19,10 @@ boolean allow_fullscreen = false;
|
||||||
consvar_t cv_vidwait = {"vid_wait", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_vidwait = {"vid_wait", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
void I_StartupGraphics(void){}
|
void I_StartupGraphics(void){}
|
||||||
void I_StartupHardwareGraphics(void){}
|
|
||||||
|
|
||||||
void I_ShutdownGraphics(void){}
|
void I_ShutdownGraphics(void){}
|
||||||
|
|
||||||
|
void VID_StartupOpenGL(void){}
|
||||||
|
|
||||||
void I_SetPalette(RGBA_t *palette)
|
void I_SetPalette(RGBA_t *palette)
|
||||||
{
|
{
|
||||||
(void)palette;
|
(void)palette;
|
||||||
|
@ -52,10 +52,8 @@ INT32 VID_SetMode(INT32 modenum)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VID_CheckRenderer(void)
|
void VID_CheckRenderer(void) {}
|
||||||
{
|
void VID_CheckGLLoaded(rendermode_t oldrender) {}
|
||||||
// ..............
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *VID_GetModeName(INT32 modenum)
|
const char *VID_GetModeName(INT32 modenum)
|
||||||
{
|
{
|
||||||
|
|
|
@ -80,7 +80,7 @@ static boolean joyaxis2_default = false;
|
||||||
static INT32 joyaxis_count = 0;
|
static INT32 joyaxis_count = 0;
|
||||||
static INT32 joyaxis2_count = 0;
|
static INT32 joyaxis2_count = 0;
|
||||||
|
|
||||||
#define COM_BUF_SIZE 8192 // command buffer size
|
#define COM_BUF_SIZE (32<<10) // command buffer size
|
||||||
#define MAX_ALIAS_RECURSION 100 // max recursion allowed for aliases
|
#define MAX_ALIAS_RECURSION 100 // max recursion allowed for aliases
|
||||||
|
|
||||||
static INT32 com_wait; // one command per frame (for cmd sequences)
|
static INT32 com_wait; // one command per frame (for cmd sequences)
|
||||||
|
|
|
@ -97,6 +97,7 @@ static void CON_InputInit(void);
|
||||||
static void CON_RecalcSize(void);
|
static void CON_RecalcSize(void);
|
||||||
static void CON_ChangeHeight(void);
|
static void CON_ChangeHeight(void);
|
||||||
|
|
||||||
|
static void CON_DrawBackpic(void);
|
||||||
static void CONS_hudlines_Change(void);
|
static void CONS_hudlines_Change(void);
|
||||||
static void CONS_backcolor_Change(void);
|
static void CONS_backcolor_Change(void);
|
||||||
|
|
||||||
|
@ -1530,6 +1531,51 @@ static void CON_DrawHudlines(void)
|
||||||
con_clearlines = y; // this is handled by HU_Erase();
|
con_clearlines = y; // this is handled by HU_Erase();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Lactozilla: Draws the console's background picture.
|
||||||
|
static void CON_DrawBackpic(void)
|
||||||
|
{
|
||||||
|
patch_t *con_backpic;
|
||||||
|
lumpnum_t piclump;
|
||||||
|
int x, w, h;
|
||||||
|
|
||||||
|
// Get the lumpnum for CONSBACK, or fallback into MISSING.
|
||||||
|
piclump = W_CheckNumForName("CONSBACK");
|
||||||
|
if (piclump == LUMPERROR)
|
||||||
|
piclump = W_GetNumForName("MISSING");
|
||||||
|
|
||||||
|
// Cache the Software patch.
|
||||||
|
con_backpic = W_CacheSoftwarePatchNum(piclump, PU_PATCH);
|
||||||
|
|
||||||
|
// Center the backpic, and draw a vertically cropped patch.
|
||||||
|
w = (con_backpic->width * vid.dupx);
|
||||||
|
x = (vid.width / 2) - (w / 2);
|
||||||
|
h = con_curlines/vid.dupy;
|
||||||
|
|
||||||
|
// If the patch doesn't fill the entire screen,
|
||||||
|
// then fill the sides with a solid color.
|
||||||
|
if (x > 0)
|
||||||
|
{
|
||||||
|
column_t *column = (column_t *)((UINT8 *)(con_backpic) + LONG(con_backpic->columnofs[0]));
|
||||||
|
if (!column->topdelta)
|
||||||
|
{
|
||||||
|
UINT8 *source = (UINT8 *)(column) + 3;
|
||||||
|
INT32 color = (source[0] | V_NOSCALESTART);
|
||||||
|
// left side
|
||||||
|
V_DrawFill(0, 0, x, con_curlines, color);
|
||||||
|
// right side
|
||||||
|
V_DrawFill((x + w), 0, (vid.width - w), con_curlines, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cache the patch normally.
|
||||||
|
con_backpic = W_CachePatchNum(piclump, PU_PATCH);
|
||||||
|
V_DrawCroppedPatch(x << FRACBITS, 0, FRACUNIT, V_NOSCALESTART, con_backpic,
|
||||||
|
0, ( BASEVIDHEIGHT - h ), BASEVIDWIDTH, h);
|
||||||
|
|
||||||
|
// Unlock the cached patch.
|
||||||
|
W_UnlockCachedPatch(con_backpic);
|
||||||
|
}
|
||||||
|
|
||||||
// draw the console background, text, and prompt if enough place
|
// draw the console background, text, and prompt if enough place
|
||||||
//
|
//
|
||||||
static void CON_DrawConsole(void)
|
static void CON_DrawConsole(void)
|
||||||
|
@ -1551,19 +1597,7 @@ static void CON_DrawConsole(void)
|
||||||
|
|
||||||
// draw console background
|
// draw console background
|
||||||
if (cons_backpic.value || con_forcepic)
|
if (cons_backpic.value || con_forcepic)
|
||||||
{
|
CON_DrawBackpic();
|
||||||
patch_t *con_backpic = W_CachePatchName("CONSBACK", PU_PATCH);
|
|
||||||
int h;
|
|
||||||
|
|
||||||
h = con_curlines/vid.dupy;
|
|
||||||
|
|
||||||
// Jimita: CON_DrawBackpic just called V_DrawScaledPatch
|
|
||||||
//V_DrawScaledPatch(0, 0, 0, con_backpic);
|
|
||||||
V_DrawCroppedPatch(0, 0, FRACUNIT, 0, con_backpic,
|
|
||||||
0, ( BASEVIDHEIGHT - h ), BASEVIDWIDTH, h);
|
|
||||||
|
|
||||||
W_UnlockCachedPatch(con_backpic);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// inu: no more width (was always 0 and vid.width)
|
// inu: no more width (was always 0 and vid.width)
|
||||||
|
|
|
@ -4855,7 +4855,8 @@ static inline void PingUpdate(void)
|
||||||
{
|
{
|
||||||
for (i = 1; i < MAXPLAYERS; i++)
|
for (i = 1; i < MAXPLAYERS; i++)
|
||||||
{
|
{
|
||||||
if (playeringame[i] && (realpingtable[i] / pingmeasurecount > (unsigned)cv_maxping.value))
|
if (playeringame[i] && !players[i].quittime
|
||||||
|
&& (realpingtable[i] / pingmeasurecount > (unsigned)cv_maxping.value))
|
||||||
{
|
{
|
||||||
if (players[i].jointime > 30 * TICRATE)
|
if (players[i].jointime > 30 * TICRATE)
|
||||||
laggers[i] = true;
|
laggers[i] = true;
|
||||||
|
@ -4874,8 +4875,8 @@ static inline void PingUpdate(void)
|
||||||
if (playeringame[i] && laggers[i])
|
if (playeringame[i] && laggers[i])
|
||||||
{
|
{
|
||||||
pingtimeout[i]++;
|
pingtimeout[i]++;
|
||||||
|
// ok your net has been bad for too long, you deserve to die.
|
||||||
if (pingtimeout[i] > cv_pingtimeout.value)
|
if (pingtimeout[i] > cv_pingtimeout.value)
|
||||||
// ok your net has been bad for too long, you deserve to die.
|
|
||||||
{
|
{
|
||||||
pingtimeout[i] = 0;
|
pingtimeout[i] = 0;
|
||||||
SendKick(i, KICK_MSG_PING_HIGH | KICK_MSG_KEEP_BODY);
|
SendKick(i, KICK_MSG_PING_HIGH | KICK_MSG_KEEP_BODY);
|
||||||
|
|
|
@ -20,12 +20,9 @@
|
||||||
#include "d_player.h"
|
#include "d_player.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The 'packet version' may be used with packets whose
|
The 'packet version' is used to distinguish packet formats.
|
||||||
format is expected to change between versions.
|
This version is independent of VERSION and SUBVERSION. Different
|
||||||
|
applications may follow different packet versions.
|
||||||
This version is independent of the mod name, and standard
|
|
||||||
version and subversion. It should only account for the
|
|
||||||
basic fields of the packet, and change infrequently.
|
|
||||||
*/
|
*/
|
||||||
#define PACKETVERSION 2
|
#define PACKETVERSION 2
|
||||||
|
|
||||||
|
|
56
src/d_main.c
56
src/d_main.c
|
@ -881,6 +881,40 @@ static inline void D_CleanFile(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///\brief Checks if a netgame URL is being handled, and changes working directory to the EXE's if so.
|
||||||
|
/// Done because browsers (at least, Firefox on Windows) launch the game from the browser's directory, which causes problems.
|
||||||
|
static void ChangeDirForUrlHandler(void)
|
||||||
|
{
|
||||||
|
// URL handlers are opened by web browsers (at least Firefox) from the browser's working directory, not the game's stored directory,
|
||||||
|
// so chdir to that directory unless overridden.
|
||||||
|
if (M_GetUrlProtocolArg() != NULL && !M_CheckParm("-nochdir"))
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
CONS_Printf("%s connect links load game files from the SRB2 application's stored directory. Switching to ", SERVER_URL_PROTOCOL);
|
||||||
|
strlcpy(srb2path, myargv[0], sizeof(srb2path));
|
||||||
|
|
||||||
|
// Get just the directory, minus the EXE name
|
||||||
|
for (i = strlen(srb2path)-1; i > 0; i--)
|
||||||
|
{
|
||||||
|
if (srb2path[i] == '/' || srb2path[i] == '\\')
|
||||||
|
{
|
||||||
|
srb2path[i] = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CONS_Printf("%s\n", srb2path);
|
||||||
|
|
||||||
|
#if defined (_WIN32)
|
||||||
|
SetCurrentDirectoryA(srb2path);
|
||||||
|
#else
|
||||||
|
if (chdir(srb2path) == -1)
|
||||||
|
I_OutputMsg("Couldn't change working directory\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
// Identify the SRB2 version, and IWAD file to use.
|
// Identify the SRB2 version, and IWAD file to use.
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
@ -1069,6 +1103,9 @@ void D_SRB2Main(void)
|
||||||
// Test Dehacked lists
|
// Test Dehacked lists
|
||||||
DEH_Check();
|
DEH_Check();
|
||||||
|
|
||||||
|
// Netgame URL special case: change working dir to EXE folder.
|
||||||
|
ChangeDirForUrlHandler();
|
||||||
|
|
||||||
// identify the main IWAD file to use
|
// identify the main IWAD file to use
|
||||||
IdentifyVersion();
|
IdentifyVersion();
|
||||||
|
|
||||||
|
@ -1151,9 +1188,15 @@ void D_SRB2Main(void)
|
||||||
if (M_CheckParm("-password") && M_IsNextParm())
|
if (M_CheckParm("-password") && M_IsNextParm())
|
||||||
D_SetPassword(M_GetNextParm());
|
D_SetPassword(M_GetNextParm());
|
||||||
|
|
||||||
|
CONS_Printf("Z_Init(): Init zone memory allocation daemon. \n");
|
||||||
|
Z_Init();
|
||||||
|
|
||||||
|
// Do this up here so that WADs loaded through the command line can use ExecCfg
|
||||||
|
COM_Init();
|
||||||
|
|
||||||
// add any files specified on the command line with -file wadfile
|
// add any files specified on the command line with -file wadfile
|
||||||
// to the wad list
|
// to the wad list
|
||||||
if (!(M_CheckParm("-connect") && !M_CheckParm("-server")))
|
if (!((M_GetUrlProtocolArg() || M_CheckParm("-connect")) && !M_CheckParm("-server")))
|
||||||
{
|
{
|
||||||
if (M_CheckParm("-file"))
|
if (M_CheckParm("-file"))
|
||||||
{
|
{
|
||||||
|
@ -1178,9 +1221,6 @@ void D_SRB2Main(void)
|
||||||
if (M_CheckParm("-server") || dedicated)
|
if (M_CheckParm("-server") || dedicated)
|
||||||
netgame = server = true;
|
netgame = server = true;
|
||||||
|
|
||||||
CONS_Printf("Z_Init(): Init zone memory allocation daemon. \n");
|
|
||||||
Z_Init();
|
|
||||||
|
|
||||||
// adapt tables to SRB2's needs, including extra slots for dehacked file support
|
// adapt tables to SRB2's needs, including extra slots for dehacked file support
|
||||||
P_PatchInfoTables();
|
P_PatchInfoTables();
|
||||||
|
|
||||||
|
@ -1188,7 +1228,7 @@ void D_SRB2Main(void)
|
||||||
M_InitMenuPresTables();
|
M_InitMenuPresTables();
|
||||||
|
|
||||||
// init title screen display params
|
// init title screen display params
|
||||||
if (M_CheckParm("-connect"))
|
if (M_GetUrlProtocolArg() || M_CheckParm("-connect"))
|
||||||
F_InitMenuPresValues();
|
F_InitMenuPresValues();
|
||||||
|
|
||||||
//---------------------------------------------------- READY TIME
|
//---------------------------------------------------- READY TIME
|
||||||
|
@ -1252,7 +1292,6 @@ void D_SRB2Main(void)
|
||||||
CONS_Printf("HU_Init(): Setting up heads up display.\n");
|
CONS_Printf("HU_Init(): Setting up heads up display.\n");
|
||||||
HU_Init();
|
HU_Init();
|
||||||
|
|
||||||
COM_Init();
|
|
||||||
CON_Init();
|
CON_Init();
|
||||||
|
|
||||||
D_RegisterServerCommands();
|
D_RegisterServerCommands();
|
||||||
|
@ -1286,11 +1325,10 @@ void D_SRB2Main(void)
|
||||||
|
|
||||||
// Set cv_renderer to the new render mode
|
// Set cv_renderer to the new render mode
|
||||||
VID_CheckRenderer();
|
VID_CheckRenderer();
|
||||||
SCR_ChangeRendererCVars(setrenderneeded);
|
SCR_ChangeRendererCVars(rendermode);
|
||||||
|
|
||||||
// check the renderer's state, and then clear setrenderneeded
|
// check the renderer's state
|
||||||
D_CheckRendererState();
|
D_CheckRendererState();
|
||||||
setrenderneeded = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wipegamestate = gamestate;
|
wipegamestate = gamestate;
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#include "g_input.h"
|
#include "g_input.h"
|
||||||
#include "m_menu.h"
|
#include "m_menu.h"
|
||||||
#include "r_local.h"
|
#include "r_local.h"
|
||||||
#include "r_things.h"
|
#include "r_skins.h"
|
||||||
#include "p_local.h"
|
#include "p_local.h"
|
||||||
#include "p_setup.h"
|
#include "p_setup.h"
|
||||||
#include "s_sound.h"
|
#include "s_sound.h"
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "r_data.h"
|
#include "r_data.h"
|
||||||
#include "r_draw.h"
|
#include "r_draw.h"
|
||||||
#include "r_patch.h"
|
#include "r_patch.h"
|
||||||
|
#include "r_things.h" // R_Char2Frame
|
||||||
#include "r_sky.h"
|
#include "r_sky.h"
|
||||||
#include "fastcmp.h"
|
#include "fastcmp.h"
|
||||||
#include "lua_script.h"
|
#include "lua_script.h"
|
||||||
|
@ -3889,7 +3890,26 @@ static void readmaincfg(MYFILE *f)
|
||||||
value = atoi(word2); // used for numerical settings
|
value = atoi(word2); // used for numerical settings
|
||||||
|
|
||||||
if (fastcmp(word, "EXECCFG"))
|
if (fastcmp(word, "EXECCFG"))
|
||||||
COM_BufAddText(va("exec %s\n", word2));
|
{
|
||||||
|
if (strchr(word2, '.'))
|
||||||
|
COM_BufAddText(va("exec %s\n", word2));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lumpnum_t lumpnum;
|
||||||
|
char newname[9];
|
||||||
|
|
||||||
|
strncpy(newname, word2, 8);
|
||||||
|
|
||||||
|
newname[8] = '\0';
|
||||||
|
|
||||||
|
lumpnum = W_CheckNumForName(newname);
|
||||||
|
|
||||||
|
if (lumpnum == LUMPERROR || W_LumpLength(lumpnum) == 0)
|
||||||
|
CONS_Debug(DBG_SETUP, "SOC Error: script lump %s not found/not valid.\n", newname);
|
||||||
|
else
|
||||||
|
COM_BufInsertText(W_CacheLumpNum(lumpnum, PU_CACHE));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
else if (fastcmp(word, "SPSTAGE_START"))
|
else if (fastcmp(word, "SPSTAGE_START"))
|
||||||
{
|
{
|
||||||
|
|
|
@ -339,7 +339,4 @@ void I_StartupGraphics(void)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_StartupHardwareGraphics(void)
|
void VID_StartupOpenGL(void) {}
|
||||||
{
|
|
||||||
// oh yeah woo yeah oh yeah woo yeah oh yeah woo yeah oh yeah woo yeah oh yeah woo yeah oh yeah woo yeah oh yeah woo y
|
|
||||||
}
|
|
||||||
|
|
|
@ -378,10 +378,8 @@ INT32 VID_SetMode (INT32 modenum) //, UINT8 *palette)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VID_CheckRenderer(void)
|
void VID_CheckRenderer(void) {}
|
||||||
{
|
void VID_CheckGLLoaded(rendermode_t oldrender) {}
|
||||||
// ..............
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -150,6 +150,9 @@ extern char logfilename[1024];
|
||||||
// Otherwise we can't force updates!
|
// Otherwise we can't force updates!
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* A custom URL protocol for server links. */
|
||||||
|
#define SERVER_URL_PROTOCOL "srb2://"
|
||||||
|
|
||||||
// Does this version require an added patch file?
|
// Does this version require an added patch file?
|
||||||
// Comment or uncomment this as necessary.
|
// Comment or uncomment this as necessary.
|
||||||
#define USE_PATCH_DTA
|
#define USE_PATCH_DTA
|
||||||
|
|
|
@ -11,10 +11,10 @@ boolean allow_fullscreen = false;
|
||||||
consvar_t cv_vidwait = {"vid_wait", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_vidwait = {"vid_wait", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
void I_StartupGraphics(void){}
|
void I_StartupGraphics(void){}
|
||||||
void I_StartupHardwareGraphics(void){}
|
|
||||||
|
|
||||||
void I_ShutdownGraphics(void){}
|
void I_ShutdownGraphics(void){}
|
||||||
|
|
||||||
|
void VID_StartupOpenGL(void){}
|
||||||
|
|
||||||
void I_SetPalette(RGBA_t *palette)
|
void I_SetPalette(RGBA_t *palette)
|
||||||
{
|
{
|
||||||
(void)palette;
|
(void)palette;
|
||||||
|
@ -40,10 +40,8 @@ INT32 VID_SetMode(INT32 modenum)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VID_CheckRenderer(void)
|
void VID_CheckRenderer(void) {}
|
||||||
{
|
void VID_CheckGLLoaded(rendermode_t oldrender) {}
|
||||||
// ..............
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *VID_GetModeName(INT32 modenum)
|
const char *VID_GetModeName(INT32 modenum)
|
||||||
{
|
{
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include "i_video.h"
|
#include "i_video.h"
|
||||||
#include "v_video.h"
|
#include "v_video.h"
|
||||||
|
|
||||||
|
#include "r_state.h" // fadecolormap
|
||||||
#include "r_draw.h" // transtable
|
#include "r_draw.h" // transtable
|
||||||
#include "p_pspr.h" // tr_transxxx
|
#include "p_pspr.h" // tr_transxxx
|
||||||
#include "p_local.h"
|
#include "p_local.h"
|
||||||
|
|
17
src/g_game.c
17
src/g_game.c
|
@ -38,7 +38,7 @@
|
||||||
#include "byteptr.h"
|
#include "byteptr.h"
|
||||||
#include "i_joy.h"
|
#include "i_joy.h"
|
||||||
#include "r_local.h"
|
#include "r_local.h"
|
||||||
#include "r_things.h"
|
#include "r_skins.h"
|
||||||
#include "y_inter.h"
|
#include "y_inter.h"
|
||||||
#include "v_video.h"
|
#include "v_video.h"
|
||||||
#include "dehacked.h" // get_number (for ghost thok)
|
#include "dehacked.h" // get_number (for ghost thok)
|
||||||
|
@ -1044,18 +1044,17 @@ static INT32 G_BasicDeadZoneCalculation(INT32 magnitude, fixed_t deadZone)
|
||||||
{
|
{
|
||||||
const INT32 jdeadzone = (JOYAXISRANGE * deadZone) / FRACUNIT;
|
const INT32 jdeadzone = (JOYAXISRANGE * deadZone) / FRACUNIT;
|
||||||
INT32 deadzoneAppliedValue = 0;
|
INT32 deadzoneAppliedValue = 0;
|
||||||
|
INT32 adjustedMagnitude = abs(magnitude);
|
||||||
|
|
||||||
if (jdeadzone > 0)
|
if (jdeadzone >= JOYAXISRANGE && adjustedMagnitude >= JOYAXISRANGE) // If the deadzone and magnitude are both 100%...
|
||||||
|
return JOYAXISRANGE; // ...return 100% input directly, to avoid dividing by 0
|
||||||
|
else if (adjustedMagnitude > jdeadzone) // Otherwise, calculate how much the magnitude exceeds the deadzone
|
||||||
{
|
{
|
||||||
if (magnitude > jdeadzone)
|
adjustedMagnitude = min(adjustedMagnitude, JOYAXISRANGE);
|
||||||
{
|
|
||||||
INT32 adjustedMagnitude = abs(magnitude);
|
|
||||||
adjustedMagnitude = min(adjustedMagnitude, JOYAXISRANGE);
|
|
||||||
|
|
||||||
adjustedMagnitude -= jdeadzone;
|
adjustedMagnitude -= jdeadzone;
|
||||||
|
|
||||||
deadzoneAppliedValue = (adjustedMagnitude * JOYAXISRANGE) / (JOYAXISRANGE - jdeadzone);
|
deadzoneAppliedValue = (adjustedMagnitude * JOYAXISRANGE) / (JOYAXISRANGE - jdeadzone);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return deadzoneAppliedValue;
|
return deadzoneAppliedValue;
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#include "../tables.h"
|
#include "../tables.h"
|
||||||
#include "../sounds.h"
|
#include "../sounds.h"
|
||||||
#include "../r_main.h"
|
#include "../r_main.h"
|
||||||
#include "../r_things.h"
|
#include "../r_skins.h"
|
||||||
#include "../m_random.h"
|
#include "../m_random.h"
|
||||||
#include "../p_local.h"
|
#include "../p_local.h"
|
||||||
#include "hw3dsdrv.h"
|
#include "hw3dsdrv.h"
|
||||||
|
|
|
@ -224,11 +224,11 @@ static void HWR_DrawFlippedColumnInCache(const column_t *patchcol, UINT8 *block,
|
||||||
if (mipmap->colormap)
|
if (mipmap->colormap)
|
||||||
texel = mipmap->colormap[texel];
|
texel = mipmap->colormap[texel];
|
||||||
|
|
||||||
// transparent pixel
|
// If the mipmap is chromakeyed, check if the texel's color
|
||||||
if (texel == HWR_PATCHES_CHROMAKEY_COLORINDEX)
|
// is equivalent to the chroma key's color index.
|
||||||
|
alpha = 0xff;
|
||||||
|
if ((mipmap->flags & TF_CHROMAKEYED) && (texel == HWR_PATCHES_CHROMAKEY_COLORINDEX))
|
||||||
alpha = 0x00;
|
alpha = 0x00;
|
||||||
else
|
|
||||||
alpha = 0xff;
|
|
||||||
|
|
||||||
// hope compiler will get this switch out of the loops (dreams...)
|
// hope compiler will get this switch out of the loops (dreams...)
|
||||||
// gcc do it ! but vcc not ! (why don't use cygwin gcc for win32 ?)
|
// gcc do it ! but vcc not ! (why don't use cygwin gcc for win32 ?)
|
||||||
|
|
|
@ -280,7 +280,7 @@ void HWR_DrawStretchyFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t
|
||||||
if (cx >= -0.1f && cx <= 0.1f && SHORT(gpatch->width) == BASEVIDWIDTH && cy >= -0.1f && cy <= 0.1f && SHORT(gpatch->height) == BASEVIDHEIGHT)
|
if (cx >= -0.1f && cx <= 0.1f && SHORT(gpatch->width) == BASEVIDWIDTH && cy >= -0.1f && cy <= 0.1f && SHORT(gpatch->height) == BASEVIDHEIGHT)
|
||||||
{
|
{
|
||||||
// Need to temporarily cache the real patch to get the colour of the top left pixel
|
// Need to temporarily cache the real patch to get the colour of the top left pixel
|
||||||
patch_t *realpatch = W_CacheLumpNumPwad(gpatch->wadnum, gpatch->lumpnum, PU_STATIC);
|
patch_t *realpatch = W_CacheSoftwarePatchNumPwad(gpatch->wadnum, gpatch->lumpnum, PU_STATIC);
|
||||||
const column_t *column = (const column_t *)((const UINT8 *)(realpatch) + LONG((realpatch)->columnofs[0]));
|
const column_t *column = (const column_t *)((const UINT8 *)(realpatch) + LONG((realpatch)->columnofs[0]));
|
||||||
if (!column->topdelta)
|
if (!column->topdelta)
|
||||||
{
|
{
|
||||||
|
@ -439,7 +439,7 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal
|
||||||
if (cx >= -0.1f && cx <= 0.1f && SHORT(gpatch->width) == BASEVIDWIDTH && cy >= -0.1f && cy <= 0.1f && SHORT(gpatch->height) == BASEVIDHEIGHT)
|
if (cx >= -0.1f && cx <= 0.1f && SHORT(gpatch->width) == BASEVIDWIDTH && cy >= -0.1f && cy <= 0.1f && SHORT(gpatch->height) == BASEVIDHEIGHT)
|
||||||
{
|
{
|
||||||
// Need to temporarily cache the real patch to get the colour of the top left pixel
|
// Need to temporarily cache the real patch to get the colour of the top left pixel
|
||||||
patch_t *realpatch = W_CacheLumpNumPwad(gpatch->wadnum, gpatch->lumpnum, PU_STATIC);
|
patch_t *realpatch = W_CacheSoftwarePatchNumPwad(gpatch->wadnum, gpatch->lumpnum, PU_STATIC);
|
||||||
const column_t *column = (const column_t *)((const UINT8 *)(realpatch) + LONG((realpatch)->columnofs[0]));
|
const column_t *column = (const column_t *)((const UINT8 *)(realpatch) + LONG((realpatch)->columnofs[0]));
|
||||||
if (!column->topdelta)
|
if (!column->topdelta)
|
||||||
{
|
{
|
||||||
|
|
|
@ -322,9 +322,10 @@ static FUINT HWR_CalcSlopeLight(FUINT lightnum, angle_t dir, fixed_t delta)
|
||||||
|
|
||||||
#ifdef DOPLANES
|
#ifdef DOPLANES
|
||||||
|
|
||||||
// HWR_RenderPlane
|
// -----------------+
|
||||||
// Render a floor or ceiling convex polygon
|
// HWR_RenderPlane : Render a floor or ceiling convex polygon
|
||||||
static void HWR_RenderPlane(extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, FBITFIELD PolyFlags, INT32 lightlevel, levelflat_t *levelflat, sector_t *FOFsector, UINT8 alpha, extracolormap_t *planecolormap)
|
// -----------------+
|
||||||
|
static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, FBITFIELD PolyFlags, INT32 lightlevel, levelflat_t *levelflat, sector_t *FOFsector, UINT8 alpha, extracolormap_t *planecolormap)
|
||||||
{
|
{
|
||||||
polyvertex_t * pv;
|
polyvertex_t * pv;
|
||||||
float height; //constant y for all points on the convex flat polygon
|
float height; //constant y for all points on the convex flat polygon
|
||||||
|
@ -438,8 +439,6 @@ static void HWR_RenderPlane(extrasubsector_t *xsub, boolean isceiling, fixed_t f
|
||||||
flatyref = (float)(((fixed_t)pv->y & (~flatflag)) / fflatheight);
|
flatyref = (float)(((fixed_t)pv->y & (~flatflag)) / fflatheight);
|
||||||
|
|
||||||
// transform
|
// transform
|
||||||
v3d = planeVerts;
|
|
||||||
|
|
||||||
if (FOFsector != NULL)
|
if (FOFsector != NULL)
|
||||||
{
|
{
|
||||||
if (!isceiling) // it's a floor
|
if (!isceiling) // it's a floor
|
||||||
|
@ -491,47 +490,43 @@ static void HWR_RenderPlane(extrasubsector_t *xsub, boolean isceiling, fixed_t f
|
||||||
flatyref = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINESINE(angle)) + FixedMul(tempytow, FINECOSINE(angle))));
|
flatyref = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINESINE(angle)) + FixedMul(tempytow, FINECOSINE(angle))));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SETUP3DVERT(vert, vx, vy) {\
|
||||||
|
/* Hurdler: add scrolling texture on floor/ceiling */\
|
||||||
|
if (texflat)\
|
||||||
|
{\
|
||||||
|
vert->s = (float)((vx) / fflatwidth) + scrollx;\
|
||||||
|
vert->t = -(float)((vy) / fflatheight) + scrolly;\
|
||||||
|
}\
|
||||||
|
else\
|
||||||
|
{\
|
||||||
|
vert->s = (float)(((vx) / fflatwidth) - flatxref + scrollx);\
|
||||||
|
vert->t = (float)(flatyref - ((vy) / fflatheight) + scrolly);\
|
||||||
|
}\
|
||||||
|
\
|
||||||
|
/* Need to rotate before translate */\
|
||||||
|
if (angle) /* Only needs to be done if there's an altered angle */\
|
||||||
|
{\
|
||||||
|
tempxsow = FLOAT_TO_FIXED(vert->s);\
|
||||||
|
tempytow = FLOAT_TO_FIXED(vert->t);\
|
||||||
|
if (texflat)\
|
||||||
|
tempytow = -tempytow;\
|
||||||
|
vert->s = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINECOSINE(angle)) - FixedMul(tempytow, FINESINE(angle))));\
|
||||||
|
vert->t = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINESINE(angle)) + FixedMul(tempytow, FINECOSINE(angle))));\
|
||||||
|
}\
|
||||||
|
\
|
||||||
|
vert->x = (vx);\
|
||||||
|
vert->y = height;\
|
||||||
|
vert->z = (vy);\
|
||||||
|
\
|
||||||
|
if (slope)\
|
||||||
|
{\
|
||||||
|
fixedheight = P_GetZAt(slope, FLOAT_TO_FIXED((vx)), FLOAT_TO_FIXED((vy)));\
|
||||||
|
vert->y = FIXED_TO_FLOAT(fixedheight);\
|
||||||
|
}\
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < nrPlaneVerts; i++,v3d++,pv++)
|
for (i = 0, v3d = planeVerts; i < nrPlaneVerts; i++,v3d++,pv++)
|
||||||
{
|
SETUP3DVERT(v3d, pv->x, pv->y);
|
||||||
// Hurdler: add scrolling texture on floor/ceiling
|
|
||||||
if (texflat)
|
|
||||||
{
|
|
||||||
v3d->s = (float)(pv->x / fflatwidth) + scrollx;
|
|
||||||
v3d->t = -(float)(pv->y / fflatheight) + scrolly;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
v3d->s = (float)((pv->x / fflatwidth) - flatxref + scrollx);
|
|
||||||
v3d->t = (float)(flatyref - (pv->y / fflatheight) + scrolly);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Need to rotate before translate
|
|
||||||
if (angle) // Only needs to be done if there's an altered angle
|
|
||||||
{
|
|
||||||
tempxsow = FLOAT_TO_FIXED(v3d->s);
|
|
||||||
tempytow = FLOAT_TO_FIXED(v3d->t);
|
|
||||||
if (texflat)
|
|
||||||
tempytow = -tempytow;
|
|
||||||
v3d->s = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINECOSINE(angle)) - FixedMul(tempytow, FINESINE(angle))));
|
|
||||||
v3d->t = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINESINE(angle)) + FixedMul(tempytow, FINECOSINE(angle))));
|
|
||||||
}
|
|
||||||
|
|
||||||
//v3d->s = (float)(v3d->s - flatxref + scrollx);
|
|
||||||
//v3d->t = (float)(flatyref - v3d->t + scrolly);
|
|
||||||
|
|
||||||
v3d->x = pv->x;
|
|
||||||
v3d->y = height;
|
|
||||||
v3d->z = pv->y;
|
|
||||||
|
|
||||||
#ifdef ESLOPE
|
|
||||||
if (slope)
|
|
||||||
{
|
|
||||||
fixedheight = P_GetZAt(slope, FLOAT_TO_FIXED(pv->x), FLOAT_TO_FIXED(pv->y));
|
|
||||||
v3d->y = FIXED_TO_FLOAT(fixedheight);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
if (slope)
|
if (slope)
|
||||||
|
@ -557,6 +552,79 @@ static void HWR_RenderPlane(extrasubsector_t *xsub, boolean isceiling, fixed_t f
|
||||||
|
|
||||||
HWD.pfnDrawPolygon(&Surf, planeVerts, nrPlaneVerts, PolyFlags);
|
HWD.pfnDrawPolygon(&Surf, planeVerts, nrPlaneVerts, PolyFlags);
|
||||||
|
|
||||||
|
if (subsector)
|
||||||
|
{
|
||||||
|
// Horizon lines
|
||||||
|
FOutVector horizonpts[6];
|
||||||
|
float dist, vx, vy;
|
||||||
|
float x1, y1, xd, yd;
|
||||||
|
UINT8 numplanes, j;
|
||||||
|
vertex_t v; // For determining the closest distance from the line to the camera, to split render planes for minimum distortion;
|
||||||
|
|
||||||
|
const float renderdist = 27000.0f; // How far out to properly render the plane
|
||||||
|
const float farrenderdist = 32768.0f; // From here, raise plane to horizon level to fill in the line with some texture distortion
|
||||||
|
|
||||||
|
seg_t *line = &segs[subsector->firstline];
|
||||||
|
|
||||||
|
for (i = 0; i < subsector->numlines; i++, line++)
|
||||||
|
{
|
||||||
|
if (!line->glseg && line->linedef->special == HORIZONSPECIAL && R_PointOnSegSide(dup_viewx, dup_viewy, line) == 0)
|
||||||
|
{
|
||||||
|
P_ClosestPointOnLine(viewx, viewy, line->linedef, &v);
|
||||||
|
dist = FIXED_TO_FLOAT(R_PointToDist(v.x, v.y));
|
||||||
|
|
||||||
|
x1 = ((polyvertex_t *)line->pv1)->x;
|
||||||
|
y1 = ((polyvertex_t *)line->pv1)->y;
|
||||||
|
xd = ((polyvertex_t *)line->pv2)->x - x1;
|
||||||
|
yd = ((polyvertex_t *)line->pv2)->y - y1;
|
||||||
|
|
||||||
|
// Based on the seg length and the distance from the line, split horizon into multiple poly sets to reduce distortion
|
||||||
|
dist = sqrtf((xd*xd) + (yd*yd)) / dist / 16.0f;
|
||||||
|
if (dist > 100.0f)
|
||||||
|
numplanes = 100;
|
||||||
|
else
|
||||||
|
numplanes = (UINT8)dist + 1;
|
||||||
|
|
||||||
|
for (j = 0; j < numplanes; j++)
|
||||||
|
{
|
||||||
|
// Left side
|
||||||
|
vx = x1 + xd * j / numplanes;
|
||||||
|
vy = y1 + yd * j / numplanes;
|
||||||
|
SETUP3DVERT((&horizonpts[1]), vx, vy);
|
||||||
|
|
||||||
|
dist = sqrtf(powf(vx - gr_viewx, 2) + powf(vy - gr_viewy, 2));
|
||||||
|
vx = (vx - gr_viewx) * renderdist / dist + gr_viewx;
|
||||||
|
vy = (vy - gr_viewy) * renderdist / dist + gr_viewy;
|
||||||
|
SETUP3DVERT((&horizonpts[0]), vx, vy);
|
||||||
|
|
||||||
|
// Right side
|
||||||
|
vx = x1 + xd * (j+1) / numplanes;
|
||||||
|
vy = y1 + yd * (j+1) / numplanes;
|
||||||
|
SETUP3DVERT((&horizonpts[2]), vx, vy);
|
||||||
|
|
||||||
|
dist = sqrtf(powf(vx - gr_viewx, 2) + powf(vy - gr_viewy, 2));
|
||||||
|
vx = (vx - gr_viewx) * renderdist / dist + gr_viewx;
|
||||||
|
vy = (vy - gr_viewy) * renderdist / dist + gr_viewy;
|
||||||
|
SETUP3DVERT((&horizonpts[3]), vx, vy);
|
||||||
|
|
||||||
|
// Horizon fills
|
||||||
|
vx = (horizonpts[0].x - gr_viewx) * farrenderdist / renderdist + gr_viewx;
|
||||||
|
vy = (horizonpts[0].z - gr_viewy) * farrenderdist / renderdist + gr_viewy;
|
||||||
|
SETUP3DVERT((&horizonpts[5]), vx, vy);
|
||||||
|
horizonpts[5].y = gr_viewz;
|
||||||
|
|
||||||
|
vx = (horizonpts[3].x - gr_viewx) * farrenderdist / renderdist + gr_viewx;
|
||||||
|
vy = (horizonpts[3].z - gr_viewy) * farrenderdist / renderdist + gr_viewy;
|
||||||
|
SETUP3DVERT((&horizonpts[4]), vx, vy);
|
||||||
|
horizonpts[4].y = gr_viewz;
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
HWD.pfnDrawPolygon(&Surf, horizonpts, 6, PolyFlags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef ALAM_LIGHTING
|
#ifdef ALAM_LIGHTING
|
||||||
// add here code for dynamic lighting on planes
|
// add here code for dynamic lighting on planes
|
||||||
HWR_PlaneLighting(planeVerts, nrPlaneVerts);
|
HWR_PlaneLighting(planeVerts, nrPlaneVerts);
|
||||||
|
@ -3235,7 +3303,7 @@ static void HWR_Subsector(size_t num)
|
||||||
if (sub->validcount != validcount)
|
if (sub->validcount != validcount)
|
||||||
{
|
{
|
||||||
HWR_GetLevelFlat(&levelflats[gr_frontsector->floorpic]);
|
HWR_GetLevelFlat(&levelflats[gr_frontsector->floorpic]);
|
||||||
HWR_RenderPlane(&extrasubsectors[num], false,
|
HWR_RenderPlane(sub, &extrasubsectors[num], false,
|
||||||
// Hack to make things continue to work around slopes.
|
// Hack to make things continue to work around slopes.
|
||||||
locFloorHeight == cullFloorHeight ? locFloorHeight : gr_frontsector->floorheight,
|
locFloorHeight == cullFloorHeight ? locFloorHeight : gr_frontsector->floorheight,
|
||||||
// We now return you to your regularly scheduled rendering.
|
// We now return you to your regularly scheduled rendering.
|
||||||
|
@ -3257,7 +3325,7 @@ static void HWR_Subsector(size_t num)
|
||||||
if (sub->validcount != validcount)
|
if (sub->validcount != validcount)
|
||||||
{
|
{
|
||||||
HWR_GetLevelFlat(&levelflats[gr_frontsector->ceilingpic]);
|
HWR_GetLevelFlat(&levelflats[gr_frontsector->ceilingpic]);
|
||||||
HWR_RenderPlane(&extrasubsectors[num], true,
|
HWR_RenderPlane(sub, &extrasubsectors[num], true,
|
||||||
// Hack to make things continue to work around slopes.
|
// Hack to make things continue to work around slopes.
|
||||||
locCeilingHeight == cullCeilingHeight ? locCeilingHeight : gr_frontsector->ceilingheight,
|
locCeilingHeight == cullCeilingHeight ? locCeilingHeight : gr_frontsector->ceilingheight,
|
||||||
// We now return you to your regularly scheduled rendering.
|
// We now return you to your regularly scheduled rendering.
|
||||||
|
@ -3340,7 +3408,7 @@ static void HWR_Subsector(size_t num)
|
||||||
{
|
{
|
||||||
HWR_GetLevelFlat(&levelflats[*rover->bottompic]);
|
HWR_GetLevelFlat(&levelflats[*rover->bottompic]);
|
||||||
light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
|
light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
|
||||||
HWR_RenderPlane(&extrasubsectors[num], false, *rover->bottomheight, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, &levelflats[*rover->bottompic],
|
HWR_RenderPlane(sub, &extrasubsectors[num], false, *rover->bottomheight, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, &levelflats[*rover->bottompic],
|
||||||
rover->master->frontsector, 255, *gr_frontsector->lightlist[light].extra_colormap);
|
rover->master->frontsector, 255, *gr_frontsector->lightlist[light].extra_colormap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3392,7 +3460,7 @@ static void HWR_Subsector(size_t num)
|
||||||
{
|
{
|
||||||
HWR_GetLevelFlat(&levelflats[*rover->toppic]);
|
HWR_GetLevelFlat(&levelflats[*rover->toppic]);
|
||||||
light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
|
light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
|
||||||
HWR_RenderPlane(&extrasubsectors[num], true, *rover->topheight, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, &levelflats[*rover->toppic],
|
HWR_RenderPlane(sub, &extrasubsectors[num], true, *rover->topheight, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, &levelflats[*rover->toppic],
|
||||||
rover->master->frontsector, 255, *gr_frontsector->lightlist[light].extra_colormap);
|
rover->master->frontsector, 255, *gr_frontsector->lightlist[light].extra_colormap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4025,7 +4093,7 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
|
||||||
if (h <= temp)
|
if (h <= temp)
|
||||||
{
|
{
|
||||||
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
||||||
lightlevel = *list[i-1].lightlevel;
|
lightlevel = *list[i-1].lightlevel > 255 ? 255 : *list[i-1].lightlevel;
|
||||||
colormap = *list[i-1].extra_colormap;
|
colormap = *list[i-1].extra_colormap;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -4033,7 +4101,7 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
|
||||||
#else
|
#else
|
||||||
i = R_GetPlaneLight(sector, temp, false);
|
i = R_GetPlaneLight(sector, temp, false);
|
||||||
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
||||||
lightlevel = *list[i].lightlevel;
|
lightlevel = *list[i].lightlevel > 255 ? 255 : *list[i].lightlevel;
|
||||||
colormap = *list[i].extra_colormap;
|
colormap = *list[i].extra_colormap;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -4049,7 +4117,7 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
|
||||||
if (!(list[i].flags & FF_NOSHADE) && (list[i].flags & FF_CUTSPRITES))
|
if (!(list[i].flags & FF_NOSHADE) && (list[i].flags & FF_CUTSPRITES))
|
||||||
{
|
{
|
||||||
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
||||||
lightlevel = *list[i].lightlevel;
|
lightlevel = *list[i].lightlevel > 255 ? 255 : *list[i].lightlevel;
|
||||||
colormap = *list[i].extra_colormap;
|
colormap = *list[i].extra_colormap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4322,7 +4390,7 @@ static void HWR_DrawSprite(gr_vissprite_t *spr)
|
||||||
extracolormap_t *colormap = sector->extra_colormap;
|
extracolormap_t *colormap = sector->extra_colormap;
|
||||||
|
|
||||||
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
||||||
lightlevel = sector->lightlevel;
|
lightlevel = sector->lightlevel > 255 ? 255 : sector->lightlevel;
|
||||||
|
|
||||||
HWR_Lighting(&Surf, lightlevel, colormap);
|
HWR_Lighting(&Surf, lightlevel, colormap);
|
||||||
}
|
}
|
||||||
|
@ -4417,7 +4485,7 @@ static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr)
|
||||||
light = R_GetPlaneLight(sector, spr->mobj->z + spr->mobj->height, false); // Always use the light at the top instead of whatever I was doing before
|
light = R_GetPlaneLight(sector, spr->mobj->z + spr->mobj->height, false); // Always use the light at the top instead of whatever I was doing before
|
||||||
|
|
||||||
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
||||||
lightlevel = *sector->lightlist[light].lightlevel;
|
lightlevel = *sector->lightlist[light].lightlevel > 255 ? 255 : *sector->lightlist[light].lightlevel;
|
||||||
|
|
||||||
if (*sector->lightlist[light].extra_colormap)
|
if (*sector->lightlist[light].extra_colormap)
|
||||||
colormap = *sector->lightlist[light].extra_colormap;
|
colormap = *sector->lightlist[light].extra_colormap;
|
||||||
|
@ -4425,7 +4493,7 @@ static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
||||||
lightlevel = sector->lightlevel;
|
lightlevel = sector->lightlevel > 255 ? 255 : sector->lightlevel;
|
||||||
|
|
||||||
if (sector->extra_colormap)
|
if (sector->extra_colormap)
|
||||||
colormap = sector->extra_colormap;
|
colormap = sector->extra_colormap;
|
||||||
|
@ -4837,7 +4905,7 @@ static void HWR_CreateDrawNodes(void)
|
||||||
|
|
||||||
if (!(sortnode[sortindex[i]].plane->blend & PF_NoTexture))
|
if (!(sortnode[sortindex[i]].plane->blend & PF_NoTexture))
|
||||||
HWR_GetLevelFlat(sortnode[sortindex[i]].plane->levelflat);
|
HWR_GetLevelFlat(sortnode[sortindex[i]].plane->levelflat);
|
||||||
HWR_RenderPlane(sortnode[sortindex[i]].plane->xsub, sortnode[sortindex[i]].plane->isceiling, sortnode[sortindex[i]].plane->fixedheight, sortnode[sortindex[i]].plane->blend, sortnode[sortindex[i]].plane->lightlevel,
|
HWR_RenderPlane(NULL, sortnode[sortindex[i]].plane->xsub, sortnode[sortindex[i]].plane->isceiling, sortnode[sortindex[i]].plane->fixedheight, sortnode[sortindex[i]].plane->blend, sortnode[sortindex[i]].plane->lightlevel,
|
||||||
sortnode[sortindex[i]].plane->levelflat, sortnode[sortindex[i]].plane->FOFSector, sortnode[sortindex[i]].plane->alpha, sortnode[sortindex[i]].plane->planecolormap);
|
sortnode[sortindex[i]].plane->levelflat, sortnode[sortindex[i]].plane->FOFSector, sortnode[sortindex[i]].plane->alpha, sortnode[sortindex[i]].plane->planecolormap);
|
||||||
}
|
}
|
||||||
else if (sortnode[sortindex[i]].polyplane)
|
else if (sortnode[sortindex[i]].polyplane)
|
||||||
|
@ -6155,7 +6223,6 @@ void HWR_Shutdown(void)
|
||||||
CONS_Printf("HWR_Shutdown()\n");
|
CONS_Printf("HWR_Shutdown()\n");
|
||||||
HWR_FreeExtraSubsectors();
|
HWR_FreeExtraSubsectors();
|
||||||
HWR_FreePolyPool();
|
HWR_FreePolyPool();
|
||||||
HWR_FreeMipmapCache();
|
|
||||||
HWR_FreeTextureCache();
|
HWR_FreeTextureCache();
|
||||||
HWD.pfnFlushScreenTextures();
|
HWD.pfnFlushScreenTextures();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1207,7 +1207,7 @@ boolean HWR_DrawModel(gr_vissprite_t *spr)
|
||||||
light = R_GetPlaneLight(sector, spr->mobj->z + spr->mobj->height, false); // Always use the light at the top instead of whatever I was doing before
|
light = R_GetPlaneLight(sector, spr->mobj->z + spr->mobj->height, false); // Always use the light at the top instead of whatever I was doing before
|
||||||
|
|
||||||
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
||||||
lightlevel = *sector->lightlist[light].lightlevel;
|
lightlevel = *sector->lightlist[light].lightlevel > 255 ? 255 : *sector->lightlist[light].lightlevel;
|
||||||
|
|
||||||
if (*sector->lightlist[light].extra_colormap)
|
if (*sector->lightlist[light].extra_colormap)
|
||||||
colormap = *sector->lightlist[light].extra_colormap;
|
colormap = *sector->lightlist[light].extra_colormap;
|
||||||
|
@ -1215,7 +1215,7 @@ boolean HWR_DrawModel(gr_vissprite_t *spr)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
if (!(spr->mobj->frame & FF_FULLBRIGHT))
|
||||||
lightlevel = sector->lightlevel;
|
lightlevel = sector->lightlevel > 255 ? 255 : sector->lightlevel;
|
||||||
|
|
||||||
if (sector->extra_colormap)
|
if (sector->extra_colormap)
|
||||||
colormap = sector->extra_colormap;
|
colormap = sector->extra_colormap;
|
||||||
|
@ -1461,7 +1461,7 @@ boolean HWR_DrawModel(gr_vissprite_t *spr)
|
||||||
|
|
||||||
// rotation pivot
|
// rotation pivot
|
||||||
p.centerx = FIXED_TO_FLOAT(spr->mobj->radius/2);
|
p.centerx = FIXED_TO_FLOAT(spr->mobj->radius/2);
|
||||||
p.centery = FIXED_TO_FLOAT(spr->mobj->height/2);
|
p.centery = FIXED_TO_FLOAT(spr->mobj->height/(flip ? -2 : 2));
|
||||||
|
|
||||||
// rotation axis
|
// rotation axis
|
||||||
if (sprinfo->available)
|
if (sprinfo->available)
|
||||||
|
@ -1473,6 +1473,9 @@ boolean HWR_DrawModel(gr_vissprite_t *spr)
|
||||||
p.rollflip = 1;
|
p.rollflip = 1;
|
||||||
else if ((sprframe->rotate & SRF_LEFT) && (ang >= ANGLE_180)) // See from left
|
else if ((sprframe->rotate & SRF_LEFT) && (ang >= ANGLE_180)) // See from left
|
||||||
p.rollflip = -1;
|
p.rollflip = -1;
|
||||||
|
|
||||||
|
if (flip)
|
||||||
|
p.rollflip *= -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
p.anglex = 0.0f;
|
p.anglex = 0.0f;
|
||||||
|
|
|
@ -1423,6 +1423,7 @@ static void SOCK_ClearBans(void)
|
||||||
boolean I_InitTcpNetwork(void)
|
boolean I_InitTcpNetwork(void)
|
||||||
{
|
{
|
||||||
char serverhostname[255];
|
char serverhostname[255];
|
||||||
|
const char *urlparam = NULL;
|
||||||
boolean ret = false;
|
boolean ret = false;
|
||||||
// initilize the OS's TCP/IP stack
|
// initilize the OS's TCP/IP stack
|
||||||
if (!I_InitTcpDriver())
|
if (!I_InitTcpDriver())
|
||||||
|
@ -1476,10 +1477,12 @@ boolean I_InitTcpNetwork(void)
|
||||||
|
|
||||||
ret = true;
|
ret = true;
|
||||||
}
|
}
|
||||||
else if (M_CheckParm("-connect"))
|
else if ((urlparam = M_GetUrlProtocolArg()) != NULL || M_CheckParm("-connect"))
|
||||||
{
|
{
|
||||||
if (M_IsNextParm())
|
if (urlparam != NULL)
|
||||||
strcpy(serverhostname, M_GetNextParm());
|
strlcpy(serverhostname, urlparam, sizeof(serverhostname));
|
||||||
|
else if (M_IsNextParm())
|
||||||
|
strlcpy(serverhostname, M_GetNextParm(), sizeof(serverhostname));
|
||||||
else
|
else
|
||||||
serverhostname[0] = 0; // assuming server in the LAN, use broadcast to detect it
|
serverhostname[0] = 0; // assuming server in the LAN, use broadcast to detect it
|
||||||
|
|
||||||
|
|
|
@ -36,10 +36,10 @@ typedef enum
|
||||||
*/
|
*/
|
||||||
extern rendermode_t rendermode;
|
extern rendermode_t rendermode;
|
||||||
|
|
||||||
/** \brief hardware renderer loaded
|
/** \brief OpenGL state
|
||||||
0 = never loaded, 1 = loaded successfully, -1 = failed loading
|
0 = never loaded, 1 = loaded successfully, -1 = failed loading
|
||||||
*/
|
*/
|
||||||
extern INT32 hwrenderloaded;
|
extern INT32 vid_opengl_state;
|
||||||
|
|
||||||
/** \brief use highcolor modes if true
|
/** \brief use highcolor modes if true
|
||||||
*/
|
*/
|
||||||
|
@ -49,11 +49,7 @@ extern boolean highcolor;
|
||||||
*/
|
*/
|
||||||
void I_StartupGraphics(void);
|
void I_StartupGraphics(void);
|
||||||
|
|
||||||
/** \brief setup hardware mode
|
/** \brief shutdown video mode
|
||||||
*/
|
|
||||||
void I_StartupHardwareGraphics(void);
|
|
||||||
|
|
||||||
/** \brief restore old video mode
|
|
||||||
*/
|
*/
|
||||||
void I_ShutdownGraphics(void);
|
void I_ShutdownGraphics(void);
|
||||||
|
|
||||||
|
@ -97,6 +93,14 @@ INT32 VID_SetMode(INT32 modenum);
|
||||||
*/
|
*/
|
||||||
void VID_CheckRenderer(void);
|
void VID_CheckRenderer(void);
|
||||||
|
|
||||||
|
/** \brief Load OpenGL mode
|
||||||
|
*/
|
||||||
|
void VID_StartupOpenGL(void);
|
||||||
|
|
||||||
|
/** \brief Checks if OpenGL loaded
|
||||||
|
*/
|
||||||
|
void VID_CheckGLLoaded(rendermode_t oldrender);
|
||||||
|
|
||||||
/** \brief The VID_GetModeName function
|
/** \brief The VID_GetModeName function
|
||||||
|
|
||||||
\param modenum video mode number
|
\param modenum video mode number
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#include "z_zone.h"
|
#include "z_zone.h"
|
||||||
#include "r_main.h"
|
#include "r_main.h"
|
||||||
#include "r_draw.h"
|
#include "r_draw.h"
|
||||||
#include "r_things.h"
|
#include "r_things.h" // R_Frame2Char etc
|
||||||
#include "m_random.h"
|
#include "m_random.h"
|
||||||
#include "s_sound.h"
|
#include "s_sound.h"
|
||||||
#include "g_game.h"
|
#include "g_game.h"
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include "doomstat.h"
|
#include "doomstat.h"
|
||||||
#include "p_mobj.h"
|
#include "p_mobj.h"
|
||||||
#include "g_game.h"
|
#include "g_game.h"
|
||||||
#include "r_things.h"
|
#include "r_skins.h"
|
||||||
#include "b_bot.h"
|
#include "b_bot.h"
|
||||||
#include "z_zone.h"
|
#include "z_zone.h"
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include "doomdef.h"
|
#include "doomdef.h"
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
#include "fastcmp.h"
|
#include "fastcmp.h"
|
||||||
#include "r_things.h"
|
#include "r_skins.h"
|
||||||
#include "p_local.h"
|
#include "p_local.h"
|
||||||
#include "g_game.h"
|
#include "g_game.h"
|
||||||
#include "p_setup.h"
|
#include "p_setup.h"
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include "doomdef.h"
|
#include "doomdef.h"
|
||||||
#ifdef HAVE_BLUA
|
#ifdef HAVE_BLUA
|
||||||
#include "fastcmp.h"
|
#include "fastcmp.h"
|
||||||
#include "r_things.h"
|
#include "r_skins.h"
|
||||||
#include "sounds.h"
|
#include "sounds.h"
|
||||||
|
|
||||||
#include "lua_script.h"
|
#include "lua_script.h"
|
||||||
|
|
19
src/m_argv.c
19
src/m_argv.c
|
@ -34,6 +34,25 @@ boolean myargmalloc = false;
|
||||||
*/
|
*/
|
||||||
static INT32 found;
|
static INT32 found;
|
||||||
|
|
||||||
|
/** \brief Parses a server URL (such as srb2://127.0.0.1) as may be passed to the game via a web browser, etc.
|
||||||
|
|
||||||
|
\return the contents of the URL after the protocol (a server to join), or NULL if not found
|
||||||
|
*/
|
||||||
|
const char *M_GetUrlProtocolArg(void)
|
||||||
|
{
|
||||||
|
INT32 i;
|
||||||
|
const size_t len = strlen(SERVER_URL_PROTOCOL);
|
||||||
|
|
||||||
|
for (i = 1; i < myargc; i++)
|
||||||
|
{
|
||||||
|
if (strlen(myargv[i]) > len && !strnicmp(myargv[i], SERVER_URL_PROTOCOL, len))
|
||||||
|
{
|
||||||
|
return &myargv[i][len];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/** \brief The M_CheckParm function
|
/** \brief The M_CheckParm function
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,9 @@ extern INT32 myargc;
|
||||||
extern char **myargv;
|
extern char **myargv;
|
||||||
extern boolean myargmalloc;
|
extern boolean myargmalloc;
|
||||||
|
|
||||||
|
// Looks for an srb2:// (or similar) URL passed in as an argument and returns the IP to connect to if found.
|
||||||
|
const char *M_GetUrlProtocolArg(void);
|
||||||
|
|
||||||
// Returns the position of the given parameter in the arg list (0 if not found).
|
// Returns the position of the given parameter in the arg list (0 if not found).
|
||||||
INT32 M_CheckParm(const char *check);
|
INT32 M_CheckParm(const char *check);
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
#include "v_video.h" // video flags
|
#include "v_video.h" // video flags
|
||||||
|
|
||||||
#include "g_game.h" // record info
|
#include "g_game.h" // record info
|
||||||
#include "r_things.h" // numskins
|
#include "r_skins.h" // numskins
|
||||||
#include "r_draw.h" // R_GetColorByName
|
#include "r_draw.h" // R_GetColorByName
|
||||||
|
|
||||||
// Map triggers for linedef executors
|
// Map triggers for linedef executors
|
||||||
|
|
|
@ -38,8 +38,20 @@ typedef INT32 fixed_t;
|
||||||
/*!
|
/*!
|
||||||
\brief convert fixed_t into floating number
|
\brief convert fixed_t into floating number
|
||||||
*/
|
*/
|
||||||
#define FIXED_TO_FLOAT(x) (((float)(x)) / ((float)FRACUNIT))
|
|
||||||
#define FLOAT_TO_FIXED(f) (fixed_t)((f) * ((float)FRACUNIT))
|
FUNCMATH FUNCINLINE static ATTRINLINE float FixedToFloat(fixed_t x)
|
||||||
|
{
|
||||||
|
return x / (float)FRACUNIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
FUNCMATH FUNCINLINE static ATTRINLINE fixed_t FloatToFixed(float f)
|
||||||
|
{
|
||||||
|
return (fixed_t)(f * FRACUNIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
// for backwards compat
|
||||||
|
#define FIXED_TO_FLOAT(x) FixedToFloat(x) // (((float)(x)) / ((float)FRACUNIT))
|
||||||
|
#define FLOAT_TO_FIXED(f) FloatToFixed(f) // (fixed_t)((f) * ((float)FRACUNIT))
|
||||||
|
|
||||||
|
|
||||||
#if defined (__WATCOMC__) && FRACBITS == 16
|
#if defined (__WATCOMC__) && FRACBITS == 16
|
||||||
|
|
75
src/m_menu.c
75
src/m_menu.c
|
@ -519,6 +519,8 @@ static menuitem_t MISC_AddonsMenu[] =
|
||||||
// ---------------------------------
|
// ---------------------------------
|
||||||
static menuitem_t MAPauseMenu[] =
|
static menuitem_t MAPauseMenu[] =
|
||||||
{
|
{
|
||||||
|
{IT_CALL | IT_STRING, NULL, "Emblem Hints...", M_EmblemHints, 32},
|
||||||
|
|
||||||
{IT_CALL | IT_STRING, NULL, "Continue", M_SelectableClearMenus,48},
|
{IT_CALL | IT_STRING, NULL, "Continue", M_SelectableClearMenus,48},
|
||||||
{IT_CALL | IT_STRING, NULL, "Retry", M_ModeAttackRetry, 56},
|
{IT_CALL | IT_STRING, NULL, "Retry", M_ModeAttackRetry, 56},
|
||||||
{IT_CALL | IT_STRING, NULL, "Abort", M_ModeAttackEndGame, 64},
|
{IT_CALL | IT_STRING, NULL, "Abort", M_ModeAttackEndGame, 64},
|
||||||
|
@ -526,6 +528,7 @@ static menuitem_t MAPauseMenu[] =
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
|
mapause_hints,
|
||||||
mapause_continue,
|
mapause_continue,
|
||||||
mapause_retry,
|
mapause_retry,
|
||||||
mapause_abort
|
mapause_abort
|
||||||
|
@ -727,9 +730,9 @@ static menuitem_t SR_SoundTestMenu[] =
|
||||||
|
|
||||||
static menuitem_t SR_EmblemHintMenu[] =
|
static menuitem_t SR_EmblemHintMenu[] =
|
||||||
{
|
{
|
||||||
{IT_STRING | IT_ARROWS, NULL, "Page", M_HandleEmblemHints, 10},
|
{IT_STRING | IT_ARROWS, NULL, "Page", M_HandleEmblemHints, 10},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Emblem Radar", &cv_itemfinder, 20},
|
{IT_STRING|IT_CVAR, NULL, "Emblem Radar", &cv_itemfinder, 20},
|
||||||
{IT_WHITESTRING|IT_SUBMENU, NULL, "Back", &SPauseDef, 30}
|
{IT_WHITESTRING|IT_CALL, NULL, "Back", M_GoBack, 30}
|
||||||
};
|
};
|
||||||
|
|
||||||
// --------------------------------
|
// --------------------------------
|
||||||
|
@ -2089,7 +2092,7 @@ static void M_VideoOptions(INT32 choice)
|
||||||
{
|
{
|
||||||
(void)choice;
|
(void)choice;
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
if (hwrenderloaded == -1)
|
if (vid_opengl_state == -1)
|
||||||
{
|
{
|
||||||
OP_VideoOptionsMenu[op_video_renderer].status = (IT_TRANSTEXT | IT_PAIR);
|
OP_VideoOptionsMenu[op_video_renderer].status = (IT_TRANSTEXT | IT_PAIR);
|
||||||
OP_VideoOptionsMenu[op_video_renderer].patch = "Renderer";
|
OP_VideoOptionsMenu[op_video_renderer].patch = "Renderer";
|
||||||
|
@ -2184,7 +2187,7 @@ menu_t OP_DataOptionsDef = DEFAULTMENUSTYLE(
|
||||||
menu_t OP_ScreenshotOptionsDef =
|
menu_t OP_ScreenshotOptionsDef =
|
||||||
{
|
{
|
||||||
MN_OP_MAIN + (MN_OP_DATA << 6) + (MN_OP_SCREENSHOTS << 12),
|
MN_OP_MAIN + (MN_OP_DATA << 6) + (MN_OP_SCREENSHOTS << 12),
|
||||||
"M_DATA",
|
"M_SCREEN",
|
||||||
sizeof (OP_ScreenshotOptionsMenu)/sizeof (menuitem_t),
|
sizeof (OP_ScreenshotOptionsMenu)/sizeof (menuitem_t),
|
||||||
&OP_DataOptionsDef,
|
&OP_DataOptionsDef,
|
||||||
OP_ScreenshotOptionsMenu,
|
OP_ScreenshotOptionsMenu,
|
||||||
|
@ -3614,6 +3617,7 @@ void M_StartControlPanel(void)
|
||||||
else if (modeattacking)
|
else if (modeattacking)
|
||||||
{
|
{
|
||||||
currentMenu = &MAPauseDef;
|
currentMenu = &MAPauseDef;
|
||||||
|
MAPauseMenu[mapause_hints].status = (M_SecretUnlocked(SECRET_EMBLEMHINTS)) ? (IT_STRING | IT_CALL) : (IT_DISABLED);
|
||||||
itemOn = mapause_continue;
|
itemOn = mapause_continue;
|
||||||
}
|
}
|
||||||
else if (!(netgame || multiplayer)) // Single Player
|
else if (!(netgame || multiplayer)) // Single Player
|
||||||
|
@ -5054,6 +5058,17 @@ static boolean M_SetNextMapOnPlatter(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static boolean M_GametypeHasLevels(INT32 gt)
|
||||||
|
{
|
||||||
|
INT32 mapnum;
|
||||||
|
|
||||||
|
for (mapnum = 0; mapnum < NUMMAPS; mapnum++)
|
||||||
|
if (M_CanShowLevelOnPlatter(mapnum, gt))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static INT32 M_CountRowsToShowOnPlatter(INT32 gt)
|
static INT32 M_CountRowsToShowOnPlatter(INT32 gt)
|
||||||
{
|
{
|
||||||
INT32 mapnum = 0, prevmapnum = 0, col = 0, rows = 0;
|
INT32 mapnum = 0, prevmapnum = 0, col = 0, rows = 0;
|
||||||
|
@ -5371,7 +5386,10 @@ static void M_HandleLevelPlatter(INT32 choice)
|
||||||
case KEY_RIGHTARROW:
|
case KEY_RIGHTARROW:
|
||||||
if (levellistmode == LLM_CREATESERVER && !lsrow)
|
if (levellistmode == LLM_CREATESERVER && !lsrow)
|
||||||
{
|
{
|
||||||
CV_AddValue(&cv_newgametype, 1);
|
INT32 startinggametype = cv_newgametype.value;
|
||||||
|
do
|
||||||
|
CV_AddValue(&cv_newgametype, 1);
|
||||||
|
while (cv_newgametype.value != startinggametype && !M_GametypeHasLevels(cv_newgametype.value));
|
||||||
S_StartSound(NULL,sfx_menu1);
|
S_StartSound(NULL,sfx_menu1);
|
||||||
lscol = 0;
|
lscol = 0;
|
||||||
|
|
||||||
|
@ -5400,7 +5418,10 @@ static void M_HandleLevelPlatter(INT32 choice)
|
||||||
case KEY_LEFTARROW:
|
case KEY_LEFTARROW:
|
||||||
if (levellistmode == LLM_CREATESERVER && !lsrow)
|
if (levellistmode == LLM_CREATESERVER && !lsrow)
|
||||||
{
|
{
|
||||||
CV_AddValue(&cv_newgametype, -1);
|
INT32 startinggametype = cv_newgametype.value;
|
||||||
|
do
|
||||||
|
CV_AddValue(&cv_newgametype, -1);
|
||||||
|
while (cv_newgametype.value != startinggametype && !M_GametypeHasLevels(cv_newgametype.value));
|
||||||
S_StartSound(NULL,sfx_menu1);
|
S_StartSound(NULL,sfx_menu1);
|
||||||
lscol = 0;
|
lscol = 0;
|
||||||
|
|
||||||
|
@ -5720,6 +5741,8 @@ static void M_DrawNightsAttackSuperSonic(void)
|
||||||
const UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_YELLOW, GTC_CACHE);
|
const UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_YELLOW, GTC_CACHE);
|
||||||
INT32 timer = (ntsatkdrawtimer/4) % 2;
|
INT32 timer = (ntsatkdrawtimer/4) % 2;
|
||||||
angle_t fa = (FixedAngle(((ntsatkdrawtimer * 4) % 360)<<FRACBITS)>>ANGLETOFINESHIFT) & FINEMASK;
|
angle_t fa = (FixedAngle(((ntsatkdrawtimer * 4) % 360)<<FRACBITS)>>ANGLETOFINESHIFT) & FINEMASK;
|
||||||
|
ntssupersonic[0] = W_CachePatchName("NTSSONC1", PU_PATCH);
|
||||||
|
ntssupersonic[1] = W_CachePatchName("NTSSONC2", PU_PATCH);
|
||||||
V_DrawFixedPatch(235<<FRACBITS, (120<<FRACBITS) - (8*FINESINE(fa)), FRACUNIT, 0, ntssupersonic[timer], colormap);
|
V_DrawFixedPatch(235<<FRACBITS, (120<<FRACBITS) - (8*FINESINE(fa)), FRACUNIT, 0, ntssupersonic[timer], colormap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7271,6 +7294,7 @@ static void M_EmblemHints(INT32 choice)
|
||||||
SR_EmblemHintMenu[0].status = (local > NUMHINTS*2) ? (IT_STRING | IT_ARROWS) : (IT_DISABLED);
|
SR_EmblemHintMenu[0].status = (local > NUMHINTS*2) ? (IT_STRING | IT_ARROWS) : (IT_DISABLED);
|
||||||
SR_EmblemHintMenu[1].status = (M_SecretUnlocked(SECRET_ITEMFINDER)) ? (IT_CVAR|IT_STRING) : (IT_SECRET);
|
SR_EmblemHintMenu[1].status = (M_SecretUnlocked(SECRET_ITEMFINDER)) ? (IT_CVAR|IT_STRING) : (IT_SECRET);
|
||||||
hintpage = 1;
|
hintpage = 1;
|
||||||
|
SR_EmblemHintDef.prevMenu = currentMenu;
|
||||||
M_SetupNextMenu(&SR_EmblemHintDef);
|
M_SetupNextMenu(&SR_EmblemHintDef);
|
||||||
itemOn = 2; // always start on back.
|
itemOn = 2; // always start on back.
|
||||||
}
|
}
|
||||||
|
@ -7951,12 +7975,20 @@ static void M_CustomLevelSelect(INT32 choice)
|
||||||
static void M_SinglePlayerMenu(INT32 choice)
|
static void M_SinglePlayerMenu(INT32 choice)
|
||||||
{
|
{
|
||||||
(void)choice;
|
(void)choice;
|
||||||
SP_MainMenu[sptutorial].status =
|
|
||||||
tutorialmap ? IT_CALL|IT_STRING : IT_NOTHING|IT_DISABLED;
|
levellistmode = LLM_RECORDATTACK;
|
||||||
SP_MainMenu[sprecordattack].status =
|
if (M_GametypeHasLevels(-1))
|
||||||
(M_SecretUnlocked(SECRET_RECORDATTACK)) ? IT_CALL|IT_STRING : IT_SECRET;
|
SP_MainMenu[sprecordattack].status = (M_SecretUnlocked(SECRET_RECORDATTACK)) ? IT_CALL|IT_STRING : IT_SECRET;
|
||||||
SP_MainMenu[spnightsmode].status =
|
else
|
||||||
(M_SecretUnlocked(SECRET_NIGHTSMODE)) ? IT_CALL|IT_STRING : IT_SECRET;
|
SP_MainMenu[sprecordattack].status = IT_NOTHING|IT_DISABLED;
|
||||||
|
|
||||||
|
levellistmode = LLM_NIGHTSATTACK;
|
||||||
|
if (M_GametypeHasLevels(-1))
|
||||||
|
SP_MainMenu[spnightsmode].status = (M_SecretUnlocked(SECRET_NIGHTSMODE)) ? IT_CALL|IT_STRING : IT_SECRET;
|
||||||
|
else
|
||||||
|
SP_MainMenu[spnightsmode].status = IT_NOTHING|IT_DISABLED;
|
||||||
|
|
||||||
|
SP_MainMenu[sptutorial].status = tutorialmap ? IT_CALL|IT_STRING : IT_NOTHING|IT_DISABLED;
|
||||||
|
|
||||||
M_SetupNextMenu(&SP_MainDef);
|
M_SetupNextMenu(&SP_MainDef);
|
||||||
}
|
}
|
||||||
|
@ -9958,9 +9990,6 @@ static void M_NightsAttack(INT32 choice)
|
||||||
// This is really just to make sure Sonic is the played character, just in case
|
// This is really just to make sure Sonic is the played character, just in case
|
||||||
M_PatchSkinNameTable();
|
M_PatchSkinNameTable();
|
||||||
|
|
||||||
ntssupersonic[0] = W_CachePatchName("NTSSONC1", PU_PATCH);
|
|
||||||
ntssupersonic[1] = W_CachePatchName("NTSSONC2", PU_PATCH);
|
|
||||||
|
|
||||||
G_SetGamestate(GS_TIMEATTACK); // do this before M_SetupNextMenu so that menu meta state knows that we're switching
|
G_SetGamestate(GS_TIMEATTACK); // do this before M_SetupNextMenu so that menu meta state knows that we're switching
|
||||||
titlemapinaction = TITLEMAP_OFF; // Nope don't give us HOMs please
|
titlemapinaction = TITLEMAP_OFF; // Nope don't give us HOMs please
|
||||||
M_SetupNextMenu(&SP_NightsAttackDef);
|
M_SetupNextMenu(&SP_NightsAttackDef);
|
||||||
|
@ -10080,13 +10109,13 @@ static void M_ReplayTimeAttack(INT32 choice)
|
||||||
static void M_EraseGuest(INT32 choice)
|
static void M_EraseGuest(INT32 choice)
|
||||||
{
|
{
|
||||||
const char *rguest = va("%s"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s-guest.lmp", srb2home, timeattackfolder, G_BuildMapName(cv_nextmap.value));
|
const char *rguest = va("%s"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s-guest.lmp", srb2home, timeattackfolder, G_BuildMapName(cv_nextmap.value));
|
||||||
(void)choice;
|
|
||||||
if (FIL_FileExists(rguest))
|
if (choice == 'y' || choice == KEY_ENTER)
|
||||||
remove(rguest);
|
{
|
||||||
if (currentMenu == &SP_NightsGuestReplayDef)
|
if (FIL_FileExists(rguest))
|
||||||
M_SetupNextMenu(&SP_NightsAttackDef);
|
remove(rguest);
|
||||||
else
|
}
|
||||||
M_SetupNextMenu(&SP_TimeAttackDef);
|
M_SetupNextMenu(currentMenu->prevMenu->prevMenu);
|
||||||
Nextmap_OnChange();
|
Nextmap_OnChange();
|
||||||
M_StartMessage(M_GetText("Guest replay data erased.\n"),NULL,MM_NOTHING);
|
M_StartMessage(M_GetText("Guest replay data erased.\n"),NULL,MM_NOTHING);
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,9 +15,10 @@
|
||||||
#ifndef __X_MENU__
|
#ifndef __X_MENU__
|
||||||
#define __X_MENU__
|
#define __X_MENU__
|
||||||
|
|
||||||
|
#include "doomstat.h" // for NUMGAMETYPES
|
||||||
#include "d_event.h"
|
#include "d_event.h"
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
#include "r_things.h" // for SKINNAMESIZE
|
#include "r_skins.h" // for SKINNAMESIZE
|
||||||
#include "f_finale.h" // for ttmode_enum
|
#include "f_finale.h" // for ttmode_enum
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#include "s_sound.h"
|
#include "s_sound.h"
|
||||||
#include "m_random.h"
|
#include "m_random.h"
|
||||||
#include "m_misc.h"
|
#include "m_misc.h"
|
||||||
#include "r_things.h"
|
#include "r_skins.h"
|
||||||
#include "i_video.h"
|
#include "i_video.h"
|
||||||
#include "z_zone.h"
|
#include "z_zone.h"
|
||||||
#include "lua_hook.h"
|
#include "lua_hook.h"
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include "p_local.h"
|
#include "p_local.h"
|
||||||
#include "p_setup.h"
|
#include "p_setup.h"
|
||||||
#include "r_main.h"
|
#include "r_main.h"
|
||||||
#include "r_things.h"
|
#include "r_skins.h"
|
||||||
#include "r_sky.h"
|
#include "r_sky.h"
|
||||||
#include "r_splats.h"
|
#include "r_splats.h"
|
||||||
#include "s_sound.h"
|
#include "s_sound.h"
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#include "p_setup.h"
|
#include "p_setup.h"
|
||||||
#include "p_saveg.h"
|
#include "p_saveg.h"
|
||||||
#include "r_data.h"
|
#include "r_data.h"
|
||||||
#include "r_things.h"
|
#include "r_skins.h"
|
||||||
#include "r_state.h"
|
#include "r_state.h"
|
||||||
#include "w_wad.h"
|
#include "w_wad.h"
|
||||||
#include "y_inter.h"
|
#include "y_inter.h"
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
#include "i_system.h"
|
#include "i_system.h"
|
||||||
|
|
||||||
#include "r_data.h"
|
#include "r_data.h"
|
||||||
#include "r_things.h"
|
#include "r_things.h" // for R_AddSpriteDefs
|
||||||
#include "r_patch.h"
|
#include "r_patch.h"
|
||||||
#include "r_sky.h"
|
#include "r_sky.h"
|
||||||
#include "r_draw.h"
|
#include "r_draw.h"
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#include "m_cond.h" //unlock triggers
|
#include "m_cond.h" //unlock triggers
|
||||||
#include "lua_hook.h" // LUAh_LinedefExecute
|
#include "lua_hook.h" // LUAh_LinedefExecute
|
||||||
#include "f_finale.h" // control text prompt
|
#include "f_finale.h" // control text prompt
|
||||||
#include "r_things.h" // skins
|
#include "r_skins.h" // skins
|
||||||
|
|
||||||
#ifdef HW3SOUND
|
#ifdef HW3SOUND
|
||||||
#include "hardware/hw3sound.h"
|
#include "hardware/hw3sound.h"
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#include "p_local.h"
|
#include "p_local.h"
|
||||||
#include "r_main.h"
|
#include "r_main.h"
|
||||||
#include "s_sound.h"
|
#include "s_sound.h"
|
||||||
#include "r_things.h"
|
#include "r_skins.h"
|
||||||
#include "d_think.h"
|
#include "d_think.h"
|
||||||
#include "r_sky.h"
|
#include "r_sky.h"
|
||||||
#include "p_setup.h"
|
#include "p_setup.h"
|
||||||
|
|
22
src/r_segs.c
22
src/r_segs.c
|
@ -240,14 +240,13 @@ static void R_DrawWallSplats(void)
|
||||||
// way we don't have to store extra post_t info with each column for
|
// way we don't have to store extra post_t info with each column for
|
||||||
// multi-patch textures. They are not normally needed as multi-patch
|
// multi-patch textures. They are not normally needed as multi-patch
|
||||||
// textures don't have holes in it. At least not for now.
|
// textures don't have holes in it. At least not for now.
|
||||||
static INT32 column2s_length; // column->length : for multi-patch on 2sided wall = texture->height
|
|
||||||
|
|
||||||
static void R_Render2sidedMultiPatchColumn(column_t *column)
|
static void R_Render2sidedMultiPatchColumn(column_t *column)
|
||||||
{
|
{
|
||||||
INT32 topscreen, bottomscreen;
|
INT32 topscreen, bottomscreen;
|
||||||
|
|
||||||
topscreen = sprtopscreen; // + spryscale*column->topdelta; topdelta is 0 for the wall
|
topscreen = sprtopscreen; // + spryscale*column->topdelta; topdelta is 0 for the wall
|
||||||
bottomscreen = topscreen + spryscale * column2s_length;
|
bottomscreen = topscreen + spryscale * lengthcol;
|
||||||
|
|
||||||
dc_yl = (sprtopscreen+FRACUNIT-1)>>FRACBITS;
|
dc_yl = (sprtopscreen+FRACUNIT-1)>>FRACBITS;
|
||||||
dc_yh = (bottomscreen-1)>>FRACBITS;
|
dc_yh = (bottomscreen-1)>>FRACBITS;
|
||||||
|
@ -279,13 +278,6 @@ static void R_Render2sidedMultiPatchColumn(column_t *column)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// quick wrapper for R_DrawFlippedMaskedColumn so it can be set as a colfunc_2s value
|
|
||||||
// uses column2s_length for texture->height as above
|
|
||||||
static void R_DrawFlippedMaskedSegColumn(column_t *column)
|
|
||||||
{
|
|
||||||
R_DrawFlippedMaskedColumn(column, column2s_length);
|
|
||||||
}
|
|
||||||
|
|
||||||
void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
{
|
{
|
||||||
size_t pindex;
|
size_t pindex;
|
||||||
|
@ -364,8 +356,8 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
{
|
{
|
||||||
if (textures[texnum]->flip & 2) // vertically flipped?
|
if (textures[texnum]->flip & 2) // vertically flipped?
|
||||||
{
|
{
|
||||||
colfunc_2s = R_DrawFlippedMaskedSegColumn;
|
colfunc_2s = R_DrawFlippedMaskedColumn;
|
||||||
column2s_length = textures[texnum]->height;
|
lengthcol = textures[texnum]->height;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
colfunc_2s = R_DrawMaskedColumn; // render the usual 2sided single-patch packed texture
|
colfunc_2s = R_DrawMaskedColumn; // render the usual 2sided single-patch packed texture
|
||||||
|
@ -373,7 +365,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
colfunc_2s = R_Render2sidedMultiPatchColumn; // render multipatch with no holes (no post_t info)
|
colfunc_2s = R_Render2sidedMultiPatchColumn; // render multipatch with no holes (no post_t info)
|
||||||
column2s_length = textures[texnum]->height;
|
lengthcol = textures[texnum]->height;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup lighting based on the presence/lack-of 3D floors.
|
// Setup lighting based on the presence/lack-of 3D floors.
|
||||||
|
@ -733,7 +725,7 @@ static void R_DrawRepeatMaskedColumn(column_t *col)
|
||||||
static void R_DrawRepeatFlippedMaskedColumn(column_t *col)
|
static void R_DrawRepeatFlippedMaskedColumn(column_t *col)
|
||||||
{
|
{
|
||||||
do {
|
do {
|
||||||
R_DrawFlippedMaskedColumn(col, column2s_length);
|
R_DrawFlippedMaskedColumn(col);
|
||||||
sprtopscreen += dc_texheight*spryscale;
|
sprtopscreen += dc_texheight*spryscale;
|
||||||
} while (sprtopscreen < sprbotscreen);
|
} while (sprtopscreen < sprbotscreen);
|
||||||
}
|
}
|
||||||
|
@ -1065,7 +1057,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
if (textures[texnum]->flip & 2) // vertically flipped?
|
if (textures[texnum]->flip & 2) // vertically flipped?
|
||||||
{
|
{
|
||||||
colfunc_2s = R_DrawRepeatFlippedMaskedColumn;
|
colfunc_2s = R_DrawRepeatFlippedMaskedColumn;
|
||||||
column2s_length = textures[texnum]->height;
|
lengthcol = textures[texnum]->height;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
colfunc_2s = R_DrawRepeatMaskedColumn; // render the usual 2sided single-patch packed texture
|
colfunc_2s = R_DrawRepeatMaskedColumn; // render the usual 2sided single-patch packed texture
|
||||||
|
@ -1073,7 +1065,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
colfunc_2s = R_Render2sidedMultiPatchColumn; //render multipatch with no holes (no post_t info)
|
colfunc_2s = R_Render2sidedMultiPatchColumn; //render multipatch with no holes (no post_t info)
|
||||||
column2s_length = textures[texnum]->height;
|
lengthcol = textures[texnum]->height;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
|
|
|
@ -0,0 +1,825 @@
|
||||||
|
// SONIC ROBO BLAST 2
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
|
//
|
||||||
|
// This program is free software distributed under the
|
||||||
|
// terms of the GNU General Public License, version 2.
|
||||||
|
// See the 'LICENSE' file for more details.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
/// \file r_skins.c
|
||||||
|
/// \brief Loading skins
|
||||||
|
|
||||||
|
#include "doomdef.h"
|
||||||
|
#include "console.h"
|
||||||
|
#include "g_game.h"
|
||||||
|
#include "r_local.h"
|
||||||
|
#include "st_stuff.h"
|
||||||
|
#include "w_wad.h"
|
||||||
|
#include "z_zone.h"
|
||||||
|
#include "m_misc.h"
|
||||||
|
#include "info.h" // spr2names
|
||||||
|
#include "i_video.h" // rendermode
|
||||||
|
#include "i_system.h"
|
||||||
|
#include "r_things.h"
|
||||||
|
#include "r_skins.h"
|
||||||
|
#include "p_local.h"
|
||||||
|
#include "dehacked.h" // get_number (for thok)
|
||||||
|
#include "m_cond.h"
|
||||||
|
#ifdef HWRENDER
|
||||||
|
#include "hardware/hw_md2.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PC_DOS
|
||||||
|
#include <stdio.h> // for snprintf
|
||||||
|
int snprintf(char *str, size_t n, const char *fmt, ...);
|
||||||
|
//int vsnprintf(char *str, size_t n, const char *fmt, va_list ap);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
INT32 numskins = 0;
|
||||||
|
skin_t skins[MAXSKINS];
|
||||||
|
|
||||||
|
// FIXTHIS: don't work because it must be inistilised before the config load
|
||||||
|
//#define SKINVALUES
|
||||||
|
#ifdef SKINVALUES
|
||||||
|
CV_PossibleValue_t skin_cons_t[MAXSKINS+1];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// P_GetSkinSprite2
|
||||||
|
// For non-super players, tries each sprite2's immediate predecessor until it finds one with a number of frames or ends up at standing.
|
||||||
|
// For super players, does the same as above - but tries the super equivalent for each sprite2 before the non-super version.
|
||||||
|
//
|
||||||
|
|
||||||
|
UINT8 P_GetSkinSprite2(skin_t *skin, UINT8 spr2, player_t *player)
|
||||||
|
{
|
||||||
|
UINT8 super = 0, i = 0;
|
||||||
|
|
||||||
|
if (!skin)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if ((playersprite_t)(spr2 & ~FF_SPR2SUPER) >= free_spr2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
while (!skin->sprites[spr2].numframes
|
||||||
|
&& spr2 != SPR2_STND
|
||||||
|
&& ++i < 32) // recursion limiter
|
||||||
|
{
|
||||||
|
if (spr2 & FF_SPR2SUPER)
|
||||||
|
{
|
||||||
|
super = FF_SPR2SUPER;
|
||||||
|
spr2 &= ~FF_SPR2SUPER;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(spr2)
|
||||||
|
{
|
||||||
|
// Normal special cases.
|
||||||
|
case SPR2_JUMP:
|
||||||
|
spr2 = ((player
|
||||||
|
? player->charflags
|
||||||
|
: skin->flags)
|
||||||
|
& SF_NOJUMPSPIN) ? SPR2_SPNG : SPR2_ROLL;
|
||||||
|
break;
|
||||||
|
case SPR2_TIRE:
|
||||||
|
spr2 = ((player
|
||||||
|
? player->charability
|
||||||
|
: skin->ability)
|
||||||
|
== CA_SWIM) ? SPR2_SWIM : SPR2_FLY;
|
||||||
|
break;
|
||||||
|
// Use the handy list, that's what it's there for!
|
||||||
|
default:
|
||||||
|
spr2 = spr2defaults[spr2];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
spr2 |= super;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= 32) // probably an infinite loop...
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return spr2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Sk_SetDefaultValue(skin_t *skin)
|
||||||
|
{
|
||||||
|
INT32 i;
|
||||||
|
//
|
||||||
|
// set default skin values
|
||||||
|
//
|
||||||
|
memset(skin, 0, sizeof (skin_t));
|
||||||
|
snprintf(skin->name,
|
||||||
|
sizeof skin->name, "skin %u", (UINT32)(skin-skins));
|
||||||
|
skin->name[sizeof skin->name - 1] = '\0';
|
||||||
|
skin->wadnum = INT16_MAX;
|
||||||
|
|
||||||
|
skin->flags = 0;
|
||||||
|
|
||||||
|
strcpy(skin->realname, "Someone");
|
||||||
|
strcpy(skin->hudname, "???");
|
||||||
|
|
||||||
|
skin->starttranscolor = 96;
|
||||||
|
skin->prefcolor = SKINCOLOR_GREEN;
|
||||||
|
skin->supercolor = SKINCOLOR_SUPERGOLD1;
|
||||||
|
skin->prefoppositecolor = 0; // use tables
|
||||||
|
|
||||||
|
skin->normalspeed = 36<<FRACBITS;
|
||||||
|
skin->runspeed = 28<<FRACBITS;
|
||||||
|
skin->thrustfactor = 5;
|
||||||
|
skin->accelstart = 96;
|
||||||
|
skin->acceleration = 40;
|
||||||
|
|
||||||
|
skin->ability = CA_NONE;
|
||||||
|
skin->ability2 = CA2_SPINDASH;
|
||||||
|
skin->jumpfactor = FRACUNIT;
|
||||||
|
skin->actionspd = 30<<FRACBITS;
|
||||||
|
skin->mindash = 15<<FRACBITS;
|
||||||
|
skin->maxdash = 70<<FRACBITS;
|
||||||
|
|
||||||
|
skin->radius = mobjinfo[MT_PLAYER].radius;
|
||||||
|
skin->height = mobjinfo[MT_PLAYER].height;
|
||||||
|
skin->spinheight = FixedMul(skin->height, 2*FRACUNIT/3);
|
||||||
|
|
||||||
|
skin->shieldscale = FRACUNIT;
|
||||||
|
skin->camerascale = FRACUNIT;
|
||||||
|
|
||||||
|
skin->thokitem = -1;
|
||||||
|
skin->spinitem = -1;
|
||||||
|
skin->revitem = -1;
|
||||||
|
skin->followitem = 0;
|
||||||
|
|
||||||
|
skin->highresscale = FRACUNIT;
|
||||||
|
skin->contspeed = 17;
|
||||||
|
skin->contangle = 0;
|
||||||
|
|
||||||
|
skin->availability = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < sfx_skinsoundslot0; i++)
|
||||||
|
if (S_sfx[i].skinsound != -1)
|
||||||
|
skin->soundsid[S_sfx[i].skinsound] = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialize the basic skins
|
||||||
|
//
|
||||||
|
void R_InitSkins(void)
|
||||||
|
{
|
||||||
|
#ifdef SKINVALUES
|
||||||
|
INT32 i;
|
||||||
|
|
||||||
|
for (i = 0; i <= MAXSKINS; i++)
|
||||||
|
{
|
||||||
|
skin_cons_t[i].value = 0;
|
||||||
|
skin_cons_t[i].strvalue = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// no default skin!
|
||||||
|
numskins = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT32 R_GetSkinAvailabilities(void)
|
||||||
|
{
|
||||||
|
INT32 s;
|
||||||
|
UINT32 response = 0;
|
||||||
|
|
||||||
|
for (s = 0; s < MAXSKINS; s++)
|
||||||
|
{
|
||||||
|
if (skins[s].availability && unlockables[skins[s].availability - 1].unlocked)
|
||||||
|
response |= (1 << s);
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true if available in circumstances, otherwise nope
|
||||||
|
// warning don't use with an invalid skinnum other than -1 which always returns true
|
||||||
|
boolean R_SkinUsable(INT32 playernum, INT32 skinnum)
|
||||||
|
{
|
||||||
|
return ((skinnum == -1) // Simplifies things elsewhere, since there's already plenty of checks for less-than-0...
|
||||||
|
|| (!skins[skinnum].availability)
|
||||||
|
|| (((netgame || multiplayer) && playernum != -1) ? (players[playernum].availabilities & (1 << skinnum)) : (unlockables[skins[skinnum].availability - 1].unlocked))
|
||||||
|
|| (modeattacking) // If you have someone else's run you might as well take a look
|
||||||
|
|| (Playing() && (R_SkinAvailable(mapheaderinfo[gamemap-1]->forcecharacter) == skinnum)) // Force 1.
|
||||||
|
|| (netgame && (cv_forceskin.value == skinnum)) // Force 2.
|
||||||
|
|| (metalrecording && skinnum == 5) // Force 3.
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true if the skin name is found (loaded from pwad)
|
||||||
|
// warning return -1 if not found
|
||||||
|
INT32 R_SkinAvailable(const char *name)
|
||||||
|
{
|
||||||
|
INT32 i;
|
||||||
|
|
||||||
|
for (i = 0; i < numskins; i++)
|
||||||
|
{
|
||||||
|
// search in the skin list
|
||||||
|
if (stricmp(skins[i].name,name)==0)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// network code calls this when a 'skin change' is received
|
||||||
|
void SetPlayerSkin(INT32 playernum, const char *skinname)
|
||||||
|
{
|
||||||
|
INT32 i = R_SkinAvailable(skinname);
|
||||||
|
player_t *player = &players[playernum];
|
||||||
|
|
||||||
|
if ((i != -1) && R_SkinUsable(playernum, i))
|
||||||
|
{
|
||||||
|
SetPlayerSkinByNum(playernum, i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (P_IsLocalPlayer(player))
|
||||||
|
CONS_Alert(CONS_WARNING, M_GetText("Skin '%s' not found.\n"), skinname);
|
||||||
|
else if(server || IsPlayerAdmin(consoleplayer))
|
||||||
|
CONS_Alert(CONS_WARNING, M_GetText("Player %d (%s) skin '%s' not found\n"), playernum, player_names[playernum], skinname);
|
||||||
|
|
||||||
|
SetPlayerSkinByNum(playernum, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Same as SetPlayerSkin, but uses the skin #.
|
||||||
|
// network code calls this when a 'skin change' is received
|
||||||
|
void SetPlayerSkinByNum(INT32 playernum, INT32 skinnum)
|
||||||
|
{
|
||||||
|
player_t *player = &players[playernum];
|
||||||
|
skin_t *skin = &skins[skinnum];
|
||||||
|
UINT8 newcolor = 0;
|
||||||
|
|
||||||
|
if (skinnum >= 0 && skinnum < numskins && R_SkinUsable(playernum, skinnum)) // Make sure it exists!
|
||||||
|
{
|
||||||
|
player->skin = skinnum;
|
||||||
|
|
||||||
|
player->camerascale = skin->camerascale;
|
||||||
|
player->shieldscale = skin->shieldscale;
|
||||||
|
|
||||||
|
player->charability = (UINT8)skin->ability;
|
||||||
|
player->charability2 = (UINT8)skin->ability2;
|
||||||
|
|
||||||
|
player->charflags = (UINT32)skin->flags;
|
||||||
|
|
||||||
|
player->thokitem = skin->thokitem < 0 ? (UINT32)mobjinfo[MT_PLAYER].painchance : (UINT32)skin->thokitem;
|
||||||
|
player->spinitem = skin->spinitem < 0 ? (UINT32)mobjinfo[MT_PLAYER].damage : (UINT32)skin->spinitem;
|
||||||
|
player->revitem = skin->revitem < 0 ? (mobjtype_t)mobjinfo[MT_PLAYER].raisestate : (UINT32)skin->revitem;
|
||||||
|
player->followitem = skin->followitem;
|
||||||
|
|
||||||
|
if (((player->powers[pw_shield] & SH_NOSTACK) == SH_PINK) && (player->revitem == MT_LHRT || player->spinitem == MT_LHRT || player->thokitem == MT_LHRT)) // Healers can't keep their buff.
|
||||||
|
player->powers[pw_shield] &= SH_STACK;
|
||||||
|
|
||||||
|
player->actionspd = skin->actionspd;
|
||||||
|
player->mindash = skin->mindash;
|
||||||
|
player->maxdash = skin->maxdash;
|
||||||
|
|
||||||
|
player->normalspeed = skin->normalspeed;
|
||||||
|
player->runspeed = skin->runspeed;
|
||||||
|
player->thrustfactor = skin->thrustfactor;
|
||||||
|
player->accelstart = skin->accelstart;
|
||||||
|
player->acceleration = skin->acceleration;
|
||||||
|
|
||||||
|
player->jumpfactor = skin->jumpfactor;
|
||||||
|
|
||||||
|
player->height = skin->height;
|
||||||
|
player->spinheight = skin->spinheight;
|
||||||
|
|
||||||
|
if (!(cv_debug || devparm) && !(netgame || multiplayer || demoplayback))
|
||||||
|
{
|
||||||
|
if (playernum == consoleplayer)
|
||||||
|
CV_StealthSetValue(&cv_playercolor, skin->prefcolor);
|
||||||
|
else if (playernum == secondarydisplayplayer)
|
||||||
|
CV_StealthSetValue(&cv_playercolor2, skin->prefcolor);
|
||||||
|
player->skincolor = newcolor = skin->prefcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player->followmobj)
|
||||||
|
{
|
||||||
|
P_RemoveMobj(player->followmobj);
|
||||||
|
P_SetTarget(&player->followmobj, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player->mo)
|
||||||
|
{
|
||||||
|
fixed_t radius = FixedMul(skin->radius, player->mo->scale);
|
||||||
|
if ((player->powers[pw_carry] == CR_NIGHTSMODE) && (skin->sprites[SPR2_NFLY].numframes == 0)) // If you don't have a sprite for flying horizontally, use the default NiGHTS skin.
|
||||||
|
{
|
||||||
|
skin = &skins[DEFAULTNIGHTSSKIN];
|
||||||
|
player->followitem = skin->followitem;
|
||||||
|
if (!(cv_debug || devparm) && !(netgame || multiplayer || demoplayback))
|
||||||
|
newcolor = skin->prefcolor; // will be updated in thinker to flashing
|
||||||
|
}
|
||||||
|
player->mo->skin = skin;
|
||||||
|
if (newcolor)
|
||||||
|
player->mo->color = newcolor;
|
||||||
|
P_SetScale(player->mo, player->mo->scale);
|
||||||
|
player->mo->radius = radius;
|
||||||
|
|
||||||
|
P_SetPlayerMobjState(player->mo, player->mo->state-states); // Prevent visual errors when switching between skins with differing number of frames
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (P_IsLocalPlayer(player))
|
||||||
|
CONS_Alert(CONS_WARNING, M_GetText("Requested skin %d not found\n"), skinnum);
|
||||||
|
else if(server || IsPlayerAdmin(consoleplayer))
|
||||||
|
CONS_Alert(CONS_WARNING, "Player %d (%s) skin %d not found\n", playernum, player_names[playernum], skinnum);
|
||||||
|
SetPlayerSkinByNum(playernum, 0); // not found put the sonic skin
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Add skins from a pwad, each skin preceded by 'S_SKIN' marker
|
||||||
|
//
|
||||||
|
|
||||||
|
// Does the same is in w_wad, but check only for
|
||||||
|
// the first 6 characters (this is so we can have S_SKIN1, S_SKIN2..
|
||||||
|
// for wad editors that don't like multiple resources of the same name)
|
||||||
|
//
|
||||||
|
static UINT16 W_CheckForSkinMarkerInPwad(UINT16 wadid, UINT16 startlump)
|
||||||
|
{
|
||||||
|
UINT16 i;
|
||||||
|
const char *S_SKIN = "S_SKIN";
|
||||||
|
lumpinfo_t *lump_p;
|
||||||
|
|
||||||
|
// scan forward, start at <startlump>
|
||||||
|
if (startlump < wadfiles[wadid]->numlumps)
|
||||||
|
{
|
||||||
|
lump_p = wadfiles[wadid]->lumpinfo + startlump;
|
||||||
|
for (i = startlump; i < wadfiles[wadid]->numlumps; i++, lump_p++)
|
||||||
|
if (memcmp(lump_p->name,S_SKIN,6)==0)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return INT16_MAX; // not found
|
||||||
|
}
|
||||||
|
|
||||||
|
#define HUDNAMEWRITE(value) STRBUFCPY(skin->hudname, value)
|
||||||
|
|
||||||
|
// turn _ into spaces and . into katana dot
|
||||||
|
#define SYMBOLCONVERT(name) for (value = name; *value; value++)\
|
||||||
|
{\
|
||||||
|
if (*value == '_') *value = ' ';\
|
||||||
|
else if (*value == '.') *value = '\x1E';\
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Patch skins from a pwad, each skin preceded by 'P_SKIN' marker
|
||||||
|
//
|
||||||
|
|
||||||
|
// Does the same is in w_wad, but check only for
|
||||||
|
// the first 6 characters (this is so we can have P_SKIN1, P_SKIN2..
|
||||||
|
// for wad editors that don't like multiple resources of the same name)
|
||||||
|
//
|
||||||
|
static UINT16 W_CheckForPatchSkinMarkerInPwad(UINT16 wadid, UINT16 startlump)
|
||||||
|
{
|
||||||
|
UINT16 i;
|
||||||
|
const char *P_SKIN = "P_SKIN";
|
||||||
|
lumpinfo_t *lump_p;
|
||||||
|
|
||||||
|
// scan forward, start at <startlump>
|
||||||
|
if (startlump < wadfiles[wadid]->numlumps)
|
||||||
|
{
|
||||||
|
lump_p = wadfiles[wadid]->lumpinfo + startlump;
|
||||||
|
for (i = startlump; i < wadfiles[wadid]->numlumps; i++, lump_p++)
|
||||||
|
if (memcmp(lump_p->name,P_SKIN,6)==0)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return INT16_MAX; // not found
|
||||||
|
}
|
||||||
|
|
||||||
|
static void R_LoadSkinSprites(UINT16 wadnum, UINT16 *lump, UINT16 *lastlump, skin_t *skin)
|
||||||
|
{
|
||||||
|
UINT16 newlastlump;
|
||||||
|
UINT8 sprite2;
|
||||||
|
|
||||||
|
*lump += 1; // start after S_SKIN
|
||||||
|
*lastlump = W_CheckNumForNamePwad("S_END",wadnum,*lump); // stop at S_END
|
||||||
|
|
||||||
|
// old wadding practices die hard -- stop at S_SKIN (or P_SKIN) or S_START if they come before S_END.
|
||||||
|
newlastlump = W_CheckForSkinMarkerInPwad(wadnum,*lump);
|
||||||
|
if (newlastlump < *lastlump) *lastlump = newlastlump;
|
||||||
|
newlastlump = W_CheckForPatchSkinMarkerInPwad(wadnum,*lump);
|
||||||
|
if (newlastlump < *lastlump) *lastlump = newlastlump;
|
||||||
|
newlastlump = W_CheckNumForNamePwad("S_START",wadnum,*lump);
|
||||||
|
if (newlastlump < *lastlump) *lastlump = newlastlump;
|
||||||
|
|
||||||
|
// ...and let's handle super, too
|
||||||
|
newlastlump = W_CheckNumForNamePwad("S_SUPER",wadnum,*lump);
|
||||||
|
if (newlastlump < *lastlump)
|
||||||
|
{
|
||||||
|
newlastlump++;
|
||||||
|
// load all sprite sets we are aware of... for super!
|
||||||
|
for (sprite2 = 0; sprite2 < free_spr2; sprite2++)
|
||||||
|
R_AddSingleSpriteDef(spr2names[sprite2], &skin->sprites[FF_SPR2SUPER|sprite2], wadnum, newlastlump, *lastlump);
|
||||||
|
|
||||||
|
newlastlump--;
|
||||||
|
*lastlump = newlastlump; // okay, make the normal sprite set loading end there
|
||||||
|
}
|
||||||
|
|
||||||
|
// load all sprite sets we are aware of... for normal stuff.
|
||||||
|
for (sprite2 = 0; sprite2 < free_spr2; sprite2++)
|
||||||
|
R_AddSingleSpriteDef(spr2names[sprite2], &skin->sprites[sprite2], wadnum, *lump, *lastlump);
|
||||||
|
|
||||||
|
if (skin->sprites[0].numframes == 0)
|
||||||
|
I_Error("R_LoadSkinSprites: no frames found for sprite SPR2_%s\n", spr2names[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns whether found appropriate property
|
||||||
|
static boolean R_ProcessPatchableFields(skin_t *skin, char *stoken, char *value)
|
||||||
|
{
|
||||||
|
// custom translation table
|
||||||
|
if (!stricmp(stoken, "startcolor"))
|
||||||
|
skin->starttranscolor = atoi(value);
|
||||||
|
|
||||||
|
#define FULLPROCESS(field) else if (!stricmp(stoken, #field)) skin->field = get_number(value);
|
||||||
|
// character type identification
|
||||||
|
FULLPROCESS(flags)
|
||||||
|
FULLPROCESS(ability)
|
||||||
|
FULLPROCESS(ability2)
|
||||||
|
|
||||||
|
FULLPROCESS(thokitem)
|
||||||
|
FULLPROCESS(spinitem)
|
||||||
|
FULLPROCESS(revitem)
|
||||||
|
FULLPROCESS(followitem)
|
||||||
|
#undef FULLPROCESS
|
||||||
|
|
||||||
|
#define GETFRACBITS(field) else if (!stricmp(stoken, #field)) skin->field = atoi(value)<<FRACBITS;
|
||||||
|
GETFRACBITS(normalspeed)
|
||||||
|
GETFRACBITS(runspeed)
|
||||||
|
|
||||||
|
GETFRACBITS(mindash)
|
||||||
|
GETFRACBITS(maxdash)
|
||||||
|
GETFRACBITS(actionspd)
|
||||||
|
|
||||||
|
GETFRACBITS(radius)
|
||||||
|
GETFRACBITS(height)
|
||||||
|
GETFRACBITS(spinheight)
|
||||||
|
#undef GETFRACBITS
|
||||||
|
|
||||||
|
#define GETINT(field) else if (!stricmp(stoken, #field)) skin->field = atoi(value);
|
||||||
|
GETINT(thrustfactor)
|
||||||
|
GETINT(accelstart)
|
||||||
|
GETINT(acceleration)
|
||||||
|
GETINT(contspeed)
|
||||||
|
GETINT(contangle)
|
||||||
|
#undef GETINT
|
||||||
|
|
||||||
|
#define GETSKINCOLOR(field) else if (!stricmp(stoken, #field)) skin->field = R_GetColorByName(value);
|
||||||
|
GETSKINCOLOR(prefcolor)
|
||||||
|
GETSKINCOLOR(prefoppositecolor)
|
||||||
|
#undef GETSKINCOLOR
|
||||||
|
else if (!stricmp(stoken, "supercolor"))
|
||||||
|
skin->supercolor = R_GetSuperColorByName(value);
|
||||||
|
|
||||||
|
#define GETFLOAT(field) else if (!stricmp(stoken, #field)) skin->field = FLOAT_TO_FIXED(atof(value));
|
||||||
|
GETFLOAT(jumpfactor)
|
||||||
|
GETFLOAT(highresscale)
|
||||||
|
GETFLOAT(shieldscale)
|
||||||
|
GETFLOAT(camerascale)
|
||||||
|
#undef GETFLOAT
|
||||||
|
|
||||||
|
#define GETFLAG(field) else if (!stricmp(stoken, #field)) { \
|
||||||
|
strupr(value); \
|
||||||
|
if (atoi(value) || value[0] == 'T' || value[0] == 'Y') \
|
||||||
|
skin->flags |= (SF_##field); \
|
||||||
|
else \
|
||||||
|
skin->flags &= ~(SF_##field); \
|
||||||
|
}
|
||||||
|
// parameters for individual character flags
|
||||||
|
// these are uppercase so they can be concatenated with SF_
|
||||||
|
// 1, true, yes are all valid values
|
||||||
|
GETFLAG(SUPER)
|
||||||
|
GETFLAG(NOSUPERSPIN)
|
||||||
|
GETFLAG(NOSPINDASHDUST)
|
||||||
|
GETFLAG(HIRES)
|
||||||
|
GETFLAG(NOSKID)
|
||||||
|
GETFLAG(NOSPEEDADJUST)
|
||||||
|
GETFLAG(RUNONWATER)
|
||||||
|
GETFLAG(NOJUMPSPIN)
|
||||||
|
GETFLAG(NOJUMPDAMAGE)
|
||||||
|
GETFLAG(STOMPDAMAGE)
|
||||||
|
GETFLAG(MARIODAMAGE)
|
||||||
|
GETFLAG(MACHINE)
|
||||||
|
GETFLAG(DASHMODE)
|
||||||
|
GETFLAG(FASTEDGE)
|
||||||
|
GETFLAG(MULTIABILITY)
|
||||||
|
GETFLAG(NONIGHTSROTATION)
|
||||||
|
#undef GETFLAG
|
||||||
|
|
||||||
|
else // let's check if it's a sound, otherwise error out
|
||||||
|
{
|
||||||
|
boolean found = false;
|
||||||
|
sfxenum_t i;
|
||||||
|
size_t stokenadjust;
|
||||||
|
|
||||||
|
// Remove the prefix. (We need to affect an adjusting variable so that we can print error messages if it's not actually a sound.)
|
||||||
|
if ((stoken[0] == 'D' || stoken[0] == 'd') && (stoken[1] == 'S' || stoken[1] == 's')) // DS*
|
||||||
|
stokenadjust = 2;
|
||||||
|
else // sfx_*
|
||||||
|
stokenadjust = 4;
|
||||||
|
|
||||||
|
// Remove the prefix. (We can affect this directly since we're not going to use it again.)
|
||||||
|
if ((value[0] == 'D' || value[0] == 'd') && (value[1] == 'S' || value[1] == 's')) // DS*
|
||||||
|
value += 2;
|
||||||
|
else // sfx_*
|
||||||
|
value += 4;
|
||||||
|
|
||||||
|
// copy name of sounds that are remapped
|
||||||
|
// for this skin
|
||||||
|
for (i = 0; i < sfx_skinsoundslot0; i++)
|
||||||
|
{
|
||||||
|
if (!S_sfx[i].name)
|
||||||
|
continue;
|
||||||
|
if (S_sfx[i].skinsound != -1
|
||||||
|
&& !stricmp(S_sfx[i].name,
|
||||||
|
stoken + stokenadjust))
|
||||||
|
{
|
||||||
|
skin->soundsid[S_sfx[i].skinsound] =
|
||||||
|
S_AddSoundFx(value, S_sfx[i].singularity, S_sfx[i].pitch, true);
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Find skin sprites, sounds & optional status bar face, & add them
|
||||||
|
//
|
||||||
|
void R_AddSkins(UINT16 wadnum)
|
||||||
|
{
|
||||||
|
UINT16 lump, lastlump = 0;
|
||||||
|
char *buf;
|
||||||
|
char *buf2;
|
||||||
|
char *stoken;
|
||||||
|
char *value;
|
||||||
|
size_t size;
|
||||||
|
skin_t *skin;
|
||||||
|
boolean hudname, realname;
|
||||||
|
|
||||||
|
//
|
||||||
|
// search for all skin markers in pwad
|
||||||
|
//
|
||||||
|
|
||||||
|
while ((lump = W_CheckForSkinMarkerInPwad(wadnum, lastlump)) != INT16_MAX)
|
||||||
|
{
|
||||||
|
// advance by default
|
||||||
|
lastlump = lump + 1;
|
||||||
|
|
||||||
|
if (numskins >= MAXSKINS)
|
||||||
|
{
|
||||||
|
CONS_Debug(DBG_RENDER, "ignored skin (%d skins maximum)\n", MAXSKINS);
|
||||||
|
continue; // so we know how many skins couldn't be added
|
||||||
|
}
|
||||||
|
buf = W_CacheLumpNumPwad(wadnum, lump, PU_CACHE);
|
||||||
|
size = W_LumpLengthPwad(wadnum, lump);
|
||||||
|
|
||||||
|
// for strtok
|
||||||
|
buf2 = malloc(size+1);
|
||||||
|
if (!buf2)
|
||||||
|
I_Error("R_AddSkins: No more free memory\n");
|
||||||
|
M_Memcpy(buf2,buf,size);
|
||||||
|
buf2[size] = '\0';
|
||||||
|
|
||||||
|
// set defaults
|
||||||
|
skin = &skins[numskins];
|
||||||
|
Sk_SetDefaultValue(skin);
|
||||||
|
skin->wadnum = wadnum;
|
||||||
|
hudname = realname = false;
|
||||||
|
// parse
|
||||||
|
stoken = strtok (buf2, "\r\n= ");
|
||||||
|
while (stoken)
|
||||||
|
{
|
||||||
|
if ((stoken[0] == '/' && stoken[1] == '/')
|
||||||
|
|| (stoken[0] == '#'))// skip comments
|
||||||
|
{
|
||||||
|
stoken = strtok(NULL, "\r\n"); // skip end of line
|
||||||
|
goto next_token; // find the real next token
|
||||||
|
}
|
||||||
|
|
||||||
|
value = strtok(NULL, "\r\n= ");
|
||||||
|
|
||||||
|
if (!value)
|
||||||
|
I_Error("R_AddSkins: syntax error in S_SKIN lump# %d(%s) in WAD %s\n", lump, W_CheckNameForNumPwad(wadnum,lump), wadfiles[wadnum]->filename);
|
||||||
|
|
||||||
|
// Some of these can't go in R_ProcessPatchableFields because they have side effects for future lines.
|
||||||
|
// Others can't go in there because we don't want them to be patchable.
|
||||||
|
if (!stricmp(stoken, "name"))
|
||||||
|
{
|
||||||
|
INT32 skinnum = R_SkinAvailable(value);
|
||||||
|
strlwr(value);
|
||||||
|
if (skinnum == -1)
|
||||||
|
STRBUFCPY(skin->name, value);
|
||||||
|
// the skin name must uniquely identify a single skin
|
||||||
|
// if the name is already used I make the name 'namex'
|
||||||
|
// using the default skin name's number set above
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const size_t stringspace =
|
||||||
|
strlen(value) + sizeof (numskins) + 1;
|
||||||
|
char *value2 = Z_Malloc(stringspace, PU_STATIC, NULL);
|
||||||
|
snprintf(value2, stringspace,
|
||||||
|
"%s%d", value, numskins);
|
||||||
|
value2[stringspace - 1] = '\0';
|
||||||
|
if (R_SkinAvailable(value2) == -1)
|
||||||
|
// I'm lazy so if NEW name is already used I leave the 'skin x'
|
||||||
|
// default skin name set in Sk_SetDefaultValue
|
||||||
|
STRBUFCPY(skin->name, value2);
|
||||||
|
Z_Free(value2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy to hudname and fullname as a default.
|
||||||
|
if (!realname)
|
||||||
|
{
|
||||||
|
STRBUFCPY(skin->realname, skin->name);
|
||||||
|
for (value = skin->realname; *value; value++)
|
||||||
|
{
|
||||||
|
if (*value == '_') *value = ' '; // turn _ into spaces.
|
||||||
|
else if (*value == '.') *value = '\x1E'; // turn . into katana dot.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!hudname)
|
||||||
|
{
|
||||||
|
HUDNAMEWRITE(skin->name);
|
||||||
|
strupr(skin->hudname);
|
||||||
|
SYMBOLCONVERT(skin->hudname)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!stricmp(stoken, "realname"))
|
||||||
|
{ // Display name (eg. "Knuckles")
|
||||||
|
realname = true;
|
||||||
|
STRBUFCPY(skin->realname, value);
|
||||||
|
SYMBOLCONVERT(skin->realname)
|
||||||
|
if (!hudname)
|
||||||
|
HUDNAMEWRITE(skin->realname);
|
||||||
|
}
|
||||||
|
else if (!stricmp(stoken, "hudname"))
|
||||||
|
{ // Life icon name (eg. "K.T.E")
|
||||||
|
hudname = true;
|
||||||
|
HUDNAMEWRITE(value);
|
||||||
|
SYMBOLCONVERT(skin->hudname)
|
||||||
|
if (!realname)
|
||||||
|
STRBUFCPY(skin->realname, skin->hudname);
|
||||||
|
}
|
||||||
|
else if (!stricmp(stoken, "availability"))
|
||||||
|
{
|
||||||
|
skin->availability = atoi(value);
|
||||||
|
if (skin->availability >= MAXUNLOCKABLES)
|
||||||
|
skin->availability = 0;
|
||||||
|
}
|
||||||
|
else if (!R_ProcessPatchableFields(skin, stoken, value))
|
||||||
|
CONS_Debug(DBG_SETUP, "R_AddSkins: Unknown keyword '%s' in S_SKIN lump #%d (WAD %s)\n", stoken, lump, wadfiles[wadnum]->filename);
|
||||||
|
|
||||||
|
next_token:
|
||||||
|
stoken = strtok(NULL, "\r\n= ");
|
||||||
|
}
|
||||||
|
free(buf2);
|
||||||
|
|
||||||
|
// Add sprites
|
||||||
|
R_LoadSkinSprites(wadnum, &lump, &lastlump, skin);
|
||||||
|
//ST_LoadFaceGraphics(numskins); -- nah let's do this elsewhere
|
||||||
|
|
||||||
|
R_FlushTranslationColormapCache();
|
||||||
|
|
||||||
|
if (!skin->availability) // Safe to print...
|
||||||
|
CONS_Printf(M_GetText("Added skin '%s'\n"), skin->name);
|
||||||
|
#ifdef SKINVALUES
|
||||||
|
skin_cons_t[numskins].value = numskins;
|
||||||
|
skin_cons_t[numskins].strvalue = skin->name;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HWRENDER
|
||||||
|
if (rendermode == render_opengl)
|
||||||
|
HWR_AddPlayerModel(numskins);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
numskins++;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Patch skin sprites
|
||||||
|
//
|
||||||
|
void R_PatchSkins(UINT16 wadnum)
|
||||||
|
{
|
||||||
|
UINT16 lump, lastlump = 0;
|
||||||
|
char *buf;
|
||||||
|
char *buf2;
|
||||||
|
char *stoken;
|
||||||
|
char *value;
|
||||||
|
size_t size;
|
||||||
|
skin_t *skin;
|
||||||
|
boolean noskincomplain, realname, hudname;
|
||||||
|
|
||||||
|
//
|
||||||
|
// search for all skin patch markers in pwad
|
||||||
|
//
|
||||||
|
|
||||||
|
while ((lump = W_CheckForPatchSkinMarkerInPwad(wadnum, lastlump)) != INT16_MAX)
|
||||||
|
{
|
||||||
|
INT32 skinnum = 0;
|
||||||
|
|
||||||
|
// advance by default
|
||||||
|
lastlump = lump + 1;
|
||||||
|
|
||||||
|
buf = W_CacheLumpNumPwad(wadnum, lump, PU_CACHE);
|
||||||
|
size = W_LumpLengthPwad(wadnum, lump);
|
||||||
|
|
||||||
|
// for strtok
|
||||||
|
buf2 = malloc(size+1);
|
||||||
|
if (!buf2)
|
||||||
|
I_Error("R_PatchSkins: No more free memory\n");
|
||||||
|
M_Memcpy(buf2,buf,size);
|
||||||
|
buf2[size] = '\0';
|
||||||
|
|
||||||
|
skin = NULL;
|
||||||
|
noskincomplain = realname = hudname = false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Parse. Has more phases than the parser in R_AddSkins because it needs to have the patching name first (no default skin name is acceptible for patching, unlike skin creation)
|
||||||
|
*/
|
||||||
|
|
||||||
|
stoken = strtok(buf2, "\r\n= ");
|
||||||
|
while (stoken)
|
||||||
|
{
|
||||||
|
if ((stoken[0] == '/' && stoken[1] == '/')
|
||||||
|
|| (stoken[0] == '#'))// skip comments
|
||||||
|
{
|
||||||
|
stoken = strtok(NULL, "\r\n"); // skip end of line
|
||||||
|
goto next_token; // find the real next token
|
||||||
|
}
|
||||||
|
|
||||||
|
value = strtok(NULL, "\r\n= ");
|
||||||
|
|
||||||
|
if (!value)
|
||||||
|
I_Error("R_PatchSkins: syntax error in P_SKIN lump# %d(%s) in WAD %s\n", lump, W_CheckNameForNumPwad(wadnum,lump), wadfiles[wadnum]->filename);
|
||||||
|
|
||||||
|
if (!skin) // Get the name!
|
||||||
|
{
|
||||||
|
if (!stricmp(stoken, "name"))
|
||||||
|
{
|
||||||
|
strlwr(value);
|
||||||
|
skinnum = R_SkinAvailable(value);
|
||||||
|
if (skinnum != -1)
|
||||||
|
skin = &skins[skinnum];
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CONS_Debug(DBG_SETUP, "R_PatchSkins: unknown skin name in P_SKIN lump# %d(%s) in WAD %s\n", lump, W_CheckNameForNumPwad(wadnum,lump), wadfiles[wadnum]->filename);
|
||||||
|
noskincomplain = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // Get the properties!
|
||||||
|
{
|
||||||
|
// Some of these can't go in R_ProcessPatchableFields because they have side effects for future lines.
|
||||||
|
if (!stricmp(stoken, "realname"))
|
||||||
|
{ // Display name (eg. "Knuckles")
|
||||||
|
realname = true;
|
||||||
|
STRBUFCPY(skin->realname, value);
|
||||||
|
SYMBOLCONVERT(skin->realname)
|
||||||
|
if (!hudname)
|
||||||
|
HUDNAMEWRITE(skin->realname);
|
||||||
|
}
|
||||||
|
else if (!stricmp(stoken, "hudname"))
|
||||||
|
{ // Life icon name (eg. "K.T.E")
|
||||||
|
hudname = true;
|
||||||
|
HUDNAMEWRITE(value);
|
||||||
|
SYMBOLCONVERT(skin->hudname)
|
||||||
|
if (!realname)
|
||||||
|
STRBUFCPY(skin->realname, skin->hudname);
|
||||||
|
}
|
||||||
|
else if (!R_ProcessPatchableFields(skin, stoken, value))
|
||||||
|
CONS_Debug(DBG_SETUP, "R_PatchSkins: Unknown keyword '%s' in P_SKIN lump #%d (WAD %s)\n", stoken, lump, wadfiles[wadnum]->filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!skin)
|
||||||
|
break;
|
||||||
|
|
||||||
|
next_token:
|
||||||
|
stoken = strtok(NULL, "\r\n= ");
|
||||||
|
}
|
||||||
|
free(buf2);
|
||||||
|
|
||||||
|
if (!skin) // Didn't include a name parameter? What a waste.
|
||||||
|
{
|
||||||
|
if (!noskincomplain)
|
||||||
|
CONS_Debug(DBG_SETUP, "R_PatchSkins: no skin name given in P_SKIN lump #%d (WAD %s)\n", lump, wadfiles[wadnum]->filename);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Patch sprites
|
||||||
|
R_LoadSkinSprites(wadnum, &lump, &lastlump, skin);
|
||||||
|
//ST_LoadFaceGraphics(skinnum); -- nah let's do this elsewhere
|
||||||
|
|
||||||
|
R_FlushTranslationColormapCache();
|
||||||
|
|
||||||
|
if (!skin->availability) // Safe to print...
|
||||||
|
CONS_Printf(M_GetText("Patched skin '%s'\n"), skin->name);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef HUDNAMEWRITE
|
||||||
|
#undef SYMBOLCONVERT
|
|
@ -0,0 +1,103 @@
|
||||||
|
// SONIC ROBO BLAST 2
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||||
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||||
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||||
|
//
|
||||||
|
// This program is free software distributed under the
|
||||||
|
// terms of the GNU General Public License, version 2.
|
||||||
|
// See the 'LICENSE' file for more details.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
/// \file r_skins.h
|
||||||
|
/// \brief Skins stuff
|
||||||
|
|
||||||
|
#ifndef __R_SKINS__
|
||||||
|
#define __R_SKINS__
|
||||||
|
|
||||||
|
#include "info.h"
|
||||||
|
#include "sounds.h"
|
||||||
|
#include "d_player.h" // skinflags
|
||||||
|
#include "r_patch.h" // spriteinfo_t
|
||||||
|
#include "r_defs.h" // spritedef_t
|
||||||
|
|
||||||
|
/// Defaults
|
||||||
|
#define SKINNAMESIZE 16
|
||||||
|
// should be all lowercase!! S_SKIN processing does a strlwr
|
||||||
|
#define DEFAULTSKIN "sonic"
|
||||||
|
#define DEFAULTSKIN2 "tails" // secondary player
|
||||||
|
#define DEFAULTNIGHTSSKIN 0
|
||||||
|
|
||||||
|
/// The skin_t struct
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char name[SKINNAMESIZE+1]; // INT16 descriptive name of the skin
|
||||||
|
UINT16 wadnum;
|
||||||
|
skinflags_t flags;
|
||||||
|
|
||||||
|
char realname[SKINNAMESIZE+1]; // Display name for level completion.
|
||||||
|
char hudname[SKINNAMESIZE+1]; // HUD name to display (officially exactly 5 characters long)
|
||||||
|
|
||||||
|
UINT8 ability; // ability definition
|
||||||
|
UINT8 ability2; // secondary ability definition
|
||||||
|
INT32 thokitem;
|
||||||
|
INT32 spinitem;
|
||||||
|
INT32 revitem;
|
||||||
|
INT32 followitem;
|
||||||
|
fixed_t actionspd;
|
||||||
|
fixed_t mindash;
|
||||||
|
fixed_t maxdash;
|
||||||
|
|
||||||
|
fixed_t normalspeed; // Normal ground
|
||||||
|
fixed_t runspeed; // Speed that you break into your run animation
|
||||||
|
|
||||||
|
UINT8 thrustfactor; // Thrust = thrustfactor * acceleration
|
||||||
|
UINT8 accelstart; // Acceleration if speed = 0
|
||||||
|
UINT8 acceleration; // Acceleration
|
||||||
|
|
||||||
|
fixed_t jumpfactor; // multiple of standard jump height
|
||||||
|
|
||||||
|
fixed_t radius; // Bounding box changes.
|
||||||
|
fixed_t height;
|
||||||
|
fixed_t spinheight;
|
||||||
|
|
||||||
|
fixed_t shieldscale; // no change to bounding box, but helps set the shield's sprite size
|
||||||
|
fixed_t camerascale;
|
||||||
|
|
||||||
|
// Definable color translation table
|
||||||
|
UINT8 starttranscolor;
|
||||||
|
UINT8 prefcolor;
|
||||||
|
UINT8 supercolor;
|
||||||
|
UINT8 prefoppositecolor; // if 0 use tables instead
|
||||||
|
|
||||||
|
fixed_t highresscale; // scale of highres, default is 0.5
|
||||||
|
UINT8 contspeed; // continue screen animation speed
|
||||||
|
UINT8 contangle; // initial angle on continue screen
|
||||||
|
|
||||||
|
// specific sounds per skin
|
||||||
|
sfxenum_t soundsid[NUMSKINSOUNDS]; // sound # in S_sfx table
|
||||||
|
|
||||||
|
// contains super versions too
|
||||||
|
spritedef_t sprites[NUMPLAYERSPRITES*2];
|
||||||
|
spriteinfo_t sprinfo[NUMPLAYERSPRITES*2];
|
||||||
|
|
||||||
|
UINT8 availability; // lock?
|
||||||
|
} skin_t;
|
||||||
|
|
||||||
|
/// Externs
|
||||||
|
extern INT32 numskins;
|
||||||
|
extern skin_t skins[MAXSKINS];
|
||||||
|
|
||||||
|
/// Function prototypes
|
||||||
|
void R_InitSkins(void);
|
||||||
|
|
||||||
|
void SetPlayerSkin(INT32 playernum,const char *skinname);
|
||||||
|
void SetPlayerSkinByNum(INT32 playernum,INT32 skinnum); // Tails 03-16-2002
|
||||||
|
boolean R_SkinUsable(INT32 playernum, INT32 skinnum);
|
||||||
|
UINT32 R_GetSkinAvailabilities(void);
|
||||||
|
INT32 R_SkinAvailable(const char *name);
|
||||||
|
void R_PatchSkins(UINT16 wadnum);
|
||||||
|
void R_AddSkins(UINT16 wadnum);
|
||||||
|
|
||||||
|
UINT8 P_GetSkinSprite2(skin_t *skin, UINT8 spr2, player_t *player);
|
||||||
|
|
||||||
|
#endif //__R_SKINS__
|
882
src/r_things.c
882
src/r_things.c
File diff suppressed because it is too large
Load Diff
139
src/r_things.h
139
src/r_things.h
|
@ -14,26 +14,27 @@
|
||||||
#ifndef __R_THINGS__
|
#ifndef __R_THINGS__
|
||||||
#define __R_THINGS__
|
#define __R_THINGS__
|
||||||
|
|
||||||
#include "sounds.h"
|
|
||||||
#include "r_plane.h"
|
#include "r_plane.h"
|
||||||
#include "r_patch.h"
|
#include "r_patch.h"
|
||||||
#include "r_portal.h"
|
#include "r_portal.h"
|
||||||
#include "r_defs.h"
|
#include "r_defs.h"
|
||||||
|
#include "r_skins.h"
|
||||||
|
|
||||||
// number of sprite lumps for spritewidth,offset,topoffset lookup tables
|
// --------------
|
||||||
// Fab: this is a hack : should allocate the lookup tables per sprite
|
// SPRITE LOADING
|
||||||
#define MAXVISSPRITES 2048 // added 2-2-98 was 128
|
// --------------
|
||||||
|
|
||||||
#define VISSPRITECHUNKBITS 6 // 2^6 = 64 sprites per chunk
|
|
||||||
#define VISSPRITESPERCHUNK (1 << VISSPRITECHUNKBITS)
|
|
||||||
#define VISSPRITEINDEXMASK (VISSPRITESPERCHUNK - 1)
|
|
||||||
|
|
||||||
#define FEETADJUST (4<<FRACBITS) // R_AddSingleSpriteDef
|
#define FEETADJUST (4<<FRACBITS) // R_AddSingleSpriteDef
|
||||||
|
|
||||||
// Constant arrays used for psprite clipping
|
boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16 wadnum, UINT16 startlump, UINT16 endlump);
|
||||||
// and initializing clipping.
|
|
||||||
extern INT16 negonearray[MAXVIDWIDTH];
|
//faB: find sprites in wadfile, replace existing, add new ones
|
||||||
extern INT16 screenheightarray[MAXVIDWIDTH];
|
// (only sprites from namelist are added or replaced)
|
||||||
|
void R_AddSpriteDefs(UINT16 wadnum);
|
||||||
|
|
||||||
|
// ---------------------
|
||||||
|
// MASKED COLUMN DRAWING
|
||||||
|
// ---------------------
|
||||||
|
|
||||||
// vars for R_DrawMaskedColumn
|
// vars for R_DrawMaskedColumn
|
||||||
extern INT16 *mfloorclip;
|
extern INT16 *mfloorclip;
|
||||||
|
@ -43,13 +44,19 @@ extern fixed_t sprtopscreen;
|
||||||
extern fixed_t sprbotscreen;
|
extern fixed_t sprbotscreen;
|
||||||
extern fixed_t windowtop;
|
extern fixed_t windowtop;
|
||||||
extern fixed_t windowbottom;
|
extern fixed_t windowbottom;
|
||||||
|
extern INT32 lengthcol;
|
||||||
|
|
||||||
void R_DrawMaskedColumn(column_t *column);
|
void R_DrawMaskedColumn(column_t *column);
|
||||||
void R_DrawFlippedMaskedColumn(column_t *column, INT32 texheight);
|
void R_DrawFlippedMaskedColumn(column_t *column);
|
||||||
|
|
||||||
//faB: find sprites in wadfile, replace existing, add new ones
|
// ----------------
|
||||||
// (only sprites from namelist are added or replaced)
|
// SPRITE RENDERING
|
||||||
void R_AddSpriteDefs(UINT16 wadnum);
|
// ----------------
|
||||||
|
|
||||||
|
// Constant arrays used for psprite clipping
|
||||||
|
// and initializing clipping.
|
||||||
|
extern INT16 negonearray[MAXVIDWIDTH];
|
||||||
|
extern INT16 screenheightarray[MAXVIDWIDTH];
|
||||||
|
|
||||||
fixed_t R_GetShadowZ(mobj_t *thing, pslope_t **shadowslope);
|
fixed_t R_GetShadowZ(mobj_t *thing, pslope_t **shadowslope);
|
||||||
|
|
||||||
|
@ -68,6 +75,9 @@ boolean R_ThingVisibleWithinDist (mobj_t *thing,
|
||||||
boolean R_PrecipThingVisible (precipmobj_t *precipthing,
|
boolean R_PrecipThingVisible (precipmobj_t *precipthing,
|
||||||
fixed_t precip_draw_dist);
|
fixed_t precip_draw_dist);
|
||||||
|
|
||||||
|
// --------------
|
||||||
|
// MASKED DRAWING
|
||||||
|
// --------------
|
||||||
/** Used to count the amount of masked elements
|
/** Used to count the amount of masked elements
|
||||||
* per portal to later group them in separate
|
* per portal to later group them in separate
|
||||||
* drawnode lists.
|
* drawnode lists.
|
||||||
|
@ -82,73 +92,18 @@ typedef struct
|
||||||
|
|
||||||
void R_DrawMasked(maskcount_t* masks, UINT8 nummasks);
|
void R_DrawMasked(maskcount_t* masks, UINT8 nummasks);
|
||||||
|
|
||||||
// -----------
|
// ----------
|
||||||
// SKINS STUFF
|
// VISSPRITES
|
||||||
// -----------
|
// ----------
|
||||||
#define SKINNAMESIZE 16
|
|
||||||
// should be all lowercase!! S_SKIN processing does a strlwr
|
|
||||||
#define DEFAULTSKIN "sonic"
|
|
||||||
#define DEFAULTSKIN2 "tails" // secondary player
|
|
||||||
#define DEFAULTNIGHTSSKIN 0
|
|
||||||
|
|
||||||
typedef struct
|
// number of sprite lumps for spritewidth,offset,topoffset lookup tables
|
||||||
{
|
// Fab: this is a hack : should allocate the lookup tables per sprite
|
||||||
char name[SKINNAMESIZE+1]; // INT16 descriptive name of the skin
|
#define MAXVISSPRITES 2048 // added 2-2-98 was 128
|
||||||
UINT16 wadnum;
|
|
||||||
skinflags_t flags;
|
|
||||||
|
|
||||||
char realname[SKINNAMESIZE+1]; // Display name for level completion.
|
#define VISSPRITECHUNKBITS 6 // 2^6 = 64 sprites per chunk
|
||||||
char hudname[SKINNAMESIZE+1]; // HUD name to display (officially exactly 5 characters long)
|
#define VISSPRITESPERCHUNK (1 << VISSPRITECHUNKBITS)
|
||||||
|
#define VISSPRITEINDEXMASK (VISSPRITESPERCHUNK - 1)
|
||||||
|
|
||||||
UINT8 ability; // ability definition
|
|
||||||
UINT8 ability2; // secondary ability definition
|
|
||||||
INT32 thokitem;
|
|
||||||
INT32 spinitem;
|
|
||||||
INT32 revitem;
|
|
||||||
INT32 followitem;
|
|
||||||
fixed_t actionspd;
|
|
||||||
fixed_t mindash;
|
|
||||||
fixed_t maxdash;
|
|
||||||
|
|
||||||
fixed_t normalspeed; // Normal ground
|
|
||||||
fixed_t runspeed; // Speed that you break into your run animation
|
|
||||||
|
|
||||||
UINT8 thrustfactor; // Thrust = thrustfactor * acceleration
|
|
||||||
UINT8 accelstart; // Acceleration if speed = 0
|
|
||||||
UINT8 acceleration; // Acceleration
|
|
||||||
|
|
||||||
fixed_t jumpfactor; // multiple of standard jump height
|
|
||||||
|
|
||||||
fixed_t radius; // Bounding box changes.
|
|
||||||
fixed_t height;
|
|
||||||
fixed_t spinheight;
|
|
||||||
|
|
||||||
fixed_t shieldscale; // no change to bounding box, but helps set the shield's sprite size
|
|
||||||
fixed_t camerascale;
|
|
||||||
|
|
||||||
// Definable color translation table
|
|
||||||
UINT8 starttranscolor;
|
|
||||||
UINT8 prefcolor;
|
|
||||||
UINT8 supercolor;
|
|
||||||
UINT8 prefoppositecolor; // if 0 use tables instead
|
|
||||||
|
|
||||||
fixed_t highresscale; // scale of highres, default is 0.5
|
|
||||||
UINT8 contspeed; // continue screen animation speed
|
|
||||||
UINT8 contangle; // initial angle on continue screen
|
|
||||||
|
|
||||||
// specific sounds per skin
|
|
||||||
sfxenum_t soundsid[NUMSKINSOUNDS]; // sound # in S_sfx table
|
|
||||||
|
|
||||||
// contains super versions too
|
|
||||||
spritedef_t sprites[NUMPLAYERSPRITES*2];
|
|
||||||
spriteinfo_t sprinfo[NUMPLAYERSPRITES*2];
|
|
||||||
|
|
||||||
UINT8 availability; // lock?
|
|
||||||
} skin_t;
|
|
||||||
|
|
||||||
// -----------
|
|
||||||
// NOT SKINS STUFF !
|
|
||||||
// -----------
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
// actual cuts
|
// actual cuts
|
||||||
|
@ -227,6 +182,12 @@ typedef struct vissprite_s
|
||||||
INT32 dispoffset; // copy of info->dispoffset, affects ordering but not drawing
|
INT32 dispoffset; // copy of info->dispoffset, affects ordering but not drawing
|
||||||
} vissprite_t;
|
} vissprite_t;
|
||||||
|
|
||||||
|
extern UINT32 visspritecount;
|
||||||
|
|
||||||
|
// ----------
|
||||||
|
// DRAW NODES
|
||||||
|
// ----------
|
||||||
|
|
||||||
// A drawnode is something that points to a 3D floor, 3D side, or masked
|
// A drawnode is something that points to a 3D floor, 3D side, or masked
|
||||||
// middle texture. This is used for sorting with sprites.
|
// middle texture. This is used for sorting with sprites.
|
||||||
typedef struct drawnode_s
|
typedef struct drawnode_s
|
||||||
|
@ -241,23 +202,11 @@ typedef struct drawnode_s
|
||||||
struct drawnode_s *prev;
|
struct drawnode_s *prev;
|
||||||
} drawnode_t;
|
} drawnode_t;
|
||||||
|
|
||||||
extern INT32 numskins;
|
|
||||||
extern skin_t skins[MAXSKINS];
|
|
||||||
extern UINT32 visspritecount;
|
|
||||||
|
|
||||||
void SetPlayerSkin(INT32 playernum,const char *skinname);
|
|
||||||
void SetPlayerSkinByNum(INT32 playernum,INT32 skinnum); // Tails 03-16-2002
|
|
||||||
boolean R_SkinUsable(INT32 playernum, INT32 skinnum);
|
|
||||||
UINT32 R_GetSkinAvailabilities(void);
|
|
||||||
INT32 R_SkinAvailable(const char *name);
|
|
||||||
void R_PatchSkins(UINT16 wadnum);
|
|
||||||
void R_AddSkins(UINT16 wadnum);
|
|
||||||
|
|
||||||
UINT8 P_GetSkinSprite2(skin_t *skin, UINT8 spr2, player_t *player);
|
|
||||||
|
|
||||||
void R_InitDrawNodes(void);
|
void R_InitDrawNodes(void);
|
||||||
|
|
||||||
char *GetPlayerFacePic(INT32 skinnum);
|
// -----------------------
|
||||||
|
// SPRITE FRAME CHARACTERS
|
||||||
|
// -----------------------
|
||||||
|
|
||||||
// Functions to go from sprite character ID to frame number
|
// Functions to go from sprite character ID to frame number
|
||||||
// for 2.1 compatibility this still uses the old 'A' + frame code
|
// for 2.1 compatibility this still uses the old 'A' + frame code
|
||||||
|
|
|
@ -27,7 +27,7 @@ extern INT32 msg_id;
|
||||||
#include "g_game.h"
|
#include "g_game.h"
|
||||||
#include "m_argv.h"
|
#include "m_argv.h"
|
||||||
#include "r_main.h" // R_PointToAngle2() used to calc stereo sep.
|
#include "r_main.h" // R_PointToAngle2() used to calc stereo sep.
|
||||||
#include "r_things.h" // for skins
|
#include "r_skins.h" // for skins
|
||||||
#include "i_system.h"
|
#include "i_system.h"
|
||||||
#include "i_sound.h"
|
#include "i_sound.h"
|
||||||
#include "s_sound.h"
|
#include "s_sound.h"
|
||||||
|
|
|
@ -453,7 +453,7 @@ void SCR_ActuallyChangeRenderer(void)
|
||||||
|
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
// Well, it didn't even load anyway.
|
// Well, it didn't even load anyway.
|
||||||
if ((hwrenderloaded == -1) && (setrenderneeded == render_opengl))
|
if ((vid_opengl_state == -1) && (setrenderneeded == render_opengl))
|
||||||
{
|
{
|
||||||
if (M_CheckParm("-nogl"))
|
if (M_CheckParm("-nogl"))
|
||||||
CONS_Alert(CONS_ERROR, "OpenGL rendering was disabled!\n");
|
CONS_Alert(CONS_ERROR, "OpenGL rendering was disabled!\n");
|
||||||
|
@ -478,7 +478,7 @@ void SCR_ChangeRenderer(void)
|
||||||
{
|
{
|
||||||
target_renderer = cv_renderer.value;
|
target_renderer = cv_renderer.value;
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
if (M_CheckParm("-opengl") && (hwrenderloaded == 1))
|
if (M_CheckParm("-opengl") && (vid_opengl_state == 1))
|
||||||
target_renderer = rendermode = render_opengl;
|
target_renderer = rendermode = render_opengl;
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -284,6 +284,7 @@
|
||||||
<ClInclude Include="..\r_patch.h" />
|
<ClInclude Include="..\r_patch.h" />
|
||||||
<ClInclude Include="..\r_portal.h" />
|
<ClInclude Include="..\r_portal.h" />
|
||||||
<ClInclude Include="..\r_segs.h" />
|
<ClInclude Include="..\r_segs.h" />
|
||||||
|
<ClInclude Include="..\r_skins.h" />
|
||||||
<ClInclude Include="..\r_sky.h" />
|
<ClInclude Include="..\r_sky.h" />
|
||||||
<ClInclude Include="..\r_splats.h" />
|
<ClInclude Include="..\r_splats.h" />
|
||||||
<ClInclude Include="..\r_state.h" />
|
<ClInclude Include="..\r_state.h" />
|
||||||
|
@ -446,6 +447,7 @@
|
||||||
<ClCompile Include="..\r_patch.c" />
|
<ClCompile Include="..\r_patch.c" />
|
||||||
<ClCompile Include="..\r_portal.c" />
|
<ClCompile Include="..\r_portal.c" />
|
||||||
<ClCompile Include="..\r_segs.c" />
|
<ClCompile Include="..\r_segs.c" />
|
||||||
|
<ClCompile Include="..\r_skins.c" />
|
||||||
<ClCompile Include="..\r_sky.c" />
|
<ClCompile Include="..\r_sky.c" />
|
||||||
<ClCompile Include="..\r_splats.c" />
|
<ClCompile Include="..\r_splats.c" />
|
||||||
<ClCompile Include="..\r_things.c" />
|
<ClCompile Include="..\r_things.c" />
|
||||||
|
|
|
@ -417,6 +417,9 @@
|
||||||
<ClInclude Include="..\r_segs.h">
|
<ClInclude Include="..\r_segs.h">
|
||||||
<Filter>R_Rend</Filter>
|
<Filter>R_Rend</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\r_skins.h">
|
||||||
|
<Filter>R_Rend</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\r_sky.h">
|
<ClInclude Include="..\r_sky.h">
|
||||||
<Filter>R_Rend</Filter>
|
<Filter>R_Rend</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -849,6 +852,9 @@
|
||||||
<ClCompile Include="..\r_segs.c">
|
<ClCompile Include="..\r_segs.c">
|
||||||
<Filter>R_Rend</Filter>
|
<Filter>R_Rend</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\r_skins.c">
|
||||||
|
<Filter>R_Rend</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\r_sky.c">
|
<ClCompile Include="..\r_sky.c">
|
||||||
<Filter>R_Rend</Filter>
|
<Filter>R_Rend</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|
|
@ -104,7 +104,7 @@ static consvar_t cv_stretch = {"stretch", "Off", CV_SAVE|CV_NOSHOWHELP, CV_OnOff
|
||||||
static consvar_t cv_alwaysgrabmouse = {"alwaysgrabmouse", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
static consvar_t cv_alwaysgrabmouse = {"alwaysgrabmouse", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
UINT8 graphics_started = 0; // Is used in console.c and screen.c
|
UINT8 graphics_started = 0; // Is used in console.c and screen.c
|
||||||
INT32 hwrenderloaded = 0;
|
INT32 vid_opengl_state = 0;
|
||||||
|
|
||||||
// To disable fullscreen at startup; is set in VID_PrepareModeList
|
// To disable fullscreen at startup; is set in VID_PrepareModeList
|
||||||
boolean allow_fullscreen = false;
|
boolean allow_fullscreen = false;
|
||||||
|
@ -1436,7 +1436,7 @@ static SDL_bool Impl_CreateContext(void)
|
||||||
{
|
{
|
||||||
// Renderer-specific stuff
|
// Renderer-specific stuff
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
if ((rendermode == render_opengl) && (hwrenderloaded != -1))
|
if ((rendermode == render_opengl) && (vid_opengl_state != -1))
|
||||||
{
|
{
|
||||||
if (!sdlglcontext)
|
if (!sdlglcontext)
|
||||||
sdlglcontext = SDL_GL_CreateContext(window);
|
sdlglcontext = SDL_GL_CreateContext(window);
|
||||||
|
@ -1469,10 +1469,10 @@ static SDL_bool Impl_CreateContext(void)
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HWRENDER
|
void VID_CheckGLLoaded(rendermode_t oldrender)
|
||||||
static void VID_CheckGLLoaded(rendermode_t oldrender)
|
|
||||||
{
|
{
|
||||||
if (hwrenderloaded == -1) // Well, it didn't work the first time anyway.
|
#ifdef HWRENDER
|
||||||
|
if (vid_opengl_state == -1) // Well, it didn't work the first time anyway.
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_ERROR, "OpenGL never loaded\n");
|
CONS_Alert(CONS_ERROR, "OpenGL never loaded\n");
|
||||||
rendermode = oldrender;
|
rendermode = oldrender;
|
||||||
|
@ -1485,40 +1485,66 @@ static void VID_CheckGLLoaded(rendermode_t oldrender)
|
||||||
setrenderneeded = 0;
|
setrenderneeded = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void VID_CheckRenderer(void)
|
void VID_CheckRenderer(void)
|
||||||
{
|
{
|
||||||
SDL_bool rendererchanged = SDL_FALSE;
|
boolean rendererchanged = false;
|
||||||
|
boolean contextcreated = false;
|
||||||
rendermode_t oldrenderer = rendermode;
|
rendermode_t oldrenderer = rendermode;
|
||||||
|
|
||||||
if (dedicated)
|
if (dedicated)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef HWRENDER
|
|
||||||
if (!graphics_started)
|
|
||||||
VID_CheckGLLoaded(oldrenderer);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (setrenderneeded)
|
if (setrenderneeded)
|
||||||
{
|
{
|
||||||
rendermode = setrenderneeded;
|
rendermode = setrenderneeded;
|
||||||
rendererchanged = SDL_TRUE;
|
rendererchanged = true;
|
||||||
|
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
if (rendermode == render_opengl)
|
if (rendermode == render_opengl)
|
||||||
{
|
{
|
||||||
VID_CheckGLLoaded(oldrenderer);
|
VID_CheckGLLoaded(oldrenderer);
|
||||||
|
|
||||||
// Initialise OpenGL before calling SDLSetMode!!!
|
// Initialise OpenGL before calling SDLSetMode!!!
|
||||||
if (hwrenderloaded != 1)
|
// This is because SDLSetMode calls OglSdlSurface.
|
||||||
I_StartupHardwareGraphics();
|
if (vid_opengl_state == 0)
|
||||||
else if (hwrenderloaded == -1)
|
{
|
||||||
rendererchanged = SDL_FALSE;
|
VID_StartupOpenGL();
|
||||||
|
// Loaded successfully!
|
||||||
|
if (vid_opengl_state == 1)
|
||||||
|
{
|
||||||
|
// Destroy the current window, if it exists.
|
||||||
|
if (window)
|
||||||
|
{
|
||||||
|
SDL_DestroyWindow(window);
|
||||||
|
window = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destroy the current window rendering context, if that also exists.
|
||||||
|
if (renderer)
|
||||||
|
{
|
||||||
|
SDL_DestroyRenderer(renderer);
|
||||||
|
renderer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new window.
|
||||||
|
Impl_CreateWindow(USE_FULLSCREEN);
|
||||||
|
|
||||||
|
// From there, the OpenGL context was already created.
|
||||||
|
contextcreated = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (vid_opengl_state == -1)
|
||||||
|
rendererchanged = false;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Impl_CreateContext();
|
if (!contextcreated)
|
||||||
|
Impl_CreateContext();
|
||||||
|
|
||||||
|
setrenderneeded = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDLSetMode(vid.width, vid.height, USE_FULLSCREEN, (rendererchanged ? SDL_FALSE : SDL_TRUE));
|
SDLSetMode(vid.width, vid.height, USE_FULLSCREEN, (rendererchanged ? SDL_FALSE : SDL_TRUE));
|
||||||
|
@ -1531,15 +1557,25 @@ void VID_CheckRenderer(void)
|
||||||
SDL_FreeSurface(bufSurface);
|
SDL_FreeSurface(bufSurface);
|
||||||
bufSurface = NULL;
|
bufSurface = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rendererchanged)
|
||||||
|
{
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
if (hwrenderloaded == 1) // Only if OpenGL ever loaded!
|
if (vid_opengl_state == 1) // Only if OpenGL ever loaded!
|
||||||
HWR_FreeTextureCache();
|
HWR_FreeTextureCache();
|
||||||
#endif
|
#endif
|
||||||
SCR_SetDrawFuncs();
|
SCR_SetDrawFuncs();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
else if (rendermode == render_opengl)
|
else if (rendermode == render_opengl)
|
||||||
R_InitHardwareMode();
|
{
|
||||||
|
if (rendererchanged)
|
||||||
|
{
|
||||||
|
R_InitHardwareMode();
|
||||||
|
V_SetPalette(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
(void)oldrenderer;
|
(void)oldrenderer;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1583,7 +1619,7 @@ static SDL_bool Impl_CreateWindow(SDL_bool fullscreen)
|
||||||
flags |= SDL_WINDOW_BORDERLESS;
|
flags |= SDL_WINDOW_BORDERLESS;
|
||||||
|
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
if (hwrenderloaded != -1)
|
if (vid_opengl_state == 1)
|
||||||
flags |= SDL_WINDOW_OPENGL;
|
flags |= SDL_WINDOW_OPENGL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1717,11 +1753,12 @@ void I_StartupGraphics(void)
|
||||||
|
|
||||||
//SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY>>1,SDL_DEFAULT_REPEAT_INTERVAL<<2);
|
//SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY>>1,SDL_DEFAULT_REPEAT_INTERVAL<<2);
|
||||||
VID_Command_ModeList_f();
|
VID_Command_ModeList_f();
|
||||||
|
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
if (M_CheckParm("-nogl"))
|
if (M_CheckParm("-nogl"))
|
||||||
hwrenderloaded = -1; // Don't call SDL_GL_LoadLibrary
|
vid_opengl_state = -1; // Don't startup OpenGL
|
||||||
else
|
else if (chosenrendermode == render_opengl)
|
||||||
I_StartupHardwareGraphics();
|
VID_StartupOpenGL();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Fury: we do window initialization after GL setup to allow
|
// Fury: we do window initialization after GL setup to allow
|
||||||
|
@ -1776,12 +1813,13 @@ void I_StartupGraphics(void)
|
||||||
graphics_started = true;
|
graphics_started = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_StartupHardwareGraphics(void)
|
void VID_StartupOpenGL(void)
|
||||||
{
|
{
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
static boolean glstartup = false;
|
static boolean glstartup = false;
|
||||||
if (!glstartup)
|
if (!glstartup)
|
||||||
{
|
{
|
||||||
|
CONS_Printf("VID_StartupOpenGL()...\n");
|
||||||
HWD.pfnInit = hwSym("Init",NULL);
|
HWD.pfnInit = hwSym("Init",NULL);
|
||||||
HWD.pfnFinishUpdate = NULL;
|
HWD.pfnFinishUpdate = NULL;
|
||||||
HWD.pfnDraw2DLine = hwSym("Draw2DLine",NULL);
|
HWD.pfnDraw2DLine = hwSym("Draw2DLine",NULL);
|
||||||
|
@ -1819,7 +1857,9 @@ void I_StartupHardwareGraphics(void)
|
||||||
HWD.pfnLoadCustomShader = hwSym("LoadCustomShader",NULL);
|
HWD.pfnLoadCustomShader = hwSym("LoadCustomShader",NULL);
|
||||||
HWD.pfnInitCustomShaders= hwSym("InitCustomShaders",NULL);
|
HWD.pfnInitCustomShaders= hwSym("InitCustomShaders",NULL);
|
||||||
|
|
||||||
if (!HWD.pfnInit()) // let load the OpenGL library
|
vid_opengl_state = HWD.pfnInit() ? 1 : -1; // let load the OpenGL library
|
||||||
|
|
||||||
|
if (vid_opengl_state == -1)
|
||||||
{
|
{
|
||||||
rendermode = render_soft;
|
rendermode = render_soft;
|
||||||
setrenderneeded = 0;
|
setrenderneeded = 0;
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include "i_sound.h"
|
#include "i_sound.h"
|
||||||
#include "sounds.h"
|
#include "sounds.h"
|
||||||
#include "r_defs.h"
|
#include "r_defs.h"
|
||||||
#include "r_things.h"
|
#include "r_skins.h"
|
||||||
#include "z_zone.h"
|
#include "z_zone.h"
|
||||||
#include "w_wad.h"
|
#include "w_wad.h"
|
||||||
#include "lua_script.h"
|
#include "lua_script.h"
|
||||||
|
|
84
src/w_wad.c
84
src/w_wad.c
|
@ -807,7 +807,7 @@ UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup)
|
||||||
|
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
// Read shaders from file
|
// Read shaders from file
|
||||||
if (rendermode == render_opengl && (hwrenderloaded == 1))
|
if (rendermode == render_opengl && (vid_opengl_state == 1))
|
||||||
{
|
{
|
||||||
HWR_ReadShaders(numwadfiles - 1, (type == RET_PK3));
|
HWR_ReadShaders(numwadfiles - 1, (type == RET_PK3));
|
||||||
HWR_LoadShaders();
|
HWR_LoadShaders();
|
||||||
|
@ -1505,6 +1505,54 @@ void *W_CacheLumpName(const char *name, INT32 tag)
|
||||||
// Cache a patch into heap memory, convert the patch format as necessary
|
// Cache a patch into heap memory, convert the patch format as necessary
|
||||||
//
|
//
|
||||||
|
|
||||||
|
void *W_CacheSoftwarePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag)
|
||||||
|
{
|
||||||
|
lumpcache_t *lumpcache = NULL;
|
||||||
|
|
||||||
|
if (!TestValidLump(wad, lump))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
lumpcache = wadfiles[wad]->patchcache;
|
||||||
|
|
||||||
|
if (!lumpcache[lump])
|
||||||
|
{
|
||||||
|
size_t len = W_LumpLengthPwad(wad, lump);
|
||||||
|
void *ptr, *lumpdata;
|
||||||
|
#ifndef NO_PNG_LUMPS
|
||||||
|
void *srcdata = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ptr = Z_Malloc(len, tag, &lumpcache[lump]);
|
||||||
|
lumpdata = Z_Malloc(len, tag, NULL);
|
||||||
|
|
||||||
|
// read the lump in full
|
||||||
|
W_ReadLumpHeaderPwad(wad, lump, lumpdata, 0, 0);
|
||||||
|
|
||||||
|
#ifndef NO_PNG_LUMPS
|
||||||
|
// lump is a png so convert it
|
||||||
|
if (R_IsLumpPNG((UINT8 *)lumpdata, len))
|
||||||
|
{
|
||||||
|
size_t newlen;
|
||||||
|
srcdata = R_PNGToPatch((UINT8 *)lumpdata, len, &newlen);
|
||||||
|
ptr = Z_Realloc(ptr, newlen, tag, &lumpcache[lump]);
|
||||||
|
M_Memcpy(ptr, srcdata, newlen);
|
||||||
|
Z_Free(srcdata);
|
||||||
|
}
|
||||||
|
else // just copy it into the patch cache
|
||||||
|
#endif
|
||||||
|
M_Memcpy(ptr, lumpdata, len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Z_ChangeTag(lumpcache[lump], tag);
|
||||||
|
|
||||||
|
return lumpcache[lump];
|
||||||
|
}
|
||||||
|
|
||||||
|
void *W_CacheSoftwarePatchNum(lumpnum_t lumpnum, INT32 tag)
|
||||||
|
{
|
||||||
|
return W_CacheSoftwarePatchNumPwad(WADFILENUM(lumpnum),LUMPNUM(lumpnum),tag);
|
||||||
|
}
|
||||||
|
|
||||||
void *W_CachePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag)
|
void *W_CachePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag)
|
||||||
{
|
{
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
|
@ -1519,39 +1567,7 @@ void *W_CachePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag)
|
||||||
if (rendermode == render_soft || rendermode == render_none)
|
if (rendermode == render_soft || rendermode == render_none)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
lumpcache_t *lumpcache = wadfiles[wad]->patchcache;
|
return W_CacheSoftwarePatchNumPwad(wad, lump, tag);
|
||||||
if (!lumpcache[lump])
|
|
||||||
{
|
|
||||||
size_t len = W_LumpLengthPwad(wad, lump);
|
|
||||||
void *ptr, *lumpdata;
|
|
||||||
#ifndef NO_PNG_LUMPS
|
|
||||||
void *srcdata = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ptr = Z_Malloc(len, tag, &lumpcache[lump]);
|
|
||||||
lumpdata = Z_Malloc(len, tag, NULL);
|
|
||||||
|
|
||||||
// read the lump in full
|
|
||||||
W_ReadLumpHeaderPwad(wad, lump, lumpdata, 0, 0);
|
|
||||||
|
|
||||||
#ifndef NO_PNG_LUMPS
|
|
||||||
// lump is a png so convert it
|
|
||||||
if (R_IsLumpPNG((UINT8 *)lumpdata, len))
|
|
||||||
{
|
|
||||||
size_t newlen;
|
|
||||||
srcdata = R_PNGToPatch((UINT8 *)lumpdata, len, &newlen);
|
|
||||||
ptr = Z_Realloc(ptr, newlen, tag, &lumpcache[lump]);
|
|
||||||
M_Memcpy(ptr, srcdata, newlen);
|
|
||||||
Z_Free(srcdata);
|
|
||||||
}
|
|
||||||
else // just copy it into the patch cache
|
|
||||||
#endif
|
|
||||||
M_Memcpy(ptr, lumpdata, len);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Z_ChangeTag(lumpcache[lump], tag);
|
|
||||||
|
|
||||||
return lumpcache[lump];
|
|
||||||
}
|
}
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
|
|
||||||
|
|
11
src/w_wad.h
11
src/w_wad.h
|
@ -191,8 +191,15 @@ boolean W_IsPatchCached(lumpnum_t lump, void *ptr);
|
||||||
void *W_CacheLumpName(const char *name, INT32 tag);
|
void *W_CacheLumpName(const char *name, INT32 tag);
|
||||||
void *W_CachePatchName(const char *name, INT32 tag);
|
void *W_CachePatchName(const char *name, INT32 tag);
|
||||||
|
|
||||||
void *W_CachePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag); // return a patch_t
|
// Returns either a Software patch, or an OpenGL patch.
|
||||||
void *W_CachePatchNum(lumpnum_t lumpnum, INT32 tag); // return a patch_t
|
// Performs any necessary conversions from PNG images.
|
||||||
|
void *W_CachePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag);
|
||||||
|
void *W_CachePatchNum(lumpnum_t lumpnum, INT32 tag);
|
||||||
|
|
||||||
|
// Returns a Software patch.
|
||||||
|
// Performs any necessary conversions from PNG images.
|
||||||
|
void *W_CacheSoftwarePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag);
|
||||||
|
void *W_CacheSoftwarePatchNum(lumpnum_t lumpnum, INT32 tag);
|
||||||
|
|
||||||
void W_UnlockCachedPatch(void *patch);
|
void W_UnlockCachedPatch(void *patch);
|
||||||
|
|
||||||
|
|
|
@ -239,10 +239,7 @@ void I_StartupGraphics(void)
|
||||||
if (!dedicated) graphics_started = true;
|
if (!dedicated) graphics_started = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_StartupHardwareGraphics(void)
|
void VID_StartupOpenGL(void){}
|
||||||
{
|
|
||||||
// oh yeah woo yeah oh yeah woo yeah oh yeah woo yeah oh yeah woo yeah oh yeah woo yeah oh yeah woo yeah oh yeah woo y
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------
|
// ------------------
|
||||||
// I_ShutdownGraphics
|
// I_ShutdownGraphics
|
||||||
|
@ -951,10 +948,8 @@ INT32 VID_SetMode(INT32 modenum)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VID_CheckRenderer(void)
|
void VID_CheckRenderer(void) {}
|
||||||
{
|
void VID_CheckGLLoaded(rendermode_t oldrender) {}
|
||||||
// ..............
|
|
||||||
}
|
|
||||||
|
|
||||||
// ========================================================================
|
// ========================================================================
|
||||||
// Free the video buffer of the last video mode,
|
// Free the video buffer of the last video mode,
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include "i_video.h"
|
#include "i_video.h"
|
||||||
#include "p_tick.h"
|
#include "p_tick.h"
|
||||||
#include "r_defs.h"
|
#include "r_defs.h"
|
||||||
#include "r_things.h"
|
#include "r_skins.h"
|
||||||
#include "s_sound.h"
|
#include "s_sound.h"
|
||||||
#include "st_stuff.h"
|
#include "st_stuff.h"
|
||||||
#include "v_video.h"
|
#include "v_video.h"
|
||||||
|
|
Loading…
Reference in New Issue