diff --git a/game.cpp b/game.cpp index 1acbf1d..9bb6c6e 100644 --- a/game.cpp +++ b/game.cpp @@ -47,12 +47,24 @@ bool Game::init() return false; } - 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, + int row1 = display->h - 95; + int row2 = display->h - 50; + int col1 = 155; + int col2 = 260; + int col3 = 365; + int col4 = 470; + + buttons.push_back(new MenuButton("Move", font, col1, row1, BUTTON_MOVE)); + buttons.push_back(new MenuButton("Build", font, col1, row2, BUTTON_BUILD)); + buttons.push_back(new MenuButton("Attack", font, col2, row1, + BUTTON_ATTACK)); + buttons.push_back(new MenuButton("Attacker", font, col3, row1, + BUTTON_BUILD_ATTACKER)); + buttons.push_back(new MenuButton("Defender", font, col3, row2, + BUTTON_BUILD_DEFENDER)); + buttons.push_back(new MenuButton("Producer", font, col4, row1, + BUTTON_BUILD_PRODUCER)); return GameState::init(); @@ -141,6 +153,13 @@ void Game::render() cursor != buttons.end(); cursor++) { MenuButton* button = *cursor; + + if ((button->get_action() & (BUTTON_BUILD_ATTACKER | + BUTTON_BUILD_DEFENDER | + BUTTON_BUILD_PRODUCER)) && + data.get_mode() != MODE_BUILD) + continue; + draw_button(button); } } @@ -154,11 +173,16 @@ void Game::draw_button(MenuButton* button) int colour = 0x000000; ButtonAction action = button->get_action(); Mode mode = data.get_mode(); + VertexType build_type = data.get_build_type(); // fixme - there's really got to be a better way... if ((action == BUTTON_BUILD && mode == MODE_BUILD) || (action == BUTTON_ATTACK && mode == MODE_ATTACK) || - (action == BUTTON_MOVE && mode == MODE_MOVE)) + (action == BUTTON_MOVE && mode == MODE_MOVE) || + (action == BUTTON_BUILD_ATTACKER && build_type == VERTEX_ATTACKER) || + (action == BUTTON_BUILD_DEFENDER && build_type == VERTEX_DEFENDER) || + (action == BUTTON_BUILD_PRODUCER && build_type == VERTEX_PRODUCER) + ) colour = 0x0000ff; else if (button->is_at(cursor_x, cursor_y)) colour = 0xff0000; diff --git a/gamedata.h b/gamedata.h index ebb4168..0d2c3da 100644 --- a/gamedata.h +++ b/gamedata.h @@ -9,8 +9,9 @@ #include "graph.h" #include "player.h" -enum Mode {MODE_MOVE, MODE_ATTACK, MODE_BUILD, MODE_SELECT}; -enum VertexType {VERTEX_ATTACKER, VERTEX_DEFENDER, VERTEX_PRODUCER, VERTEX_NONE}; +enum Mode {MODE_MOVE=0x1, MODE_ATTACK=0x2, MODE_BUILD=0x4, MODE_SELECT=0x8}; +enum VertexType {VERTEX_NONE=0x1, VERTEX_ATTACKER=0x2, VERTEX_DEFENDER=0x4, + VERTEX_PRODUCER=0x8}; class GameVertex : public Vertex { @@ -43,6 +44,7 @@ class GameData : public Graph Mode get_mode() const { return mode; } void set_mode(Mode m); + VertexType get_build_type() const { return build_type; } void set_build_type(VertexType type) { build_type = type; } // returns the move/attack range for the specified node diff --git a/menubutton.h b/menubutton.h index 3c96fef..479dcf5 100644 --- a/menubutton.h +++ b/menubutton.h @@ -13,9 +13,9 @@ using std::string; // fixme: there's probably a better way to do this, but SDL's event model // has me hard-pressed to figure out what it is. -enum ButtonAction {BUTTON_BUILD, BUTTON_ATTACK, BUTTON_MOVE, - BUTTON_BUILD_ATTACKER, BUTTON_BUILD_DEFENDER, - BUTTON_BUILD_PRODUCER}; +enum ButtonAction {BUTTON_BUILD=0x1, BUTTON_ATTACK=0x2, BUTTON_MOVE=0x4, + BUTTON_BUILD_ATTACKER=0x8, BUTTON_BUILD_DEFENDER=0x10, + BUTTON_BUILD_PRODUCER=0x20}; class MenuButton {