/*Returns whether has handled event completely or not*/ bool GameChat::handle_event(GameState* gs, SDL_Event *event) { int view_w = gs->view().width, view_h = gs->view().height; int chat_w = view_w, chat_h = 100; int chat_x = 0, chat_y = 0; //h - chat_h - TILE_SIZE; SDLKey keycode = event->key.keysym.sym; SDLMod keymod = event->key.keysym.mod; bool did_typing = false; if (is_typing) { did_typing = (typing_field.handle_event(event)); } switch (event->type) { case SDL_MOUSEBUTTONDOWN: { // if (show_chat && event->button.button == SDL_BUTTON_LEFT // && gs->mouse_x() < chat_w && gs->mouse_y() < chat_h) { // toggle_chat(gs); // return true; // } break; } case SDL_KEYDOWN: { if (keycode == SDLK_RETURN) { toggle_chat(gs); return true; } if (is_typing) { if (keycode == SDLK_BACKSPACE) { if (typing_field.empty()) { reset_typed_message(); is_typing = false; } return true; } if (keycode == SDLK_LCTRL || keycode == SDLK_RCTRL) { is_typing = false; return true; } if (keycode == SDLK_DELETE) { reset_typed_message(); is_typing = false; return true; } } break; } } return did_typing; }
void GameChat::toggle_chat(GameState* gs) { if (is_typing) { if (!typed_message.message.empty()) { typed_message.sender = gs->game_settings().username; int colour_idx = gs->player_data().local_player_data().net_id % player_colours_n; typed_message.sender_colour = player_colours[colour_idx]; if (!handle_special_commands(gs, typed_message.message)) { add_message(typed_message); net_send_chatmessage(gs->net_connection(), typed_message); } } else { show_chat = false; fade_out_rate = 0.1f; } reset_typed_message(); is_typing = false; } else { if (!show_chat) show_chat = true; else if (show_chat) is_typing = true; } }
void GameChat::step(GameState* gs) { std::string& msg = typed_message.message; if (show_chat) fade_out = 1.0f; else if (fade_out > 0.0f) fade_out -= fade_out_rate; if (repeat_steps_left > 0) repeat_steps_left--; else if (current_key != SDLK_FIRST) { /*Handle keys being held down*/ if (is_typeable_keycode(current_key)) { msg += keycode_to_char(current_key, current_mod); repeat_steps_left = NEXT_REPEAT_STEP_AMNT; } else if (current_key == SDLK_BACKSPACE) { if (msg.empty()) { reset_typed_message(); is_typing = false; } else { msg.resize(msg.size() - 1); } repeat_steps_left = NEXT_BACKSPACE_STEP_AMNT; } } }
GameChat::GameChat() : typed_message(std::string(), std::string()) { current_key = SDLK_UNKNOWN; current_mod = KMOD_NONE; reset_typed_message(); show_chat = true; fade_out = 1.0f; fade_out_rate = 0.05f; is_typing = false; repeat_steps_left = 0; }
void GameChat::toggle_chat(GameState* gs) { if (is_typing) { if (!typing_field.empty()) { ChatMessage typed_message = get_field_as_chat_message(gs, true); if (!handle_special_commands(gs, typed_message.message)) { add_message(typed_message); net_send_chatmessage(gs->net_connection(), typed_message); } } else { show_chat = false; fade_out_rate = 0.1f; } reset_typed_message(); is_typing = false; } else { if (!show_chat) show_chat = true; else if (show_chat) is_typing = true; } }
/*Returns whether has handled event completely or not*/ bool GameChat::handle_event(GameState* gs, SDL_Event *event) { int view_w = gs->view().width, view_h = gs->view().height; int chat_w = view_w, chat_h = 100; int chat_x = 0, chat_y = 0; //h - chat_h - TILE_SIZE; SDLKey keycode = event->key.keysym.sym; SDLMod keymod = event->key.keysym.mod; current_mod = keymod; switch (event->type) { case SDL_MOUSEBUTTONDOWN: { // if (show_chat && event->button.button == SDL_BUTTON_LEFT // && gs->mouse_x() < chat_w && gs->mouse_y() < chat_h) { // toggle_chat(gs); // return true; // } break; } case SDL_KEYUP: { if (current_key == keycode) current_key = SDLK_FIRST; /*Let GameState handle this as well*/ break; } case SDL_KEYDOWN: { if (keycode == SDLK_RETURN) { toggle_chat(gs); return true; } if (is_typing) { std::string& msg = typed_message.message; if (is_typeable_keycode(keycode)) { msg += keycode_to_char(keycode, keymod); if (current_key != keycode) { current_key = keycode; repeat_steps_left = INITIAL_REPEAT_STEP_AMNT; } return true; } if (keycode == SDLK_BACKSPACE) { if (msg.empty()) { reset_typed_message(); is_typing = false; } else { msg.resize(msg.size() - 1); } if (current_key != keycode) { current_key = keycode; repeat_steps_left = INITIAL_REPEAT_STEP_AMNT; } return true; } if (keycode == SDLK_LCTRL || keycode == SDLK_RCTRL) { is_typing = false; return true; } if (keycode == SDLK_DELETE) { reset_typed_message(); is_typing = false; return true; } } break; } } return false; }