feat(enemy): sistema d'HP declaratiu i nou enemic big_pentagon
This commit is contained in:
@@ -24,7 +24,10 @@ namespace Systems::EnemyEvents {
|
||||
ctx.floating_score_manager.crear(POINTS, enemy.getCenter());
|
||||
}
|
||||
|
||||
void doCreateDebris(Systems::Collision::Context& ctx, const Enemy& enemy, const Bullet* bullet) {
|
||||
// Helper compartit per CREATE_DEBRIS i CREATE_DEBRIS_PARTIAL: única
|
||||
// crida a explode(), paràmetres alineats; només canvia piece_scale
|
||||
// (1.0 = explosió completa, 0.3 = xip d'esquerda).
|
||||
void spawnDebrisForEnemy(Systems::Collision::Context& ctx, const Enemy& enemy, const Bullet* bullet, float piece_scale) {
|
||||
constexpr float SPEED_EXPLOSIO = 80.0F;
|
||||
const Vec2 INHERITED_VEL = enemy.getVelocityVector() *
|
||||
Defaults::Physics::Debris::ENEMY_VELOCITY_INHERITANCE;
|
||||
@@ -44,7 +47,8 @@ namespace Systems::EnemyEvents {
|
||||
Defaults::Physics::Debris::ENEMY_LIFETIME,
|
||||
Defaults::Physics::Debris::ENEMY_FRICTION,
|
||||
Defaults::Physics::Debris::ENEMY_SEGMENT_MULTIPLIER,
|
||||
BULLET_VEL);
|
||||
BULLET_VEL,
|
||||
piece_scale);
|
||||
}
|
||||
|
||||
void doCreateFireworks(Systems::Collision::Context& ctx, const Enemy& enemy) {
|
||||
@@ -88,6 +92,13 @@ namespace Systems::EnemyEvents {
|
||||
}
|
||||
|
||||
for (const auto& action : actions) {
|
||||
// Si una acció prèvia d'aquest chain ha destruït l'enemic
|
||||
// (típicament DECREASE_HEALTH→ON_NO_HEALTH→SET_HURT-wounded→DESTROY),
|
||||
// saltem la resta — no té sentit aplicar APPLY_IMPULSE o FLASH a un
|
||||
// cos ja inactiu.
|
||||
if (!enemy.isActive()) {
|
||||
break;
|
||||
}
|
||||
switch (action.type) {
|
||||
case EnemyActionType::SET_HURT:
|
||||
if (enemy.isWounded()) {
|
||||
@@ -106,7 +117,10 @@ namespace Systems::EnemyEvents {
|
||||
doAddScore(ctx, enemy, shooter_id);
|
||||
break;
|
||||
case EnemyActionType::CREATE_DEBRIS:
|
||||
doCreateDebris(ctx, enemy, bullet);
|
||||
spawnDebrisForEnemy(ctx, enemy, bullet, 1.0F);
|
||||
break;
|
||||
case EnemyActionType::CREATE_DEBRIS_PARTIAL:
|
||||
spawnDebrisForEnemy(ctx, enemy, bullet, Defaults::Enemies::Debris::PARTIAL_PIECE_SCALE);
|
||||
break;
|
||||
case EnemyActionType::CREATE_FIREWORKS:
|
||||
doCreateFireworks(ctx, enemy);
|
||||
@@ -116,6 +130,15 @@ namespace Systems::EnemyEvents {
|
||||
doApplyImpulse(enemy, bullet);
|
||||
}
|
||||
break;
|
||||
case EnemyActionType::DECREASE_HEALTH:
|
||||
enemy.decrementHealth(shooter_id);
|
||||
if (enemy.getHealth() <= 0) {
|
||||
dispatchEvent(ctx, enemy, EnemyEventType::ON_NO_HEALTH, shooter_id, bullet);
|
||||
}
|
||||
break;
|
||||
case EnemyActionType::FLASH:
|
||||
enemy.triggerFlash();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user