feat(lighting): flicker tipus foc per antorxes

This commit is contained in:
JailDesigner committed 2026-05-12 22:07:25 +02:00
1 parent 3195746189
commit 35aaa6c519
8 files changed
+124 -16

No files matched your search

+8
View File
@@ -259,6 +259,13 @@ class Entity {
[[nodiscard]] auto getLightRadius() const -> int { return light_radius_; }
void setLightRadius(int r) { light_radius_ = r; }
// Activa la modulació "tipus foc" del radi a la pasada d'il·luminació
// (per a antorxes, fogueres, etc.). El bloc opcional
// `light: { flicker: true }` del YAML el pobla. Per defecte false:
// la llum queda perfectament estable (cas player, mòmia).
[[nodiscard]] auto getLightFlicker() const -> bool { return light_flicker_; }
void setLightFlicker(bool f) { light_flicker_ = f; }
// Centre de la llum en píxels del canvas. Per defecte és el centre del
// `pixel_rect_` (que és la caixa de render: sprite top-left + mida).
// Virtual perquè entitats amb desplaçament visual sobre la posició
@@ -280,6 +287,7 @@ class Entity {
bool blocks_movement_{false};
int height_{0};
int light_radius_{0};
bool light_flicker_{false};
bool dead_{false};
SDL_FlipMode flip_{SDL_FLIP_NONE};
EventBus* bus_{nullptr};
@@ -155,15 +155,23 @@ namespace {
return c["height"].get_value<int>();
}
// Bloc opcional `light: { radius: N }` de la plantilla. Si manca, el
// radi és 0 i l'entitat no entra a la pasada d'il·luminació. La forma
// del gradient (3 anells) viu a data/config/lighting.yaml — no cal
// declarar-la per entitat.
auto readLightRadius(const fkyaml::node& tmpl) -> int {
if (!tmpl.contains("light")) { return 0; }
// Bloc opcional `light: { radius: N, flicker: bool }` de la plantilla.
// Si manca, el radi és 0 i l'entitat no entra a la pasada d'il·luminació.
// `flicker` activa la modulació "tipus foc" del radi (només antorxes
// l'haurien d'usar). La forma del gradient (3 anells) i els paràmetres
// del flicker viuen a data/config/lighting.yaml — no cal declarar-los
// per entitat.
struct LightTemplate {
int radius{0};
bool flicker{false};
};
auto readLight(const fkyaml::node& tmpl) -> LightTemplate {
if (!tmpl.contains("light")) { return {}; }
const auto& l = tmpl["light"];
if (!l.contains("radius")) { return 0; }
return l["radius"].get_value<int>();
LightTemplate out;
if (l.contains("radius")) { out.radius = l["radius"].get_value<int>(); }
if (l.contains("flicker")) { out.flicker = l["flicker"].get_value<bool>(); }
return out;
}
// Bloc `collision: { size: [w, h], base_size: [bw, bh]?, offset: [x, y]? }`
@@ -288,7 +296,9 @@ namespace {
entity->setCollisionBox(*BOX);
}
entity->setHeight(readHeight(tmpl));
entity->setLightRadius(readLightRadius(tmpl));
const auto LIGHT = readLight(tmpl);
entity->setLightRadius(LIGHT.radius);
entity->setLightFlicker(LIGHT.flicker);
anchor_out = readAnchor(tmpl);
return entity;
}