diff --git a/game.cpp b/game.cpp index d28bccc..6266020 100644 --- a/game.cpp +++ b/game.cpp @@ -97,17 +97,16 @@ void Game::render() // Background image first DrawUtils::draw(display, background, 0, 0); - list vertices = data.get_vertices(); - // Now paint on the targeting circle if (data.get_current_vertex(true) != NULL) { - Vertex* v = data.get_current_vertex(); + GameVertex* v = data.get_current_vertex(); DrawUtils::draw_circle_filled(display, v->x, v->y, range, range_colour); } // First draw the edges, so that they don't obscure any data + list vertices = data.get_vertices(); for (list::iterator cursor = vertices.begin(); cursor != vertices.end(); cursor++) { @@ -125,7 +124,7 @@ void Game::render() // ring the selected vertex and write info about it if (data.get_current_vertex() != NULL) { - Vertex* v = data.get_current_vertex(); + GameVertex* v = data.get_current_vertex(); DrawUtils::draw_circle(display, v->x, v->y, v->r + 5, 0x000000); draw_stats(v); } @@ -134,7 +133,7 @@ void Game::render() for (list::iterator cursor = vertices.begin(); cursor != vertices.end(); cursor++) { - Vertex* v = *cursor; + GameVertex* v = dynamic_cast(*cursor); draw_node(v); } @@ -149,8 +148,7 @@ void Game::render() 0x000000); if (data.get_current_vertex() != NULL && - dynamic_cast(data.get_current_vertex())->player == - data.get_turn()) + data.get_current_vertex()->player == data.get_turn()) { for (list::iterator cursor = buttons.begin(); cursor != buttons.end(); cursor++) @@ -193,7 +191,7 @@ void Game::draw_button(MenuButton* button) } -void Game::draw_node(Vertex* v) +void Game::draw_node(GameVertex* v) { DrawUtils::draw_circle_filled(display, v->x, v->y, v->r, v->colour); @@ -201,7 +199,7 @@ void Game::draw_node(Vertex* v) DrawUtils::draw_text(display, itos(v->score), v->x, v->y, font, 0x00ff00, true, true); - switch (dynamic_cast(v)->type) + switch (v->type) { case VERTEX_ATTACKER: DrawUtils::draw(display, attacker_icon, v->x + 5, v-> y + 5); @@ -242,7 +240,7 @@ void Game::handle_button_press(ButtonAction action) } -void Game::draw_stats(Vertex* v) +void Game::draw_stats(GameVertex* v) { int line_num = 0; int line_height = 14; @@ -251,16 +249,13 @@ void Game::draw_stats(Vertex* v) int adj_y = y; DrawUtils::draw_text(display, "player:", x, adj_y, font); - DrawUtils::draw_text(display, - dynamic_cast(v)->player->get_name(), - x + 50, adj_y, font); + DrawUtils::draw_text(display, v->player->get_name(), x + 50, adj_y, font); line_num++; adj_y = y + line_num * line_height; DrawUtils::draw_text(display, "type:", x, adj_y, font); - VertexType vtype = dynamic_cast(v)->type; string type; - switch(vtype) + switch(v->type) { case VERTEX_ATTACKER: type = "attacker"; @@ -277,13 +272,13 @@ void Game::draw_stats(Vertex* v) line_num++; adj_y = y + line_num * line_height; DrawUtils::draw_text(display, "atk:", x, adj_y, font); - DrawUtils::draw_text(display, itos(dynamic_cast(v)->calculate_attack()), + DrawUtils::draw_text(display, itos(v->calculate_attack()), x + 50, adj_y, font); line_num++; adj_y = y + line_num * line_height; DrawUtils::draw_text(display, "armor:", x, adj_y, font); - DrawUtils::draw_text(display, itos(dynamic_cast(v)->calculate_armor()), + DrawUtils::draw_text(display, itos(v->calculate_armor()), x + 50, adj_y, font); line_num++; @@ -291,7 +286,7 @@ void Game::draw_stats(Vertex* v) DrawUtils::draw_text(display, "hp:", x, adj_y, font); DrawUtils::draw_text(display, itos(v->score), x + 50, adj_y, font); - if (vtype == VERTEX_PRODUCER) + if (v->type == VERTEX_PRODUCER) { line_num++; adj_y = y + line_num * line_height; diff --git a/game.h b/game.h index f341399..bd67e1f 100644 --- a/game.h +++ b/game.h @@ -38,9 +38,9 @@ class Game : public GameState bool right, bool middle); private: - void draw_stats(Vertex* v); + void draw_stats(GameVertex* v); void draw_button(MenuButton* button); - void draw_node(Vertex* v); + void draw_node(GameVertex* v); void handle_button_press(ButtonAction action); diff --git a/gamedata.cpp b/gamedata.cpp index 64e0b0d..972ecf2 100644 --- a/gamedata.cpp +++ b/gamedata.cpp @@ -25,17 +25,20 @@ GameData::GameData() GameData::~GameData() { } -Vertex* GameData::get_current_vertex(bool only_mine) const +GameVertex* GameData::get_current_vertex(bool only_mine) const { if (only_mine) { - if (current != NULL && - dynamic_cast(current)->player == turn) return current; + if (current != NULL) + { + GameVertex* ret = dynamic_cast(current); + if (ret->player == turn) return ret; + } return NULL; } - return current; + return dynamic_cast(current); } @@ -78,7 +81,7 @@ void GameData::handle_click(int x, int y) int colour; colour = turn->get_colour(); - Vertex* v = vertex_at(x, y, 0); + GameVertex* v = dynamic_cast(vertex_at(x, y, 0)); // fixme - energy expenditure should happen in each of these cases except // MODE_SELECT @@ -92,7 +95,7 @@ void GameData::handle_click(int x, int y) add_vertex(x, y, 0, r, colour); break; case MODE_ATTACK: - if (v == NULL || dynamic_cast(v)->player == turn) return; + if (v == NULL || v->player == turn) return; if (v->colour != colour) attack_vertex(v); break; case MODE_MOVE: @@ -111,7 +114,7 @@ void GameData::handle_click(int x, int y) bool GameData::select_vertex(int x, int y) { - Vertex * v = vertex_at(x, y, 0); + GameVertex * v = dynamic_cast(vertex_at(x, y, 0)); if (v == NULL) return false; current = v; @@ -143,7 +146,7 @@ bool GameData::add_vertex(int x, int y, int z, int r, int colour) } // same here - just a logic check - if (dynamic_cast(current)->player != turn) + if (current->player != turn) { delete v; return false; @@ -180,11 +183,11 @@ void GameData::set_mode(Mode m) 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; + if (current->player == turn) mode = m; } -int GameData::get_range(Vertex* node) +int GameData::get_range(GameVertex* node) { if (node == NULL) node = current; @@ -210,10 +213,10 @@ int GameData::get_range(Vertex* node) } -void GameData::attack_vertex(Vertex* target) +void GameData::attack_vertex(GameVertex* target) { - float atk = dynamic_cast(current)->calculate_attack(); - float armor = dynamic_cast(target)->calculate_armor(); + float atk = current->calculate_attack(); + float armor = target->calculate_armor(); int damage = (int)(atk / armor); target->score -= damage; if (target->score <= 0) remove_vertex(target); diff --git a/gamedata.h b/gamedata.h index 45bc448..b917da5 100644 --- a/gamedata.h +++ b/gamedata.h @@ -18,7 +18,7 @@ class GameData : public Graph GameData(); ~GameData(); - Vertex* get_current_vertex(bool only_mine = false) const; + GameVertex* get_current_vertex(bool only_mine = false) const; void clear_current_vertex(); void toggle_turn(); @@ -26,7 +26,7 @@ class GameData : public Graph // select or add vertex, as appropriate void handle_click(int x, int y); bool select_vertex(int x, int y); - void attack_vertex(Vertex* target); + void attack_vertex(GameVertex* target); bool add_vertex(int x, int y, int z, int r, int colour); @@ -38,14 +38,14 @@ class GameData : public Graph // returns the move/attack range for the specified node // (or the selected node if node == NULL) - int get_range(Vertex* node = NULL); + int get_range(GameVertex* node = NULL); // check for (and set, if needed) winner bool endgame(); Player* get_turn() const { return turn; } private: - Vertex* current; + GameVertex* current; Player player1, player2; Player* turn;