[Decompilation] [th05] Shinki: Pattern 9/11

The one where Shinki fires aimed purple 32×32 ball bullets, together
with symmetric rotating spreads from the left and right edges of her
wings whose angles rotate along ¾ of a circle.

Part of P0190, funded by nrook.
This commit is contained in:
nmlgc 2022-04-18 18:47:11 +02:00
parent 8b79dd5371
commit 2027639c81
3 changed files with 53 additions and 84 deletions

View File

@ -24,6 +24,7 @@ extern "C" {
#include "th05/main/bullet/cheeto.hpp"
#include "th05/main/bullet/laser.hpp"
#include "th05/main/boss/boss.hpp"
#include "th05/main/player/player.hpp"
#include "th05/sprites/main_pat.h"
// Constants
@ -381,3 +382,47 @@ bool near pattern_wings_to_purple(void)
}
return (boss.phase_frame == 200);
}
void near pattern_aimed_b6balls_and_symmetric_spreads(void)
{
#define b6ball_interval boss_statebyte[15]
if(boss.phase_frame <= 128) {
return;
}
if(boss.phase_frame == 129) {
b6ball_interval = select_for_rank(96, 32, 28, 24);
}
int spread_cycle = (boss.phase_frame % (0x40 * 2));
if((boss.phase_frame % b6ball_interval) == 0) {
b6ball_template.angle = player_angle_from(b6ball_template.origin);
b6ball_template.speed.set(4.0f);
b6ball_template.patnum_tiny = PAT_B6BALL_PURPLE;
b6balls_add();
}
if((boss.phase_frame % 4) == 0) {
bullet_template.origin.x -= (SHINKI_WING_W / 2);
bullet_template.group = BG_SPREAD;
bullet_template.special_motion = BSM_EXACT_LINEAR;
bullet_template.set_spread(3, 0x02);
bullet_template.spawn_type = (BST_CLOUD_FORWARDS | BST_NO_SLOWDOWN);
bullet_template.speed.set(2.5f);
bullet_template.patnum = PAT_BULLET16_V_RED;
if(spread_cycle < 0x40) {
bullet_template.angle = (spread_cycle * 3);
} else {
bullet_template.angle = (0x40 - (spread_cycle * 3));
}
bullets_add_special();
bullet_template.angle = (0x80 - bullet_template.angle);
bullet_template.origin.x += SHINKI_WING_W;
bullets_add_special();
snd_se_play(15);
}
#undef b6ball_interval
}

View File

@ -5,3 +5,9 @@
unsigned char pascal near player_angle_from(
Subpixel x, Subpixel y, unsigned char plus_angle = 0
);
inline unsigned char near player_angle_from(
const PlayfieldPoint &point, unsigned char plus_angle = 0
) {
return player_angle_from(point.x, point.y, plus_angle);
}

View File

@ -19185,93 +19185,11 @@ BOSS_6_TEXT segment byte public 'CODE' use16
@pattern_random_rain_and_spreads_$qv procdesc near
@pattern_cheetos_within_spread_wa$qv procdesc near
@pattern_wings_to_purple$qv procdesc near
@pattern_aimed_b6balls_and_symmet$qv procdesc near
BOSS_6_TEXT ends
BOSS_X_TEXT segment byte public 'CODE' use16
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
sub_1DC2F proc near
push bp
mov bp, sp
push si
cmp _boss_phase_frame, 128
jle loc_1DCFD
cmp _boss_phase_frame, 129
jnz short loc_1DC59
push (60h shl 16) or 20h
push (1Ch shl 16) or 18h
call select_for_rank
mov _boss_statebyte[15], al
loc_1DC59:
mov ax, _boss_phase_frame
mov bx, 128
cwd
idiv bx
mov si, dx
mov al, _boss_statebyte[15]
mov ah, 0
push ax
mov ax, _boss_phase_frame
cwd
pop bx
idiv bx
or dx, dx
jnz short loc_1DC93
call @player_angle_from$q20%SubpixelBase$ti$ti%t1uc pascal, b6ball_template.pos.cur.x, b6ball_template.pos.cur.y, 0
mov b6ball_template.B6B_angle, al
mov b6ball_template.B6B_speed, (4 shl 4)
mov b6ball_template.B6B_patnum_tiny, PAT_B6BALL_PURPLE
call @b6balls_add$qv
loc_1DC93:
mov ax, _boss_phase_frame
mov bx, 4
cwd
idiv bx
or dx, dx
jnz short loc_1DCFD
sub _bullet_template.BT_origin.x, (128 shl 4)
mov _bullet_template.BT_group, BG_SPREAD
mov _bullet_template.BT_special_motion, BSM_EXACT_LINEAR
mov word ptr _bullet_template.spread, (2 shl 8) or 3
mov _bullet_template.spawn_type, BST_CLOUD_FORWARDS or BST_NO_SLOWDOWN
mov _bullet_template.speed, (2 shl 4) + 8
mov _bullet_template.patnum, PAT_BULLET16_V_RED
cmp si, 64
jge short loc_1DCD4
mov ax, si
imul ax, 3
mov _bullet_template.BT_angle, al
jmp short loc_1DCE1
; ---------------------------------------------------------------------------
loc_1DCD4:
mov ax, si
imul ax, 3
mov dl, 64
sub dl, al
mov _bullet_template.BT_angle, dl
loc_1DCE1:
call _bullets_add_special
mov al, 80h
sub al, _bullet_template.BT_angle
mov _bullet_template.BT_angle, al
add _bullet_template.BT_origin.x, (256 shl 4)
call _bullets_add_special
call snd_se_play pascal, 15
loc_1DCFD:
pop si
pop bp
retn
sub_1DC2F endp
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
@ -19916,7 +19834,7 @@ loc_1E3E7:
jz loc_1E527
inc _boss_phase
mov _boss_phase_frame, 0
mov fp_2CE4A, offset sub_1DC2F
mov fp_2CE4A, offset @pattern_aimed_b6balls_and_symmet$qv
jmp loc_1E36F
; ---------------------------------------------------------------------------