e1ee447b7f
Раскладка (по подтверждённой пробником модели, tests/w3bankgfx): - roomtest переведён на MEMORY=huge: та же small-раскладка резидента (CODE в W1, DATA за ним) плюс банки кода в W3; - guards.c собирается как --bank 1=guards.c — там будет ИИ и боёвка; - СОСТОЯНИЕ стража живёт в W1/W2 (pop_guard.c): писучие статики __banked-модуля линкуются в страницу банка и снаружи не читаются, так что банк — только код; - поля pop_char_t повторяют char_type оригинала (types.h:302), чтобы порт seg005/seg006 ложился один в один. Режим читов (порт cheats_enabled, seg000:111): глобальный флаг pop_cheats, на время разработки включается в main. Реализован один чит — K (kill guard, seg000:786): скелета не берёт, живому стражу ставит guardhp_delta = -guardhp_curr и alive = 0. Обработка по фронту нажатия. Остальные читы оригинала не портированы. Проверено в MAME: приложение в huge-раскладке стартует, комната рисуется, Kid бегает — то есть банкованный pop_guard_tick() зовётся каждый кадр через трамплин и корректно возвращается; K не роняет приложение (стража в комнате пока нет). Банк занят на 6 Б из 16384. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
39 lines
1.0 KiB
C
39 lines
1.0 KiB
C
/*
|
|
* pop_guard.c — состояние стража (W1/W2). См. pop_guard.h.
|
|
* Логика — в банке (guards.c), отрисовка — из главного цикла.
|
|
*/
|
|
#include "pop_guard.h"
|
|
|
|
pop_char_t Guard;
|
|
uint8_t guardhp_curr, guardhp_max;
|
|
int8_t guardhp_delta;
|
|
|
|
uint8_t pop_guard_present(void)
|
|
{
|
|
return (uint8_t)(Guard.charid != 0 && Guard.alive < 0 && guardhp_curr != 0);
|
|
}
|
|
|
|
void pop_guard_reset(void)
|
|
{
|
|
Guard.charid = 0;
|
|
Guard.alive = 0;
|
|
Guard.direction = 0;
|
|
guardhp_curr = 0;
|
|
guardhp_delta = 0;
|
|
}
|
|
|
|
/* kill guard cheat (seg000:786):
|
|
* if (Guard.charid != charid_4_skeleton) {
|
|
* guardhp_delta = -guardhp_curr;
|
|
* Guard.alive = 0;
|
|
* }
|
|
* Скелета чит не убивает — он и в оригинале бессмертен. */
|
|
void pop_guard_kill(void)
|
|
{
|
|
if (Guard.charid == CHARID_4_SKELETON) return;
|
|
if (!pop_guard_present()) return;
|
|
guardhp_delta = (int8_t)-guardhp_curr;
|
|
guardhp_curr = 0;
|
|
Guard.alive = 0;
|
|
}
|