mirror of https://github.com/nmlgc/ReC98.git
[Decompilation] [th01] Elis: Pattern 4/13
The one where Elis fires a curved 5-stack of static rings. Part of P0194, funded by Ember2528.
This commit is contained in:
parent
23dbb7fd61
commit
b2006b5042
|
@ -83,6 +83,7 @@ enum elis_starpattern_ret_t {
|
||||||
extern union {
|
extern union {
|
||||||
int angle_range; // ACTUAL TYPE: unsigned char
|
int angle_range; // ACTUAL TYPE: unsigned char
|
||||||
pellet_group_t group;
|
pellet_group_t group;
|
||||||
|
int ring;
|
||||||
int speed_multiplied_by_8;
|
int speed_multiplied_by_8;
|
||||||
} pattern_state;
|
} pattern_state;
|
||||||
// --------
|
// --------
|
||||||
|
@ -116,6 +117,8 @@ enum elis_entity_cel_t {
|
||||||
|
|
||||||
// ENT_ATTACK
|
// ENT_ATTACK
|
||||||
C_PREPARE = 0,
|
C_PREPARE = 0,
|
||||||
|
C_ATTACK_1 = 1,
|
||||||
|
C_ATTACK_2 = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ent_still_or_wave boss_entities[ENT_STILL_OR_WAVE]
|
#define ent_still_or_wave boss_entities[ENT_STILL_OR_WAVE]
|
||||||
|
@ -140,6 +143,9 @@ inline void ent_sync(elis_entity_t dst, elis_entity_t src) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// It's needed in the functions below...
|
||||||
|
void girl_bg_put(int unncessary_parameter_that_still_needs_to_be_1_or_2);
|
||||||
|
|
||||||
// [unput_0] should theoretically always be `true`. Making sure that both VRAM
|
// [unput_0] should theoretically always be `true`. Making sure that both VRAM
|
||||||
// pages are identical avoids visual glitches from blitting cels with different
|
// pages are identical avoids visual glitches from blitting cels with different
|
||||||
// transparent areas on top of each other (see: Mima's third arm)… but you can
|
// transparent areas on top of each other (see: Mima's third arm)… but you can
|
||||||
|
@ -147,8 +153,6 @@ inline void ent_sync(elis_entity_t dst, elis_entity_t src) {
|
||||||
inline void ent_unput_and_put_both(
|
inline void ent_unput_and_put_both(
|
||||||
elis_entity_t ent, elis_entity_cel_t cel, bool unput_0 = true
|
elis_entity_t ent, elis_entity_cel_t cel, bool unput_0 = true
|
||||||
) {
|
) {
|
||||||
void girl_bg_put(int unncessary_parameter_that_still_needs_to_be_1_or_2);
|
|
||||||
|
|
||||||
graph_accesspage_func(1);
|
graph_accesspage_func(1);
|
||||||
girl_bg_put(ent + 1);
|
girl_bg_put(ent + 1);
|
||||||
boss_entities[ent].move_lock_and_put_image_8(cel);
|
boss_entities[ent].move_lock_and_put_image_8(cel);
|
||||||
|
@ -158,6 +162,19 @@ inline void ent_unput_and_put_both(
|
||||||
}
|
}
|
||||||
boss_entities[ent].move_lock_and_put_image_8(cel);
|
boss_entities[ent].move_lock_and_put_image_8(cel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void ent_put_both(elis_entity_t ent, elis_entity_cel_t cel) {
|
||||||
|
graph_accesspage_func(1); boss_entities[ent].move_lock_and_put_image_8(cel);
|
||||||
|
graph_accesspage_func(0); boss_entities[ent].move_lock_and_put_image_8(cel);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ent_attack_render() { \
|
||||||
|
if((boss_phase_frame % 8) == 0) { \
|
||||||
|
ent_unput_and_put_both(ENT_ATTACK, C_ATTACK_1); \
|
||||||
|
} else if((boss_phase_frame % 8) == 4) { \
|
||||||
|
ent_put_both(ENT_ATTACK, C_ATTACK_2); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
// --------
|
// --------
|
||||||
|
|
||||||
// Form-relative coordinates
|
// Form-relative coordinates
|
||||||
|
@ -844,3 +861,47 @@ elis_starpattern_ret_t near star_of_david(void)
|
||||||
|
|
||||||
#undef circle
|
#undef circle
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int pattern_curved_5_stack_rings(void)
|
||||||
|
{
|
||||||
|
#define fire_ring(i, angle_offset, speed) { \
|
||||||
|
for(int i = 0; i < pattern_state.ring; i++) { \
|
||||||
|
Pellets.add_single( \
|
||||||
|
(form_center_x(F_GIRL) - (PELLET_W / 2)), \
|
||||||
|
(form_center_y(F_GIRL) - (PELLET_H / 2)), \
|
||||||
|
(((0x100 / pattern_state.ring) * i) + angle_offset), \
|
||||||
|
to_sp(speed) \
|
||||||
|
); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
ent_attack_render();
|
||||||
|
if(boss_phase_frame == 10) {
|
||||||
|
select_for_rank(pattern_state.ring, 14, 16, 18, 20);
|
||||||
|
fire_ring(i, 0x00, 3.0f);
|
||||||
|
} else if(boss_phase_frame == 16) {
|
||||||
|
fire_ring(i, 0x02, 3.375f);
|
||||||
|
} else if(boss_phase_frame == 24) {
|
||||||
|
fire_ring(i, 0x04, 4.0f);
|
||||||
|
} else if(boss_phase_frame == 32) {
|
||||||
|
fire_ring(i, 0x06, 4.5f);
|
||||||
|
} else if(boss_phase_frame == 40) {
|
||||||
|
fire_ring(i, 0x08, 5.0f);
|
||||||
|
} else if(boss_phase_frame > 60) {
|
||||||
|
boss_phase_frame = 0;
|
||||||
|
|
||||||
|
// ZUN bug: A completely unnecessary unblitting call that doesn't even
|
||||||
|
// switch back to VRAM page 0. At first, this might look like it has no
|
||||||
|
// effect since Elis runs a wave_teleport() animation afterwards. But
|
||||||
|
// if any player shot, bomb, or Orb sprites overlap Elis between the
|
||||||
|
// end of this pattern and the start of the teleport animation, their
|
||||||
|
// corresponding unblitting calls will rip holes into the Elis sprite.
|
||||||
|
graph_accesspage_func(1);
|
||||||
|
girl_bg_put(2);
|
||||||
|
|
||||||
|
return CHOOSE_NEW;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
#undef fire_ring
|
||||||
|
}
|
||||||
|
|
250
th01_reiiden.asm
250
th01_reiiden.asm
|
@ -17410,257 +17410,11 @@ ELIS_BASE_TOP = (PLAYFIELD_TOP + ((PLAYFIELD_H / 21) * 5) - (ELIS_GIRL_H / 2))
|
||||||
extern @elis_select_for_rank$qmiiiii:proc
|
extern @elis_select_for_rank$qmiiiii:proc
|
||||||
extern @phase_1$qi:proc
|
extern @phase_1$qi:proc
|
||||||
@star_of_david$qv procdesc near
|
@star_of_david$qv procdesc near
|
||||||
|
extern @pattern_curved_5_stack_rings$qv:proc
|
||||||
main_35_TEXT ends
|
main_35_TEXT ends
|
||||||
|
|
||||||
main_35__TEXT segment byte public 'CODE' use16
|
main_35__TEXT segment byte public 'CODE' use16
|
||||||
|
|
||||||
; =============== S U B R O U T I N E =======================================
|
|
||||||
|
|
||||||
; Attributes: bp-based frame
|
|
||||||
|
|
||||||
sub_260DC proc far
|
|
||||||
push bp
|
|
||||||
mov bp, sp
|
|
||||||
push si
|
|
||||||
mov ax, _boss_phase_frame
|
|
||||||
mov bx, 8
|
|
||||||
cwd
|
|
||||||
idiv bx
|
|
||||||
or dx, dx
|
|
||||||
jnz short loc_26136
|
|
||||||
push 1
|
|
||||||
call _graph_accesspage_func
|
|
||||||
call @girl_bg_put$qi stdcall, 2
|
|
||||||
mov elis_attack.BE_move_lock_frame, 0
|
|
||||||
mov elis_attack.BE_bos_image, 1
|
|
||||||
call @CBossEntity@move_lock_and_put_8$qiiii stdcall, offset elis_attack, ds, large 0, large 0 or (3 shl 16)
|
|
||||||
push 0
|
|
||||||
call _graph_accesspage_func
|
|
||||||
call @girl_bg_put$qi stdcall, 2
|
|
||||||
add sp, 14h
|
|
||||||
mov elis_attack.BE_move_lock_frame, 0
|
|
||||||
mov elis_attack.BE_bos_image, 1
|
|
||||||
jmp short loc_2617F
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_26136:
|
|
||||||
mov ax, _boss_phase_frame
|
|
||||||
mov bx, 8
|
|
||||||
cwd
|
|
||||||
idiv bx
|
|
||||||
cmp dx, 4
|
|
||||||
jnz short loc_26194
|
|
||||||
push 1
|
|
||||||
call _graph_accesspage_func
|
|
||||||
mov elis_attack.BE_move_lock_frame, 0
|
|
||||||
mov elis_attack.BE_bos_image, 2
|
|
||||||
call @CBossEntity@move_lock_and_put_8$qiiii stdcall, offset elis_attack, ds, large 0, large 0 or (3 shl 16)
|
|
||||||
push 0
|
|
||||||
call _graph_accesspage_func
|
|
||||||
add sp, 10h
|
|
||||||
mov elis_attack.BE_move_lock_frame, 0
|
|
||||||
mov elis_attack.BE_bos_image, 2
|
|
||||||
|
|
||||||
loc_2617F:
|
|
||||||
call @CBossEntity@move_lock_and_put_8$qiiii c, offset elis_attack, ds, large 0, large 0 or (3 shl 16)
|
|
||||||
|
|
||||||
loc_26194:
|
|
||||||
cmp _boss_phase_frame, 10
|
|
||||||
jnz short loc_261ED
|
|
||||||
call @elis_select_for_rank$qmiiiii c, offset _elis_pattern_state, ds, large 14 or (16 shl 16), large 18 or (20 shl 16)
|
|
||||||
xor si, si
|
|
||||||
jmp short loc_261E4
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_261B6:
|
|
||||||
pushd 0 or (0 shl 16)
|
|
||||||
pushd PM_REGULAR or (0 shl 16)
|
|
||||||
push (3 shl 4)
|
|
||||||
mov ax, 256
|
|
||||||
cwd
|
|
||||||
idiv _elis_pattern_state
|
|
||||||
imul si
|
|
||||||
push ax
|
|
||||||
mov ax, elis_still_or_wave.BE_cur_top
|
|
||||||
add ax, 44
|
|
||||||
push ax
|
|
||||||
mov ax, elis_still_or_wave.BE_cur_left
|
|
||||||
add ax, 60
|
|
||||||
push ax
|
|
||||||
push ds
|
|
||||||
push offset _Pellets
|
|
||||||
call @CPellets@add_single$qiiuci15pellet_motion_tiii
|
|
||||||
add sp, 14h
|
|
||||||
inc si
|
|
||||||
|
|
||||||
loc_261E4:
|
|
||||||
cmp si, _elis_pattern_state
|
|
||||||
jl short loc_261B6
|
|
||||||
jmp loc_2631C
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_261ED:
|
|
||||||
cmp _boss_phase_frame, 16
|
|
||||||
jnz short loc_26231
|
|
||||||
xor si, si
|
|
||||||
jmp short loc_26228
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_261F8:
|
|
||||||
pushd 0 or (0 shl 16)
|
|
||||||
pushd PM_REGULAR or (0 shl 16)
|
|
||||||
push (3 shl 4) + 6
|
|
||||||
mov ax, 256
|
|
||||||
cwd
|
|
||||||
idiv _elis_pattern_state
|
|
||||||
imul si
|
|
||||||
add al, 2
|
|
||||||
push ax
|
|
||||||
mov ax, elis_still_or_wave.BE_cur_top
|
|
||||||
add ax, 44
|
|
||||||
push ax
|
|
||||||
mov ax, elis_still_or_wave.BE_cur_left
|
|
||||||
add ax, 60
|
|
||||||
push ax
|
|
||||||
push ds
|
|
||||||
push offset _Pellets
|
|
||||||
call @CPellets@add_single$qiiuci15pellet_motion_tiii
|
|
||||||
add sp, 14h
|
|
||||||
inc si
|
|
||||||
|
|
||||||
loc_26228:
|
|
||||||
cmp si, _elis_pattern_state
|
|
||||||
jl short loc_261F8
|
|
||||||
jmp loc_2631C
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_26231:
|
|
||||||
cmp _boss_phase_frame, 24
|
|
||||||
jnz short loc_26275
|
|
||||||
xor si, si
|
|
||||||
jmp short loc_2626C
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_2623C:
|
|
||||||
pushd 0 or (0 shl 16)
|
|
||||||
pushd PM_REGULAR or (0 shl 16)
|
|
||||||
push (4 shl 4)
|
|
||||||
mov ax, 256
|
|
||||||
cwd
|
|
||||||
idiv _elis_pattern_state
|
|
||||||
imul si
|
|
||||||
add al, 4
|
|
||||||
push ax
|
|
||||||
mov ax, elis_still_or_wave.BE_cur_top
|
|
||||||
add ax, 44
|
|
||||||
push ax
|
|
||||||
mov ax, elis_still_or_wave.BE_cur_left
|
|
||||||
add ax, 60
|
|
||||||
push ax
|
|
||||||
push ds
|
|
||||||
push offset _Pellets
|
|
||||||
call @CPellets@add_single$qiiuci15pellet_motion_tiii
|
|
||||||
add sp, 14h
|
|
||||||
inc si
|
|
||||||
|
|
||||||
loc_2626C:
|
|
||||||
cmp si, _elis_pattern_state
|
|
||||||
jl short loc_2623C
|
|
||||||
jmp loc_2631C
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_26275:
|
|
||||||
cmp _boss_phase_frame, 32
|
|
||||||
jnz short loc_262B8
|
|
||||||
xor si, si
|
|
||||||
jmp short loc_262B0
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_26280:
|
|
||||||
pushd 0 or (0 shl 16)
|
|
||||||
pushd PM_REGULAR or (0 shl 16)
|
|
||||||
push (4 shl 4) + 8
|
|
||||||
mov ax, 256
|
|
||||||
cwd
|
|
||||||
idiv _elis_pattern_state
|
|
||||||
imul si
|
|
||||||
add al, 6
|
|
||||||
push ax
|
|
||||||
mov ax, elis_still_or_wave.BE_cur_top
|
|
||||||
add ax, 44
|
|
||||||
push ax
|
|
||||||
mov ax, elis_still_or_wave.BE_cur_left
|
|
||||||
add ax, 60
|
|
||||||
push ax
|
|
||||||
push ds
|
|
||||||
push offset _Pellets
|
|
||||||
call @CPellets@add_single$qiiuci15pellet_motion_tiii
|
|
||||||
add sp, 14h
|
|
||||||
inc si
|
|
||||||
|
|
||||||
loc_262B0:
|
|
||||||
cmp si, _elis_pattern_state
|
|
||||||
jl short loc_26280
|
|
||||||
jmp short loc_2631C
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_262B8:
|
|
||||||
cmp _boss_phase_frame, 40
|
|
||||||
jnz short loc_262FB
|
|
||||||
xor si, si
|
|
||||||
jmp short loc_262F3
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_262C3:
|
|
||||||
pushd 0 or (0 shl 16)
|
|
||||||
pushd PM_REGULAR or (0 shl 16)
|
|
||||||
push (5 shl 4)
|
|
||||||
mov ax, 256
|
|
||||||
cwd
|
|
||||||
idiv _elis_pattern_state
|
|
||||||
imul si
|
|
||||||
add al, 8
|
|
||||||
push ax
|
|
||||||
mov ax, elis_still_or_wave.BE_cur_top
|
|
||||||
add ax, 44
|
|
||||||
push ax
|
|
||||||
mov ax, elis_still_or_wave.BE_cur_left
|
|
||||||
add ax, 60
|
|
||||||
push ax
|
|
||||||
push ds
|
|
||||||
push offset _Pellets
|
|
||||||
call @CPellets@add_single$qiiuci15pellet_motion_tiii
|
|
||||||
add sp, 14h
|
|
||||||
inc si
|
|
||||||
|
|
||||||
loc_262F3:
|
|
||||||
cmp si, _elis_pattern_state
|
|
||||||
jl short loc_262C3
|
|
||||||
jmp short loc_2631C
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_262FB:
|
|
||||||
cmp _boss_phase_frame, 60
|
|
||||||
jle short loc_2631C
|
|
||||||
mov _boss_phase_frame, 0
|
|
||||||
push 1
|
|
||||||
call _graph_accesspage_func
|
|
||||||
call @girl_bg_put$qi stdcall, 2
|
|
||||||
add sp, 4
|
|
||||||
xor ax, ax
|
|
||||||
jmp short loc_2631F
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_2631C:
|
|
||||||
mov ax, 1
|
|
||||||
|
|
||||||
loc_2631F:
|
|
||||||
pop si
|
|
||||||
pop bp
|
|
||||||
retf
|
|
||||||
sub_260DC endp
|
|
||||||
|
|
||||||
|
|
||||||
; =============== S U B R O U T I N E =======================================
|
; =============== S U B R O U T I N E =======================================
|
||||||
|
|
||||||
; Attributes: bp-based frame
|
; Attributes: bp-based frame
|
||||||
|
@ -18261,7 +18015,7 @@ loc_268E8:
|
||||||
; ---------------------------------------------------------------------------
|
; ---------------------------------------------------------------------------
|
||||||
|
|
||||||
loc_268FA:
|
loc_268FA:
|
||||||
call sub_260DC
|
call @pattern_curved_5_stack_rings$qv
|
||||||
jmp short loc_2692E
|
jmp short loc_2692E
|
||||||
; ---------------------------------------------------------------------------
|
; ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue