Citadel of Celestial Cascades is a Touhou themed puzzle platformer where the player takes control of Youmu and utilises her varied moveset to kill every ghost enemy on each level, thus unlocking the exit. Each level features a collectible which while initially seeming like a bonus challenge for completionists, is actually required to reach the credits.
Pretty much every one of Youmu's abilities has some interesting quirks to it, all of which are used to complete the game as fast as possible.

Game objectives

  • Aims for fastest completion

Sync instructions

  • OS: Ubuntu 20.04.2 LTS
  • Game must be ran in a desktop environment, as outlined in the discussion thread
  • Unsure about this given the discussion thread but, the command-line option --audio-driver ALSA may be necessary for the encode to have audio
  • Virtual screen resolution may be altered freely

Mechanics & Exploits Used

Jump: The game features fairly standard jumping mechanics - the longer you hold the key, the higher Youmu will go. The interesting thing is buffering a jump with horizontal speed will maintain that speed. This will be referred to as bunnyhopping from now on.
Walljump: Youmu can jump off walls! Doing so will give her the highest horizontal speed possible in the game, so it will be done as much as possible, and then that speed will be preserved with bunnyhops.
Sword slash: Youmu can swing her sword! This basic attack has 4 active frames where it can hit enemies or boxes, killing the former and pushing the latter. As all attacks, it can be aimed in one of 8 directions. Normally there is a bit of a cooldown between swings, but successfully killing an enemy allows Youmu to skip said cooldown and swing again right away.
Dash: After killing an enemy, as long as Youmu remains midair or on a wall, I can press jump again to dash in one of eight directions. The direction of the dash can be changed mid-dash, making it quite versatile for all kinds of platforming. Dashing horizontally is faster than walking, but slower than walljumping, so it is rarely used for purely horizontal traversal. Dashing down is also slower than simply falling any time Youmu has enough room to accelerate downwards. The dash does however interrupt the freeze from clearing all enemies on the screen and opening the exit, so it will often be used to save a couple frames by continuing to move. Dashes can be refreshed by killing another enemy after dashing, until there are no more enemies left, however the dash must be used between kills as only one can be held at a time.
Bullet: After killing two consecutive enemies without touching the floor Youmu will gain a bullet which she can fire at any time in one of the eight directions. This bullet deals the same amount of damage as a sword swing, but has the advantage of being a ranged attack. Firing a bullet will freeze the game for a couple frames, after which the projectile is fired. Killing a third enemy will refresh the bullet as well as the dash, and any further kills will do the same. Same as the dash, only one bullet can be held at a time. By using the bullet it is possible to kill two enemies on the same frame, stacking the freeze from killing them and saving a handful of frames. Doing this on the last two enemies of the level will softlock the level, but as long as the last remaining enemy is a solo kill, kills can be doubled up for timesave.
Pause: While it might seem counter intuitive, pausing the game can in fact help with going fast. The usual cooldown from slashing the sword without killing an enemy runs during the pause menu, meaning I can wait out the cooldown without having Youmu move an inch, and slash again right away in the same spot. This comes in especially handy in encounters with shielded enemies. Additionally, 1-frame pauses are utilised to release jump without letting Youmu move, allowing for some otherwise impossible walljumps and wallslides.
Wallslide: This is a glitch resulting from buffering a walljump input on the first possible frame. I'm not sure the exact conditions under which the glitch occurs, however I believe it to have something to do with Youmu's horizontal position aligning just right with the wall that's being slid on. This means sometimes touching another wall to set up the correct align for a slide is required. Wallslides are useful for gaining height in places where it wasn't intended, or just doing so quicker than one would by simply jumping between two walls.
Box Redirect: Slashing a box normally sends it in the direction where the attack was aimed. Hitting the box on any frame of the attack that is not the first one allows me to change the direction Youmu is aiming and with it also the direction the box will fly.
Time Control: Pausing the game has the effect of stopping everything but Youmu for the first frame of the pause screen. Pressing pause and confirm on the same frame performs a 0-frame pause, effectively letting the game continue at seemingly full speed, while all objects other than Youmu get stopped for 1 frame. This is used in a couple levels to slow down falling boxes to perform otherwise impossible jumps off them midair.

Stage by stage comments

Start

There is no menu delay so the intro cutscene can be skipped and the first level chosen in just a couple frames.

1

Fairly basic level. Use horizontal dashes and don't bonk into walls.

2

Downwards dash to cancel all upwards momentum from the jump. Dashing into the exit trigger is still faster than just standing on top of it due to the dash cancelling the 'level clear' freeze.

3

As is the case with a lot of the early levels, not much to comment on here. Simply optimised gameplay.

4

First time using walljumps as a way to gain horizontal speed, though due to the level geometry it's not possible to use bunnyhopping to my advantage.

5

First instance of wallslides being used to speed up upwards movement.

6

Wallslide into walljump into bunnyhop all on 1x1 tiles to get directly to the collectible and be able to kill the enemy on the way.

7

More wallslides to grab the collectible in an unintended way, then a pause-assisted walljump to continue with the level.

8-11

Not much to say here.

12

The ability to redirect the dash at any point allows me to manipulate Youmu's h position in such a way that allows a slide on the upcoming wall. After which comes a long chain of bunnyhops in the low ceiling corridor to preserve walljump speed.

13-16

Nothing new here.

17

First level to introduce eye blocks, which just kill Youmu when touched. The hitboxes are fairly forgiving and that fact is abused to its maximum potential.

18-20

Nothing new here.

21

First and only instance of killing two enemies on the same frame by using a bullet and a sword slash.

22-26

Nothing new.

27

First instance of a moving enemy. These will move towards Youmu when they have line of sight. This generally does not impact much of the routing for the levels though, as any puzzles that would require manipulating them can be skipped.

28-29

Nothing new.

30

Another walljump into low ceiling bunnyhops.

31

First occurrence of a box. This one is easily skipped with a wallslide.

32

Second instance of a pause-assisted walljump, used to skip moving the box again and doing some slower platforming.

33

Just optimised platforming.

34

Attaching to the side of a box kills its vertical speed, allowing me to put the box on Youmu's head and be able to push it into a good position right away. This level also features the first instance of Time Control, allowing me to slow the box as it's flying towards the exit. This lets Youmu catch up to the box midair and jump off to grab the collectible a bit earlier than normal.

35

Wallslides allow me to skip the entire box puzzle in this level.

36

Tough level to optimise! I tried different combinations of up and diagonal slashes, as well as Time Control but couldn't figure out a more optimal chain.

37

The entire puzzle aspect of this level is skipped thanks to one conveniently exposed corner.

38

Couldn't figure out a way to get down to the goal without jumping all the way to the left, since all dashes need to be used to get to the collectible.

39

Walljump speed is fast so bnuuyhopping is preferred to keeping dashes.

40

Mild flashing lights warning. First instance of pausing the game to wait out sword swing cooldown. Simplified a lot of the routing for these levels and made them a lot faster.

41

Another puzzle easily skipped, this one didn't even require any glitches!

42

Doubling up on sword slash and bullet to instantly kill a 1 shield enemy, allowing me to forego the pause abuse.

43-44

Nothing new.

45

Another usage of Time Control to slow down the box after pushing it up-right. This allows me to walljump off it midair and jump over the eye blocks. Normally this section requires baiting the eye enemy over to use it for a dash, which takes approximately 5 seconds longer than using this exploit.

46

First usage of a box redirect, to pull a box along with Youmu as she falls.

47

Bonking the box from below allows me to slow down its fall and walljump off it.

48

Second use of Time Control, this time to slow down the falling box, allowing me to jump off it and not die to the eye blocks. It's also the only way I found to quickly collect the item.

49

Nothing new.

50

Going into this level from the level select seems to get the collectible countdown to start quicker. I didn't do extensive testing as pausing during a level transition doesn't lose time, so it might be unnecessary, just didn't feel like testing it. Killing the two overlapping enemies with one slash crashed the game, so I'm forced to kill them separately instead. As with any normal level, every enemy must be killed for the level to end, so killing the extra ad is required after slashing the boss enemy. As such last meaningful input happens when the slash comes out.

Special thanks

  • -7 for encouraging me to optimise this TAS and submit it here

feos: Claiming for judging.
feos: libTAS 1.4.3 has just been released and this movie works great on it. The movie itself is great too, so accepting. I fixed the movie to point to that version of libTAS too.
The ending music is the main tune of the game just slowed down to about 23%, and it's not played from the start, and it's barely possible to recognize what it's playing without resampling it back to normal speed, and hard to spot loop end, so I'm not sure it really matters where the encode should end.
fsvgm777: Processing (got an AVI dump from feos).


TASVideoAgent
They/Them
Moderator
Joined: 8/3/2004
Posts: 15535
Location: 127.0.0.1
This topic is for the purpose of discussing #7315: rythin's Linux Citadel of Celestial Cascades in 04:01.58
Judge, Moderator, Player (200)
Joined: 7/15/2021
Posts: 112
Location: United States
Looks cool! Gets my "yes" vote. The movie has no annotations (and thus no sync info), and the submission doesn't contain sync info either, and furthermore it specifies an interim commit of libTAS, so I set about to try and sync this movie myself. Unfortunately, it segfaults in OS_X11::get_real_window_size, which is a Godot function (this crash also happens outside libTAS). That function doesn't seem to be present in the latest version of Godot, but unfortunately, the game is monolithically statically-linked for some reason, so I can't just replace its Godot with the latest Godot. Poking around for a bit in Ghidra didn't help me that much, but I figured it might have something to do with my window manager, i3. So I switched over to GNOME, and there the game runs fine outside of libTAS, but when run inside libTAS itself, it segfaults, this time in the X11 function XCreateIC (inside Godot's OS_X11::initialize).
rythin
She/Her
Skilled player (1141)
Joined: 11/4/2021
Posts: 47
Sorry! First time submitting on here and I wasn't sure how much info was necessary, and poking around a couple other PC submissions I didn't see any syncing info. I'm not sure about native Linux installs as I personally use WSL to run libTAS, but this game was a bit difficult to get running for me aswell, as it needed a full desktop environment rather than the usual method of having separate windows running Linux apps. Quoting instructions from R30hedron from the libTAS discord, who originally figured out how to get the game running:
If you are running libTAS within WSL and you have a game that is being stubborn about not having access to window sizes or the like, here's a potential set of steps to get that game running. 1) Setup a new XLaunch config that matches the WSL2 guide, but instead of "Multiple Windows", use "One large window". 2) Within a wsl bash terminal, run sudo apt-get install xfce4 or a different desktop environment of choice. (the install process will ask for what "flavor" of xfce4 you want. gdm3 is the one I picked.) 3) Run both the XLaunch config and run startxfce4 within a wsl bash terminal window. The game now will have a desktop environment from which to pull info about position and avoid the segfault.
I believe the command line option '--audio-driver ALSA' might be necessary for it to run aswell? Sorry, it's been a while since I set it up and am a bit fuzzy on the details. The libTAS interim build is used because encoding on the last stable build produces a video with no sound, but the game itself *should* run. Please let me know if I should edit the submission in any way to include this information or if this post is enough ^^;
Judge, Moderator, Player (200)
Joined: 7/15/2021
Posts: 112
Location: United States
Alright, so, I can confirm that the game runs fine under libTAS if I'm using the XFCE desktop environment. I can also thus confirm that this movie syncs on libTAS v1.4.2 stable. I didn't need to specify the ALSA audio driver, but I did notice that the sound wasn't muted properly and played directly through my speakers (headphones). Most likely it's needed if you're using savestates, but as I'm only playing back the movie, I haven't needed to use them. I'm not exactly sure if they still apply as I know the movie rules were rewritten and vastly simplified a while ago (judges feel free to correct me), but the libTAS section in the legacy movie rules goes into detail about sync instructions.
MESHUGGAH
Other
Skilled player (1916)
Joined: 11/14/2009
Posts: 1353
Location: 𝔐𝔞𝔤𝑦𝔞𝔯
First of all good job on submitting your first TAS! While I don't know this game, the TAS seems highly optimized. I can't count how many different tricks I saw while watching the encode. All while listening to the crazy scale runs, you solve some levels without using the box, and the time control / pause tricks... very nice! The only place I saw an improvement is "Stage" 2:20. After throwing the box to the final platform, you seem to push it a bit too much to the end. The gameplay and your strategy is way too fast to give any more detailed ideas :) Obvious yes vote!
PhD in TASing 🎓 speedrun enthusiast ❤🚷🔥 white hat hacker ▓ black box tester ░ censorships and rules...
Site Admin, Skilled player (1250)
Joined: 4/17/2010
Posts: 11469
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
Info Teddy wrote:
Alright, so, I can confirm that the game runs fine under libTAS if I'm using the XFCE desktop environment. I can also thus confirm that this movie syncs on libTAS v1.4.2 stable.
Thanks!
Info Teddy wrote:
I'm not exactly sure if they still apply as I know the movie rules were rewritten and vastly simplified a while ago (judges feel free to correct me), but the libTAS section in the legacy movie rules goes into detail about sync instructions.
It's here now https://tasvideos.org/EmulatorResources/LibTAS#MovieSubmissions
rythin wrote:
Sorry! First time submitting on here and I wasn't sure how much info was necessary, and poking around a couple other PC submissions I didn't see any syncing info.
It used to be visible but then https://github.com/TASVideos/tasvideos/issues/755
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.
Editor, Skilled player (1438)
Joined: 3/31/2010
Posts: 2106
This looked pretty nifty. All stages seemed to be dispatched swiftly, and the tool-assistance was apparent. Yes vote.
fsvgm777
She/Her
Senior Publisher, Player (225)
Joined: 5/28/2009
Posts: 1213
Location: Luxembourg
It consistently desyncs for me on the 12th screen (around the 52 second mark). Youmu doesn't quite reach the portal. I tried various settings, but without success. I'm using a Kubuntu 20.04 VM with the latest updates, and as such, I'm using the KDE desktop environment.
Steam Community page - Bluesky profile Oh, I'm just a concerned observer.
Judge, Moderator, Player (200)
Joined: 7/15/2021
Posts: 112
Location: United States
If it helps, I'm running Fedora 35.
rythin
She/Her
Skilled player (1141)
Joined: 11/4/2021
Posts: 47
First of all good job on submitting your first TAS! While I don't know this game, the TAS seems highly optimized.
Thank you!
The only place I saw an improvement is "Stage" 2:20. After throwing the box to the final platform, you seem to push it a bit too much to the end.
There isn't really a way to make it land closer without pushing it to the left on the previous platform, which would be much slower.
It consistently desyncs for me on the 12th screen (around the 52 second mark). Youmu doesn't quite reach the portal. I tried various settings, but without success. I'm using a Kubuntu 20.04 VM with the latest updates, and as such, I'm using the KDE desktop environment.
Not really sure what could be causing that, I'm no Linux expert unfortunately :/ I'm personally running Ubuntu 20.04 through WSL, if that's any help.
fsvgm777
She/Her
Senior Publisher, Player (225)
Joined: 5/28/2009
Posts: 1213
Location: Luxembourg
Okay, I just got the chance of setting up WSL2 and everything (used XFCE4 desktop environment), and it still desyncs for me at the same spot. I'm officially at a loss here. If it helps, my CPU is an AMD Ryzen 7 4800H.
Steam Community page - Bluesky profile Oh, I'm just a concerned observer.
rythin
She/Her
Skilled player (1141)
Joined: 11/4/2021
Posts: 47
Would it be possible to just add a couple of frames of left arrow inputs there? Not an ideal solution but since the game has no RNG the rest of the movie should sync up anyway. Really strange, not sure why it'd desync there.
Site Admin, Skilled player (1250)
Joined: 4/17/2010
Posts: 11469
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
I got the movie to sync without doing anything specific. rythin, please put sync info in the submission description: https://tasvideos.org/EmulatorResources/LibTAS#DocumentSyncRequirements It used to be required to be right inside .ltm, but after some reevaluation we decided it should not be required to be in the annotations at all times. EDIT: I still get no audio in the encode even though I dumped on latest interim... --audio-driver ALSA is indeed required for proper audio dumping (makes it properly mute in libtas too).
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.
Post subject: Movie published
TASVideoAgent
They/Them
Moderator
Joined: 8/3/2004
Posts: 15535
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. ---- [4614] Linux Citadel of Celestial Cascades by rythin in 04:01.58