PoP roomtest: выпивание зелья (уровень 1 — склянка здоровья)
Каркас предметов уже был (check_get_item/do_pickup/proc_get_object), пустой оставалась только ветка зелий. Порт seg005 get_item + seg006 proc_get_object: - pop_get_item_action теперь отдаёт 3 = «пить» и делает do_pickup с ТИПОМ зелья, который лежит в старших битах модификатора тайла (modif >> 3); - pop_ctrl на код 3 запускает seq_78_drink; - эффекты: тип 1 (здоровье) — +1 HP через hitp_delta и красная вспышка, причём как в оригинале только если HP не полные; тип 5 («злое») — −1 HP. Типы 2/3/4/6 (жизнь, перо, переворот, открыть ворота) — свойства поздних уровней, портируем вместе с ними. Вспышка фона получила цвет: меч даёт ярко-жёлтую (было), зелье — красную (flash_color оригинала; двух значений достаточно, других в игре нет). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -809,6 +809,9 @@ uint8_t pop_down_action(void) __banked
|
||||
uint8_t pop_have_sword;
|
||||
uint8_t pop_item_taken; /* 0 = нет; иначе tilepos+1 поднятого */
|
||||
uint8_t pop_flash_time; /* кадров вспышки фона (flash_time) */
|
||||
/* Цвет вспышки: 0 = ярко-жёлтая (меч), 1 = красная (зелье). В оригинале это
|
||||
* flash_color; нам хватает двух значений, которые реально встречаются. */
|
||||
uint8_t pop_flash_red;
|
||||
static int8_t pickup_obj_type; /* -1 = меч (порт pickup_obj_type) */
|
||||
|
||||
/* do_pickup (seg006:1671): стереть предмет с карты (тайл → пол) и запомнить
|
||||
@@ -832,7 +835,29 @@ void pop_proc_get_object(void) __banked
|
||||
* чёрное поле экрана. У нас так же (gfx_pal_set 0), см. roomtest. */
|
||||
pop_flash_time = 8;
|
||||
}
|
||||
pickup_obj_type = 0; /* зелья (типы 1..6) не портированы */
|
||||
else {
|
||||
/* proc_get_object (seg006:1927), ветка зелий. Типы 3/4/6
|
||||
* (перо/переворот/открыть все ворота) — свойства поздних уровней,
|
||||
* их портируем вместе с этими уровнями. */
|
||||
switch (pickup_obj_type) {
|
||||
case 1: /* здоровье: +1 HP, красная вспышка */
|
||||
if (hitp_curr != hitp_max) {
|
||||
hitp_delta = 1;
|
||||
pop_flash_red = 1;
|
||||
pop_flash_time = 2;
|
||||
}
|
||||
break;
|
||||
case 5: /* «злое» зелье: −1 HP */
|
||||
hitp_delta = -1;
|
||||
pop_flash_red = 1;
|
||||
pop_flash_time = 2;
|
||||
break;
|
||||
default: /* 2 жизнь / 3 перо / 4 переворот /
|
||||
* 6 открыть — TODO с их уровнями */
|
||||
break;
|
||||
}
|
||||
}
|
||||
pickup_obj_type = 0;
|
||||
}
|
||||
|
||||
/* check_get_item + get_item (seg005:061F/073E). Возврат: 0 — предмета нет
|
||||
@@ -861,9 +886,17 @@ uint8_t pop_get_item_action(void) __banked
|
||||
Kid.x = (uint8_t)char_dx_forward((int8_t)((t == TILE_POTION) - 2));
|
||||
return 1;
|
||||
}
|
||||
if (t != TILE_SWORD) return 0; /* питьё зелий не портировано */
|
||||
do_pickup(-1, (uint8_t)(Kid.curr_row * 10 + icol));
|
||||
return 2;
|
||||
{
|
||||
uint8_t tp = (uint8_t)(Kid.curr_row * 10 + icol);
|
||||
if (t == TILE_SWORD) {
|
||||
do_pickup(-1, tp);
|
||||
return 2; /* поднять меч (seq_91) */
|
||||
}
|
||||
/* Зелье: тип лежит в СТАРШИХ битах модификатора (get_item,
|
||||
* seg005: do_pickup(curr_room_modif[curr_tilepos] >> 3)). */
|
||||
do_pickup((int8_t)(pop_trob_modif(g_room)[tp] >> 3), tp);
|
||||
return 3; /* пить (seq_78) */
|
||||
}
|
||||
}
|
||||
|
||||
/* ---- Диспетчер ----------------------------------------------------- */
|
||||
|
||||
Reference in New Issue
Block a user