JNechaevsky/international-doom

Heretic & Hexen: misc feature/minor issues discussion

kitchen-ace opened this issue · 35 comments

Since these ports are getting closer to a proper release, here's some random things I've thought about while playing. All of these are very minor and you are well within your right to WONTFIX all of them :)

✅ Heretic: The secret found message overwrites the normal messages while it's up; often I've stumbled into a secret area and picked up something but I don't know what it was because the pickup message is supplanted.
It might be possible to display normal messages on a 2nd line? Or move the secret message back to the center of the screen.

This is also the case with Hexen's "some of the puzzle has been solved" type messages; I imagine special-casing these is harder though.

Hexen:

  • Jumping while in noclip mode makes your jump height lower/faster. This is a vanilla bug. Really there's no need to jump in noclip, but it looks a bit odd anyhow.

  • ❌ The Heresiarch's floating cubes can disappear. (vanilla bug). This is probably very hard to fix in a demo-safe way, see this discussion from Doomsday: https://tracker.dengine.net/issues/770
    (seems down right now, the gist is that the sectors the cubes get spawned in don't get updated IIRC)
    Here's an example wad to test if you want: hxsorc.zip
    Let him walk towards you a bit and then circle around behind him.

  • ✅ Giving all weapons doesn't update the super-weapon indicators (either the normal statusbar one or the new inter-hexen widget). (vanilla behaviour again.) I don't know if there are situations where changing this would be a problem?

  • ✅ While I like your generic armour icon, is there a reason you didn't want to use one of the armour pieces as an armour icon? You could even make it class-specific: mesh armour for the fighter, shield for the cleric, amulet for the mage.

edit: All games:

  • ✅ option to reload save on death when you press a key instead of going to the start of the level

  • ✅ key to toggle vertical mouse movement on/off. (extremely niche use)

Also none of this is required for a proper release.

😱 I'm not that good reader! 😅

Heretic: The secret found message overwrites the normal messages while it's up;

This logic comes from Doom, I'm afraid, where messages are always left-aligned. But yeah, making impossible to read next pickup messages in next four seconds is not really good. I think I'll just follow your recommendation, and "top" becomes third message line in all three games - for some unclear reason, I would like to have some vertical space between "normal" and "secret" strings.

Jumping while in noclip mode makes your jump height lower/faster. This is a vanilla bug. Really there's no need to jump in noclip, but it looks a bit odd anyhow.

Small clue where to investigate could be very helpful. On very brief look I wasn't able to find the reason of such speedup. 🙁 But should falling speed must be also get fixed? AFAIR, there was complains in Crispy Doom...

The Heresiarch's floating cubes can disappear. (vanilla bug).

On a brief investigation by using freeze+spectator mode, cubes are not spawning "above ceiling", looks likes they are spawning at all, so it seems to be a play state, not render bug. If it's play state thing, most probably better leave it untouched to don't bring up any fixes to original mechanics.

Giving all weapons doesn't update the super-weapon indicators

Done. 🙂 Very reasonable question of two lines of code. Fourth weapon items doesn't seems to be affecting game mechanics, and it's a cheat code after all.

While I like your generic armour icon, is there a reason you didn't want to use one of the armour pieces as an armour icon?

I'm afraid IWAD icons doesn't represents full armor system of four items. An options should be possible, but then nice vertical space between these stings will be lost:

image

Like in Heretic, which is looking not very good. But it doesn't means "no", I'll try it out. By the way, have you tried to understand how A.C. is calculated in Hexen? It's a total mind...blow! 🤯

option to reload save on death when you press a key instead of going to the start of the level

Probably, same way to Crispy Doom, by holding run button?

key to toggle vertical mouse movement on/off

Done. 🙂 Not that useless to have, and finally a motivation to move bindings menu one line up in Doom.

😱 I'm not that good reader! 😅

Sorry!! wasn't trying to overwhelm you, just wanted to collect all my thoughts about little things in one place, rather than making a dozen tiny issues.

Hexen: Jumping while in noclip mode makes your jump height lower/faster.

I haven't been very motivated to code anything lately but I imagine this is something I can fix if I can figure out where the problem is. I'll take a look.

Hexen: Heresiarch cubes

Definitely a playstate thing, so if it's not worth trying to fix, that's fine

Hexen: Armour icons

No problem if you want to leave it, I can see how putting only one armour piece might be misleading for some people. And yeah Hexen's armour system is totally bonkers, way more complicated than it needs to be especially since you lose most of your armour in just a few hits anyhow.

option to reload save on death when you press a key instead of going to the start of the level

Probably, same way to Crispy Doom, by holding run button?

That'd be fine. (Is that how it works in Crispy? I actually have use and run both set to space, and autorun on, so I can walk slow by holding space. It occasionally leads to restarting the level instead of loading the save it seems, race condition I guess. But that's fine, it works most of the time.)

Vertical movement key, secret messages, Hexen superweapon indicator

Looks good, thanks a lot!

That'd be fine. (Is that how it works in Crispy? I actually have use and run both set to space, and autorun on, so I can walk slow by holding space. It occasionally leads to restarting the level instead of loading the save it seems, race condition I guess. But that's fine, it works most of the time.)

Yes, just checked - Crispy loads last save when run button is hold while pressing use. Maybe it is worth to turn it into a gameplay feature? Like... On-death action (reload save / reload level)? Or perhaps, some better name?

Maybe it is worth to turn it into a gameplay feature? Like... On-death action (reload save / reload level)? Or perhaps, some better name?

Woof uses "On Death Action" with options of "last save", "default" (restart level), "nothing" (do nothing, potentially useful for speedrunners I guess), which sounds good to me. But truthfully I'm fine with it being the Crispy way, if you prefer to avoid the extra menu option. My control setup is unusual and not something most people will use.

Perhaps @NightFright2k19 or @Meerschweinmann have opinions on this?

One thing Crispy does differently than Woof is that it won't auto-load a save if it was from a different level than you're on. I like things this way, but again I'm not too picky about how this is handled. (I'm also assuming this is not some quirk due to my weird control setup.)

I'm all to follow Woof approach, literally everything that needs and must be clear as cross-port standard. Crispy handles cases with not loading saves from previous levels indeed - it restarts level entirely if no save was made on new level and takes away all player's stuff. Maybe it's a bit punishing?

It's definitely deserves an option, and both Doom and Heretic still have free line for it.🙂 Hexen doesn't seems to be need it, as it already handles last save by itself.

But sure, let's hear opinions of our respected colleagues.

Crispy handles cases with not loading saves from previous levels indeed - it restarts level entirely if no save was made on new level and takes away all player's stuff. Maybe it's a bit punishing?

Well it's not that bad since you can always reload the save manually. But again I don't have strong opinions on the particulars of the implementation.

Hexen doesn't seems to be need it, as it already handles last save by itself.

Not quite: Hexen will load the last autosave it made, which it does every time you enter a new level. But if you've saved manually since then, that save won't be loaded automatically. Except, if you load a game from the titlescreen/when no game is being played, and you haven't gone to a different level since, it will fall back on loading that save instead of going to the start of the level. What a mess!

As english is not my native language i have sometimes hard times to follow when there is many unread text :)

If you want to know if i find it usefull to define an action what should happen after you have died, instead of only restart the level from beginning, then yes, i find that useful.

Hope i get it right.

It is up to Julia to decide if she want to do such thing. But Julia seems open for almost everything :)

As english is not my native language i have sometimes hard times to follow when there is many unread text :)

My apologies, this whole issue was a lot harder to read than I thought it'd be.

The question is, which do you like better?

  • define an action that happens after you die, like Woof
  • automatically load your last save when you die, if you hold run and press use, like Crispy Doom
  • something else?

No problem :)

I could live with the crispy way, but newcomers have to know this key-combo.

The Woof-way is the deluxe way in my opinion that i would prefer.

Hexen: Jumping while in noclip mode makes your jump height lower/faster.

I haven't been very motivated to code anything lately but I imagine this is something I can fix if I can figure out where the problem is. I'll take a look.

Seems like all vertical movement is accelerated in noclip mode in both Heretic and Hexen, because of this check in p_map.c: https://github.com/JNechaevsky/international-doom/blob/main/src/hexen/p_map.c#L902
it's missing *tmthing = oldmo; before returning.

I doubt this is intentional, but I'm not sure if this overall behaviour should be changed or not. What do you think? Either way I feel like special-casing jumping alone is not worth the trouble.

"On death action" is technically done, using Woof and Crispy code. But both implementations have one small flaw, I found completely uncomfortable: if user is saved near the wall or exit switch, then dies and reloads by use key, there is a extremely high chance that use will be presser right after reborn. To avoid it, use must be carefully striked just once, not holded. Deffinitly need to do something about it.

That could be a problem if the wall has a linedef action you will not activate? But if it is only a wall it makes oof.

True, if it's just a wall, then "oof" sound will be played. I'm almost at the solution, engine must be tricked to prevent use action while use is kept pressed for few game tics, but should work as usual if it's released and pressed again.

Tested the "on death action" in DOOM II now with last save. It worked like a charm. When i go to next level and do not save in next level, then it goes flawlessly to my last save the level before. The options name is "last save", so this is correct.
Heretic works fine too.

Excellent, works great! Using a switch on reload is also a problem in Woof sometimes, I will see if I can adapt it to work there, should be pretty easy.

Oha, Hexen has the "on death action" too. And it works nice :)
Slowly but sure Inter-Heretic and Inter-Hexen are becoming a loveletter for those two games and they get the love they deserve.

Yeah, Hexen's implementation was a nightmare on first look, but in the end it was even simpler than Doom and Heretic.

Good news: taken Michael's correction suggested in Chocolate Hexen, demo compatibility gets finally good level. There also was a small problem brought by Lee Killough's fix, so I have reverted it. Please note - this will bring back falling into a wall if player is saved while standing on the ledge and then loading, so be careful. Not sure if it is possible or worth to guard this fix with "single player only" condition, let everything be working in one logics.

A -timedemo mode now working flawlessly on Hexen, looks likes there was a problem in vanilla code. I was too lazy to investigate and fix it, and simplified timing demo handling instead: now it's using normal demo playing code with few additions to run demos as fast as possible. Still, there is no need to watch full demo to be sure if last level is entered, this trick will do such job:

inter-hexen.exe -console -nodraw -timedemo demo.lmp

Heretic got D'Sparil spawning spots removing - until there will be no other decition, and if there will be any, this seems to be the most reasonable way to go.

Not very good news: Hexen have filled it's quota for two pages of features. Not really a problem, as third page can be added as well, or it is still possible to draw strings over status bar, but I stubbornly want to have a nice looking menu. 🤪 There is still huge potential for visual improvements, like stained glass shards can not disappear (actually, this leads to another problem with their "zero-gravity" once floor level changes...), random flipping of sitting corpses (technically they are not corpses initially) and couple of more, but none of this are demo-safe, and should implemented, it must be strictly "Compatibility breaking / cosmetic" features. Or most probably, better don't touch such thing for good, I definitely don't want to repeat my past mistakes by making changes in original game mechanics.

Hiho. I wanted to answer earlier, but i was not at home.

In the end everything went good with Hexen and the "on death action" is very good for it, because it is an useful feature.

To be honest, i did not know that Hexen can't use -timedemo, because when i had benchmarked it was DOOM over all the years to compare source ports.
Last time i had benched Heretic was as you integrated low detail mode in Inter-Heretic to compare different resolutions with nearly same pixel-count.
But when it does work now i should test some resolutions in Hexen :)

As you said with the spawning spots to remove everything that goes beyond the vanilla limit seems the most reasonable too for my understandment. The other thing is that, what should be wrong with your solution? Compatibility to vanilla exe could not break because of that, because the vanilla .exe could not play such maps. I could never use a vanilla exe demo from such a map, because there can be no demos made with vanilla exe and GZDOOM plays no vanilla demos as Inter plays no GZDOOM demos. And you are in contact with Fabian and Kraflab to get a cross port solution, so everything should come after some time to a good end. Or do i get something wrong?

To Hexens gameplay page. For me it would not be a problem if there would be a third page for gameplay-features instead of pressing too much options at one page that could hit Hexens holy and high status bar. Inter-DOOM and Inter-Heretic have those third pages too.

With optical improvements like glass shards or sitting corpses i think you will do the right decisions. It would be nice if the glass lays around after get punched or some corpses are flipped, but when these options alter gameplay mechanics or break compatibility that would be not so fine.

The audience that plays ports like Inter/Crispy/Woof may be not so strict or hardcore vanilla like those vanilla exe or Choco-DOOM lovers that want to penetrate themself with the original errors and limitations that we had back in the days, but the Inter ports are part of a port family that should go the faithful enhanced way it does.
But i think you will choose the right way, that you had chosen all the time.

I wish you nice 50 minutes rest of your sunday today, for me the sunday has a whopping 170 minutes rest :)

Heretic got D'Sparil spawning spots removing - until there will be no other decition, and if there will be any, this seems to be the most reasonable way to go.

Agree with this. I imagine Fabian will be OK with these additions in Crispy Heretic as well; as for dsda-doom, it's currently lagging a bit in features anyhow (like HEHACKED support of any kind) and has been for some time, so who knows.

I do think it would be a good idea to at least output a message to the terminal on maps that exceed the limits of mace spots, D'Sparil spots, and ambient sounds.

Happy day job Monday everyone! ☠️

In case of Hexen, -timedemo was primary needed to check demo compatibility, i.e. without necessity of watching demo on normal speed from start to end. But having working mode instead of non-working mode is also good. Low detail is technically possible, there are just few small dilemmas:

  • By default F5 is bound to suicide in Hexen. I still can add blank filed to keybinds section, though. But it doesn't seems to be oblivious, as user have to see it and bind some kind of key. Another way is new string in Video menu? But such string is not very hot-swap friendly, as user will have to travel to Video options just to change detail mode. Ideally, both approaches should be done.
  • This will inflate visplanes drawing code. Shouldn't be a big problem though, as this code is done already. Just will harm it's readability.

In general, I don't think someone will use Inter for demo recordings, there is a DSDA source port nowadays for such tasks, and this is only good. But providing demo compatibility is a good tone, since demos can be not only recorded, but watched as well. 🙂 Also, long demos helping a lot for automated tests of both render and game mechanics. Performance benchmarking too, but this is situational.

And you are in contact with Fabian and Kraflab to get a cross port solution

Well, there is a started discussion for it: fabiangreffrath/crispy-doom#1167. But no decision was made at this point, though. Heretic doesn't seems to be a highly requested by runners, so this is not about "okay everyone, stop all your activities and let's make a decision now!". I can only hope that it will not lead to yet-another standard or complevel. 🤭

Speaking of complevels and standards, I do hope as well that @kitchen-ace's idea with HEHACKED will not be a new standard, ideally it should be something vanilla-compatible, but I was never able to run HeHacked on DOSBox, it's just showing broken text graphics.

I do think it would be a good idea to at least output a message to the terminal on maps that exceed the limits of mace spots, D'Sparil spots, and ambient sounds.

Really good idea, thank you! It's a bit tricky, as once limit is raised, it will remain raised, so simple approach like this one will not work properly:

src/heretic/p_pspr.c	Mon Feb 19 13:30:42 2024
@@ -261,6 +261,12 @@
     {
         MaceSpotCountMax = MaceSpotCountMax ? MaceSpotCountMax * 2 : MAX_MACE_SPOTS;
         MaceSpots = I_Realloc(MaceSpots, sizeof(*MaceSpots) * MaceSpotCountMax);
+        
+        if (MaceSpotCount == MAX_MACE_SPOTS)
+        {
+            printf ("\n  Warning: found more than 8 Firemace spots."
+                    " This level won't work in vanilla Heretic!\n");
+        }
     }
     MaceSpots[MaceSpotCount].x = mthing->x << FRACBITS;
     MaceSpots[MaceSpotCount].y = mthing->y << FRACBITS;

I.e. it will work just once.

Happy monday everybody :)

That i had used timedemo with Heretic last time to bench low graphics, should be no hint to integrate low graphics mode in Hexen too. If you have reasons against it, then it is not necessary, because there are many other resolutions to get more performance.

And yes, the demo-scene is on DSDA, but as you wrote, i like it to watch demos too. And why delete a feature the Vanilla exes could do?

And your spawner solution seems logical. Eventually Fabian and kraflab join this solution. But even it should come something else as solution, people that use Inter can play those levels now without getting bombed Out of the Game until there is a cross port solution.

it will work just once.

Still much better than nothing.

I was never able to run HeHacked on DOSBox, it's just showing broken text graphics.

Did you change the ini file for Heretic 1.3? I don't know that that would be why it doesn't work, but maybe. Instructions here: https://ettingrinder.youfailit.net/heretic-hhe.html

Speaking of complevels and standards, I do hope as well that @kitchen-ace's idea with HEHACKED will not be a new standard, ideally it should be something vanilla-compatible

The problem with HEHACKED as it is, is that it's quite broken, and even if you hex-edited HHE.EXE to fix it with Heretic 1.3 and solved all the patch version issues, it's still lacking and some features don't work properly, and the patch format itself is much worse than DHE. There's also no source code for it, only for DEHACKED; and no ports support it besides Chocolate Heretic, and its descendants.

I do want to (eventually) have something that works with Vanilla, but if I manage to do that and make the patch format better, I might as well call it something else and not "HEHACKED 3.0 unofficial" or whatever. Not going to happen any time soon though, I can barely make a 2-line PR without errors these days :p

Regarding the "load save after death":
Personally, it kinda irritates me if the game makes such a decision for me. What if I don't want to load the last save I made? It might be rare, but it can happen. Maybe I made several saves and the last one was in a bad spot.

If you ask me, the best system is the keyframe rewind from DSDA. Sure, it kinda turns the gaming session into a demo which you can replay and fix at any given time, but at least I can stop worrying about when was the last time I hit the save key in case I screw up.

But well... I guess most people will be happy with the instant reload, so be it. However, if there were an option to keep the question whether or not to load the last save, I'd be all for it.

However, if there were an option to keep the question whether or not to load the last save, I'd be all for it.

You're in luck as it was implemented with an option :)
Last page under Gameplay Features on all ports -> On-Death action

That is everything in this collection of issues, except for jumping in Hexen with noclip. Going to repaste my previous comment in case it got missed:


Seems like all vertical movement is accelerated in noclip mode in both Heretic and Hexen, because of this check in p_map.c: https://github.com/JNechaevsky/international-doom/blob/main/src/hexen/p_map.c#L902
it's missing *tmthing = oldmo; before returning.

I doubt this is intentional, but I'm not sure if this overall behaviour should be changed or not. What do you think? Either way I feel like special-casing jumping alone is not worth the trouble.

Regarding the "load save after death": Personally, it kinda irritates me if the game makes such a decision for me. What if I don't want to load the last save I made?....

An addition to what kitchen-ace said. It is not only an option, you have to turn on that option that it loads the last save.
That is what i love. When you install Inter/Crispy and don't change any options, you have a vanilla game except double resolution turned on.
But to be honest, who wants 320x200 on todays display-sizes. With 14" CRT back in the days that was ok.
You have to actively change the options to get enhanced features. In my opinion the right way.

Good news:
I have just completed a full Hexen run (original campaign w/o HexenDK, for now) in Inter-Hexen. No issues!

Well, perhaps one, but I guess it's not related to the port:
In "Griffin Chapel" (hub 3), there's this NW area with the moving walls. You have to press four switches behind secret walls to prevent the ceiling from crushing you when you are going for the puzzle switch. The first time, I went straight for the crusher. It's possible to survive it. However, after this, the nearby chamber with the exit teleporter wouldn't open, so I was stuck (could have gotten out with a Chaos Device though, I guess). I reloaded and redid the area with the secret switches activated first and it worked. Maybe the responsible script doesn't allow you to skip that relevant part.

Nice @NightFright2k19 ! Lots of bugs in hexen.wad, most are pretty minor but there's a few softlocks, Gibbet is probably the worst: https://doomwiki.org/wiki/Hub_4:_Gibbet#Bugs

Yeah, just as said before, "On death action" is completely optional and disabled by default, i.e. default behavior is same to vanilla. BTW, all features by default are off or set to vanilla behavior, excluding 2x resolution. Friendly ports was using this approach, so I decided to follow.

Seems like all vertical movement is accelerated in noclip mode in both Heretic and Hexen

I see.. Even if will be fixed, I'm afraid there might be complains like "what the heck is happened with vanilla noclip behavior while no play state fixes was declared?". Probably worth to leave it "as is". The only unconditional fix in play state mechanics at the moment is Fabian's correction of Icon of Sin spawner, which prevents division by zero (a program crash, literally) while saving and reloading while flying cube.

Well, perhaps one, but I guess it's not related to the port

This must be a problem with clipping in original code, which wasn't touched. In general, Hexen also have huge clipping bug with running into a wall while standing on some kind of map object, like this one: https://youtu.be/fzMaITI2_rM?t=28

I'm no longer fixing any kinds of such bugs in game mechanics, not because of demo compatibility - such fixes can be guarded by "in single player only" condition, but because of "one logics approach" as Fabian calls it. This means: what if player is suggesting to see/have/use this this bug not only while demo recording, but while normal playing? Boomers! And having a dozens of micro-switches for all possible fixes is the worst idea.

Fixing all the things was a good practice, but in the end, brought nothing more than headache of compatibility not only with demos, but complicated mapping things like in KDiKDiZD.

Render, however, is a different story. Initially, all Inter-s are having Crispy-s render code, but porting was done, I made a lot of changes like PrBoom+ optimizations and other things. This is not critically needed unless complex scene with hundreds of visplanes or sprites in view is appearing, but I totally like the idea of having fast/effective render, especially now, when higher render resolutions are available.

Even if will be fixed, I'm afraid there might be complains like "what the heck is happened with vanilla noclip behavior while no play state fixes was declared?". Probably worth to leave it "as is".

Yeah those were basically my thoughts as well. And it's irrelevant most of the time either way.

In that case: I declare this issue closed! Thanks as always for all your hard work, and sorry for dumping all these things into one issue (though it made for a nice discussion thread 😄)

Thanks everyone too! Sorry, I'm a bit quiet again, probably because of finally starting to get slightly tired from code grinding. Looks likes at the moment, all this path of Heretic and Hexen took three months (initial commit with Heretic, which started it all). Not that long for two ports. 🤓

Hah, I knew you'd have to slow down eventually! Good thing because I'm running out of things for you to fix ;)

For all it's worth:
You have created one, quite possibly THE best looking Raven games port with a software renderer out there. It's only the second time I've ever played Hexen. Initially I used GZDoom, but I was young and naive. THIS is the way to play it!

I can agree with everything Nightfright said. Inter-Heretic and Inter-Hexen are the ports these both Raven games needed so long. The feature list is a perfect match for me. And it is fun to look/read and write here. Thank you for everything!