We just released a Feb. 5 '89 prototype of DuckTales for the NES!
If you'd like to support our preservation efforts (and this wasn't cheap), please consider donating or supporting us on Patreon. Thank you!

Hover! (1995)

From The Cutting Room Floor
Jump to navigation Jump to search
This page contains changes which are not marked for translation.
Other languages:
Deutsch • ‎English • ‎polski • ‎svenska • ‎한국어

Title Screen

Hover!

Developer: Microsoft
Publisher: Microsoft
Platform: Windows
Released internationally: August 24, 1995


CopyrightIcon.png This game has hidden developer credits.
GraphicsIcon.png This game has unused graphics.
Sgf2-unusedicon1.png This game has unused abilities.
SoundIcon.png This game has unused sounds.
TextIcon.png This game has unused text.
DebugIcon.png This game has debugging material.


ProtoIcon.png This game has a prototype article
BugsIcon.png This game has a bugs page

Hover! is a game that's something of a tech demo, with fairly basic gameplay, but demonstrating what computers could do at the time. It shipped with the Windows 95 CD-ROM.

Unused Dialog

HoverAbout.png

This About dialog seems to be from an earlier version of the game. However, all known prototypes, as well as the final version, use the standard Windows About dialog.

According to the placeholder date and text seen in the footer, this version was released with Windows 95 Build 224, which is also known as the M7 build.

Developer Credits

HoverDevelopers.png

The intro level shown right after the game starts up contains much more than what meets the eye at first. To move around, hold Ctrl and enter the code IBMAB (the project's code name, "Bambi", spelled backwards). The controls will unlock, and you can maneuver around the wall behind you to see pictures of the game's developers.

HoverDeveloperPhotos.png

Each developer photo may have one out of four different image borders, but there does not seem to be a meaning behind that, rather than artistic choices. Known developers are:

  • Stan LePard (Sound): This was his first game he composed the soundtrack for, after which he contributed to many other Microsoft games.
  • Harley Howe (Graphics): This is his earliest Mobygames credit. He later went on to co-found Cat Daddy Games.

Unused Graphics

The game's texture files contain two unused placeholder images.

Texture Usage Notes
HoverUnusedTexture.png
  • TEXT1.TEX: 1 occurence as "FBASE_02_T" (floor)
  • TEXT2.TEX: 2 occurences as "FBASE_02_T" (floor) and "CBASE_01_T" (ceiling)
  • TEXT3.TEX: 1 occurence as "FBASE_02_T" (floor)
HoverUnusedDecal.png
  • TEXT2.TEX: 2 occurences as "DECAL_00_D" and "DECAL_01_D".
Demonstrates the capability of a transparency mask as it is simply the aforementioned floor/ceiling placeholder texture with holes added to it.

Unused Abilities

Unused Level Information

Each level information structure can control how many of each power-up type are placed in a maze. However, the available structures evenly spread each type by placing 4 of each, with some obscured as a question mark, but their type being set properly.

Also, the level array has 21 entries out of which 2 are unused. The default levels are stored in entries 1 to 18, with the game looping between 16 and 18 for any level after 18, and entry 21 storing the splash screen level information. Entries 19 and 20 are unused. The complete table is calculated as follows:

Level Pod Counts Object Counts Level Bonus Flag Capture Bonus Flag Remain Bonus
# Maze1 Speed Slow Map Wall Cloak Jump Shield Green Bot Blue Bot Flags Easy Medium Hard Easy Medium Hard Easy Medium Hard
1 1 4 4 4 4 4 4 4 1 1 3 0 0 0 900 1000 1100 2250 2500 2750
2 2 4 4 4 4 4 4 4 1 1 3 4050 4500 4950 1350 1500 1650 3375 3750 4125
3 3 4 4 4 4 4 4 4 1 1 3 9450 10500 11550 1800 2000 2200 4500 5000 5500
4 1 4 4 4 4 4 4 4 2 1 4 18450 20500 22550 2250 2500 2750 5625 6250 6875
5 2 4 4 4 4 4 4 4 2 2 4 29250 32500 35750 2700 3000 3300 6750 7500 8250
6 3 4 4 4 4 4 4 4 2 2 5 45000 50000 55000 3150 3500 3850 7875 8750 9625
7 1 4 4 4 4 4 4 4 3 2 5 63000 70000 77000 3600 4000 4400 9000 10000 11000
8 2 4 4 4 4 4 4 4 3 2 6 87300 97000 106700 4050 4500 4950 10125 11250 12375
9 3 4 4 4 4 4 4 4 3 3 6 114300 127000 139700 4500 5000 5500 11250 12500 13750
10 1 4 4 4 4 4 4 4 4 3 6 144000 160000 176000 4950 5500 6050 12375 13750 15125
11 2 4 4 4 4 4 4 4 4 3 6 176400 196000 215600 5400 6000 6600 13500 15000 16500
12 3 4 4 4 4 4 4 4 4 3 6 211500 235000 258500 5850 6500 7150 14625 16250 17875
13 1 4 4 4 4 4 4 4 5 4 6 249300 277000 304700 6300 7000 7700 15750 17500 19250
14 2 4 4 4 4 4 4 4 5 4 6 289800 322000 354200 6750 7500 8250 16875 18750 20625
15 3 4 4 4 4 4 4 4 5 4 6 333000 370000 407000 7200 8000 8800 18000 20000 22000
16 1 4 4 4 4 4 4 4 6 4 6 378900 421000 463100 7650 8500 9350 19125 21250 23375
17 2 4 4 4 4 4 4 4 6 4 6 378900 421000 463100 7650 8500 9350 19125 21250 23375
18 3 4 4 4 4 4 4 4 6 4 6 378900 421000 463100 7650 8500 9350 19125 21250 23375
19 1 4 4 4 4 4 4 4 6 4 6 0 0 0 0 0 0 0 0 0
20 2 4 4 4 4 4 4 4 6 4 6 0 0 0 0 0 0 0 0 0
21 S 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  1. Where 1=Medieval, 2=City, 3=Sewer, S=Small (splash screen). If random mazes are selected, this column is ignored.

Unused Sounds

hit_shld.wav

The sound directories contain a hit_shld.wav which is never played by the game's code. Its internal ID is 19, listed between hitting a robot (20) and a wall (18). Since the sound to place a power-up wall is named shield.wav, this sound was probably meant when hitting such walls, and they mave have looked differently first (more like a shield).

Debugging Material

Debug Commands

The final game retains most debugging commands from an early beta version, which are not accessible through the UI by default, but can be added back with a menu resource editor and the given command IDs:

Hmmm...
To do:
The command IDs 0x8000, 0x8001, 0x8002, 0x8003, 0x84D0, 0x84D6, 0x84F1 (and possibly more) are definitely bound by the game, but are either constantly disabled or have no noticeable effect. Test them more thoroughly or check what their code does.

Advanced Game Logic Settings

It is possible to control human and robot car physics, as well as the robot AI settings and additional gameplay parameters.

Even while the dialogs required for this have been removed, the code to use them is still available in the final executable. Thus, to revive the commands listed below, you also need to copy over the dialogs from the 1.0.8.0 Beta executable (with a resource hacking tool) or nothing will happen when invoking the commands.

ID Dialog ID Description
0x84D2 133
Hover SetPosition.png
Set New Position. Teleports and stops the human car there, with the fields "X Position", "Y Position" and "Angle".
0x84D8 148
Hover PlayerMotionPhysics.png
Player Motion Physics. The 11 values have the following meaning, with physics being updated 20 times a second (optimally the same as the frame rate):
  • Normal Acceleration - Fixed amount added to current velocity each frame until reaching Max. Velocity. While accelerating, the Friction Constant is not applied.
  • Friction Constant - Percentage of current velocity added to it while not accelerating, thus negative to slowly decelerate back to 0 speed. A value of -0.5 would reduce the speed by 50% each frame. 0 would be an immediate stop. 0.5% would increase the speed by 50% every frame until reaching Max. Velocity.
  • Max. Velocity - Fixed speed a car cannot exceed, even if speed resulting from collisions would physically exceed it. This is temporarily increased or decreased while Speed and Slow Pods are active.
  • Acquire Velocity - Speed which an AI car targets when running towards a flag or a human. Unused for the human car.
  • Rotation Stability - Percentage of rotation speed removed each frame (torque decay). 1 (100%) disallows any turning, 0.1 (10%) adjusts it very slowly, 0 (0%) keeps rotating the car infinitely. Negative values increase the amount of spinning infinitely.
  • Rotation Kick - Amount of immediate rotation after hitting something.
  • Rotation Accel - Speed of rotational skidding when turning manually.
  • Slow Multiplier - Multiplicator of Max. Velocity to decrease the highest allowed speed (thus less than 1) while a Slow Pod is active. This has no effect on opponent cars as they can't collect pods. Interestingly, it is well set up for them though - this might hint that it was once planned that opponent cars could at least collect pods (but maybe not use power-ups).
  • Speed Multiplier - Multiplicator of Max. Velocity to increase the highest allowed speed (thus bigger than 1) while a Speed Pod is active. This is also the speed of the skid pads. Together with Max. Velocity, this determines the highest bar of the speedometer and largest radius of the direction needle (before drawing out of bounds).
  • Turn Lag Factor - Percentage of rotation adjustment each frame to ensure the car is moving into the direction it is facing (e.g. the amount of slipperyness / skidding causing the "hovering" effect). 1 (100%) immediately moves into the direction the car is facing, 0 (0%) means no adjustment. The stronger the correction, the stronger it decelerates the car. Values above 1 oversteer which is recorrected each frame and causes jittering, negative values turn the car more and more away from the actual direction and accelerate as a side effect.
  • Turn Rate - Degrees applied to car rotation each frame, triggered by turning (torque). Rotation Stability decreases this amount every frame while not turning.
0x84D9 149
Hover DroneMotionPhysics.png
Drone Motion Physics. The values are described above.
0x84DC 130
Hover TuningParameters.png
Tuning Paramaters (sic). It sets up the duration of power-up effects as "Speed", "Slow", "God", "Smoke" and "Tmp Wall" and jump physics as "Accel", "Velocity" and "Velocity Deg", but the jump physics seem to have no effect.
0x84EF 152
Hover RobotAITuning.png
Robot AI Tuning Parameters. The 10 values map to the following meanings:
  • Backup Turn Rate (float) - The chance of turning in backwards driving a drone will take when being hit and confused.
  • Backup Game Cycles (integer) - The length of backwards driving a drone will take when being hit and confused.
  • Backup Speed Factor (float) - The speed of backwards driving a drone will take when being hit and confused, relative to the normal driving speed.
  • Max. Target Angle Adjust (integer) - The maximum angle a drone will turn to start targeting (unsure).
  • Max Angle for Acceleration (integer) - The angle a target has to be in before the drone accelerates towards it.
  • Max Dist to Acquire Human (integer) - The maximum distance before a green drone sees the human car and targets it.
  • Max Dist to Acquire Flag (integer) - The maximum distance before a blue drone sees a red flag and targets it.
  • Max Beacon Distance (integer) - The maximum distance to a waypoint before a drone queries it as the next target.
  • Max Beacon Height Difference (integer) - The height at which a drone can see a waypoint and will query it as the next target.
  • Beacon Search Depth (integer) - Probably represents the number of beacons to validate before taking their route, making sure no other drone is using them now.

A distance of 500 is approximately the length of a car.

Alternatively, if you do not want to add dialogs, you can use registry keys to modify these settings externally: They are all read from HKEY_CURRENT_USER\SOFTWARE\Microsoft\Hover! and stored in binary format, representing a sequence of 4-byte integers or floats in order of the above descriptions.

Floating point values are stored in fixed-point packed integer format: They are read like an integer, but then divided by 65536.0 to retrieve the "real" floating value.

Key Name Description
HBegParams Controls car physics in Easy mode.
HIntParams Controls car physics in Intermediate mode.
HExpParams Controls car physics in Difficult mode.
RBegParams Controls car physics of the opponents in Easy mode.
RIntParams Controls car physics of the opponents in Intermediate mode.
RExpParams Controls car physics of the opponents in Difficult mode.
RobotAIBegParams Flags to control opponent behavior, in Easy mode.
RobotAIIntParams Flags to control opponent behavior, in Intermediate mode.
RobotAIExpParams Flags to control opponent behavior, in Difficult mode.

The following script can be used to create the keys with default values:

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Hover!]
"HBegParams"=hex:00,00,01,00,34,F3,FF,FF,00,00,32,00,00,00,00,00,00,80,00,00,33,33,00,00,\
  33,33,00,00,F5,A8,00,00,7A,54,01,00,99,19,00,00,00,00,05,00
"HIntParams"=hex:00,00,03,00,71,FD,FF,FF,00,00,41,00,00,00,00,00,00,80,00,00,CC,4C,00,00,\
  CC,4C,00,00,00,80,00,00,7A,54,01,00,66,06,00,00,00,00,07,00
"HExpParams"=hex:00,00,05,00,BF,FF,FF,FF,00,00,4B,00,00,00,00,00,00,80,00,00,00,80,00,00,\
  66,66,00,00,66,66,00,00,7A,54,01,00,8F,02,00,00,00,00,0F,00
"RBegParams"=hex:00,00,01,00,71,FD,FF,FF,00,00,28,00,00,00,14,00,CC,CC,00,00,CC,CC,00,00,\
  CC,4C,00,00,F5,A8,00,00,7A,54,01,00,66,06,00,00,00,00,05,00
"RIntParams"=hex:00,00,01,00,71,FD,FF,FF,00,00,32,00,00,00,14,00,CC,CC,00,00,CC,CC,00,00,\
  CC,4C,00,00,F5,A8,00,00,7A,54,01,00,66,06,00,00,00,00,05,00
"RExpParams"=hex:00,00,01,00,71,FD,FF,FF,00,00,3C,00,00,00,14,00,CC,CC,00,00,CC,CC,00,00,\
  CC,4C,00,00,F5,A8,00,00,7A,54,01,00,66,06,00,00,00,00,05,00
"RobotAIBegParams"=hex:00,80,01,00,3C,00,00,00,66,66,00,00,1E,00,00,00,0F,00,00,00,88,13,00,00,\
  88,13,00,00,88,13,00,00,64,00,00,00,03,00,00,00
"RobotAIIntParams"=hex:00,80,01,00,3C,00,00,00,66,66,00,00,1E,00,00,00,0F,00,00,00,58,1B,00,00,88,\
  13,00,00,88,13,00,00,64,00,00,00,04,00,00,00
"RobotAIExpParams"=hex:00,80,01,00,3C,00,00,00,66,66,00,00,1E,00,00,00,0F,00,00,00,10,27,00,00,88,\
  13,00,00,88,13,00,00,64,00,00,00,04,00,00,00

If you also do not feel comfortable editing the registry, the HoverHack tool can be used which simulates the settings dialogs and creates the registry keys for you.

Floor Pad Commands

The square traps on the floor in every maze can be tested more detailedly with the following commands:

ID Description
0x84DB Hold pad test. Allows movement while driving over them, with car being lowered.
0x84ED Hold pad test. Totally disables any effect when driving over them.
0x84EE Flag remover pad test. Removes all collected flags and places them back in the maze.

Mini Map Commands

All mini map features enabled.

The mini map can display additional information at full window size to debug the maze design and its drawing functionality.

ID Description
0x84D5 The mini map covers the complete window. All walls are constantly visible. This does not work in fullscreen mode. Resizing the window ends this mode.
0x84D7 Mini map displays robot beacons (waypoints) and routes to them. Robots move from one waypoint to another, unless they target either you (green robots), a flag (blue or yellow robots), or are currently recovering from having been hit. If a beacon is marked with a square around it, a robot is currently targeting and driving towards it.

Palette Commands

The brightness has been decreased multiple times.

Hover is fading distant objects to a specific color (fog) which can be modified with the following commands. Note that these commands can be applied repeatedly to strengthen the effects.

ID Description
0x84E5 Decrease brightness.
0x84E6 Increase red amount.
0x84E7 Decrease red amount.
0x84E8 Increase blue amount.
0x84E9 Decrease blue amount.
0x84EA Increase green amount.
0x84EB Decrease green amount.
0x84EC Increase brightness.

Power-up Commands

The following commands yield a specific power-up each, as if the corresponding pod (green sphere) was collected. Note that using these commands in the above mentioned developer maze does not work, and causes them to no longer function for the remainder of the game.

ID Power-up
0x84DD Jump
0x84DE Cloak
0x84DF Wall
0x84E0 Slow
0x84E1 Speed
0x84E2 Shield
0x84E3 Map Eraser

Status Bar Commands

A status bar at the bottom of the game's window (does not work in fullscreen) can be displayed through multiple commands, displaying the following information (from left to right):

Hover Statusbar.png

  • The X coordinate of the human car (updated every 3 seconds).
  • The Y coordinate of the human car (updated every 3 seconds).
  • The height of the human car (updated every 3 seconds).
  • The current frames per second and the desired FPS (updated every 3 seconds).
  • The width of the game resolution, in pixels.
  • WALL if the human car is colliding with a wall.
  • POD if the human car is colliding with a power up bubble or an opponent team's flag.
  • FLOOR if the human car is colliding with raised or lowered steps, or a floor pad.
  • CAR if the human car is colliding with other cars.
ID Description
0x8033 Shows the status bar, covering a tiny bottom of game view until the window is resized.
0x84DA Shows the status bar, but also resizes the window to not make it overlap the game view. This always causes the window to switch to the nearest lower resolution.

Other Commands

The following commands control audio or video internals of the game:

ID Description
0x8035
Hover WavMix32.png
Opens the debug control dialog of the integrated WavMix32 sound mixer.
0x84F0 Only enabled when the game is run in a 640x480 resolution window. Switches between the half-resolution 320x240 (default fullscreen) or native 640x480 graphics.
0x84F2 No effect, the code was removed, but the command is still bound.

Debug Messages

The game may write any of the following lines to the debug output when loading data or logging system events:

Trashing Heap
Blowing floor heap
Blowing fixed memory heap.  Increase MAXTEXTURESIZE in CTexture.h and re-compile.
ScreenSaver Starting...
Disabling Screen Saver
Allowing Screen Saver