diff --git a/cmake/unix.cmake b/cmake/unix.cmake index b928240e4..40bb33308 100644 --- a/cmake/unix.cmake +++ b/cmake/unix.cmake @@ -156,6 +156,9 @@ if(HAVE_SSE) add_definitions(-D_USE_SSE) endif() +# Define a SLADE_DEBUG macro +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSLADE_DEBUG") + # Enable debug symbols for glib (so gdb debugging works properly with strings etc.) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_GLIBCXX_DEBUG") diff --git a/dist/res/config/archive_formats.cfg b/dist/res/config/archive_formats.cfg index 8d8546d5d..44afd31e4 100644 --- a/dist/res/config/archive_formats.cfg +++ b/dist/res/config/archive_formats.cfg @@ -230,7 +230,7 @@ archive_formats supports_dirs = false; entry_format = "archive_wolf"; prefer_uppercase = true; - + extensions { wl1 = "Wolf3D WL1"; diff --git a/dist/res/config/colours/Dark Grey.txt b/dist/res/config/colours/Dark Grey.txt index 9206d5255..1eebef4ad 100644 --- a/dist/res/config/colours/Dark Grey.txt +++ b/dist/res/config/colours/Dark Grey.txt @@ -151,14 +151,14 @@ colours { group = "Map Editor"; rgb = 0, 0, 0; } - + map_linedraw { name = "Line Drawing"; group = "Map Editor"; rgb = 0, 150, 50; } - + map_3d_crosshair { name = "3D Crosshair"; @@ -167,7 +167,7 @@ colours { alpha = 255; additive = true; } - + map_3d_hilight { name = "3D Hilight"; @@ -175,7 +175,7 @@ colours { rgb = 0, 180, 255; alpha = 180; } - + map_3d_selection { name = "3D Selection"; diff --git a/dist/res/config/colours/Default.txt b/dist/res/config/colours/Default.txt index cbeb5666d..a952e1f36 100644 --- a/dist/res/config/colours/Default.txt +++ b/dist/res/config/colours/Default.txt @@ -265,14 +265,14 @@ colours { group = "Map Editor"; rgb = 0, 0, 0; } - + map_linedraw { name = "Line Drawing"; group = "Map Editor"; rgb = 0, 150, 50; } - + map_3d_crosshair { name = "3D Crosshair"; @@ -281,7 +281,7 @@ colours { alpha = 255; additive = true; } - + map_3d_hilight { name = "3D Hilight"; @@ -289,7 +289,7 @@ colours { rgb = 255, 255, 140; alpha = 170; } - + map_3d_selection { name = "3D Selection"; diff --git a/dist/res/config/entry_types/map.cfg b/dist/res/config/entry_types/map.cfg index bbe306cd3..92002bb71 100644 --- a/dist/res/config/entry_types/map.cfg +++ b/dist/res/config/entry_types/map.cfg @@ -36,7 +36,7 @@ map_linedefs : map_base // Doom64 sidedef_t is 12-byte long; "normal" sidedefs are 30-byte long. // The reduced size in D64 is because the textures are referenced by a -// two-byte index rather than by their eight-byte name. +// two-byte index rather than by their eight-byte name. map_sidedefs : map_base { name = "Map Sides"; diff --git a/dist/res/config/games/chex1.cfg b/dist/res/config/games/chex1.cfg index b7978a9c5..7a3a6a346 100644 --- a/dist/res/config/games/chex1.cfg +++ b/dist/res/config/games/chex1.cfg @@ -5,19 +5,19 @@ game chex1 { name = "Chex Quest"; - + // IWAD filename iwad = "chex.wad"; - + // Supported map formats map_formats = doom; - + // DECORATE filters filters = "chex", "any"; // Sky flat for 3d mode sky_flat = "F_SKY1"; - + // Light levels light_level_interval = 16; @@ -43,14 +43,14 @@ game chex1 heightceiling = 128; lightlevel = 160; } - + block sidedef { texturetop = "CEMENT2"; texturemiddle = "CEMENT2"; texturebottom = "CEMENT2"; } - + block thing { type = 1; diff --git a/dist/res/config/games/chex3.cfg b/dist/res/config/games/chex3.cfg index c24f5e9ca..81bb7524d 100644 --- a/dist/res/config/games/chex3.cfg +++ b/dist/res/config/games/chex3.cfg @@ -5,28 +5,28 @@ game chex3 { name = "Chex Quest 3"; - + // IWAD filename iwad = "chex3.wad"; - + // Supported map formats map_formats = hexen, udmf; - + // DECORATE filters filters = "chex", "any"; // Enable mixed textures and flats mix_tex_flats = true; - + // Enable TX_ namespace tx_textures = true; - + // Scripting script_language = "acs_zdoom"; // Sky flat for 3d mode sky_flat = "F_SKY1"; - + // Light levels light_level_interval = 8; @@ -66,14 +66,14 @@ game chex3 heightceiling = 128; lightlevel = 160; } - + block sidedef { texturetop = "CEMENT2"; texturemiddle = "CEMENT2"; texturebottom = "CEMENT2"; } - + block thing { type = 1; diff --git a/dist/res/config/games/doom1.cfg b/dist/res/config/games/doom1.cfg index 6189400e4..90343834e 100644 --- a/dist/res/config/games/doom1.cfg +++ b/dist/res/config/games/doom1.cfg @@ -5,19 +5,19 @@ game doom { name = "Doom (Ultimate)"; - + // IWAD filename iwad = "doom.wad"; - + // Supported map formats map_formats = doom; - + // DECORATE filters filters = "doom", "any"; // Sky flat for 3d mode sky_flat = "F_SKY1"; - + // Light levels light_level_interval = 16; @@ -56,7 +56,7 @@ game doom map E3M7 { sky = "SKY3"; } map E3M8 { sky = "SKY3"; } map E3M9 { sky = "SKY3"; } - + // Episode 4 map E4M1 { sky = "SKY4"; } map E4M2 { sky = "SKY4"; } @@ -80,14 +80,14 @@ game doom heightceiling = 128; lightlevel = 160; } - + block sidedef { texturetop = "STONE2"; texturemiddle = "STONE2"; texturebottom = "STONE2"; } - + block thing { type = 1; diff --git a/dist/res/config/games/doom2.cfg b/dist/res/config/games/doom2.cfg index 0fbdc5ce0..2ce0c6c32 100644 --- a/dist/res/config/games/doom2.cfg +++ b/dist/res/config/games/doom2.cfg @@ -5,19 +5,19 @@ game doom2 { name = "Doom 2"; - + // IWAD filename iwad = "doom2.wad"; - + // Supported map formats map_formats = doom; - + // DECORATE filters filters = "doom", "any"; // Sky flat for 3d mode sky_flat = "F_SKY1"; - + // Light levels light_level_interval = 16; @@ -74,14 +74,14 @@ game doom2 heightceiling = 128; lightlevel = 160; } - + block sidedef { texturetop = "STONE2"; texturemiddle = "STONE2"; texturebottom = "STONE2"; } - + block thing { type = 1; diff --git a/dist/res/config/games/doom64.cfg b/dist/res/config/games/doom64.cfg index b0eb2bba4..4d7035818 100644 --- a/dist/res/config/games/doom64.cfg +++ b/dist/res/config/games/doom64.cfg @@ -4,25 +4,25 @@ game doom64 { name = "Doom 64"; - + // IWAD filename iwad = "doom64.wad"; - + // Supported map formats map_formats = doom64; - + // DECORATE filters filters = "doom64", "any"; - + // Sky flat? - + // Valid map names -- Doom64 EX supports MAPINFO so actually // any map name is a valid name. map_name_any = true; // Enable mixed textures and flats mix_tex_flats = true; - + // Enable TX_ namespace (actually T_ namespace) tx_textures = true; @@ -89,7 +89,7 @@ game doom64 heightceiling = 128; lightlevel = 256; } - + block sidedef { texturetop = "C29"; diff --git a/dist/res/config/games/heretic.cfg b/dist/res/config/games/heretic.cfg index bed8e77ea..d340d4302 100644 --- a/dist/res/config/games/heretic.cfg +++ b/dist/res/config/games/heretic.cfg @@ -4,19 +4,19 @@ game heretic { name = "Heretic"; - + // IWAD filename iwad = "heretic.wad"; - + // Supported map formats map_formats = doom; - + // DECORATE filters filters = "heretic", "raven", "any"; // Sky flat for 3d mode sky_flat = "F_SKY1"; - + // Light levels light_level_interval = 16; @@ -95,14 +95,14 @@ game heretic heightceiling = 128; lightlevel = 160; } - + block sidedef { texturetop = "GRSTNPB"; texturemiddle = "GRSTNPB"; texturebottom = "GRSTNPB"; } - + block thing { type = 1; diff --git a/dist/res/config/games/hexen.cfg b/dist/res/config/games/hexen.cfg index d17dff743..d3e772344 100644 --- a/dist/res/config/games/hexen.cfg +++ b/dist/res/config/games/hexen.cfg @@ -4,19 +4,19 @@ game hexen { name = "Hexen"; - + // IWAD filename iwad = "hexen.wad"; - + // Supported map formats map_formats = hexen; - + // DECORATE filters filters = "hexen", "raven", "any"; - + // Sky flat for 3d mode sky_flat = "F_SKY"; - + // Scripting script_language = "acs_hexen"; @@ -85,7 +85,7 @@ game hexen //map MAP56 { sky = "SKYWALL", "SKY4"; } // Values taken from MAPINFO in hexdd.wad - + // Cluster 1 map MAP41 { sky = "SKYWALL", "SKY1"; } map MAP42 { sky = "SKYWALL", "SKY1"; } @@ -195,14 +195,14 @@ game hexen heightceiling = 128; lightlevel = 160; } - + block sidedef { texturetop = "FOREST01"; texturemiddle = "FOREST01"; texturebottom = "FOREST01"; } - + block thing { type = 1; diff --git a/dist/res/config/games/include/flags_doom.cfg b/dist/res/config/games/include/flags_doom.cfg index 3cd8b02c9..77f485343 100644 --- a/dist/res/config/games/include/flags_doom.cfg +++ b/dist/res/config/games/include/flags_doom.cfg @@ -6,25 +6,25 @@ thing_flags value = 1; udmf = "skill1", "skill2"; } - + flag "Medium Skill" { value = 2; udmf = "skill3"; } - + flag "Hard Skill" { value = 4; udmf = "skill4", "skill5"; } - + flag "Ambush" { value = 8; udmf = "ambush"; } - + flag "Multiplayer Only" { value = 16; @@ -39,49 +39,49 @@ line_flags value = 1; udmf = "blocking"; } - + flag "Blocks Monsters" { value = 2; udmf = "blockmonsters"; } - + flag "Two Sided" { value = 4; udmf = "twosided"; } - + flag "Upper Unpegged" { value = 8; udmf = "dontpegtop"; } - + flag "Lower Unpegged" { value = 16; udmf = "dontpegbottom"; } - + flag "Secret" { value = 32; udmf = "secret"; } - + flag "Blocks Sound" { value = 64; udmf = "blocksound"; } - + flag "Not On Map" { value = 128; udmf = "dontdraw"; } - + flag "Starts On Map" { value = 256; diff --git a/dist/res/config/games/include/flags_hexen.cfg b/dist/res/config/games/include/flags_hexen.cfg index 91609640f..b97ecaeef 100644 --- a/dist/res/config/games/include/flags_hexen.cfg +++ b/dist/res/config/games/include/flags_hexen.cfg @@ -6,19 +6,19 @@ thing_flags value = 1; udmf = "skill1", "skill2"; } - + flag "Medium Skill" { value = 2; udmf = "skill3"; } - + flag "Hard Skill" { value = 4; udmf = "skill4", "skill5"; } - + flag "Ambush" { value = 8; @@ -30,37 +30,37 @@ thing_flags value = 16; udmf = "dormant"; } - + flag "Fighter" { value = 32; udmf = "class1"; } - + flag "Cleric" { value = 64; udmf = "class2"; } - + flag "Mage" { value = 128; udmf = "class3"; } - + flag "Single Player" { value = 256; udmf = "single"; } - + flag "Coop" { value = 512; udmf = "coop"; } - + flag "Deathmatch" { value = 1024; @@ -75,55 +75,55 @@ line_flags value = 1; udmf = "blocking"; } - + flag "Blocks Monsters" { value = 2; udmf = "blockmonsters"; } - + flag "Two Sided" { value = 4; udmf = "twosided"; } - + flag "Upper Unpegged" { value = 8; udmf = "dontpegtop"; } - + flag "Lower Unpegged" { value = 16; udmf = "dontpegbottom"; } - + flag "Secret" { value = 32; udmf = "secret"; } - + flag "Blocks Sound" { value = 64; udmf = "blocksound"; } - + flag "Not On Map" { value = 128; udmf = "dontdraw"; } - + flag "Starts On Map" { value = 256; udmf = "mapped"; } - + flag "Repeatable" { value = 512; @@ -139,31 +139,31 @@ line_triggers value = 0; udmf = "playercross"; } - + trigger "Player Use" { value = 1; udmf = "playeruse"; } - + trigger "Monster Cross" { value = 2; udmf = "monstercross"; } - + trigger "Attack Hit" { value = 3; udmf = "impact"; } - + trigger "Player Bump" { value = 4; udmf = "playerpush"; } - + trigger "Missile Cross" { value = 5; diff --git a/dist/res/config/games/include/flags_strife.cfg b/dist/res/config/games/include/flags_strife.cfg index b36087d03..94eacb1e1 100644 --- a/dist/res/config/games/include/flags_strife.cfg +++ b/dist/res/config/games/include/flags_strife.cfg @@ -6,49 +6,49 @@ thing_flags value = 1; udmf = "skill1", "skill2"; } - + flag "Medium Skill" { value = 2; udmf = "skill3"; } - + flag "Hard Skill" { value = 4; udmf = "skill4", "skill5"; } - + flag "Stand Still" { value = 8; udmf = "standing"; } - + flag "Multiplayer Only" { value = 16; udmf = "!single"; } - + flag "Ambush" { value = 32; udmf = "ambush"; } - + flag "Ally" { value = 64; udmf = "strifeally"; } - + flag "Translucent" { value = 128; udmf = "translucent"; } - + flag "Invisible" { value = 256; @@ -63,72 +63,72 @@ line_flags value = 1; udmf = "blocking"; } - + flag "Blocks Monsters" { value = 2; udmf = "blockmonsters"; } - + flag "Two Sided" { value = 4; udmf = "twosided"; } - + flag "Upper Unpegged" { value = 8; udmf = "dontpegtop"; } - + flag "Lower Unpegged" { value = 16; udmf = "dontpegbottom"; } - + flag "Secret" { value = 32; udmf = "secret"; } - + flag "Blocks Sound" { value = 64; udmf = "blocksound"; } - + flag "Not On Map" { value = 128; udmf = "dontdraw"; } - + flag "Starts On Map" { value = 256; udmf = "mapped"; } - + flag "Railing" { value = 512; udmf = "jumpover"; } - + flag "Block Floaters" { value = 1024; udmf = "blockfloaters"; } - + flag "Translucent (75%)" { value = 2048; udmf = "translucent"; } - + flag 4096 = "Translucent (25%)"; } diff --git a/dist/res/config/games/include/props_base.cfg b/dist/res/config/games/include/props_base.cfg index b1c9ea611..d7f62eb37 100644 --- a/dist/res/config/games/include/props_base.cfg +++ b/dist/res/config/games/include/props_base.cfg @@ -76,7 +76,7 @@ udmf_properties name = "Special"; type = actionspecial; } - + property arg0 = "Arg 0"; property arg1 = "Arg 1"; property arg2 = "Arg 2"; @@ -137,7 +137,7 @@ udmf_properties property heightfloor = "Floor Height"; property heightceiling = "Ceiling Height"; - + property id { name = "Tag/ID"; diff --git a/dist/res/config/games/include/specials_doom64.cfg b/dist/res/config/games/include/specials_doom64.cfg index ba47212c3..8b3ad812f 100644 --- a/dist/res/config/games/include/specials_doom64.cfg +++ b/dist/res/config/games/include/specials_doom64.cfg @@ -6,7 +6,7 @@ action_specials group "Doors" { tagged = sector_or_back; - + special 1 = "Door Normal"; special 2 = "Door Open"; special 3 = "Door Close"; @@ -93,7 +93,7 @@ action_specials special 245 = "Ceiling Set Hieght"; special 252 = "Ceiling Move By Height"; } - + group "Scripted Plats" { special 236 = "Custom Plat Down Up"; @@ -101,7 +101,7 @@ action_specials special 238 = "Custom Plat Up Down"; special 239 = "Custom Plat Up Down Fast"; } - + group "Macro Control" { special 246 = "Macro Restart at Batch ID"; diff --git a/dist/res/config/games/include/specials_hexen.cfg b/dist/res/config/games/include/specials_hexen.cfg index 0cb07a435..3b3cde21e 100644 --- a/dist/res/config/games/include/specials_hexen.cfg +++ b/dist/res/config/games/include/specials_hexen.cfg @@ -432,7 +432,7 @@ action_specials group "Teleporters" { tagged = thing; - + special 70 { name = "Teleport"; @@ -448,7 +448,7 @@ action_specials group "Lighting" { tagged = sector; - + special 109 = "Light_ForceLightning"; special 110 { @@ -504,7 +504,7 @@ action_specials group "Scrollers" { tagged = no; - + special 100 { name = "Scroll_Texture_Left"; @@ -595,7 +595,7 @@ action_specials group "Things" { tagged = thing; - + special 72 { name = "ThrustThing"; @@ -666,7 +666,7 @@ action_specials group "Lines" { tagged = line; - + special 121 { name = "Line_SetIdentification"; diff --git a/dist/res/config/games/include/things_action2.cfg b/dist/res/config/games/include/things_action2.cfg index 902d5c997..f9485ad80 100644 --- a/dist/res/config/games/include/things_action2.cfg +++ b/dist/res/config/games/include/things_action2.cfg @@ -304,14 +304,14 @@ thing_types sprite = "SNPRA?"; scale = 0.18; } - + thing 13568 { name = "Maggie (ally)"; scale = 0.4; sprite = "MAGGB?"; } - + group "Bonus" { thing 13485 @@ -517,7 +517,7 @@ thing_types name = "Pizza pie"; sprite = "PZA2A?"; } - + group "Dead of Winter" { thing 13595 @@ -661,7 +661,7 @@ thing_types name = "Blunderbuss"; sprite = "BUSSM?"; } - + group "Bonus" { thing 20003 @@ -728,7 +728,7 @@ thing_types name = "Cannon ball"; sprite = "BUSSG?"; } - + group "Dead of Winter" { thing 13578 @@ -862,7 +862,7 @@ thing_types name = "Windows source code"; sprite = "XPCDA?"; } - + group "Dead of Winter" { thing 13593 @@ -891,14 +891,14 @@ thing_types } } } - + group "Billboard NPCs" { // Group defaults radius = 16; angle = false; decoration = true; - + thing 13381 { name = "Jerry Marconi"; @@ -944,7 +944,7 @@ thing_types name = "Gary Johnson"; sprite = "GARYO?"; } - + group "Bonus" { /* Unfortunately, this conflicts with the Snowman from Dead of Winter... @@ -955,7 +955,7 @@ thing_types } */ } } - + group "Interactive Items" { // Group defaults @@ -1030,7 +1030,7 @@ thing_types name = "Trash can with key"; sprite = "TRASA?"; } - + group "Dead of Winter" { thing 13570 @@ -1066,7 +1066,7 @@ thing_types } } } - + group "Gore" { // Group defaults @@ -1084,7 +1084,7 @@ thing_types name = "Dead Gary Johnson"; sprite = "GARYM?"; } - + group "Dead of Winter" { thing 13602 @@ -1161,7 +1161,7 @@ thing_types angle = false; decoration = true; solid = true; - + group "Streets" { thing 13375 @@ -1185,7 +1185,7 @@ thing_types width = 8; heigt = 56; } - + group "Dead of Winter" { thing 13569 @@ -1200,7 +1200,7 @@ thing_types } } } - + group "Furniture" { thing 13421 @@ -1239,7 +1239,7 @@ thing_types height = 42; } } - + group "Plants" { thing 13396 @@ -1265,7 +1265,7 @@ thing_types height = 72; } } - + group "Rocks" { thing 13480 @@ -1290,12 +1290,12 @@ thing_types height = 30; } } - + group "Small Things" { // Group defaults solid = false; - + thing 13372 { name = "Cocktail glass"; @@ -1470,7 +1470,7 @@ thing_types height = 48; } } - + group "Lighting" { // Group defaults @@ -1517,14 +1517,14 @@ thing_types name = "Swinging light bulb"; sprite = "BULBE?"; } - + group "Dead of Winter" { thing 13574 { name = "Lamp Light"; sprite = "WLT1A?"; - } + } thing 13576 { name = "Lamp Globe"; diff --git a/dist/res/config/games/include/things_chex1.cfg b/dist/res/config/games/include/things_chex1.cfg index b47606cc6..b196358c0 100644 --- a/dist/res/config/games/include/things_chex1.cfg +++ b/dist/res/config/games/include/things_chex1.cfg @@ -281,7 +281,7 @@ thing_types sprite = "YKEYA?"; } } - + group "Lighting" { // Group defaults @@ -292,7 +292,7 @@ thing_types fullbright = true; decoration = true; solid = true; - + thing 2028 { name = "Landing Light"; sprite = "COLUA?"; } } @@ -304,7 +304,7 @@ thing_types angle = false; decoration = true; solid = true; - + group "IFC" { thing 35 { name = "Oxygen Tank"; sprite = "CBRAA?"; } @@ -315,7 +315,7 @@ thing_types thing 62 { name = "Hanging Pots"; sprite = "GOR5A?"; hanging = true; radius = 20; } thing 34 { name = "Beaker"; sprite = "CANDA?"; } } - + group "Slime" { // Group defaults @@ -324,7 +324,7 @@ thing_types thing 44 { name = "Slime Fountain"; sprite = "TBLUA?"; } thing 21 { name = "Zorched Cycloptis"; sprite = "SARGN?"; solid = false; } // E1M4 has one... } - + group "Rocks & Cave Stuff" { thing 33 { name = "Bazooik Mine Cart"; sprite = "COL4A?"; } @@ -334,7 +334,7 @@ thing_types thing 30 { name = "Bazooik Cave Stalagmite"; sprite = "COL1A?"; } thing 53 { name = "Bazooik Cave Stalactite"; sprite = "GOR5A?"; } } - + group "Plants" { thing 31 { name = "Hydroponic Plant"; sprite = "COL2A?"; hanging = true; } @@ -348,7 +348,7 @@ thing_types thing 47 { name = "Apple Tree"; sprite = "SMITA?"; radius = 20; } thing 43 { name = "Orange Tree"; sprite = "TRE1A?"; radius = 20; } } - + group "Captives" { // Group defaults diff --git a/dist/res/config/games/include/things_chex3.cfg b/dist/res/config/games/include/things_chex3.cfg index b7a14a330..ec623fa3c 100644 --- a/dist/res/config/games/include/things_chex3.cfg +++ b/dist/res/config/games/include/things_chex3.cfg @@ -97,21 +97,21 @@ thing_types radius = 24; sprite = "BOSSA?"; } - + thing 69 { name = "Flembrane"; radius = 64; sprite = "FLMBA?"; } - + thing 9050 { name = "Flemoidus Larva"; radius = 30; sprite = "LRVAA?"; } - + thing 9057 { name = "Flemoidus Quadrumpus"; @@ -351,7 +351,7 @@ thing_types radius = 14; } } - + group "Lighting" { // Group defaults @@ -362,7 +362,7 @@ thing_types fullbright = true; decoration = true; solid = true; - + thing 34 { name = "Bollard"; sprite = "CANDA?"; } // ChexChemicalFlask in Chex 1 thing 35 { name = "Street Light"; sprite = "CBRAA?"; } // ChexGasTank in Chex 1, height 128 thing 45 { name = "Flemoid Lamp"; sprite = "TGRNA?"; } // ChexCivilian1 in Chex 1 @@ -379,7 +379,7 @@ thing_types angle = false; decoration = true; solid = true; - + group "Art" { thing 18 { name = "Model Rocket"; sprite = "MROCA?"; radius = 20; } @@ -394,7 +394,7 @@ thing_types thing 9055 { name = "Chex Warrior Statue"; sprite = "STTUE?"; radius = 20; } thing 9056 { name = "Huge Spoon Sculpture"; sprite = "STTUF?"; radius = 60; } } - + group "IFC" { thing 19 { name = "Radar Dish"; sprite = "RADAA?"; radius = 20; } @@ -413,7 +413,7 @@ thing_types thing 80 { name = "Beaker"; sprite = "POL5A?"; } thing 85 { name = "Map Room Point Light"; sprite = "TLMPA?"; } } - + group "Slime" { // Group defaults @@ -428,7 +428,7 @@ thing_types thing 86 { name = "Slimy Urn"; sprite = "TLP2A?"; } thing 2035 { name = "Flemoid Power Strand"; sprite = "BAR2A?"; radius = 15; } } - + group "Rocks & Cave Stuff" { thing 31 { name = "Grey Rock"; sprite = "COL2A?"; } // ChexSubmergedPlant in Chex 1 @@ -439,7 +439,7 @@ thing_types thing 74 { name = "Bazooik Cave Stalagmite"; sprite = "HDB2A?"; } thing 75 { name = "Bazooik Cave Stalactite"; sprite = "HDB3A?"; hanging = true; solid = false; } } - + group "Plants" { thing 30 { name = "Slimed Pine Tree"; sprite = "COL1A?"; } // ChexCavernStalagmite in Chex 1 @@ -455,7 +455,7 @@ thing_types thing 9060 { name = "Apple Tree"; sprite = "TRE5A?"; radius = 20; } thing 9061 { name = "Orange Tree"; sprite = "TRE6A?"; radius = 20; } } - + group "Captives" { // Group defaults diff --git a/dist/res/config/games/include/things_common.cfg b/dist/res/config/games/include/things_common.cfg index be6215bf0..d73b793f0 100644 --- a/dist/res/config/games/include/things_common.cfg +++ b/dist/res/config/games/include/things_common.cfg @@ -7,7 +7,7 @@ thing_types { // Group defaults colour = { 120, 120, 200 } - + group "Editor Things" { thing 32000 diff --git a/dist/res/config/games/include/things_doom1.cfg b/dist/res/config/games/include/things_doom1.cfg index 52e3577e7..ec93834e9 100644 --- a/dist/res/config/games/include/things_doom1.cfg +++ b/dist/res/config/games/include/things_doom1.cfg @@ -318,7 +318,7 @@ thing_types radius = 14; } } - + group "Gore" { // Group defaults @@ -424,13 +424,13 @@ thing_types angle = false; decoration = true; solid = true; - + group "Tech" { thing 48 { name = "Tech Column"; sprite = "ELECA?"; } thing 2035 { name = "Barrel"; sprite = "BAR1A?"; } } - + group "Hell" { thing 33 { name = "Short Red Pillar"; sprite = "COL4A?"; } @@ -441,7 +441,7 @@ thing_types thing 36 { name = "Pillar + Pumping Heart"; sprite = "COL5A?"; } thing 41 { name = "Evil Eye"; sprite = "CEYEA?"; fullbright = true; } } - + group "Plants" { thing 54 { name = "Large Brown Tree"; sprite = "TRE2A?"; radius = 32; } diff --git a/dist/res/config/games/include/things_doom2.cfg b/dist/res/config/games/include/things_doom2.cfg index f231c422e..85773c524 100644 --- a/dist/res/config/games/include/things_doom2.cfg +++ b/dist/res/config/games/include/things_doom2.cfg @@ -122,7 +122,7 @@ thing_types icon = "powerup"; } } - + group "Gore" { // Group defaults diff --git a/dist/res/config/games/include/things_doom64.cfg b/dist/res/config/games/include/things_doom64.cfg index 9991935ef..5ec84a399 100644 --- a/dist/res/config/games/include/things_doom64.cfg +++ b/dist/res/config/games/include/things_doom64.cfg @@ -17,7 +17,7 @@ thing_types thing 4 { name = "Player 4 Start"; sprite = "PLAYD?"; palette = "PALPLAY3"; player_coop; } thing 11 { name = "Deathmatch Start"; sprite = "PLAYF?"; player_dm; } } - + group "Player Bots" { // Group defaults @@ -354,7 +354,7 @@ thing_types thing 1047 { name = "Hanging Meat"; sprite = "A004A?"; height = 64; } thing 1048 { name = "Hanging Head"; sprite = "A005A?"; height = 60; } thing 1049 { name = "Hanging Ribq"; sprite = "A023A?"; height = 98; } - + thing 1022 { name = "Skull Stick"; @@ -418,7 +418,7 @@ thing_types thing 1034 { name = "Red Fire"; sprite = "RFLMA?"; solid = false; } thing 1035 { name = "Yellow Fire"; sprite = "YFLMA?"; solid = false; } thing 1039 { name = "Yellow Torch"; sprite = "A030A?"; } - + thing 1015 { name = "Hanging Tech Lamp (Long)"; @@ -426,7 +426,7 @@ thing_types height = 54; hanging = true; } - + thing 1016 { name = "Hanging Tech Lamp (Short)"; @@ -434,7 +434,7 @@ thing_types height = 12; hanging = true; } - + thing 1050 { name = "Torch Stick (Long)"; @@ -511,8 +511,8 @@ thing_types { // Group defaults colour = { 120, 120, 200 } - - + + thing 0 { name = "Camera"; sprite = "LASSA?"; } thing 2050 { name = "Projectile Spot"; sprite = "TRCRA?"; } thing 89 { name = "Trigger"; sprite = "APLSA?"; radius = 32; } diff --git a/dist/res/config/games/include/things_heretic.cfg b/dist/res/config/games/include/things_heretic.cfg index 6447749b6..fefa30f5e 100644 --- a/dist/res/config/games/include/things_heretic.cfg +++ b/dist/res/config/games/include/things_heretic.cfg @@ -73,7 +73,7 @@ thing_types radius = 22; height = 62; } - thing 45 + thing 45 { name = "Nitrogolem"; sprite = "MUMMY?"; @@ -112,41 +112,41 @@ thing_types name = "D'Sparil Teleport Location"; sprite = "SOR2I?"; } - thing 9 + thing 9 { name = "Maulotaur"; sprite = "MNTRA?"; radius = 28; height = 100; } - thing 64 + thing 64 { name = "Undead Warrior"; sprite = "KNIGA?"; radius = 24; height = 48; } - thing 65 + thing 65 { name = "Undead Warrior Ghost"; sprite = "KNIGA?"; radius = 24; height = 78; } - thing 70 + thing 70 { name = "Weredragon"; sprite = "BEASA?"; radius = 32; height = 74; } - thing 90 + thing 90 { name = "Sabreclaw"; sprite = "CLNKA?"; radius = 20; height = 64; - } + } thing 92 { name = "Ophidian"; @@ -161,7 +161,7 @@ thing_types // Group defaults angle = false; colour = { 0, 0, 200 } - thing 81 + thing 81 { name = "Crystal Vial"; sprite = "PTN1A?"; @@ -353,7 +353,7 @@ thing_types angle = false; decoration = true; solid = true; - + group "Castle" { thing 94 @@ -430,7 +430,7 @@ thing_types height = 16; } } - + group "Rocks" { // Group defaults @@ -474,7 +474,7 @@ thing_types } } - + group "Sounds" { // Group defaults diff --git a/dist/res/config/games/include/things_hexen.cfg b/dist/res/config/games/include/things_hexen.cfg index 7933015ae..9afe0378b 100644 --- a/dist/res/config/games/include/things_hexen.cfg +++ b/dist/res/config/games/include/things_hexen.cfg @@ -118,7 +118,7 @@ thing_types radius = 32; } thing 10100 - { + { name = "Zedek (fighter)"; sprite = "PLAYE?"; radius = 16; @@ -155,8 +155,8 @@ thing_types // Group defaults angle = false; colour = { 0, 0, 200 } - - thing 81 + + thing 81 { name = "Crystal Vial"; sprite = "PTN1A?"; @@ -205,7 +205,7 @@ thing_types thing 124 { name = "Green Mana"; sprite = "MAN2H?"; } thing 8004 { name = "Combined Mana"; sprite = "MAN3A?"; } } - + group "Powerups" { // Group defaults @@ -282,7 +282,7 @@ thing_types colour = { 64, 64, 255 } sprite = "KEY3A0"; } - + thing 8033 { name = "Fire Key"; @@ -303,7 +303,7 @@ thing_types colour = { 47, 151, 255 } sprite = "KEY6A0"; } - + thing 8036 { name = "Silver Key"; @@ -324,7 +324,7 @@ thing_types colour = { 255, 218, 0 } sprite = "KEY9A0"; } - + thing 8039 { name = "Swamp Key"; @@ -436,7 +436,7 @@ thing_types angle = true; } } - + group "Special Effects" { // Group defaults @@ -448,12 +448,12 @@ thing_types angle = false; icon = "spot"; colour = { 180, 180, 60 } - + thing 3000 = "Polyobject Anchor"; thing 3001 = "Polyobject Start Spot"; thing 3002 = "Polyobject Start Spot (crush)"; } - + group "Map Spots" { icon = "spot"; @@ -702,7 +702,7 @@ thing_types angle = false; decoration = true; solid = true; - + group "Castle" { thing 77 @@ -774,10 +774,10 @@ thing_types solid = false; } } - + group "Dungeon" { - thing 8067 + thing 8067 { name = "Iron Maiden"; sprite = "IRONA?"; @@ -808,7 +808,7 @@ thing_types solid = false; } thing 8077 - { + { name = "Hook With Skull"; sprite = "CHNSG?"; hanging = true; @@ -840,7 +840,7 @@ thing_types solid = false; } } - + group "Graveyard" { thing 63 @@ -849,7 +849,7 @@ thing_types sprite = "TMS1A?"; radius = 10; } - thing 64 + thing 64 { name = "Tombstone (Shane)"; sprite = "TMS2A?"; @@ -861,35 +861,35 @@ thing_types sprite = "TMS3A?"; radius = 10; } - thing 66 + thing 66 { name = "Tombstone (Brian R)"; sprite = "TMS4A?"; radius = 10; } - thing 67 + thing 67 { name = "Tombstone (cross circle)"; sprite = "TMS5A?"; radius = 10; } - thing 68 + thing 68 { name = "Tombstone (small cross)"; sprite = "TMS6A?"; radius = 8; } - thing 69 + thing 69 { name = "Tombstone (Brian P)"; sprite = "TMS7A?"; radius = 8; } } - + group "Statues" { - thing 5 + thing 5 { name= "Winged Statue"; sprite = "STTWA?"; @@ -924,7 +924,7 @@ thing_types name = "Ice Gargoyle (tall)"; sprite = "STT3A?"; radius = 14; - } + } thing 8050 { name = "Lava Gargoyle (short)"; @@ -980,37 +980,37 @@ thing_types // Group defaults colour = { 80, 160, 80 } - thing 80 + thing 80 { name = "Gnarled Tree 1"; sprite = "TRE6A?"; radius = 22; } - thing 87 + thing 87 { name = "Gnarled Tree 2"; sprite = "TRE7A?"; radius = 22; } - thing 78 + thing 78 { name = "Tall Tree 1"; sprite = "TRE5A?"; radius = 15; } - thing 79 + thing 79 { name = "Tall Tree 2"; sprite = "TRE4A?"; radius = 15; } - thing 8068 + thing 8068 { name = "Evergreen Tree"; sprite = "XMASA?"; radius = 11; } - thing 8062 + thing 8062 { name = "Rotten Dead Tree (destructible)"; sprite = "TRDTA?"; @@ -1176,7 +1176,7 @@ thing_types sprite = "SLC2A?"; radius = 6; } - thing 52 + thing 52 { name = "Stalactite (large)"; sprite = "SLC1A?"; @@ -1188,13 +1188,13 @@ thing_types sprite = "SGMPA?"; radius = 8; } - thing 51 + thing 51 { name = "Stalagmite (small)"; sprite = "SGM3A?"; radius = 8; } - thing 50 + thing 50 { name = "Stalagmite (medium)"; sprite = "SGM2A?"; @@ -1206,7 +1206,7 @@ thing_types sprite = "SGM1A?"; radius = 8; } - thing 96 + thing 96 { name = "Ice Spike (tiny)"; sprite = "ICM4A?"; @@ -1242,13 +1242,13 @@ thing_types sprite = "ICT3A?"; radius = 4; } - thing 90 + thing 90 { name = "Icicle (medium)"; sprite = "ICT2A?"; radius = 5; } - thing 89 + thing 89 { name = "Icicle (large)"; sprite = "ICT1A?"; @@ -1291,7 +1291,7 @@ thing_types } } } - + group "Sounds" { // Group defaults diff --git a/dist/res/config/games/include/things_strife.cfg b/dist/res/config/games/include/things_strife.cfg index 7e93424e6..2f73dc954 100644 --- a/dist/res/config/games/include/things_strife.cfg +++ b/dist/res/config/games/include/things_strife.cfg @@ -25,7 +25,7 @@ thing_types { // Group defaults colour = { 255, 255, 0 } - + thing 14 { name = "Teleport Destination"; sprite = "TFOGA?"; } thing 23 { name = "Teleport Swirl"; sprite = "TELPA?"; } thing 118 { name = "Teleport New Map Spot 1"; sprite = "TFOGB?"; } @@ -212,7 +212,7 @@ thing_types { // Group defaults angle = false; - colour = { 150, 150, 150 } + colour = { 150, 150, 150 } thing 13 { name = "ID Card"; colour = { 200, 0, 0 } sprite = "CRD2A?"; } thing 38 { name = "Silver Key"; sprite = "KY2SA?"; } @@ -353,7 +353,7 @@ thing_types thing 55 { name = "Damaged Aztec Pillar"; sprite = "STLAA?"; height = 80; } thing 56 { name = "Ruined Aztec Pillar"; sprite = "STLEA?"; height = 40; } } - + group "Base & Town" { thing 44 { name = "Ruined Statue"; sprite = "DSTAA?"; radius = 20; height = 56; } @@ -382,7 +382,7 @@ thing_types thing 228 { name = "Ammo Filler"; sprite = "AFEDA?"; radius = 12; height = 24; } thing 2014 { name = "Water Bottle"; sprite = "WATRA?"; radius = 20; solid = false; } } - + group "Alien" { thing 221 { name = "Alien Bubble Column"; sprite = "BUBBA?"; height = 128; } @@ -391,7 +391,7 @@ thing_types thing 224 { name = "Alien Asp Climber"; sprite = "ASPRA?"; height = 128; } thing 227 { name = "Huge Alien Pillar"; sprite = "APOWA?"; radius = 24; height = 192; } } - + group "Water" { // Group defaults @@ -420,7 +420,7 @@ thing_types { // Group defaults colour = { 80, 160, 80 } - + thing 29 { name = "Rubble 1"; sprite = "RUB1A?"; } thing 30 { name = "Rubble 2"; sprite = "RUB2A?"; } thing 31 { name = "Rubble 3"; sprite = "RUB3A?"; } diff --git a/dist/res/config/games/srb2.cfg b/dist/res/config/games/srb2.cfg index 7ba400c79..18ca0c894 100644 --- a/dist/res/config/games/srb2.cfg +++ b/dist/res/config/games/srb2.cfg @@ -5,16 +5,16 @@ game srb2 { name = "Sonic Robo Blast 2"; - + // IWAD filename iwad = "srb2.pk3"; - + // Supported map formats map_formats = doom, udmf; // Enable mixed textures and flats mix_tex_flats = true; - + // Enable TX_ namespace tx_textures = true; @@ -23,7 +23,7 @@ game srb2 // Sky flat for 3d mode sky_flat = "F_SKY1"; - + // Light levels light_level_interval = 16; @@ -123,14 +123,14 @@ game srb2 heightceiling = 512; lightlevel = 230; } - + block sidedef { texturetop = "GFZROCK"; texturemiddle = "GFZROCK"; texturebottom = "GFZROCK"; } - + block thing { type = 1; diff --git a/dist/res/config/games/strife.cfg b/dist/res/config/games/strife.cfg index d4c4a95b1..a03379652 100644 --- a/dist/res/config/games/strife.cfg +++ b/dist/res/config/games/strife.cfg @@ -4,19 +4,19 @@ game strife { name = "Strife"; - + // IWAD filename iwad = "strife1.wad"; - + // Supported map formats map_formats = doom; - + // DECORATE filters filters = "strife", "any"; // Sky flat for 3d mode sky_flat = "F_SKY001"; - + // Light levels light_level_interval = 16; @@ -72,14 +72,14 @@ game strife heightceiling = 128; lightlevel = 160; } - + block sidedef { texturetop = "PLASTR01"; texturemiddle = "PLASTR01"; texturebottom = "PLASTR01"; } - + block thing { type = 1; diff --git a/dist/res/config/games/urbanbrawl.cfg b/dist/res/config/games/urbanbrawl.cfg index c80eb5171..d3bbfa335 100644 --- a/dist/res/config/games/urbanbrawl.cfg +++ b/dist/res/config/games/urbanbrawl.cfg @@ -5,28 +5,28 @@ game urbanbrawl { name = "Urban Brawl"; - + // IWAD filename iwad = "action2.wad"; - + // Supported map formats map_formats = hexen, udmf; - + // DECORATE filters filters = "any"; // Enable mixed textures and flats mix_tex_flats = true; - + // Enable TX_ namespace tx_textures = true; - + // Scripting script_language = "acs_zdoom"; // Sky flat for 3d mode sky_flat = "F_SKY1"; - + // Light levels light_level_interval = 8; @@ -66,14 +66,14 @@ game urbanbrawl heightceiling = 128; lightlevel = 160; } - + block sidedef { texturetop = "CEMENT2"; texturemiddle = "CEMENT2"; texturebottom = "CEMENT2"; } - + block thing { type = 1; diff --git a/dist/res/config/iwads.cfg b/dist/res/config/iwads.cfg index 6a77792e4..b4c41c247 100644 --- a/dist/res/config/iwads.cfg +++ b/dist/res/config/iwads.cfg @@ -38,37 +38,37 @@ gog id = "\\Games\\1435827232"; path = "/DOOM.WAD"; } - + udoombfg { id = "\\Games\\1135892318"; path = "/base/wads/doom.wad"; } - + doom2 { id = "\\Games\\1435848814"; path = "/doom2/DOOM2.WAD"; } - + doom2bfg { id = "\\Games\\1135892318"; path = "/base/wads/doom2.wad"; } - + finaltnt { id = "\\Games\\1435848742"; path = "/TNT/TNT.WAD"; } - + finalplutonia { id = "\\Games\\1435848742"; path = "/Plutonia/PLUTONIA.WAD"; } - + strife { id = "\\Games\\1432899949"; diff --git a/dist/res/config/languages/acs.txt b/dist/res/config/languages/acs.txt index ed721484e..728c0a826 100644 --- a/dist/res/config/languages/acs.txt +++ b/dist/res/config/languages/acs.txt @@ -10,7 +10,7 @@ acs : cstyle keywords = { - open, restart, script, special, str, suspend, terminate, world, + open, restart, script, special, str, suspend, terminate, world, } constants = @@ -167,221 +167,221 @@ acs_z : acs function, enter, respawn, death, lightning, unloading, disconnect, kill, fixed, global, net, import, libdefine, library, nocompact, nowadauthor, EncryptStrings, static, wadauthor, region, endregion, reopen, - + // Skulltag script types BlueReturn, RedReturn, WhiteReturn, Pickup, ClientSide } constants = { - TRUE, FALSE, ON, OFF, YES, NO, + TRUE, FALSE, ON, OFF, YES, NO, - LINE_FRONT, LINE_BACK, SIDE_FRONT, SIDE_BACK, - TEXTURE_TOP, TEXTURE_MIDDLE, TEXTURE_BOTTOM, + LINE_FRONT, LINE_BACK, SIDE_FRONT, SIDE_BACK, + TEXTURE_TOP, TEXTURE_MIDDLE, TEXTURE_BOTTOM, - TEXFLAG_TOP, TEXFLAG_MIDDLE, TEXFLAG_BOTTOM, TEXFLAG_ADDOFFSET, + TEXFLAG_TOP, TEXFLAG_MIDDLE, TEXFLAG_BOTTOM, TEXFLAG_ADDOFFSET, - GAME_SINGLE_PLAYER, GAME_NET_COOPERATIVE, GAME_NET_DEATHMATCH, GAME_TITLE_MAP, + GAME_SINGLE_PLAYER, GAME_NET_COOPERATIVE, GAME_NET_DEATHMATCH, GAME_TITLE_MAP, - CLASS_FIGHTER, CLASS_CLERIC, CLASS_MAGE, + CLASS_FIGHTER, CLASS_CLERIC, CLASS_MAGE, - SKILL_VERY_EASY, SKILL_EASY, SKILL_NORMAL, SKILL_HARD, SKILL_VERY_HARD, + SKILL_VERY_EASY, SKILL_EASY, SKILL_NORMAL, SKILL_HARD, SKILL_VERY_HARD, - BLOCK_NOTHING, BLOCK_CREATURES, BLOCK_EVERYTHING, BLOCK_RAILING, BLOCK_PLAYERS, + BLOCK_NOTHING, BLOCK_CREATURES, BLOCK_EVERYTHING, BLOCK_RAILING, BLOCK_PLAYERS, - SCROLL, CARRY, SCROLL_AND_CARRY, + SCROLL, CARRY, SCROLL_AND_CARRY, - MOD_UNKNOWN, MOD_ROCKET, MOD_R_SPLASH, MOD_PLASMARIFLE, MOD_BFG_BOOM, - MOD_BFG_SPLASH, MOD_CHAINSAW, MOD_SSHOTGUN, MOD_WATER, MOD_SLIME, MOD_LAVA, - MOD_CRUSH, MOD_TELEFRAG, MOD_FALLING, MOD_SUICIDE, MOD_BARREL, MOD_EXIT, - MOD_SPLASH, MOD_HIT, MOD_RAILGUN, MOD_ICE, MOD_DISINTEGRATE, MOD_POISON, - MOD_ELECTRIC, + MOD_UNKNOWN, MOD_ROCKET, MOD_R_SPLASH, MOD_PLASMARIFLE, MOD_BFG_BOOM, + MOD_BFG_SPLASH, MOD_CHAINSAW, MOD_SSHOTGUN, MOD_WATER, MOD_SLIME, MOD_LAVA, + MOD_CRUSH, MOD_TELEFRAG, MOD_FALLING, MOD_SUICIDE, MOD_BARREL, MOD_EXIT, + MOD_SPLASH, MOD_HIT, MOD_RAILGUN, MOD_ICE, MOD_DISINTEGRATE, MOD_POISON, + MOD_ELECTRIC, - MOVIE_Played, MOVIE_Played_NoVideo, MOVIE_Played_Aborted, MOVIE_Failed, + MOVIE_Played, MOVIE_Played_NoVideo, MOVIE_Played_Aborted, MOVIE_Failed, - PROP_FROZEN, PROP_NOTARGET, PROP_INSTANTWEAPONSWITCH, PROP_FLY, - PROP_TOTALLYFROZEN, PROP_BUDDHA, + PROP_FROZEN, PROP_NOTARGET, PROP_INSTANTWEAPONSWITCH, PROP_FLY, + PROP_TOTALLYFROZEN, PROP_BUDDHA, - PROP_INVULNERABILITY, PROP_STRENGTH, PROP_INVISIBILITY, PROP_RADIATIONSUIT, - PROP_ALLMAP, PROP_INFRARED, PROP_WEAPONLEVEL2, PROP_FLIGHT, PROP_SPEED, + PROP_INVULNERABILITY, PROP_STRENGTH, PROP_INVISIBILITY, PROP_RADIATIONSUIT, + PROP_ALLMAP, PROP_INFRARED, PROP_WEAPONLEVEL2, PROP_FLIGHT, PROP_SPEED, PROP_BUDDHA2, PROP_FRIGHTENING, PROP_NOCLIP, PROP_NOCLIP2, PROP_GODMODE, PROP_GODMODE2, - INPUT_OLDBUTTONS, INPUT_BUTTONS, INPUT_PITCH, INPUT_YAW, INPUT_ROLL, - INPUT_FORWARDMOVE, INPUT_SIDEMOVE, INPUT_UPMOVE, + INPUT_OLDBUTTONS, INPUT_BUTTONS, INPUT_PITCH, INPUT_YAW, INPUT_ROLL, + INPUT_FORWARDMOVE, INPUT_SIDEMOVE, INPUT_UPMOVE, - MODINPUT_OLDBUTTONS, MODINPUT_BUTTONS, MODINPUT_PITCH, MODINPUT_YAW, - MODINPUT_ROLL, MODINPUT_FORWARDMOVE, MODINPUT_SIDEMOVE, MODINPUT_UPMOVE, + MODINPUT_OLDBUTTONS, MODINPUT_BUTTONS, MODINPUT_PITCH, MODINPUT_YAW, + MODINPUT_ROLL, MODINPUT_FORWARDMOVE, MODINPUT_SIDEMOVE, MODINPUT_UPMOVE, - BT_ATTACK, BT_USE, BT_JUMP, BT_CROUCH, BT_TURN180, BT_ALTATTACK, BT_RELOAD, - BT_ZOOM, BT_SPEED, BT_STRAFE, BT_MOVERIGHT, BT_MOVELEFT, BT_BACK, BT_FORWARD, - BT_RIGHT, BT_LEFT, BT_LOOKUP, BT_LOOKDOWN, BT_MOVEUP, BT_MOVEDOWN, + BT_ATTACK, BT_USE, BT_JUMP, BT_CROUCH, BT_TURN180, BT_ALTATTACK, BT_RELOAD, + BT_ZOOM, BT_SPEED, BT_STRAFE, BT_MOVERIGHT, BT_MOVELEFT, BT_BACK, BT_FORWARD, + BT_RIGHT, BT_LEFT, BT_LOOKUP, BT_LOOKDOWN, BT_MOVEUP, BT_MOVEDOWN, BT_SHOWSCORES, BT_USER1, BT_USER2, BT_USER3, BT_USER4, BT_RUN, - CR_UNTRANSLATED, CR_BRICK, CR_TAN, CR_GRAY, CR_GREY, CR_GREEN, CR_BROWN, - CR_GOLD, CR_RED, CR_BLUE, CR_ORANGE, CR_WHITE, CR_YELLOW, CR_BLACK, - CR_LIGHTBLUE, CR_CREAM, CR_OLIVE, CR_DARKGREEN, CR_DARKRED, CR_DARKBROWN, + CR_UNTRANSLATED, CR_BRICK, CR_TAN, CR_GRAY, CR_GREY, CR_GREEN, CR_BROWN, + CR_GOLD, CR_RED, CR_BLUE, CR_ORANGE, CR_WHITE, CR_YELLOW, CR_BLACK, + CR_LIGHTBLUE, CR_CREAM, CR_OLIVE, CR_DARKGREEN, CR_DARKRED, CR_DARKBROWN, CR_PURPLE, CR_DARKGRAY, CR_DARKGREY, CR_CYAN, CR_ICE, CR_FIRE, CR_SAPPHIRE, CR_TEAL, - HUDMSG_PLAIN, HUDMSG_FADEOUT, HUDMSG_TYPEON, HUDMSG_FADEINOUT, HUDMSG_LOG, + HUDMSG_PLAIN, HUDMSG_FADEOUT, HUDMSG_TYPEON, HUDMSG_FADEINOUT, HUDMSG_LOG, HUDMSG_COLORSTRING, HUDMSG_ADDBLEND, HUDMSG_LAYER_OVERHUD, HUDMSG_ALPHA, HUDMSG_LAYER_OVERMAP, HUDMSG_LAYER_UNDERHUD, HUDMSG_NOTWITH3DVIEW, HUDMSG_NOTWITHFULLMAP, HUDMSG_NOTWITHOVERLAYMAP, HUDMSG_NOWRAP, - MARINEWEAPON_Dummy, MARINEWEAPON_Fist, MARINEWEAPON_BerserkFist, - MARINEWEAPON_Chainsaw, MARINEWEAPON_Pistol, MARINEWEAPON_Shotgun, - MARINEWEAPON_SuperShotgun, MARINEWEAPON_Chaingun, MARINEWEAPON_RocketLauncher, - MARINEWEAPON_PlasmaRifle, MARINEWEAPON_Railgun, MARINEWEAPON_BFG, + MARINEWEAPON_Dummy, MARINEWEAPON_Fist, MARINEWEAPON_BerserkFist, + MARINEWEAPON_Chainsaw, MARINEWEAPON_Pistol, MARINEWEAPON_Shotgun, + MARINEWEAPON_SuperShotgun, MARINEWEAPON_Chaingun, MARINEWEAPON_RocketLauncher, + MARINEWEAPON_PlasmaRifle, MARINEWEAPON_Railgun, MARINEWEAPON_BFG, // ACS actor properties for Get/Check/SetActorProperty functions - APROP_Health, APROP_Speed, APROP_Damage, APROP_Alpha, APROP_RenderStyle, - APROP_SeeSound, APROP_AttackSound, APROP_PainSound, APROP_DeathSound, - APROP_ActiveSound, APROP_Ambush, APROP_Invulnerable, APROP_JumpZ, - APROP_ChaseGoal, APROP_Frightened, APROP_Gravity, APROP_Friendly, - APROP_SpawnHealth, APROP_Dropped, APROP_Notarget, APROP_Species, APROP_Nametag, - APROP_Score, APROP_Notrigger, APROP_DamageFactor, APROP_MasterTID, - APROP_TargetTID, APROP_TracerTID, APROP_Waterlevel, APROP_ScaleX, APROP_ScaleY, + APROP_Health, APROP_Speed, APROP_Damage, APROP_Alpha, APROP_RenderStyle, + APROP_SeeSound, APROP_AttackSound, APROP_PainSound, APROP_DeathSound, + APROP_ActiveSound, APROP_Ambush, APROP_Invulnerable, APROP_JumpZ, + APROP_ChaseGoal, APROP_Frightened, APROP_Gravity, APROP_Friendly, + APROP_SpawnHealth, APROP_Dropped, APROP_Notarget, APROP_Species, APROP_Nametag, + APROP_Score, APROP_Notrigger, APROP_DamageFactor, APROP_MasterTID, + APROP_TargetTID, APROP_TracerTID, APROP_Waterlevel, APROP_ScaleX, APROP_ScaleY, APROP_Dormant, APROP_Mass, APROP_Accuracy, APROP_Stamina, APROP_Height, APROP_Radius, APROP_ReactionTime, APROP_AttackZOffset, APROP_MeleeRange, APROP_ViewHeight, APROP_StencilColor, APROP_DamageMultiplier, APROP_Friction, APROP_MaxStepHeight, APROP_MaxDropOffHeight, APROP_DamageType, APROP_SoundClass, APROP_FriendlySeeBlocks, APROP_WaterDepth, - STYLE_None, STYLE_Normal, STYLE_Fuzzy, STYLE_SoulTrans, STYLE_Stencil, - STYLE_OptFuzzy, STYLE_Translucent, STYLE_Add, STYLE_Shaded, + STYLE_None, STYLE_Normal, STYLE_Fuzzy, STYLE_SoulTrans, STYLE_Stencil, + STYLE_OptFuzzy, STYLE_Translucent, STYLE_Add, STYLE_Shaded, STYLE_TranslucentStencil, STYLE_Shadow, STYLE_Subtract, STYLE_AddStencil, STYLE_AddShaded, - LEVELINFO_PAR_TIME, LEVELINFO_CLUSTERNUM, LEVELINFO_LEVELNUM, - LEVELINFO_TOTAL_SECRETS, LEVELINFO_FOUND_SECRETS, LEVELINFO_TOTAL_ITEMS, - LEVELINFO_FOUND_ITEMS, LEVELINFO_TOTAL_MONSTERS, LEVELINFO_KILLED_MONSTERS, - LEVELINFO_SUCK_TIME, + LEVELINFO_PAR_TIME, LEVELINFO_CLUSTERNUM, LEVELINFO_LEVELNUM, + LEVELINFO_TOTAL_SECRETS, LEVELINFO_FOUND_SECRETS, LEVELINFO_TOTAL_ITEMS, + LEVELINFO_FOUND_ITEMS, LEVELINFO_TOTAL_MONSTERS, LEVELINFO_KILLED_MONSTERS, + LEVELINFO_SUCK_TIME, - PLAYERINFO_TEAM, PLAYERINFO_AIMDIST, PLAYERINFO_COLOR, PLAYERINFO_GENDER, - PLAYERINFO_NEVERSWITCH, PLAYERINFO_MOVEBOB, PLAYERINFO_STILLBOB, + PLAYERINFO_TEAM, PLAYERINFO_AIMDIST, PLAYERINFO_COLOR, PLAYERINFO_GENDER, + PLAYERINFO_NEVERSWITCH, PLAYERINFO_MOVEBOB, PLAYERINFO_STILLBOB, PLAYERINFO_PLAYERCLASS, PLAYERINFO_FOV, PLAYERINFO_DESIREDFOV, PLAYERINFO_FVIEWBOB, - NOT_BOTTOM, NOT_MIDDLE, NOT_TOP, NOT_FLOOR, NOT_CEILING, + NOT_BOTTOM, NOT_MIDDLE, NOT_TOP, NOT_FLOOR, NOT_CEILING, - DAMAGE_PLAYERS, DAMAGE_NONPLAYERS, DAMAGE_IN_AIR, DAMAGE_SUBCLASSES_PROTECT, + DAMAGE_PLAYERS, DAMAGE_NONPLAYERS, DAMAGE_IN_AIR, DAMAGE_SUBCLASSES_PROTECT, DAMAGE_NO_ARMOR, - MRF_OLDEFFECTS, MRF_ADDSTAMINA, MRF_FULLHEALTH, MRF_UNDOBYTOMEOFPOWER, - MRF_UNDOBYCHAOSDEVICE, MRF_FAILNOTELEFRAG, MRF_FAILNOLAUGH, - MRF_WHENINVULNERABLE, MRF_LOSEACTUALWEAPON, MRF_NEWTIDBEHAVIOUR, + MRF_OLDEFFECTS, MRF_ADDSTAMINA, MRF_FULLHEALTH, MRF_UNDOBYTOMEOFPOWER, + MRF_UNDOBYCHAOSDEVICE, MRF_FAILNOTELEFRAG, MRF_FAILNOLAUGH, + MRF_WHENINVULNERABLE, MRF_LOSEACTUALWEAPON, MRF_NEWTIDBEHAVIOUR, MRF_UNDOBYDEATH, MRF_UNDOBYDEATHFORCED, MRF_UNDOBYDEATHSAVES, MRF_UNDOALWAYS, MRF_TRANSFERTRANSLATION, - T_ROCK1, T_ROCK2, T_ROCK3, T_DIRT1, T_DIRT2, T_DIRT3, T_DIRT4, T_DIRT5, T_DIRT6, - T_STAINEDGLASS1, T_STAINEDGLASS2, T_STAINEDGLASS3, T_STAINEDGLASS4, - T_STAINEDGLASS5, T_STAINEDGLASS6, T_STAINEDGLASS7, T_STAINEDGLASS8, - T_STAINEDGLASS9, T_STAINEDGLASS0, - - T_NONE, T_SHOTGUY, T_CHAINGUY, T_BARON, T_ZOMBIE, T_IMP, T_ARACHNOTRON, - T_SPIDERMASTERMIND, T_DEMON, T_SPECTRE, T_IMPFIREBALL, T_CLIP, T_SHELLS, - T_CACODEMON, T_REVENANT, T_BRIDGE, T_ARMORBONUS, T_STIMPACK, T_MEDKIT, - T_SOULSPHERE, T_SHOTGUN, T_CHAINGUN, T_ROCKETLAUNCHER, T_PLASMAGUN, T_BFG, - T_CHAINSAW, T_SUPERSHOTGUN, T_PLASMABOLT, T_TRACER, T_GREENARMOR, T_BLUEARMOR, - T_CELL, T_BLUEKEYCARD, T_REDKEYCARD, T_YELLOWKEYCARD, T_YELLOWSKULLKEY, - T_REDSKULLKEY, T_BLUESKULLKEY, T_TEMPLARGEFLAME, T_STEALTHBARON, - T_STEALTHKNIGHT, T_STEALTHZOMBIE, T_STEALTHSHOTGUY, T_LOSTSOUL, T_VILE, - T_MANCUBUS, T_HELLKNIGHT, T_CYBERDEMON, T_PAINELEMENTAL, T_WOLFSS, - T_STEALTHARACHNOTRON, T_STEALTHVILE, T_STEALTHCACODEMON, T_STEALTHCHAINGUY, + T_ROCK1, T_ROCK2, T_ROCK3, T_DIRT1, T_DIRT2, T_DIRT3, T_DIRT4, T_DIRT5, T_DIRT6, + T_STAINEDGLASS1, T_STAINEDGLASS2, T_STAINEDGLASS3, T_STAINEDGLASS4, + T_STAINEDGLASS5, T_STAINEDGLASS6, T_STAINEDGLASS7, T_STAINEDGLASS8, + T_STAINEDGLASS9, T_STAINEDGLASS0, + + T_NONE, T_SHOTGUY, T_CHAINGUY, T_BARON, T_ZOMBIE, T_IMP, T_ARACHNOTRON, + T_SPIDERMASTERMIND, T_DEMON, T_SPECTRE, T_IMPFIREBALL, T_CLIP, T_SHELLS, + T_CACODEMON, T_REVENANT, T_BRIDGE, T_ARMORBONUS, T_STIMPACK, T_MEDKIT, + T_SOULSPHERE, T_SHOTGUN, T_CHAINGUN, T_ROCKETLAUNCHER, T_PLASMAGUN, T_BFG, + T_CHAINSAW, T_SUPERSHOTGUN, T_PLASMABOLT, T_TRACER, T_GREENARMOR, T_BLUEARMOR, + T_CELL, T_BLUEKEYCARD, T_REDKEYCARD, T_YELLOWKEYCARD, T_YELLOWSKULLKEY, + T_REDSKULLKEY, T_BLUESKULLKEY, T_TEMPLARGEFLAME, T_STEALTHBARON, + T_STEALTHKNIGHT, T_STEALTHZOMBIE, T_STEALTHSHOTGUY, T_LOSTSOUL, T_VILE, + T_MANCUBUS, T_HELLKNIGHT, T_CYBERDEMON, T_PAINELEMENTAL, T_WOLFSS, + T_STEALTHARACHNOTRON, T_STEALTHVILE, T_STEALTHCACODEMON, T_STEALTHCHAINGUY, T_STEALTHSERGEANT, T_STEALTHIMP, T_STEALTHMANCUBUS, T_STEALTHREVENANT, T_BARREL, - T_CACODEMONSHOT, T_ROCKET, T_BFGSHOT, T_ARACHNOTRONPLASMA, T_BLOOD, T_PUFF, - T_MEGASPHERE, T_INVULNERABILITY, T_BERSERK, T_INVISIBILITY, T_IRONFEET, - T_COMPUTERMAP, T_LIGHTAMP, T_AMMOBOX, T_ROCKETAMMO, T_ROCKETBOX, T_BATTERY, - T_SHELLBOX, T_BACKPACK, T_GUTS, T_BLOODPOOL, T_BLOODPOOL1, T_BLOODPOOL2, - T_FLAMINGBARREL, T_BRAINS, T_SCRIPTEDMARINE, T_HEALTHBONUS, T_MANCUBUSSHOT, - T_BARONBALL, - - T_CLINK, T_MUMMYLEADER, T_BEAST, T_MUMMY, T_KNIGHT, T_IMPLEADER, T_MUMMYGHOST, - T_MUMMYLEADERGHOST, T_WIMPYWANDAMMO, T_HEFTYWANDAMMO, T_ITEMEGG, T_ITEMFLIGHT, - T_ITEMTELEPORT, T_WIZARD, T_IRONLICH, T_ITEMHEALTHPOTION, T_ITEMHEALTHFLASH, - T_ITEMHEALTHFLASK, T_ITEMHEALTHFULL, T_CROSSBOW, T_BLASTER, T_PHOENIXROD, - T_SKULLROD, T_MACE, T_GAUNTLETS, T_WIMPYCROSSBOWAMMO, T_HEFTYCROSSBOWAMMO, - T_WIMPYMACEAMMO, T_HEFTYMACEAMMO, T_WIMPYBLASTERAMMO, T_HEFTYBLASTERAMMO, - T_MORPHBLAST, T_SHIELD1, T_SHIELD2, T_ITEMTIMEBOMB, T_ITEMTORCH, T_BLUEKEY, - T_GREENKEY, T_YELLOWKEY, T_SOUND_WIND, T_SOUND_WATERFALL, T_BEASTBALL, - T_FEATHER, T_CHICKEN, T_VOLCANOBALL, T_TINYVOLCANOBALL, T_POD, T_PODGENERATOR, - T_KNIGHTAXE, T_KNIGHTBLOODAXE, T_KNIGHTGHOST, T_MUMMYHEAD, T_SNAKE, - T_ITEMINVULNERABILITY, T_ITEMTOME, T_ITEMINVISIBILITY, T_ITEMBAGOFHOLDING, - T_ITEMALLMAP, T_SNAKEPROJECTILE, T_SNAKEPROJECTILEBIG, T_WIZARDSHOT, - T_DSPARILTELEPORTDEST, T_DSPARILONSERPENT, T_DSPARILALONE, T_SERPENTFIREBALL, - T_DSPARILBLUESHOT, T_DSPARILWIZARDSPAWNER, T_CROSSBOWMAINBLAST, - T_CROSSBOWMINIBLAST, T_CROSSBOWPOWERBLAST, T_VOLCANO, T_POWERWANDMINIBLAST, - T_POWERWANDBIGGERBLAST, T_DEATHBALL, T_NOGRAVITYMACEBALL, T_BOUNCYMACEBALL, - T_HEAVYMACEBALL, T_RIPPER, T_WIMPYSKULLRODAMMO, T_HEFTYSKULLRODAMMO, - T_SKULLRODBLAST, T_WIMPYPHOENIXRODAMMO, T_HEFTYPHOENIXRODAMMO, T_PHOENIXSHOT, - T_IRONLICHBLUESHOT, T_WHIRLWIND, T_REDTELEGLITTER, T_BLUETELEGLITTER, - - T_CENTAUR, T_CENTAURLEADER, T_DEMON1, T_ETTIN, T_FIREGARGOYLE, T_WATERLURKER, - T_WATERLURKERLEADER, T_WRAITH, T_WRAITHBURIED, T_FIREBALL1, T_MANA1, T_MANA2, - T_ITEMBOOTS, T_ITEMPORK, T_ITEMSUMMON, T_ITEMTPORTOTHER, T_BISHOP, T_ICEGOLEM, - T_DRAGONSKINBRACERS, T_ITEMBOOSTMANA, T_FIGHTERAXE, T_FIGHTERHAMMER, - T_FIGHTERSWORD1, T_FIGHTERSWORD2, T_FIGHTERSWORD3, T_CLERICSTAFF, T_CLERICHOLY1, - T_CLERICHOLY2, T_CLERICHOLY3, T_MAGESHARDS, T_MAGESTAFF1, T_MAGESTAFF2, - T_MAGESTAFF3, T_ARROW, T_DART, T_POISONDART, T_RIPPERBALL, T_BLADE, T_ICESHARD, - T_FLAME_SMALL, T_FLAME_LARGE, T_MESHARMOR, T_FALCONSHIELD, T_PLATINUMHELM, - T_AMULETOFWARDING, T_ITEMFLECHETTE, T_ITEMREPULSION, T_MANA3, T_PUZZSKULL, - T_PUZZGEMBIG, T_PUZZGEMRED, T_PUZZGEMGREEN1, T_PUZZGEMGREEN2, T_PUZZGEMBLUE1, - T_PUZZGEMBLUE2, T_PUZZBOOK1, T_PUZZBOOK2, T_METALKEY, T_SMALLMETALKEY, T_AXEKEY, - T_FIREKEY, T_EMERALDKEY, T_MACEKEY, T_SILVERKEY, T_RUSTYKEY, T_HORNKEY, - T_SERPENTKEY, T_WATERDRIP, T_TEMPSMALLFLAME, T_PERMSMALLFLAME, T_PERMLARGEFLAME, - T_DEMON_MASH, T_DEMON2_MASH, T_ETTIN_MASH, T_CENTAUR_MASH, T_THRUSTSPIKEUP, - T_THRUSTSPIKEDOWN, T_FLESH_DRIP1, T_FLESH_DRIP2, T_SPARK_DRIP, - - ACTOR_NONE, ACTOR_WORLD, ACTOR_PLAYER, ACTOR_BOT, ACTOR_VOODOODOLL, - ACTOR_MONSTER, ACTOR_ALIVE, ACTOR_DEAD, ACTOR_MISSILE, ACTOR_GENERIC, - - SECSEQ_FLOOR, SECSEQ_CEILING, SECSEQ_FULLHEIGHT, SECSEQ_INTERIOR, - - AAPTR_DEFAULT, AAPTR_NULL, AAPTR_TARGET, AAPTR_MASTER, AAPTR_TRACER, - AAPTR_PLAYER_GETTARGET, AAPTR_PLAYER_GETCONVERSATION, AAPTR_PLAYER1, - AAPTR_PLAYER2, AAPTR_PLAYER3, AAPTR_PLAYER4, AAPTR_PLAYER5, AAPTR_PLAYER6, + T_CACODEMONSHOT, T_ROCKET, T_BFGSHOT, T_ARACHNOTRONPLASMA, T_BLOOD, T_PUFF, + T_MEGASPHERE, T_INVULNERABILITY, T_BERSERK, T_INVISIBILITY, T_IRONFEET, + T_COMPUTERMAP, T_LIGHTAMP, T_AMMOBOX, T_ROCKETAMMO, T_ROCKETBOX, T_BATTERY, + T_SHELLBOX, T_BACKPACK, T_GUTS, T_BLOODPOOL, T_BLOODPOOL1, T_BLOODPOOL2, + T_FLAMINGBARREL, T_BRAINS, T_SCRIPTEDMARINE, T_HEALTHBONUS, T_MANCUBUSSHOT, + T_BARONBALL, + + T_CLINK, T_MUMMYLEADER, T_BEAST, T_MUMMY, T_KNIGHT, T_IMPLEADER, T_MUMMYGHOST, + T_MUMMYLEADERGHOST, T_WIMPYWANDAMMO, T_HEFTYWANDAMMO, T_ITEMEGG, T_ITEMFLIGHT, + T_ITEMTELEPORT, T_WIZARD, T_IRONLICH, T_ITEMHEALTHPOTION, T_ITEMHEALTHFLASH, + T_ITEMHEALTHFLASK, T_ITEMHEALTHFULL, T_CROSSBOW, T_BLASTER, T_PHOENIXROD, + T_SKULLROD, T_MACE, T_GAUNTLETS, T_WIMPYCROSSBOWAMMO, T_HEFTYCROSSBOWAMMO, + T_WIMPYMACEAMMO, T_HEFTYMACEAMMO, T_WIMPYBLASTERAMMO, T_HEFTYBLASTERAMMO, + T_MORPHBLAST, T_SHIELD1, T_SHIELD2, T_ITEMTIMEBOMB, T_ITEMTORCH, T_BLUEKEY, + T_GREENKEY, T_YELLOWKEY, T_SOUND_WIND, T_SOUND_WATERFALL, T_BEASTBALL, + T_FEATHER, T_CHICKEN, T_VOLCANOBALL, T_TINYVOLCANOBALL, T_POD, T_PODGENERATOR, + T_KNIGHTAXE, T_KNIGHTBLOODAXE, T_KNIGHTGHOST, T_MUMMYHEAD, T_SNAKE, + T_ITEMINVULNERABILITY, T_ITEMTOME, T_ITEMINVISIBILITY, T_ITEMBAGOFHOLDING, + T_ITEMALLMAP, T_SNAKEPROJECTILE, T_SNAKEPROJECTILEBIG, T_WIZARDSHOT, + T_DSPARILTELEPORTDEST, T_DSPARILONSERPENT, T_DSPARILALONE, T_SERPENTFIREBALL, + T_DSPARILBLUESHOT, T_DSPARILWIZARDSPAWNER, T_CROSSBOWMAINBLAST, + T_CROSSBOWMINIBLAST, T_CROSSBOWPOWERBLAST, T_VOLCANO, T_POWERWANDMINIBLAST, + T_POWERWANDBIGGERBLAST, T_DEATHBALL, T_NOGRAVITYMACEBALL, T_BOUNCYMACEBALL, + T_HEAVYMACEBALL, T_RIPPER, T_WIMPYSKULLRODAMMO, T_HEFTYSKULLRODAMMO, + T_SKULLRODBLAST, T_WIMPYPHOENIXRODAMMO, T_HEFTYPHOENIXRODAMMO, T_PHOENIXSHOT, + T_IRONLICHBLUESHOT, T_WHIRLWIND, T_REDTELEGLITTER, T_BLUETELEGLITTER, + + T_CENTAUR, T_CENTAURLEADER, T_DEMON1, T_ETTIN, T_FIREGARGOYLE, T_WATERLURKER, + T_WATERLURKERLEADER, T_WRAITH, T_WRAITHBURIED, T_FIREBALL1, T_MANA1, T_MANA2, + T_ITEMBOOTS, T_ITEMPORK, T_ITEMSUMMON, T_ITEMTPORTOTHER, T_BISHOP, T_ICEGOLEM, + T_DRAGONSKINBRACERS, T_ITEMBOOSTMANA, T_FIGHTERAXE, T_FIGHTERHAMMER, + T_FIGHTERSWORD1, T_FIGHTERSWORD2, T_FIGHTERSWORD3, T_CLERICSTAFF, T_CLERICHOLY1, + T_CLERICHOLY2, T_CLERICHOLY3, T_MAGESHARDS, T_MAGESTAFF1, T_MAGESTAFF2, + T_MAGESTAFF3, T_ARROW, T_DART, T_POISONDART, T_RIPPERBALL, T_BLADE, T_ICESHARD, + T_FLAME_SMALL, T_FLAME_LARGE, T_MESHARMOR, T_FALCONSHIELD, T_PLATINUMHELM, + T_AMULETOFWARDING, T_ITEMFLECHETTE, T_ITEMREPULSION, T_MANA3, T_PUZZSKULL, + T_PUZZGEMBIG, T_PUZZGEMRED, T_PUZZGEMGREEN1, T_PUZZGEMGREEN2, T_PUZZGEMBLUE1, + T_PUZZGEMBLUE2, T_PUZZBOOK1, T_PUZZBOOK2, T_METALKEY, T_SMALLMETALKEY, T_AXEKEY, + T_FIREKEY, T_EMERALDKEY, T_MACEKEY, T_SILVERKEY, T_RUSTYKEY, T_HORNKEY, + T_SERPENTKEY, T_WATERDRIP, T_TEMPSMALLFLAME, T_PERMSMALLFLAME, T_PERMLARGEFLAME, + T_DEMON_MASH, T_DEMON2_MASH, T_ETTIN_MASH, T_CENTAUR_MASH, T_THRUSTSPIKEUP, + T_THRUSTSPIKEDOWN, T_FLESH_DRIP1, T_FLESH_DRIP2, T_SPARK_DRIP, + + ACTOR_NONE, ACTOR_WORLD, ACTOR_PLAYER, ACTOR_BOT, ACTOR_VOODOODOLL, + ACTOR_MONSTER, ACTOR_ALIVE, ACTOR_DEAD, ACTOR_MISSILE, ACTOR_GENERIC, + + SECSEQ_FLOOR, SECSEQ_CEILING, SECSEQ_FULLHEIGHT, SECSEQ_INTERIOR, + + AAPTR_DEFAULT, AAPTR_NULL, AAPTR_TARGET, AAPTR_MASTER, AAPTR_TRACER, + AAPTR_PLAYER_GETTARGET, AAPTR_PLAYER_GETCONVERSATION, AAPTR_PLAYER1, + AAPTR_PLAYER2, AAPTR_PLAYER3, AAPTR_PLAYER4, AAPTR_PLAYER5, AAPTR_PLAYER6, AAPTR_PLAYER7, AAPTR_PLAYER8, AAPTR_FRIENDPLAYER, AAPTR_GET_LINETARGET, - PTROP_UNSAFETARGET, PTROP_UNSAFEMASTER, PTROP_NOSAFEGUARDS, + PTROP_UNSAFETARGET, PTROP_UNSAFEMASTER, PTROP_NOSAFEGUARDS, // Zandronum database additions DB_ORDER_ASC, DB_ORDER_DESC, - TEAM_BLUE, TEAM_RED, NO_TEAM, + TEAM_BLUE, TEAM_RED, NO_TEAM, // Team properties (Zandronum) TPROP_Name, TPROP_Score, TPROP_IsValid, TPROP_NumPlayers, TPROP_NumLivePlayers, TPROP_TextColor, TPROP_PlayerStartNum, TPROP_Spread, TPROP_Carrier, TPROP_Assister, TPROP_FragCount, TPROP_DeathCount, TPROP_WinCount, TPROP_PointCount, TPROP_ReturnTics, TPROP_TeamItem, TPROP_WinnerTheme, TPROP_LoserTheme, - IS_WAITINGFORPLAYERS, IS_FIRSTCOUNTDOWN, IS_INPROGRESS, IS_BOSSFIGHT, - IS_WAVECOMPLETE, IS_COUNTDOWN, + IS_WAITINGFORPLAYERS, IS_FIRSTCOUNTDOWN, IS_INPROGRESS, IS_BOSSFIGHT, + IS_WAVECOMPLETE, IS_COUNTDOWN, - T_GRENADE, T_BFG10KSHOT, T_DARKIMPFIREBALL, T_CACOLANTERNSHOT, T_ABADDONSHOT, - T_DARKIMP, T_BLOODDEMON, T_SSGGUY, T_HECTEBUS, T_CACOLANTERN, T_BELPHEGOR, - T_ABADDON, T_PISTOL, T_GRENADELAUNCHER, T_RAILGUN, T_BFG10000, T_MINIGUN, - T_MAXHEALTHBONUS, T_MAXARMORBONUS, T_REDARMOR, T_TURBOSPHERE, T_ANTIGRAVBELT, - T_TIMEFREEZER, T_INFRAGOGGLES, T_INFRATRACKER, T_TRANSLUCENCY, T_DOOMSPHERE, - T_RANDOMPOWERUP, T_BLUEFLAG, T_REDFLAG, T_WHITEFLAG, T_STRENGTH, T_RAGE, - T_DRAIN, T_SPREAD, T_RESISTANCE, T_REGENERATION, T_PROSPERITY, T_REFLECTION, - T_HIGHJUMP, T_HASTE, + T_GRENADE, T_BFG10KSHOT, T_DARKIMPFIREBALL, T_CACOLANTERNSHOT, T_ABADDONSHOT, + T_DARKIMP, T_BLOODDEMON, T_SSGGUY, T_HECTEBUS, T_CACOLANTERN, T_BELPHEGOR, + T_ABADDON, T_PISTOL, T_GRENADELAUNCHER, T_RAILGUN, T_BFG10000, T_MINIGUN, + T_MAXHEALTHBONUS, T_MAXARMORBONUS, T_REDARMOR, T_TURBOSPHERE, T_ANTIGRAVBELT, + T_TIMEFREEZER, T_INFRAGOGGLES, T_INFRATRACKER, T_TRANSLUCENCY, T_DOOMSPHERE, + T_RANDOMPOWERUP, T_BLUEFLAG, T_REDFLAG, T_WHITEFLAG, T_STRENGTH, T_RAGE, + T_DRAIN, T_SPREAD, T_RESISTANCE, T_REGENERATION, T_PROSPERITY, T_REFLECTION, + T_HIGHJUMP, T_HASTE, - EV_KeyDown, EV_KeyRepeat, EV_KeyUp, EV_Char, EV_MouseMove, EV_LButtonDown, - EV_LButtonUp, EV_LButtonDblClick, EV_MButtonDown, EV_MButtonUp, - EV_MButtonDblClick, EV_RButtonDown, EV_RButtonUp, EV_RButtonDblClick, - EV_WheelDown, EV_WheelUp, + EV_KeyDown, EV_KeyRepeat, EV_KeyUp, EV_Char, EV_MouseMove, EV_LButtonDown, + EV_LButtonUp, EV_LButtonDblClick, EV_MButtonDown, EV_MButtonUp, + EV_MButtonDblClick, EV_RButtonDown, EV_RButtonUp, EV_RButtonDblClick, + EV_WheelDown, EV_WheelUp, - GKM_SHIFT, GKM_CTRL, GKM_ALT, GKM_LBUTTON, GKM_MBUTTON, GKM_RBUTTON, GK_PGDN, - GK_PGUP, GK_HOME, GK_END, GK_LEFT, GK_RIGHT, GK_ALERT, GK_BACKSPACE, GK_TAB, - GK_LINEFEED, GK_DOWN, GK_VTAB, GK_UP, GK_FORMFEED, GK_RETURN, GK_F1, GK_F2, - GK_F3, GK_F4, GK_F5, GK_F6, GK_F7, GK_F8, GK_F9, GK_F10, GK_F11, GK_F12, GK_DEL, - GK_ESCAPE, GK_FREE1, GK_FREE2, GK_FREE3, GK_CESCAPE, + GKM_SHIFT, GKM_CTRL, GKM_ALT, GKM_LBUTTON, GKM_MBUTTON, GKM_RBUTTON, GK_PGDN, + GK_PGUP, GK_HOME, GK_END, GK_LEFT, GK_RIGHT, GK_ALERT, GK_BACKSPACE, GK_TAB, + GK_LINEFEED, GK_DOWN, GK_VTAB, GK_UP, GK_FORMFEED, GK_RETURN, GK_F1, GK_F2, + GK_F3, GK_F4, GK_F5, GK_F6, GK_F7, GK_F8, GK_F9, GK_F10, GK_F11, GK_F12, GK_DEL, + GK_ESCAPE, GK_FREE1, GK_FREE2, GK_FREE3, GK_CESCAPE, - CHANGELEVEL_KEEPFACING, CHANGELEVEL_RESETINVENTORY, CHANGELEVEL_NOMONSTERS, - CHANGELEVEL_CHANGESKILL, CHANGELEVEL_NOINTERMISSION, CHANGELEVEL_RESETHEALTH, - CHANGELEVEL_PRERAISEWEAPON, + CHANGELEVEL_KEEPFACING, CHANGELEVEL_RESETINVENTORY, CHANGELEVEL_NOMONSTERS, + CHANGELEVEL_CHANGESKILL, CHANGELEVEL_NOINTERMISSION, CHANGELEVEL_RESETHEALTH, + CHANGELEVEL_PRERAISEWEAPON, - NO_CHANGE, + NO_CHANGE, SECF_SILENT, SECF_NOFALLINGDAMAGE, SECF_FLOORDROP, SECF_NORESPAWN, SECF_FRICTION, SECF_PUSH, SECF_SILENTMOVE, SECF_DMGTERRAINFX, SECF_DMGENDGODMODE, SECF_DMGENDLEVEL, @@ -390,10 +390,10 @@ acs_z : acs SECPART_3D, SECPART_Ceiling, SECPART_Floor, BLOCKF_CREATURES, BLOCKF_MONSTERS, BLOCKF_PLAYERS, BLOCKF_FLOATERS, BLOCKF_HITSCAN, - BLOCKF_PROJECTILES, BLOCKF_EVERYTHING, BLOCKF_RAILING, BLOCKF_USE, BLOCKF_SIGHT, + BLOCKF_PROJECTILES, BLOCKF_EVERYTHING, BLOCKF_RAILING, BLOCKF_USE, BLOCKF_SIGHT, BLOCKF_SOUND, BLOCKF_LANDMONSTERS, - FOGP_DENSITY, FOGP_OUTSIDEDENSITY, FOGP_SKYFOG, + FOGP_DENSITY, FOGP_OUTSIDEDENSITY, FOGP_SKYFOG, PRINTNAME_LEVELNAME, PRINTNAME_LEVEL, PRINTNAME_SKILL, PRINTNAME_NEXTLEVEL, PRINTNAME_NEXTSECRET, @@ -490,27 +490,27 @@ acs_z : acs args = "int script, [int mapnum], [int arg1], [int arg2], [int lock]"; description = "Executes the specified script if the player has the right key. Displays the 'remote' locked message."; } - + ACS_LockedExecuteDoor { args = "int script, [int mapnum], [int arg1], [int arg2], [int lock]"; description = "Executes the specified script if the player has the right key. Displays the 'door' locked message."; } - + ACS_Suspend { args = "int script, [int mapnum]"; description = "Suspends execution of the specified script. Use ACS_Execute or ACS_LockedExecute to resume the script."; } - + ACS_Terminate { args = "int script, [int mapnum]"; description = "Terminates execution of the specified script."; } - + Autosave { args = ""; description = "Automatically saves the game to an autosave slot."; } - + Ceiling_CrushAndRaise = "int tag, int speed, int damage, [int crushmode]"; Ceiling_CrushAndRaiseA = "int tag, int downspeed, int upspeed, int damage, [int crushmode]"; Ceiling_CrushAndRaiseDist = "int tag, int dist, int speed, int damage, [int crushmode]"; @@ -555,7 +555,7 @@ acs_z : acs Door_CloseWaitOpen = "int tag, int speed, int delay, [int lighttag]"; Door_LockedRaise = "int tag, int speed, int delay, int lock, [int lighttag]"; Door_Open = "int tag, int speed, [int lighttag]"; - Door_Raise = "int tag, int speed, int delay, [int lighttag]"; + Door_Raise = "int tag, int speed, int delay, [int lighttag]"; Door_WaitClose = "int tag, int speed, int wait, [int lighttag]"; Door_WaitRaise = "int tag, int speed, int delay, int wait, [int lighttag]"; Elevator_LowerToNearest = "int tag, int speed"; @@ -1056,7 +1056,7 @@ acs_z : acs SortDBEntries = "unknown parameters list"; Strftime = "int timestamp, str format, [int utc]"; SystemTime; - + // ZDaemon functions GetTeamScore = "int team"; SetTeamScore = "int team, int score"; diff --git a/dist/res/config/languages/decorate.txt b/dist/res/config/languages/decorate.txt index 6dde0ad41..da4bca2b0 100644 --- a/dist/res/config/languages/decorate.txt +++ b/dist/res/config/languages/decorate.txt @@ -25,96 +25,96 @@ decorate : cstyle { $override, // Actor properties - + // Generic - Game, SpawnID, ConversationID, - + Game, SpawnID, ConversationID, + // Text - Obituary, HitObituary, Tag, - + Obituary, HitObituary, Tag, + // Health and Pain - Health, GibHealth, WoundHealth, PainChance, PainThreshold, PainType, DeathType, + Health, GibHealth, WoundHealth, PainChance, PainThreshold, PainType, DeathType, // Combat Accuracy, Stamina, ReactionTime, - Damage, DamageFactor, DamageMultiply, DamageType, PoisonDamage, PoisonDamageType, - ExplosionRadius, ExplosionDamage, SelfDamageFactor, RadiusDamageFactor, DontHurtShooter, + Damage, DamageFactor, DamageMultiply, DamageType, PoisonDamage, PoisonDamageType, + ExplosionRadius, ExplosionDamage, SelfDamageFactor, RadiusDamageFactor, DontHurtShooter, MeleeDamage, MeleeThreshold, MeleeRange, MaxTargetRange, FriendlySeeBlocks, - MissileType, MissileHeight, MinMissileChance, - WeaveIndexXY, WeaveIndexZ, ProjectileKickBack, + MissileType, MissileHeight, MinMissileChance, + WeaveIndexXY, WeaveIndexZ, ProjectileKickBack, RipperLevel, RipLevelMin, RipLevelMax, Threshold, DefThreshold, ShadowAimFactor, ShadowPenaltyFactor, - + // Physics Gravity, Mass, Radius, Height, BounceFactor, BounceCount, BounceType, WallBounceFactor, PushFactor, DeathHeight, BurnHeight, ProjectilePassHeight, CameraHeight, MaxStepHeight, MaxDropOffHeight, Speed, VSpeed, FastSpeed, FloatSpeed, Friction, MaxSlopeSteepness, ThruBits, LandingSpeed, - + // Rendering - RenderStyle, None, Normal, Fuzzy, OptFuzzy, Translucent, SoulTrans, Stencil, AddStencil, StencilColor, Shaded, + RenderStyle, None, Normal, Fuzzy, OptFuzzy, Translucent, SoulTrans, Stencil, AddStencil, StencilColor, Shaded, AddShaded, Shadow, Add, Subtract, DefaultAlpha, Alpha, XScale, YScale, Scale, Translation, BloodColor, BloodType, Decal, FloatBobPhase, DistanceCheck, SpriteAngle, SpriteRotation, VisibleAngles, VisiblePitch, StealthAlpha, FloatBobStrength, RenderRadius, CameraFOV, LightLevel, - + // Sounds SeeSound, AttackSound, PainSound, BounceSound, CrushPainSound, DeathSound, ActiveSound, MeleeSound, HowlSound, PainSound, WallBounceSound, RipSound, PushSound, - + // Multiplayer weirdness - DesignatedTeam, VisibleToTeam, VisibleToPlayerClass, - + DesignatedTeam, VisibleToTeam, VisibleToPlayerClass, + // Scripting Args, ClearFlags, Species, Activation, DropItem, Skip_Super, DynamicLight, // Player-specific properties - Player, DisplayName, SoundClass, Face, ColorRange, ColorSet, ColorSetFile, ClearColorSet, - AttackZOffset, JumpZ, SpawnClass, ViewHeight, ForwardMove, SideMove, MaxHealth, MugshotMaxHealth, - RunHealth, MorphWeapon, FlechetteType, ScoreIcon, CrouchSprite, DamageScreenColor, StartItem, + Player, DisplayName, SoundClass, Face, ColorRange, ColorSet, ColorSetFile, ClearColorSet, + AttackZOffset, JumpZ, SpawnClass, ViewHeight, ForwardMove, SideMove, MaxHealth, MugshotMaxHealth, + RunHealth, MorphWeapon, FlechetteType, ScoreIcon, CrouchSprite, DamageScreenColor, StartItem, InvulnerabilityMode, HealRadiusType, HexenArmor, Portrait, WeaponSlot, FallingScreamSpeed, GruntSpeed, AirCapacity, UseRange, ViewBob, TeleportFreezeTime, FlyBob, WaterClimbSpeed, ViewBobSpeed, - + // Inventory-specific properties - Inventory, RestrictedTo, ForbiddenTo, Amount, Icon, InterHubAmount, MaxAmount, + Inventory, RestrictedTo, ForbiddenTo, Amount, Icon, InterHubAmount, MaxAmount, DefMaxAmount, PickupFlash, PickupMessage, PickupSound, PickupAnnouncerEntry, Respawntics, UseSound, GiveQuest, AltHUDIcon, - + // Fake Inventory FakeInventory, Respawns, - + // Health Health, LowMessage, - + // Health pickup HealthPickup, AutoUse, - + // Armor-specific properties Armor, SaveAmount, SavePercent, MaxAbsorb, MaxFullAbsorb, MaxSaveAmount, MaxBonus, MaxBonusMax, // Powerup-specific properties Powerup, Color, Colormap, Duration, Mode, Strength, Type, - + // Predefined powerup colors BlueMap, GoldMap, GreenMap, InverseMap, RedMap, - + // Morph powerup PowerMorph, PlayerClass, MorphStyle, MorphFlash, UnmorphFlash, MonsterClass, - + // Morph projectile MorphProjectile, PlayerClass, MonsterClass, Duration, MorphStyle, MorphFlash, UnmorphFlash, - + // Weapon-specific properties - Weapon, Kickback, DefaultKickback, ReadySound, SelectionOrder, SisterWeapon, UpSound, YAdjust, + Weapon, Kickback, DefaultKickback, ReadySound, SelectionOrder, SisterWeapon, UpSound, YAdjust, AmmoGive, AmmoGive1, AmmoGive2, AmmoType, AmmoType1, AmmoType2, AmmoUse, AmmoUse1, AmmoUse2, BobStyle, BobSpeed, BobRangeX, BobRangeY, SlotNumber, SlotPriority, PreferredSkin, MinSelectionAmmo1, MinSelectionAmmo2, WeaponScaleX, WeaponScaleY, LookScale, - + // Weapon piece - WeaponPiece, Number, Weapon, - + WeaponPiece, Number, Weapon, + // Ammo-specific properties Ammo, BackpackAmount, BackpackMaxAmount, DropAmount, - + // Puzzle items PuzzleItem, Number, FailMessage, FailSound, @@ -125,13 +125,13 @@ decorate : cstyle { Monster, Projectile, // DECORATE expressions - x, y, z, angle, momx, momy, momz, velx, vely, velz, pitch, tid, tidtohate, + x, y, z, angle, momx, momy, momz, velx, vely, velz, pitch, tid, tidtohate, ceilingz, floorz, scalex, scaley, score, special, waterlevel, var, int, roll, visibleendangle, visibleendpitch, visiblestartangle, visiblestartpitch, // Anonymous functions bool, state, if, else, return, for, while, do, break, continue, - + // Damage type properties NoArmor, Factor, ReplaceFactor, @@ -142,7 +142,7 @@ decorate : cstyle { constants = { // General constants TRUE, FALSE, - + // Flags ABSMASKANGLE, ABSMASKPITCH, ACTIVATEIMPACT, ACTIVATEMCROSS, ACTIVATEPCROSS, ACTLIKEBRIDGE, ADDITIVEPOISONDAMAGE, ADDITIVEPOISONDURATION, AIMREFLECT, ALLOWBOUNCEONACTORS, ALLOWPAIN, ALLOWPARTICLES, ALLOWTHRUFLAGS, ALWAYSFAST, @@ -155,20 +155,20 @@ decorate : cstyle { DONTHARMSPECIES, DONTHURTSPECIES, DONTMORPH, DONTOVERLAP, DONTREFLECT, DONTRIP, DONTSEEKINVISIBLE, DONTSPLASH, DONTSQUASH, DONTTHRUST, DONTTRANSLATE, DOOMBOUNCE, DORMANT, DROPOFF, DROPPED, EXPLOCOUNT, EXPLODEONWATER, EXTREMEDEATH, FASTER, FASTMELEE, FIREDAMAGE, FIRERESIST, FIXMAPTHINGPOS, FLOAT, - FLOATBOB, FLOORCLIP, FLOORHUGGER, FOILBUDDHA, FOILINVUL, FORCEDECAL, FORCEPAIN, FORCERADIUSDMG, FORCEXYBILLBOARD, + FLOATBOB, FLOORCLIP, FLOORHUGGER, FOILBUDDHA, FOILINVUL, FORCEDECAL, FORCEPAIN, FORCERADIUSDMG, FORCEXYBILLBOARD, FORCEYBILLBOARD, FRIENDLY, FRIGHTENED, FULLVOLACTIVE, FULLVOLDEATH, GETOWNER, GHOST, GRENADETRAIL, HARMFRIENDS, HERETICBOUNCE, HEXENBOUNCE, HITMASTER, HITTARGET, HITTRACER, ICECORPSE, ICEDAMAGE, ICESHATTER, INCOMBAT, INVISIBLE, - INVULNERABLE, ISMONSTER, JUMPDOWN, JUSTATTACKED, JUSTHIT, LAXTELEFRAGDMG, LONGMELEERANGE, LOOKALLAROUND, LOWGRAVITY, - MASKROTATION, MBFBOUNCER, MISSILE, MISSILEEVENMORE, MISSILEMORE, MIRRORREFLECT, MOVEWITHSECTOR, MTHRUSPECIES, NEVERFAST, - NEVERRESPAWN, NEVERTARGET, NOBLOCKMAP, NOBLOCKMONST, NOBLOOD, NOBLOODDECALS, NOBOSSRIP, NOBOUNCESOUND, - NOCLIP, NODAMAGE, NODAMAGETHRUST, NODECAL, NODROPOFF, NOEXPLODEFLOOR, NOEXTREMEDEATH, NOFEAR, NOFORWARDFALL, - NOGRAVITY, NOICEDEATH, NOINFIGHTING, NOINTERACTION, NOKILLSCRIPTS, NOLIFTDROP, NOMENU, NONSHOOTABLE, NOPAIN, - NORADIUSDMG, NOSECTOR, NOSKIN, NOSPLASHALERT, NOTARGET, NOTARGETSWITCH, NOTAUTOAIMED, NOTDMATCH, + INVULNERABLE, ISMONSTER, JUMPDOWN, JUSTATTACKED, JUSTHIT, LAXTELEFRAGDMG, LONGMELEERANGE, LOOKALLAROUND, LOWGRAVITY, + MASKROTATION, MBFBOUNCER, MISSILE, MISSILEEVENMORE, MISSILEMORE, MIRRORREFLECT, MOVEWITHSECTOR, MTHRUSPECIES, NEVERFAST, + NEVERRESPAWN, NEVERTARGET, NOBLOCKMAP, NOBLOCKMONST, NOBLOOD, NOBLOODDECALS, NOBOSSRIP, NOBOUNCESOUND, + NOCLIP, NODAMAGE, NODAMAGETHRUST, NODECAL, NODROPOFF, NOEXPLODEFLOOR, NOEXTREMEDEATH, NOFEAR, NOFORWARDFALL, + NOGRAVITY, NOICEDEATH, NOINFIGHTING, NOINTERACTION, NOKILLSCRIPTS, NOLIFTDROP, NOMENU, NONSHOOTABLE, NOPAIN, + NORADIUSDMG, NOSECTOR, NOSKIN, NOSPLASHALERT, NOTARGET, NOTARGETSWITCH, NOTAUTOAIMED, NOTDMATCH, NOTELEFRAG, NOTELEOTHER, NOTELEPORT, NOTELESTOMP, NOTIMEFREEZE, NOTONAUTOMAP, NOTRIGGER, NOVERTICALMELEERANGE, NOWALLBOUNCESND, OLDRADIUSDMG, PAINLESS, PICKUP, PIERCEARMOR, PUFFGETSOWNER, PUFFONACTORS, PUSHABLE, QUARTERGRAVITY, QUICKTORETALIATE, RANDOMIZE, REFLECTIVE, RELATIVETOFLOOR, RIPPER, ROCKETTRAIL, SCREENSEEKER, SEEINVISIBLE, SEEKERMISSILE, SEESDAGGERS, SHADOW, SHIELDREFLECT, - SHOOTABLE, SHORTMISSILERANGE, SKULLFLY, SKYEXPLODE, SLIDESONWALLS, SOLID, SPAWNCEILING, SPAWNFLOAT, + SHOOTABLE, SHORTMISSILERANGE, SKULLFLY, SKYEXPLODE, SLIDESONWALLS, SOLID, SPAWNCEILING, SPAWNFLOAT, SPAWNSOUNDSOURCE, SPECIAL, SPECIALFIREDAMAGE, SPECIALFLOORCLIP, SPECTRAL, SPRITEANGLE, STANDSTILL, STAYMORPHED, STEALTH, STEPMISSILE, STRIFEDAMAGE, SUMMONEDMONSTER, SYNCHRONIZED, TELEPORT, TELESTOMP, TERRAIN, THRUACTORS, THRUGHOST, THRUREFLECT, THRUSPECIES, TOUCHY, USEBOUNCESTATE, USEKILLSCRIPTS, USESPECIAL, @@ -185,18 +185,18 @@ decorate : cstyle { // INVENTORY. INVENTORY, QUIET, AUTOACTIVATE, UNDROPPABLE, INVBAR, HUBPOWER, PERSISTENTPOWER, INTERHUBSTRIP, - PICKUPFLASH, ALWAYSPICKUP, FANCYPICKUPSOUND, BIGPOWERUP, KEEPDEPLETED, IGNORESKILL, + PICKUPFLASH, ALWAYSPICKUP, FANCYPICKUPSOUND, BIGPOWERUP, KEEPDEPLETED, IGNORESKILL, ADDITIVETIME, UNTOSSABLE, RESTRICTABSOLUTELY, NEVERRESPAWN, NOSCREENFLASH, NOATTENPICKUPSOUND, TOSSED, TRANSFER, NOTELEPORTFREEZE, UNCLEARABLE, NOSCREENBLINK, ISHEALTH, ISARMOR, NEVERLOCAL, ISKEYITEM, - + // PLAYERPAWN. - PLAYERPAWN, + PLAYERPAWN, CANSUPERMORPH, CROUCHABLEMORPH, NOTHRUSTWHENINVUL, WEAPONLEVEL2ENDED, - + // POWERSPEED. POWERSPEED, NOTRAIL, @@ -227,7 +227,7 @@ decorate : cstyle { //constants, source: gzdoom.pk3 AAPTR_DEFAULT, AAPTR_FRIENDPLAYER, AAPTR_LINETARGET, AAPTR_MASTER, AAPTR_NULL, AAPTR_PLAYER_GETCONVERSATION, AAPTR_PLAYER_GETTARGET, AAPTR_PLAYER1, AAPTR_PLAYER2, AAPTR_PLAYER3, AAPTR_PLAYER4, AAPTR_PLAYER5, - AAPTR_PLAYER6, AAPTR_PLAYER7, AAPTR_PLAYER8, AAPTR_TARGET, AAPTR_TRACER, + AAPTR_PLAYER6, AAPTR_PLAYER7, AAPTR_PLAYER8, AAPTR_TARGET, AAPTR_TRACER, AF_ClearSpecial, AF_Default, AF_MissileTrigger, AF_MonsterTrigger, AF_NoDeathSpecial, AF_ThingActs, AF_ThingTargets, AF_TriggerActs, AF_TriggerTargets, AMF_TARGETEMITTER, AMF_TARGETNONPLAYER, AMF_EMITFROMTARGET, @@ -331,7 +331,7 @@ decorate : cstyle { BT_MOVEDOWN, BT_SHOWSCORES, BT_USER1, BT_USER2, BT_USER3, BT_USER4, // Flags for A_JumpIfTargetInLOS and A_JumpIfInTargetLOS - JLOSF_ALLYNOJUMP, JLOSF_CHECKMASTER, JLOSF_CHECKTRACER, JLOSF_CLOSENOFOV, JLOSF_CLOSENOJUMP, JLOSF_CLOSENOSIGHT, + JLOSF_ALLYNOJUMP, JLOSF_CHECKMASTER, JLOSF_CHECKTRACER, JLOSF_CLOSENOFOV, JLOSF_CLOSENOJUMP, JLOSF_CLOSENOSIGHT, JLOSF_COMBATANTONLY, JLOSF_DEADNOJUMP, JLOSF_FLIPFOV, JLOSF_NOSIGHT, JLOSF_PROJECTILE, JLOSF_TARGETLOS, JLOSF_NOAUTOAIM, @@ -339,7 +339,7 @@ decorate : cstyle { KILS_FOILBUDDHA, KILS_FOILINVUL, KILS_KILLMISSILES, KILS_NOMONSTERS, KILS_EXFILTER, KILS_EXSPECIES, KILS_EITHER, LOF_DONTCHASEGOAL, LOF_FULLVOLSEESOUND, LOF_NOJUMP, LOF_NOSEESOUND, LOF_NOSIGHTCHECK, LOF_NOSOUNDCHECK, - MRF_ADDSTAMINA, MRF_FAILNOLAUGH, MRF_FAILNOTELEFRAG, MRF_FULLHEALTH, MRF_LOSEACTUALWEAPON, + MRF_ADDSTAMINA, MRF_FAILNOLAUGH, MRF_FAILNOTELEFRAG, MRF_FULLHEALTH, MRF_LOSEACTUALWEAPON, MRF_NEWTIDBEHAVIOUR, MRF_UNDOBYCHAOSDEVICE, MRF_UNDOBYDEATH, MRF_UNDOBYDEATHFORCED, MRF_UNDOBYDEATHSAVES, MRF_UNDOBYTOMEOFPOWER, MRF_WHENINVULNERABLE, MRF_UNDOALWAYS, MRF_TRANSFERTRANSLATION, MSF_Classic, MSF_DontHurt, MSF_Standard, @@ -406,7 +406,7 @@ decorate : cstyle { // A_SpawnItemEx flags SXF_ABSOLUTEANGLE, SXF_ABSOLUTEMOMENTUM, SXF_ABSOLUTEPOSITION, SXF_ABSOLUTEVELOCITY, SXF_CLIENTSIDE, SXF_NOCHECKPOSITION, SXF_SETMASTER, SXF_TELEFRAG, SXF_TRANSFERAMBUSHFLAG, SXF_TRANSFERPITCH, - SXF_TRANSFERPOINTERS, SXF_TRANSFERTRANSLATION, SXF_USEBLOODCOLOR, SXF_CLEARCALLERTID, SXF_MULTIPLYSPEED, + SXF_TRANSFERPOINTERS, SXF_TRANSFERTRANSLATION, SXF_USEBLOODCOLOR, SXF_CLEARCALLERTID, SXF_MULTIPLYSPEED, SXF_TRANSFERSCALE, SXF_TRANSFERSPECIAL, SXF_CLEARCALLERSPECIAL, SXF_TRANSFERSTENCILCOL, SXF_TRANSFERALPHA, SXF_TRANSFERRENDERSTYLE, SXF_SETTARGET, SXF_SETTRACER, SXF_NOPOINTERS, SXF_ORIGINATOR, SXF_TRANSFERSPRITEFRAME, SXF_TRANSFERROLL, SXF_ISTARGET, SXF_ISMASTER, SXF_ISTRACER, @@ -428,7 +428,7 @@ decorate : cstyle { WAF_NORANDOM, WAF_USEPUFF, // A_Warp flags - WARPF_ABSOLUTEANGLE, WARPF_ABSOLUTEOFFSET, WARPF_COPYINTERPOLATION, WARPF_INTERPOLATE,WARPF_NOCHECKPOSITION, + WARPF_ABSOLUTEANGLE, WARPF_ABSOLUTEOFFSET, WARPF_COPYINTERPOLATION, WARPF_INTERPOLATE,WARPF_NOCHECKPOSITION, WARPF_STOP, WARPF_TESTONLY, WARPF_TOFLOOR, WARPF_USECALLERANGLE, WARPF_WARPINTERPOLATION, WARPF_ABSOLUTEPOSITION, WARPF_BOB, WARPF_MOVEPTR, WARPF_USETID, WARPF_COPYPITCH, WARPF_COPYVELOCITY, @@ -441,16 +441,16 @@ decorate : cstyle { // A_Explode XF_HURTSOURCE, XF_NOTMISSILE, XF_EXPLICITDAMAGETYPE, XF_NOSPLASH, XF_THRUSTZ, XF_THRUSTLESS, XF_NOALLIES, XF_CIRCULAR, - + // A_ZoomFactor constants (not in constants.txt) ZOOM_INSTANT, ZOOM_NOSCALETURNING, - + // Some additional constants - ChunkFlags, - BeastAttack, BeastPuff, ClinkAttack, ImpMeAttack, TeleGlitter, TeleGlitter2, + ChunkFlags, + BeastAttack, BeastPuff, ClinkAttack, ImpMeAttack, TeleGlitter, TeleGlitter2, StaffAttack, BoltSpark, MummyAttack, MummyAttack2, CentaurDrop, DemonAttack1, EttinAttack, DropMace, PigAttack, - SpectreMelee, PeasantAttack, spectrespawn, ReaverMelee, + SpectreMelee, PeasantAttack, spectrespawn, ReaverMelee, } functions { @@ -784,7 +784,7 @@ decorate : cstyle { A_FireRailgunLeft; A_FireRailgunRight; A_RailWait; - + A_RestoreSpecialPosition; A_RestoreSpecialDoomThing; A_RestoreSpecialThing1; @@ -835,11 +835,11 @@ decorate : cstyle { A_FireCrackle; A_BFGSpray = "[string flashtype], [int numrays], [int damage], [float angle], [float distance], [float vrange], [int explict_damage], [int flags]"; A_BarrelDestroy; - + // Restricted functions A_IceSetTics; A_BridgeOrbit; A_BridgeInit = "[class ball]"; A_SpawnSingleItem = "class type, [int fail_single], [int fail_coop], [int fail_dm]"; - + // Scripted marines have some A_M_Refire = "[bool ignoremissile]"; A_M_CheckAttack; @@ -857,7 +857,7 @@ decorate : cstyle { A_M_FireRailgun; A_M_BFGsound; A_M_FireBFG; - + // Heretic has a lot of them A_BeakRaise; A_BeakAttackPL1; A_BeakAttackPL2; A_Sor1Pain; A_Sor1Chase; A_Srcr1Attack; A_SorcererRise; @@ -880,14 +880,14 @@ decorate : cstyle { A_MinotaurDecide; A_MinotaurAtk1; A_MinotaurAtk2; A_MinotaurAtk3; A_MinotaurCharge; A_MinotaurLook; A_MinotaurRoam; A_MinotaurChase; A_MinotaurDeath; A_MntrFloorFire; - A_KnightAttack; A_DripBlood; + A_KnightAttack; A_DripBlood; A_GhostOff; A_WizAtk1; A_WizAtk2; A_WizAtk3; // Hexen has a bunch of them, too A_BatSpawnInit; A_BatSpawn; A_BatMove; A_BishopChase; A_BishopDecide; A_BishopDoBlur; A_BishopSpawnBlur; A_BishopPainBlur; A_BishopAttack; A_BishopAttack2; - A_ClericAttack; A_FighterAttack; + A_ClericAttack; A_FighterAttack; A_CFlameAttack; A_CFlameRotate; A_CFlamePuff; A_CFlameMissile; A_CHolyAttack; A_CHolyPalette; A_CHolyAttack2; A_CHolySeek; A_CHolyCheckScream; A_CHolyTail; A_CMaceAttack; @@ -921,12 +921,12 @@ decorate : cstyle { A_Summon; A_TeloSpawnA; A_TeloSpawnB; A_TeloSpawnC; A_TeloSpawnD; A_CheckTeleRing; A_WraithInit; A_WraithChase; A_WraithMelee; A_WraithRaiseInit; A_WraithRaise; A_WraithFX2; A_WraithFX3; - + // Strife is the last with these A_BeShadowyFoe; A_AcolyteBits; A_AcolyteDie; A_HideDecepticon; A_AlienSpectreDeath; A_CrusaderChoose; A_CrusaderSweepLeft; A_CrusaderSweepRight; A_CrusaderRefire; A_CrusaderDeath; - A_SpawnEntity; A_EntityAttack; A_EntityDeath; A_SubEntityDeath; + A_SpawnEntity; A_EntityAttack; A_EntityDeath; A_SubEntityDeath; A_InquisitorWalk; A_InquisitorDecide; A_InquisitorAttack; A_InquisitorJump; A_InquisitorCheckLand; A_TossArm; A_ReaverRanged; A_LoremasterChain; @@ -1002,7 +1002,7 @@ decorate : cstyle { OverlayID; OverlayX = "[int layer]"; OverlayY = "[int layer]"; - + // Internal use only, normally A_Turn = "[float angle]"; A_LineEffect = "[int boomspecial], [int tag]"; @@ -1050,7 +1050,7 @@ decorate : cstyle { Door_CloseWaitOpen = "int tag, int speed, int delay, [int lighttag]"; Door_LockedRaise = "int tag, int speed, int delay, int lock, [int lighttag]"; Door_Open = "int tag, int speed, [int lighttag]"; - Door_Raise = "int tag, int speed, int delay, [int lighttag]"; + Door_Raise = "int tag, int speed, int delay, [int lighttag]"; Elevator_LowerToNearest = "int tag, int speed"; Elevator_MoveToFloor = "int tag, int speed"; Elevator_RaiseToNearest = "int tag, int speed"; diff --git a/dist/res/config/languages/fragglescript.txt b/dist/res/config/languages/fragglescript.txt index ec7b27f1d..90a08453b 100644 --- a/dist/res/config/languages/fragglescript.txt +++ b/dist/res/config/languages/fragglescript.txt @@ -9,117 +9,117 @@ fragglescript : cstyle { keywords = { // Level info - consolecmd, creator, drown, gravity, ignore, interpic, + consolecmd, creator, drown, gravity, ignore, interpic, levelname, music, nextlevel, nextsecret, partime, skyname, // Console commands allowjump, gimme, gravity, gr_fogcolor, gr_fogdensity, viewheight, map, - + // Variable types string, int, mobj, fixed, float, const, hud, - + // Default variables consoleplayer, displayplayer, zoom, fov, trigger } constants = { - PLAYER, TROOPER, SHOTGUY, ARCHVILE, VILEFIRE, REVENANT, REVENANTMISL, SMOKE, - MANCUBUS, MANCUBUSSHOT, CHAINGUY, IMP, DEMON, SPECTRE, CACODEMON, BARONOFHELL, - BARONSHOT, HELLKNIGHT, LOSTSOUL, SPIDERMASTERMIND, ARACHNOTRON, CYBERDEMON, - PAINELEMENTAL, WOLFSS, KEEN, BOSSBRAIN, BOSSSPIT, BOSSTARGET, SPAWNSHOT, - SPAWNFIRE, BARREL, IMPSHOT, CACOSHOT, FLYINGROCKET, FLYINGPLASMA, FLYINGBFG, - ARACHPLAZ, PUFF, BLOOD, TFOG, IFOG, TELEPORTMAN, EXTRABFG, GREENARMOR, - BLUEARMOR, HEALTHPOTION, ARMORHELMET, BLUEKEYCARD, REDKEYCARD, YELLOWKEYCARD, - YELLOWSKULLKEY, REDSKULLKEY, BLUESKULLKEY,STIMPACK, MEDIKIT, SUPERCHARGE, - INVULNERABILITY, BESERKPACK, INVISIBILITY, RADSUIT, AUTOMAP, LITEAMP, - MEGASPHERE, CLIP, BULLETBOX, ROCKET, ROCKETBOX, ECELL, ECELLPACK, SHELLS, - SHELLBOX, BACKPACK, BFG, CHAINGUN, CHAINSAW, RLAUNCHER, PLASMAGUN, SHOTGUN, - SUPERSHOTGUN, TALLTECHLAMP, SHORTTECHLAMP, FLOORLAMP, TALLGRNPILLAR, - SHRTGRNPILLAR, TALLREDPILLAR, SHRTREDPILLAR, SKULLCOLUMN, HEARTCOLUMN, - EVILEYE, SKULLROCK, GRAYTREE, TALLBLUFIRESTICK, TALLGRNFIRESTICK, - TALLREDFIRESTICK, SHRTBLUFIRESTICK, SHRTGRNFIRESTICK, SHRTREDFIRESTICK, - STALAGMITE, TALLTECHPILLAR, CANDLE, CANDELABRA, TWITCHCORPSE1, TWITCHCORPSE2, - HANGINGMAN1, HANGINGMAN2, HANGINGMAN3, HANGINGMAN4, HANGINGMAN5, HANGINGMAN6, - HANGINGMAN7, HANGINGMAN8, DEADCACO, DEADPLAYER, DEADTROOPER, DEADDEMON, - DEADLOSTSOUL, DEADIMP, DEADSERGEANT, SLOP, SLOP2, SKULLPOLE1, BLOODPOOL1, - SKULLPOLE2, SKULLPILE, DEADCORPSE1, TWITCHCORPSE3, TREE, BURNINGBARREL, - HANGINGMAN9, HANGINGMAN10, HANGINGMAN11, HANGINGMAN12, HANGINGMAN13, + PLAYER, TROOPER, SHOTGUY, ARCHVILE, VILEFIRE, REVENANT, REVENANTMISL, SMOKE, + MANCUBUS, MANCUBUSSHOT, CHAINGUY, IMP, DEMON, SPECTRE, CACODEMON, BARONOFHELL, + BARONSHOT, HELLKNIGHT, LOSTSOUL, SPIDERMASTERMIND, ARACHNOTRON, CYBERDEMON, + PAINELEMENTAL, WOLFSS, KEEN, BOSSBRAIN, BOSSSPIT, BOSSTARGET, SPAWNSHOT, + SPAWNFIRE, BARREL, IMPSHOT, CACOSHOT, FLYINGROCKET, FLYINGPLASMA, FLYINGBFG, + ARACHPLAZ, PUFF, BLOOD, TFOG, IFOG, TELEPORTMAN, EXTRABFG, GREENARMOR, + BLUEARMOR, HEALTHPOTION, ARMORHELMET, BLUEKEYCARD, REDKEYCARD, YELLOWKEYCARD, + YELLOWSKULLKEY, REDSKULLKEY, BLUESKULLKEY,STIMPACK, MEDIKIT, SUPERCHARGE, + INVULNERABILITY, BESERKPACK, INVISIBILITY, RADSUIT, AUTOMAP, LITEAMP, + MEGASPHERE, CLIP, BULLETBOX, ROCKET, ROCKETBOX, ECELL, ECELLPACK, SHELLS, + SHELLBOX, BACKPACK, BFG, CHAINGUN, CHAINSAW, RLAUNCHER, PLASMAGUN, SHOTGUN, + SUPERSHOTGUN, TALLTECHLAMP, SHORTTECHLAMP, FLOORLAMP, TALLGRNPILLAR, + SHRTGRNPILLAR, TALLREDPILLAR, SHRTREDPILLAR, SKULLCOLUMN, HEARTCOLUMN, + EVILEYE, SKULLROCK, GRAYTREE, TALLBLUFIRESTICK, TALLGRNFIRESTICK, + TALLREDFIRESTICK, SHRTBLUFIRESTICK, SHRTGRNFIRESTICK, SHRTREDFIRESTICK, + STALAGMITE, TALLTECHPILLAR, CANDLE, CANDELABRA, TWITCHCORPSE1, TWITCHCORPSE2, + HANGINGMAN1, HANGINGMAN2, HANGINGMAN3, HANGINGMAN4, HANGINGMAN5, HANGINGMAN6, + HANGINGMAN7, HANGINGMAN8, DEADCACO, DEADPLAYER, DEADTROOPER, DEADDEMON, + DEADLOSTSOUL, DEADIMP, DEADSERGEANT, SLOP, SLOP2, SKULLPOLE1, BLOODPOOL1, + SKULLPOLE2, SKULLPILE, DEADCORPSE1, TWITCHCORPSE3, TREE, BURNINGBARREL, + HANGINGMAN9, HANGINGMAN10, HANGINGMAN11, HANGINGMAN12, HANGINGMAN13, HANGINGMAN14, BLOODPOOL2, BLOODPOOL3, BLOODPOOL4, PUSH, PULL, - - Armor, Berserk, BFG, Chaingun, Chainsaw, Fullmap, Map, Plasma, Rocket, + + Armor, Berserk, BFG, Chaingun, Chainsaw, Fullmap, Map, Plasma, Rocket, Shotgun, SuperShotgun, Health, Ammo, Keys, Weapons } - + functions { Abs = "value"; ACos = "value"; - AmbientSound = "name"; + AmbientSound = "name"; ASin = "value"; ATan = "value"; - Beep; - Break; - CeilHeight = "tag_number, [set_height], [crush]"; - CeilingHeight = "tag_number, [set_height], [crush]"; - CeilingTexture = "tag_number, [set_tex]"; - CeilText = "tag_number, [set_tex]"; + Beep; + Break; + CeilHeight = "tag_number, [set_height], [crush]"; + CeilingHeight = "tag_number, [set_height], [crush]"; + CeilingTexture = "tag_number, [set_tex]"; + CeilText = "tag_number, [set_tex]"; ChangeHubLevel; - ChangeMusic = "name"; - ChangeTag = "tag_num, new_tag"; - CheckCVar = "cvar"; - CheckInventory = "player_num, item"; - ClearCamera; - Clock; - CloseDoor = "tag_num, [speed]"; - Colormap = "tag_num, color"; - Continue; + ChangeMusic = "name"; + ChangeTag = "tag_num, new_tag"; + CheckCVar = "cvar"; + CheckInventory = "player_num, item"; + ClearCamera; + Clock; + CloseDoor = "tag_num, [speed]"; + Colormap = "tag_num, color"; + Continue; Cos = "value"; CreatePic = "texture, xpos, ypos"; - DamageObj = "[target], amount"; - DeleteHUPic = "handle"; + DamageObj = "[target], amount"; + DeleteHUPic = "handle"; ExitLevel; ExitSecret; Exp = "value"; - FadeLight = "tag_num, level, [speed]"; + FadeLight = "tag_num, level, [speed]"; FixedValue = "value"; Floor = "value"; - FloorHeight = "tag_number, [set_height], [crush]"; - FloorText = "tag_number, [set_tex]"; - FloorTexture = "tag_number, [set_tex]"; - Gamemode; - Gameskill; - GiveInventory = "player, item, [count]"; - Goto = "label"; - HealObj = "[target], amount"; - Include = "lumpname"; - Input; + FloorHeight = "tag_number, [set_height], [crush]"; + FloorText = "tag_number, [set_tex]"; + FloorTexture = "tag_number, [set_tex]"; + Gamemode; + Gameskill; + GiveInventory = "player, item, [count]"; + Goto = "label"; + HealObj = "[target], amount"; + Include = "lumpname"; + Input; IntValue = "value"; - IsObjPlayer = "[object]"; - IsPlayerObj = "[object]"; - Kill = "[target]"; - KillInSector = "tag"; - KillObj = "[target]"; - LevelNum; - LightLevel = "tag_number, [set_level]"; - LineAttack = "shooter, angle, damage"; - LineFlag = "linenum, flag, [set]"; - LineTrigger = "type, [tag]"; + IsObjPlayer = "[object]"; + IsPlayerObj = "[object]"; + Kill = "[target]"; + KillInSector = "tag"; + KillObj = "[target]"; + LevelNum; + LightLevel = "tag_number, [set_level]"; + LineAttack = "shooter, angle, damage"; + LineFlag = "linenum, flag, [set]"; + LineTrigger = "type, [tag]"; Log = "value"; - Ls = "special, [arg0], [arg1], [arg2], [arg3], [arg4]"; - MapThingNumExist = "number"; - MapThings; + Ls = "special, [arg0], [arg1], [arg2], [arg3], [arg4]"; + MapThingNumExist = "number"; + MapThings; Max = "value1, value2"; - MaxPlayerAmmo = "player, int/ammo_type, [value]"; - Message = "text"; + MaxPlayerAmmo = "player, int/ammo_type, [value]"; + Message = "text"; Min = "value1, value2"; - MobjHeight = "target, [value]"; - MobjMomx = "target, [value]"; + MobjHeight = "target, [value]"; + MobjMomx = "target, [value]"; MobjMomy = "target, [value]"; MobjMomz = "target, [value]"; - MobjRadius = "target, [value]"; - MobjTarget = "m1, [m2]"; + MobjRadius = "target, [value]"; + MobjTarget = "m1, [m2]"; MobjValue = "value"; - ModifyHUPic = "handle, texture, xpos, ypos"; - ModifyPic = "handle, texture, xpos, ypos"; + ModifyHUPic = "handle, texture, xpos, ypos"; + ModifyPic = "handle, texture, xpos, ypos"; MoveCamera = "camera, targetobj, targetheight, movespeed, targetangle, anglespeed"; MoveCeil = "tag_num, dest_height, [speed], [crush], [silent]"; MoveCeiling = "tag_num, dest_height, [speed], [crush], [silent]"; @@ -130,15 +130,15 @@ fragglescript : cstyle { ObjDead = "[target]"; ObjFlag = "[target], flag_num, [set]"; ObjHealth = "[target]"; - ObjHeight = "target, [value]"; - ObjMomx = "target, [value]"; + ObjHeight = "target, [value]"; + ObjMomx = "target, [value]"; ObjMomy = "target, [value]"; ObjMomz = "target, [value]"; - ObjRadius = "target, [value]"; - ObjReactionTime = "target, [duration]"; + ObjRadius = "target, [value]"; + ObjReactionTime = "target, [duration]"; ObjSector = "[target]"; ObjState = "[target], state_code"; - ObjTarget = "m1, [m2]"; + ObjTarget = "m1, [m2]"; ObjType = "[target]"; ObjX = "[target]"; ObjY = "[target]"; @@ -161,56 +161,56 @@ fragglescript : cstyle { PointToDist = "x1, y1, x2, y2"; Pow = "value, power"; Print = "message"; - PRnd; - PushObj = "target, angle, force"; - PushThing = "target, angle, force"; - RadiusAttack = "spot, source, damage"; - ReactionTime = "target, [duration]"; - RemoveObj = "target"; - Resurrect = "target"; - Return; - Rnd; - RunCommand = "command"; - ScriptRunning = "script_num"; - ScriptWait = "script_num"; - ScriptWaitPre = "script_num"; - SectorColormap = "tag_num, color"; - SectorType = "tag_num, [new_type]"; - SetCamera = "target, [angle], [height], [pitch]"; + PRnd; + PushObj = "target, angle, force"; + PushThing = "target, angle, force"; + RadiusAttack = "spot, source, damage"; + ReactionTime = "target, [duration]"; + RemoveObj = "target"; + Resurrect = "target"; + Return; + Rnd; + RunCommand = "command"; + ScriptRunning = "script_num"; + ScriptWait = "script_num"; + ScriptWaitPre = "script_num"; + SectorColormap = "tag_num, color"; + SectorType = "tag_num, [new_type]"; + SetCamera = "target, [angle], [height], [pitch]"; SetColor = "tag_num, color", "tag_num, r, g, b"; - SetCorona = "corona_num, whattochange, float value"; - SetHUPicDisplay = "handle, visible"; - SetLineBlocking = "num_tag, blocking"; - SetLineMnBlock = "num_tag, blocking"; - SetLineMonsterBlocking = "num_tag, blocking"; - SetLineTexture = "tag, side, position, texture", "tag, texture, side, sections"; - SetLineTrigger = "tag, type"; - SetObjPosition = "target, x, [y], [z]"; - SetPicVisible = "handle, visible"; - SetWeapon = "player, weapon"; - SilentTeleport = "[target], tag"; + SetCorona = "corona_num, whattochange, float value"; + SetHUPicDisplay = "handle, visible"; + SetLineBlocking = "num_tag, blocking"; + SetLineMnBlock = "num_tag, blocking"; + SetLineMonsterBlocking = "num_tag, blocking"; + SetLineTexture = "tag, side, position, texture", "tag, texture, side, sections"; + SetLineTrigger = "tag, type"; + SetObjPosition = "target, x, [y], [z]"; + SetPicVisible = "handle, visible"; + SetWeapon = "player, weapon"; + SilentTeleport = "[target], tag"; Sin = "value"; - SkinColor = "player, [color]"; - Spawn = "type, x, y, [angle], [z], [bool zrel]"; - SpawnExplosion = "type, x, y, [z]"; - SpawnMissile = "source, dest, type"; - SpawnShot2 = "type, source, [zofs]"; + SkinColor = "player, [color]"; + Spawn = "type, x, y, [angle], [z], [bool zrel]"; + SpawnExplosion = "type, x, y, [z]"; + SpawnMissile = "source, dest, type"; + SpawnShot2 = "type, source, [zofs]"; Sqrt = "value"; StartAmbiantSound = "name"; // Legacy can't spell - StartScript = "script_num"; - StartSectorSound = "tag_num, sound"; - StartSkill = "skill_level"; - StartSound = "source, sound"; + StartScript = "script_num"; + StartSectorSound = "tag_num, sound"; + StartSkill = "skill_level"; + StartSound = "source, sound"; StringValue = "value"; - TagWait = "tag_num"; - TakeInventory = "player, item, [amount]"; + TagWait = "tag_num"; + TakeInventory = "player, item, [amount]"; Tan = "value"; - Teleport = "[target], tag"; - TestLocation = "[target]"; - ThingCount = "type"; - TimedTip = "duration, message"; - Tip = "message"; - Wait = "duration"; - WallGlow; + Teleport = "[target], tag"; + TestLocation = "[target]"; + ThingCount = "type"; + TimedTip = "duration, message"; + Tip = "message"; + Wait = "duration"; + WallGlow; } } diff --git a/dist/res/config/languages/sladescript.txt b/dist/res/config/languages/sladescript.txt index ff0636665..562f4587d 100644 --- a/dist/res/config/languages/sladescript.txt +++ b/dist/res/config/languages/sladescript.txt @@ -149,12 +149,12 @@ sladescript : lua MapEditor.ClearSelection; MapEditor.Select = "MapObject object, [boolean add]"; MapEditor.SetEditMode = "integer mode, [integer sectorMode]"; - + // MapLine type boolean MapLine.Flag = "string flagName"; MapLine.Flip = "[boolean swapSides]"; table MapLine.VisibleTextures; - + // MapObject type boolean MapObject.HasProperty = "string name"; boolean MapObject.BoolProperty = "string name"; @@ -165,14 +165,14 @@ sladescript : lua MapObject.SetIntProperty = "string name, integer value"; MapObject.SetFloatProperty = "string name, float value"; MapObject.SetStringProperty = "string name, string value"; - + // MapSector type boolean MapSector.ContainsPoint = "Point position"; // MapThing type boolean MapThing.Flag = "string flagName"; MapThing.SetAnglePoint = "Point position"; - + // Plane type float Plane.HeightAt = "Point position"; @@ -241,7 +241,7 @@ sladescript : lua Palette.Shift = "float amount, integer firstIndex, integer lastIndex"; Palette.Invert = "integer firstIndex, integer lastIndex"; Palette.Gradient = "Colour startColour, Colour endColour, integer firstIndex, integer lastIndex"; - + // Translation type string Translation.AsText; Translation.Clear; @@ -260,7 +260,7 @@ sladescript : lua Translation.ReadTable = "string data"; Translation.RemoveRange = "integer index"; Translation.SwapRanges = "integer index1, integer index2"; - + // TransRange type string TransRange.AsText; TransRangePalette TransRange.AsPaletteRange; @@ -321,7 +321,7 @@ sladescript : lua "float, float, float" Colour.AsLAB; string Colour.AsString = "integer format"; Colour.FromHSL = "float hue, float saturation, float lightness"; - + // DataBlock type string DataBlock.AsString; DataBlock.SetData = "string data"; diff --git a/dist/res/config/languages/umapinfo.txt b/dist/res/config/languages/umapinfo.txt index b6d4f66f6..45fa08446 100644 --- a/dist/res/config/languages/umapinfo.txt +++ b/dist/res/config/languages/umapinfo.txt @@ -4,7 +4,7 @@ umapinfo case_sensitive = false; blocks = "map"; - keywords = + keywords = { map, true, false, clear, levelname, label, author, levelpic, next, nextsecret, skytexture, music, exitpic, enterpic, partime, endgame, endpic, endbunny, endcast, nointermission, intertext, intertextsecret, interbackdrop, @@ -30,7 +30,7 @@ umapinfo HangNoGuts, HangBNoBrain, HangTLookingDown, HangTSkull, HangTLookingUp, HangTNoBrain, ColonGibs, SmallBloodPool, BrainStem, PointPusher, PointPuller, MBFHelperDog, PlasmaBall1, PlasmaBall2, EvilSceptre, UnholyBible, MusicChanger - + // Deh_Actor_145 ... Deh_Actor_249 } } diff --git a/dist/res/config/languages/zdoom.txt b/dist/res/config/languages/zdoom.txt index b7ad3e616..8ee1becbd 100644 --- a/dist/res/config/languages/zdoom.txt +++ b/dist/res/config/languages/zdoom.txt @@ -36,7 +36,7 @@ z_cvarinfo { // Types bool, color, float, int, string } - + constants = { //Boolean values TRUE, FALSE @@ -58,8 +58,8 @@ z_decaldef { keywords = { pic, shade, x, scale, y, scale, flipx, flipy, randomflipx, randomflipy, solid, translucent, add, fuzzy, fullbright, lowerdecal, colors, animator, decal, - decalgroup, generator, stretcher, GoalX, GoalY, StretchStart, StretchTime, - fader, DecayStart, DecayTime, Combiner, slider, DistX, DistY, SlideStart, + decalgroup, generator, stretcher, GoalX, GoalY, StretchStart, StretchTime, + fader, DecayStart, DecayTime, Combiner, slider, DistX, DistY, SlideStart, SlideTime, colorchanger, FadeStart, FadeTime, Color, optional } } @@ -99,7 +99,7 @@ z_gldefs { keyword_link = "http://zdoom.org/wiki/GLDEFS"; constant_link = "http://zdoom.org/wiki/GLDEFS"; function_link = "http://zdoom.org/wiki/GLDEFS"; - blocks = "pointlight", "pulselight", "flickerlight", "flickerlight2", "sectorlight", + blocks = "pointlight", "pulselight", "flickerlight", "flickerlight2", "sectorlight", "object", "detail", "skybox", "brightmap", "glow", "hardwareshader"; keywords = { @@ -119,7 +119,7 @@ z_iwadinfo { name = "ZDoom IWAD Info"; case_sensitive = false; - + keywords = { IWad, Order, Names @@ -157,8 +157,8 @@ z_language { blocks = "default"; keywords = { - default, csy, dan, de, dea, des, deu, ell, en, ena, enc, eng, eni, enu, enz, esm, - esn, esp, eti, fin, fr, fra, frb, frc, frs, hun, isl, ita, its, nlb, nld, non, nor, + default, csy, dan, de, dea, des, deu, ell, en, ena, enc, eng, eni, enu, enz, esm, + esn, esp, eti, fin, fr, fra, frb, frc, frs, hun, isl, ita, its, nlb, nld, non, nor, plk, ptb, ptg, rus, sky, sv, trk } } @@ -204,15 +204,15 @@ z_mapinfo { clear, delete, fps, function, sound, soundid, video, // Cluster - Cluster, ClusterDef, EnterText, ExitText, ExitTextIsLump, Music, Flat, Pic, Hub, + Cluster, ClusterDef, EnterText, ExitText, ExitTextIsLump, Music, Flat, Pic, Hub, AllowIntermission, entertextislump, gameover, intro, outro, - + // Episode ClearEpisodes, Episode, Name, PicName, Key, Remove, NoSkillMenu, Optional, Extended, teaser, intro, - + // Map - Map, DefaultMap, AddDefaultMap, GameDefaults, + Map, DefaultMap, AddDefaultMap, GameDefaults, ActivateOwnDeathSpecials, AirControl, AirSupply, AllowCrouch, AllowFreelook, AllowJump, AllowMonsterTelefrags, AllowRespawn, AutoSequences, BaronSpecial, BorderTexture, CDId, CDTrack, CheckSwitchRange, ClipMidTextures, @@ -221,16 +221,16 @@ z_mapinfo { FadeTable, FallingDamage, FilterStarts, ForceNoSkyStretch, ForgetState, Gravity, Grinding_Polyobj, HorizWallShade, InfiniteFlightPowerup, InterMusic, IronlichSpecial, KeepFullInventory, LaxMonsterActivation, - LevelNum, Lightning, Map07Special, MapBackground, MinotaurSpecial, + LevelNum, Lightning, Map07Special, MapBackground, MinotaurSpecial, MissilesActivateImpactLines, MissileShootersActivateImpactLines, - MonsterFallingDamage, Music, Next, No_Grinding_Polyobj, NoAllies, - NoAutosaveHint, NoAutoSequences, NoCheckSwitchRange, NoCrouch, + MonsterFallingDamage, Music, Next, No_Grinding_Polyobj, NoAllies, + NoAutosaveHint, NoAutoSequences, NoCheckSwitchRange, NoCrouch, NoFallingDamage, NoFreelook, NoInfighting, NoIntermission, NoInventoryBar, - NoJump, NormalInfighting, NoSoundClipping, OldFallingDamage, - ForceFallingDamage, OutsideFog, Par, PrecacheSounds, RandomPlayerStarts, + NoJump, NormalInfighting, NoSoundClipping, OldFallingDamage, + ForceFallingDamage, OutsideFog, Par, PrecacheSounds, RandomPlayerStarts, Redirect, RememberState, ResetHealth, ResetInventory, Secret, SecretNext, Sky1, Sky2, Skybox, SkyStretch, Slideshow, SmoothLighting, - SpawnWithWeaponRaised, SpecialAction, SpecialAction_ExitLevel, + SpawnWithWeaponRaised, SpecialAction, SpecialAction_ExitLevel, SpecialAction_OpenDoor, SpecialAction_LowerFloor, SpecialAction_KillMonsters, SpiderMastermindSpecial, StrictMonsterActivation, StrifeFallingDamage, SuckTime, TeamDamage, TeamPlayOff, TeamPlayOn, TitlePatch, TotalInfighting, @@ -326,12 +326,12 @@ z_menudef { constant_link = "http://zdoom.org/wiki/MENUDEF"; function_link = "http://zdoom.org/wiki/MENUDEF"; blocks = "listmenu", "addlistmenu", "optionmenu", addoptionmenu, "optionvalue", "optionstring"; - - keywords = { - ListMenu, AddListMenu, OptionMenu, AddOptionMenu, OptionValue, OptionString, - DefaultListMenu, DefaultOptionMenu, OptionMenuSettings, - Font, Linespacing, LabelOffset, PlayerDisplay, Position, Selector, StaticText, - StaticTextSwitchable, ScrollTop, SafeCommand, ColorPicker, Class, ScreenResolution, + + keywords = { + ListMenu, AddListMenu, OptionMenu, AddOptionMenu, OptionValue, OptionString, + DefaultListMenu, DefaultOptionMenu, OptionMenuSettings, + Font, Linespacing, LabelOffset, PlayerDisplay, Position, Selector, StaticText, + StaticTextSwitchable, ScrollTop, SafeCommand, ColorPicker, Class, ScreenResolution, StaticPatch, Control, Option, Slider, PatchItem, TextItem, Submenu, Command, NetgameMessage, StaticPatchCentered, StaticTextCentered, MouseWindow, CenterMenu, Title, PlayerNameBox, ValueText, MapControl, Else, TextField, NumberField, @@ -341,12 +341,12 @@ z_menudef { PlayerSkinItem, PlayerGenderItem, AutoaimSlider, PlayerSwitchOnPickupItem, Indent, LabeledSubMenu, SliderReverbEditOption, ReverbOption, ReverbSelect } - + functions { ifgame = "game, [...]"; ifoption = "option, [...]"; } - - constants = { + + constants = { doom, heretic, hexen, strife, chex, readthis, swapmenu, windows, unix, mac, - openal, swrender, mmx, LoadMenu, SaveMenu, PlayerMenu, JoystickConfigMenu, + openal, swrender, mmx, LoadMenu, SaveMenu, PlayerMenu, JoystickConfigMenu, GameplayMenu, CompatibilityMenu, VideoModeMenu, } } @@ -361,7 +361,7 @@ z_modeldef { keywords = { MODEL, PATH, SKIN, SCALE, FRAME, FRAMEINDEX, - Rotation-Speed, Rotation-Vector, Rotation-Center, + Rotation-Speed, Rotation-Vector, Rotation-Center, Offset, AngleOffset, PitchOffset, RollOffset, ZOffset, SurfaceSkin, Animation, BaseFrame } @@ -569,7 +569,7 @@ z_textures { } constants = { - Inverse, Gold, Red, Green, Ice, Desaturate, Copy, Translucent, + Inverse, Gold, Red, Green, Ice, Desaturate, Copy, Translucent, Add, Subtract, ReverseSubtract, Modulate, CopyAlpha, Overlay, CopyNewAlpha } @@ -598,13 +598,13 @@ z_xlat { P_SLOW, P_NORMAL, P_FAST, P_TURBO, F_SLOW, F_NORMAL, F_FAST, F_TURBO, VDOORWAIT, PLATWAIT, DORATE, ELEVATORSPEED, SCROLL_UNIT, CEILWAIT, - + Init_Gravity, Init_Color, Init_Damage, Init_TransferSky } functions { unsupported; - + ACS_Execute = "int script, [int mapnum], [int s_arg1], [int s_arg2], [int s_arg3]"; ACS_ExecuteAlways = "int script, [int mapnum], [int arg1], [int arg2], [int arg3]"; ACS_ExecuteWithResult = "int script, [int s_arg1], [int s_arg2], [int s_arg3]"; @@ -646,7 +646,7 @@ z_xlat { Door_CloseWaitOpen = "int tag, int speed, int delay, [int lighttag]"; Door_LockedRaise = "int tag, int speed, int delay, int lock, [int lighttag]"; Door_Open = "int tag, int speed, [int lighttag]"; - Door_Raise = "int tag, int speed, int delay, [int lighttag]"; + Door_Raise = "int tag, int speed, int delay, [int lighttag]"; Elevator_LowerToNearest = "int tag, int speed"; Elevator_MoveToFloor = "int tag, int speed"; Elevator_RaiseToNearest = "int tag, int speed"; diff --git a/dist/res/config/languages/zscript.txt b/dist/res/config/languages/zscript.txt index 64d230250..806283321 100644 --- a/dist/res/config/languages/zscript.txt +++ b/dist/res/config/languages/zscript.txt @@ -82,7 +82,7 @@ zscript bMISSILE, bDROPPED, bSHADOW, bNOBLOOD, bCORPSE, bINFLOAT, bCOUNTKILL, bCOUNTITEM, bSKULLFLY, bNOTDMATCH, bSPAWNSOUNDSOURCE, bFRIENDLY, bNOLIFTDROP, bSTEALTH, bICECORPSE, - + // MF2 bDONTREFLECT, bWINDTHRUST, bDONTSEEKINVISIBLE, bBLASTED, bFLOORCLIP, bSPAWNFLOAT, bNOTELEPORT, bRIPPER, bPUSHABLE, bSLIDESONWALLS, bCANPASS, bCANNOTPUSH, bTHRUGHOST, @@ -153,7 +153,7 @@ zscript bBOUNCEAUTOOFF, bBOUNCELIKEHERETIC, bCANBOUNCEWATER, bNOWALLBOUNCESND, bNOBOUNCESOUND, bBOUNCEONACTORS, bEXPLODEONWATER, bMBFBOUNCER, bBOUNCEAUTOOFFFLOORONLY, bUSEBOUNCESTATE, bDONTBOUNCEONSHOOTABLES, bBOUNCEONUNRIPPABLES, bDONTBOUNCEONSKY, - + // Misc bNOSAVEGAME } @@ -168,7 +168,7 @@ zscript MISSILE, DROPPED, SHADOW, NOBLOOD, CORPSE, INFLOAT, COUNTKILL, COUNTITEM, SKULLFLY, NOTDMATCH, SPAWNSOUNDSOURCE, FRIENDLY, NOLIFTDROP, STEALTH, ICECORPSE, - + // MF2 DONTREFLECT, WINDTHRUST, DONTSEEKINVISIBLE, BLASTED, FLOORCLIP, SPAWNFLOAT, NOTELEPORT, RIPPER, PUSHABLE, SLIDESONWALLS, CANPASS, CANNOTPUSH, THRUGHOST, @@ -239,7 +239,7 @@ zscript BOUNCEAUTOOFF, BOUNCELIKEHERETIC, CANBOUNCEWATER, NOWALLBOUNCESND, NOBOUNCESOUND, BOUNCEONACTORS, EXPLODEONWATER, MBFBOUNCER, BOUNCEAUTOOFFFLOORONLY, USEBOUNCESTATE, DONTBOUNCEONSHOOTABLES, BOUNCEONUNRIPPABLES, DONTBOUNCEONSKY, - + // Misc NOSAVEGAME } diff --git a/dist/res/config/nodebuilders.cfg b/dist/res/config/nodebuilders.cfg index e68795e5b..cb78368fc 100644 --- a/dist/res/config/nodebuilders.cfg +++ b/dist/res/config/nodebuilders.cfg @@ -6,7 +6,7 @@ nodebuilders name = "ZDBSP"; command = "$o $f --output=$f"; executable = "zdbsp"; - + option "--no-prune" = "Don't remove unused sidedefs or sectors"; option "--gl" = "Build GL nodes (full)"; option "--gl-matching" = "Build GL nodes (fast)"; @@ -20,25 +20,25 @@ nodebuilders option "--extended" = "Extended nodes"; option "--comments" = "Add UDMF index comments"; } - + zennode { name = "ZenNode"; command = "$o $f -o $f"; executable = "ZenNode"; - + option "-rz" = "Don't build REJECT"; option "-n3" = "Fast node build"; option "-ni" = "Ignore invisible lines"; option "-n2 -nu -rf -bc" = "Vanilla Optimized"; } - + glbsp { name = "GLBSP"; command = "$o $f -o $f"; executable = "glbsp"; - + option "-fast" = "Fast node build"; option "-normal" = "Force normal node rebuild"; option "-pack" = "Pack duplicate sidedefs"; @@ -49,13 +49,13 @@ nodebuilders option "-nonormal" = "Don't build normal nodes"; option "-noprune" = "Don't prune lines or sides"; } - + bsp { name = "BSP"; command = "$o $f -o $f"; executable = "bsp*"; - + option "-picknode visplane" = "Minimize visplanes"; option "-noreject" = "Don't build REJECT"; option "-blockmap comp" = "Compressed BLOCKMAP"; diff --git a/dist/res/config/ports/boom.cfg b/dist/res/config/ports/boom.cfg index cda37fa33..0d46cc99c 100644 --- a/dist/res/config/ports/boom.cfg +++ b/dist/res/config/ports/boom.cfg @@ -4,17 +4,17 @@ port boom { name = "Boom"; - + // Supported games games = doom, doom2, chex1; - + // Supported map formats map_formats = doom; - + // Enable boom extensions boom = true; boom_sector_flag_start = 32; - + // Light levels light_level_interval = 16; } diff --git a/dist/res/config/ports/boom_mbf.cfg b/dist/res/config/ports/boom_mbf.cfg index 4ab577688..df41f416a 100644 --- a/dist/res/config/ports/boom_mbf.cfg +++ b/dist/res/config/ports/boom_mbf.cfg @@ -4,17 +4,17 @@ port boom_mbf { name = "Boom + MBF"; - + // Supported games games = doom, doom2, chex1; - + // Supported map formats map_formats = doom; - + // Enable boom extensions boom = true; boom_sector_flag_start = 32; - + // Light levels light_level_interval = 16; } diff --git a/dist/res/config/ports/boom_mbf21.cfg b/dist/res/config/ports/boom_mbf21.cfg index f7f2ffa1f..5976e27d3 100644 --- a/dist/res/config/ports/boom_mbf21.cfg +++ b/dist/res/config/ports/boom_mbf21.cfg @@ -4,17 +4,17 @@ port boom_mbf21 { name = "Boom + MBF21"; - + // Supported games games = doom, doom2, chex1; - + // Supported map formats map_formats = doom; - + // Enable boom extensions boom = true; boom_sector_flag_start = 32; - + // Light levels light_level_interval = 16; diff --git a/dist/res/config/ports/edge_classic.cfg b/dist/res/config/ports/edge_classic.cfg index fc4adc1e9..b97f98971 100644 --- a/dist/res/config/ports/edge_classic.cfg +++ b/dist/res/config/ports/edge_classic.cfg @@ -13,13 +13,13 @@ port edge_classic { name = "EDGE-Classic"; - + // Supported games games = doom, doom2, heretic, chex1; - + // Supported map formats map_formats = doom, udmf; - + #ifdef MAP_DOOM // Enable boom extensions in Doom-format maps boom = true; @@ -37,16 +37,16 @@ port edge_classic // Enable long names long_names = true; - + // Enable mixed textures and flats mix_tex_flats = true; - + // Enable TX_ namespace tx_textures = true; - + // Light levels light_level_interval = 8; - + // UDMF namespace udmf_namespace = "edge-classic"; diff --git a/dist/res/config/ports/eternity.cfg b/dist/res/config/ports/eternity.cfg index caa5b4735..0af9dc918 100644 --- a/dist/res/config/ports/eternity.cfg +++ b/dist/res/config/ports/eternity.cfg @@ -12,13 +12,13 @@ port eternity { name = "Eternity"; - + // Supported games games = doom, doom2, chex1; - + // Supported map formats map_formats = doom, udmf; - + #ifdef MAP_DOOM // Enable boom extensions boom = true; @@ -31,10 +31,10 @@ port eternity // Valid map names map_name_any = true; - + // Enable mixed textures and flats mix_tex_flats = true; - + // Enable TX_ namespace tx_textures = true; diff --git a/dist/res/config/ports/include/flags_boom.cfg b/dist/res/config/ports/include/flags_boom.cfg index 38c262681..4d7d1e786 100644 --- a/dist/res/config/ports/include/flags_boom.cfg +++ b/dist/res/config/ports/include/flags_boom.cfg @@ -7,37 +7,37 @@ thing_flags value = 1; udmf = "skill1", "skill2"; } - + flag "Medium Skill" { value = 2; udmf = "skill3"; } - + flag "Hard Skill" { value = 4; udmf = "skill4", "skill5"; } - + flag "Ambush" { value = 8; udmf = "ambush"; } - + flag "Multiplayer Only" { value = 16; udmf = "!single"; } - + flag "Not in DM" { value = 32; udmf = "!dm"; } - + flag "Not in Coop" { value = 64; @@ -52,55 +52,55 @@ line_flags value = 1; udmf = "blocking"; } - + flag "Blocks Monsters" { value = 2; udmf = "blockmonsters"; } - + flags "Two Sided" { value = 4; udmf = "twosided"; } - + flag "Upper Unpegged" { value = 8; udmf = "dontpegtop"; } - + flag "Lower Unpegged" { value = 16; udmf = "dontpegbottom"; } - + flag "Secret" { value = 32; udmf = "secret"; } - + flag "Blocks Sound" { value = 64; udmf = "blocksound"; } - + flag "Not On Map" { value = 128; udmf = "dontdraw"; } - + flag "Starts On Map" { value = 256; udmf = "mapped"; } - + flag "Pass Use" { value = 512; diff --git a/dist/res/config/ports/include/flags_edge_classic.cfg b/dist/res/config/ports/include/flags_edge_classic.cfg index 55a245cc3..069442749 100644 --- a/dist/res/config/ports/include/flags_edge_classic.cfg +++ b/dist/res/config/ports/include/flags_edge_classic.cfg @@ -6,43 +6,43 @@ thing_flags value = 1; udmf = "skill1", "skill2"; } - + flag "Medium Skill" { value = 2; udmf = "skill3"; } - + flag "Hard Skill" { value = 4; udmf = "skill4", "skill5"; } - + flag "Ambush" { value = 8; udmf = "ambush"; } - + flag "Multiplayer Only" { value = 16; udmf = "!single", "dm", "coop"; } - + flag "Not in DM" { value = 32; udmf = "!dm"; } - + flag "Not in Coop" { value = 64; udmf = "!coop"; } - + flag "Friendly" { value = 128; @@ -57,55 +57,55 @@ line_flags value = 1; udmf = "blocking"; } - + flag "Blocks Monsters" { value = 2; udmf = "blockmonsters"; } - + flags "Two Sided" { value = 4; udmf = "twosided"; } - + flag "Upper Unpegged" { value = 8; udmf = "dontpegtop"; } - + flag "Lower Unpegged" { value = 16; udmf = "dontpegbottom"; } - + flag "Secret" { value = 32; udmf = "secret"; } - + flag "Blocks Sound" { value = 64; udmf = "blocksound"; } - + flag "Not On Map" { value = 128; udmf = "dontdraw"; } - + flag "Starts On Map" { value = 256; udmf = "mapped"; } - + flag "Pass Use" { value = 512; @@ -116,7 +116,7 @@ line_flags { value = 4096; } - + flag "Block Players" { value = 8192; diff --git a/dist/res/config/ports/include/flags_eternity.cfg b/dist/res/config/ports/include/flags_eternity.cfg index 3a8980c22..957393144 100644 --- a/dist/res/config/ports/include/flags_eternity.cfg +++ b/dist/res/config/ports/include/flags_eternity.cfg @@ -6,49 +6,49 @@ thing_flags value = 1; udmf = "skill1", "skill2"; } - + flag "Medium Skill" { value = 2; udmf = "skill3"; } - + flag "Hard Skill" { value = 4; udmf = "skill4", "skill5"; } - + flag "Ambush" { value = 8; udmf = "ambush"; } - + flag "Multiplayer Only" { value = 16; udmf = "!single"; } - + flag "Not in DM" { value = 32; udmf = "!dm"; } - + flag "Not in Coop" { value = 64; udmf = "!coop"; } - + flag "Friendly" { value = 128; udmf = "friend"; } - + flag "Dormant" { value = 512; @@ -63,61 +63,61 @@ line_flags value = 1; udmf = "blocking"; } - + flag "Blocks Monsters" { value = 2; udmf = "blockmonsters"; } - + flags "Two Sided" { value = 4; udmf = "twosided"; } - + flag "Upper Unpegged" { value = 8; udmf = "dontpegtop"; } - + flag "Lower Unpegged" { value = 16; udmf = "dontpegbottom"; } - + flag "Secret" { value = 32; udmf = "secret"; } - + flag "Blocks Sound" { value = 64; udmf = "blocksound"; } - + flag "Not On Map" { value = 128; udmf = "dontdraw"; } - + flag "Starts On Map" { value = 256; udmf = "mapped"; } - + flag "Pass Use" { value = 512; udmf = "passuse"; } - + flag "3D Middle Texture" { value = 1024; diff --git a/dist/res/config/ports/include/flags_mbf.cfg b/dist/res/config/ports/include/flags_mbf.cfg index 926db4477..a57f66e57 100644 --- a/dist/res/config/ports/include/flags_mbf.cfg +++ b/dist/res/config/ports/include/flags_mbf.cfg @@ -7,43 +7,43 @@ thing_flags value = 1; udmf = "skill1", "skill2"; } - + flag "Medium Skill" { value = 2; udmf = "skill3"; } - + flag "Hard Skill" { value = 4; udmf = "skill4", "skill5"; } - + flag "Ambush" { value = 8; udmf = "ambush"; } - + flag "Multiplayer Only" { value = 16; udmf = "!single", "dm", "coop"; } - + flag "Not in DM" { value = 32; udmf = "!dm"; } - + flag "Not in Coop" { value = 64; udmf = "!coop"; } - + flag "Friendly" { value = 128; @@ -58,55 +58,55 @@ line_flags value = 1; udmf = "blocking"; } - + flag "Blocks Monsters" { value = 2; udmf = "blockmonsters"; } - + flags "Two Sided" { value = 4; udmf = "twosided"; } - + flag "Upper Unpegged" { value = 8; udmf = "dontpegtop"; } - + flag "Lower Unpegged" { value = 16; udmf = "dontpegbottom"; } - + flag "Secret" { value = 32; udmf = "secret"; } - + flag "Blocks Sound" { value = 64; udmf = "blocksound"; } - + flag "Not On Map" { value = 128; udmf = "dontdraw"; } - + flag "Starts On Map" { value = 256; udmf = "mapped"; } - + flag "Pass Use" { value = 512; diff --git a/dist/res/config/ports/include/flags_mbf21.cfg b/dist/res/config/ports/include/flags_mbf21.cfg index 4236a0074..abb3f950a 100644 --- a/dist/res/config/ports/include/flags_mbf21.cfg +++ b/dist/res/config/ports/include/flags_mbf21.cfg @@ -1,12 +1,12 @@ #ifdef MAP_DOOM line_flags -{ +{ flag "Block Land Monsters" { value = 4096; } - + flag "Block Players" { value = 8192; diff --git a/dist/res/config/ports/include/flags_zdoom.cfg b/dist/res/config/ports/include/flags_zdoom.cfg index c8d468a84..7951cc98f 100644 --- a/dist/res/config/ports/include/flags_zdoom.cfg +++ b/dist/res/config/ports/include/flags_zdoom.cfg @@ -7,19 +7,19 @@ thing_flags value = 1; udmf = "skill1", "skill2"; } - + flag "Medium Skill" { value = 2; udmf = "skill3"; } - + flag "Hard Skill" { value = 4; udmf = "skill4", "skill5"; } - + flag "Ambush" { value = 8; @@ -31,73 +31,73 @@ thing_flags value = 16; udmf = "dormant"; } - + flag "Fighter" { value = 32; udmf = "class1"; } - + flag "Cleric" { value = 64; udmf = "class2"; } - + flag "Mage" { value = 128; udmf = "class3"; } - + flag "Single Player" { value = 256; udmf = "single"; } - + flag "Coop" { value = 512; udmf = "coop"; } - + flag "Deathmatch" { value = 1024; udmf = "dm"; } - + flag "Translucent" { value = 2048; udmf = "translucent"; } - + flag "Invisible" { value = 4096; udmf = "invisible"; } - + flag "Ally" { value = 8192; udmf = "strifeally"; } - + flag "Stand Still" { value = 16384; udmf = "standing"; } - + flag "Count as Secret" { value = 524288; udmf = "countsecret"; } - + flag "Does Not Count" { value = 2097152; @@ -112,75 +112,75 @@ line_flags value = 1; udmf = "blocking"; } - + flag "Blocks Monsters" { value = 2; udmf = "blockmonsters"; } - + flags "Two Sided" { value = 4; udmf = "twosided"; } - + flag "Upper Unpegged" { value = 8; udmf = "dontpegtop"; } - + flag "Lower Unpegged" { value = 16; udmf = "dontpegbottom"; } - + flag "Secret" { value = 32; udmf = "secret"; } - + flag "Blocks Sound" { value = 64; udmf = "blocksound"; } - + flag "Not On Map" { value = 128; udmf = "dontdraw"; } - + flag "Starts On Map" { value = 256; udmf = "mapped"; } - + flag "Repeatable" { value = 512; udmf = "repeatspecial"; activation = true; } - + flag "Monsters Activate" { value = 8192; udmf = "monsteractivate"; activation = true; } - + flag "Block Players" { value = 16384; udmf = "blockplayers"; } - + flag "Block Everything" { value = 32768; @@ -195,37 +195,37 @@ line_triggers value = 0; udmf = "playercross"; } - + trigger "Player Use" { value = 1; udmf = "playeruse"; } - + trigger "Monster Cross" { value = 2; udmf = "monstercross"; } - + trigger "Attack Hit" { value = 3; udmf = "impact"; } - + trigger "Player Bump" { value = 4; udmf = "playerpush"; } - + trigger "Missile Cross" { value = 5; udmf = "missilecross"; } - + trigger "Player Use Thru" { value = 6; @@ -241,43 +241,43 @@ thing_flags value = 1; udmf = "skill1", "skill2"; } - + flag "Medium Skill" { value = 2; udmf = "skill3"; } - + flag "Hard Skill" { value = 4; udmf = "skill4", "skill5"; } - + flag "Ambush" { value = 8; udmf = "ambush"; } - + flag "Multiplayer Only" { value = 16; udmf = "!single", "dm", "coop"; } - + flag "Not in DM" { value = 32; udmf = "!dm"; } - + flag "Not in Coop" { value = 64; udmf = "!coop"; } - + flag "Friendly" { value = 128; @@ -292,63 +292,63 @@ line_flags value = 1; udmf = "blocking"; } - + flag "Blocks Monsters" { value = 2; udmf = "blockmonsters"; } - + flags "Two Sided" { value = 4; udmf = "twosided"; } - + flag "Upper Unpegged" { value = 8; udmf = "dontpegtop"; } - + flag "Lower Unpegged" { value = 16; udmf = "dontpegbottom"; } - + flag "Secret" { value = 32; udmf = "secret"; } - + flag "Blocks Sound" { value = 64; udmf = "blocksound"; } - + flag "Not On Map" { value = 128; udmf = "dontdraw"; } - + flag "Starts On Map" { value = 256; udmf = "mapped"; } -#ifdef GAME_STRIFE +#ifdef GAME_STRIFE flag "Railing" { value = 512; udmf = "jumpover"; } #endif // GAME_STRIFE -#ifndef GAME_STRIFE +#ifndef GAME_STRIFE flag "Pass Use" { value = 512; diff --git a/dist/res/config/ports/include/props_edge_classic.cfg b/dist/res/config/ports/include/props_edge_classic.cfg index 4c081ff1c..1e13d07eb 100644 --- a/dist/res/config/ports/include/props_edge_classic.cfg +++ b/dist/res/config/ports/include/props_edge_classic.cfg @@ -122,7 +122,7 @@ udmf_properties default = 0; } } - + group "EDGE-Classic Misc" { show_always = false; @@ -141,7 +141,7 @@ udmf_properties group "Advanced" { show_always = false; - + property scale { name = "Scale"; @@ -161,11 +161,11 @@ udmf_properties default = 1.0; } } - + group "Appearance" { show_always = false; - + property alpha { name = "Alpha"; @@ -173,11 +173,11 @@ udmf_properties default = 1.0; } } - + group "Miscellaneous" { show_always = false; - + property health { name = "Health Multiplier"; diff --git a/dist/res/config/ports/include/props_eternity.cfg b/dist/res/config/ports/include/props_eternity.cfg index 450a7696f..c4ba38a09 100644 --- a/dist/res/config/ports/include/props_eternity.cfg +++ b/dist/res/config/ports/include/props_eternity.cfg @@ -384,7 +384,7 @@ udmf_properties name = "Ceiling Portal ID"; type = int; default = 0; - } + } property alphafloor { @@ -523,7 +523,7 @@ udmf_properties property arg3 = "Arg 3"; property arg4 = "Arg 4"; } - + group "Flags" { type = bool; @@ -567,7 +567,7 @@ udmf_properties //property class15 = "Class 15"; //property class16 = "Class 16"; } - + group "Scripting Special" { type = actionspecial; @@ -582,7 +582,7 @@ udmf_properties default = ""; }*/ } - + /*group "Conversations" { show_always = false; diff --git a/dist/res/config/ports/include/props_zdoom.cfg b/dist/res/config/ports/include/props_zdoom.cfg index 1437cc8d0..d6ea4e233 100644 --- a/dist/res/config/ports/include/props_zdoom.cfg +++ b/dist/res/config/ports/include/props_zdoom.cfg @@ -125,7 +125,7 @@ udmf_properties default = false; } } - + group "Special" { property locknumber @@ -538,7 +538,7 @@ udmf_properties type = bool; default = false; } - + property portal_ceil_disabled { name = "Ceiling Portal Disabled"; @@ -574,7 +574,7 @@ udmf_properties type = bool; default = false; } - + property portal_floor_disabled { name = "Floor Portal Disabled"; @@ -888,7 +888,7 @@ udmf_properties group "Advanced" { show_always = false; - + property pitch { name = "Pitch"; @@ -932,7 +932,7 @@ udmf_properties property arg3 = "Arg 3"; property arg4 = "Arg 4"; } - + group "Flags" { type = bool; @@ -980,7 +980,7 @@ udmf_properties property class15 = "Class 15"; property class16 = "Class 16"; } - + group "Scripting" { type = actionspecial; @@ -1004,25 +1004,25 @@ udmf_properties property conversation = "Conversation ID"; } - + group "Appearance" { show_always = false; - + property alpha { name = "Alpha"; type = float; default = 1.0; } - + property fillcolor { name = "Fill Color"; type = colour; default = 0x000000; } - + property renderstyle { name = "Render Style"; @@ -1031,13 +1031,13 @@ udmf_properties default = ""; } } - + group "Miscellaneous" { show_always = false; type = int; default = 0; - + property floatbobphase = "Bobbing Phase"; property gravity { diff --git a/dist/res/config/ports/include/specials_boom.cfg b/dist/res/config/ports/include/specials_boom.cfg index 83c151c80..43f700968 100644 --- a/dist/res/config/ports/include/specials_boom.cfg +++ b/dist/res/config/ports/include/specials_boom.cfg @@ -6,7 +6,7 @@ action_specials group "Floor Changers" { tagged = sector; - + special 189 = "S1 Change Floor Tex & Effect (Trigger Model)"; special 190 = "SR Change Floor Tex & Effect (Trigger Model)"; special 153 = "W1 Change Floor Tex & Effect (Trigger Model)"; @@ -16,59 +16,62 @@ action_specials special 239 = "W1 Change Floor Tex & Effect (Numeric Model)"; special 240 = "WR Change Floor Tex & Effect (Numeric Model)"; } - + group "Misc" { group "Untagged" { tagged = no; - + special 85 = "-- Scrolling Wall (Right)"; } - + group "Line-tagged" { tagged = line; - + special 260 = "-- Translucent Line"; } } - - group "Floor Down" - { - tagged = sector; - - special 159 = "S1 Floor To Lowest Adjacent Floor"; - special 177 = "SR Floor To Lowest Adjacent Floor"; - - special 222 = "SR Floor Down To Adjacent Floor"; - special 221 = "S1 Floor Down To Adjacent Floor"; - special 220 = "WR Floor Down To Adjacent Floor"; - special 219 = "W1 Floor Down To Adjacent Floor"; - } - - group "Floor Up" + + group "Floors" { - tagged = sector; - - special 178 = "SR Floor Up 512"; - special 142 = "W1 Floor Up 512"; - special 147 = "WR Floor Up 512"; - special 158 = "S1 Floor Up By Shortest Lo Tex"; - special 176 = "SR Floor Up By Shortest Lo Tex"; - special 160 = "S1 Floor Up 24 Change Tex & Effect"; - special 179 = "SR Floor Up 24 Change Tex & Effect"; - special 161 = "S1 Floor Up 24"; - special 180 = "SR Floor Up 24"; - special 191 = "SR Floor Donut Raise"; - special 146 = "W1 Floor Donut Raise"; - special 155 = "WR Floor Donut Raise"; + group "Move Down" + { + tagged = sector; + + special 159 = "S1 Floor To Lowest Adjacent Floor"; + special 177 = "SR Floor To Lowest Adjacent Floor"; + + special 222 = "SR Floor Down To Adjacent Floor"; + special 221 = "S1 Floor Down To Adjacent Floor"; + special 220 = "WR Floor Down To Adjacent Floor"; + special 219 = "W1 Floor Down To Adjacent Floor"; + } + + group "Move Up" + { + tagged = sector; + + special 178 = "SR Floor Up 512"; + special 142 = "W1 Floor Up 512"; + special 147 = "WR Floor Up 512"; + special 158 = "S1 Floor Up By Shortest Lo Tex"; + special 176 = "SR Floor Up By Shortest Lo Tex"; + special 160 = "S1 Floor Up 24 Change Tex & Effect"; + special 179 = "SR Floor Up 24 Change Tex & Effect"; + special 161 = "S1 Floor Up 24"; + special 180 = "SR Floor Up 24"; + special 191 = "SR Floor Donut Raise"; + special 146 = "W1 Floor Donut Raise"; + special 155 = "WR Floor Donut Raise"; + } } - + group "Lifts" { tagged = sector; - + special 143 = "W1 Lift Up 24 Change Tex"; special 148 = "WR Lift Up 24 Change Tex"; special 144 = "W1 Lift Up 24 Remove Effect"; @@ -80,11 +83,11 @@ action_specials special 211 = "SR Toggle Floor To Ceiling (Instant)"; special 212 = "WR Toggle Floor To Ceiling (Instant)"; } - + group "Ceilings" { tagged = sector; - + special 145 = "W1 Ceil Down To Floor Fast"; special 152 = "WR Ceil Down To Floor Fast"; special 166 = "S1 Ceil Up To Highest Ceil"; @@ -101,11 +104,11 @@ action_specials special 200 = "W1 Ceil Down To Highest Floor"; special 202 = "WR Ceil Down To Highest Floor"; } - + group "Crushers" { tagged = sector; - + special 184 = "SR Start Crusher"; special 165 = "S1 Start Crusher Silent"; special 185 = "SR Start Crusher Silent"; @@ -115,11 +118,11 @@ action_specials special 168 = "S1 Stop Crusher"; special 188 = "SR Stop Crusher"; } - + group "Light Effects" { tagged = sector; - + special 172 = "S1 Light Start Blinking"; special 193 = "SR Light Start Blinking"; special 156 = "WR Light Start Blinking"; @@ -131,49 +134,52 @@ action_specials special 170 = "S1 Light To 35"; special 171 = "S1 Light To 255"; } - + group "Teleports" { group "Thing-based" { tagged = sector; - + special 195 = "SR Teleport"; special 174 = "S1 Teleport"; - + special 269 = "WR Teleport Monsters Only (Silent)"; special 268 = "W1 Teleport Monsters Only (Silent)"; - + special 210 = "SR Teleport Preserve Direction (Silent)"; special 209 = "S1 Teleport Preserve Direction (Silent)"; special 208 = "WR Teleport Preserve Direction (Silent)"; special 207 = "W1 Teleport Preserve Direction (Silent)"; } - + group "Line-based" { tagged = line; - + special 244 = "WR Teleport Line"; special 243 = "W1 Teleport Line"; special 263 = "WR Teleport Line (Reversed)"; special 262 = "W1 Teleport Line (Reversed)"; - + special 267 = "WR Teleport Line Monsters Only"; special 266 = "W1 Teleport Line Monsters Only"; special 265 = "WR Teleport Line Monsters Only (Reversed)"; special 264 = "W1 Teleport Line Monsters Only (Reversed)"; } } - - group "Remote Doors" + + group "Doors" { - tagged = sector; - - special 175 = "S1 Door Close + Open"; - special 196 = "SR Door Close + Open"; + group "Remote" + { + tagged = sector; + + special 175 = "S1 Door Close + Open"; + special 196 = "SR Door Close + Open"; + } } - + group "Stair Builders" { tagged = sector; @@ -183,11 +189,11 @@ action_specials special 259 = "SR Build Stairs 16 + Crush"; special 257 = "WR Build Stairs 16 + Crush"; } - + group "Elevators" { tagged = sector; - + special 229 = "S1 Elevator To Higher Floor"; special 230 = "SR Elevator To Higher Floor"; special 227 = "W1 Elevator To Higher Floor"; @@ -201,29 +207,29 @@ action_specials special 235 = "W1 Elevator To Current Floor"; special 236 = "WR Elevator To Current Floor"; } - + group "Exits" { tagged = no; - + special 197 = "G1 Exit (Normal)"; special 198 = "G1 Exit (Secret)"; } - + group "Transfers" { tagged = sector; - + special 213 = "-- Transfer Floor Light"; special 261 = "-- Transfer Ceiling Light"; special 242 = "-- Transfer Heights"; special 223 = "-- Set Friction To Length"; } - + group "Pushers" { tagged = sector; - + special 224 = "-- Set Wind"; special 225 = "-- Set Current"; special 226 = "-- Point Pusher"; @@ -233,7 +239,7 @@ action_specials group "Affecting sectors" { tagged = sector; - + special 214 = "-- Accel Tagged Ceiling w.r.t. 1st Side's Sector"; special 215 = "-- Accel Tagged Floor w.r.t. 1st Side's Sector"; special 216 = "-- Accel Objects on Tagged Floor wrt 1st Side's Sector"; @@ -251,7 +257,7 @@ action_specials group "Affecting lines" { tagged = line; - + special 218 = "-- Accel Tagged Wall w.r.t 1st Side's Sector"; special 249 = "-- Scroll Tagged Wall w.r.t 1st Side's Sector"; special 254 = "-- Scroll Tagged Wall, Same as Floor/Ceiling"; @@ -260,7 +266,7 @@ action_specials group "Affecting self" { tagged = no; - + special 255 = "-- Scroll Wall Using Sidedef Offsets"; } } diff --git a/dist/res/config/ports/include/specials_eternity.cfg b/dist/res/config/ports/include/specials_eternity.cfg index dd37daa22..adc46d468 100644 --- a/dist/res/config/ports/include/specials_eternity.cfg +++ b/dist/res/config/ports/include/specials_eternity.cfg @@ -27,7 +27,7 @@ action_specials special 281 = "-- 3DMidTex_MoveWithFloor"; special 282 = "-- 3DMidTex_MoveWithCeiling"; } - + group "Portals" { group "Plane Portals" @@ -46,7 +46,7 @@ action_specials special 291 = "-- Portal_SkyboxFloor"; special 292 = "-- Portal_SkyboxFloorCeiling"; } - + group "Anchored Portals" { special 295 = "-- Portal_AnchoredCeiling"; @@ -56,7 +56,7 @@ action_specials special 299 = "-- Portal_AnchorLineFloor"; special 385 = "-- Apply_PortalToFrontsector"; } - + group "Two-Way Portals" { special 344 = "-- Portal_TwowayCeiling"; @@ -64,7 +64,7 @@ action_specials special 346 = "-- Portal_TwowayAnchorLine"; special 347 = "-- Portal_TwowayAnchorLineFloor"; } - + group "Linked Portals" { special 358 = "-- Portal_LinkedCeiling"; @@ -75,13 +75,13 @@ action_specials special 377 = "-- Portal_LinkedLineToLineAnchor"; } } - + group "Transfers" { special 293 = "-- TransferHereticWind"; special 294 = "-- TransferHereticCurrent"; } - + group "Sectors" { group "Attached Sectors" @@ -93,7 +93,7 @@ action_specials special 383 = "-- Attach_MirrorFloorToControl"; special 384 = "-- Attach_MirrorCeilingToControl"; } - + group "Slopes" { special 386 = "-- Slope_FrontsectorFloor"; @@ -115,13 +115,13 @@ action_specials group "Untagged" { tagged = no; - + special 417 = "-- Scrolling Wall (Up)"; special 418 = "-- Scrolling Wall (Down)"; special 419 = "-- Scrolling Wall (Down, Fast)"; } } - + group "Parameterized" { special 300 = "Door_Raise"; @@ -379,6 +379,64 @@ action_specials 32 = "turbo"; } } + arg delay_tics + { + name = "Delay (tics)"; + type = tics; + } + arg delay_octics + { + name = "Delay (octics)"; + type = octics; + } + arg delay_tics_door + { + name = "Delay (tics)"; + type = tics; + custom_values + { + 35 = "brief"; + 150 = "normal - standard Doom door"; + 300 = "slow"; + 1050 = "agonizing"; + } + } + arg delay_octics_door + { + name = "Delay (octics)"; + type = octics; + custom_values + { + 8 = "brief"; + 34 = "normal - standard Doom door (approx.)"; + 69 = "slow (approx.)"; + 240 = "agonizing"; + } + } + arg delay_tics_lift + { + name = "Delay (tics)"; + type = tics; + custom_values + { + 35 = "brief"; + 105 = "normal - standard Doom lift"; + 165 = "slow"; + 350 = "agonizing"; + } + } + arg delay_octics_lift + { + name = "Delay (octics)"; + type = octics; + custom_values + { + 8 = "brief"; + 24 = "normal - standard Doom lift"; + 38 = "slow (approx.)"; + 80 = "agonizing"; + } + } arg crush_mode { name = "Crush mode"; @@ -994,7 +1052,7 @@ action_specials 3 = "Close door"; } } - arg4 = "Delay"; + arg4 = $delay_octics_door; arg5 = "Lock"; }*/ special 12 @@ -1002,7 +1060,7 @@ action_specials name = "Door_Raise"; arg1 = "Sector Tag"; arg2 = $door_speed; - arg3 = "Delay"; + arg3 = $delay_tics_door; arg4 = "Light Tag"; } special 105 @@ -1010,7 +1068,7 @@ action_specials name = "Door_WaitRaise"; arg1 = "Sector Tag"; arg2 = $door_speed; - arg3 = "Delay"; + arg3 = $delay_tics_door; arg4 = "Wait Time"; arg5 = "Light Tag"; } @@ -1019,7 +1077,7 @@ action_specials name = "Door_LockedRaise"; arg1 = "Sector Tag"; arg2 = $door_speed; - arg3 = "Delay"; + arg3 = $delay_tics_door; arg4 = "Lock"; arg5 = "Light Tag"; } @@ -1050,7 +1108,7 @@ action_specials name = "Door_CloseWaitOpen"; arg1 = "Sector Tag"; arg2 = $door_speed; - arg3 = "Delay"; + arg3 = $delay_octics_door; arg4 = "Light Tag"; } /*special 14 @@ -1058,7 +1116,7 @@ action_specials name = "Door_Animated"; arg1 = "Sector Tag"; arg2 = $door_speed; - arg3 = "Delay"; + arg3 = $delay_tics_door; arg4 = "Lock"; }*/ } @@ -1072,10 +1130,7 @@ action_specials name = "Generic_Lift"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 { - name = "Delay (in octics)"; - desc = "Doom default is 24 octics (3 seconds)"; - } + arg3 = $delay_octics_lift; arg4 { name = "Lift Type"; type = choice; @@ -1094,14 +1149,14 @@ action_specials name = "Plat_DownWaitUpStay"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 = "Delay (in tics)"; + arg3 = $delay_tics_lift; } special 206 { name = "Plat_DownWaitUpStayLip"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 = "Delay (in tics)"; + arg3 = $delay_tics_lift; arg4 = "Lip"; arg5 { name = "Sound type"; @@ -1117,7 +1172,7 @@ action_specials name = "Plat_DownByValue"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 = "Delay (in tics)"; + arg3 = $delay_tics_lift; arg4 = "Eighth of Value"; } special 64 @@ -1125,21 +1180,21 @@ action_specials name = "Plat_UpWaitDownStay"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 = "Delay (in tics)"; + arg3 = $delay_tics_lift; } /*special 172 { name = "Plat_UpNearestWaitDownStay"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 = "Delay (in tics)"; + arg3 = $delay_tics_lift; }*/ special 65 { name = "Plat_UpByValue"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 = "Delay (in tics)"; + arg3 = $delay_tics_lift; arg4 = "Eighth of Value"; } special 230 @@ -1169,14 +1224,14 @@ action_specials name = "Plat_PerpetualRaise"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 = "Delay (in tics)"; + arg3 = $delay_tics_lift; } special 207 { name = "Plat_PerpetualRaiseLip"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 = "Delay (in tics)"; + arg3 = $delay_tics_lift; arg4 = "Lip"; } special 231 @@ -2459,7 +2514,7 @@ action_specials arg1 = "PolyObject ID"; arg2 = "Speed"; arg3 = "Byte Angle"; - arg4 = "Close Delay"; + arg4 = $delay_tics_door; } special 8 { @@ -2468,7 +2523,7 @@ action_specials arg2 = $polyobj_speed; arg3 = "Byte Angle"; arg4 = "Distance"; - arg5 = "Close Delay"; + arg5 = $delay_tics_door; } /*special 86 { diff --git a/dist/res/config/ports/include/specials_mbf.cfg b/dist/res/config/ports/include/specials_mbf.cfg index 0c977bcd9..af4e2456c 100644 --- a/dist/res/config/ports/include/specials_mbf.cfg +++ b/dist/res/config/ports/include/specials_mbf.cfg @@ -6,7 +6,7 @@ action_specials group "Transfers" { tagged = sector; - + special 271 = "-- Transfer Sky Texture"; special 272 = "-- Transfer Sky Texture (Flipped)"; } diff --git a/dist/res/config/ports/include/specials_mbf21.cfg b/dist/res/config/ports/include/specials_mbf21.cfg index 7668589bb..a6c0e2ac3 100644 --- a/dist/res/config/ports/include/specials_mbf21.cfg +++ b/dist/res/config/ports/include/specials_mbf21.cfg @@ -8,7 +8,7 @@ action_specials group "Affecting lines" { tagged = line; - + special 1024 = "-- Scroll Wall w/ Offsets, Share w/ Similar Tag (Standard)"; special 1025 = "-- Scroll Wall w/ Offsets, Share w/ Similar Tag (Displacement)"; special 1026 = "-- Scroll Wall w/ Offsets, Share w/ Similar Tag (Accelerative)"; diff --git a/dist/res/config/ports/include/specials_zdoom.cfg b/dist/res/config/ports/include/specials_zdoom.cfg index 5899eae8e..1ab6ba9d9 100644 --- a/dist/res/config/ports/include/specials_zdoom.cfg +++ b/dist/res/config/ports/include/specials_zdoom.cfg @@ -92,6 +92,64 @@ action_specials 32 = "turbo"; } } + arg delay_octics + { + name = "Delay (octics)"; + type = octics; + } + arg delay_tics + { + name = "Delay (tics)"; + type = tics; + } + arg delay_octics_door + { + name = "Delay (octics)"; + type = octics; + custom_values + { + 8 = "brief"; + 34 = "normal - standard Doom door (approx.)"; + 69 = "slow (approx.)"; + 240 = "agonizing"; + } + } + arg delay_tics_door + { + name = "Delay (tics)"; + type = tics; + custom_values + { + 35 = "brief"; + 150 = "normal - standard Doom door"; + 300 = "slow"; + 1050 = "agonizing"; + } + } + arg delay_octics_lift + { + name = "Delay (octics)"; + type = octics; + custom_values + { + 8 = "brief"; + 24 = "normal - standard Doom lift"; + 38 = "slow (approx.)"; + 80 = "agonizing"; + } + } + arg delay_tics_lift + { + name = "Delay (tics)"; + type = tics; + custom_values + { + 35 = "brief"; + 105 = "normal - standard Doom lift"; + 165 = "slow"; + 350 = "agonizing"; + } + } arg crush_mode { name = "Crush mode"; @@ -593,7 +651,7 @@ action_specials 3 = "Close door"; } } - arg4 = "Delay"; + arg4 = $delay_octics_door; arg5 = "Lock"; } special 12 @@ -601,7 +659,7 @@ action_specials name = "Door_Raise"; arg1 = "Sector Tag"; arg2 = $door_speed; - arg3 = "Delay"; + arg3 = $delay_tics_door; arg4 = "Light Tag"; } special 13 @@ -609,7 +667,7 @@ action_specials name = "Door_LockedRaise"; arg1 = "Sector Tag"; arg2 = $door_speed; - arg3 = "Delay"; + arg3 = $delay_tics_door; arg4 = "Lock"; arg5 = "Light Tag"; } @@ -632,7 +690,7 @@ action_specials name = "Door_CloseWaitOpen"; arg1 = "Sector Tag"; arg2 = $door_speed; - arg3 = "Delay"; + arg3 = $delay_octics_door; arg4 = "Light Tag"; } special 14 @@ -640,7 +698,7 @@ action_specials name = "Door_Animated"; arg1 = "Sector Tag"; arg2 = $door_speed; - arg3 = "Delay"; + arg3 = $delay_tics_door; arg4 = "Lock"; } } @@ -654,10 +712,7 @@ action_specials name = "Generic_Lift"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 { - name = "Delay (in octics)"; - desc = "Doom default is 24 octics (3 seconds)"; - } + arg3 = $delay_octics_lift; arg4 { name = "Lift Type"; type = choice; @@ -676,14 +731,14 @@ action_specials name = "Plat_DownWaitUpStay"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 = "Delay (in tics)"; + arg3 = $delay_tics_lift; } special 206 { name = "Plat_DownWaitUpStayLip"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 = "Delay (in tics)"; + arg3 = $delay_tics_lift; arg4 = "Lip"; arg5 { name = "Sound type"; @@ -699,7 +754,7 @@ action_specials name = "Plat_DownByValue"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 = "Delay (in tics)"; + arg3 = $delay_tics_lift; arg4 = "Eighth of Value"; } special 64 @@ -707,21 +762,21 @@ action_specials name = "Plat_UpWaitDownStay"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 = "Delay (in tics)"; + arg3 = $delay_tics_lift; } special 172 { name = "Plat_UpNearestWaitDownStay"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 = "Delay (in tics)"; + arg3 = $delay_tics_lift; } special 65 { name = "Plat_UpByValue"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 = "Delay (in tics)"; + arg3 = $delay_tics_lift; arg4 = "Eighth of Value"; } special 230 @@ -742,14 +797,14 @@ action_specials name = "Plat_PerpetualRaise"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 = "Delay (in tics)"; + arg3 = $delay_tics_lift; } special 207 { name = "Plat_PerpetualRaiseLip"; arg1 = "Sector Tag"; arg2 = $lift_speed; - arg3 = "Delay (in tics)"; + arg3 = $delay_tics_lift; arg4 = "Lip"; } special 231 @@ -2026,7 +2081,7 @@ action_specials arg1 = "PolyObject ID"; arg2 = "Speed"; arg3 = "Byte Angle"; - arg4 = "Close Delay"; + arg4 = $delay_tics_door; } special 8 { @@ -2035,7 +2090,7 @@ action_specials arg2 = $polyobj_speed; arg3 = "Byte Angle"; arg4 = "Distance"; - arg5 = "Close Delay"; + arg5 = $delay_tics_door; } special 86 { @@ -2403,7 +2458,7 @@ action_specials group "Scripting" { tagged = no; - + special 273 = "WR FS_Execute"; special 274 = "W1 FS_Execute"; special 275 = "W1 FS_Execute (Frontside only)"; @@ -2415,14 +2470,14 @@ action_specials group "Renderer" { tagged = no; - + special 336 = "-- Line Mirror"; special 337 = "-- Line Horizon"; } group "Transfers" { tagged = sector; - + special 280 = "-- Transfer Heights (swimmable)"; special 350 = "-- Transfer_Heights (only fake the floor)"; special 351 = "-- Transfer_Heights (fake and clip only the floor)"; @@ -2430,7 +2485,7 @@ action_specials group "3D Floors" { tagged = sector; - + special 281 = "-- 3D Floor (solid, opaque)"; special 289 = "-- 3D Floor (solid, opaque, no light effects)"; special 300 = "-- 3D Floor (solid, 50% translucent, no light effects)"; @@ -2458,7 +2513,7 @@ action_specials group "Sector Effects" { tagged = sectors; - + special 282 = "-- Set Sector Light & Fog", "Set colors from RRGGBB hex values as front side textures: upper for light, lower for fog."; special 333 = "-- Set Gravity from Length of Line"; special 334 = "-- Set Sector Light & Fog", "Set colors from RRGGBB hex values as front side textures: upper for light, lower for fog."; @@ -2467,7 +2522,7 @@ action_specials group "Wagglers" { tagged = sectors; - + special 338 = "W1 Floor_Waggle (amplitude 24)"; special 339 = "W1 Floor_Waggle (amplitude 12)"; } @@ -2483,7 +2538,7 @@ action_specials group "Affecting lines" { tagged = no; - + special 48 = "-- Scroll Texture Left"; special 422 = "-- Scroll Texture Right"; special 423 = "-- Scroll Texture Up"; @@ -2497,7 +2552,7 @@ action_specials group "Translucent Lines" { tagged = lines; - + special 284 = "-- Translucent Line (50% opaque)"; special 285 = "-- Translucent Line (75% opaque)"; special 286 = "-- Translucent Line (25% opaque)"; @@ -2511,7 +2566,7 @@ action_specials group "Slopes" { tagged = sector_and_back; - + special 340 = "-- Slope front floor"; special 341 = "-- Slope front ceiling"; special 342 = "-- Slope front floor and ceiling"; @@ -2538,7 +2593,7 @@ action_specials group "Autosave" { tagged = no; - + special 348 = "W1 Autosave"; special 349 = "S1 Autosave"; } diff --git a/dist/res/config/ports/include/things_boom.cfg b/dist/res/config/ports/include/things_boom.cfg index fe46683e0..966a4e6be 100644 --- a/dist/res/config/ports/include/things_boom.cfg +++ b/dist/res/config/ports/include/things_boom.cfg @@ -7,8 +7,8 @@ thing_types { // Group defaults colour = { 120, 120, 200 } - - + + thing 5001 { name = "Point Pusher"; diff --git a/dist/res/config/ports/include/things_eternity.cfg b/dist/res/config/ports/include/things_eternity.cfg index 9df650a21..ed7aa8a18 100644 --- a/dist/res/config/ports/include/things_eternity.cfg +++ b/dist/res/config/ports/include/things_eternity.cfg @@ -21,7 +21,7 @@ thing_types // Defaults icon = "camera"; shrink = true; - + thing 5003 = "Demo Camera Spot"; thing 5006 = "Skybox Camera"; @@ -55,7 +55,7 @@ thing_types radius = 16; sprite = "EEBSA?"; } - + group "Doom Copies" { thing 6304 @@ -224,7 +224,7 @@ thing_types // Group defaults angle = false; colour = { 100, 100, 200 } - + group "Doom Copies" { thing 6211 @@ -286,7 +286,7 @@ thing_types radius = 20; angle = false; icon = "weapon"; - + group "Doom Copies" { thing 6205 { name = "Chainsaw"; sprite = "CSAWA?"; } @@ -376,7 +376,7 @@ thing_types radius = 16; angle = false; icon = "powerup"; - + group "Doom Copies" { thing 6224 { name = "Partial Invisibility Sphere"; sprite = "PINSB?"; } @@ -407,7 +407,7 @@ thing_types thing 6039 { name = "Yellow Skull Key"; colour = { 255, 255, 0 } sprite = "YSKUA?"; radius = 14; } } } - + group "Gore" { // Group defaults @@ -419,7 +419,7 @@ thing_types { // Group defaults colour = { 90, 0, 0 } - + group "Doom Copies" { thing 6015 { name = "Dead Player"; sprite = "PLAYN?"; } @@ -531,7 +531,7 @@ thing_types angle = false; decoration = true; solid = true; - + group "Tech" { group "Doom Copies" @@ -540,7 +540,7 @@ thing_types thing 6235 { name = "Barrel"; sprite = "BAR1A?"; } } } - + group "Hell" { group "Doom Copies" @@ -554,7 +554,7 @@ thing_types thing 6041 { name = "Evil Eye"; sprite = "CEYEA?"; fullbright = true; } } } - + group "Plants" { group "Doom Copies" @@ -575,7 +575,7 @@ thing_types thing 9001 = "Map Spot"; thing 9013 = "Map Spot With Gravity"; } - + group "Miscellaneous" { // Defaults @@ -594,14 +594,14 @@ thing_types sprite = "EERVA?"; } } - + group "Particle Effects" { // Group defaults angle = false; icon = "particle"; shrink = true; - + thing 5007 { name = "Particle Drip"; @@ -628,7 +628,7 @@ thing_types angle = false; icon = "sound"; shrink = true; - + group "Environmental Sound Sequence" { thing 1200 = "Environment Sequence (0)"; diff --git a/dist/res/config/ports/include/things_zdoom.cfg b/dist/res/config/ports/include/things_zdoom.cfg index 138b44619..8512b06ae 100644 --- a/dist/res/config/ports/include/things_zdoom.cfg +++ b/dist/res/config/ports/include/things_zdoom.cfg @@ -113,7 +113,7 @@ thing_types colour = { 200, 200, 200 } shrink = true; angle = false; - + thing 9840 { name = "Spot Light"; @@ -250,7 +250,7 @@ thing_types // Defaults icon = "path"; shrink = true; - + thing 9046 { name = "Secret Trigger"; @@ -268,7 +268,7 @@ thing_types } zeth = 11; } - + thing 9047 = "Patrol Special"; thing 9071 { @@ -546,7 +546,7 @@ thing_types { // Group defaults zeth = 38; - + thing 9982 = "Eyes Go Above Ceiling"; thing 9983 = "Eyes Go Below Ceiling"; thing 9989 = "Actor Hits Fake Floor"; @@ -585,7 +585,7 @@ thing_types { // Group defaults zeth = 28; - + thing 1400 = "Sound Sequence (0)"; thing 1401 = "Sound Sequence (1)"; thing 1402 = "Sound Sequence (2)"; @@ -786,9 +786,9 @@ thing_types sprite = "SKULA1"; } } - - - + + + // Doom-specific things #ifdef GAME_DOOM group "Teleports" @@ -796,7 +796,7 @@ thing_types thing 9043 { name = "Teleport Destination Gravity"; sprite = "TFOGA?"; } thing 9044 { name = "Teleport Destination No Gravity"; sprite = "TFOGA?"; } } - + group "Player Starts" { // Group defaults @@ -808,7 +808,7 @@ thing_types thing 4003 { name = "Player 7 Start"; sprite = "PLAYC1"; translation = "doom5"; player_coop; } thing 4004 { name = "Player 8 Start"; sprite = "PLAYD1"; translation = "doom6"; player_coop; } } - + group "Scripted Marines" { // Group defaults @@ -828,14 +828,14 @@ thing_types thing 9110 { name = "Railgun Marine"; sprite = "PLAYF2F8"; } thing 9111 { name = "BFG9000 Marine"; sprite = "PLAYF2F8"; } } - + group "Team Multiplayer" { // Group defaults colour = { 0, 255, 0 } radius = 16; height = 56; - + thing 5080 { name = "Team #1 Start (Blue)"; @@ -844,7 +844,7 @@ thing_types colour = {0, 0, 255} player_team; } - + thing 5081 { name = "Team #2 Start (Red)"; @@ -862,7 +862,7 @@ thing_types colour = {0, 255, 0} player_team; } - + thing 5084 { name = "Team #4 Start (Gold)"; @@ -871,7 +871,7 @@ thing_types colour = {255, 255, 0} player_team; } - + thing 5130 { name = "Team #1 Flag (Blue)"; @@ -880,7 +880,7 @@ thing_types radius = 20; height = 16; } - + thing 5131 { name = "Team #2 Flag (Red)"; @@ -889,7 +889,7 @@ thing_types radius = 20; height = 16; } - + thing 5133 { name = "Team #3 Flag (Green)"; @@ -898,7 +898,7 @@ thing_types radius = 20; height = 16; } - + thing 5134 { name = "Team #4 Flag (Gold)"; @@ -907,7 +907,7 @@ thing_types radius = 20; height = 16; } - + thing 5132 { name = "Single Flag (White)"; @@ -922,7 +922,7 @@ thing_types { thing 5010 { name = "Pistol"; sprite = "PISTA?"; } } - + group "Decorations" { group "Rocks" @@ -941,7 +941,7 @@ thing_types { // Group defaults colour = { 200, 0, 0 } - + group "Stealth Monsters" { translation = "0:255=%[0.00,0.00,0.00]:[1.31,0.84,0.84]"; @@ -1042,7 +1042,7 @@ thing_types thing 9043 { name = "Teleport Destination Gravity"; sprite = "TELEA?"; } thing 9044 { name = "Teleport Destination No Gravity"; sprite = "TELEA?"; } } - + group "Player Starts" { // Group defaults @@ -1055,14 +1055,14 @@ thing_types thing 4004 { name = "Player 8 Start"; sprite = "PLAYD?"; player_coop; } } - + group "Team Multiplayer" { // Group defaults colour = { 0, 255, 0 } radius = 16; height = 56; - + thing 5080 { name = "Team #1 Start (Blue)"; @@ -1070,7 +1070,7 @@ thing_types translation = "225:240=%[0.00,0.00,0.00]:[0.00,0.00,2.00]"; colour = {0, 0, 255} } - + thing 5081 { name = "Team #2 Start (Red)"; @@ -1086,7 +1086,7 @@ thing_types translation = "225:240=%[0.00,0.00,0.00]:[0.00,2.00,0.00]"; colour = {0, 255, 0} } - + thing 5084 { name = "Team #4 Start (Gold)"; @@ -1094,7 +1094,7 @@ thing_types translation = "225:240=%[0.00,0.00,0.00]:[2.00,2.00,0.00]"; colour = {255, 255, 0} } - + thing 5130 { name = "Team #1 Flag (Blue)"; @@ -1103,7 +1103,7 @@ thing_types radius = 20; height = 16; } - + thing 5131 { name = "Team #2 Flag (Red)"; @@ -1112,7 +1112,7 @@ thing_types radius = 20; height = 16; } - + thing 5133 { name = "Team #3 Flag (Green)"; @@ -1121,7 +1121,7 @@ thing_types radius = 20; height = 16; } - + thing 5134 { name = "Team #4 Flag (Gold)"; @@ -1130,7 +1130,7 @@ thing_types radius = 20; height = 16; } - + thing 5132 { name = "Single Flag (White)"; @@ -1160,7 +1160,7 @@ thing_types thing 9043 { name = "Teleport Destination Gravity"; sprite = "TELEA?"; } thing 9044 { name = "Teleport Destination No Gravity"; sprite = "TELEA?"; } } - + group "Scripted Objects" { thing 112 { name = "Little Fly"; sprite = "AFLYA?"; } diff --git a/dist/res/config/ports/zdoom.cfg b/dist/res/config/ports/zdoom.cfg index 0afa01b7c..4aae9c5bc 100644 --- a/dist/res/config/ports/zdoom.cfg +++ b/dist/res/config/ports/zdoom.cfg @@ -16,13 +16,13 @@ port zdoom { name = "ZDoom"; - + // Supported games games = doom, doom2, heretic, hexen, strife, chex1, chex3, ad2; - + // Supported map formats map_formats = doom, hexen, udmf; - + #ifdef MAP_DOOM // Enable boom extensions in Doom-format maps boom = true; @@ -40,19 +40,19 @@ port zdoom // Enable long names long_names = true; - + // Enable mixed textures and flats mix_tex_flats = true; - + // Enable TX_ namespace tx_textures = true; - + // Scripting script_language = "acs_zdoom"; // Light levels light_level_interval = 8; - + // UDMF namespace udmf_namespace = "ZDoom"; diff --git a/src/Archive/ArchiveManager.cpp b/src/Archive/ArchiveManager.cpp index 9d0d5a873..b64cb49ae 100644 --- a/src/Archive/ArchiveManager.cpp +++ b/src/Archive/ArchiveManager.cpp @@ -38,6 +38,7 @@ #include "General/Console.h" #include "General/ResourceManager.h" #include "General/UI.h" +#include "MainEditor/MainEditor.h" #include "Utility/FileUtils.h" #include "Utility/StringUtils.h" @@ -911,7 +912,7 @@ bool ArchiveManager::openBaseResource(int index) return false; // Attempt to open the file - ui::showSplash(fmt::format("Opening {}...", filename), true); + ui::showSplash(fmt::format("Opening {}...", filename), true, maineditor::windowWx()); if (base_resource_archive_->open(filename)) { base_resource = index; diff --git a/src/Game/ActionSpecial.cpp b/src/Game/ActionSpecial.cpp index 7c33c1088..b4b8d7862 100644 --- a/src/Game/ActionSpecial.cpp +++ b/src/Game/ActionSpecial.cpp @@ -44,6 +44,8 @@ using namespace game; // Variables // // ----------------------------------------------------------------------------- +int ActionSpecial::next_order_ = 0; + ActionSpecial ActionSpecial::unknown_; ActionSpecial ActionSpecial::gen_switched_; ActionSpecial ActionSpecial::gen_manual_; @@ -60,6 +62,7 @@ ActionSpecial ActionSpecial::gen_manual_; // ActionSpecial class constructor // ----------------------------------------------------------------------------- ActionSpecial::ActionSpecial(string_view name, string_view group) : + order_{ next_order_++ }, name_{ name }, group_{ group }, tagged_{ TagType::None }, @@ -94,6 +97,8 @@ void ActionSpecial::reset() // ----------------------------------------------------------------------------- void ActionSpecial::parse(ParseTreeNode* node, Arg::SpecialMap* shared_args) { + order_ = next_order_++; + // Check for simple definition if (node->isLeaf()) { diff --git a/src/Game/ActionSpecial.h b/src/Game/ActionSpecial.h index b39cb1678..073d10771 100644 --- a/src/Game/ActionSpecial.h +++ b/src/Game/ActionSpecial.h @@ -15,6 +15,7 @@ namespace game public: ActionSpecial(string_view name = "Unknown", string_view group = ""); + int order() const { return order_; } const string& name() const { return name_; } const string& group() const { return group_; } TagType needsTag() const { return tagged_; } @@ -37,6 +38,9 @@ namespace game static void initGlobal(); private: + static int next_order_; + + int order_; string name_; string group_; TagType tagged_; diff --git a/src/Game/Args.cpp b/src/Game/Args.cpp index f42f6ce96..445870234 100644 --- a/src/Game/Args.cpp +++ b/src/Game/Args.cpp @@ -143,6 +143,12 @@ string Arg::valueString(int value) const return fmt::format("{} ({})", value, speed_label); } + case Tics: + return fmt::format("{:.2f} seconds", value / 35.0); + + case Octics: + return fmt::format("{:.2f} seconds", value / 8.0); + default: break; } @@ -237,6 +243,10 @@ void Arg::parse(ParseTreeNode* node, SpecialMap* shared_args) type = Flags; else if (strutil::equalCI(atype, "speed")) type = Speed; + else if (strutil::equalCI(atype, "tics")) + type = Tics; + else if (strutil::equalCI(atype, "octics")) + type = Octics; else type = Number; diff --git a/src/Game/Args.h b/src/Game/Args.h index b1c5420e6..9a8235360 100644 --- a/src/Game/Args.h +++ b/src/Game/Args.h @@ -23,6 +23,8 @@ namespace game Choice, Flags, Speed, + Tics, + Octics, }; typedef std::map SpecialMap; diff --git a/src/Game/Configuration.cpp b/src/Game/Configuration.cpp index 55b3f0030..c3caea9d7 100644 --- a/src/Game/Configuration.cpp +++ b/src/Game/Configuration.cpp @@ -1759,16 +1759,23 @@ UDMFProperty* Configuration::getUDMFProperty(const string& name, MapObject::Type { using Type = MapObject::Type; + UDMFPropMap* udmf_props = nullptr; + if (type == Type::Vertex) - return &udmf_vertex_props_[name]; + udmf_props = &udmf_vertex_props_; else if (type == Type::Line) - return &udmf_linedef_props_[name]; + udmf_props = &udmf_linedef_props_; else if (type == Type::Side) - return &udmf_sidedef_props_[name]; + udmf_props = &udmf_sidedef_props_; else if (type == Type::Sector) - return &udmf_sector_props_[name]; + udmf_props = &udmf_sector_props_; else if (type == Type::Thing) - return &udmf_thing_props_[name]; + udmf_props = &udmf_thing_props_; + else + return nullptr; + + if (udmf_props->count(name) == 1) + return &(*udmf_props)[name]; else return nullptr; } @@ -1791,6 +1798,26 @@ UDMFPropMap& Configuration::allUDMFProperties(MapObject::Type type) } } +// ----------------------------------------------------------------------------- +// Returns all defined UDMF properties for MapObject type [type], in the order +// they were defined in the configuration +// ----------------------------------------------------------------------------- +vector*> +Configuration::sortedUDMFProperties(MapObject::Type type) +{ + auto& all_props = allUDMFProperties(type); + vector*> sorted_props; + sorted_props.reserve(all_props.size()); + for (auto& prop : all_props) + { + sorted_props.push_back(&prop); + } + std::sort(sorted_props.begin(), sorted_props.end(), [](const auto& a, const auto& b) { + return a->second.order() < b->second.order(); + }); + return sorted_props; +} + // ----------------------------------------------------------------------------- // Removes any UDMF properties in [object] that have default values // (so they are not written to the UDMF map unnecessarily) diff --git a/src/Game/Configuration.h b/src/Game/Configuration.h index 0d230c8f0..8e959fb5a 100644 --- a/src/Game/Configuration.h +++ b/src/Game/Configuration.h @@ -167,6 +167,8 @@ namespace game // UDMF properties UDMFProperty* getUDMFProperty(const string& name, MapObject::Type type); UDMFPropMap& allUDMFProperties(MapObject::Type type); + vector*> + sortedUDMFProperties(MapObject::Type type); void cleanObjectUDMFProps(MapObject* object); // Sector types diff --git a/src/Game/Decorate.cpp b/src/Game/Decorate.cpp index 693af771b..379357cb4 100644 --- a/src/Game/Decorate.cpp +++ b/src/Game/Decorate.cpp @@ -268,9 +268,8 @@ void parseDecorateActor(Tokenizer& tz, std::map& types, vector> editor_properties; // Skip "native" keyword if present tz.advIfNextNC("native"); @@ -280,18 +279,18 @@ void parseDecorateActor(Tokenizer& tz, std::map& types, vector& types, vector& types, vector& types, vector& types, vector& types, vector& types, ve // Init tokenizer Tokenizer tz; tz.setSpecialCharacters(":,{}"); - tz.enableDecorate(true); tz.openMem(entry->data(), entry->name()); // --- Parse --- diff --git a/src/Game/UDMFProperty.cpp b/src/Game/UDMFProperty.cpp index f339b9962..1a615e851 100644 --- a/src/Game/UDMFProperty.cpp +++ b/src/Game/UDMFProperty.cpp @@ -37,6 +37,8 @@ using namespace slade; using namespace game; +int UDMFProperty::next_order_ = 0; + // ----------------------------------------------------------------------------- // diff --git a/src/Game/UDMFProperty.h b/src/Game/UDMFProperty.h index 3d64d210e..a6a8eeef1 100644 --- a/src/Game/UDMFProperty.h +++ b/src/Game/UDMFProperty.h @@ -28,9 +28,10 @@ namespace game Unknown }; - UDMFProperty() = default; + UDMFProperty() : order_(next_order_++) {} ~UDMFProperty() = default; + int order() const { return order_; } const string& propName() const { return property_; } const string& name() const { return name_; } const string& group() const { return group_; } @@ -53,6 +54,8 @@ namespace game string getStringRep(); private: + static int next_order_; + int order_; string property_; string name_; string group_; diff --git a/src/Game/ZScript.cpp b/src/Game/ZScript.cpp index 9e2d6cbe9..ef68e80d7 100644 --- a/src/Game/ZScript.cpp +++ b/src/Game/ZScript.cpp @@ -63,7 +63,9 @@ bool dump_parsed_blocks = false; bool dump_parsed_states = false; bool dump_parsed_functions = false; -string db_comment = "//$"; +// Doom Builder's magic comment indicator +// Only documentation seems to be: https://zdoom.org/wiki/Editor_keys +string editor_comment_prefix = "//$"; } // namespace slade::zscript @@ -191,7 +193,6 @@ void parseBlocks(ArchiveEntry* entry, vector& parsed, vector"); - tz.enableDecorate(true); tz.setCommentTypes(Tokenizer::CommentTypes::CPPStyle | Tokenizer::CommentTypes::CStyle); tz.openMem(entry->data(), "ZScript"); @@ -855,13 +856,8 @@ bool Class::parseClassBlock(vector& block) states_.parse(statement); // DB property comment - else if (strutil::startsWith(first_token, db_comment)) - { - if (statement.tokens.size() > 1) - db_properties_.emplace_back(first_token.substr(3), statement.tokens[1]); - else - db_properties_.emplace_back(first_token.substr(3), "true"); - } + else if (strutil::startsWith(first_token, editor_comment_prefix)) + db_properties_.emplace_back(Tokenizer::parseEditorComment(first_token)); // Function else if (Function::isFunction(statement)) @@ -890,14 +886,9 @@ bool Class::parseDefaults(vector& defaults) continue; // DB property comment - if (strutil::startsWith(statement.tokens[0], db_comment)) + if (strutil::startsWith(statement.tokens[0], editor_comment_prefix)) { - string_view prop = statement.tokens[0]; - prop.remove_prefix(3); - if (statement.tokens.size() > 1) - db_properties_.emplace_back(prop, statement.tokens[1]); - else - db_properties_.emplace_back(prop, "true"); + db_properties_.emplace_back(Tokenizer::parseEditorComment(statement.tokens[0])); continue; } @@ -1117,14 +1108,6 @@ bool ParsedStatement::parse(Tokenizer& tz) if (tz.advIf(';')) return true; - // DB comment - if (strutil::startsWith(tz.current().text, db_comment)) - { - tokens.emplace_back(tz.current().text); - tokens.emplace_back(tz.getLine()); - return true; - } - if (tz.check('}')) { // End of array initializer diff --git a/src/Game/ZScript.h b/src/Game/ZScript.h index d3ddfa8fc..3380f63db 100644 --- a/src/Game/ZScript.h +++ b/src/Game/ZScript.h @@ -175,6 +175,7 @@ namespace zscript vector> db_properties_; + void parseEditorComment(string_view token); bool parseClassBlock(vector& block); bool parseDefaults(vector& defaults); }; diff --git a/src/General/Log.h b/src/General/Log.h index 6d1e5cf2a..9e14de109 100644 --- a/src/General/Log.h +++ b/src/General/Log.h @@ -105,29 +105,28 @@ namespace log // Debug helper type -// Note: NDEBUG is a standard C macro indicating that assert()s should be -// disabled, but it's also the only macro cmake defines differently between -// debug and release builds, so we co-opt it just for this. -#ifndef NDEBUG +#ifdef SLADE_DEBUG #include class Debuggable { wxString repr; public: - Debuggable(wxString v) { repr = v; } + Debuggable(const wxString v) { repr = v; } + Debuggable(const string v) { repr = v; } Debuggable(const char* v) { repr = v; } - Debuggable(bool v) { repr = v ? "true" : "false"; } - Debuggable(int v) { repr = wxString::Format("%d", v); } - Debuggable(unsigned int v) { repr = wxString::Format("%u", v); } - Debuggable(long v) { repr = wxString::Format("%ld", v); } - Debuggable(unsigned long v) { repr = wxString::Format("%lu", v); } - Debuggable(double v) { repr = wxString::Format("%g", v); } - - Debuggable(Vec2d v) { repr = wxString::Format("(%0.6f, %0.6f)", v.x, v.y); } - Debuggable(Vec3f v) { repr = wxString::Format("(%0.6f, %0.6f, %0.6f)", v.x, v.y, v.z); } - Debuggable(Rectf v) { repr = wxString::Format("(%0.6f, %0.6f to %0.6f, %0.6f)", v.x1(), v.y1(), v.x2(), v.y2()); } - + Debuggable(const bool v) { repr = v ? "true" : "false"; } + Debuggable(const int v) { repr = wxString::Format("%d", v); } + Debuggable(const unsigned int v) { repr = wxString::Format("%u", v); } + Debuggable(const long v) { repr = wxString::Format("%ld", v); } + Debuggable(const unsigned long v) { repr = wxString::Format("%lu", v); } + Debuggable(const double v) { repr = wxString::Format("%g", v); } + + Debuggable(const Vec2d v) { repr = wxString::Format("(%0.6f, %0.6f)", v.x, v.y); } + Debuggable(const Vec3f v) { repr = wxString::Format("(%0.6f, %0.6f, %0.6f)", v.x, v.y, v.z); } + Debuggable(const Rectf v) { repr = wxString::Format("(%0.6f, %0.6f to %0.6f, %0.6f)", v.x1(), v.y1(), v.x2(), v.y2()); } + + Debuggable(const void* v) { repr = wxString::Format("%08p", v); } template Debuggable(T* v) { repr = Debuggable(*v).repr; } template Debuggable(vector v) @@ -173,16 +172,16 @@ inline void LOG_DEBUG( message << a11.get() << " "; message << a12.get(); message.Trim(); - log::debug(0, wxString::Format("%s", message)); + log::message(log::MessageType::Debug, 0, message.ToStdString()); } #define LOG_DEBUG_VAR(name) LOG_DEBUG(#name ": ", name) -#else // not NDEBUG +#else // SLADE_DEBUG struct Debuggable { template Debuggable(T _unused) {} }; #define LOG_DEBUG(...) #define LOG_DEBUG_VAR(name) -#endif // DEBUG +#endif // SLADE_DEBUG } // namespace slade diff --git a/src/General/UI.cpp b/src/General/UI.cpp index 52c3becad..d39a1316b 100644 --- a/src/General/UI.cpp +++ b/src/General/UI.cpp @@ -117,13 +117,21 @@ void ui::showSplash(string_view message, bool progress, wxWindow* parent) if (!splash_enabled || !isMainThread()) return; + // The splash window uses wxFRAME_FLOAT_ON_PARENT, which can't be added or removed dynamically + // on all platforms, so if the parent changes the splash window must be recreated + if (splash_window && splash_window->GetParent() != parent) + { + splash_window->Destroy(); + splash_window = nullptr; + } + if (!splash_window) { SplashWindow::init(); - splash_window = std::make_unique(); + splash_window = std::make_unique(parent); } - splash_window->show(wxString{ message.data(), message.size() }, progress, parent); + splash_window->show(wxString{ message.data(), message.size() }, progress); } // ----------------------------------------------------------------------------- diff --git a/src/MainEditor/UI/ArchiveManagerPanel.cpp b/src/MainEditor/UI/ArchiveManagerPanel.cpp index b09694f29..223309560 100644 --- a/src/MainEditor/UI/ArchiveManagerPanel.cpp +++ b/src/MainEditor/UI/ArchiveManagerPanel.cpp @@ -1189,7 +1189,7 @@ void ArchiveManagerPanel::closeEntryTabs(Archive* parent) const void ArchiveManagerPanel::openFile(const wxString& filename) const { // Show splash screen - ui::showSplash("Opening Archive...", true); + ui::showSplash("Opening Archive...", true, maineditor::windowWx()); // test wxStopWatch sw; @@ -1231,7 +1231,7 @@ void ArchiveManagerPanel::openFiles(const wxArrayString& files) const void ArchiveManagerPanel::openDirAsArchive(const wxString& dir) const { // Show splash screen - ui::showSplash("Opening Directory...", true); + ui::showSplash("Opening Directory...", true, maineditor::windowWx()); // test wxStopWatch sw; @@ -2261,7 +2261,16 @@ void ArchiveManagerPanel::onDirArchiveCheckCompleted(wxThreadEvent& e) // Otherwise show change/update dialog else { - DirArchiveUpdateDialog dlg(maineditor::windowWx(), archive, change_list.changes); + // Show on top of the focused top-level window + // (There's a wxGetActiveWindow, but it doesn't work on Mac.) + wxWindow* focused = wxWindow::FindFocus(); + if (focused) { + focused = wxGetTopLevelParent(focused); + } + if (! focused) { + focused = maineditor::windowWx(); + } + DirArchiveUpdateDialog dlg(focused, archive, change_list.changes); dlg.ShowModal(); } diff --git a/src/MainEditor/UI/ArchivePanel.cpp b/src/MainEditor/UI/ArchivePanel.cpp index 090036a0e..6c8c79303 100644 --- a/src/MainEditor/UI/ArchivePanel.cpp +++ b/src/MainEditor/UI/ArchivePanel.cpp @@ -966,7 +966,7 @@ bool ArchivePanel::importFiles() // Go through the list of files bool ok = true; entry_tree_->Freeze(); - ui::showSplash("Importing Files...", true); + ui::showSplash("Importing Files...", true, maineditor::windowWx()); for (size_t a = 0; a < info.filenames.size(); a++) { // Get filename @@ -1027,7 +1027,7 @@ bool ArchivePanel::importDir() undo_manager_->beginRecord("Import Directory"); entry_tree_->Freeze(); - ui::showSplash("Importing Files...", true); + ui::showSplash("Importing Files...", true, maineditor::windowWx()); // Import the directory auto ok = archive->importDir(path, archive_dir_ignore_hidden, dir); @@ -1085,7 +1085,7 @@ bool ArchivePanel::buildArchive() filedialog::FDInfo info; if (filedialog::saveFile(info, "Build Archive", zip.fileExtensionString(), this)) { - ui::showSplash("Building " + info.filenames[0], true); + ui::showSplash("Building " + info.filenames[0], true, maineditor::windowWx()); ui::setSplashProgress(0.0f); // prevent for "archive in archive" when saving in the current directory @@ -2016,7 +2016,7 @@ bool ArchivePanel::gfxConvert() const gcd.ShowModal(); // Show splash window - ui::showSplash("Writing converted image data...", true); + ui::showSplash("Writing converted image data...", true, maineditor::windowWx()); // Begin recording undo level undo_manager_->beginRecord("Gfx Format Conversion"); @@ -2734,7 +2734,7 @@ bool ArchivePanel::optimizePNG() const // Get selected entries auto selection = entry_tree_->selectedEntries(); - ui::showSplash("Running external programs, please wait...", true); + ui::showSplash("Running external programs, please wait...", true, maineditor::windowWx()); // Begin recording undo level undo_manager_->beginRecord("Optimize PNG"); diff --git a/src/MainEditor/UI/TextureXEditor/TextureXPanel.cpp b/src/MainEditor/UI/TextureXEditor/TextureXPanel.cpp index 68ab49ac0..dbef7fce8 100644 --- a/src/MainEditor/UI/TextureXEditor/TextureXPanel.cpp +++ b/src/MainEditor/UI/TextureXEditor/TextureXPanel.cpp @@ -1464,7 +1464,7 @@ void TextureXPanel::exportTexture() gcd.ShowModal(); // Show splash window - ui::showSplash("Writing converted image data...", true); + ui::showSplash("Writing converted image data...", true, maineditor::windowWx()); // Write any changes for (unsigned a = 0; a < selection.size(); a++) @@ -1583,7 +1583,7 @@ void TextureXPanel::extractTexture() info, "Export Textures as PNG (Filename will be ignored)", "PNG Files (*.png)|*.png", this)) { // Show splash window - ui::showSplash("Saving converted image data...", true); + ui::showSplash("Saving converted image data...", true, maineditor::windowWx()); // Go through the selection for (size_t a = 0; a < selection.size(); a++) diff --git a/src/MapEditor/Renderer/MapRenderer2D.cpp b/src/MapEditor/Renderer/MapRenderer2D.cpp index 63fca396d..6683ce79e 100644 --- a/src/MapEditor/Renderer/MapRenderer2D.cpp +++ b/src/MapEditor/Renderer/MapRenderer2D.cpp @@ -2108,8 +2108,6 @@ void MapRenderer2D::renderFlatsVBO(int type, bool texture, float alpha) using game::Feature; using game::UDMFFeature; - bool vbo_updated = false; - if (flat_ignore_light) glColor4f(flat_brightness, flat_brightness, flat_brightness, alpha); @@ -2130,22 +2128,23 @@ void MapRenderer2D::renderFlatsVBO(int type, bool texture, float alpha) last_flat_type_ = type; } - // First, check if any polygon vertex data has changed (in this case we need to refresh the entire vbo) - for (unsigned a = 0; a < map_->nSectors(); a++) - { - auto poly = map_->sector(a)->polygon(); - if (poly && poly->vboUpdate() > 1) - { - updateFlatsVBO(); - vbo_updated = true; - } - } - // Create VBO if necessary - if (!vbo_updated && vbo_flats_ == 0) + if (vbo_flats_ == 0) { updateFlatsVBO(); - vbo_updated = true; + } + // If any polygon vertex data has changed, we need to refresh the entire vbo + else + { + for (unsigned a = 0; a < map_->nSectors(); a++) + { + auto poly = map_->sector(a)->polygon(); + if (poly && poly->vboUpdate() > 1) + { + updateFlatsVBO(); + break; + } + } } // Setup opengl state diff --git a/src/MapEditor/Renderer/MapRenderer3D.cpp b/src/MapEditor/Renderer/MapRenderer3D.cpp index ff4dd924d..b4d7f90fc 100644 --- a/src/MapEditor/Renderer/MapRenderer3D.cpp +++ b/src/MapEditor/Renderer/MapRenderer3D.cpp @@ -113,8 +113,8 @@ void applyZDoomPerSectionOffsets( if (side->hasProp("scaley_" + section_name)) *sy = 1.0 / side->floatProperty("scaley_" + section_name); - *xoff *= *sx; - *yoff *= *sy; + *xoff *= fabs(*sx); + *yoff *= fabs(*sy); } } // namespace @@ -1581,13 +1581,13 @@ void MapRenderer3D::updateLine(unsigned index) } if (!tex.world_panning) { - xoff *= sx; - yoff *= sy; + xoff *= fabs(sx); + yoff *= fabs(sy); } sx *= lsx; sy *= lsy; - xoff *= lsx; - yoff *= lsy; + xoff *= fabs(lsx); + yoff *= fabs(lsy); // Create quad setupQuad(&quad, line->seg(), cp1, fp1); @@ -1674,13 +1674,13 @@ void MapRenderer3D::updateLine(unsigned index) } if (!tex.world_panning) { - xoff *= sx; - yoff *= sy; + xoff *= fabs(sx); + yoff *= fabs(sy); } sx *= lsx; sy *= lsy; - xoff *= lsx; - yoff *= lsy; + xoff *= fabs(lsx); + yoff *= fabs(lsy); if (lpeg) // Lower unpegged yoff += (ceiling1 - floor2); @@ -1735,13 +1735,13 @@ void MapRenderer3D::updateLine(unsigned index) } if (!tex.world_panning) { - xoff *= sx; - yoff *= sy; + xoff *= fabs(sx); + yoff *= fabs(sy); } sx *= lsx; sy *= lsy; - xoff *= lsx; - yoff *= lsy; + xoff *= fabs(lsx); + yoff *= fabs(lsy); // Setup quad coordinates double top, bottom; @@ -1831,13 +1831,13 @@ void MapRenderer3D::updateLine(unsigned index) } if (!tex.world_panning) { - xoff *= sx; - yoff *= sy; + xoff *= fabs(sx); + yoff *= fabs(sy); } sx *= lsx; sy *= lsy; - xoff *= lsx; - yoff *= lsy; + xoff *= fabs(lsx); + yoff *= fabs(lsy); // Create quad setupQuad(&quad, line->seg(), cp1, cp2); @@ -1890,13 +1890,13 @@ void MapRenderer3D::updateLine(unsigned index) } if (!tex.world_panning) { - xoff *= sx; - yoff *= sy; + xoff *= fabs(sx); + yoff *= fabs(sy); } sx *= lsx; sy *= lsy; - xoff *= lsx; - yoff *= lsy; + xoff *= fabs(lsx); + yoff *= fabs(lsy); if (lpeg) // Lower unpegged yoff += (ceiling2 - floor1); @@ -1954,13 +1954,13 @@ void MapRenderer3D::updateLine(unsigned index) } if (!tex.world_panning) { - xoff *= sx; - yoff *= sy; + xoff *= fabs(sx); + yoff *= fabs(sy); } sx *= lsx; sy *= lsy; - xoff *= lsx; - yoff *= lsy; + xoff *= fabs(lsx); + yoff *= fabs(lsy); // Setup quad coordinates double top, bottom; @@ -2050,13 +2050,13 @@ void MapRenderer3D::updateLine(unsigned index) } if (!tex.world_panning) { - xoff *= sx; - yoff *= sy; + xoff *= fabs(sx); + yoff *= fabs(sy); } sx *= lsx; sy *= lsy; - xoff *= lsx; - yoff *= lsy; + xoff *= fabs(lsx); + yoff *= fabs(lsy); // Create quad setupQuad(&quad, line->seg().flip(), cp2, cp1); diff --git a/src/MapEditor/SectorBuilder.cpp b/src/MapEditor/SectorBuilder.cpp index 07a00581c..c1ab04f52 100644 --- a/src/MapEditor/SectorBuilder.cpp +++ b/src/MapEditor/SectorBuilder.cpp @@ -343,8 +343,6 @@ SectorBuilder::Edge SectorBuilder::findOuterEdge() const double min_dist = 999999999; MapLine* nearest = nullptr; - // LOG_DEBUG("Finding outer edge from vertex", vertex_right, "at", vertex_right->point()); - // Fire a ray east from the vertex and find the first line it crosses MapLine* line = nullptr; for (unsigned a = 0; a < map_->nLines(); a++) @@ -397,7 +395,6 @@ SectorBuilder::Edge SectorBuilder::findOuterEdge() const // Determine the edge side double side = math::lineSide(vertex_right_->position(), nearest->seg()); - // LOG_DEBUG("Found next outer line", nearest, "on side", side); if (side >= 0) return Edge{ nearest, true }; else diff --git a/src/MapEditor/UI/Dialogs/ActionSpecialDialog.cpp b/src/MapEditor/UI/Dialogs/ActionSpecialDialog.cpp index 83c12e4a5..91e917158 100644 --- a/src/MapEditor/UI/Dialogs/ActionSpecialDialog.cpp +++ b/src/MapEditor/UI/Dialogs/ActionSpecialDialog.cpp @@ -39,6 +39,7 @@ #include "SpecialPresetDialog.h" #include "UI/Controls/NumberTextCtrl.h" #include "UI/WxUtils.h" +#include #include using namespace slade; @@ -65,16 +66,22 @@ ActionSpecialTreeView::ActionSpecialTreeView(wxWindow* parent) : wxDataViewTreeC dc.SetFont(GetFont()); wxSize textsize; - // Populate tree - for (auto& i : game::configuration().allActionSpecials()) + // Sort specials in config order + sorted_specials_.reserve(game::configuration().allActionSpecials().size()); + for (const auto& i : game::configuration().allActionSpecials()) { if (!i.second.defined()) continue; wxString label = wxString::Format("%d: %s", i.second.number(), i.second.name()); - AppendItem(getGroup(i.second.group()), label); textsize.IncTo(dc.GetTextExtent(label)); + sorted_specials_.push_back({ &i.second, label, {} }); } + std::sort(sorted_specials_.begin(), sorted_specials_.end(), [](const auto& a, const auto& b) { + return a.special->order() < b.special->order(); + }); + + filterSpecials(); Expand(root_); // Bind events @@ -117,23 +124,17 @@ void ActionSpecialTreeView::showSpecial(int special, bool focus) return; } - // Go through item groups - for (auto& group : groups_) + // Go through every item + for (const auto& i : sorted_specials_) { - // Go through group items - for (int b = 0; b < GetChildCount(group.item); b++) + // Select+show if match + if (i.special->number() == special) { - auto item = GetNthChild(group.item, b); - - // Select+show if match - if (specialNumber(item) == special) - { - EnsureVisible(item); - Select(item); - if (focus) - SetFocus(); - return; - } + EnsureVisible(i.item); + Select(i.item); + if (focus) + SetFocus(); + return; } } } @@ -150,6 +151,107 @@ int ActionSpecialTreeView::selectedSpecial() const return -1; } +// ----------------------------------------------------------------------------- +// Limit the visible specials, based on a filter string. If it's blank or +// numeric, show everything and select that special; otherwise, split it on +// whitespace, only show specials whose names contain each word, and select the +// first visible special +// ----------------------------------------------------------------------------- +void ActionSpecialTreeView::filterSpecials(string filter) +{ + // Unfortunately, there's no filtering on a wxDataViewTreeCtrl, so we must empty the tree (of + // leaves only, not groups) and then repopulate it + for (auto& i : sorted_specials_) + { + if (i.item.IsOk()) + { + DeleteItem(i.item); + i.item = wxDataViewItem(nullptr); + } + } + + const int current_special = selectedSpecial(); + bool current_visible = false; + bool show_everything = false; + int typed_special = -1; + vector filter_words; + if (current_special == 0) + current_visible = true; + + // Check what kind of filter we have: nothing, a number, or text + strutil::trimIP(filter); + if (filter.empty()) + show_everything = true; + else + { + // See if it's a number first + const auto result = std::from_chars(filter.data(), filter.data() + filter.size(), typed_special, 10); + // This is a weird API + if (result.ec == std::errc()) + show_everything = true; + } + + if (! show_everything) + // Split on spaces and filter by name + filter_words = strutil::splitV(filter, ' ', true); + + // Now add the items back to the tree, skipping any that don't match the filter + for (auto& i : sorted_specials_) + { + bool show = true; + for (const auto& word : filter_words) + { + if (! strutil::containsCI(i.special->name(), word)) + { + show = false; + break; + } + } + if (! show) + continue; + + if (i.special->number() == current_special) + current_visible = true; + i.item = AppendItem(getGroup(i.special->group()), i.label); + } + + // If we're filtering, expand all the groups + if (! show_everything) + { + for (const auto& g : groups_) + { + Expand(g.item); + } + } + + // If a number was typed, select that + if (typed_special >= 0) + showSpecial(typed_special, false); + // If not, but the previous selection is still visible, re-select it + else if (current_special != 0 && current_visible) + showSpecial(current_special, false); + // Otherwise, select the first available special + else + { + for (const auto& i : sorted_specials_) + { + if (i.item.IsOk()) + { + Select(i.item); + EnsureVisible(i.item); + break; + } + } + } + + // If nothing was a viable selection, fall back to 0 + if (! GetSelection().IsOk()) + { + Select(item_none_); + EnsureVisible(item_none_); + } +} + // ----------------------------------------------------------------------------- // Returns the parent wxDataViewItem representing action special group [group] // ----------------------------------------------------------------------------- @@ -575,17 +677,18 @@ class ArgsSpeedControl : public ArgsChoiceControl slider_control_ = new wxSlider(this, -1, 0, 0, 255); slider_control_->SetLineSize(2); slider_control_->SetPageSize(8); - // Add a tic for every predefined value + // Add a tick for every predefined value for (const auto& custom_flag : arg.custom_flags) slider_control_->SetTick(custom_flag.value); slider_control_->Bind(wxEVT_SLIDER, &ArgsSpeedControl::onSlide, this); speed_label_ = new wxStaticText(this, -1, ""); GetSizer()->Detach(choice_control_); - row->Add(choice_control_, wxSizerFlags(0).Expand()); + row->Add(choice_control_, wxSizerFlags(0).Center()); row->AddSpacer(ui::pad()); - row->Add(slider_control_, wxSizerFlags(1).Align(wxALIGN_CENTER_VERTICAL)); + row->Add(slider_control_, wxSizerFlags(1).Center()); GetSizer()->Add(row, wxSizerFlags(1).Expand()); + GetSizer()->AddSpacer(ui::pad()); GetSizer()->Add(speed_label_, wxSizerFlags(1).Expand()); // The label has its longest value at 0, which makes for an appropriate @@ -625,6 +728,71 @@ class ArgsSpeedControl : public ArgsChoiceControl } } }; + +// ----------------------------------------------------------------------------- +// ArgsDelayControl Class +// +// Arg control that shows a slider for selecting an amount of time, and also +// converts it to seconds. +// ----------------------------------------------------------------------------- +class ArgsDelayControl : public ArgsChoiceControl +{ +public: + ArgsDelayControl(wxWindow* parent, const game::Arg& arg, int units_per_sec) + : ArgsChoiceControl(parent, arg), units_per_sec_(units_per_sec) + { + auto row = new wxBoxSizer(wxHORIZONTAL); + + slider_control_ = new wxSlider(this, -1, 0, 0, 255); + slider_control_->SetLineSize(2); + slider_control_->SetPageSize(8); + // Add a tick for every predefined value + for (const auto& custom_flag : arg.custom_flags) + slider_control_->SetTick(custom_flag.value); + slider_control_->Bind(wxEVT_SLIDER, &ArgsDelayControl::onSlide, this); + delay_label_ = new wxStaticText(this, -1, ""); + + GetSizer()->Detach(choice_control_); + row->Add(choice_control_, wxSizerFlags(0).Center()); + row->AddSpacer(ui::pad()); + row->Add(slider_control_, wxSizerFlags(1).Center()); + GetSizer()->Add(row, wxSizerFlags(1).Expand()); + GetSizer()->AddSpacer(ui::pad()); + GetSizer()->Add(delay_label_, wxSizerFlags(1).Expand()); + + // The label has its longest value at 0, which makes for an appropriate + // minimum size + syncControls(0); + + wxWindowBase::Fit(); + } + + // Set the value in the textbox + void setArgValue(long val) override { syncControls(val); } + +protected: + wxSlider* slider_control_; + wxStaticText* delay_label_; + int units_per_sec_; + + void onSlide(wxCommandEvent& event) { syncControls(slider_control_->GetValue()); } + + void syncControls(int value) + { + ArgsChoiceControl::setArgValue(value); + + if (value < 0) + { + slider_control_->SetValue(0); + delay_label_->SetLabel(""); + } + else + { + slider_control_->SetValue(value); + delay_label_->SetLabel(fmt::format("{:.2f} seconds", (float)value / units_per_sec_)); + } + } +}; } // namespace slade @@ -704,6 +872,10 @@ void ArgsPanel::setup(const game::ArgSpec& args, bool udmf) control_args_[a] = new ArgsFlagsControl(this, arg, !udmf); else if (arg.type == Arg::Type::Speed) control_args_[a] = new ArgsSpeedControl(this, arg); + else if (arg.type == Arg::Type::Tics) + control_args_[a] = new ArgsDelayControl(this, arg, 35); + else if (arg.type == Arg::Type::Octics) + control_args_[a] = new ArgsDelayControl(this, arg, 8); else control_args_[a] = new ArgsTextControl(this, arg, !udmf); } @@ -874,10 +1046,25 @@ void ActionSpecialPanel::setupSpecialPanel() auto sizer = new wxBoxSizer(wxVERTICAL); // Special box - text_special_ = new NumberTextCtrl(panel_action_special_); + text_special_ = new wxTextCtrl(panel_action_special_, wxID_ANY); sizer->Add(text_special_, 0, wxEXPAND | wxBOTTOM, ui::pad()); - text_special_->Bind( - wxEVT_TEXT, [&](wxCommandEvent& e) { tree_specials_->showSpecial(text_special_->number(), false); }); + // Typing in the box acts as a filter + text_special_->Bind(wxEVT_TEXT, [&](wxCommandEvent& e) { + // This method calls Select on itself, but we don't want to treat that as a real selection + // change, or we'll alter the text and recurse into it. Disable the event while calling it + auto selection = selectedSpecial(); + ignore_select_event_ = true; + tree_specials_->filterSpecials(text_special_->GetValue().ToStdString()); + ignore_select_event_ = false; + + if (selection != selectedSpecial()) + updateArgsPanel(); + }); + // Focusing the text also select-alls; if you leave and return you probably want to start over, + // not make small edits + text_special_->Bind(wxEVT_SET_FOCUS, [&](wxFocusEvent& e) { + text_special_->SetSelection(-1, -1); + }); // Action specials tree tree_specials_ = new ActionSpecialTreeView(panel_action_special_); @@ -987,12 +1174,7 @@ void ActionSpecialPanel::setSpecial(int special) tree_specials_->showSpecial(special, false); text_special_->SetValue(wxString::Format("%d", special)); - // Setup args if any - if (panel_args_) - { - auto& args = game::configuration().actionSpecial(selectedSpecial()).argSpec(); - panel_args_->setup(args, (mapeditor::editContext().mapDesc().format == MapFormat::UDMF)); - } + updateArgsPanel(); } // ----------------------------------------------------------------------------- @@ -1240,6 +1422,18 @@ void ActionSpecialPanel::openLines(vector& lines) } } +// ----------------------------------------------------------------------------- +// Update the arg names/types on the args panel +// ----------------------------------------------------------------------------- +void ActionSpecialPanel::updateArgsPanel() +{ + if (panel_args_) + { + auto& args = game::configuration().actionSpecial(selectedSpecial()).argSpec(); + panel_args_->setup(args, (mapeditor::editContext().mapDesc().format == MapFormat::UDMF)); + } +} + // ----------------------------------------------------------------------------- // @@ -1262,8 +1456,8 @@ void ActionSpecialPanel::onRadioButtonChanged(wxCommandEvent& e) // ----------------------------------------------------------------------------- void ActionSpecialPanel::onSpecialSelectionChanged(wxDataViewEvent& e) { - if ((game::configuration().featureSupported(game::Feature::Boom) && rb_generalised_->GetValue()) - || selectedSpecial() < 0) + if (ignore_select_event_ || selectedSpecial() < 0 || + (game::configuration().featureSupported(game::Feature::Boom) && rb_generalised_->GetValue())) { e.Skip(); return; @@ -1272,11 +1466,7 @@ void ActionSpecialPanel::onSpecialSelectionChanged(wxDataViewEvent& e) // Set special # text box text_special_->SetValue(wxString::Format("%d", selectedSpecial())); - if (panel_args_) - { - auto& args = game::configuration().actionSpecial(selectedSpecial()).argSpec(); - panel_args_->setup(args, (mapeditor::editContext().mapDesc().format == MapFormat::UDMF)); - } + updateArgsPanel(); } // ----------------------------------------------------------------------------- @@ -1293,12 +1483,9 @@ void ActionSpecialPanel::onSpecialItemActivated(wxDataViewEvent& e) } // Jump to args tab, if there is one + updateArgsPanel(); if (panel_args_) - { - auto& args = game::configuration().actionSpecial(selectedSpecial()).argSpec(); - panel_args_->setup(args, (mapeditor::editContext().mapDesc().format == MapFormat::UDMF)); panel_args_->SetFocus(); - } } // ----------------------------------------------------------------------------- @@ -1361,11 +1548,11 @@ ActionSpecialDialog::ActionSpecialDialog(wxWindow* parent, bool show_args) : sizer->Add(stc_tabs_, 1, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, ui::padLarge()); // Special panel - panel_special_ = new ActionSpecialPanel(stc_tabs_); + panel_special_ = new ActionSpecialPanel(this); stc_tabs_->AddPage(wxutil::createPadPanel(stc_tabs_, panel_special_), "Special"); // Args panel - panel_args_ = new ArgsPanel(stc_tabs_); + panel_args_ = new ArgsPanel(this); stc_tabs_->AddPage(wxutil::createPadPanel(stc_tabs_, panel_args_), "Args"); panel_special_->setArgsPanel(panel_args_); } @@ -1385,11 +1572,6 @@ ActionSpecialDialog::ActionSpecialDialog(wxWindow* parent, bool show_args) : void ActionSpecialDialog::setSpecial(int special) const { panel_special_->setSpecial(special); - if (panel_args_) - { - auto& args = game::configuration().actionSpecial(special).argSpec(); - panel_args_->setup(args, (mapeditor::editContext().mapDesc().format == MapFormat::UDMF)); - } } // ----------------------------------------------------------------------------- diff --git a/src/MapEditor/UI/Dialogs/ActionSpecialDialog.h b/src/MapEditor/UI/Dialogs/ActionSpecialDialog.h index d38f347d1..51800b9fc 100644 --- a/src/MapEditor/UI/Dialogs/ActionSpecialDialog.h +++ b/src/MapEditor/UI/Dialogs/ActionSpecialDialog.h @@ -9,6 +9,7 @@ namespace slade { namespace game { + class ActionSpecial; struct ArgSpec; } @@ -29,11 +30,21 @@ class ActionSpecialTreeView : public wxDataViewTreeCtrl int specialNumber(wxDataViewItem item) const; void showSpecial(int special, bool focus = true); int selectedSpecial() const; + void filterSpecials(string filter = ""); private: wxDataViewItem root_; wxDataViewItem item_none_; wxDialog* parent_dialog_ = nullptr; + bool is_filtered_ = false; + + struct ASTVRow + { + const game::ActionSpecial* special; + wxString label; + wxDataViewItem item; + }; + vector sorted_specials_ = {}; struct ASTVGroup { @@ -80,6 +91,7 @@ class ActionSpecialPanel : public wxPanel void showGeneralised(bool show = true); void applyTo(vector& lines, bool apply_special); void openLines(vector& lines); + void updateArgsPanel(); void onRadioButtonChanged(wxCommandEvent& e); void onSpecialSelectionChanged(wxDataViewEvent& e); @@ -95,8 +107,9 @@ class ActionSpecialPanel : public wxPanel ArgsPanel* panel_args_ = nullptr; wxChoice* choice_trigger_ = nullptr; bool show_trigger_ = false; - NumberTextCtrl* text_special_ = nullptr; + wxTextCtrl* text_special_ = nullptr; wxButton* btn_preset_ = nullptr; + bool ignore_select_event_ = false; struct FlagHolder { diff --git a/src/MapEditor/UI/MapCanvas.cpp b/src/MapEditor/UI/MapCanvas.cpp index 6c3be4816..249220688 100644 --- a/src/MapEditor/UI/MapCanvas.cpp +++ b/src/MapEditor/UI/MapCanvas.cpp @@ -449,6 +449,13 @@ void MapCanvas::onMouseMotion(wxMouseEvent& e) // ----------------------------------------------------------------------------- void MapCanvas::onMouseWheel(wxMouseEvent& e) { + // wxGTK has a bug causing duplicate wheel events, but the duplicates have + // exactly the same timestamp, which makes them easy to detect + if (e.GetTimestamp() == last_wheel_timestamp_) + return; + else + last_wheel_timestamp_ = e.GetTimestamp(); + #ifdef __WXOSX__ double mwheel_rotation = (double)e.GetWheelRotation() / (double)e.GetWheelDelta(); if (mwheel_rotation < 0) diff --git a/src/MapEditor/UI/MapCanvas.h b/src/MapEditor/UI/MapCanvas.h index 178ede1cf..f41c99dc7 100644 --- a/src/MapEditor/UI/MapCanvas.h +++ b/src/MapEditor/UI/MapCanvas.h @@ -28,6 +28,7 @@ class MapCanvas : public OGLCanvas, public KeyBindHandler bool mouse_warp_ = false; vector fps_avg_; sf::Clock sf_clock_; + long last_wheel_timestamp_ = -1; // Events void onSize(wxSizeEvent& e); diff --git a/src/MapEditor/UI/PropsPanel/MOPGProperty.cpp b/src/MapEditor/UI/PropsPanel/MOPGProperty.cpp index 66bda8793..faf7b4e67 100644 --- a/src/MapEditor/UI/PropsPanel/MOPGProperty.cpp +++ b/src/MapEditor/UI/PropsPanel/MOPGProperty.cpp @@ -152,6 +152,21 @@ void MOPGBoolProperty::applyValue() object->setBoolProperty(GetName().ToStdString(), m_value.GetBool()); } +// ----------------------------------------------------------------------------- +// Sets the property value to the default +// ----------------------------------------------------------------------------- +void MOPGBoolProperty::clearValue() +{ + // Do nothing if no parent (and thus no object list) + if (!parent_ || noupdate_) + return; + + bool def = false; + if (udmf_prop_) + def = property::asBool(udmf_prop_->defaultValue()); + GetGrid()->ChangePropertyValue(this, def); +} + // ----------------------------------------------------------------------------- // @@ -234,6 +249,21 @@ void MOPGIntProperty::applyValue() object->setIntProperty(GetName().ToStdString(), m_value.GetInteger()); } +// ----------------------------------------------------------------------------- +// Sets the property value to the default +// ----------------------------------------------------------------------------- +void MOPGIntProperty::clearValue() +{ + // Do nothing if no parent (and thus no object list) + if (!parent_ || noupdate_) + return; + + int def = 0; + if (udmf_prop_) + def = property::asInt(udmf_prop_->defaultValue()); + GetGrid()->ChangePropertyValue(this, def); +} + // ----------------------------------------------------------------------------- // @@ -316,6 +346,21 @@ void MOPGFloatProperty::applyValue() object->setFloatProperty(GetName().ToStdString(), m_value.GetDouble()); } +// ----------------------------------------------------------------------------- +// Sets the property value to the default +// ----------------------------------------------------------------------------- +void MOPGFloatProperty::clearValue() +{ + // Do nothing if no parent (and thus no object list) + if (!parent_ || noupdate_) + return; + + double def = 0.; + if (udmf_prop_) + def = property::asFloat(udmf_prop_->defaultValue()); + GetGrid()->ChangePropertyValue(this, def); +} + // ----------------------------------------------------------------------------- // @@ -420,6 +465,21 @@ void MOPGStringProperty::applyValue() object->setStringProperty(GetName().ToStdString(), m_value.GetString().ToStdString()); } +// ----------------------------------------------------------------------------- +// Sets the property value to the default +// ----------------------------------------------------------------------------- +void MOPGStringProperty::clearValue() +{ + // Do nothing if no parent (and thus no object list) + if (!parent_ || noupdate_) + return; + + string def; + if (udmf_prop_) + def = property::asString(udmf_prop_->defaultValue()); + GetGrid()->ChangePropertyValue(this, def); +} + // ----------------------------------------------------------------------------- // MOPGIntWithArgsProperty Class Functions @@ -881,6 +941,21 @@ void MOPGAngleProperty::applyValue() object->setIntProperty(GetName().ToStdString(), m_value.GetInteger()); } +// ----------------------------------------------------------------------------- +// Sets the property value to the default +// ----------------------------------------------------------------------------- +void MOPGAngleProperty::clearValue() +{ + // Do nothing if no parent (and thus no object list) + if (!parent_ || noupdate_) + return; + + int def = 0; + if (udmf_prop_) + def = property::asInt(udmf_prop_->defaultValue()); + GetGrid()->ChangePropertyValue(this, def); +} + // ----------------------------------------------------------------------------- // Returns the angle value as a string // ----------------------------------------------------------------------------- @@ -987,6 +1062,23 @@ void MOPGColourProperty::applyValue() object->setIntProperty(GetName().ToStdString(), col.GetRGB()); } +// ----------------------------------------------------------------------------- +// Sets the property value to the default +// ----------------------------------------------------------------------------- +void MOPGColourProperty::clearValue() +{ + // Do nothing if no parent (and thus no object list) + if (!parent_ || noupdate_) + return; + + wxColour def; + if (udmf_prop_) + def.SetRGB(property::asInt(udmf_prop_->defaultValue())); + wxVariant var; + var << def; + GetGrid()->ChangePropertyValue(this, var); +} + // ----------------------------------------------------------------------------- // @@ -1153,6 +1245,19 @@ void MOPGSPACTriggerProperty::applyValue() game::configuration().setLineSpacTrigger(GetChoiceSelection(), dynamic_cast(object)); } +// ----------------------------------------------------------------------------- +// Sets the property value to the default (whatever's first) +// ----------------------------------------------------------------------------- +void MOPGSPACTriggerProperty::clearValue() +{ + // Do nothing if no parent (and thus no object list) + if (!parent_ || noupdate_) + return; + + int def = 0; + GetGrid()->ChangePropertyValue(this, 0); +} + // ----------------------------------------------------------------------------- // MOPGTagProperty Class Functions diff --git a/src/MapEditor/UI/PropsPanel/MOPGProperty.h b/src/MapEditor/UI/PropsPanel/MOPGProperty.h index 3d0356a02..98addd9b9 100644 --- a/src/MapEditor/UI/PropsPanel/MOPGProperty.h +++ b/src/MapEditor/UI/PropsPanel/MOPGProperty.h @@ -45,6 +45,7 @@ class MOPGProperty virtual void updateVisibility() = 0; virtual void applyValue() {} virtual void resetValue(); + virtual void clearValue() = 0; protected: MapObjectPropsPanel* parent_ = nullptr; @@ -62,6 +63,7 @@ class MOPGBoolProperty : public MOPGProperty, public wxBoolProperty void openObjects(vector& objects) override; void updateVisibility() override; void applyValue() override; + void clearValue() override; }; class MOPGIntProperty : public MOPGProperty, public wxIntProperty @@ -73,6 +75,7 @@ class MOPGIntProperty : public MOPGProperty, public wxIntProperty void openObjects(vector& objects) override; void updateVisibility() override; void applyValue() override; + void clearValue() override; }; class MOPGFloatProperty : public MOPGProperty, public wxFloatProperty @@ -84,6 +87,7 @@ class MOPGFloatProperty : public MOPGProperty, public wxFloatProperty void openObjects(vector& objects) override; void updateVisibility() override; void applyValue() override; + void clearValue() override; }; class MOPGStringProperty : public MOPGProperty, public wxStringProperty @@ -97,6 +101,7 @@ class MOPGStringProperty : public MOPGProperty, public wxStringProperty void openObjects(vector& objects) override; void updateVisibility() override; void applyValue() override; + void clearValue() override; }; class MOPGIntWithArgsProperty : public MOPGIntProperty @@ -186,6 +191,7 @@ class MOPGAngleProperty : public MOPGProperty, public wxEditEnumProperty void openObjects(vector& objects) override; void updateVisibility() override; void applyValue() override; + void clearValue() override; // wxPGProperty overrides wxString ValueToString(wxVariant& value, int arg_flags = 0) const override; @@ -200,6 +206,7 @@ class MOPGColourProperty : public MOPGProperty, public wxColourProperty void openObjects(vector& objects) override; void updateVisibility() override; void applyValue() override; + void clearValue() override; }; class MOPGTextureProperty : public MOPGStringProperty @@ -229,6 +236,7 @@ class MOPGSPACTriggerProperty : public MOPGProperty, public wxEnumProperty void openObjects(vector& objects) override; void updateVisibility() override; void applyValue() override; + void clearValue() override; }; class MOPGTagProperty : public MOPGIntProperty diff --git a/src/MapEditor/UI/PropsPanel/MapObjectPropsPanel.cpp b/src/MapEditor/UI/PropsPanel/MapObjectPropsPanel.cpp index 38b0a3bfb..9fe80faad 100644 --- a/src/MapEditor/UI/PropsPanel/MapObjectPropsPanel.cpp +++ b/src/MapEditor/UI/PropsPanel/MapObjectPropsPanel.cpp @@ -78,24 +78,13 @@ MapObjectPropsPanel::MapObjectPropsPanel(wxWindow* parent, bool no_apply) : stc_sections_ = STabCtrl::createControl(this); sizer->Add(stc_sections_, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, ui::pad()); - const auto& inactiveTextColour = wxSystemSettings::GetColour(wxSYS_COLOUR_INACTIVECAPTIONTEXT); - // Add main property grid - pg_properties_ = new wxPropertyGrid( - stc_sections_, -1, wxDefaultPosition, wxDefaultSize, wxPG_TOOLTIPS | wxPG_SPLITTER_AUTO_CENTER); - pg_properties_->SetCaptionTextColour(inactiveTextColour); - pg_properties_->SetCellDisabledTextColour(inactiveTextColour); + pg_properties_ = createPropGrid(); stc_sections_->AddPage(pg_properties_, "Properties"); // Create side property grids - pg_props_side1_ = new wxPropertyGrid( - stc_sections_, -1, wxDefaultPosition, wxDefaultSize, wxPG_TOOLTIPS | wxPG_SPLITTER_AUTO_CENTER); - pg_props_side1_->SetCaptionTextColour(inactiveTextColour); - pg_props_side1_->SetCellDisabledTextColour(inactiveTextColour); - pg_props_side2_ = new wxPropertyGrid( - stc_sections_, -1, wxDefaultPosition, wxDefaultSize, wxPG_TOOLTIPS | wxPG_SPLITTER_AUTO_CENTER); - pg_props_side2_->SetCaptionTextColour(inactiveTextColour); - pg_props_side2_->SetCellDisabledTextColour(inactiveTextColour); + pg_props_side1_ = createPropGrid(); + pg_props_side2_ = createPropGrid(); // Add buttons auto hbox = new wxBoxSizer(wxHORIZONTAL); @@ -144,6 +133,32 @@ MapObjectPropsPanel::MapObjectPropsPanel(wxWindow* parent, bool no_apply) : wxWindowBase::Layout(); } +// ----------------------------------------------------------------------------- +// Create and set up a property grid +// ----------------------------------------------------------------------------- +wxPropertyGrid* MapObjectPropsPanel::createPropGrid() +{ + const auto& inactiveTextColour = wxSystemSettings::GetColour(wxSYS_COLOUR_INACTIVECAPTIONTEXT); + + auto propgrid = new wxPropertyGrid( + stc_sections_, -1, wxDefaultPosition, wxDefaultSize, wxPG_TOOLTIPS | wxPG_SPLITTER_AUTO_CENTER); + propgrid->SetExtraStyle(wxPG_EX_HELP_AS_TOOLTIPS | wxPG_EX_MULTIPLE_SELECTION); + propgrid->SetCaptionTextColour(inactiveTextColour); + propgrid->SetCellDisabledTextColour(inactiveTextColour); + + // wxPropertyGrid is very conservative about not stealing focus, and won't do it even if you + // explicitly click on the category column, which doesn't make sense + propgrid->Bind(wxEVT_LEFT_DOWN, [propgrid](wxMouseEvent& e) { + propgrid->SetFocus(); + e.Skip(); + }); + propgrid->Bind(wxEVT_KEY_DOWN, [this, propgrid](wxKeyEvent& e) { + onPropGridKeyDown(e, propgrid); + }); + + return propgrid; +} + // ----------------------------------------------------------------------------- // Returns true if 'Show All' is ticked // ----------------------------------------------------------------------------- @@ -153,22 +168,27 @@ bool MapObjectPropsPanel::showAll() const } // ----------------------------------------------------------------------------- -// Adds a boolean property cell to the grid under [group] for the object -// property [propname] +// Add an existing property to the grid. Helper function for the following. +// Returns the same property, for convenience. // ----------------------------------------------------------------------------- -MOPGProperty* MapObjectPropsPanel::addBoolProperty( +// We have a strange inheritance problem where every MOPGProperty subclass +// inherits from a wxPGProperty subclass, but MOPGProperty itself doesn't +// inherit from wxPGProperty, so we can't take a MOPGProperty* and call +// wxPGProperty methods on it. So template it and let god sort 'em out +template +T* MapObjectPropsPanel::addProperty( wxPGProperty* group, - const wxString& label, - const wxString& propname, + T* prop, bool readonly, wxPropertyGrid* grid, game::UDMFProperty* udmf_prop) { - // Create property - auto prop = new MOPGBoolProperty(label, propname); prop->setParent(this); prop->setUDMFProp(udmf_prop); + if (udmf_prop) + prop->SetHelpString(wxString::Format("%s\n(%s)", udmf_prop->name(), udmf_prop->propName())); + // Add it properties_.push_back(prop); if (!grid) @@ -183,6 +203,23 @@ MOPGProperty* MapObjectPropsPanel::addBoolProperty( return prop; } +// ----------------------------------------------------------------------------- +// Adds a boolean property cell to the grid under [group] for the object +// property [propname] +// ----------------------------------------------------------------------------- +MOPGProperty* MapObjectPropsPanel::addBoolProperty( + wxPGProperty* group, + const wxString& label, + const wxString& propname, + bool readonly, + wxPropertyGrid* grid, + game::UDMFProperty* udmf_prop) +{ + return addProperty( + group, new MOPGBoolProperty(label, propname), + readonly, grid, udmf_prop); +} + // ----------------------------------------------------------------------------- // Adds an integer property cell to the grid under [group] for the object // property [propname] @@ -196,22 +233,9 @@ MOPGProperty* MapObjectPropsPanel::addIntProperty( game::UDMFProperty* udmf_prop) { // Create property - auto prop = new MOPGIntProperty(label, propname); - prop->setParent(this); - prop->setUDMFProp(udmf_prop); - - // Add it - properties_.push_back(prop); - if (!grid) - pg_properties_->AppendIn(group, prop); - else - grid->AppendIn(group, prop); - - // Set read-only if specified - if (readonly) - prop->ChangeFlag(wxPG_PROP_READONLY, true); - - return prop; + return addProperty( + group, new MOPGIntProperty(label, propname), + readonly, grid, udmf_prop); } // ----------------------------------------------------------------------------- @@ -227,22 +251,9 @@ MOPGProperty* MapObjectPropsPanel::addFloatProperty( game::UDMFProperty* udmf_prop) { // Create property - auto prop = new MOPGFloatProperty(label, propname); - prop->setParent(this); - prop->setUDMFProp(udmf_prop); - - // Add it - properties_.push_back(prop); - if (!grid) - pg_properties_->AppendIn(group, prop); - else - grid->AppendIn(group, prop); - - // Set read-only if specified - if (readonly) - prop->ChangeFlag(wxPG_PROP_READONLY, true); - - return prop; + return addProperty( + group, new MOPGFloatProperty(label, propname), + readonly, grid, udmf_prop); } // ----------------------------------------------------------------------------- @@ -258,22 +269,9 @@ MOPGProperty* MapObjectPropsPanel::addStringProperty( game::UDMFProperty* udmf_prop) { // Create property - auto prop = new MOPGStringProperty(label, propname); - prop->setParent(this); - prop->setUDMFProp(udmf_prop); - - // Add it - properties_.push_back(prop); - if (!grid) - pg_properties_->AppendIn(group, prop); - else - grid->AppendIn(group, prop); - - // Set read-only if specified - if (readonly) - prop->ChangeFlag(wxPG_PROP_READONLY, true); - - return prop; + return addProperty( + group, new MOPGStringProperty(label, propname), + readonly, grid, udmf_prop); } // ----------------------------------------------------------------------------- @@ -290,22 +288,9 @@ MOPGProperty* MapObjectPropsPanel::addLineFlagProperty( game::UDMFProperty* udmf_prop) { // Create property - auto prop = new MOPGLineFlagProperty(label, propname, index); - prop->setParent(this); - prop->setUDMFProp(udmf_prop); - - // Add it - properties_.push_back(prop); - if (!grid) - pg_properties_->AppendIn(group, prop); - else - grid->AppendIn(group, prop); - - // Set read-only if specified - if (readonly) - prop->ChangeFlag(wxPG_PROP_READONLY, true); - - return prop; + return addProperty( + group, new MOPGLineFlagProperty(label, propname, index), + readonly, grid, udmf_prop); } // ----------------------------------------------------------------------------- @@ -322,22 +307,9 @@ MOPGProperty* MapObjectPropsPanel::addThingFlagProperty( game::UDMFProperty* udmf_prop) { // Create property - auto prop = new MOPGThingFlagProperty(label, propname, index); - prop->setParent(this); - prop->setUDMFProp(udmf_prop); - - // Add it - properties_.push_back(prop); - if (!grid) - pg_properties_->AppendIn(group, prop); - else - grid->AppendIn(group, prop); - - // Set read-only if specified - if (readonly) - prop->ChangeFlag(wxPG_PROP_READONLY, true); - - return prop; + return addProperty( + group, new MOPGThingFlagProperty(label, propname, index), + readonly, grid, udmf_prop); } // ----------------------------------------------------------------------------- @@ -354,22 +326,9 @@ MOPGProperty* MapObjectPropsPanel::addTextureProperty( game::UDMFProperty* udmf_prop) { // Create property - auto prop = new MOPGTextureProperty(textype, label, propname); - prop->setParent(this); - prop->setUDMFProp(udmf_prop); - - // Add it - properties_.push_back(prop); - if (!grid) - pg_properties_->AppendIn(group, prop); - else - grid->AppendIn(group, prop); - - // Set read-only if specified - if (readonly) - prop->ChangeFlag(wxPG_PROP_READONLY, true); - - return prop; + return addProperty( + group, new MOPGTextureProperty(textype, label, propname), + readonly, grid, udmf_prop); } // ----------------------------------------------------------------------------- @@ -441,45 +400,15 @@ void MapObjectPropsPanel::addUDMFProperty( else if (prop.type() == UDMFProperty::Type::String) addStringProperty(group, prop.name(), propname, false, grid, &prop); else if (prop.type() == UDMFProperty::Type::Colour) - { - auto prop_col = new MOPGColourProperty(prop.name(), propname); - prop_col->setParent(this); - prop_col->setUDMFProp(&prop); - properties_.push_back(prop_col); - grid->AppendIn(group, prop_col); - } + addProperty(group, new MOPGColourProperty(prop.name(), propname), false, grid, &prop); else if (prop.type() == UDMFProperty::Type::ActionSpecial) - { - auto prop_as = new MOPGActionSpecialProperty(prop.name(), propname); - prop_as->setParent(this); - prop_as->setUDMFProp(&prop); - properties_.push_back(prop_as); - grid->AppendIn(group, prop_as); - } + addProperty(group, new MOPGActionSpecialProperty(prop.name(), propname), false, grid, &prop); else if (prop.type() == UDMFProperty::Type::SectorSpecial) - { - auto prop_ss = new MOPGSectorSpecialProperty(prop.name(), propname); - prop_ss->setParent(this); - prop_ss->setUDMFProp(&prop); - properties_.push_back(prop_ss); - grid->AppendIn(group, prop_ss); - } + addProperty(group, new MOPGSectorSpecialProperty(prop.name(), propname), false, grid, &prop); else if (prop.type() == UDMFProperty::Type::ThingType) - { - auto prop_tt = new MOPGThingTypeProperty(prop.name(), propname); - prop_tt->setParent(this); - prop_tt->setUDMFProp(&prop); - properties_.push_back(prop_tt); - grid->AppendIn(group, prop_tt); - } + addProperty(group, new MOPGThingTypeProperty(prop.name(), propname), false, grid, &prop); else if (prop.type() == UDMFProperty::Type::Angle) - { - auto prop_angle = new MOPGAngleProperty(prop.name(), propname); - prop_angle->setParent(this); - prop_angle->setUDMFProp(&prop); - properties_.push_back(prop_angle); - grid->AppendIn(group, prop_angle); - } + addProperty(group, new MOPGAngleProperty(prop.name(), propname), false, grid, &prop); else if (prop.type() == UDMFProperty::Type::TextureWall) addTextureProperty(group, prop.name(), propname, mapeditor::TextureType::Texture, false, grid, &prop); else if (prop.type() == UDMFProperty::Type::TextureFlat) @@ -494,11 +423,7 @@ void MapObjectPropsPanel::addUDMFProperty( else tagtype = MOPGTagProperty::IdType::Sector; - auto prop_id = new MOPGTagProperty(tagtype, prop.name(), propname); - prop_id->setParent(this); - prop_id->setUDMFProp(&prop); - properties_.push_back(prop_id); - grid->AppendIn(group, prop_id); + addProperty(group, new MOPGTagProperty(tagtype, prop.name(), propname), false, grid, &prop); } } @@ -837,20 +762,20 @@ void MapObjectPropsPanel::setupTypeUDMF(MapObject::Type objtype) else if (objtype == MapObject::Type::Thing) stc_sections_->SetPageText(0, "Thing"); - // Go through all possible properties for this type - auto& props = game::configuration().allUDMFProperties(objtype); + // Go through all possible properties for this type, in configuration order + auto props = game::configuration().sortedUDMFProperties(objtype); for (auto& i : props) { // Skip if hidden - if ((hide_flags_ && i.second.isFlag()) || (hide_triggers_ && i.second.isTrigger())) + if ((hide_flags_ && i->second.isFlag()) || (hide_triggers_ && i->second.isTrigger())) { - hide_props_.emplace_back(i.second.propName()); + hide_props_.emplace_back(i->second.propName()); continue; } - if (VECTOR_EXISTS(hide_props_, i.second.propName())) + if (VECTOR_EXISTS(hide_props_, i->second.propName())) continue; - addUDMFProperty(i.second, objtype); + addUDMFProperty(i->second, objtype); } // Add side properties if line type @@ -863,36 +788,22 @@ void MapObjectPropsPanel::setupTypeUDMF(MapObject::Type objtype) stc_sections_->AddPage(pg_props_side2_, "Back Side"); // Get side properties - auto& sprops = game::configuration().allUDMFProperties(MapObject::Type::Side); - - // Front side - for (auto& i : sprops) - { - // Skip if hidden - if ((hide_flags_ && i.second.isFlag()) || (hide_triggers_ && i.second.isTrigger())) - { - hide_props_.emplace_back(i.second.propName()); - continue; - } - if (VECTOR_EXISTS(hide_props_, i.second.propName())) - continue; - - addUDMFProperty(i.second, objtype, "side1", pg_props_side1_); - } + auto sprops = game::configuration().sortedUDMFProperties(MapObject::Type::Side); - // Back side + // Add to both sides for (auto& i : sprops) { // Skip if hidden - if ((hide_flags_ && i.second.isFlag()) || (hide_triggers_ && i.second.isTrigger())) + if ((hide_flags_ && i->second.isFlag()) || (hide_triggers_ && i->second.isTrigger())) { - hide_props_.emplace_back(i.second.propName()); + hide_props_.emplace_back(i->second.propName()); continue; } - if (VECTOR_EXISTS(hide_props_, i.second.propName())) + if (VECTOR_EXISTS(hide_props_, i->second.propName())) continue; - addUDMFProperty(i.second, objtype, "side2", pg_props_side2_); + addUDMFProperty(i->second, objtype, "side1", pg_props_side1_); + addUDMFProperty(i->second, objtype, "side2", pg_props_side2_); } } @@ -954,13 +865,15 @@ void MapObjectPropsPanel::openObjects(vector& objects) pg_properties_->EnableProperty(pg_properties_->GetGrid()->GetRoot()); // Setup property grid for the object type - if (mapeditor::editContext().mapDesc().format == MapFormat::UDMF) + bool is_udmf = (mapeditor::editContext().mapDesc().format == MapFormat::UDMF); + bool type_changed = ! (last_type_ == objects[0]->objType() && udmf_ == is_udmf); + if (is_udmf) setupTypeUDMF(objects[0]->objType()); else setupType(objects[0]->objType()); // Find any custom properties (UDMF only) - if (mapeditor::editContext().mapDesc().format == MapFormat::UDMF) + if (is_udmf) { for (auto& object : objects) { @@ -1046,6 +959,10 @@ void MapObjectPropsPanel::openObjects(vector& objects) pg_properties_->Thaw(); pg_props_side1_->Thaw(); pg_props_side2_->Thaw(); + + // After changing types, the scroll position is meaningless, so scroll back to the top + if (type_changed) + pg_properties_->Scroll(0, 0); } // ----------------------------------------------------------------------------- @@ -1302,3 +1219,29 @@ void MapObjectPropsPanel::onPropertyChanged(wxPropertyGridEvent& e) } } } + + +// ----------------------------------------------------------------------------- +// Handle a keypress on a propgrid itself (not a property editor) +// ----------------------------------------------------------------------------- +void MapObjectPropsPanel::onPropGridKeyDown(wxKeyEvent& e, wxPropertyGrid* propgrid) +{ + if (e.GetKeyCode() == WXK_DELETE) + { + if (objects_.empty()) + return; + + // Clear the selected properties, and remove them entirely if custom + auto selection = propgrid->GetSelectedProperties(); + propgrid->Freeze(); + for (auto& prop : selection) + { + auto mopg_prop = dynamic_cast(prop); + if (mopg_prop) + mopg_prop->clearValue(); + } + propgrid->Thaw(); + } + else + e.Skip(); +} diff --git a/src/MapEditor/UI/PropsPanel/MapObjectPropsPanel.h b/src/MapEditor/UI/PropsPanel/MapObjectPropsPanel.h index 1b95920ff..c4ad67422 100644 --- a/src/MapEditor/UI/PropsPanel/MapObjectPropsPanel.h +++ b/src/MapEditor/UI/PropsPanel/MapObjectPropsPanel.h @@ -59,6 +59,15 @@ class MapObjectPropsPanel : public PropsPanelBase bool hide_triggers_ = false; vector hide_props_; + wxPropertyGrid* createPropGrid(); + + template + T* addProperty( + wxPGProperty* group, + T* prop, + bool readonly = false, + wxPropertyGrid* grid = nullptr, + game::UDMFProperty* udmf_prop = nullptr); MOPGProperty* addBoolProperty( wxPGProperty* group, const wxString& label, @@ -128,5 +137,7 @@ class MapObjectPropsPanel : public PropsPanelBase void onShowAllToggled(wxCommandEvent& e); void onBtnAdd(wxCommandEvent& e); void onPropertyChanged(wxPropertyGridEvent& e); + + void onPropGridKeyDown(wxKeyEvent& e, wxPropertyGrid* propgrid); }; } // namespace slade diff --git a/src/SLADEMap/MapObjectList/LineList.cpp b/src/SLADEMap/MapObjectList/LineList.cpp index 30ff84678..e4c2f0b9a 100644 --- a/src/SLADEMap/MapObjectList/LineList.cpp +++ b/src/SLADEMap/MapObjectList/LineList.cpp @@ -113,11 +113,6 @@ vector LineList::cutPoints(const Seg2d& cutter) const { // Add intersection point to vector intersect_points.push_back(intersection); - LOG_DEBUG("Intersection point", intersection, "valid with", line); - } - else if (intersection != cutter.start()) - { - LOG_DEBUG("Intersection point", intersection, "invalid"); } } diff --git a/src/SLADEMap/MapObjectList/SectorList.cpp b/src/SLADEMap/MapObjectList/SectorList.cpp index 7eca3e7f1..2e90a4211 100644 --- a/src/SLADEMap/MapObjectList/SectorList.cpp +++ b/src/SLADEMap/MapObjectList/SectorList.cpp @@ -80,6 +80,15 @@ void SectorList::remove(unsigned index) usage_tex_[strutil::upper(objects_[index]->ceiling().texture)] -= 1; MapObjectList::remove(index); + + // The last sector just moved into the deleted sector's space. Its geometry didn't change, but + // because its index did, its VBO is completely invalid now + if (index < objects_.size()) + { + auto poly = objects_[index]->polygon(); + if (poly) + poly->invalidateVBO(); + } } // ----------------------------------------------------------------------------- diff --git a/src/SLADEMap/SLADEMap.cpp b/src/SLADEMap/SLADEMap.cpp index eb931b48e..edbda2b42 100644 --- a/src/SLADEMap/SLADEMap.cpp +++ b/src/SLADEMap/SLADEMap.cpp @@ -48,6 +48,7 @@ using namespace slade; // ----------------------------------------------------------------------------- CVAR(Bool, map_split_auto_offset, true, CVar::Flag::Save) +static const double MERGE_ARCH_SPLIT_DIST = 0.1; // ----------------------------------------------------------------------------- // @@ -721,7 +722,7 @@ MapVertex* SLADEMap::mergeVerticesPoint(const Vec2d& pos) for (unsigned a = 0; a < vertices().size(); a++) { // Skip if vertex isn't on the point - if (vertex(a)->position_.x != pos.x || vertex(a)->position_.y != pos.y) + if (! vertex(a)->position_.closerThan(pos, MERGE_ARCH_SPLIT_DIST)) continue; // Set as the merge target vertex if we don't have one already @@ -1011,11 +1012,9 @@ bool SLADEMap::mergeArch(const vector& vertices) for (auto* connected_line : vertex->connected_lines_) VECTOR_ADD_UNIQUE(connected_lines, connected_line); - // Split lines (by vertices) - constexpr double split_dist = 0.1; // Split existing lines that vertices moved onto for (auto* merged : merged_vertices) - splitLinesAt(merged, split_dist); + splitLinesAt(merged, MERGE_ARCH_SPLIT_DIST); // Split lines that moved onto existing vertices for (unsigned a = 0; a < connected_lines.size(); a++) @@ -1029,7 +1028,7 @@ bool SLADEMap::mergeArch(const vector& vertices) if (connected_lines[a]->v1() == vertex || connected_lines[a]->v2() == vertex) continue; - if (connected_lines[a]->distanceTo(vertex->position()) < split_dist) + if (connected_lines[a]->distanceTo(vertex->position()) < MERGE_ARCH_SPLIT_DIST) { connected_lines.push_back(splitLine(connected_lines[a], vertex)); VECTOR_ADD_UNIQUE(merged_vertices, vertex); @@ -1068,8 +1067,6 @@ bool SLADEMap::mergeArch(const vector& vertices) splitLine(line2, nv); connected_lines.push_back(lines().last()); - LOG_DEBUG("Lines", line1, "and", line2, "intersect"); - a--; break; } diff --git a/src/UI/Controls/ResourceArchiveChooser.cpp b/src/UI/Controls/ResourceArchiveChooser.cpp index 4bb48e043..958811d66 100644 --- a/src/UI/Controls/ResourceArchiveChooser.cpp +++ b/src/UI/Controls/ResourceArchiveChooser.cpp @@ -34,6 +34,7 @@ #include "ResourceArchiveChooser.h" #include "App.h" #include "Archive/ArchiveManager.h" +#include "MainEditor/MainEditor.h" #include "UI/WxUtils.h" #include "Utility/SFileDialog.h" @@ -135,7 +136,7 @@ void ResourceArchiveChooser::onBtnOpenResource(wxCommandEvent& e) filedialog::FDInfo info; if (filedialog::openFile(info, "Open Resource Archive", app::archiveManager().getArchiveExtensionsString(), this)) { - ui::showSplash("Opening Resource Archive", true); + ui::showSplash("Opening Resource Archive", true, maineditor::windowWx()); auto na = app::archiveManager().openArchive(info.filenames[0], true, true); ui::hideSplash(); if (na) diff --git a/src/UI/Dialogs/GfxConvDialog.cpp b/src/UI/Dialogs/GfxConvDialog.cpp index 47b5f8274..2c1fca68e 100644 --- a/src/UI/Dialogs/GfxConvDialog.cpp +++ b/src/UI/Dialogs/GfxConvDialog.cpp @@ -39,6 +39,7 @@ #include "Graphics/Icons.h" #include "Graphics/Palette/PaletteManager.h" #include "Graphics/SImage/SIFormat.h" +#include "MainEditor/MainEditor.h" #include "UI/Canvas/GfxCanvas.h" #include "UI/Controls/ColourBox.h" #include "UI/Controls/PaletteChooser.h" @@ -646,7 +647,7 @@ void GfxConvDialog::onBtnConvert(wxCommandEvent& e) void GfxConvDialog::onBtnConvertAll(wxCommandEvent& e) { // Show splash window - ui::showSplash("Converting Gfx...", true); + ui::showSplash("Converting Gfx...", true, maineditor::windowWx()); // Convert all images for (size_t a = current_item_; a < items_.size(); a++) diff --git a/src/UI/SplashWindow.cpp b/src/UI/SplashWindow.cpp index 7c9e8ca45..d19e1dfa7 100644 --- a/src/UI/SplashWindow.cpp +++ b/src/UI/SplashWindow.cpp @@ -30,6 +30,8 @@ // Includes // // ----------------------------------------------------------------------------- +#include + #include "Main.h" #include "SplashWindow.h" #include "App.h" @@ -64,8 +66,10 @@ bool init_done = false; // ----------------------------------------------------------------------------- // SplashWindow class constructor // ----------------------------------------------------------------------------- -SplashWindow::SplashWindow() : - wxMiniFrame{ nullptr, -1, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE } +SplashWindow::SplashWindow(wxWindow* parent) : + wxMiniFrame{ + parent, -1, wxEmptyString, wxDefaultPosition, wxDefaultSize, + wxBORDER_NONE | (parent ? wxFRAME_FLOAT_ON_PARENT : 0) } { // Init wxMiniFrame::SetBackgroundStyle(wxBG_STYLE_PAINT); @@ -146,7 +150,7 @@ void SplashWindow::init() // Shows the splash window with [message]. // If [progress] is true, a progress bar will also be shown // ----------------------------------------------------------------------------- -void SplashWindow::show(const wxString& message, bool progress, wxWindow* parent) +void SplashWindow::show(const wxString& message, bool progress) { // Setup progress bar int rheight = img_height; @@ -159,13 +163,7 @@ void SplashWindow::show(const wxString& message, bool progress, wxWindow* parent else show_progress_ = false; - // Set parent - if (!parent && app::isInitialised()) - SetParent(maineditor::windowWx()); - else - SetParent(parent); - - // Show & init window + // Show & init window #ifndef __WXGTK__ SetInitialSize({ img_width, rheight }); #else @@ -194,6 +192,9 @@ void SplashWindow::forceRedraw() { Refresh(); Update(); + + // Spin the event loop once, to ensure we get our paint events. + wxTheApp->SafeYieldFor(nullptr, wxEVT_CATEGORY_UI); } diff --git a/src/UI/SplashWindow.h b/src/UI/SplashWindow.h index 7289767cf..65cce7bc5 100644 --- a/src/UI/SplashWindow.h +++ b/src/UI/SplashWindow.h @@ -5,7 +5,7 @@ namespace slade class SplashWindow : public wxMiniFrame { public: - SplashWindow(); + SplashWindow(wxWindow* parent = nullptr); ~SplashWindow() = default; float progress() const { return progress_; } @@ -13,7 +13,7 @@ class SplashWindow : public wxMiniFrame void setProgressMessage(const wxString& message); void setProgress(float progress); - void show(const wxString& message, bool progress = false, wxWindow* parent = nullptr); + void show(const wxString& message, bool progress = false); void hide(); void forceRedraw(); diff --git a/src/Utility/Polygon2D.h b/src/Utility/Polygon2D.h index a2c296caf..9b9f04134 100644 --- a/src/Utility/Polygon2D.h +++ b/src/Utility/Polygon2D.h @@ -32,6 +32,7 @@ class Polygon2D void setColour(float r, float g, float b, float a); bool hasPolygon() const { return !subpolys_.empty(); } int vboUpdate() const { return vbo_update_; } + void invalidateVBO() { vbo_update_ = 2; } void setZ(float z); void setZ(Plane plane); diff --git a/src/Utility/StringUtils.cpp b/src/Utility/StringUtils.cpp index 6040d63c7..0d56e6908 100644 --- a/src/Utility/StringUtils.cpp +++ b/src/Utility/StringUtils.cpp @@ -597,7 +597,7 @@ string_view strutil::beforeFirstV(string_view str, char chr) return str; } -vector strutil::split(string_view str, char separator) +vector strutil::split(string_view str, char separator, bool skip_duplicates) { unsigned start = 0; const auto size = str.size(); @@ -606,7 +606,8 @@ vector strutil::split(string_view str, char separator) { if (str[c] == separator) { - split.emplace_back(str.substr(start, c - start)); + if (! skip_duplicates || c > start) + split.emplace_back(str.substr(start, c - start)); start = c + 1; } } @@ -616,7 +617,7 @@ vector strutil::split(string_view str, char separator) return split; } -vector strutil::splitV(string_view str, char separator) +vector strutil::splitV(string_view str, char separator, bool skip_duplicates) { unsigned start = 0; const auto size = str.size(); @@ -625,7 +626,8 @@ vector strutil::splitV(string_view str, char separator) { if (str[c] == separator) { - split.push_back(str.substr(start, c - start)); + if (! skip_duplicates || c > start) + split.push_back(str.substr(start, c - start)); start = c + 1; } } diff --git a/src/Utility/StringUtils.h b/src/Utility/StringUtils.h index 6bd4477ed..e500e67be 100644 --- a/src/Utility/StringUtils.h +++ b/src/Utility/StringUtils.h @@ -90,8 +90,8 @@ namespace strutil string_view beforeLastV(string_view str, char chr); string beforeFirst(string_view str, char chr); string_view beforeFirstV(string_view str, char chr); - vector split(string_view str, char separator); - vector splitV(string_view str, char separator); + vector split(string_view str, char separator, bool skip_duplicates = false); + vector splitV(string_view str, char separator, bool skip_duplicates = false); string truncate(string_view str, unsigned length); string& truncateIP(string& str, unsigned length); string removeLast(string_view str, unsigned n); diff --git a/src/Utility/Structs.h b/src/Utility/Structs.h index 2c1e7090d..bbd14b41f 100644 --- a/src/Utility/Structs.h +++ b/src/Utility/Structs.h @@ -82,6 +82,14 @@ template struct Vec2 return std::sqrt((dist_x * dist_x) + (dist_y * dist_y)); } + bool closerThan(const Vec2 other, T max_dist) const + { + T dist_x = other.x - x; + T dist_y = other.y - y; + + return (dist_x * dist_x) + (dist_y * dist_y) < max_dist * max_dist; + } + // aka "Manhattan" distance -- just the sum of the vertical and horizontal // distance, and an upper bound on the true distance T taxicabDistanceTo(const Vec2& other) const diff --git a/src/Utility/Tokenizer.cpp b/src/Utility/Tokenizer.cpp index 848db84c2..fc48cbff6 100644 --- a/src/Utility/Tokenizer.cpp +++ b/src/Utility/Tokenizer.cpp @@ -69,6 +69,41 @@ bool isWhitespace(char p) // // ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// Parses a magic editor comment, as introduced by Doom Builder. +// Token should be of the form "//$Key ...". +// Returns a pair of the key (lowercased) and any value, or "true" if none. +// See also: https://zdoom.org/wiki/Editor_keys +// ----------------------------------------------------------------------------- + +// These aren't documented very well, and it's not really clear what the argument format is intended +// to be, but none of them seem to take more than one argument. So take the whole rest of the line, +// strip whitespace, and drop the quotes if any. +std::pair Tokenizer::parseEditorComment(string_view token) +{ + // Find the first space + size_t spos = token.find(" \t"); + if (spos == string_view::npos) + { + string key(token.substr(3)); + strutil::lowerIP(key); + return std::pair{ key, "true" }; + } + + string key(token.substr(3, spos - 3)); + strutil::lowerIP(key); + + string value(token.substr(spos)); + strutil::trimIP(value); + + // Strip quotes, if present + if (value.front() == '"' && value.back() == '"') + { + value.erase(value.back()); + value.erase(value.front()); + } + return std::pair{ key, value }; +} // ----------------------------------------------------------------------------- // Returns true if the token is a valid integer. If [allow_hex] is true, can diff --git a/src/Utility/Tokenizer.h b/src/Utility/Tokenizer.h index 3c450f499..4ac37e09e 100644 --- a/src/Utility/Tokenizer.h +++ b/src/Utility/Tokenizer.h @@ -70,6 +70,8 @@ class Tokenizer bool done = false; }; + static std::pair parseEditorComment(string_view token); + // Constructors Tokenizer(int comments = CommentTypes::Default, const string& special_characters = DEFAULT_SPECIAL_CHARACTERS);