diff --git a/Build/Configurations/Includes/Doom2_things.cfg b/Build/Configurations/Includes/Doom2_things.cfg index 0a6e922e..859f292f 100644 --- a/Build/Configurations/Includes/Doom2_things.cfg +++ b/Build/Configurations/Includes/Doom2_things.cfg @@ -157,15 +157,13 @@ obstacles color = 3; // Cyan arrow = 0; title = "Obstacles"; - width = 20; sort = 1; - height = 20; blocking = 1; 70 { title = "Burning barrel"; - width = 10; + width = 16; sprite = "FCANA0"; height = 32; class = "BurningBarrel"; @@ -209,7 +207,7 @@ decoration sort = 1; height = 16; hangs = 0; - blocking = 0; + blocking = 1; 79 { @@ -238,7 +236,6 @@ decoration sprite = "HDB1A0"; height = 88; hangs = 1; - blocking = 1; class = "HangNoGuts"; } @@ -248,7 +245,6 @@ decoration sprite = "HDB2A0"; height = 88; hangs = 1; - blocking = 1; class = "HangBNoBrain"; } @@ -258,7 +254,6 @@ decoration sprite = "HDB3A0"; height = 64; hangs = 1; - blocking = 1; class = "HangTLookingDown"; } diff --git a/Build/Configurations/Includes/Doom_things.cfg b/Build/Configurations/Includes/Doom_things.cfg index 04ead12c..8d085cc1 100644 --- a/Build/Configurations/Includes/Doom_things.cfg +++ b/Build/Configurations/Includes/Doom_things.cfg @@ -445,7 +445,7 @@ obstacles color = 3; // Cyan arrow = 0; title = "Obstacles"; - width = 20; + width = 16; sort = 1; height = 20; hangs = 0; @@ -555,6 +555,7 @@ lights { title = "Candle"; sprite = "CANDA0"; + width = 20; blocking = 0; class = "Candlestick"; } @@ -607,7 +608,7 @@ decoration color = 4; // Red arrow = 0; title = "Decoration"; - width = 16; + width = 20; sort = 1; height = 16; hangs = 0; @@ -618,6 +619,7 @@ decoration title = "Hanging victim, twitching (blocking)"; sprite = "GOR1A0"; height = 68; + width = 16; hangs = 1; blocking = 1; class = "BloodyTwitch"; @@ -660,6 +662,7 @@ decoration title = "Hanging pair of legs (blocking)"; sprite = "GOR4A0"; height = 68; + width = 16; hangs = 1; blocking = 1; class = "Meat4"; @@ -681,6 +684,7 @@ decoration title = "Hanging victim, 1-legged (blocking)"; sprite = "GOR3A0"; height = 84; + width = 16; hangs = 1; blocking = 1; class = "HangingCorpse"; @@ -702,6 +706,7 @@ decoration title = "Hanging leg (blocking)"; sprite = "GOR5A0"; height = 52; + width = 16; hangs = 1; blocking = 1; class = "Meat5"; @@ -722,6 +727,7 @@ decoration { title = "Impaled human"; sprite = "POL1A0"; + width = 16; blocking = 1; class = "DeadStick"; } @@ -731,6 +737,7 @@ decoration { title = "Twitching impaled human"; sprite = "POL6A0"; + width = 16; blocking = 1; class = "LiveStick"; } @@ -740,6 +747,7 @@ decoration { title = "Skull on a pole"; sprite = "POL4A0"; + width = 16; blocking = 1; class = "HeadOnAStick"; } @@ -749,6 +757,7 @@ decoration { title = "5 skulls shish kebob"; sprite = "POL2A0"; + width = 16; blocking = 1; class = "HeadsOnAStick"; } @@ -758,6 +767,7 @@ decoration { title = "Pile of skulls and candles"; sprite = "POL3A0"; + width = 16; blocking = 1; class = "HeadCandles"; } diff --git a/Build/Configurations/Includes/Heretic_things.cfg b/Build/Configurations/Includes/Heretic_things.cfg index 53b88a10..8bf8ccb6 100644 --- a/Build/Configurations/Includes/Heretic_things.cfg +++ b/Build/Configurations/Includes/Heretic_things.cfg @@ -480,12 +480,14 @@ obstacles title = "Stalactite (Small)"; sprite = "STCSA0"; height = 36; + hangs = 1; } 40 { title = "Stalactite (Large)"; sprite = "STCLA0"; height = 68; + hangs = 1; } 44 { @@ -562,25 +564,27 @@ decoration title = "Decoration"; width = 16; sort = 1; - blocking = 2; - + 94 { title = "Blue Key Marker"; sprite = "KGZBA0"; height = 50; + blocking = 2; } 95 { title = "Green Key Marker"; sprite = "KGZGA0"; height = 50; + blocking = 2; } 96 { title = "Yellow Key Marker"; sprite = "KGZYA0"; height = 50; + blocking = 2; } 51 { @@ -588,6 +592,7 @@ decoration sprite = "HCORA0"; hangs = 1; height = 104; + blocking = 2; } 17 { diff --git a/Build/Configurations/Includes/Hexen_things.cfg b/Build/Configurations/Includes/Hexen_things.cfg index 96180cdf..9f076637 100644 --- a/Build/Configurations/Includes/Hexen_things.cfg +++ b/Build/Configurations/Includes/Hexen_things.cfg @@ -7,6 +7,7 @@ players width = 16; sort = 1; error = 2; + blocking = 2; 1 { @@ -63,6 +64,7 @@ teleports width = 16; sort = 1; error = 1; + blocking = 0; 14 { @@ -84,6 +86,7 @@ monsters width = 20; sort = 1; error = 2; + blocking = 2; 107 { @@ -221,6 +224,7 @@ weapons title = "Weapons"; width = 20; sort = 1; + blocking = 0; 10 { @@ -306,6 +310,7 @@ ammunition title = "Mana"; width = 8; sort = 1; + blocking = 0; 122 { @@ -331,6 +336,7 @@ health title = "Health and Armor"; width = 20; sort = 1; + blocking = 0; 8005 { @@ -367,6 +373,7 @@ powerups width = 20; height = 20; sort = 1; + blocking = 0; 30 { @@ -452,6 +459,7 @@ puzzle title = "Puzzle Items"; width = 20; sort = 1; + blocking = 0; 9002 { @@ -561,6 +569,7 @@ keys title = "Keys"; width = 8; sort = 1; + blocking = 0; 8030 { @@ -626,6 +635,7 @@ obstacles title = "Obstacles"; width = 20; sort = 1; + blocking = 2; 8064 { @@ -691,18 +701,21 @@ obstacles title = "Stalactite (small)"; sprite = "SLC3A0"; width = 8; + hangs = 1; } 56 { title = "Stalactite (medium)"; sprite = "SLC2A0"; width = 6; + hangs = 1; } 52 { title = "Stalactite (large)"; sprite = "SLC1A0"; width = 8; + hangs = 1; } 48 { @@ -829,24 +842,28 @@ obstacles title = "Icicle (tiny)"; sprite = "ICT4A0"; width = 4; + hangs = 1; } 91 { title = "Icicle (small)"; sprite = "ICT3A0"; width = 4; + hangs = 1; } 90 { title = "Icicle (medium)"; sprite = "ICT2A0"; width = 5; + hangs = 1; } 89 { title = "Icicle (large)"; sprite = "ICT1A0"; width = 8; + hangs = 1; } 8068 { @@ -1003,17 +1020,20 @@ lights arrow = 0; title = "Light sources"; width = 20; + blocking = 2; sort = 1; 17 { title = "Chandelier (lit)"; sprite = "CDLRA0"; + hangs = 1; } 8063 { title = "Chandelier (unlit)"; sprite = "CDLRD0"; + hangs = 1; } 8066 { @@ -1125,54 +1145,70 @@ decoration title = "Decoration"; width = 20; sort = 1; + blocking = 0; 8071 { title = "Chain (short)"; sprite = "CHNSA0"; width = 4; + hangs = 1; + height = 32; } 8072 { title = "Chain (long)"; sprite = "CHNSB0"; width = 4; + hangs = 1; + height = 64; } 8073 { title = "Hook With Heart"; sprite = "CHNSC0"; width = 4; + hangs = 1; } 8077 { title = "Hook With Skull"; sprite = "CHNSG0"; width = 4; + hangs = 1; } 8074 { title = "Chain With Large Hook"; sprite = "CHNSD0"; width = 4; + hangs = 1; + height = 32; } 8075 { title = "Chain With Small Hook"; sprite = "CHNSE0"; width = 4; + hangs = 1; + height = 32; } 8076 { title = "Chain with Spike Ball"; sprite = "CHNSF0"; width = 4; + hangs = 1; + height = 32; } 8103 { title = "Hanging Bucket"; sprite = "BCKTA0"; width = 8; + hangs = 1; + height = 72; + blocking = 2; } 6 { @@ -1260,12 +1296,14 @@ decoration title = "Shrub"; sprite = "SHB1A0"; width = 8; + blocking = 2; } 8102 { title = "Shrub 2"; sprite = "SHB2A0"; width = 16; + blocking = 2; } 111 { @@ -1277,30 +1315,43 @@ decoration title= "Hanging Corpse"; sprite = "CPS3A0"; width = 6; + hangs = 1; + height = 75; + blocking = 2; } 61 { title = "Impaled Corpse"; sprite = "CPS1A0"; width = 10; + height = 92; + blocking = 2; } 108 { title = "Lynched Corpse"; sprite = "CPS4A0"; width = 11; + hangs = 1; + height = 95; + blocking = 2; } 109 { title = "Lynched Corpse (heartless)"; sprite = "CPS5A0"; width = 10; + hangs = 1; + height = 95; + blocking = 2; } 110 { title = "Corpse (sitting)"; sprite = "CPS6A0"; width = 15; + height = 35; + blocking = 2; } 62 { @@ -1347,6 +1398,7 @@ decoration title = "Pot (tall)"; sprite = "POT1A0"; width = 10; + blocking = 2; arg0 { title = "Contained Item"; @@ -1359,6 +1411,7 @@ decoration title = "Pot (medium)"; sprite = "POT2A0"; width = 10; + blocking = 2; arg0 { title = "Contained Item"; @@ -1371,6 +1424,7 @@ decoration title = "Pot (short)"; sprite = "POT3A0"; width = 15; + blocking = 2; arg0 { title = "Contained Item"; @@ -1382,11 +1436,13 @@ decoration { title = "Hanging Moss 1"; sprite = "MSS1A0"; + hangs = 1; } 59 { title = "Hanging Moss 2"; sprite = "MSS2A0"; + hangs = 1; } 10090 { @@ -1410,6 +1466,7 @@ sounds width = 0; sort = 1; fixedsize = true; + blocking = 0; 1403 = "Creak"; 1408 = "Earth Crack"; @@ -1432,6 +1489,7 @@ other width = 0; sort = 1; fixedsize = true; + blocking = 0; 118 { diff --git a/Build/Configurations/Includes/ZDoom_misc.cfg b/Build/Configurations/Includes/ZDoom_misc.cfg index 72b07fdc..2ac84a59 100644 --- a/Build/Configurations/Includes/ZDoom_misc.cfg +++ b/Build/Configurations/Includes/ZDoom_misc.cfg @@ -37,6 +37,7 @@ linedefflags_udmf wrapmidtex = "Wrap middle texture"; midtex3d = "Walkable middle texture"; blockprojectiles = "Block projectiles"; + blockuse = "Block use actions"; } @@ -60,7 +61,8 @@ thingflags thingflags_udmf { - skill6 = "Skill 6"; + countsecret = "Count as secret"; + skill6 = "Skill 6"; skill7 = "Skill 7"; skill8 = "Skill 8"; class1 = "Class 1"; @@ -336,6 +338,11 @@ universalfields type = 2; default = ""; } + conversation + { + type = 0; + default = 0; + } } sector @@ -477,6 +484,18 @@ universalfields type = 3; default = false; } + + soundsequence + { + type = 2; + default = ""; + } + + hidden + { + type = 3; + default = false; + } } } @@ -541,7 +560,7 @@ udmfmaplumpnames { required = false; nodebuild = false; - blindcopy = true; + script = "ZDoom_USDF.cfg"; } ZNODES diff --git a/Source/Core/Builder.sln b/Source/Core/Builder.sln index 0c6ae3b6..41e6d77c 100644 --- a/Source/Core/Builder.sln +++ b/Source/Core/Builder.sln @@ -7,10 +7,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuilderModes", "..\Plugins\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GZDoomEditing", "..\Plugins\GZDoomEditing\GZDoomEditing.csproj", "{760A9BC7-CB73-4C36-858B-994C14996FCD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommentsPanel", "..\Plugins\CommentsPanel\CommentsPanel.csproj", "{58BD8A5B-1B48-435D-8473-A92F27D06C49}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TagExplorer", "..\Plugins\TagExplorer\TagExplorer.csproj", "{BE7917F3-E6FE-4D5B-8FA9-B8E7668AC731}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UDMFControls", "..\Plugins\UMDFControls\UDMFControls.csproj", "{2D11C828-295C-463A-8545-CA1AD6D51518}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -51,16 +51,6 @@ Global {760A9BC7-CB73-4C36-858B-994C14996FCD}.Release|Mixed Platforms.Build.0 = Release|x86 {760A9BC7-CB73-4C36-858B-994C14996FCD}.Release|x86.ActiveCfg = Release|x86 {760A9BC7-CB73-4C36-858B-994C14996FCD}.Release|x86.Build.0 = Release|x86 - {58BD8A5B-1B48-435D-8473-A92F27D06C49}.Debug|Any CPU.ActiveCfg = Debug|x86 - {58BD8A5B-1B48-435D-8473-A92F27D06C49}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {58BD8A5B-1B48-435D-8473-A92F27D06C49}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {58BD8A5B-1B48-435D-8473-A92F27D06C49}.Debug|x86.ActiveCfg = Debug|x86 - {58BD8A5B-1B48-435D-8473-A92F27D06C49}.Debug|x86.Build.0 = Debug|x86 - {58BD8A5B-1B48-435D-8473-A92F27D06C49}.Release|Any CPU.ActiveCfg = Release|x86 - {58BD8A5B-1B48-435D-8473-A92F27D06C49}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {58BD8A5B-1B48-435D-8473-A92F27D06C49}.Release|Mixed Platforms.Build.0 = Release|x86 - {58BD8A5B-1B48-435D-8473-A92F27D06C49}.Release|x86.ActiveCfg = Release|x86 - {58BD8A5B-1B48-435D-8473-A92F27D06C49}.Release|x86.Build.0 = Release|x86 {BE7917F3-E6FE-4D5B-8FA9-B8E7668AC731}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BE7917F3-E6FE-4D5B-8FA9-B8E7668AC731}.Debug|Any CPU.Build.0 = Debug|Any CPU {BE7917F3-E6FE-4D5B-8FA9-B8E7668AC731}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -71,6 +61,16 @@ Global {BE7917F3-E6FE-4D5B-8FA9-B8E7668AC731}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {BE7917F3-E6FE-4D5B-8FA9-B8E7668AC731}.Release|Mixed Platforms.Build.0 = Release|Any CPU {BE7917F3-E6FE-4D5B-8FA9-B8E7668AC731}.Release|x86.ActiveCfg = Release|Any CPU + {2D11C828-295C-463A-8545-CA1AD6D51518}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D11C828-295C-463A-8545-CA1AD6D51518}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D11C828-295C-463A-8545-CA1AD6D51518}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {2D11C828-295C-463A-8545-CA1AD6D51518}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {2D11C828-295C-463A-8545-CA1AD6D51518}.Debug|x86.ActiveCfg = Debug|Any CPU + {2D11C828-295C-463A-8545-CA1AD6D51518}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D11C828-295C-463A-8545-CA1AD6D51518}.Release|Any CPU.Build.0 = Release|Any CPU + {2D11C828-295C-463A-8545-CA1AD6D51518}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {2D11C828-295C-463A-8545-CA1AD6D51518}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {2D11C828-295C-463A-8545-CA1AD6D51518}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Source/Core/Editing/ThingsFilter.cs b/Source/Core/Editing/ThingsFilter.cs index 9fdb5a35..f8e10537 100644 --- a/Source/Core/Editing/ThingsFilter.cs +++ b/Source/Core/Editing/ThingsFilter.cs @@ -227,7 +227,8 @@ namespace CodeImp.DoomBuilder.Editing /// public bool IsThingVisible(Thing t) { - return thingsvisiblestate[t]; + if (t.IsDisposed) return false; //mxd + return thingsvisiblestate[t]; } // This writes the filter to configuration diff --git a/Source/Core/Rendering/IRenderer2D.cs b/Source/Core/Rendering/IRenderer2D.cs index b1072507..ff729934 100644 --- a/Source/Core/Rendering/IRenderer2D.cs +++ b/Source/Core/Rendering/IRenderer2D.cs @@ -85,8 +85,5 @@ namespace CodeImp.DoomBuilder.Rendering void RenderText(TextLabel text); void RenderGeometry(FlatVertex[] vertices, ImageData texture, bool transformcoords); void RedrawSurface(); - - //mxd. Center camera on given coordinates - void PositionView(float x, float y); } } diff --git a/Source/Core/Windows/ThingEditForm.Designer.cs b/Source/Core/Windows/ThingEditForm.Designer.cs index c0b13db6..383b5703 100644 --- a/Source/Core/Windows/ThingEditForm.Designer.cs +++ b/Source/Core/Windows/ThingEditForm.Designer.cs @@ -34,6 +34,10 @@ namespace CodeImp.DoomBuilder.Windows System.Windows.Forms.Label taglabel; System.Windows.Forms.Label label7; this.thingtype = new CodeImp.DoomBuilder.Controls.ThingBrowserControl(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.posX = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox(); + this.posY = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox(); this.height = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox(); this.angle = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox(); this.heightlabel = new System.Windows.Forms.Label(); @@ -66,10 +70,6 @@ namespace CodeImp.DoomBuilder.Windows this.fieldslist = new CodeImp.DoomBuilder.Controls.FieldsEditorControl(); this.cancel = new System.Windows.Forms.Button(); this.apply = new System.Windows.Forms.Button(); - this.posY = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox(); - this.posX = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox(); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); groupBox1 = new System.Windows.Forms.GroupBox(); groupBox2 = new System.Windows.Forms.GroupBox(); label5 = new System.Windows.Forms.Label(); @@ -128,6 +128,51 @@ namespace CodeImp.DoomBuilder.Windows groupBox2.TabStop = false; groupBox2.Text = " Coordination "; // + // label2 + // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(45, 44); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(17, 14); + this.label2.TabIndex = 15; + this.label2.Text = "X:"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(45, 69); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(17, 14); + this.label1.TabIndex = 14; + this.label1.Text = "Y:"; + // + // posX + // + this.posX.AllowDecimal = false; + this.posX.AllowNegative = true; + this.posX.AllowRelative = true; + this.posX.ButtonStep = 8; + this.posX.Location = new System.Drawing.Point(68, 39); + this.posX.Name = "posX"; + this.posX.Size = new System.Drawing.Size(72, 24); + this.posX.StepValues = null; + this.posX.TabIndex = 13; + // + // posY + // + this.posY.AllowDecimal = false; + this.posY.AllowNegative = true; + this.posY.AllowRelative = true; + this.posY.ButtonStep = 8; + this.posY.Location = new System.Drawing.Point(68, 64); + this.posY.Name = "posY"; + this.posY.Size = new System.Drawing.Size(72, 24); + this.posY.StepValues = null; + this.posY.TabIndex = 12; + // // height // this.height.AllowDecimal = false; @@ -265,10 +310,10 @@ namespace CodeImp.DoomBuilder.Windows | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.flags.AutoScroll = true; - this.flags.Columns = 2; - this.flags.Location = new System.Drawing.Point(18, 26); + this.flags.Columns = 3; + this.flags.Location = new System.Drawing.Point(19, 19); this.flags.Name = "flags"; - this.flags.Size = new System.Drawing.Size(338, 195); + this.flags.Size = new System.Drawing.Size(337, 202); this.flags.TabIndex = 0; // // tabeffects @@ -279,7 +324,7 @@ namespace CodeImp.DoomBuilder.Windows this.tabeffects.Location = new System.Drawing.Point(4, 23); this.tabeffects.Name = "tabeffects"; this.tabeffects.Padding = new System.Windows.Forms.Padding(3); - this.tabeffects.Size = new System.Drawing.Size(652, 352); + this.tabeffects.Size = new System.Drawing.Size(652, 365); this.tabeffects.TabIndex = 1; this.tabeffects.Text = "Action"; this.tabeffects.UseVisualStyleBackColor = true; @@ -296,7 +341,7 @@ namespace CodeImp.DoomBuilder.Windows this.actiongroup.Controls.Add(this.doompanel); this.actiongroup.Location = new System.Drawing.Point(6, 78); this.actiongroup.Name = "actiongroup"; - this.actiongroup.Size = new System.Drawing.Size(640, 268); + this.actiongroup.Size = new System.Drawing.Size(640, 281); this.actiongroup.TabIndex = 22; this.actiongroup.TabStop = false; this.actiongroup.Text = " Action "; @@ -318,7 +363,7 @@ namespace CodeImp.DoomBuilder.Windows this.hexenpanel.Controls.Add(this.arg4label); this.hexenpanel.Location = new System.Drawing.Point(6, 53); this.hexenpanel.Name = "hexenpanel"; - this.hexenpanel.Size = new System.Drawing.Size(628, 208); + this.hexenpanel.Size = new System.Drawing.Size(628, 221); this.hexenpanel.TabIndex = 13; // // arg2 @@ -444,7 +489,7 @@ namespace CodeImp.DoomBuilder.Windows | System.Windows.Forms.AnchorStyles.Right))); this.doompanel.Location = new System.Drawing.Point(6, 54); this.doompanel.Name = "doompanel"; - this.doompanel.Size = new System.Drawing.Size(628, 208); + this.doompanel.Size = new System.Drawing.Size(628, 221); this.doompanel.TabIndex = 12; // // groupBox3 @@ -487,7 +532,7 @@ namespace CodeImp.DoomBuilder.Windows this.tabcustom.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.tabcustom.Location = new System.Drawing.Point(4, 23); this.tabcustom.Name = "tabcustom"; - this.tabcustom.Size = new System.Drawing.Size(652, 352); + this.tabcustom.Size = new System.Drawing.Size(652, 365); this.tabcustom.TabIndex = 2; this.tabcustom.Text = "Custom"; this.tabcustom.UseVisualStyleBackColor = true; @@ -506,7 +551,7 @@ namespace CodeImp.DoomBuilder.Windows this.fieldslist.Name = "fieldslist"; this.fieldslist.PropertyColumnVisible = true; this.fieldslist.PropertyColumnWidth = 150; - this.fieldslist.Size = new System.Drawing.Size(636, 334); + this.fieldslist.Size = new System.Drawing.Size(636, 347); this.fieldslist.TabIndex = 1; this.fieldslist.TypeColumnVisible = true; this.fieldslist.TypeColumnWidth = 100; @@ -535,51 +580,6 @@ namespace CodeImp.DoomBuilder.Windows this.apply.UseVisualStyleBackColor = true; this.apply.Click += new System.EventHandler(this.apply_Click); // - // posY - // - this.posY.AllowDecimal = false; - this.posY.AllowNegative = true; - this.posY.AllowRelative = true; - this.posY.ButtonStep = 8; - this.posY.Location = new System.Drawing.Point(68, 64); - this.posY.Name = "posY"; - this.posY.Size = new System.Drawing.Size(72, 24); - this.posY.StepValues = null; - this.posY.TabIndex = 12; - // - // posX - // - this.posX.AllowDecimal = false; - this.posX.AllowNegative = true; - this.posX.AllowRelative = true; - this.posX.ButtonStep = 8; - this.posX.Location = new System.Drawing.Point(68, 39); - this.posX.Name = "posX"; - this.posX.Size = new System.Drawing.Size(72, 24); - this.posX.StepValues = null; - this.posX.TabIndex = 13; - // - // label1 - // - this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(45, 69); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(17, 14); - this.label1.TabIndex = 14; - this.label1.Text = "Y:"; - // - // label2 - // - this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(45, 44); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(17, 14); - this.label2.TabIndex = 15; - this.label2.Text = "X:"; - this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // // ThingEditForm // this.AcceptButton = this.apply; diff --git a/Source/Core/Windows/ThingEditForm.resx b/Source/Core/Windows/ThingEditForm.resx index ea0585f4..e3212e91 100644 --- a/Source/Core/Windows/ThingEditForm.resx +++ b/Source/Core/Windows/ThingEditForm.resx @@ -147,9 +147,6 @@ True - - True - True diff --git a/Source/Plugins/GZDoomEditing/General/BuilderPlug.cs b/Source/Plugins/GZDoomEditing/General/BuilderPlug.cs index 825c8afe..b4526180 100644 --- a/Source/Plugins/GZDoomEditing/General/BuilderPlug.cs +++ b/Source/Plugins/GZDoomEditing/General/BuilderPlug.cs @@ -74,6 +74,9 @@ namespace CodeImp.DoomBuilder.GZDoomEditing private bool usegravity; private bool usehighlight; private float stitchrange; + + //mxd + private bool editnewthing; // Copy/paste private string copiedtexture; @@ -102,6 +105,9 @@ namespace CodeImp.DoomBuilder.GZDoomEditing public bool UseGravity { get { return usegravity; } set { usegravity = value; } } public bool UseHighlight { get { return usehighlight; } set { usehighlight = value; } } public float StitchRange { get { return stitchrange; } } + + //mxd + public bool EditNewThing { get { return editnewthing; } } // Copy/paste public string CopiedTexture { get { return copiedtexture; } set { copiedtexture = value; } } @@ -148,6 +154,9 @@ namespace CodeImp.DoomBuilder.GZDoomEditing changeheightbysidedef = General.Settings.ReadPluginSetting("BuilderModes", "changeheightbysidedef", 0); visualmodeclearselection = General.Settings.ReadPluginSetting("BuilderModes", "visualmodeclearselection", false); stitchrange = (float)General.Settings.ReadPluginSetting("BuilderModes", "stitchrange", 20); + + //mxd + editnewthing = General.Settings.ReadPluginSetting("BuilderModes", "editnewthing", true); } #endregion diff --git a/Source/Plugins/GZDoomEditing/Resources/Actions.cfg b/Source/Plugins/GZDoomEditing/Resources/Actions.cfg index 0b1db40c..95693cfd 100644 --- a/Source/Plugins/GZDoomEditing/Resources/Actions.cfg +++ b/Source/Plugins/GZDoomEditing/Resources/Actions.cfg @@ -10,6 +10,7 @@ gzdoomvisualmode allowkeys = true; allowmouse = true; allowscroll = true; + default = 81; } flooralignmode diff --git a/Source/Plugins/GZDoomEditing/VisualModes/BaseVisualMode.cs b/Source/Plugins/GZDoomEditing/VisualModes/BaseVisualMode.cs index 02843c37..f7cfff7d 100644 --- a/Source/Plugins/GZDoomEditing/VisualModes/BaseVisualMode.cs +++ b/Source/Plugins/GZDoomEditing/VisualModes/BaseVisualMode.cs @@ -43,7 +43,8 @@ namespace CodeImp.DoomBuilder.GZDoomEditing SwitchAction = "gzdoomvisualmode", // Action name used to switch to this mode ButtonImage = "VisualModeZ.png", // Image resource name for the button ButtonOrder = 1, // Position of the button (lower is more to the left) - ButtonGroup = "001_visual")] + ButtonGroup = "001_visual", + UseByDefault = true)] public class BaseVisualMode : VisualMode { @@ -1202,6 +1203,39 @@ namespace CodeImp.DoomBuilder.GZDoomEditing return new NullVisualEventReceiver(); } } + + //mxd. Copied from BuilderModes.ThingsMode + // This creates a new thing + private Thing InsertThing(Vector2D pos) { + if (pos.x < General.Map.Config.LeftBoundary || pos.x > General.Map.Config.RightBoundary || + pos.y > General.Map.Config.TopBoundary || pos.y < General.Map.Config.BottomBoundary) { + General.Interface.DisplayStatus(StatusType.Warning, "Failed to insert thing: outside of map boundaries."); + return null; + } + + // Create thing + Thing t = General.Map.Map.CreateThing(); + if (t != null) { + General.Settings.ApplyDefaultThingSettings(t); + t.Move(pos); + t.UpdateConfiguration(); + General.Map.IsChanged = true; + + // Update things filter so that it includes this thing + General.Map.ThingsFilter.Update(); + + // Snap to grid enabled? + if (General.Interface.SnapToGrid) { + // Snap to grid + t.SnapToGrid(); + } else { + // Snap to map format accuracy + t.SnapToAccuracy(); + } + } + + return t; + } #endregion @@ -1553,22 +1587,60 @@ namespace CodeImp.DoomBuilder.GZDoomEditing foreach(IVisualEventReceiver i in objs) i.OnPasteProperties(); PostAction(); } - - [BeginAction("insertitem", BaseAction = true)] + + [BeginAction("insertitem", BaseAction = true)] //mxd. now we can actually insert things in Visual modes public void Insert() { - PreAction(UndoGroup.None); - List objs = GetSelectedObjects(true, true, true); - foreach(IVisualEventReceiver i in objs) i.OnInsert(); - PostAction(); + PickTarget(); + + if (target.picked == null) { + General.Interface.DisplayStatus(StatusType.Warning, "Cannot insert item here!"); + return; + } + + ClearSelection(); + PreActionNoChange(); + + General.Map.UndoRedo.CreateUndo("Insert thing"); + Thing t = InsertThing(new Vector2D(target.hitpos.x, target.hitpos.y)); + + if (t == null) { + General.Map.UndoRedo.WithdrawUndo(); + return; + } + + // Edit the thing? + if (BuilderPlug.Me.EditNewThing) + General.Interface.ShowEditThings(new List { t }); + + //add thing to blockmap + blockmap.AddThing(t); + + General.Interface.DisplayStatus(StatusType.Action, "Inserted a new thing."); + General.Map.IsChanged = true; + General.Map.ThingsFilter.Update(); + PostAction(); } - [BeginAction("deleteitem", BaseAction = true)] + [BeginAction("deleteitem", BaseAction = true)] //mxd. now we can actually delete things in Visual modes public void Delete() { - PreAction(UndoGroup.None); - List objs = GetSelectedObjects(true, true, true); - foreach(IVisualEventReceiver i in objs) i.OnDelete(); + List objs = GetSelectedObjects(false, false, true); + if(objs.Count == 0) return; + + string rest = objs.Count + " thing" + (objs.Count > 1 ? "s." : "."); + + //make undo + General.Map.UndoRedo.CreateUndo("Delete " + rest); + General.Interface.DisplayStatus(StatusType.Info, "Deleted " + rest); + + PreActionNoChange(); + foreach(IVisualEventReceiver i in objs) i.OnDelete(); //are they deleted from BlockMap automatically?.. + + // Update cache values + General.Map.IsChanged = true; + General.Map.ThingsFilter.Update(); + PostAction(); } diff --git a/Source/Plugins/GZDoomEditing/VisualModes/BaseVisualThing.cs b/Source/Plugins/GZDoomEditing/VisualModes/BaseVisualThing.cs index 34bf0243..ecce5255 100644 --- a/Source/Plugins/GZDoomEditing/VisualModes/BaseVisualThing.cs +++ b/Source/Plugins/GZDoomEditing/VisualModes/BaseVisualThing.cs @@ -203,7 +203,7 @@ namespace CodeImp.DoomBuilder.GZDoomEditing if(Thing.Position.z > 0) pos.z = sd.Ceiling.plane.GetZ(Thing.Position) - info.Height; else - pos.z = Thing.Sector.CeilHeight; + pos.z = Thing.Sector.CeilHeight - info.Height; //mxd. was [pos.z = Thing.Sector.CeilHeight;] } pos.z -= Thing.Position.z; @@ -424,10 +424,17 @@ namespace CodeImp.DoomBuilder.GZDoomEditing public virtual void OnProcess(double deltatime) { } public virtual void OnTextureFloodfill() { } public virtual void OnInsert() { } - public virtual void OnDelete() { } + //public virtual void OnDelete() { } public virtual void ApplyTexture(string texture) { } public virtual void ApplyUpperUnpegged(bool set) { } public virtual void ApplyLowerUnpegged(bool set) { } + + //mxd. Delete thing + public virtual void OnDelete() { + this.Thing.Dispose(); + this.Dispose(); + } + // Return texture name public virtual string GetTextureName() { return ""; } diff --git a/Source/Plugins/GZDoomEditing/VisualModes/VisualCeiling.cs b/Source/Plugins/GZDoomEditing/VisualModes/VisualCeiling.cs index d6688928..47dc4c26 100644 --- a/Source/Plugins/GZDoomEditing/VisualModes/VisualCeiling.cs +++ b/Source/Plugins/GZDoomEditing/VisualModes/VisualCeiling.cs @@ -167,12 +167,20 @@ namespace CodeImp.DoomBuilder.GZDoomEditing // Move texture coordinates protected override void MoveTextureOffset(Point xy) { - Sector.Sector.Fields.BeforeFieldsChange(); + //mxd + Sector s = GetControlSector(); + float oldx = s.Fields.GetValue("xpanningceiling", 0.0f); + float oldy = s.Fields.GetValue("ypanningceiling", 0.0f); + s.Fields["xpanningceiling"] = new UniValue(UniversalType.Float, oldx + (float)xy.X); + s.Fields["ypanningceiling"] = new UniValue(UniversalType.Float, oldy + (float)xy.Y); + s.UpdateNeeded = true; + + /*Sector.Sector.Fields.BeforeFieldsChange(); float oldx = Sector.Sector.Fields.GetValue("xpanningceiling", 0.0f); float oldy = Sector.Sector.Fields.GetValue("ypanningceiling", 0.0f); Sector.Sector.Fields["xpanningceiling"] = new UniValue(UniversalType.Float, oldx + (float)xy.X); Sector.Sector.Fields["ypanningceiling"] = new UniValue(UniversalType.Float, oldy + (float)xy.Y); - Sector.Sector.UpdateNeeded = true; + Sector.Sector.UpdateNeeded = true;*/ } // Paste texture diff --git a/Source/Plugins/GZDoomEditing/VisualModes/VisualFloor.cs b/Source/Plugins/GZDoomEditing/VisualModes/VisualFloor.cs index ad2fb558..58893ce3 100644 --- a/Source/Plugins/GZDoomEditing/VisualModes/VisualFloor.cs +++ b/Source/Plugins/GZDoomEditing/VisualModes/VisualFloor.cs @@ -166,12 +166,21 @@ namespace CodeImp.DoomBuilder.GZDoomEditing // Move texture coordinates protected override void MoveTextureOffset(Point xy) { - Sector.Sector.Fields.BeforeFieldsChange(); + //mxd + Sector s = GetControlSector(); + s.Fields.BeforeFieldsChange(); + float oldx = s.Fields.GetValue("xpanningfloor", 0.0f); + float oldy = s.Fields.GetValue("ypanningfloor", 0.0f); + s.Fields["xpanningfloor"] = new UniValue(UniversalType.Float, oldx + (float)xy.X); + s.Fields["ypanningfloor"] = new UniValue(UniversalType.Float, oldy + (float)xy.Y); + s.UpdateNeeded = true; + + /*Sector.Sector.Fields.BeforeFieldsChange(); float oldx = Sector.Sector.Fields.GetValue("xpanningfloor", 0.0f); float oldy = Sector.Sector.Fields.GetValue("ypanningfloor", 0.0f); Sector.Sector.Fields["xpanningfloor"] = new UniValue(UniversalType.Float, oldx + (float)xy.X); Sector.Sector.Fields["ypanningfloor"] = new UniValue(UniversalType.Float, oldy + (float)xy.Y); - Sector.Sector.UpdateNeeded = true; + Sector.Sector.UpdateNeeded = true;*/ } // Paste texture diff --git a/Source/Plugins/GZDoomEditing/VisualModes/VisualMiddle3D.cs b/Source/Plugins/GZDoomEditing/VisualModes/VisualMiddle3D.cs index 94919299..195c6aae 100644 --- a/Source/Plugins/GZDoomEditing/VisualModes/VisualMiddle3D.cs +++ b/Source/Plugins/GZDoomEditing/VisualModes/VisualMiddle3D.cs @@ -190,7 +190,7 @@ namespace CodeImp.DoomBuilder.GZDoomEditing // Determine initial color int lightlevel = lightabsolute ? lightvalue : sd.Ceiling.brightnessbelow + lightvalue; - //mxd + //mxd. This calculates light with doom-style wall shading //PixelColor wallbrightness = PixelColor.FromInt(mode.CalculateBrightness(lightlevel)); PixelColor wallbrightness = PixelColor.FromInt(mode.CalculateBrightness(lightlevel, Sidedef)); PixelColor wallcolor = PixelColor.Modulate(sd.Ceiling.colorbelow, wallbrightness); diff --git a/Source/Plugins/TagExplorer/BuilderPlug.cs b/Source/Plugins/TagExplorer/BuilderPlug.cs index 04347086..403c79cc 100644 --- a/Source/Plugins/TagExplorer/BuilderPlug.cs +++ b/Source/Plugins/TagExplorer/BuilderPlug.cs @@ -22,11 +22,6 @@ namespace CodeImp.DoomBuilder.TagExplorer // This event is called when the plugin is initialized public override void OnInitialize() { - if (GZBuilder.GZGeneral.Version < 1.10f) { - General.ErrorLogger.Add(ErrorType.Error, "Tag Explorer plugin: GZDoom Builder 1.10 or later required!"); - return; - } - base.OnInitialize(); // Keep a static reference @@ -76,5 +71,10 @@ namespace CodeImp.DoomBuilder.TagExplorer if (tagExplorer != null) tagExplorer.UpdateTree(); } + + public override void OnActionEnd(CodeImp.DoomBuilder.Actions.Action action) { + if (tagExplorer != null && action.Name == "builder_deleteitem") + tagExplorer.UpdateTree(); + } } } diff --git a/Source/Plugins/TagExplorer/Controls/TagExplorer.cs b/Source/Plugins/TagExplorer/Controls/TagExplorer.cs index 34c6c787..68d5493a 100644 --- a/Source/Plugins/TagExplorer/Controls/TagExplorer.cs +++ b/Source/Plugins/TagExplorer/Controls/TagExplorer.cs @@ -9,6 +9,7 @@ using System.Windows.Forms; using CodeImp.DoomBuilder.Config; using CodeImp.DoomBuilder.Geometry; using CodeImp.DoomBuilder.Map; +using CodeImp.DoomBuilder.Editing; using CodeImp.DoomBuilder.Types; namespace CodeImp.DoomBuilder.TagExplorer @@ -30,6 +31,9 @@ namespace CodeImp.DoomBuilder.TagExplorer private Color commentColor = Color.DarkMagenta; private SelectedNode selection; + private static bool udmf; + internal static bool UDMF { get { return udmf; } } + public TagExplorer() { InitializeComponent(); @@ -48,7 +52,9 @@ namespace CodeImp.DoomBuilder.TagExplorer cbCenterOnSelected.Checked = General.Settings.ReadPluginSetting("centeronselected", false); cbSelectOnClick.Checked = General.Settings.ReadPluginSetting("doselect", false); - if (GZBuilder.GZGeneral.UDMF) { + udmf = (General.Map.Config.FormatInterface == "UniversalMapSetIO"); + + if (udmf) { cbCommentsOnly.Checked = General.Settings.ReadPluginSetting("commentsonly", false); treeView.LabelEdit = true; toolTip1.SetToolTip(tbSearch, "Enter text to find comment\r\nEnter # + tag number to show only specified tag. Example: #667\r\nEnter $ + effect number to show only specified effect. Example: $80"); @@ -66,13 +72,9 @@ namespace CodeImp.DoomBuilder.TagExplorer General.Settings.WritePluginSetting("displaymode", cbDisplayMode.SelectedIndex); General.Settings.WritePluginSetting("centeronselected", cbCenterOnSelected.Checked); General.Settings.WritePluginSetting("doselect", cbSelectOnClick.Checked); - - if (GZBuilder.GZGeneral.UDMF) - General.Settings.WritePluginSetting("commentsonly", cbCommentsOnly.Checked); - - if (disposing && (components != null)) - components.Dispose(); + if (udmf) General.Settings.WritePluginSetting("commentsonly", cbCommentsOnly.Checked); + if (disposing && (components != null)) components.Dispose(); base.Dispose(disposing); } @@ -96,7 +98,7 @@ namespace CodeImp.DoomBuilder.TagExplorer int filteredAction = -1; getSpecialValues(serachStr, ref filteredTag, ref filteredAction); - if (filteredTag != -1 || filteredAction != -1) serachStr = ""; + if (!udmf || filteredTag != -1 || filteredAction != -1) serachStr = ""; TreeNode selectedNode = null; @@ -118,7 +120,7 @@ namespace CodeImp.DoomBuilder.TagExplorer if (!hasComment && cbCommentsOnly.Checked) continue; - if (!GZBuilder.GZGeneral.UDMF || serachStr.Length == 0 || (hasComment && comment.ToLowerInvariant().IndexOf(serachStr) != -1)) { + if (!udmf || serachStr.Length == 0 || (hasComment && comment.ToLowerInvariant().IndexOf(serachStr) != -1)) { TreeNode node = new TreeNode(name, 1, 1); node.Tag = info; if (hasComment) node.ForeColor = commentColor; @@ -180,8 +182,32 @@ namespace CodeImp.DoomBuilder.TagExplorer treeView.Nodes.Add(new TreeNode(CAT_THINGS, 0, 0, catNodes)); - } else { //sort by tag. just add them as they are - treeView.Nodes.Add(new TreeNode(CAT_THINGS, 0, 0, nodes.ToArray())); + } else { //sort by tag + Dictionary categories = new Dictionary(); + TreeNode noTag = new TreeNode("No Tag", 0, 0); + + foreach (TreeNode node in nodes) { + NodeInfo nodeInfo = node.Tag as NodeInfo; + + if (nodeInfo.Tag == 0) { + noTag.Nodes.Add(node); + continue; + } + + if (!categories.ContainsKey(nodeInfo.Tag)) + categories.Add(nodeInfo.Tag, new TreeNode("Tag " + nodeInfo.Tag, 0, 0, new TreeNode[] { node })); + else + categories[nodeInfo.Tag].Nodes.Add(node); + } + + TreeNode[] catNodes = new TreeNode[categories.Values.Count]; + categories.Values.CopyTo(catNodes, 0); + + TreeNode category = new TreeNode(CAT_THINGS, 0, 0, catNodes); + if (noTag.Nodes.Count > 0) + category.Nodes.Add(noTag); + + treeView.Nodes.Add(category); } } @@ -202,7 +228,7 @@ namespace CodeImp.DoomBuilder.TagExplorer if (!hasComment && cbCommentsOnly.Checked) continue; - if (!GZBuilder.GZGeneral.UDMF || serachStr.Length == 0 || (hasComment && comment.ToLowerInvariant().IndexOf(serachStr) != -1)) { + if (!udmf || serachStr.Length == 0 || (hasComment && comment.ToLowerInvariant().IndexOf(serachStr) != -1)) { TreeNode node = new TreeNode(name, 3, 3); node.Tag = info; if (hasComment) node.ForeColor = commentColor; @@ -246,7 +272,32 @@ namespace CodeImp.DoomBuilder.TagExplorer category.Nodes.Add(noAction); treeView.Nodes.Add(category); - } else { //just add them as they are + } else if (currentSortMode == SortMode.SORT_BY_TAG) { + Dictionary categories = new Dictionary(); + TreeNode noTag = new TreeNode("No Tag", 2, 2); + + foreach (TreeNode node in nodes) { + NodeInfo nodeInfo = node.Tag as NodeInfo; + + if (nodeInfo.Tag == 0) { + noTag.Nodes.Add(node); + continue; + } + + if (!categories.ContainsKey(nodeInfo.Tag)) + categories.Add(nodeInfo.Tag, new TreeNode("Tag " + nodeInfo.Tag, 2, 2, new TreeNode[] { node })); + else + categories[nodeInfo.Tag].Nodes.Add(node); + } + TreeNode[] catNodes = new TreeNode[categories.Values.Count]; + categories.Values.CopyTo(catNodes, 0); + + TreeNode category = new TreeNode(CAT_SECTORS, 2, 2, catNodes); + if (noTag.Nodes.Count > 0) + category.Nodes.Add(noTag); + + treeView.Nodes.Add(category); + } else {//just add them as they are treeView.Nodes.Add(new TreeNode(CAT_SECTORS, 2, 2, nodes.ToArray())); } } @@ -268,7 +319,7 @@ namespace CodeImp.DoomBuilder.TagExplorer if (!hasComment && cbCommentsOnly.Checked) continue; - if (!GZBuilder.GZGeneral.UDMF || serachStr.Length == 0 || (hasComment && comment.ToLowerInvariant().IndexOf(serachStr) != -1)) { + if (!udmf || serachStr.Length == 0 || (hasComment && comment.ToLowerInvariant().IndexOf(serachStr) != -1)) { TreeNode node = new TreeNode(name, 5, 5); node.Tag = info; if (hasComment) node.ForeColor = commentColor; @@ -313,6 +364,31 @@ namespace CodeImp.DoomBuilder.TagExplorer treeView.Nodes.Add(category); + } else if (currentSortMode == SortMode.SORT_BY_TAG) { + Dictionary categories = new Dictionary(); + TreeNode noTag = new TreeNode("No Tag", 4, 4); + + foreach (TreeNode node in nodes) { + NodeInfo nodeInfo = node.Tag as NodeInfo; + + if (nodeInfo.Tag == 0) { + noTag.Nodes.Add(node); + continue; + } + + if (!categories.ContainsKey(nodeInfo.Tag)) + categories.Add(nodeInfo.Tag, new TreeNode("Tag " + nodeInfo.Tag, 4, 4, new TreeNode[] { node })); + else + categories[nodeInfo.Tag].Nodes.Add(node); + } + TreeNode[] catNodes = new TreeNode[categories.Values.Count]; + categories.Values.CopyTo(catNodes, 0); + + TreeNode category = new TreeNode(CAT_LINEDEFS, 4, 4, catNodes); + if (noTag.Nodes.Count > 0) + category.Nodes.Add(noTag); + + treeView.Nodes.Add(category); } else { //just add them as they are treeView.Nodes.Add(new TreeNode(CAT_LINEDEFS, 4, 4, nodes.ToArray())); } @@ -438,7 +514,7 @@ namespace CodeImp.DoomBuilder.TagExplorer break; default: - GZBuilder.GZGeneral.Trace("Got unknown category: " + info.Type); + General.ErrorLogger.Add(ErrorType.Warning, "Tag Explorer: got unknown category: " + info.Type); break; } @@ -465,6 +541,8 @@ namespace CodeImp.DoomBuilder.TagExplorer General.Editing.ChangeMode("SectorsMode"); Sector s = General.Map.Map.GetSectorByIndex(info.Index); if (s != null) { + s.Selected = true; + foreach (Sidedef sd in s.Sidedefs) sd.Line.Selected = true; } @@ -473,8 +551,51 @@ namespace CodeImp.DoomBuilder.TagExplorer //focus on element? if (cbCenterOnSelected.Checked) { - Vector2D pos = info.GetPosition(); - General.Map.Renderer2D.PositionView(pos.x, pos.y); + List points = new List(); + RectangleF area = MapSet.CreateEmptyArea(); + + if (info.Type == NodeInfoType.LINEDEF) { + Linedef l = General.Map.Map.GetLinedefByIndex(info.Index); + points.Add(l.Start.Position); + points.Add(l.End.Position); + } else if (info.Type == NodeInfoType.SECTOR) { + Sector s = General.Map.Map.GetSectorByIndex(info.Index); + foreach (Sidedef sd in s.Sidedefs) { + points.Add(sd.Line.Start.Position); + points.Add(sd.Line.End.Position); + } + } else if (info.Type == NodeInfoType.THING) { + Thing t = General.Map.Map.GetThingByIndex(info.Index); + Vector2D p = (Vector2D)t.Position; + points.Add(p); + points.Add(p + new Vector2D(t.Size * 2.0f, t.Size * 2.0f)); + points.Add(p + new Vector2D(t.Size * 2.0f, -t.Size * 2.0f)); + points.Add(p + new Vector2D(-t.Size * 2.0f, t.Size * 2.0f)); + points.Add(p + new Vector2D(-t.Size * 2.0f, -t.Size * 2.0f)); + } else { + General.Fail("Tag Explorer: unknown object type given to zoom in on!"); + } + + // Make a view area from the points + foreach (Vector2D p in points) area = MapSet.IncreaseArea(area, p); + + // Make the area square, using the largest side + if (area.Width > area.Height) { + float delta = area.Width - area.Height; + area.Y -= delta * 0.5f; + area.Height += delta; + } else { + float delta = area.Height - area.Width; + area.X -= delta * 0.5f; + area.Width += delta; + } + + // Add padding + area.Inflate(100f, 100f); + + // Zoom to area + ClassicMode editmode = (General.Editing.Mode as ClassicMode); + editmode.CenterOnArea(area, 0.6f); } //update view @@ -484,7 +605,7 @@ namespace CodeImp.DoomBuilder.TagExplorer private void treeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { //edit comment - if (GZBuilder.GZGeneral.UDMF) { + if (udmf) { NodeInfo info = e.Node.Tag as NodeInfo; if (info == null) return; @@ -495,7 +616,7 @@ namespace CodeImp.DoomBuilder.TagExplorer //we don't want to edit categories if we are in UDMF private void treeView_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e) { - if (!GZBuilder.GZGeneral.UDMF || e.Node.Tag == null) { + if (!udmf || e.Node.Tag == null) { e.CancelEdit = true; return; } @@ -514,7 +635,6 @@ namespace CodeImp.DoomBuilder.TagExplorer //apply comment info.Comment = e.Label; e.Node.Text = info.GetName(ref comment, currentSortMode); - //e.Node.ForeColor = (comment == "" ? Color.Black : commentColor); e.Node.ForeColor = commentColor; } else { //Edit cancelled. info.Comment = ""; //Remove comment diff --git a/Source/Plugins/TagExplorer/NodeInfo.cs b/Source/Plugins/TagExplorer/NodeInfo.cs index 7d9769da..4405466d 100644 --- a/Source/Plugins/TagExplorer/NodeInfo.cs +++ b/Source/Plugins/TagExplorer/NodeInfo.cs @@ -108,10 +108,18 @@ namespace CodeImp.DoomBuilder.TagExplorer UniFields fields = getFields(); if (comment == "") { - if (fields.ContainsKey("comment")) fields.Remove("comment"); + if (fields.ContainsKey("comment")) { + General.Map.UndoRedo.CreateUndo("Remove comment"); + fields.BeforeFieldsChange(); + fields.Remove("comment"); + } return; } + //create undo stuff + General.Map.UndoRedo.CreateUndo("Set comment"); + fields.BeforeFieldsChange(); + if (!fields.ContainsKey("comment")) fields.Add("comment", new UniValue((int)UniversalType.String, comment)); else @@ -147,7 +155,7 @@ namespace CodeImp.DoomBuilder.TagExplorer private string getThingName(Thing t, ref string comment, string sortMode) { bool isDefaultName = true; comment = ""; - if (GZBuilder.GZGeneral.UDMF && t.Fields.ContainsKey("comment")) { + if (TagExplorer.UDMF && t.Fields.ContainsKey("comment")) { comment = t.Fields["comment"].Value.ToString(); isDefaultName = false; } @@ -157,7 +165,7 @@ namespace CodeImp.DoomBuilder.TagExplorer private string getSectorName(Sector s, ref string comment, string sortMode) { bool isDefaultName = true; comment = ""; - if (GZBuilder.GZGeneral.UDMF && s.Fields.ContainsKey("comment")) { + if (TagExplorer.UDMF && s.Fields.ContainsKey("comment")) { comment = s.Fields["comment"].Value.ToString(); isDefaultName = false; } @@ -167,7 +175,7 @@ namespace CodeImp.DoomBuilder.TagExplorer private string getLinedefName(Linedef l, ref string comment, string sortMode) { bool isDefaultName = true; comment = ""; - if (GZBuilder.GZGeneral.UDMF && l.Fields.ContainsKey("comment")) { + if (TagExplorer.UDMF && l.Fields.ContainsKey("comment")) { comment = l.Fields["comment"].Value.ToString(); isDefaultName = false; } diff --git a/Source/Plugins/UMDFControls/BuilderPlug.cs b/Source/Plugins/UMDFControls/BuilderPlug.cs index 50f6d884..d70fbc45 100644 --- a/Source/Plugins/UMDFControls/BuilderPlug.cs +++ b/Source/Plugins/UMDFControls/BuilderPlug.cs @@ -11,7 +11,7 @@ using CodeImp.DoomBuilder.VisualModes; namespace CodeImp.DoomBuilder.UDMFControls { - public class BuilderPlug: Plug { + public sealed class BuilderPlug: Plug { private static BuilderPlug me; public static BuilderPlug Me { get { return me; } } diff --git a/Source/Plugins/UMDFControls/Windows/UDMFControlsForm.Designer.cs b/Source/Plugins/UMDFControls/Windows/UDMFControlsForm.Designer.cs index 549f044f..1466a95c 100644 --- a/Source/Plugins/UMDFControls/Windows/UDMFControlsForm.Designer.cs +++ b/Source/Plugins/UMDFControls/Windows/UDMFControlsForm.Designer.cs @@ -59,6 +59,7 @@ this.cbnofakecontrast = new System.Windows.Forms.CheckBox(); this.cbwrapmidtex = new System.Windows.Forms.CheckBox(); this.cbclipmidtex = new System.Windows.Forms.CheckBox(); + this.cbhidden = new System.Windows.Forms.CheckBox(); this.gbRotation.SuspendLayout(); this.gbPosition.SuspendLayout(); this.gbScale.SuspendLayout(); @@ -336,13 +337,14 @@ // // gbFlagsFloor // + this.gbFlagsFloor.Controls.Add(this.cbhidden); this.gbFlagsFloor.Controls.Add(this.cbsilent); this.gbFlagsFloor.Controls.Add(this.cbnorespawn); this.gbFlagsFloor.Controls.Add(this.cbnofallingdamage); this.gbFlagsFloor.Controls.Add(this.cbdropactors); this.gbFlagsFloor.Location = new System.Drawing.Point(6, 150); this.gbFlagsFloor.Name = "gbFlagsFloor"; - this.gbFlagsFloor.Size = new System.Drawing.Size(235, 112); + this.gbFlagsFloor.Size = new System.Drawing.Size(235, 139); this.gbFlagsFloor.TabIndex = 3; this.gbFlagsFloor.TabStop = false; this.gbFlagsFloor.Text = "Floor and Ceiling flags:"; @@ -350,7 +352,7 @@ // cbsilent // this.cbsilent.AutoSize = true; - this.cbsilent.Location = new System.Drawing.Point(6, 91); + this.cbsilent.Location = new System.Drawing.Point(6, 115); this.cbsilent.Name = "cbsilent"; this.cbsilent.Size = new System.Drawing.Size(52, 18); this.cbsilent.TabIndex = 3; @@ -361,7 +363,7 @@ // cbnorespawn // this.cbnorespawn.AutoSize = true; - this.cbnorespawn.Location = new System.Drawing.Point(6, 67); + this.cbnorespawn.Location = new System.Drawing.Point(6, 91); this.cbnorespawn.Name = "cbnorespawn"; this.cbnorespawn.Size = new System.Drawing.Size(89, 18); this.cbnorespawn.TabIndex = 2; @@ -372,7 +374,7 @@ // cbnofallingdamage // this.cbnofallingdamage.AutoSize = true; - this.cbnofallingdamage.Location = new System.Drawing.Point(6, 43); + this.cbnofallingdamage.Location = new System.Drawing.Point(6, 67); this.cbnofallingdamage.Name = "cbnofallingdamage"; this.cbnofallingdamage.Size = new System.Drawing.Size(114, 18); this.cbnofallingdamage.TabIndex = 1; @@ -461,6 +463,17 @@ this.cbclipmidtex.Text = "Clip Middle Texture"; this.cbclipmidtex.UseVisualStyleBackColor = true; // + // cbhidden + // + this.cbhidden.AutoSize = true; + this.cbhidden.Location = new System.Drawing.Point(6, 43); + this.cbhidden.Name = "cbhidden"; + this.cbhidden.Size = new System.Drawing.Size(59, 18); + this.cbhidden.TabIndex = 4; + this.cbhidden.Tag = "hidden"; + this.cbhidden.Text = "Hidden"; + this.cbhidden.UseVisualStyleBackColor = true; + // // UDMFControlsForm // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); @@ -538,5 +551,6 @@ private System.Windows.Forms.CheckBox cblightabsolute; private System.Windows.Forms.CheckBox cbRelativeMode; private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.CheckBox cbhidden; } } \ No newline at end of file diff --git a/Source/Plugins/UMDFControls/Windows/UDMFControlsForm.cs b/Source/Plugins/UMDFControls/Windows/UDMFControlsForm.cs index 73b6dbc2..595484f5 100644 --- a/Source/Plugins/UMDFControls/Windows/UDMFControlsForm.cs +++ b/Source/Plugins/UMDFControls/Windows/UDMFControlsForm.cs @@ -55,7 +55,7 @@ namespace CodeImp.DoomBuilder.UDMFControls updateList = new List(); wallFlags = new CheckBox[] { cbnodecals, cbnofakecontrast, cbclipmidtex, cbsmoothlighting }; - sectorFlags = new CheckBox[] { cbsilent, cbnofallingdamage, cbdropactors, cbnorespawn }; + sectorFlags = new CheckBox[] { cbsilent, cbnofallingdamage, cbdropactors, cbnorespawn, cbhidden }; renderStyles = new List() { "translucent", "add" }; @@ -108,10 +108,10 @@ namespace CodeImp.DoomBuilder.UDMFControls setDefaultUniversalProperties(sp.Linedef.Fields, defaultLinedefFields); break; - case VisualGeometryType.WALL_MIDDLE_3D: //all 3D-walls in a sector are linked to the same sidedef of control sector, so if many are selected, we need only one. + case VisualGeometryType.WALL_MIDDLE_3D: walls3dCount++; - if (wall3DIndeces.IndexOf(vg.Sector.Sector.FixedIndex) != -1) - break; + //if (wall3DIndeces.IndexOf(vg.Sector.Sector.FixedIndex) != -1) + //break; wall3DIndeces.Add(vg.Sector.Sector.FixedIndex); goto case VisualGeometryType.WALL_MIDDLE; @@ -120,6 +120,9 @@ namespace CodeImp.DoomBuilder.UDMFControls wallsMid.Add(sp); setDefaultUniversalProperties(sp.Sidedef.Fields, defaultSidedefFields); setDefaultUniversalProperties(sp.Linedef.Fields, defaultLinedefFields); + + if (sp.HasControlLinedef) + setDefaultUniversalProperties(sp.ControlSidedef.Fields, defaultSidedefFields); break; case VisualGeometryType.WALL_UPPER: @@ -176,8 +179,8 @@ namespace CodeImp.DoomBuilder.UDMFControls if (firstWall != null) { if(firstFloor == null){ //get shared values from wall //get values - float scaleX = (float)firstWall.Sidedef.Fields[KeyNames.GetScaleX(firstWall.GeometryType)].Value; - float scaleY = (float)firstWall.Sidedef.Fields[KeyNames.GetScaleY(firstWall.GeometryType)].Value; + float scaleX = (float)firstWall.ControlSidedef.Fields[KeyNames.GetScaleX(firstWall.GeometryType)].Value; + float scaleY = (float)firstWall.ControlSidedef.Fields[KeyNames.GetScaleY(firstWall.GeometryType)].Value; float translateX = (float)firstWall.Sidedef.Fields[KeyNames.GetTranslationX(firstWall.GeometryType)].Value; float translateY = (float)firstWall.Sidedef.Fields[KeyNames.GetTranslationY(firstWall.GeometryType)].Value; @@ -196,6 +199,8 @@ namespace CodeImp.DoomBuilder.UDMFControls if (walls3dCount == wallsMid.Count && wallsTop.Count == 0 && wallsBottom.Count == 0) { gbAlpha.Enabled = false; bgBrightness.Enabled = false; + //cblightabsolute.Checked = true; + //cblightabsolute.Enabled = false; } } @@ -248,6 +253,9 @@ namespace CodeImp.DoomBuilder.UDMFControls foreach (SurfaceProperties wall in list) { removeDefaultUniversalProperties(wall.Sidedef.Fields, defaultSidedefFields); removeDefaultUniversalProperties(wall.Linedef.Fields, defaultLinedefFields); + + if(wall.HasControlLinedef) + removeDefaultUniversalProperties(wall.ControlSidedef.Fields, defaultSidedefFields); } } } @@ -280,21 +288,41 @@ namespace CodeImp.DoomBuilder.UDMFControls //sidedef props private void setSidedefProperty(string propName, object value) { //special cases - if (propName == "scale" || propName == "offset") { + if (propName == "scale") { + General.Fail("use SetSidedefScale instead!"); + return; + }else if(propName == "offset"){ setPairedSidedefProperty(propName, (Vector2D)value); return; } //apply value - foreach (List list in walls) { - foreach (SurfaceProperties vg in list) - vg.Sidedef.Fields[propName].Value = value; - } + /*if (propName == "light" && !cblightabsolute.Checked) { + int light = (int)value > 0 ? (int)value : 0; + + //3d walls are lit as if "absolutelighting" flag is always set + foreach (List list in walls) { + foreach (SurfaceProperties vg in list) { + if (vg.GeometryType == VisualGeometryType.WALL_MIDDLE_3D) + vg.Sidedef.Fields[propName].Value = light; + else + vg.Sidedef.Fields[propName].Value = value; + } + } + } else {*/ + foreach (List list in walls) { + foreach (SurfaceProperties vg in list) { + if ((propName == "light" || propName == "lightabsolute") && vg.GeometryType == VisualGeometryType.WALL_MIDDLE_3D) //just... skip it for now + continue; + vg.Sidedef.Fields[propName].Value = value; + } + } + //} } private void setPairedSidedefProperty(string propName, Vector2D value) { - if (propName != "scale" && propName != "offset") - return; + if (propName == "scale") General.Fail("use SetScale instead!"); //dbg + if (propName != "offset") return; string upperNameX = "x_top"; string upperNameY = "y_top"; @@ -318,7 +346,7 @@ namespace CodeImp.DoomBuilder.UDMFControls val = (float)vg.Sidedef.Fields[props[index]].Value + value.x; vg.Sidedef.Fields[props[index]].Value = val; - val = (float)vg.Sidedef.Fields[props[index+1]].Value + value.y; + val = (float)vg.Sidedef.Fields[props[index + 1]].Value + value.y; vg.Sidedef.Fields[props[index + 1]].Value = val; } index += 2; @@ -427,6 +455,58 @@ namespace CodeImp.DoomBuilder.UDMFControls } } } + + private void setSidedefScale(Vector2D value) { + string[] props = new string[] { "scalex_top", "scaley_top", "scalex_mid", "scaley_mid", "scalex_bottom", "scaley_bottom" }; + List controlSectors = new List(); + int index = 0; + + //apply values + if (relativeMode) { + float val; + foreach (List list in walls) { //top -> middle -> bottom + foreach (SurfaceProperties vg in list) { + if (vg.HasControlLinedef) { + if (controlSectors.Contains(vg.ControlSidedef.Sector.FixedIndex)) + continue; + + val = (float)vg.ControlSidedef.Fields[props[index]].Value + value.x; + vg.ControlSidedef.Fields[props[index]].Value = val; + + val = (float)vg.ControlSidedef.Fields[props[index + 1]].Value + value.y; + vg.ControlSidedef.Fields[props[index + 1]].Value = val; + + controlSectors.Add(vg.ControlSidedef.Sector.FixedIndex); + } else { + val = (float)vg.Sidedef.Fields[props[index]].Value + value.x; + vg.Sidedef.Fields[props[index]].Value = val; + + val = (float)vg.Sidedef.Fields[props[index + 1]].Value + value.y; + vg.Sidedef.Fields[props[index + 1]].Value = val; + } + } + index += 2; + } + } else { + foreach (List list in walls) { //top -> middle -> bottom + foreach (SurfaceProperties vg in list) { + if (vg.HasControlLinedef) { + if (controlSectors.Contains(vg.ControlSidedef.Sector.FixedIndex)) + continue; + + vg.ControlSidedef.Fields[props[index]].Value = value.x; + vg.ControlSidedef.Fields[props[index + 1]].Value = value.y; + + controlSectors.Add(vg.ControlSidedef.Sector.FixedIndex); + } else { + vg.Sidedef.Fields[props[index]].Value = value.x; + vg.Sidedef.Fields[props[index + 1]].Value = value.y; + } + } + index += 2; + } + } + } //EVENTS private void btnOK_Click(object sender, EventArgs e) { @@ -495,7 +575,8 @@ namespace CodeImp.DoomBuilder.UDMFControls //scale private void scaleControl_OnValueChanged(object sender, EventArgs e) { - setSharedPairedProperty((string)scaleControl.Tag, relativeMode ? scaleControl.Delta : scaleControl.Value); + setPairedSectorProperty((string)scaleControl.Tag, relativeMode ? scaleControl.Delta : scaleControl.Value); + setSidedefScale(relativeMode ? scaleControl.Delta : scaleControl.Value); update(); } @@ -543,10 +624,13 @@ namespace CodeImp.DoomBuilder.UDMFControls } } - internal class SurfaceProperties { + internal sealed class SurfaceProperties { private Sector sector; public Sector Sector { get { return sector; } } + private Sidedef controlSidedef; + public Sidedef ControlSidedef { get { return controlSidedef; } } + private Sidedef sidedef; public Sidedef Sidedef { get { return sidedef; } } @@ -555,6 +639,9 @@ namespace CodeImp.DoomBuilder.UDMFControls public VisualGeometryType GeometryType { get { return vg.GeometryType; } } private VisualGeometry vg; + + private bool hasControlLinedef; + public bool HasControlLinedef { get { return hasControlLinedef; } } public SurfaceProperties(VisualGeometry visualGeometry) { vg = visualGeometry; @@ -563,8 +650,14 @@ namespace CodeImp.DoomBuilder.UDMFControls sector.Fields.BeforeFieldsChange(); } else { linedef = vg.GetControlLinedef(); - sidedef = linedef.Front; + + controlSidedef = linedef.Front; + sidedef = vg.Sidedef; + + hasControlLinedef = (controlSidedef.Sector.FixedIndex != sidedef.Sector.FixedIndex); + linedef.Fields.BeforeFieldsChange(); + controlSidedef.Fields.BeforeFieldsChange(); sidedef.Fields.BeforeFieldsChange(); } } @@ -575,7 +668,7 @@ namespace CodeImp.DoomBuilder.UDMFControls } - internal class KeyNames { + internal sealed class KeyNames { //SCALE public static string GetScaleX(VisualGeometryType type) { return getScale(type).Replace("$", "x");