The whole thing was done by a single SetText call in dialogue mode. I am not joking, I just needed to use the UnityExplorer's C# console to start a SetText call. Dialogue mode was required since this cutscene has animation changes and actual dialogues. Everything you saw was done by the following line sent to SetText:
|hide||move,-4,-8,0,1||camtarget,null||move,-5,-11,0,-1||move,-6,-13,0,-1||movewait,-6||face,-6,-5||movewait,-4||face,-4,-5||next||wait,1||hide||tail,-4|Watch me do this BLJ!|next||hide||sound,jump||jump,-4||moveahead,-4,1,0,0||wait,0.10||moveahead,-4,-1.5,0,0||wait,0.3||flip,-4,true||wait,0.15||sound,jump||jump,-4||moveahead,-4,1,0,0||wait,0.10||moveahead,-4,-1.5,0,0||wait,0.3||flip,-4,true||wait,0.15||anim,-4,101||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||wait,0.05||sound,jump||move,-4,-1000,0,2,25.0||wait,0.1||move,-4,-8,0,1,1000.0||anim,-5,PickAction||anim,-6,PickAction||wait,0.5||flip,-5||flip,-6||wait,0.5||flip,-5||flip,-6||wait,0.5||flip,-5||flip,-6||wait,0.5||flip,-5||flip,-6||movewait,-4||wait,0.05||anim,-4,111||sound,ItemHold||anim,-5,Surprized||face,-5,-4||anim,-6,Hurt||hide||tail,-6||size,1.5||shaky|THAT'S NOT HOW PHYSICS WORK!
I really can't emphasise enough how nothing else was done besides calling SetText, it really is just this powerful. The only video editing I had to do was trim the beginning and end of the video so the frame counts fit in 10 seconds.
Let's break this down since you're probably wondering how I even got there.
|hide||move,-4,-8,0,1||camtarget,null||move,-5,-11,0,-1||move,-6,-13,0,-1||movewait,-6||face,-6,-5||movewait,-4||face,-4,-5||next||wait,1|
This section isn't actually shown in the meme, it's purely setting up the scene and for me to setup the recording. It simply tells to lock the camera (since it removes its targetting) and have vi, kabbu and leif to move to their positions. I also made kabbu and leif face each other (though I could have used one face command since this is supported via an optional parameter, but forgot, lol) and have vi face kabbu. Once everything is setup, the next command tells SetText to end the textbox and to prompt for player input. In this case, this has just been commands so there's no text and I didn't even show the textbox thanks to the hide command. This allows me to start the recording and having to alt tab to the game to start the cutscene manually by passing the invisible textbox. For ease during video trimming later, I added a wait command which stalls the game for 1 second. It also allows to have some padding before the actual first textbox is popped.
Originally, I had kabbu and leif have the elipsis emote and then kabbu speaking as a nice intro, but this added too much runtime so I had to cut it. It was just emoticon commands.
|hide||tail,-4|Watch me do this BLJ!|next||hide|
Anything not a command in SetText is actually rendered and because we are in dialogue mode, the rendering is done by the dialogue system. Here, I have to toggle back the textbox's vidibility, set its tail to vi and I don't need to do anything else: the game will handle all the animations and the bleeps and stuff automatically. I just need to put the line and the game does the rest. The next is to prompt for input (which I waited a decent amount of time to make sure you could read) then hid the textbox as the next section has no text rendering.
|sound,jump||jump,-4||moveahead,-4,1,0,0||wait,0.10||moveahead,-4,-1.5,0,0||wait,0.3||flip,-4,true||wait,0.15||sound,jump||jump,-4||moveahead,-4,1,0,0||wait,0.10||moveahead,-4,-1.5,0,0||wait,0.3||flip,-4,true||wait,0.15|
This is where things starts to get interesting. Moveahead is a command that allows you to move an entity, but relative to its current position. I can also combine this with a jump command to make it seem like vi is jumping to the right, but goes back to the left. This is sort of jank: if I don't put the wait times correctly, the game might not have vi reach her destination on the second move, but with a bit of finessing, I found a combination that was reliable. Originally, I made her jump 3 times, but one was cut due to the 10 seconds rule. The sound command does exactly like you'd expect so you can really fake an entity jumping with strategically designed commands like these. It's kind of mind blowing. Even better: you could have done some stuff to not have her change facing direction, but you'd have to do it outside of SetText so I opted here to just have her face back to the right. You really can do a whole lot here in an actual mod, but I wanted to limit myself to just SetText and it didn't disappoint.
|anim,-4,101|
This sets vi's animation to a sprite she has when throwing her beemerang. The reason I did this is because in the original BLJ, mario is shown in a sitting position due to the long jump movement. There wasn't really a good candidate that was closer and It was important for me to take vi as the one doing it because...I just thought it was the most fitting. So I ended up with that.
Next comes a bunch of |sound,jump||wait,0.05|
in a row.
This requires some explanation because it's the main portion of the effect. SetText allows you to play a sound to one of the game's available AudioSource which are pooled meaning you have 15 available and only those 15. If you want to play a sound and spam it, the best thing you can do with one command is tell the sound command to loop it, but the problem is that it won't sound like spam because the way looped play works is it plays the clip, then and ONLY THEN will it play it again once it's done. This wasn't frequent enough and it also wasn't used in game which explains why you can't really...make it stop if you do this lol. The easy workaround however is do what I did: play the sound on any AudioSource, wait a very short amount of time and then play another one on another AudioSource. This allows you to spam the sound A LOT because it will play as long as you don't have 15 of them playing at the same time, but the clip is so short, you wouldn't run out of AudioSource because the oldest one has time to finish playing which frees it for next time. So really, all I had to do was spam a bunch of these sound + short wait in a row and it allows to fake the effect of vi spamming jump when it's obviously just for show.
|move,-4,-1000,0,2,25.0||wait,0.1||move,-4,-8,0,1,1000.0|
This is a funny part: the move command allows you to give a multiplier on how fast you want the entity to move to its destination. To make her go oob, I just needed to put a crazy value (here 25x) so that she would go so fast, she would zoom past the wall, but it's still slow enough that you can see it in the video. The wait is just to give you time to see it before I tell her to go back with a crazy 1000x multiplier. The problem is this move will not work: she is so out of bounds by the time the second move gets issued that she can't get back. This is intentional: I exploit the fact that the game has a failsafe on forcemove where if you have a move like this that doesn't end after a bit, it times out and teleports the entity to the destination. This not only is convenient, but it also adds more to the effect thanks to the smoke particles giving the impression she did actually performed a glitch in game. This failsafe taking some time is the main reason staying within 10 seconds was complicated, but there really was no other way to make it work.
|anim,-5,PickAction||anim,-6,PickAction||wait,0.5||flip,-5||flip,-6||wait,0.5||flip,-5||flip,-6||wait,0.5||flip,-5||flip,-6||wait,0.5||flip,-5||flip,-6||movewait,-4||wait,0.05|
Because vi wasn't going to be visible for a few seconds, it gave me the opportunity to make kabbu and leif do some stuff. Here, I just told them to have their battle animation when choosing an action and flip twice with some carefuly placed wait. It just gave the illusion of them wondering where vi went. I could have put text there, but it was much more brief and interesting to just have them animated. This ends by waiting vi gets back, but I was still getting some issues where her animation wouldn't change so I fixed it by adding a very short wait after on top.
|anim,-4,111||sound,ItemHold|
This is self explanatory, but if you wonder why I didn't used the animation she actually does when she gets her Beemerang back in game, it's because the way they do it is specific to that event: they animate both the beemerang out of the chest and her separately. I had to get creative and use her rank up animation which happened to fit nicely here.
|anim,-5,Surprized||face,-5,-4||anim,-6,Hurt||hide||tail,-6||size,1.5||shaky|THAT'S NOT HOW PHYSICS WORK!
This is just extra for funsies. I made leif and kabbu into the best shock animations the game could give me making sure kabbu faces vi before having leif say his line with larger font and shaky effect in all caps. It's just a fun thing I wanted leif to react too since he seemed overly concerned about it in game too :)
That's everything. I really can't stress this enough: SetText is INSANE. The fact I was able to do this effect with just one line like this in about 8 hours with little experience is crazy. It got to the point where I actually could type these commands naturally and I have no doubt mar/genow reached this point in development, but this is even crazier when you consider all this is a fraction of what you can do with it and way more if you introduce more code other than SetText.
It was a fun project to demonstrate its power and I can't wait to actually leverage it in mods :)