Фикс переворота: отсев тайлов по fore-окну — в ЛОГИЧЕСКИХ координатах
Симптом (нашёл пользователь, ур. 9): в перевёрнутом виде Кид рисуется ПЕРЕД передней колонной — передние грани его больше не перекрывают. Причина: окно fore-клипа задаётся прямоугольником уже перевёрнутого спрайта, то есть в ЭКРАННЫХ координатах, а весь отсев «задевает ли ТАЙЛ окно» считает позицию тайла из его РЯДА (63*row + …) — величину логическую, от переворота не зависящую. Сравнивались разные системы координат, и выбрасывались ровно те тайлы, что должны лечь поверх персонажа. Заведена вторая пара границ того же окна — pop_t_fclip_ly0/ly1 (логические, ставятся в pop_fore_set_clip). По ней теперь идут ВСЕ отсевы по тайлам: tile_in_fclip, грубый отсев в pop_blit_b, wp_vis, wpp_fill и отсев кладки в pop_wall_b, а также выбор диапазона рядов в pop_fore_over_char. Экранная пара осталась там, где режется сам блит (он работает с уже перевёрнутым прямоугольником). Проверено в MAME: колонна снова перекрывает перевёрнутого Кида. tests-host 6/6.
This commit is contained in:
@@ -34,6 +34,14 @@ pop_rnd_t pop_t_seed;
|
||||
|
||||
int pop_t_clip_top;
|
||||
int pop_t_fclip_x0, pop_t_fclip_y0, pop_t_fclip_x1, pop_t_fclip_y1;
|
||||
/* ТО ЖЕ ОКНО В ЛОГИЧЕСКИХ (неперевёрнутых) координатах. Экранная пара нужна
|
||||
* для клипа самого блита — он режет уже перевёрнутый прямоугольник; а вот
|
||||
* ОТСЕВ ТАЙЛОВ идёт по позиции тайла в комнате (63*row + …), и она от
|
||||
* переворота не зависит. Пока пара была одна, при pop_upside отсев сравнивал
|
||||
* логический y тайла с зеркальным окном и выбрасывал именно те тайлы, что
|
||||
* должны лечь ПОВЕРХ персонажа: передняя грань колонны переставала рисоваться
|
||||
* и Кид оказывался перед ней (найдено пользователем на уровне 9). */
|
||||
int pop_t_fclip_ly0, pop_t_fclip_ly1;
|
||||
uint8_t pop_t_fclip_on;
|
||||
uint8_t pop_t_bake_rest;
|
||||
|
||||
@@ -332,8 +340,8 @@ void pop_blit_b(atlas_t *a, uint8_t idx, int x, int ybottom)
|
||||
* atlas_image, ни за map/unmap. */
|
||||
if (pop_t_fclip_on &&
|
||||
(x >= pop_t_fclip_x1 || x + 64 <= pop_t_fclip_x0 ||
|
||||
ybottom + POP_YOFF + 1 <= pop_t_fclip_y0 ||
|
||||
ybottom + POP_YOFF - 64 >= pop_t_fclip_y1))
|
||||
ybottom + POP_YOFF + 1 <= pop_t_fclip_ly0 ||
|
||||
ybottom + POP_YOFF - 64 >= pop_t_fclip_ly1))
|
||||
return;
|
||||
img = (const uint8_t *)atlas_image(a, idx);
|
||||
gfx_w0_map(a->page);
|
||||
@@ -476,6 +484,12 @@ void pop_fore_set_clip(int x, int y, int w, int h)
|
||||
{
|
||||
pop_t_fclip_x0 = x; pop_t_fclip_y0 = y;
|
||||
pop_t_fclip_x1 = x + w; pop_t_fclip_y1 = y + h;
|
||||
if (pop_upside) { /* вернуть окно в неперевёрнутый вид */
|
||||
pop_t_fclip_ly0 = 2 * POP_YOFF + POP_PLAYFIELD_H - (y + h);
|
||||
pop_t_fclip_ly1 = 2 * POP_YOFF + POP_PLAYFIELD_H - y;
|
||||
} else {
|
||||
pop_t_fclip_ly0 = y; pop_t_fclip_ly1 = y + h;
|
||||
}
|
||||
}
|
||||
|
||||
/* Ряд 0 комнаты СНИЗУ (fg-коды) — нужен draw_tile_topright/floorright, когда
|
||||
|
||||
Reference in New Issue
Block a user