Клинок расширяет футпринт перерисовки на колонку (redraw_at_char)
Порт seg003:0430 «If char is holding sword, it makes redraw-area bigger»: при Char.sword >= sword_2_drawn футпринт расширяется на одну колонку в сторону взгляда (вправо при dir>=0, влево иначе). У нас char_footprint этого не делал, и клинок торчал на колонку дальше области, где перерисовываются передние грани: меч оставался поверх столба, а его след — на фоне. char_footprint получил параметр sword; pop_fore_over_char — тоже (страж машет мечом ровно так же). Ветка Кида берёт Kid.sword, ветка стража — Guard.sword. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
#include "pop_geom.h"
|
||||
#include "pop_level.h" /* pop_doorlink2 — состояние нажатия кнопки */
|
||||
#include "pop_kid.h" /* Kid.curr_col/curr_row — порядок оверлеев (см. ниже) */
|
||||
#include "pop_guard.h" /* SWORD_2_DRAWN — расширение футпринта под клинок */
|
||||
|
||||
/* ---- Атласы (прямая адресация) ------------------------------------- */
|
||||
static atlas_t env[5];
|
||||
@@ -1547,7 +1548,7 @@ static void other_overlay_tile(int row, int col)
|
||||
static int8_t fp_cL, fp_cR, fp_cLraw, fp_rT, fp_rB, fp_rTraw;
|
||||
|
||||
static void char_footprint(int obj_x, int obj_y, uint16_t w, uint16_t h,
|
||||
int8_t dir)
|
||||
int8_t dir, uint8_t sword)
|
||||
{
|
||||
int wh = (int)((w + 1) >> 1); /* char_width_half */
|
||||
int xl = obj_x / 2 + 58; /* char_x_left (58-база) */
|
||||
@@ -1558,6 +1559,14 @@ static void char_footprint(int obj_x, int obj_y, uint16_t w, uint16_t h,
|
||||
cLraw = col_from_x(xl); /* до клампа: <0 = футпринт за левым швом */
|
||||
cL = cLraw; if (cL < 0) cL = 0; else if (cL > 9) cL = 9;
|
||||
cR = col_from_x(xr); if (cR < 0) cR = 0; else if (cR > 9) cR = 9;
|
||||
/* redraw_at_char (seg003:0430): «If char is holding sword, it makes
|
||||
* redraw-area bigger» — КЛИНОК торчит на колонку дальше габарита кадра,
|
||||
* и без этого расширения передние грани в той колонке не
|
||||
* перерисовываются: меч остаётся поверх столба, а его след — на фоне. */
|
||||
if (sword >= SWORD_2_DRAWN) {
|
||||
if (dir >= 0) { if (++cR > 9) cR = 9; }
|
||||
else { if (--cL < 0) cL = 0; }
|
||||
}
|
||||
/* Порт set_char_collision (seg006:0723): нижний ряд = y_to_row_mod4(obj_y),
|
||||
* причём обёртка -1 (Kid НИЖЕ комнаты — climbdown/провал, obj_y в полосе
|
||||
* «ряд 3») трактуется как ряд 3, НЕ ряд 0. Верхний ряд считается от
|
||||
@@ -1589,7 +1598,7 @@ void pop_fore_over_kid(int obj_x, int obj_y, uint16_t w, uint16_t h,
|
||||
{
|
||||
int8_t cL, cR, cLraw, rT, rB, rTraw, r, c;
|
||||
fclip_on = 1; /* окно = прямоугольник спрайта */
|
||||
char_footprint(obj_x, obj_y, w, h, dir);
|
||||
char_footprint(obj_x, obj_y, w, h, dir, Kid.sword);
|
||||
cL = fp_cL; cR = fp_cR; cLraw = fp_cLraw;
|
||||
rT = fp_rT; rB = fp_rB; rTraw = fp_rTraw;
|
||||
/* set_objtile_at_char (seg006:1833): тайл, при обработке которого спрайт
|
||||
@@ -1673,11 +1682,11 @@ void pop_fore_over_kid(int obj_x, int obj_y, uint16_t w, uint16_t h,
|
||||
* (seq_77..seq_84). Появятся падающие/висящие стражи — тогда и общий
|
||||
* порт redraw_at_char2, а не догадки сейчас. */
|
||||
void pop_fore_over_char(int obj_x, int obj_y, uint16_t w, uint16_t h,
|
||||
int8_t dir) __banked
|
||||
int8_t dir, uint8_t sword) __banked
|
||||
{
|
||||
int8_t r, c;
|
||||
fclip_on = 1; /* окно = прямоугольник спрайта */
|
||||
char_footprint(obj_x, obj_y, w, h, dir);
|
||||
char_footprint(obj_x, obj_y, w, h, dir, sword);
|
||||
gfx_set_bank(GFX_BANK_SPRITE);
|
||||
for (r = fp_rT; r <= fp_rB; r++)
|
||||
for (c = fp_cL; c <= fp_cR; c++)
|
||||
|
||||
@@ -78,7 +78,7 @@ void pop_fore_set_clip(int x, int y, int w, int h) __banked;
|
||||
* вызов стал кроссбанковым и обязан идти через трамплин. Зовётся раз в
|
||||
* кадр, других вызывающих нет — цена одного трамплина здесь не видна. */
|
||||
void pop_fore_over_char(int obj_x, int obj_y, uint16_t w, uint16_t h,
|
||||
int8_t dir) __banked;
|
||||
int8_t dir, uint8_t sword) __banked;
|
||||
|
||||
/* Восстановить фон там, где в прошлых кадрах рисовался ОВЕРЛЕЙ
|
||||
* (draw_other_overlay/floor_overlay/полоса потолка): он выходит за
|
||||
|
||||
@@ -157,7 +157,7 @@ void pop_guard_draw(void) __banked
|
||||
* (seg008:690 draw_tile_fore). Без этого страж виден сквозь передний
|
||||
* столб. */
|
||||
if (w && h)
|
||||
pop_fore_over_char(fp_x, obj_y, w, h, Guard.direction);
|
||||
pop_fore_over_char(fp_x, obj_y, w, h, Guard.direction, Guard.sword);
|
||||
}
|
||||
|
||||
/* ---- Индикаторы HP (порт draw_kid_hp / draw_guard_hp, seg000:1416) --- *
|
||||
|
||||
Reference in New Issue
Block a user