mirror of https://github.com/nmlgc/ReC98.git
[Decompilation] [th05] Shinki: Background particle rendering
We really wouldn't have wanted to start writing inline ASM in the middle of a conditional expression just to get that janky `CMP AX, 0` instead of TCC's sensible `OR AX, AX` optimization. Part of P0146, funded by -Tom- and Ember2528.
This commit is contained in:
parent
b66400b3d2
commit
4672f226bb
|
@ -6,4 +6,4 @@
|
|||
_AX = top; \
|
||||
_CX = left; \
|
||||
z_super_roll_put_16x16_mono_raw(patnum);
|
||||
void z_pascal near z_super_roll_put_16x16_mono_raw(int patnum);
|
||||
void pascal near z_super_roll_put_16x16_mono_raw(int patnum);
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
#include "platform.h"
|
||||
#include "pc98.h"
|
||||
#include "decomp.hpp"
|
||||
#include "master.hpp"
|
||||
#include "th01/math/area.hpp"
|
||||
#include "th01/math/subpixel.hpp"
|
||||
|
@ -13,6 +14,8 @@
|
|||
#include "th04/math/randring.h"
|
||||
#include "th04/main/drawp.hpp"
|
||||
#include "th04/main/playfld.hpp"
|
||||
#include "th05/sprites/main_pat.h"
|
||||
#include "th05/formats/super.h"
|
||||
#include "th05/main/boss/boss.hpp"
|
||||
|
||||
/// Structures
|
||||
|
@ -58,6 +61,60 @@ static const int PARTICLES_UNINITIALIZED = (-1 & 0xFF);
|
|||
extern unsigned char shinki_bg_linesets_zoomed_out;
|
||||
extern int shinki_bg_type_a_particles_alive;
|
||||
|
||||
void near shinki_bg_particles_render(void)
|
||||
{
|
||||
_ES = SEG_PLANE_B;
|
||||
boss_particle_t near *particle = boss_particles;
|
||||
int patnum;
|
||||
screen_x_t left_;
|
||||
int i = 0;
|
||||
while(i < BOSS_PARTICLE_COUNT) {
|
||||
if(particle->pos.x.v != Subpixel::None()) {
|
||||
particle->pos.x.v += particle->velocity.x.v;
|
||||
particle->pos.y.v += particle->velocity.y.v;
|
||||
if(particle->patnum == 0) {
|
||||
patnum = (particle->age / 8);
|
||||
if(patnum >= PARTICLE_CELS) {
|
||||
patnum = (PARTICLE_CELS - 1);
|
||||
}
|
||||
patnum += PAT_PARTICLE;
|
||||
} else {
|
||||
patnum = particle->patnum;
|
||||
}
|
||||
|
||||
#define left static_cast<pixel_t>(_CX)
|
||||
#define top static_cast<pixel_t>(_AX)
|
||||
|
||||
// Lol, is this only not directly assigned to _CX because ZUN was
|
||||
// scared that the _AX assignment might overwrite _CX?
|
||||
left_ = (
|
||||
particle->pos.x.to_pixel() + PLAYFIELD_LEFT - (PARTICLE_W / 2)
|
||||
);
|
||||
top = (
|
||||
particle->pos.y.to_pixel() + PLAYFIELD_TOP - (PARTICLE_H / 2)
|
||||
);
|
||||
left = left_;
|
||||
if(!(
|
||||
(left > (PLAYFIELD_LEFT - PARTICLE_W)) &&
|
||||
(left < PLAYFIELD_RIGHT) &&
|
||||
(top > keep_0(PLAYFIELD_TOP - PARTICLE_H)) &&
|
||||
(top < PLAYFIELD_BOTTOM)
|
||||
)) {
|
||||
particle->pos = particle->origin;
|
||||
particle->age = 0;
|
||||
} else {
|
||||
z_super_roll_put_16x16_mono(left, top, patnum);
|
||||
particle->age++;
|
||||
}
|
||||
|
||||
#undef top
|
||||
#undef left
|
||||
}
|
||||
i++;
|
||||
particle++;
|
||||
}
|
||||
}
|
||||
|
||||
void near shinki_bg_type_a_update_part1(void)
|
||||
{
|
||||
boss_particle_t near *particle;
|
||||
|
|
|
@ -3532,96 +3532,7 @@ loc_D322:
|
|||
retn
|
||||
yumeko_bg_render endp
|
||||
|
||||
|
||||
; =============== S U B R O U T I N E =======================================
|
||||
|
||||
; Attributes: bp-based frame
|
||||
|
||||
sub_D327 proc near
|
||||
|
||||
@@i = word ptr -4
|
||||
@@left = word ptr -2
|
||||
|
||||
enter 4, 0
|
||||
push si
|
||||
push di
|
||||
mov ax, GRAM_400
|
||||
mov es, ax
|
||||
mov si, offset _boss_particles
|
||||
mov [bp+@@i], 0
|
||||
jmp short loc_D3BA
|
||||
; ---------------------------------------------------------------------------
|
||||
|
||||
loc_D33C:
|
||||
cmp [si+boss_particle_t.BP_pos.x], SUBPIXEL_NONE
|
||||
jz short loc_D3B4
|
||||
mov ax, [si+boss_particle_t.BP_velocity.x]
|
||||
add [si+boss_particle_t.BP_pos.x], ax
|
||||
mov ax, [si+boss_particle_t.BP_velocity.y]
|
||||
add [si+boss_particle_t.BP_pos.y], ax
|
||||
cmp [si+boss_particle_t.BP_patnum], 0
|
||||
jnz short loc_D36C
|
||||
mov ax, [si+boss_particle_t.BP_age]
|
||||
mov bx, 8
|
||||
cwd
|
||||
idiv bx
|
||||
mov di, ax
|
||||
cmp di, PARTICLE_CELS
|
||||
jl short loc_D366
|
||||
mov di, (PARTICLE_CELS - 1)
|
||||
|
||||
loc_D366:
|
||||
add di, PAT_PARTICLE
|
||||
jmp short loc_D373
|
||||
; ---------------------------------------------------------------------------
|
||||
|
||||
loc_D36C:
|
||||
mov al, [si+boss_particle_t.BP_patnum]
|
||||
mov ah, 0
|
||||
mov di, ax
|
||||
|
||||
loc_D373:
|
||||
mov ax, [si+boss_particle_t.BP_pos.x]
|
||||
sar ax, 4
|
||||
add ax, (PLAYFIELD_LEFT - (PARTICLE_W / 2))
|
||||
mov [bp+@@left], ax
|
||||
mov ax, [si+boss_particle_t.BP_pos.y]
|
||||
sar ax, 4
|
||||
add ax, (PLAYFIELD_TOP - (PARTICLE_H / 2))
|
||||
mov cx, [bp+@@left]
|
||||
cmp cx, (PLAYFIELD_LEFT - PARTICLE_W)
|
||||
jle short loc_D39F
|
||||
cmp cx, PLAYFIELD_RIGHT
|
||||
jge short loc_D39F
|
||||
cmp ax, (PLAYFIELD_TOP - PARTICLE_H)
|
||||
jle short loc_D39F
|
||||
cmp ax, PLAYFIELD_BOTTOM
|
||||
jl short loc_D3AD
|
||||
|
||||
loc_D39F:
|
||||
mov eax, dword ptr [si+boss_particle_t.BP_origin]
|
||||
mov dword ptr [si+boss_particle_t.BP_pos], eax
|
||||
mov [si+boss_particle_t.BP_age], 0
|
||||
jmp short loc_D3B4
|
||||
; ---------------------------------------------------------------------------
|
||||
|
||||
loc_D3AD:
|
||||
call z_super_roll_put_16x16_mono_raw pascal, di
|
||||
inc [si+boss_particle_t.BP_age]
|
||||
|
||||
loc_D3B4:
|
||||
inc [bp+@@i]
|
||||
add si, size boss_particle_t
|
||||
|
||||
loc_D3BA:
|
||||
cmp [bp+@@i], BOSS_PARTICLE_COUNT
|
||||
jl loc_D33C
|
||||
pop di
|
||||
pop si
|
||||
leave
|
||||
retn
|
||||
sub_D327 endp
|
||||
|
||||
_shinki_bg_particles_render procdesc c near
|
||||
_shinki_bg_type_a_update_part1 procdesc c near
|
||||
GRCG_LINESET_LINE_PUT procdesc pascal near \
|
||||
set:near ptr, i:word
|
||||
|
@ -3677,7 +3588,7 @@ loc_D630:
|
|||
call _grcg_setmode_rmw_seg1
|
||||
mov ah, GC_BRG
|
||||
call _grcg_setcolor_direct_seg1_raw
|
||||
call sub_D327
|
||||
call _shinki_bg_particles_render
|
||||
call grcg_lineset_line_put pascal, offset lineset0, 18
|
||||
call grcg_lineset_line_put pascal, offset lineset0, 12
|
||||
call grcg_lineset_line_put pascal, offset lineset1, 18
|
||||
|
@ -3921,7 +3832,7 @@ loc_D82E:
|
|||
call _grcg_setmode_rmw_seg1
|
||||
mov ah, GC_BRG
|
||||
call _grcg_setcolor_direct_seg1_raw
|
||||
call sub_D327
|
||||
call _shinki_bg_particles_render
|
||||
call grcg_lineset_line_put pascal, offset lineset0, 18
|
||||
call grcg_lineset_line_put pascal, offset lineset0, 12
|
||||
call grcg_lineset_line_put pascal, offset lineset1, 18
|
||||
|
@ -4130,7 +4041,7 @@ loc_D9C6:
|
|||
call _grcg_setmode_rmw_seg1
|
||||
mov ah, GC_BRG
|
||||
call _grcg_setcolor_direct_seg1_raw
|
||||
call sub_D327
|
||||
call _shinki_bg_particles_render
|
||||
call grcg_lineset_line_put pascal, offset lineset0, 18
|
||||
call grcg_lineset_line_put pascal, offset lineset0, 12
|
||||
call grcg_lineset_line_put pascal, offset lineset1, 18
|
||||
|
@ -4291,7 +4202,7 @@ loc_DB0A:
|
|||
call sub_E950
|
||||
call sub_DA25
|
||||
call grcg_setcolor pascal, (GC_RMW shl 16) + 6
|
||||
call sub_D327
|
||||
call _shinki_bg_particles_render
|
||||
GRCG_OFF_CLOBBERING dx
|
||||
leave
|
||||
retn
|
||||
|
|
Loading…
Reference in New Issue