TASVideos

Tool-assisted game movies
When human skills are just not enough

Game Resources / DOS / Wolfenstein 3D

Movement

Scale

  • Each tile is 65536 units.
  • Player radius (∞-norm) is 22528 units.
  • There are 360 directions in full circle (degrees).
  • There are 20 subdirections in each direction.
  • There are 65 door positions.

Speed

  • Forward: Max. 14999 units per frame.
  • Backward: Max. 9999 units per frame.
  • Sideways (strafe): Max. 14999 units per frame.
  • Straferun (diagonal): Max. 21212 units per frame.
  • Backwards straferun (diagonal): Max 18026 units per frame.
  • Maximum turn is 5 units per frame (= 5 degrees per frame).
  • Doors open/close at 1 position per frame.
  • Example: Rectangle room might be 10 N, 15 W = 25 frames, but diagonal = 26 frames

Primary direction

Each direction has associated primary direction. This is the direction "use" command searches for object (door, elevator, secret door, etc...)

  • For 45 degree direction (North-East), it is North.
  • For 135 degree direction (North-West), it is West.
  • For 225 degree direction (South-West), it is South.
  • For 315 degree direction (South-East), it is South (not East).
  • For every other direction, it is the nearest cardinal direction.

So for instance, if strafing West at 135 degree angle, you can open door pointing to West, but if strafing West at 225 degree angle, you can't open that door without turning.

Also, doors to East (like the normal elevator door and elevator in E1L1) can't be opened at either 45 degree angle suitable for straferunning East.

Weapons

Pistol

Has no rapid fire ability. Fires every 25 frames.

Machine Gun

While holding down the fire button, fires every 12 frames. Fires every 25 frames if the fire button is released and pushed again. As a result of this, it's slightly more efficient to hold down the fire button even if every other shot misses.

Chaingun

While holding down the fire button, fires every 6 frames. Acts like the machine gun, except with an involuntary second bullet, so each volley is an even number of bullets. Volleys start 25 frames apart from each other if the fire button is released and pressed again (or 19 frames after the second bullet of the last volley).

Player-to-enemy damage calculation

All random numbers are 0-255.

The numbers are pulled from a table-based pseudo-random number generator. The table of values is (pulled from the source):

    0,   8, 109, 220, 222, 241, 149, 107,  75, 248, 254, 140,  16,  66
   74,  21, 211,  47,  80, 242, 154,  27, 205, 128, 161,  89,  77,  36
   95, 110,  85,  48, 212, 140, 211, 249,  22,  79, 200,  50,  28, 188
   52, 140, 202, 120,  68, 145,  62,  70, 184, 190,  91, 197, 152, 224
  149, 104,  25, 178, 252, 182, 202, 182, 141, 197,   4,  81, 181, 242
  145,  42,  39, 227, 156, 198, 225, 193, 219,  93, 122, 175, 249,   0
  175, 143,  70, 239,  46, 246, 163,  53, 163, 109, 168, 135,   2, 235
   25,  92,  20, 145, 138,  77,  69, 166,  78, 176, 173, 212, 166, 113
   94, 161,  41,  50, 239,  49, 111, 164,  70,  60,   2,  37, 171,  75
  136, 156,  11,  56,  42, 146, 138, 229,  73, 146,  77,  61,  98, 196
  135, 106,  63, 197, 195,  86,  96, 203, 113, 101, 170, 247, 181, 113
   80, 250, 108,   7, 255, 237, 129, 226,  79, 107, 112, 166, 103, 241
   24, 223, 239, 120, 198,  58,  60,  82, 128,   3, 184,  66, 143, 224
  145, 224,  81, 206, 163,  45,  63,  90, 168, 114,  59,  33, 159,  95
   28, 139, 123,  98, 125, 196,  15,  70, 194, 253,  54,  14, 109, 226
   71,  17, 161,  93, 186,  87, 244, 138,  20,  52, 123, 251,  26,  36
   17,  46,  52, 231, 232,  76,  31, 221,  84,  37, 216, 165, 212, 106
  197, 242,  98,  43,  39, 175, 254, 145, 190,  84, 118, 222, 187, 136
  120, 163, 236, 249
The RNG index is a value from 0-255. It increases at least once every frame and also whenever a random number is required, and wraps back around after it hits 255.

Enemy-to-player damage

Enemy AI

Enemies behave differently depending on if they can see you or not. Note that AI decisions are based on entire tiles, and the subposition of the player is not used as a tiebreaker if they line up with the enemy.

Enemy sees player

  • List of enemy travel directions, in order of priority. If one direction is blocked, it will go down the list until something works.
    • Diagonal towards the player. If their x tile is the same as the player, west will be the x component, and if the y tiles are the same, north will be the y component.
    • Cardinal direction towards the player, randomly chosen between the two possibilities
    • Other cardinal direction towards the player
    • Cardinal direction away from the player, randomly chosen between the two possibilities. This is predetermined by the previous randomly chosen direction and does not use an extra RNG roll.
    • Other cardinal direction away from the player
  • If the enemy is less than 4 tiles away from the player, they will want more distance. In this case, use the above priority list but prioritize moving away from the player.
  • An RNG roll is always used when determining the direction, even if the diagonal is free.
  • If a door is blocking the enemy's preferred direction, they will open it even if it's locked.
  • The odds of the enemy shooting the player decrease with distance.
    • If the player is right up against the enemy, he's guaranteed to stop and shoot.

Enemy is awake but cannot see player

  • List of enemy travel directions, in order of priority. If one direction is blocked, it will go down the list until something works.
    • Cardinal direction towards the player with the largest difference in distance to the player. Skip if this requires turning around
    • Other cardinal direction towards the player. Skip if this requires turning around. Also skip if the player is lined up directly behind.
    • Direction previously traveled by the enemy
    • Enemy will rotate until it finds a free direction. This includes diagonals and is the only way for enemies to move diagonally when they can't see the player. Any direction that involves turning around is skipped over. The direction of rotation (clockwise or counter-clockwise) is randomly chosen. The enemy will only check west, northwest, and north, which is possibly unintended but is what the code does. This RNG roll is not done unless this step is necessary.
    • Turn around as a last resort
  • If a door is blocking the enemy's preferred direction, they will open it even if it's locked.

Enemy reaction times

Enemies will react if they see you or if you fire a bullet within their floor code (enemies placed on deaf tiles will not react to bullets). Floor codes and deaf tiles can be viewed in the map editor. If a door is even slightly open between two floor codes, they will be considered conjoined and firing within one code will awaken enemies in both. Errors in floor code design can be exploited to awaken enemies behind locked doors and do some easy door tricks (see E3L3).

Different enemies have different reaction times once they're aware of your presence, with some of them incorporating randomness. All reaction times here are given in frames.

  • Guard: 1 + random/4 (range of 1 to 64)
  • SS and mutant: Both are 1 + random/6 (range of 1 to 43)
  • Dog: 1 + random/8 (range of 1 to 32)
  • Officer: Always 2, no randomness involved.
  • Everything else (including bosses): Always 1.

Level editor

Havoc's Wolf3D Editor gives you detailed level maps, object locations, and enemy patrols: http://hwolf3d.dugtrio17.com/index.php?section=hwe

Memory addresses:

Address Set #41: Wolfenstein 3D
System: DOS
Download .wch file for: BizHawk
Domain Address Data Type Signed Endian Description
System Bus 26E70 Byte Unsigned Little RNG index
System Bus 425F6 Word Unsigned Little Door openness table (64 entries)
System Bus 44888 Byte Unsigned Little Tile data (4096 entries)
System Bus 468A2 Word Signed Little Player health
System Bus 471DE Word Unsigned Little Level timer
System Bus 477E4 Word Signed Little Player sub-heading
System Bus 48822 Word Unsigned Little Object types (150 entries, 60 byte stride)
System Bus 4882C Byte Unsigned Little Object direction (150 entries, 60 byte stride) from 0 to 7, 0 being east and increasing 45 degrees counter-clockwise
System Bus 4882E Doubleword Unsigned Little Player X position
System Bus 4882F Word Unsigned Little Object X (150 entries, 60 byte stride)
System Bus 48832 Doubleword Unsigned Little Player Y position
System Bus 48833 Word Unsigned Little Object Y (150 entries, 60 byte stride)
System Bus 48848 Word Unsigned Little Player heading (degrees)
System Bus 4884A Word Signed Little Object health (150 entries, 60 byte stride)


Combined RSS Feed
GameResources/DOS/Wolfenstein3D last edited by slamo on 2016-09-05 00:47:55
Page info and history | Latest diff | List referrers | View Source