Safari Hunt is a light gun shooter game on Sega Master System first released in 1986 integrated in the BIOS (version 2.4) alongside with Hang On for the first North America launch where the light phaser (light gun) was included in the package. Later on it was available in the compilation games
Hang On & Safari Hunt
and Marksman Shooting / Trap Shooting / Safari Hunt
.
Game objectives
- Emulator used: BizHawk 2.5.2
- Finish the first 3 rounds as fast as possible (first loop)
- Heavy luck manipulation
Comments
Safari Hunt is a shooting game with 3 repeating levels (lake, forest & jungle). Each level has 3 or 4 different types of target to shoot, the goal is to get enough points to be qualified for the next round, with 30 ammos or a time limit (2560 frames = ~43s). Round will be then over when all the 30 bullets are shot or time is out (the timer is not visible), and all targets have left the screen.
This has an end screen after 69 rounds, the final screen has a funny message:
YOU ARE A WONDERFUL HUNT
LET'S GO TO THE REAL HUN
WITH A REAL GUN
I might do a TAS for all the 69 rounds in another submission, so this TAS should be a Vault tier as I want to show the results of my research and it can be a starting point for an
any% all rounds
run.
Lake | Forest | Jungle |
---|---|---|
Spawn routine
The game has 6 slots to spawn 6 targets at the same time on the screen. Each target type would be attributed to 1 or 2 specific slots (e.g. Duck slot 2 & 3). Only the first 5 slots are used for shootable targets, the 6th slot is used for some extra animation (e.g. splash animation for the fish).
%% Addresses for the 6 slots in memory
Slot Index | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
Addr | 0x0530 | 0x0560 | 0x0590 | 0x05C0 | 0x05F0 | 0x0620 |
Each slot contains all the information of the target spawn, depending on the type of target, some values have a different purpose.
Here are some useful address offsets common for each slots:
Here are some useful address offsets common for each slots:
Offset | Name | Info |
---|---|---|
+0 | Type | the number use to identify a target (e.g. 25 = duck) |
+7 | Y | Y position from 0 to 192 |
+9 | X | X position from 0 to 256 |
+12 | Height | 16 pixels except for the bear & monkey (24) and the bat (8) |
+14 | Width | 16 pixels except for the bear & panther (24) |
+15 | dY | signed value to add to the Y position each frame |
+17 | dX | signed value to add to the X position each frame |
+32 | direct type | a number to set the direction (dY & dX) from a subroutine in the code |
+33 | direction time | the next time the direction will be changed |
The game will follow a spawn order from a table in memory for each level. This spawn table has a size of 20 bytes, for an index from 0 to 9, index+0 is the target type and index+1 is the next spawn time.
This how the current spawn is tracked in memory:
This how the current spawn is tracked in memory:
-
0x0217
- current spawn index -
0x0218
- next spawn time -
0x0219
- spawn table ROM address (e.g.0x1BDA
for lake level)
At the beginning of each round, the first index would not spawn and the next spawn timer will be set to 16. For instance the first round starts with the index 0 but the very first spawn is for the index 1 after 16 frames.
Each frame, the next spawn time is decreased, when this value reach zero:
- Current spawn index is increased by 1 (modulo 10)
- Check the slot(s) associate with the target:
- A slot is available, then set the target type in the slot and set the next spawn time
- all slots are occupied, then spawn is skipped and the next target spawn time is set to 1
- once the slot is setup, the spawn info (size, animation, …) is set with a random location for some target:
- Location is not set and the spawn is canceled, the current spawn time stays the same.
- location is set from a subroutine.
Luck Manipulation
Because of the simplicity of the light phaser, the shot action and the shot location can be use manipulate the luck. When the player presses the trigger, the game freezes during 1 frame in order to compute where the gunshot and the RNG (address:
0x01ED
) is not updated during that frame. Depending on the location, the RNG may be different
Target spawn location
- Make sure the spawn location is set inside the screen (avoid spawn cancelation)
- Choose a location where the target can exit the screen quickly after getting shot when it requires, usually at the end of the round or to avoid a spawn skipping
Target spawn direction:
Manipulating the direction for some target (e.g. Ducks), we can keep them on the screen long enough to do some spawn skipping and make other targets with more points to spawn quicker.
Manipulating the direction for some target (e.g. Ducks), we can keep them on the screen long enough to do some spawn skipping and make other targets with more points to spawn quicker.
Stage by stage comments
Round 1 - Forest
Name | RABBIT | DUCK | FISH |
---|---|---|---|
Type | 24 | 25 | 26 |
Points | 1000 | 300 | 1000 |
Slot index | 0 | 2 & 3 | 1 |
Spawn Table (0x1BC6)
Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
Target | DUCK | DUCK | FISH | DUCK | RABBIT | DUCK | RABBIT | DUCK | FISH | DUCK |
Time | 64 | 88 | 64 | 96 | 64 | 88 | 64 | 88 | 64 | 64 |
We need to reach 10 000 as fast as possible, for that we want the fish and rabbits to spawn quicker since they give 1000 points and for that we want 2 ducks to always fly around so every other duck spawn would be skipped.
Rabbit is the fastest target to exit the screen when spawn on the right and it allows to have 2 rabbit spawns in the row. The fish is the slowest to Spawn and despawn, it’s better to skip a fish spawn for a rabbit spawn.
With a total of 6 rabbits and 3 fishes, we just need to get 4 ducks in order to have just above the minimum 10 000 points. We need 2 spawns of duck during the first level, it’s better to do right after a fish spawn, duck at index 9 has the smallest next spawn time of 64 frames instead of 88 or 96.
Level Spawn
Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Spawn | _-_ | DUCK | FISH | DUCK | RABBIT | _-_ | RABBIT | _-_ | FISH | DUCK | _-_ | _-_ | FISH | _-_ | RABBIT | _-_ | RABBIT | _-_ | FISH | DUCK | _-_ | _-_ | _-_ | _-_ | RABBIT | _-_ | RABBIT |
Timer | 16 | 88 | 64 | 96 | 64 | 1 | 64 | 1 | 64 | 64 | 1 | 1 | 64 | 1 | 64 | 1 | 64 | 1 | 64 | 64 | 1 | 1 | 1 | 1 | 64 | 1 | 64 |
Round 2 - Forest
Name | PARROT (bird) | AMARDILLO | BEAR | APPLE |
---|---|---|---|---|
Type | 27 | 28 | 30 | 2 |
Points | 200 | 1000 | 2000 | 1000 |
Slot index | 2 & 3 | 1 | 0 | 4 |
Spawn table (
0x1BDA
)
Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
Target | PARROT | AMARDILLO | PARROT | BEAR | PARROT | AMARDILLO | PARROT | BEAR | PARROT | AMARDILLO |
Time | 64 | 64 | 88 | 88 | 64 | 64 | 88 | 64 | 64 | 16 |
This level has the fastest spawn cycle: SUM = 664 frames. On top of that, there are apples that spawn independently from the target spawn routine. The main focus is to get as many apples as possible.
The strategy here is to get a lot of points so for the next round which has the slowest spawn (SUM = 768 frames), we can the remaining points while shooting all the 30 bullets as fast as possible. In this case we need 25200 points and it can be done with 8 apples, 2 bears, 2 armadillos and 5 parrots.
Unless level 1, here we want to avoid having spawn skipping because the bears are slowest to exit the screen and we only want 2 of them before the end of the round, so we need to have all the spawn in order to avoid the 3rd bear spawn. It’s also faster to have the first spawn at the beginning of the round.
Level Spawn
Index | 6 | 7 | 8 | 9 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|---|---|---|---|
Target | _-_ | BEAR | PARROT | AMARDILLO | PARROT | _-_ | PARROT | BEAR | PARROT | AMARDILLO | PARROT |
Time | 16 | 64 | 64 | 16 | 16 | 1 | 88 | 88 | 64 | 64 | 88 |
Round 3 - Jungle
Name | SPIDER | BAT | MONKEY | PANTHER |
---|---|---|---|---|
Type | 29 | 31 | 33 | 34 |
Points | 100 | 500 | 300 | 2000 |
Slot index | 0 | 1 | 2 | 3 |
Spawn table
Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
Target | BAT | SPIDER | MONKEY | SPIDER | BAT | SPIDER | MONKEY | PANTHER | BAT | MONKEY |
Time | 96 | 64 | 96 | 80 | 64 | 64 | 64 | 96 | 80 | 64 |
For this level we are shooting all the 30 bullets as fast as possible! The spider, the monkey and the bat are shot at the last moment to skip 5 targets and get a 2nd panther at the end. For the last panther, the spawn location has been manipulated to have a fast despawn on the right.
Index | 6 | 7 | 8 | 9 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Target | _-_ | PANTHER | BAT | MONKEY | _-_ | SPIDER | _-_ | _-_ | _-_ | _-_ | _-_ | PANTHER |
Time | 16 | 96 | 80 | 64 | 1 | 64 | 1 | 1 | 1 | 1 | 1 | 96 |
Other comments
Tools used
- Emulicius: Decompile to assembly & debugger, great tools and wrote in java (works anywhere)
- Lua Scripts: draw target hit boxes and generate some logs
For next
- look more in detail for the RNG to see how the shot location impact the value
- look at how target hit box behind an obstacle work (tree, bush, ...)
GoddessMaria: Jugding...