From b0c9a8024e7e1882b3a87fb0473f69db70f87d33 Mon Sep 17 00:00:00 2001 From: zaid-ismail031 Date: Mon, 29 Aug 2022 23:10:35 +0200 Subject: [PATCH] Refactor missiles.cpp to use Direction enum instead of magic Point/Displacement constants. --- Source/automap.cpp | 2 ++ Source/engine/direction.hpp | 1 + Source/engine/displacement.hpp | 2 ++ Source/missiles.cpp | 56 +++++++++++++++++++++++++++------- Source/monster.cpp | 2 ++ 5 files changed, 52 insertions(+), 11 deletions(-) diff --git a/Source/automap.cpp b/Source/automap.cpp index de6a58a0a..548a09f31 100644 --- a/Source/automap.cpp +++ b/Source/automap.cpp @@ -468,6 +468,8 @@ void DrawAutomapPlr(const Surface &out, const Displacement &myPlayerOffset, int DrawHorizontalLine(out, point, AmLine(8) + 1, playerColor); DrawMapLineSteepSE(out, point, AmLine(4), playerColor); } break; + case Direction::NoDirection: + break; } } diff --git a/Source/engine/direction.hpp b/Source/engine/direction.hpp index 4738e8791..b9a42d061 100644 --- a/Source/engine/direction.hpp +++ b/Source/engine/direction.hpp @@ -16,6 +16,7 @@ enum class Direction : std::uint8_t { NorthEast, East, SouthEast, + NoDirection }; /** Maps from direction to a left turn from the direction. */ diff --git a/Source/engine/displacement.hpp b/Source/engine/displacement.hpp index 341433498..6d04d5a51 100644 --- a/Source/engine/displacement.hpp +++ b/Source/engine/displacement.hpp @@ -244,6 +244,8 @@ private: return { 1, -1 }; case Direction::SouthEast: return { 1, 0 }; + case Direction::NoDirection: + return { 0, 0 }; default: return { 0, 0 }; } diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 7c2aa79c8..9adbc2cae 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -16,6 +16,7 @@ #endif #include "engine/load_file.hpp" #include "engine/random.hpp" +#include "engine/points_in_rectangle_range.hpp" #include "init.h" #include "inv.h" #include "levels/trigs.h" @@ -1442,9 +1443,11 @@ void AddRuneExplosion(Missile &missile, const AddMissileParameter & /*parameter* missile._midam = dmg; - constexpr Displacement Offsets[] = { { -1, -1 }, { 0, -1 }, { 1, -1 }, { -1, 0 }, { 0, 0 }, { 1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 } }; - for (Displacement offset : Offsets) - CheckMissileCol(missile, dmg, dmg, false, missile.position.tile + offset, true); + auto searchArea = PointsInRectangleRangeColMajor { + Rectangle { missile.position.tile, 1 } + }; + for (Point position : searchArea) + CheckMissileCol(missile, dmg, dmg, false, position, true); } missile._mlid = AddLight(missile.position.start, 8); SetMissDir(missile, 0); @@ -2976,8 +2979,18 @@ void MI_Fireball(Missile &missile) const Point missilePosition = missile.position.tile; ChangeLight(missile._mlid, missile.position.tile, missile._miAnimFrame); - constexpr Displacement Offsets[] = { { 0, 0 }, { 0, 1 }, { 0, -1 }, { 1, 0 }, { 1, -1 }, { 1, 1 }, { -1, 0 }, { -1, 1 }, { -1, -1 } }; - for (Displacement offset : Offsets) { + constexpr Direction Offsets[] = { + Direction::NoDirection, + Direction::SouthWest, + Direction::NorthEast, + Direction::SouthEast, + Direction::East, + Direction::South, + Direction::NorthWest, + Direction::West, + Direction::North + }; + for (Direction offset : Offsets) { if (!CheckBlock(missile.position.start, missilePosition + offset)) CheckMissileCol(missile, minDam, maxDam, false, missilePosition + offset, true); } @@ -3314,8 +3327,15 @@ void MI_Flash(Missile &missile) } missile._mirange--; - constexpr Displacement Offsets[] = { { -1, 0 }, { 0, 0 }, { 1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 } }; - for (Displacement offset : Offsets) + constexpr Direction Offsets[] = { + Direction::NorthWest, + Direction::NoDirection, + Direction::SouthEast, + Direction::West, + Direction::SouthWest, + Direction::South + }; + for (Direction offset : Offsets) CheckMissileCol(missile, missile._midam, missile._midam, true, missile.position.tile + offset, true); if (missile._mirange == 0) { @@ -3336,8 +3356,12 @@ void MI_Flash2(Missile &missile) } missile._mirange--; - constexpr Displacement Offsets[] = { { -1, -1 }, { 0, -1 }, { 1, -1 } }; - for (Displacement offset : Offsets) + constexpr Direction Offsets[] = { + Direction::North, + Direction::North, + Direction::East + }; + for (Direction offset : Offsets) CheckMissileCol(missile, missile._midam, missile._midam, true, missile.position.tile + offset, true); if (missile._mirange == 0) { @@ -3925,8 +3949,18 @@ void MI_Element(Missile &missile) ChangeLight(missile._mlid, missile.position.tile, missile._miAnimFrame); Point startPoint = missile.var3 == 2 ? Point { missile.var4, missile.var5 } : Point(missile.position.start); - constexpr Displacement Offsets[] = { { 0, 0 }, { 0, 1 }, { 0, -1 }, { 1, 0 }, { 1, -1 }, { 1, 1 }, { -1, 0 }, { -1, 1 }, { -1, -1 } }; - for (Displacement offset : Offsets) { + constexpr Direction Offsets[] = { + Direction::NoDirection, + Direction::SouthWest, + Direction::NorthEast, + Direction::SouthEast, + Direction::East, + Direction::South, + Direction::NorthWest, + Direction::West, + Direction::North + }; + for (Direction offset : Offsets) { if (!CheckBlock(startPoint, missilePosition + offset)) CheckMissileCol(missile, dam, dam, true, missilePosition + offset, true); } diff --git a/Source/monster.cpp b/Source/monster.cpp index 10a44b1a8..ea0ebf131 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -3832,6 +3832,8 @@ bool Walk(Monster &monster, Direction md) case Direction::NorthWest: WalkNorthwards(monster, -1, 0, Direction::NorthWest); break; + case Direction::NoDirection: + break; } return true; }