Emulate Wolf3d pushwalls
Forum rules
Before asking on how to use a ZDoom feature, read the ZDoom wiki first. This forum is archived - please use this set of forums to ask new questions.
Before asking on how to use a ZDoom feature, read the ZDoom wiki first. This forum is archived - please use this set of forums to ask new questions.
Emulate Wolf3d pushwalls
Has anybody yet tried to emulate the "secret door" pushwalls from Wolfenstein 3-D? This came into my mind... and may yet be possible.
I'm not much into ZDoom editing, but I might give or guess some clues...
The only things that DON'T block polyobjects are the walls or other polys. Polys certainly look bad after leaving their home sector.
Here's my sketch: draw a single sector, place equal, (64x64) square-shaped polyobjects on it, having the same "player uses" script on all sides. Under ACS, we define a 2-d "map" array with 0's and 1's defining vacant and occupied (64x64) spaces on that sector, so polys won't overlap with polys or walls; we also two simple "x","y" arrays as long as the number of polys, each index specifying the X and/or Y of each poly.
Under their "use" script: an argument <arg.1> should specify the direction (0=east, 1=north, 2=west, 3=south), depending on which side the player is pushing; another argument <arg.2> should specify the 'pushwall ID' (used with the "x", "y" arrays). We look up "x" and "y" at index <arg.2>. We look up the "map" at index <y><x>. If we see a 1 right on poly's spot, then it's OK and the block CAN be pushed (that's usual). According to <arg.1> we check 2 next adjacent squares on the "map". If the next one is also busy, exit the script. If the next is free, but the second not, or if both are free, mark the last one as busy, the first as free, then execute the movement. Activate a boolean <b> variable, change the poly's "x", "y" indices and move the polyobject away, via a simple command. While <b> is on, this script should be 'exited' on activation (can't push while another's moving). Deactivate <b> after the block ends its movement. Make sure its "x", "y" indices are renewed and that its busy/free 1/0 is updated on the "map".
Does it work? I couldn't show you real code here, because I haven't scripted for a long time... Does it sound good?
I'm not much into ZDoom editing, but I might give or guess some clues...
The only things that DON'T block polyobjects are the walls or other polys. Polys certainly look bad after leaving their home sector.
Here's my sketch: draw a single sector, place equal, (64x64) square-shaped polyobjects on it, having the same "player uses" script on all sides. Under ACS, we define a 2-d "map" array with 0's and 1's defining vacant and occupied (64x64) spaces on that sector, so polys won't overlap with polys or walls; we also two simple "x","y" arrays as long as the number of polys, each index specifying the X and/or Y of each poly.
Under their "use" script: an argument <arg.1> should specify the direction (0=east, 1=north, 2=west, 3=south), depending on which side the player is pushing; another argument <arg.2> should specify the 'pushwall ID' (used with the "x", "y" arrays). We look up "x" and "y" at index <arg.2>. We look up the "map" at index <y><x>. If we see a 1 right on poly's spot, then it's OK and the block CAN be pushed (that's usual). According to <arg.1> we check 2 next adjacent squares on the "map". If the next one is also busy, exit the script. If the next is free, but the second not, or if both are free, mark the last one as busy, the first as free, then execute the movement. Activate a boolean <b> variable, change the poly's "x", "y" indices and move the polyobject away, via a simple command. While <b> is on, this script should be 'exited' on activation (can't push while another's moving). Deactivate <b> after the block ends its movement. Make sure its "x", "y" indices are renewed and that its busy/free 1/0 is updated on the "map".
Does it work? I couldn't show you real code here, because I haven't scripted for a long time... Does it sound good?
- Cleveland Rock
- Posts: 27
- Joined: Wed Oct 25, 2006 6:36 pm
- Preferred Pronouns: He/Him
- Operating System Version (Optional): Windows 10
- Graphics Processor: nVidia with Vulkan support
- Location: Cleveland
- Contact:
I tried doing pushed walls and sliding doors like in Wolfenstein 3D a while back. The doors worked like a charm, but the pushed walls were really glitchy.
A guy I know who goes by the name "Boingo the Clown" is working on a Wolfenstein project for GZDoom. Well, it's currently only for Legacy, but he's switching to GZDoom. I don't know if it'll be any help, but, it's at his web site. The pushed walls look really nice.
A guy I know who goes by the name "Boingo the Clown" is working on a Wolfenstein project for GZDoom. Well, it's currently only for Legacy, but he's switching to GZDoom. I don't know if it'll be any help, but, it's at his web site. The pushed walls look really nice.
- Ryan Cordell
- Posts: 4349
- Joined: Sun Feb 06, 2005 6:39 am
- Preferred Pronouns: No Preference
- Operating System Version (Optional): Windows 10
- Graphics Processor: nVidia (Modern GZDoom)
- Location: Capital of Explodistan
- Krylancelo
- Posts: 10
- Joined: Mon Sep 11, 2006 9:31 pm
- Location: Teh Intarwebivurs
I tried fiddling with these secret walls when AFA was working on his W3D TC... I got them to work, but there was severe HOMage that I couldn't get fixed at the time (I'm sure it could've been fixed had I made the right changes)... I'd probably have to go back at it to figure out how I made it work in the first place.
Skunk - That's not the problem. The polyobject implementation makes it difficult to emulate Wolf3D's push wall behaviour 100% because polyobjects can only exist in its own sub sector.
In Wolf3D, the secret walls can be pushed in any direction so the possibility of it running into another wall or sector is there, which equals HOM.
In Wolf3D, the secret walls can be pushed in any direction so the possibility of it running into another wall or sector is there, which equals HOM.
- Krylancelo
- Posts: 10
- Joined: Mon Sep 11, 2006 9:31 pm
- Location: Teh Intarwebivurs
- Cleveland Rock
- Posts: 27
- Joined: Wed Oct 25, 2006 6:36 pm
- Preferred Pronouns: He/Him
- Operating System Version (Optional): Windows 10
- Graphics Processor: nVidia with Vulkan support
- Location: Cleveland
- Contact:
Hence the problem. DOOM could never effectively emulate Wolfenstein unless a polyobject was created that you could push in any direction until it hits a wall. Wolfenstein 3D's push walls didn't just go in one direction. There's one map in W3D I have in mind where there was a humungous maze of insane push walls that was used for a contest that never actually happened (It had a message sprite saying "Call Apogee, say 'aardwolf'". It was replaced with a pile of bones in later versions so people would stop calling Apogee and saying "aardwolf." I hear people still call them.).Nash wrote:The Wolf3D mod doesn't have any push walls, they raise up like any other Doom door.
I'm afraid I don't understand the problem. Since the levels of Wolf3D are entirely flat and have no changes in light level, you could essentially make all the rooms one gigantic sector.
I understand that the sector will get cut into subsectors by the node builder of course, but all you need to do is make any walls that would cause this problem into non-moving polyobjs. They would appear identical to the surrounding walls and wouldn't carve the sector up.
Here's a visual example so you can see what I mean.
The following image is a 4 x 4 grid representing a small part of a Wolf3D map. For the purposes of this demonstration, just assume that the surrounding walls are all solid. The color of the grid spaces are as follows:
White: Empty space
Red/Purple: Solid wall
Blue/Green: Polyobjects
The red walls would be actual void space in the converted map, as they cause no possibility of a subsector splitting the available movement space around the polyobjects
The one purple wall would actually be empty sector space so that the movement space forms a perfect square, making the sector concave. However, a separate polyobject would be moved in and act in every way like a solid wall. The player would have no idea that any trickery was being done.
In this way, you can move the blue and green blocks to any of the 5 empty spaces available to them (the 2 spaces left and right of the green block, and the 3 spaces around the blue block, assuming the green block is moved first) without causing HOM.
Note the blue line crossing the "corridor" on the right side of the grid. This line would be the sector divider between the square sector on the left and the corridor to the right. This ensures that the node builder won't split the sector upon node generation.
Unless I'm missing something here, this should work. Even a level composed of hundreds of movable walls should be possible by making the area into a huge square sector, right?
I understand that the sector will get cut into subsectors by the node builder of course, but all you need to do is make any walls that would cause this problem into non-moving polyobjs. They would appear identical to the surrounding walls and wouldn't carve the sector up.
Here's a visual example so you can see what I mean.
The following image is a 4 x 4 grid representing a small part of a Wolf3D map. For the purposes of this demonstration, just assume that the surrounding walls are all solid. The color of the grid spaces are as follows:
White: Empty space
Red/Purple: Solid wall
Blue/Green: Polyobjects
The red walls would be actual void space in the converted map, as they cause no possibility of a subsector splitting the available movement space around the polyobjects
The one purple wall would actually be empty sector space so that the movement space forms a perfect square, making the sector concave. However, a separate polyobject would be moved in and act in every way like a solid wall. The player would have no idea that any trickery was being done.
In this way, you can move the blue and green blocks to any of the 5 empty spaces available to them (the 2 spaces left and right of the green block, and the 3 spaces around the blue block, assuming the green block is moved first) without causing HOM.
Note the blue line crossing the "corridor" on the right side of the grid. This line would be the sector divider between the square sector on the left and the corridor to the right. This ensures that the node builder won't split the sector upon node generation.
Unless I'm missing something here, this should work. Even a level composed of hundreds of movable walls should be possible by making the area into a huge square sector, right?