Submission #4830: dwangoAC's Arcade Super Puzzle Fighter II Turbo in 07:08.15

Arcade
baseline
(Submitted: spf2t.zip unknown)
FBA-rr 0.0.7
25689
60
1619
Unknown
Submitted by dwangoAC on 9/9/2015 3:12 AM
Submission Comments
Super Puzzle Fighter II Turbo is a game originally released in arcades in 1996 that was ported to several consoles over the years. The game works on a mechanic of normal blocks (which can group together into power gems), crash gems (which destroy gems of the same color), and counter gems sent over from opponents that count down until they turn into normal blocks. Blocks fall in pairs and after the 25th pair a diamond gem appears which destroys all gems of the same color on the playfield.

Game objectives

  • Emulator used: fba-rr-007
  • Defeats the 8 normal characters and the final character as quickly as possible
  • Plays as the "weakest" character (Ryu) and plays on the hardest difficulty
  • Abuses enemy attack RNG
  • Gets abused by gem drop order

Comments

I've recently been going through games that were significant to me in days gone by which do not yet have a tool assisted speedrun. I primarily played the PSX version of this game but the arcade version has better resolution so I opted to start with that. I later regretted my decision due to some emulator issues I'll describe in a section below and I'll move back to describing the game's significance to me before I start ranting mid-paragraph. I played the PSX version extensively in the past and greatly enjoyed it.
There's a very full guide of the game on StrategyWiki that was quite useful for showing the enemy drop orders and other useful details specific to the arcade version.

RNG Mechanics

The RNG in this game is evil - input prior to starting the round dictates all gems that will be dropped for the entire round. You can spend hours trying different input at the end of the previous round to manipulate the drop order in the next round, and endlessly try for better times. Sometimes a drop order that seems good is really bad, because your opponent will get the same gems in the same order as you and it's not always possible to get the upper hand quickly. As a result this is the kind of game that could be infinitely optimized - I put many, many hours into optimization with at best mixed results to my sanity in the process on some levels (Sakura, I'm looking at you!) but overall I'm content with how this turned out.

Round by round comments

Each gem color (yellow, red, green, and blue) is listed below, with crash gems in upper case and D as the diamond if it is used.

Round 1 (Ken) drop order

rr ry gY bg gB Yg rY gr bb gg rr yR bb yB ry br gY bb yR Yb gB By Gy
7y + 5Y = 12
9r + 2R = 11
9g + 1G = 10
9b + 4B = 13
}}
For the first fight I intentionally picked Ken as the enemy, as Ken has one of the best attack patterns. I put more effort changing the drop order at the end of this level than any other. The way you rotate pieces and where you place them will affect the next level's predefined drop sequence, and I did most of the initial experimentation in the first level while experimenting with what might make for a better drop order for Donovan. What I didn't quite factor in early in the run is that the enemy gets the exact same drop order - it's something I knew from playing the game for years, but it somehow didn't occur to me that the enemy would have the opportunity to attack me the same way I was attacking, so what seems like "ideal" drop sequences are often disastrous if your goal is to finish quickly. This was primarily because the first person to attack puts their opponent on defense, at which point every gem they destroy counts to remove half of the blocks being sent (destroying two of the same color removes 1 counter gem headed toward them, etc.). The problem I kept encountering was I would be faster than the opponent to attack, but because they have the same blocks they would immediately soak up most of the damage. It's far better to attack when they have no opportunity for defense, which is harder than it sounds in the early game.

Round 2 (Donovan) drop order

gg rb bg yG rB yb yb rY yb bG yr rg bg gB rb bg by Yb bY Rg ry Yr gb Gb
7y   + 4Y = 11
8r   + 1R = 9
9g   + 3G = 12
14b  + 2B = 16
}}
By changing input at the end of the first fight I was able to create a drop order that was biased toward blue gems, so I went to great lengths to try to make the largest blue power gem I could. In retrospect this was perhaps not the best strategy as I ended up leaving a very large number of blocks behind at the end of the level. Donovan is considered one of the hardest opponents because of his mustard stand attack pattern but he gets very few opportunities to attack. The crash gem at the end isn't needed to defeat him but changes to its position and rotation can be used to manipulate the drop order for the next fight.

Round 3 (Chun-Li) drop order

yg rg bb rB gB ry bY gr rr yb bY bg rg bb yy br rY rY ry gg Rb YB yy gr GD
8y  + 5Y = 12
12r + 1R = 13
9g  + 1G = 10
10b + 3B = 13
}}
Chun-Li is famous for making power gems when she attacks an opponent with a level playfield but she doesn't get much of an opportunity to do more than chip damage that sends a scant few lazy counter gems over so I opted to make a couple of 4x4 power gems in her honor on my own. This is the first level to employ the diamond; I place it on the red gems which act like a fuse, dropping out of the way and allowing other crash gems to touch their respective colors. The diamond usually does half damage and sends counter gems over that start counting down from 3 instead of the normal 5, but chain reactions caused after the diamond is used do normal damage. This round ends with an all clear stage which I'm happy about.

Round 4 (Morrigan) drop order

gr rG bG bg gr gb gr bb bb gR gB gr rG yB yb Rg gB gg gy by YB gY yG Bg
5y  + 2Y =  7
6r  + 2R =  8
15g + 4G = 19
9b  + 5B = 14
}}
Morrigan has a somewhat annoying alternating attack pattern but by limiting her to only sending me a small amount of counter gems at a time early in the round I can place gems in anticipation. This is the first level where I manipulate the drop location to my advantage, forcing the first set of gems to drop on the left side. I send over a fair bit of small damage to star causing Morrigan problems before doing a decent sized attack that does her in.

Round 5 (Ryu) drop order

br bg gr yy bG bR gr yy gg ry yb bg by yr bb gb rG YR gr yR GB Rg Rb
9y  + 1Y = 10
7r  + 5R = 12
9g  + 3G = 12
11b + 1B = 12
}}
After skipping past an intermission I fight... myself. Ryu's weakness, and the reason he is considered the weakest character, is that big attacks turn into vertical columns that can be easily exploited - simply place a crash gem of the correct color in the column you know Ryu will be dropping gems into and let the fun begin. The AI seems to know how to do this well, and I suspect the arcade game designers intentionally placed Ryu in the upper left / player 1 default character selection spot for this reason, but I digress. As you can see from the drop order I intentionally set up a sequence with a fairly even distribution of gems of all colors, and I place them in columns to match where Ryu will drop counter gems. I set off a time bomb / mine next to the green column that helps take out my doppelganger handily.

Round 6 (Hsien-Ko) drop order

yb gb gg gR bb yy rr br gg gr rb Gr rg yR ry yy gY br yB Rg gB gg gG
8y  + 1Y =  9
9r  + 3R = 12 
14g + 2G = 16
7b  + 2B =  9
}}
It seemed like I had to work on this particular stage for a very long time before I was able to quickly defeat Hsien-Ko (Seriously, I have no idea how a native English speaker is supposed to know how to pronounce that name). I let Hsien-Ko (Hiss'in'n Ko?) send over a fairly large attack to give me more gems to work with - more gems means I can make a bigger attack faster, which is a good thing. I'm able to make a massive power gem (but not too massive, as I want to avoid fighting Devilot to save time and avoiding making a power gem of size 20 or larger is the easiest way to do that). In the end, Hsien-Ko (Sign-Co?) gets obliterated by the destruction of a rather large power gem followed by a chain reaction - say good-bye to Hsien-Ko (Cinco? I'm clearly bad at this).

Round 7 (Sakura) drop order

bY yG gy gg gb bY rg yy rr rr rB bg gg gB gB bb gy rr Rr ry GR bR gr YB yD
7y  + 3Y = 10
11r + 3R = 14 
12g + 2G = 14
7b  + 4B = 11
}}
Ah, Sakura - this fight turned out to be one of my favorites, but I had to re-do this fight a dozen times to get something I was happy with. All of the drop orders were especially bad and I just couldn't find one I was happy with. I probably put 12 hours of testing different drop orders and different techniques into this round alone. This fight starts out looking like a bit of a mess, but by using yellow gems to separate crash gems from power gems of the same color I'm able to set up a sizable attack. Of course, by the time I get everything lined up where I need it I've literally filled the center all the way to the top, which ends with an impressive finish. The "DANGER" warning gets as high as 92 blocks sent, although I think it's actually a larger attack than that. Needless to say, the bratty schoolgirl is done in with one of the largest finishes in the run.

Round 8 (Felicia) drop order

gB yg gy gr ry yy ry rr rY gr rY gy rY Gy rG Yr gy bG rg rY Gy Br yb rB yD
12y + 5Y = 17 
15r + 0R = 15
8g  + 4G = 12
2b  + 3B =  5
}}
Felicia is just plain weird, but setting up a decent chain reaction initially fueled by a rather large diamond burst finishes her off in a quite ordinary looking way, as far as a typical fight in this game is concerned. I say all this, but the honest truth is I spent over 6 hours working on a fight that at the end I still wasn't completely satisfied with, only to have FBA corrupt my movie file yet again which wiped out the entire fight, permanently. I struggled through another round that had even worse results, only to finish it and accidentally load an earlier state in read+write mode, then fatfinger loading a different state in read-only mode that was beyond the then-current movie, at which point it truncated everything to the beginning of the Felicia round again and I nearly quit in frustration. Imagine my surprise when my third attempt was faster than either of the first two attempts through sheer dumb luck of getting a better drop order. Do take note of the odd positioning of the last pair that appears, however, it'll come in important very soon.

Round 9 (Da.. I mean, Akuma) drop order

gg gb rY rr yb rr rr bb bb bb gg bG gg rr Yb rG ry RB
2y  + 2Y =  4
11r + 1R = 12
7g  + 2G =  9
10b + 1B = 11
}}
After a quite amusing entrance Akuma appears, and Akuma is less than pleasant. Not only does Akuma have the most evil counter gem attack pattern in the game, we're facing him on Hard mode. He literally drops blocks at "perfect" speeds, although he occasionally rotates them as they come down which does slow things down just enough for me to get the upper hand. I tried any number of attempts at the end of Felicia's stage to generate this quite amazing drop sequence, and by "any number of attempts" I mean 1 attempt (that is to say, I finished the level then went back and rotated the yellow crash block once). That's right, this incredibly crazy drop pattern was the first manipulation attempt, and couldn't have been more perfect. It still took quite a bit of testing to figure out how to end the input as early as I do, however. The primary tactic is sending over just enough damage to counteract gems that would mess up exploding both red and blue power gems at the same time. When he does send a few counter gems over I manipulate them into falling in harmless areas, and near the end I taunt Akuma (in a replacement file I created after submission) and drop a bomb on him. The game is nice enough to auto-advance past the summary and even the name entry so after setting up a big enough attack I simply rotate the pair of crash gems at the end into the right location and end input.

Emulator notes

I could write an entire diatribe on everything that fba-rr-007 did against me but I'll spare you the gritty details. Needless to say, FBA (or at least the rerecording version) is *very* unstable and loves to pass on guru meditation messages (memory search, I'm looking at you!). There are funky quirks, such as disabling the current savestate load and save functions when working with a movie (I bound them to a set slot and worked around it). Lua scripting is effectively broken if you want to do anything other than displaying stuff on the screen, although I was able to create an input-modules.lua file specific to spf2t. My very first run through the game was destroyed by an issue where I created and later loaded a savestate at the first frame and unless I loaded that savestate the movie wouldn't sync. One of the bugs I discovered turned out to be very handy, however - disabling audio disables the ability to use turbo and makes frame advance advance two frames at a time, holding buttons down in the process. For this particular game, that was actually a huge benefit as there is always plenty of time to move gems before they fall so I actually ran through a substantial part of the game in that state.

Other comments and potential improvements

This was both fun and frustrating to work on. On the one hand, this process is quite possibly one of the most unique puzzles I've ever worked on in the sense that I was often trying to find a way to set up chain reactions or otherwise amass power gems and taking the list of upcoming gems and figuring out the best thing to do was often quite tricky. On the other hand, the infinite number of potential gem drop orders you can sort through is maddening - will *this* series of gems produce a faster result than the last one? Who knows! Spend a few hours trying to get one to be just a second faster, give up in frustration, try another drop order and destroy the enemy in no time flat, hope to get the same luck on the next round and fail, lather, rinse, repeat. Needless to say, I am in no way deluding myself into believing that this is completely perfect because to make it perfect would require botting and knowing where certain things reside in memory, both of which are literally impossible in this emulator. I encourage anyone who wants to to obsolete this run in the future - assuming some of the annoyances of the emulator are resolved you might find it to be an enjoyable process of puzzling over the best solutions.

Thanks

I'd like to say thanks to zid who helped me diagnose the brokenness that is Lua support in this emulator and to Raelcun, Invariel, and everyone else on IRC who kept me in good spirits during the low points of the run. Enjoy!

ars4326: Judging!
ars4326: Updated movie file. Previous time: 07:08.18 (25691 frames). Current time: 07:08.15 (25689 frames).
ars4326: Hi again, dwangoAC. Overall, this was a fun watch. Observing the steadily incrementing combo setups were entertaining, along with some of the more humorous opponent defeats (e.g. Sakura and Akuma). From a tech quality standpoint, it was also very noteworthy in how much time you invested into the run (both individual stages and overall), as well as documenting how unforgiving the RNG was. Impressive work!
Accepting for publication to Moons!
fsvgm777: Processing.
Last Edited by adelikat on 10/14/2023 6:16 PM
Page History Latest diff List referrers