Sync info

  • OS: Ubuntu 22.04 LTS,Linux Kernel 5.15.0-47-generic
  • Executable Version: PICO-8 0.2.5C
To generate the executable, open a PICO-8 cient, type FOLDER and drop the .p8.png file for the game on this folder. Then use the LOAD anise_wheres_twig-2.p8.png and EXPORT anise.bin commands to generate the standalone executables (launch anise.bin/linux/anise from libTAS). Cartridge can be found on PICO-8 BBS: https://www.lexaloffle.com/bbs/?pid=76397
To make the movie sync, open ~/.lexaloffle/pico-8/config.txt and set foreground_sleep_ms to 5.

  • Genre: Platform
  • Fastest completion
Star Anise Chronicles: OH NO WHERE’S TWIG?? is a non-linear platformer game developed by indie game dev, programmer and furry extraordinaire eevee and released in May 2020. The game is a tribute to the late Twig, one of her cats. It stars Anise, another cat of hers, as she embarks on a little adventure to find her missing Branch Commander.
This movie aims to beat the game as fast as possible, and it has been developed in close collaboration with the RTA WR holder for the game (which is also me). The run is being performed on PICO-8 0.2.5C, using the freely available .p8.png cart to create a Linux executable. It is worth noting that a speedrun edition of this game exists, which removes most of the text and adds RTA-styled splits. However, I deemed it best to use the original release as the text is cute and due to some tricks involving ability activating, a route in the speedrun edition would be substantially different.
Since the game is very straightforward in terms of execution and glitches, I’ll be diving directly into the route and explain relevant tricks as we go along.

Jump

After the intro dialogue, we’re left in control of Anise with no options other than moving left or right. Jumping is a required upgrade and so we head directly towards it. Even here, however, there’s some basic optimization: we slow down before the first fall to avoid falling all the way to the bottom floor. This is done because if we did, we would bonk against the floating platform and lose our precious movement speed for too long. Later, we take an aggressive turn to fall as close to the left as possible. I get Anise at the wall since from that position we can keep the fall all the way to the jump upgrade, requiring to land only as we collect it.

Bag

In order to get to Twig, we must get some blocks out of the way, each controlled by a different Luneko, which will ask help from us obtaining some kind of item. Once we’ve obtained jumping, we head directly to the first of these items, the bag. The maneuvering here is fairly straightforward, and as soon as we collect the bag, we head straight to Cheezball and give him the bag.
Pressing X as we carry an item allows us to use that item. While most items and actions are instant, actions that play sounds (such as the ba) won’t start their action until the sound stops playing. So here, we can use the bag while in the room before Cheezball, and get it active the first frame we're in the room. We activate the item during the room transition this way, as Anise is already in the new room as soon as the transition starts. This technique doesn’t save time by itself, but there is a soft cap on how fast we can activate abilities, and doing so early when possible allows us to make use of more of them. We grab the ability to meow and head out of the room.

Meow

Meowing causes Anise to either interact with other Lunekos, make some flavor comments and such. But most importantly, meowing causes doors in any room to open, opening up new paths. It’s also worth noting that Anise keeps her position relative to the door when moved to the new room via door, so we can use this fact to get some extra optimization out of door transitions.
We climb thru the door rooms, get out and meet Nyapo-ion, who asks for food in exchange for removing his set of blocks. We then embark on another fetch quest, after receiving a useful key.

Key

We resume the climb and make it to a room with two doors. Here is a good showcase of the usefulness of item buffering. By hitting the meow earlier in the room, we have just enough time to switch into the key and use it right as the doors start opening, allowing us to both get the two required item usages done as fast as possible and also keeping our midair movement speed as we make it thru the door.
After navigating the maze of door rooms, we collect a slice of pizza and make it back. We meet again with Nyapo-ion, who delivers on his promise and removes the blocks. We then delve further into the room and obtain the paw.

Paw

With the paw, we can achieve two things: one, knock over little jars all around the world, and two, activate levers located across several rooms. Using these, we can finally reach the top area of the world, but not before accidentally getting ourselves dirty with some volcanic ash. This causes Purrl to not want to hang out with Anise due to the evident grossness, and she ends up creating a new set of blocks! These lead us directly to the final upgrade of the game, the Telepawt.

Telepawt

The telepawt is an interesting twist on blink mechanics. It will teleport Anise to the opposite side of the room relative to the center of the screen (mirroring her position left to right and vice versa), while preserving her vertical position and momentum but flipping her facing direction. This is an instant ability, disabled only if using it would place us inside any kind of collision. As such, this is by far the fastest form of movement for covering horizontal distances unless we need to make it to the middle of a room. We showcase its utility as we move to a nearby waterfall to get ourselves clean. We quicly return to Purrl, having avoided getting dirty again thanks to our newfound ability to teleport. She finally agrees to remove her blocks, and from here, we can quickly move to the final room, reaching Twig and finishing the movie as we close the final text box.

Credits

  • me, for being the only known speedrunner of this game and therefore helping with the route. Altho I opted to not take the door route back at the end because that’s obviously slow IKU WHAT WERE YOU THINKING
  • eevee, for making the game. I like it a lot!
  • Amber, for overseeing the run and bugging me to make a 100% route. Maybe soon?

feos: Claiming for judging.
feos: Removed caps since what looks like an official name (not in-game) doesn't have it.
ikuyo: Cancelling due to desyncs. Will look into it later.
feos: It syncs now!

feos: Claiming for judging.
feos: Looks good, accepting.
fsvgm777: Processing.


TASVideoAgent
They/Them
Moderator
Joined: 8/3/2004
Posts: 15582
Location: 127.0.0.1
Patashu
He/Him
Joined: 10/2/2005
Posts: 4043
Supporting my local indie gamedevs (and the people who TAS their games) with a Yes vote!
My Chiptune music, made in Famitracker: http://soundcloud.com/patashu My twitch. I stream mostly shmups & rhythm games http://twitch.tv/patashu My youtube, again shmups and rhythm games and misc stuff: http://youtube.com/user/patashu
Editor, Player (175)
Joined: 4/7/2015
Posts: 331
Location: Porto Alegre, RS, Brazil
Oh yes! This game is cute, and the telepawt is a very nice feature that was really enjoyable watching it being exploited.
Games are basically math with a visual representation of this math, that's why I make the scripts, to re-see games as math. My things: YouTube, GitHub, Pastebin, Twitter
rythin
She/Her
Skilled player (1142)
Joined: 11/4/2021
Posts: 47
I am an avid enjoyer of anything teleporty in a TAS setting and of course love to see more pico rep. Yes vote!
Personman
Other
Joined: 4/20/2008
Posts: 465
I have been vaguely intending to play this game for Literally Years but for no particular reason have failed to do so until today, when I was inspired to by seeing that this TAS existed. Fun game, great TAS, thanks!
A warb degombs the brangy. Your gitch zanks and leils the warb.
Site Admin, Skilled player (1254)
Joined: 4/17/2010
Posts: 11475
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
ikuyo, please add sync instructions to the submission.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
ikuyo
She/Her
Judge, Experienced player (506)
Joined: 7/8/2021
Posts: 101
feos wrote:
ikuyo, please add sync instructions to the submission.
Oops, my bad! Here's the movie with proper annotations.
Site Admin, Skilled player (1254)
Joined: 4/17/2010
Posts: 11475
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
I can't get this run to sync
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
TASVideosGrue
They/Them
Joined: 10/1/2008
Posts: 2785
Location: The dark corners of the TASVideos server
om, nom, nom... om, nom, nom... nom nom
keylie
He/Him
Editor, Emulator Coder, Expert player (2841)
Joined: 3/17/2013
Posts: 392
It syncs for me. I am getting a lag frame at 672, also in the author movie (libtas movies store lag frames). It is caused by the game calling SDL_Delay(5) seven times, which makes it sleep for 35 ms. This exceeds the frame length (33 ms), so a lag frame is triggered. Could you check if you are getting the lag frame, and also if you are getting the sleeps calls (enable logging for Sleep category)?
Site Admin, Skilled player (1254)
Joined: 4/17/2010
Posts: 11475
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
No lag frame there https://i.imgur.com/iodFRPn.png
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
ikuyo
She/Her
Judge, Experienced player (506)
Joined: 7/8/2021
Posts: 101
feos wrote:
No lag frame there https://i.imgur.com/iodFRPn.png
This screenshot is actually interesting, since for both kileye and myself, the SDL_Delay calls cause the game to sleep for 5ms each, but your print shows the SDL_delay calls on your side only last 2ms. They make the exact same amount of calls per frame it seems, but since they sleep for different amounts of time, they cause different behavior altogether, which is probably where the desync comes from. Here's the information my debugger shows if I ask it to print SDL debug info frame 0.
Attempt 1: Connected.
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_DYNAPI_entry call.
[libTAS f:0] Thread 24295 (main) SDL_Init call.
[libTAS f:0] Thread 24295 (main) Detected SDL 2.0.20
[libTAS f:0] Thread 24295 (main) SDL_InitSubSystem call.
[libTAS f:0] Thread 24295 (main)     SDL_TIMER enabled.
[libTAS f:0] Thread 24295 (main)     SDL_AUDIO fake enabled.
[libTAS f:0] Thread 24295 (main) Init SDL Audio with default driver
[libTAS f:0] Thread 24295 (main)     SDL_VIDEO enabled.
[libTAS f:0] Thread 24295 (main)     SDL_JOYSTICK fake enabled.
[libTAS f:0] Thread 24295 (main)     SDL_HAPTIC fake enabled.
[libTAS f:0] Thread 24295 (main)     SDL_GAMECONTROLLER fake enabled.
[libTAS f:0] Thread 24295 (main)     SDL_EVENTS enabled.
[libTAS f:0] Thread 24295 (main) OpenGL vendor: Mesa/X.org
[libTAS f:0] Thread 24295 (main) OpenGL renderer: llvmpipe (LLVM 13.0.1, 256 bits)
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GL_SetAttribute call with attr 5 and value 1
[libTAS f:0] Thread 24295 (main) SDL_GL_SetAttribute call with attr 15 and value 1
[libTAS f:0] Thread 24295 (main) SDL_GL_SetAttribute call with attr 0 and value 8
[libTAS f:0] Thread 24295 (main) SDL_GL_SetAttribute call with attr 1 and value 8
[libTAS f:0] Thread 24295 (main) SDL_GL_SetAttribute call with attr 2 and value 8
[libTAS f:0] Thread 24295 (main) SDL_GL_SetAttribute call with attr 3 and value 8
[libTAS f:0] Thread 24295 (main) SDL_GL_SetAttribute call with attr 17 and value 3
[libTAS f:0] Thread 24295 (main) SDL_GL_SetAttribute call with attr 18 and value 3
[libTAS f:0] Thread 24295 (main) SDL_GL_SetAttribute call with attr 21 and value 1
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetDesktopDisplayMode call with index 0
[libTAS f:0] Thread 24295 (main)    returns mode format: 370546692, w: 1920, h: 1080, refresh rate: 30, data: 22592992
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_NumJoysticks call.
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_CreateWindow call - title: anise, pos: (536805376,536805376), size: (896,896), flags: 24
[libTAS f:0] Thread 24295 (main) SDL_CreateRenderer call.
[libTAS f:0] Thread 24295 (main)    flag SDL_RENDERER_PRESENTVSYNC
[libTAS f:0] Thread 24295 (main) SDL_GetTicks call - returning 0
[libTAS f:0] Thread 24295 (main) SDL_RenderPresent call.
keylie
He/Him
Editor, Emulator Coder, Expert player (2841)
Joined: 3/17/2013
Posts: 392
Probably found the issue, look at file `~/.lexaloffle/pico-8/config.txt` and look for parameter `foreground_sleep_ms`. Mine is set to 5. Setting this value should make the TAS to sync.
Site Admin, Skilled player (1254)
Joined: 4/17/2010
Posts: 11475
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
It worked!
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
GJTASer2018
He/Him
Joined: 1/24/2018
Posts: 304
Location: Stafford, NY
But why were the delay values different in the first place? Is it something user-configurable?
c-square wrote:
Yes, standard runs are needed and very appreciated here too
Dylon Stejakoski wrote:
Me and the boys starting over our games of choice for the infinityieth time in a row because of just-found optimizations
^ Why I don't have any submissions despite being on the forums for years now...
ikuyo
She/Her
Judge, Experienced player (506)
Joined: 7/8/2021
Posts: 101
GJTASer2018 wrote:
But why were the delay values different in the first place? Is it something user-configurable?
I suspect the default may have changed in a recent PICO-8 update. I've had PICO-8 installed on Linux for a while (as I did RTA speedruns of Celeste Classic and some of its mods) so that may have set it back then.
Post subject: Movie published
TASVideoAgent
They/Them
Moderator
Joined: 8/3/2004
Posts: 15582
Location: 127.0.0.1
This movie has been published. The posts before this message apply to the submission, and posts after this message apply to the published movie. ---- [4907] PICO8 Star Anise Chronicles: Oh No Wheres Twig?? by ikuyo in 03:05.50