This game has a prototype article
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.
- 1 Unused Dialog
- 2 Developer Credits
- 3 Unused Graphics
- 4 Unused Abilities
- 5 Unused Sounds
- 6 Debugging Material
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.
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.
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.
The game's texture files contain two unused placeholder images.
||Demonstrates the capability of a transparency mask as it is simply the aforementioned floor/ceiling placeholder texture with holes added to it.|
Controllable Power-up probability
Each level information structure can control exactly how many of each power-up type (Speed, Slow, Map Eraser, Wall, Cloak, Jump, Shield) are placed in a maze. However, the available structures default to evenly spread each type by placing 4 of each, with some obscured randomly by being graphically replaced with a question mark, but their type already being set.
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).
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:
The command IDs 0x8000, 0x8001, 0x8002, 0x8003, 0x84D0, 0x84D6, 0x84D8, 0x84D9, 0x84DC, 0x84EF, 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.
Floor pad commands
The square traps on the floor in every maze can be tested more detailedly with the following commands:
|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
The mini map can display additional information at full window size to debug the maze design and its drawing functionality.
|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.|
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.
|0x84E6||Increase red amount.|
|0x84E7||Decrease red amount.|
|0x84E8||Increase blue amount.|
|0x84E9||Decrease blue amount.|
|0x84EA||Increase green amount.|
|0x84EB||Decrease green amount.|
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.
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):
- 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.
|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.|
The following commands control audio or video internals of the game:
|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.|
Game logic registry keys
It is possible to control human and robot car physics, as well as the robot AI settings.
Even though the windows to edit these settings comfortably were removed at a very early prototype stage, the functionality still remains: At startup, the game checks for the existence of specific registry keys to override default game behavior.
The registry keys are all read from HKEY_CURRENT_USER\SOFTWARE\Microsoft\Hover! and stored in binary format, representing a sequence of 4-byte integers or floats to control specific game logic. It should be noted that the 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.
The following script can be used to create the keys, which are explained in the following:
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 do not feel comfortable editing the registry, the HoverHack tool can be used which simulates the prototype windows and creates the registry keys for you.
Car motion physics
|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.|
The 11 floats map to the following meanings:
- Normal Acceleration - the amount of acceleration until reaching maximum velocity.
- Friction Constant - the amount of sliding when acceleration pauses.
- Max. Velocity - the maximum speed a car can reach.
- Acquire Velocity - the speed an opponent car has when running towards a flag or a human. Unused for the human car.
- Rotation Stability - the amount of spinning after hitting something.
- Rotation Kick - the amount of immediate rotation after hitting something.
- Rotation Accel - the speed of rotational skidding when turning manually.
- Slow Multiplier - the multiplication factor a car gets slower when under the influence of a red light. 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 - the multiplication factor a car gets faster when under the influence of a green light. This is also the speed of the skid pads and sets the maximum speed displayed in the speedometer.
- Turn Lag Factor - the amount of skidding introduced when turning (e.g., the "hovering" effect amount).
- Turn Rate - the speed of rotation when turning manually.
AI behavior parameters
|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 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.