TASVideos

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

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

Console: Sega MasterSystem
Game name: Safari Hunt
Game version: USA/Europe
ROM filename: Hang-On & Safari Hunt (UE) [!].sms
Branch:
Emulator: BizHawk 2.5.2
Movie length: 01:11.21
FrameCount: 4267
Re-record count: 2162
Author's real name: Arnaud Ladoucette
Author's nickname: arnaud33200
Submitter: arnaud33200
Submitted at: 2021-04-04 04:10:30
Text last edited at: 2021-04-14 02:01:12
Text last edited by: arnaud33200
Download: Download (2228 bytes)
Status: judging underway
Submission instructions
Discuss this submission (also rating / voting)
List all submissions by this submitter
List pages on this site that refer to this submission
View submission text history
Back to the submission list
Author's comments and explanations:

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.


(Link to video)

Game objectives

  • Emulator used: BizHawk 2.5.2
  • Finish the first 3 rounds as fast as possible
  • 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 25 25 26 25 24 25 24 25 26 25
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 - 25 26 25 24 - 24 - 26 25 - - 26 - 24 - 24 - 26 25 - - - - 24 - 24
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 27 28 27 30 27 28 27 30 27 28
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 - 30 27 28 27 - 27 30 27 28 27
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 31 29 33 29 31 29 33 34 31 33
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 - 34 31 33 - 29 - - - - - 34
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...


Similar submissions (by title and categories where applicable):