Skip to content

Commit 187bdba

Browse files
obligaronAJenbo
authored andcommitted
Ensure gap-filling firewall tiles only damage moving players
1 parent 536378a commit 187bdba

File tree

1 file changed

+23
-6
lines changed

1 file changed

+23
-6
lines changed

Source/missiles.cpp

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,17 @@ void RotateBlockedMissile(Missile &missile)
472472
missile.setFrameGroupRaw(dir);
473473
}
474474

475-
void CheckMissileCol(Missile &missile, DamageType damageType, int minDamage, int maxDamage, bool isDamageShifted, Point position, bool dontDeleteOnCollision)
475+
bool CheckCanHitOnlyWalking(const Missile &missile, const ActorPosition &position, Direction wallDir)
476+
{
477+
Point other = missile.position.tile + wallDir;
478+
if (missile.position.tile == position.tile && other == position.future)
479+
return true;
480+
if (missile.position.tile == position.future && other == position.tile)
481+
return true;
482+
return false;
483+
}
484+
485+
void CheckMissileCol(Missile &missile, DamageType damageType, int minDamage, int maxDamage, bool isDamageShifted, Point position, bool dontDeleteOnCollision, std::optional<Direction> onlyHitWalking = {})
476486
{
477487
if (!InDungeonBounds(position))
478488
return;
@@ -481,7 +491,7 @@ void CheckMissileCol(Missile &missile, DamageType damageType, int minDamage, int
481491
int mid = dMonster[position.x][position.y];
482492
if (mid != 0) {
483493
Monster &monster = Monsters[std::abs(mid) - 1];
484-
if (mid > 0 || monster.mode == MonsterMode::Petrified) {
494+
if (onlyHitWalking.has_value() ? (monster.isWalking() && CheckCanHitOnlyWalking(missile, monster.position, *onlyHitWalking)) : (mid > 0 || monster.mode == MonsterMode::Petrified)) {
485495
if (missile.IsTrap()
486496
|| (missile._micaster == TARGET_PLAYERS && ( // or was fired by a monster and
487497
monster.isPlayerMinion() != Monsters[missile._misource].isPlayerMinion() // the monsters are on opposing factions
@@ -504,8 +514,8 @@ void CheckMissileCol(Missile &missile, DamageType damageType, int minDamage, int
504514

505515
bool isPlayerHit = false;
506516
bool blocked = false;
507-
Player *player = PlayerAtPosition(position, true);
508-
if (player != nullptr) {
517+
Player *player = PlayerAtPosition(position, !onlyHitWalking.has_value());
518+
if (player != nullptr && (onlyHitWalking.has_value() ? (player->isWalking() && CheckCanHitOnlyWalking(missile, player->position, *onlyHitWalking)) : true)) {
509519
if (missile._micaster != TARGET_BOTH && !missile.IsTrap()) {
510520
if (missile._micaster == TARGET_MONSTERS) {
511521
if (player->getId() != missile._misource)
@@ -758,6 +768,7 @@ bool TryGrowWall(int id, MissileID type, Point position, Direction growDirection
758768
Displacement travelled = Displacement(Right(Right(growDirection))).worldToNormalScreen() * 30; // Move the wall to the edge to the next tile, but not over it
759769
missile->position.traveled += travelled;
760770
missile->_miDrawFlag = false;
771+
missile->var3 = static_cast<int>(Left(Left(growDirection))) + 1;
761772
UpdateMissilePos(*missile);
762773
assert(gapPos == missile->position.tile); // Check that the tile we checked against (CanPlaceWall) didn't change
763774
}
@@ -3052,7 +3063,10 @@ void ProcessFireWall(Missile &missile)
30523063
missile._miAnimFrame = 13;
30533064
missile._miAnimAdd = -1;
30543065
}
3055-
CheckMissileCol(missile, GetMissileData(missile._mitype).damageType(), missile._midam, missile._midam, true, missile.position.tile, true);
3066+
std::optional<Direction> onlyHitWalking = {};
3067+
if (missile.var3 != 0)
3068+
onlyHitWalking = static_cast<Direction>(missile.var3 - 1);
3069+
CheckMissileCol(missile, GetMissileData(missile._mitype).damageType(), missile._midam, missile._midam, true, missile.position.tile, true, onlyHitWalking);
30563070
if (missile.duration == 0) {
30573071
missile._miDelFlag = true;
30583072
AddUnLight(missile._mlid);
@@ -3184,7 +3198,10 @@ void ProcessLightningWall(Missile &missile)
31843198
{
31853199
missile.duration--;
31863200
const int range = missile.duration;
3187-
CheckMissileCol(missile, GetMissileData(missile._mitype).damageType(), missile._midam, missile._midam, true, missile.position.tile, false);
3201+
std::optional<Direction> onlyHitWalking = {};
3202+
if (missile.var3 != 0)
3203+
onlyHitWalking = static_cast<Direction>(missile.var3 - 1);
3204+
CheckMissileCol(missile, GetMissileData(missile._mitype).damageType(), missile._midam, missile._midam, true, missile.position.tile, false, onlyHitWalking);
31883205
if (missile._miHitFlag)
31893206
missile.duration = range;
31903207
if (missile.duration == 0)

0 commit comments

Comments
 (0)