void techroom_anim_render(float frametime) { int x, y; // render common stuff tech_common_render(); // render the animation if(Current_list[Cur_entry].animation.num_frames > 0) { //grab dimensions bm_get_info((Current_list[Cur_entry].animation.streaming) ? Current_list[Cur_entry].animation.bitmap_id : Current_list[Cur_entry].animation.first_frame, &x, &y, NULL, NULL, NULL); //get the centre point - adjust x = Tech_ani_centre_coords[gr_screen.res][0] - x / 2; y = Tech_ani_centre_coords[gr_screen.res][1] - y / 2; generic_anim_render(&Current_list[Cur_entry].animation, frametime, x, y, true); } // if our active item has a bitmap instead of an animation, draw it else if((Cur_entry >= 0) && (Current_list[Cur_entry].bitmap >= 0)){ //grab dimensions bm_get_info(Current_list[Cur_entry].bitmap, &x, &y, NULL, NULL, NULL); //get the centre point - adjust x = Tech_ani_centre_coords[gr_screen.res][0] - x / 2; y = Tech_ani_centre_coords[gr_screen.res][1] - y / 2; gr_set_bitmap(Current_list[Cur_entry].bitmap); gr_bitmap(x, y, GR_RESIZE_MENU); } }
/** * Renders everything for a head animation * Also checks for when new head ani's need to start playing */ void HudGaugeTalkingHead::render(float frametime) { if ( Head_frame.first_frame == -1 ) { return; } if(msg_id != -1 && head_anim != NULL) { if(!head_anim->done_playing) { // draw frame // hud_set_default_color(); setGaugeColor(); // clear setClip(position[0] + Anim_offsets[0], position[1] + Anim_offsets[1], Anim_size[0], Anim_size[1]); gr_clear(); resetClip(); renderBitmap(Head_frame.first_frame, position[0], position[1]); // head ani border float scale_x = i2fl(Anim_size[0]) / i2fl(head_anim->width); float scale_y = i2fl(Anim_size[1]) / i2fl(head_anim->height); gr_set_screen_scale(fl2ir(base_w / scale_x), fl2ir(base_h / scale_y)); setGaugeColor(); generic_anim_render(head_anim,frametime, fl2ir((position[0] + Anim_offsets[0] + HUD_offset_x) / scale_x), fl2ir((position[1] + Anim_offsets[1] + HUD_offset_y) / scale_y)); // draw title gr_set_screen_scale(base_w, base_h); renderString(position[0] + Header_offsets[0], position[1] + Header_offsets[1], XSTR("message", 217)); } else { for (int j = 0; j < Num_messages_playing; ++j) { if (Playing_messages[j].id == msg_id) { Playing_messages[j].play_anim = false; break; // only one head ani plays at a time } } msg_id = -1; // allow repeated messages to display a new head ani head_anim = NULL; // Nothing to see here anymore, move along } } // check playing messages to see if we have any messages with talking animations that need to be created. for (int i = 0; i < Num_messages_playing; i++ ) { if(Playing_messages[i].play_anim && Playing_messages[i].id != msg_id ) { msg_id = Playing_messages[i].id; if (Playing_messages[i].anim_data) head_anim = Playing_messages[i].anim_data; else head_anim = NULL; return; } } }
// 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(); }
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(); }