diff --git a/applications/PoP/roomtest/pop_pace.c b/applications/PoP/roomtest/pop_pace.c index 3491d06..0377422 100644 --- a/applications/PoP/roomtest/pop_pace.c +++ b/applications/PoP/roomtest/pop_pace.c @@ -13,7 +13,7 @@ #include #include "pop_pace.h" -uint8_t pop_speed_mode; /* crt0 зануляет _DATA → FASTEST */ +uint8_t pop_speed_mode; /* crt0 зануляет _DATA → NORMAL */ volatile uint8_t pop_frame_tick; /* Бит 5 порта 0xFE на прошлой выборке: 0 или 0x20. На виду у asm-тела. */ @@ -96,5 +96,5 @@ uint8_t pop_pace_n(uint8_t fight) { if (pop_speed_mode == POP_SPEED_NORMAL) return fight ? 5 : 4; if (pop_speed_mode == POP_SPEED_FAST) return fight ? 4 : 3; - return 3; /* FASTEST */ + return 3; /* FASTEST: и вне боя, и в бою */ } diff --git a/applications/PoP/roomtest/pop_pace.h b/applications/PoP/roomtest/pop_pace.h index bc8850e..be70a04 100644 --- a/applications/PoP/roomtest/pop_pace.h +++ b/applications/PoP/roomtest/pop_pace.h @@ -55,12 +55,15 @@ * 83,3 мс, fight_speed 6 = 100 мс. Условие боя у оригинала одно и * буквальное — «у Кида ВЫНУТ МЕЧ» (Kid.sword == sword_2_drawn), не * «идёт бой» и не «рядом страж»; проверяется в верху главного цикла. */ -#define POP_SPEED_FASTEST 0 /* 3/3 — 61,4 мс; не успели — подтормаживаем */ +/* Нумерация НЕ произвольная: 0 обязан быть дефолтом (crt0 зануляет _DATA), + * а обход по кругу инкрементом даёт ровно NORMAL -> FAST -> FASTEST. + * Заодно номер режима = число палочек в отладочной метке минус один. */ +#define POP_SPEED_NORMAL 0 /* 4/5 — 81,9 / 102,4 мс; повтор оригинала */ #define POP_SPEED_FAST 1 /* 3/4 — 61,4 / 81,9 мс; бой как в оригинале */ -#define POP_SPEED_NORMAL 2 /* 4/5 — 81,9 / 102,4 мс; повтор оригинала */ +#define POP_SPEED_FASTEST 2 /* 3/3 — 61,4 мс; не успели — подтормаживаем */ #define POP_SPEED_MODES 3 -extern uint8_t pop_speed_mode; /* POP_SPEED_*; дефолт — FASTEST */ +extern uint8_t pop_speed_mode; /* POP_SPEED_*; дефолт — NORMAL */ /* Клавиша смены режима по кругу (PS/2 set 2). P — свободна: заняты * K/I/S/L/U/[/] (читы, pop_cheat.h) и +/- (обход комнат). */ diff --git a/applications/PoP/roomtest/roomtest_cold.c b/applications/PoP/roomtest/roomtest_cold.c index 057140b..9026f85 100644 --- a/applications/PoP/roomtest/roomtest_cold.c +++ b/applications/PoP/roomtest/roomtest_cold.c @@ -25,6 +25,7 @@ #include "pop_ctrl.h" /* pop_ctrl_init/close — ввод поднимает и закрывает boot */ #include "pop_vflip.h" /* сброс зеркальных страниц на смене уровня */ #include "pop_cheat.h" /* pop_cheats — режим разработки включает pop_boot */ +#include "pop_pace.h" /* pop_speed_mode — режим скорости в отладочной метке */ #include /* puts/printf — сообщения об ошибках загрузки */ #include @@ -291,27 +292,86 @@ uint8_t pop_dbg_roomnav(uint8_t dir) __banked return 1; } -/* ---- ОТЛАДКА: номер отрисованной комнаты в верхнем борте ------------- */ +/* ---- ОТЛАДКА: состояние прогона в верхнем борте ---------------------- * + * + * Четыре блока ПАЛОЧКАМИ, каждый своим цветом (outtextxy не годится: текст + * тянет системный знакогенератор, _gfx_font_buf — 2 КБ статики в W2, и + * сажает кучу). Двузначные числа — двумя группами: слева десятки, справа + * единицы, || |||| = 24. + * + * жёлтый x 10.. 85 уровень (1..15) + * белый x 100..175 комната (1..24) + * голубой x 190..205 скорость (1 палочка NORMAL, 2 FAST, 3 FASTEST) + * красный x 220..225 бессмертие (палочка есть = включено) + * + * ЦВЕТА — индексы ИГРОВОЙ палитры, и выбраны они не по вкусу, а по двум + * ограничениям. + * + * Первое: записи палитры лежат в ФОРМАТЕ BGR (BIOS $A4), а не RGB — в + * kid.pal 0x3E это `55 ff ff`, то есть жёлтый, а не голубой. Читать файл + * «как привычно» нельзя, цвета выйдут переставленными (на этом я и + * попался в первом заходе). + * + * Второе, важнее: часть палитры ПЕРЕЗАПИСЫВАЕТСЯ на ходу — 0x40..0x4F + * зелья, 0x50..0x5F env, 0x60..0x6F стена (эти два меняются при смене + * ТАЙЛСЕТА, подземелье/дворец), 0x90..0x9F страж. Прежняя метка комнаты + * рисовалась цветом 0x57, то есть из env-диапазона: белой она была только + * в подземелье, а во дворце брала случайный цвет тайлсета. Здесь берём + * только 0x3A..0x3F — их не трогает никто: + * 0x3E жёлтый (255,255,85), 0x3F белый, 0x3B голубой (85,255,255), + * 0x3C красный (226,0,48) — тот же, которым игра даёт вспышку урона. + * + * Перерисовка change-driven: пока ничего из показанного не изменилось, в + * борт не пишем вовсе. Счётчик 2 — обе страницы дабл-буфера. */ -static uint8_t room_label_sig = 0xFF; /* последняя показанная комната */ +static uint8_t room_label_sig = 0xFF; /* последняя показанная комната */ +static uint8_t lvl_label_sig = 0xFF; /* ...уровень */ +static uint8_t spd_label_sig = 0xFF; /* ...режим скорости */ +static uint8_t imm_label_sig = 0xFF; /* ...бессмертие */ static uint8_t room_label_redraw; /* остаток кадров (2 = обе страницы) */ +/* Группа палочек: n штук от x вправо, шаг 5, ширина 2. */ +static void label_bars(int x, uint8_t n) +{ + uint8_t i; + for (i = 0; i < n; i++) bar(x + i * 5, 0, x + 1 + i * 5, 5); +} + void pop_dbg_room_label(uint8_t room) __banked { - uint8_t prev = room_label_sig, i; - room_label_sig = room; /* СНАЧАЛА сохранить (sdcc_z80_cmp_store_a_bug) */ - if (room != prev) room_label_redraw = 2; + /* СНАЧАЛА сохранить, потом сравнивать — обход sdcc_z80_cmp_store_a_bug + * (`if (n != g) g = n;` пишет разность вместо значения). */ + uint8_t prev_room = room_label_sig, prev_lvl = lvl_label_sig; + uint8_t prev_spd = spd_label_sig, prev_imm = imm_label_sig; + uint8_t lvl = pop_current_level, spd = pop_speed_mode, imm = pop_immortal; + room_label_sig = room; + lvl_label_sig = lvl; + spd_label_sig = spd; + imm_label_sig = imm; + if (room != prev_room || lvl != prev_lvl || spd != prev_spd || imm != prev_imm) + room_label_redraw = 2; if (!room_label_redraw) return; - /* Номер ПАЛОЧКАМИ, а не outtextxy: текст тянет системный знакогенератор - * (_gfx_font_buf, 2 КБ статики в W2) и сажает кучу. Слева десятки, - * справа единицы: || |||| = 24. */ + setfillstyle(SOLID_FILL, BLACK); - bar(100, 0, 175, 5); - /* 0x57, а НЕ WHITE: палитра игровая, запись 15 в ней чёрная - * (kid.pal: 0x0F = 0,0,0; чистый белый = 0x57). */ - setfillstyle(SOLID_FILL, 0x57); - for (i = 0; i < (uint8_t)(room / 10); i++) bar(100 + i * 5, 0, 101 + i * 5, 5); - for (i = 0; i < (uint8_t)(room % 10); i++) bar(130 + i * 5, 0, 131 + i * 5, 5); + bar(10, 0, 230, 5); + + setfillstyle(SOLID_FILL, 0x3E); /* уровень — жёлтый */ + label_bars(10, (uint8_t)(lvl / 10)); + label_bars(40, (uint8_t)(lvl % 10)); + + setfillstyle(SOLID_FILL, 0x3F); /* комната — белый */ + label_bars(100, (uint8_t)(room / 10)); + label_bars(130, (uint8_t)(room % 10)); + + /* Скорость: номер режима + 1, то есть NORMAL 1, FAST 2, FASTEST 3 — + * чем больше палочек, тем быстрее (см. нумерацию в pop_pace.h). */ + setfillstyle(SOLID_FILL, 0x3B); /* скорость — голубой */ + label_bars(190, (uint8_t)(spd + 1)); + + if (imm) { /* бессмертие — красный */ + setfillstyle(SOLID_FILL, 0x3C); + label_bars(220, 1); + } room_label_redraw--; }