From cf8c05c9c45b70450dfaf4630d6bd33fae76a91e Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Thu, 21 Nov 2019 16:58:28 +0200 Subject: [PATCH 1/2] - fixed missing checks for function calls from DECORATE State functions could call ZScript code with incompatible self pointer, e.g. weapon's function could be called with self pointed to player pawn DECORATE scripts that contain such errors are no longer accepted https://forum.zdoom.org/viewtopic.php?t=66429 --- src/scripting/decorate/thingdef_exp.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/scripting/decorate/thingdef_exp.cpp b/src/scripting/decorate/thingdef_exp.cpp index 4a1a82922..9b78a5f28 100644 --- a/src/scripting/decorate/thingdef_exp.cpp +++ b/src/scripting/decorate/thingdef_exp.cpp @@ -510,7 +510,8 @@ static FxExpression *ParseExpression0 (FScanner &sc, PClassActor *cls) sc.UnGet(); ParseFunctionParameters(sc, cls, args, func, "", nullptr); } - return new FxVMFunctionCall(new FxSelf(sc), func, args, sc, false); + // FxVMFunctionCall cannot be used here as it lacks some important checks + return new FxFunctionCall(identifier, NAME_None, args, sc); } } From f941c98c1e3b17531466549e58322f7627ccfc1e Mon Sep 17 00:00:00 2001 From: Ed the Bat Date: Thu, 21 Nov 2019 14:41:07 -0500 Subject: [PATCH 2/2] Compatibility fixes for Clavicula Nox https://www.doomworld.com/idgames/levels/doom2/Ports/a-c/clavnoxr This Vavoom mod was unplayable in G/ZDoom without cheating, due to how swimmable water was implemented. This finally fixes it to work. --- wadsrc/static/zscript/level_compatibility.zs | 142 +++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/wadsrc/static/zscript/level_compatibility.zs b/wadsrc/static/zscript/level_compatibility.zs index 6d891602b..1dd67c4e9 100644 --- a/wadsrc/static/zscript/level_compatibility.zs +++ b/wadsrc/static/zscript/level_compatibility.zs @@ -1520,6 +1520,148 @@ class LevelCompatibility : LevelPostProcessor SetLineSpecial(564, Exit_Normal, 0); break; } + + case '9B966DA88265AC8972B7E15C86928AFB': // Clavicula Nox: Revised Edition map01 + { + // All swimmable water in Clavicula Nox is Vavoom-style, and doesn't work. + // Change it to ZDoom-style and extend the control sector heights to fill. + // Lava also sometimes needs the damage effect added manually. + SetLineSpecial(698, 160, 4, 2, 0, 128); + OffsetSectorPlane(121, Sector.floor, -32); + break; + } + + case '9FD0C47C2E132F64B48CA5BFBDE47F1D': // clavnoxr map02 + { + SetLineSpecial(953, 160, 12, 2, 0, 128); + OffsetSectorPlane(139, Sector.floor, -24); + SetLineSpecial(989, 160, 13, 2, 0, 128); + OffsetSectorPlane(143, Sector.floor, -24); + SetLineSpecial(1601, 160, 19, 2, 0, 128); + SetLineSpecial(1640, 160, 20, 2, 0, 128); + SetLineSpecial(1641, 160, 21, 2, 0, 128); + OffsetSectorPlane(236, Sector.floor, -96); + break; + } + + case '969B9691007490CF022B632B2729CA49': // clavnoxr map03 + { + SetLineSpecial(96, 160, 1, 2, 0, 128); + OffsetSectorPlane(11, Sector.floor, -80); + SetLineSpecial(955, 160, 13, 2, 0, 128); + OffsetSectorPlane(173, Sector.floor, -16); + SetLineSpecial(1082, 160, 14, 2, 0, 128); + OffsetSectorPlane(195, Sector.floor, -16); + SetLineSpecial(1111, 160, 15, 2, 0, 128); + OffsetSectorPlane(203, Sector.floor, -16); + SetLineSpecial(1115, 160, 16, 2, 0, 128); + OffsetSectorPlane(204, Sector.floor, -16); + SetLineSpecial(1163, 160, 17, 2, 0, 128); + OffsetSectorPlane(216, Sector.floor, -56); + SetLineSpecial(1169, 160, 18, 2, 0, 128); + OffsetSectorPlane(217, Sector.floor, -16); + break; + } + + case '748EDAEB3990F13B22C13C593631B2E6': // clavnoxr map04 + { + SetLineSpecial(859, 160, 22, 2, 0, 128); + SetLineSpecial(861, 160, 23, 2, 0, 128); + OffsetSectorPlane(172, Sector.floor, -168); + break; + } + + case 'A066B0B432FAE8ED20B83383F9E03E12': // clavnoxr map05 + { + SetLineSpecial(1020, 160, 2, 2, 0, 128); + SetSectorSpecial(190, 69); + OffsetSectorPlane(190, Sector.floor, -24); + break; + } + + case '5F36D758ED26CAE907FA79902330877D': // clavnoxr map06 + { + SetLineSpecial(1086, 160, 1, 2, 0, 128); + SetLineSpecial(60, 160, 4, 2, 0, 128); + SetLineSpecial(561, 160, 2, 2, 0, 128); + SetLineSpecial(280, 160, 3, 2, 0, 128); + SetLineSpecial(692, 160, 5, 2, 0, 128); + SetLineSpecial(1090, 160, 7, 2, 0, 128); + SetLineSpecial(1091, 160, 8, 2, 0, 128); + SetLineSpecial(1094, 160, 9, 2, 0, 128); + SetLineSpecial(1139, 160, 12, 2, 0, 128); + SetLineSpecial(1595, 160, 16, 2, 0, 128); + SetLineSpecial(1681, 160, 17, 2, 0, 128); + SetLineSpecial(1878, 160, 20, 2, 0, 128); + SetLineSpecial(1882, 160, 22, 2, 0, 128); + OffsetSectorPlane(8, Sector.floor, -64); + OffsetSectorPlane(34, Sector.floor, -24); + OffsetSectorPlane(64, Sector.floor, -16); + OffsetSectorPlane(102, Sector.floor, -16); + OffsetSectorPlane(170, Sector.floor, -64); + OffsetSectorPlane(171, Sector.floor, -64); + OffsetSectorPlane(178, Sector.floor, -16); + OffsetSectorPlane(236, Sector.floor, -16); + OffsetSectorPlane(250, Sector.floor, -16); + OffsetSectorPlane(283, Sector.floor, -64); + OffsetSectorPlane(284, Sector.floor, -56); + break; + } + + case 'B7E98C1EA1B38B707ADA8097C25CFA75': // clavnoxr map07 + { + SetLineSpecial(1307, 160, 22, 2, 0, 128); + SetLineSpecial(1305, 160, 23, 2, 0, 128); + OffsetSectorPlane(218, Sector.floor, -64); + break; + } + + case '7DAB2E8BB5759D742211505A3E5054D1': // clavnoxr map08 + { + SetLineSpecial(185, 160, 1, 2, 0, 128); + SetLineSpecial(735, 160, 13, 2, 0, 128); + OffsetSectorPlane(20, Sector.floor, -16); + SetSectorSpecial(20, 69); + OffsetSectorPlane(102, Sector.floor, -64); + break; + } + + case 'C17A9D1350399E251C70711EB22856AE': // clavnoxr map09 + { + SetLineSpecial(63, 160, 1, 2, 0, 128); + SetLineSpecial(84, 160, 2, 2, 0, 128); + SetLineSpecial(208, 160, 4, 2, 0, 128); + SetLineSpecial(326, 160, 6, 2, 0, 128); + SetLineSpecial(433, 160, 10, 2, 0, 128); + OffsetSectorPlane(6, Sector.floor, -64); + OffsetSectorPlane(9, Sector.floor, -64); + OffsetSectorPlane(34, Sector.floor, -64); + OffsetSectorPlane(59, Sector.floor, -64); + SetSectorSpecial(75, 69); + OffsetSectorPlane(75, Sector.floor, -64); + break; + } + + case 'B6BB8A1792FE51C773E6770CD91DB618': // clavnoxr map11 + { + SetLineSpecial(1235, 160, 23, 2, 0, 128); + SetLineSpecial(1238, 160, 24, 2, 0, 128); + OffsetSectorPlane(240, Sector.floor, -80); + break; + } + + case 'ADDF57B80E389F86D324571D43F3CAB7': // clavnoxr map12 + { + SetLineSpecial(1619, 160, 19, 2, 0, 128); + SetLineSpecial(1658, 160, 20, 2, 0, 128); + SetLineSpecial(1659, 160, 21, 2, 0, 128); + OffsetSectorPlane(254, Sector.floor, -160); + // Raising platforms in MAP12 didn't work, so this will redo them. + SetLineSpecial(1469, 160, 6, 1, 0, 255); + OffsetSectorPlane(65, Sector.floor, -8); + OffsetSectorPlane(65, Sector.ceiling, 8); + break; + } } } }