mirror of https://github.com/nmlgc/ReC98.git
[Decompilation] [th01] Stage objects: Card update and rendering
Including firing the revenge pellets on Lunatic. And that's all non-boilerplate card code done as well! Completes P0159, funded by Yanga.
This commit is contained in:
parent
36068acb02
commit
e491cd7b03
|
@ -1,3 +1,8 @@
|
||||||
|
#include "th01/hardware/input.hpp"
|
||||||
|
#include "th01/sprites/pellet.h"
|
||||||
|
#include "th01/math/subpixel.hpp"
|
||||||
|
#include "th01/main/bullet/pellet.hpp"
|
||||||
|
|
||||||
static const unsigned int CARD_SCORE_CAP_DIGITS = digit_count(CARD_SCORE_CAP);
|
static const unsigned int CARD_SCORE_CAP_DIGITS = digit_count(CARD_SCORE_CAP);
|
||||||
static const pixel_t CARD_SCORE_W = (CARD_SCORE_CAP_DIGITS * GLYPH_HALF_W);
|
static const pixel_t CARD_SCORE_W = (CARD_SCORE_CAP_DIGITS * GLYPH_HALF_W);
|
||||||
|
|
||||||
|
@ -67,3 +72,72 @@ void cards_score_render(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define card_put_8(i) \
|
||||||
|
stageobj_put_8( \
|
||||||
|
cards.left[i], \
|
||||||
|
cards.top[i], \
|
||||||
|
CARD_ANIM[cards.hp[i]][cards.flip_frames[i] / CARD_FRAMES_PER_CEL], \
|
||||||
|
i \
|
||||||
|
);
|
||||||
|
|
||||||
|
void cards_update_and_render(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int cards_removed = 0;
|
||||||
|
|
||||||
|
// ZUN bug: Why is this called first? The animated card sprites will
|
||||||
|
// therefore overlap the score popup every [CARD_FRAMES_PER_CEL] frames,
|
||||||
|
// leading to some minor flickering.
|
||||||
|
cards_score_render();
|
||||||
|
|
||||||
|
for(i = 0; i < cards.count; i++) {
|
||||||
|
if(cards.flag[i] == CARD_FLIPPING) {
|
||||||
|
if(
|
||||||
|
(cards.flip_frames[i] < FRAME_ANIM_DONE) &&
|
||||||
|
((cards.flip_frames[i] % CARD_FRAMES_PER_CEL) == 0)
|
||||||
|
) {
|
||||||
|
graph_accesspage_func(1); card_put_8(i);
|
||||||
|
graph_accesspage_func(0); card_put_8(i);
|
||||||
|
}
|
||||||
|
cards.flip_frames[i]++;
|
||||||
|
if(cards.flip_frames[i] >= card_first_frame_of(CARD_CEL_FLIPPED)) {
|
||||||
|
if(rank == RANK_LUNATIC) {
|
||||||
|
pellet_group_t group;
|
||||||
|
|
||||||
|
if(stage_num < 10) {
|
||||||
|
group = PG_1_AIMED;
|
||||||
|
} else {
|
||||||
|
group = PG_1_RANDOM_NARROW_AIMED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cards.flip_frames[i] == FRAME_ANIM_DONE) {
|
||||||
|
Pellets.add_group(
|
||||||
|
(cards.left[i] + (STAGEOBJ_W / 2) - (PELLET_W / 2)),
|
||||||
|
(cards.top[i] + (STAGEOBJ_H / 2) - (PELLET_H / 2)),
|
||||||
|
group,
|
||||||
|
to_sp(3.5f)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(cards.flip_frames[i] >= card_first_frame_of(CARD_CELS)) {
|
||||||
|
if(cards.hp[i] == 0) {
|
||||||
|
cards.flag[i] = CARD_REMOVED;
|
||||||
|
cards.flip_frames[i] = 0;
|
||||||
|
} else {
|
||||||
|
cards.flag[i] = CARD_ALIVE;
|
||||||
|
cards.flip_frames[i] = 0;
|
||||||
|
cards.hp[i]--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(cards.flag[i] == CARD_REMOVED) {
|
||||||
|
cards_removed++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(cards_removed == cards.count) {
|
||||||
|
stage_cleared = true;
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -9,6 +9,8 @@ enum card_flag_t {
|
||||||
CARD_FLIPPING = 1,
|
CARD_FLIPPING = 1,
|
||||||
|
|
||||||
CARD_REMOVED = 2,
|
CARD_REMOVED = 2,
|
||||||
|
|
||||||
|
_card_flag_t_FORCE_INT16 = 0x7FFF
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int CARD_FRAMES_PER_CEL = 6;
|
static const int CARD_FRAMES_PER_CEL = 6;
|
||||||
|
@ -42,7 +44,7 @@ extern unsigned long *cards_score;
|
||||||
struct CCards {
|
struct CCards {
|
||||||
screen_x_t *left;
|
screen_x_t *left;
|
||||||
vram_y_t *top;
|
vram_y_t *top;
|
||||||
card_flag_t *flag;
|
char *flag; // card_flag_t
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
// Current frame within the CARD_FLIPPING animation.
|
// Current frame within the CARD_FLIPPING animation.
|
||||||
|
@ -56,7 +58,7 @@ struct CCards {
|
||||||
if(count > 0) {
|
if(count > 0) {
|
||||||
left = new screen_x_t[count];
|
left = new screen_x_t[count];
|
||||||
top = new vram_y_t[count];
|
top = new vram_y_t[count];
|
||||||
flag = new card_flag_t[count];
|
flag = new char[count];
|
||||||
flip_frames = new int[count];
|
flip_frames = new int[count];
|
||||||
hp = new char[count];
|
hp = new char[count];
|
||||||
cards_score = new unsigned long[count];
|
cards_score = new unsigned long[count];
|
||||||
|
@ -72,6 +74,10 @@ extern bool16 stage_cleared;
|
||||||
// immediate effects of such collisions. Score points for collisisions are
|
// immediate effects of such collisions. Score points for collisisions are
|
||||||
// granted in relation to the [stage_num].
|
// granted in relation to the [stage_num].
|
||||||
void cards_hittest(int stage_num);
|
void cards_hittest(int stage_num);
|
||||||
|
|
||||||
|
// Also sets the [stage_cleared] flag if all cards were cleared, and fires
|
||||||
|
// revenge pellets on Lunatic.
|
||||||
|
void cards_update_and_render(void);
|
||||||
// -----
|
// -----
|
||||||
|
|
||||||
// "Obstacles"
|
// "Obstacles"
|
||||||
|
|
240
th01_reiiden.asm
240
th01_reiiden.asm
|
@ -66,7 +66,6 @@ main_21 group main_21_TEXT, main_21__TEXT
|
||||||
main_25 group main_25_TEXT, main_25__TEXT
|
main_25 group main_25_TEXT, main_25__TEXT
|
||||||
main_27 group main_27_TEXT, main_27__TEXT
|
main_27 group main_27_TEXT, main_27__TEXT
|
||||||
main_29 group main_29_TEXT, main_29__TEXT
|
main_29 group main_29_TEXT, main_29__TEXT
|
||||||
main_30 group main_30_TEXT, main_30__TEXT
|
|
||||||
main_31 group main_31_TEXT, main_31__TEXT
|
main_31 group main_31_TEXT, main_31__TEXT
|
||||||
main_32 group main_32_TEXT, main_32__TEXT
|
main_32 group main_32_TEXT, main_32__TEXT
|
||||||
main_33 group main_33_TEXT, main_33__TEXT
|
main_33 group main_33_TEXT, main_33__TEXT
|
||||||
|
@ -1039,7 +1038,7 @@ loc_C879:
|
||||||
idiv bx
|
idiv bx
|
||||||
cmp dx, 4
|
cmp dx, 4
|
||||||
jz short loc_C88B
|
jz short loc_C88B
|
||||||
call sub_201BE
|
call @cards_update_and_render$qv
|
||||||
|
|
||||||
loc_C88B:
|
loc_C88B:
|
||||||
cmp _orb_in_portal, 0
|
cmp _orb_in_portal, 0
|
||||||
|
@ -15684,237 +15683,11 @@ main_29__TEXT ends
|
||||||
|
|
||||||
; Segment type: Pure code
|
; Segment type: Pure code
|
||||||
main_30_TEXT segment byte public 'CODE' use16
|
main_30_TEXT segment byte public 'CODE' use16
|
||||||
assume cs:main_30
|
|
||||||
;org 3
|
|
||||||
assume es:nothing, ss:nothing, ds:_DATA, fs:nothing, gs:nothing
|
|
||||||
|
|
||||||
; panel_flag_t
|
|
||||||
PANEL_ALIVE = 0
|
|
||||||
PANEL_FLIPPING = 1
|
|
||||||
PANEL_REMOVED = 2
|
|
||||||
|
|
||||||
extern @cards_hittest$qi:proc
|
extern @cards_hittest$qi:proc
|
||||||
extern @STR_RIGHT_ALIGNED_FROM_UINT16$QNCUIUI:proc
|
extern @STR_RIGHT_ALIGNED_FROM_UINT16$QNCUIUI:proc
|
||||||
extern @cards_score_render$qv:proc
|
extern @cards_update_and_render$qv:proc
|
||||||
main_30_TEXT ends
|
main_30_TEXT ends
|
||||||
|
|
||||||
main_30__TEXT segment byte public 'CODE' use16
|
|
||||||
|
|
||||||
; =============== S U B R O U T I N E =======================================
|
|
||||||
|
|
||||||
; Attributes: bp-based frame
|
|
||||||
|
|
||||||
sub_201BE proc far
|
|
||||||
|
|
||||||
@@group = word ptr -2
|
|
||||||
|
|
||||||
enter 2, 0
|
|
||||||
push si
|
|
||||||
push di
|
|
||||||
xor di, di
|
|
||||||
call @cards_score_render$qv
|
|
||||||
xor si, si
|
|
||||||
jmp loc_2037C
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_201CF:
|
|
||||||
les bx, _cards_flag
|
|
||||||
mov al, es:[bx+si]
|
|
||||||
cbw
|
|
||||||
cmp ax, PANEL_FLIPPING
|
|
||||||
jnz loc_2036D
|
|
||||||
mov ax, si
|
|
||||||
add ax, ax
|
|
||||||
les bx, _cards_flip_frames
|
|
||||||
add bx, ax
|
|
||||||
cmp word ptr es:[bx], 25
|
|
||||||
jge loc_202A6
|
|
||||||
mov ax, es:[bx]
|
|
||||||
mov bx, 6
|
|
||||||
cwd
|
|
||||||
idiv bx
|
|
||||||
or dx, dx
|
|
||||||
jnz loc_202A6
|
|
||||||
push 1
|
|
||||||
call _graph_accesspage_func
|
|
||||||
pop cx
|
|
||||||
push si ; bg_slot
|
|
||||||
les bx, _cards_hp
|
|
||||||
mov al, es:[bx+si]
|
|
||||||
cbw
|
|
||||||
imul ax, CARD_ANIM_CELS
|
|
||||||
mov dx, si
|
|
||||||
add dx, dx
|
|
||||||
les bx, _cards_flip_frames
|
|
||||||
add bx, dx
|
|
||||||
push ax
|
|
||||||
mov ax, es:[bx]
|
|
||||||
mov bx, 6
|
|
||||||
cwd
|
|
||||||
idiv bx
|
|
||||||
pop bx
|
|
||||||
add bx, ax
|
|
||||||
mov al, _CARD_ANIM[bx]
|
|
||||||
mov ah, 0
|
|
||||||
push ax ; ptn_id
|
|
||||||
mov ax, si
|
|
||||||
add ax, ax
|
|
||||||
les bx, _cards_top
|
|
||||||
add bx, ax
|
|
||||||
push word ptr es:[bx] ; top
|
|
||||||
mov ax, si
|
|
||||||
add ax, ax
|
|
||||||
les bx, _cards_left
|
|
||||||
add bx, ax
|
|
||||||
push word ptr es:[bx] ; left
|
|
||||||
call @stageobj_put_8$qiiii
|
|
||||||
push 0
|
|
||||||
call _graph_accesspage_func
|
|
||||||
add sp, 0Ah
|
|
||||||
push si ; bg_slot
|
|
||||||
les bx, _cards_hp
|
|
||||||
mov al, es:[bx+si]
|
|
||||||
cbw
|
|
||||||
imul ax, CARD_ANIM_CELS
|
|
||||||
mov dx, si
|
|
||||||
add dx, dx
|
|
||||||
les bx, _cards_flip_frames
|
|
||||||
add bx, dx
|
|
||||||
push ax
|
|
||||||
mov ax, es:[bx]
|
|
||||||
mov bx, 6
|
|
||||||
cwd
|
|
||||||
idiv bx
|
|
||||||
pop bx
|
|
||||||
add bx, ax
|
|
||||||
mov al, _CARD_ANIM[bx]
|
|
||||||
mov ah, 0
|
|
||||||
push ax ; ptn_id
|
|
||||||
mov ax, si
|
|
||||||
add ax, ax
|
|
||||||
les bx, _cards_top
|
|
||||||
add bx, ax
|
|
||||||
push word ptr es:[bx] ; top
|
|
||||||
mov ax, si
|
|
||||||
add ax, ax
|
|
||||||
les bx, _cards_left
|
|
||||||
add bx, ax
|
|
||||||
push word ptr es:[bx] ; left
|
|
||||||
call @stageobj_put_8$qiiii
|
|
||||||
add sp, 8
|
|
||||||
|
|
||||||
loc_202A6:
|
|
||||||
mov ax, si
|
|
||||||
add ax, ax
|
|
||||||
les bx, _cards_flip_frames
|
|
||||||
add bx, ax
|
|
||||||
inc word ptr es:[bx]
|
|
||||||
cmp word ptr es:[bx], 24
|
|
||||||
jl loc_2036D
|
|
||||||
mov al, _rank
|
|
||||||
cbw
|
|
||||||
cmp ax, RANK_LUNATIC
|
|
||||||
jnz short loc_2031C
|
|
||||||
mov al, _stage_num
|
|
||||||
cbw
|
|
||||||
cmp ax, 10
|
|
||||||
jge short loc_202D4
|
|
||||||
mov [bp+@@group], PG_1_AIMED
|
|
||||||
jmp short loc_202D9
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_202D4:
|
|
||||||
mov [bp+@@group], PG_1_RANDOM_NARROW_AIMED
|
|
||||||
|
|
||||||
loc_202D9:
|
|
||||||
mov ax, si
|
|
||||||
add ax, ax
|
|
||||||
les bx, _cards_flip_frames
|
|
||||||
add bx, ax
|
|
||||||
cmp word ptr es:[bx], 25
|
|
||||||
jnz short loc_2031C
|
|
||||||
push (3 shl 4) + 8
|
|
||||||
push [bp+@@group]
|
|
||||||
mov ax, si
|
|
||||||
add ax, ax
|
|
||||||
les bx, _cards_top
|
|
||||||
add bx, ax
|
|
||||||
mov ax, es:[bx]
|
|
||||||
add ax, 12
|
|
||||||
push ax
|
|
||||||
mov ax, si
|
|
||||||
add ax, ax
|
|
||||||
les bx, _cards_left
|
|
||||||
add bx, ax
|
|
||||||
mov ax, es:[bx]
|
|
||||||
add ax, 12
|
|
||||||
push ax
|
|
||||||
push ds
|
|
||||||
push offset _Pellets
|
|
||||||
call @CPellets@add_group$qii14pellet_group_ti
|
|
||||||
add sp, 0Ch
|
|
||||||
|
|
||||||
loc_2031C:
|
|
||||||
mov ax, si
|
|
||||||
add ax, ax
|
|
||||||
les bx, _cards_flip_frames
|
|
||||||
add bx, ax
|
|
||||||
cmp word ptr es:[bx], 30
|
|
||||||
jl short loc_2036D
|
|
||||||
les bx, _cards_hp
|
|
||||||
cmp byte ptr es:[bx+si], 0
|
|
||||||
jnz short loc_2034F
|
|
||||||
les bx, _cards_flag
|
|
||||||
mov byte ptr es:[bx+si], PANEL_REMOVED
|
|
||||||
mov ax, si
|
|
||||||
add ax, ax
|
|
||||||
les bx, _cards_flip_frames
|
|
||||||
add bx, ax
|
|
||||||
mov word ptr es:[bx], 0
|
|
||||||
jmp short loc_2036D
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_2034F:
|
|
||||||
les bx, _cards_flag
|
|
||||||
mov byte ptr es:[bx+si], PANEL_ALIVE
|
|
||||||
mov ax, si
|
|
||||||
add ax, ax
|
|
||||||
les bx, _cards_flip_frames
|
|
||||||
add bx, ax
|
|
||||||
mov word ptr es:[bx], 0
|
|
||||||
les bx, _cards_hp
|
|
||||||
dec byte ptr es:[bx+si]
|
|
||||||
|
|
||||||
loc_2036D:
|
|
||||||
les bx, _cards_flag
|
|
||||||
mov al, es:[bx+si]
|
|
||||||
cbw
|
|
||||||
cmp ax, PANEL_REMOVED
|
|
||||||
jnz short loc_2037B
|
|
||||||
inc di
|
|
||||||
|
|
||||||
loc_2037B:
|
|
||||||
inc si
|
|
||||||
|
|
||||||
loc_2037C:
|
|
||||||
cmp si, _card_count
|
|
||||||
jl loc_201CF
|
|
||||||
cmp di, _card_count
|
|
||||||
jnz short loc_20395
|
|
||||||
mov _stage_cleared, 1
|
|
||||||
|
|
||||||
loc_20390:
|
|
||||||
mov _done, 1
|
|
||||||
|
|
||||||
loc_20395:
|
|
||||||
pop di
|
|
||||||
pop si
|
|
||||||
leave
|
|
||||||
retf
|
|
||||||
sub_201BE endp
|
|
||||||
|
|
||||||
main_30__TEXT ends
|
|
||||||
|
|
||||||
; ===========================================================================
|
; ===========================================================================
|
||||||
|
|
||||||
; Segment type: Pure code
|
; Segment type: Pure code
|
||||||
|
@ -35553,15 +35326,6 @@ public _default_grp_fn, _default_bgm_fn, _scene_fn_, _CARD_ANIM
|
||||||
_default_grp_fn db 'ST .GRP', 0, 0, 0, 0, 0, 0, 0, 0
|
_default_grp_fn db 'ST .GRP', 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
_default_bgm_fn db 'ST .MDT', 0, 0, 0, 0, 0, 0, 0, 0
|
_default_bgm_fn db 'ST .MDT', 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
|
||||||
STAGEOBJ_W = PTN_W
|
|
||||||
STAGEOBJ_H = PTN_H
|
|
||||||
STAGEOBJS_X = (PLAYFIELD_W / STAGEOBJ_W)
|
|
||||||
STAGEOBJS_Y = (PLAYFIELD_H / STAGEOBJ_H)
|
|
||||||
STAGEOBJS_COUNT = (STAGEOBJS_X * STAGEOBJS_Y)
|
|
||||||
|
|
||||||
CARD_ANIM_CELS = 5
|
|
||||||
CARD_HP_MAX = 5
|
|
||||||
|
|
||||||
_CARD_ANIM label byte
|
_CARD_ANIM label byte
|
||||||
db PTN_CARD_0HP, PTN_CARD_0HP_HALF, PTN_CARD_0HP_EDGE, PTN_CARD_REMOVED_HALF, PTN_CARD_REMOVED
|
db PTN_CARD_0HP, PTN_CARD_0HP_HALF, PTN_CARD_0HP_EDGE, PTN_CARD_REMOVED_HALF, PTN_CARD_REMOVED
|
||||||
db PTN_CARD_1HP, PTN_CARD_1HP_HALF, PTN_CARD_1HP_EDGE, PTN_CARD_0HP_HALF, PTN_CARD_0HP
|
db PTN_CARD_1HP, PTN_CARD_1HP_HALF, PTN_CARD_1HP_EDGE, PTN_CARD_0HP_HALF, PTN_CARD_0HP
|
||||||
|
|
Loading…
Reference in New Issue