diff --git a/applications/PoP/roomtest/pop_bg.c b/applications/PoP/roomtest/pop_bg.c index 0a65782..426132e 100644 --- a/applications/PoP/roomtest/pop_bg.c +++ b/applications/PoP/roomtest/pop_bg.c @@ -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++) diff --git a/applications/PoP/roomtest/pop_bg.h b/applications/PoP/roomtest/pop_bg.h index f3c631d..5c1e230 100644 --- a/applications/PoP/roomtest/pop_bg.h +++ b/applications/PoP/roomtest/pop_bg.h @@ -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/полоса потолка): он выходит за diff --git a/applications/PoP/roomtest/pop_gdraw.c b/applications/PoP/roomtest/pop_gdraw.c index 921857a..74a595a 100644 --- a/applications/PoP/roomtest/pop_gdraw.c +++ b/applications/PoP/roomtest/pop_gdraw.c @@ -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) --- *