Commit Graph

262 Commits

Author SHA1 Message Date
nmlgc 306a504ef5 [Naming] [th05] Officially rename "curve bullets" to "cheetos"
Short, sweet, fits more nicely into 8.3 filenames than "curve bullets"
does, and 76.7% of fans agree:

	https://twitter.com/ReC98Project/status/1500256959785746434

OMAKE.TXT calls them "homing lasers", but… eh, nah.

Part of P0190, funded by nrook.
2022-04-29 03:28:44 +02:00
nmlgc c90c7d52c4 [Decompilation] [th04] Stage 4 Marisa: Point-reflected movement
This is the function that causes Marisa's `Divide Error` crash when
called during a 4-frame window during the end of certain patterns.
Just like with Kurumi's division by zero, it's just as undefined here
what should happen instead, and any possible fix can only ever be a
fan-fiction interpretation of the code. And since the community will
have an easier time understanding and debating a C++-level hack instead
of an ASM-level one, it makes sense to first decompile this function…

…and document it, which is actually much harder!

Part of P0189, funded by Arandui and Lmocinemod.
2022-04-17 00:00:35 +02:00
nmlgc adffa1ccf9 [Decompilation] [th05] Shinki's 32×32 balls: Spawn function
Wait, wouldn't it be cool if we could keep the render, spawn, and
update functions in the same translation unit, by switching code
segments in the middle of the file? Let's hope this works out, and give
the source file an all-encompassing generic name.

Part of P0188, funded by [Anonymous] and nrook.
2022-03-27 01:50:07 +01:00
nmlgc 38eb77c828 [Decompilation] [th04/th05] Bosses: Item drops
Part of P0188, funded by [Anonymous] and nrook.
2022-03-27 01:35:40 +01:00
nmlgc 354a4724f3 [Decompilation] [th04/th05] Bosses: Defeat sequence
With TH04's version hardcoding not only Gengetsu's dialog and
initialization, but also the Bad Ending after having clearing Stage 5
with continues or on Easy difficulty.

Part of P0188, funded by [Anonymous] and nrook.
2022-03-27 01:35:37 +01:00
nmlgc 0fb1a9f01e [Maintenance] [th05] Split segment #3 before Shinki
Part of P0188, funded by [Anonymous] and nrook.
2022-03-27 01:29:03 +01:00
nmlgc a03e8a78b8 [Reverse-engineering] [th04] Stage 4 Reimu: Data segment variables
Part of P0187, funded by [Anonymous] and Blue Bolt.
2022-03-27 00:48:06 +01:00
nmlgc 5e4f1f0f1d [Reverse-engineering] [th04] Gengetsu: Wave teleport amplitude
Given how close the string literals of TH04's boss defeat sequence
function are to the end of its data segment, it makes sense to figure
out the three values after it right now.

Part of P0187, funded by [Anonymous] and Blue Bolt.
2022-03-27 00:43:03 +01:00
nmlgc 903d824c48 [Decompilation] [th04/th05] Dialog: Script loading functions
Part of P0186, funded by [Anonymous] and Blue Bolt.
2022-03-27 00:39:04 +01:00
nmlgc 295d5a8c6c [Decompilation] [th05] Bosses: Player sprite collision
TH05 only…? Yes, moving over a boss sprite doesn't actually kill the
player in TH04.

Part of P0186, funded by [Anonymous] and Blue Bolt.
2022-03-27 00:39:03 +01:00
nmlgc 7d5b34d390 [Maintenance] [th04/th05] Text popups: Move to a new "text overlay" module
This term encompasses both the event popups, the Stage and BGM titles
(which have nothing to do with the former), and the upcoming transition
effect.

Part of P0186, funded by [Anonymous] and Blue Bolt.
2022-03-27 00:33:51 +01:00
nmlgc 1c468eef21 [Maintenance] [th02] Put OP/MAINE globals into a single translation unit
Part of P0186, funded by [Anonymous] and Blue Bolt.
2022-03-26 20:44:42 +01:00
nmlgc a21ab3d225 [Decompilation] [th04/th05] Midbosses: Defeat animation update function
This code structure is driving me insane.

Completes P0185, funded by [Anonymous], -Tom-, and Blue Bolt.
2022-03-05 17:50:33 +01:00
nmlgc b3e61807a1 [Decompilation] [th04/th05] Playfield shaking
Part of P0185, funded by [Anonymous], -Tom-, and Blue Bolt.
2022-03-05 17:50:33 +01:00
nmlgc a907feacf8 [Decompilation] [th05] Lasers: Spawn and control functions
Part of P0185, funded by [Anonymous], -Tom-, and Blue Bolt.
2022-03-05 17:50:27 +01:00
nmlgc 944654596d [Decompilation] [th05] Curved bullets: Update function
The algorithm for gradually rotating these clockwise or counterclockwise
towards the player could have been 5 lines long. ZUN blows it up to 26
lines.

Also, a 16×16 killbox for the head node, and a 12×12 one for trail
nodes.

Part of P0185, funded by [Anonymous], -Tom-, and Blue Bolt.
2022-03-05 15:31:50 +01:00
nmlgc f918298770 [Decompilation] [th04/th05] Items: Splash circle spawn/update functions
Completes P0184, funded by -Tom-.
2022-03-05 15:31:50 +01:00
nmlgc 07b956b3ad [Maintenance] [th04/th05] Move bullet code into dedicated segments
Too bad that alignment constraints do in fact force us to compile
th04/bullet_u.cpp and th04/bullet_a.cpp separately. 😕

Part of P0184, funded by -Tom-.
2022-03-05 15:31:50 +01:00
nmlgc f9d983e0c0 [Decompilation] [th03] Player: Collision detection
8×8-pixel* player hitbox confirmed.

(* 8×4 in VRAM terms)

Completes P0183, funded by Yanga and [Anonymous].
2022-02-18 09:36:34 +01:00
nmlgc c04ca8da91 [Reverse-engineering] [th03] Collision bitmap: Drawing slopes (undecompilable)
Reason: Self-modifying. -.-

Only used in Chiyuri's EX Attack (the one with the diagonal lasers).

Part of P0182, funded by Lmocinemod and [Anonymous].
2022-02-18 09:36:34 +01:00
nmlgc 8b24a07a09 [Decompilation] [th01] Sariel: Main function
Part of P0181, funded by Ember2528.
2022-01-31 08:31:18 +01:00
nmlgc 8b01702aa5 [Decompilation] [th01] Sariel: Move compiler-generated data to C land
Very helpful at this small scale, as it allows us to directly decompile
floating-point literals. These will be added to Sariel's regular
translation unit in the same order, so we merely have to remove them
from this temporary translation unit then.

Part of P0174, funded by Ember2528.
2022-01-31 05:15:29 +01:00
nmlgc 2d5491e4a9 [Decompilation] [th03] YUME.NEM: Loading
"I don't need the return value in MAINL.EXE? Let's copy-paste the
function and remove all of its `return` statements then!" :zunpet:

Completes P0172, funded by [Anonymous] and Blue Bolt.
2021-12-27 03:59:33 +01:00
nmlgc 6d5918881f [Decompilation] [th03] YUME.NEM: Encryption and saving
Also "intransparently setting the clear flag, but only in the MAINL.EXE
version".

Part of P0172, funded by [Anonymous] and Blue Bolt.
2021-12-27 03:59:30 +01:00
nmlgc 79aeb8dccc [Decompilation] [th03] YUME.NEM: Decryption
Featuring inline assembly for a single ROR instruction. Turbo C++ 4.0J
unfortunately only offers intrinsics for 16-bit rotations.

Part of P0172, funded by [Anonymous] and Blue Bolt.
2021-12-27 03:59:02 +01:00
nmlgc 9ae4f7726e [Decompilation] [th05] EMS / Dialog: Face loading and rendering
Aha! TH05 actually loads every single rendered dialog image
individually before rendering it, either from the EMS area or disk.
That's one way to save memory, I guess?

Part of P0169, funded by Blue Bolt.
2021-11-29 02:01:10 +01:00
nmlgc 7673456ab3 [Decompilation] [th04] EMS / Dialog: Loading the remaining images
What the hell is TH05 doing there…?

Part of P0169, funded by Blue Bolt.
2021-11-29 02:01:10 +01:00
nmlgc fe33d49e0a [Decompilation] [th04/th05] EMS: Allocation + Preloading the eyecatch image
No, I'm not copying exactly what was on ZUN's monitor during the 2010
MAG・ネット documentary. Also, this one was very lucky not to receive
a stupid function name.

Part of P0168, funded by Blue Bolt and rosenrose.
2021-11-29 01:53:43 +01:00
nmlgc dbd9e23bf9 [Maintenance] [th04/th05] Split segment #1 before the EMS functions
Well, except for GameCore(), which has nothing of interest.

Part of P0168, funded by Blue Bolt and rosenrose.
2021-11-28 19:15:22 +01:00
nmlgc d5ec2220ec [Decompilation] [th01] Boss defeat sequence: Drawing white lines
Part of P0167, funded by Ember2528.
2021-11-07 23:32:04 +01:00
nmlgc 8db3dd2919 [Build] Don't compile any ZUN code directly to `bin/`
I've long moved to a convention of putting every .OBJ compiled from ZUN
code into the subdirectory of the game that introduced it. These four
are the last remaining inconsistencies from earlier in development.

Part of P0162, funded by Ember2528.
2021-10-20 00:06:16 +02:00
nmlgc 42ba4a5725 [Decompilation] [th01] Particle system
Only seen in Mima's fight, but initialized for all non-final boss
fights. Also with explicit support for all 8 origin edges, not just the
top-right one used in Mima's fight… and an off-by-one error?!

Completes P0160, funded by Yanga.
2021-10-09 23:25:59 +02:00
nmlgc 2f9304781f [Maintenance] [th01] Split segment #1 before the pellet speed modification code
There might only be three functions between the second and new third
split, but these seem to depend on the entire rest of the code for
card-flipping stages…

Part of P0160, funded by Yanga.
2021-10-08 18:39:04 +02:00
nmlgc b9bc6ac04d [Decompilation] [th01] Bomb items: Spawn function
Part of P0158, funded by Yanga.
2021-09-28 18:05:24 +02:00
nmlgc 4bc6405543 [Decompilation] [th01] HARRY UP pellet pattern
Completes P0156, funded by Ember2528.
2021-08-22 23:56:59 +02:00
nmlgc 6ffe87f35b [Decompilation] [th01] Konngara: Main function
Third longest function in all of PC-98 Touhou, and it's even more of a
copy-pasta than the patterns we've seen earlier. Certainly didn't feel
that long.

Part of P0156, funded by Ember2528.
2021-08-22 23:56:58 +02:00
nmlgc 81fc86150d [Decompilation] [th05] Aiming to the player
Completes P0152, funded by -Tom- and [Anonymous].
2021-07-31 21:09:37 +02:00
nmlgc 6127ca0ec1 [Reverse-engineering] [th05] Bullets: Velocity and angle calculation (undecompilable)
Reason: That switch statement. How should we even?

Well, the code *is* fairly good. After looking very deep into it, and
spending 35% of that function on blank lines (for logical grouping) and
explanatory comments, that is…

Part of P0152, funded by -Tom- and [Anonymous].
2021-07-31 21:09:36 +02:00
nmlgc 4d24ca53bd [Decompilation] [th04/th05] Bullets: Update function
… (24 + (difficulty * 8) + rank) in TH04, and (42 + (difficulty * 8))
in TH05. Also, TH05 only doesn't have TH04's bullet zap animation
because ZUN didn't consistently use constants…

Completes P0151, funded by Blue Bolt and -Tom-.
2021-07-31 20:19:33 +02:00
nmlgc 0d7fc5af77 [Decompilation] [th04/th05] Turbo/Slow Mode slowdown
Slow Mode only does one thing: It looks at how many 8×8 pellets or
16×16 bullets are alive, and reduces the frame rate by 33% (i.e., turns
every second frame into two frames) if that number is…

Part of P0151, funded by Blue Bolt and -Tom-.
2021-07-31 20:19:33 +02:00
nmlgc c4cc31ee6f [Maintenance] [th05] Split segment #3 before the bullet update function
Part of P0149, funded by Blue Bolt, Ember2528, and -Tom-.
2021-07-31 09:33:50 +02:00
nmlgc e1a26bb9b1 [Decompilation] [th04/th05] Player position clamping
Completes P0148, funded by [Anonymous].
2021-07-21 00:35:03 +02:00
nmlgc ab8af79549 [Separate translation units] [th04/th05] motion_update_seg3() (undecompilable)
Reason: See previous commit.

Part of P0148, funded by [Anonymous].
2021-07-21 00:35:02 +02:00
nmlgc f3d59bc324 [Decompilation] [th04/th05] Applying VRAM scrolling to Y coordinates (segment 3)
… Wait, we *can* decompile functions with both parameters, no stack
frame, and a Pascal calling convention?! Good that I already forgot how
impossible it was to decompile the first function I looked at that fell
into this category!

Part of P0148, funded by [Anonymous].
2021-07-21 00:35:02 +02:00
nmlgc 8671340481 [Decompilation] [th04/th05] Gather circle rendering
Part of P0148, funded by [Anonymous].
2021-07-21 00:35:02 +02:00
nmlgc 6333643222 [Decompilation] [th03/th04/th05] cfg_load_resident_ptr()
Including the pointless DOS I/O variation in TH05's MAIN.EXE.
I'm slowly running out of characters to remove from the first segment
name in that file, though…

Part of P0148, funded by [Anonymous].
2021-07-21 00:34:59 +02:00
nmlgc 68d9419e8e [Maintenance] [th02] Remove ranks_center[data].asm
Part of P0141, funded by [Anonymous] and rosenrose.
2021-05-27 19:08:57 +02:00
nmlgc e5dffdd9b6 [Maintenance] [th01] Move frame_delay() to consistently named files
It didn't bother me during all of 2020 that TH01's version was
inconsistently part of vsync.h?!

Part of P0140, funded by [Anonymous].
2021-05-27 18:49:29 +02:00
nmlgc d9858113d8 [Decompilation] [th04] snd_load()
Last one! Done with the SHARED segment for the forseeable future! 🎉

Sure, not the best C++ code either, but still by far the sanest
implementation of this function in any of the 4 games.

Completes P0139, funded by [Anonymous].
2021-05-12 14:31:03 +02:00
nmlgc ca4bf5002a [Separate translation units] [th04] cdg_put_plane() (undecompilable)
Reason: Self-modifying. -.-

Part of P0139, funded by [Anonymous].
2021-05-11 18:48:00 +02:00