feat(stats): Player com a font de veritat de vides/score/tresors i sarcs amb recompensa
This commit is contained in:
1 parent
d186f66c2c
commit
f5d251c33b
14 files changed
+226
-34
No files matched your search
@@ -26,6 +26,7 @@
|
||||
#include "core/ui/ui_config.hpp"
|
||||
#include "external/fkyaml_node.hpp"
|
||||
#include "game/entities/concrete/dust.hpp"
|
||||
#include "game/entities/concrete/sarcophagus.hpp"
|
||||
#include "game/entities/concrete/whip_attack.hpp"
|
||||
#include "game/entities/entity.hpp"
|
||||
#include "game/entities/entity_factory.hpp"
|
||||
@@ -321,6 +322,12 @@ GameScene::GameScene(Config config)
|
||||
entity_manager_.getBus().subscribe("player_disabled", [this](const Event& ev) {
|
||||
onPlayerDisabled(ev.player_id);
|
||||
});
|
||||
// `sarcophagus_opened`: extret a `onSarcophagusOpened` per acotar
|
||||
// la complexitat cognitiva del ctor (mateix patró que `player_killed`
|
||||
// i `player_disabled`).
|
||||
entity_manager_.getBus().subscribe("sarcophagus_opened", [this](const Event& ev) {
|
||||
onSarcophagusOpened(ev);
|
||||
});
|
||||
|
||||
// Polvet: precarreguem el surface del Dust una sola vegada perquè
|
||||
// els spawns runtime de l'entitat no facin disc al primer salt.
|
||||
@@ -732,6 +739,21 @@ void GameScene::onPlayerDisabled(int player_id) {
|
||||
players_active_[player_id] = false;
|
||||
}
|
||||
|
||||
void GameScene::onSarcophagusOpened(const Event& ev) {
|
||||
// `player_id < 0`: pintada sense atribució (broadcast inicial). No
|
||||
// hauria de tancar mai un sarc, però per defensa ignorem.
|
||||
if (ev.player_id < 0) { return; }
|
||||
const auto IDX = static_cast<std::size_t>(ev.player_id);
|
||||
if (IDX >= players_.size()) { return; }
|
||||
const auto* ent = std::get_if<Entity*>(&ev.payload);
|
||||
if (ent == nullptr || *ent == nullptr) { return; }
|
||||
auto* sarc = dynamic_cast<Sarcophagus*>(*ent);
|
||||
if (sarc == nullptr) { return; }
|
||||
auto& p = *players_[IDX];
|
||||
p.addScore(sarc->getPointsReward());
|
||||
p.addTreasures(sarc->getTreasuresReward());
|
||||
}
|
||||
|
||||
void GameScene::preloadGameOverAssets() const {
|
||||
// Pre-load del so del countdown: el dispara `updateGameOverFlow`
|
||||
// cada vegada que canvia el número visible de CONTINUE? (incloent
|
||||
|
||||
@@ -127,6 +127,14 @@ class GameScene : public Scene {
|
||||
// mètode per acotar la complexitat cognitiva del subscriber/ctor.
|
||||
void onPlayerDisabled(int player_id);
|
||||
|
||||
// Handler de l'event `sarcophagus_opened` (un jugador acaba de
|
||||
// tancar el perímetre). Reparteix la recompensa (`points`,
|
||||
// `treasures` del YAML del sarc) al Player corresponent, que al
|
||||
// mutar score/treasures publicarà `player_stats_changed` i el HUD
|
||||
// s'actualitzarà sol. Extret a mètode per acotar la complexitat
|
||||
// cognitiva del ctor.
|
||||
void onSarcophagusOpened(const Event& ev);
|
||||
|
||||
// Pre-load dels recursos d'àudio que s'usen mid-partida i no els
|
||||
// toca el Director (so del countdown, etc.). Si la clau és buida
|
||||
// o ja està al cache, és no-op. Extret a mètode per acotar la
|
||||
|
||||
Reference in new issue
Block a user