From 26756b82dc6b45d9ccd92bb7f0ff833c49e552db Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Fri, 6 Aug 2021 01:52:56 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8FSplit=20up=20DrawAutomapTile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Source/automap.cpp | 197 +++++++++++++++++++++++++-------------------- 1 file changed, 109 insertions(+), 88 deletions(-) diff --git a/Source/automap.cpp b/Source/automap.cpp index 5c722e57e..19cf98504 100644 --- a/Source/automap.cpp +++ b/Source/automap.cpp @@ -103,6 +103,101 @@ void DrawMapHorizontalDoor(const Surface &out, Point center) DrawDiamond(out, center, MapColorsBright); } +void DrawDirt(const Surface &out, Point center) +{ + out.SetPixel(center, MapColorsDim); + out.SetPixel({ center.x - AmLine8, center.y - AmLine4 }, MapColorsDim); + out.SetPixel({ center.x - AmLine8, center.y + AmLine4 }, MapColorsDim); + out.SetPixel({ center.x + AmLine8, center.y - AmLine4 }, MapColorsDim); + out.SetPixel({ center.x + AmLine8, center.y + AmLine4 }, MapColorsDim); + out.SetPixel({ center.x - AmLine16, center.y }, MapColorsDim); + out.SetPixel({ center.x + AmLine16, center.y }, MapColorsDim); + out.SetPixel({ center.x, center.y - AmLine8 }, MapColorsDim); + out.SetPixel({ center.x, center.y + AmLine8 }, MapColorsDim); + out.SetPixel({ center.x + AmLine8 - AmLine32, center.y + AmLine4 }, MapColorsDim); + out.SetPixel({ center.x - AmLine8 + AmLine32, center.y + AmLine4 }, MapColorsDim); + out.SetPixel({ center.x - AmLine16, center.y + AmLine8 }, MapColorsDim); + out.SetPixel({ center.x + AmLine16, center.y + AmLine8 }, MapColorsDim); + out.SetPixel({ center.x - AmLine8, center.y + AmLine16 - AmLine4 }, MapColorsDim); + out.SetPixel({ center.x + AmLine8, center.y + AmLine16 - AmLine4 }, MapColorsDim); + out.SetPixel({ center.x, center.y + AmLine16 }, MapColorsDim); +} + +void DrawStairs(const Surface &out, Point center) +{ + constexpr int NumStairSteps = 4; + const Displacement offset = { -AmLine8, AmLine4 }; + Point p = { center.x - AmLine8, center.y - AmLine8 - AmLine4 }; + for (int i = 0; i < NumStairSteps; ++i) { + DrawMapLineSE(out, p, AmLine16, MapColorsBright); + p += offset; + } +} + +/** + * Left-facing obstacle + */ +void DrawHorizontal(const Surface &out, Point center, AutomapTile tile) +{ + if ((tile.flags & (AutomapFlagHorizontalDoor | AutomapFlagHorizontalGrate | AutomapFlagHorizontalArch)) == 0) { + DrawMapLineSE(out, { center.x, center.y - AmLine16 }, AmLine16, MapColorsDim); + return; + } + if ((tile.flags & AutomapFlagHorizontalDoor) != 0) { + DrawMapHorizontalDoor(out, { center.x + AmLine16, center.y - AmLine8 }); + } + if ((tile.flags & AutomapFlagHorizontalGrate) != 0) { + DrawMapLineSE(out, { center.x + AmLine16, center.y - AmLine8 }, AmLine8, MapColorsDim); + DrawDiamond(out, { center.x, center.y - AmLine8 }, MapColorsDim); + } else if ((tile.flags & AutomapFlagHorizontalArch) != 0) { + DrawDiamond(out, { center.x, center.y - AmLine8 }, MapColorsDim); + } +} + +/** + * Right-facing obstacle + */ +void DrawVertical(const Surface &out, Point center, AutomapTile tile) +{ + if ((tile.flags & (AutomapFlagVerticalDoor | AutomapFlagVerticalGrate | AutomapFlagVerticalArch)) == 0) { + DrawMapLineNE(out, { center.x - AmLine32, center.y }, AmLine16, MapColorsDim); + return; + } + if ((tile.flags & AutomapFlagVerticalDoor) != 0) { // two wall segments with a door in the middle + DrawMapVerticalDoor(out, { center.x - AmLine16, center.y - AmLine8 }); + } + if ((tile.flags & AutomapFlagVerticalGrate) != 0) { // right-facing half-wall + DrawMapLineNE(out, { center.x - AmLine32, center.y }, AmLine8, MapColorsDim); + DrawDiamond(out, { center.x, center.y - AmLine8 }, MapColorsDim); + } else if ((tile.flags & AutomapFlagVerticalArch) != 0) { // window or passable column + DrawDiamond(out, { center.x, center.y - AmLine8 }, MapColorsDim); + } +} + +/** + * For caves the horizontal/vertical flags are swapped + */ +void DrawCaveHorizontal(const Surface &out, Point center, AutomapTile tile) +{ + if ((tile.flags & AutomapFlagVerticalDoor) != 0) { + DrawMapHorizontalDoor(out, { center.x - AmLine16, center.y + AmLine8 }); + } else { + DrawMapLineSE(out, { center.x - AmLine32, center.y }, AmLine16, MapColorsDim); + } +} + +/** + * For caves the horizontal/vertical flags are swapped + */ +void DrawCaveVertical(const Surface &out, Point center, AutomapTile tile) +{ + if ((tile.flags & AutomapFlagHorizontalDoor) != 0) { + DrawMapVerticalDoor(out, { center.x + AmLine16, center.y + AmLine8 }); + } else { + DrawMapLineNE(out, { center.x, center.y + AmLine16 }, AmLine16, MapColorsDim); + } +} + /** * @brief Renders the given automap shape at the specified screen coordinates. */ @@ -112,125 +207,51 @@ void DrawAutomapTile(const Surface &out, Point center, AutomapTile tile) return; if ((tile.flags & AutomapFlagDirt) != 0) { - out.SetPixel(center, MapColorsDim); - out.SetPixel({ center.x - AmLine8, center.y - AmLine4 }, MapColorsDim); - out.SetPixel({ center.x - AmLine8, center.y + AmLine4 }, MapColorsDim); - out.SetPixel({ center.x + AmLine8, center.y - AmLine4 }, MapColorsDim); - out.SetPixel({ center.x + AmLine8, center.y + AmLine4 }, MapColorsDim); - out.SetPixel({ center.x - AmLine16, center.y }, MapColorsDim); - out.SetPixel({ center.x + AmLine16, center.y }, MapColorsDim); - out.SetPixel({ center.x, center.y - AmLine8 }, MapColorsDim); - out.SetPixel({ center.x, center.y + AmLine8 }, MapColorsDim); - out.SetPixel({ center.x + AmLine8 - AmLine32, center.y + AmLine4 }, MapColorsDim); - out.SetPixel({ center.x - AmLine8 + AmLine32, center.y + AmLine4 }, MapColorsDim); - out.SetPixel({ center.x - AmLine16, center.y + AmLine8 }, MapColorsDim); - out.SetPixel({ center.x + AmLine16, center.y + AmLine8 }, MapColorsDim); - out.SetPixel({ center.x - AmLine8, center.y + AmLine16 - AmLine4 }, MapColorsDim); - out.SetPixel({ center.x + AmLine8, center.y + AmLine16 - AmLine4 }, MapColorsDim); - out.SetPixel({ center.x, center.y + AmLine16 }, MapColorsDim); + DrawDirt(out, center); } if ((tile.flags & AutomapFlagStairs) != 0) { - constexpr int NumStairSteps = 4; - const Displacement offset = { -AmLine8, AmLine4 }; - Point p = { center.x - AmLine8, center.y - AmLine8 - AmLine4 }; - for (int i = 0; i < NumStairSteps; ++i) { - DrawMapLineSE(out, p, AmLine16, MapColorsBright); - p += offset; - } + DrawStairs(out, center); } - bool drawVertical = false; - bool drawHorizontal = false; - bool drawCaveHorizontal = false; - bool drawCaveVertical = false; switch (tile.type) { case AutomapTypes::Diamond: // stand-alone column or other unpassable object DrawDiamond(out, { center.x, center.y - AmLine8 }, MapColorsDim); break; case AutomapTypes::Vertical: case AutomapTypes::FenceVertical: - drawVertical = true; + DrawVertical(out, center, tile); break; case AutomapTypes::Horizontal: case AutomapTypes::FenceHorizontal: - drawHorizontal = true; + DrawHorizontal(out, center, tile); break; case AutomapTypes::Cross: - drawVertical = true; - drawHorizontal = true; + DrawVertical(out, center, tile); + DrawHorizontal(out, center, tile); break; case AutomapTypes::CaveHorizontalCross: - drawVertical = true; - drawCaveHorizontal = true; + DrawVertical(out, center, tile); + DrawCaveHorizontal(out, center, tile); break; case AutomapTypes::CaveVerticalCross: - drawHorizontal = true; - drawCaveVertical = true; + DrawHorizontal(out, center, tile); + DrawCaveVertical(out, center, tile); break; case AutomapTypes::CaveHorizontal: - drawCaveHorizontal = true; + DrawCaveHorizontal(out, center, tile); break; case AutomapTypes::CaveVertical: - drawCaveVertical = true; + DrawCaveVertical(out, center, tile); break; case AutomapTypes::CaveCross: - drawCaveHorizontal = true; - drawCaveVertical = true; + DrawCaveHorizontal(out, center, tile); + DrawCaveVertical(out, center, tile); break; case AutomapTypes::Corner: case AutomapTypes::None: break; } - - if (drawVertical) { // right-facing obstacle - if ((tile.flags & AutomapFlagVerticalDoor) != 0) { // two wall segments with a door in the middle - DrawMapVerticalDoor(out, { center.x - AmLine16, center.y - AmLine8 }); - } - if ((tile.flags & AutomapFlagVerticalGrate) != 0) { // right-facing half-wall - DrawMapLineNE(out, { center.x - AmLine32, center.y }, AmLine8, MapColorsDim); - tile.flags |= AutomapFlagVerticalArch; - } - if ((tile.flags & AutomapFlagVerticalArch) != 0) { // window or passable column - DrawDiamond(out, { center.x, center.y - AmLine8 }, MapColorsDim); - } - if ((tile.flags & (AutomapFlagVerticalDoor | AutomapFlagVerticalGrate | AutomapFlagVerticalArch)) == 0) { - DrawMapLineNE(out, { center.x - AmLine32, center.y }, AmLine16, MapColorsDim); - } - } - - if (drawHorizontal) { // left-facing obstacle - if ((tile.flags & AutomapFlagHorizontalDoor) != 0) { - DrawMapHorizontalDoor(out, { center.x + AmLine16, center.y - AmLine8 }); - } - if ((tile.flags & AutomapFlagHorizontalGrate) != 0) { - DrawMapLineSE(out, { center.x + AmLine16, center.y - AmLine8 }, AmLine8, MapColorsDim); - tile.flags |= AutomapFlagHorizontalArch; - } - if ((tile.flags & AutomapFlagHorizontalArch) != 0) { - DrawDiamond(out, { center.x, center.y - AmLine8 }, MapColorsDim); - } - if ((tile.flags & (AutomapFlagHorizontalDoor | AutomapFlagHorizontalGrate | AutomapFlagHorizontalArch)) == 0) { - DrawMapLineSE(out, { center.x, center.y - AmLine16 }, AmLine16, MapColorsDim); - } - } - - // For caves the horizontal/vertical flags are swapped - if (drawCaveHorizontal) { - if ((tile.flags & AutomapFlagVerticalDoor) != 0) { - DrawMapHorizontalDoor(out, { center.x - AmLine16, center.y + AmLine8 }); - } else { - DrawMapLineSE(out, { center.x - AmLine32, center.y }, AmLine16, MapColorsDim); - } - } - - if (drawCaveVertical) { - if ((tile.flags & AutomapFlagHorizontalDoor) != 0) { - DrawMapVerticalDoor(out, { center.x + AmLine16, center.y + AmLine8 }); - } else { - DrawMapLineNE(out, { center.x, center.y + AmLine16 }, AmLine16, MapColorsDim); - } - } } void SearchAutomapItem(const Surface &out, const Displacement &myPlayerOffset)