// process this frame for the chatbox int chatbox_process(int key_in) { int key_out; key_out = key_in; // if the chatbox hasn't explicitly been created, we can't do any processing if(!Chatbox_created){ return key_out; } // process the incoming key appropriately if (key_in == -1) { key_out = Chat_window.process(); } else { key_out = Chat_window.process(key_in); } // look for special keypresses switch(key_out){ // line recall up one case KEY_UP: chatbox_recall_up(); key_out = 0; break; // line recall down one case KEY_DOWN: chatbox_recall_down(); key_out = 0; break; } // if we're supposed to be checking our own scroll buttons if((Chatbox_mode_flags & CHATBOX_FLAG_BUTTONS) && (Chatbox_mode_flags & CHATBOX_FLAG_DRAW_BOX)){ if ( Chatbox_buttons[gr_screen.res][CHATBOX_SCROLL_UP].button.pressed() ) { chatbox_scroll_up(); } if ( Chatbox_buttons[gr_screen.res][CHATBOX_SCROLL_DOWN].button.pressed() ) { chatbox_scroll_down(); } if ( Chatbox_buttons[gr_screen.res][CHATBOX_TOGGLE_SIZE].button.pressed() ){ chatbox_toggle_size(); } } // check to see if the enter text button has been pressed if ( Chat_enter_text.pressed() ) { Chat_inputbox.set_focus(); } // check to see if the current input text needs to be split up and sent automaticall chatbox_autosplit_line(); return key_out; }
// called once per frame when game state is GS_STATE_RED_ALERT void red_alert_do_frame(float frametime) { int i, k; // ensure that the red alert interface has been initialized if (!Red_alert_inited) { Int3(); return; } // commit if skipping briefing, but not in multi - Goober5000 if (!(Game_mode & GM_MULTIPLAYER)) { if (The_mission.flags[Mission::Mission_Flags::No_briefing]) { red_alert_button_pressed(RA_CONTINUE); return; } } k = Ui_window.process() & ~KEY_DEBUGGED; switch (k) { case KEY_ESC: // gameseq_post_event(GS_EVENT_ENTER_GAME); gameseq_post_event(GS_EVENT_MAIN_MENU); break; } // end switch for (i=0; i<NUM_BUTTONS; i++){ if (Buttons[gr_screen.res][i].button.pressed()){ red_alert_button_pressed(i); } } GR_MAYBE_CLEAR_RES(Background_bitmap); if (Background_bitmap >= 0) { gr_set_bitmap(Background_bitmap); gr_bitmap(0, 0, GR_RESIZE_MENU); } Ui_window.draw(); // hud_anim_render(&Flash_anim, frametime); font::set_font(font::FONT1); if ( timestamp_elapsed(Text_delay) ) { int finished_wipe = 0; if ( Briefing->num_stages > 0 ) { finished_wipe = brief_render_text(0, Ra_brief_text_wnd_coords[gr_screen.res][RA_X_COORD], Ra_brief_text_wnd_coords[gr_screen.res][RA_Y_COORD], Ra_brief_text_wnd_coords[gr_screen.res][RA_H_COORD], frametime, 0); } if (finished_wipe) { red_alert_voice_play(); } } // blit incoming transmission red_alert_blit_title(); gr_flip(); }
// gameplay_help_do_frame() is the function that displays help when acutally playing the game void gameplay_help_do_frame(float frametime) { int i, k; // ensure the gameplay help interface has been initialized if (!Gameplay_help_inited) { Int3(); return; } // make sure game sounds are paused weapon_pause_sounds(); audiostream_pause_all(); k = Ui_window.process() & ~KEY_DEBUGGED; gameplay_help_process_key(k); for (i=0; i<NUM_BUTTONS; i++){ if (Buttons[gr_screen.res][i].button.pressed()){ gameplay_help_button_pressed(i); } } GR_MAYBE_CLEAR_RES(Background_bitmap); if (Background_bitmap >= 0) { gr_set_bitmap(Background_bitmap); gr_bitmap(0, 0, GR_RESIZE_MENU); } Ui_window.draw(); gameplay_help_draw_text(); gr_flip(); }
// run the popup in a tight loop (no states) void multi_pinfo_popup_do() { int k; // if there was an error in initialization, return immediately if (Multi_pinfo_popup_error) { return; } // tight loop while (!Multi_pinfo_popup_done) { multi_pinfo_maybe_reload_pic(&Mp_pilot); multi_pinfo_maybe_reload_pic(&Mp_squad); // process the window k = Multi_pinfo_window.process(); switch (k) { case KEY_ESC : Multi_pinfo_popup_done = 1; break; } // check button presses multi_pinfo_popup_check_buttons(); // set frametime and run background stuff game_set_frametime(-1); game_do_state_common(gameseq_get_state()); // draw the background bitmap and the ui window over it Assert(Multi_pinfo_screen_save != -1); gr_reset_clip(); gr_restore_screen(Multi_pinfo_screen_save); // grey the screen gr_set_shader(&Grey_shader); gr_shade(0, 0, gr_screen.clip_width, gr_screen.clip_height, false); // draw the background bitmap gr_set_bitmap(Multi_pinfo_bitmap); gr_bitmap(0, 0); // blit the selected pilot image multi_pinfo_blit_pilot_image(); // blit the squadron logo multi_pinfo_blit_squadron_logo(); // blit the player statistics multi_pinfo_blit_player_stats(); // draw the ui window and flip Multi_pinfo_window.draw(); gr_flip(); } }
// debug pause do frame void pause_debug_do() { int key; key = Pause_win.process(); if (Pause_single_step.changed()) { game_single_step = Pause_single_step.checked(); } if (Pause_physics.changed()) { physics_paused = Pause_physics.checked(); } if (Pause_ai.changed()) { ai_paused = Pause_ai.checked(); if (ai_paused) { obj_init_all_ships_physics(); } } if (Pause_ai_render.changed()) { Ai_render_debug_flag = Pause_ai_render.checked(); } if (Pause_firing.changed()) { Ai_firing_enabled = Pause_firing.checked(); } if (Pause_external_view_mode_check.changed()) { Pause_external_view_mode = Pause_external_view_mode_check.checked(); if (Pause_external_view_mode) { HUD_sourced_printf(HUD_SOURCE_HIDDEN, XSTR("External view of player ship.", 182)); } else { HUD_sourced_printf(HUD_SOURCE_HIDDEN, XSTR("View from inside player ship.", 183)); } } if (Pause_continue.pressed() || (key == KEY_PAUSE)) { // Changed, MK, 11/9/97, only Pause break pause. gameseq_post_event(GS_EVENT_PREVIOUS_STATE); } gr_clear(); Pause_win.draw(); gr_flip(); }
int popup_do_with_condition(popup_info *pi, int flags, int(*condition)()) { int screen_id, choice = -1, done = 0; int test; screen_id = gr_save_screen(); if ( popup_init(pi, flags) == -1 ) return -1; 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(); game_set_frametime(-1); game_do_state_common(gameseq_get_state()); // do stuff common to all states gr_restore_screen(screen_id); // draw one frame first Popup_window.draw(); popup_force_draw_buttons(pi); popup_draw_msg_text(pi, flags); popup_draw_button_text(pi, flags); gr_flip(); // test the condition function or process for the window if ((test = condition()) > 0) { done = 1; choice = test; } else { 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; } } } } 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; }
// called once a frame during show goals state to process events and render the screen void mission_show_goals_do_frame(float frametime) { int k, i, y, z; int font_height = gr_get_font_height(); k = Goals_screen_ui_window.process(); switch (k) { case KEY_ESC: mission_goal_exit(); break; case KEY_DOWN: goal_screen_scroll_down(); break; case KEY_UP: goal_screen_scroll_up(); break; default: // do nothing break; } // end switch for (i=0; i<NUM_GOAL_SCREEN_BUTTONS; i++){ if (Goal_buttons[i].button.pressed()){ goal_screen_button_pressed(i); } } GR_MAYBE_CLEAR_RES(Goals_screen_bg_bitmap); if (Goals_screen_bg_bitmap >= 0) { gr_set_bitmap(Goals_screen_bg_bitmap); gr_bitmap(0, 0, GR_RESIZE_MENU); } Goals_screen_ui_window.draw(); y = 0; z = Scroll_offset; while (y + font_height <= Goal_screen_text_h) { Goal_text.display(z, y); y += font_height; z++; } Primary_goal_list.icons_display(Scroll_offset); Secondary_goal_list.icons_display(Scroll_offset); Bonus_goal_list.icons_display(Scroll_offset); gr_flip(); }
// do frame void multi_df_debrief_do() { int k, new_k; char buf[256]; k = chatbox_process(); new_k = Multi_df_window.process(k, 0); // process keypresses switch(new_k){ case KEY_ESC: multi_debrief_esc_hit(); break; } // process buttons multi_df_process_buttons(); // music stuff common_music_do(); // process debriefing details multi_debrief_do_frame(); // draw the background GR_MAYBE_CLEAR_RES(Multi_df_background_bitmap); if (Multi_df_background_bitmap >= 0) { gr_set_bitmap(Multi_df_background_bitmap); gr_bitmap(0, 0, GR_RESIZE_MENU); } // draw the window Multi_df_window.draw(); // kill matrix multi_df_blit_kill_matrix(); // render the chatbox chatbox_render(); // draw the mission title strcpy_s(buf, The_mission.name); font::force_fit_string(buf, 255, Kill_matrix_title_coords[gr_screen.res][2]); gr_set_color_fast(&Color_bright_white); gr_string(Kill_matrix_title_coords[gr_screen.res][0], Kill_matrix_title_coords[gr_screen.res][1], buf, GR_RESIZE_MENU); // flip gr_flip(); }
// --------------------------------------------------------------------- // mission_hotkey_do_frame() // // Called once per frame to process user input for the Hotkey Assignment Screen // void mission_hotkey_do_frame(float frametime) { char buf[256]; int i, k, w, h, y, z, line, hotkeys; int font_height = gr_get_font_height(); int select_tease_line = -1; // line mouse is down on, but won't be selected until button released color circle_color; if ( help_overlay_active(Hotkey_overlay_id) ) { Buttons[gr_screen.res][HELP_BUTTON].button.reset_status(); Ui_window.set_ignore_gadgets(1); } k = Ui_window.process() & ~KEY_DEBUGGED; if ( (k > 0) || B1_JUST_RELEASED ) { if ( help_overlay_active(Hotkey_overlay_id) ) { help_overlay_set_state(Hotkey_overlay_id, gr_screen.res, 0); Ui_window.set_ignore_gadgets(0); k = 0; } } if ( !help_overlay_active(Hotkey_overlay_id) ) { Ui_window.set_ignore_gadgets(0); } switch (k) { case KEY_DOWN: // scroll list down hotkey_scroll_line_down(); break; case KEY_UP: // scroll list up hotkey_scroll_line_up(); break; case KEY_PAGEDOWN: // scroll list down hotkey_scroll_screen_down(); break; case KEY_PAGEUP: // scroll list up hotkey_scroll_screen_up(); break; case KEY_CTRLED | KEY_ENTER: save_hotkeys(); // fall through to next state -- allender changed this behavior since ESC should always cancel, no? case KEY_ESC: mission_hotkey_exit(); break; case KEY_TAB: case KEY_ENTER: case KEY_PADENTER: expand_wing(); break; case KEY_EQUAL: case KEY_PADPLUS: add_hotkey(Cur_hotkey); break; case KEY_MINUS: case KEY_PADMINUS: remove_hotkey(); break; case KEY_F2: gameseq_post_event(GS_EVENT_OPTIONS_MENU); break; case KEY_CTRLED | KEY_R: reset_hotkeys(); break; case KEY_CTRLED | KEY_C: clear_hotkeys(); break; } // end switch // ? for (i=0; i<MAX_KEYED_TARGETS; i++) { if (k == Key_sets[i]) Cur_hotkey = i; if (k == (Key_sets[i] | KEY_SHIFTED)) add_hotkey(i); } // handle pressed buttons for (i=0; i<NUM_BUTTONS; i++) { if (Buttons[gr_screen.res][i].button.pressed()) { hotkey_button_pressed(i); break; // only need to handle 1 button @ a time } } for (i=0; i<LIST_BUTTONS_MAX; i++) { // check for tease line if (List_buttons[i].button_down()) { select_tease_line = i + Scroll_offset; } // check for selected list item if (List_buttons[i].pressed()) { Selected_line = i + Scroll_offset; List_buttons[i].get_mouse_pos(&z, NULL); z += Hotkey_list_coords[gr_screen.res][0]; // adjust to full screen space if ((z >= Hotkey_wing_icon_x[gr_screen.res]) && (z < (Hotkey_wing_icon_x[gr_screen.res]) + Hotkey_function_field_width[gr_screen.res])) { expand_wing(); } } if (List_buttons[i].double_clicked()) { Selected_line = i + Scroll_offset; hotkeys = -1; switch (Hotkey_lines[Selected_line].type) { case HOTKEY_LINE_WING: hotkeys = get_wing_hotkeys(Hotkey_lines[Selected_line].index); break; case HOTKEY_LINE_SHIP: case HOTKEY_LINE_SUBSHIP: hotkeys = Hotkey_bits[Hotkey_lines[Selected_line].index]; break; } if (hotkeys != -1) { if (hotkeys & (1 << Cur_hotkey)) remove_hotkey(); else add_hotkey(Cur_hotkey); } } } GR_MAYBE_CLEAR_RES(Background_bitmap); if (Background_bitmap >= 0) { gr_set_bitmap(Background_bitmap); gr_bitmap(0, 0, GR_RESIZE_MENU); } else gr_clear(); Ui_window.draw(); gr_init_color(&circle_color, 160, 160, 0); // draw the big "F10" in the little box font::set_font(font::FONT2); gr_set_color_fast(&Color_text_normal); strcpy_s(buf, Scan_code_text[Key_sets[Cur_hotkey]]); gr_get_string_size(&w, &h, buf); gr_printf_menu(Hotkey_function_name_coords[gr_screen.res][0] + (Hotkey_function_name_coords[gr_screen.res][2] - w) / 2, Hotkey_function_name_coords[gr_screen.res][1], buf); font::set_font(font::FONT1); line = Scroll_offset; while (hotkey_line_query_visible(line)) { z = Hotkey_lines[line].index; y = Hotkey_list_coords[gr_screen.res][1] + Hotkey_lines[line].y - Hotkey_lines[Scroll_offset].y; hotkeys = 0; switch (Hotkey_lines[line].type) { case HOTKEY_LINE_HEADING: gr_set_color_fast(&Color_text_heading); gr_get_string_size(&w, &h, Hotkey_lines[line].label); i = y + h / 2 - 1; gr_line(Hotkey_list_coords[gr_screen.res][0], i, Hotkey_ship_x[gr_screen.res] - 2, i, GR_RESIZE_MENU); gr_line(Hotkey_ship_x[gr_screen.res] + w + 1, i, Hotkey_list_coords[gr_screen.res][0] + Hotkey_list_coords[gr_screen.res][2], i, GR_RESIZE_MENU); break; case HOTKEY_LINE_WING: gr_set_bitmap(Wing_bmp); bm_get_info(Wing_bmp, NULL, &h, NULL); i = y + font_height / 2 - h / 2 - 1; gr_bitmap(Hotkey_wing_icon_x[gr_screen.res], i, GR_RESIZE_MENU); // i = y + font_height / 2 - 1; // gr_set_color_fast(&circle_color); // gr_circle(ICON_LIST_X + 4, i, 5, GR_RESIZE_MENU); // gr_set_color_fast(&Color_bright); // gr_line(ICON_LIST_X, i, ICON_LIST_X + 2, i, GR_RESIZE_MENU); // gr_line(ICON_LIST_X + 4, i - 4, ICON_LIST_X + 4, i - 2, GR_RESIZE_MENU); // gr_line(ICON_LIST_X + 6, i, ICON_LIST_X + 8, i, GR_RESIZE_MENU); // gr_line(ICON_LIST_X + 4, i + 2, ICON_LIST_X + 4, i + 4, GR_RESIZE_MENU); hotkeys = get_wing_hotkeys(Hotkey_lines[line].index); break; case HOTKEY_LINE_SHIP: case HOTKEY_LINE_SUBSHIP: hotkeys = Hotkey_bits[Hotkey_lines[line].index]; break; default: Int3(); } if (Hotkey_lines[line].type != HOTKEY_LINE_HEADING) { Assert( (line - Scroll_offset) < LIST_BUTTONS_MAX ); List_buttons[line - Scroll_offset].update_dimensions(Hotkey_list_coords[gr_screen.res][0], y, Hotkey_list_coords[gr_screen.res][0] + Hotkey_list_coords[gr_screen.res][2] - Hotkey_list_coords[gr_screen.res][0], font_height); List_buttons[line - Scroll_offset].enable(); if (hotkeys & (1 << Cur_hotkey)) { gr_set_color_fast(&Color_text_active); } else { if (line == Selected_line) gr_set_color_fast(&Color_text_selected); else if (line == select_tease_line) gr_set_color_fast(&Color_text_subselected); else gr_set_color_fast(&Color_text_normal); } } else { Assert( (line - Scroll_offset) < LIST_BUTTONS_MAX ); List_buttons[line - Scroll_offset].disable(); } // print active hotkeys associated for this line if (hotkeys) { for (i=0; i<MAX_KEYED_TARGETS; i++) { if (hotkeys & (1 << i)) { gr_printf_menu(Hotkey_list_coords[gr_screen.res][0] + Hotkey_function_field_width[gr_screen.res]*i, y, Scan_code_text[Key_sets[i]]); } } /* *buf = 0; for (i=0; i<MAX_KEYED_TARGETS; i++) { if (hotkeys & (1 << i)) { strcat_s(buf, Scan_code_text[Key_sets[i]]); strcat_s(buf, ", "); } } Assert(strlen(buf) > 1); buf[strlen(buf) - 2] = 0; // lose the ", " on the end font::force_fit_string(buf, 255, GROUP_LIST_W); gr_printf_menu(GROUP_LIST_X, y, buf);*/ } // draw ship/wing name strcpy_s(buf, Hotkey_lines[line].label); end_string_at_first_hash_symbol(buf); if (Hotkey_lines[line].type == HOTKEY_LINE_SUBSHIP) { // indent font::force_fit_string(buf, 255, Hotkey_list_coords[gr_screen.res][0] + Hotkey_list_coords[gr_screen.res][2] - (Hotkey_ship_x[gr_screen.res]+20)); gr_printf_menu(Hotkey_ship_x[gr_screen.res]+20, y, buf); } else { font::force_fit_string(buf, 255, Hotkey_list_coords[gr_screen.res][0] + Hotkey_list_coords[gr_screen.res][2] - Hotkey_ship_x[gr_screen.res]); gr_printf_menu(Hotkey_ship_x[gr_screen.res], y, buf); } line++; } i = line - Scroll_offset; while (i < LIST_BUTTONS_MAX) List_buttons[i++].disable(); // blit help overlay if active help_overlay_maybe_blit(Hotkey_overlay_id, gr_screen.res); gr_flip(); }
// Called once per frame to run the dead popup int popupdead_do_frame(float frametime) { int k, choice; if ( !Popupdead_active ) { return -1; } // maybe show skip mission popup if ((!Popupdead_skip_already_shown) && (Player->show_skip_popup) && (Game_mode & GM_NORMAL) && (Game_mode & GM_CAMPAIGN_MODE) && (Player->failures_this_session >= PLAYER_MISSION_FAILURE_LIMIT)) { int popup_choice = popup(0, 3, XSTR("Do Not Skip This Mission", 1473), XSTR("Advance To The Next Mission", 1474), XSTR("Don't Show Me This Again", 1475), XSTR("You have failed this mission five times. If you like, you may advance to the next mission.", 1472) ); switch (popup_choice) { case 0: // stay on this mission, so proceed to normal death popup // in other words, do nothing. break; case 1: // skip this mission Popupdead_active = 0; mission_campaign_skip_to_next(); gameseq_post_event(GS_EVENT_START_GAME); return -1; case 2: // don't show this again Player->show_skip_popup = 0; break; } Popupdead_skip_already_shown = 1; } k = Popupdead_window.process(); choice = popupdead_process_keys(k); if ( choice >= 0 ) { // do something different for single/multiplayer if ( Game_mode & GM_NORMAL ) { Popupdead_choice=choice; } else { Assert( Popupdead_multi_type != -1 ); switch ( Popupdead_multi_type ) { case POPUPDEAD_OBS_ONLY: case POPUPDEAD_OBS_QUIT: Popupdead_choice = POPUPDEAD_DO_OBSERVER; if ( (Popupdead_multi_type == POPUPDEAD_OBS_QUIT) && (choice == 1) ) Popupdead_choice = POPUPDEAD_DO_MAIN_HALL; break; case POPUPDEAD_RESPAWN_ONLY: case POPUPDEAD_RESPAWN_QUIT: Popupdead_choice = POPUPDEAD_DO_RESPAWN; if ( (Popupdead_multi_type == POPUPDEAD_RESPAWN_QUIT) && (choice == 1) ) Popupdead_choice = POPUPDEAD_DO_MAIN_HALL; break; default: Int3(); break; } } } choice = popupdead_check_buttons(); if ( choice >= 0 ) { // do something different for single/multiplayer if ( Game_mode & GM_NORMAL ) { Popupdead_choice=choice; } else { Assert( Popupdead_multi_type != -1 ); switch ( Popupdead_multi_type ) { case POPUPDEAD_OBS_ONLY: case POPUPDEAD_OBS_QUIT: Popupdead_choice = POPUPDEAD_DO_OBSERVER; if ( (Popupdead_multi_type == POPUPDEAD_OBS_QUIT) && (choice == 1) ) Popupdead_choice = POPUPDEAD_DO_MAIN_HALL; break; case POPUPDEAD_RESPAWN_ONLY: case POPUPDEAD_RESPAWN_QUIT: Popupdead_choice = POPUPDEAD_DO_RESPAWN; if ( (Popupdead_multi_type == POPUPDEAD_RESPAWN_QUIT) && (choice == 1) ) Popupdead_choice = POPUPDEAD_DO_MAIN_HALL; break; default: Int3(); break; } } } Popupdead_window.draw(); popupdead_force_draw_buttons(); popupdead_draw_button_text(); // maybe force the player to respawn if they've taken too long to choose if (( Game_mode & GM_MULTIPLAYER ) && (The_mission.max_respawn_delay >= 0) && (timestamp_elapsed(Popupdead_timer)) && (choice < 0)) { if (( Popupdead_multi_type == POPUPDEAD_RESPAWN_ONLY) || ( Popupdead_multi_type == POPUPDEAD_RESPAWN_QUIT)) { Popupdead_choice = POPUPDEAD_DO_RESPAWN; } } return Popupdead_choice; }
void credits_do_frame(float frametime) { int i, k, next, percent, bm1, bm2; int bx1, by1, bw1, bh1; int bx2, by2, bw2, bh2; // Use this id to trigger the start of music playing on the credits screen if ( timestamp_elapsed(Credits_music_begin_timestamp) ) { Credits_music_begin_timestamp = 0; credits_start_music(); } k = Ui_window.process(); switch (k) { case KEY_ESC: gameseq_post_event(GS_EVENT_MAIN_MENU); key_flush(); break; case KEY_CTRLED | KEY_UP: case KEY_SHIFTED | KEY_TAB: if ( !(Player->flags & PLAYER_FLAGS_IS_MULTI) ) { credits_screen_button_pressed(CUTSCENES_BUTTON); break; } // else, react like tab key. case KEY_CTRLED | KEY_DOWN: case KEY_TAB: credits_screen_button_pressed(TECH_DATABASE_BUTTON); break; default: break; } // end switch for (i=0; i<NUM_BUTTONS; i++){ if (Buttons[i][gr_screen.res].button.pressed()){ if (credits_screen_button_pressed(i)){ return; } } } gr_reset_clip(); GR_MAYBE_CLEAR_RES(Background_bitmap); if (Background_bitmap >= 0) { gr_set_bitmap(Background_bitmap); gr_bitmap(0, 0); } percent = (int) (100.0f - (CREDITS_ARTWORK_DISPLAY_TIME - Credits_counter) * 100.0f / CREDITS_ARTWORK_FADE_TIME); if (percent < 0){ percent = 0; } next = Credits_artwork_index + 1; if (next >= NUM_IMAGES){ next = 0; } if (Credits_bmps[Credits_artwork_index] < 0) { char buf[40]; if (gr_screen.res == GR_1024) { sprintf(buf, NOX("2_CrIm%.2d"), Credits_artwork_index); } else { sprintf(buf, NOX("CrIm%.2d"), Credits_artwork_index); } Credits_bmps[Credits_artwork_index] = bm_load(buf); } if (Credits_bmps[next] < 0) { char buf[40]; if (gr_screen.res == GR_1024) { sprintf(buf, NOX("2_CrIm%.2d"), Credits_artwork_index); } else { sprintf(buf, NOX("CrIm%.2d"), next); } Credits_bmps[next] = bm_load(buf); } bm1 = Credits_bmps[Credits_artwork_index]; bm2 = Credits_bmps[next]; if((bm1 != -1) && (bm2 != -1)){ Assert(percent >= 0 && percent <= 100); // get width and height bm_get_info(bm1, &bw1, &bh1, NULL, NULL, NULL); bm_get_info(bm2, &bw2, &bh2, NULL, NULL, NULL); // determine where to draw the coords bx1 = Credits_image_coords[gr_screen.res][CREDITS_X_COORD] + ((Credits_image_coords[gr_screen.res][CREDITS_W_COORD] - bw1)/2); by1 = Credits_image_coords[gr_screen.res][CREDITS_Y_COORD] + ((Credits_image_coords[gr_screen.res][CREDITS_H_COORD] - bh1)/2); bx2 = Credits_image_coords[gr_screen.res][CREDITS_X_COORD] + ((Credits_image_coords[gr_screen.res][CREDITS_W_COORD] - bw2)/2); by2 = Credits_image_coords[gr_screen.res][CREDITS_Y_COORD] + ((Credits_image_coords[gr_screen.res][CREDITS_H_COORD] - bh2)/2); gr_cross_fade(bm1, bm2, bx1, by1, bx2, by2, (float)percent / 100.0f); } /* if (CreditsWin01 != -1) { gr_set_bitmap(CreditsWin01); gr_bitmap(233, 5); } if (CreditsWin02 != -1) { gr_set_bitmap(CreditsWin02); gr_bitmap(616, 8); } if (CreditsWin03 != -1) { gr_set_bitmap(CreditsWin03); gr_bitmap(233, 299); } if (CreditsWin04 != -1) { gr_set_bitmap(CreditsWin04); gr_bitmap(215, 8); } */ Ui_window.draw(); for (i=TECH_DATABASE_BUTTON; i<=CREDITS_BUTTON; i++){ if (Buttons[i][gr_screen.res].button.button_down()){ break; } } if (i > CREDITS_BUTTON){ Buttons[CREDITS_BUTTON][gr_screen.res].button.draw_forced(2); } gr_set_clip(Credits_text_coords[gr_screen.res][CREDITS_X_COORD], Credits_text_coords[gr_screen.res][CREDITS_Y_COORD], Credits_text_coords[gr_screen.res][CREDITS_W_COORD], Credits_text_coords[gr_screen.res][CREDITS_H_COORD]); gr_set_font(FONT1); gr_set_color_fast(&Color_normal); int sy; if ( Credit_position > 0 ) { sy = fl2i(Credit_position+0.5f); } else { sy = fl2i(Credit_position-0.5f); } gr_string(0x8000, sy, Credit_text); int temp_time; temp_time = timer_get_milliseconds(); Credits_frametime = temp_time - Credits_last_time; Credits_last_time = temp_time; timestamp_inc(Credits_frametime / 1000.0f); float fl_frametime = i2fl(Credits_frametime) / 1000.f; if (keyd_pressed[KEY_LSHIFT]) { Credit_position -= fl_frametime * CREDITS_SCROLL_RATE * 4.0f; } else { Credit_position -= fl_frametime * CREDITS_SCROLL_RATE; } if (Credit_position < Credit_stop_pos){ Credit_position = Credit_start_pos; } Credits_counter += fl_frametime; while (Credits_counter >= CREDITS_ARTWORK_DISPLAY_TIME) { Credits_counter -= CREDITS_ARTWORK_DISPLAY_TIME; Credits_artwork_index = next; } gr_flip(); }
// do void fiction_viewer_do_frame(float frametime) { int i, k, w, h; // make sure we exist if (!Fiction_viewer_inited) { fiction_viewer_exit(); return; } // process keys k = Fiction_viewer_window.process() & ~KEY_DEBUGGED; switch (k) { case KEY_ESC: common_music_close(); gameseq_post_event(GS_EVENT_MAIN_MENU); return; } // process button presses for (i = 0; i < NUM_FVW_BUTTONS; i++) if (Fiction_viewer_buttons[Fiction_viewer_ui][gr_screen.res][i].button.pressed()) fiction_viewer_button_pressed(i); common_music_do(); // clear GR_MAYBE_CLEAR_RES(Fiction_viewer_bitmap); if (Fiction_viewer_bitmap >= 0) { gr_set_bitmap(Fiction_viewer_bitmap); gr_bitmap(0, 0, GR_RESIZE_MENU); } // draw the window Fiction_viewer_window.draw(); // render the briefing text brief_render_text(Top_fiction_viewer_text_line, Fiction_viewer_text_coordinates[Fiction_viewer_ui][gr_screen.res][0], Fiction_viewer_text_coordinates[Fiction_viewer_ui][gr_screen.res][1], Fiction_viewer_text_coordinates[Fiction_viewer_ui][gr_screen.res][3], frametime); // maybe output the "more" indicator if ((Fiction_viewer_text_max_lines + Top_fiction_viewer_text_line) < Num_brief_text_lines[0]) { use_std_font(); // can be scrolled down int more_txt_x = Fiction_viewer_text_coordinates[Fiction_viewer_ui][gr_screen.res][0] + (Fiction_viewer_text_coordinates[Fiction_viewer_ui][gr_screen.res][2]/2) - 10; int more_txt_y = Fiction_viewer_text_coordinates[Fiction_viewer_ui][gr_screen.res][1] + Fiction_viewer_text_coordinates[Fiction_viewer_ui][gr_screen.res][3]; // located below text, centered gr_get_string_size(&w, &h, XSTR("more", 1469), strlen(XSTR("more", 1469))); gr_set_color_fast(&Color_black); gr_rect(more_txt_x-2, more_txt_y, w+3, h, GR_RESIZE_MENU); gr_set_color_fast(&Color_more_indicator); gr_string(more_txt_x, more_txt_y, XSTR("more", 1469), GR_RESIZE_MENU); // base location on the input x and y? use_fv_font(); } gr_flip(); }
// 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; }
void cmd_brief_do_frame(float frametime) { char buf[40]; int i, k, w, h, x, y; // if no command briefing exists, skip this screen. if (!Cmd_brief_inited) { cmd_brief_exit(); return; } if ( help_overlay_active(CMD_BRIEF_OVERLAY) ) { Cmd_brief_buttons[gr_screen.res][CMD_BRIEF_BUTTON_HELP].button.reset_status(); Ui_window.set_ignore_gadgets(1); } k = Ui_window.process() & ~KEY_DEBUGGED; if ( (k > 0) || B1_JUST_RELEASED ) { if ( help_overlay_active(CMD_BRIEF_OVERLAY) ) { help_overlay_set_state(CMD_BRIEF_OVERLAY, 0); Ui_window.set_ignore_gadgets(0); k = 0; } } if ( !help_overlay_active(CMD_BRIEF_OVERLAY) ) { Ui_window.set_ignore_gadgets(0); } switch (k) { case KEY_ESC: common_music_close(); gameseq_post_event(GS_EVENT_MAIN_MENU); break; } // end switch for (i=0; i<NUM_CMD_BRIEF_BUTTONS; i++){ if (Cmd_brief_buttons[gr_screen.res][i].button.pressed()){ cmd_brief_button_pressed(i); } } cmd_brief_voice_play(Cur_stage); common_music_do(); if (cmd_brief_check_stage_done() && Player->auto_advance && (Cur_stage < Cur_cmd_brief->num_stages - 1)){ if((Cur_Anim.num_frames <= 1) || Cur_Anim.done_playing) { cmd_brief_new_stage(Cur_stage + 1); } } GR_MAYBE_CLEAR_RES(Cmd_brief_background_bitmap); if (Cmd_brief_background_bitmap >= 0) { gr_set_bitmap(Cmd_brief_background_bitmap); gr_bitmap(0, 0, GR_RESIZE_MENU); } if(Cur_Anim.num_frames > 0) { bm_get_info((Cur_Anim.streaming) ? Cur_Anim.bitmap_id : Cur_Anim.first_frame, &x, &y, NULL, NULL, NULL); x = Cmd_image_center_coords[gr_screen.res][CMD_X_COORD] - x / 2; y = Cmd_image_center_coords[gr_screen.res][CMD_Y_COORD] - y / 2; generic_anim_render(&Cur_Anim, (Cmd_brief_paused) ? 0 : frametime, x, y, true); } Ui_window.draw(); if (!Player->auto_advance){ Cmd_brief_buttons[gr_screen.res][CMD_BRIEF_BUTTON_PAUSE].button.draw_forced(2); } gr_set_font(FONT1); gr_set_color_fast(&Color_text_heading); sprintf(buf, XSTR( "Stage %d of %d", 464), Cur_stage + 1, Cur_cmd_brief->num_stages); gr_get_string_size(&w, NULL, buf); gr_string(Cmd_text_wnd_coords[Uses_scroll_buttons][gr_screen.res][CMD_X_COORD] + Cmd_text_wnd_coords[Uses_scroll_buttons][gr_screen.res][CMD_W_COORD] - w, Cmd_stage_y[gr_screen.res], buf, GR_RESIZE_MENU); if (brief_render_text(Top_cmd_brief_text_line, Cmd_text_wnd_coords[Uses_scroll_buttons][gr_screen.res][CMD_X_COORD], Cmd_text_wnd_coords[Uses_scroll_buttons][gr_screen.res][CMD_Y_COORD], Cmd_text_wnd_coords[Uses_scroll_buttons][gr_screen.res][CMD_H_COORD], frametime, 0, 1)){ Voice_good_to_go = 1; } if (gr_screen.res == 1) { Max_cmdbrief_Lines = 166/gr_get_font_height(); //Make the max number of lines dependent on the font height. 225 and 85 are magic numbers, based on the window size in retail. } else { Max_cmdbrief_Lines = 116/gr_get_font_height(); } // maybe output the "more" indicator if ( Max_cmdbrief_Lines < Num_brief_text_lines[0] ) { // can be scrolled down int more_txt_x = Cmd_text_wnd_coords[Uses_scroll_buttons][gr_screen.res][CMD_X_COORD] + (Cmd_text_wnd_coords[Uses_scroll_buttons][gr_screen.res][CMD_W_COORD]/2) - 10; int more_txt_y = Cmd_text_wnd_coords[Uses_scroll_buttons][gr_screen.res][CMD_Y_COORD] + Cmd_text_wnd_coords[Uses_scroll_buttons][gr_screen.res][CMD_H_COORD] - 2; // located below brief text, centered gr_get_string_size(&w, &h, XSTR("more", 1469), strlen(XSTR("more", 1469))); gr_set_color_fast(&Color_black); gr_rect(more_txt_x-2, more_txt_y, w+3, h, GR_RESIZE_MENU); gr_set_color_fast(&Color_red); gr_string(more_txt_x, more_txt_y, XSTR("more", 1469), GR_RESIZE_MENU); // base location on the input x and y? } // blit help overlay if active help_overlay_maybe_blit(CMD_BRIEF_OVERLAY); gr_flip(); }
void credits_do_frame(float frametime) { GR_DEBUG_SCOPE("Credits do frame"); int i, k, next, percent, bm1, bm2; int bx1, by1, bw1, bh1; int bx2, by2, bw2, bh2; // Use this id to trigger the start of music playing on the credits screen if ( timestamp_elapsed(Credits_music_begin_timestamp) ) { Credits_music_begin_timestamp = 0; credits_start_music(); } k = Ui_window.process(); switch (k) { case KEY_ESC: gameseq_post_event(GS_EVENT_MAIN_MENU); key_flush(); break; case KEY_CTRLED | KEY_UP: case KEY_SHIFTED | KEY_TAB: if ( !(Player->flags & PLAYER_FLAGS_IS_MULTI) ) { credits_screen_button_pressed(CUTSCENES_BUTTON); break; } // else, react like tab key. case KEY_CTRLED | KEY_DOWN: case KEY_TAB: credits_screen_button_pressed(TECH_DATABASE_BUTTON); break; default: break; } // end switch for (i=0; i<NUM_BUTTONS; i++){ if (Buttons[i][gr_screen.res].button.pressed()){ if (credits_screen_button_pressed(i)){ return; } } } gr_reset_clip(); GR_MAYBE_CLEAR_RES(Background_bitmap); if (Background_bitmap >= 0) { gr_set_bitmap(Background_bitmap); gr_bitmap(0, 0, GR_RESIZE_MENU); } percent = (int) (100.0f - (Credits_artwork_display_time - Credits_counter) * 100.0f / Credits_artwork_fade_time); if (percent < 0){ percent = 0; } next = Credits_artwork_index + 1; if (next >= Credits_num_images){ next = 0; } if (Credits_bmps[Credits_artwork_index] < 0) { char buf[40]; if (gr_screen.res == GR_1024) { sprintf(buf, NOX("2_CrIm%.2d"), Credits_artwork_index); } else { sprintf(buf, NOX("CrIm%.2d"), Credits_artwork_index); } Credits_bmps[Credits_artwork_index] = bm_load(buf); } if (Credits_bmps[next] < 0) { char buf[40]; if (gr_screen.res == GR_1024) { sprintf(buf, NOX("2_CrIm%.2d"), next); } else { sprintf(buf, NOX("CrIm%.2d"), next); } Credits_bmps[next] = bm_load(buf); } bm1 = Credits_bmps[Credits_artwork_index]; bm2 = Credits_bmps[next]; if((bm1 != -1) && (bm2 != -1)){ GR_DEBUG_SCOPE("Render credits bitmap"); Assert(percent >= 0 && percent <= 100); // get width and height bm_get_info(bm1, &bw1, &bh1, NULL, NULL, NULL); bm_get_info(bm2, &bw2, &bh2, NULL, NULL, NULL); // determine where to draw the coords bx1 = Credits_image_coords[gr_screen.res][CREDITS_X_COORD] + ((Credits_image_coords[gr_screen.res][CREDITS_W_COORD] - bw1)/2); by1 = Credits_image_coords[gr_screen.res][CREDITS_Y_COORD] + ((Credits_image_coords[gr_screen.res][CREDITS_H_COORD] - bh1)/2); bx2 = Credits_image_coords[gr_screen.res][CREDITS_X_COORD] + ((Credits_image_coords[gr_screen.res][CREDITS_W_COORD] - bw2)/2); by2 = Credits_image_coords[gr_screen.res][CREDITS_Y_COORD] + ((Credits_image_coords[gr_screen.res][CREDITS_H_COORD] - bh2)/2); auto alpha = (float)percent / 100.0f; gr_set_bitmap(bm1, GR_ALPHABLEND_FILTER, GR_BITBLT_MODE_NORMAL, 1.0f - alpha); gr_bitmap(bx1, by1, GR_RESIZE_MENU); gr_set_bitmap(bm2, GR_ALPHABLEND_FILTER, GR_BITBLT_MODE_NORMAL, alpha); gr_bitmap(bx2, by2, GR_RESIZE_MENU); } Ui_window.draw(); for (i=TECH_DATABASE_BUTTON; i<=CREDITS_BUTTON; i++){ if (Buttons[i][gr_screen.res].button.button_down()){ break; } } if (i > CREDITS_BUTTON){ Buttons[CREDITS_BUTTON][gr_screen.res].button.draw_forced(2); } gr_set_clip(Credits_text_coords[gr_screen.res][CREDITS_X_COORD], Credits_text_coords[gr_screen.res][CREDITS_Y_COORD], Credits_text_coords[gr_screen.res][CREDITS_W_COORD], Credits_text_coords[gr_screen.res][CREDITS_H_COORD], GR_RESIZE_MENU); font::set_font(font::FONT1); gr_set_color_fast(&Color_normal); int y_offset = 0; for (SCP_vector<SCP_string>::iterator iter = Credit_text_parts.begin(); iter != Credit_text_parts.end(); ++iter) { size_t currentPos = 0; size_t lineEnd; do { int height; int width; lineEnd = iter->find('\n', currentPos); auto length = lineEnd - currentPos; if (lineEnd == SCP_string::npos) { length = std::numeric_limits<size_t>::max(); } gr_get_string_size(&width, &height, iter->c_str() + currentPos, static_cast<int>(length)); // Check if the text part is actually visible if (Credit_position + y_offset + height > 0.0f) { float x = static_cast<float>((gr_screen.clip_width_unscaled - width) / 2); gr_string(x, Credit_position + y_offset, iter->c_str() + currentPos, GR_RESIZE_MENU, static_cast<int>(length)); } y_offset += height; currentPos = lineEnd + 1; } while (lineEnd < iter->length() && lineEnd != SCP_string::npos); } int temp_time; temp_time = timer_get_milliseconds(); Credits_frametime = temp_time - Credits_last_time; Credits_last_time = temp_time; timestamp_inc(i2f(Credits_frametime) / TIMESTAMP_FREQUENCY); float fl_frametime = i2fl(Credits_frametime) / 1000.f; if (keyd_pressed[KEY_LSHIFT]) { Credit_position -= fl_frametime * Credits_scroll_rate * 4.0f; } else { Credit_position -= fl_frametime * Credits_scroll_rate; } if (Credit_position < Credit_stop_pos){ Credit_position = Credit_start_pos; } Credits_counter += fl_frametime; while (Credits_counter >= Credits_artwork_display_time) { Credits_counter -= Credits_artwork_display_time; Credits_artwork_index = next; } gr_flip(); }
void player_select_do() { int k; // Goober5000 - display a popup warning about problems in the mod if ((Global_warning_count > 10 || Global_error_count > 0) && !Startup_warning_dialog_displayed) { char text[512]; sprintf(text, "Warning!\n\nThe currently active mod has generated %d warnings and/or errors during program startup. These could have been caused by anything from incorrectly formated table files to corrupt models. While FreeSpace Open will attempt to compensate for these issues, it cannot guarantee a trouble-free gameplay experience. Source Code Project staff cannot provide assistance or support for these problems, as they are caused by the mod's data files, not FreeSpace Open's source code.", Global_warning_count + Global_error_count); popup(PF_TITLE_BIG | PF_TITLE_RED | PF_USE_AFFIRMATIVE_ICON, 1, POPUP_OK, text); Startup_warning_dialog_displayed = true; } // set the input box at the "virtual" line 0 to be active so the player can enter a callsign if (Player_select_input_mode) { Player_select_input_box.set_focus(); } // process any ui window stuff k = Player_select_window.process(); if (k) { extern void game_process_cheats(int k); game_process_cheats(k); } switch (k) { // switch between single and multiplayer modes case KEY_TAB: { if (Player_select_input_mode) { gamesnd_play_iface(SND_GENERAL_FAIL); break; } // play a little sound gamesnd_play_iface(SND_USER_SELECT); if (Player_select_mode == PLAYER_SELECT_MODE_MULTI) { player_select_set_bottom_text(XSTR( "Single-Player Mode", 376)); // reinitialize as single player mode player_select_init_player_stuff(PLAYER_SELECT_MODE_SINGLE); } else if (Player_select_mode == PLAYER_SELECT_MODE_SINGLE) { player_select_set_bottom_text(XSTR( "Multiplayer Mode", 377)); // reinitialize as multiplayer mode player_select_init_player_stuff(PLAYER_SELECT_MODE_MULTI); } break; } case KEY_ESC: { // we can hit ESC to get out of text input mode, and we don't want // to set this var in that case since it will crash on a NULL Player // ptr when going to the mainhall if ( !Player_select_input_mode ) { Player_select_no_save_pilot = 1; } break; } } // draw the player select pseudo-dialog over it GR_MAYBE_CLEAR_RES(Player_select_background_bitmap); gr_set_bitmap(Player_select_background_bitmap); gr_bitmap(0,0,GR_RESIZE_MENU); // press the accept button if (Player_select_autoaccept) { Player_select_buttons[gr_screen.res][ACCEPT_BUTTON].button.press_button(); } // draw any ui window stuf Player_select_window.draw(); // light up the correct mode button (single or multi) if (Player_select_mode == PLAYER_SELECT_MODE_SINGLE) { Player_select_buttons[gr_screen.res][SINGLE_BUTTON].button.draw_forced(2); } else { Player_select_buttons[gr_screen.res][MULTI_BUTTON].button.draw_forced(2); } // draw the pilot list text player_select_draw_list(); // draw copyright message on the bottom on the screen player_select_display_copyright(); if (!Player_select_input_mode) { player_select_process_noninput(k); } else { player_select_process_input(k); } // draw any pending messages on the bottom or middle of the screen player_select_display_all_text(); gr_flip(); }
void multi_pause_do() { int k; // make sure we don't enter this state unless we're in the mission itself Netgame.game_state = NETGAME_STATE_PAUSED; // server of the game should periodically be sending pause packets for good measure if (Net_player->flags & NETINFO_FLAG_AM_MASTER) { } if (!(Game_mode & GM_STANDALONE_SERVER)) { // restore saved screen data if any if (Multi_paused_screen_id >= 0) { gr_restore_screen(Multi_paused_screen_id); } // set the background image if (Multi_paused_background >= 0) { gr_set_bitmap(Multi_paused_background); gr_bitmap(0, 0, GR_RESIZE_MENU); } // if we're inside of popup code right now, don't process the window if(!popup_active()){ // process chatbox and window stuff k = chatbox_process(); k = Multi_paused_window.process(k); switch (k) { case KEY_ESC: case KEY_PAUSE: multi_pause_request(0); break; } } // check for any button presses multi_pause_check_buttons(); // render the callsign of the guy who paused multi_pause_render_callsign(); // render the chatbox chatbox_render(); // draw tooltips // Multi_paused_window.draw_tooltip(); Multi_paused_window.draw(); // display the voice status indicator multi_common_voice_display_status(); // don't flip screen if we are in the popup code right now if (!popup_active()) { gr_flip(); } } // standalone pretty much does nothing here else { os_sleep(1); } }
// pause do frame - will handle running multiplayer operations if necessary void pause_do() { int k; const char *pause_str = XSTR("Paused", 767); int str_w, str_h; // next two are for view resetting static int previous_Viewer_mode = -1; static int previous_hud_state = -1; Assert( !(Game_mode & GM_MULTIPLAYER) ); // RENDER A GAME FRAME HERE AS THE BACKGROUND (if normal pause) if(Pause_type == PAUSE_TYPE_NORMAL) { // Fall back to viewer just incase saved screen is invalid if(Pause_saved_screen == -1){ Pause_type = PAUSE_TYPE_VIEWER; } else if(Pause_type == PAUSE_TYPE_NORMAL) { gr_restore_screen(Pause_saved_screen); } } if(Pause_type == PAUSE_TYPE_NORMAL){ if (Pause_background_bitmap >= 0) { gr_set_bitmap(Pause_background_bitmap); // draw the bitmap gr_bitmap(Please_wait_coords[gr_screen.res][0], Please_wait_coords[gr_screen.res][1], GR_RESIZE_MENU); // draw "Paused" on it gr_set_color_fast(&Color_normal); gr_set_font(FONT2); gr_get_string_size(&str_w, &str_h, pause_str); gr_string((gr_screen.max_w_unscaled - str_w) / 2, (gr_screen.max_h_unscaled - str_h) / 2, pause_str, GR_RESIZE_MENU); gr_set_font(FONT1); } } if (Pause_type == PAUSE_TYPE_VIEWER) { if (previous_Viewer_mode < 0) previous_Viewer_mode = Viewer_mode; if (previous_hud_state < 0) previous_hud_state = hud_disabled(); } // process the ui window here k = Pause_win.process() & ~KEY_DEBUGGED; switch (k) { case KEY_TAB: hud_toggle_draw(); break; // view from outside of the ship case KEY_ENTER: if (Pause_type == PAUSE_TYPE_VIEWER) { button_function_demo_valid(VIEW_EXTERNAL); } break; // view from target case KEY_PADDIVIDE: if (Pause_type == PAUSE_TYPE_VIEWER) { button_function_demo_valid(VIEW_OTHER_SHIP); } break; // change target case KEY_PADMULTIPLY: if (Pause_type == PAUSE_TYPE_VIEWER) { button_function(TARGET_NEXT); } break; case KEY_ESC: case KEY_ALTED + KEY_PAUSE: case KEY_PAUSE: // reset previous view if we happened to be playing around with it during pause if (Pause_type == PAUSE_TYPE_VIEWER) { if (previous_Viewer_mode >= 0) { Viewer_mode = previous_Viewer_mode; } // NOTE remember that hud state is reversed here (0 == on, 1 == off) if ( (previous_hud_state >= 0) && (hud_disabled() != previous_hud_state) ) { hud_set_draw( !previous_hud_state ); } } gameseq_post_event(GS_EVENT_PREVIOUS_STATE); break; } // end switch // draw the background window Pause_win.draw(); // a very unique case where we shouldn't be doing the page flip because we're inside of popup code if(!popup_active()){ if(Pause_type == PAUSE_TYPE_NORMAL) { gr_flip(); } } else { // this should only be happening in a very unique multiplayer case Int3(); } }
void pilot_manage_do(void) { int k = Ui_window.process(); int i; if ( k > 0 ) { // put back in when overlay stuff is fixed // if ( help_overlay_active(PILOT_MANAGE_OVERLAY) ) { // help_overlay_set_state(PILOT_MANAGE_OVERLAY,0); // k = 0; // } } switch (k) { case KEY_ESC: // cancel only if not trying to enter a pilot name if (!pilot_manage_callsign_enter_mode) gameseq_post_event(GS_EVENT_BARRACKS_MENU);//GS_EVENT_PREVIOUS_STATE break; } // end switch int prospective_pilot = -1; // Entering pilot callsign if (pilot_manage_callsign_enter_mode) { // set focus to inputbox Inputbox.set_focus(); switch (k) { case KEY_ESC: // cancel create pilot Num_pilots--; for (i=0; i<Num_pilots; i++) { strcpy(Pilots[i], Pilots[i + 1]); Pilot_ranks[i] = Pilot_ranks[i + 1]; } pilot_manage_set_callsign_enter_mode(false); break; case KEY_ENTER: pilot_manage_accept_new_pilot_callsign(); break; } } // process buttons for (i=0; i<PM_NUM_BUTTONS; i++) { if (Buttons[gr_screen.res][i].button.pressed()) { pilot_manage_button_pressed(i); } } // pilot that mouse is over // if mouse is over a pilot, find index into Pilots array if (List_region.is_mouse_on()) { int y; List_region.get_mouse_pos(NULL, &y); int pilot_index = List_scroll_offset + (y / gr_get_font_height()); if ((pilot_index >= 0) && (pilot_index < Num_pilots)) { prospective_pilot = pilot_index; } } // if mouse clicked in list region, find index into Pilots array if (List_region.pressed()) { if (prospective_pilot != -1) { Selected_line = prospective_pilot; gamesnd_play_iface(SND_USER_SELECT); } } gr_reset_clip(); GR_MAYBE_CLEAR_RES(Background_bitmap); if (Background_bitmap >= 0) { gr_set_bitmap(Background_bitmap); gr_bitmap(0, 0); } Ui_window.draw(); //light up the correct mode button (single or multi) if (Player_sel_mode == PLAYER_SELECT_MODE_SINGLE) { Buttons[gr_screen.res][PM_SINGLE_MODE_BUTTON].button.draw_forced(2); } else { Buttons[gr_screen.res][PM_MULTI_MODE_BUTTON].button.draw_forced(2); } pilot_manage_display_pilot_callsigns(prospective_pilot); pilot_manage_force_button_frame(); pilot_manage_maybe_show_button_text(); // needs to be fixed help_overlay_maybe_blit(PILOT_MANAGE_OVERLAY); gr_flip(); }
void techroom_do_frame(float frametime) { int i, k; // turn off controls when overlay is on if ( help_overlay_active(Techroom_overlay_id) ) { Buttons[gr_screen.res][HELP_BUTTON].button.reset_status(); Ui_window.set_ignore_gadgets(1); } // turn off controls in trackball mode if (Trackball_active) { Ui_window.set_ignore_gadgets(1); } else { Ui_window.set_ignore_gadgets(0); } k = Ui_window.process() & ~KEY_DEBUGGED; if ( (k > 0) || B1_JUST_RELEASED ) { if ( help_overlay_active(Techroom_overlay_id) ) { help_overlay_set_state(Techroom_overlay_id, gr_screen.res, 0); Ui_window.set_ignore_gadgets(0); k = 0; } } if ( !help_overlay_active(Techroom_overlay_id) ) { Ui_window.set_ignore_gadgets(0); } switch (k) { case KEY_SHIFTED | KEY_TAB: // activate previous tab i = Tab - 1; if (i < 0) { i = NUM_TABS - 1; } techroom_change_tab(i); break; case KEY_TAB: // activate next tab i = Tab + 1; if (i >= NUM_TABS) { i = 0; } techroom_change_tab(i); break; case KEY_CTRLED | KEY_DOWN: if ( !(Player->flags & PLAYER_FLAGS_IS_MULTI) ) { techroom_button_pressed(SIMULATOR_TAB); break; } // fall through case KEY_CTRLED | KEY_UP: techroom_button_pressed(CREDITS_TAB); break; case KEY_CTRLED | KEY_ENTER: case KEY_ESC: gameseq_post_event(GS_EVENT_MAIN_MENU); break; case KEY_CTRLED | KEY_SHIFTED | KEY_S: Techroom_show_all = 1; techroom_lists_reset(); techroom_change_tab(Tab); break; } // check ship model window for activity if (View_window.pressed()) { Trackball_active = 1; Trackball_mode = 1; } if (B1_RELEASED) { Trackball_active = 0; } // check all da buttons for (i=0; i<NUM_BUTTONS; i++) { if (Buttons[gr_screen.res][i].button.pressed()) { if (techroom_button_pressed(i)) { return; } } } // check for mouseovers/clicks on the selection list Select_tease_line = -1; for (i=0; i<LIST_BUTTONS_MAX; i++) { if (List_buttons[i].is_mouse_on()) { Select_tease_line = i + List_offset; } if (List_buttons[i].pressed()) { Cur_entry = i + List_offset; gamesnd_play_iface(SND_USER_SELECT); techroom_select_new_entry(); } } // clear & draw bg bitmap GR_MAYBE_CLEAR_RES(Tech_background_bitmap); if (Tech_background_bitmap >= 0) { gr_set_bitmap(Tech_background_bitmap); gr_bitmap(0, 0, GR_RESIZE_MENU); } // render switch (Tab) { case SHIPS_DATA_TAB: techroom_ships_render(frametime); break; case WEAPONS_DATA_TAB: case INTEL_DATA_TAB: techroom_anim_render(frametime); break; } Ui_window.draw(); for (i=TECH_DATABASE_TAB; i<=CREDITS_TAB; i++) { if (Buttons[gr_screen.res][i].button.button_down()) { break; } } if (i > CREDITS_TAB) { Buttons[gr_screen.res][TECH_DATABASE_TAB].button.draw_forced(2); } for (i=0; i<NUM_TABS; i++){ if (Buttons[gr_screen.res][i].button.button_down()){ break; } } if (i == NUM_TABS){ Buttons[gr_screen.res][Tab].button.draw_forced(2); } // blit help overlay if active help_overlay_maybe_blit(Techroom_overlay_id, gr_screen.res); gr_flip(); }
void hud_scrollback_do_frame(float frametime) { int i, k, x, y; int font_height = gr_get_font_height(); k = Ui_window.process(); switch (k) { case KEY_RIGHT: case KEY_TAB: if (Scrollback_mode == SCROLLBACK_MODE_OBJECTIVES) { Scrollback_mode = SCROLLBACK_MODE_MSGS_LOG; Scroll_max = hud_query_scrollback_size(); hud_scroll_reset(); } else if (Scrollback_mode == SCROLLBACK_MODE_MSGS_LOG) { Scrollback_mode = SCROLLBACK_MODE_EVENT_LOG; Scroll_max = Num_log_lines * gr_get_font_height(); hud_scroll_reset(); } else { Scrollback_mode = SCROLLBACK_MODE_OBJECTIVES; Scroll_max = Num_obj_lines * gr_get_font_height(); Scroll_offset = 0; } break; case KEY_LEFT: case KEY_SHIFTED | KEY_TAB: if (Scrollback_mode == SCROLLBACK_MODE_OBJECTIVES) { Scrollback_mode = SCROLLBACK_MODE_EVENT_LOG; Scroll_max = Num_log_lines * gr_get_font_height(); hud_scroll_reset(); } else if (Scrollback_mode == SCROLLBACK_MODE_MSGS_LOG) { Scrollback_mode = SCROLLBACK_MODE_OBJECTIVES; Scroll_max = Num_obj_lines * gr_get_font_height(); Scroll_offset = 0; } else { Scrollback_mode = SCROLLBACK_MODE_MSGS_LOG; Scroll_max = hud_query_scrollback_size(); hud_scroll_reset(); } break; case KEY_PAGEUP: hud_page_scroll_list(1); break; case KEY_PAGEDOWN: hud_page_scroll_list(0); break; case KEY_ENTER: case KEY_CTRLED | KEY_ENTER: case KEY_ESC: hud_scrollback_exit(); break; case KEY_F1: // show help overlay break; case KEY_F2: // goto options screen gameseq_post_event(GS_EVENT_OPTIONS_MENU); break; } // end switch for (i=0; i<NUM_BUTTONS; i++) { if (Buttons[gr_screen.res][i].button.pressed()) { hud_scrollback_button_pressed(i); } } GR_MAYBE_CLEAR_RES(Background_bitmap); if (Background_bitmap >= 0) { gr_set_bitmap(Background_bitmap); gr_bitmap(0, 0, GR_RESIZE_MENU); } /* if ((Scrollback_mode == SCROLLBACK_MODE_OBJECTIVES) && (Status_bitmap >= 0)) { gr_set_bitmap(Status_bitmap); gr_bitmap(Hud_mission_log_status_coords[gr_screen.res][0], Hud_mission_log_status_coords[gr_screen.res][1], GR_RESIZE_MENU); } */ // draw the objectives key at the bottom of the ingame objectives screen if (Scrollback_mode == SCROLLBACK_MODE_OBJECTIVES) { ML_render_objectives_key(); } Ui_window.draw(); if (Scrollback_mode == SCROLLBACK_MODE_EVENT_LOG) { Buttons[gr_screen.res][SHOW_EVENTS_BUTTON].button.draw_forced(2); mission_log_scrollback(Scroll_offset, Hud_mission_log_list_coords[gr_screen.res][0], Hud_mission_log_list_coords[gr_screen.res][1], Hud_mission_log_list_coords[gr_screen.res][2], Hud_mission_log_list_coords[gr_screen.res][3]); } else if (Scrollback_mode == SCROLLBACK_MODE_OBJECTIVES) { Buttons[gr_screen.res][SHOW_OBJS_BUTTON].button.draw_forced(2); ML_objectives_do_frame(Scroll_offset); } else { line_node *node_ptr; Buttons[gr_screen.res][SHOW_MSGS_BUTTON].button.draw_forced(2); // y = ((LIST_H / font_height) - 1) * font_height; y = 0; if ( !EMPTY(&Msg_scrollback_used_list) && HUD_msg_inited ) { node_ptr = GET_FIRST(&Msg_scrollback_used_list); i = 0; while ( node_ptr != END_OF_LIST(&Msg_scrollback_used_list) ) { if ((node_ptr->source == HUD_SOURCE_HIDDEN) || (i++ < Scroll_offset)) { node_ptr = GET_NEXT(node_ptr); } else { int team = HUD_source_get_team(node_ptr->source); if (team >= 0) { gr_set_color_fast(iff_get_color_by_team(team, Player_ship->team, 0)); } else { switch (node_ptr->source) { case HUD_SOURCE_TRAINING: gr_set_color_fast(&Color_bright_blue); break; case HUD_SOURCE_TERRAN_CMD: gr_set_color_fast(&Color_bright_white); break; case HUD_SOURCE_IMPORTANT: case HUD_SOURCE_FAILED: case HUD_SOURCE_SATISFIED: gr_set_color_fast(&Color_bright_white); break; default: gr_set_color_fast(&Color_text_normal); break; } } if (node_ptr->time) gr_print_timestamp(Hud_mission_log_list_coords[gr_screen.res][0], Hud_mission_log_list_coords[gr_screen.res][1] + y, node_ptr->time, GR_RESIZE_MENU); x = Hud_mission_log_list2_coords[gr_screen.res][0] + node_ptr->x; gr_printf_menu(x, Hud_mission_log_list_coords[gr_screen.res][1] + y, "%s", node_ptr->text); if (node_ptr->underline_width) gr_line(x, Hud_mission_log_list_coords[gr_screen.res][1] + y + font_height - 1, x + node_ptr->underline_width, Hud_mission_log_list_coords[gr_screen.res][1] + y + font_height - 1, GR_RESIZE_MENU); if ((node_ptr->source == HUD_SOURCE_FAILED) || (node_ptr->source == HUD_SOURCE_SATISFIED)) { // draw goal icon if (node_ptr->source == HUD_SOURCE_FAILED) gr_set_color_fast(&Color_bright_red); else gr_set_color_fast(&Color_bright_green); i = Hud_mission_log_list_coords[gr_screen.res][1] + y + font_height / 2 - 1; gr_circle(Hud_mission_log_list2_coords[gr_screen.res][0] - 6, i, 5, GR_RESIZE_MENU); gr_set_color_fast(&Color_bright); gr_line(Hud_mission_log_list2_coords[gr_screen.res][0] - 10, i, Hud_mission_log_list2_coords[gr_screen.res][0] - 8, i, GR_RESIZE_MENU); gr_line(Hud_mission_log_list2_coords[gr_screen.res][0] - 6, i - 4, Hud_mission_log_list2_coords[gr_screen.res][0] - 6, i - 2, GR_RESIZE_MENU); gr_line(Hud_mission_log_list2_coords[gr_screen.res][0] - 4, i, Hud_mission_log_list2_coords[gr_screen.res][0] - 2, i, GR_RESIZE_MENU); gr_line(Hud_mission_log_list2_coords[gr_screen.res][0] - 6, i + 2, Hud_mission_log_list2_coords[gr_screen.res][0] - 6, i + 4, GR_RESIZE_MENU); } y += font_height + node_ptr->y; node_ptr = GET_NEXT(node_ptr); if (y + font_height > Hud_mission_log_list_coords[gr_screen.res][3]) break; } } } } gr_set_color_fast(&Color_text_heading); gr_print_timestamp(Hud_mission_log_time_coords[gr_screen.res][0], Hud_mission_log_time_coords[gr_screen.res][1] - font_height, Missiontime, GR_RESIZE_MENU); gr_string(Hud_mission_log_time2_coords[gr_screen.res][0], Hud_mission_log_time_coords[gr_screen.res][1] - font_height, XSTR( "Current time", 289), GR_RESIZE_MENU); gr_flip(); }
// ----------------------------------------------------------------------------- void barracks_do_frame(float frametime) { int k = Ui_window.process(); if ( k > 0 ) { if ( help_overlay_active(Barracks_overlay_id) ) { help_overlay_set_state(Barracks_overlay_id,gr_screen.res,0); k = 0; } } // pilot that mouse is over int prospective_pilot = -1; int i; // Entering pilot callsign if (Barracks_callsign_enter_mode) { // set focus to inputbox Inputbox.set_focus(); switch (k) { case KEY_ESC: // cancel create pilot Num_pilots--; for (i=0; i<Num_pilots; i++) { strcpy(Pilots[i], Pilots[i + 1]); Pilot_ranks[i] = Pilot_ranks[i + 1]; } barracks_set_callsign_enter_mode(false); break; case KEY_ENTER: barracks_accept_new_pilot_callsign(); break; } } else { // not entering pilot callsign switch (k) { case KEY_ENTER: if (barracks_new_pilot_selected()) { gamesnd_play_iface(SND_GENERAL_FAIL); } else { gamesnd_play_iface(SND_USER_SELECT); } break; case KEY_ESC: // cancel if (!help_overlay_active(Barracks_overlay_id)) { if (Num_pilots && !barracks_pilot_accepted()) { gameseq_post_event(GS_EVENT_MAIN_MENU); } else { gamesnd_play_iface(SND_GENERAL_FAIL); } } else { // kill the overlay help_overlay_set_state(Barracks_overlay_id,gr_screen.res,0); } break; case KEY_TAB: // switch mode (simgle/multi) if ( Networking_disabled ) { game_feature_disabled_popup(); break; } if (Player_sel_mode == PLAYER_SELECT_MODE_SINGLE) { Cur_pilot->flags |= PLAYER_FLAGS_IS_MULTI; Pilot.save_player(Cur_pilot); barracks_init_player_stuff(PLAYER_SELECT_MODE_MULTI); } else { // make sure we don't carry over the multi flag Cur_pilot->flags &= ~PLAYER_FLAGS_IS_MULTI; Pilot.save_player(Cur_pilot); barracks_init_player_stuff(PLAYER_SELECT_MODE_SINGLE); } gamesnd_play_iface(SND_USER_SELECT); break; case KEY_F1: // show help overlay gamesnd_play_iface(SND_HELP_PRESSED); break; case KEY_F2: // goto options screen gamesnd_play_iface(SND_SWITCH_SCREENS); gameseq_post_event(GS_EVENT_OPTIONS_MENU); break; } // end switch // process buttons for (i=0; i<BARRACKS_NUM_BUTTONS; i++) { if (Buttons[gr_screen.res][i].button.pressed()) { barracks_button_pressed(i); } } // if mouse is over a pilot, find index into Pilots array if (List_region.is_mouse_on()) { int y; List_region.get_mouse_pos(NULL, &y); int pilot_index = List_scroll_offset + (y / gr_get_font_height()); if ((pilot_index >= 0) && (pilot_index < Num_pilots)) { prospective_pilot = pilot_index; } } // if mouse clicked in list region, find index into Pilots array if (List_region.pressed()) { if (prospective_pilot != -1) { Selected_line = prospective_pilot; gamesnd_play_iface(SND_USER_SELECT); } } } // check mouse over help if (mouse_down(MOUSE_LEFT_BUTTON)) { help_overlay_set_state(Barracks_overlay_id, gr_screen.res, 0); } // do pilot pic stuff if ((Pic_number >= 0) && (Pic_number < Num_pilot_images)) { if (Pilot_images[Pic_number] == BARRACKS_IMAGE_NOT_LOADED) { // haven't tried loading it yet Pilot_images[Pic_number] = bm_load(Pilot_image_names[Pic_number]); if (Pilot_images[Pic_number] >= 0) { int w, h; bm_get_info(Pilot_images[Pic_number], &w, &h, NULL); // check for invalid pilot pic file if ((w != PLAYER_PILOT_PIC_W) || (h != PLAYER_PILOT_PIC_H)) { bm_release(Pilot_images[Pic_number]); Pilot_images[Pic_number] = -1; } } } } else { Pic_number = -1; } // do squad pic stuff if ((Pic_squad_number >= 0) && (Pic_squad_number < Num_pilot_squad_images)) { if (Pilot_squad_images[Pic_squad_number] == BARRACKS_IMAGE_NOT_LOADED) { // haven't tried loading it yet Pilot_squad_images[Pic_squad_number] = bm_load_duplicate(Pilot_squad_image_names[Pic_squad_number]); if (Pilot_squad_images[Pic_squad_number] >= 0) { int w, h; bm_get_info(Pilot_squad_images[Pic_squad_number], &w, &h, NULL); // check for invalid pilot pic file if ((w != PLAYER_SQUAD_PIC_W) || (h != PLAYER_SQUAD_PIC_H)) { bm_release(Pilot_squad_images[Pic_squad_number]); Pilot_squad_images[Pic_squad_number] = -1; } } } } else { Pic_squad_number = -1; } // draw the background, etc gr_reset_clip(); GR_MAYBE_CLEAR_RES(Background_bitmap); if (Background_bitmap >= 0) { gr_set_bitmap(Background_bitmap); gr_bitmap(0, 0, GR_RESIZE_MENU); } // draw pilot image and clean up afterwards barracks_draw_pilot_pic(); barracks_draw_squad_pic(); // draw the window Ui_window.draw(); // light up the correct mode button (single or multi) if (Player_sel_mode == PLAYER_SELECT_MODE_SINGLE) { Buttons[gr_screen.res][B_PILOT_SINGLE_MODE_BUTTON].button.draw_forced(2); } else { Buttons[gr_screen.res][B_PILOT_MULTI_MODE_BUTTON].button.draw_forced(2); } // write out pilot call signs barracks_display_pilot_callsigns(prospective_pilot); // write out current pilot stats barracks_display_pilot_stats(); // blit help overlay if active help_overlay_maybe_blit(Barracks_overlay_id, gr_screen.res); // flip the page gr_flip(); }
void mht_do() { int k = Mht_window.process(); // need to ensure ambient is playing, since it may be stopped by a playing movie main_hall_start_ambient(); // process any keypresses switch(k){ case KEY_ESC : mht_exit_game(); break; case KEY_B: gameseq_post_event( GS_EVENT_BARRACKS_MENU ); break; case KEY_G: if(Player->flags & PLAYER_FLAGS_IS_MULTI){ break; } if (Num_recent_missions > 0) { strcpy_s( Game_current_mission_filename, Recent_missions[0] ); } else { mission_load_up_campaign(); strcpy_s( Game_current_mission_filename, Campaign.missions[0].name ); } Campaign.current_mission = -1; gameseq_post_event(GS_EVENT_START_GAME_QUICK); break; case KEY_L: gameseq_post_event( GS_EVENT_LOAD_MISSION_MENU ); break; case KEY_F2: gameseq_post_event(GS_EVENT_OPTIONS_MENU); break; case KEY_M: if (Player->flags & PLAYER_FLAGS_IS_MULTI){ main_hall_do_multi_ready(); } break; } // process button presses mht_check_buttons(); // draw the background, etc gr_reset_clip(); GR_MAYBE_CLEAR_RES(Mht_bitmap); if(Mht_bitmap != -1){ gr_set_bitmap(Mht_bitmap); gr_bitmap(0,0,GR_RESIZE_MENU); } Mht_window.draw(); // flip the buffer gr_flip(); }
void cutscenes_screen_do_frame() { int i, k, y, z; int font_height = gr_get_font_height(); int select_tease_line = -1; k = Ui_window.process(); switch (k) { case KEY_DOWN: // select next line cutscenes_screen_scroll_line_down(); break; case KEY_UP: // select previous line cutscenes_screen_scroll_line_up(); break; case KEY_TAB: case KEY_CTRLED | KEY_DOWN: cutscenes_screen_button_pressed(CREDITS_BUTTON); break; case KEY_SHIFTED | KEY_TAB: case KEY_CTRLED | KEY_UP: cutscenes_screen_button_pressed(SIMULATOR_BUTTON); break; case KEY_ENTER: cutscenes_screen_play(); break; case KEY_ESC: // cancel gameseq_post_event(GS_EVENT_MAIN_MENU); game_flush(); break; case KEY_F1: // show help overlay break; case KEY_F2: // goto options screen gameseq_post_event(GS_EVENT_OPTIONS_MENU); break; // the "show-all" hotkey case KEY_CTRLED | KEY_SHIFTED | KEY_S: { Cutscene_list.clear(); size_t size = Cutscenes.size(); for (size_t t = 0; t < size; t++) { Cutscene_list.push_back((int)t); } break; } } // end switch for (i=0; i<NUM_BUTTONS; i++){ if (Buttons[gr_screen.res][i].button.pressed()){ if (cutscenes_screen_button_pressed(i)){ return; } } } if (List_region.button_down()) { List_region.get_mouse_pos(NULL, &y); z = Scroll_offset + y / font_height; if ((z >= 0) && (z < (int)Cutscene_list.size())) select_tease_line = z; } if (List_region.pressed()) { List_region.get_mouse_pos(NULL, &y); z = Scroll_offset + y / font_height; if ((z >= 0) && (z < (int)Cutscene_list.size())) Selected_line = z; } GR_MAYBE_CLEAR_RES(Background_bitmap); if (Background_bitmap >= 0) { gr_set_bitmap(Background_bitmap); gr_bitmap(0, 0); } Ui_window.draw(); for (i=TECH_DATABASE_BUTTON; i<=CREDITS_BUTTON; i++){ if (Buttons[gr_screen.res][i].button.button_down()){ break; } } if (i > CREDITS_BUTTON){ Buttons[gr_screen.res][CUTSCENES_BUTTON].button.draw_forced(2); } y = 0; z = Scroll_offset; while (y + font_height <= Cutscene_list_coords[gr_screen.res][3]) { if (z >= (int)Cutscene_list.size()){ break; } if (z == Selected_line){ gr_set_color_fast(&Color_text_selected); } else if (z == select_tease_line) { gr_set_color_fast(&Color_text_subselected); } else { gr_set_color_fast(&Color_text_normal); } gr_printf(Cutscene_list_coords[gr_screen.res][0], Cutscene_list_coords[gr_screen.res][1] + y, Cutscenes[Cutscene_list[z]].name); y += font_height; z++; } if (Description_index != Selected_line) { char *src = NULL; Description_index = Selected_line; Text_size = 0; if ( Description_index < (int)Cutscene_list.size( ) && (int)Cutscene_list[ Description_index ] < (int)Cutscenes.size( ) ) { src = Cutscenes[Cutscene_list[Description_index]].description; if (src) { Text_size = split_str(src, Cutscene_desc_coords[gr_screen.res][2], Text_line_size, Text_lines, Cutscene_max_text_lines[gr_screen.res]); Assert(Text_size >= 0 && Text_size < Cutscene_max_text_lines[gr_screen.res]); } } } if (Description_index >= 0) { int len; char line[MAX_TEXT_LINE_LEN + 1]; gr_set_color_fast(&Color_text_normal); y = 0; z = Text_offset; while (y + font_height <= Cutscene_desc_coords[gr_screen.res][3]) { if (z >= Text_size || z >= MAX_TEXT_LINES-1) break; len = Text_line_size[z]; if (len > MAX_TEXT_LINE_LEN) len = MAX_TEXT_LINE_LEN; strncpy(line, Text_lines[z], len); line[len] = 0; gr_string(Cutscene_desc_coords[gr_screen.res][0], Cutscene_desc_coords[gr_screen.res][1] + y, line); y += font_height; z++; } } gr_flip(); }
// do void loop_brief_do(float frametime) { int k; int idx; // process keys k = Loop_brief_window.process(); switch (k) { case KEY_ESC: int do_loop = 0; // this popup should be straight forward, and also not allow you to get out // of it without actually picking one of the two options do_loop = popup(PF_USE_NEGATIVE_ICON | PF_USE_AFFIRMATIVE_ICON | PF_IGNORE_ESC | PF_BODY_BIG, 2, XSTR("Decline", 1467), XSTR("Accept", 1035), XSTR("You must either Accept or Decline before returning to the Main Hall", 1618)); // if we accepted moving into loop then set it up for the next time the user plays if (do_loop == 1) { // select the loop mission Campaign.loop_enabled = 1; Campaign.loop_reentry = Campaign.next_mission; // save reentry pt, so we can break out of loop Campaign.next_mission = Campaign.loop_mission; } gameseq_post_event(GS_EVENT_MAIN_MENU); return; } // process button presses for (idx=0; idx<NUM_LOOP_BRIEF_BUTTONS; idx++){ if (Loop_buttons[gr_screen.res][idx].button.pressed()){ loop_brief_button_pressed(idx); } } common_music_do(); // clear GR_MAYBE_CLEAR_RES(Loop_brief_bitmap); if (Loop_brief_bitmap >= 0) { gr_set_bitmap(Loop_brief_bitmap); gr_bitmap(0, 0, GR_RESIZE_MENU); } // draw the window Loop_brief_window.draw(); // render the briefing text brief_render_text(0, Loop_brief_text_coords[gr_screen.res][0], Loop_brief_text_coords[gr_screen.res][1], Loop_brief_text_coords[gr_screen.res][3], flFrametime); if(Loop_anim.num_frames > 0) { int x; int y; bm_get_info((Loop_anim.streaming) ? Loop_anim.bitmap_id : Loop_anim.first_frame, &x, &y, NULL, NULL, NULL); x = Loop_brief_anim_center_coords[gr_screen.res][0] - x / 2; y = Loop_brief_anim_center_coords[gr_screen.res][1] - y / 2; generic_anim_render(&Loop_anim, frametime, x, y, true); } // render all anims anim_render_all(GS_STATE_LOOP_BRIEF, flFrametime); gr_flip(); }