feat(whip): cabla flag whip.damage_pierces_walls a computeDamageRect
Quan el flag està actiu (default), l'iteració píxel a píxel ignora `Map::collides` i només respecta `insidePlayfield`. El mur extern, doncs, sempre retalla — fora del playfield no hi ha res a colpejar. Els tests existents passen amb la nova lògica perquè els seus setups posen el damage_rect a corredors lliures (sense sarcs a la trajectòria), i el test W2 segueix verificant el retall del playfield.
This commit is contained in:
1 parent
932b457725
commit
7871d3930e
2 files changed
+12
-1
No files matched your search
@@ -398,6 +398,7 @@ if(BUILD_TESTS)
|
|||||||
tests/audio_cache_stubs.cpp
|
tests/audio_cache_stubs.cpp
|
||||||
source/core/resources/resource_helper.cpp
|
source/core/resources/resource_helper.cpp
|
||||||
source/core/resources/resource_pack.cpp
|
source/core/resources/resource_pack.cpp
|
||||||
|
source/game/gameplay_config.cpp
|
||||||
source/game/map/map.cpp
|
source/game/map/map.cpp
|
||||||
source/utils/log.cpp
|
source/utils/log.cpp
|
||||||
${ENTITY_SOURCES_BASE}
|
${ENTITY_SOURCES_BASE}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include "game/entities/entity_factory.hpp"
|
#include "game/entities/entity_factory.hpp"
|
||||||
#include "game/entities/entity_manager.hpp"
|
#include "game/entities/entity_manager.hpp"
|
||||||
#include "game/entities/player.hpp"
|
#include "game/entities/player.hpp"
|
||||||
|
#include "game/gameplay_config.hpp"
|
||||||
#include "game/map/map.hpp"
|
#include "game/map/map.hpp"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
@@ -174,9 +175,16 @@ void WhipAttack::computeDamageRect(Direction dir, float spawn_x, float spawn_y,
|
|||||||
// d'atac, fins a topar amb un mur o sarc, o esgotar `range_px`.
|
// d'atac, fins a topar amb un mur o sarc, o esgotar `range_px`.
|
||||||
// L'amplada perpendicular és `tile_size` (els passadissos del joc
|
// L'amplada perpendicular és `tile_size` (els passadissos del joc
|
||||||
// tenen exactament aquesta mida i l'atac és lateral).
|
// tenen exactament aquesta mida i l'atac és lateral).
|
||||||
|
//
|
||||||
|
// Si el tweak `whip.damage_pierces_walls` està actiu, la hitbox
|
||||||
|
// ignora els sarcòfags (passa a través del bloc complet) però
|
||||||
|
// continua respectant el `insidePlayfield`: fora de la sala no hi
|
||||||
|
// ha res a colpejar i ampliar-ho generaria visuals/edge cases
|
||||||
|
// estranys. El mur extern, doncs, sempre retalla.
|
||||||
const auto TILE = static_cast<float>(Map::tile_size);
|
const auto TILE = static_cast<float>(Map::tile_size);
|
||||||
const int MAX_PX = static_cast<int>(std::max(0.0F, range_px));
|
const int MAX_PX = static_cast<int>(std::max(0.0F, range_px));
|
||||||
const auto MAX = static_cast<float>(MAX_PX);
|
const auto MAX = static_cast<float>(MAX_PX);
|
||||||
|
const bool PIERCES = GameplayConfig::get().whipDamagePiercesWalls();
|
||||||
float length = 0.0F;
|
float length = 0.0F;
|
||||||
|
|
||||||
auto try_probe = [&](float l) -> bool {
|
auto try_probe = [&](float l) -> bool {
|
||||||
@@ -198,7 +206,9 @@ void WhipAttack::computeDamageRect(Direction dir, float spawn_x, float spawn_y,
|
|||||||
probe = {.x = spawn_x, .y = spawn_y + (MAX - l), .w = TILE, .h = l};
|
probe = {.x = spawn_x, .y = spawn_y + (MAX - l), .w = TILE, .h = l};
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return Map::insidePlayfield(probe) && !Map::collides(probe);
|
if (!Map::insidePlayfield(probe)) { return false; }
|
||||||
|
if (PIERCES) { return true; }
|
||||||
|
return !Map::collides(probe);
|
||||||
};
|
};
|
||||||
|
|
||||||
for (int i = 1; i <= MAX_PX; ++i) {
|
for (int i = 1; i <= MAX_PX; ++i) {
|
||||||
|
|||||||
Reference in new issue
Block a user