From 04abc827f773f5a39c54cbed514e20665a8ca8a4 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Sat, 23 Jan 2016 01:30:20 +0100 Subject: [PATCH] Merged in GZDB r2465. --- Build/Compilers/Nodebuilders/zdbsp.exe | Bin 242688 -> 269312 bytes Build/Compilers/ZDoom/acc.exe | Bin 66560 -> 66560 bytes Build/Compilers/ZDoom/zdefs.acs | 1 + Build/Compilers/ZDoom/zspecial.acs | 5 +- Build/Configurations/Boom_DoomDoom.cfg | 9 + Build/Configurations/Doom_DoomDoom.cfg | 9 + Build/Configurations/Includes/Game_Doom.cfg | 54 +- .../Configurations/Includes/Game_Heretic.cfg | 56 +- Build/Configurations/Includes/Game_Hexen.cfg | 48 +- Build/Configurations/Includes/Game_Strife.cfg | 55 +- .../Configurations/Includes/ZDoom_things.cfg | 28 +- .../Action Doom/Includes/Game_Action2.cfg | 54 +- .../Chex Quest 3/Includes/Game_Chex3.cfg | 50 +- .../Chex Quest/Includes/Game_Chex.cfg | 50 +- .../Harmony/Includes/Game_Harmony.cfg | 52 +- Build/Scripting/ZDoom_ACS.cfg | 278 ++- Build/Textures/MissingSky3D.png | Bin 0 -> 24951 bytes Help/gc_basicsettings.html | 43 +- Help/gc_resourcesettings.html | 12 +- Source/Core/Builder.csproj | 12 +- Source/Core/Config/GameConfiguration.cs | 58 +- Source/Core/Config/ProgramConfiguration.cs | 14 +- Source/Core/Controls/LinedefInfoPanel.cs | 12 +- Source/Core/Controls/ScintillaControl.cs | 16 +- Source/Core/Data/DataManager.cs | 615 ++++++- Source/Core/Data/PK3StructuredReader.cs | 10 +- Source/Core/Data/SpriteImage.cs | 4 +- Source/Core/GZBuilder/Data/MapInfo.cs | 91 +- Source/Core/GZBuilder/Data/SkyboxInfo.cs | 18 + Source/Core/GZBuilder/GZDoom/GldefsParser.cs | 1535 +++++++++-------- Source/Core/GZBuilder/GZDoom/MapinfoParser.cs | 1239 +++++++------ Source/Core/GZBuilder/GZGeneral.cs | 70 +- Source/Core/General/General.cs | 26 +- Source/Core/Geometry/Tools.cs | 9 +- Source/Core/Map/Linedef.cs | 2 +- Source/Core/Properties/Resources.Designer.cs | 11 +- Source/Core/Properties/Resources.resx | 3 + Source/Core/Rendering/Display2DShader.cs | 8 +- Source/Core/Rendering/Renderer3D.cs | 173 +- Source/Core/Rendering/Things2DShader.cs | 8 +- Source/Core/Rendering/World3DShader.cs | 12 +- Source/Core/Resources/Actions.cfg | 10 + Source/Core/Resources/MissingSky3D.png | Bin 0 -> 24951 bytes Source/Core/Resources/Sky.png | Bin 0 -> 1220 bytes Source/Core/Resources/world3d.fx | 67 +- Source/Core/VisualModes/VisualGeometry.cs | 23 +- Source/Core/VisualModes/VisualVertex.cs | 21 +- Source/Core/Windows/MainForm.Designer.cs | 27 +- Source/Core/Windows/MainForm.cs | 13 +- Source/Core/ZDoom/ZDTextParser.cs | 63 +- .../BuilderModes/IO/WavefrontExporter.cs | 2 +- .../VisualModes/BaseVisualMode.cs | 29 +- .../BuilderModes/VisualModes/SectorData.cs | 3 - .../BuilderModes/VisualModes/VisualCeiling.cs | 96 +- .../BuilderModes/VisualModes/VisualFloor.cs | 97 +- .../VisualModes/VisualMiddleSingle.cs | 25 +- .../BuilderModes/VisualModes/VisualUpper.cs | 27 +- 57 files changed, 3246 insertions(+), 2007 deletions(-) create mode 100644 Build/Textures/MissingSky3D.png create mode 100644 Source/Core/GZBuilder/Data/SkyboxInfo.cs create mode 100644 Source/Core/Resources/MissingSky3D.png create mode 100644 Source/Core/Resources/Sky.png diff --git a/Build/Compilers/Nodebuilders/zdbsp.exe b/Build/Compilers/Nodebuilders/zdbsp.exe index 2fa3102c351c13d66e663e4f844996c9a42146d5..75c9062626bd4e2f627b6884a98e92674933720e 100644 GIT binary patch literal 269312 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 bhN+~E;cD(5@?1l?P*Qba>tFSMPYV1m^MEG( literal 242688 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�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 K-#`D|E$|92e diff --git a/Build/Compilers/ZDoom/acc.exe b/Build/Compilers/ZDoom/acc.exe index a60988bc63c0372dbe99613c56495361c728cc99..2efd005ffdeb422cc866f369d69af452f2208d7e 100644 GIT binary patch delta 7012 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 IGeyS#0&Wkc4FCWD diff --git a/Build/Compilers/ZDoom/zdefs.acs b/Build/Compilers/ZDoom/zdefs.acs index c80cf89..a82ad18 100644 --- a/Build/Compilers/ZDoom/zdefs.acs +++ b/Build/Compilers/ZDoom/zdefs.acs @@ -969,6 +969,7 @@ #define BLOCKF_USE 128 #define BLOCKF_SIGHT 256 #define BLOCKF_HITSCAN 512 +#define BLOCKF_SOUND 1024 #define FOGP_DENSITY 0 #define FOGP_OUTSIDEDENSITY 1 diff --git a/Build/Compilers/ZDoom/zspecial.acs b/Build/Compilers/ZDoom/zspecial.acs index 22e7298..ae0ec98 100644 --- a/Build/Compilers/ZDoom/zspecial.acs +++ b/Build/Compilers/ZDoom/zspecial.acs @@ -199,7 +199,7 @@ special // 211:Transfer_CeilingLight, 212:Sector_SetColor(4,5), 213:Sector_SetFade(4), - 214:Sector_SetDamage(3), + 214:Sector_SetDamage(3,5), 215:Teleport_Line(2), 216:Sector_SetGravity(3), 217:Stairs_BuildUpDoom(5), @@ -302,7 +302,7 @@ special -57:SetCVarString(2), -58:GetUserCVarString(2), -59:SetUserCVarString(3), - -60:LineAttack(4,8), + -60:LineAttack(4,9), -61:PlaySound(2,6), -62:StopSound(1,2), -63:strcmp(2,3), @@ -337,6 +337,7 @@ special -91:QuakeEx(8,12), -92:Warp(6,11), -93:GetMaxInventory(2), + -94:SetSectorDamage(2,6), // Zandronum's -100:ResetMap(0), diff --git a/Build/Configurations/Boom_DoomDoom.cfg b/Build/Configurations/Boom_DoomDoom.cfg index 5bb7ee9..5193c7c 100644 --- a/Build/Configurations/Boom_DoomDoom.cfg +++ b/Build/Configurations/Boom_DoomDoom.cfg @@ -32,6 +32,15 @@ include("Includes\\Game_Doom.cfg"); //mxd. No DECORATE support in vanilla decorategames = ""; +//mxd. Sky textures for vanilla maps +defaultskytextures +{ + SKY1 = "E1M1,E1M2,E1M3,E1M4,E1M5,E1M6,E1M7,E1M8,E1M9"; + SKY2 = "E2M1,E2M2,E2M3,E2M4,E2M5,E2M6,E2M7,E2M8,E2M9"; + SKY3 = "E3M1,E3M2,E3M3,E3M4,E3M5,E3M6,E3M7,E3M8,E3M9"; + SKY4 = "E4M1,E4M2,E4M3,E4M4,E4M5,E4M6,E4M7,E4M8,E4M9"; +} + // Default thing filters // (these are not required, just useful for new users) thingsfilters diff --git a/Build/Configurations/Doom_DoomDoom.cfg b/Build/Configurations/Doom_DoomDoom.cfg index 79ce1ba..066fadc 100644 --- a/Build/Configurations/Doom_DoomDoom.cfg +++ b/Build/Configurations/Doom_DoomDoom.cfg @@ -32,6 +32,15 @@ include("Includes\\Game_Doom.cfg"); //mxd. No DECORATE support in vanilla decorategames = ""; +//mxd. Sky textures for vanilla maps +defaultskytextures +{ + SKY1 = "E1M1,E1M2,E1M3,E1M4,E1M5,E1M6,E1M7,E1M8,E1M9"; + SKY2 = "E2M1,E2M2,E2M3,E2M4,E2M5,E2M6,E2M7,E2M8,E2M9"; + SKY3 = "E3M1,E3M2,E3M3,E3M4,E3M5,E3M6,E3M7,E3M8,E3M9"; + SKY4 = "E4M1,E4M2,E4M3,E4M4,E4M5,E4M6,E4M7,E4M8,E4M9"; +} + // Default thing filters // (these are not required, just useful for new users) thingsfilters diff --git a/Build/Configurations/Includes/Game_Doom.cfg b/Build/Configurations/Includes/Game_Doom.cfg index f3d3fd3..3457bc6 100644 --- a/Build/Configurations/Includes/Game_Doom.cfg +++ b/Build/Configurations/Includes/Game_Doom.cfg @@ -1,29 +1,37 @@ // Default lump name for new map - defaultlumpname = "MAP01"; - basegame = 1; //mxd: 0 - UNKNOWN, 1 - DOOM, 2 - HERETIC, 3 - HEXEN, 4 - STRIFE, +defaultlumpname = "MAP01"; +basegame = 1; //mxd: 0 - UNKNOWN, 1 - DOOM, 2 - HERETIC, 3 - HEXEN, 4 - STRIFE - // Decorate actors to include depending on actor game property - decorategames = "doom"; +// Decorate actors to include depending on actor game property +decorategames = "doom"; - // Skill levels - skills - { - include("Doom_misc.cfg", "skills"); - } +//mxd. Sky textures for vanilla maps +defaultskytextures +{ + SKY1 = "MAP01,MAP02,MAP03,MAP04,MAP05,MAP06,MAP07,MAP08,MAP09,MAP10,MAP11"; + SKY2 = "MAP12,MAP13,MAP14,MAP15,MAP16,MAP17,MAP18,MAP19,MAP20"; + SKY3 = "MAP21,MAP22,MAP23,MAP24,MAP25,MAP26,MAP27,MAP28,MAP29,MAP30,MAP31,MAP32"; +} - // Default textures - defaultwalltexture = "STARTAN"; - defaultfloortexture = "FLOOR0_1"; - defaultceilingtexture = "CEIL1_1"; +// Skill levels +skills +{ + include("Doom_misc.cfg", "skills"); +} - // Door making - makedoortrack = "DOORTRAK"; - makedoordoor = "BIGDOOR2"; - makedoorceil = "FLAT20"; +// Default textures +defaultwalltexture = "STARTAN"; +defaultfloortexture = "FLOOR0_1"; +defaultceilingtexture = "CEIL1_1"; - // Default texture sets - // (these are not required, but useful for new users) - texturesets - { - include("Doom_texturesets.cfg"); - } \ No newline at end of file +// Door making +makedoortrack = "DOORTRAK"; +makedoordoor = "BIGDOOR2"; +makedoorceil = "FLAT20"; + +// Default texture sets +// (these are not required, but useful for new users) +texturesets +{ + include("Doom_texturesets.cfg"); +} \ No newline at end of file diff --git a/Build/Configurations/Includes/Game_Heretic.cfg b/Build/Configurations/Includes/Game_Heretic.cfg index d73b31b..ba674a8 100644 --- a/Build/Configurations/Includes/Game_Heretic.cfg +++ b/Build/Configurations/Includes/Game_Heretic.cfg @@ -1,29 +1,37 @@ // Default lump name for new map - defaultlumpname = "E1M1"; - basegame = 2; +defaultlumpname = "E1M1"; +basegame = 2; - // Decorate actors to include depending on actor game property - decorategames = "heretic raven"; +// Decorate actors to include depending on actor game property +decorategames = "heretic raven"; - // Skill levels - skills - { - include("Heretic_misc.cfg", "skills"); - } +//mxd. Sky textures for vanilla maps +defaultskytextures +{ + SKY1 = "E1M1,E1M2,E1M3,E1M4,E1M5,E1M6,E1M7,E1M8,E1M9,E4M1,E4M2,E4M3,E4M4,E4M5,E4M6,E4M7,E4M8,E4M9,E6M1,E6M2,E6M3"; + SKY2 = "E2M1,E2M2,E2M3,E2M4,E2M5,E2M6,E2M7,E2M8,E2M9"; + SKY3 = "E3M1,E3M2,E3M3,E3M4,E3M5,E3M6,E3M7,E3M8,E3M9,E5M1,E5M2,E5M3,E5M4,E5M5,E5M6,E5M7,E5M8,E5M9"; +} - // Default textures - defaultwalltexture = "GRSTNPB"; - defaultfloortexture = "FLOOR03"; - defaultceilingtexture = "FLAT506"; +// Skill levels +skills +{ + include("Heretic_misc.cfg", "skills"); +} - // Door making - makedoortrack = "WOODWL"; - makedoordoor = "DOORWOOD"; - makedoorceil = "FLOOR04"; - - // Default texture sets - // (these are not required, but useful for new users) - texturesets - { - include("Heretic_texturesets.cfg"); - } \ No newline at end of file +// Default textures +defaultwalltexture = "GRSTNPB"; +defaultfloortexture = "FLOOR03"; +defaultceilingtexture = "FLAT506"; + +// Door making +makedoortrack = "WOODWL"; +makedoordoor = "DOORWOOD"; +makedoorceil = "FLOOR04"; + +// Default texture sets +// (these are not required, but useful for new users) +texturesets +{ + include("Heretic_texturesets.cfg"); +} \ No newline at end of file diff --git a/Build/Configurations/Includes/Game_Hexen.cfg b/Build/Configurations/Includes/Game_Hexen.cfg index 30b1418..be50c58 100644 --- a/Build/Configurations/Includes/Game_Hexen.cfg +++ b/Build/Configurations/Includes/Game_Hexen.cfg @@ -1,30 +1,30 @@ // Default lump name for new map - defaultlumpname = "MAP01"; - skyflatname = "F_SKY"; - basegame = 3; +defaultlumpname = "MAP01"; +skyflatname = "F_SKY"; +basegame = 3; - // Decorate actors to include depending on actor game property - decorategames = "hexen raven"; +// Decorate actors to include depending on actor game property +decorategames = "hexen raven"; - // Skill levels - skills - { - include("Hexen_misc.cfg", "skills"); - } +// Skill levels +skills +{ + include("Hexen_misc.cfg", "skills"); +} - // Default textures - defaultwalltexture = "FOREST01"; - defaultfloortexture = "F_010"; - defaultceilingtexture = "F_011"; +// Default textures +defaultwalltexture = "FOREST01"; +defaultfloortexture = "F_010"; +defaultceilingtexture = "F_011"; - // Door making - makedoortrack = "D_END2"; - makedoordoor = "D_WD07"; - makedoorceil = "F_092"; +// Door making +makedoortrack = "D_END2"; +makedoordoor = "D_WD07"; +makedoorceil = "F_092"; - // Default texture sets - // (these are not required, but useful for new users) - texturesets - { - include("Hexen_texturesets.cfg"); - } \ No newline at end of file +// Default texture sets +// (these are not required, but useful for new users) +texturesets +{ + include("Hexen_texturesets.cfg"); +} \ No newline at end of file diff --git a/Build/Configurations/Includes/Game_Strife.cfg b/Build/Configurations/Includes/Game_Strife.cfg index de3b6a6..364f336 100644 --- a/Build/Configurations/Includes/Game_Strife.cfg +++ b/Build/Configurations/Includes/Game_Strife.cfg @@ -1,30 +1,37 @@ // Default lump name for new map - defaultlumpname = "MAP01"; - skyflatname = "F_SKY001"; - basegame = 4; +defaultlumpname = "MAP01"; +skyflatname = "F_SKY001"; +basegame = 4; - // Decorate actors to include depending on actor game property - decorategames = "strife"; +// Decorate actors to include depending on actor game property +decorategames = "strife"; - // Skill levels - skills - { - include("Strife_misc.cfg", "skills"); - } +//mxd. Sky textures for vanilla maps +defaultskytextures +{ + SKYMNT01 = "MAP10,MAP11,MAP12,MAP13,MAP14,MAP15,MAP16,MAP17,MAP18,MAP19,MAP20,MAP21,MAP22,MAP23,MAP24,MAP25,MAP26,MAP27,MAP28,MAP29,MAP30,MAP31"; + SKYMNT02 = "MAP01,MAP02,MAP03,MAP04,MAP05,MAP06,MAP07,MAP08,MAP09,MAP32,MAP33,MAP34"; +} - // Default textures - defaultwalltexture = "BRKGRY17"; - defaultfloortexture = "F_NOLINE"; - defaultceilingtexture = "F_DECK"; +// Skill levels +skills +{ + include("Strife_misc.cfg", "skills"); +} - // Door making - makedoortrack = "DORTRK01"; - makedoordoor = "DORML01"; - makedoorceil = "F_UNDOOR"; +// Default textures +defaultwalltexture = "BRKGRY17"; +defaultfloortexture = "F_NOLINE"; +defaultceilingtexture = "F_DECK"; - // Default texture sets - // (these are not required, but useful for new users) - texturesets - { - include("Strife_texturesets.cfg"); - } \ No newline at end of file +// Door making +makedoortrack = "DORTRK01"; +makedoordoor = "DORML01"; +makedoorceil = "F_UNDOOR"; + +// Default texture sets +// (these are not required, but useful for new users) +texturesets +{ + include("Strife_texturesets.cfg"); +} \ No newline at end of file diff --git a/Build/Configurations/Includes/ZDoom_things.cfg b/Build/Configurations/Includes/ZDoom_things.cfg index 071ee51..a8cdb86 100644 --- a/Build/Configurations/Includes/ZDoom_things.cfg +++ b/Build/Configurations/Includes/ZDoom_things.cfg @@ -32,20 +32,6 @@ zdoom } } - obstacles - { - blocking = 2; - - 5050 - { - title = "Stalagmite"; - sprite = "SMT2A0"; - class = "Stalagmite"; - width = 16; - height = 48; - } - } - lights { blocking = 2; @@ -1396,6 +1382,20 @@ doom class = "StealthZombieMan"; } } + + obstacles + { + blocking = 2; + + 5050 + { + title = "Stalagmite"; + sprite = "SMT2A0"; + class = "Stalagmite"; + width = 16; + height = 48; + } + } decoration { diff --git a/Build/Configurations/Other Games/Action Doom/Includes/Game_Action2.cfg b/Build/Configurations/Other Games/Action Doom/Includes/Game_Action2.cfg index 0444ba6..7a3e6b1 100644 --- a/Build/Configurations/Other Games/Action Doom/Includes/Game_Action2.cfg +++ b/Build/Configurations/Other Games/Action Doom/Includes/Game_Action2.cfg @@ -1,29 +1,37 @@ // Default lump name for new map - defaultlumpname = "MAP01"; +defaultlumpname = "MAP01"; - // Decorate actors to include depending on actor game property - decorategames = "action2"; // Doesn't actually exist, but used to prevent loading Doom actors when loading zdoom.pk3 +// Decorate actors to include depending on actor game property +decorategames = "action2"; // Doesn't actually exist, but used to prevent loading Doom actors when loading zdoom.pk3 - // Skill levels - skills - { - include("Action2_misc.cfg", "skills"); - } +//mxd. Sky textures for vanilla maps +defaultskytextures +{ + SKY1 = "MAP01,MAP02,MAP03,MAP04,MAP05,MAP06,MAP07,MAP08,MAP09,MAP10,MAP11"; + SKY2 = "MAP12,MAP13,MAP14,MAP15,MAP16,MAP17,MAP18,MAP19,MAP20"; + SKY3 = "MAP21,MAP22,MAP23,MAP24,MAP25,MAP26,MAP27,MAP28,MAP29,MAP30,MAP31,MAP32"; +} - // Door making - makedoortrack = "BLACK"; +// Skill levels +skills +{ + include("Action2_misc.cfg", "skills"); +} - // Default thing filters - // (these are not required, just useful for new users) - /*thingsfilters - { - include("Doom_misc.cfg", "thingsfilters"); - }*/ - +// Door making +makedoortrack = "BLACK"; - // Default texture sets - // (these are not required, but useful for new users) - texturesets - { - include("Action2_texturesets.cfg"); - } \ No newline at end of file +// Default thing filters +// (these are not required, just useful for new users) +/*thingsfilters +{ + include("Doom_misc.cfg", "thingsfilters"); +}*/ + + +// Default texture sets +// (these are not required, but useful for new users) +texturesets +{ + include("Action2_texturesets.cfg"); +} \ No newline at end of file diff --git a/Build/Configurations/Other Games/Chex Quest 3/Includes/Game_Chex3.cfg b/Build/Configurations/Other Games/Chex Quest 3/Includes/Game_Chex3.cfg index ab06f56..26c14ba 100644 --- a/Build/Configurations/Other Games/Chex Quest 3/Includes/Game_Chex3.cfg +++ b/Build/Configurations/Other Games/Chex Quest 3/Includes/Game_Chex3.cfg @@ -1,28 +1,34 @@ // Default lump name for new map - defaultlumpname = "MAP01"; +defaultlumpname = "MAP01"; - // Decorate actors to include depending on actor game property - decorategames = "chex"; +// Decorate actors to include depending on actor game property +decorategames = "chex"; - // Skill levels - skills - { - include("Chex_misc.cfg", "skills"); - } +//mxd. Sky textures for vanilla maps +defaultskytextures +{ + SKY1 = "E1M1,E1M2,E1M3,E1M4,E1M5"; +} - // Door making - makedoortrack = "COMPSTA1"; +// Skill levels +skills +{ + include("Chex_misc.cfg", "skills"); +} - // Default thing filters - // (these are not required, just useful for new users) - /*thingsfilters - { - include("Doom_misc.cfg", "thingsfilters"); - }*/ +// Door making +makedoortrack = "COMPSTA1"; - // Default texture sets - // (these are not required, but useful for new users) - texturesets - { - include("Chex3_texturesets.cfg"); - } \ No newline at end of file +// Default thing filters +// (these are not required, just useful for new users) +/*thingsfilters +{ + include("Doom_misc.cfg", "thingsfilters"); +}*/ + +// Default texture sets +// (these are not required, but useful for new users) +texturesets +{ + include("Chex3_texturesets.cfg"); +} \ No newline at end of file diff --git a/Build/Configurations/Other Games/Chex Quest/Includes/Game_Chex.cfg b/Build/Configurations/Other Games/Chex Quest/Includes/Game_Chex.cfg index 21f5b1e..115af36 100644 --- a/Build/Configurations/Other Games/Chex Quest/Includes/Game_Chex.cfg +++ b/Build/Configurations/Other Games/Chex Quest/Includes/Game_Chex.cfg @@ -1,28 +1,34 @@ // Default lump name for new map - defaultlumpname = "MAP01"; +defaultlumpname = "MAP01"; - // Decorate actors to include depending on actor game property - decorategames = "chex"; +// Decorate actors to include depending on actor game property +decorategames = "chex"; - // Skill levels - skills - { - include("Chex_misc.cfg", "skills"); - } +//mxd. Sky textures for vanilla maps +defaultskytextures +{ + SKY1 = "E1M1,E1M2,E1M3,E1M4,E1M5"; +} - // Door making - makedoortrack = "COMPSTA1"; +// Skill levels +skills +{ + include("Chex_misc.cfg", "skills"); +} - // Default thing filters - // (these are not required, just useful for new users) - /*thingsfilters - { - include("Doom_misc.cfg", "thingsfilters"); - }*/ +// Door making +makedoortrack = "COMPSTA1"; - // Default texture sets - // (these are not required, but useful for new users) - texturesets - { - include("Chex_texturesets.cfg"); - } \ No newline at end of file +// Default thing filters +// (these are not required, just useful for new users) +/*thingsfilters +{ + include("Doom_misc.cfg", "thingsfilters"); +}*/ + +// Default texture sets +// (these are not required, but useful for new users) +texturesets +{ + include("Chex_texturesets.cfg"); +} \ No newline at end of file diff --git a/Build/Configurations/Other Games/Harmony/Includes/Game_Harmony.cfg b/Build/Configurations/Other Games/Harmony/Includes/Game_Harmony.cfg index ba8c7f2..654f1f2 100644 --- a/Build/Configurations/Other Games/Harmony/Includes/Game_Harmony.cfg +++ b/Build/Configurations/Other Games/Harmony/Includes/Game_Harmony.cfg @@ -1,28 +1,36 @@ // Default lump name for new map - defaultlumpname = "MAP01"; +defaultlumpname = "MAP01"; - // Decorate actors to include depending on actor game property - decorategames = "harmony"; // Doesn't actually exist, but used to prevent loading Doom actors when loading zdoom.pk3 +// Decorate actors to include depending on actor game property +decorategames = "harmony"; // Doesn't actually exist, but used to prevent loading Doom actors when loading zdoom.pk3 - // Skill levels - skills - { - include("Harmony_misc.cfg", "skills"); - } +//mxd. Sky textures for vanilla maps +defaultskytextures +{ + SKY1 = "MAP01,MAP02,MAP03,MAP04,MAP05,MAP06,MAP07,MAP08,MAP09,MAP10,MAP11"; + SKY2 = "MAP12,MAP13,MAP14,MAP15,MAP16,MAP17,MAP18,MAP19,MAP20"; + SKY3 = "MAP21,MAP22,MAP23,MAP24,MAP25,MAP26,MAP27,MAP28,MAP29,MAP30,MAP31,MAP32"; +} - // Door making - makedoortrack = "DOORTRAK"; +// Skill levels +skills +{ + include("Harmony_misc.cfg", "skills"); +} - // Default thing filters - // (these are not required, just useful for new users) - /*thingsfilters - { - include("Doom_misc.cfg", "thingsfilters"); - }*/ +// Door making +makedoortrack = "DOORTRAK"; - // Default texture sets - // (these are not required, but useful for new users) - texturesets - { - include("Harmony_texturesets.cfg"); - } \ No newline at end of file +// Default thing filters +// (these are not required, just useful for new users) +/*thingsfilters +{ + include("Doom_misc.cfg", "thingsfilters"); +}*/ + +// Default texture sets +// (these are not required, but useful for new users) +texturesets +{ + include("Harmony_texturesets.cfg"); +} \ No newline at end of file diff --git a/Build/Scripting/ZDoom_ACS.cfg b/Build/Scripting/ZDoom_ACS.cfg index 9753e4b..75acc13 100644 --- a/Build/Scripting/ZDoom_ACS.cfg +++ b/Build/Scripting/ZDoom_ACS.cfg @@ -121,7 +121,7 @@ keywords Death = "Script expression Death"; Default = "default:"; Delay = "void Delay(int tics)"; - Disconnect = "Disconnect script expression"; + Disconnect = "Script expression Disconnect"; Do = "do"; Door_Animated = "Door_Animated(tag, speed, delay, lock)"; Door_Close = "Door_Close(tag, speed, lighttag)"; @@ -261,7 +261,7 @@ keywords Light_Strobe = "Light_Strobe(tag, upper, lower, u-tics, l-tics)"; Light_StrobeDoom = "Light_StrobeDoom(tag, u-tics, l-tics)"; Lightning = "Script expression Lightning"; - LineAttack = "LineAttack(int tid, fixed angle, fixed pitch, int damage[, str pufftype = 'BulletPuff'[, str damagetype = 'None'[, fixed range = 2048[, int flags = 0]]]])\nFires a hitscan attack. If tid is 0, the activator of the script is the source of the attack."; + LineAttack = "LineAttack(int tid, fixed angle, fixed pitch, int damage[, str pufftype = 'BulletPuff'[, str damagetype = 'None'[, fixed range = 2048[, int flags = 0[, int pufftid = 0]]]]])\nFires a hitscan attack. If tid is 0, the activator of the script is the source of the attack."; Line_AlignCeiling = "Line_AlignCeiling(lineid, side)"; Line_AlignFloor = "Line_AlignFloor(lineid, side)"; Line_SetBlocking = "Line_SetBlocking(lineid, setflags, clearflags)"; @@ -390,6 +390,8 @@ keywords SetPlayerProperty = "SetPlayerProperty(who, set, which)"; SetPointer = "bool SetPointer(int assign_slot, int tid[, int pointer_selector[, int flags]])\nSet the value of one of the caller's stored pointers."; SetResultValue = "void SetResultValue(int value)"; + SetSectorDamage = "fixed SetSectorDamage(int tag, int amount, str damagetype, int interval, int leaky)"; + SetSectorTerrain = "fixed SetSectorTerrain(int tag, int plane, str terraintype)"; SetSkyScrollSpeed = "void SetSkyScrollSpeed(int sky, fixed skyspeed)\nChanges the scrolling speed of a sky.\nThis is useful in conjunction with ChangeSky.\nsky: either 1 or 2.\nskyspeed: the desired scrolling speed."; SetActorTeleFog = "void SetActorTeleFog(int tid, str telefogsrcclass, str telefogdestclass"; SetThingSpecial = "void SetThingSpecial(int tid, int special[, int arg0[, int arg1[, int arg2[, int arg3[, int arg4]]]]])\nSets the special for any things with the same TID.\nThis is similar to Thing_SetSpecial, except it can only be used from ACS,\nand it can set all of a thing's special arguments.\nIf tid is 0, then the activator is used."; @@ -547,11 +549,12 @@ constants APROP_Mass; APROP_MasterTID; APROP_MeleeRange; - APROP_NameTag; - APROP_NoTarget; - APROP_NoTrigger; + APROP_Nametag; + APROP_Notarget; + APROP_Notrigger; APROP_PainSound; APROP_Radius; + APROP_Reactiontime; APROP_RenderStyle; APROP_ScaleX; APROP_ScaleY; @@ -566,12 +569,12 @@ constants APROP_TracerTID; APROP_ViewHeight; APROP_Waterlevel; - ARMORINFO_CLASSNAME; - ARMORINFO_SAVEAMOUNT; ARMORINFO_ACTUALSAVEAMOUNT; - ARMORINFO_SAVEPERCENT; + ARMORINFO_CLASSNAME; ARMORINFO_MAXABSORB; ARMORINFO_MAXFULLABSORB; + ARMORINFO_SAVEAMOUNT; + ARMORINFO_SAVEPERCENT; ATTN_IDLE; ATTN_NONE; ATTN_NORM; @@ -590,6 +593,7 @@ constants BLOCKF_PROJECTILES; BLOCKF_RAILING; BLOCKF_SIGHT; + BLOCKF_SOUND; BLOCKF_USE; BT_ALTATTACK; BT_ATTACK; @@ -617,20 +621,19 @@ constants BT_USER4; BT_ZOOM; CARRY; - CHAN_AREA; + CHAN_5; + CHAN_6; + CHAN_7; CHAN_AUTO; CHAN_BODY; CHAN_ITEM; CHAN_LISTENERZ; - CHAN_LOOP; CHAN_MAYBE_LOCAL; CHAN_NOPAUSE; CHAN_UI; CHAN_VOICE; CHAN_WEAPON; - CHAN_5; - CHAN_6; - CHAN_7; + CHANGELEVEL_CHANGESKILL; CHANGELEVEL_KEEPFACING; CHANGELEVEL_NOINTERMISSION; CHANGELEVEL_NOMONSTERS; @@ -670,9 +673,27 @@ constants DAMAGE_NONPLAYERS; DAMAGE_PLAYERS; DAMAGE_SUBCLASSES_PROTECT; + DB_ORDER_ASC; + DB_ORDER_DESC; + EV_Char; + EV_KeyDown; + EV_KeyRepeat; + EV_KeyUp; + EV_LButtonDblClick; + EV_LButtonDown; + EV_LButtonUp; + EV_MButtonDblClick; + EV_MButtonDown; + EV_MButtonUp; + EV_MouseMove; + EV_RButtonDblClick; + EV_RButtonDown; + EV_RButtonUp; + EV_WheelDown; + EV_WheelUp; FALSE; - FHF_NORANDOMPUFFZ; FHF_NOIMPACTDECAL; + FHF_NORANDOMPUFFZ; FOGP_DENSITY; FOGP_OUTSIDEDENSITY; FOGP_SKYFOG; @@ -680,6 +701,45 @@ constants GAME_NET_DEATHMATCH; GAME_SINGLE_PLAYER; GAME_TITLE_MAP; + GK_ALERT; + GK_BACKSPACE; + GK_CESCAPE; + GK_DEL; + GK_DOWN; + GK_END; + GK_ESCAPE; + GK_F1; + GK_F10; + GK_F11; + GK_F12; + GK_F2; + GK_F3; + GK_F4; + GK_F5; + GK_F6; + GK_F7; + GK_F8; + GK_F9; + GK_FORMFEED; + GK_FREE1; + GK_FREE2; + GK_FREE3; + GK_HOME; + GK_LEFT; + GK_LINEFEED; + GK_PGDN; + GK_PGUP; + GK_RETURN; + GK_RIGHT; + GK_TAB; + GK_UP; + GK_VTAB; + GKM_ALT; + GKM_CTRL; + GKM_LBUTTON; + GKM_MBUTTON; + GKM_RBUTTON; + GKM_SHIFT; HUDMSG_ADDBLEND; HUDMSG_ALPHA; HUDMSG_COLORSTRING; @@ -733,66 +793,69 @@ constants MARINEWEAPON_RocketLauncher; MARINEWEAPON_Shotgun; MARINEWEAPON_SuperShotgun; - MF_SPECIAL; - MF_SOLID; - MF_SHOOTABLE; - MF_NOSECTOR; - MF_NOBLOCKMAP; MF_AMBUSH; - MF_JUSTHIT; - MF_JUSTATTACKED; - MF_SPAWNCEILING; - MF_NOGRAVITY; - MF_DROPOFF; - MF_PICKUP; - MF_NOCLIP; - MF_INCHASE; - MF_FLOAT; - MF_TELEPORT; - MF_MISSILE; - MF_DROPPED; - MF_SHADOW; - MF_NOBLOOD; MF_CORPSE; - MF_INFLOAT; - MF_INBOUNCE; - MF_COUNTKILL; MF_COUNTITEM; - MF_SKULLFLY; - MF_NOTDMATCH; - MF_SPAWNSOUNDSOURCE; + MF_COUNTKILL; + MF_DROPOFF; + MF_DROPPED; + MF_FLOAT; MF_FRIENDLY; - MF_UNMORPHED; - MF_NOLIFTDROP; - MF_STEALTH; MF_ICECORPSE; - ML_BLOCKING; - ML_BLOCKMONSTERS; - ML_TWOSIDED; - ML_DONTPEGTOP; - ML_DONTPEGBOTTOM; - ML_SECRET; - ML_SOUNDBLOCK; - ML_DONTDRAW; - ML_MAPPED; - ML_REPEAT_SPECIAL; + MF_INBOUNCE; + MF_INCHASE; + MF_INFLOAT; + MF_JUSTATTACKED; + MF_JUSTHIT; + MF_MISSILE; + MF_NOBLOCKMAP; + MF_NOBLOOD; + MF_NOCLIP; + MF_NOGRAVITY; + MF_NOLIFTDROP; + MF_NOSECTOR; + MF_NOTDMATCH; + MF_PICKUP; + MF_SHADOW; + MF_SHOOTABLE; + MF_SKULLFLY; + MF_SOLID; + MF_SPAWNCEILING; + MF_SPAWNSOUNDSOURCE; + MF_SPECIAL; + MF_STEALTH; + MF_TELEPORT; + MF_UNMORPHED; + ML_3DMIDTEX; ML_ADDTRANS; - ML_MONSTERSCANACTIVATE; + ML_BLOCK_FLOATERS; ML_BLOCK_PLAYERS; ML_BLOCKEVERYTHING; - ML_ZONEBOUNDARY; - ML_RAILING; - ML_BLOCK_FLOATERS; - ML_CLIP_MIDTEX; - ML_WRAP_MIDTEX; - ML_3DMIDTEX; - ML_CHECKSWITCHRANGE; - ML_FIRSTSIDEONLY; - ML_BLOCKPROJECTILE; - ML_BLOCKUSE; - ML_BLOCKSIGHT; ML_BLOCKHITSCAN; + ML_BLOCKING; + ML_BLOCKMONSTERS; + ML_BLOCKPROJECTILE; + ML_BLOCKSIGHT; + ML_BLOCKUSE; + ML_CHECKSWITCHRANGE; + ML_CLIP_MIDTEX; + ML_DONTDRAW; + ML_DONTPEGBOTTOM; + ML_DONTPEGTOP; + ML_FIRSTSIDEONLY; + ML_MAPPED; + ML_MONSTERSCANACTIVATE; + ML_RAILING; + ML_REPEAT_SPECIAL; + ML_SECRET; + ML_SOUNDBLOCK; + ML_TWOSIDED; + ML_WRAP_MIDTEX; + ML_ZONEBOUNDARY; + MOD_BARREL; + MOD_BFG_BOOM; MOD_BFG_SPLASH; + MOD_CHAINSAW; MOD_CRUSH; MOD_DISINTEGRATE; MOD_ELECTRIC; @@ -801,9 +864,14 @@ constants MOD_HIT; MOD_ICE; MOD_LAVA; + MOD_PLASMARIFLE; MOD_POISON; + MOD_R_SPLASH; MOD_RAILGUN; + MOD_ROCKET; MOD_SLIME; + MOD_SPLASH; + MOD_SSHOTGUN; MOD_SUICIDE; MOD_TELEFRAG; MOD_UNKNOWN; @@ -835,6 +903,7 @@ constants MRF_WHENINVULNERABLE; NO; NO_CHANGE; + NO_TEAM; NOT_BOTTOM; NOT_CEILING; NOT_FLOOR; @@ -875,11 +944,11 @@ constants PTROP_NOSAFEGUARDS; PTROP_UNSAFEMASTER; PTROP_UNSAFETARGET; + QF_FULLINTENSITY; + QF_MAX; QF_RELATIVE; QF_SCALEDOWN; QF_SCALEUP; - QF_MAX; - QF_FULLINTENSITY; QF_WAVE; SCROLL; SCROLL_AND_CARRY; @@ -900,21 +969,31 @@ constants SKILL_NORMAL; SKILL_VERY_EASY; SKILL_VERY_HARD; - SPAC_None; - SPAC_Cross; - SPAC_Use; - SPAC_MCross; - SPAC_Impact; - SPAC_Push; - SPAC_PCross; - SPAC_UseThrough; + SOUND_Active; + SOUND_Attack; + SOUND_Bounce; + SOUND_CrushPain; + SOUND_Death; + SOUND_Howl; + SOUND_Pain; + SOUND_See; + SOUND_Use; + SOUND_WallBounce; SPAC_AnyCross; - SPAC_MUse; + SPAC_Cross; + SPAC_Impact; + SPAC_MCross; SPAC_MPush; + SPAC_MUse; + SPAC_None; + SPAC_PCross; + SPAC_Push; + SPAC_Use; SPAC_UseBack; + SPAC_UseThrough; STYLE_Add; - STYLE_AddStencil; STYLE_AddShaded; + STYLE_AddStencil; STYLE_Fuzzy; STYLE_None; STYLE_Normal; @@ -1242,6 +1321,8 @@ constants T_YELLOWKEYCARD; T_YELLOWSKULLKEY; T_ZOMBIE; + TEAM_BLUE; + TEAM_RED; TEXFLAG_ADDOFFSET; TEXFLAG_BOTTOM; TEXFLAG_MIDDLE; @@ -1249,22 +1330,41 @@ constants TEXTURE_BOTTOM; TEXTURE_MIDDLE; TEXTURE_TOP; - WARPF_ABSOLUTEOFFSET; + TPROP_Assister; + TPROP_Carrier; + TPROP_DeathCount; + TPROP_FragCount; + TPROP_IsValid; + TPROP_LoserTheme; + TPROP_Name; + TPROP_NumLivePlayers; + TPROP_NumPlayers; + TPROP_PlayerStartNum; + TPROP_PointCount; + TPROP_ReturnTics; + TPROP_Score; + TPROP_Spread; + TPROP_TeamItem; + TPROP_TextColor; + TPROP_WinCount; + TPROP_WinnerTheme; + TRANSLATION_ICE; + TRUE; WARPF_ABSOLUTEANGLE; - WARPF_USECALLERANGLE; - WARPF_NOCHECKPOSITION; - WARPF_INTERPOLATE; - WARPF_WARPINTERPOLATION; - WARPF_COPYINTERPOLATION; - WARPF_STOP; - WARPF_TOFLOOR; - WARPF_TESTONLY; + WARPF_ABSOLUTEOFFSET; WARPF_ABSOLUTEPOSITION; WARPF_BOB; - WARPF_MOVEPTR; - WARPF_USEPTR; - WARPF_COPYVELOCITY; + WARPF_COPYINTERPOLATION; WARPF_COPYPITCH; - TRUE; + WARPF_COPYVELOCITY; + WARPF_INTERPOLATE; + WARPF_MOVEPTR; + WARPF_NOCHECKPOSITION; + WARPF_STOP; + WARPF_TESTONLY; + WARPF_TOFLOOR; + WARPF_USECALLERANGLE; + WARPF_USEPTR; + WARPF_WARPINTERPOLATION; YES; } \ No newline at end of file diff --git a/Build/Textures/MissingSky3D.png b/Build/Textures/MissingSky3D.png new file mode 100644 index 0000000000000000000000000000000000000000..cb86d71e31c28cf540cae3c970caf04c3b0a6304 GIT binary patch literal 24951 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

Py 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 literal 0 HcmV?d00001 diff --git a/Help/gc_basicsettings.html b/Help/gc_basicsettings.html index 528c64f..6a6904c 100644 --- a/Help/gc_basicsettings.html +++ b/Help/gc_basicsettings.html @@ -23,10 +23,11 @@
game (string)
The name that is displayed in Doom Buider for your Game Configuration.
+ Default value is "<unnamed game>".

enabledbydefault (boolean) - GZDB only.
This game configuration is available by default. You can enable and disable game configurations using Game Configurations window.
- The default value is false.
+ Default value is false.

actionspecialhelp (string) - GZDB only.
The URL used to display action special help. "%K" wildcard is replaced by id property defined in action definition.
@@ -38,7 +39,7 @@ basegame (integer) [0 .. 4] - GZDB only.
Indicates which game the current configuration is based on. Used to load game-specific GLDEFS lumps (DOOMDEFS, HTICDEFS, HEXNDEFS or STRFDEFS).
Possible values: 1 (DOOM), 2 (HERETIC), 3 (HEXEN) or 4 (STRIFE).
- The default value is 0 (don't load game-specific lumps).
+ Default value is 0 (don't load game-specific lumps).

engine (string)
@@ -52,7 +53,7 @@
testshortpaths (boolean)
Set to true to use MSDOS 8.3 format paths and filenames by default. The user can still change this in the Game Configurations window.
- The default value is false.
+ Default value is false.

defaultsavecompiler (string)
Name of the Nodebuilder Compiler Configuration structure to use as the default settings for the compiler that is used when saving the map. The user can still change this in the Game Configurations window.
@@ -67,7 +68,7 @@ This defines the skill options the user has available with this game engine/project. The settings in this structure are expected to be numbers with string values (the descriptive name for the skill level).

Example: -

+  
 skills
 {
 	1 = "I'm too young to die";
@@ -79,7 +80,8 @@ skills
 

linetagindicatesectors (boolean)
- When true, Doom Builder will highlight sectors associated with the same tag number when a line is highlighted. This is only really useful for Doom format maps, because Hexen format and UDMF format has no single tag on linedefs (in those formats, the arguments of the linedef's action can be tags, which also works to highlight sectors).
The default is false.
+ When true, Doom Builder will highlight sectors associated with the same tag number when a line is highlighted. This is only really useful for Doom format maps, because Hexen format and UDMF format has no single tag on linedefs (in those formats, the arguments of the linedef's action can be tags, which also works to highlight sectors).
+Default value is false.

singlesidedflag (integer or string)
This lets Doom Builder know the linedef flag that indicates a line with only one side. Doom Builder will set this flag value on a linedef when it changes a line to become single sided and removes the flag from a linedef when it becomes double sided. Plugins can also use this information to perform operations on linedefs. For map formats that use numeric flags (Doom and Hexen) this must be an integer flag value. For map formats that use named flags (UDMF), this must be a string indicating the name of the flag.
@@ -91,22 +93,28 @@ skills This lets Doom Builder know the linedef flag that indicates a line which blocks players and monsters. Doom Builder uses this to give the line a special color and plugins can use this information to perform operations related to blocking sound lines. For map formats that use numeric flags (Doom and Hexen) this must be an integer specifying the flag value of the Impassable flag. For map formats that use named flags (UDMF), this must be a string indicating the name of the Impassable flag.

defaultwalltexture (string) - GZDB only.
- Name of a texture to use on sidedefs when creating a new sector.
+ Name of a texture to use on sidedefs when creating a new sector.
+"STARTAN".

defaultfloortexture (string) - GZDB only.
- Name of a flat to use on the floor when creating a new sector.
+ Name of a flat to use on the floor when creating a new sector.
+ Default value is "FLOOR0_1".

defaultceilingtexture (string) - GZDB only.
- Name of a flat to use on the ceiling when creating a new sector.
+ Name of a flat to use on the ceiling when creating a new sector.
+ Default value is "CEIL1_1".

makedoortrack (string)
Name of a texture to use on the walls when making a door.
+ Default value is "-" (no texture).

makedoordoor (string) - GZDB only.
Name of a texture to use as the door texture when making a door.
+ Default value is "-" (no texture).

makedoorceil (string) - GZDB only.
Name of a texture to use as the door's ceiling texture when making a door.
+ Default value is "-" (no texture).

makedooraction (integer)
Linedef action number to put on the lines when making a door.
@@ -115,13 +123,28 @@ skills Arguments for the linedef action number to put on the lines when making a door.

doomlightlevels (boolean)
- Set this to false to use linear lighting in Doom Builder. Normally Doom Builder uses a simulation of Doom's light levels.
Default value is true.
+ Set this to false to use linear lighting in Doom Builder. Normally Doom Builder uses a simulation of Doom's light levels. +
Default value is true.

start3dmode (integer)
Thing type number that Doom Builder will use to keep your Visual Mode camera position stored in the map. Doom Builder will place a single thing of this type in your map and move it along as you move in Visual Mode.

skyflatname (string)
- Name of the flat that is interpreted as sky (meaning there is no ceiling). Doom Builder and plugins can use this information for various purposes.
+ Name of the flat that is interpreted as sky (meaning there is no ceiling). Doom Builder and plugins can use this information for various purposes. +
Default value is "F_SKY1".
+
+ defaultskytextures (structure) - GZDB only.
+ Defines the relationship between map names and sky texture names used by vanilla maps.
+
+ Example: +
+defaultskytextures
+{
+	SKY1 = "MAP01,MAP02,MAP03,MAP04,MAP05";
+	SKY2 = "MAP12,MAP13,MAP14,MAP15,MAP16";
+	SKY3 = "MAP21,MAP22,MAP23,MAP24,MAP25";
+}
+

longtexturenames (boolean) - GZDB only.
Enables support for long (> 8 chars) texture names. This is used by GZDoom Builder to limit the input fields in the user interface and to check the validity of texture names in resources. This setting should only be enabled for UDMF game configurations. Enabling this setting will make maps incompatible with Doom Builder 2 and can lead to problems in Slade 3 This does NOT determine the actual limitation on the texture names in the map file format.
Default value is false.
diff --git a/Help/gc_resourcesettings.html b/Help/gc_resourcesettings.html index 9852425..9646f8a 100644 --- a/Help/gc_resourcesettings.html +++ b/Help/gc_resourcesettings.html @@ -21,7 +21,7 @@ decorategames (string)
Fill this to the game names to support DECORATE actors from. Only the DECORATE actors who's game name is in this string will be loaded. If this setting is not set, DECORATE lumps are not loaded.

- Example: + Example:
 decorategames = "heretic raven";
 
@@ -41,7 +41,7 @@ decorategames = "heretic raven"; textures (structure)
This lists the marker lump names that indicate the begin and end of a list of textures that Doom Builder should load. There must be a separate structure for each range, for which the structure name doesn't matter. The range must have a 'start' setting and an 'end' setting of which the values must be the names of the start and end lumps (strings). Please note that PNAMES, TEXTURE1 and TEXTURE2 lumps do not need to be in the game configuration, they are always loaded when available.

- Example: + Example:
 textures
 {
@@ -56,7 +56,7 @@ textures
 		patches (structure)
This lists the marker lump names that indicate the begin and end of a list of patches that Doom Builder should load. There must be a separate structure for each range, for which the structure name doesn't matter. The range must have a 'start' setting and an 'end' setting of which the values must be the names of the start and end lumps (strings). Note that Doom Builder does not load all patches, only those that are used by the textures.

- Example: + Example:
 patches
 {
@@ -77,7 +77,7 @@ patches
 		sprites (structure)
This lists the marker lump names that indicate the begin and end of a list of sprites that Doom Builder should load. There must be a separate structure for each range, for which the structure name doesn't matter. The range must have a 'start' setting and an 'end' setting of which the values must be the names of the start and end lumps (strings). Note that Doom Builder does not load all sprites, only those that are used by the things.

- Example: + Example:
 sprites
 {
@@ -92,7 +92,7 @@ sprites
 		flats (structure)
This lists the marker lump names that indicate the begin and end of a list of flats that Doom Builder should load. There must be a separate structure for each range, for which the structure name doesn't matter. The range must have a 'start' setting and an 'end' setting of which the values must be the names of the start and end lumps (strings).

- Example: + Example:
 flats
 {
@@ -107,7 +107,7 @@ flats
 		colormaps (structure)
This lists the marker lump names that indicate the begin and end of a list of colormaps that Doom Builder should load. There must be a separate structure for each range, for which the structure name doesn't matter. The range must have a 'start' setting and an 'end' setting of which the values must be the names of the start and end lumps (strings).

- Example: + Example:
 colormaps
 {
diff --git a/Source/Core/Builder.csproj b/Source/Core/Builder.csproj
index 078fc80..baa6a41 100644
--- a/Source/Core/Builder.csproj
+++ b/Source/Core/Builder.csproj
@@ -46,8 +46,9 @@
     ..\..\Build\Builder.xml
     
     
-    3
+    4
     true
+    1591
   
   
     true
@@ -502,8 +503,8 @@
     
     
     
-    
-      True
+	
+	  True
       True
       Resources.resx
     
@@ -583,7 +584,7 @@
     
       Designer
       ResXFileCodeGenerator
-      Resources.Designer.cs
+	  Resources.Designer.cs
     
   
   
@@ -875,6 +876,7 @@
     
     
     
+    
     
     
     
@@ -1132,10 +1134,12 @@
     
     
     
+    
     
     
     
     
+    
     
     
     
diff --git a/Source/Core/Config/GameConfiguration.cs b/Source/Core/Config/GameConfiguration.cs
index 37041eb..aa237a6 100644
--- a/Source/Core/Config/GameConfiguration.cs
+++ b/Source/Core/Config/GameConfiguration.cs
@@ -77,7 +77,8 @@ namespace CodeImp.DoomBuilder.Config
 		private readonly bool linetagindicatesectors;
 		private readonly string decorategames;
 		private string skyflatname;
-		private readonly int maxtexturenamelength;
+        private Dictionary defaultskytextures; //mxd 
+        private readonly int maxtexturenamelength;
 		private readonly bool longtexturenames; //mxd
 		private readonly int leftboundary;
 		private readonly int rightboundary;
@@ -194,7 +195,8 @@ namespace CodeImp.DoomBuilder.Config
 		public bool LineTagIndicatesSectors { get { return linetagindicatesectors ; } }
 		public string DecorateGames { get { return decorategames; } }
 		public string SkyFlatName { get { return skyflatname; } internal set { skyflatname = value; } } //mxd. Added setter
-		public int MaxTextureNameLength { get { return maxtexturenamelength; } }
+        public Dictionary DefaultSkyTextures { get { return defaultskytextures; } } //mxd
+        public int MaxTextureNameLength { get { return maxtexturenamelength; } }
 		public bool UseLongTextureNames { get { return longtexturenames; } } //mxd
 		public int LeftBoundary { get { return leftboundary; } }
 		public int RightBoundary { get { return rightboundary; } }
@@ -309,9 +311,10 @@ namespace CodeImp.DoomBuilder.Config
 			this.linedefrenderstyles = new Dictionary(StringComparer.Ordinal); //mxd
 			this.sectorrenderstyles = new Dictionary(StringComparer.Ordinal); //mxd
 			this.thingrenderstyles = new Dictionary(StringComparer.Ordinal); //mxd
-			
-			// Read general settings
-			configname = cfg.ReadSetting("game", "");
+            this.defaultskytextures = new Dictionary(StringComparer.OrdinalIgnoreCase); //mxd
+
+            // Read general settings
+            configname = cfg.ReadSetting("game", "");
 
 			//mxd
 			int gt = (cfg.ReadSetting("basegame", (int)GameType.UNKNOWN));
@@ -426,8 +429,11 @@ namespace CodeImp.DoomBuilder.Config
 			LoadTextureSets();
 			LoadThingFilters();
 
-			// Make door flags
-			LoadMakeDoorFlags();
+            //mxd. Vanilla sky textures
+            LoadDefaultSkies();
+
+            // Make door flags
+            LoadMakeDoorFlags();
 		}
 
 		// Destructor
@@ -898,8 +904,42 @@ namespace CodeImp.DoomBuilder.Config
 			}
 		}
 
-		//mxd
-		private void LoadStringDictionary(Dictionary target, string settingname) 
+        //mxd
+        private void LoadDefaultSkies()
+        {
+            IDictionary dic = cfg.ReadSetting("defaultskytextures", new Hashtable());
+            char[] separator = new[] { ',' };
+            foreach (DictionaryEntry de in dic)
+            {
+                string skytex = de.Key.ToString();
+                if (defaultskytextures.ContainsKey(skytex))
+                {
+                    General.ErrorLogger.Add(ErrorType.Warning, "Sky texture \"" + skytex + "\" is double-defined in the current game configuration!");
+                    continue;
+                }
+
+                string[] maps = de.Value.ToString().Split(separator, StringSplitOptions.RemoveEmptyEntries);
+                if (maps.Length == 0)
+                {
+                    General.ErrorLogger.Add(ErrorType.Warning, "Sky texture \"" + skytex + "\" has no map names defined in the current game configuration!");
+                    continue;
+                }
+
+                foreach (string map in maps)
+                {
+                    if (defaultskytextures.ContainsKey(map))
+                    {
+                        General.ErrorLogger.Add(ErrorType.Warning, "Map \"" + map + "\" is double-defined in the \"DefaultSkyTextures\" block of current game configuration!");
+                        continue;
+                    }
+
+                    defaultskytextures[map] = skytex;
+                }
+            }
+        }
+
+        //mxd
+        private void LoadStringDictionary(Dictionary target, string settingname) 
 		{
 			IDictionary dic = cfg.ReadSetting(settingname, new Hashtable());
 			foreach(DictionaryEntry de in dic)
diff --git a/Source/Core/Config/ProgramConfiguration.cs b/Source/Core/Config/ProgramConfiguration.cs
index d507e07..083719b 100644
--- a/Source/Core/Config/ProgramConfiguration.cs
+++ b/Source/Core/Config/ProgramConfiguration.cs
@@ -98,7 +98,8 @@ namespace CodeImp.DoomBuilder.Config
 		private ModelRenderMode gzDrawModelsMode;
 		private LightRenderMode gzDrawLightsMode;
 		private bool gzDrawFog;
-		private bool gzToolbarGZDoom;
+        private bool gzDrawSky;
+        private bool gzToolbarGZDoom;
 		private bool gzSynchCameras;
 		private bool gzShowEventLines;
 		private bool gzOldHighlightMode;
@@ -112,6 +113,7 @@ namespace CodeImp.DoomBuilder.Config
 		private string lastUsedConfigName;
 		private string lastUsedMapFolder;
 		private bool gzMarkExtraFloors;
+        private bool gzdoomrenderingeffects = true; //mxd
         private bool drawFullCrosshair;
 		private int maxRecentFiles;
 		private bool autoClearSideTextures;
@@ -192,7 +194,8 @@ namespace CodeImp.DoomBuilder.Config
 		public ModelRenderMode GZDrawModelsMode { get { return gzDrawModelsMode; } internal set { gzDrawModelsMode = value; } }
 		public LightRenderMode GZDrawLightsMode { get { return gzDrawLightsMode; } internal set { gzDrawLightsMode = value; } }
 		public bool GZDrawFog { get { return gzDrawFog; } internal set { gzDrawFog = value; } }
-		public bool GZToolbarGZDoom { get { return gzToolbarGZDoom; } internal set { gzToolbarGZDoom = value; } }
+        public bool GZDrawSky { get { return gzDrawSky; } internal set { gzDrawSky = value; } }
+        public bool GZToolbarGZDoom { get { return gzToolbarGZDoom; } internal set { gzToolbarGZDoom = value; } }
 		public bool GZSynchCameras { get { return gzSynchCameras; } internal set { gzSynchCameras = value; } }
 		public bool GZShowEventLines { get { return gzShowEventLines; } internal set { gzShowEventLines = value; } }
 		public bool GZOldHighlightMode { get { return gzOldHighlightMode; } internal set { gzOldHighlightMode = value; } }
@@ -206,6 +209,7 @@ namespace CodeImp.DoomBuilder.Config
 		public string LastUsedConfigName { get { return lastUsedConfigName; } internal set { lastUsedConfigName = value; } }
 		public string LastUsedMapFolder { get { return lastUsedMapFolder; } internal set { lastUsedMapFolder = value; } }
 		public bool GZMarkExtraFloors { get { return gzMarkExtraFloors; } internal set { gzMarkExtraFloors = value; } }
+        public bool GZDoomRenderingEffects { get { return gzdoomrenderingeffects; } set { gzdoomrenderingeffects = value; } } //mxd
         public bool DrawFullCrosshair { get { return drawFullCrosshair; } internal set { drawFullCrosshair = value; } }
         public int MaxRecentFiles { get { return maxRecentFiles; } internal set { maxRecentFiles = General.Clamp(value, 8, 25); } }
 		public bool AutoClearSidedefTextures { get { return autoClearSideTextures; } internal set { autoClearSideTextures = value; } }
@@ -309,7 +313,8 @@ namespace CodeImp.DoomBuilder.Config
 				gzDrawModelsMode = (ModelRenderMode)cfg.ReadSetting("gzdrawmodels", (int)ModelRenderMode.ALL);
 				gzDrawLightsMode = (LightRenderMode)cfg.ReadSetting("gzdrawlights", (int)LightRenderMode.ALL);
 				gzDrawFog = cfg.ReadSetting("gzdrawfog", false);
-				gzToolbarGZDoom = cfg.ReadSetting("gztoolbargzdoom", true);
+                gzDrawSky = cfg.ReadSetting("gzdrawsky", true);
+                gzToolbarGZDoom = cfg.ReadSetting("gztoolbargzdoom", true);
 				gzSynchCameras = cfg.ReadSetting("gzsynchcameras", true);
 				gzShowEventLines = cfg.ReadSetting("gzshoweventlines", true);
 				gzOldHighlightMode = cfg.ReadSetting("gzoldhighlightmode", false);
@@ -408,7 +413,8 @@ namespace CodeImp.DoomBuilder.Config
 			cfg.WriteSetting("gzdrawmodels", (int)gzDrawModelsMode);
 			cfg.WriteSetting("gzdrawlights", (int)gzDrawLightsMode);
 			cfg.WriteSetting("gzdrawfog", gzDrawFog);
-			cfg.WriteSetting("gzsynchcameras", gzSynchCameras);
+            cfg.WriteSetting("gzdrawsky", gzDrawSky);
+            cfg.WriteSetting("gzsynchcameras", gzSynchCameras);
 			cfg.WriteSetting("gzshoweventlines", gzShowEventLines);
 			cfg.WriteSetting("gzoldhighlightmode", gzOldHighlightMode);
 			cfg.WriteSetting("gztoolbargzdoom", gzToolbarGZDoom);
diff --git a/Source/Core/Controls/LinedefInfoPanel.cs b/Source/Core/Controls/LinedefInfoPanel.cs
index f06f8ed..067fc65 100644
--- a/Source/Core/Controls/LinedefInfoPanel.cs
+++ b/Source/Core/Controls/LinedefInfoPanel.cs
@@ -299,7 +299,17 @@ namespace CodeImp.DoomBuilder.Controls
 
 					//mxd. Sector index
 					frontpanel.Text += ". Sector " + l.Front.Sector.Index + " ";
-				}
+
+                    //visibility
+                    frontTopUDMFOffsetLabel.Visible = false;
+                    frontTopUDMFScaleLabel.Visible = false;
+
+                    frontMidUDMFOffsetLabel.Visible = false;
+                    frontMidUDMFScaleLabel.Visible = false;
+
+                    frontBottomUDMFOffsetLabel.Visible = false;
+                    frontBottomUDMFScaleLabel.Visible = false;
+                }
 
 				//mxd. Set texture names, update panel sizes
 				UpdateTexturePanel(panelFrontTop, l.Front.HighTexture, fronthighname, labelTextureFrontTop,
diff --git a/Source/Core/Controls/ScintillaControl.cs b/Source/Core/Controls/ScintillaControl.cs
index 67571bf..63208da 100644
--- a/Source/Core/Controls/ScintillaControl.cs
+++ b/Source/Core/Controls/ScintillaControl.cs
@@ -134,11 +134,7 @@ namespace CodeImp.DoomBuilder.Controls
 		// This ignores key combinations so that they are passed
 		// on to the other controls on the parent form
 		private readonly Dictionary ignoredkeys;
-		
-		// States
-		private ScriptMarginType indexmargintype;
-		private ScriptIndicatorStyle indexindicatorstyle;
-		
+				
 		#endregion
 
 		#region ================== Properties
@@ -162,16 +158,6 @@ namespace CodeImp.DoomBuilder.Controls
 			set { EOLMode = (int)value; }
 		}
 
-		/// 
-		/// The type of a margin.
-		/// 
-		public ScriptMarginType MarginType { get { return indexmargintype; } }
-
-		/// 
-		/// The type of a margin.
-		/// 
-		public ScriptIndicatorStyle IndicatorStyle { get { return indexindicatorstyle; } }
-
 		/// 
 		/// Are there any redoable actions in the undo history?
 		/// 
diff --git a/Source/Core/Data/DataManager.cs b/Source/Core/Data/DataManager.cs
index 13bb0b3..5f2d23b 100644
--- a/Source/Core/Data/DataManager.cs
+++ b/Source/Core/Data/DataManager.cs
@@ -18,6 +18,9 @@
 
 using System;
 using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Drawing.Imaging;
 using System.IO;
 using System.Threading;
 using System.Windows.Forms;
@@ -29,6 +32,8 @@ using CodeImp.DoomBuilder.IO;
 using CodeImp.DoomBuilder.Map;
 using CodeImp.DoomBuilder.Windows;
 using CodeImp.DoomBuilder.ZDoom;
+using SlimDX;
+using SlimDX.Direct3D9;
 
 #endregion
 
@@ -70,7 +75,8 @@ namespace CodeImp.DoomBuilder.Data
 		private MapInfo mapinfo;
 		private Dictionary> reverbs; // 
 		private Dictionary glowingflats; // Texture name hash, Glowing Flat Data
-		private List soundsequences;
+        private Dictionary skyboxes;
+        private List soundsequences;
 		
 		// Background loading
 		private Queue imageque;
@@ -92,8 +98,11 @@ namespace CodeImp.DoomBuilder.Data
 		private ImageData whitetexture;
 		private ImageData blacktexture; //mxd
 
-		//mxd. Comment icons
-		private ImageData[] commenttextures;
+        //mxd. Sky textures
+        private CubeTexture skybox; // GZDoom skybox
+
+        //mxd. Comment icons
+        private ImageData[] commenttextures;
 		
 		// Used images
 		private Dictionary usedtextures; //mxd
@@ -139,7 +148,8 @@ namespace CodeImp.DoomBuilder.Data
 		public ImageData WhiteTexture { get { return whitetexture; } }
 		public ImageData BlackTexture { get { return blacktexture; } } //mxd
 		public ImageData[] CommentTextures { get { return commenttextures; } } //mxd
-		public List ThingCategories { get { return thingcategories; } }
+        internal CubeTexture SkyBox { get { return skybox; } } //mxd
+        public List ThingCategories { get { return thingcategories; } }
 		public ICollection ThingTypes { get { return thingtypes.Values; } }
 		public DecorateParser Decorate { get { return decorate; } }
 		internal ICollection TextureSets { get { return texturesets; } }
@@ -169,9 +179,11 @@ namespace CodeImp.DoomBuilder.Data
 			//mxd.
 			modeldefentries = new Dictionary();
 			gldefsentries = new Dictionary();
-			reverbs = new Dictionary>();
-			glowingflats = new Dictionary();
-			soundsequences = new List();
+            reverbs = new Dictionary>(StringComparer.Ordinal);
+            glowingflats = new Dictionary();
+            skyboxes = new Dictionary(StringComparer.Ordinal);
+
+            soundsequences = new List();
 
 			// Load special images (mxd: the rest is loaded in LoadInternalTextures())
 			whitetexture = new ResourceImage("CodeImp.DoomBuilder.Resources.White.png") { UseColorCorrection = false };
@@ -224,8 +236,17 @@ namespace CodeImp.DoomBuilder.Data
 				blacktexture = null; //mxd
 				unknownimage.Dispose(); //mxd
 				unknownimage = null; //mxd
-				foreach(ImageData i in commenttextures) i.Dispose(); //mxd
-				commenttextures = null;
+                for (int i = 0; i < commenttextures.Length; i++) //mxd
+                {
+                    commenttextures[i].Dispose();
+                    commenttextures[i] = null;
+                }
+                commenttextures = null;
+                if (skybox != null) //mxd
+                {
+                    skybox.Dispose();
+                    skybox = null;
+                }
 				
 				// Done
 				isdisposed = true;
@@ -251,8 +272,8 @@ namespace CodeImp.DoomBuilder.Data
 			Load(all);
 		}
 
-		// This loads all data resources
-		internal void Load(DataLocationList locations)
+        // This loads all data resources
+        private void Load(DataLocationList locations)
 		{
 			Dictionary texturesonly = new Dictionary();
 			Dictionary colormapsonly = new Dictionary();
@@ -474,17 +495,21 @@ namespace CodeImp.DoomBuilder.Data
 				// Add to all
 				alltextures.AddFlat(img.Value);
 			}
-			
-			// Start background loading
-			StartBackgroundLoader();
+
+            //mxd. Create skybox texture(s)
+            SetupSkybox();
+
+            // Start background loading
+            StartBackgroundLoader();
 			
 			// Output info
 			General.WriteLogLine("Loaded " + texcount + " textures, " + flatcount + " flats, " + 
 				colormapcount + " colormaps, " + spritecount + " sprites, " + 
 				thingcount + " decorate things, " + modeldefentries.Count + " model/voxel deinitions, " + 
-				gldefsentries.Count + " dynamic light definitions, " + 
-				glowingflats.Count + " glowing flat definitions, " + reverbs.Count + " sound environment definitions");
-		}
+				gldefsentries.Count + " dynamic light definitions, " +
+                glowingflats.Count + " glowing flat definitions, " + skyboxes.Count + " skybox definitions, " +
+                reverbs.Count + " sound environment definitions");
+        }
 		
 		// This unloads all data
 		private void Unload()
@@ -1730,20 +1755,18 @@ namespace CodeImp.DoomBuilder.Data
 		//mxd. This creates  dictionary. Should be called after all DECORATE actors are parsed
 		private Dictionary CreateActorsByClassList() 
 		{
-			Dictionary actors = new Dictionary(StringComparer.Ordinal);
-			if(string.IsNullOrEmpty(General.Map.Config.DecorateGames)) return actors;
+            Dictionary actors = new Dictionary(StringComparer.OrdinalIgnoreCase);
+            if (string.IsNullOrEmpty(General.Map.Config.DecorateGames)) return actors;
 
 			//read our new shiny ClassNames for default game things
 			foreach(KeyValuePair ti in thingtypes) 
 			{
 				if(!string.IsNullOrEmpty(ti.Value.ClassName))
 				{
-					string classname = ti.Value.ClassName.ToLowerInvariant();
-
-					if(actors.ContainsKey(classname) && actors[classname] != ti.Key)
-						General.ErrorLogger.Add(ErrorType.Warning, "actor '" + ti.Value.ClassName + "' has several editor numbers! Only the last one (" + ti.Key + ") will be used.");
-					actors[classname] = ti.Key;
-				}
+                    if (actors.ContainsKey(ti.Value.ClassName) && actors[ti.Value.ClassName] != ti.Key)
+                        General.ErrorLogger.Add(ErrorType.Warning, "actor '" + ti.Value.ClassName + "' has several editor numbers! Only the last one (" + ti.Key + ") will be used.");
+                    actors[ti.Value.ClassName] = ti.Key;
+                }
 			}
 
 			if(actors.Count == 0) 
@@ -1772,8 +1795,11 @@ 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") 
+            // Rebuild skybox texture
+            SetupSkybox();
+
+            // Rebuild geometry if in Visual mode
+            if (General.Editing.Mode != null && General.Editing.Mode.GetType().Name == "BaseVisualMode") 
 			{
 				General.Editing.Mode.OnReloadResources();
 			}
@@ -1825,9 +1851,9 @@ namespace CodeImp.DoomBuilder.Data
 				Dictionary streams = dr.GetModeldefData();
 				foreach(KeyValuePair group in streams) 
 				{
-					// Parse the data
-					if(parser.Parse(group.Value, currentreader.Location.location + "\\" + group.Key, true)) 
-					{
+                    // Parse the data
+                    if(parser.Parse(group.Value, Path.Combine(currentreader.Location.location, group.Key), true))
+                    {
 						foreach(KeyValuePair g in parser.Entries) 
 						{
 							if(modeldefentriesbyname.ContainsKey(g.Key)) 
@@ -1952,10 +1978,10 @@ namespace CodeImp.DoomBuilder.Data
 		//mxd. This parses gldefs. Should be called after all DECORATE actors are parsed
 		private void LoadGldefs(Dictionary actorsbyclass) 
 		{
-			//if no actors defined in DECORATE or game config...
-			if(actorsbyclass.Count == 0) return;
+            // Skip if no actors defined in DECORATE or game config...
+            if (actorsbyclass.Count == 0) return;
 
-			GldefsParser parser = new GldefsParser { OnInclude = ParseFromLocation };
+            GldefsParser parser = new GldefsParser { OnInclude = ParseFromLocation };
 
 			// Load gldefs from resources
 			foreach(DataReader dr in containers) 
@@ -1977,11 +2003,11 @@ namespace CodeImp.DoomBuilder.Data
 				}
 			}
 
-			//create Gldefs Entries dictionary
-			foreach(KeyValuePair e in parser.Objects) //
-			{ 
-				//if we have decorate actor and light definition for given ClassName...
-				if(actorsbyclass.ContainsKey(e.Key) && parser.LightsByName.ContainsKey(e.Value)) 
+            // Create Gldefs Entries dictionary
+            foreach (KeyValuePair e in parser.Objects) //
+            {
+                //If we have decorate actor and light definition for given ClassName...
+                if (actorsbyclass.ContainsKey(e.Key) && parser.LightsByName.ContainsKey(e.Value)) 
 					gldefsentries[actorsbyclass[e.Key]] = parser.LightsByName[e.Value];
 				else if(!decorate.AllActorsByClass.ContainsKey(e.Key))
 					General.ErrorLogger.Add(ErrorType.Warning, "Got GLDEFS light for class '" + e.Key + "', but haven't found such class in DECORATE");
@@ -1989,48 +2015,55 @@ namespace CodeImp.DoomBuilder.Data
 
 			// Grab them glowy flats!
 			glowingflats = parser.GlowingFlats;
-		}
 
-		//mxd. This loads (Z)MAPINFO
-		private void LoadMapInfo(out Dictionary spawnnums, out Dictionary doomednums)
-		{
-			MapinfoParser parser = new MapinfoParser { OnInclude = ParseFromLocation };
-			
-			foreach(DataReader dr in containers)
-			{
-				currentreader = dr;
+            // And skyboxes
+            skyboxes = parser.Skyboxes;
+        }
 
-				Dictionary streams = dr.GetMapinfoData();
-				foreach(KeyValuePair group in streams) 
-				{
-					// Parse the data
-					parser.Parse(group.Value, Path.Combine(currentreader.Location.location, group.Key), General.Map.Options.LevelName, false);
+        //mxd. This loads (Z)MAPINFO
+        private void LoadMapInfo(out Dictionary spawnnums, out Dictionary doomednums)
+        {
+            MapinfoParser parser = new MapinfoParser { OnInclude = ParseFromLocation };
 
-					//MAPINFO lumps are interdependable. Can't carry on...
-					if(parser.HasError)
-					{
-						parser.LogError();
+            // Parse mapinfo 
+            foreach (DataReader dr in containers)
+            {
+                currentreader = dr;
 
-						// No nulls allowed!
-						spawnnums = new Dictionary();
-						doomednums = new Dictionary();
-						mapinfo = new MapInfo();
+                Dictionary streams = dr.GetMapinfoData();
+                foreach (KeyValuePair group in streams)
+                {
+                    // Parse the data
+                    parser.Parse(group.Value, Path.Combine(dr.Location.location, group.Key), General.Map.Options.LevelName, false);
 
-						return;
-					}
-				}
-			}
+                    //MAPINFO lumps are interdependable. Can't carry on...
+                    if (parser.HasError)
+                    {
+                        parser.LogError();
+                        break;
+                    }
+                }
+            }
 
-			// Set the output values
-			spawnnums = parser.SpawnNums;
-			doomednums = parser.DoomEdNums;
+            if (!parser.HasError)
+            {
+                // Store parsed data
+                spawnnums = parser.SpawnNums;
+                doomednums = parser.DoomEdNums;
+                mapinfo = parser.MapInfo;
+            }
+            else
+            {
+                // No nulls allowed!
+                spawnnums = new Dictionary();
+                doomednums = new Dictionary();
+                mapinfo = new MapInfo();
+            }
 
-			// Store to our MapInfo property
-			currentreader = null;
-			mapinfo = parser.MapInfo ?? new MapInfo();
-		}
+            currentreader = null;
+        }
 
-		private void ParseFromLocation(ZDTextParser parser, string location, bool clearerrors)
+        private void ParseFromLocation(ZDTextParser parser, string location, bool clearerrors)
 		{
 			if(currentreader.IsSuspended) throw new Exception("Data reader is suspended");
 			parser.Parse(currentreader.LoadFile(location), location, clearerrors);
@@ -2266,7 +2299,439 @@ namespace CodeImp.DoomBuilder.Data
 				updatedusedtextures = true;
 			}
 		}
-		
-		#endregion
-	}
+
+        #endregion
+
+        #region ================== mxd. Skybox Making
+
+        private void SetupSkybox()
+        {
+            // Get rid of old texture
+            if (skybox != null) skybox.Dispose(); skybox = null;
+
+            // Determine which texture name to use
+            string skytex = string.Empty;
+            if (!string.IsNullOrEmpty(mapinfo.Sky1))
+            {
+                skytex = mapinfo.Sky1;
+            }
+            // Use vanilla sky only when current map doesn't have a MAPINFO entry
+            else if (!mapinfo.IsDefined)
+            {
+                if (General.Map.Config.DefaultSkyTextures.ContainsKey(General.Map.Options.CurrentName))
+                    skytex = General.Map.Config.DefaultSkyTextures[General.Map.Options.CurrentName];
+                else
+                    skytex = General.GetByIndex(General.Map.Config.DefaultSkyTextures, 0).Value;
+            }
+
+            // Create sky texture
+            if (!string.IsNullOrEmpty(skytex))
+            {
+                if (skyboxes.ContainsKey(skytex))
+                {
+                    // Create cubemap texture
+                    skybox = (skyboxes[skytex].Textures.Count == 6 ? MakeSkyBox6(skyboxes[skytex]) : MakeSkyBox3(skyboxes[skytex]));
+                }
+                else
+                {
+                    // Create classic texture
+                    ImageData tex = GetTextureImage(skytex);
+                    if (!(tex is UnknownImage))
+                    {
+                        if (!tex.IsImageLoaded) tex.LoadImage();
+                        if (!tex.LoadFailed)
+                        {
+                            skybox = MakeClassicSkyBox(new Bitmap(tex.GetBitmap()), true);
+                        }
+                    }
+                }
+            }
+
+            // Sky texture will be missing in ZDoom. Use internal texture
+            if (skybox == null)
+            {
+                ImageData tex = LoadInternalTexture("MissingSky3D.png");
+                tex.CreateTexture();
+                skybox = MakeClassicSkyBox(new Bitmap(tex.GetBitmap()), false);
+                tex.Dispose();
+            }
+        }
+
+        private static CubeTexture MakeClassicSkyBox(Bitmap img, bool dogradients)
+        {
+            // CubeTexture must be square with power of 2 sides
+            int targetwidth = General.NextPowerOf2(img.Width);
+            int targetheight = General.NextPowerOf2(img.Height);
+
+            // Get averaged top and bottom colors
+            Color topcolor, bottomcolor;
+            if (dogradients)
+            {
+                int tr = 0, tg = 0, tb = 0, br = 0, bg = 0, bb = 0;
+                for (int i = 0; i < img.Width; i++)
+                {
+                    Color c = img.GetPixel(i, 0);
+                    tr += c.R;
+                    tg += c.G;
+                    tb += c.B;
+
+                    c = img.GetPixel(i, img.Height - 1);
+                    br += c.R;
+                    bg += c.G;
+                    bb += c.B;
+                }
+
+                topcolor = Color.FromArgb(255, tr / img.Width, tg / img.Width, tb / img.Width);
+                bottomcolor = Color.FromArgb(255, br / img.Width, bg / img.Width, bb / img.Width);
+            }
+            else
+            {
+                // This should be built-in sky texture
+                Color c = img.GetPixel(img.Width / 2, 0);
+                topcolor = Color.FromArgb(255, c);
+
+                c = img.GetPixel(img.Width / 2, img.Height - 1);
+                bottomcolor = Color.FromArgb(255, c);
+            }
+
+            // Make it Po2
+            if (img.Width != targetwidth || img.Height != targetheight) img = ResizeImage(img, targetwidth, targetheight);
+
+            // Make it square
+            if (targetwidth > targetheight)
+            {
+                int c = targetwidth / targetheight;
+                Bitmap result = new Bitmap(targetwidth, targetwidth, img.PixelFormat);
+
+                // Tile vertically
+                using (Graphics g = Graphics.FromImage(result))
+                {
+                    for (int i = 0; i < c; i++) g.DrawImage(img, 0, targetheight * i);
+                }
+
+                img = result;
+            }
+            else if (targetwidth < targetheight)
+            {
+                int c = targetheight / targetwidth;
+                Bitmap result = new Bitmap(targetheight, targetheight);
+
+                // Tile horizontally
+                using (Graphics g = Graphics.FromImage(result))
+                {
+                    for (int i = 0; i < c; i++) g.DrawImage(img, targetwidth * i, 0);
+                }
+
+                img = result;
+            }
+
+            // Make top and bottom images
+            Bitmap top = new Bitmap(img.Width, img.Height);
+            using (Graphics g = Graphics.FromImage(top))
+            {
+                using (SolidBrush b = new SolidBrush(topcolor))
+                {
+                    g.FillRectangle(b, 0, 0, img.Width, img.Height);
+                }
+            }
+
+            Bitmap bottom = new Bitmap(img.Width, img.Height);
+            using (Graphics g = Graphics.FromImage(bottom))
+            {
+                using (SolidBrush b = new SolidBrush(bottomcolor))
+                {
+                    g.FillRectangle(b, 0, 0, img.Width, img.Height);
+                }
+            }
+
+            // Apply top/bottom gradients
+            if (dogradients)
+            {
+                using (Graphics g = Graphics.FromImage(img))
+                {
+                    int gradientheight = img.Height / 6;
+                    Rectangle area = new Rectangle(0, 0, img.Width, gradientheight);
+                    using (LinearGradientBrush b = new LinearGradientBrush(area, topcolor, Color.FromArgb(0, topcolor), 90f))
+                    {
+                        g.FillRectangle(b, area);
+                    }
+
+                    area = new Rectangle(0, img.Height - gradientheight, img.Width, gradientheight);
+                    using (LinearGradientBrush b = new LinearGradientBrush(area, Color.FromArgb(0, bottomcolor), bottomcolor, 90f))
+                    {
+                        area.Y += 1;
+                        g.FillRectangle(b, area);
+                    }
+                }
+            }
+
+            // Make cubemap texture
+            CubeTexture cubemap = new CubeTexture(General.Map.Graphics.Device, img.Width, 1, Usage.None, Format.A8R8G8B8, Pool.Managed);
+
+            // Draw faces
+            img.RotateFlip(RotateFlipType.Rotate180FlipX);
+            DrawCubemapFace(cubemap, CubeMapFace.NegativeX, img);
+
+            img.RotateFlip(RotateFlipType.Rotate90FlipNone);
+            DrawCubemapFace(cubemap, CubeMapFace.NegativeY, img);
+
+            img.RotateFlip(RotateFlipType.Rotate90FlipNone);
+            DrawCubemapFace(cubemap, CubeMapFace.PositiveX, img);
+
+            img.RotateFlip(RotateFlipType.Rotate90FlipNone);
+            DrawCubemapFace(cubemap, CubeMapFace.PositiveY, img);
+
+            DrawCubemapFace(cubemap, CubeMapFace.PositiveZ, top);
+            DrawCubemapFace(cubemap, CubeMapFace.NegativeZ, bottom);
+
+            // All done...
+            return cubemap;
+        }
+
+        // Makes CubeTexture from 6 images
+        private CubeTexture MakeSkyBox6(SkyboxInfo info)
+        {
+            // Gather images. They should be defined in this order: North, East, South, West, Top, Bottom
+            Bitmap[] sides = new Bitmap[6];
+            int targetsize = 0;
+            for (int i = 0; i < info.Textures.Count; i++)
+            {
+                ImageData tex = GetTextureImage(info.Textures[i]);
+                if (!(tex is UnknownImage))
+                {
+                    if (!tex.IsImageLoaded) tex.LoadImage();
+                    if (!tex.LoadFailed)
+                    {
+                        sides[i] = new Bitmap(tex.GetBitmap());
+                        targetsize = Math.Max(targetsize, Math.Max(sides[i].Width, sides[i].Height));
+                    }
+                }
+
+                if (sides[i] == null)
+                {
+                    General.ErrorLogger.Add(ErrorType.Error, "Unable to create \"" + info.Name + "\" skybox: unable to find \"" + info.Textures[i] + "\" texture");
+                    return null;
+                }
+            }
+
+            // All images must be square and have the same size
+            if (targetsize == 0)
+            {
+                General.ErrorLogger.Add(ErrorType.Error, "Unable to create \"" + info.Name + "\" skybox: invalid texture size");
+                return null;
+            }
+
+            // Make it Po2
+            targetsize = General.NextPowerOf2(targetsize);
+
+            for (int i = 0; i < sides.Length; i++)
+            {
+                if (sides[i].Width != targetsize || sides[i].Height != targetsize)
+                    sides[i] = ResizeImage(sides[i], targetsize, targetsize);
+            }
+
+            // Return cubemap texture
+            return MakeSkyBox(sides, targetsize, info.FlipTop);
+        }
+
+        // Makes CubeTexture from 3 images
+        private CubeTexture MakeSkyBox3(SkyboxInfo info)
+        {
+            // Gather images. They should be defined in this order: Sides, Top, Bottom
+            Bitmap[] sides = new Bitmap[6];
+            int targetsize = 0;
+
+            // Create NWSE images from the side texture
+            ImageData side = GetTextureImage(info.Textures[0]);
+            if (!(side is UnknownImage))
+            {
+                if (!side.IsImageLoaded) side.LoadImage();
+                if (!side.LoadFailed)
+                {
+                    // This should be 4x1 format image. If it's not, resize it
+                    Bitmap sideimg = new Bitmap(side.GetBitmap());
+                    targetsize = Math.Max(sideimg.Width / 4, sideimg.Height);
+
+                    if (targetsize == 0)
+                    {
+                        General.ErrorLogger.Add(ErrorType.Error, "Unable to create \"" + info.Name + "\" skybox: invalid texture size");
+                        return null;
+                    }
+
+                    // Make it Po2
+                    targetsize = General.NextPowerOf2(targetsize);
+
+                    // Resize if needed
+                    if (sideimg.Width != targetsize * 4 || sideimg.Height != targetsize)
+                    {
+                        sideimg = ResizeImage(sideimg, targetsize * 4, targetsize);
+                    }
+
+                    // Chop into tiny pieces
+                    for (int i = 0; i < 4; i++)
+                    {
+                        // Create square image
+                        Bitmap img = new Bitmap(targetsize, targetsize);
+                        using (Graphics g = Graphics.FromImage(img))
+                        {
+                            // Copy area from the side image
+                            g.DrawImage(sideimg, 0, 0, new Rectangle(targetsize * i, 0, targetsize, targetsize), GraphicsUnit.Pixel);
+                        }
+
+                        // Add to collection
+                        sides[i] = img;
+                    }
+                }
+            }
+
+            // Sanity check...
+            if (sides[0] == null || sides[1] == null || sides[2] == null || sides[3] == null)
+            {
+                General.ErrorLogger.Add(ErrorType.Error, "Unable to create \"" + info.Name + "\" skybox: unable to find \"" + info.Textures[0] + "\" texture");
+                return null;
+            }
+
+            // Create top
+            ImageData top = GetTextureImage(info.Textures[1]);
+            if (!(top is UnknownImage))
+            {
+                if (!top.IsImageLoaded) top.LoadImage();
+                if (!top.LoadFailed)
+                {
+                    // Copy bitmap 
+                    Bitmap topimg = new Bitmap(top.GetBitmap());
+
+                    // Resize if needed
+                    if (topimg.Width != targetsize || topimg.Height != targetsize)
+                        topimg = ResizeImage(topimg, targetsize, targetsize);
+
+                    // Add to collection
+                    sides[4] = topimg;
+                }
+            }
+
+            // Sanity check...
+            if (sides[4] == null)
+            {
+                General.ErrorLogger.Add(ErrorType.Error, "Unable to create \"" + info.Name + "\" skybox: unable to find \"" + info.Textures[1] + "\" texture");
+                return null;
+            }
+
+            // Create bottom
+            ImageData bottom = GetTextureImage(info.Textures[2]);
+            if (!(bottom is UnknownImage))
+            {
+                if (!bottom.IsImageLoaded) bottom.LoadImage();
+                if (!bottom.LoadFailed)
+                {
+                    // Copy bitmap 
+                    Bitmap bottomimg = new Bitmap(bottom.GetBitmap());
+
+                    // Resize if needed
+                    if (bottomimg.Width != targetsize || bottomimg.Height != targetsize)
+                        bottomimg = ResizeImage(bottomimg, targetsize, targetsize);
+
+                    // Add to collection
+                    sides[5] = bottomimg;
+                }
+            }
+
+            // Sanity check...
+            if (sides[5] == null)
+            {
+                General.ErrorLogger.Add(ErrorType.Error, "Unable to create \"" + info.Name + "\" skybox: unable to find \"" + info.Textures[2] + "\" texture");
+                return null;
+            }
+
+            // Return cubemap texture
+            return MakeSkyBox(sides, targetsize, info.FlipTop);
+        }
+
+        // Makes CubeTexture from 6 images.
+        // sides[] must contain 6 square Po2 images in this order: North, East, South, West, Top, Bottom
+        private static CubeTexture MakeSkyBox(Bitmap[] sides, int targetsize, bool fliptop)
+        {
+            CubeTexture cubemap = new CubeTexture(General.Map.Graphics.Device, targetsize, 1, Usage.None, Format.A8R8G8B8, Pool.Managed);
+
+            // Draw faces
+            sides[3].RotateFlip(RotateFlipType.Rotate180FlipX);
+            DrawCubemapFace(cubemap, CubeMapFace.NegativeX, sides[3]); // West
+
+            sides[0].RotateFlip(RotateFlipType.Rotate90FlipX);
+            DrawCubemapFace(cubemap, CubeMapFace.NegativeY, sides[0]); // North
+
+            sides[1].RotateFlip(RotateFlipType.RotateNoneFlipX);
+            DrawCubemapFace(cubemap, CubeMapFace.PositiveX, sides[1]); // East
+
+            sides[2].RotateFlip(RotateFlipType.Rotate270FlipX);
+            DrawCubemapFace(cubemap, CubeMapFace.PositiveY, sides[2]); // South
+
+            sides[4].RotateFlip(fliptop ? RotateFlipType.Rotate90FlipX : RotateFlipType.Rotate90FlipNone);
+            DrawCubemapFace(cubemap, CubeMapFace.PositiveZ, sides[4]); // Top
+
+            sides[5].RotateFlip(RotateFlipType.Rotate270FlipX);
+            DrawCubemapFace(cubemap, CubeMapFace.NegativeZ, sides[5]); // Bottom
+
+            // All done...
+            return cubemap;
+        }
+
+        private static void DrawCubemapFace(CubeTexture texture, CubeMapFace face, Bitmap image)
+        {
+            DataRectangle rect = texture.LockRectangle(face, 0, LockFlags.NoSystemLock);
+            SurfaceDescription desc = texture.GetLevelDescription(0);
+
+            if (rect.Data.CanWrite)
+            {
+                for (int row = 0; row < desc.Height; row++)
+                {
+                    int rowstart = row * rect.Pitch;
+                    rect.Data.Seek(rowstart, SeekOrigin.Begin);
+
+                    for (int col = 0; col < desc.Width; col++)
+                    {
+                        Color color = image.GetPixel(row, col);
+
+                        rect.Data.WriteByte(color.B);
+                        rect.Data.WriteByte(color.G);
+                        rect.Data.WriteByte(color.R);
+                        rect.Data.WriteByte(color.A);
+                    }
+                }
+            }
+            else
+            {
+                General.ErrorLogger.Add(ErrorType.Error, "Skybox creation failed: CubeTexture is unwritable...");
+            }
+
+            texture.UnlockRectangle(face, 0);
+        }
+
+        private static Bitmap ResizeImage(Image image, int width, int height)
+        {
+            var destrect = new Rectangle(0, 0, width, height);
+            var destimage = new Bitmap(width, height);
+
+            destimage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
+
+            using (var graphics = Graphics.FromImage(destimage))
+            {
+                graphics.CompositingMode = CompositingMode.SourceCopy;
+                graphics.CompositingQuality = CompositingQuality.HighQuality;
+                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
+                graphics.SmoothingMode = SmoothingMode.HighQuality;
+                graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
+
+                using (var wrapmode = new ImageAttributes())
+                {
+                    wrapmode.SetWrapMode(WrapMode.TileFlipXY);
+                    graphics.DrawImage(image, destrect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapmode);
+                }
+            }
+
+            return destimage;
+        }
+
+        #endregion
+    }
 }
diff --git a/Source/Core/Data/PK3StructuredReader.cs b/Source/Core/Data/PK3StructuredReader.cs
index 8f4c125..2fdb849 100644
--- a/Source/Core/Data/PK3StructuredReader.cs
+++ b/Source/Core/Data/PK3StructuredReader.cs
@@ -531,17 +531,17 @@ namespace CodeImp.DoomBuilder.Data
 			// Error when suspended
 			if(issuspended) throw new Exception("Data reader is suspended");
 
-			//mapinfo should be in root folder
+			// Mapinfo should be in root folder
 			Dictionary streams = new Dictionary(StringComparer.Ordinal);
-			string[] files = GetAllFiles("", false);
 
-			//try to find (z)mapinfo
+            //try to find (z)mapinfo
+            string[] files = GetAllFiles("", false);
 			foreach(string s in files)
 			{
 				string filename = Path.GetFileNameWithoutExtension(s.ToLowerInvariant());
 				if(filename == "zmapinfo" || filename == "mapinfo")
-					streams.Add(s, LoadFile(s));
-			}
+                    streams[s] = LoadFile(s);
+            }
 
 			return streams;
 		}
diff --git a/Source/Core/Data/SpriteImage.cs b/Source/Core/Data/SpriteImage.cs
index de66da3..08c5d8d 100644
--- a/Source/Core/Data/SpriteImage.cs
+++ b/Source/Core/Data/SpriteImage.cs
@@ -30,8 +30,8 @@ namespace CodeImp.DoomBuilder.Data
 	{
 		#region ================== Variables
 
-		protected int offsetx;
-		protected int offsety;
+		private int offsetx;
+        private int offsety;
         protected bool flipped;
 		
 		#endregion
diff --git a/Source/Core/GZBuilder/Data/MapInfo.cs b/Source/Core/GZBuilder/Data/MapInfo.cs
index a204492..4900524 100644
--- a/Source/Core/GZBuilder/Data/MapInfo.cs
+++ b/Source/Core/GZBuilder/Data/MapInfo.cs
@@ -1,30 +1,69 @@
-using SlimDX;
+#region ================== Namespaces
 
-namespace CodeImp.DoomBuilder.GZBuilder.Data 
+using SlimDX;
+
+#endregion
+
+namespace CodeImp.DoomBuilder.GZBuilder.Data
 {
-	public sealed class MapInfo 
-	{
-		public string Sky1;
-		public float Sky1ScrollSpeed;
-		public string Sky2;
-		public float Sky2ScrollSpeed;
-		public bool DoubleSky;
-		public bool HasFadeColor;
-		public Color4 FadeColor;
-		public bool HasOutsideFogColor;
-		public Color4 OutsideFogColor;
-		public int FogDensity;
-		public int OutsideFogDensity;
+    public sealed class MapInfo
+    {
+        #region ================== Variables
 
-		public bool EvenLighting;
-		public bool SmoothLighting;
-		public int VertWallShade;
-		public int HorizWallShade;
+        private bool isdefined;
 
-		public MapInfo() 
-		{
-			VertWallShade = 16;
-			HorizWallShade = -16;
-		}
-	}
-}
+        private string title;
+        private string sky1;
+        private float sky1scrollspeed;
+        private string sky2;
+        private float sky2scrollspeed;
+        private bool doublesky;
+        private bool hasfadecolor;
+        private Color4 fadecolor;
+        private bool hasoutsidefogcolor;
+        private Color4 outsidefogcolor;
+        private int fogdensity;
+        private int outsidefogdensity;
+
+        private bool evenlighting;
+        private bool smoothlighting;
+        private int vertwallshade;
+        private int horizwallshade;
+
+        #endregion
+
+        #region ================== Properties
+
+        public bool IsDefined { get { return isdefined; } }
+
+        public string Title { get { return title; } internal set { title = value; isdefined = true; } }
+        public string Sky1 { get { return sky1; } internal set { sky1 = value; isdefined = true; } }
+        public float Sky1ScrollSpeed { get { return sky1scrollspeed; } internal set { sky1scrollspeed = value; isdefined = true; } }
+        public string Sky2 { get { return sky2; } internal set { sky2 = value; isdefined = true; } }
+        public float Sky2ScrollSpeed { get { return sky2scrollspeed; } internal set { sky2scrollspeed = value; isdefined = true; } }
+        public bool DoubleSky { get { return doublesky; } internal set { doublesky = value; isdefined = true; } }
+        public bool HasFadeColor { get { return hasfadecolor; } internal set { hasfadecolor = value; isdefined = true; } }
+        public Color4 FadeColor { get { return fadecolor; } internal set { fadecolor = value; isdefined = true; } }
+        public bool HasOutsideFogColor { get { return hasoutsidefogcolor; } internal set { hasoutsidefogcolor = value; isdefined = true; } }
+        public Color4 OutsideFogColor { get { return outsidefogcolor; } internal set { outsidefogcolor = value; isdefined = true; } }
+        public int FogDensity { get { return fogdensity; } internal set { fogdensity = value; isdefined = true; } }
+        public int OutsideFogDensity { get { return outsidefogdensity; } internal set { outsidefogdensity = value; isdefined = true; } }
+
+        public bool EvenLighting { get { return evenlighting; } internal set { evenlighting = value; isdefined = true; } }
+        public bool SmoothLighting { get { return smoothlighting; } internal set { smoothlighting = value; isdefined = true; } }
+        public int VertWallShade { get { return vertwallshade; } internal set { vertwallshade = value; isdefined = true; } }
+        public int HorizWallShade { get { return horizwallshade; } internal set { horizwallshade = value; isdefined = true; } }
+
+        #endregion
+
+        #region ================== Constructor
+
+        public MapInfo()
+        {
+            vertwallshade = 16;
+            horizwallshade = -16;
+        }
+
+        #endregion
+    }
+}
\ No newline at end of file
diff --git a/Source/Core/GZBuilder/Data/SkyboxInfo.cs b/Source/Core/GZBuilder/Data/SkyboxInfo.cs
new file mode 100644
index 0000000..f4d4d9c
--- /dev/null
+++ b/Source/Core/GZBuilder/Data/SkyboxInfo.cs
@@ -0,0 +1,18 @@
+using System.Collections.Generic;
+
+namespace CodeImp.DoomBuilder.GZBuilder.Data
+{
+	public sealed class SkyboxInfo
+	{
+		private readonly string name;
+		public string Name { get { return name; } }
+		public readonly List Textures;
+		public bool FlipTop;
+
+		public SkyboxInfo(string name)
+		{
+			this.name = name;
+			Textures = new List();
+		}
+	}
+}
diff --git a/Source/Core/GZBuilder/GZDoom/GldefsParser.cs b/Source/Core/GZBuilder/GZDoom/GldefsParser.cs
index fdc2f9b..c057451 100644
--- a/Source/Core/GZBuilder/GZDoom/GldefsParser.cs
+++ b/Source/Core/GZBuilder/GZDoom/GldefsParser.cs
@@ -14,743 +14,808 @@ using CodeImp.DoomBuilder.IO;
 
 namespace CodeImp.DoomBuilder.GZBuilder.GZDoom
 {
-	internal sealed class GldefsParser : ZDTextParser
-	{
-		#region ================== Constants
+    internal sealed class GldefsParser : ZDTextParser
+    {
+        #region ================== Constants
 
-		private const int DEFAULT_GLOW_HEIGHT = 64;
+        private const int DEFAULT_GLOW_HEIGHT = 64;
 
-		#endregion
+        #endregion
 
-		#region ================== Structs
+        #region ================== Structs
 
-		private struct GldefsLightType
-		{
-			public const string POINT = "pointlight";
-			public const string PULSE = "pulselight";
-			public const string FLICKER = "flickerlight";
-			public const string FLICKER2 = "flickerlight2";
-			public const string SECTOR = "sectorlight";
-
-			public static readonly Dictionary GLDEFS_TO_GZDOOM_LIGHT_TYPE = new Dictionary(StringComparer.Ordinal) { { POINT, DynamicLightType.NORMAL }, { PULSE, DynamicLightType.PULSE }, { FLICKER, DynamicLightType.FLICKER }, { FLICKER2, DynamicLightType.RANDOM }, { SECTOR, DynamicLightType.SECTOR } };
-		}
-
-		#endregion
-
-		#region ================== Delegates
-
-		public delegate void IncludeDelegate(GldefsParser parser, string includefile, bool clearerrors);
-		public IncludeDelegate OnInclude;
-
-		#endregion
-
-		#region ================== Variables
-
-		private readonly Dictionary lightsByName; //LightName, light definition
-		private readonly Dictionary objects; //ClassName, LightName
-		private readonly Dictionary glowingflats;
-		private readonly HashSet parsedlumps;
-
-		#endregion
-
-		#region ================== Properties
-
-		public Dictionary LightsByName { get { return lightsByName; } }
-		public Dictionary Objects { get { return objects; } }
-		internal Dictionary GlowingFlats { get { return glowingflats; } }
-
-		#endregion
-
-		#region ================== Constructor
-
-		public GldefsParser() 
-		{
-			// Syntax
-			whitespace = "\n \t\r\u00A0";
-			specialtokens = ",{}\n";
-			
-			parsedlumps = new HashSet(StringComparer.OrdinalIgnoreCase);
-			lightsByName = new Dictionary(StringComparer.Ordinal); //LightName, Light params
-			objects = new Dictionary(StringComparer.Ordinal); //ClassName, LightName
-			glowingflats = new Dictionary(); // Texture name hash, Glowing Flat Data
-		}
-
-		#endregion
-
-		#region ================== Parsing
-
-		public override bool Parse(Stream stream, string sourcefilename, bool clearerrors) 
-		{
-			if(!base.Parse(stream, sourcefilename, clearerrors)) return false;
-
-			// Keep local data
-			Stream localstream = datastream;
-			string localsourcename = sourcename;
-			BinaryReader localreader = datareader;
-
-			// Continue until at the end of the stream
-			while(SkipWhitespace(true)) 
-			{
-				string token = StripTokenQuotes(ReadToken()).ToLowerInvariant(); //Quotes can be anywhere! ANYWHERE!!! And GZDoom will still parse data correctly
-				if(string.IsNullOrEmpty(token)) break;
-
-				//got light structure
-				if(token == GldefsLightType.POINT || token == GldefsLightType.PULSE || token == GldefsLightType.FLICKER 
-					|| token == GldefsLightType.FLICKER2 || token == GldefsLightType.SECTOR) 
-				{
-					string lightType = token;
-					DynamicLightData light = new DynamicLightData { Type = GldefsLightType.GLDEFS_TO_GZDOOM_LIGHT_TYPE[lightType] };
-
-					//find classname
-					SkipWhitespace(true);
-					string lightName = StripTokenQuotes(ReadToken()).ToLowerInvariant();
-
-					if(string.IsNullOrEmpty(lightName))
-					{
-						ReportError("Expected " + token + " name");
-						return false;
-					}
-
-					//now find opening brace
-					if(!NextTokenIs("{", false))
-					{
-						ReportError("Expected opening brace");
-						return false;
-					}
-
-					//read gldefs light structure
-					while(SkipWhitespace(true)) 
-					{
-						token = ReadToken().ToLowerInvariant();
-						if(!string.IsNullOrEmpty(token)) 
-						{
-//color
-							if(token == "color") 
-							{
-								SkipWhitespace(true);
-
-								token = StripTokenQuotes(ReadToken());
-								if(!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out light.Color.Red)) 
-								{
-									// Not numeric!
-									ReportError("Expected Red color value, but got '" + token + "'");
-									return false;
-								}
-
-								SkipWhitespace(true);
-
-								token = StripTokenQuotes(ReadToken());
-								if(!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out light.Color.Green)) 
-								{
-									// Not numeric!
-									ReportError("Expected Green color value, but got '" + token + "'");
-									return false;
-								}
-
-								SkipWhitespace(true);
-
-								token = StripTokenQuotes(ReadToken());
-								if(!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out light.Color.Blue)) 
-								{
-									// Not numeric!
-									ReportError("Expected Blue color value, but got '" + token + "'");
-									return false;
-								}
-//size
-							} 
-							else if(token == "size") 
-							{
-								if(lightType != GldefsLightType.SECTOR) 
-								{
-									SkipWhitespace(true);
-
-									token = StripTokenQuotes(ReadToken());
-									if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out light.PrimaryRadius)) 
-									{
-										// Not numeric!
-										ReportError("Expected Size value, but got '" + token + "'");
-										return false;
-									}
-									light.PrimaryRadius *= 2;
-
-								} 
-								else 
-								{
-									ReportError("'" + token + "' is not valid property for " + lightType);
-									return false;
-								}
-//offset
-							} 
-							else if(token == "offset") 
-							{
-								SkipWhitespace(true);
-
-								token = StripTokenQuotes(ReadToken());
-								if(!ReadSignedFloat(token, ref light.Offset.X)) 
-								{
-									// Not numeric!
-									ReportError("Expected Offset X value, but got '" + token + "'");
-									return false;
-								}
-
-								SkipWhitespace(true);
-
-								token = StripTokenQuotes(ReadToken());
-								if(!ReadSignedFloat(token, ref light.Offset.Z)) 
-								{
-									// Not numeric!
-									ReportError("Expected Offset Y value, but got '" + token + "'");
-									return false;
-								}
-
-								SkipWhitespace(true);
-
-								token = StripTokenQuotes(ReadToken());
-								if(!ReadSignedFloat(token, ref light.Offset.Y)) 
-								{
-									// Not numeric!
-									ReportError("Expected Offset Z value, but got '" + token + "'");
-									return false;
-								}
-//subtractive
-							} 
-							else if(token == "subtractive") 
-							{
-								SkipWhitespace(true);
-
-								token = StripTokenQuotes(ReadToken());
-								int i;
-								if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out i)) 
-								{
-									// Not numeric!
-									ReportError("expected Subtractive value, but got '" + token + "'");
-									return false;
-								}
-
-								light.Subtractive = i == 1;
-//dontlightself
-							} 
-							else if(token == "dontlightself") 
-							{
-								SkipWhitespace(true);
-
-								token = StripTokenQuotes(ReadToken());
-								int i;
-								if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out i)) 
-								{
-									// Not numeric!
-									ReportError("Expected DontLightSelf value, but got '" + token + "'");
-									return false;
-								}
-
-								light.DontLightSelf = (i == 1);
-//interval
-							} 
-							else if(token == "interval") 
-							{
-								if(lightType == GldefsLightType.PULSE || lightType == GldefsLightType.FLICKER2) 
-								{
-									SkipWhitespace(true);
-
-									token = StripTokenQuotes(ReadToken());
-									float interval;
-									if(!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out interval)) 
-									{
-										// Not numeric!
-										ReportError("Expected Interval value, but got '" + token + "'");
-										return false;
-									}
-
-									if(interval == 0) LogWarning("Interval value should be greater than zero");
-
-									//I wrote logic for dynamic lights animation first, so here I modify gldefs settings to fit in existing logic
-									if(lightType == GldefsLightType.PULSE) 
-									{
-										light.Interval = (int)(interval * 35); //measured in tics (35 per second) in PointLightPulse, measured in seconds in gldefs' PulseLight
-									} 
-									else //FLICKER2. Seems like PointLightFlickerRandom to me
-									{ 
-										light.Interval = (int)(interval * 350); //0.1 is one second for FlickerLight2
-									}
-								} 
-								else 
-								{
-									ReportError("'" + token + "' is not valid property for " + lightType);
-									return false;
-								}
-//secondarysize
-							} 
-							else if(token == "secondarysize") 
-							{
-								if(lightType == GldefsLightType.PULSE || lightType == GldefsLightType.FLICKER || lightType == GldefsLightType.FLICKER2) 
-								{
-									SkipWhitespace(true);
-
-									token = StripTokenQuotes(ReadToken());
-									if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out light.SecondaryRadius)) 
-									{
-										// Not numeric!
-										ReportError("Expected SecondarySize value, but got '" + token + "'");
-										return false;
-									}
-									light.SecondaryRadius *= 2;
-								} 
-								else 
-								{
-									ReportError("'" + token + "' is not valid property for " + lightType);
-									return false;
-								}
-//chance
-							} 
-							else if(token == "chance") 
-							{
-								if(lightType == GldefsLightType.FLICKER) 
-								{
-									SkipWhitespace(true);
-
-									token = StripTokenQuotes(ReadToken());
-									float chance;
-									if(!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out chance)) 
-									{
-										// Not numeric!
-										ReportError("Expected Chance value, but got '" + token + "'");
-										return false;
-									}
-
-									//transforming from 0.0 .. 1.0 to 0 .. 359 to fit in existing logic
-									light.Interval = (int)(chance * 359.0f);
-								} 
-								else 
-								{
-									ReportError("'" + token + "' is not valid property for " + lightType);
-									return false;
-								}
-//scale
-							} 
-							else if(token == "scale") 
-							{
-								if(lightType == GldefsLightType.SECTOR) 
-								{
-									SkipWhitespace(true);
-
-									token = StripTokenQuotes(ReadToken());
-									float scale;
-									if(!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out scale)) 
-									{
-										// Not numeric!
-										ReportError("Expected Scale value, but got '" + token + "'");
-										return false;
-									}
-
-									if(scale > 1.0f) 
-									{
-										ReportError("Scale must be in 0.0 - 1.0 range, but is " + scale);
-										return false;
-									}
-
-									//sector light doesn't have animation, so we will store it's size in Interval
-									//transforming from 0.0 .. 1.0 to 0 .. 10 to preserve value.
-									light.Interval = (int)(scale * 10.0f);
-								} 
-								else 
-								{
-									ReportError("'" + token + "' is not valid property for " + lightType);
-									return false;
-								}
-							} 
-							//end of structure
-							else if(token == "}") 
-							{
-								bool skip = false;
-
-								//general checks
-								if(light.Color.Red == 0.0f && light.Color.Green == 0.0f && light.Color.Blue == 0.0f) 
-								{
-									LogWarning("'" + lightName + "' light Color is " + light.Color.Red + "," + light.Color.Green + "," + light.Color.Blue + ". It won't be shown in GZDoom");
-									skip = true;
-								}
-
-								//light-type specific checks
-								if(light.Type == DynamicLightType.NORMAL && light.PrimaryRadius == 0) 
-								{
-									LogWarning("'" + lightName + "' light Size is 0. It won't be shown in GZDoom");
-									skip = true;
-								}
-
-								if(light.Type == DynamicLightType.FLICKER || light.Type == DynamicLightType.PULSE || light.Type == DynamicLightType.RANDOM) 
-								{
-									if(light.PrimaryRadius == 0 && light.SecondaryRadius == 0)
-									{
-										LogWarning("'" + lightName + "' light Size and SecondarySize are 0. This light won't be shown in GZDoom");
-										skip = true;
-									}
-								}
-
-								//offset it slightly to avoid shading glitches
-								if(light.Offset.Z == 0.0f) light.Offset.Z = 0.1f;
-
-								// Add to the collection?
-								if(!skip) lightsByName[lightName] = light;
-
-								//break out of this parsing loop
-								break; 
-							}
-						}
-					}
-				} 
-				else if(token == "object") 
-				{
-					SkipWhitespace(true);
-
-					//read object class
-					string objectClass = StripTokenQuotes(ReadToken()).ToLowerInvariant();
-
-					if(string.IsNullOrEmpty(objectClass))
-					{
-						ReportError("Expected object class");
-						return false;
-					}
-
-					//now find opening brace
-					if(!NextTokenIs("{", false))
-					{
-						ReportError("Expected opening brace");
-						return false;
-					}
-
-					int bracesCount = 1;
-					bool foundLight = false;
-					bool foundFrame = false;
-
-					//read frames structure
-					while(SkipWhitespace(true)) 
-					{
-						token = ReadToken();
-						if(!string.IsNullOrEmpty(token)) 
-						{
-							token = StripTokenQuotes(token).ToLowerInvariant();
-							if(!foundLight && !foundFrame && token == "frame") 
-							{
-								SkipWhitespace(true);
-								token = ReadToken().ToLowerInvariant(); //should be frame name
-
-								//use this frame if it's 4 characters long or it's the first frame
-								foundFrame = (token.Length == 4 || (token.Length > 4 && token[4] == 'a'));
-							} 
-							else if(!foundLight && foundFrame && token == "light") //just use first light and be done with it
-							{ 
-								SkipWhitespace(true);
-								token = ReadToken().ToLowerInvariant(); //should be light name
-
-								if(!string.IsNullOrEmpty(token)) 
-								{
-									if(lightsByName.ContainsKey(token)) 
-									{
-										objects[objectClass] = token;
-										foundLight = true;
-									} 
-									else 
-									{
-										LogWarning("Light declaration not found for light '" + token + "'");
-									}
-								}
-							} 
-							else if(token == "{") //continue in this loop until object structure ends
-							{ 
-								bracesCount++;
-							} 
-							else if(token == "}") 
-							{
-								if(--bracesCount < 1) break; //This was Cave Johnson. And we are done here.
-							}
-						}
-					}
-				}
-				//Glowing flats block start
-				else if(token == "glow")
-				{
-					// Next sould be opening brace
-					if(!NextTokenIs("{", false))
-					{
-						ReportError("Expected opening brace");
-						return false;
-					}
-
-					// Parse inner blocks
-					while(SkipWhitespace(true))
-					{
-						token = ReadToken().ToLowerInvariant();
-						if(token == "}")
-						{
-							// End of Glow structure
-							break;
-						}
-						else if(token == "flats" || token == "walls") 
-						{
-							// Next sould be opening brace
-							if(!NextTokenIs("{", false))
-							{
-								ReportError("Expected opening brace");
-								return false;
-							}
-
-							// Read flat names
-							while(SkipWhitespace(true))
-							{
-								token = ReadToken();
-								if(token == "}") break;
-
-								// Add glow data
-								glowingflats[General.Map.Data.GetFullLongFlatName(Lump.MakeLongName(token, General.Map.Options.UseLongTextureNames))] = new GlowingFlatData {
-									Height = DEFAULT_GLOW_HEIGHT * 2,
-									Fullbright = true,
-									Color = new PixelColor(255, 255, 255, 255),
-									CalculateTextureColor = true
-								};
-							}
-						} 
-						// GLOOME subtractive flats
-						else if(token == "subflats" || token == "subwalls")
-						{
-							// Next sould be opening brace
-							if(!NextTokenIs("{", false))
-							{
-								ReportError("Expected opening brace");
-								return false;
-							}
-
-							// Read flat names
-							while(SkipWhitespace(true))
-							{
-								token = ReadToken();
-								if(token == "}") break;
-
-								// Add glow data
-								glowingflats[General.Map.Data.GetFullLongFlatName(Lump.MakeLongName(token, General.Map.Options.UseLongTextureNames))] = new GlowingFlatData {
-									Height = DEFAULT_GLOW_HEIGHT * 2,
-									Fullblack = true,
-									Subtractive = true,
-									Color = new PixelColor(255, 0, 0, 0),
-									CalculateTextureColor = false
-								};
-							}
-						}
-						else if(token == "texture" || token == "subtexture")
-						{
-							int color;
-							int glowheight = DEFAULT_GLOW_HEIGHT;
-							bool subtractivetexture = (token == "subtexture");
-							string texturename = StripTokenQuotes(ReadToken(false));
-
-							if(string.IsNullOrEmpty(texturename))
-							{
-								ReportError("expected " + token + " name");
-								return false;
-							}
-							
-							// Now we should find a comma
-							if(!NextTokenIs(",", false))
-							{
-								ReportError("Expected a comma");
-								return false;
-							}
-
-							// Next is color
-							SkipWhitespace(true);
-							token = ReadToken();
-
-							if(!int.TryParse(token, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out color)) 
-							{
-								//probably it's a color name?
-								Color c = Color.FromName(token); //should be similar to C++ color name detection, I suppose
-								if(c.IsKnownColor)
-								{
-									color = PixelColor.FromColor(c).ToInt();
-								}
-								else
-								{
-									ReportError("expected glow color value, but got '" + token + "'");
-									return false;
-								}
-							}
-
-							// The glow data is valid at thispoint. Let's get texture hash 
-							long texturehash = General.Map.Data.GetFullLongFlatName(Lump.MakeLongName(texturename, General.Map.Options.UseLongTextureNames));
-
-							// Now we can find a comma
-							if(!NextTokenIs(",", false))
-							{
-								// Add glow data
-								glowingflats[texturehash] = new GlowingFlatData {
-									Height = glowheight * 2,
-									Subtractive = subtractivetexture,
-									Color = PixelColor.FromInt(color).WithAlpha(255),
-									CalculateTextureColor = false
-								};
-
-								continue;
-							}
-
-							// Can be glow height
-							SkipWhitespace(true);
-							token = ReadToken();
-
-							int h;
-							if(int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out h))
-							{
-								// Can't pass glowheight directly cause TryParse will unconditionally set it to 0
-								glowheight = h;
-								
-								// Now we can find a comma
-								if(!NextTokenIs(",", false))
-								{
-									// Add glow data
-									glowingflats[texturehash] = new GlowingFlatData {
-										Height = glowheight * 2,
-										Subtractive = subtractivetexture,
-										Color = PixelColor.FromInt(color).WithAlpha(255),
-										CalculateTextureColor = false
-									};
-
-									continue;
-								}
-
-								// Read the flag
-								SkipWhitespace(true);
-								token = ReadToken().ToLowerInvariant();
-							}
-
-							// Next is "fullbright" or "fullblack" flag
-							bool fullbright = (token == "fullbright");
-							bool fullblack = (!subtractivetexture && token == "fullblack");
-
-							if(!fullblack && !fullbright)
-							{
-								string expectedflags = (subtractivetexture ? "'fullbright'" : "'fullbright' or 'fullblack'");
-								ReportError("expected " + expectedflags + " flag, but got '" + token + "'");
-								return false;
-							}
-
-							// Add glow data
-							glowingflats[texturehash] = new GlowingFlatData {
-								Height = glowheight * 2,
-								Fullbright = fullbright,
-								Fullblack = fullblack,
-								Subtractive = subtractivetexture,
-								Color = PixelColor.FromInt(color).WithAlpha(255),
-								CalculateTextureColor = false
-							};
-						}
-					}
-				}
-				else if(token == "#include") 
-				{
-					//INFO: ZDoom GLDEFS include paths can't be relative ("../glstuff.txt") 
-					//or absolute ("d:/project/glstuff.txt") 
-					//or have backward slashes ("info\glstuff.txt")
-					//include paths are relative to the first parsed entry, not the current one 
-					//also include paths may or may not be quoted
-					SkipWhitespace(true);
-					string includelump = StripTokenQuotes(ReadToken(false)); // Don't skip newline
-
-					// Sanity checks
-					if(string.IsNullOrEmpty(includelump))
-					{
-						ReportError("Expected file name to include");
-						return false;
-					}
-
-                    // Check invalid path chars
-                    if (!CheckInvalidPathChars(token)) return false;
-
-                    // Absolute paths are not supported...
-                    if (Path.IsPathRooted(includelump))
-					{
-						ReportError("Absolute include paths are not supported by ZDoom");
-						return false;
-					}
-
-					// Relative paths are not supported
-					if(includelump.StartsWith(RELATIVE_PATH_MARKER) || includelump.StartsWith(CURRENT_FOLDER_PATH_MARKER) ||
-					   includelump.StartsWith(ALT_RELATIVE_PATH_MARKER) || includelump.StartsWith(ALT_CURRENT_FOLDER_PATH_MARKER))
-					{
-						ReportError("Relative include paths are not supported by ZDoom");
-						return false;
-					}
-
-					// Backward slashes are not supported
-					if(includelump.Contains(Path.DirectorySeparatorChar.ToString(CultureInfo.InvariantCulture)))
-					{
-						ReportError("Only forward slashes are supported by ZDoom");
-						return false;
-					}
-				
-					// Already parsed?
-					if(parsedlumps.Contains(includelump))
-					{
-						ReportError("Already parsed '" + includelump + "'. Check your #include directives");
-						return false;
-					}
-
-					// Add to collection
-					parsedlumps.Add(includelump);
-
-					// Callback to parse this file
-					if(OnInclude != null) OnInclude(this, includelump, clearerrors);
-
-					// Bail out on error
-					if(this.HasError) return false;
-
-					// Set our buffers back to continue parsing
-					datastream = localstream;
-					datareader = localreader;
-					sourcename = localsourcename;
-				} 
-				else if(token == "$gzdb_skip") //mxd
-				{
-					break;
-				}
-				else 
-				{
-					// Unknown structure!
-					string token2;
-					do 
-					{
-						if(!SkipWhitespace(true)) break;
-						token2 = ReadToken();
-						if(string.IsNullOrEmpty(token2)) break;
-					}
-					while(token2 != "{");
-					int scopelevel = 1;
-					do 
-					{
-						if(!SkipWhitespace(true)) break;
-						token2 = ReadToken();
-						if(string.IsNullOrEmpty(token2)) break;
-						if(token2 == "{") scopelevel++;
-						if(token2 == "}") scopelevel--;
-					}
-					while(scopelevel > 0);
-				}
-			}
-
-			return !this.HasError;
-		}
-
-		#endregion
-
-		#region ================== Methods
-
-		internal void ClearIncludesList() 
-		{
-			parsedlumps.Clear();
-		}
-
-		protected override string GetLanguageType()
-		{
-			return "GLDEFS";
-		}
-
-		#endregion
-	}
+        private struct GldefsLightType
+        {
+            public const string POINT = "pointlight";
+            public const string PULSE = "pulselight";
+            public const string FLICKER = "flickerlight";
+            public const string FLICKER2 = "flickerlight2";
+            public const string SECTOR = "sectorlight";
+
+            public static readonly Dictionary GLDEFS_TO_GZDOOM_LIGHT_TYPE = new Dictionary(StringComparer.Ordinal) { { POINT, DynamicLightType.NORMAL }, { PULSE, DynamicLightType.PULSE }, { FLICKER, DynamicLightType.FLICKER }, { FLICKER2, DynamicLightType.RANDOM }, { SECTOR, DynamicLightType.SECTOR } };
+        }
+
+        #endregion
+
+        #region ================== Delegates
+
+        public delegate void IncludeDelegate(GldefsParser parser, string includefile, bool clearerrors);
+        public IncludeDelegate OnInclude;
+
+        #endregion
+
+        #region ================== Variables
+
+        private readonly Dictionary lightsbyname; //LightName, light definition
+        private readonly Dictionary objects; //ClassName, LightName
+        private readonly Dictionary glowingflats;
+        private readonly Dictionary skyboxes;
+        private readonly HashSet parsedlumps;
+
+        #endregion
+
+        #region ================== Properties
+
+        internal Dictionary LightsByName { get { return lightsbyname; } }
+        internal Dictionary Objects { get { return objects; } }
+        internal Dictionary GlowingFlats { get { return glowingflats; } }
+        internal Dictionary Skyboxes { get { return skyboxes; } }
+
+        #endregion
+
+        #region ================== Constructor
+
+        public GldefsParser()
+        {
+            // Syntax
+            whitespace = "\n \t\r\u00A0";
+            specialtokens = ",{}\n";
+
+            parsedlumps = new HashSet(StringComparer.OrdinalIgnoreCase);
+            lightsbyname = new Dictionary(StringComparer.OrdinalIgnoreCase); //LightName, Light params
+            objects = new Dictionary(StringComparer.OrdinalIgnoreCase); //ClassName, LightName
+            glowingflats = new Dictionary(); // Texture name hash, Glowing Flat Data
+            skyboxes = new Dictionary(StringComparer.OrdinalIgnoreCase);
+        }
+
+        #endregion
+
+        #region ================== Parsing
+
+        public override bool Parse(Stream stream, string sourcefilename, bool clearerrors)
+        {
+            if (!base.Parse(stream, sourcefilename, clearerrors)) return false;
+
+            // Keep local data
+            Stream localstream = datastream;
+            string localsourcename = sourcename;
+            BinaryReader localreader = datareader;
+
+            // Continue until at the end of the stream
+            while (SkipWhitespace(true))
+            {
+                string token = StripTokenQuotes(ReadToken()).ToLowerInvariant(); // Quotes can be anywhere! ANYWHERE!!! And GZDoom will still parse data correctly
+                if (string.IsNullOrEmpty(token)) break;
+
+                switch (token)
+                {
+                    case GldefsLightType.POINT:
+                    case GldefsLightType.PULSE:
+                    case GldefsLightType.SECTOR:
+                    case GldefsLightType.FLICKER:
+                    case GldefsLightType.FLICKER2:
+                        if (!ParseLight(token)) return false;
+                        break;
+
+                    case "object":
+                        if (!ParseObject()) return false;
+                        break;
+
+                    case "glow":
+                        if (!ParseGlowingFlats()) return false;
+                        break;
+
+                    case "skybox":
+                        if (!ParseSkybox()) return false;
+                        break;
+
+                    case "#include":
+                        if (!ParseInclude(clearerrors)) return false;
+
+                        // Set our buffers back to continue parsing
+                        datastream = localstream;
+                        datareader = localreader;
+                        sourcename = localsourcename;
+                        break;
+
+                    case "$gzdb_skip": return !this.HasError;
+
+                    default:
+                        // Unknown structure!
+                        SkipStructure();
+                        break;
+                }
+            }
+
+            // All done
+            return !this.HasError;
+        }
+
+        private bool ParseLight(string lighttype)
+        {
+            DynamicLightData light = new DynamicLightData { Type = GldefsLightType.GLDEFS_TO_GZDOOM_LIGHT_TYPE[lighttype] };
+
+            // Find classname
+            SkipWhitespace(true);
+            string lightname = StripTokenQuotes(ReadToken()).ToLowerInvariant();
+
+            if (string.IsNullOrEmpty(lightname))
+            {
+                ReportError("Expected " + lighttype + " name");
+                return false;
+            }
+
+            // Now find opening brace
+            if (!NextTokenIs("{", false))
+            {
+                ReportError("Expected opening brace");
+                return false;
+            }
+
+            // Read gldefs light structure
+            while (SkipWhitespace(true))
+            {
+                string token = ReadToken().ToLowerInvariant();
+                if (string.IsNullOrEmpty(token)) continue;
+
+                switch (token)
+                {
+                    case "color":
+                        SkipWhitespace(true);
+                        token = StripTokenQuotes(ReadToken());
+                        if (!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out light.Color.Red))
+                        {
+                            // Not numeric!
+                            ReportError("Expected Red color value, but got '" + token + "'");
+                            return false;
+                        }
+
+                        SkipWhitespace(true);
+                        token = StripTokenQuotes(ReadToken());
+                        if (!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out light.Color.Green))
+                        {
+                            // Not numeric!
+                            ReportError("Expected Green color value, but got '" + token + "'");
+                            return false;
+                        }
+
+                        SkipWhitespace(true);
+                        token = StripTokenQuotes(ReadToken());
+                        if (!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out light.Color.Blue))
+                        {
+                            // Not numeric!
+                            ReportError("Expected Blue color value, but got '" + token + "'");
+                            return false;
+                        }
+                        break;
+
+                    case "size":
+                        if (lighttype != GldefsLightType.SECTOR)
+                        {
+                            SkipWhitespace(true);
+
+                            token = StripTokenQuotes(ReadToken());
+                            if (!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out light.PrimaryRadius))
+                            {
+                                // Not numeric!
+                                ReportError("Expected Size value, but got '" + token + "'");
+                                return false;
+                            }
+                            light.PrimaryRadius *= 2;
+
+                        }
+                        else
+                        {
+                            ReportError("'" + token + "' is not valid property for " + lighttype);
+                            return false;
+                        }
+                        break;
+
+                    case "offset":
+                        SkipWhitespace(true);
+                        token = StripTokenQuotes(ReadToken());
+                        if (!ReadSignedFloat(token, ref light.Offset.X))
+                        {
+                            // Not numeric!
+                            ReportError("Expected Offset X value, but got '" + token + "'");
+                            return false;
+                        }
+
+                        SkipWhitespace(true);
+                        token = StripTokenQuotes(ReadToken());
+                        if (!ReadSignedFloat(token, ref light.Offset.Z))
+                        {
+                            // Not numeric!
+                            ReportError("Expected Offset Y value, but got '" + token + "'");
+                            return false;
+                        }
+
+                        SkipWhitespace(true);
+                        token = StripTokenQuotes(ReadToken());
+                        if (!ReadSignedFloat(token, ref light.Offset.Y))
+                        {
+                            // Not numeric!
+                            ReportError("Expected Offset Z value, but got '" + token + "'");
+                            return false;
+                        }
+                        break;
+
+                    case "subtractive":
+                        {
+                            SkipWhitespace(true);
+
+                            token = StripTokenQuotes(ReadToken());
+                            int i;
+                            if (!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out i))
+                            {
+                                // Not numeric!
+                                ReportError("expected Subtractive value, but got '" + token + "'");
+                                return false;
+                            }
+
+                            light.Subtractive = (i == 1);
+                        }
+                        break;
+
+                    case "dontlightself":
+                        {
+                            SkipWhitespace(true);
+
+                            token = StripTokenQuotes(ReadToken());
+                            int i;
+                            if (!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out i))
+                            {
+                                // Not numeric!
+                                ReportError("Expected DontLightSelf value, but got '" + token + "'");
+                                return false;
+                            }
+
+                            light.DontLightSelf = (i == 1);
+                        }
+                        break;
+
+                    case "interval":
+                        if (lighttype == GldefsLightType.PULSE || lighttype == GldefsLightType.FLICKER2)
+                        {
+                            SkipWhitespace(true);
+
+                            token = StripTokenQuotes(ReadToken());
+                            float interval;
+                            if (!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out interval))
+                            {
+                                // Not numeric!
+                                ReportError("Expected Interval value, but got '" + token + "'");
+                                return false;
+                            }
+
+                            if (interval == 0) LogWarning("Interval value should be greater than zero");
+
+                            //I wrote logic for dynamic lights animation first, so here I modify gldefs settings to fit in existing logic
+                            if (lighttype == GldefsLightType.PULSE)
+                            {
+                                light.Interval = (int)(interval * 35); //measured in tics (35 per second) in PointLightPulse, measured in seconds in gldefs' PulseLight
+                            }
+                            else //FLICKER2. Seems like PointLightFlickerRandom to me
+                            {
+                                light.Interval = (int)(interval * 350); //0.1 is one second for FlickerLight2
+                            }
+                        }
+                        else
+                        {
+                            ReportError("'" + token + "' is not valid property for " + lighttype);
+                            return false;
+                        }
+                        break;
+
+                    case "secondarysize":
+                        if (lighttype == GldefsLightType.PULSE || lighttype == GldefsLightType.FLICKER || lighttype == GldefsLightType.FLICKER2)
+                        {
+                            SkipWhitespace(true);
+
+                            token = StripTokenQuotes(ReadToken());
+                            if (!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out light.SecondaryRadius))
+                            {
+                                // Not numeric!
+                                ReportError("Expected SecondarySize value, but got '" + token + "'");
+                                return false;
+                            }
+
+                            light.SecondaryRadius *= 2;
+                        }
+                        else
+                        {
+                            ReportError("'" + token + "' is not valid property for " + lighttype);
+                            return false;
+                        }
+                        break;
+
+                    case "chance":
+                        if (lighttype == GldefsLightType.FLICKER)
+                        {
+                            SkipWhitespace(true);
+
+                            token = StripTokenQuotes(ReadToken());
+                            float chance;
+                            if (!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out chance))
+                            {
+                                // Not numeric!
+                                ReportError("Expected Chance value, but got '" + token + "'");
+                                return false;
+                            }
+
+                            // Transforming from 0.0 .. 1.0 to 0 .. 359 to fit in existing logic
+                            light.Interval = (int)(chance * 359.0f);
+                        }
+                        else
+                        {
+                            ReportError("'" + token + "' is not valid property for " + lighttype);
+                            return false;
+                        }
+                        break;
+
+                    case "scale":
+                        if (lighttype == GldefsLightType.SECTOR)
+                        {
+                            SkipWhitespace(true);
+
+                            token = StripTokenQuotes(ReadToken());
+                            float scale;
+                            if (!float.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out scale))
+                            {
+                                // Not numeric!
+                                ReportError("Expected Scale value, but got '" + token + "'");
+                                return false;
+                            }
+
+                            if (scale > 1.0f)
+                            {
+                                ReportError("Scale must be in 0.0 - 1.0 range, but is " + scale);
+                                return false;
+                            }
+
+                            //sector light doesn't have animation, so we will store it's size in Interval
+                            //transforming from 0.0 .. 1.0 to 0 .. 10 to preserve value.
+                            light.Interval = (int)(scale * 10.0f);
+                        }
+                        else
+                        {
+                            ReportError("'" + token + "' is not valid property for " + lighttype);
+                            return false;
+                        }
+                        break;
+
+                    case "}":
+                        {
+                            bool skip = false;
+
+                            // General checks
+                            if (light.Color.Red == 0.0f && light.Color.Green == 0.0f && light.Color.Blue == 0.0f)
+                            {
+                                LogWarning("'" + lightname + "' light Color is " + light.Color.Red + "," + light.Color.Green + "," + light.Color.Blue + ". It won't be shown in GZDoom");
+                                skip = true;
+                            }
+
+                            // Light-type specific checks
+                            if (light.Type == DynamicLightType.NORMAL && light.PrimaryRadius == 0)
+                            {
+                                LogWarning("'" + lightname + "' light Size is 0. It won't be shown in GZDoom");
+                                skip = true;
+                            }
+
+                            if (light.Type == DynamicLightType.FLICKER || light.Type == DynamicLightType.PULSE || light.Type == DynamicLightType.RANDOM)
+                            {
+                                if (light.PrimaryRadius == 0 && light.SecondaryRadius == 0)
+                                {
+                                    LogWarning("'" + lightname + "' light Size and SecondarySize are 0. This light won't be shown in GZDoom");
+                                    skip = true;
+                                }
+                            }
+
+                            // Offset it slightly to avoid shading glitches
+                            if (light.Offset.Z == 0.0f) light.Offset.Z = 0.1f;
+
+                            // Add to the collection?
+                            if (!skip) lightsbyname[lightname] = light;
+
+                            // Break out of this parsing loop
+                            return true;
+                        }
+                }
+            }
+
+            // All done here
+            return true;
+        }
+
+        private bool ParseObject()
+        {
+            SkipWhitespace(true);
+
+            // Read object class
+            string objectclass = StripTokenQuotes(ReadToken()).ToLowerInvariant();
+
+            if (string.IsNullOrEmpty(objectclass))
+            {
+                ReportError("Expected object class");
+                return false;
+            }
+
+            // Now find opening brace
+            if (!NextTokenIs("{", false))
+            {
+                ReportError("Expected opening brace");
+                return false;
+            }
+
+            int bracescount = 1;
+            bool foundlight = false;
+            bool foundframe = false;
+
+            // Read frames structure
+            while (SkipWhitespace(true))
+            {
+                string token = ReadToken();
+                if (string.IsNullOrEmpty(token)) continue;
+
+                token = StripTokenQuotes(token).ToLowerInvariant();
+                if (!foundlight && !foundframe && token == "frame")
+                {
+                    SkipWhitespace(true);
+                    token = ReadToken().ToLowerInvariant(); // Should be frame name
+
+                    // Use this frame if it's 4 characters long or it's the first frame
+                    foundframe = (token.Length == 4 || (token.Length > 4 && token[4] == 'a'));
+                }
+                else if (!foundlight && foundframe && token == "light") // Just use first light and be done with it
+                {
+                    SkipWhitespace(true);
+                    token = ReadToken().ToLowerInvariant(); // Should be light name
+
+                    if (!string.IsNullOrEmpty(token))
+                    {
+                        if (lightsbyname.ContainsKey(token))
+                        {
+                            objects[objectclass] = token;
+                            foundlight = true;
+                        }
+                        else
+                        {
+                            LogWarning("Light declaration not found for light '" + token + "'");
+                        }
+                    }
+                }
+                else if (token == "{") // Continue in this loop until object structure ends
+                {
+                    bracescount++;
+                }
+                else if (token == "}")
+                {
+                    if (--bracescount < 1) break; // This was Cave Johnson. And we are done here.
+                }
+            }
+
+            // All done here
+            return true;
+        }
+
+        private bool ParseGlowingFlats()
+        {
+            // Next sould be opening brace
+            if (!NextTokenIs("{", false))
+            {
+                ReportError("Expected opening brace");
+                return false;
+            }
+
+            // Parse inner blocks
+            while (SkipWhitespace(true))
+            {
+                string token = ReadToken().ToLowerInvariant();
+                if (token == "}") break; // End of Glow structure
+
+                switch (token)
+                {
+                    case "walls":
+                    case "flats":
+                        if (!NextTokenIs("{", false))
+                        {
+                            ReportError("Expected opening brace");
+                            return false;
+                        }
+
+                        while (SkipWhitespace(true))
+                        {
+                            token = ReadToken();
+                            if (token == "}") break;
+
+                            // Add glow data
+                            long flatnamehash = General.Map.Data.GetFullLongFlatName(Lump.MakeLongName(token, General.Map.Options.UseLongTextureNames));
+                            glowingflats[flatnamehash] = new GlowingFlatData
+                            {
+                                Height = DEFAULT_GLOW_HEIGHT * 2,
+                                Fullbright = true,
+                                Color = new PixelColor(255, 255, 255, 255),
+                                CalculateTextureColor = true
+                            };
+                        }
+                        break;
+
+                    case "subwalls":
+                    case "subflats":
+                        if (!NextTokenIs("{", false))
+                        {
+                            ReportError("Expected opening brace");
+                            return false;
+                        }
+
+                        while (SkipWhitespace(true))
+                        {
+                            token = ReadToken();
+                            if (token == "}") break;
+
+                            // Add glow data
+                            long flatnamehash = General.Map.Data.GetFullLongFlatName(Lump.MakeLongName(token, General.Map.Options.UseLongTextureNames));
+                            glowingflats[flatnamehash] = new GlowingFlatData
+                            {
+                                Height = DEFAULT_GLOW_HEIGHT * 2,
+                                Fullblack = true,
+                                Subtractive = true,
+                                Color = new PixelColor(255, 0, 0, 0),
+                                CalculateTextureColor = false
+                            };
+                        }
+                        break;
+
+                    case "subtexture":
+                    case "texture":
+                        {
+                            int color;
+                            int glowheight = DEFAULT_GLOW_HEIGHT;
+                            bool subtractivetexture = (token == "subtexture");
+                            string texturename = StripTokenQuotes(ReadToken(false));
+
+                            if (string.IsNullOrEmpty(texturename))
+                            {
+                                ReportError("expected " + token + " name");
+                                return false;
+                            }
+
+                            // Now we should find a comma
+                            if (!NextTokenIs(",", false))
+                            {
+                                ReportError("Expected a comma");
+                                return false;
+                            }
+
+                            // Next is color
+                            SkipWhitespace(true);
+                            token = ReadToken();
+
+                            if (!int.TryParse(token, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out color))
+                            {
+                                //probably it's a color name?
+                                Color c = Color.FromName(token); //should be similar to C++ color name detection, I suppose
+                                if (c.IsKnownColor)
+                                {
+                                    color = PixelColor.FromColor(c).ToInt();
+                                }
+                                else
+                                {
+                                    ReportError("expected glow color value, but got '" + token + "'");
+                                    return false;
+                                }
+                            }
+
+                            // The glow data is valid at thispoint. Let's get texture hash 
+                            long texturehash = General.Map.Data.GetFullLongFlatName(Lump.MakeLongName(texturename, General.Map.Options.UseLongTextureNames));
+
+                            // Now we can find a comma
+                            if (!NextTokenIs(",", false))
+                            {
+                                // Add glow data
+                                glowingflats[texturehash] = new GlowingFlatData
+                                {
+                                    Height = glowheight * 2,
+                                    Subtractive = subtractivetexture,
+                                    Color = PixelColor.FromInt(color).WithAlpha(255),
+                                    CalculateTextureColor = false
+                                };
+                                continue;
+                            }
+
+                            // Can be glow height
+                            SkipWhitespace(true);
+                            token = ReadToken();
+
+                            int h;
+                            if (int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out h))
+                            {
+                                // Can't pass glowheight directly cause TryParse will unconditionally set it to 0
+                                glowheight = h;
+
+                                // Now we can find a comma
+                                if (!NextTokenIs(",", false))
+                                {
+                                    // Add glow data
+                                    glowingflats[texturehash] = new GlowingFlatData
+                                    {
+                                        Height = glowheight * 2,
+                                        Subtractive = subtractivetexture,
+                                        Color = PixelColor.FromInt(color).WithAlpha(255),
+                                        CalculateTextureColor = false
+                                    };
+                                    continue;
+                                }
+
+                                // Read the flag
+                                SkipWhitespace(true);
+                                token = ReadToken().ToLowerInvariant();
+                            }
+
+                            // Next is "fullbright" or "fullblack" flag
+                            bool fullbright = (token == "fullbright");
+                            bool fullblack = (!subtractivetexture && token == "fullblack");
+
+                            if (!fullblack && !fullbright)
+                            {
+                                string expectedflags = (subtractivetexture ? "'fullbright'" : "'fullbright' or 'fullblack'");
+                                ReportError("expected " + expectedflags + " flag, but got '" + token + "'");
+                                return false;
+                            }
+
+                            // Add glow data
+                            glowingflats[texturehash] = new GlowingFlatData
+                            {
+                                Height = glowheight * 2,
+                                Fullbright = fullbright,
+                                Fullblack = fullblack,
+                                Subtractive = subtractivetexture,
+                                Color = PixelColor.FromInt(color).WithAlpha(255),
+                                CalculateTextureColor = false
+                            };
+                        }
+                        break;
+                }
+            }
+
+            // All done here
+            return true;
+        }
+
+        private bool ParseSkybox()
+        {
+            SkipWhitespace(true);
+            string name = StripTokenQuotes(ReadToken());
+
+            if (string.IsNullOrEmpty(name))
+            {
+                ReportError("Expected skybox name");
+                return false;
+            }
+
+            if (skyboxes.ContainsKey(name)) LogWarning("Skybox \"" + name + "\" is double-defined");
+
+            SkyboxInfo info = new SkyboxInfo(name.ToUpperInvariant());
+
+            // FlipTop / opening brace
+            SkipWhitespace(true);
+            string token = ReadToken();
+            if (token.ToLowerInvariant() == "fliptop")
+            {
+                info.FlipTop = true;
+                if (!NextTokenIs("{")) return false;
+            }
+            else if (token != "{")
+            {
+                ReportError("Expected opening brace or \"fliptop\" keyword");
+                return false;
+            }
+
+            // Read skybox texture names
+            while (SkipWhitespace(true))
+            {
+                token = ReadToken();
+                if (token == "}") break;
+                info.Textures.Add(token);
+            }
+
+            // Sanity check. Should have 3 or 6 textrues
+            if (info.Textures.Count != 3 && info.Textures.Count != 6)
+            {
+                ReportError("Expected 3 or 6 skybox textures");
+                return false;
+            }
+
+            // Add to collection
+            skyboxes[name] = info;
+
+            // All done here
+            return true;
+        }
+
+        private bool ParseInclude(bool clearerrors)
+        {
+            //INFO: GZDoom GLDEFS include paths can't be relative ("../glstuff.txt") 
+            //or absolute ("d:/project/glstuff.txt") 
+            //or have backward slashes ("info\glstuff.txt")
+            //include paths are relative to the first parsed entry, not the current one 
+            //also include paths may or may not be quoted
+            SkipWhitespace(true);
+            string includelump = StripTokenQuotes(ReadToken(false)); // Don't skip newline
+
+            // Sanity checks
+            if (string.IsNullOrEmpty(includelump))
+            {
+                ReportError("Expected file name to include");
+                return false;
+            }
+
+            // Check invalid path chars
+            if (!CheckInvalidPathChars(includelump)) return false;
+
+            // Absolute paths are not supported...
+            if (Path.IsPathRooted(includelump))
+            {
+                ReportError("Absolute include paths are not supported by GZDoom");
+                return false;
+            }
+
+            // Relative paths are not supported
+            if (includelump.StartsWith(RELATIVE_PATH_MARKER) || includelump.StartsWith(CURRENT_FOLDER_PATH_MARKER) ||
+               includelump.StartsWith(ALT_RELATIVE_PATH_MARKER) || includelump.StartsWith(ALT_CURRENT_FOLDER_PATH_MARKER))
+            {
+                ReportError("Relative include paths are not supported by GZDoom");
+                return false;
+            }
+
+            // Backward slashes are not supported
+            if (includelump.Contains(Path.DirectorySeparatorChar.ToString(CultureInfo.InvariantCulture)))
+            {
+                ReportError("Only forward slashes are supported by GZDoom");
+                return false;
+            }
+
+            // Already parsed?
+            if (parsedlumps.Contains(includelump))
+            {
+                ReportError("Already parsed '" + includelump + "'. Check your #include directives");
+                return false;
+            }
+
+            // Add to collection
+            parsedlumps.Add(includelump);
+
+            // Callback to parse this file
+            if (OnInclude != null) OnInclude(this, includelump, clearerrors);
+
+            // All done here
+            return !this.HasError;
+        }
+
+        #endregion
+
+        #region ================== Methods
+
+        internal void ClearIncludesList()
+        {
+            parsedlumps.Clear();
+        }
+
+        protected override string GetLanguageType()
+        {
+            return "GLDEFS";
+        }
+
+        #endregion
+    }
 }
\ No newline at end of file
diff --git a/Source/Core/GZBuilder/GZDoom/MapinfoParser.cs b/Source/Core/GZBuilder/GZDoom/MapinfoParser.cs
index dd24da5..0e05d25 100644
--- a/Source/Core/GZBuilder/GZDoom/MapinfoParser.cs
+++ b/Source/Core/GZBuilder/GZDoom/MapinfoParser.cs
@@ -11,563 +11,684 @@ using CodeImp.DoomBuilder.GZBuilder.Data;
 
 #endregion
 
-namespace CodeImp.DoomBuilder.GZBuilder.GZDoom 
+namespace CodeImp.DoomBuilder.GZBuilder.GZDoom
 {
-	internal sealed class MapinfoParser : ZDTextParser
-	{
-		#region ================== Delegates
-
-		public delegate void IncludeDelegate(MapinfoParser parser, string includefile, bool clearerror);
-		public IncludeDelegate OnInclude;
-
-		#endregion
-
-		#region ================== Variables
-
-		private MapInfo mapinfo;
-		private string mapname;
-		private readonly Dictionary spawnnums;
-		private readonly Dictionary doomednums; // >
-		private readonly HashSet parsedlumps;
-
-		#endregion
-
-		#region ================== Properties
-
-		public MapInfo MapInfo { get { return mapinfo; } }
-		public Dictionary SpawnNums { get { return spawnnums; } }
-		public Dictionary DoomEdNums { get { return doomednums; } }
-
-		#endregion
-
-		#region ================== Constructor
-
-		public MapinfoParser()
-		{
-			// Syntax
-			whitespace = "\n \t\r\u00A0";
-			specialtokens = ",{}=\n";
-			
-			mapinfo = new MapInfo();
-			spawnnums = new Dictionary();
-			doomednums = new Dictionary();
-			parsedlumps = new HashSet(StringComparer.OrdinalIgnoreCase);
-		}
-
-		#endregion
-
-		#region ================== Parsing
-
-
-		override public bool Parse(Stream stream, string sourcefilename, bool clearerrors)
-		{
-			if(string.IsNullOrEmpty(mapname)) throw new NotSupportedException("MapName is required!");
-			return Parse(stream, sourcefilename, mapname, clearerrors);
-		}
-
-		public bool Parse(Stream stream, string sourcefilename, string mapname, bool clearerrors) 
-		{
-			this.mapname = mapname.ToLowerInvariant();
-			if(!base.Parse(stream, sourcefilename, clearerrors)) return false;
-
-			while(SkipWhitespace(true)) 
-			{
-				string token = ReadToken();
-				if(!string.IsNullOrEmpty(token)) 
-				{
-					token = token.ToLowerInvariant();
-					if(ParseBlock(token, clearerrors)) break;
-				}
-			}
-
-			//check values
-			if(mapinfo.FadeColor.Red > 0 || mapinfo.FadeColor.Green > 0 || mapinfo.FadeColor.Blue > 0)
-				mapinfo.HasFadeColor = true;
-
-			if(mapinfo.OutsideFogColor.Red > 0 || mapinfo.OutsideFogColor.Green > 0 || mapinfo.OutsideFogColor.Blue > 0)
-				mapinfo.HasOutsideFogColor = true;
-
-			//Cannot fail here
-			return true;
-		}
-
-		//returns true if parsing is finished
-		private bool ParseBlock(string token, bool clearerrors) 
-		{
-			// Keep local data
-			Stream localstream = datastream;
-			string localsourcename = sourcename;
-			BinaryReader localreader = datareader;
-			
-			if(token == "map" || token == "defaultmap" || token == "adddefaultmap") 
-			{
-				switch(token)
-				{
-					case "map":
-						//get map name
-						SkipWhitespace(true);
-						token = ReadToken().ToLowerInvariant();
-						if(token != mapname) return false; //not finished, search for next "map", "defaultmap" or "adddefaultmap" block
-						break;
-
-					case "defaultmap":
-						//reset MapInfo
-						mapinfo = new MapInfo();
-						break;
-				}
-
-				// Track brace level
-				int bracelevel = 0;
-
-				//search for required keys
-				while(SkipWhitespace(true)) 
-				{
-					token = ReadToken().ToLowerInvariant();
-//sky1 or sky2
-					if(token == "sky1" || token == "sky2") 
-					{
-						string skyType = token;
-						SkipWhitespace(true);
-						token = StripTokenQuotes(ReadToken()).ToLowerInvariant();
-
-						//new format
-						if(token == "=") 
-						{
-							SkipWhitespace(true);
-
-							//should be sky texture name
-							token = StripTokenQuotes(ReadToken());
-							bool gotComma = (token.IndexOf(",", StringComparison.Ordinal) != -1);
-							if(gotComma) token = token.Replace(",", "");
-							string skyTexture = StripTokenQuotes(token).ToLowerInvariant();
-
-							if(!string.IsNullOrEmpty(skyTexture)) 
-							{
-								if(skyType == "sky1")
-									mapinfo.Sky1 = skyTexture;
-								else
-									mapinfo.Sky2 = skyTexture;
-
-								//check if we have scrollspeed
-								SkipWhitespace(true);
-								token = StripTokenQuotes(ReadToken());
-
-								if(!gotComma && token == ",") 
-								{
-									gotComma = true;
-									SkipWhitespace(true);
-									token = ReadToken();
-								}
-
-								if(gotComma) 
-								{
-									float scrollSpeed = 0;
-									if(!ReadSignedFloat(token, ref scrollSpeed)) 
-									{
-										// Not numeric!
-										ReportError("Expected " + skyType + " scroll speed value, but got '" + token + "'");
-										return false;
-									}
-
-									if(skyType == "sky1")
-										mapinfo.Sky1ScrollSpeed = scrollSpeed;
-									else
-										mapinfo.Sky2ScrollSpeed = scrollSpeed;
-								} 
-								else 
-								{
-									datastream.Seek(-token.Length - 1, SeekOrigin.Current); //step back and try parsing this token again
-								}
-							} 
-							else 
-							{
-								ReportError("Expected " + skyType + " texture name");
-								return false;
-							}
-						}
-						//old format
-						else 
-						{
-							//token should be sky1/2 name
-							if(!string.IsNullOrEmpty(token)) 
-							{
-								if(skyType == "sky1")
-									mapinfo.Sky1 = token;
-								else
-									mapinfo.Sky2 = token;
-
-								//try to read scroll speed
-								SkipWhitespace(true);
-								token = StripTokenQuotes(ReadToken());
-
-								float scrollSpeed = 0;
-								if(!ReadSignedFloat(token, ref scrollSpeed)) 
-								{
-									// Not numeric!
-									datastream.Seek(-token.Length - 1, SeekOrigin.Current); //step back and try parsing this token again
-									continue;
-								}
-
-								if(skyType == "sky1")
-									mapinfo.Sky1ScrollSpeed = scrollSpeed;
-								else
-									mapinfo.Sky2ScrollSpeed = scrollSpeed;
-
-							} 
-							else 
-							{
-								ReportError("Expected " + skyType + " texture name");
-								return false;
-							}
-						}
-					}
-//fade or outsidefog
-					else if(token == "fade" || token == "outsidefog") 
-					{
-						string fadeType = token;
-						SkipWhitespace(true);
-						token = StripTokenQuotes(ReadToken()).ToLowerInvariant();
-
-						//new format?
-						if(token == "=") 
-						{
-							SkipWhitespace(true);
-							token = ReadToken();
-						}
-
-						//get the color value
-						string colorVal = StripTokenQuotes(token).ToLowerInvariant().Replace(" ", "");
-						if(!string.IsNullOrEmpty(colorVal)) 
-						{
-							Color4 color = new Color4();
-							//try to get the color...
-							if(GetColor(colorVal, ref color)) 
-							{
-								if(fadeType == "fade")
-									mapinfo.FadeColor = color;
-								else
-									mapinfo.OutsideFogColor = color;
-							} 
-							else //...or not
-							{ 
-								ReportError("Failed to parse " + fadeType + " value from string '" + colorVal + "'");
-								return false;
-							}
-						} 
-						else 
-						{
-							ReportError("Expected " + fadeType + " color value");
-							return false;
-						}
-					}
-//vertwallshade or horizwallshade
-					else if(token == "vertwallshade" || token == "horizwallshade") 
-					{
-						string shadeType = token;
-						SkipWhitespace(true);
-						token = StripTokenQuotes(ReadToken());
-
-						//new format
-						if(token == "=") 
-						{
-							SkipWhitespace(true);
-							token = StripTokenQuotes(ReadToken());
-						}
-
-						int val = 0;
-						if(!ReadSignedInt(token, ref val)) 
-						{
-							// Not numeric!
-							ReportError("Expected " + shadeType + " value, but got '" + token + "'");
-							return false;
-						}
-
-						if(shadeType == "vertwallshade")
-							mapinfo.VertWallShade = General.Clamp(val, -255, 255);
-						else
-							mapinfo.HorizWallShade = General.Clamp(val, -255, 255);
-					}
-//fogdensity or outsidefogdensity
-					else if(token == "fogdensity" || token == "outsidefogdensity") 
-					{
-						string densityType = token;
-						SkipWhitespace(true);
-						token = StripTokenQuotes(ReadToken());
-
-						//new format
-						if(token == "=") 
-						{
-							SkipWhitespace(true);
-							token = StripTokenQuotes(ReadToken());
-						}
-
-						int val;
-						if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out val)) 
-						{
-							// Not numeric!
-							ReportError("Expected " + densityType + " value, but got '" + token + "'");
-							return false;
-						}
-
-						if(densityType == "fogdensity")
-							mapinfo.FogDensity = (int)(1024 * (256.0f / val));
-						else
-							mapinfo.OutsideFogDensity = (int)(1024 * (256.0f / val));
-					}
-//doublesky
-					else if(token == "doublesky") 
-					{
-						mapinfo.DoubleSky = true;
-					}
-//evenlighting
-					else if(token == "evenlighting") 
-					{
-						mapinfo.EvenLighting = true;
-					}
-//smoothlighting
-					else if(token == "smoothlighting") 
-					{
-						mapinfo.SmoothLighting = true;
-					}
-//block end
-					else if(token == "}") 
-					{
-						return ParseBlock(token, clearerrors);
-					}
-//child block
-					else if(token == "{")
-					{
-						// Skip inner properties
-						bracelevel++;
-						if(bracelevel > 1)
-						{
-							do
-							{
-								SkipWhitespace(true);
-								token = ReadToken();
-								if(token == "{") bracelevel++;
-								else if(token == "}") bracelevel--;
-							} while(!string.IsNullOrEmpty(token) && bracelevel > 1);
-						}
-					}
-				}
-			}
-			else if(token == "include") // It's "include", not "#include". Cause fuck consistency.
-			{
-				SkipWhitespace(true);
-				string includelump = StripTokenQuotes(ReadToken(false)); // Don't skip newline
-
-				//INFO: ZDoom MAPINFO include paths can't be relative ("../mapstuff.txt") 
-				//or absolute ("d:/project/mapstuff.txt") 
-				//or have backward slashes ("info\mapstuff.txt")
-				//include paths are relative to the first parsed entry, not the current one 
-				//also include paths may or may not be quoted
-				if(!string.IsNullOrEmpty(includelump)) 
-				{
-					// Absolute paths are not supported...
-					if(Path.IsPathRooted(includelump))
-					{
-						ReportError("Absolute include paths are not supported by ZDoom");
-						return false;
-					}
-
-					// Relative paths are not supported
-					if(includelump.StartsWith(RELATIVE_PATH_MARKER) || includelump.StartsWith(CURRENT_FOLDER_PATH_MARKER) ||
-					   includelump.StartsWith(ALT_RELATIVE_PATH_MARKER) || includelump.StartsWith(ALT_CURRENT_FOLDER_PATH_MARKER))
-					{
-						ReportError("Relative include paths are not supported by ZDoom");
-						return false;
-					}
-
-					// Backward slashes are not supported
-					if(includelump.Contains(Path.DirectorySeparatorChar.ToString(CultureInfo.InvariantCulture)))
-					{
-						ReportError("Only forward slashes are supported by ZDoom");
-						return false;
-					}
-
-					// Already parsed?
-					if(parsedlumps.Contains(includelump))
-					{
-						ReportError("Already parsed '" + includelump + "'. Check your include directives");
-						return false;
-					}
-
-					// Add to collection
-					parsedlumps.Add(includelump);
-
-					// Callback to parse this file
-					if(OnInclude != null) OnInclude(this, includelump, clearerrors);
-
-					// Bail out on error
-					if(this.HasError) return false;
-
-					// Set our buffers back to continue parsing
-					datastream = localstream;
-					datareader = localreader;
-					sourcename = localsourcename;
-				} 
-				else 
-				{
-					ReportError("Expected filename to include");
-					return false;
-				}
-			}
-			else if(token == "gameinfo")
-			{
-				if(!NextTokenIs("{")) return false; // Finished with this file
-
-				while(SkipWhitespace(true))
-				{
-					token = ReadToken();
-					if(string.IsNullOrEmpty(token))
-					{
-						ReportError("Failed to find the end of GameInfo block");
-						return false; // Finished with this file
-					}
-					if(token == "}") break;
-
-					if(token == "skyflatname")
-					{
-						if(!NextTokenIs("=")) return false; // Finished with this file
-						SkipWhitespace(true);
-						string skyflatname = StripTokenQuotes(ReadToken());
-						if(string.IsNullOrEmpty(skyflatname)) 
-						{
-							ReportError("Unable to get SkyFlatName value");
-							return false; // Finished with this file
-						}
-
-						General.Map.Config.SkyFlatName = skyflatname.ToUpperInvariant();
-					}
-				}
-			}
-			else if(token == "doomednums")
-			{
-				if(!NextTokenIs("{")) return false; // Finished with this file
-
-				while(SkipWhitespace(true)) 
-				{
-					token = ReadToken();
-					if(string.IsNullOrEmpty(token)) 
-					{
-						ReportError("Failed to find the end of DoomEdNums block");
-						return false; // Finished with this file
-					}
-					if(token == "}") break;
-
-					// First must be a number
-					int id;
-					if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out id)) 
-					{
-						// Not numeric!
-						ReportError("Expected DoomEdNums entry number, but got '" + token + "'");
-						return false; // Finished with this file
-					}
-
-					// Then "="
-					if(!NextTokenIs("=")) return false; // Finished with this file
-
-					// Then actor class
-					SkipWhitespace(false);
-					string classname = StripTokenQuotes(ReadToken());
-					if(string.IsNullOrEmpty(classname)) 
-					{
-						ReportError("Unable to get DoomEdNums entry class definition");
-						return false; // Finished with this file
-					}
-
-					// Possible special and args. We'll skip them
-					for(int i = 0; i < 6; i++)
-					{
-						if(!NextTokenIs(",", false)) break;
-
-						// Read special name or arg value
-						if(!SkipWhitespace(true) || string.IsNullOrEmpty(ReadToken())) return false;
-					}
-
-					// Add to collection?
-					if(id != 0) doomednums[id] = classname.ToLowerInvariant();
-				}
-			} 
-			else if(token == "spawnnums")
-			{
-				if(!NextTokenIs("{")) return false; // Finished with this file
-
-				while(SkipWhitespace(true))
-				{
-					token = ReadToken();
-					if(string.IsNullOrEmpty(token)) 
-					{
-						ReportError("Failed to find the end of SpawnNums block");
-						return false; // Finished with this file
-					}
-					if(token == "}") break;
-
-					// First must be a number
-					int id;
-					if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out id)) 
-					{
-						// Not numeric!
-						ReportError("Expected SpawnNums number, but got '" + token + "'");
-						return false; // Finished with this file
-					}
-
-					// Then "="
-					if(!NextTokenIs("=")) return false; // Finished with this file
-
-					// Then actor class
-					SkipWhitespace(false);
-					token = StripTokenQuotes(ReadToken());
-					if(string.IsNullOrEmpty(token))
-					{
-						ReportError("Unable to get SpawnNums entry class definition");
-						return false;
-					}
-
-					// Add to collection
-					spawnnums[id] = token.ToLowerInvariant();
-				}
-			} 
-			else if(token == "$gzdb_skip")
-			{
-				return true; // Finished with this file
-			}
-
-			return false; // Not done yet
-		}
-
-		#endregion
-
-		#region ================== Methods
-
-		private static bool GetColor(string name, ref Color4 color) 
-		{
-			if(name == "black") return true;
-
-			//probably it's a hex color (like FFCC11)?
-			int ci;
-			if(int.TryParse(name, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out ci)) 
-			{
-				color = new Color4(ci) {Alpha = 1.0f};
-				return true;
-			}
-
-			//probably it's a color name?
-			Color c = Color.FromName(name); //should be similar to C++ color name detection, I suppose
-			if(c.IsKnownColor) 
-			{
-				color = new Color4(c);
-				return true;
-			}
-			return false;
-		}
-
-		protected override string GetLanguageType()
-		{
-			return "MAPINFO";
-		}
-
-		#endregion
-	}
-}
+    internal sealed class MapinfoParser : ZDTextParser
+    {
+        #region ================== Delegates
+
+        public delegate void IncludeDelegate(MapinfoParser parser, string includefile, bool clearerror);
+        public IncludeDelegate OnInclude;
+
+        #endregion
+
+        #region ================== Variables
+
+        private MapInfo mapinfo;
+        private string mapname;
+        private readonly Dictionary spawnnums;
+        private readonly Dictionary doomednums; // >
+        private readonly HashSet parsedlumps;
+
+        #endregion
+
+        #region ================== Properties
+
+        public MapInfo MapInfo { get { return mapinfo; } }
+        public Dictionary SpawnNums { get { return spawnnums; } }
+        public Dictionary DoomEdNums { get { return doomednums; } }
+
+        #endregion
+
+        #region ================== Constructor
+
+        public MapinfoParser()
+        {
+            // Syntax
+            whitespace = "\n \t\r\u00A0";
+            specialtokens = ",{}=\n";
+
+            mapinfo = new MapInfo();
+            spawnnums = new Dictionary();
+            doomednums = new Dictionary();
+            parsedlumps = new HashSet(StringComparer.OrdinalIgnoreCase);
+        }
+
+        #endregion
+
+        #region ================== Parsing
+
+
+        override public bool Parse(Stream stream, string sourcefilename, bool clearerrors)
+        {
+            if (string.IsNullOrEmpty(mapname)) throw new NotSupportedException("Map name required!");
+            return Parse(stream, sourcefilename, mapname, clearerrors);
+        }
+
+        public bool Parse(Stream stream, string sourcefilename, string mapname, bool clearerrors)
+        {
+            this.mapname = mapname.ToLowerInvariant();
+            if (!base.Parse(stream, sourcefilename, clearerrors)) return false;
+
+            // Keep local data
+            Stream localstream = datastream;
+            string localsourcename = sourcename;
+            BinaryReader localreader = datareader;
+
+            // Classic format skip stoppers...
+            HashSet breakat = new HashSet { "map", "defaultmap", "adddefaultmap" };
+
+            while (SkipWhitespace(true))
+            {
+                string token = ReadToken().ToLowerInvariant();
+                if (string.IsNullOrEmpty(token)) break;
+                bool stopparsing = false;
+
+                switch (token)
+                {
+                    case "adddefaultmap":
+                        // Parse properties
+                        if (!ParseMapBlock()) return false;
+                        break;
+
+                    case "defaultmap":
+                        // Reset MapInfo
+                        mapinfo = new MapInfo();
+
+                        // Parse properties
+                        if (!ParseMapBlock()) return false;
+                        break;
+
+                    case "map":
+                        // Get map lump name
+                        SkipWhitespace(true);
+                        token = ReadToken().ToLowerInvariant();
+                        if (token != this.mapname)
+                        {
+                            // Map number? Try to build map name from it...
+                            int n;
+                            if (int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out n))
+                            {
+                                token = ((n > 0 && n < 10) ? "map0" + n : "map" + n);
+                            }
+
+                            // Still no dice?
+                            if (token != this.mapname)
+                            {
+                                SkipStructure(breakat);
+                                continue; // Not finished, search for next "map", "defaultmap" or "adddefaultmap" block
+                            }
+                        }
+
+                        // Try to get map name
+                        SkipWhitespace(true);
+                        token = ReadToken();
+                        if (token.ToLowerInvariant() == "lookup")
+                        {
+                            // No dice...
+                            SkipWhitespace(true);
+                            ReadToken();
+                        }
+                        else
+                        {
+                            mapinfo.Title = StripTokenQuotes(token);
+                        }
+
+                        // Parse properties
+                        if (!ParseMapBlock()) return false;
+                        break;
+
+                    case "include":
+                        if (!ParseInclude(clearerrors)) return false;
+
+                        // Set our buffers back to continue parsing
+                        datastream = localstream;
+                        datareader = localreader;
+                        sourcename = localsourcename;
+                        break;
+
+                    case "gameinfo":
+                        if (!ParseGameInfo()) return false;
+                        break;
+
+                    case "doomednums":
+                        if (!ParseDoomEdNums()) return false;
+                        break;
+
+                    case "spawnnums":
+                        if (!ParseSpawnNums()) return false;
+                        break;
+
+                    case "$gzdb_skip":
+                        stopparsing = true; // Finished with this file
+                        break;
+                }
+
+                if (stopparsing) break;
+            }
+
+            // Check values
+            if (mapinfo.FadeColor.Red > 0 || mapinfo.FadeColor.Green > 0 || mapinfo.FadeColor.Blue > 0)
+                mapinfo.HasFadeColor = true;
+
+            if (mapinfo.OutsideFogColor.Red > 0 || mapinfo.OutsideFogColor.Green > 0 || mapinfo.OutsideFogColor.Blue > 0)
+                mapinfo.HasOutsideFogColor = true;
+
+            // All done
+            return !this.HasError;
+        }
+
+        private bool ParseInclude(bool clearerrors)
+        {
+            SkipWhitespace(true);
+            string includelump = StripTokenQuotes(ReadToken(false)); // Don't skip newline
+
+            //INFO: ZDoom MAPINFO include paths can't be relative ("../mapstuff.txt") 
+            //or absolute ("d:/project/mapstuff.txt") 
+            //or have backward slashes ("info\mapstuff.txt")
+            //include paths are relative to the first parsed entry, not the current one 
+            //also include paths may or may not be quoted
+            if (!string.IsNullOrEmpty(includelump))
+            {
+                // Absolute paths are not supported...
+                if (Path.IsPathRooted(includelump))
+                {
+                    ReportError("Absolute include paths are not supported by ZDoom");
+                    return false;
+                }
+
+                // Relative paths are not supported
+                if (includelump.StartsWith(RELATIVE_PATH_MARKER) || includelump.StartsWith(CURRENT_FOLDER_PATH_MARKER) ||
+                   includelump.StartsWith(ALT_RELATIVE_PATH_MARKER) || includelump.StartsWith(ALT_CURRENT_FOLDER_PATH_MARKER))
+                {
+                    ReportError("Relative include paths are not supported by ZDoom");
+                    return false;
+                }
+
+                // Backward slashes are not supported
+                if (includelump.Contains(Path.DirectorySeparatorChar.ToString(CultureInfo.InvariantCulture)))
+                {
+                    ReportError("Only forward slashes are supported by ZDoom");
+                    return false;
+                }
+
+                // Check invalid path chars
+                if (!CheckInvalidPathChars(includelump)) return false;
+
+                // Already parsed?
+                if (parsedlumps.Contains(includelump))
+                {
+                    ReportError("Already parsed '" + includelump + "'. Check your include directives");
+                    return false;
+                }
+
+                // Add to collection
+                parsedlumps.Add(includelump);
+
+                // Callback to parse this file
+                if (OnInclude != null)
+                {
+                    OnInclude(this, includelump, clearerrors);
+
+                    // Bail out on error
+                    if (this.HasError) return false;
+                }
+            }
+            else
+            {
+                ReportError("Expected filename to include");
+                return false;
+            }
+
+            // All done here
+            return true;
+        }
+
+        private bool ParseGameInfo()
+        {
+            if (!NextTokenIs("{")) return false; // Finished with this file
+
+            while (SkipWhitespace(true))
+            {
+                string token = ReadToken();
+                if (string.IsNullOrEmpty(token))
+                {
+                    ReportError("Failed to find the end of GameInfo block");
+                    return false; // Finished with this file
+                }
+
+                if (token == "}") break;
+
+                if (token.ToLowerInvariant() == "skyflatname")
+                {
+                    if (!NextTokenIs("=")) return false; // Finished with this file
+                    SkipWhitespace(true);
+                    string skyflatname = StripTokenQuotes(ReadToken());
+                    if (string.IsNullOrEmpty(skyflatname))
+                    {
+                        ReportError("Unable to get SkyFlatName value");
+                        return false; // Finished with this file
+                    }
+
+                    General.Map.Config.SkyFlatName = skyflatname.ToUpperInvariant();
+                }
+            }
+
+            // All done here
+            return true;
+        }
+
+        private bool ParseDoomEdNums()
+        {
+            if (!NextTokenIs("{")) return false; // Finished with this file
+
+            while (SkipWhitespace(true))
+            {
+                string token = ReadToken();
+                if (string.IsNullOrEmpty(token))
+                {
+                    ReportError("Failed to find the end of DoomEdNums block");
+                    return false; // Finished with this file
+                }
+
+                if (token == "}") break;
+
+                // First must be a number
+                int id;
+                if (!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out id))
+                {
+                    // Not numeric!
+                    ReportError("Expected DoomEdNums entry number, but got '" + token + "'");
+                    return false; // Finished with this file
+                }
+
+                // Then "="
+                if (!NextTokenIs("=")) return false; // Finished with this file
+
+                // Then actor class
+                SkipWhitespace(false);
+                string classname = StripTokenQuotes(ReadToken());
+                if (string.IsNullOrEmpty(classname))
+                {
+                    ReportError("Unable to get DoomEdNums entry class definition");
+                    return false; // Finished with this file
+                }
+
+                // Possible special and args. We'll skip them
+                for (int i = 0; i < 6; i++)
+                {
+                    if (!NextTokenIs(",", false)) break;
+
+                    // Read special name or arg value
+                    if (!SkipWhitespace(true) || string.IsNullOrEmpty(ReadToken())) return false;
+                }
+
+                // Add to collection?
+                if (id != 0) doomednums[id] = classname.ToLowerInvariant();
+            }
+
+            // All done here
+            return true;
+        }
+
+        private bool ParseSpawnNums()
+        {
+            if (!NextTokenIs("{")) return false; // Finished with this file
+
+            while (SkipWhitespace(true))
+            {
+                string token = ReadToken();
+                if (string.IsNullOrEmpty(token))
+                {
+                    ReportError("Failed to find the end of SpawnNums block");
+                    return false; // Finished with this file
+                }
+
+                if (token == "}") break;
+
+                // First must be a number
+                int id;
+                if (!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out id))
+                {
+                    // Not numeric!
+                    ReportError("Expected SpawnNums number, but got '" + token + "'");
+                    return false; // Finished with this file
+                }
+
+                // Then "="
+                if (!NextTokenIs("=")) return false; // Finished with this file
+
+                // Then actor class
+                SkipWhitespace(false);
+                token = StripTokenQuotes(ReadToken());
+                if (string.IsNullOrEmpty(token))
+                {
+                    ReportError("Unable to get SpawnNums entry class definition");
+                    return false;
+                }
+
+                // Add to collection
+                spawnnums[id] = token.ToLowerInvariant();
+            }
+
+            // All done here
+            return true;
+        }
+
+        #endregion
+
+        #region ================== Map block parsing
+
+        private bool ParseMapBlock()
+        {
+            bool classicformat = !NextTokenIs("{", false);
+
+            // Track brace level
+            int bracelevel = 0;
+
+            // Parse required values
+            while (SkipWhitespace(true))
+            {
+                string token = ReadToken().ToLowerInvariant();
+                switch (token)
+                {
+                    //TODO: are there any other blocks available in the classic format?..
+                    case "map":
+                    case "defaultmap":
+                    case "adddefaultmap":
+                        if (classicformat)
+                        {
+                            // We parsed too greadily, step back
+                            DataStream.Seek(-token.Length - 1, SeekOrigin.Current);
+
+                            // Finished with this block
+                            return true;
+                        }
+                        else
+                        {
+                            ReportError("Unexpected token \"" + token + "\"");
+                            return false;
+                        }
+
+                    case "sky2":
+                    case "sky1":
+                        if (!ParseSky(token)) return false;
+                        break;
+
+                    case "outsidefog":
+                    case "fade":
+                        if (!ParseFade(token)) return false;
+                        break;
+
+                    case "horizwallshade":
+                    case "vertwallshade":
+                        if (!ParseWallShade(token)) return false;
+                        break;
+
+                    case "outsidefogdensity":
+                    case "fogdensity":
+                        if (!ParseFogDensity(token)) return false;
+                        break;
+
+                    case "doublesky":
+                        mapinfo.DoubleSky = true;
+                        break;
+
+                    case "evenlighting":
+                        mapinfo.EvenLighting = true;
+                        break;
+
+                    case "smoothlighting":
+                        mapinfo.SmoothLighting = true;
+                        break;
+
+                    case "}": return true; // Block end
+
+                    case "{": // Skip inner blocks
+                        bracelevel++;
+                        if (bracelevel > 1)
+                        {
+                            do
+                            {
+                                SkipWhitespace(true);
+                                token = ReadToken();
+                                if (token == "{") bracelevel++;
+                                else if (token == "}") bracelevel--;
+                            } while (!string.IsNullOrEmpty(token) && bracelevel > 1);
+                        }
+                        break;
+                }
+            }
+
+            // All done here
+            return true;
+        }
+
+        private bool ParseSky(string skytype)
+        {
+            SkipWhitespace(true);
+            string token = StripTokenQuotes(ReadToken());
+
+            // New format
+            if (token == "=")
+            {
+                SkipWhitespace(true);
+
+                // Should be sky texture name
+                token = StripTokenQuotes(ReadToken());
+                bool gotcomma = (token.IndexOf(",", StringComparison.Ordinal) != -1);
+                if (gotcomma) token = token.Replace(",", "");
+                string skytexture = token.ToUpperInvariant();
+
+                if (string.IsNullOrEmpty(skytexture))
+                {
+                    ReportError("Expected " + skytype + " texture name");
+                    return false;
+                }
+
+                if (skytype == "sky1")
+                    mapinfo.Sky1 = skytexture;
+                else
+                    mapinfo.Sky2 = skytexture;
+
+                // Check if we have scrollspeed
+                SkipWhitespace(true);
+                token = StripTokenQuotes(ReadToken());
+
+                if (!gotcomma && token == ",")
+                {
+                    gotcomma = true;
+                    SkipWhitespace(true);
+                    token = StripTokenQuotes(ReadToken());
+                }
+
+                if (gotcomma)
+                {
+                    float scrollspeed = 0;
+                    if (!ReadSignedFloat(token, ref scrollspeed))
+                    {
+                        // Not numeric!
+                        ReportError("Expected " + skytype + " scroll speed value, but got '" + token + "'");
+                        return false;
+                    }
+
+                    if (skytype == "sky1")
+                        mapinfo.Sky1ScrollSpeed = scrollspeed;
+                    else
+                        mapinfo.Sky2ScrollSpeed = scrollspeed;
+                }
+                else
+                {
+                    datastream.Seek(-token.Length - 1, SeekOrigin.Current); // Step back and try parsing this token again
+                }
+            }
+            // Old format
+            else
+            {
+                // Token should be sky1/2 name
+                if (string.IsNullOrEmpty(token))
+                {
+                    ReportError("Expected " + skytype + " texture name");
+                    return false;
+                }
+
+                if (skytype == "sky1")
+                    mapinfo.Sky1 = token.ToUpperInvariant();
+                else
+                    mapinfo.Sky2 = token.ToUpperInvariant();
+
+                // Try to read scroll speed
+                SkipWhitespace(true);
+                token = StripTokenQuotes(ReadToken());
+
+                float scrollspeed = 0;
+                if (!ReadSignedFloat(token, ref scrollspeed))
+                {
+                    // Not numeric!
+                    datastream.Seek(-token.Length - 1, SeekOrigin.Current); // Step back and try parsing this token again
+                    return true;
+                }
+
+                if (skytype == "sky1")
+                    mapinfo.Sky1ScrollSpeed = scrollspeed;
+                else
+                    mapinfo.Sky2ScrollSpeed = scrollspeed;
+            }
+
+            // All done here
+            return true;
+        }
+
+        private bool ParseFade(string fadetype)
+        {
+            SkipWhitespace(true);
+            string token = StripTokenQuotes(ReadToken());
+
+            // New format?
+            if (token == "=")
+            {
+                SkipWhitespace(true);
+                token = StripTokenQuotes(ReadToken());
+            }
+
+            // Get the color value
+            string colorval = StripTokenQuotes(token).ToLowerInvariant().Replace(" ", "");
+
+            if (string.IsNullOrEmpty(colorval))
+            {
+                ReportError("Expected " + fadetype + " color value");
+                return false;
+            }
+
+            Color4 color = new Color4();
+
+            // Try to get the color...
+            if (GetColor(colorval, ref color))
+            {
+                if (fadetype == "fade")
+                    mapinfo.FadeColor = color;
+                else
+                    mapinfo.OutsideFogColor = color;
+            }
+            else //...or not
+            {
+                ReportError("Failed to parse " + fadetype + " value from string '" + colorval + "'");
+                return false;
+            }
+
+            // All done here
+            return true;
+        }
+
+        private bool ParseWallShade(string shadetype)
+        {
+            SkipWhitespace(true);
+            string token = StripTokenQuotes(ReadToken());
+
+            // New format
+            if (token == "=")
+            {
+                SkipWhitespace(true);
+                token = StripTokenQuotes(ReadToken());
+            }
+
+            int val = 0;
+            if (!ReadSignedInt(token, ref val))
+            {
+                // Not numeric!
+                ReportError("Expected " + shadetype + " value, but got '" + token + "'");
+                return false;
+            }
+
+            if (shadetype == "vertwallshade")
+                mapinfo.VertWallShade = General.Clamp(val, -255, 255);
+            else
+                mapinfo.HorizWallShade = General.Clamp(val, -255, 255);
+
+            // All done here
+            return true;
+        }
+
+        private bool ParseFogDensity(string densitytype)
+        {
+            SkipWhitespace(true);
+            string token = StripTokenQuotes(ReadToken());
+
+            // New format
+            if (token == "=")
+            {
+                SkipWhitespace(true);
+                token = StripTokenQuotes(ReadToken());
+            }
+
+            int val;
+            if (!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out val))
+            {
+                // Not numeric!
+                ReportError("Expected " + densitytype + " value, but got '" + token + "'");
+                return false;
+            }
+
+            if (densitytype == "fogdensity")
+                mapinfo.FogDensity = (int)(1024 * (256.0f / val));
+            else
+                mapinfo.OutsideFogDensity = (int)(1024 * (256.0f / val));
+
+            // All done here
+            return true;
+        }
+
+        #endregion
+
+        #region ================== Methods
+
+        private static bool GetColor(string name, ref Color4 color)
+        {
+            if (name == "black") return true;
+
+            //probably it's a hex color (like FFCC11)?
+            int ci;
+            if (int.TryParse(name, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out ci))
+            {
+                color = new Color4(ci) { Alpha = 1.0f };
+                return true;
+            }
+
+            //probably it's a color name?
+            Color c = Color.FromName(name); //should be similar to C++ color name detection, I suppose
+            if (c.IsKnownColor)
+            {
+                color = new Color4(c);
+                return true;
+            }
+            return false;
+        }
+
+        protected override string GetLanguageType()
+        {
+            return "MAPINFO";
+        }
+
+        #endregion
+    }
+}
\ No newline at end of file
diff --git a/Source/Core/GZBuilder/GZGeneral.cs b/Source/Core/GZBuilder/GZGeneral.cs
index 6cf2a72..d976c9d 100644
--- a/Source/Core/GZBuilder/GZGeneral.cs
+++ b/Source/Core/GZBuilder/GZGeneral.cs
@@ -2,6 +2,7 @@
 
 using CodeImp.DoomBuilder.Actions;
 using CodeImp.DoomBuilder.Config;
+using CodeImp.DoomBuilder.Editing;
 using CodeImp.DoomBuilder.Windows;
 using CodeImp.DoomBuilder.GZBuilder.Data;
 
@@ -73,25 +74,43 @@ namespace CodeImp.DoomBuilder.GZBuilder
 		[BeginAction("gztogglelights")]
 		private static void ToggleLightsRenderingMode() 
 		{
-			switch(General.Settings.GZDrawLightsMode) 
-			{
-				case LightRenderMode.NONE:
-					General.Settings.GZDrawLightsMode = LightRenderMode.ALL;
-					General.MainWindow.DisplayStatus(StatusType.Action, "Dynamic lights rendering mode: ALL");
-					break;
+            if (General.Editing.Mode is ClassicMode)
+            {
+                switch (General.Settings.GZDrawLightsMode)
+                {
+                    case LightRenderMode.NONE:
+                        General.Settings.GZDrawLightsMode = LightRenderMode.ALL;
+                        General.MainWindow.DisplayStatus(StatusType.Action, "Dynamic lights rendering mode: ALL");
+                        break;
 
-				case LightRenderMode.ALL:
-					General.Settings.GZDrawLightsMode = LightRenderMode.ALL_ANIMATED;
-					General.MainWindow.DisplayStatus(StatusType.Action, "Models rendering mode: ANIMATED");
-					break;
+                    default:
+                        General.Settings.GZDrawLightsMode = LightRenderMode.NONE;
+                        General.MainWindow.DisplayStatus(StatusType.Action, "Dynamic lights rendering mode: NONE");
+                        break;
+                }
+            }
+            else
+            {
+                switch (General.Settings.GZDrawLightsMode)
+                {
+                    case LightRenderMode.NONE:
+                        General.Settings.GZDrawLightsMode = LightRenderMode.ALL;
+                        General.MainWindow.DisplayStatus(StatusType.Action, "Dynamic lights rendering mode: ALL");
+                        break;
 
-				case LightRenderMode.ALL_ANIMATED:
-					General.Settings.GZDrawLightsMode = LightRenderMode.NONE;
-					General.MainWindow.DisplayStatus(StatusType.Action, "Models rendering mode: NONE");
-					break;
-			}
-			
-			General.MainWindow.RedrawDisplay();
+                    case LightRenderMode.ALL:
+                        General.Settings.GZDrawLightsMode = LightRenderMode.ALL_ANIMATED;
+                        General.MainWindow.DisplayStatus(StatusType.Action, "Dynamic lights rendering mode: ANIMATED");
+                        break;
+
+                    case LightRenderMode.ALL_ANIMATED:
+                        General.Settings.GZDrawLightsMode = LightRenderMode.NONE;
+                        General.MainWindow.DisplayStatus(StatusType.Action, "Dynamic lights rendering mode: NONE");
+                        break;
+                }
+            }
+
+            General.MainWindow.RedrawDisplay();
 			General.MainWindow.UpdateGZDoomPanel();
 		}
 
@@ -104,18 +123,29 @@ namespace CodeImp.DoomBuilder.GZBuilder
 			General.MainWindow.UpdateGZDoomPanel();
 		}
 
-		[BeginAction("gztogglefx")]
+        [BeginAction("gztogglesky")]
+        private static void ToggleSky()
+        {
+            General.Settings.GZDrawSky = !General.Settings.GZDrawSky;
+            General.MainWindow.DisplayStatus(StatusType.Action, "Sky rendering is " + (General.Settings.GZDrawSky ? "ENABLED" : "DISABLED"));
+            General.MainWindow.RedrawDisplay();
+            General.MainWindow.UpdateGZDoomPanel();
+        }
+
+        [BeginAction("gztogglefx")]
 		private static void ToggleFx() 
 		{
 			int on = 0;
 			on += General.Settings.GZDrawFog ? 1 : -1;
-			on += General.Settings.GZDrawLightsMode != LightRenderMode.NONE ? 1 : -1;
+            on += General.Settings.GZDrawSky ? 1 : -1;
+            on += General.Settings.GZDrawLightsMode != LightRenderMode.NONE ? 1 : -1;
 			on += General.Settings.GZDrawModelsMode != ModelRenderMode.NONE ? 1 : -1;
 
 			bool enable = (on < 0);
 
 			General.Settings.GZDrawFog = enable;
-			General.Settings.GZDrawLightsMode = (enable ? LightRenderMode.ALL : LightRenderMode.NONE);
+            General.Settings.GZDrawSky = enable;
+            General.Settings.GZDrawLightsMode = (enable ? LightRenderMode.ALL : LightRenderMode.NONE);
 			General.Settings.GZDrawModelsMode = (enable ? ModelRenderMode.ALL : ModelRenderMode.NONE);
 			General.MainWindow.DisplayStatus(StatusType.Action, "Advanced effects are " + (enable ? "ENABLED" : "DISABLED") );
 
diff --git a/Source/Core/General/General.cs b/Source/Core/General/General.cs
index b5b8a1c..6ca22d2 100644
--- a/Source/Core/General/General.cs
+++ b/Source/Core/General/General.cs
@@ -1807,8 +1807,8 @@ namespace CodeImp.DoomBuilder
 			return e.Current;
 		}
 
-		// This returns the next power of 2
-		public static int NextPowerOf2(int v)
+        // This returns the next power of 2
+        /*public static int NextPowerOf2(int v)
 		{
 			int p = 0;
 
@@ -1817,10 +1817,24 @@ namespace CodeImp.DoomBuilder
 
 			// Return power
 			return (int)Math.Pow(2, p);
-		}
-		
-		// Convert bool to integer
-		internal static int Bool2Int(bool v)
+		}*/
+
+        //mxd. This returns the next power of 2. Taken from http://bits.stephan-brumme.com/roundUpToNextPowerOfTwo.html
+        public static int NextPowerOf2(int x)
+        {
+            x--;
+            x |= x >> 1;  // handle  2 bit numbers
+            x |= x >> 2;  // handle  4 bit numbers
+            x |= x >> 4;  // handle  8 bit numbers
+            x |= x >> 8;  // handle 16 bit numbers
+            x |= x >> 16; // handle 32 bit numbers
+            x++;
+
+            return x;
+        }
+
+        // Convert bool to integer
+        internal static int Bool2Int(bool v)
 		{
 			return v ? 1 : 0;
 		}
diff --git a/Source/Core/Geometry/Tools.cs b/Source/Core/Geometry/Tools.cs
index 4c81ef6..fafd2fa 100644
--- a/Source/Core/Geometry/Tools.cs
+++ b/Source/Core/Geometry/Tools.cs
@@ -2127,7 +2127,8 @@ namespace CodeImp.DoomBuilder.Geometry
 		public static List GetDynamicLightShapes()
 		{
 			List circles = new List();
-			foreach(Thing t in General.Map.Map.Things)
+            const int linealpha = 128;
+            foreach (Thing t in General.Map.Map.Things)
 			{
 				int lightid = Array.IndexOf(GZBuilder.GZGeneral.GZ_LIGHTS, t.Type);
 				if(lightid == -1) continue;
@@ -2171,15 +2172,15 @@ namespace CodeImp.DoomBuilder.Geometry
 				switch(t.Type)
 				{
 					case 1502: // Vavoom light
-						color = new PixelColor(255, 255, 255, 255);
+						color = new PixelColor(linealpha, 255, 255, 255);
 						break;
 
 					case 1503: // Vavoom colored light
-						color = new PixelColor(255, (byte)t.Args[1], (byte)t.Args[2], (byte)t.Args[3]);
+						color = new PixelColor(linealpha, (byte)t.Args[1], (byte)t.Args[2], (byte)t.Args[3]);
 						break;
 
 					default:
-						color = new PixelColor(255, (byte)t.Args[0], (byte)t.Args[1], (byte)t.Args[2]);
+						color = new PixelColor(linealpha, (byte)t.Args[0], (byte)t.Args[1], (byte)t.Args[2]);
 						break;
 				}
 
diff --git a/Source/Core/Map/Linedef.cs b/Source/Core/Map/Linedef.cs
index bebca28..b5e3f40 100644
--- a/Source/Core/Map/Linedef.cs
+++ b/Source/Core/Map/Linedef.cs
@@ -305,7 +305,7 @@ namespace CodeImp.DoomBuilder.Map
 		}
 		
 		// This copies all properties to another line
-		new public void CopyPropertiesTo(Linedef l)
+		public void CopyPropertiesTo(Linedef l)
 		{
 			l.BeforePropsChange();
 			
diff --git a/Source/Core/Properties/Resources.Designer.cs b/Source/Core/Properties/Resources.Designer.cs
index c0d8eb3..a17717a 100644
--- a/Source/Core/Properties/Resources.Designer.cs
+++ b/Source/Core/Properties/Resources.Designer.cs
@@ -1179,7 +1179,16 @@ namespace CodeImp.DoomBuilder.Properties {
                 return ((System.Drawing.Bitmap)(obj));
             }
         }
-        
+
+        internal static System.Drawing.Bitmap Sky
+        {
+            get
+            {
+                object obj = ResourceManager.GetObject("Sky", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+
         /// 
         ///   Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
         /// 
diff --git a/Source/Core/Properties/Resources.resx b/Source/Core/Properties/Resources.resx
index 5bc1b99..b333e4b 100644
--- a/Source/Core/Properties/Resources.resx
+++ b/Source/Core/Properties/Resources.resx
@@ -544,6 +544,9 @@
   
     ..\Resources\GridIncrease.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
   
+  
+    ..\Resources\Sky.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+  
   
     ..\Resources\zonebuilder.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
   
diff --git a/Source/Core/Rendering/Display2DShader.cs b/Source/Core/Rendering/Display2DShader.cs
index 908c6bd..0d02cb5 100644
--- a/Source/Core/Rendering/Display2DShader.cs
+++ b/Source/Core/Rendering/Display2DShader.cs
@@ -113,12 +113,12 @@ namespace CodeImp.DoomBuilder.Rendering
 		// This sets up the render pipeline
 		public override void BeginPass(int index)
 		{
-			Device device = manager.D3DDevice.Device;
-
 			if(!manager.Enabled)
 			{
-				// Sampler settings
-				if(General.Settings.ClassicBilinear)
+                Device device = manager.D3DDevice.Device;
+
+                // Sampler settings
+                if (General.Settings.ClassicBilinear)
 				{
 					device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Linear);
 					device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Linear);
diff --git a/Source/Core/Rendering/Renderer3D.cs b/Source/Core/Rendering/Renderer3D.cs
index b03b024..1868251 100644
--- a/Source/Core/Rendering/Renderer3D.cs
+++ b/Source/Core/Rendering/Renderer3D.cs
@@ -43,13 +43,16 @@ namespace CodeImp.DoomBuilder.Rendering
 		private const float FOG_RANGE = 0.9f;
 		internal const float GZDOOM_VERTICAL_VIEW_STRETCH = 1.2f;
 		internal const float GZDOOM_INVERTED_VERTICAL_VIEW_STRETCH = 1.0f / GZDOOM_VERTICAL_VIEW_STRETCH;
-		
-		#endregion
 
-		#region ================== Variables
+        private const int SHADERPASS_LIGHT = 17; //mxd
+        private const int SHADERPASS_SKYBOX = 5; //mxd
 
-		// Matrices
-		private Matrix projection;
+        #endregion
+
+        #region ================== Variables
+
+        // Matrices
+        private Matrix projection;
 		private Matrix view3d;
 		private Matrix viewproj; //mxd
 		private Matrix billboard;
@@ -92,8 +95,11 @@ namespace CodeImp.DoomBuilder.Rendering
 		//mxd. Translucent geometry to be rendered. Must be sorted by camera distance.
 		private List translucentgeo;
 
-		//mxd. Solid things to be rendered (currently(?) there won't be any). Must be sorted by sector.
-		private Dictionary> solidthings;
+        //mxd. Geometry to be rendered as skybox.
+        private List skygeo;
+
+        //mxd. Solid things to be rendered (currently(?) there won't be any). Must be sorted by sector.
+        private Dictionary> solidthings;
 
 		//mxd. Masked things to be rendered. Must be sorted by sector.
 		private Dictionary> maskedthings;
@@ -400,8 +406,9 @@ namespace CodeImp.DoomBuilder.Rendering
 			solidgeo = new Dictionary>(); //mxd
 			maskedgeo = new Dictionary>(); //mxd
 			translucentgeo = new List(); //mxd
+            skygeo = new List(); //mxd
 
-			solidthings = new Dictionary>(); //mxd
+            solidthings = new Dictionary>(); //mxd
 			maskedthings = new Dictionary>(); //mxd
 			translucentthings = new List(); //mxd
 			
@@ -427,8 +434,16 @@ namespace CodeImp.DoomBuilder.Rendering
 			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
 			graphics.Shaders.World3D.Begin();
 
-			// SOLID PASS
-			world = Matrix.Identity;
+            //mxd. SKY PASS
+            if (skygeo.Count > 0)
+            {
+                world = Matrix.Identity;
+                ApplyMatrices3D();
+                RenderSky(skygeo);
+            }
+
+            // SOLID PASS
+            world = Matrix.Identity;
 			ApplyMatrices3D();
 			RenderSinglePass(solidgeo, solidthings);
 
@@ -510,8 +525,9 @@ namespace CodeImp.DoomBuilder.Rendering
 			solidgeo = null;
 			maskedgeo = null;
 			translucentgeo = null;
+            skygeo = null;
 
-			solidthings = null;
+            solidthings = null;
 			maskedthings = null;
 			translucentthings = null;
 			
@@ -951,7 +967,8 @@ namespace CodeImp.DoomBuilder.Rendering
 				// If the camera is inside a sector, compare z coordinates
 				translucentgeo.Sort(delegate(VisualGeometry vg1, VisualGeometry vg2)
 				{
-					float camdist1, camdist2;
+                    if (vg1 == vg2) return 0;
+                    float camdist1, camdist2;
 
 					if((vg1.GeometryType == VisualGeometryType.FLOOR || vg1.GeometryType == VisualGeometryType.CEILING)
 						&& General.Map.VisualCamera.Sector.Index == vg1.Sector.Sector.Index)
@@ -978,9 +995,13 @@ namespace CodeImp.DoomBuilder.Rendering
 			}
 			else
 			{
-				translucentgeo.Sort((vg1, vg2) => (int)((General.Map.VisualCamera.Position - vg2.BoundingBox[0]).GetLengthSq()
-													  - (General.Map.VisualCamera.Position - vg1.BoundingBox[0]).GetLengthSq()));
-			}
+                translucentgeo.Sort(delegate (VisualGeometry vg1, VisualGeometry vg2)
+                {
+                    if (vg1 == vg2) return 0;
+                    return (int)((General.Map.VisualCamera.Position - vg2.BoundingBox[0]).GetLengthSq()
+                               - (General.Map.VisualCamera.Position - vg1.BoundingBox[0]).GetLengthSq());
+                });
+            }
 
 			ImageData curtexture;
 			VisualSector sector = null;
@@ -1104,12 +1125,16 @@ namespace CodeImp.DoomBuilder.Rendering
 				graphics.Device.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Clamp);
 				graphics.Device.SetRenderState(RenderState.CullMode, Cull.None); //mxd. Disable backside culling, because otherwise sprites with positive ScaleY and negative ScaleX will be facing away from the camera...
 
-				// Sort geometry by camera distance. First vertex of the BoundingBox is it's center
-				thingspass.Sort((vt1, vt2) => (int)((General.Map.VisualCamera.Position - vt2.BoundingBox[0]).GetLengthSq()
-												  - (General.Map.VisualCamera.Position - vt1.BoundingBox[0]).GetLengthSq()));
+                // Sort geometry by camera distance. First vertex of the BoundingBox is it's center
+                thingspass.Sort(delegate (VisualThing vt1, VisualThing vt2)
+                {
+                    if (vt1 == vt2) return 0;
+                    return (int)((General.Map.VisualCamera.Position - vt2.BoundingBox[0]).GetLengthSq()
+                               - (General.Map.VisualCamera.Position - vt1.BoundingBox[0]).GetLengthSq());
+                });
 
-				// Reset vars
-				currentpass = RenderPass.Solid;
+                // Reset vars
+                currentpass = RenderPass.Solid;
 				curtexturename = 0;
 				Color4 vertexcolor = new Color4();
 				fogfactor = -1;
@@ -1279,7 +1304,7 @@ namespace CodeImp.DoomBuilder.Rendering
 			if(geometrytolit.Count == 0) return;
 			
 			graphics.Shaders.World3D.World = Matrix.Identity;
-			graphics.Shaders.World3D.BeginPass(17);
+			graphics.Shaders.World3D.BeginPass(SHADERPASS_LIGHT);
 
 			VisualSector sector = null;
 
@@ -1565,10 +1590,61 @@ namespace CodeImp.DoomBuilder.Rendering
 			graphics.Shaders.World3D.EndPass();
 		}
 
-		//mxd. This gets color from dynamic lights based on distance to thing. 
-		//thing position must be in absolute cordinates 
-		//(thing.Position.Z value is relative to floor of the sector the thing is in)
-		private Color4 GetLitColorForThing(VisualThing t) 
+        //mxd
+        private void RenderSky(IEnumerable geo)
+        {
+            VisualSector sector = null;
+
+            // Set render settings
+            graphics.Shaders.World3D.BeginPass(SHADERPASS_SKYBOX);
+            graphics.Shaders.World3D.Texture1 = General.Map.Data.SkyBox;
+            graphics.Shaders.World3D.World = world;
+            graphics.Shaders.World3D.CameraPosition = new Vector4(cameraposition.x, cameraposition.y, cameraposition.z, 0f);
+
+            foreach (VisualGeometry g in geo)
+            {
+                // Changing sector?
+                if (!object.ReferenceEquals(g.Sector, sector))
+                {
+                    // Update the sector if needed
+                    if (g.Sector.NeedsUpdateGeo) g.Sector.Update();
+
+                    // Only do this sector when a vertexbuffer is created
+                    //mxd. No Map means that sector was deleted recently, I suppose
+                    if (g.Sector.GeometryBuffer != null && g.Sector.Sector.Map != null)
+                    {
+                        // Change current sector
+                        sector = g.Sector;
+
+                        // Set stream source
+                        graphics.Device.SetStreamSource(0, sector.GeometryBuffer, 0, WorldVertex.Stride);
+                    }
+                    else
+                    {
+                        sector = null;
+                    }
+                }
+
+                if (sector != null)
+                {
+                    // Set the colors to use
+                    graphics.Shaders.World3D.HighlightColor = CalculateHighlightColor((g == highlighted) && showhighlight, (g.Selected && showselection));
+
+                    // Apply changes
+                    graphics.Shaders.World3D.ApplySettings();
+
+                    // Render!
+                    graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
+                }
+            }
+
+            graphics.Shaders.World3D.EndPass();
+        }
+
+        //mxd. This gets color from dynamic lights based on distance to thing. 
+        //thing position must be in absolute cordinates 
+        //(thing.Position.Z value is relative to floor of the sector the thing is in)
+        private Color4 GetLitColorForThing(VisualThing t) 
 		{
 			Color4 litColor = new Color4();
 			foreach(VisualThing lt in lightthings)
@@ -1595,7 +1671,8 @@ namespace CodeImp.DoomBuilder.Rendering
 		// This calculates the highlight/selection color
 		private Color4 CalculateHighlightColor(bool ishighlighted, bool isselected)
 		{
-			Color4 highlightcolor = isselected ? General.Colors.Selection.ToColorValue() : General.Colors.Highlight.ToColorValue();
+            if (!ishighlighted && !isselected) return new Color4(); //mxd
+            Color4 highlightcolor = isselected ? General.Colors.Selection.ToColorValue() : General.Colors.Highlight.ToColorValue();
 			highlightcolor.Alpha = ishighlighted ? highlightglowinv : highlightglow;
 			return highlightcolor;
 		}
@@ -1627,26 +1704,36 @@ namespace CodeImp.DoomBuilder.Rendering
 			// Must have a texture and vertices
 			if(g.Texture != null && g.Triangles > 0)
 			{
-				switch(g.RenderPass)
-				{
-					case RenderPass.Solid:
-						if(!solidgeo.ContainsKey(g.Texture)) solidgeo.Add(g.Texture, new List());
-						solidgeo[g.Texture].Add(g);
-						break;
+                if (g.RenderAsSky && General.Settings.GZDrawSky)
+                {
+                    skygeo.Add(g);
+                }
+                else
+                {
+                    switch (g.RenderPass)
+                    {
+                        case RenderPass.Solid:
+                            if (!solidgeo.ContainsKey(g.Texture))
+                                solidgeo.Add(g.Texture, new List());
+                            solidgeo[g.Texture].Add(g);
+                            break;
 
-					case RenderPass.Mask:
-						if(!maskedgeo.ContainsKey(g.Texture)) maskedgeo.Add(g.Texture, new List());
-						maskedgeo[g.Texture].Add(g);
-						break;
+                        case RenderPass.Mask:
+                            if (!maskedgeo.ContainsKey(g.Texture))
+                                maskedgeo.Add(g.Texture, new List());
+                            maskedgeo[g.Texture].Add(g);
+                            break;
 
-					case RenderPass.Additive: case RenderPass.Alpha:
-						translucentgeo.Add(g);
-						break;
+                        case RenderPass.Additive:
+                        case RenderPass.Alpha:
+                            translucentgeo.Add(g);
+                            break;
 
-					default:
-						throw new NotImplementedException("Geometry rendering of " + g.RenderPass + " render pass is not implemented!");
-				}
-			}
+                        default:
+                            throw new NotImplementedException("Geometry rendering of " + g.RenderPass + " render pass is not implemented!");
+                    }
+                }
+            }
 		}
 
 		// This collects a visual sector's geometry for rendering
diff --git a/Source/Core/Rendering/Things2DShader.cs b/Source/Core/Rendering/Things2DShader.cs
index c096939..29facab 100644
--- a/Source/Core/Rendering/Things2DShader.cs
+++ b/Source/Core/Rendering/Things2DShader.cs
@@ -137,12 +137,12 @@ namespace CodeImp.DoomBuilder.Rendering
 		// This sets up the render pipeline
 		public override void BeginPass(int index)
 		{
-			Device device = manager.D3DDevice.Device;
-
 			if(!manager.Enabled)
 			{
-				// Sampler settings
-				if(General.Settings.ClassicBilinear)
+                Device device = manager.D3DDevice.Device;
+
+                // Sampler settings
+                if (General.Settings.ClassicBilinear)
 				{
 					device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Linear);
 					device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Linear);
diff --git a/Source/Core/Rendering/World3DShader.cs b/Source/Core/Rendering/World3DShader.cs
index 98161bf..eed8477 100644
--- a/Source/Core/Rendering/World3DShader.cs
+++ b/Source/Core/Rendering/World3DShader.cs
@@ -67,7 +67,7 @@ namespace CodeImp.DoomBuilder.Rendering
 			}
 		}
 
-		public Texture Texture1 { set { if(manager.Enabled) effect.SetTexture(texture1, value); settingschanged = true; } }
+		public BaseTexture Texture1 { set { if(manager.Enabled) effect.SetTexture(texture1, value); settingschanged = true; } }
 
 		//mxd
 		private Color4 vertexcolor;
@@ -184,7 +184,7 @@ namespace CodeImp.DoomBuilder.Rendering
 				lightPositionAndRadiusHandle = effect.GetParameter(null, "lightPosAndRadius");
 				lightColorHandle = effect.GetParameter(null, "lightColor");
 				//fog
-				camPosHandle = effect.GetParameter(null, "cameraPos");
+				camPosHandle = effect.GetParameter(null, "campos");
 
 				world = effect.GetParameter(null, "world");
 			}
@@ -285,12 +285,12 @@ namespace CodeImp.DoomBuilder.Rendering
 		// This sets up the render pipeline
 		public override void BeginPass(int index)
 		{
-			Device device = manager.D3DDevice.Device;
-
 			if(!manager.Enabled)
 			{
-				// Sampler settings
-				if(General.Settings.VisualBilinear)
+                Device device = manager.D3DDevice.Device;
+
+                // Sampler settings
+                if (General.Settings.VisualBilinear)
 				{
 					device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Linear);
 					device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Linear);
diff --git a/Source/Core/Resources/Actions.cfg b/Source/Core/Resources/Actions.cfg
index 92591bb..ba14a24 100644
--- a/Source/Core/Resources/Actions.cfg
+++ b/Source/Core/Resources/Actions.cfg
@@ -1166,6 +1166,16 @@ gztogglefog
 	allowscroll = false;
 }
 
+gztogglesky
+{
+	title = "Toggle sky rendering";
+	category = "gzdoombuilder";
+	description = "Toggles sky rendering in Visual mode.";
+	allowkeys = true;
+	allowmouse = true;
+	allowscroll = false;
+}
+
 gztogglefx
 {
 	title = "Toggle models, dynamic lights and fog rendering";
diff --git a/Source/Core/Resources/MissingSky3D.png b/Source/Core/Resources/MissingSky3D.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb86d71e31c28cf540cae3c970caf04c3b0a6304
GIT binary patch
literal 24951
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

Py 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 literal 0 HcmV?d00001 diff --git a/Source/Core/Resources/Sky.png b/Source/Core/Resources/Sky.png new file mode 100644 index 0000000000000000000000000000000000000000..0d331c8fdade5f1071bcfc71d4d5b0bfbed0b795 GIT binary patch literal 1220 zcmaJ>ZD<>19KWQUEY-SB5KSrL@g{ZFCU=+1CAqV4dAYO;EVWBhmZFnf?w%xPdoSKy zm!vY4F*>UtorndE%y;&oj?IA#oy=h=9SRN=w6h<|=(iOuRX2uTd@f5mKh!;N&&!|R z@Bjb(U%2U^!GZR+&Nd9g+LQbEG&(!%Z@UxiGbc&`bhxcV)*99dR#`A07L~L-1W83G z!ZZ}5>I;`)ABMGb%bBc|P3`AIP4Nmg##>Qz#Ky3`y%k*$$DjrBuqdlx{Ex3L;y{+d z_(3K`rt~;0$@?Y^I6OI+5huq)R>Jo_1^Ox+a-cv<02O6iHMvR{ulwcD-8K_As6(u= zFn(K9HZ=s|ngIdh4R}N{5ClQiOEJNqKiCU=B*hRUP0*yrM{|CX^ZP(!;V7CR6}U9t z--v}?VZ3BnI!6%Ya@kv^y_!)ZD3)aj(nt7w9)$3iRn-zI9@X64^uR+?G-Tb9H5J$% zg}gRlg>j_xb_$A~N^Lq;%|@Y6$%u-e6O@-E6vfV~jyA0{ydz^vw3(^ukVr#Qn=nMw zkHYRI8P)FYfovdB!||Fpp+MD2@?jiVypk+&G|NO|@nC-}#LyI#U|6a@#`;2hG{^*) zK!|Q~ld5S6stB80`3^U6S1uPfpkQf6M$^Wd-5V-tmS&bT9mM1HZh<`qWmVG3=HqsG z8)~5;ABIxDp(&tVA5Pvv0~HGJEE^BSLUh#DA4>R{ILjbo%tw+525)esEpl&g+5hDd zNDN^&_dm^Un$QH<*UiyIkImtSDw=o$jkZwwLBTMGKgmZkm8H0IH|~G=+N~SwYsY#Y z0w3kB?($Z}g)iSb>FPdD+ literal 0 HcmV?d00001 diff --git a/Source/Core/Resources/world3d.fx b/Source/Core/Resources/world3d.fx index 1661905..dca8012 100644 --- a/Source/Core/Resources/world3d.fx +++ b/Source/Core/Resources/world3d.fx @@ -18,8 +18,21 @@ struct PixelData float2 uv : TEXCOORD0; }; -//mxd -// Pixel input data for light pass +//mxd. Vertex input data for sky rendering +struct SkyVertexData +{ + float3 pos : POSITION; + float2 uv : TEXCOORD0; +}; + +//mxd. Pixel input data for sky rendering +struct SkyPixelData +{ + float4 pos : POSITION; + float3 tex : TEXCOORD0; +}; + +//mxd. Pixel input data for light pass struct LitPixelData { float4 pos : POSITION; @@ -44,7 +57,10 @@ float4 lightPosAndRadius; float4 lightColor; //also used as fog color //fog -const float4 cameraPos; //w is set to fade factor (distance, at wich fog color completely overrides pixel color) +const float4 campos; //w is set to fade factor (distance, at wich fog color completely overrides pixel color) + +//sky +static const float4 skynormal = float4(0.0f, 1.0f, 0.0f, 0.0f); // Texture input const texture texture1; @@ -66,6 +82,17 @@ sampler2D texturesamp = sampler_state MaxAnisotropy = maxanisotropysetting; }; +//mxd. Skybox texture sampler settings +samplerCUBE skysamp = sampler_state +{ + Texture = ; + MagFilter = magfiltersettings; + MinFilter = minfiltersettings; + MipFilter = mipfiltersettings; + MipMapLodBias = 0.0f; + MaxAnisotropy = maxanisotropysetting; +}; + // Vertex shader PixelData vs_main(VertexData vd) { @@ -100,7 +127,7 @@ LitPixelData vs_customvertexcolor_fog(VertexData vd) // Fill pixel data input pd.pos = mul(float4(vd.pos, 1.0f), worldviewproj); - pd.pos_w = mul(float4(vd.pos, 1.0f), world); + pd.pos_w = mul(float4(vd.pos, 1.0f), world).xyz; pd.color = vertexColor; pd.uv = vd.uv; pd.normal = vd.normal; @@ -114,7 +141,7 @@ LitPixelData vs_lightpass(VertexData vd) { LitPixelData pd; pd.pos = mul(float4(vd.pos, 1.0f), worldviewproj); - pd.pos_w = mul(float4(vd.pos, 1.0f), world); + pd.pos_w = mul(float4(vd.pos, 1.0f), world).xyz; pd.color = vd.color; pd.uv = vd.uv; pd.normal = vd.normal; @@ -165,8 +192,8 @@ float4 ps_fullbright_highlight(PixelData pd) : COLOR //mxd. This adds fog color to current pixel color float4 getFogColor(LitPixelData pd, float4 color) { - float fogdist = max(16.0f, distance(pd.pos_w, cameraPos.xyz)); - float fogfactor = exp2(cameraPos.w * fogdist); + float fogdist = max(16.0f, distance(pd.pos_w, campos.xyz)); + float fogfactor = exp2(campos.w * fogdist); color.rgb = lerp(lightColor.rgb, color.rgb, fogfactor); return color; @@ -238,6 +265,23 @@ float4 ps_lightpass(LitPixelData pd) : COLOR return lightColorMod; //should never get here } +//mxd. Vertex skybox shader +SkyPixelData vs_skybox(SkyVertexData vd) +{ + SkyPixelData pd; + pd.pos = mul(float4(vd.pos, 1.0f), worldviewproj); + float3 worldpos = mul(float4(vd.pos, 1.0f), world).xyz; + pd.tex = reflect(worldpos - campos.xyz, normalize(mul(skynormal, world).xyz)); + return pd; +} + +//mxd. Pixel skybox shader +float4 ps_skybox(SkyPixelData pd) : COLOR +{ + float4 ncolor = texCUBE(skysamp, pd.tex); + return float4(highlightcolor.rgb * highlightcolor.a + (ncolor.rgb - 0.4f * highlightcolor.a), 1.0f); +} + // Technique for shader model 2.0 technique SM20 { @@ -277,8 +321,13 @@ technique SM20 PixelShader = compile ps_2_0 ps_main(); } - pass p5 {} //mxd. need this only to maintain offset - + //mxd. Skybox shader + pass p5 + { + VertexShader = compile vs_2_0 vs_skybox(); + PixelShader = compile ps_2_0 ps_skybox(); + } + // Normal with highlight pass p6 { diff --git a/Source/Core/VisualModes/VisualGeometry.cs b/Source/Core/VisualModes/VisualGeometry.cs index 9ef92b6..75a920c 100644 --- a/Source/Core/VisualModes/VisualGeometry.cs +++ b/Source/Core/VisualModes/VisualGeometry.cs @@ -75,13 +75,14 @@ namespace CodeImp.DoomBuilder.VisualModes private Vector3D[] boundingBox; protected VisualGeometryType geometrytype; protected string partname; //UDMF part name - - #endregion + protected bool renderassky; - #region ================== Properties - - // Internal properties - public WorldVertex[] Vertices { get { return vertices; } } //mxd + #endregion + + #region ================== Properties + + // Internal properties + public WorldVertex[] Vertices { get { return vertices; } } //mxd internal int VertexOffset { get { return vertexoffset; } set { vertexoffset = value; } } internal int Triangles { get { return triangles; } } @@ -89,11 +90,12 @@ namespace CodeImp.DoomBuilder.VisualModes public Vector3D[] BoundingBox { get { return boundingBox; } } public VisualGeometryType GeometryType { get { return geometrytype; } } public float FogFactor { get { return fogfactor; } set { fogfactor = value; } } + public bool RenderAsSky { get { return renderassky; } } - ///

- /// Render pass in which this geometry must be rendered. Default is Solid. - /// - public RenderPass RenderPass { get { return renderpass; } set { renderpass = value; } } + /// + /// Render pass in which this geometry must be rendered. Default is Solid. + /// + public RenderPass RenderPass { get { return renderpass; } set { renderpass = value; } } /// /// Image to use as texture on this geometry. @@ -131,7 +133,6 @@ namespace CodeImp.DoomBuilder.VisualModes /// /// This creates visual geometry that is bound to a sidedef. This geometry is only visible when the sidedef is visible. It is automatically back-face culled during rendering and automatically XY intersection tested as well as back-face culled during object picking. /// - /// protected VisualGeometry(VisualSector vs, Sidedef sd) { this.sector = vs; diff --git a/Source/Core/VisualModes/VisualVertex.cs b/Source/Core/VisualModes/VisualVertex.cs index d52995c..d7543ed 100644 --- a/Source/Core/VisualModes/VisualVertex.cs +++ b/Source/Core/VisualModes/VisualVertex.cs @@ -1,14 +1,14 @@ using System; +using CodeImp.DoomBuilder.Geometry; using CodeImp.DoomBuilder.Map; using SlimDX; -using CodeImp.DoomBuilder.Geometry; namespace CodeImp.DoomBuilder.VisualModes { public class VisualVertexPair { - private VisualVertex floorvert; - private VisualVertex ceilvert; + private readonly VisualVertex floorvert; + private readonly VisualVertex ceilvert; public VisualVertex[] Vertices { get { return new[] { floorvert, ceilvert }; } } public VisualVertex FloorVertex { get { return floorvert; } } @@ -37,18 +37,17 @@ namespace CodeImp.DoomBuilder.VisualModes } } - public abstract class VisualVertex : IVisualPickable, IComparable + public abstract class VisualVertex : IVisualPickable { //Constants public const float DEFAULT_SIZE = 6.0f; //Variables - protected Vertex vertex; + protected readonly Vertex vertex; private Matrix position; - private float cameradistance; protected bool selected; protected bool changed; - protected bool ceilingVertex; + protected readonly bool ceilingVertex; protected bool haveOffset; //Properties @@ -90,13 +89,5 @@ namespace CodeImp.DoomBuilder.VisualModes { return false; } - - /// - /// This sorts things by distance from the camera. Farthest first. - /// - public int CompareTo(VisualVertex other) - { - return Math.Sign(other.cameradistance - this.cameradistance); - } } } diff --git a/Source/Core/Windows/MainForm.Designer.cs b/Source/Core/Windows/MainForm.Designer.cs index 5e299ff..6744b58 100644 --- a/Source/Core/Windows/MainForm.Designer.cs +++ b/Source/Core/Windows/MainForm.Designer.cs @@ -197,7 +197,8 @@ namespace CodeImp.DoomBuilder.Windows this.modelsshowfiltered = new System.Windows.Forms.ToolStripMenuItem(); this.modelsshowall = new System.Windows.Forms.ToolStripMenuItem(); this.buttontogglefog = new System.Windows.Forms.ToolStripButton(); - this.buttontoggleeventlines = new System.Windows.Forms.ToolStripButton(); + this.buttontogglesky = new System.Windows.Forms.ToolStripButton(); + this.buttontoggleeventlines = new System.Windows.Forms.ToolStripButton(); this.buttontogglevisualvertices = new System.Windows.Forms.ToolStripButton(); this.separatorgzmodes = new System.Windows.Forms.ToolStripSeparator(); this.buttontest = new System.Windows.Forms.ToolStripSplitButton(); @@ -1262,6 +1263,7 @@ namespace CodeImp.DoomBuilder.Windows this.dynamiclightmode, this.modelrendermode, this.buttontogglefog, + this.buttontogglesky, this.buttontoggleeventlines, this.buttontogglevisualvertices, this.separatorgzmodes, @@ -1843,10 +1845,22 @@ namespace CodeImp.DoomBuilder.Windows this.buttontogglefog.Tag = "builder_gztogglefog"; this.buttontogglefog.Text = "Toggle Fog Rendering"; this.buttontogglefog.Click += new System.EventHandler(this.InvokeTaggedAction); - // - // buttontoggleeventlines - // - this.buttontoggleeventlines.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + // + // buttontogglesky + // + this.buttontogglesky.CheckOnClick = true; + this.buttontogglesky.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.buttontogglesky.Image = global::CodeImp.DoomBuilder.Properties.Resources.Sky; + this.buttontogglesky.ImageTransparentColor = System.Drawing.Color.Magenta; + this.buttontogglesky.Name = "buttontogglesky"; + this.buttontogglesky.Size = new System.Drawing.Size(23, 20); + this.buttontogglesky.Tag = "builder_gztogglesky"; + this.buttontogglesky.Text = "Toggle Sky Rendering"; + this.buttontogglesky.Click += new System.EventHandler(this.InvokeTaggedAction); + // + // buttontoggleeventlines + // + this.buttontoggleeventlines.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this.buttontoggleeventlines.Image = global::CodeImp.DoomBuilder.Properties.Resources.InfoLine; this.buttontoggleeventlines.ImageTransparentColor = System.Drawing.Color.Magenta; this.buttontoggleeventlines.Name = "buttontoggleeventlines"; @@ -2647,7 +2661,8 @@ namespace CodeImp.DoomBuilder.Windows private System.Windows.Forms.ToolStripSeparator seperatorgeometry; private System.Windows.Forms.ToolStripButton buttontogglefx; private System.Windows.Forms.ToolStripButton buttontogglefog; - private System.Windows.Forms.ToolStripStatusLabel warnsLabel; + private System.Windows.Forms.ToolStripButton buttontogglesky; + private System.Windows.Forms.ToolStripStatusLabel warnsLabel; private System.Windows.Forms.ToolStripMenuItem itemReloadModedef; private System.Windows.Forms.ToolStripMenuItem itemReloadGldefs; private System.Windows.Forms.ToolStripSeparator separatorDrawModes; diff --git a/Source/Core/Windows/MainForm.cs b/Source/Core/Windows/MainForm.cs index 175b415..55f42b5 100644 --- a/Source/Core/Windows/MainForm.cs +++ b/Source/Core/Windows/MainForm.cs @@ -420,8 +420,11 @@ namespace CodeImp.DoomBuilder.Windows // Map opened? if(General.Map != null) { - // Show map name and filename in caption - this.Text = (mapchanged ? "\u25CF " : "") + General.Map.FileTitle + " (" + General.Map.Options.CurrentName + ") - " + Application.ProductName; + // Get nice name + string maptitle = (!string.IsNullOrEmpty(General.Map.Data.MapInfo.Title) ? ": " + General.Map.Data.MapInfo.Title : ""); + + // Show map name and filename in caption + this.Text = (mapchanged ? "\u25CF " : "") + General.Map.FileTitle + " (" + General.Map.Options.CurrentName + ") - " + Application.ProductName; } else { @@ -2039,7 +2042,8 @@ namespace CodeImp.DoomBuilder.Windows dynamiclightmode.Visible = General.Settings.GZToolbarGZDoom && maploaded; buttontogglefx.Visible = General.Settings.GZToolbarGZDoom && maploaded; buttontogglefog.Visible = General.Settings.GZToolbarGZDoom && maploaded; - buttontoggleeventlines.Visible = General.Settings.GZToolbarGZDoom && maploaded; + buttontogglesky.Visible = General.Settings.GZToolbarGZDoom && maploaded; + buttontoggleeventlines.Visible = General.Settings.GZToolbarGZDoom && maploaded; buttontogglevisualvertices.Visible = General.Settings.GZToolbarGZDoom && maploaded; separatorgzmodes.Visible = General.Settings.GZToolbarGZDoom && maploaded; @@ -2192,7 +2196,8 @@ namespace CodeImp.DoomBuilder.Windows } buttontogglefog.Checked = General.Settings.GZDrawFog; - buttontoggleeventlines.Checked = General.Settings.GZShowEventLines; + buttontogglesky.Checked = General.Settings.GZDrawSky; + buttontoggleeventlines.Checked = General.Settings.GZShowEventLines; buttontogglevisualvertices.Visible = General.Map.UDMF; buttontogglevisualvertices.Checked = General.Settings.GZShowVisualVertices; } diff --git a/Source/Core/ZDoom/ZDTextParser.cs b/Source/Core/ZDoom/ZDTextParser.cs index 8e9f65f..8bf9105 100644 --- a/Source/Core/ZDoom/ZDTextParser.cs +++ b/Source/Core/ZDoom/ZDTextParser.cs @@ -17,6 +17,7 @@ #region ================== Namespaces using System; +using System.Collections.Generic; using System.Globalization; using System.Text; using System.IO; @@ -87,14 +88,23 @@ namespace CodeImp.DoomBuilder.ZDoom //mxd. Clear error status? if(clearerrors) ClearError(); - //mxd. Integrity check - if(stream == null || stream.Length == 0) - { - ReportError("Unable to load '" + sourcefilename + "'"); - return false; - } - - datastream = stream; + //mxd. Integrity checks + if (stream == null) + { + ReportError("Unable to load \"" + sourcefilename + "\""); + return false; + } + + if (stream.Length == 0) + { + if (!string.IsNullOrEmpty(sourcename)) + LogWarning("Include file \"" + sourcefilename + "\" is empty"); + else + LogWarning("File is empty"); + return true; + } + + datastream = stream; datareader = new BinaryReader(stream, Encoding.ASCII); sourcename = sourcefilename; datastream.Seek(0, SeekOrigin.Begin); @@ -470,9 +480,38 @@ namespace CodeImp.DoomBuilder.ZDoom if(success) value = val * sign; return success; } - - // This reports an error - protected internal void ReportError(string message) + + //mxd + protected void SkipStructure() { SkipStructure(new HashSet()); } + protected void SkipStructure(HashSet breakat) + { + string token; + do + { + if (!SkipWhitespace(true)) break; + token = ReadToken(); + if (string.IsNullOrEmpty(token)) break; + if (breakat.Contains(token)) + { + DataStream.Seek(-token.Length - 1, SeekOrigin.Current); + return; + } + } + while (token != "{"); + int scopelevel = 1; + do + { + if (!SkipWhitespace(true)) break; + token = ReadToken(); + if (string.IsNullOrEmpty(token)) break; + if (token == "{") scopelevel++; + if (token == "}") scopelevel--; + } + while (scopelevel > 0); + } + + // This reports an error + protected internal void ReportError(string message) { // Set error information errordesc = message; @@ -606,7 +645,7 @@ namespace CodeImp.DoomBuilder.ZDoom case 60: case 62: case 124: - ReportError("unsupported character \"" + c + "\" in path \"" + path + "\"."); + ReportError("Unsupported character \"" + c + "\" in path \"" + path + "\"."); return false; default: diff --git a/Source/Plugins/BuilderModes/IO/WavefrontExporter.cs b/Source/Plugins/BuilderModes/IO/WavefrontExporter.cs index d57fd70..d67b222 100644 --- a/Source/Plugins/BuilderModes/IO/WavefrontExporter.cs +++ b/Source/Plugins/BuilderModes/IO/WavefrontExporter.cs @@ -197,7 +197,7 @@ namespace CodeImp.DoomBuilder.BuilderModes.IO BaseVisualMode mode = new BaseVisualMode(); bool renderingEffectsDisabled = false; - if(!BaseVisualMode.GZDoomRenderingEffects) + if(!General.Settings.GZDoomRenderingEffects) { renderingEffectsDisabled = true; mode.ToggleGZDoomRenderingEffects(); diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs index 877af70..4a59d23 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs @@ -95,8 +95,6 @@ namespace CodeImp.DoomBuilder.BuilderModes private readonly List copybuffer; private Type lasthighlighttype; - private static bool gzdoomRenderingEffects = true; //mxd - private BSP bsp; //mxd. Moved here from Tools @@ -161,7 +159,6 @@ namespace CodeImp.DoomBuilder.BuilderModes } public object HighlightedTarget { get { return target.picked; } } //mxd - public static bool GZDoomRenderingEffects { get { return gzdoomRenderingEffects; } } //mxd public bool UseSelectionFromClassicMode { get { return useSelectionFromClassicMode; } } //mxd new public IRenderer3D Renderer { get { return renderer; } } @@ -785,8 +782,8 @@ namespace CodeImp.DoomBuilder.BuilderModes Sector[] sectorsWithEffects = null; bsp.Update(); - if(!gzdoomRenderingEffects) - { + if (!General.Settings.GZDoomRenderingEffects) + { //store all sectors with effects if(sectordata != null && sectordata.Count > 0) { @@ -828,10 +825,10 @@ namespace CodeImp.DoomBuilder.BuilderModes vertices.Clear(); } - if(!gzdoomRenderingEffects) return; //mxd - - // Find all sector who's tag is not 0 and hash them so that we can find them quicly - foreach(Sector s in General.Map.Map.Sectors) + if (!General.Settings.GZDoomRenderingEffects) return; //mxd + + // Find all sector who's tag is not 0 and hash them so that we can find them quicly + foreach (Sector s in General.Map.Map.Sectors) { foreach(int tag in s.Tags) { @@ -1591,9 +1588,9 @@ namespace CodeImp.DoomBuilder.BuilderModes { base.OnUndoEnd(); - //mxd. Effects may've become invalid - if(gzdoomRenderingEffects && sectordata != null && sectordata.Count > 0) - RebuildElementData(); + //mxd. Effects may've become invalid + if (General.Settings.GZDoomRenderingEffects && sectordata != null && sectordata.Count > 0) + RebuildElementData(); //mxd. As well as geometry... foreach(KeyValuePair group in visiblesectors) @@ -3532,11 +3529,11 @@ namespace CodeImp.DoomBuilder.BuilderModes [BeginAction("togglegzdoomgeometryeffects")] public void ToggleGZDoomRenderingEffects() { - gzdoomRenderingEffects = !gzdoomRenderingEffects; - RebuildElementData(); + General.Settings.GZDoomRenderingEffects = !General.Settings.GZDoomRenderingEffects; + RebuildElementData(); UpdateChangedObjects(); - General.Interface.DisplayStatus(StatusType.Info, "(G)ZDoom geometry effects are " + (gzdoomRenderingEffects ? "ENABLED" : "DISABLED")); - } + General.Interface.DisplayStatus(StatusType.Info, "(G)ZDoom geometry effects are " + (General.Settings.GZDoomRenderingEffects ? "ENABLED" : "DISABLED")); + } //mxd [BeginAction("thingaligntowall")] diff --git a/Source/Plugins/BuilderModes/VisualModes/SectorData.cs b/Source/Plugins/BuilderModes/VisualModes/SectorData.cs index 210b5ac..22349e7 100644 --- a/Source/Plugins/BuilderModes/VisualModes/SectorData.cs +++ b/Source/Plugins/BuilderModes/VisualModes/SectorData.cs @@ -339,9 +339,6 @@ namespace CodeImp.DoomBuilder.BuilderModes SectorLevel l = lightlevels[i]; SectorLevel pl = lightlevels[i + 1]; - // Glow levels should not affect light transfer - if(l.type == SectorLevelType.Glow) continue; - // Glow levels don't cast light if(pl.type == SectorLevelType.Glow && lightlevels.Count > i + 2) pl = lightlevels[i + 2]; diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs index a15e69f..3390663 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualCeiling.cs @@ -117,43 +117,35 @@ namespace CodeImp.DoomBuilder.BuilderModes else texscale = new Vector2D(1.0f / 64.0f, 1.0f / 64.0f); - //mxd. Sky is always bright - int color; - if(s.CeilTexture == General.Map.Config.SkyFlatName) - { - color = -1; // That's white. With alpha. Not very impressive, eh? - fogfactor = 0; // No fog - } - else - { - color = PixelColor.FromInt(level.color).WithAlpha((byte)General.Clamp(level.alpha, 0, 255)).ToInt(); + // Determine brightness + int color = PixelColor.FromInt(level.color).WithAlpha((byte)General.Clamp(level.alpha, 0, 255)).ToInt(); - //mxd. Top extrafloor level should calculate fogdensity - //from the brightness of the level above it - int targetbrightness; - if(extrafloor != null && !extrafloor.VavoomType && !level.disablelighting) - { - targetbrightness = 0; - SectorData sd = mode.GetSectorData(this.Sector.Sector); - for(int i = 0; i < sd.LightLevels.Count - 1; i++) - { - if(sd.LightLevels[i] == level) - { - targetbrightness = sd.LightLevels[i + 1].brightnessbelow; - break; - } - } - } - else - { - targetbrightness = level.brightnessbelow; - } + //mxd. Top extrafloor level should calculate fogdensity + //from the brightness of the level above it + int targetbrightness; + if (extrafloor != null && !extrafloor.VavoomType && !level.disablelighting) + { + targetbrightness = 0; + SectorData sd = mode.GetSectorData(this.Sector.Sector); + for (int i = 0; i < sd.LightLevels.Count - 1; i++) + { + if (sd.LightLevels[i] == level) + { + targetbrightness = sd.LightLevels[i + 1].brightnessbelow; + break; + } + } + } + else + { + targetbrightness = level.brightnessbelow; + } - fogfactor = CalculateFogDensity(targetbrightness); - } + //mxd. Determine fog density + fogfactor = CalculateFogDensity(targetbrightness); - // Make vertices - ReadOnlyCollection triverts = base.Sector.Sector.Triangles.Vertices; + // Make vertices + ReadOnlyCollection triverts = Sector.Sector.Triangles.Vertices; WorldVertex[] verts = new WorldVertex[triverts.Count]; for(int i = 0; i < triverts.Count; i++) { @@ -196,18 +188,38 @@ namespace CodeImp.DoomBuilder.BuilderModes { this.RenderPass = RenderPass.Solid; } - - // Apply vertices - base.SetVertices(verts); + + //mxd. Update sky render flag + UpdateSkyRenderFlag(); + + // Apply vertices + base.SetVertices(verts); return (verts.Length > 0); } - - #endregion - #region ================== Methods + //mxd + private void UpdateSkyRenderFlag() + { + bool isrenderedassky = renderassky; + renderassky = (level.sector.CeilTexture == General.Map.Config.SkyFlatName); + if (isrenderedassky != renderassky && Sector.Sides != null) + { + // Upper/middle geometry may need updating... + foreach (Sidedef side in level.sector.Sidedefs) + { + VisualSidedefParts parts = Sector.GetSidedefParts(side); + if (parts.upper != null) parts.upper.UpdateSkyRenderFlag(); + else if (parts.middlesingle != null) parts.middlesingle.UpdateSkyRenderFlag(); + } + } + } - // Return texture coordinates - protected override Point GetTextureOffset() + #endregion + + #region ================== Methods + + // Return texture coordinates + protected override Point GetTextureOffset() { return new Point { X = (int)Sector.Sector.Fields.GetValue("xpanningceiling", 0.0f), Y = (int)Sector.Sector.Fields.GetValue("ypanningceiling", 0.0f) }; diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs index 8ba669c..d321edd 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualFloor.cs @@ -119,43 +119,35 @@ namespace CodeImp.DoomBuilder.BuilderModes else texscale = new Vector2D(1.0f / 64.0f, 1.0f / 64.0f); - //mxd. Sky is always bright - int color; - if(s.FloorTexture == General.Map.Config.SkyFlatName) - { - color = -1; // That's white. With alpha. Not very impressive, eh? - fogfactor = 0; // No fog - } - else - { - color = PixelColor.FromInt(level.color).WithAlpha((byte)General.Clamp(level.alpha, 0, 255)).ToInt(); + // Determine brightness + int color = PixelColor.FromInt(level.color).WithAlpha((byte)General.Clamp(level.alpha, 0, 255)).ToInt(); - //mxd. Top extrafloor level should calculate fogdensity - //from the brightness of the level above it - int targetbrightness; - if(extrafloor != null && extrafloor.VavoomType && !level.disablelighting) - { - targetbrightness = 0; - SectorData sd = mode.GetSectorData(this.Sector.Sector); - for(int i = 0; i < sd.LightLevels.Count - 1; i++) - { - if(sd.LightLevels[i] == level) - { - targetbrightness = sd.LightLevels[i + 1].brightnessbelow; - break; - } - } - } - else - { - targetbrightness = level.brightnessbelow; - } + //mxd. Top extrafloor level should calculate fogdensity + //from the brightness of the level above it + int targetbrightness; + if (extrafloor != null && extrafloor.VavoomType && !level.disablelighting) + { + targetbrightness = 0; + SectorData sd = mode.GetSectorData(this.Sector.Sector); + for (int i = 0; i < sd.LightLevels.Count - 1; i++) + { + if (sd.LightLevels[i] == level) + { + targetbrightness = sd.LightLevels[i + 1].brightnessbelow; + break; + } + } + } + else + { + targetbrightness = level.brightnessbelow; + } - fogfactor = CalculateFogDensity(targetbrightness); - } + //mxd. Determine fog density + fogfactor = CalculateFogDensity(targetbrightness); - // Make vertices - ReadOnlyCollection triverts = base.Sector.Sector.Triangles.Vertices; + // Make vertices + ReadOnlyCollection triverts = Sector.Sector.Triangles.Vertices; WorldVertex[] verts = new WorldVertex[triverts.Count]; for(int i = 0; i < triverts.Count; i++) { @@ -198,18 +190,37 @@ namespace CodeImp.DoomBuilder.BuilderModes { this.RenderPass = RenderPass.Solid; } - - // Apply vertices - base.SetVertices(verts); + + //mxd. Update sky render flag + UpdateSkyRenderFlag(); + + // Apply vertices + base.SetVertices(verts); return (verts.Length > 0); } - - #endregion - - #region ================== Methods - // Return texture coordinates - protected override Point GetTextureOffset() + //mxd + private void UpdateSkyRenderFlag() + { + bool isrenderedassky = renderassky; + renderassky = (level.sector.FloorTexture == General.Map.Config.SkyFlatName || level.sector.LongFloorTexture == MapSet.EmptyLongName); + if (isrenderedassky != renderassky && Sector.Sides != null) + { + // Middle geometry may need updating... + foreach (Sidedef side in level.sector.Sidedefs) + { + VisualSidedefParts parts = Sector.GetSidedefParts(side); + if (parts.middlesingle != null) parts.middlesingle.UpdateSkyRenderFlag(); + } + } + } + + #endregion + + #region ================== Methods + + // Return texture coordinates + protected override Point GetTextureOffset() { return new Point { X = (int)Sector.Sector.Fields.GetValue("xpanningfloor", 0.0f), Y = (int)Sector.Sector.Fields.GetValue("ypanningfloor", 0.0f) }; diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualMiddleSingle.cs b/Source/Plugins/BuilderModes/VisualModes/VisualMiddleSingle.cs index 139a0e7..93f02bf 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualMiddleSingle.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualMiddleSingle.cs @@ -62,8 +62,11 @@ namespace CodeImp.DoomBuilder.BuilderModes { Vector2D vl, vr; - //mxd. lightfog flag support - int lightvalue; + //mxd. Apply sky hack? + UpdateSkyRenderFlag(); + + //mxd. lightfog flag support + int lightvalue; bool lightabsolute; GetLightValue(out lightvalue, out lightabsolute); @@ -201,13 +204,19 @@ namespace CodeImp.DoomBuilder.BuilderModes base.SetVertices(null); //mxd return false; } - - #endregion - - #region ================== Methods - // Return texture name - public override string GetTextureName() + //mxd + internal void UpdateSkyRenderFlag() + { + renderassky = (Sidedef.LongMiddleTexture == MapSet.EmptyLongName && Sidedef.Sector != null && Sidedef.Sector.CeilTexture == General.Map.Config.SkyFlatName); + } + + #endregion + + #region ================== Methods + + // Return texture name + public override string GetTextureName() { return this.Sidedef.MiddleTexture; } diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualUpper.cs b/Source/Plugins/BuilderModes/VisualModes/VisualUpper.cs index 42cb6bb..bdbf9db 100644 --- a/Source/Plugins/BuilderModes/VisualModes/VisualUpper.cs +++ b/Source/Plugins/BuilderModes/VisualModes/VisualUpper.cs @@ -61,9 +61,12 @@ namespace CodeImp.DoomBuilder.BuilderModes public override bool Setup() { Vector2D vl, vr; - - //mxd. lightfog flag support - int lightvalue; + + //mxd. Apply sky hack? + UpdateSkyRenderFlag(); + + //mxd. lightfog flag support + int lightvalue; bool lightabsolute; GetLightValue(out lightvalue, out lightabsolute); @@ -196,13 +199,21 @@ namespace CodeImp.DoomBuilder.BuilderModes base.SetVertices(null); //mxd return false; } - - #endregion - #region ================== Methods + //mxd + internal void UpdateSkyRenderFlag() + { + renderassky = (Sidedef.Other != null && Sidedef.Sector != null && Sidedef.Other.Sector != null && + Sidedef.Sector.CeilTexture == General.Map.Config.SkyFlatName && + Sidedef.Other.Sector.CeilTexture == General.Map.Config.SkyFlatName); + } - // Return texture name - public override string GetTextureName() + #endregion + + #region ================== Methods + + // Return texture name + public override string GetTextureName() { return this.Sidedef.HighTexture; }