PoP: roomtest — объекты/обломки/переходы комнат + арт
Порт Prince of Persia (applications/PoP/roomtest): развитие уровня, объекты (loose-полы/обломки), переходы между комнатами, фон-упаковка; планы (room_model/size_optimization), bug_list, pop_trob. Арт third_party/16x16-RPG-characters. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include "pop_bg.h"
|
||||
#include "pop_level.h" /* pop_doorlink2 — состояние нажатия кнопки */
|
||||
|
||||
/* ---- Атласы (прямая адресация) ------------------------------------- */
|
||||
static atlas_t env[5];
|
||||
@@ -44,20 +45,36 @@ void pop_bg_free(void)
|
||||
atlas_free(&fore_at);
|
||||
}
|
||||
|
||||
/* Верхний клип блитов фона (ЭКРАННАЯ y): !=0 — строки кадра с screen_y <
|
||||
* g_clip_top не рисуются (частичным блитом со сдвигом источника). Нужно
|
||||
* полосе кладки у потолка (row<0): высокие кадры не должны лезть в верхний
|
||||
* борт (за пределы игрового поля). 0 — без клипа. */
|
||||
static int g_clip_top;
|
||||
|
||||
/* Блит ленты idx атласа a: НИЗ спрайта на ybottom, левый край x,
|
||||
* прозрачно (0xFF). w/h читаются из getimage-заголовка ленты (в W0). */
|
||||
* прозрачно (0xFF). w/h читаются из getimage-заголовка ленты (в W0).
|
||||
* При g_clip_top рисуем только часть кадра ниже границы (gfx_blit_part). */
|
||||
static void blit_b(atlas_t *a, uint8_t idx, int x, int ybottom)
|
||||
{
|
||||
const uint8_t *img;
|
||||
uint16_t w, h;
|
||||
int top;
|
||||
if (idx >= a->count)
|
||||
return;
|
||||
img = (const uint8_t *)atlas_image(a, idx);
|
||||
gfx_w0_map(a->page);
|
||||
w = (uint16_t)(img[0] | ((uint16_t)img[1] << 8));
|
||||
h = (uint16_t)(img[2] | ((uint16_t)img[3] << 8));
|
||||
if (w && h)
|
||||
gfx_blit(x, ybottom - (int)h + 1 + POP_YOFF, img); /* +YOFF: центрирование */
|
||||
top = ybottom - (int)h + 1 + POP_YOFF; /* +YOFF: центрирование */
|
||||
if (w && h) {
|
||||
if (g_clip_top && top < g_clip_top) {
|
||||
int sy = g_clip_top - top; /* пропустить верхние строки */
|
||||
if (sy < (int)h)
|
||||
gfx_blit_part(x, g_clip_top, img, 0, sy, (int)w, (int)h - sy);
|
||||
} else {
|
||||
gfx_blit(x, top, img);
|
||||
}
|
||||
}
|
||||
gfx_w0_unmap();
|
||||
}
|
||||
|
||||
@@ -116,6 +133,8 @@ static const uint8_t WALL_FRAM_BOTTOM[4] = {7, 9, 5, 3};
|
||||
static const uint8_t WALL_FRAM_MAIN[4] = {8, 10, 6, 4};
|
||||
static const uint8_t DOOR_FRAM_SLICE[9] = {67, 59, 58, 57, 56, 55, 54, 53, 52};
|
||||
static const uint8_t SPIKES_FRAM_RIGHT[10] = {0, 134, 135, 136, 137, 138, 137, 135, 134, 0};
|
||||
static const uint8_t SPIKES_FRAM_LEFT[10] = {0, 128, 129, 130, 131, 132, 131, 129, 128, 0};
|
||||
static const uint8_t SPIKES_FRAM_FORE[10] = {0, 139, 140, 141, 142, 143, 142, 140, 139, 0};
|
||||
static const uint8_t BLUELINE_FRAM1[4] = {0, 124, 125, 126};
|
||||
static const int8_t BLUELINE_FRAM_Y[4] = {0, -20, -20, 0};
|
||||
static const uint8_t BLUELINE_FRAM3[4] = {44, 44, 45, 45};
|
||||
@@ -133,6 +152,7 @@ static const uint8_t RPOS[4] = {52, 42, 31, 21};
|
||||
/* ---- Текущая комната (globals для tile_code/mod) ------------------- */
|
||||
static const uint8_t *g_fg, *g_bg, *g_lfg, *g_lbg;
|
||||
static const uint8_t *g_below; /* row0-коды комнаты СНИЗУ (для topright под нижним рядом) */
|
||||
static const uint8_t *g_above, *g_abovemod; /* row2 fg/mod комнаты СВЕРХУ (полоса кладки у потолка) */
|
||||
static uint8_t g_room;
|
||||
|
||||
/* Задать ряд 0 комнаты снизу (fg-коды) — нужен для draw_tile_topright/
|
||||
@@ -141,13 +161,22 @@ static uint8_t g_room;
|
||||
* снизу (кромка уровня = стена). */
|
||||
void pop_room_set_below(const uint8_t *below_row0_fg) { g_below = below_row0_fg; }
|
||||
|
||||
/* Задать ряд 2 (fg-коды + модификаторы) комнаты СВЕРХУ — для полосы кладки
|
||||
* у потолка (seg008 draw_room: доп. верхний ряд из room_A, draw_tile_aboveroom
|
||||
* при draw_main_y=-1). 0 — нет комнаты сверху (кромка уровня → пол). */
|
||||
void pop_room_set_above(const uint8_t *above_row2_fg, const uint8_t *above_row2_mod)
|
||||
{ g_above = above_row2_fg; g_abovemod = above_row2_mod; }
|
||||
|
||||
static uint8_t tile_code(int row, int col)
|
||||
{
|
||||
if (col < 0) {
|
||||
if (g_lfg && row >= 0 && row < 3) return g_lfg[row];
|
||||
return 20; /* уровневая кромка = стена */
|
||||
}
|
||||
if (row < 0) return 1; /* верхняя кромка = пол */
|
||||
if (row < 0) { /* верхняя полоса: ряд 2 комнаты сверху */
|
||||
if (row == -1 && g_above && col < 10) return g_above[col];
|
||||
return 1; /* нет комнаты сверху → пол (кромка) */
|
||||
}
|
||||
if (row > 2 || col > 9) return 20;
|
||||
return g_fg[row * 10 + col];
|
||||
}
|
||||
@@ -158,6 +187,7 @@ static uint8_t tile_mod(int row, int col)
|
||||
if (g_lbg && row >= 0 && row < 3) return g_lbg[row];
|
||||
return 0;
|
||||
}
|
||||
if (row == -1 && g_abovemod && col < 10) return g_abovemod[col];
|
||||
if (row < 0 || row > 2 || col > 9) return 0;
|
||||
return g_bg[row * 10 + col];
|
||||
}
|
||||
@@ -213,7 +243,9 @@ static void wall_pattern(int row, int col, int which_part)
|
||||
uint16_t mid_div, mid_off, bot_div, bot_off;
|
||||
uint8_t bg;
|
||||
|
||||
rnd_seed = (unsigned long)(g_room + TBL_LINE[row] + col);
|
||||
/* Верхняя полоса (row<0): SDLPoP рисует её как ряд 2 комнаты сверху
|
||||
* (drawn_row=2 для seed, draw_main_y=-1 для позиции) — seed по row 2. */
|
||||
rnd_seed = (unsigned long)(g_room + TBL_LINE[row < 0 ? 2 : row] + col);
|
||||
prandom(1); /* сброс */
|
||||
mid_div = prandom(1);
|
||||
mid_off = prandom(4);
|
||||
@@ -321,6 +353,14 @@ static void draw_tile(int row, int col)
|
||||
uint8_t code = tile_code(row, col);
|
||||
uint8_t lcode = tile_code(row, col - 1);
|
||||
uint8_t lmod = tile_mod(row, col - 1);
|
||||
/* Нажатая кнопка (seg008 get_tile_to_draw): при таймере связи >1 opener
|
||||
* (0x0F) рисуется как ПОЛ (modif 0), closer (0x06) — как stuck (0x05).
|
||||
* Модификатор кнопки = индекс LINKLOC. И для самого тайла, и для левого
|
||||
* соседа (его правая грань). */
|
||||
if (code == 0x0F) { if ((pop_doorlink2(tile_mod(row, col)) & 0x1F) > 1) code = 1; }
|
||||
else if (code == 0x06) { if ((pop_doorlink2(tile_mod(row, col)) & 0x1F) > 1) code = 5; }
|
||||
if (lcode == 0x0F) { if ((pop_doorlink2(lmod) & 0x1F) > 1) { lcode = 1; lmod = 0; } }
|
||||
else if (lcode == 0x06) { if ((pop_doorlink2(lmod) & 0x1F) > 1) lcode = 5; }
|
||||
int xh = COL_XH[col];
|
||||
int x = xh * 8;
|
||||
int dby = 63 * row + 65;
|
||||
@@ -367,15 +407,19 @@ static void draw_tile(int row, int col)
|
||||
}
|
||||
}
|
||||
|
||||
/* --- draw_tile_anim_right (seg008.c:530) — статичные части --- */
|
||||
if (lcode == 4) { /* gate: решётка */
|
||||
draw_gate_back(lmod, xh, dby, dmy);
|
||||
} else if (lcode == 11) { /* loose: правая грань (анимир. по modif соседа-loose) */
|
||||
env_b(LOOSE_FRAM_RIGHT[get_loose_frame(pop_loose_modif[row * 10 + (col - 1)])], x, dby - 1);
|
||||
} else if (lcode == 2) { /* spike: статич. кадр */
|
||||
uint8_t sf = (lmod & 0x80) ? 5 : lmod;
|
||||
if (sf < 10 && SPIKES_FRAM_RIGHT[sf])
|
||||
env_b(SPIKES_FRAM_RIGHT[sf], x, dmy - 7);
|
||||
/* --- draw_tile_anim_right (seg008.c:530) — статичные части. Для
|
||||
* верхней полосы (row<0, draw_tile_aboveroom) НЕ рисуется + защита от
|
||||
* отрицательного индекса в pop_loose_modif. --- */
|
||||
if (row >= 0) {
|
||||
if (lcode == 4) { /* gate: решётка */
|
||||
draw_gate_back(lmod, xh, dby, dmy);
|
||||
} else if (lcode == 11) { /* loose: правая грань (анимир. по modif соседа-loose) */
|
||||
env_b(LOOSE_FRAM_RIGHT[get_loose_frame(pop_loose_modif[row * 10 + (col - 1)])], x, dby - 1);
|
||||
} else if (lcode == 2) { /* spike: статич. кадр */
|
||||
uint8_t sf = (lmod & 0x80) ? 5 : lmod;
|
||||
if (sf < 10 && SPIKES_FRAM_RIGHT[sf])
|
||||
env_b(SPIKES_FRAM_RIGHT[sf], x, dmy - 7);
|
||||
}
|
||||
}
|
||||
|
||||
/* --- draw_tile_bottom (seg008.c:570) --- */
|
||||
@@ -387,12 +431,16 @@ static void draw_tile(int row, int col)
|
||||
env_b(t->bottom_id, x, dby);
|
||||
}
|
||||
|
||||
/* --- draw_loose (seg008.c:600) — нижняя грань (анимир. по modif) --- */
|
||||
/* --- draw_loose (seg008.c:600) — нижняя грань (анимир. по modif). В
|
||||
* верхней полосе (row<0) loose ряда 2 верхнего соседа рисуем статически
|
||||
* (кадр покоя 43): анимацию/разбитость соседа мы не тянем. --- */
|
||||
if (code == 11)
|
||||
env_b(LOOSE_FRAM_BOTTOM[get_loose_frame(pop_loose_modif[row * 10 + col])], x, dby);
|
||||
env_b(row >= 0 ? LOOSE_FRAM_BOTTOM[get_loose_frame(pop_loose_modif[row * 10 + col])]
|
||||
: LOOSE_FRAM_BOTTOM[0], x, dby);
|
||||
|
||||
/* --- draw_tile_base (seg008.c:611) --- */
|
||||
{
|
||||
/* --- draw_tile_base (seg008.c:611). Верхняя полоса (row<0) базу НЕ
|
||||
* рисует (draw_tile_aboveroom) — только нижние/правые грани. --- */
|
||||
if (row >= 0) {
|
||||
uint8_t base_id = t->base_id;
|
||||
if (code == 11) /* loose: левая грань (анимир.) */
|
||||
base_id = LOOSE_FRAM_LEFT[get_loose_frame(pop_loose_modif[row * 10 + col])];
|
||||
@@ -400,6 +448,17 @@ static void draw_tile(int row, int col)
|
||||
env_b(base_id, x, t->base_y + dmy);
|
||||
}
|
||||
|
||||
/* --- draw_tile_anim (seg008.c:0B2B) — левый кадр выдвинутых пик в
|
||||
* СВОЕЙ ячейке (анимир. по своему modif). Без него остриё пики
|
||||
* рисуется только правым соседом со сдвигом → шахта над самой пикой
|
||||
* пустая. */
|
||||
if (row >= 0 && code == 2) {
|
||||
uint8_t sm = tile_mod(row, col);
|
||||
uint8_t sf = (sm & 0x80) ? 5 : sm;
|
||||
if (sf > 0 && sf < 10 && SPIKES_FRAM_LEFT[sf])
|
||||
env_b(SPIKES_FRAM_LEFT[sf], x, dmy - 2);
|
||||
}
|
||||
|
||||
/* --- draw_tile_fore (seg008.c:690) --- */
|
||||
if (code == 20) {
|
||||
wmod = wall_modifier(row, col);
|
||||
@@ -431,6 +490,75 @@ void pop_loose_shake_draw(int row, int col)
|
||||
gfx_set_bank(GFX_BANK_NORMAL);
|
||||
}
|
||||
|
||||
/* Перерисовать пики тайла (row,col) на back-странице по ЖИВОМУ modif
|
||||
* (pop_trob). Кадр выдвижения рисует ПРАВЫЙ сосед (draw_tile ветка lcode==2
|
||||
* читает lmod = g_bg[row*10+col] = живой modif пики). g_bg должен указывать
|
||||
* на room_modif (enter_room передаёт его как bg). Порт redraw_21h/draw_tile.
|
||||
* heal берёт печёный статич. фон, поверх — динамич. кадр (шипы над полом). */
|
||||
void pop_spike_redraw(int row, int col)
|
||||
{
|
||||
int x = COL_XH[col] * 8;
|
||||
int dmy = 63 * row + 62; /* как в draw_tile (dby-3) */
|
||||
uint8_t sm = g_bg[row * 10 + col]; /* живой modif пики (room_modif) */
|
||||
uint8_t sf = (sm & 0x80) ? 5 : sm; /* видимый кадр (hold 0x80..0x8F → 5) */
|
||||
/* Шипы выдвигаются выше линии пола (env_b на dmy-7) — heal с запасом
|
||||
* вверх (63*row+34 .. +74) покрывает и остриё, и сам пол; ширина 64 =
|
||||
* тайл + правый сосед (остриё рисуется в его ячейке).
|
||||
* heal вернул из ОЗУ-копии ВЕСЬ печёный статичный фон (база пик 127, пол,
|
||||
* грани соседей — всё, что рисовал бы полный draw_tile при modif=0).
|
||||
* Единственное, что реально анимируется — два спрайта острия (LEFT в своей
|
||||
* ячейке + RIGHT в соседней, оба по sf). Поэтому вместо 2×draw_tile
|
||||
* (десятки блитов статики поверх идентичного фона = идемпотентно) рисуем
|
||||
* РОВНО эти два острия — пиксель-в-пиксель тот же результат, во много раз
|
||||
* дешевле (порт redraw_21h: draw_tile_anim + draw_tile_anim_right). */
|
||||
heal_off(x, 63 * row + 34, 64, 40);
|
||||
gfx_set_bank(GFX_BANK_SPRITE);
|
||||
if (sf > 0 && sf < 10) {
|
||||
if (SPIKES_FRAM_LEFT[sf]) /* остриё в своей ячейке */
|
||||
env_b(SPIKES_FRAM_LEFT[sf], x, dmy - 2);
|
||||
if (col + 1 < 10 && SPIKES_FRAM_RIGHT[sf]) /* остриё в ячейке соседа */
|
||||
env_b(SPIKES_FRAM_RIGHT[sf], COL_XH[col + 1] * 8, dmy - 7);
|
||||
}
|
||||
gfx_set_bank(GFX_BANK_NORMAL);
|
||||
}
|
||||
|
||||
/* Перерисовать ЛЕВЫЙ шов (col0) на back-странице по живому modif соседа —
|
||||
* ворота соседней комнаты слева (portcullis room8) видны в col0 текущей
|
||||
* комнаты через draw_gate_back (draw_tile ветка lcode==4, lmod = g_lbg[0]).
|
||||
* g_lbg (lcol_bg) должен указывать на живой modif (roomtest обновляет из
|
||||
* room_modif соседа перед вызовом). Bar-в-чёрный + redraw (как loose bake):
|
||||
* heal вернул бы ЗАПЕЧЁННОЕ состояние ворот → при открытии нижние бары
|
||||
* оставались бы; чёрная плита стирает старые бары в VRAM+ОЗУ-копию. */
|
||||
void pop_room_redraw_seam_left(void)
|
||||
{
|
||||
gfx_set_bank(GFX_BANK_NORMAL);
|
||||
setfillstyle(SOLID_FILL, BLACK);
|
||||
bar(0, POP_YOFF, 31, POP_YOFF + 64); /* col0, ряд 0 (бары ворот) */
|
||||
gfx_set_bank(GFX_BANK_TRANSPARENT);
|
||||
draw_tile(0, 0); /* фон col0 + бары ворот (живой modif) */
|
||||
gfx_set_bank(GFX_BANK_NORMAL);
|
||||
}
|
||||
|
||||
/* Перерисовать тайл КНОПКИ (row,col) на back-странице: нажатая/отжатая
|
||||
* (draw_tile подставляет пол/stuck по таймеру связи). Bar-в-чёрный +
|
||||
* redraw — иначе «шишка» отжатой кнопки (base 147) осталась бы при переходе
|
||||
* в пол. Звать из pop_process_trobs для кнопок текущей комнаты. */
|
||||
void pop_button_redraw(int row, int col)
|
||||
{
|
||||
int x = COL_XH[col] * 8;
|
||||
int yb = POP_YOFF + 63 * row;
|
||||
/* Wipe СВОЕЙ ячейки + правой грани кнопки (заходит в 0,3) + перерисовка
|
||||
* пола. НИЗ строго yb+64 (≈ низ передней грани пола): ниже — СТЕНА ряда 1
|
||||
* (высокий спрайт), которую тут не перерисовываем → иначе чёрный бар. */
|
||||
gfx_set_bank(GFX_BANK_NORMAL);
|
||||
setfillstyle(SOLID_FILL, BLACK);
|
||||
bar(x, yb + 26, x + 59, yb + 64);
|
||||
gfx_set_bank(GFX_BANK_TRANSPARENT);
|
||||
draw_tile(row, col);
|
||||
if (col + 1 < 10) draw_tile(row, col + 1);
|
||||
gfx_set_bank(GFX_BANK_NORMAL);
|
||||
}
|
||||
|
||||
/* Запечь ПУСТОТУ на месте упавшего loose (текущая страница). Порт
|
||||
* redraw_at_cur_mob (seg007:132C): перерисовать сам тайл (теперь empty) И
|
||||
* тайл СПРАВА (его левая грань зависит от нашего кода: пока был loose —
|
||||
@@ -571,6 +699,14 @@ void pop_room_draw(uint8_t room_num,
|
||||
for (row = 2; row >= 0; row--) /* снизу вверх (2,1,0) */
|
||||
for (col = 0; col < 10; col++)
|
||||
draw_tile(row, col);
|
||||
/* Полоса кладки у потолка (seg008 draw_room: доп. ряд из room_A, row2
|
||||
* при draw_main_y=-1): нижние/правые грани ряда 2 комнаты сверху. Кадры
|
||||
* высокие — верх ушёл бы в борт (за поле); клип по верхней границе поля
|
||||
* (POP_YOFF) рисует ТОЛЬКО срез у потолка, без зачернения борта. */
|
||||
g_clip_top = POP_YOFF;
|
||||
for (col = 0; col < 10; col++)
|
||||
draw_tile(-1, col);
|
||||
g_clip_top = 0;
|
||||
gfx_set_bank(GFX_BANK_NORMAL);
|
||||
}
|
||||
|
||||
@@ -598,7 +734,13 @@ static int8_t y_to_row(int y) /* y_to_row_mod4 (seg006, TILE_SIZEY=
|
||||
static void fore_tile(int row, int col) /* передний слой одного тайла */
|
||||
{
|
||||
uint8_t code = tile_code(row, col);
|
||||
const piece *t = &tile_table[code];
|
||||
const piece *t;
|
||||
/* Нажатая кнопка → пол/stuck (как get_tile_to_draw), ИНАЧЕ fore рисует
|
||||
* переднюю грань КНОПКИ (bottom_id 149) поверх Kid, перекрывая уже
|
||||
* нарисованную грань пола 43 → «остаток нажатой кнопки» на грани. */
|
||||
if (code == 0x0F) { if ((pop_doorlink2(tile_mod(row, col)) & 0x1F) > 1) code = 1; }
|
||||
else if (code == 0x06) { if ((pop_doorlink2(tile_mod(row, col)) & 0x1F) > 1) code = 5; }
|
||||
t = &tile_table[code];
|
||||
int x = COL_XH[col] * 8;
|
||||
int dmy = 63 * row + 62;
|
||||
int dby = dmy + 3; /* = 63*row+65 (draw_tile_bottom) */
|
||||
@@ -611,6 +753,12 @@ static void fore_tile(int row, int col) /* передний слой одно
|
||||
} else {
|
||||
if (t->bottom_id) /* передняя кромка пола (draw_tile_bottom) */
|
||||
env_b(t->bottom_id, x, dby);
|
||||
if (code == 2) { /* пики: fore-кадр поверх Kid (напоротый) */
|
||||
uint8_t sm = tile_mod(row, col);
|
||||
uint8_t sf = (sm & 0x80) ? 5 : sm;
|
||||
if (sf > 0 && sf < 10 && SPIKES_FRAM_FORE[sf])
|
||||
env_b(SPIKES_FRAM_FORE[sf], x, dmy - 2);
|
||||
}
|
||||
if (t->fore_id) /* передние объекты: колонны/ворота/щебень */
|
||||
fore_b(t->fore_id, t->fore_x * 8 + x, t->fore_y + dmy);
|
||||
}
|
||||
@@ -665,10 +813,11 @@ void pop_fore_over_kid(int obj_x, int obj_y, uint16_t w, uint16_t h,
|
||||
int wh = (int)((w + 1) >> 1); /* char_width_half */
|
||||
int xl = obj_x / 2 + 58; /* char_x_left (58-база) */
|
||||
int xr;
|
||||
int8_t cL, cR, rT, rB, r, c;
|
||||
int8_t cL, cR, cLraw, rT, rB, r, c;
|
||||
if (dir >= 0) xl -= wh; /* лицом вправо: левый край внутрь */
|
||||
xr = xl + wh;
|
||||
cL = col_from_x(xl); if (cL < 0) cL = 0; else if (cL > 9) cL = 9;
|
||||
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;
|
||||
/* Порт set_char_collision (seg006:0723): нижний ряд = y_to_row_mod4(obj_y),
|
||||
* причём обёртка -1 (Kid НИЖЕ комнаты — climbdown/провал, obj_y в полосе
|
||||
@@ -695,6 +844,17 @@ void pop_fore_over_kid(int obj_x, int obj_y, uint16_t w, uint16_t h,
|
||||
for (r = rT; r <= rB; r++)
|
||||
for (c = cL; c <= cR; c++)
|
||||
fore_tile(r, c);
|
||||
/* Шовная окклюзия ворот (порт redraw_at_char для шва): футпринт зашёл за
|
||||
* ЛЕВЫЙ шов (cLraw<0) и у соседа слева в этом ряду решётка ворот (код 4) —
|
||||
* перерисовать её бары ПОВЕРХ Kid. Иначе Kid, стоя за закрытыми воротами
|
||||
* (col-1), рисуется поверх решётки. Бары = draw_gate_back по живому modif
|
||||
* соседа (g_lbg = lcol_bg, openness). */
|
||||
if (cLraw < 0 && g_lfg)
|
||||
for (r = rT; r <= rB; r++)
|
||||
if ((g_lfg[r] & 0x1F) == 4) {
|
||||
int dby = 63 * r + 65;
|
||||
draw_gate_back(g_lbg ? g_lbg[r] : 0, COL_XH[0], dby, dby - 3);
|
||||
}
|
||||
if (frame >= 137 && frame <= 144) { /* подъём: пол назначения поверх Kid */
|
||||
uint8_t fidx = (uint8_t)(frame - 137);
|
||||
for (r = rT; r <= rB; r++)
|
||||
|
||||
Reference in New Issue
Block a user