diff --git a/game/CMakeLists.txt b/game/CMakeLists.txt index 866c16c..f9b861e 100644 --- a/game/CMakeLists.txt +++ b/game/CMakeLists.txt @@ -15,6 +15,7 @@ set( SOURCES game.cpp board.cpp unitv.cpp + unit.cpp ) add_library( game ${SOURCES} ) \ No newline at end of file diff --git a/game/unit.cpp b/game/unit.cpp new file mode 100644 index 0000000..14d517e --- /dev/null +++ b/game/unit.cpp @@ -0,0 +1,26 @@ +#include "unit.h" + +#include "unitv.h" + +#include + +std::unique_ptr CUnit::getUnitFromVis( unitVis_c vis ) +{ + switch( vis ) + { + case '^': + case '>': + case 'v': + case '<': + { + std::unique_ptr p = std::unique_ptr(new CUnitV); + if( (bool)p && p->setFromVisual(vis) ) + { + return std::move(p); + } + break; + } + } + + return std::move(std::unique_ptr(nullptr)); +} \ No newline at end of file diff --git a/game/unit.h b/game/unit.h index 128e87d..e71a96f 100644 --- a/game/unit.h +++ b/game/unit.h @@ -2,6 +2,7 @@ #define _UNIT_H_ #include +#include #include "vector2.h" @@ -15,11 +16,15 @@ typedef char unitVis_c; class CUnit { public: - - CUnit() = default; virtual ~CUnit() = default; - virtual unitVis_c getVisual() const = 0; + virtual unitVis_c getVisual() const = 0; + virtual bool setFromVisual(unitVis_c& vis) = 0; + + static std::unique_ptr getUnitFromVis( unitVis_c vis ); + +protected: + CUnit() = default; private: diff --git a/game/unitv.cpp b/game/unitv.cpp index 752a60f..92818c3 100644 --- a/game/unitv.cpp +++ b/game/unitv.cpp @@ -8,17 +8,18 @@ CUnitV::CUnitV() } + +// Map of visual representation of unitv +static const std::map< dir_t, unitVis_c > sk_visMap = +{ + {dir_t::N,'^'}, + {dir_t::E,'>'}, + {dir_t::S,'v'}, + {dir_t::W,'<'}, +}; + unitVis_c CUnitV::getVisual() const { - // Map of visual representation of unitv - static const std::map< dir_t, unitVis_c > sk_visMap = - { - {dir_t::N,'^'}, - {dir_t::E,'>'}, - {dir_t::S,'v'}, - {dir_t::W,'<'}, - }; - std::map< dir_t, char >::const_iterator it = sk_visMap.find(dir); if( it == sk_visMap.end() ) @@ -27,4 +28,21 @@ unitVis_c CUnitV::getVisual() const } return it->second; +} + +bool CUnitV::setFromVisual( unitVis_c& vis ) +{ + std::map< dir_t, char >::const_iterator it; + + for( it = sk_visMap.begin(); it != sk_visMap.end(); it++ ) + { + if( it->second == vis ) + { + dir == it->first; + return true; + } + } + + // No matching direction to visual + return false; } \ No newline at end of file diff --git a/game/unitv.h b/game/unitv.h index 1da4710..2f04dc7 100644 --- a/game/unitv.h +++ b/game/unitv.h @@ -11,7 +11,8 @@ public: CUnitV(); virtual ~CUnitV() = default; - virtual unitVis_c getVisual() const; + virtual unitVis_c getVisual() const override; + virtual bool setFromVisual( unitVis_c& vis ) override; private: diff --git a/test/test.cpp b/test/test.cpp index 082eb4b..4e17826 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -43,8 +43,13 @@ int main() { tests::test_CBoard(); - std::cout<<"Testing units"< myV = CUnit::getUnitFromVis('v'); + std::cout<getVisual()<