[Decompilation] [th01] Sariel: Spawn ray rendering

So if Sariel's version of this function is worse than Konngara's, can
we conclude that Sariel's code was written first?

(Edit, after having decompiled more of the fight: Sariel's functions
are predominantly `near` in contrast to Konngara's 100% `far` ones,
which is just as much of an indicator for the opposite.)

Part of P0174, funded by Ember2528.
This commit is contained in:
nmlgc 2021-12-27 22:31:23 +01:00
parent c8636aed9b
commit b1ec7fce28
4 changed files with 81 additions and 96 deletions

View File

@ -30,6 +30,7 @@ extern "C" {
#include "th01/formats/stagedat.hpp"
#include "th01/sprites/pellet.h"
#include "th01/sprites/shape8x8.hpp"
#include "th01/main/spawnray.hpp"
#include "th01/main/vars.hpp"
#include "th01/main/boss/entity_a.hpp"
#include "th01/main/stage/palette.hpp"
@ -291,7 +292,8 @@ template <int SnakeCount> struct Snakes {
#define select_for_rank konngara_select_for_rank
#include "th01/main/select_r.cpp"
void pellet_spawnray_unput_and_put(
// Almost identical to Sariel's version. This one is better.
static void spawnray_unput_and_put(
screen_x_t origin_x, vram_y_t origin_y,
screen_x_t target_x, vram_y_t target_y,
int col
@ -299,27 +301,10 @@ void pellet_spawnray_unput_and_put(
{
static screen_x_t target_prev_x = -PIXEL_NONE;
static vram_y_t target_prev_y = -PIXEL_NONE;
if(col == 99) {
target_prev_x = -PIXEL_NONE;
target_prev_y = -PIXEL_NONE;
// Umm, shouldn't we unblit in this case?
return;
}
if(
(target_prev_x != -PIXEL_NONE) && (target_prev_y != -PIXEL_NONE) &&
(target_prev_x >= 0) && (target_prev_x < RES_X) &&
(target_prev_y >= 0) && (target_prev_y < RES_Y)
) {
graph_r_line_unput(origin_x, origin_y, target_prev_x, target_prev_y);
}
if(
(target_x >= 0) && (target_x < RES_X) &&
(target_y >= 0) && (target_y < RES_Y)
) {
graph_r_line(origin_x, origin_y, target_x, target_y, col);
}
target_prev_x = target_x;
target_prev_y = target_y;
spawnray_unput_and_put_func(
target_prev_x, target_prev_y,
origin_x, origin_y, target_x, target_y, col, false
);
}
// Siddhaṃ seed syllables
@ -1032,9 +1017,7 @@ void pattern_four_homing_snakes(void)
inline void swordray_unput_put_and_move(
screen_x_t& end_x, screen_x_t& end_y, screen_x_t delta_x, screen_y_t delta_y
) {
pellet_spawnray_unput_and_put(
SWORD_CENTER_X, SWORD_CENTER_Y, end_x, end_y, 6
);
spawnray_unput_and_put(SWORD_CENTER_X, SWORD_CENTER_Y, end_x, end_y, 6);
// Gimme those original instructions!
if(delta_x < 0) { end_x -= -delta_x; } else { end_x += delta_x; }
if(delta_y < 0) { end_y -= -delta_y; } else { end_y += delta_y; }

View File

@ -23,6 +23,7 @@ extern "C" {
#include "th01/formats/ptn.hpp"
#include "th01/formats/stagedat.hpp"
#include "th01/sprites/pellet.h"
#include "th01/main/spawnray.hpp"
#include "th01/main/vars.hpp"
#include "th01/main/boss/entity_a.hpp"
}
@ -226,3 +227,24 @@ void sariel_free(void)
sariel_grc_free();
ptn_free(PTN_SLOT_BG_ENT);
}
// Almost identical to Konngara's version. This one is worse.
void pascal near spawnray_unput_and_put(
screen_x_t origin_x, vram_y_t origin_y,
screen_x_t target_x, vram_y_t target_y,
int col
)
{
#define target_prev_x spawnray_target_prev_x
#define target_prev_y spawnray_target_prev_y
extern screen_x_t target_prev_x;
extern vram_y_t target_prev_y;
spawnray_unput_and_put_func(
target_prev_x, target_prev_y,
origin_x, origin_y, target_x, target_y, col, true
);
#undef target_prev_x
#undef target_prev_y
}

29
th01/main/spawnray.hpp Normal file
View File

@ -0,0 +1,29 @@
#define spawnray_unput_and_put_func( \
target_prev_x, target_prev_y, \
origin_x, origin_y, target_x, target_y, col, unblit_always \
) { \
if(col == 99) { \
target_prev_x = -PIXEL_NONE; \
target_prev_y = -PIXEL_NONE; \
/* Umm, shouldn't we unblit in this case? */ \
goto spawnray_ret; \
} \
if( \
(unblit_always || \
(target_prev_x != -PIXEL_NONE) && (target_prev_y != -PIXEL_NONE) \
) && \
(target_prev_x >= 0) && (target_prev_x < RES_X) && \
(target_prev_y >= 0) && (target_prev_y < RES_Y) \
) { \
graph_r_line_unput(origin_x, origin_y, target_prev_x, target_prev_y); \
} \
if( \
(target_x >= 0) && (target_x < RES_X) && \
(target_y >= 0) && (target_y < RES_Y) \
) { \
graph_r_line(origin_x, origin_y, target_x, target_y, col); \
} \
target_prev_x = target_x; \
target_prev_y = target_y; \
spawnray_ret: \
}

View File

@ -22432,6 +22432,8 @@ main_36_TEXT segment byte public 'CODE' use16
@wand_bg_snap$qv procdesc near
@wand_bg_put$qv procdesc near
extern @sariel_free$qv:proc
@SPAWNRAY_UNPUT_AND_PUT$QIIIII procdesc pascal near \
origin:Point, target_x:word, target_y:word, col:word
main_36_TEXT ends
main_36__TEXT segment byte public 'CODE' use16
@ -22445,65 +22447,6 @@ sariel_shield equ <boss_entity_0>
sariel_dress equ <boss_anim_0>
sariel_wand equ <boss_anim_1>
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
sub_28948 proc near
@@col = word ptr 4
@@bottom = word ptr 6
@@right = word ptr 8
@@top = word ptr 0Ah
@@left = word ptr 0Ch
push bp
mov bp, sp
push si
push di
mov si, [bp+@@right]
mov di, [bp+@@bottom]
cmp [bp+@@col], 99
jnz short loc_28967
mov point_35DBB.x, 999
mov point_35DBB.y, 999
jmp short loc_289CA
; ---------------------------------------------------------------------------
loc_28967:
cmp point_35DBB.x, 0
jl short loc_2899B
cmp point_35DBB.x, RES_X
jge short loc_2899B
cmp point_35DBB.y, 0
jl short loc_2899B
cmp point_35DBB.y, RES_Y
jge short loc_2899B
call _graph_r_line_unput c, [bp+@@left], [bp+@@top], point_35DBB.x, point_35DBB.y
loc_2899B:
or si, si
jl short loc_289C2
cmp si, RES_X
jge short loc_289C2
or di, di
jl short loc_289C2
cmp di, RES_Y
jge short loc_289C2
call _graph_r_line c, [bp+@@left], [bp+@@top], si, di, [bp+@@col]
loc_289C2:
mov point_35DBB.x, si
mov point_35DBB.y, di
loc_289CA:
pop di
pop si
pop bp
retn 0Ah
sub_28948 endp
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
@ -25550,7 +25493,10 @@ sub_2A69B proc near
mov bp, sp
cmp _boss_phase_frame, 5
jge short loc_2A6B0
call sub_28948 pascal, large 0, large 0, 99
push large 0
push large 0
push 99
call @spawnray_unput_and_put$qiiiii
loc_2A6B0:
cmp _boss_phase_frame, 50
@ -25661,7 +25607,7 @@ loc_2A85B:
jge short loc_2A886
loc_2A863:
call sub_28948 pascal, ((RES_X / 2) shl 16) or 120, point_3B037.x, point_3B037.y, 7
call @spawnray_unput_and_put$qiiiii pascal, ((RES_X / 2) shl 16) or 120, point_3B037.x, point_3B037.y, 7
mov ax, x_3B03D
add point_3B037.x, ax
mov ax, y_3B03B
@ -25789,7 +25735,10 @@ sub_2A949 proc near
push di
cmp _boss_phase_frame, 5
jge short loc_2A960
call sub_28948 pascal, large 0, large 0, 99
push large 0
push large 0
push 99
call @spawnray_unput_and_put$qiiiii
loc_2A960:
cmp _boss_phase_frame, 150
@ -25830,7 +25779,7 @@ loc_2A99E:
sar eax, 8
add ax, 160
mov di, ax
call sub_28948 pascal, ((RES_X / 2) shl 16) or 160, si, ax, 7
call @spawnray_unput_and_put$qiiiii pascal, ((RES_X / 2) shl 16) or 160, si, ax, 7
mov al, byte_3B042
add angle_3B041, al
inc byte_3B042
@ -25848,7 +25797,7 @@ loc_2AA13:
jnz short loc_2AA36
mov si, 999
mov di, 999
call sub_28948 pascal, ((RES_X / 2) shl 16) or 160, si, di, 7
call @spawnray_unput_and_put$qiiiii pascal, ((RES_X / 2) shl 16) or 160, si, di, 7
mov angle_3B041, 0
jmp loc_2ABD8
; ---------------------------------------------------------------------------
@ -26052,7 +26001,7 @@ loc_2AC27:
push ax ; left
call _grc_put_8
add sp, 0Ah
call sub_28948 pascal, ((RES_X / 2) shl 16) or 120, point_3B043.x, point_3B043.y, 7
call @spawnray_unput_and_put$qiiiii pascal, ((RES_X / 2) shl 16) or 120, point_3B043.x, point_3B043.y, 7
loc_2AC8A:
mov ax, _boss_phase_frame
@ -26088,7 +26037,7 @@ loc_2AC8A:
push ax
push point_3B043.y
push 7
call sub_28948
call @spawnray_unput_and_put$qiiiii
cmp grc_image_3B04B, 5
jge short loc_2ACFB
mov ax, grc_image_3B04B
@ -26430,7 +26379,7 @@ loc_2B01A:
push ax ; left
call _grc_put_8
add sp, 12h
call sub_28948 pascal, ((RES_X / 2) shl 16) or 120, x_3B04D, y_3B04F, 7
call @spawnray_unput_and_put$qiiiii pascal, ((RES_X / 2) shl 16) or 120, x_3B04D, y_3B04F, 7
loc_2B07B:
mov ax, _boss_phase_frame
@ -26465,7 +26414,7 @@ loc_2B07B:
push ax
push y_3B04F
push 7
call sub_28948
call @spawnray_unput_and_put$qiiiii
cmp grc_image_3B051, 5
jge short loc_2B0E9
mov ax, grc_image_3B051
@ -27243,7 +27192,7 @@ loc_2B883:
push ax
push point_3B330.x
call _egc_copy_rect_1_to_0_16
call sub_28948 pascal, ((RES_X / 2) shl 16) or 185, point_3B330.x, point_3B330.y, 7
call @spawnray_unput_and_put$qiiiii pascal, ((RES_X / 2) shl 16) or 185, point_3B330.x, point_3B330.y, 7
push 7 ; col
push grc_image_3B334 ; image
push GRC_SLOT_BOSS_1 ; slot
@ -27278,7 +27227,7 @@ loc_2B8E3:
push ax
push point_3B330.y
push 7
call sub_28948
call @spawnray_unput_and_put$qiiiii
push 7 ; col
push grc_image_3B334 ; image
push GRC_SLOT_BOSS_1 ; slot
@ -29911,7 +29860,9 @@ _BG_IMAGES label dword
dd aBoss6_a2_grp ; "BOSS6_A2.GRP"
dd aBoss6_a3_grp ; "BOSS6_A3.GRP"
dd aBoss6_a4_grp ; "BOSS6_A4.GRP"
point_35DBB Point <999, 999>
public _spawnray_target_prev_x, _spawnray_target_prev_y
_spawnray_target_prev_x dw 999
_spawnray_target_prev_y dw 999
dd 0
dd 0
dd 0