diff --git a/.github/workflows/building.yml b/.github/workflows/building.yml index 93b6f57..246008b 100644 --- a/.github/workflows/building.yml +++ b/.github/workflows/building.yml @@ -22,9 +22,9 @@ jobs: os: ubuntu-latest compiler: clang++ - #- name: MacOS Clang - # os: macos-latest - # compiler: clang++ + - name: MacOS Clang + os: macos-latest + compiler: clang++ - name: Windows GCC os: windows-latest diff --git a/CMakeLists.txt b/CMakeLists.txt index dc5a9d8..5549e28 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,7 @@ add_library(controller "include/caravan/controller/controller.h" "include/caravan/controller/controller_tui.h" + "src/caravan/controller/controller.cpp" "src/caravan/controller/controller_tui.cpp" ) @@ -80,6 +81,7 @@ add_library(view "include/caravan/view/view.h" "include/caravan/view/view_tui.h" + "src/caravan/view/view.cpp" "src/caravan/view/view_tui.cpp" ) diff --git a/include/caravan/controller/controller.h b/include/caravan/controller/controller.h index 9d7158a..5f49ba7 100644 --- a/include/caravan/controller/controller.h +++ b/include/caravan/controller/controller.h @@ -13,9 +13,18 @@ class ControllerSubscriber { public: - virtual void on_user_input(std::string input, bool complete) = 0; // TODO + virtual void on_controller_command(GameCommand command) = 0; // TODO }; -class Controller : public ViewSubscriber, Publisher {}; +class Controller : public ViewSubscriber, public Publisher { +protected: + bool closed; +public: + virtual ~Controller() = default; + explicit Controller() : closed(false) {}; + + void subscribe(ControllerSubscriber *sub) override; + void close() { closed = true; }; +}; #endif //CARAVAN_CONTROLLER_H diff --git a/include/caravan/controller/controller_tui.h b/include/caravan/controller/controller_tui.h index ee4e446..f98eef9 100644 --- a/include/caravan/controller/controller_tui.h +++ b/include/caravan/controller/controller_tui.h @@ -11,7 +11,7 @@ class ControllerTUI : public Controller { public: explicit ControllerTUI() = default; - void on_view_update() override; // from ViewSubscriber + void on_view_user_input(std::string input) override; // from ViewSubscriber }; #endif //CARAVAN_CONTROLLER_TUI_H diff --git a/include/caravan/core/common.h b/include/caravan/core/common.h index bd39971..dbd614b 100644 --- a/include/caravan/core/common.h +++ b/include/caravan/core/common.h @@ -81,7 +81,6 @@ typedef std::vector Deck; typedef std::array Faces; typedef std::array PlayerCaravanNames; - typedef struct Slot { Card card {}; Faces faces {}; @@ -91,18 +90,18 @@ typedef struct Slot { typedef std::array Track; typedef struct GameConfig { - uint8_t pa_num_cards; - uint8_t pa_num_sample_decks; - bool pa_balanced_sample; + uint8_t pa_num_cards {0}; + uint8_t pa_num_sample_decks {0}; + bool pa_balanced_sample {false}; - uint8_t pb_num_cards; - uint8_t pb_num_sample_decks; - bool pb_balanced_sample; + uint8_t pb_num_cards {0}; + uint8_t pb_num_sample_decks {0}; + bool pb_balanced_sample {false}; - PlayerName pn_first; + PlayerName pn_first {NO_PLAYER}; } GameConfig; -typedef struct GameOption { +typedef struct GameOption { // TODO remove OptionType type {}; uint8_t pos_hand {}; CaravanName caravan_name {}; @@ -110,6 +109,13 @@ typedef struct GameOption { Card card {}; } GameOption; +typedef struct GameCommand { + OptionType type {NO_OPTION}; + uint8_t pos_hand {0}; + CaravanName caravan_name {NO_CARAVAN}; + uint8_t pos_caravan {0}; +} GameCommand; + /* * FUNCTIONS */ @@ -122,12 +128,12 @@ bool is_face_card(Card c); * CLASSES */ -template +template class Publisher { protected: std::vector subscribers; public: - void subscribe(T *sub); + virtual void subscribe(T *sub) = 0; }; #endif //CARAVAN_CORE_COMMON_H diff --git a/include/caravan/user/user.h b/include/caravan/user/user.h index 979387e..e5701ec 100644 --- a/include/caravan/user/user.h +++ b/include/caravan/user/user.h @@ -12,6 +12,7 @@ class User { protected: PlayerName name; public: + virtual ~User() = default; explicit User(PlayerName pn) : name(pn) {}; PlayerName get_name() { return name; } diff --git a/include/caravan/view/view.h b/include/caravan/view/view.h index ada4192..737b4f2 100644 --- a/include/caravan/view/view.h +++ b/include/caravan/view/view.h @@ -12,22 +12,24 @@ class ViewSubscriber { public: - virtual void on_view_update() = 0; // TODO + virtual void on_view_user_input(std::string input) = 0; }; -class View : Publisher { +class View : public Publisher { protected: User *user_top_ptr; User *user_bottom_ptr; bool closed; public: - using Publisher::subscribe; - + virtual ~View() = default; explicit View(User *utop, User *ubottom) : user_top_ptr(utop), user_bottom_ptr(ubottom), closed(false) {}; virtual void run() = 0; + void subscribe(ViewSubscriber *sub) override; void close() { closed = true; }; }; + + #endif //CARAVAN_VIEW_H diff --git a/include/caravan/view/view_tui.h b/include/caravan/view/view_tui.h index b107bb8..2bd6a3a 100644 --- a/include/caravan/view/view_tui.h +++ b/include/caravan/view/view_tui.h @@ -10,7 +10,6 @@ class ViewTUI : public View { public: - using View::subscribe; explicit ViewTUI(User *utop, User *ubottom) : View(utop, ubottom) {}; void run() override; diff --git a/src/caravan/controller/controller.cpp b/src/caravan/controller/controller.cpp new file mode 100644 index 0000000..32758bc --- /dev/null +++ b/src/caravan/controller/controller.cpp @@ -0,0 +1,9 @@ +// Copyright (c) 2022-2024 r3w0p +// The following code can be redistributed and/or +// modified under the terms of the GPL-3.0 License. + +#include "caravan/controller/controller.h" + +void Controller::subscribe(ControllerSubscriber *sub) { + subscribers.push_back(sub); +} diff --git a/src/caravan/controller/controller_tui.cpp b/src/caravan/controller/controller_tui.cpp index 560c221..5d4a72a 100644 --- a/src/caravan/controller/controller_tui.cpp +++ b/src/caravan/controller/controller_tui.cpp @@ -4,6 +4,27 @@ #include "caravan/controller/controller_tui.h" -void ControllerTUI::on_view_update() { +void ControllerTUI::on_view_user_input(std::string input) { + if(closed) return; + // Decipher input + GameCommand command; + + if( + input.size() >= 4 and + (input.at(0) == 'E' or input.at(0) == 'e') and + (input.at(1) == 'X' or input.at(1) == 'x') and + (input.at(2) == 'I' or input.at(2) == 'i') and + (input.at(3) == 'T' or input.at(3) == 't') + ) { + command.type = OPTION_EXIT; + + } else if(input.size() >= 2) { + + } else return; + + // Pass to subscribers + for(ControllerSubscriber *s : subscribers) { + s->on_controller_command(command); + } } diff --git a/src/caravan/core/common.cpp b/src/caravan/core/common.cpp index 9ade294..76f2dd4 100644 --- a/src/caravan/core/common.cpp +++ b/src/caravan/core/common.cpp @@ -4,7 +4,6 @@ #include "caravan/core/common.h" - bool is_numeral_card(Card c) { return (c.rank >= ACE and c.rank <= TEN); } @@ -12,8 +11,3 @@ bool is_numeral_card(Card c) { bool is_face_card(Card c) { return (c.rank >= JACK and c.rank <= JOKER); } - -template -void Publisher::subscribe(T *sub) { - subscribers.push_back(sub); -} diff --git a/src/caravan/main.cpp b/src/caravan/main.cpp index fdbe38b..57d5cea 100644 --- a/src/caravan/main.cpp +++ b/src/caravan/main.cpp @@ -5,23 +5,35 @@ #include "caravan/view/view_tui.h" #include "caravan/user/bot_easy.h" #include "caravan/controller/controller_tui.h" - +#include int main() { - auto *utop = new UserHuman(PLAYER_TOP); - auto *ubottom = new UserHuman(PLAYER_BOTTOM); + User *utop; + User *ubottom; + + ViewTUI *v; + Controller *c; + // Model *m; + + try { + utop = new UserHuman(PLAYER_TOP); + ubottom = new UserHuman(PLAYER_BOTTOM); + + v = new ViewTUI(utop, ubottom); + c = new ControllerTUI(); + // m = ... - auto *v = new ViewTUI(utop, ubottom); - auto *c = new ControllerTUI(); - // auto *m = ... + // TODO Subscribe components + v->subscribe(c); - // TODO Subscribe - v->subscribe(c); + v->run(); - v->run(); + } catch (CaravanFatalException &e) { + std::cout << e.what() << std::endl; + } v->close(); - // TODO c->close(); + c->close(); // TODO m->close(); delete v; diff --git a/src/caravan/view/view.cpp b/src/caravan/view/view.cpp new file mode 100644 index 0000000..9606938 --- /dev/null +++ b/src/caravan/view/view.cpp @@ -0,0 +1,9 @@ +// Copyright (c) 2022-2024 r3w0p +// The following code can be redistributed and/or +// modified under the terms of the GPL-3.0 License. + +#include "caravan/view/view.h" + +void View::subscribe(ViewSubscriber *sub) { + subscribers.push_back(sub); +} diff --git a/src/caravan/view/view_tui.cpp b/src/caravan/view/view_tui.cpp index 097074b..3398b44 100644 --- a/src/caravan/view/view_tui.cpp +++ b/src/caravan/view/view_tui.cpp @@ -14,10 +14,13 @@ #include "ftxui/component/screen_interactive.hpp" #include "ftxui/dom/elements.hpp" - void ViewTUI::run() { + // TODO on_model_exit, close the game + using namespace ftxui; + if(closed) return; + // Input data std::string user_input; std::string command;