send a tag suggestion

which tags should be associated with each other?


why should these tags be associated?

Use the form below to provide more context.

#fightcade


This kind of attitude has become obnoxiously common in the post-Fightcade 2 world and it sucks. It’s the FGC equivalent of ugh, why don’t these people buying mini consoles just set up RetroArch and a Raspberry Pi

Besides the fact that FV2 DC (the only version that FC2 supports) has issues and folks like me have wanted a more accurate port for decades, setting up FC2 isn’t as easy as walking into an arcade in Like A Dragon Gaiden. I’m quite tech-literate and I had to troubleshoot a fair bit to get FV2 on FC2 functioning right with my setup and internet connection. BBH had to do the same with other DC-hardware-based stuff like KoFXI. We aren’t morons, we’ve been emulating since the 90s.

FC2 has done incredible good for the community but it should not cannibalize the need for proper, official ports done with care. There’s still a barrier to accessibility—especially for emulation of hardware from the late 90s on, which is often more finicky and taxing—and anything to help reduce that should be celebrated.

If even just one person out of 10000 plays FV2 on RGGG, enjoys it, and wants to dig deeper into the game, I consider that a big win.



For whatever reason, Puyo Puyo 2 stores executable graphics handling code in RAM. What this means is that I can inject my own payload into the subroutine to call the PRNG every time the code is run -- in this case, every 2 frames! That means each tick of the timer gives you ~30 different possible seeds. I think that's sufficient randomization for most people, and I can write a larger payload to run the code every frame if necessary.

As a bonus, the graphics handling code works anywhere sprite manipulation is involved -- basically everywhere. That means the Fightcade save state can be placed on the mode select menu directly hovering over the Puyo Puyo 2 selection, meaning a button press is all it takes to get you into a match! Plus, I've also set up the payload to delete itself before the game starts in case the CPU needed those PC cycles for accurate game timing.

Technical explanation follows:



100 IQ: Use Fightcade to play Third Strike with friends online

150 IQ: Use Fightcade to play Windjammers with friends online

10,000 IQ: Use Fightcade to play Tetris: Battle Gaiden with friends online



it seems like fightcade hasn't actually been updated since the start of the year. From the outside it looks like the main dev is wrapped up in other business as well as trying to get duckstation integrated into fightcade. So the ETA on Sega C-2 with rollback netcode is gonna have to wait.

Right now I'm focusing on creating a custom PP2 savestate for fightcade. The main goals of the savestate are:

  1. Setting the dipswitch to enable freeplay (easy)
  2. Cheating the wait timer from 10 seconds to 100 seconds (done)
  3. Getting players into the match screen as quickly as possible (easy..?)
  4. Ensuring the RNG seed is sufficiently randomized (...)

That last one is tricky to nail down. The way PP2 is written, the seed is set to a fixed number on boot (0x35879DE2 if you are curious) and only gets iterated when random events fire off. So the issue is that the closer you set the savestate to game start, the fewer opportunities you have to sufficiently randomize the RNG before the start of a game. I was able to consistently get the exact same seed from cold boot just by mashing start.

It might be a better question to ask what exactly causes the RNG to be called? From some limited analysis, it seems like the following things do it:

  1. The flashes and sparkles in the attract animation
  2. Puyos blinking on the game field (including during the attract demo)
  3. Something to do with the background characters animating in the waiting for player screen..?

Waiting for the attract sequence to run long enough to make enough RNG calls is a no-go since it takes so long to get a sufficiently randomized number of calls in, so the recruit screen is the next best bet. It's also only one screen removed from the start of a game -- unfortunately, it doesn't seem like anything on the mode select screen calls the RNG.

The main issue is that whatever calls the RNG on the recruit screen doesn't do so evenly -- it only makes calls about every 1-2 seconds. So that's still infrequent enough to be able to game the RNG if you know what's up.

Right now my gameplan is to try to see if the update rate for the background animations can be modified in RAM somehow - if I can get the RNG call to happen every frame, for example, you'd get a lot more randomization of the seed for the first match of the set. Right now I'm using the MAME debugger to step through the assembly code to look for calls to RAM around calls to the RNG function. I'm not a big fan of the MAME debugger, but I can't figure out how to get Ghidra to properly disassemble the m86k ROM, or how to set up ASM breakpoints in Bizhawk. If you know how I'd love to hear how!

It'd be cool to figure out if it's possible to corrupt the savestate to spawn an RNG-based sprite on the mode select screen to cut down on one more menu. That's way outside of my skillset though.