// automatically split up any input text, send it, and leave the remainder void chatbox_autosplit_line() { char *remainder,msg[150]; int msg_pixel_width; // if the chat line is getting too long, fire off the message, putting the last // word on the next input line. memset(msg,0,150); Chat_inputbox.get_text(msg); remainder = ""; // determine if the width of the string in pixels is > than the inputbox width -- if so, // then send the message gr_get_string_size(&msg_pixel_width, NULL, msg); // if ( msg_pixel_width >= (Chatbox_inputbox_w - Player->short_callsign_width) ) { if ( msg_pixel_width >= (Chatbox_inputbox_w - 25)) { remainder = strrchr(msg, ' '); if ( remainder ) { *remainder = '\0'; remainder++; } else { remainder = ""; } // if I'm the server, then broadcast the packet chatbox_recall_add(msg); send_game_chat_packet(Net_player, msg, MULTI_MSG_ALL,NULL); chatbox_add_line(msg, MY_NET_PLAYER_NUM); // display any remainder of text on the next line Chat_inputbox.set_text(remainder); } else if((Chat_inputbox.pressed() && (strlen(msg) > 0)) || (strlen(msg) >= CHATBOX_MAX_LEN)) { // tack on the null terminator in the boundary case int x = strlen(msg); if(x >= CHATBOX_MAX_LEN){ msg[CHATBOX_MAX_LEN-1] = '\0'; } // if I'm the server, then broadcast the packet chatbox_recall_add(msg); send_game_chat_packet(Net_player, msg, MULTI_MSG_ALL,NULL); chatbox_add_line(msg, MY_NET_PLAYER_NUM); // display any remainder of text on the next line Chat_inputbox.set_text(remainder); } }
// automatically split up any input text, send it, and leave the remainder void chatbox_autosplit_line() { char *remainder,msg[150]; char temp[150]; int msg_pixel_width; int target, target_length = -1; // if the chat line is getting too long, fire off the message, putting the last // word on the next input line. memset(msg,0,150); Chat_inputbox.get_text(msg); remainder = ""; // check if this message is supposed to have a recipient target = chatbox_get_msg_target_type(msg); target_length = chatbox_get_msg_target_length(msg); // determine if the width of the string in pixels is > than the inputbox width -- if so, // then send the message gr_get_string_size(&msg_pixel_width, NULL, msg); // if ( msg_pixel_width >= (Chatbox_inputbox_w - Player->short_callsign_width) ) { if ( msg_pixel_width >= (Chatbox_inputbox_w - 25)) { remainder = strrchr(msg, ' '); if ( remainder ) { *remainder = '\0'; remainder++; } else { remainder = ""; } // if I'm the server, then broadcast the packet chatbox_recall_add(msg); if (target != MULTI_MSG_EXPR) { send_game_chat_packet(Net_player, msg, target); } else { // copy the name of the player the message is being sent to strncpy(temp, msg+1, target_length-2); temp[target_length-2] = '\0'; send_game_chat_packet(Net_player, msg, target, NULL, temp); } chatbox_add_line(msg, MY_NET_PLAYER_NUM); if (target != MULTI_MSG_ALL) { // we need to add the target the message is going to before we add the rest of the string strncpy(temp, msg, target_length); temp[target_length] = ' '; temp[target_length+1] = '\0'; strcat_s(temp, remainder); Chat_inputbox.set_text(temp); } else { // display any remainder of text on the next line Chat_inputbox.set_text(remainder); } } else if((Chat_inputbox.pressed() && (msg[0] != '\0')) || (strlen(msg) >= CHATBOX_MAX_LEN)) { // tack on the null terminator in the boundary case int x = strlen(msg); if(x >= CHATBOX_MAX_LEN){ msg[CHATBOX_MAX_LEN-1] = '\0'; } // if I'm the server, then broadcast the packet chatbox_recall_add(msg); if (target != MULTI_MSG_EXPR) { send_game_chat_packet(Net_player, msg, target); } else { // copy the name of the player the message is being sent to strncpy(temp, msg+1, target_length-2); temp[target_length-2] = '\0'; send_game_chat_packet(Net_player, msg, target, NULL, temp); } chatbox_add_line(msg, MY_NET_PLAYER_NUM); // display any remainder of text on the next line Chat_inputbox.set_text(remainder); } }
// process pilot callsign void barracks_accept_new_pilot_callsign() { char buf[CALLSIGN_LEN + 1]; char name[MAX_FILENAME_LEN]; int i; int z = 0; Inputbox.get_text(buf); drop_white_space(buf); if (!isalpha(*buf)) { z = 1; } else { for (i=1; buf[i]; i++) { if (!isalpha(buf[i]) && !isdigit(buf[i]) && !strchr(VALID_PILOT_CHARS, buf[i])) { z = 1; return; } } } for (i=1; i<Num_pilots; i++) { if (!stricmp(buf, Pilots[i])) { z = 1; if (pilot_verify_overwrite() == 1) { strcpy_s(name, Pilots[Selected_line]); for (z=i; z<Num_pilots-1; z++) { strcpy(Pilots[z], Pilots[z + 1]); Pilot_ranks[z] = Pilot_ranks[z + 1]; } Num_pilots--; delete_pilot_file(name); z = 0; } return; } } if (!*buf || (i < Num_pilots)) { // duplicate name, alert user z = 1; } if (z) { gamesnd_play_iface(SND_GENERAL_FAIL); return; } strcpy(Pilots[0], buf); strcpy_s(Cur_pilot->callsign, buf); init_new_pilot(Cur_pilot, !Clone_flag); // again, make sure we set his flags correctly to ensure that he gets saved to the proper directory and gets // displayed correctly if (Player_sel_mode == PLAYER_SELECT_MODE_SINGLE) { Cur_pilot->flags &= ~(PLAYER_FLAGS_IS_MULTI); } else { Cur_pilot->flags |= PLAYER_FLAGS_IS_MULTI; Cur_pilot->stats.flags |= STATS_FLAG_MULTIPLAYER; } if ( !(Game_mode & GM_STANDALONE_SERVER) ) { Pilot.save_player(Cur_pilot); } Selected_line = 0; barracks_new_pilot_selected(); barracks_set_callsign_enter_mode(false); }
void player_select_process_input(int k) { char buf[CALLSIGN_LEN + 1]; int idx,z; // if the player is in the process of typing in a new pilot name... switch (k) { // cancel create pilot case KEY_ESC: player_select_cancel_create(); break; // accept a new pilot name case KEY_ENTER: Player_select_input_box.get_text(buf); drop_white_space(buf); z = 0; if (!isalpha(*buf)) { z = 1; } else { for (idx=1; buf[idx]; idx++) { if (!isalpha(buf[idx]) && !isdigit(buf[idx]) && !strchr(VALID_PILOT_CHARS, buf[idx])) { z = 1; break; } } } for (idx=1; idx<Player_select_num_pilots; idx++) { if (!stricmp(buf, Pilots[idx])) { // verify if it is ok to overwrite the file if (pilot_verify_overwrite() == 1) { // delete the pilot and select the beginning of the list Player_select_pilot = idx; player_select_delete_pilot(); Player_select_pilot = 0; idx = Player_select_num_pilots; z = 0; } else z = 1; break; } } if (!*buf || (idx < Player_select_num_pilots)) { z = 1; } if (z) { gamesnd_play_iface(SND_GENERAL_FAIL); break; } // Create the new pilot, and write out his file strcpy(Pilots[0], buf); // if this is the first guy, we should set the Player struct if (Player == NULL) { Player = &Players[0]; Player->reset(); Player->flags |= PLAYER_FLAGS_STRUCTURE_IN_USE; } strcpy_s(Player->callsign, buf); init_new_pilot(Player, !Player_select_clone_flag); // set him as being a multiplayer pilot if we're in the correct mode if (Player_select_mode == PLAYER_SELECT_MODE_MULTI) { Player->flags |= PLAYER_FLAGS_IS_MULTI; Player->stats.flags |= STATS_FLAG_MULTIPLAYER; } // create his pilot file Pilot.save_player(Player); // unset the player Player->reset(); Player = NULL; // make this guy the selected pilot and put him first on the list Player_select_pilot = 0; // unset the input mode player_select_set_input_mode(0); // clear any pending bottom text player_select_set_bottom_text(""); // clear any pending middle text player_select_set_middle_text(""); // ungray all the controls player_select_set_controls(0); // evaluate whether or not this is the very first pilot player_select_eval_very_first_pilot(); break; case 0: break; // always kill middle text when a char is pressed in input mode default: player_select_set_middle_text(""); break; } }
// exit: -1 => error // 0..nchoices-1 => choice int popup_do(popup_info *pi, int flags) { int screen_id, choice = -1, done = 0; if ( popup_init(pi, flags) == -1 ){ return -1; } screen_id = gr_save_screen(); int old_max_w_unscaled = gr_screen.max_w_unscaled; int old_max_h_unscaled = gr_screen.max_h_unscaled; int old_max_w_unscaled_zoomed = gr_screen.max_w_unscaled_zoomed; int old_max_h_unscaled_zoomed = gr_screen.max_h_unscaled_zoomed; gr_reset_screen_scale(); while(!done) { int k; os_poll(); // if we were killed by a call to popup_kill_any_active(), kill the popup if(Popup_should_die){ choice = -1; break; } // if we're flagged as should be running the state underneath, then do so if(flags & PF_RUN_STATE){ game_do_state(gameseq_get_state()); } // otherwise just run the common functions (for networking,etc) else { game_set_frametime(-1); game_do_state_common(gameseq_get_state(),flags & PF_NO_NETWORKING); // do stuff common to all states } k = Popup_window.process(); // poll for input, handle mouse choice = popup_process_keys(pi, k, flags); if ( choice != POPUP_NOCHANGE ) { done=1; } if ( !done ) { choice = popup_check_buttons(pi); if ( choice != POPUP_NOCHANGE ) { done=1; } } // don't draw anything if(!(flags & PF_RUN_STATE)){ gr_restore_screen(screen_id); } // if this is an input popup, store the input text if(flags & PF_INPUT){ Popup_input.get_text(pi->input_text); } Popup_window.draw(); popup_force_draw_buttons(pi); popup_draw_msg_text(pi, flags); popup_draw_button_text(pi, flags); gr_flip(); } gr_set_screen_scale(old_max_w_unscaled, old_max_h_unscaled, old_max_w_unscaled_zoomed, old_max_h_unscaled_zoomed); popup_close(pi,screen_id); return choice; }