Grazza
omg lolcano

Posts: 9587
Registered: 07-02 |
WARNING: Highly technical information follows. You probably don't need to study this at all unless you want to investigate this stuff. Worth a quick look to see if there are any known issues on any maps you plan to record on though. Or if you're making a "vanilla" wad and just want some tips on how to avoid triggering overflows (or at least reduce the risk of them), read the text immediately below (in yellow).
To avoid spechits overflows: Avoid a situation where you have more than 8 special lines so close together that a player or monster is able to cross them all at the same time. Remember that some monsters have a larger radius than the player.
To avoid reject overflows: Use a good reject map builder - any modern one should be OK.
To reduce the chance of intercepts overflows: Make sure that linedef 0 is very short, and perhaps out of the main area of play.
To avoid playeringame overflows: Don't obstruct your player start positions.
If you've read this thread you'll know roughly what a spechits overflow is, and that it can lead to desyncs. You may also be aware that recent versions of Prboom-plus can detect them, and attempt to emulate the behaviour of the vanilla exes and Dosdoom/Tasdoom in this respect. Chocolate-Doom also includes similar code to emulate the vanilla behaviour.
I have compiled a list of maps where spechits overflows can occur, together with some notes on their effects. I have also done so for maps with Reject overflows and demos with Intercepts overflows (which often results in the all ghosts bug). Here are the tables; some notes follow.
Table of maps for which spechits overflows are possible
| pwad | map red if critical | example demo yellow if Tasdoom | lines leading to overflow | comments on effects, desyncs and emulation in current Prboom-plus; bold if critical | | 1024 | map23 | 2423-301.lmp | 3055, 3056, 3057, 3058, 3066, 3072, 3073, 3074, 3075 | behaviour depends on magic number; 2423-301.lmp is OK with the default magic number, but desyncs with the alternate (2230937832) | | 2sectors | map01 | 2s01-030.lmp | 1025, 1050, 1069, 1093, 1152, 1153, 1154, 1155, 1158 | benign? | | aboo4 (original version) | map01 | none | 613, 616, 617, 619, 620, 622, 623, 625, 626 | unknown - no demos to test it with | | av | map05 | av05-227.lmp | 2265, 2266, 2269, 2270, 2281, 2284, 2305, 2306, 2309 | benign? | | av | map15 | av15-317.lmp av15-612.lmp av15-623.lmp av15-638.lmp av15-715.lmp af151000.lmp | 2098, 2106, 2109, 2110, 2097, 2104, 2105, 2108, 2111 or similar | system-dependent in Doom2.exe; emulated OK; the example demos need a magic number with prboom-plus: -spechit 2230937832 works in all cases; other compet-n demos on this map play back OK with the default magic number | | av | map21 | at211122.lmp | 1316, 1506, 1507, 1965, 1967, 1968, 1969, 1226, 1966 | benign? this is the only demo on this map with this overflow | | av | map26 | av261924.lmp | 4131, 4132, 4133, 4140, 4141, 4142, 4143, 4144, 4145 | benign? this is the only demo on this map with this overflow; it also features a benign intercepts overflow | | base666 | map01 | btas1056.lmp | 1206, 1217, 1218, 1592, 1593, 1598, 1599, 1600, 1601 | benign? | | belltoll | map02 | none | 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8109, 8111 | unknown - no demos to test it with | | biotech | map03 | none | 848, 849, 850, 851, 852, 854, 853, 855, 856 | unknown - no demos to test it with | | biowar | map13 | bw131304.lmp | 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658 | benign? | | cchest2 | map24 | none | 6260, 6261, 6262, 6263, 6265, 6268, 6271, 6264, 6267 and other(s) | unknown; there's more than one place where an overflow can occur - the map is full of special lines | | class_e2 | e1m8 | none | 566, 568, 572, 562, 563, 595, 596, 597, 598 | unknown - no demos to test it with | | darken | map08 | darken08.lmp | 1837, 1844, 1834, 1835, 1836, 1838, 1839, 1840, 1841 | benign? | | datavill (hacx pwad) | map19 | none | 1005, 1004, 1495, 1496, 1499, 1500, 1509, 1510, 1524 | unknown - no demos to test it with | | dmdhzfan | map01 | none | 18, 19, 20, 21, 22, 25, 48, 50, 56 | unknown - this map is a tech demo; note that the fan causes the overflow | | dmplylnd | e2m3 | none | 447, 448, 449, 450, 459, 461, 463, 465, 499 | unknown - no demos to test it with | | doom | e4m1 | c4m1o139.lmp c4m1v139.lmp c4n1-055.lmp c4x1-055.lmp e4m1-216.lmp ep4-2207.lmp ep4-2631.lmp ep4-3500.lmp ep4-3945.lmp f4m1-243.lmp f4m1-256.lmp f4m1-426.lmp n4s1-058.lmp r4m1-137.lmp r4m1-344.lmp t4m1long.lmp u4m1-228.lmp u4m1-232.lmp e4ns1246.lmp r4m1-152.lmp r4m1-525.lmp
| 256, 257, 258, 262, 264, 266, 267, 268, 270 or similar | An overflow in an id map! It occurs when a spectre walks over the NIN secret; emulated OK, it seems, and can lead to desyncs: e4ns1246 desyncs without emulation (though the player exits E4M1, and dies early in E4M2), and so does r4m1-152; r4m1-525 requires -spechit 2230937832; the others listed all play back OK with or without emulation | | doom2 v1.666 | map02 | uvlev2.lmp | 117, 118, 119, 122, 123, 124, 453, 454, 455 | benign? These bars were removed in v1.9; the demo can be found here | | dv | map01 | dv01-max-2942-wh.lmp | 3461, 3526, 3536, 3609, 3655, 4420, 4568, 1472, 1946 | benign? | | dyst3 | map08 | dyst3-08.lmp | 1180, 1181, 1184, 1185, 1190, 1196, 1197, 1203, 1214 | benign? | | eternal | map12 | et122614.lmp | 1350, 1355, 1356, 15, 1349, 16, 1348, 1362, 1361 | benign? | | eternall.wad (from eternal.zip) | map25 | et252031.lmp | 638, 1910, 1911, 1914, 1915, 1916, 1917, 1919, 1920 | benign? | | eternal | map31 | et312225.lmp | 2921, 2922, 2923, 2924, 2933, 2936, 2942, 2943, 2965 | emulated OK; likely to lead to desyncs if not emulated | | extremal | e3m8 | none | 271, 272, 273, 276, 277, 278, 279, 280, 281 | unknown - no demos to test it with | | flsofdth | e4m3 | fod3uv.lmp | 604, 605, 716, 717, 718, 719, 728, 729, 730 | the example demo is for tasdoom, and it is emulated OK | | grind2x | map01 | gr2x_847.lmp | 1522, 1538, 1539, 1542, 1540, 1543, 1544, 1545, 1547 | a spechits magic number such as 2230937832 is needed with prboom-plus | |
| gunsmoke | map01 | none | 2509, 2510, 2511, 2512, 2513, 2515, 2514, 2517, 2518 | unknown - no demos to test it with; overflow can occur when running into any of the three bars, which have many blue-keyed sides | h2h-xmas | map26 | xm26-313.lmp | 586, 587, 588, 590, 591, 592, 594, 595, 596 | benign? | | hacx | map04 | hx04-724.lmp | 1336, 1338, 1340, 1341, 1344, 1345, 1348, 1349, 1350 | benign? | | hacx | map09 | hx09-847.lmp | 1149, 1151, 1163, 1169, 1170, 1171, 1172, 1176, 1177 | benign? | | hr | map18 | hr18-348.lmp hr181329.lmp | 1077, 1080, 1151, 1152, 1153, 1154, 1171, 1173, 1174 | emulated OK (Doom2.exe and Tasdoom); likely to lead to desyncs if not emulated | | hr2final | map19 | hr2-lv19.lmp | 169, 3068, 3081, 3087, 3088, 3089, 3096, 3097, 3098 | benign? | | hr2final | map31 | hr2-lv31.lmp | 522, 560, 561, 562, 563, 564, 565, 566, 1858 | probably emulated OK; demos recorded without emulation desync if played back with emulation in the same way they do with Doom2.exe | | icarus | map09 | ic09uvgb.lmp ic09uv.lmp | 389, 400, 434, 436, 437, 439, 440, 441, 442 | benign?; ic09uv.lmp is for tasdoom and it is emulated OK | | ksutra | map18 | ks181235.lmp | 5748, 5749, 5750, 2848, 2885, 2886, 5745, 5746, 5747 | benign? | | ksutra | map23 | ks23-201.lmp | 3099, 3100, 3101, 3104, 3105, 3106, 3107, 3108, 3109 | benign? | | ksutra | map31 | ks311117.lmp | 1892, 1893, 1895, 1897, 1898, 1899, 1900, 1901, 1904 | benign? | | mm | map02 | mm021204.lmp | 307, 965, 966, 968, 974, 975, 964, 967, 970 | benign? | | mm | map05 | mm05r554.lmp | 961, 963, 952, 953, 954, 955, 956, 957, 958 | playback is presumably system-dependent with Doom2.exe; a spechits magic number such as 2230937832 is needed with prboom-plus; this demo crashes timer.exe; the overflow occurs when a pain elemental crosses the (lowered) red key bars. | | mm | map08 | mm08-119.lmp | 714, 722, 723, 726, 733, 734, 735, 736, 738 | benign? | | mm | map28 | 30mm8356.lmp | 2022, 2023, 2025, 2015, 2016, 2017, 2018, 2019, 2020 | benign? | | mm2 | map18 | m218nmx.lmp | 3163, 3164, 3534, 3535, 3536, 3537, 3538, 3539, 3540 | benign? | | mm2 | map20 | m220-547.lmp | 441, 507, 524, 533, 612, 613, 611, 615, 519 | benign? the overflow occurs when an arachnotron (large radius) crosses these lines | | ndcp | map06 | none | 1315, 1370, 1371, 3755, 3756, 3757, 3758, 3759, 3760 | unknown | | ongar | map10 | none | 128, 130, 131, 132, 134, 135, 122, 123, 124 | unknown | | pe4_dt2 | e4m2 | p4e2s052.lmp p4p2s118.lmp | 243, 244, 245, 246, 247, 248, 249, 250, 251 | p4p2s118.lmp plays back OK with or without emulation (but crashes timer.exe); p4e2s052.lmp requires, e.g., -spechit 2230937832 | | requiem | map03 | rq03-136.lmp | 1186, 1284, 1285, 1286, 1287, 1294, 1295, 1296, 1297 | benign? | | requiem | map15 | rq151440.lmp | 2000, 2004, 2010, 1976, 1981, 1982, 1983, 2014, 2018 | benign? | | requiem | map16 | rr16-955.lmp | 1115, 1116, 1117, 1119, 1122, 1123, 1124, 1125, 1118 | benign? | | requiem + req21fix | map21 | rq21-636.lmp | 2507, 2508, 2510, 2511, 2513, 2514, 2516, 2517, 2512 | benign? note that the overflow occurs even with the fixed version of the map, used for recording | | requiem | map31 | rq31s115.lmp | 317, 320, 1779, 1780, 1784, 1785, 1786, 1787, 1788 | benign? | | squadron | map01 | sq417-01.lmp | 209, 210, 211, 212, 217, 218, 219, 220, 229 | benign? trivial map anyway | | sci2 | map03 | s203n245.lmp | 1262, 1263, 1264, 1265, 1266, 1268, 1267, 1269, 1270 | benign? | | sci2 | map05 | s205n546.lmp | 2268, 2269, 2270, 2271, 2273, 2274, 2275, 2287, 2288 | emulated OK; playback is system-dependent with Doom2.exe; a spechits magic number such as 2230937832 is needed with prboom-plus | | sci2 | map07 | s207n516.lmp | 1527, 1528, 1529, 1531, 1532, 1533, 1535, 1536, 1537 | emulated OK; playback is system-dependent with Doom2.exe; a spechits magic number such as 2231485512 is needed with prboom-plus | | sci2 | map16 | s216n241.lmp | 1527, 1528, 1529, 1531, 1532, 1533, 1535, 1536, 1537 | benign? | | scythe | map18 | sc18-sp.lmp sc18e036.lmp sc18m036.lmp | 351, 352, 353, 354, 355, 360, 361, 362, 363 or 356, 357, 358, 363, 364, 365, 366, 367, 368, etc. | sc18-sp.lmp plays back OK with or without emulation; the 0:36 coop by Erik/Method needs -spechit 2230937832 | | scythe | map30 | sc30-uv.lmp sf304509.lmp | 2565, 2577, 2571, 2578, 2576, 2569, 2570, 2575, 2567 | emulated OK?; can lead to desyncs if not emulated; for sf304509.lmp (an egg in the scythe demopack), a spechits magic number is needed: one that works is 2230937832 | | scythe2 | map02 | s202-207.lmp | 649, 650, 651, 658, 643, 644, 645, 646, 652 | emulated OK; playback is system-dependent with Doom2.exe; a spechits magic number such as 2230220160 is needed with prboom-plus | | scythe2 | map08 | none | 2202, 2203, 2206, 3053, 3054, 2200, 2208, 3055, 3056 | unknown | | scythe2 | map10 | s210-245.lmp | 673, 674, 676, 681, 682, 684, 686, 687, 688 | benign?; emulated OK | | scythe2 | map18 | s218-428.lmp | 1578, 1579, 1617, 1635, 1636, 1680, 1681, 1682, 1683 | benign? | | strain | map06 | str06-uv.lmp | 1736, 1786, 2333, 1737, 1738, 1785, 2334, 2336, 2332 | benign? | | strain | map07 | st07-237.lmp | 986, 998, 999, 1000, 1007, 1008, 1009, 1010, 1011 | spechits overflow necessary to exit the map! emulated OK, it seems; precise behaviour depends on magic number - st07-237.lmp is OK with the default magic number, but desyncs (no exit) with the alternate (2230937832), or with Chocolate-Doom | | strain | map14 | st14-832.lmp | 2351, 2353, 2355, 2357, 2358, 2359, 2360, 2361, 2362 | benign? | | tnt | map25 | ep25-908.lmp | 704, 705, 706, 707, 708, 893, 894, 895, 896 | benign? | | vesperas | map09 | vesp_729.lmp | 707, 713, 714, 715, 716, 717, 718, 719, 720 | benign? | | wotdoom3 | map07 | none | 1117, 1122, 1129, 1108, 1109, 1110, 1115, 1120, 1106 | unknown - no demos to test it with | | zomheart | map01 | none | 1622, 1625, 1626, 1627, 1629, 1642, 1643, 1644, 1645 | unknown - no demos to test it with |
Table of maps with a REJECT overflow
| pwad | map | example demo | size of overflow | emulation in current Prboom-plus | | berserk | e1m1 | berm1032.lmp and bert2740.lmp | too short (666<667) | emulation not guaranteed; both demos play back OK with or without emulation | | bldnight | map05 | bld51351.lmp | too short (21218<29404) | too large for emulation; the example demo desyncs | | bldnight | map07 | bld71232.lmp | too short (14792<14965) | too large for emulation, but the example demo plays back OK | | dmonfear | map25 | ydfear25.lmp | too short (2702<2888) | too large for emulation, but the example demo plays back OK (padding with zeros + attempted emulation); Donner's other dfear demos on maps with reject problems desync | | flsofdth | e4m2 | fod2uv.lmp | too short (2415<2416) | emulation not guaranteed (?) | | hellroom | map01 | hlrmp257.lmp hlrfp555.lmp | too short (84<85) | emulated; both demos play back OK without emulation too | | hyena | e1m1 | none | too short (325<326) | emulation not guaranteed | | invasion (inva_19.zip) | e1m1 | none | too short (760<761) | emulated | | lwfirst (equino-x.zip) | e1m3 | equ3-104.lmp | too short (21841<22050) | too large for emulation, but the desyncs in Doom.exe and Prboom-plus with emulation appear the same; another demo, equ3-114.lmp, plays back OK with or without emulation; because these demos were recorded with an older version of prboom, -pad_reject_with_ff is needed | | lwfirst (equino-x.zip) | e1m7 | equ7-108.lmp | too short (596<1082) | too large for emulation, but the sample demo plays back OK with or without emulation; because this demo was recorded with an older version of prboom, -pad_reject_with_ff is needed | | requiem | map08 | any on this map | too short (13944<13945) | emulated | | requiem | map16 | any on this map | too short (10224<10225) | emulated | | requiem | map22 | any on this map (e.g. rq22-518.lmp) | too short (10804<10805) | emulated | | requiem | map31 | any on this map | too short (3784<3785) | emulated | | rrd201 | map02 | none | too short (7750<7751) | emulation not guaranteed | | te | map06 | none | too short (5778<5779) | emulation not guaranteed | | teeth (Master Levels) | map32 | teeth-32.lmp te32-106.lmp | too short (24<25) | emulated / tends to lead to a desync if not emulated | | too1337 | e1m1 | too1-035.lmp | too short (3120<3121) | emulated; the sample demo plays back OK without emulation too | | ultdtv | maps 02-07 | none | all too short by one byte | emulated (?) | | yaotzin | map01 | yao-uv.lmp yao-750.lmp | too short (50404<51200) | too large an overflow for emulation, but yao-uv.lmp plays back OK in prboom-plus 2.4.6.2 (REJECT padded with zeroes) with or without emulation; yao-750.lmp desyncs though |
Table of demos with an INTERCEPTS overflow
| pwad | map | demo | outcome | emulation in current Prboom-plus | | av | map08 | av08-odd.lmp | "all ghosts" | emulated OK | | av | map26 | av261924.lmp | benign | no bad effects, it seems | | blacktwr | map25 | blackbug.lmp | "all ghosts" and exit | not emulated perfectly, but well enough that the player exits | | doom | e1m3 | n1m3bug.lmp | "all ghosts" | emulated OK; this demo is by Donatas Tamonis and can be found in his web space | | doom | e1m9 | e1m9-uv.lmp (dm-atm.zip) | benign | no bad effects, it seems; yes, another intercepts overflow on one of the original E1/shareware maps; this is a dht3 demo | doom2 | map02 | lv02-!!!.lmp (fa02-132.zip) | "all ghosts" | emulated OK | doom2 | map18 | ty18-bug.lmp (ty18c810.zip) | "all ghosts" | probably emulated OK, but not fully checked; this is a DANG demo | | eternall.wad (from eternal.zip) | map18 | wtf.lmp | "all ghosts" | emulated OK? (not fully checked); the demo is in et18-227.zip | | hr | map27 | hr27odd.lmp | "all ghosts" | emulated OK | | hr2final | map24 | h2241828.lmp | benign | no bad effects, it seems | | hr2final | map32 | h2323105.lmp | "all ghosts" | the demo was recorded without emulation | | ksutra | map10 | ks101018.lmp | benign | no bad effects, it seems | | manor | map01 | manorbug.lmp | "all ghosts" | emulated OK | | mm | map12 | mm12r406.lmp | benign | no bad effects, it seems | | nuts | map01 | nutsnp52.lmp | "all ghosts" | emulated OK, but with a significant slow-down | plutonia | map15 | pl15-odd.lmp | "all ghosts" | emulated OK? (not fully checked); demo is in pl15-238.zip | | ssbase | e1m1 | ssba-heh.lmp | crash with Doom2.exe | "all ghosts" with prboom-plus, but no crash |
Sorry, I haven't given hyperlinks for the wads or demos; I presume that anyone interested in this stuff will already have them or be able to find them. The idgames database, Compet-n, DSDA and this Demos Forum are the places to look. This is a useful link in this respect (replace "demoname" with the filename you're seeking):
http://www.google.com/search?q=site...m2.net+demoname
When I have described an overflow as "benign?", this means that any demos I have tested have played back OK whether the overflow is emulated or not. In some cases it is hard to judge if the overflow is being emulated correctly, as there are no demos on the map in question that play back OK with Doom2.exe.
If you are recording in Prboom-plus on any of maps where the spechits overflow is liable to cause desyncs, then if you want your demo to play back with Doom2.exe, set the program to attempt to emulate the overflow. Note that this is not guaranteed to work, and that it might not play back with Eternity (as it doesn't at present have this feature, as far as I am aware). If you record with Doom2.exe on one of these maps and the demo desyncs with Prboom-plus, try it with overflows emulated.
I'll note that so far I haven't come across an instance where Prboom-plus 2.4.8.1 is clearly unable to emulate a spechits overflow.
Obviously I haven't tested every map in existence, but as you can see I have tested a fair few, including most of the popular wads for recording. Let me know if you find any more, or can help resolve any of those listed more clearly, or if there are some obscure desynching demos that ought to be tested.
I have also added short tables of INTERCEPTS and REJECT overflows. These are based on far less testing (just ad hoc, really). There are probably quite a lot of maps with the REJECT problem, but one wouldn't expect to find many demos where there is a large overflow in any case, as they often lead to desyncs in Doom2.exe itself. Prboom+ can emulate them as long as the size of the overflow is no more than 16 bytes and the size of the REJECT lump is divisible by 4. Demos with INTERCEPTS overflows are also rare, as they sometimes result in a crash with the vanilla engine, and often in "all ghosts" behaviour, which in most cases makes it impossible to exit the map (you need to find a damage/exit sector, which most maps don't have). There also appear to be a few where the overflow is small and has no effects.
In some cases, a spechits overflow makes a demo play back differently on different systems with the vanilla exe. In these cases, you may need to get the spechits "magic number", generated by a patched "e6y" version of Doom2.exe or Doom-plus running on a system where the demo plays back OK, and enter that in the command line using the "-spechit" parameter. However, if you want to use a shortcut and just try something that has a good chance of working if the demo is an old one, or was recorded on an older OS, or with Chocolate-Doom, use this:
-spechit 2230937832
So far, all demos that have been found not to work with the default value, play back OK with this one.
Last updated: 16-March-2008
|