Submission #7089: arnaud33200's SMS Safari Hunt in 01:11.21

(Link to video)
Sega Master System
baseline
BizHawk 2.5.2
4267
59.9227510135505
2162
Unknown
Hang-On & Safari Hunt (UE) [!].sms
Submitted by arnaud33200 on 4/4/2021 4:10:30 AM
Submission Comments
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:
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:
  • 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.

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...
Last Edited by adelikat on 11/6/2023 1:51 AM
Page History Latest diff List referrers