diff --git a/src/Bob.cpp b/src/Bob.cpp index 0329911..8003b6e 100644 --- a/src/Bob.cpp +++ b/src/Bob.cpp @@ -45,7 +45,6 @@ void Game::handle_event(SDL_Event *event) this->grid->handle_event(event); this->field_box->handle_event(event); this->upgrade_box->handle_event(event); - this->next_turn_button->handle_event(event); } break; case SDL_KEYDOWN: @@ -72,8 +71,7 @@ void Game::handle_event(SDL_Event *event) { window_size = this->window->toggle_fullscreen(); this->grid->update_dimensions(window_size); - this->text_input_box->update_dimensions({0, window_size.y - 20, 0, 20}); - this->next_turn_button->update_position({window_size.x - 100, window_size.y - 100}); + this->text_input_box->update_dimensions({0, 0, window_size.x, 0}); this->upgrade_box->set_visible(false); } break; @@ -162,35 +160,56 @@ void Game::command(std::string input) { prompt << "This is a test!"; } + else if (input == "next" && this->started) + { + Player *last_player = Player::current_player; + this->turn = this->turn + 1; + if (this->turn == players.size()) + { + this->turn = 0; + trigger_event(BOB_NEXTROUNDEVENT, 0, (void *) last_player, (void *) Player::current_player); + } + else + { + trigger_event(BOB_NEXTTURNEVENT, 0, (void *) last_player, (void *) Player::current_player); + } + Player::current_player = players[turn]; + prompt << "Next player is: " << (Player::current_player)->get_name(); + } else if (input == "surrender") { //Player::current_player->surrender(); } - else if (!this->started) + else if (!this->started && input.substr(0, 10) == "add player") { - if (input.substr(0, 11) == "add player") + Player *added = new Player(input.substr(11, std::string::npos)); + if (!this->grid->place(added)) { - Player *added = new Player(input.substr(11, std::string::npos)); - /*if (!this->grid->place(added)) - { - this->text_input_box->output << "Failed to add player:" << added->get_name(); - delete added; - } - else - { - this->players.push_back(added); - } - */ + prompt << "Failed to add player:" << added->get_name(); + delete added; } - else if (input == "start") + else { - //this->start_game(); - prompt << "Started the game."; + this->players.push_back(added); + prompt << "Added player " << added->get_name(); } } + else if (input == "start" && !this->started) + { + this->start(); + this->started = true; + prompt << "Started the game."; + } this->text_input_box->prompt(prompt.str()); } +void Game::start() +{ + std::random_shuffle(players.begin(), players.end()); + this->turn = 0; + Player::current_player = players[0]; +} + int Game::game_loop() { this->frame_timer->start_timer(); @@ -234,7 +253,6 @@ void Game::render() this->test_box->render(this->renderer); this->field_box->render(this->renderer); this->upgrade_box->render(this->renderer); - this->next_turn_button->render(this->renderer); this->text_input_box->render(this->renderer); this->renderer->present(); } diff --git a/src/Bob.hpp b/src/Bob.hpp index e156fde..528da88 100644 --- a/src/Bob.hpp +++ b/src/Bob.hpp @@ -58,6 +58,8 @@ public: } this->frame_timer = new Timer(); this->move_timer = new Timer(); + this->turn = 0; + Player::current_player = this->players[turn]; } ~Game() @@ -79,6 +81,8 @@ public: delete this->layout; } + void start(); + void command(std::string command); void render(); @@ -89,6 +93,7 @@ public: private: bool started; + Uint64 turn; TextInputBox *text_input_box; std::vector players; NextTurnButtonBox *next_turn_button; diff --git a/src/Gameplay.cpp b/src/Gameplay.cpp index 7a90f24..fcf70e8 100644 --- a/src/Gameplay.cpp +++ b/src/Gameplay.cpp @@ -597,4 +597,9 @@ bool inside_target(const SDL_Rect *target, const SDL_Point *position) { return target->x < position->x && target->x + target->w > position->x && target->y < position->y && target->y + target->h > position->y; +} + +bool HexagonGrid::place(Player *player) +{ + return true; } \ No newline at end of file diff --git a/src/Gameplay.hpp b/src/Gameplay.hpp index 303c6a0..bb3ccc4 100644 --- a/src/Gameplay.hpp +++ b/src/Gameplay.hpp @@ -605,6 +605,7 @@ public: bool get_fighting() { return this->fighting; } void set_fighting(bool state) { this->fighting = state; } + private: bool fighting; const Field field; @@ -685,6 +686,8 @@ public: void handle_event(SDL_Event *event); + bool place(Player *player); + private: bool changed; FieldMeta *first_attack; diff --git a/src/Gui.cpp b/src/Gui.cpp index b8eb3eb..8ef4fbe 100644 --- a/src/Gui.cpp +++ b/src/Gui.cpp @@ -25,21 +25,19 @@ bool TextBox::load_text(std::string text) const char *displayed_text = text.c_str(); SDL_Surface *text_surface = TTF_RenderUTF8_Blended_Wrapped(this->font, displayed_text, this->color, this->dimensions.w); + this->dimensions.h = text_surface->h; if (text_surface == nullptr) { SDL_FreeSurface(text_surface); throw SDL_TTFException(); } - //this->dimensions.w = text_surface->w; - //this->dimensions.h = text_surface->h; - SDL_Surface *surface = SDL_CreateRGBSurface(0, this->dimensions.w, this->dimensions.h, 32, rmask, gmask, bmask, + SDL_Surface *surface = SDL_CreateRGBSurface(0, this->dimensions.w, text_surface->h, 32, rmask, gmask, bmask, amask); if (surface == nullptr || SDL_LockSurface(surface) < 0 || SDL_FillRect(surface, nullptr, SDL_MapRGB(surface->format, 255, 255, 255)) < 0) { throw SDL_Exception("Failed to fill rect behind text!"); } - //SDL_Rect text_rect = {this->dimensions.x, this->dimensions.y, surface->w, surface->h}; SDL_UnlockSurface(surface); if (SDL_BlitSurface(text_surface, nullptr, surface, nullptr) < 0) { @@ -220,7 +218,7 @@ void UpgradeBox::render(Renderer *ext_renderer) } SDL_Rect dim = this->upgrades[0]->get_dimensions(); this->dimensions.w = dim.w; - this->dimensions.h = (dim.h + 4) * (int) this->upgrades.size(); + this->dimensions.h = dim.h * (int) this->upgrades.size(); } void Container::render(Renderer *renderer) @@ -267,9 +265,9 @@ void UpgradeBox::update_position(SDL_Point pos) for (auto box : this->upgrades) { box->update_position(d_pos); - d_pos.y += 20; + d_pos.y += box->get_dimensions().h; } - this->upgrade_info->update_position({pos.x + 110, pos.y}); + this->upgrade_info->update_position({pos.x + this->upgrades[0]->get_dimensions().w, pos.y}); } void UpgradeBox::set_visible(bool status) @@ -339,8 +337,11 @@ void TextInputBox::handle_event(const SDL_Event *event) } else if (event->key.keysym.sym == SDLK_BACKSPACE) { - input << '\b'; - input << " "; + std::string foo = input.str(); + if (!foo.empty()) + foo.pop_back(); + input.str(foo); + input.seekp(foo.length()); changed = true; } else if (event->key.keysym.sym == SDLK_c && SDL_GetModState() & KMOD_CTRL) @@ -379,11 +380,10 @@ void TextInputBox::handle_event(const SDL_Event *event) void TextInputBox::prompt(std::string message) { - this->output << this->input.str() << "\n" << message << "\n# "; + this->output << this->input.str() << "\n" << message << "\n" << Player::current_player->get_name() << "# "; this->lines += 2; - this->dimensions.h = (this->font_height * lines); this->load_text(output.str()); - if (this->dimensions.h > 500) + if (lines > 20) { this->lines = 2; output.str(""); @@ -404,6 +404,7 @@ void TextInputBox::update_dimensions(SDL_Rect rect) this->dimensions.x = rect.x; this->dimensions.y = rect.y; this->dimensions.w = rect.w; + this->load_text(output.str()); } bool TextInputBox::get_active() diff --git a/src/Gui.hpp b/src/Gui.hpp index 3d65201..6832d68 100644 --- a/src/Gui.hpp +++ b/src/Gui.hpp @@ -51,7 +51,7 @@ class TextBox : public Box { public: TextBox(Renderer *renderer, SDL_Rect dimensions, SDL_Color color, TTF_Font *font_) - : Box(renderer, dimensions, color), font(font_) + : Box(renderer, dimensions, color), font(font_), lines(1) { this->font_height = TTF_FontHeight(font); } @@ -62,6 +62,7 @@ public: protected: TTF_Font *font; + Uint16 lines; int font_height; }; @@ -69,10 +70,10 @@ class TextInputBox : TextBox { public: TextInputBox(Renderer *renderer_, SDL_Rect dimensions_, SDL_Color color_, TTF_Font *font_) - : TextBox(renderer_, dimensions_, color_, font_), input(""), lines(1) + : TextBox(renderer_, dimensions_, color_, font_), input("") { this->visible = false; - this->output << "# "; + this->output << Player::current_player->get_name() << "# "; this->load_text(output.str()); } @@ -93,7 +94,6 @@ public: void prompt(std::string message); private: - Uint16 lines; std::ostringstream output; // what is loaded to the texture - currnt input std::stringstream input; // editable command prompt };