diff --git a/game.cpp b/game.cpp index e41ca49..1acbf1d 100644 --- a/game.cpp +++ b/game.cpp @@ -20,6 +20,12 @@ Game::~Game() SDL_FreeSurface(background); if (font != NULL) TTF_CloseFont(font); + + for (list::iterator cursor = buttons.begin(); + cursor != buttons.end(); cursor++) + { + delete *cursor; + } } @@ -41,11 +47,12 @@ bool Game::init() return false; } - move_button = MenuButton("Move", font, 155, display->h - 95, BUTTON_MOVE); - attack_button = MenuButton("Attack", font, 260, display->h - 95, - BUTTON_ATTACK); - build_button = MenuButton("Build", font, 155, display->h - 50, - BUTTON_BUILD); + buttons.push_back(new MenuButton("Move", font, 155, display->h - 95, + BUTTON_MOVE)); + buttons.push_back(new MenuButton("Attack", font, 260, display->h - 95, + BUTTON_ATTACK)); + buttons.push_back(new MenuButton("Build", font, 155, display->h - 50, + BUTTON_BUILD)); return GameState::init(); @@ -130,9 +137,12 @@ void Game::render() if (data.get_current_vertex() != NULL) { - draw_button(&move_button); - draw_button(&build_button); - draw_button(&attack_button); + for (list::iterator cursor = buttons.begin(); + cursor != buttons.end(); cursor++) + { + MenuButton* button = *cursor; + draw_button(button); + } } SDL_Flip(display); @@ -156,6 +166,32 @@ void Game::draw_button(MenuButton* button) } +void Game::handle_button_press(ButtonAction action) +{ + switch (action) + { + case BUTTON_BUILD: + data.set_mode(MODE_BUILD); + break; + case BUTTON_ATTACK: + data.set_mode(MODE_ATTACK); + break; + case BUTTON_MOVE: + data.set_mode(MODE_MOVE); + break; + case BUTTON_BUILD_ATTACKER: + data.set_build_type(VERTEX_ATTACKER); + break; + case BUTTON_BUILD_DEFENDER: + data.set_build_type(VERTEX_DEFENDER); + break; + case BUTTON_BUILD_PRODUCER: + data.set_build_type(VERTEX_PRODUCER); + break; + } +} + + void Game::draw_stats(Vertex* v) { int num_lines = 4; @@ -181,8 +217,14 @@ void Game::draw_stats(Vertex* v) void Game::on_lbutton_down(int x, int y) { - if (y > display->h - 110) return; + for (list::iterator cursor = buttons.begin(); + cursor != buttons.end(); cursor++) + { + MenuButton* button = *cursor; + if (button->is_at(x, y)) handle_button_press(button->get_action()); + } + if (y > display->h - 110) return; if (!data.endgame()) data.handle_click(x, y); } diff --git a/game.h b/game.h index 2580747..6e2b8ba 100644 --- a/game.h +++ b/game.h @@ -10,9 +10,11 @@ #include "gamedata.h" #include "gamestate.h" #include "menubutton.h" -#include #include +#include +#include +using std::list; using std::stack; @@ -39,6 +41,8 @@ class Game : public GameState void draw_stats(Vertex* v); void draw_button(MenuButton* button); + void handle_button_press(ButtonAction action); + // data GameData data; // the x,y position of the mouse cursor @@ -50,9 +54,7 @@ class Game : public GameState TTF_Font* font; // menu buttons - MenuButton move_button; - MenuButton build_button; - MenuButton attack_button; + list buttons; static int NODE_RADIUS; diff --git a/gamedata.cpp b/gamedata.cpp index b687142..356537f 100644 --- a/gamedata.cpp +++ b/gamedata.cpp @@ -31,6 +31,7 @@ GameData::GameData() player1 = Player("player 1", PLAYER1_COLOUR); player2 = Player("player 2", PLAYER2_COLOUR); turn = &player1; + build_type = VERTEX_NONE; } GameData::~GameData() { } @@ -236,6 +237,9 @@ void GameData::set_mode(Mode m) // Stay in MODE_SELECT (or maybe MODE_BUILD) when current is null if (current == NULL) return; + // If we're leaving MODE_BUILD, we should set the build_type back to none + if (mode == MODE_ATTACK && m != mode) build_type = VERTEX_NONE; + // The other modes all require current to match the player if (dynamic_cast(current)->player == turn) mode = m; } diff --git a/gamedata.h b/gamedata.h index 93057ec..ebb4168 100644 --- a/gamedata.h +++ b/gamedata.h @@ -10,7 +10,7 @@ #include "player.h" enum Mode {MODE_MOVE, MODE_ATTACK, MODE_BUILD, MODE_SELECT}; -enum VertexType {VERTEX_ATTACKER, VERTEX_DEFENDER, VERTEX_PRODUCER}; +enum VertexType {VERTEX_ATTACKER, VERTEX_DEFENDER, VERTEX_PRODUCER, VERTEX_NONE}; class GameVertex : public Vertex { @@ -43,6 +43,8 @@ class GameData : public Graph Mode get_mode() const { return mode; } void set_mode(Mode m); + void set_build_type(VertexType type) { build_type = type; } + // returns the move/attack range for the specified node // (or the selected node if node == NULL) int get_range(Vertex* node = NULL); @@ -57,10 +59,12 @@ class GameData : public Graph float calculate_strength_r(Vertex* node, unsigned int depth, list& visited); Vertex* current; - Mode mode; Player player1, player2; Player* turn; + Mode mode; + VertexType build_type; + static int PLAYER1_COLOUR; static int PLAYER2_COLOUR;