From dd08ede080cc5937f1eaebb600fbe2f82a6b55e6 Mon Sep 17 00:00:00 2001 From: Reinder Feenstra Date: Wed, 6 Oct 2021 22:23:09 +0200 Subject: [PATCH] board: allow placing signal on top of straght if direction matches --- server/src/board/board.cpp | 36 ++++++++++++++++++++++----------- server/src/board/tile/tiles.cpp | 7 +++++++ server/src/board/tile/tiles.hpp | 2 ++ 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/server/src/board/board.cpp b/server/src/board/board.cpp index eb7a14f9..e7a5de92 100644 --- a/server/src/board/board.cpp +++ b/server/src/board/board.cpp @@ -46,23 +46,35 @@ Board::Board(const std::weak_ptr& world, std::string_view _id) : if(auto it = m_tiles.find(l); it != m_tiles.end()) { - if(!replace && tileClassId == StraightRailTile::classId && it->second->tileId() == TileId::RailStraight) // merge to bridge + if(!replace) { const TileRotate tileRotate = it->second->rotate; - if((tileRotate == rotate + TileRotate::Deg90 || tileRotate == rotate - TileRotate::Deg90) && deleteTile(x, y)) + + if(tileClassId == StraightRailTile::classId && it->second->tileId() == TileId::RailStraight) // merge to bridge { - tileClassId = Bridge90RailTile::classId; - rotate = tileRotate; + if((tileRotate == rotate + TileRotate::Deg90 || tileRotate == rotate - TileRotate::Deg90) && deleteTile(x, y)) + { + tileClassId = Bridge90RailTile::classId; + rotate = tileRotate; + } + else if((tileRotate == rotate + TileRotate::Deg45 || tileRotate == rotate + TileRotate::Deg225) && deleteTile(x, y)) + { + tileClassId = Bridge45LeftRailTile::classId; + rotate = tileRotate; + } + else if((tileRotate == rotate - TileRotate::Deg45 || tileRotate == rotate - TileRotate::Deg225) && deleteTile(x, y)) + { + tileClassId = Bridge45RightRailTile::classId; + rotate = tileRotate; + } + else + return false; } - else if((tileRotate == rotate + TileRotate::Deg45 || tileRotate == rotate + TileRotate::Deg225) && deleteTile(x, y)) + else if(Tiles::isRailSignal(tileClassId) && // replace straight by a signal + it->second->tileId() == TileId::RailStraight && + (tileRotate == rotate || (tileRotate + TileRotate::Deg180) == rotate) && deleteTile(x, y)) { - tileClassId = Bridge45LeftRailTile::classId; - rotate = tileRotate; - } - else if((tileRotate == rotate - TileRotate::Deg45 || tileRotate == rotate - TileRotate::Deg225) && deleteTile(x, y)) - { - tileClassId = Bridge45RightRailTile::classId; - rotate = tileRotate; + // tileClassId and rotate are ok :) } else return false; diff --git a/server/src/board/tile/tiles.cpp b/server/src/board/tile/tiles.cpp index 9a18eaec..9912cebc 100644 --- a/server/src/board/tile/tiles.cpp +++ b/server/src/board/tile/tiles.cpp @@ -52,3 +52,10 @@ std::shared_ptr Tiles::create(const std::shared_ptr& world, std::st IF_CLASSID_CREATE(TunnelRailTile) return std::shared_ptr(); } + +bool Tiles::isRailSignal(std::string_view classId) +{ + return + (classId == Signal2AspectRailTile::classId) || + (classId == Signal3AspectRailTile::classId); +} diff --git a/server/src/board/tile/tiles.hpp b/server/src/board/tile/tiles.hpp index f158f4ee..e28923dc 100644 --- a/server/src/board/tile/tiles.hpp +++ b/server/src/board/tile/tiles.hpp @@ -82,6 +82,8 @@ struct Tiles ); static std::shared_ptr create(const std::shared_ptr& world, std::string_view classId, std::string_view id = {}); + + static bool isRailSignal(std::string_view classId); }; #endif