Отладочная метка: уровень, комната, режим скорости, бессмертие; дефолт NORMAL
Четыре блока палочками в верхнем борте, каждый своим цветом. Цвета взяты из 0x3A..0x3F — единственного диапазона, который не перезаписывают ни зелья (0x40), ни env/wall тайлсета (0x50/0x60), ни страж (0x90). Прежняя метка комнаты рисовалась цветом 0x57, то есть из env-диапазона: белой она была только в подземелье, во дворце брала цвет тайлсета. Записи палитры — BGR (BIOS $A4), не RGB; читать kid.pal «как привычно» нельзя, цвета выйдут переставленными. Режимы перенумерованы: NORMAL=0, FAST=1, FASTEST=2. Тогда дефолт (crt0 зануляет _DATA) — NORMAL, обход инкрементом даёт NORMAL->FAST->FASTEST, а номер режима + 1 = число палочек.
This commit is contained in:
@@ -13,7 +13,7 @@
|
||||
#include <kbd_raw.h>
|
||||
#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: и вне боя, и в бою */
|
||||
}
|
||||
|
||||
@@ -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) и +/- (обход комнат). */
|
||||
|
||||
@@ -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 <stdio.h> /* puts/printf — сообщения об ошибках загрузки */
|
||||
#include <kbd_raw.h>
|
||||
|
||||
@@ -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--;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user