bradharding / doomretro

The classic, refined DOOM source port. For Windows PC.
https://www.doomretro.com
GNU General Public License v3.0
680 stars 85 forks source link

[Bug] Allow voodoo dolls to trigger exit line after death #814

Open andrikpowell opened 11 months ago

andrikpowell commented 11 months ago

Hey Brad, I noticed that the death exit in MAP12 of Hell Revealations doesn't actually work correctly.

At first I thought it was the barrel physics, but after some tests I've deduced it is due to a voodoo doll unable to trigger the exit line after another voodoo doll kills the player. Obviously it's important to be able to kill the player to enter the next map.

Basically the way the exit is set up is that there are two vanilla conveyors (crusher and barrel) that each push a voodoo doll over an action line. The first conveyor pushes a voodoo doll to telefrag another voodoo doll to ensure the player's death. The second conveyor that happens a little bit after pushes a voodoo doll over an exit line.

For some reason Doom Retro doesn't allow the voodoo doll to cross over the exit line if the player is already dead, and therefore the player is unable to continue to the next map.

dashodanger commented 11 months ago

Just a pot shot, but does it have anything to do with the compat_zombie check from https://github.com/bradharding/doomretro/commit/7e95a45a2ba7624d92ac9ce5fdc996e994ccbcb2 ?

andrikpowell commented 11 months ago

Just a pot shot, but does it have anything to do with the compat_zombie check from 7e95a45 ?

I don't think this would fix it, since the setup works completely fine in GZDoom and old ZDoom ports, and they don't even have a compat_zombie setting (nor can it be forced in ZMAPINFO).

Also, just to try it, I did add compat_zombie to the RMAPINFO map entry, and it did not fix it. Just player dying without entering the next map.

I can see in IDDT that the voodoo doll does get pushed over the exit line, it just doesn't move to the next map.

bradharding commented 11 months ago

Just a pot shot, but does it have anything to do with the compat_zombie check from 7e95a45 ?

I think you're right, @dashodanger, it does. The compatibility flag should be enabled by default, which I've now done so in 559fac01d4ea35eae19a686ce85a8db34b977d37.

The other problem is that compat_zombie isn't being parsed correctly in MAPINFO lumps, so that's why using it wouldn't work. (The MAPINFO parsing code needs a complete rewrite. It's a mess.)

@andrikpowell, is this issue now resolved with that commit?

andrikpowell commented 11 months ago

@andrikpowell, is this issue now resolved with that commit?

Yes, this did solve the problem.

Although, I'm still a little confused why that option allows it to work specifically in Doom Retro, since ZDoom ports do not allow for the player to become a Zombie, and yet the death exit worked fine in those ports without any compatibility settings having to be added.

The other problem is that compat_zombie isn't being parsed correctly in MAPINFO lumps, so that's why using it wouldn't work.

Ah, so that's why it didn't do anything when I added compat_zombie to the RMAPINFO.

(The MAPINFO parsing code needs a complete rewrite. It's a mess.)

If you are doing a rewrite of the MAPINFO code, can I request something similar to ZMAPINFO's defaultmap?

defaultmap { properties } Sets the defaults that will be automatically used for all subsequent map definitions.

This way instead of having to put this under every map entry:

MAP MAP01
{
       levelname = "Fucking Hell"
       levelpic = "CWILV00"
       skytexture = "SKY1"
       next = "MAP02"
       music = "D_RUNNIN"
       partime = 30
       compat_floormove
       compat_limitpain
       compat_nopassover
       compat_useblocking
       nojump
}

MAP MAP02
{
       levelname = "Isle Near Radar"
       levelpic = "CWILV01"
       skytexture = "SKY1"
       next = "MAP03"
       music = "D_STALKS"
       partime = 300
       compat_floormove
       compat_limitpain
       compat_nopassover
       compat_useblocking
       nojump
       compat_zombie
}

I could just do something like this, and have compatibility settings applied to every map below it: _(and only add compatibility options specific to one map just on that one map entry - in this example: compatzombie)

defaultmap
{
       compat_floormove
       compat_limitpain
       compat_nopassover
       compat_useblocking
       nojump
}

MAP MAP01
{
       levelname = "Fucking Hell"
       levelpic = "CWILV00"
       skytexture = "SKY1"
       next = "MAP02"
       music = "D_RUNNIN"
       partime = 30
}

MAP MAP02
{
       levelname = "Isle Near Radar"
       levelpic = "CWILV01"
       skytexture = "SKY1"
       next = "MAP03"
       music = "D_STALKS"
       partime = 300
           compat_zombie
}