Submission #7372: Dacicus's SNES Skipp and Friends: Unexpected Journey in 05:22.85

Super Nintendo Entertainment System
baseline
(Submitted: Skipp and Friends - Unexpected Journey V4.01pdrc (PD).smc USA)
BizHawk 2.4.0
19403
60.0988138974405
6187
PowerOn
Submitted by Dacicus on 3/31/2022 1:44 PM
Submission Comments
Now that it's April 1 somewhere in the world, let's get the fun going with my final submission to the site!
Encodes to accompany your reading pleasure: TAS, TAS + status display - level transitions, Non-TAS playthrough (for comparison)

The Game

Skipp and Friends: Unexpected Journey is a homebrew SNES puzzle game that won a competition in 2009. It later had a cartridge release as part of Super 4 in 1 Multicart. Someone even wrote a walkthrough for it.

The Plot

The game explains it nicely, but this run skips the story screen in order to save time, so I have copied it here and added some thoughts.
In former times, friends Skipp, Apple, and the Wedge were camped.
Yay, camping! Enjoying the great outdoors! Spending time in the pristine wilderness! Wait... these guys aren't FPS players, are they? No, don't camp. Move around and help your teammates, slackers.
Opposing to expectation, as for them they were kidnapped by the foreigners which is supposed to because it exists.
There are numerous dangers when camping: Bigfoot, illegal farmers, illegal hunters, Nessie, ROUS's, sinkholes, illegal traffickers, etc. In this case, it looks like the illegal aliens have struck.
They were placed on the underground prison of the spacecraft of enormous foreign country....
An underground prison on a spacecraft? So many questions... Somehow, I doubt that Russia, China, Canada, India, China, Indonesia, Brazil, Pakistan, Australia, or Brazil will be willing share information about their technological research into such matters.
Before marshmellows burns, it escapes from the body of the captivity and it must help those in order to return to their planet!
OK, so the goal is to complete the game before the marshmallows burn. The game provides no marshmallow burn indicator, so it's up to the viewers to determine when to call time, when to start timing, how many marshmallows to cook, and how to cook them. Please prepare your bag of marshmallows, your marshmallow cooking sticks, and your fire before you start watching.
Hm... puzzle game with three characters kidnapped by aliens... sounds familiar. Is this the return of Tommy?

The Characters

Each of our furry protagonists has unique abilities to contribute to the escape attempt:
  • Skipp (the deer) can fly using a rocket and can detonate some type of explosive. The explosion can damage enemies and destroy certain walls.
  • Wedge (the platypus) can shoot a laser gun and can generate a protective barrier around himself.
  • Apple (the ferret) can unlock doors via cardkey and can scream. The scream stuns enemies briefly.
Speaking of enemies, there is only one type of common enemy. Each one patrols a set path. When a protagonist moves into attack range, the enemy rushes over to attack. When a protagonist moves out of attack range, the enemy goes back to patrolling like nothing happened. The enemy just focuses on the first protagonist to move into attack range, ignoring any others while that first protagonist is still in range. Based on this information, I deduce that the enemies might be robots or stereotypically lazy union workers.

Mechanics

Controls

ButtonFunction
D-padMovement
A or XFirst ability
B or YSecond ability
L shoulderSwitch character
R shoulderWhen pressed, D-pad moves the camera around the level
StartPause
SelectReset level (while paused)
When switching characters, the selection always goes to the right (Skipp to Wedge to Apple and back to Skipp). You can do another action on the same frame as switching, and there is no delay before the next character can do an action. For example, assume that Skipp is selected. You press Up and L shoulder on frame 9001. This causes Skipp to move upward and transfers control to Wedge. Then you press Down on frame 9002, which causes Wedge to move downward.

The Grid

Each square tile in a level has a size of 256 by 256 (0x100 by 0x100) units. The bottom and right borders of solid blocks are at 0x70 in the low byte, whereas the top and left borders are at 0x9F. This means that characters will stop at 0x70 when moving up or left into a solid block and at 0x9F when moving down or right.

Movement

CharacterSpeed (distance per frame)
Skipp0x1E = 30
Wedge0x14 = 20
Apple0x23 = 35
Moving tiles0x19 = 25
Snap to grid0x10 = 16
Corner boost0x20 = 32
When using the D-pad, characters move at a fixed speed; there is no acceleration. The distance is the same in the horizontal and vertical directions. Likewise, moving tiles force the character to move at fixed speed. Much like a Delta P situation, once the tiles got ya, they've got ya until you run out of air reach the end of the road or hit an obstacle that was sacrificed to the relentless pull. Obstacles may be boxes or other characters.
Snapping to grid occurs with the rocket, explode, and laser abilities. The character's X and Y positions change by 0x10 (or by the remaining distance if less than 0x10) until the low byte of each reaches 0x80 in the current tile. Unlike the other abilities, however, the timer for explode only starts counting after Skipp's positions have reached 0x80.
The rocket ability does involve acceleration. Once Skipp starts flying, his speed starts at some value and increases by one each frame. There does not seem to be an upper limit.
Corner boosts are explained under Glitches & Tricks.

Counters

TypeValue
Explode0x3C = 60
Rocket, Laser, Scream0x1E = 30
Push0x0E = 14
Door unlock0x42 = 66
Ability counters start at zero and increase by one each frame until reaching the target value in the table. Then the ability is either done or, for rocket, moves into the next stage (flying). The push counter also increases by one each frame but applies to characters pushing against a box. The box only starts moving when the counter resets to zero. Note that the character doing the pushing has to be in the same row or column as the box in order to push it horizontally or vertically, respectively. This only applies to the final pushing frame, the 0x0E to 0x00 transition. The starting point does not matter. When doors are unlocked with keys, the counter increases by three each frame.

The Run

  • Emulator: BizHawk 2.4.0
  • Core: BSNES
  • ROM: Skipp and Friends - Unexpected Journey V4.01pdrc (PD).smc
  • SHA-1: d1f821df4542bc5a49aefd49e54b4103136afe7e
There are at least two other ROMs available for this game. One of them is listed in GoodSNES 3.27 as an [a1] variant and has SHA-1 2b732b232f56cb34c92178a35005f0da5df69af5. The final one fixes color math problems and allows the game to run on hardware. Its SHA-1 is e7bc816afecc36510f51c65871bd8fec859dc63f. Based on my tests, this run synchs with any of the three ROMs.

Goals & Categories

  • Fastest completion
  • Uses glitches
  • Takes damage to save time
  • Unofficial game/Homebrew
  • Genre: Puzzle

RAM Addresses

I can't seem to add an address list to the wiki currently, but the Lua script that I used for status display has most of the important addresses: Link
The game's timer is at 0x0056 in WRAM. Starting at around 0x0A69 are several arrays that have information about items and enemies. Each one appears to be 0x28 bytes long. For example, door unlock counters are in the 0x0BF9 array and laser status counters in the 0x0C21 array.

Glitches & Tricks

These are listed in alphabetical order based on the name I've given them. Some of them might seem obvious, but I'm documenting them here in order to be thorough.

Barrier decoy

Wedge's barrier protects only himself from damage. Since enemies target the first character to enter their attack range, however, you can activate the barrier and use Wedge as a decoy to draw their attacks while the others pass by unharmed.

Corner boost

When a character is near the corner of a wall and moving into the wall (i.e., the character's movement is perpendicular to the plane of the wall), the character's speed in the direction of the plane of the wall will be 0x20 rather than its usual value. This is technically only a boost for Skipp and Wedge, since Apple's usual movement speed is faster. Near the corner means that the low byte is outside the interval [0x70, 0x9F]. The boosted speed will continue until the low byte falls into that interval. The boost does not work if the character is attempting to move diagonally (e.g., up+left rather than just up or just left); in that case, the character's speed will be its usual value.
Since the characters' usual speeds are not multiples of 0x20, it is possible to finely adjust their low byte coordinates to various degrees by repeatedly doing a corner boost followed by a normal movement back into the direction from which the character just came. In particular, Apple's low byte coordinate can be set to any desired value using this repeat corner boost.

Cutting corners

Rather than moving in one direction and then in a perpendicular direction to get around a corner, sometimes it is possible to move diagonally and save a frame. The criteria appear to be that the end coordinates after the move do not collide with the object. This can be done at any corner of a moving tile. For solid objects, such as walls and boxes, it only works at upper corners when moving up+left or up+right and at lower corners when moving down+left or down+right.

Fast push

When a box starts moving after being pushed, characters cannot enter what you expect to be the empty space that it formerly occupied until it has finished moving. This slows down sequential pushes because the character has to wait for the box to finish moving and then walk back up to it to start the next push. If you move the character around the box and walk alongside it while it is moving, however, you can start the next push earlier than usual. This applies to all characters, but the amount of time saved is different for each one because of their different walking speeds. Note that this trick requires empty space alongside the box.

Laser interference

Wedge's laser can block other lasers and vice versa. I don't actually use this in the run.

Laser skip

This probably saves the most time of any of the tricks, since it significantly shortens routes through several levels. Move the character into the laser when the laser's status counter changes from 0x0A to 0x0B, and the character can pass through without taking damage. Only possible with Skipp and Apple; Wedge moves too slowly. Skipp has to start within a certain distance of the laser, approximately 0x10 units, for this to work.

Push counter storage

Characters need to push against a locked door in order to unlock it with a key; this does not apply to Apple's cardkey ability. The push counter is activated by pushing against the door. If you then trigger one of the abilities listed under Counters above, the push counter value freezes until the ability has completed. Most of the abilities keep the character stationary, but Skipp's rocket is not complete until he has stopped flying by hitting an obstacle.

Simultaneous movement

You only control one character at a time. By using moving tiles and abilities that cause a snap to grid, however, you can have multiple characters moving simultaneously.

Level Commentary

For the sake of comparison for possible improvements, I consider a level started on the frame when each character's position is set to its starting value in the status display script. I consider a level completed when the status display script reports that all characters have exited. The game is very hex edit friendly except for one level. Are you ready to start cooking marshmallows? Then let's go...

Level 1

  • Password: DEAF (not given to you in-game, but that's what I found in the ROM)
  • Start frame: 1053
  • End frame: 1530
An introductory level in which characters have large numbers of their abilities. This allows a lot of simultaneous movement. You can also see examples of corner boosts and cutting corners. For future levels, assume that these three techniques are used whenever possible. If one is not used and I don't explain why, you may have found an improvement.

Level 2

  • Password: LEVL
  • Start frame: 2468
  • End frame: 3486
Wait, did the fuzzballs somehow get captured again after only one level? This is unacceptable. Time to reset the burn indicator: Eat your marshmallow and start cooking another one.
I trigger Skipp's explosion ability as soon as possible. This means that the actual explosion does not occur as quickly as possible, but the frames are better spent moving the other characters. This level also contains the one instance of push counter storage in the run when Skipp unlocks the door, saving one frame of pushing a box later.

Level 3

  • Password: STOP
  • Start frame: 4430
  • End frame: 5846
Interesting password choice for a level that extensively features moving tiles. Skipp is the obvious choice for getting the key due to his explode ability, which is required to break the wall. Since his walking speed is faster than the moving tile speed, getting him onto the tiles as late as possible saves time. However, cutting the corner to get onto the tiles is slower, as measured by the frame on which he reaches the end of the tiles. Unlike the previous level, the explosion is triggered to occur as quickly as possible in order to save time. Breaking that wall is the rate-limiting step for the first part of the level.
Meanwhile, you can see some fast pushes when Apple and Wedge move a box around. Apple functions as an obstacle in order to let Skipp get off the tiles early and save time getting the door unlocked. Any character could be the obstacle, but Apple's speed is best for getting to the exit later. The box also serves as an obstacle for Skipp on another set of moving tiles. You can get the box into position to be the first obstacle, but it turns out to be a slower strategy overall.

Level 4

  • Password: ENEM
  • Start frame: 6790
  • End frame: 8135
We finally meet some enemies, but you only see one of them in the run. It turns out that Skipp's explosion protects him from lasers! How convenient. With proper timing, this allows a major change from the intended route. Rather than getting the key and flying around and pushing a red button, Skipp gets right to work blowing things up. Around frame 7410, you might think that there is a missed opportunity to cut the corner. Actually, it is faster to continue the corner boost in order to get a few more units of vertical movement in preparation for the rocket later. Skipp and Apple can outrun enemies, but the small width of that corridor at the end means that they will take damage. They have no more health to spare, so Wedge does a barrier decoy.

Level 5

  • Password: METE
  • Start frame: 9088
  • End frame: 10622
Ooh, more red buttons. But no, they do not get pressed. Using laser skips, this level is basically just a walk to the exit. Skipp can get through all of the lasers unharmed via proper positioning, but it is faster to take damage.

Level 6

  • Password: DECI
  • Start frame: 11575
  • End frame: 13498
The password is one letter off from being cool. What's also not cool is that the badger and jackal got captured again. I wonder how the bear got away. Regardless, a successful escape attempt must include all three. You remember how to reset the marshmallow burn indicator, right? Do it.
The other two are stuck in their cells until Skipp gets a key, so the explosion is triggered to take out the wall as quickly as possible. Skipp pushes a box out of the way before freeing Apple, which allows Apple to move to the right sooner. Note that it is also possible to push the box to the right. That turns out to be faster in a lot of cases but not for the specific laser configuration in this run. Apple does a repeat corner boost in order to get the X position into a better state for subsequent movements. Though Apple can move to the left sooner after leaving the room with the second key, a delay will be necessary before the lasers, so I just keep moving downward in order to maintain smooth motion. Wedge does a barrier decoy to let Apple get past the enemy. Someone finally pushes a red button!
That all may seem simple enough, but this is the level that breaks when hex editing previous input. The problem arises from the group of four lasers around the center of the level. The status counter addresses in RAM for these are 0x0C2A, 0x0C34, 0x0C2B, and 0x0C35 when going from left to right. Lasers activate based on the value of the game's timer. This is the relevant code from the game's source:
rep  #20h
lda  Timer
lsr
lsr
lsr
sep  #20h
and  TMASK, y
cmp  TOFS, y
beq  @start_beam
The TMASK and TOFS values are in the WRAM arrays starting at 0x0B31 and 0x0B59, respectively. Values for the lasers are as follows, with the timer ranges being derived from the code above:
C2AC34C2BC35
TMASK7777
TOFS3571
Timer (mod 64)24 - 3140 - 4756 - 638 - 15
This means that laser C2A will activate when the game's timer value is in the range 24 - 31 (mod 64), and so on for the others. If you find an error in the ranges, please let me know. There are 64 possible states for the lasers on any given frame, which depend on the game's timer when the level starts. This can lead to delays in several places when characters need to pass through the lasers:
  • Skipp flying to the left after getting the first key.
  • Apple moving to the right before getting the second key, if you want to avoid damage.
  • Skipp flying to the right while Apple is screaming.
  • Apple moving to the left after getting the second key, if already took damage.
You can also add the variations of pushing the box up or right with Skipp. My solution was to bot all of the possibilities. I recorded what I believed to be optimal movies of pushing the box in each direction. Using cheats to prevent the characters from dying, I could ignore damage from the enemies and lasers. Then I wrote a bot to loop through the 64 possible starting values of the game's timer and insert delays or move input around in appropriate places until the level was successfully completed. The results were that pushing the box to the right is never slower than pushing it up, but sometimes the end times were equal. The fastest completion was a difference of 0x777 between the timer start and end values, and the slowest was 0x78F. The initial timer values that allow the fastest completion are 1, 2, 42, 46-49, 57, and 61 (mod 64). You can download my botting files and test results here.

Level 7

  • Password: FRID
  • Start frame: 14456
  • End frame: 15504
An ice level without the changes to movement physics that you often see in games. Laser skips are the key to avoiding backtracking. Wedge does a barrier decoy. A red button gets pressed without anyone touching it.

Level 8

  • Password: ICEE
  • Start frame: 16441
  • End frame: 18009
The wombat has had it with this underground spacecraft and is shooting everything in sight until the bullets laser cartridges(?) run out. Just what is the ammunition for a laser gun, anyway? That one enemy in the middle part of the level keeps walking into a wall trying to reach Apple. Its attack range apparently extends through the wall. This could be an argument that they are robots after all, since I do not believe that the lazy type of union worker would be so persistent. No new tricks here. The double kill with one laser shot is simply a matter of timing and can be done without tool assistance. With regard to moving tiles, Skipp can be an obstacle while snapping to grid prior to flying but not while actually flying. Apple chills out in the corridor near the end. The attack ranges of those two final enemies are weird and only include a few of the tiles that you would expect them to. What does the red button do, you ask? Entice you to go out of the way and waste frames, of course.

Level 9

  • Password: RARE
  • Start frame: 18908 (18961)
  • End frame: 19608 (19402)
Some clarification about the frame numbers: The numbers outside of parentheses are what you get if using the same timing process as on previous levels. However, you cannot actually control the character until the boss spawns in, which is the start value in parentheses. The end value in parentheses is the final input frame.
The status bar suggests that the buffalo and the carpet have exited the level, but I don't see an exit anywhere. If you think that they were captured again, do the marshmallow reset thing. Otherwise, keep cooking the current one.
The final boss is revealed to be... the head of The Governator? This must be Tommy in another disguise (sorry if you haven't completed the Lost Vikings series, but I couldn't find a way to hide spoilers) . He just patrols this route: (0x0400, 0x0200) to (0x0A00, 0x0200) to (0x0700, 0x0680) and back to (0x0400, 0x0200). Sometimes he goes back from the second point to the first point, but it only seems to happen once at the start of the fight. Sometimes he stops and shoots projectiles. When defeated, the exit spawns at the tile corresponding to the boss's X high byte + 2 and Y high byte + 3.
You can read the ending and come up with some questions, but the most important one is: Did any of the marshmallows burn?

Possible improvements

Finding a way to switch the selection to the previous character (moving leftward on the status bar) can save a few frames over the course of the run.
It might be possible to improve Level 1 by changing where Wedge fires the lasers. Because of the snapping to grid behavior, I assume that you just need to test one location in each tile en route to the exit, but I did not test all of the possible combinations.
Level 6 can be improved by as many as 12 frames based on changes to the initial timer value, but it requires improvements in one or more of the preceding levels.

Possible screenshots

These frame suggestions are probably obvious: 1312, 1337, 2700, 2750, 3087, 3381, 4895, 4919, 5412, 5838, 6865, 7119, 7740, 8006, 9267, 9759, 10484, 12012, 12173, 12815, 14499, 15380, 17220, 17582, 19164.

The Contest

I put some messages in the run. Whoever finds them first will win some appetizing, delicious, flavorful, mouthwatering, scrumptious... marshmallow cookies! One cookie is up for grabs per message. Please submit your answers via a post in this run's forum thread. Include the frame number(s) and the contents of the message. The contest runs through the end of April 1, 2022.

Frequently Asked Questions

Why use such an old version of BizHawk?
Newer ones do not work with my OS.
Why are the encodes not on YouTube?
Google, for some reason, wants my telephone number in order to let me access my account. I am not going to provide it.
I've watched the run. What's the joke?
If it's not obvious from watching the run, try reading the submission notes again.
I'm allergic to marshmallows. Can I get another type of cookie?
Maybe. Let me know what you prefer.
My Internet connection cut out just as I was about to post and win the contest. Can I still get a cookie?
Sure, just go to your local cookie store and buy one.

Samsara: don't skipp leg day
Samsara: Alright, it's been close to a month and I still can't figure out the joke. Granted, I've only been thinking about it for the amount of time it's taken me to watch the run and write this judgement message, and by that I mean I'm not thinking about it at all and am instead thinking about whether or not it's socially acceptable for me to talk about how often I think about cute girls. I'm gonna say yes. It's an AFD judgement! I still have dozens more to get to at time of writing! Let the rules be hecked! I have cute girls to think about!
This is a cute little homebrew game and the run looks well done for what it is. Accepting.

despoa: Processing...
Last Edited by despoa on 4/24/2022 10:50 PM
Page History Latest diff List referrers