Game Configurations: added Vanilla Strife, Vanilla Heretic and Vanilla Hexen game configurations.

Added "makedoorceil" game configuration property. Works the same way as "makedoortrack" and "makedoordoor", but for ceilings of door sectors. 
Changed, Game configurations: the editor no longer tries to load DECORATE/MODELDEF/VOXELDEF/GLDEFS/REVERBS lumps when "decorategames" setting is not specified / is set to empty string.
Changed, General interface: "Tools -> Reload MODELDEF/VOXELDEF" and "Tools -> Reload GLDEFS" menu items are no longer shown when current game configuration doesn't support DECORATE. 
Fixed a crash when pasting linedef/thing properties in Hexen map format.
Fixed, Visual mode: Visual Thing resources were not fully unloaded when resetting D3D device leading to crash when switching to the editor from a DX-using game engine (like ZDoom) running in fullscreen.
Fixed: in some cases, when current game configuration supported multiple script compilers, it was possible to open/create a map or change map options without selecting any script compiler.
Fixed, New Map Options window: default map name was not updated when switching game configurations.
Fixed: copied map element properties were not reset after switching to another map.
Fixed: stored textures for "Make Door" action were not reset after switching to another map.
Fixed, Game Configurations window: currently selected test engine name was not updated when pasting test engines from another configuration. 
Fixed, Game Configurations: all "Heretic in Doom map format" configurations were using Doom sector effects list.
Fixed, Game Configurations: all "Strife in Doom map format" configurations were using Doom sector effects list.
This commit is contained in:
MaxED 2015-10-21 13:35:42 +00:00
parent 027df50640
commit a182a5098d
51 changed files with 1123 additions and 562 deletions

Binary file not shown.

View file

@ -32,6 +32,9 @@ include("Includes\\Boom_common.cfg", "mapformat_doom");
// Settings common to Doom games
include("Includes\\Game_Doom.cfg");
//mxd. No DECORATE support in vanilla
decorategames = "";
// Default thing filters
// (these are not required, just useful for new users)
thingsfilters

View file

@ -29,6 +29,9 @@ include("Includes\\Boom_common.cfg", "mapformat_doom");
// Settings common to Doom games
include("Includes\\Game_Doom.cfg");
//mxd. No DECORATE support in vanilla
decorategames = "";
// Default thing filters
// (these are not required, just useful for new users)
thingsfilters
@ -39,6 +42,9 @@ thingsfilters
//Default map name
defaultlumpname = "E1M1";
// Default testing parameters
testparameters = "-iwad \"%WP\" -skill \"%S\" -file \"%AP\" \"%F\" -warp %L1 %L2 %NM";
// THING TYPES
// Each engine has its own additional thing types
// Order should always be 1: Game; 2: ZDoom/game; 3: ZDoom/zdoom

View file

@ -32,6 +32,9 @@ include("Includes\\Doom_common.cfg", "mapformat_doom");
// Settings common to Doom games
include("Includes\\Game_Doom.cfg");
//mxd. No DECORATE support in vanilla
decorategames = "";
// Default thing filters
// (these are not required, just useful for new users)
thingsfilters

View file

@ -29,6 +29,9 @@ include("Includes\\Doom_common.cfg", "mapformat_doom");
// Settings common to Doom games
include("Includes\\Game_Doom.cfg");
//mxd. No DECORATE support in vanilla
decorategames = "";
// Default thing filters
// (these are not required, just useful for new users)
thingsfilters
@ -39,6 +42,9 @@ thingsfilters
//Default map name
defaultlumpname = "E1M1";
// Default testing parameters
testparameters = "-iwad \"%WP\" -skill \"%S\" -file \"%AP\" \"%F\" -warp %L1 %L2 %NM";
// THING TYPES
// Each engine has its own additional thing types
// Order should always be 1: Game; 2: ZDoom/game; 3: ZDoom/zdoom

View file

@ -25,6 +25,7 @@ include("Includes\\ZDoom_common.cfg", "common");
// Settings common to Doom map format
include("Includes\\ZDoom_common.cfg", "mapformat_doom");
include("Includes\\Heretic_misc.cfg", "mapformat_doom");
// Settings common to Heretic games
include("Includes\\Game_Heretic.cfg");

View file

@ -0,0 +1,64 @@
/*************************************************************\
Doom Builder 2 Game Configuration for ZDoom-compatible port
\*************************************************************/
// 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 = "Heretic: Heretic (Doom format)";
// This is the simplified game engine/sourceport name
engine = "heretic";
// *******************************************************
// * *
// * Note: all the elements that could be factorized *
// * because they were common to ZDoom, GZDoom and *
// * Zandronum have been moved to ZDoom_common.cfg. *
// * *
// *******************************************************
// STANDARD DOOM SETTINGS
// Settings common to all games and all map formats
include("Includes\\Doom_common.cfg", "common");
// Settings common to Doom map format
include("Includes\\Heretic_common.cfg", "mapformat_doom");
// Settings common to Doom games
include("Includes\\Game_Heretic.cfg");
//mxd. No DECORATE support in vanilla
decorategames = "";
// Default thing filters
// (these are not required, just useful for new users)
thingsfilters
{
include("Includes\\Doom_misc.cfg", "thingsfilters");
}
//Default map name
defaultlumpname = "E1M1";
// Default testing parameters
testparameters = "-iwad \"%WP\" -skill \"%S\" -file \"%AP\" \"%F\" -warp %L1 %L2 %NM";
// THING TYPES
// Each engine has its own additional thing types
// Order should always be 1: Game; 2: ZDoom/game; 3: ZDoom/zdoom
thingtypes
{
// Basic game actors
include("Includes\\Heretic_things.cfg");
}
// 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\\Doom_misc.cfg", "enums");
}

View file

@ -0,0 +1,62 @@
/*************************************************************\
Doom Builder 2 Game Configuration for ZDoom-compatible port
\*************************************************************/
// 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 = "Hexen: Hexen (Hexen format)";
// This is the simplified game engine/sourceport name
engine = "hexen";
// *******************************************************
// * *
// * Note: all the elements that could be factorized *
// * because they were common to ZDoom, GZDoom and *
// * Zandronum have been moved to ZDoom_common.cfg. *
// * *
// *******************************************************
// STANDARD ZDOOM SETTINGS
// Settings common to all games and all map formats
include("Includes\\Doom_common.cfg", "common");
// Settings common to Hexen map format
include("Includes\\Hexen_common.cfg", "mapformat_hexen");
// Settings common to Hexen games
include("Includes\\Game_Hexen.cfg");
//mxd. No DECORATE support in vanilla
decorategames = "";
// Default thing filters
// (these are not required, just useful for new users)
thingsfilters
{
include("Includes\\Hexen_misc.cfg", "thingsfilters");
}
// THING TYPES
// Each engine has its own additional thing types
// Order should always be 1: Game; 2: ZDoom/game; 3: ZDoom/zdoom
thingtypes
{
// Basic game actors
include("Includes\\Hexen_things.cfg");
}
// 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\\Doom_misc.cfg", "enums");
// Standard ZDoom enums
include("Includes\\ZDoom_misc.cfg", "enums");
// Additional ZDoom enums for that game
include("Includes\\ZDoom_misc.cfg", "enums_hexen");
}

View file

@ -20,7 +20,7 @@ common
// Texture sources
textures
{
include("Doom_misc.cfg", "textures");
include("Doom_misc.cfg", "textures");
}
// Patch sources

View file

@ -1,7 +1,4 @@
// Basic Doom and Vanilla engine stuff.
skills
{
1 = "I'm too young to die";
@ -11,7 +8,6 @@ skills
5 = "Nightmare!";
}
linedefflags
{
1 = "Impassable";
@ -25,7 +21,6 @@ linedefflags
256 = "Initially shown on automap";
}
thingflags
{
1 = "Easy";
@ -35,7 +30,6 @@ thingflags
16 = "Multiplayer only";
}
// Default flags for first new thing
defaultthingflags
{
@ -44,18 +38,20 @@ defaultthingflags
4;
}
// How thing flags should be compared (for the stuck thing error check)
thingflagscompare
{
skills {
skills
{
1;
2;
4;
}
gamemodes {
16 {
gamemodes
{
16
{
comparemethod = "equal";
ignoredgroup = "skills";
ingnorethisgroupwhenunset = true;
@ -63,7 +59,6 @@ thingflagscompare
}
}
// Mask for the thing flags which indicates the options
// that make the same thing appear in the same modes
thingflagsmasks
@ -72,7 +67,6 @@ thingflagsmasks
thingflagsmask2 = 0;
}
// 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
@ -89,7 +83,6 @@ linedefflagstranslation
256 = "mapped";
}
// 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
@ -102,7 +95,6 @@ thingflagstranslation
16 = "!single";
}
// Default sector brightness levels
sectorbrightness
{
@ -110,7 +102,6 @@ sectorbrightness
128; 112; 96; 80; 64; 48; 32; 16; 0;
}
/*
TEXTURES AND FLAT SOURCES
This tells Doom Builder where to find the information for textures
@ -188,7 +179,6 @@ flats
}
}
/*
MAP LUMP NAMES
Map lumps are loaded with the map as long as they are right after each other. When the editor
@ -289,7 +279,6 @@ doommaplumpnames
}
}
hexenmaplumpnames
{
~MAP
@ -380,16 +369,14 @@ hexenmaplumpnames
{
required = false;
nodebuild = false;
script = "ZDoom_ACS.cfg";
script = "Hexen_ACS.cfg";
}
}
// Default thing filters
// (these are not required, just useful for new users)
thingsfilters
{
filter0
{
name = "Easy skill";
@ -400,33 +387,9 @@ thingsfilters
{
1 = true;
}
}
filter1
{
name = "Hard skill";
category = "";
type = -1;
fields
{
4 = true;
}
}
filter2
{
name = "Keys only";
category = "keys";
type = -1;
}
filter3
{
name = "Medium skill";
category = "";
@ -436,9 +399,26 @@ thingsfilters
{
2 = true;
}
}
filter2
{
name = "Hard skill";
category = "";
type = -1;
fields
{
4 = true;
}
}
filter3
{
name = "Keys only";
category = "keys";
type = -1;
}
filter4
{
@ -450,9 +430,7 @@ thingsfilters
{
16 = true;
}
}
}

View file

@ -14,13 +14,7 @@
// Door making
makedoortrack = "DOORTRAK";
makedoordoor = "BIGDOOR2";
// Default thing filters
// (these are not required, just useful for new users)
/*thingsfilters
{
include("Doom_misc.cfg", "thingsfilters");
}*/
makedoorceil = "FLAT20";
// Default texture sets
// (these are not required, but useful for new users)

View file

@ -1,5 +1,5 @@
// Default lump name for new map
defaultlumpname = "MAP01";
defaultlumpname = "E1M1";
basegame = 2;
// Decorate actors to include depending on actor game property
@ -12,14 +12,9 @@
}
// Door making
makedoortrack = "METL2";
// Default thing filters
// (these are not required, just useful for new users)
/*thingsfilters
{
include("Doom_misc.cfg", "thingsfilters");
}*/
makedoortrack = "WOODWL";
makedoordoor = "DOORWOOD";
makedoorceil = "FLOOR04";
// Default texture sets
// (these are not required, but useful for new users)

View file

@ -15,13 +15,7 @@
// Door making
makedoortrack = "D_END2";
makedoordoor = "D_WD07";
// Default thing filters
// (these are not required, just useful for new users)
/*thingsfilters
{
include("Hexen_misc.cfg", "thingsfilters");
} */
makedoorceil = "F_092";
// Default texture sets
// (these are not required, but useful for new users)

View file

@ -15,6 +15,7 @@
// Door making
makedoortrack = "DORTRK01";
makedoordoor = "DORML01";
makedoorceil = "F_UNDOOR";
// Default texture sets
// (these are not required, but useful for new users)

View file

@ -0,0 +1,90 @@
//mxd. These settings are used only in Vanilla Heretic configuration.
mapformat_doom
{
// The format interface handles the map data format
formatinterface = "DoomMapSetIO";
maplumpnames
{
include("Doom_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("ZDoom_misc.cfg", "speciallinedefs_doomhexen");
// Default flags for first new thing
defaultthingflags
{
include("Doom_misc.cfg", "defaultthingflags");
}
// Door making
include("ZDoom_misc.cfg", "doormaking_doom");
// Generalized actions
generalizedlinedefs = false;
generalizedsectors = false;
// DEFAULT SECTOR BRIGHTNESS LEVELS
sectorbrightness
{
include("Doom_misc.cfg", "sectorbrightness");
}
// SECTOR TYPES
sectortypes
{
include("Heretic_sectors.cfg");
}
// LINEDEF FLAGS
linedefflags
{
include("Doom_misc.cfg", "linedefflags");
}
// LINEDEF ACTIVATIONS
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
{
include("Doom_misc.cfg", "linedefflagstranslation");
}
// LINEDEF TYPES
linedeftypes
{
include("Heretic_linedefs.cfg");
}
// THING FLAGS
thingflags
{
include("Doom_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("Doom_misc.cfg", "thingflagstranslation");
}
// How to compare thing flags (for the stuck things error checker)
thingflagscompare
{
include("Doom_misc.cfg", "thingflagscompare");
}
// Things flags masks
include("Doom_misc.cfg", "thingflagsmasks");
}

View file

@ -6,4 +6,14 @@ skills
3 = "Bringest them oneth";
4 = "Thou art a smite-meister";
5 = "Black plague possesses thee";
}
//mxd. These are Heretic-specific settings only.
//mxd. These settings are valid only in native Heretic map format.
mapformat_doom
{
sectortypes
{
include("Heretic_sectors.cfg");
}
}

View file

@ -0,0 +1,101 @@
//mxd. These settings are used only in Vanilla Hexen configuration.
mapformat_hexen
{
// The format interface handles the map data format
formatinterface = "HexenMapSetIO";
maplumpnames
{
include("Doom_misc.cfg", "hexenmaplumpnames");
}
// When this is set to true, sectors with the same tag will light up when a line is highlighted
linetagindicatesectors = false;
// Special linedefs
include("ZDoom_misc.cfg", "speciallinedefs_doomhexen");
// Default flags for first new thing
defaultthingflags
{
include("ZDoom_misc.cfg", "defaultthingflags");
}
// Door making
include("ZDoom_misc.cfg", "doormaking_hexen");
// Generalized actions
generalizedlinedefs = false;
generalizedsectors = false;
// DEFAULT SECTOR BRIGHTNESS LEVELS
sectorbrightness
{
include("ZDoom_misc.cfg", "sectorbrightness");
}
// SECTOR TYPES
sectortypes
{
include("Hexen_sectors.cfg");
}
// LINEDEF FLAGS
linedefflags
{
include("Doom_misc.cfg", "linedefflags");
include("Hexen_misc.cfg", "linedefflags");
}
// Activations filter for Hexen type activations
// This filters the activation bits from the flags
include("Hexen_misc.cfg", "linedefactivationsfilter");
// LINEDEF ACTIVATIONS
// Make sure these are in order from lowest value to highest value
linedefactivations
{
include("Hexen_misc.cfg", "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
{
include("Doom_misc.cfg", "linedefflagstranslation");
include("Hexen_misc.cfg", "linedefflagstranslation");
}
// LINEDEF TYPES
linedeftypes
{
include("Hexen_linedefs.cfg");
}
// THING FLAGS
thingflags
{
include("Doom_misc.cfg", "thingflags");
include("Hexen_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("Doom_misc.cfg", "thingflagstranslation");
include("Hexen_misc.cfg", "thingflagstranslation");
}
// How to compare thing flags (for the stuck things error checker)
thingflagscompare
{
include("Hexen_misc.cfg", "thingflagscompare");
}
// Things flags masks
include("Hexen_misc.cfg", "thingflagsmasks");
}

View file

@ -1,7 +1,4 @@
// Basic Hexen stuff.
skills
{
1 = "Squire / Altar boy / Apprentice";
@ -11,7 +8,6 @@ skills
5 = "Titan / Pope / Archimage";
}
linedefflags
{
512 = "Repeatable Action";
@ -19,7 +15,6 @@ linedefflags
32768 = "Block Everything";
}
thingflags
{
16 = "Dormant";
@ -31,7 +26,6 @@ thingflags
1024 = "Deathmatch";
}
// Default flags for first new thing
defaultthingflags
{
@ -62,18 +56,9 @@ thingflagscompare
gamemodes
{
256
{
requiredgroup = "skills";
}
512
{
requiredgroup = "skills";
}
1024
{
ignoredgroup = "skills";
}
256 { requiredgroup = "skills"; }
512 { requiredgroup = "skills"; }
1024 { ignoredgroup = "skills"; }
}
}
@ -85,7 +70,6 @@ thingflagsmasks
thingflagsmask2 = 1792; // 256 + 512 + 1024
}
// 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
@ -101,7 +85,6 @@ linedefflagstranslation
32768 = "blockeverything";
}
// 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
@ -116,7 +99,6 @@ thingflagstranslation
1024 = "dm";
}
// Activations filter for Hexen type activations
// This filters the activation bits from the flags
// This is in its own structure for inclusion only,
@ -126,7 +108,6 @@ linedefactivationsfilter
linedefactivationsfilter = 7168;
}
// LINEDEF ACTIVATIONS
// Make sure these are in order from lowest value to highest value
linedefactivations
@ -137,14 +118,13 @@ linedefactivations
3072 = "Projectile hits";
4096 = "Player bumps";
5120 = "Projectile flies over";
6144 = "Player presses Use (PassThru)";
}
// Default thing filters
// (these are not required, just useful for new users)
thingsfilters
{
filter0
{
name = "Easy skill";
@ -155,33 +135,9 @@ thingsfilters
{
1 = true;
}
}
filter1
{
name = "Hard skill";
category = "";
type = -1;
fields
{
4 = true;
}
}
filter2
{
name = "Keys only";
category = "keys";
type = -1;
}
filter3
{
name = "Medium skill";
category = "";
@ -191,12 +147,88 @@ thingsfilters
{
2 = true;
}
}
filter2
{
name = "Hard skill";
category = "";
type = -1;
fields
{
4 = true;
}
}
filter3
{
name = "Fighter class";
category = "";
type = -1;
fields
{
32 = true;
}
}
filter4
{
name = "Cleric class";
category = "";
type = -1;
fields
{
64 = true;
}
}
filter5
{
name = "Mage class";
category = "";
type = -1;
fields
{
128 = true;
}
}
filter6
{
name = "Keys only";
category = "keys";
type = -1;
}
filter7
{
name = "Cooperative";
category = "";
type = -1;
fields
{
512 = true;
}
}
filter8
{
name = "Deathmatch";
category = "";
type = -1;
fields
{
1024 = true;
}
}
}
// ENUMERATIONS
// These are enumerated lists for linedef types and UDMF fields.
enums
@ -224,4 +256,14 @@ enums
{
0 = "None";
}
}
//mxd. These are Hexen-specific settings only.
//mxd. These settings are valid only in native Hexen map format.
mapformat_hexen
{
sectortypes
{
include("Hexen_sectors.cfg");
}
}

View file

@ -1516,16 +1516,19 @@ other
3000
{
title = "Polyobject Anchor";
sprite = "internal:anchor";
fixedrotation = true;
}
3001
{
title = "Polyobject Start Spot";
sprite = "internal:anchor";
fixedrotation = true;
}
3002
{
title = "Polyobject Start Spot (crush)";
sprite = "internal:anchor";
fixedrotation = true;
}
10225

View file

@ -0,0 +1,93 @@
//mxd. These settings are used only in Vanilla Strife configuration.
mapformat_doom
{
// The format interface handles the map data format
formatinterface = "DoomMapSetIO";
maplumpnames
{
include("Doom_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("ZDoom_misc.cfg", "speciallinedefs_doomhexen");
// Default flags for first new thing
defaultthingflags
{
include("Strife_misc.cfg", "mapformat_doom.defaultthingflags");
}
// Door making
include("ZDoom_misc.cfg", "doormaking_doom");
// Generalized actions
generalizedlinedefs = false;
generalizedsectors = false;
// DEFAULT SECTOR BRIGHTNESS LEVELS
sectorbrightness
{
include("Doom_misc.cfg", "sectorbrightness");
}
// SECTOR TYPES
sectortypes
{
include("Strife_misc.cfg", "mapformat_doom.sectortypes");
}
// LINEDEF FLAGS
linedefflags
{
include("Doom_misc.cfg", "linedefflags");
include("Strife_misc.cfg", "mapformat_doom.linedefflags");
}
// LINEDEF ACTIVATIONS
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
{
include("Doom_misc.cfg", "linedefflagstranslation");
include("Strife_misc.cfg", "mapformat_doom.linedefflagstranslation");
}
// LINEDEF TYPES
linedeftypes
{
include("Strife_linedefs.cfg");
}
// THING FLAGS
thingflags
{
include("Strife_misc.cfg", "mapformat_doom.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("Strife_misc.cfg", "mapformat_doom.thingflagstranslation");
}
// How to compare thing flags (for the stuck things error checker)
thingflagscompare
{
include("Doom_misc.cfg", "thingflagscompare");
}
// Things flags masks
include("Strife_misc.cfg", "mapformat_doom.thingflagsmasks");
}

View file

@ -10,10 +10,15 @@ skills
5 = "Bloodbath";
}
//mxd. These settings are valid only in native strife map format
//mxd. These are Strife-specific settings only.
//mxd. These settings are valid only in native Strife map format.
mapformat_doom
{
sectortypes
{
include("Strife_sectors.cfg");
}
linedefflags
{
512 = "Jump over railing";
@ -80,7 +85,6 @@ mapformat_doom
// (these are not required, just useful for new users)
thingsfilters
{
filter0
{
name = "Easy skill";
@ -91,33 +95,9 @@ thingsfilters
{
1 = true;
}
}
filter1
{
name = "Hard skill";
category = "";
type = -1;
fields
{
4 = true;
}
}
filter2
{
name = "Keys only";
category = "keys";
type = -1;
}
filter3
{
name = "Medium skill";
category = "";
@ -127,9 +107,26 @@ thingsfilters
{
2 = true;
}
}
filter2
{
name = "Hard skill";
category = "";
type = -1;
fields
{
4 = true;
}
}
filter3
{
name = "Keys only";
category = "keys";
type = -1;
}
filter4
{
@ -141,7 +138,5 @@ thingsfilters
{
16 = true;
}
}
}

View file

@ -1,3 +1,18 @@
18 = "Current Force, tag=dir&magnitude";
0 = "Normal";
1 = "Light blink random";
2 = "Light blink 0.5 second";
3 = "Light blink 1 second";
4 = "5% damage every 32 tics + light blink 0.5 sec.";
5 = "Damage: +2 to nukagecount";
7 = "Damage 5% every 32 tics";
8 = "Light oscillate";
9 = "Secret";
10 = "Ceiling closes 30 seconds after level start";
11 = "20% dmg. per sec. When player dies, level ends";
12 = "Light blink 0.5 second, synchronized";
13 = "Light blink 1 second, synchronized";
14 = "Ceiling opens 5 minutes after level start";
15 = "Instant death: 999% damage every tic";
16 = "Damage: +4 to nukagecount";
17 = "Light flicker random";
18 = "Water current, tag controls angle and strength";

View file

@ -250,7 +250,7 @@ mapformat_hexen
// Activations filter for Hexen type activations
// This filters the activation bits from the flags
linedefactivationsfilter = 7168;
include("Hexen_misc.cfg", "linedefactivationsfilter");
// LINEDEF ACTIVATIONS
// Make sure these are in order from lowest value to highest value

View file

@ -9,7 +9,6 @@ linedefflags
// Make sure these are in order from lowest value to highest value
linedefactivations
{
6144 = "Player presses Use (PassThru)";
7168 = "Projectile hits or crosses";
}
@ -1737,7 +1736,7 @@ thingsfilters_udmf
type = -1;
}
filter1
filter1
{
name = "Deathmatch";
category = "";
@ -1747,7 +1746,6 @@ thingsfilters_udmf
{
dm = true;
}
}
filter2
@ -1760,7 +1758,6 @@ thingsfilters_udmf
{
coop = true;
}
}
filter3
@ -1773,10 +1770,8 @@ thingsfilters_udmf
{
skill1 = true;
}
}
filter4
{
name = "Skill 2";
@ -1787,10 +1782,8 @@ thingsfilters_udmf
{
skill2 = true;
}
}
filter5
{
name = "Skill 3";
@ -1801,10 +1794,8 @@ thingsfilters_udmf
{
skill3 = true;
}
}
filter6
{
name = "Skill 4";
@ -1815,10 +1806,8 @@ thingsfilters_udmf
{
skill4 = true;
}
}
filter7
{
name = "Skill 5";
@ -1829,10 +1818,8 @@ thingsfilters_udmf
{
skill5 = true;
}
}
filter8
{
name = "Skill 6";
@ -1843,10 +1830,8 @@ thingsfilters_udmf
{
skill6 = true;
}
}
filter9
{
name = "Skill 7";
@ -1857,10 +1842,8 @@ thingsfilters_udmf
{
skill7 = true;
}
}
filter10
{
name = "Skill 8";
@ -1871,9 +1854,7 @@ thingsfilters_udmf
{
skill8 = true;
}
}
}
// Special linedefs

View file

@ -0,0 +1,58 @@
/*************************************************************\
Doom Builder 2 Game Configuration for ZDoom-compatible port
\*************************************************************/
// 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 = "Strife: Strife (Doom format)";
// This is the simplified game engine/sourceport name
engine = "strife";
// *******************************************************
// * *
// * Note: all the elements that could be factorized *
// * because they were common to ZDoom, GZDoom and *
// * Zandronum have been moved to ZDoom_common.cfg. *
// * *
// *******************************************************
// STANDARD DOOM SETTINGS
// Settings common to all games and all map formats
include("Includes\\Doom_common.cfg", "common");
// Settings common to Doom map format
include("Includes\\Strife_common.cfg", "mapformat_doom");
// Settings common to Strife games
include("Includes\\Game_Strife.cfg");
//mxd. No DECORATE support in vanilla
decorategames = "";
// Default thing filters
// (these are not required, just useful for new users)
thingsfilters
{
include("Includes\\Strife_misc.cfg", "thingsfilters");
}
// THING TYPES
// Each engine has its own additional thing types
// Order should always be 1: Game; 2: ZDoom/game; 3: ZDoom/zdoom
thingtypes
{
// Basic game actors
include("Includes\\Strife_things.cfg");
}
// 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\\Doom_misc.cfg", "enums");
}*/

View file

@ -25,6 +25,7 @@ include("Includes\\ZDoom_common.cfg", "common");
// Settings common to Doom map format
include("Includes\\ZDoom_common.cfg", "mapformat_doom");
include("Includes\\Heretic_misc.cfg", "mapformat_doom");
// Settings common to Heretic games
include("Includes\\Game_Heretic.cfg");

View file

@ -25,6 +25,7 @@ include("Includes\\ZDoom_common.cfg", "common");
// Settings common to Doom map format
include("Includes\\ZDoom_common.cfg", "mapformat_doom");
include("Includes\\Heretic_misc.cfg", "mapformat_doom");
// Settings common to Heretic games
include("Includes\\Game_Heretic.cfg");

View file

@ -126,13 +126,13 @@ namespace CodeImp.DoomBuilder.Config
this.startmode = General.Settings.ReadSetting("configurations." + settingskey + ".startmode", "VerticesMode");
this.enabled = General.Settings.ReadSetting("configurations." + settingskey + ".enabled", config.ReadSetting("enabledbydefault", false)); //mxd
//mxd. read test engines
//mxd. Read test engines
testEngines = new List<EngineInfo>();
IDictionary list = General.Settings.ReadSetting("configurations." + settingskey + ".engines", new ListDictionary());
currentEngineIndex = Math.Max(0, General.Settings.ReadSetting("configurations." + settingskey + ".currentengineindex", 0));
//no engine list found? use old engine properties
if (list.Count == 0)
// No engine list found? Use old engine properties
if(list.Count == 0)
{
EngineInfo info = new EngineInfo();
info.TestProgram = General.Settings.ReadSetting("configurations." + settingskey + ".testprogram", "");
@ -147,7 +147,7 @@ namespace CodeImp.DoomBuilder.Config
else
{
//read engines settings from config
foreach (DictionaryEntry de in list)
foreach(DictionaryEntry de in list)
{
string path = "configurations." + settingskey + ".engines." + de.Key;
EngineInfo info = new EngineInfo();
@ -248,7 +248,7 @@ namespace CodeImp.DoomBuilder.Config
public int CompareTo(ConfigurationInfo other)
{
// Compare
return name.CompareTo(other.name);
return String.Compare(name, other.name, StringComparison.Ordinal);
}
// This saves the settings to program configuration

View file

@ -66,6 +66,7 @@ namespace CodeImp.DoomBuilder.Config
private readonly bool testshortpaths;
private readonly string makedoortrack;
private readonly string makedoordoor; //mxd
private readonly string makedoorceil; //mxd
private readonly int makedooraction;
private readonly int makedooractivate;
private readonly int[] makedoorargs;
@ -178,6 +179,7 @@ namespace CodeImp.DoomBuilder.Config
public bool TestShortPaths { get { return testshortpaths; } }
public string MakeDoorTrack { get { return makedoortrack; } }
public string MakeDoorDoor { get { return makedoordoor; } } //mxd
public string MakeDoorCeiling { get { return makedoorceil; } } //mxd
public int MakeDoorAction { get { return makedooraction; } }
public int MakeDoorActivate { get { return makedooractivate; } }
public Dictionary<string, bool> MakeDoorFlags { get { return makedoorflags; } }
@ -323,6 +325,7 @@ namespace CodeImp.DoomBuilder.Config
testshortpaths = cfg.ReadSetting("testshortpaths", false);
makedoortrack = cfg.ReadSetting("makedoortrack", "-");
makedoordoor = cfg.ReadSetting("makedoordoor", "-"); //mxd
makedoorceil = cfg.ReadSetting("makedoorceil", "-"); //mxd
makedooraction = cfg.ReadSetting("makedooraction", 0);
makedooractivate = cfg.ReadSetting("makedooractivate", 0);
linetagindicatesectors = cfg.ReadSetting("linetagindicatesectors", false);

View file

@ -505,6 +505,7 @@ namespace CodeImp.DoomBuilder.Controls
buttonsave.Enabled = (t != null) && t.ExplicitSave;
buttonsaveall.Enabled = (explicitsavescripts > 0);
buttoncompile.Enabled = (t != null) && (t.Config.Compiler != null);
buttonsearch.Enabled = (t != null); //mxd
buttonkeywordhelp.Enabled = (t != null) && !string.IsNullOrEmpty(t.Config.KeywordHelp);
buttonscriptconfig.Enabled = (t != null) && t.IsReconfigurable;
buttonundo.Enabled = (t != null);

View file

@ -1707,9 +1707,10 @@ namespace CodeImp.DoomBuilder.Data
private Dictionary<string, List<int>> CreateActorsByClassList()
{
Dictionary<string, List<int>> actors = new Dictionary<string, List<int>>(StringComparer.Ordinal);
if(string.IsNullOrEmpty(General.Map.Config.DecorateGames)) return actors;
//read our new shiny ClassNames for default game things
foreach (KeyValuePair<int, ThingTypeInfo> ti in thingtypes)
foreach(KeyValuePair<int, ThingTypeInfo> ti in thingtypes)
{
if(!string.IsNullOrEmpty(ti.Value.ClassName))
{
@ -1719,7 +1720,7 @@ namespace CodeImp.DoomBuilder.Data
}
}
if (actors.Count == 0)
if(actors.Count == 0)
General.ErrorLogger.Add(ErrorType.Warning, "Warning: unable to find any DECORATE actor definitions!");
return actors;
@ -1728,12 +1729,15 @@ namespace CodeImp.DoomBuilder.Data
//mxd
public void ReloadModeldef()
{
if (modeldefentries != null)
if(modeldefentries != null)
{
foreach (KeyValuePair<int, ModelData> group in modeldefentries)
foreach(KeyValuePair<int, ModelData> group in modeldefentries)
group.Value.Dispose();
}
// Bail out when not supported by currect game configuration
if(string.IsNullOrEmpty(General.Map.Config.DecorateGames)) return;
General.MainWindow.DisplayStatus(StatusType.Busy, "Reloading model definitions...");
LoadModeldefs(CreateActorsByClassList());
@ -1743,7 +1747,7 @@ namespace CodeImp.DoomBuilder.Data
foreach(Thing t in General.Map.Map.Things) t.UpdateCache();
//rebuild geometry if in Visual mode
if (General.Editing.Mode != null && General.Editing.Mode.GetType().Name == "BaseVisualMode")
if(General.Editing.Mode != null && General.Editing.Mode.GetType().Name == "BaseVisualMode")
{
General.Editing.Mode.OnReloadResources();
}
@ -1754,6 +1758,9 @@ namespace CodeImp.DoomBuilder.Data
//mxd
public void ReloadGldefs()
{
// Bail out when not supported by currect game configuration
if(string.IsNullOrEmpty(General.Map.Config.DecorateGames)) return;
General.MainWindow.DisplayStatus(StatusType.Busy, "Reloading GLDEFS...");
try
@ -1768,7 +1775,7 @@ namespace CodeImp.DoomBuilder.Data
}
//rebuild geometry if in Visual mode
if (General.Editing.Mode != null && General.Editing.Mode.GetType().Name == "BaseVisualMode")
if(General.Editing.Mode != null && General.Editing.Mode.GetType().Name == "BaseVisualMode")
{
General.Editing.Mode.OnReloadResources();
}
@ -1780,24 +1787,24 @@ namespace CodeImp.DoomBuilder.Data
private void LoadModeldefs(Dictionary<string, List<int>> actorsByClass)
{
//if no actors defined in DECORATE or game config...
if (actorsByClass.Count == 0) return;
if(actorsByClass.Count == 0) return;
Dictionary<string, ModelData> modelDefEntriesByName = new Dictionary<string, ModelData>(StringComparer.Ordinal);
ModeldefParser parser = new ModeldefParser();
foreach (DataReader dr in containers)
foreach(DataReader dr in containers)
{
currentreader = dr;
Dictionary<string, Stream> streams = dr.GetModeldefData();
foreach (KeyValuePair<string, Stream> group in streams)
foreach(KeyValuePair<string, Stream> group in streams)
{
// Parse the data
if(parser.Parse(group.Value, currentreader.Location.location + "\\" + group.Key))
{
foreach(KeyValuePair<string, ModelData> g in parser.Entries)
{
if (modelDefEntriesByName.ContainsKey(g.Key))
if(modelDefEntriesByName.ContainsKey(g.Key))
{
General.ErrorLogger.Add(ErrorType.Warning, "Model definition for actor '" + g.Key + "' is double-defined in '" + group.Key + "'");
modelDefEntriesByName[g.Key] = g.Value;
@ -1813,7 +1820,7 @@ namespace CodeImp.DoomBuilder.Data
currentreader = null;
foreach (KeyValuePair<string, ModelData> e in modelDefEntriesByName)
foreach(KeyValuePair<string, ModelData> e in modelDefEntriesByName)
{
if(actorsByClass.ContainsKey(e.Key))
{
@ -1829,6 +1836,9 @@ namespace CodeImp.DoomBuilder.Data
//mxd
private void LoadVoxels()
{
// Bail out when not supported by currect game configuration
if(string.IsNullOrEmpty(General.Map.Config.DecorateGames)) return;
//Get names of all voxel models, which can be used "as is"
Dictionary<string, bool> voxelNames = new Dictionary<string, bool>(StringComparer.Ordinal);
@ -1863,7 +1873,7 @@ namespace CodeImp.DoomBuilder.Data
sprite = ti.Sprite;
}
if (string.IsNullOrEmpty(sprite)) continue;
if(string.IsNullOrEmpty(sprite)) continue;
if(!sprites.ContainsKey(sprite)) sprites.Add(sprite, new List<int>());
sprites[sprite].Add(ti.Index);
}
@ -1883,7 +1893,7 @@ namespace CodeImp.DoomBuilder.Data
{
foreach(KeyValuePair<string, List<int>> sc in sprites)
{
if (sc.Key.Contains(entry.Key))
if(sc.Key.Contains(entry.Key))
{
foreach(int id in sc.Value) modeldefentries[id] = entry.Value;
processed.Add(entry.Key, false);
@ -1899,7 +1909,7 @@ namespace CodeImp.DoomBuilder.Data
foreach(KeyValuePair<string, bool> group in voxelNames)
{
if(processed.ContainsKey(group.Key)) continue;
foreach (KeyValuePair<string, List<int>> sc in sprites)
foreach(KeyValuePair<string, List<int>> sc in sprites)
{
if(sc.Key.Contains(group.Key))
{
@ -1917,26 +1927,26 @@ namespace CodeImp.DoomBuilder.Data
private void LoadGldefs(Dictionary<string, List<int>> actorsByClass)
{
//if no actors defined in DECORATE or game config...
if (actorsByClass.Count == 0) return;
if(actorsByClass.Count == 0) return;
GldefsParser parser = new GldefsParser { OnInclude = ParseFromLocation };
//load gldefs from resources
foreach (DataReader dr in containers)
foreach(DataReader dr in containers)
{
currentreader = dr;
parser.ClearIncludesList();
Dictionary<string, Stream> streams = dr.GetGldefsData(General.Map.Config.GameType);
foreach (KeyValuePair<string, Stream> group in streams)
foreach(KeyValuePair<string, Stream> group in streams)
parser.Parse(group.Value, group.Key);
}
//create gldefsEntries dictionary
foreach (KeyValuePair<string, string> e in parser.Objects) //ClassName, Light name
foreach(KeyValuePair<string, string> e in parser.Objects) //ClassName, Light name
{
//if we have decorate actor and light definition for given ClassName...
if (actorsByClass.ContainsKey(e.Key) && parser.LightsByName.ContainsKey(e.Value))
if(actorsByClass.ContainsKey(e.Key) && parser.LightsByName.ContainsKey(e.Value))
{
foreach(int i in actorsByClass[e.Key])
{
@ -1961,12 +1971,12 @@ namespace CodeImp.DoomBuilder.Data
{
MapinfoParser parser = new MapinfoParser { OnInclude = ParseFromLocation };
foreach (DataReader dr in containers)
foreach(DataReader dr in containers)
{
currentreader = dr;
Dictionary<string, Stream> streams = dr.GetMapinfoData();
foreach (KeyValuePair<string, Stream> group in streams)
foreach(KeyValuePair<string, Stream> group in streams)
{
// Parse the data
parser.Parse(group.Value, Path.Combine(currentreader.Location.location, group.Key), General.Map.Options.LevelName);
@ -1992,9 +2002,12 @@ namespace CodeImp.DoomBuilder.Data
//mxd. This loads REVERBS
private void LoadReverbs()
{
ReverbsParser parser = new ReverbsParser();
reverbs.Clear();
// Bail out when not supported by currect game configuration
if(string.IsNullOrEmpty(General.Map.Config.DecorateGames)) return;
ReverbsParser parser = new ReverbsParser();
foreach(DataReader dr in containers)
{
currentreader = dr;
@ -2013,16 +2026,19 @@ namespace CodeImp.DoomBuilder.Data
//mxd. This loads SNDSEQ
private void LoadSndSeq()
{
SndSeqParser parser = new SndSeqParser();
soundsequences.Clear();
// Bail out when not supported by currect game configuration
if(string.IsNullOrEmpty(General.Map.Config.DecorateGames)) return;
SndSeqParser parser = new SndSeqParser();
foreach(DataReader dr in containers)
{
currentreader = dr;
List<Stream> streams = dr.GetSndSeqData();
// Parse the data
foreach (Stream s in streams)
foreach(Stream s in streams)
{
if(s != null) parser.Parse(s, "SNDSEQ");
}

View file

@ -646,7 +646,7 @@ namespace CodeImp.DoomBuilder
bool localscriptschanged = CheckScriptChanged();
// If the scripts window is open, save the scripts first
if (IsScriptsWindowOpen) scriptwindow.Editor.ImplicitSave();
if(IsScriptsWindowOpen) scriptwindow.Editor.ImplicitSave();
// Only recompile scripts when the scripts have changed
// (not when only the map changed)
@ -661,20 +661,20 @@ namespace CodeImp.DoomBuilder
// Show script window if there are any errors and we are going to test the map
// and always update the errors on the scripts window.
if ((errors.Count > 0) && (scriptwindow == null) && (purpose == SavePurpose.Testing)) ShowScriptEditor();
if (scriptwindow != null) scriptwindow.Editor.ShowErrors(errors);
if((errors.Count > 0) && (scriptwindow == null) && (purpose == SavePurpose.Testing)) ShowScriptEditor();
if(scriptwindow != null) scriptwindow.Editor.ShowErrors(errors);
// Only write the map and rebuild nodes when the actual map has changed
// (not when only scripts have changed)
if (changed)
if(changed)
{
// Make a copy of the map data
MapSet outputset = map.Clone();
// Remove all flags from all 3D Start things
foreach (Thing t in outputset.Things)
foreach(Thing t in outputset.Things)
{
if (t.Type == config.Start3DModeThingType)
if(t.Type == config.Start3DModeThingType)
{
// We're not using SetFlag here, this doesn't have to be undone.
// Please note that this is totally exceptional!
@ -685,7 +685,7 @@ namespace CodeImp.DoomBuilder
// Do we need sidedefs compression?
StatusInfo oldstatus;
if (map.Sidedefs.Count > io.MaxSidedefs)
if(map.Sidedefs.Count > io.MaxSidedefs)
{
// Compress sidedefs
oldstatus = General.MainWindow.Status;
@ -694,7 +694,7 @@ namespace CodeImp.DoomBuilder
General.MainWindow.DisplayStatus(oldstatus);
// Check if it still doesnt fit
if (outputset.Sidedefs.Count > io.MaxSidedefs)
if(outputset.Sidedefs.Count > io.MaxSidedefs)
{
// Problem! Can't save the map like this!
General.ShowErrorMessage("Unable to save the map: There are too many unique sidedefs!", MessageBoxButtons.OK);
@ -703,28 +703,28 @@ namespace CodeImp.DoomBuilder
}
// Check things
if (map.Things.Count > io.MaxThings)
if(map.Things.Count > io.MaxThings)
{
General.ShowErrorMessage("Unable to save the map: There are too many things!", MessageBoxButtons.OK);
return false;
}
// Check sectors
if (map.Sectors.Count > io.MaxSectors)
if(map.Sectors.Count > io.MaxSectors)
{
General.ShowErrorMessage("Unable to save the map: There are too many sectors!", MessageBoxButtons.OK);
return false;
}
// Check linedefs
if (map.Linedefs.Count > io.MaxLinedefs)
if(map.Linedefs.Count > io.MaxLinedefs)
{
General.ShowErrorMessage("Unable to save the map: There are too many linedefs!", MessageBoxButtons.OK);
return false;
}
// Check vertices
if (map.Vertices.Count > io.MaxVertices)
if(map.Vertices.Count > io.MaxVertices)
{
General.ShowErrorMessage("Unable to save the map: There are too many vertices!", MessageBoxButtons.OK);
return false;
@ -1061,7 +1061,7 @@ namespace CodeImp.DoomBuilder
// Find the nodebuilder
NodebuilderInfo nodebuilder = General.GetNodebuilderByName(nodebuildername);
if (nodebuilder == null)
if(nodebuilder == null)
{
// Problem! Can't find that nodebuilder!
General.ShowWarningMessage("Unable to build the nodes: The configured nodebuilder cannot be found.\nPlease check your game configuration settings!", MessageBoxButtons.OK);
@ -1103,7 +1103,7 @@ namespace CodeImp.DoomBuilder
buildwad.Dispose();
// Does the nodebuilder require an output file?
if (nodebuilder.HasSpecialOutputFile)
if(nodebuilder.HasSpecialOutputFile)
{
// Make a temporary output file for the nodebuilder
tempfile2 = General.MakeTempFilename(compiler.Location);
@ -1121,23 +1121,23 @@ namespace CodeImp.DoomBuilder
compiler.OutputFile = Path.GetFileName(tempfile2);
compiler.SourceFile = sourcefile;
compiler.WorkingDirectory = Path.GetDirectoryName(tempfile1);
if (compiler.Run())
if(compiler.Run())
{
// Open the output file
try { buildwad = new WAD(tempfile2); }
catch (Exception e)
catch(Exception e)
{
General.WriteLogLine(e.GetType().Name + " while reading build wad file: " + e.Message);
buildwad = null;
}
if (buildwad != null)
if(buildwad != null)
{
// Output lumps complete?
lumpscomplete = VerifyNodebuilderLumps(buildwad, BUILD_MAP_HEADER);
}
if (lumpscomplete)
if(lumpscomplete)
{
// Copy nodebuilder lumps to temp file
General.WriteLogLine("Copying nodebuilder lumps to temporary file...");
@ -1151,20 +1151,20 @@ namespace CodeImp.DoomBuilder
compilererrors += Environment.NewLine + e.description;
// Nodebuilder did not build the lumps!
if (failaswarning)
if(failaswarning)
General.ShowWarningMessage("Unable to build the nodes: The nodebuilder failed to build the expected data structures.\nThe map will be saved without the nodes." + (compiler.Errors.Length > 0 ? Environment.NewLine + compilererrors : ""), MessageBoxButtons.OK);
else
General.ShowErrorMessage("Unable to build the nodes: The nodebuilder failed to build the expected data structures." + (compiler.Errors.Length > 0 ? Environment.NewLine + compilererrors : ""), MessageBoxButtons.OK);
}
// Done with the build wad
if (buildwad != null) buildwad.Dispose();
if(buildwad != null) buildwad.Dispose();
}
else //mxd
{
//collect errors
string compilererrors = "";
foreach (CompilerError e in compiler.Errors)
foreach(CompilerError e in compiler.Errors)
compilererrors += Environment.NewLine + e.description;
// Nodebuilder did not build the lumps!
@ -1187,19 +1187,19 @@ namespace CodeImp.DoomBuilder
// Find the map header in source
int srcindex = wad.FindLumpIndex(mapheader);
if (srcindex > -1)
if(srcindex > -1)
{
// Go for all the map lump names
lumpscomplete = true;
foreach (KeyValuePair<string, MapLumpInfo> group in config.MapLumps)
foreach(KeyValuePair<string, MapLumpInfo> group in config.MapLumps)
{
// Check if this lump should exist
if(group.Value.NodeBuild && !group.Value.AllowEmpty && group.Value.Required)
{
//mxd
string lumpname = group.Key;
if (lumpname.Contains(CONFIG_MAP_HEADER)) lumpname = lumpname.Replace(CONFIG_MAP_HEADER, mapheader);
if(lumpname.Contains(CONFIG_MAP_HEADER)) lumpname = lumpname.Replace(CONFIG_MAP_HEADER, mapheader);
// Find the lump in the source
if(wad.FindLump(lumpname, srcindex, srcindex + config.MapLumps.Count + 2) == null)
@ -1224,7 +1224,7 @@ namespace CodeImp.DoomBuilder
public MemoryStream GetLumpData(string lumpname)
{
Lump l = tempwad.FindLump(lumpname);
if (l != null)
if(l != null)
{
l.Stream.Seek(0, SeekOrigin.Begin);
return new MemoryStream(l.Stream.ReadAllBytes());
@ -1239,7 +1239,7 @@ namespace CodeImp.DoomBuilder
// Remove the lump if it already exists
int li = tempwad.FindLumpIndex(lumpname);
if (li > -1)
if(li > -1)
{
insertindex = li;
tempwad.RemoveAt(li);
@ -1262,7 +1262,7 @@ namespace CodeImp.DoomBuilder
{
// Find the map header in target
int headerindex = target.FindLumpIndex(mapname);
if (headerindex == -1)
if(headerindex == -1)
{
// If this header doesnt exists in the target
// then insert at the end of the target
@ -1273,7 +1273,7 @@ namespace CodeImp.DoomBuilder
int insertindex = headerindex;
// Go for all the map lump names
foreach (KeyValuePair<string, MapLumpInfo> group in config.MapLumps)
foreach(KeyValuePair<string, MapLumpInfo> group in config.MapLumps)
{
// Check if this lump is required
if(group.Value.Required)
@ -1283,7 +1283,7 @@ namespace CodeImp.DoomBuilder
// Check if the lump is missing at the target
int targetindex = FindSpecificLump(target, lumpname, headerindex, mapname, config.MapLumps);
if (targetindex == -1)
if(targetindex == -1)
{
// Determine target index
insertindex++;
@ -1321,8 +1321,8 @@ namespace CodeImp.DoomBuilder
//Remove lumps, which are not required
List<Lump> toRemove = new List<Lump>();
foreach (Lump lump in target.Lumps)
if (!requiredLumps.Contains(lump.Name)) toRemove.Add(lump);
foreach(Lump lump in target.Lumps)
if(!requiredLumps.Contains(lump.Name)) toRemove.Add(lump);
foreach (Lump lump in toRemove) target.Remove(lump);
}
@ -1332,16 +1332,16 @@ namespace CodeImp.DoomBuilder
{
// Go for all lumps
bool skipping = false;
foreach (Lump srclump in source.Lumps)
foreach(Lump srclump in source.Lumps)
{
// Check if we should stop skipping lumps here
if (skipping)
if(skipping)
{
//mxd
string srclumpname = srclump.Name;
if (srclumpname.Contains(sourcemapname)) srclumpname = srclumpname.Replace(sourcemapname, CONFIG_MAP_HEADER);
if(srclumpname.Contains(sourcemapname)) srclumpname = srclumpname.Replace(sourcemapname, CONFIG_MAP_HEADER);
if (!mapconfig.MapLumps.ContainsKey(srclumpname))
if(!mapconfig.MapLumps.ContainsKey(srclumpname))
{
// Stop skipping
skipping = false;
@ -1349,14 +1349,14 @@ namespace CodeImp.DoomBuilder
}
// Check if we should start skipping lumps here
if (!skipping && (srclump.Name == sourcemapname))
if(!skipping && (srclump.Name == sourcemapname))
{
// We have encountered the map header, start skipping!
skipping = true;
}
// Not skipping this lump?
if (!skipping)
if(!skipping)
{
// Copy lump over!
Lump tgtlump = target.Insert(srclump.Name, target.Lumps.Count, srclump.Length);
@ -1373,7 +1373,7 @@ namespace CodeImp.DoomBuilder
{
// Find the map header in target
int tgtheaderindex = target.FindLumpIndex(targetmapname);
if (tgtheaderindex == -1)
if(tgtheaderindex == -1)
{
// If this header doesnt exists in the target
// then insert at the end of the target
@ -1385,10 +1385,10 @@ namespace CodeImp.DoomBuilder
// Find the map header in source
int srcheaderindex = source.FindLumpIndex(sourcemapname);
if (srcheaderindex > -1)
if(srcheaderindex > -1)
{
// Go for all the map lump names
foreach (KeyValuePair<string, MapLumpInfo> group in config.MapLumps)
foreach(KeyValuePair<string, MapLumpInfo> group in config.MapLumps)
{
// Check if this lump should be copied
if((group.Value.Required && copyrequired) || (group.Value.BlindCopy && copyblindcopy) ||
@ -1400,7 +1400,7 @@ namespace CodeImp.DoomBuilder
// Find the lump in the source
int sourceindex = FindSpecificLump(source, srclumpname, srcheaderindex, sourcemapname, config.MapLumps);
if (sourceindex > -1)
if(sourceindex > -1)
{
// Remove lump at target
int lumpindex = RemoveSpecificLump(target, tgtlumpname, tgtheaderindex, targetmapname, config.MapLumps);
@ -1439,19 +1439,19 @@ namespace CodeImp.DoomBuilder
// because when an unknown lump is met, this search must stop.
// Go for all lumps in order to find the specified lump
for (int i = 0; i < maplumps.Count + 1; i++)
for(int i = 0; i < maplumps.Count + 1; i++)
{
// Still within bounds?
if ((mapheaderindex + i) < source.Lumps.Count)
if((mapheaderindex + i) < source.Lumps.Count)
{
// Check if this is a known lump name
string srclumpname = source.Lumps[mapheaderindex + i].Name; //mxd
if (srclumpname.Contains(mapheadername)) srclumpname = srclumpname.Replace(mapheadername, CONFIG_MAP_HEADER);
if(srclumpname.Contains(mapheadername)) srclumpname = srclumpname.Replace(mapheadername, CONFIG_MAP_HEADER);
if (maplumps.ContainsKey(srclumpname)) //mxd
if(maplumps.ContainsKey(srclumpname)) //mxd
{
// Is this the lump we are looking for?
if (source.Lumps[mapheaderindex + i].Name == lumpname)
if(source.Lumps[mapheaderindex + i].Name == lumpname)
{
// Return this index
return mapheaderindex + i;
@ -1475,7 +1475,7 @@ namespace CodeImp.DoomBuilder
{
// Find the specific lump index
int lumpindex = FindSpecificLump(source, lumpname, mapheaderindex, mapheadername, maplumps);
if (lumpindex > -1)
if(lumpindex > -1)
{
// Remove this lump
//General.WriteLogLine(lumpname + " removed");
@ -1610,24 +1610,24 @@ namespace CodeImp.DoomBuilder
{
Cursor.Current = Cursors.WaitCursor;
if (scriptwindow == null)
if(scriptwindow == null)
{
// Load the window
scriptwindow = new ScriptEditorForm();
}
// Window not yet visible?
if (!scriptwindow.Visible)
if(!scriptwindow.Visible)
{
// Show the window
if (General.Settings.ScriptOnTop)
if(General.Settings.ScriptOnTop)
{
if (scriptwindow.Visible && (scriptwindow.Owner == null)) scriptwindow.Hide();
if(scriptwindow.Visible && (scriptwindow.Owner == null)) scriptwindow.Hide();
scriptwindow.Show(General.MainWindow);
}
else
{
if (scriptwindow.Visible && (scriptwindow.Owner != null)) scriptwindow.Hide();
if(scriptwindow.Visible && (scriptwindow.Owner != null)) scriptwindow.Hide();
scriptwindow.Show();
}
}
@ -1643,7 +1643,7 @@ namespace CodeImp.DoomBuilder
internal bool AskSaveScriptChanges()
{
// Window open?
if (scriptwindow != null)
if(scriptwindow != null)
{
// Ask to save changes
// This also saves implicitly
@ -1666,15 +1666,15 @@ namespace CodeImp.DoomBuilder
// the window is already in the closing process
internal void CloseScriptEditor(bool closing)
{
if (scriptwindow != null)
if(scriptwindow != null)
{
if (!scriptwindow.IsDisposed)
if(!scriptwindow.IsDisposed)
{
// Remember what files were open
scriptwindow.Editor.WriteOpenFilesToConfiguration();
// Close now
if (!closing) scriptwindow.Close();
if(!closing) scriptwindow.Close();
}
// Done
@ -1685,7 +1685,7 @@ namespace CodeImp.DoomBuilder
// This checks if the scripts are changed
internal bool CheckScriptChanged()
{
if (scriptwindow != null)
if(scriptwindow != null)
{
// Check if scripts are changed
return scriptschanged || scriptwindow.Editor.CheckImplicitChanges();
@ -1702,7 +1702,7 @@ namespace CodeImp.DoomBuilder
errors.Clear();
// Go for all the map lumps
foreach (MapLumpInfo lumpinfo in config.MapLumps.Values)
foreach(MapLumpInfo lumpinfo in config.MapLumps.Values)
{
// Is this a script lump?
if(lumpinfo.Script != null || lumpinfo.ScriptBuild)
@ -1750,9 +1750,9 @@ namespace CodeImp.DoomBuilder
if (scriptconfig.Compiler == null) return true;
// Find the lump
if (lumpname == CONFIG_MAP_HEADER) reallumpname = TEMP_MAP_HEADER;
if(lumpname == CONFIG_MAP_HEADER) reallumpname = TEMP_MAP_HEADER;
Lump lump = tempwad.FindLump(reallumpname);
if (lump == null) throw new Exception("No such lump in temporary wad file '" + reallumpname + "'.");
if(lump == null) throw new Exception("No such lump in temporary wad file '" + reallumpname + "'.");
// Determine source file
string sourcefile = (filepathname.Length > 0 ? filepathname : tempwad.Filename);
@ -1870,14 +1870,14 @@ namespace CodeImp.DoomBuilder
List<ScriptItem> numberedscriptslist = new List<ScriptItem>();
// Load the script lumps
foreach (MapLumpInfo maplumpinfo in config.MapLumps.Values)
foreach(MapLumpInfo maplumpinfo in config.MapLumps.Values)
{
// Is this a script lump?
if ((maplumpinfo.ScriptBuild || maplumpinfo.Script != null) && maplumpinfo.Name == "SCRIPTS")
if((maplumpinfo.ScriptBuild || maplumpinfo.Script != null) && maplumpinfo.Name == "SCRIPTS")
{
// Load the lump data
MemoryStream stream = GetLumpData(maplumpinfo.Name);
if (stream != null)
if(stream != null)
{
// Get script names
AcsParserSE parser = new AcsParserSE();
@ -1941,10 +1941,10 @@ namespace CodeImp.DoomBuilder
public void ChangeThingFilter(ThingsFilter newfilter)
{
// We have a special filter for null
if (newfilter == null) newfilter = new NullThingsFilter();
if(newfilter == null) newfilter = new NullThingsFilter();
// Deactivate old filter
if (thingsfilter != null) thingsfilter.Deactivate();
if(thingsfilter != null) thingsfilter.Deactivate();
// Change
thingsfilter = newfilter;
@ -1964,7 +1964,7 @@ namespace CodeImp.DoomBuilder
{
// Let the plugin and editing mode know
General.Plugins.OnMapSetChangeBegin();
if (General.Editing.Mode != null) General.Editing.Mode.OnMapSetChangeBegin();
if(General.Editing.Mode != null) General.Editing.Mode.OnMapSetChangeBegin();
this.visualcamera.Sector = null;
// Can't have a selection in an old map set
@ -1983,7 +1983,7 @@ namespace CodeImp.DoomBuilder
// Let the plugin and editing mode know
General.Plugins.OnMapSetChangeEnd();
if (General.Editing.Mode != null) General.Editing.Mode.OnMapSetChangeEnd();
if(General.Editing.Mode != null) General.Editing.Mode.OnMapSetChangeEnd();
}
// This reloads resources
@ -2002,11 +2002,11 @@ namespace CodeImp.DoomBuilder
ReloadResources();
if (General.ErrorLogger.IsErrorAdded)
if(General.ErrorLogger.IsErrorAdded)
{
// Show any errors if preferred
General.MainWindow.DisplayStatus(StatusType.Warning, "There were errors during resources loading!");
if (General.Settings.ShowErrorsWindow) General.MainWindow.ShowErrors();
if(General.Settings.ShowErrorsWindow) General.MainWindow.ShowErrors();
}
else
{
@ -2046,7 +2046,7 @@ namespace CodeImp.DoomBuilder
// Reload data resources
General.WriteLogLine("Reloading data resources...");
data = new DataManager();
if (!string.IsNullOrEmpty(filepathname))
if(!string.IsNullOrEmpty(filepathname))
{
DataLocation maplocation = new DataLocation(DataLocation.RESOURCE_WAD, filepathname, false, false, false);
data.Load(configinfo.Resources, options.Resources, maplocation);
@ -2066,7 +2066,7 @@ namespace CodeImp.DoomBuilder
General.Plugins.ReloadResources();
// Inform editing mode that the resources are reloaded
if (General.Editing.Mode != null) General.Editing.Mode.OnReloadResources();
if(General.Editing.Mode != null) General.Editing.Mode.OnReloadResources();
// Reset status
General.MainWindow.DisplayStatus(oldstatus);
@ -2085,7 +2085,7 @@ namespace CodeImp.DoomBuilder
// Show map options dialog
MapOptionsForm optionsform = new MapOptionsForm(options, false);
if (optionsform.ShowDialog(General.MainWindow) == DialogResult.OK)
if(optionsform.ShowDialog(General.MainWindow) == DialogResult.OK)
{
// Update interface
//General.MainWindow.UpdateInterface();
@ -2211,7 +2211,7 @@ namespace CodeImp.DoomBuilder
}
// Anything to snap?
if (vertstosnap.Count == 0 && things.Count == 0)
if(vertstosnap.Count == 0 && things.Count == 0)
{
General.Interface.DisplayStatus(StatusType.Warning, "Select any map element first!");
return;
@ -2235,17 +2235,17 @@ namespace CodeImp.DoomBuilder
if(snappedthings > 0) message.Add(snappedthings + " things");
// Map changed?
if (message.Count > 0)
if(message.Count > 0)
{
// Display status
General.Interface.DisplayStatus(StatusType.Info, "Snapped " + string.Join(" and ", message.ToArray()));
// Warn the user
if(snappedverts > 0)
/*if(snappedverts > 0)
{
MessageBox.Show("Snapped " + snappedverts + " vertices to grid." + Environment.NewLine +
"It's a good idea to run Map Analysis Mode now.");
}
}*/
// Invoke clear selection to update sector highlight overlay
General.Actions.InvokeAction("builder_clearselection");

View file

@ -377,67 +377,53 @@ namespace CodeImp.DoomBuilder.Rendering
// This resets the device and returns true on success
internal bool Reset()
{
// Test the cooperative level
//Result coopresult = device.TestCooperativeLevel();
// Can we reset?
//if(coopresult.Name != "D3DERR_DEVICENOTRESET")
// Unload all Direct3D resources
foreach(ID3DResource res in resources.Values) res.UnloadResource();
// Lose backbuffers
if(backbuffer != null) backbuffer.Dispose();
if(depthbuffer != null) depthbuffer.Dispose();
backbuffer = null;
depthbuffer = null;
try
{
// Unload all Direct3D resources
foreach(ID3DResource res in resources.Values) res.UnloadResource();
// Lose backbuffers
if(backbuffer != null) backbuffer.Dispose();
if(depthbuffer != null) depthbuffer.Dispose();
backbuffer = null;
depthbuffer = null;
try
{
// Make present parameters
PresentParameters displaypp = CreatePresentParameters(adapter);
// Reset the device
device.Reset(displaypp);
}
#if DEBUG
catch(Exception e)
{
// Failed to re-initialize
Console.WriteLine("Device reset failed: " + e.Message);
return false;
}
#else
catch (Exception)
{
// Failed to re-initialize
return false;
}
#endif
// Keep a reference to the original buffers
backbuffer = device.GetBackBuffer(0, 0);
depthbuffer = device.DepthStencilSurface;
// Get the viewport
viewport = device.Viewport;
// Reload all Direct3D resources
foreach(ID3DResource res in resources.Values) res.ReloadResource();
// Re-apply settings
SetupSettings();
// Make present parameters
PresentParameters displaypp = CreatePresentParameters(adapter);
// Success
return true;
// Reset the device
device.Reset(displaypp);
}
/*
else
#if DEBUG
catch(Exception e)
{
// Failed
// Failed to re-initialize
Console.WriteLine("Device reset failed: " + e.Message);
return false;
}
*/
#else
catch(Exception)
{
// Failed to re-initialize
return false;
}
#endif
// Keep a reference to the original buffers
backbuffer = device.GetBackBuffer(0, 0);
depthbuffer = device.DepthStencilSurface;
// Get the viewport
viewport = device.Viewport;
// Reload all Direct3D resources
foreach(ID3DResource res in resources.Values) res.ReloadResource();
// Re-apply settings
SetupSettings();
// Success
return true;
}
#endregion

View file

@ -58,6 +58,7 @@ namespace CodeImp.DoomBuilder.VisualModes
private VertexBuffer cagebuffer; //mxd
private int cagelength; //mxd
private bool updategeo;
private bool updatecage; //mxd
private int triangles;
// Rendering
@ -212,10 +213,13 @@ namespace CodeImp.DoomBuilder.VisualModes
// This is called before a device is reset (when resized or display adapter was changed)
public void UnloadResource()
{
// Trash geometry buffer
// Trash geometry buffers
if(geobuffer != null) geobuffer.Dispose();
geobuffer = null;
if(cagebuffer != null) cagebuffer.Dispose(); //mxd
cagebuffer = null; //mxd
updategeo = true;
updatecage = true; //mxd
}
// This is called resets when the device is reset
@ -229,83 +233,10 @@ namespace CodeImp.DoomBuilder.VisualModes
/// <summary>
/// Sets the color of the cage around the thing geometry and rebuilds the thing cage.
/// </summary>
protected void UpdateThingCage(PixelColor color)
protected void SetCageColor(PixelColor color)
{
cagecolor = color.ToColorValue();
// Trash cage buffer
if(cagebuffer != null) cagebuffer.Dispose();
cagebuffer = null;
// Make a new cage
List<WorldVertex> cageverts;
if(sizeless)
{
WorldVertex v0 = new WorldVertex(-info.Radius + position_v3.X, -info.Radius + position_v3.Y, position_v3.Z);
WorldVertex v1 = new WorldVertex(info.Radius + position_v3.X, info.Radius + position_v3.Y, position_v3.Z);
WorldVertex v2 = new WorldVertex(info.Radius + position_v3.X, -info.Radius + position_v3.Y, position_v3.Z);
WorldVertex v3 = new WorldVertex(-info.Radius + position_v3.X, info.Radius + position_v3.Y, position_v3.Z);
WorldVertex v4 = new WorldVertex(position_v3.X, position_v3.Y, info.Radius + position_v3.Z);
WorldVertex v5 = new WorldVertex(position_v3.X, position_v3.Y, -info.Radius + position_v3.Z);
cageverts = new List<WorldVertex>(new[] { v0, v1, v2, v3, v4, v5 });
}
else
{
float top = position_v3.Z + info.Height;
float bottom = position_v3.Z;
WorldVertex v0 = new WorldVertex(-info.Radius + position_v3.X, -info.Radius + position_v3.Y, bottom);
WorldVertex v1 = new WorldVertex(-info.Radius + position_v3.X, info.Radius + position_v3.Y, bottom);
WorldVertex v2 = new WorldVertex(info.Radius + position_v3.X, info.Radius + position_v3.Y, bottom);
WorldVertex v3 = new WorldVertex(info.Radius + position_v3.X, -info.Radius + position_v3.Y, bottom);
WorldVertex v4 = new WorldVertex(-info.Radius + position_v3.X, -info.Radius + position_v3.Y, top);
WorldVertex v5 = new WorldVertex(-info.Radius + position_v3.X, info.Radius + position_v3.Y, top);
WorldVertex v6 = new WorldVertex(info.Radius + position_v3.X, info.Radius + position_v3.Y, top);
WorldVertex v7 = new WorldVertex(info.Radius + position_v3.X, -info.Radius + position_v3.Y, top);
cageverts = new List<WorldVertex>(new[] { v0, v1,
v1, v2,
v2, v3,
v3, v0,
v4, v5,
v5, v6,
v6, v7,
v7, v4,
v0, v4,
v1, v5,
v2, v6,
v3, v7 });
}
// Make new arrow
if(Thing.IsDirectional)
{
Matrix transform = Matrix.Scaling(info.Radius, info.Radius, info.Radius)
* (Matrix.RotationY(-Thing.RollRad) * Matrix.RotationX(-Thing.PitchRad) * Matrix.RotationZ(Thing.Angle))
* (sizeless ? position : position * Matrix.Translation(0.0f, 0.0f, thingheight / 2f));
WorldVertex a0 = new WorldVertex(Vector3D.Transform(0.0f, 0.0f, 0.0f, transform)); //start
WorldVertex a1 = new WorldVertex(Vector3D.Transform(0.0f, -1.5f, 0.0f, transform)); //end
WorldVertex a2 = new WorldVertex(Vector3D.Transform(0.2f, -1.1f, 0.2f, transform));
WorldVertex a3 = new WorldVertex(Vector3D.Transform(-0.2f, -1.1f, 0.2f, transform));
WorldVertex a4 = new WorldVertex(Vector3D.Transform(0.2f, -1.1f, -0.2f, transform));
WorldVertex a5 = new WorldVertex(Vector3D.Transform(-0.2f, -1.1f, -0.2f, transform));
cageverts.AddRange(new[] { a0, a1,
a1, a2,
a1, a3,
a1, a4,
a1, a5 });
}
// Create buffer
WorldVertex[] cv = cageverts.ToArray();
cagelength = cv.Length / 2;
cagebuffer = new VertexBuffer(General.Map.Graphics.Device, WorldVertex.Stride * cv.Length, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
cagebuffer.Lock(0, WorldVertex.Stride * cv.Length, LockFlags.None).WriteRange(cv);
cagebuffer.Unlock();
updatecage = true;
}
/// <summary>
@ -316,6 +247,7 @@ namespace CodeImp.DoomBuilder.VisualModes
position_v3 = D3DDevice.V3(pos); //mxd
position = Matrix.Translation(position_v3);
updategeo = true;
updatecage = true; //mxd
//mxd. update bounding box?
if(lightType != DynamicLightType.NONE && lightRadius > thing.Size)
@ -484,6 +416,87 @@ namespace CodeImp.DoomBuilder.VisualModes
// Done
updategeo = false;
}
//mxd. Need to update thing cage?
if(updatecage)
{
// Trash cage buffer
if(cagebuffer != null) cagebuffer.Dispose();
cagebuffer = null;
// Make a new cage
List<WorldVertex> cageverts;
if(sizeless)
{
WorldVertex v0 = new WorldVertex(-info.Radius + position_v3.X, -info.Radius + position_v3.Y, position_v3.Z);
WorldVertex v1 = new WorldVertex(info.Radius + position_v3.X, info.Radius + position_v3.Y, position_v3.Z);
WorldVertex v2 = new WorldVertex(info.Radius + position_v3.X, -info.Radius + position_v3.Y, position_v3.Z);
WorldVertex v3 = new WorldVertex(-info.Radius + position_v3.X, info.Radius + position_v3.Y, position_v3.Z);
WorldVertex v4 = new WorldVertex(position_v3.X, position_v3.Y, info.Radius + position_v3.Z);
WorldVertex v5 = new WorldVertex(position_v3.X, position_v3.Y, -info.Radius + position_v3.Z);
cageverts = new List<WorldVertex>(new[] { v0, v1, v2, v3, v4, v5 });
}
else
{
float top = position_v3.Z + info.Height;
float bottom = position_v3.Z;
WorldVertex v0 = new WorldVertex(-info.Radius + position_v3.X, -info.Radius + position_v3.Y, bottom);
WorldVertex v1 = new WorldVertex(-info.Radius + position_v3.X, info.Radius + position_v3.Y, bottom);
WorldVertex v2 = new WorldVertex(info.Radius + position_v3.X, info.Radius + position_v3.Y, bottom);
WorldVertex v3 = new WorldVertex(info.Radius + position_v3.X, -info.Radius + position_v3.Y, bottom);
WorldVertex v4 = new WorldVertex(-info.Radius + position_v3.X, -info.Radius + position_v3.Y, top);
WorldVertex v5 = new WorldVertex(-info.Radius + position_v3.X, info.Radius + position_v3.Y, top);
WorldVertex v6 = new WorldVertex(info.Radius + position_v3.X, info.Radius + position_v3.Y, top);
WorldVertex v7 = new WorldVertex(info.Radius + position_v3.X, -info.Radius + position_v3.Y, top);
cageverts = new List<WorldVertex>(new[] { v0, v1,
v1, v2,
v2, v3,
v3, v0,
v4, v5,
v5, v6,
v6, v7,
v7, v4,
v0, v4,
v1, v5,
v2, v6,
v3, v7 });
}
// Make new arrow
if(Thing.IsDirectional)
{
Matrix transform = Matrix.Scaling(info.Radius, info.Radius, info.Radius)
* (Matrix.RotationY(-Thing.RollRad) * Matrix.RotationX(-Thing.PitchRad) * Matrix.RotationZ(Thing.Angle))
* (sizeless ? position : position * Matrix.Translation(0.0f, 0.0f, thingheight / 2f));
WorldVertex a0 = new WorldVertex(Vector3D.Transform(0.0f, 0.0f, 0.0f, transform)); //start
WorldVertex a1 = new WorldVertex(Vector3D.Transform(0.0f, -1.5f, 0.0f, transform)); //end
WorldVertex a2 = new WorldVertex(Vector3D.Transform(0.2f, -1.1f, 0.2f, transform));
WorldVertex a3 = new WorldVertex(Vector3D.Transform(-0.2f, -1.1f, 0.2f, transform));
WorldVertex a4 = new WorldVertex(Vector3D.Transform(0.2f, -1.1f, -0.2f, transform));
WorldVertex a5 = new WorldVertex(Vector3D.Transform(-0.2f, -1.1f, -0.2f, transform));
cageverts.AddRange(new[] { a0, a1,
a1, a2,
a1, a3,
a1, a4,
a1, a5 });
}
// Create buffer
WorldVertex[] cv = cageverts.ToArray();
cagelength = cv.Length / 2;
cagebuffer = new VertexBuffer(General.Map.Graphics.Device, WorldVertex.Stride * cv.Length, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
cagebuffer.Lock(0, WorldVertex.Stride * cv.Length, LockFlags.None).WriteRange(cv);
cagebuffer.Unlock();
// Done
updatecage = false;
}
}
//mxd

View file

@ -793,9 +793,9 @@ namespace CodeImp.DoomBuilder.Windows
bool formatinterfacesmatch = havecopiedconfig && current.FormatInterface == configinfocopy.FormatInterface;
pasteall.Enabled = formatinterfacesmatch;
pasteengines.Enabled = havecopiedconfig;
pasteresources.Enabled = havecopiedconfig;
pastecolorpresets.Enabled = formatinterfacesmatch;
pasteengines.Enabled = (havecopiedconfig && configinfocopy.TestEngines.Count > 0);
pasteresources.Enabled = (havecopiedconfig && configinfocopy.Resources.Count > 0);
pastecolorpresets.Enabled = (formatinterfacesmatch && configinfocopy.LinedefColorPresets.Length > 0);
}
private void copyall_Click(object sender, EventArgs e)
@ -817,6 +817,7 @@ namespace CodeImp.DoomBuilder.Windows
current.PasteFrom(configinfocopy);
//update display
cbEngineSelector.Text = string.Empty; // Otherwise current text from cbEngineSelector will override the pasted one
listconfigs_SelectedIndexChanged(listconfigs, EventArgs.Empty);
General.Interface.DisplayStatus(StatusType.Info, "Pasted game configuration from '" + configinfocopy.Name + "'");
}
@ -843,6 +844,7 @@ namespace CodeImp.DoomBuilder.Windows
current.PasteTestEnginesFrom(configinfocopy);
//update display
cbEngineSelector.Text = string.Empty; // Otherwise current text from cbEngineSelector will override the pasted one
listconfigs_SelectedIndexChanged(listconfigs, EventArgs.Empty);
General.Interface.DisplayStatus(StatusType.Info, "Pasted engines list from '" + configinfocopy.Name + "'");
}

View file

@ -130,8 +130,8 @@ namespace CodeImp.DoomBuilder.Windows
this.configurationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.preferencesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.seperatortoolsconfig = new System.Windows.Forms.ToolStripSeparator();
this.screenshotToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.editAreaScreenshotToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.itemsavescreenshot = new System.Windows.Forms.ToolStripMenuItem();
this.itemsaveeditareascreenshot = new System.Windows.Forms.ToolStripMenuItem();
this.separatortoolsscreenshots = new System.Windows.Forms.ToolStripSeparator();
this.itemtestmap = new System.Windows.Forms.ToolStripMenuItem();
this.menuhelp = new System.Windows.Forms.ToolStripMenuItem();
@ -1034,8 +1034,8 @@ namespace CodeImp.DoomBuilder.Windows
this.configurationToolStripMenuItem,
this.preferencesToolStripMenuItem,
this.seperatortoolsconfig,
this.screenshotToolStripMenuItem,
this.editAreaScreenshotToolStripMenuItem,
this.itemsavescreenshot,
this.itemsaveeditareascreenshot,
this.separatortoolsscreenshots,
this.itemtestmap});
this.menutools.Name = "menutools";
@ -1108,23 +1108,23 @@ namespace CodeImp.DoomBuilder.Windows
this.seperatortoolsconfig.Name = "seperatortoolsconfig";
this.seperatortoolsconfig.Size = new System.Drawing.Size(243, 6);
//
// screenshotToolStripMenuItem
// itemsavescreenshot
//
this.screenshotToolStripMenuItem.Image = global::CodeImp.DoomBuilder.Properties.Resources.Screenshot;
this.screenshotToolStripMenuItem.Name = "screenshotToolStripMenuItem";
this.screenshotToolStripMenuItem.Size = new System.Drawing.Size(246, 22);
this.screenshotToolStripMenuItem.Tag = "builder_savescreenshot";
this.screenshotToolStripMenuItem.Text = "Save Screenshot";
this.screenshotToolStripMenuItem.Click += new System.EventHandler(this.InvokeTaggedAction);
this.itemsavescreenshot.Image = global::CodeImp.DoomBuilder.Properties.Resources.Screenshot;
this.itemsavescreenshot.Name = "itemsavescreenshot";
this.itemsavescreenshot.Size = new System.Drawing.Size(246, 22);
this.itemsavescreenshot.Tag = "builder_savescreenshot";
this.itemsavescreenshot.Text = "Save Screenshot";
this.itemsavescreenshot.Click += new System.EventHandler(this.InvokeTaggedAction);
//
// editAreaScreenshotToolStripMenuItem
// itemsaveeditareascreenshot
//
this.editAreaScreenshotToolStripMenuItem.Image = global::CodeImp.DoomBuilder.Properties.Resources.ScreenshotActiveWindow;
this.editAreaScreenshotToolStripMenuItem.Name = "editAreaScreenshotToolStripMenuItem";
this.editAreaScreenshotToolStripMenuItem.Size = new System.Drawing.Size(246, 22);
this.editAreaScreenshotToolStripMenuItem.Tag = "builder_saveeditareascreenshot";
this.editAreaScreenshotToolStripMenuItem.Text = "Save Screenshot (active window)";
this.editAreaScreenshotToolStripMenuItem.Click += new System.EventHandler(this.InvokeTaggedAction);
this.itemsaveeditareascreenshot.Image = global::CodeImp.DoomBuilder.Properties.Resources.ScreenshotActiveWindow;
this.itemsaveeditareascreenshot.Name = "itemsaveeditareascreenshot";
this.itemsaveeditareascreenshot.Size = new System.Drawing.Size(246, 22);
this.itemsaveeditareascreenshot.Tag = "builder_saveeditareascreenshot";
this.itemsaveeditareascreenshot.Text = "Save Screenshot (active window)";
this.itemsaveeditareascreenshot.Click += new System.EventHandler(this.InvokeTaggedAction);
//
// separatortoolsscreenshots
//
@ -2638,8 +2638,8 @@ namespace CodeImp.DoomBuilder.Windows
private System.Windows.Forms.ToolStripMenuItem toggleTesting;
private System.Windows.Forms.ToolStripMenuItem toggleRendering;
private System.Windows.Forms.ToolStripSeparator separatortoolsscreenshots;
private System.Windows.Forms.ToolStripMenuItem screenshotToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem editAreaScreenshotToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem itemsavescreenshot;
private System.Windows.Forms.ToolStripMenuItem itemsaveeditareascreenshot;
private System.Windows.Forms.ToolStripMenuItem itemShortcutReference;
private System.Windows.Forms.ToolStripMenuItem itemopenconfigfolder;
private System.Windows.Forms.ToolStripMenuItem itemopenmapincurwad;

View file

@ -2499,7 +2499,6 @@ namespace CodeImp.DoomBuilder.Windows
itemsavemap.Enabled = (General.Map != null);
itemsavemapas.Enabled = (General.Map != null);
itemsavemapinto.Enabled = (General.Map != null);
itemtestmap.Enabled = (General.Map != null);
itemopenmapincurwad.Enabled = (General.Map != null); //mxd
itemimport.Enabled = (General.Map != null); //mxd
itemexport.Enabled = (General.Map != null); //mxd
@ -3075,13 +3074,18 @@ namespace CodeImp.DoomBuilder.Windows
// This sets up the tools menu
private void UpdateToolsMenu()
{
// Enable/disable items
//mxd. Enable/disable items
bool enabled = (General.Map != null);
itemreloadresources.Enabled = enabled;
//mxd
itemReloadGldefs.Enabled = enabled;
itemReloadModedef.Enabled = enabled;
itemreloadresources.Visible = enabled;
seperatortoolsconfig.Visible = enabled;
itemsavescreenshot.Visible = enabled;
itemsaveeditareascreenshot.Visible = enabled;
separatortoolsscreenshots.Visible = enabled;
itemtestmap.Visible = enabled;
bool supported = (enabled && !string.IsNullOrEmpty(General.Map.Config.DecorateGames));
itemReloadGldefs.Visible = supported;
itemReloadModedef.Visible = supported;
}
// Errors and Warnings

View file

@ -34,7 +34,6 @@ namespace CodeImp.DoomBuilder.Windows
// Variables
private readonly MapOptions options;
private readonly bool newmap;
private string previousdefaultmaplumpname; //mxd
// Properties
public MapOptions Options { get { return options; } }
@ -50,6 +49,12 @@ namespace CodeImp.DoomBuilder.Windows
// Keep settings
this.options = options;
//mxd. Add script compilers
foreach(KeyValuePair<string, ScriptConfiguration> group in General.CompiledScriptConfigs)
{
scriptcompiler.Items.Add(group.Value);
}
//mxd. Go for all enabled configurations
for(int i = 0; i < General.Configs.Count; i++)
{
@ -59,13 +64,13 @@ namespace CodeImp.DoomBuilder.Windows
// Add config name to list
int index = config.Items.Add(General.Configs[i]);
//mxd.
//mxd
if(newmap && !string.IsNullOrEmpty(General.Settings.LastUsedConfigName) && General.Configs[i].Name == General.Settings.LastUsedConfigName)
{
// Select this item
config.SelectedIndex = index;
} // Is this configuration currently selected?
}
// Is this configuration currently selected?
else if(string.Compare(General.Configs[i].Filename, options.ConfigFile, true) == 0) // Is this configuration currently selected?
{
// Select this item
@ -97,48 +102,8 @@ namespace CodeImp.DoomBuilder.Windows
//mxd
if(General.Map != null) datalocations.StartPath = General.Map.FilePathName;
//mxd. Set script compiler
if (config.SelectedIndex != -1)
{
ConfigurationInfo ci = config.SelectedItem as ConfigurationInfo;
foreach(KeyValuePair<string, ScriptConfiguration> group in General.CompiledScriptConfigs)
{
scriptcompiler.Items.Add(group.Value);
if(group.Key == options.ScriptCompiler)
scriptcompiler.SelectedIndex = scriptcompiler.Items.Count - 1;
}
//Nothing selected? Let's try default one form the game configuration, if we have any
if(scriptcompiler.SelectedIndex == -1 && !string.IsNullOrEmpty(ci.DefaultScriptCompiler))
{
int cfgindex = 0;
foreach(KeyValuePair<string, ScriptConfiguration> group in General.CompiledScriptConfigs)
{
if(group.Key == ci.DefaultScriptCompiler)
{
scriptcompiler.SelectedIndex = cfgindex;
break;
}
cfgindex++;
}
}
if(General.CompiledScriptConfigs.Count == 0 || string.IsNullOrEmpty(ci.DefaultScriptCompiler))
{
scriptcompiler.Enabled = false;
scriptcompilerlabel.Enabled = false;
}
else if (scriptcompiler.SelectedIndex == -1 && scriptcompiler.Items.Count > 0)
{
scriptcompiler.SelectedIndex = 0;
}
}
// Set the level name
if (!string.IsNullOrEmpty(options.CurrentName)) levelname.Text = options.CurrentName; //mxd
if(!string.IsNullOrEmpty(options.CurrentName)) levelname.Text = options.CurrentName; //mxd
// Set strict patches loading
strictpatches.Checked = options.StrictPatches;
@ -158,6 +123,15 @@ namespace CodeImp.DoomBuilder.Windows
config.Focus();
return;
}
//mxd. Script configuration selected?
if(scriptcompiler.Enabled && scriptcompiler.SelectedIndex == -1)
{
// Select a configuration!
MessageBox.Show(this, "Please select a script type to use for editing your map.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
scriptcompiler.Focus();
return;
}
// Level name empty?
if(levelname.Text.Length == 0)
@ -274,10 +248,9 @@ namespace CodeImp.DoomBuilder.Windows
options.CopyResources(datalocations.GetResources());
//mxd. Store script compiler
if(scriptcompiler.Enabled && scriptcompiler.SelectedIndex > -1)
if(scriptcompiler.Enabled)
{
ScriptConfiguration scriptcfg = scriptcompiler.SelectedItem as ScriptConfiguration;
foreach(KeyValuePair<string, ScriptConfiguration> group in General.CompiledScriptConfigs)
{
if(group.Value == scriptcfg)
@ -311,38 +284,47 @@ namespace CodeImp.DoomBuilder.Windows
if(config.SelectedIndex < 0) return;
// Get the info
ConfigurationInfo ci = config.SelectedItem as ConfigurationInfo;
ConfigurationInfo info = config.SelectedItem as ConfigurationInfo;
if(info == null) return; //mxd. Some boilerplate
// No lump name in the name field?
if(levelname.Text.Trim().Length == 0 || levelname.Text.Trim() == previousdefaultmaplumpname)
if(newmap || levelname.Text.Trim().Length == 0)
{
// Get default lump name from configuration
levelname.Text = ci.DefaultLumpName;
examplelabel.Text = ci.DefaultLumpName; //mxd
levelname.Text = info.DefaultLumpName;
}
examplelabel.Text = info.DefaultLumpName; //mxd
//mxd. Select script compiler
string scriptconfig = string.Empty;
if(!string.IsNullOrEmpty(options.ScriptCompiler) && General.CompiledScriptConfigs.ContainsKey(options.ScriptCompiler))
{
scriptconfig = options.ScriptCompiler;
}
else if(!string.IsNullOrEmpty(info.DefaultScriptCompiler) && General.CompiledScriptConfigs.ContainsKey(info.DefaultScriptCompiler))
{
scriptconfig = info.DefaultScriptCompiler;
}
//mxd
bool enablescriptcompiler = !string.IsNullOrEmpty(ci.DefaultScriptCompiler);
scriptcompiler.Enabled = enablescriptcompiler;
scriptcompilerlabel.Enabled = enablescriptcompiler;
previousdefaultmaplumpname = ci.DefaultLumpName;
//mxd. Select default script compiler for this game configuration
if(scriptcompiler.Enabled)
//mxd. Select proper script compiler
if(!string.IsNullOrEmpty(scriptconfig))
{
if(General.CompiledScriptConfigs.ContainsKey(ci.DefaultScriptCompiler))
scriptcompiler.SelectedItem = General.CompiledScriptConfigs[ci.DefaultScriptCompiler];
}
else
scriptcompiler.Enabled = true;
scriptcompiler.SelectedItem = General.CompiledScriptConfigs[scriptconfig];
scriptcompilerlabel.Enabled = true;
}
else
{
scriptcompiler.Enabled = false;
scriptcompiler.SelectedIndex = -1;
scriptcompilerlabel.Enabled = false;
}
// Show resources
datalocations.FixedResourceLocationList(ci.Resources);
datalocations.FixedResourceLocationList(info.Resources);
// Update long texture names checkbox (mxd)
longtexturenames.Enabled = ci.Configuration.ReadSetting("longtexturenames", false);
longtexturenames.Enabled = info.Configuration.ReadSetting("longtexturenames", false);
longtexturenames.Checked = longtexturenames.Enabled && options.UseLongTextureNames;
}

View file

@ -109,7 +109,7 @@ namespace CodeImp.DoomBuilder.Windows
mapsettings = new Configuration(true);
// Check strict patches box, check what game configuration is preferred
if (options != null)
if(options != null)
{
strictpatches.Checked = options.StrictPatches;
gameconfig = options.ConfigFile;
@ -251,7 +251,7 @@ namespace CodeImp.DoomBuilder.Windows
}
// Map found? Let's call it a day :)
if (lumpsfound >= lumpsrequired) return true;
if(lumpsfound >= lumpsrequired) return true;
}
}
@ -380,13 +380,22 @@ namespace CodeImp.DoomBuilder.Windows
config.Focus();
return;
}
//mxd. Script configuration selected?
if(scriptcompiler.Enabled && scriptcompiler.SelectedIndex == -1)
{
// Select a configuration!
MessageBox.Show(this, "Please select a script type to use for editing your map.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
scriptcompiler.Focus();
return;
}
// Collect information
ConfigurationInfo configinfo = (config.SelectedItem as ConfigurationInfo); //mxd
DataLocationList locations = datalocations.GetResources();
// Resources are valid? (mxd)
if (!datalocations.ResourcesAreValid())
if(!datalocations.ResourcesAreValid())
{
MessageBox.Show(this, "Cannot open map: at least one resource doesn't exist!", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
datalocations.Focus();
@ -430,10 +439,9 @@ namespace CodeImp.DoomBuilder.Windows
options.CopyResources(locations);
//mxd. Store script compiler
if(scriptcompiler.Enabled && scriptcompiler.SelectedIndex > -1)
if(scriptcompiler.Enabled)
{
ScriptConfiguration scriptcfg = scriptcompiler.SelectedItem as ScriptConfiguration;
foreach(KeyValuePair<string, ScriptConfiguration> group in General.CompiledScriptConfigs)
{
if(group.Value == scriptcfg)
@ -486,7 +494,7 @@ namespace CodeImp.DoomBuilder.Windows
DataLocationList locations;
DataLocationList listedlocations;
string scriptconfig = string.Empty;
string scriptconfig = string.Empty; //mxd
// Map previously selected?
if(!string.IsNullOrEmpty(selectedmapname))
@ -525,26 +533,28 @@ namespace CodeImp.DoomBuilder.Windows
datalocations.EditResourceLocationList(listedlocations);
//mxd. Select script compiler
if (!string.IsNullOrEmpty(options.ScriptCompiler) && General.CompiledScriptConfigs.ContainsKey(options.ScriptCompiler))
ConfigurationInfo info = config.SelectedItem as ConfigurationInfo;
if(info != null)
{
scriptconfig = options.ScriptCompiler;
}
else
{
string defaultscriptconfig = (config.SelectedItem as ConfigurationInfo).Configuration.ReadSetting("defaultscriptcompiler", string.Empty);
if(!string.IsNullOrEmpty(defaultscriptconfig) && General.CompiledScriptConfigs.ContainsKey(defaultscriptconfig))
scriptconfig = defaultscriptconfig;
if(!string.IsNullOrEmpty(options.ScriptCompiler) && General.CompiledScriptConfigs.ContainsKey(options.ScriptCompiler))
{
scriptconfig = options.ScriptCompiler;
}
else if(!string.IsNullOrEmpty(info.DefaultScriptCompiler) && General.CompiledScriptConfigs.ContainsKey(info.DefaultScriptCompiler))
{
scriptconfig = info.DefaultScriptCompiler;
}
}
}
//mxd. Select proper script compiler
if (!string.IsNullOrEmpty(scriptconfig))
if(!string.IsNullOrEmpty(scriptconfig))
{
scriptcompiler.Enabled = true;
scriptcompiler.SelectedItem = General.CompiledScriptConfigs[scriptconfig];
scriptcompilerlabel.Enabled = true;
}
else
}
else
{
scriptcompiler.Enabled = false;
scriptcompiler.SelectedIndex = -1;

View file

@ -171,7 +171,7 @@ namespace CodeImp.DoomBuilder.BuilderEffects
form.Location = formLocation;
form.FormClosed += form_FormClosed;
form.ShowDialog(Form.ActiveForm);
form.ShowDialog(General.Interface);
}
//events

View file

@ -88,14 +88,14 @@ namespace CodeImp.DoomBuilder.BuilderModes.ClassicModes
ICollection<Linedef> selection = General.Map.Map.GetSelectedLinedefs(true);
List<Line> lines = new List<Line>();
foreach (Linedef ld in selection)
foreach(Linedef ld in selection)
{
Line l = new Line(ld);
lines.Add(l);
}
//do we have valid selection?
if (!Setup(lines))
if(!Setup(lines))
{
FinishDraw();
return;
@ -107,7 +107,7 @@ namespace CodeImp.DoomBuilder.BuilderModes.ClassicModes
form.OnOkClick += form_OnOkClick;
form.OnFlipClick += form_OnFlipClick;
form.OnSubdivisionChanged += form_OnSubdivisionChanged;
form.Show(Form.ActiveForm);
form.Show(General.Interface);
General.Interface.FocusDisplay();
handleColor = General.Colors.BrightColors[new Random().Next(General.Colors.BrightColors.Length - 1)];

View file

@ -960,7 +960,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
if(sel != null)
{
PastePropertiesOptionsForm form = new PastePropertiesOptionsForm();
if(form.Setup(MapElementType.LINEDEF) && form.ShowDialog(Form.ActiveForm) == DialogResult.OK)
if(form.Setup(MapElementType.LINEDEF) && form.ShowDialog(General.Interface) == DialogResult.OK)
{
// Apply properties to selection
string rest = (sel.Count == 1 ? "a single linedef" : sel.Count + " linedefs");

View file

@ -69,11 +69,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
private Dictionary<Sector, string[]> selectedEffectLabels;
private Dictionary<Sector, string[]> unselectedEffectLabels;
//mxd. "Make Door" textures
private static string doortex = "-";
private static string tracktex = "-";
private static bool resetoffsets = true;
#endregion
#region ================== Properties
@ -1446,7 +1441,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
if(sel != null)
{
PastePropertiesOptionsForm form = new PastePropertiesOptionsForm();
if(form.Setup(MapElementType.SECTOR) && form.ShowDialog(Form.ActiveForm) == DialogResult.OK)
if(form.Setup(MapElementType.SECTOR) && form.ShowDialog(General.Interface) == DialogResult.OK)
{
// Apply properties to selection
string rest = (sel.Count == 1 ? "a single sector" : sel.Count + " sectors");
@ -1508,16 +1503,16 @@ namespace CodeImp.DoomBuilder.BuilderModes
if(orderedselection.Count > 0)
{
if(doortex == "-") doortex = General.Map.Config.MakeDoorDoor; //mxd
if(tracktex == "-") tracktex = General.Map.Config.MakeDoorTrack; //mxd
string doortex = BuilderPlug.Me.MakeDoor.DoorTexture;
string tracktex = BuilderPlug.Me.MakeDoor.TrackTexture;
string ceiltex = BuilderPlug.Me.MakeDoor.CeilingTexture;
string floortex = null;
string ceiltex = null;
// Find ceiling and floor textures
bool resetoffsets = BuilderPlug.Me.MakeDoor.ResetOffsets;
// Find floor texture
foreach(Sector s in orderedselection)
{
if(floortex == null) floortex = s.FloorTexture; else if(floortex != s.FloorTexture) floortex = "";
if(ceiltex == null) ceiltex = s.CeilTexture; else if(ceiltex != s.CeilTexture) ceiltex = "";
}
// Show the dialog
@ -1529,6 +1524,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
ceiltex = form.CeilingTexture;
floortex = form.FloorTexture;
resetoffsets = form.ResetOffsets;
//mxd. Store new settings
BuilderPlug.Me.MakeDoor = new BuilderPlug.MakeDoorSettings(doortex, tracktex, ceiltex, resetoffsets);
// Create undo
General.Map.UndoRedo.CreateUndo("Make door (" + doortex + ")");
@ -1551,7 +1549,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
{
// Make this a doortrak
sd.SetTextureHigh("-");
sd.SetTextureMid(tracktex);
if(!string.IsNullOrEmpty(tracktex)) sd.SetTextureMid(tracktex);
sd.SetTextureLow("-");
// Set upper/lower unpegged flags
@ -1561,9 +1559,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
else
{
// Set textures
if(floortex.Length > 0) s.SetFloorTexture(floortex);
if(ceiltex.Length > 0) s.SetCeilTexture(ceiltex);
if(doortex.Length > 0) sd.Other.SetTextureHigh(doortex);
if(!string.IsNullOrEmpty(floortex)) s.SetFloorTexture(floortex);
if(!string.IsNullOrEmpty(ceiltex)) s.SetCeilTexture(ceiltex);
if(!string.IsNullOrEmpty(doortex)) sd.Other.SetTextureHigh(doortex);
// Set upper/lower unpegged flags
sd.Line.SetFlag(General.Map.Config.UpperUnpeggedFlag, false);
@ -1605,12 +1603,12 @@ namespace CodeImp.DoomBuilder.BuilderModes
}
// Reset the texture offsets if required
if (resetoffsets)
if(resetoffsets)
{
sd.OffsetX = 0;
sd.OffsetY = 0;
if (sd.Other != null)
if(sd.Other != null)
{
sd.Other.OffsetX = 0;
sd.Other.OffsetY = 0;
@ -1631,7 +1629,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
}
else //mxd
{
General.Interface.DisplayStatus(StatusType.Warning, "This action requires a selection!");
General.Interface.DisplayStatus(StatusType.Warning, "This action requires a highlight or selection!");
}
}

View file

@ -859,7 +859,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
if(sel != null)
{
PastePropertiesOptionsForm form = new PastePropertiesOptionsForm();
if(form.Setup(MapElementType.THING) && form.ShowDialog(Form.ActiveForm) == DialogResult.OK)
if(form.Setup(MapElementType.THING) && form.ShowDialog(General.Interface) == DialogResult.OK)
{
// Apply properties to selection
string rest = (sel.Count == 1 ? "a single thing" : sel.Count + " things");

View file

@ -783,7 +783,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
if(sel != null)
{
PastePropertiesOptionsForm form = new PastePropertiesOptionsForm();
if(form.Setup(MapElementType.VERTEX) && form.ShowDialog(Form.ActiveForm) == DialogResult.OK)
if(form.Setup(MapElementType.VERTEX) && form.ShowDialog(General.Interface) == DialogResult.OK)
{
// Apply properties to selection
string rest = (sel.Count == 1 ? "a single vertex" : sel.Count + " vertices");

View file

@ -59,6 +59,26 @@ namespace CodeImp.DoomBuilder.BuilderModes
#endregion
#region ================== Structs (mxd)
public struct MakeDoorSettings
{
public readonly string DoorTexture;
public readonly string TrackTexture;
public readonly string CeilingTexture;
public readonly bool ResetOffsets;
public MakeDoorSettings(string doortexture, string tracktexture, string ceilingtexture, bool resetoffsets)
{
DoorTexture = doortexture;
TrackTexture = tracktexture;
CeilingTexture = ceilingtexture;
ResetOffsets = resetoffsets;
}
}
#endregion
#region ================== Variables
// Static instance
@ -151,11 +171,11 @@ namespace CodeImp.DoomBuilder.BuilderModes
public float HighlightRange { get { return highlightrange; } }
public float HighlightThingsRange { get { return highlightthingsrange; } }
public float SplitLinedefsRange { get { return splitlinedefsrange; } }
public bool UseHighlight {
get {
return usehighlight;
}
set {
public bool UseHighlight
{
get { return usehighlight; }
set
{
usehighlight = value;
General.Map.Renderer3D.ShowSelection = usehighlight;
General.Map.Renderer3D.ShowHighlight = usehighlight;
@ -169,7 +189,10 @@ namespace CodeImp.DoomBuilder.BuilderModes
public bool SyncSelection { get { return syncSelection; } set { syncSelection = value; } } //mxd
public bool LockSectorTextureOffsetsWhileDragging { get { return lockSectorTextureOffsetsWhileDragging; } internal set { lockSectorTextureOffsetsWhileDragging = value; } } //mxd
public bool DragThingsInSectorsMode { get { return dragThingsInSectorsMode; } internal set { dragThingsInSectorsMode = value; } } //mxd
//mxd. "Make Door" action persistent settings
internal MakeDoorSettings MakeDoor;
#endregion
#region ================== Initialize / Dispose
@ -286,6 +309,16 @@ namespace CodeImp.DoomBuilder.BuilderModes
General.Settings.WritePluginSetting("dragthingsinsectorsmode", dragThingsInSectorsMode);
}
//mxd. These should be reset when changing maps
private void ResetCopyProperties()
{
copiedvertexprops = null;
copiedthingprops = null;
copiedlinedefprops = null;
copiedsidedefprops = null;
copiedsectorprops = null;
}
#endregion
#region ================== Events
@ -436,6 +469,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
//mxd
General.Interface.AddDocker(drawingOverridesDocker);
drawingOverridesPanel.Setup();
MakeDoor = new MakeDoorSettings(General.Map.Config.MakeDoorDoor, General.Map.Config.MakeDoorTrack, General.Map.Config.MakeDoorCeiling, MakeDoor.ResetOffsets);
ResetCopyProperties();
}
// Map opened
@ -448,7 +483,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
//mxd
General.Interface.AddDocker(drawingOverridesDocker);
drawingOverridesPanel.Setup();
General.Map.Renderer2D.UpdateExtraFloorFlag(); //mxd
General.Map.Renderer2D.UpdateExtraFloorFlag();
MakeDoor = new MakeDoorSettings(General.Map.Config.MakeDoorDoor, General.Map.Config.MakeDoorTrack, General.Map.Config.MakeDoorCeiling, MakeDoor.ResetOffsets);
ResetCopyProperties();
}
//mxd

View file

@ -332,6 +332,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
s.SetFlag(f.Key, f.Value);
}
// Should we bother?
if(!General.Map.UDMF) return;
// Apply fields
s.Fields.BeforeFieldsChange();
@ -455,6 +458,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
s.SetFlag(f.Key, f.Value);
}
// Should we bother?
if(!General.Map.UDMF) return;
// Apply fields
s.Fields.BeforeFieldsChange();
@ -573,6 +579,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
l.Args[i] = args[i];
}
// Should we bother?
if(!General.Map.UDMF) return;
// Apply fields
l.Fields.BeforeFieldsChange();
@ -727,6 +736,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
t.Args[i] = args[i];
}
// Should we bother?
if(!General.Map.UDMF) return;
// Apply fields
t.Fields.BeforeFieldsChange();

View file

@ -140,7 +140,7 @@ namespace CodeImp.DoomBuilder.BuilderModes.Interface
this.tracktexture.Location = new System.Drawing.Point(101, 29);
this.tracktexture.MultipleTextures = false;
this.tracktexture.Name = "tracktexture";
this.tracktexture.Required = true;
this.tracktexture.Required = false;
this.tracktexture.Size = new System.Drawing.Size(83, 105);
this.tracktexture.TabIndex = 6;
this.tracktexture.TextureName = "";

View file

@ -414,7 +414,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Apply settings
SetPosition(pos);
UpdateThingCage(Thing.Color);
SetCageColor(Thing.Color);
// Keep info for object picking
cageradius2 = thingradius * Angle2D.SQRT2;

View file

@ -148,7 +148,7 @@ namespace CodeImp.DoomBuilder.ColorPicker
}
form.Location = formLocation;
form.FormClosed += form_FormClosed;
form.ShowDialog(Form.ActiveForm);
form.ShowDialog(General.Interface);
}
else
{

View file

@ -79,10 +79,10 @@ namespace CodeImp.DoomBuilder.TagRange
TagRangeForm f = new TagRangeForm();
f.Setup();
if(f.SelectionCount > 0)
f.ShowDialog(Form.ActiveForm);
f.ShowDialog(General.Interface);
else
General.Interface.DisplayStatus(StatusType.Warning, "This action requires a selection!"); //mxd
f.Dispose();
}
}
}
}