OpenRift Posted May 27, 2021 (edited) In the vast library of vanilla Doom WADs, there has only been one (that I know of) that came with built-in custom par times, that being Alien Vendetta through the included AV.EXE. Normally, you can't do this in vanilla, as dehacked won't allow it. But having analyzed AV.EXE, I've been able to make a quick guide on how to change par times. EDIT: Thanks to @Ridley, we now have a version of @xttl Dehacked Special Edition that adds the ability to add custom par times for all versions of the 1.9 EXE (doom2, ultimate, final and final id anthology). Yes I know this is old news but I just remembered this post and thought I'd add the tool here for easy access. DOWNLOAD HERE Original Post Advanced Documentation (old) Spoiler PLEASE NOTE: This is for advanced users only and can damage your EXE if not done correctly, so PLEASE make a backup of your EXE before trying this. The first step is to open your EXE in a hex-editor. I use HxD, but any editor with a go-to-offset function should do. The following offsets are where the par time data starts: The Ultimate Doom: 0009ADC4 Doom II: 00099C34 Final Doom (unpatched version, included for completeness): 0009B468 Final Doom (patched id Anthology version): 0009AE38 NOTE: it's encouraged that you use the patched version of the Final Doom EXE for a more optimal experience, as the unpatched version has a weird teleporter bug and is more for demo testing or overall experimentation. You'll know you've reached the right offset if the cursor is on the byte with a value of 1E. In the example above, the values within the red boxes are where each par time begins, in numerical order by map. This screenshot is from DOOM2.EXE, and it may appear a little different in DOOM.EXE or Final Doom's DOOM2.EXE. Either way, look for the pattern of offsets in columns separated by 2 or 3 pairs of zeros. Converting Times to Hex Offsets Doom's the par time table is stored and read in seconds, so that's the number you'll need to convert to hex. I mentioned earlier that all of the EXEs' par time data starts with the value of 1E. This is because coincidentally, all the par times for the first level is 30 seconds across all 3 games, and 30 in hexadecimal is 1E. I highly recommend you try out this integer to hex converter to convert your desired times. Be sure to set the following on the converter: to 'decode' so it's converting integers to hex instead of vice versa set the type to 16-bit Set the byte order to Little-endian. Something to note is that converted par times may take up more than one byte. This is okay, that's why each par time is separated by 2-3 bytes with a value of 00. Replacing Par Times Let's say, for example, you want to make the par time for the first level 30 minutes (idk why your level would take that long but whatever). You plug 1800 into the converter and you get values 08 07. You would then go to where E1M1/MAP01's par time is and replace 1E 00 with 08 07. In the case of a smaller Hex value like 240 (4 minutes), this would translate in the converter to f0 00. In a case like this, you can of course ignore the 00 value and replace the first byte value of the level with f0. Limitations The only caveat with this is that you can't set pars above 59 minutes and 59 seconds (3599 seconds), because anything beyond that will just display "SUCKS", akin to how if a player takes over an hour to finish a level, it will display "SUCKS" for their play time at the intermission screen. If you have any questions or noticed I've missed something, let me know below! ;) Edited October 8, 2023 by OpenRift Added link to DeHackEd SE Par Time build 18 Quote Share this post Link to post
TheNoob_Gamer Posted May 27, 2021 I have never noticed that AV came with modified par times - this is a well-thought discovery! 5 Quote Share this post Link to post
Doomkid Posted May 27, 2021 I've never bothered with par times, but this is some super useful information right here for those who are into that! 5 Quote Share this post Link to post
1Destro3456 Posted May 27, 2021 Ooh, that's really cool, thanks for sharing that information. Hopefully we see more of this in mapping 2 Quote Share this post Link to post
maxmanium Posted August 9, 2021 (edited) If anyone needs it, the offset for the first Final Doom EXE (the one with the teleporter Z-axis bug) is 0009B468. Edited August 9, 2021 by maxmanium 2 Quote Share this post Link to post
P41R47 Posted August 10, 2021 Now this is interesting! Great find, OpenRift I wonder who may have hexhacked the exe to modify those values. Also, in what order it may have been hacked, before applying the dehacked patch or after. I suspect Anders Johnsen or Kim Andre Malde may have made it. Also, since it has par times, they should be shown on their respective map wiki entry, right? Wonder why it don't already. 2 Quote Share this post Link to post
OpenRift Posted August 10, 2021 17 hours ago, maxmanium said: If anyone needs it, the offset for the first Final Doom EXE (the one with the teleporter Z-axis bug) is 0009B468. Oh good, thank you. I was thinking about that the other day. I never found it to be entirely practical to add since the older Final Doom EXE is really only useful for demo testing or general experimentation. 1 Quote Share this post Link to post
Nikku4211 Posted September 7, 2021 Awesome. Someone should make a DeHackEd fork of the patching utility that adds support for modifying custom par times. And then after that maybe we could get Chocolate Doom to support it. 2 Quote Share this post Link to post
Dusty_Rhodes Posted November 14, 2021 (edited) On 9/7/2021 at 2:12 PM, Nikku4211 said: Awesome. Someone should make a DeHackEd fork of the patching utility that adds support for modifying custom par times. And then after that maybe we could get Chocolate Doom to support it. I came to this looking for a guide to change them. This is super helpful so thanks Openrift! Anyway, I'd love to see a utility like that. I plan on making a CT.exe for Commubity Trunk as it finishes up (we still have a while, but I really was curious about how this worked.) My thought is that I'll rush through all the levels as fast as I can, write down the times, dehack a DOS raised limit executable (it's a limit removing wad, if there's a million tutti fruttis, I might not do this haha), and then hexhack the par times in. It's entirely unnecessary, but as a tribute to early 2000s wads, it feels appropriate. It's not a very common thing to see, so it could be cool. I believe the way Doom's par times were done was Romero played all the levels as fast as he could, rounded them up, then added 30 seconds. That's probably what I'll do. We have a few maps finished, so I might try to dehack / hexhack what we have so far. Edited November 14, 2021 by Dusty_Rhodes 2 Quote Share this post Link to post
OpenRift Posted November 15, 2021 13 hours ago, Dusty_Rhodes said: I came to this looking for a guide to change them. This is super helpful so thanks Openrift! Anyway, I'd love to see a utility like that. I plan on making a CT.exe for Commubity Trunk as it finishes up (we still have a while, but I really was curious about how this worked.) My thought is that I'll rush through all the levels as fast as I can, write down the times, dehack a DOS raised limit executable (it's a limit removing wad, if there's a million tutti fruttis, I might not do this haha), and then hexhack the par times in. It's entirely unnecessary, but as a tribute to early 2000s wads, it feels appropriate. It's not a very common thing to see, so it could be cool. I believe the way Doom's par times were done was Romero played all the levels as fast as he could, rounded them up, then added 30 seconds. That's probably what I'll do. We have a few maps finished, so I might try to dehack / hexhack what we have so far. I mean I imagined that since it was a Community Chest-inspired project, it would be made for Boom-compatible ports. But hey, if you manage to make it limit-raising/limit-removing, that's cool too. 1 Quote Share this post Link to post
Dusty_Rhodes Posted November 15, 2021 10 hours ago, OpenRift said: I mean I imagined that since it was a Community Chest-inspired project, it would be made for Boom-compatible ports. But hey, if you manage to make it limit-raising/limit-removing, that's cool too. CC1, which it is largely based off of, was limit removing. It used some Boom bug fixes though. If I make a sequel, I fully intend to use Boom, especially for ANIMATED and SWTICHES lumps. Probably will use MAPINFO so people can use custom skies in certain maps, and all that jazz. But I felt I should keep it simple first time round. I LOVE Boom, so I'm excited to map for it some more in the future. One thing at a time. Still, thanks for the great guide. 1 Quote Share this post Link to post
OpenRift Posted October 8, 2023 Sorry to bump a dead thread, but I just added a link to @Ridley's version of dehacked that includes Par-times so it's easier to find. 2 Quote Share this post Link to post
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.