From 72f3c3fe6c3cb51a4cd9db0342701023d70cf59d Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sat, 31 Dec 2022 13:38:05 -0500 Subject: [PATCH] Add Hexen line activation flags - Lines can be set to activate when crossing or bumping into them, with distinctions for players, enemies, and missiles+items. - A new flag has been added to determine if a line special can activate more than once. - Finish Line + Respawn Line are now handled like other specials. This means that: - They follow the new line activation rules (so you can potentially have a finish line that you have to bump instead of cross) - More importantly, they can be called as functions in ACS. (Player_FinishLine and Player_Respawn) - Fixed linedef flags not being saved in save games. --- extras/conf/udb/Includes/RingRacers_misc.cfg | 791 +++++++++++++++++++ src/p_spec.c | 2 +- 2 files changed, 792 insertions(+), 1 deletion(-) create mode 100644 extras/conf/udb/Includes/RingRacers_misc.cfg diff --git a/extras/conf/udb/Includes/RingRacers_misc.cfg b/extras/conf/udb/Includes/RingRacers_misc.cfg new file mode 100644 index 000000000..df17459f7 --- /dev/null +++ b/extras/conf/udb/Includes/RingRacers_misc.cfg @@ -0,0 +1,791 @@ +linedefflags +{ + 1 = "[0] Impassable"; + 2 = "[1] Block Players"; + 4 = "[2] Double-Sided"; + 8 = "[3] Upper Unpegged"; + 16 = "[4] Lower Unpegged"; + 32 = "[5] Slope Skew"; + 64 = "[6] Not Climbable"; + 128 = "[7] No Midtexture Skew"; + 256 = "[8] Peg Midtexture"; + 512 = "[9] Solid Midtexture"; + 1024 = "[10] Repeat Midtexture"; + 2048 = "[11] Netgame Only"; + 4096 = "[12] No Netgame"; + 8192 = "[13] Block Enemies"; + 16384 = "[14] Don't Bounce"; + 32768 = "[15] FOF Transfer"; +} + + +// Linedef flags UDMF translation table +// This is needed for copy/paste and prefabs to work properly +// When the UDMF field name is prefixed with ! it is inverted +linedefflagstranslation +{ + 1 = "blocking"; + 2 = "blockplayers"; + 4 = "twosided"; + 8 = "dontpegtop"; + 16 = "dontpegbottom"; + 32 = "skewtd"; + 64 = "noclimb"; + 128 = "noskew"; + 256 = "midpeg"; + 512 = "midsolid"; + 1024 = "wrapmidtex"; + 2048 = "netonly"; + 4096 = "nonet"; + 8192 = "blockmonsters"; + 16384 = "notbouncy"; + 32768 = "transfer"; +} + + +linedefflags_udmf +{ + blocking = "Impassable"; + blockplayers = "Block Players"; + twosided = "Double-Sided"; + dontpegtop = "Upper Unpegged"; + dontpegbottom = "Lower Unpegged"; + skewtd = "Slope Skew"; + noclimb = "Not Climbable"; + noskew = "No Midtexture Skew"; + midpeg = "Peg Midtexture"; + midsolid = "Solid Midtexture"; + wrapmidtex = "Repeat Midtexture"; + netonly = "Netgame Only"; + nonet = "No Netgame"; + blockmonsters = "Block Enemies"; + bouncy = "Don't Bump"; + transfer = "FOF Transfer"; +} + +linedefactivations +{ + 1 = "When player crosses"; + 2 = "When enemy crosses"; + 4 = "When projectile crosses"; + 8 = "When player bumps"; + 16 = "When enemy bumps"; + 32 = "On projectile impact"; +} + +linedefactivations_udmf +{ + repeatspecial + { + name = "Repeatable action"; + istrigger = false; + } + playercross = "When player crosses"; + playerpush = "When player bumps"; + monstercross = "When enemy crosses"; + monsterpush = "When enemy bumps"; + missilecross = "When projectile crosses"; + impact = "On projectile impact"; +} + +linedefrenderstyles +{ + translucent = "Translucent"; + add = "Add"; + subtract = "Subtract"; + reversesubtract = "Reverse subtract"; + modulate = "Modulate"; + fog = "Fog"; +} + +sectorflags +{ + colormapfog = "Fog Planes in Colormap"; + colormapfadesprites = "Fade Fullbright in Colormap"; + colormapprotected = "Protected Colormap"; + flipspecial_nofloor = "No Trigger on Floor Touch"; + flipspecial_ceiling = "Trigger on Ceiling Touch"; + triggerspecial_touch = "Trigger on Edge Touch"; + triggerspecial_headbump = "Trigger on Headbump"; + triggerline_plane = "Linedef Trigger Requires Plane Touch"; + triggerline_mobj = "Non-Pushables Can Trigger Linedef"; + invertprecip = "Invert Precipitation"; + gravityflip = "Flip Objects in Reverse Gravity"; + heatwave = "Heat Wave"; + noclipcamera = "Intangible to the Camera"; + ripple_floor = "Water Ripple Floor"; + ripple_ceiling = "Water Ripple Ceiling"; + invertencore = "Encore Remap Invert"; + nostepup = "Wall Sector (no step-up)"; + doublestepup = "Ramp Sector (double step-up/down)"; + nostepdown = "Non-Ramp Sector (no step-down)"; + starpostactivator = "Star Post Activator"; + exit = "Exit"; + fan = "Fan Sector"; + deleteitems = "Delete Items"; + zoomtubestart = "Zoom Tube Start"; + zoomtubeend = "Zoom Tube End"; +} + +thingflags +{ + 1 = "[1] Extra"; + 2 = "[2] Flip"; + 4 = "[4] Special"; + 8 = "[8] Ambush"; +} + +// THING FLAGS +thingflags_udmf +{ + flip = "Flip"; +} + + +// Thing flags UDMF translation table +// This is needed for copy/paste and prefabs to work properly +// When the UDMF field name is prefixed with ! it is inverted +thingflagstranslation +{ + 2 = "flip"; +} + + +// DEFAULT SECTOR BRIGHTNESS LEVELS +sectorbrightness +{ + 255; + 248; + 240; + 232; + 224; + 216; + 208; + 200; + 192; + 184; + 176; + 168; + 160; + 152; + 144; + 136; + 128; + 120; + 112; + 104; + 96; + 88; + 80; + 72; + 64; + 56; + 48; + 40; + 32; + 24; + 16; + 8; + 0; +} + +numbrightnesslevels = 32; + +/* +TEXTURES AND FLAT SOURCES +This tells Doom Builder where to find the information for textures +and flats in the IWAD file, Addition WAD file and Map WAD file. + +Start and end lumps must be given in a structure (of which the +key name doesnt matter) and any textures or flats in between them +are loaded in either the textures category or flats category. + +For textures: PNAMES, TEXTURE1 and TEXTURE2 are loaded by default. +*/ +textures +{ + zdoom1 + { + start = "TX_START"; + end = "TX_END"; + } +} + +/* +ADDITIONAL UNIVERSAL DOOM MAP FORMAT FIELD DEFINITIONS +Only add fields here that Doom Builder does not edit with its own user-interface! +The "default" field must match the UDMF specifications! + +Field data types: +0 = integer * +1 = float +2 = string +3 = bool +4 = linedef action (integer) * +5 = sector effect (integer) * +6 = texture (string) +7 = flat (string) +8 = angle in degrees (integer) +9 = angle in radians (float) +10 = XXRRGGBB color (integer) +11 = enum option (integer) * +12 = enum bits (integer) * +13 = sector tag (integer) * +14 = thing tag (integer) * +15 = linedef tag (integer) * +16 = enum option (string) +17 = angle in degrees (float) +22 = byte angle (integer) +*/ +universalfields +{ + sector + { + } + + linedef + { + } + + sidedef + { + } + + thing + { + } +} + +/* +MAP LUMP NAMES +Map lumps are loaded with the map as long as they are right after each other. When the editor +meets a lump which is not defined in this list it will ignore the map if not satisfied. +The order of items defines the order in which lumps will be written to WAD file on save. +To indicate the map header lump, use ~MAP + +Legenda: +required = Lump is required to exist. +blindcopy = Lump will be copied along with the map blindly. (useful for lumps Doom Builder doesn't use) +nodebuild = The nodebuilder generates this lump. +allowempty = The nodebuilder is allowed to leave this lump empty. +scriptbuild = This lump is a text-based script, which should be compiled using current script compiler; +script = This lump is a text-based script. Specify the filename of the script configuration to use. +*/ + +doommaplumpnames +{ + ~MAP + { + required = true; + blindcopy = true; + nodebuild = false; + } + + THINGS + { + required = true; + nodebuild = true; + allowempty = true; + } + + LINEDEFS + { + required = true; + nodebuild = true; + allowempty = false; + } + + SIDEDEFS + { + required = true; + nodebuild = true; + allowempty = false; + } + + VERTEXES + { + required = true; + nodebuild = true; + allowempty = false; + } + + SEGS + { + required = false; + nodebuild = true; + allowempty = false; + } + + SSECTORS + { + required = false; + nodebuild = true; + allowempty = false; + } + + NODES + { + required = false; + nodebuild = true; + allowempty = false; + } + + SECTORS + { + required = true; + nodebuild = true; + allowempty = false; + } + + REJECT + { + required = false; + nodebuild = true; + allowempty = false; + } + + BLOCKMAP + { + required = false; + nodebuild = true; + allowempty = true; + } +} + +udmfmaplumpnames +{ + ZNODES + { + required = false; + nodebuild = true; + allowempty = false; + } + + REJECT + { + required = false; + nodebuild = true; + allowempty = false; + } + + BLOCKMAP + { + required = false; + nodebuild = true; + allowempty = true; + } +} + +// Because Ring Racers has a versatile virtual resource +// system, we can separate these out a bit more. +sharedmaplumpnames +{ + BEHAVIOR + { + required = false; + blindcopy = true; + nodebuild = false; + } + + SCRIPTS + { + required = false; + nodebuild = false; + script = "RingRacers_ACS.cfg"; + } + + PICTURE + { + required = false; + blindcopy = true; + nodebuild = false; + } + + MINIMAP + { + required = false; + blindcopy = true; + nodebuild = false; + } + + TWEAKMAP + { + required = false; + blindcopy = true; + nodebuild = false; + } + + ENCORE + { + required = false; + blindcopy = true; + nodebuild = false; + } +} + +// ENUMERATIONS +// These are enumerated lists for linedef types and UDMF fields. +// Reserved names are: angledeg, anglerad, color, texture, flat +enums +{ + falsetrue + { + 0 = "False"; + 1 = "True"; + } + + yesno + { + 0 = "Yes"; + 1 = "No"; + } + + noyes + { + 0 = "No"; + 1 = "Yes"; + } + + setadd + { + 0 = "Set"; + 1 = "Add"; + } + + onoff + { + 0 = "On"; + 1 = "Off"; + } + + offon + { + 0 = "Off"; + 1 = "On"; + } + + updown + { + 0 = "Up"; + 1 = "Down"; + } + + downup + { + 0 = "Down"; + 1 = "Up"; + } + + frontback + { + 0 = "None"; + 1 = "Front"; + 2 = "Back"; + } + + frontbackboth + { + 0 = "Front"; + 1 = "Back"; + 2 = "Front and back"; + } + + tangibility + { + 1 = "Intangible from top"; + 2 = "Intangible from bottom"; + 4 = "Don't block players"; + 8 = "Don't block non-players"; + } + + floorceiling + { + 0 = "Floor"; + 1 = "Ceiling"; + 2 = "Both"; + } + + scrollcarry + { + 0 = "Scroll and carry"; + 1 = "Scroll"; + 2 = "Carry"; + } + + scrolltype + { + 0 = "Regular"; + 1 = "Accelerative"; + 2 = "Displacement"; + } + + comparison + { + 0 = "Equal"; + 1 = "Less than or equal"; + 2 = "Greater than or equal"; + } + + triggertype + { + 0 = "Continuous"; + 1 = "Once"; + 2 = "Each time on entry"; + 3 = "Each time on entry/exit"; + } + + xtriggertype + { + 0 = "Continuous"; + 1 = "Each time on entry"; + 2 = "Each time on entry/exit"; + } + + team + { + 0 = "Red"; + 1 = "Blue"; + } + + flagcheck + { + 0 = "Has all"; + 1 = "Has any"; + 2 = "Has exactly"; + 3 = "Doesn't have all"; + 4 = "Doesn't have any"; + } + + maceflags + { + 1 = "Double size"; + 2 = "No sounds"; + 4 = "Player-turnable chain"; + 8 = "Swing instead of spin"; + 16 = "Make chain from end item"; + 32 = "Spawn link at origin"; + 64 = "Clip inside ground"; + 128 = "No distance check"; + } + + pushablebehavior + { + 0 = "Normal"; + 1 = "Slide"; + 2 = "Immovable"; + 3 = "Classic"; + } + + monitorrespawn + { + 0 = "Same item"; + 1 = "Random (Weak)"; + 2 = "Random (Strong)"; + } + + blendmodes + { + 0 = "Translucent"; + 1 = "Add"; + 2 = "Subtract"; + 3 = "Reverse subtract"; + 4 = "Modulate"; + } + + rritems + { + 0 = "Rings"; + 1 = "Sneaker"; + 2 = "Rocket Sneaker"; + 3 = "Invincibility"; + 4 = "Banana"; + 5 = "Eggman Mark"; + 6 = "Orbinaut"; + 7 = "Jawz"; + 8 = "Proximity Mine"; + 9 = "Land Mine"; + 10 = "Ballhog"; + 11 = "SPB"; + 12 = "Grow"; + 13 = "Shrink"; + 14 = "Lightning Shield"; + 15 = "Bubble Shield"; + 16 = "Flame Shield"; + 17 = "Hyudoro"; + 18 = "Pogo Spring"; + 19 = "Super Ring"; + 20 = "Kitchen Sink"; + 21 = "Drop Target"; + 22 = "Garden Top"; + } +} + +//Default things filters +thingsfilters +{ + filter0 + { + name = "Player starts"; + category = "starts"; + type = -1; + } + + filter1 + { + name = "Normal Gravity"; + category = ""; + type = -1; + + fields + { + 2 = false; + } + + } + + filter2 + { + name = "Reverse Gravity"; + category = ""; + type = -1; + + fields + { + 2 = true; + } + + } + + filter3 + { + name = "Rings"; + category = ""; + type = 300; + } + + filter4 + { + name = "Waypoints"; + category = "waypoints"; + } +} + +// Special linedefs +speciallinedefs +{ + soundlinedefflag = 64; // See linedefflags + singlesidedflag = 1; // See linedefflags + doublesidedflag = 4; // See linedefflags + impassableflag = 1; + upperunpeggedflag = 8; + lowerunpeggedflag = 16; + repeatmidtextureflag = 1024; + pegmidtextureflag = 256; +} + +speciallinedefs_udmf +{ + soundlinedefflag = "noclimb"; + singlesidedflag = "blocking"; + doublesidedflag = "twosided"; + impassableflag = "blocking"; + upperunpeggedflag = "dontpegtop"; + lowerunpeggedflag = "dontpegbottom"; + repeatmidtextureflag = "wrapmidtex"; + pegmidtextureflag = "midpeg"; +} + +scriptlumpnames +{ + MAINCFG + { + script = "SOC.cfg"; + } + + OBJCTCFG + { + script = "SOC.cfg"; + } + + SOC_ + { + script = "SOC.cfg"; + isprefix = true; + } + + LUA_ + { + script = "Lua.cfg"; + isprefix = true; + } +} + +// Texture sources +textures +{ + zdoom1 + { + start = "TX_START"; + end = "TX_END"; + } +} + +// Patch sources +patches +{ + standard1 + { + start = "P_START"; + end = "P_END"; + } + + standard2 + { + start = "PP_START"; + end = "PP_END"; + } +} + +// Sprite sources +sprites +{ + standard1 + { + start = "S_START"; + end = "S_END"; + } + + standard2 + { + start = "SS_START"; + end = "SS_END"; + } +} + +// Flat sources +flats +{ + standard1 + { + start = "F_START"; + end = "F_END"; + } + + standard2 + { + start = "FF_START"; + end = "FF_END"; + } + + standard3 + { + start = "FF_START"; + end = "F_END"; + } + + standard4 + { + start = "F_START"; + end = "FF_END"; + } +} diff --git a/src/p_spec.c b/src/p_spec.c index 14b8df6ff..6ec94cb15 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4106,7 +4106,7 @@ boolean P_ProcessSpecial(activator_t *activator, INT16 special, INT32 *args, cha } } break; - + case 480: // Polyobj_DoorSlide case 481: // Polyobj_DoorSwing PolyDoor(line);