Oh, bleh. A realization about character dialogue hit me...
There is a function used during character dialogue in-game that copies data from a temporary buffer into a particular location, which is read later when drawing character dialogue on-screen. This function only copies 64 bytes of data. (There might only even be 64 bytes of free space available in this location; I don't know for sure.)
I've already fixed one of those bugs (extra spaces in names), which was caused because I didn't bugtest my code when I originally wrote my variable-width font code, and a register got clobbered. ^^;;;
The dialog boxes that I didn't recognize are actually character-specific dialogue that is in a different format from what the game expects there, so that's why they are completely broken. I'll look for those code references later, I guess...
And that flashy, glitch mess at the end... is probably caused by a bank value being wrong, and incorrectly-formatted, unterminated text being drawn, which overflows the tilemap into other parts of RAM, and eventually consumes the entire game...
I don't know exactly how I'll tackle that yet. .-.;;; It's part of a few lines that required extra work, so I left them out when formatting the rest of the menu text...
Well, I fixed what caused everything to break yesterday, and ran into a different, very annoying and also very strange bug:
When playing any game with an AI opponent, after that AI player says anything, the game clears completely wrong memory addresses when removing their dialogue box. This causes all sorts of problems, like corrupt tiles overwriting the map, the HUD disappearing, or the game soft-locking after displaying that dialogue box...
Nothing I added recently directly caused this; it is either a byproduct of something I added in my very first patcher build, or something related to how my patcher itself builds everything into the ROM.
My hand-patched build from months ago doesn't exhibit this bug, so I have no idea what is wrong...
Oh no... I isolated what is wrong here, and I am not happy at all...
It's another instance of this game always expecting its text to be in a very specific bank. It never, ever updates what bank it searches for dialog boxes in, only what address within that bank is being currently used.
That causes problems like this, where another function is looking for where it should draw (or, in this case, clear) a dialog box, but it runs off into who-knows-where and trashes memory...
Awesome, rewriting everything that touched SearchDialogDefinitionForA fixed the corruption bug that was crashing games when AI characters said anything! ^w^
... aaaand I immediately found another corruption bug in a dialog window I didn't touch yet. >.<;;;
I don't even know how Konomi's face got corrupted...
While translating venture card-related text, I found a debugging feature left in the game ^w^
https://tcrf.net/Itadaki_Street_2:_Neon_Sign_wa_Bara_Iro_ni#Debug_Venture_Card_Function
Another Ita2 tidbit:
There's a bit of unreferenced text near one routine that handles venture cards #61 and #62, which give stock dividends of 10%/20% normally. At first glance, though, this text seems like it would just print garbage tiles on screen...
It turns out this extra text is old enough that it expects a lowercase English font, which isn't in the final game anymore... and it also suggests you originally got paid a flat amount per stock share you owned instead!
In today's "why is this code making the game crash" adventures, spot the bug:
stack.push(tile_ID);
stack.push(tilemap_index);
stack.push(bank_number);
... // Run code here
stack.pull(tile_ID);
stack.pull(tilemap_index);
stack.pull(bank_number);
return;
... It's doing things in the same order! How can this code be broken...? ^^;;;;;
(I have since fixed this bug. ^.^)
Itadaki Street 2 devlog
Still working, very slowly, on rewriting everything so it works in this new format.
I feel like I'm back where I started 3 years ago...
Itadaki Street 2 devlog
Still not quite working...
The corrupted tiles look different every time, so I guess that's a clue? But why would it be reading from RAM somewhere...?