feat(mummy): naix en SPAWN, llig spawn.duration_s del YAML
La mòmia ara entra a l'estat SPAWN al construir-se: visible al pixel_rect_ inicial, sense moviment ni dany, esperant que algú extern (GameScene) li armi el comptador via `triggerSpawnExit()`. La durada (`spawn.duration_s` al YAML, default 0) controla quan passa a ROAMING una vegada armat el comptador. Posat a 0.6s a mummy.yaml. Aquest commit encara no enganxa el trigger: la mòmia es queda quieta tota la partida — comportament visual intermedi, esperat. El commit següent posarà el trigger a GameScene al final del text-exit de ROOM_INTRO. Tests de smoke i whip ajustats: les mòmies construïdes en stand-alone necessiten `triggerSpawnExit()` + un update gran abans d'interactuar amb `enterHurt`/contacto. Helper `exitMummySpawn` afegit a cada fitxer. Guards defensius a `enterHurt` i `onPlayerContact`: encara que el filtre central a EntityManager salta DynamicHazards en SPAWN, blindem la crida directa per a futurs camins (whip propers, scripts...). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
a6b2b02930
commit
041447eaa4
4 files changed
+49
No files matched your search
@@ -69,6 +69,15 @@ namespace {
|
||||
|
||||
#define REQUIRE(cond) check((cond), #cond, __FILE__, __LINE__)
|
||||
|
||||
// Treu la mòmia de l'estat SPAWN inicial (Mummy::Mummy ara hi entra).
|
||||
// Equival al que fa GameScene al final del text-exit de ROOM_INTRO: arma
|
||||
// el comptador i consumeix la durada amb un update. Tests que operin
|
||||
// directament sobre HURT/ROAMING l'han de cridar abans.
|
||||
void exitMummySpawn(Mummy& mummy) {
|
||||
mummy.triggerSpawnExit();
|
||||
mummy.update(mummy.getSpawnDurationS() + 0.001F);
|
||||
}
|
||||
|
||||
void testFactory() {
|
||||
std::cout << "[T1] factory\n";
|
||||
auto& factory = EntityFactory::instance();
|
||||
@@ -442,6 +451,7 @@ namespace {
|
||||
// Mateixa col·locació que testMummyStep: corredor exterior
|
||||
// superior, lliure de sarcs, prou marge per fugir cap a la dreta.
|
||||
mummy.setPixelRect({.x = 60.0F, .y = 40.0F, .w = 12.0F, .h = 24.0F});
|
||||
exitMummySpawn(mummy);
|
||||
|
||||
// Direcció preferida: dreta. Mòmia ha d'entrar en HURT i avançar
|
||||
// a la dreta (la velocitat de hurt és més alta que la base).
|
||||
@@ -474,6 +484,7 @@ namespace {
|
||||
// la paret i fer-la sortir de HURT.
|
||||
const float RIGHT_WALL = static_cast<float>(Map::playfield_x + Map::playfield_w);
|
||||
mummy.setPixelRect({.x = RIGHT_WALL - 12.0F, .y = 40.0F, .w = 12.0F, .h = 24.0F});
|
||||
exitMummySpawn(mummy);
|
||||
|
||||
// La direcció preferida (RIGHT) està bloquejada al test
|
||||
// d'`is_open`; entrarem amb una perpendicular o quieta.
|
||||
@@ -517,6 +528,7 @@ namespace {
|
||||
// expiri el timer (60 px/s · 0.6 s = 36 px de runway).
|
||||
mummy.setPixelRect({.x = 40.0F, .y = 160.0F, .w = 16.0F, .h = 32.0F});
|
||||
REQUIRE(mummy.getCollisionRect().x == 40.0F);
|
||||
exitMummySpawn(mummy);
|
||||
|
||||
mummy.enterHurt(Mummy::Direction::WEST);
|
||||
REQUIRE(mummy.getState() == Mummy::State::HURT);
|
||||
@@ -571,6 +583,7 @@ namespace {
|
||||
mummy.setCollisionBox({.offset_x = 0, .offset_y = 16, .width = 16, .height = 16});
|
||||
// Mateix runway que T18.
|
||||
mummy.setPixelRect({.x = 40.0F, .y = 160.0F, .w = 16.0F, .h = 32.0F});
|
||||
exitMummySpawn(mummy);
|
||||
|
||||
mummy.enterHurt(Mummy::Direction::WEST);
|
||||
for (int i = 0; i < 200 && mummy.getState() == Mummy::State::HURT; ++i) {
|
||||
|
||||
Reference in new issue
Block a user