2 * $Logfile: /Freespace2/code/MissionUI/MissionLoopBrief.cpp $
7 * Campaign Loop briefing screen
10 * Revision 1.1 2002/05/03 03:28:10 root
14 * 4 9/06/99 9:44p Jefff
15 * break out of loop support
17 * 3 9/06/99 6:38p Dave
18 * Improved CD detection code.
20 * 2 8/27/99 12:04a Dave
21 * Campaign loop screen.
27 #include "missionloopbrief.h"
28 #include "missionscreencommon.h"
32 #include "eventmusic.h"
35 #include "gamesequence.h"
36 #include "missioncampaign.h"
38 #include "freespace.h"
40 // ---------------------------------------------------------------------------------------------------------------------------------------
41 // MISSION LOOP BRIEF DEFINES/VARS
44 char *Loop_brief_fname[GR_NUM_RESOLUTIONS] = {
45 "LoopBrief", // GR_640
46 "2_LoopBrief", // GR_1024
49 char *Loop_brief_mask[GR_NUM_RESOLUTIONS] = {
50 "LoopBrief-m", // GR_640
51 "2_Loopbrief-m", // GR_1024
54 #define NUM_LOOP_BRIEF_BUTTONS 2
55 #define LOOP_BRIEF_DECLINE 0
56 #define LOOP_BRIEF_ACCEPT 1
57 ui_button_info Loop_buttons[GR_NUM_RESOLUTIONS][NUM_LOOP_BRIEF_BUTTONS] = {
59 ui_button_info("LBB_00", 529, 437, -1, -1, 0),
60 ui_button_info("LBB_01", 575, 433, -1, -1, 1),
63 ui_button_info("2_LBB_00", 846, 699, -1, -1, 0),
64 ui_button_info("2_LBB_01", 920, 693, -1, -1, 1),
68 #define NUM_LOOP_TEXT 2
69 UI_XSTR Loop_text[GR_NUM_RESOLUTIONS][NUM_LOOP_TEXT] = {
71 { "Decline", 1467, 514, 413, UI_XSTR_COLOR_PINK, -1, &Loop_buttons[0][LOOP_BRIEF_DECLINE].button },
72 { "Accept", 1035, 573, 413, UI_XSTR_COLOR_PINK, -1, &Loop_buttons[0][LOOP_BRIEF_ACCEPT].button },
75 { "Decline", 1467, 855, 670, UI_XSTR_COLOR_PINK, -1, &Loop_buttons[1][LOOP_BRIEF_DECLINE].button },
76 { "Accept", 1035, 928, 670, UI_XSTR_COLOR_PINK, -1, &Loop_buttons[1][LOOP_BRIEF_ACCEPT].button },
81 int Loop_brief_anim_coords[GR_NUM_RESOLUTIONS][2] = {
91 int Loop_brief_text_coords[GR_NUM_RESOLUTIONS][4] = {
100 UI_WINDOW Loop_brief_window;
101 int Loop_brief_bitmap;
104 anim_instance *Loop_anim_instance;
108 // ---------------------------------------------------------------------------------------------------------------------------------------
109 // MISSION LOOP BRIEF FUNCTIONS
113 void loop_brief_button_pressed(int i)
116 case LOOP_BRIEF_DECLINE:
118 if(game_do_cd_mission_check(Game_current_mission_filename)){
119 gameseq_post_event(GS_EVENT_START_GAME);
120 gamesnd_play_iface(SND_USER_SELECT);
122 gameseq_post_event(GS_EVENT_MAIN_MENU);
126 case LOOP_BRIEF_ACCEPT:
127 // select the loop mission
128 Campaign.loop_enabled = 1;
129 Campaign.loop_reentry = Campaign.next_mission; // save reentry pt, so we can break out of loop
130 Campaign.next_mission = Campaign.loop_mission;
133 if(game_do_cd_mission_check(Game_current_mission_filename)){
134 gameseq_post_event(GS_EVENT_START_GAME);
135 gamesnd_play_iface(SND_USER_SELECT);
137 gameseq_post_event(GS_EVENT_MAIN_MENU);
144 void loop_brief_init()
149 // load the background bitmap
150 Loop_brief_bitmap = bm_load(Loop_brief_fname[gr_screen.res]);
151 Assert(Loop_brief_bitmap != -1);
154 Loop_brief_window.create(0, 0, gr_screen.max_w, gr_screen.max_h, 0);
155 Loop_brief_window.set_mask_bmap(Loop_brief_mask[gr_screen.res]);
158 for (idx=0; idx<NUM_LOOP_BRIEF_BUTTONS; idx++) {
159 b = &Loop_buttons[gr_screen.res][idx];
161 b->button.create(&Loop_brief_window, "", b->x, b->y, 60, 30, 0, 1);
162 b->button.set_highlight_action(common_play_highlight_sound);
163 b->button.set_bmaps(b->filename);
164 b->button.link_hotspot(b->hotspot);
168 for(idx=0; idx<NUM_LOOP_TEXT; idx++){
169 Loop_brief_window.add_XSTR(&Loop_text[gr_screen.res][idx]);
172 // load animation if any
174 Loop_anim_instance = NULL;
175 if(Campaign.missions[Campaign.current_mission].mission_loop_brief_anim != NULL){
176 Loop_anim = anim_load(Campaign.missions[Campaign.current_mission].mission_loop_brief_anim);
178 Loop_anim = anim_load("CB_default");
181 // fire up an anim instance
182 if(Loop_anim != NULL){
183 anim_play_struct aps;
185 anim_play_init(&aps, Loop_anim, Loop_brief_anim_coords[gr_screen.res][0], Loop_brief_anim_coords[gr_screen.res][1]);
186 aps.framerate_independent = 1;
188 aps.screen_id = GS_STATE_LOOP_BRIEF;
189 Loop_anim_instance = anim_play(&aps);
193 if(Campaign.missions[Campaign.current_mission].mission_loop_desc != NULL){
194 brief_color_text_init(Campaign.missions[Campaign.current_mission].mission_loop_desc, Loop_brief_text_coords[gr_screen.res][2]);
198 if(Campaign.missions[Campaign.current_mission].mission_loop_brief_sound != NULL){
199 Loop_sound = audiostream_open(Campaign.missions[Campaign.current_mission].mission_loop_brief_sound, ASF_VOICE);
201 if(Loop_sound != -1){
202 audiostream_play(Loop_sound, Master_voice_volume, 0);
207 common_music_init(SCORE_BRIEFING);
217 k = Loop_brief_window.process();
221 gameseq_post_event(GS_EVENT_MAIN_MENU);
225 // process button presses
226 for (idx=0; idx<NUM_LOOP_BRIEF_BUTTONS; idx++){
227 if (Loop_buttons[gr_screen.res][idx].button.pressed()){
228 loop_brief_button_pressed(idx);
235 GR_MAYBE_CLEAR_RES(Loop_brief_bitmap);
236 if (Loop_brief_bitmap >= 0) {
237 gr_set_bitmap(Loop_brief_bitmap);
242 Loop_brief_window.draw();
244 // render the briefing text
245 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);
248 anim_render_all(GS_STATE_LOOP_BRIEF, flFrametime);
254 void loop_brief_close()
256 // this makes sure that we're all cool no matter how the user decides to exit
257 mission_campaign_mission_over();
260 if (Loop_brief_bitmap >= 0){
261 bm_unload(Loop_brief_bitmap);
263 Loop_brief_bitmap = -1;
265 // destroy the window
266 Loop_brief_window.destroy();
268 // free up anim stuff
269 if(Loop_anim_instance != NULL){
270 anim_release_render_instance(Loop_anim_instance);
271 Loop_anim_instance = NULL;
273 if(Loop_anim != NULL){
274 anim_free(Loop_anim);
279 if(Loop_sound != -1){
280 audiostream_stop(Loop_sound);
281 audiostream_close_file(Loop_sound);
286 common_music_close();