Add support for cutscenes before the various briefing and debriefing sections (FRED support for this feature will come later, but it will load and save correctly for now).

This commit is contained in:
karajorma committed 2009-05-14 16:27:36 +00:00
1 parent a9219ca129
commit 251285cacc
9 files changed
+172 -9

No files matched your search

+5 -5
View File
@@ -909,12 +909,12 @@ BEGIN
COMBOBOX IDC_SHIP_CARGO1,47,65,94,258,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_SHIP_ALT,47,79,94,125,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_SHIP_CALLSIGN,47,93,94,125,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Texture Replacement",IDC_TEXTURES,47,110,93,14,0,WS_EX_STATICEDGE
PUSHBUTTON "Texture Replacement",IDC_TEXTURES,47,110,94,14,0,WS_EX_STATICEDGE
COMBOBOX IDC_HOTKEY,189,24,68,122,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_SHIP_PERSONA,189,40,68,129,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
EDITTEXT IDC_SCORE,189,55,68,14,ES_AUTOHSCROLL | ES_NUMBER
CONTROL "Player Ship",IDC_PLAYER_SHIP,"Button",BS_3STATE | WS_TABSTOP,189,88,51,10
PUSHBUTTON "Set As Player Ship",IDC_SET_AS_PLAYER_SHIP,187,100,69,14,0,WS_EX_STATICEDGE
PUSHBUTTON "Set As Player Ship",IDC_SET_AS_PLAYER_SHIP,188,98,69,14,0,WS_EX_STATICEDGE
PUSHBUTTON "Misc",IDC_FLAGS,47,132,50,14,0,WS_EX_STATICEDGE
PUSHBUTTON "Initial Status",IDC_INITIAL_STATUS,101,132,50,14,0,WS_EX_STATICEDGE
PUSHBUTTON "Initial Orders",IDC_GOALS,156,132,50,14,0,WS_EX_STATICEDGE
@@ -933,7 +933,7 @@ BEGIN
CONTROL "Spin1",IDC_ARRIVAL_DELAY_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,86,206,11,14
LTEXT "Seconds",IDC_STATIC,103,208,45,8
CONTROL "Update Cue",IDC_UPDATE_ARRIVAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,245,54,10
CONTROL "Tree1",IDC_ARRIVAL_TREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS | WS_BORDER | WS_TABSTOP,15,255,133,84,WS_EX_CLIENTEDGE
CONTROL "Tree1",IDC_ARRIVAL_TREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS | WS_BORDER | WS_HSCROLL | WS_TABSTOP,15,255,133,84,WS_EX_CLIENTEDGE
CONTROL "No Warp Effect",IDC_NO_ARRIVAL_WARP,"Button",BS_3STATE | WS_TABSTOP,16,341,65,10
COMBOBOX IDC_DEPARTURE_LOCATION,202,162,103,127,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_DEPARTURE_TARGET,202,176,103,262,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
@@ -941,7 +941,7 @@ BEGIN
CONTROL "Spin3",IDC_DEPARTURE_DELAY_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,240,206,11,14
LTEXT "Seconds",IDC_STATIC,255,209,45,8
CONTROL "Update Cue",IDC_UPDATE_DEPARTURE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,251,246,54,10
CONTROL "Tree1",IDC_DEPARTURE_TREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS | WS_BORDER | WS_TABSTOP,172,256,133,84,WS_EX_CLIENTEDGE
CONTROL "Tree1",IDC_DEPARTURE_TREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS | WS_BORDER | WS_HSCROLL | WS_TABSTOP,172,256,133,84,WS_EX_CLIENTEDGE
CONTROL "No Warp Effect",IDC_NO_DEPARTURE_WARP,"Button",BS_3STATE | WS_TABSTOP,172,342,65,10
EDITTEXT IDC_HELP_BOX,7,362,307,53,ES_MULTILINE | ES_READONLY,WS_EX_TRANSPARENT
LTEXT "Ship Name",IDC_STATIC,7,10,36,8
@@ -971,7 +971,7 @@ BEGIN
EDITTEXT IDC_ASSIST_SCORE,189,72,68,14,ES_AUTOHSCROLL | ES_NUMBER
LTEXT "Assist %",IDC_STATIC,158,75,27,8
LTEXT "Callsign",IDC_STATIC,18,95,25,8
PUSHBUTTON "Alt Ship Class",IDC_ALT_SHIP_CLASS,180,100,69,14,0,WS_EX_STATICEDGE
PUSHBUTTON "Alt Ship Class",IDC_ALT_SHIP_CLASS,187,114,69,14,0,WS_EX_STATICEDGE
END
IDD_WEAPON_EDITOR DIALOGEX 0, 0, 519, 79
+1
View File
@@ -1427,6 +1427,7 @@ void clear_mission()
extern void allocate_mission_text(int size);
allocate_mission_text( MISSION_TEXT_SIZE );
The_mission.cutscenes.clear();
fiction_viewer_reset();
cmd_brief_reset();
mission_event_shutdown();
+69
View File
@@ -583,6 +583,8 @@ int CFred_mission_save::save_mission_file(char *pathname)
err = -3;
// else if (save_briefing_info())
// err = -4;
else if (save_cutscenes())
err = -4;
else if (save_cmd_briefs())
err = -4;
else if (save_briefing())
@@ -680,6 +682,8 @@ int CFred_mission_save::autosave_mission_file(char *pathname)
// err = -4;
else if (save_fiction())
err = -3;
else if (save_cutscenes())
err = -4;
else if (save_cmd_briefs())
err = -4;
else if (save_briefing())
@@ -1069,6 +1073,71 @@ int CFred_mission_save::save_plot_info()
return err;
}
int CFred_mission_save::save_cutscenes()
{
char type[NAME_LENGTH];
char out[MULTITEXT_LENGTH];
// Let's just assume it has them for now -
if (!(The_mission.cutscenes.empty()) ) {
if (Format_fs2_open) {
if (optional_string_fred("#Cutscenes")) {
parse_comments(2);
}
else {
fout_version("\n\n#Cutscenes\n\n");
}
for (uint i = 0; i < The_mission.cutscenes.size(); i++) {
if ( strlen(The_mission.cutscenes[i].cutscene_name) ) {
// determine the name of this cutscene type
switch (The_mission.cutscenes[i].type) {
case MOVIE_PRE_FICTION:
strcpy(type, "$Fiction Viewer Cutscene:");
break;
case MOVIE_PRE_CMD_BRIEF:
strcpy(type, "$Command Brief Cutscene:");
break;
case MOVIE_PRE_BRIEF:
strcpy(type, "$Briefing Cutscene:");
break;
case MOVIE_PRE_GAME:
strcpy(type, "$Pre-game Cutscene:");
break;
case MOVIE_PRE_DEBRIEF:
strcpy(type, "$Debriefing Cutscene:");
break;
default:
Int3();
continue;
}
if (optional_string_fred(type)) {
parse_comments();
fout(" %s", The_mission.cutscenes[i].cutscene_name);
}
else {
fout_version("%s %s\n", type, The_mission.cutscenes[i].cutscene_name);
}
required_string_fred("+formula:");
parse_comments();
convert_sexp_to_string(The_mission.cutscenes[i].formula, out, SEXP_SAVE_MODE, 4096);
fout(" %s", out);
}
}
required_string_fred("#end");
parse_comments();
}
else {
MessageBox(NULL, "Warning: This mission contains cutscene data, but you are saving in the retail mission format. This infomration will be lost", "Incompatibility with retail mission format", MB_OK);
}
}
fso_comment_pop(true);
return err;
}
int CFred_mission_save::save_fiction()
{
if (mission_has_fiction())
+1
View File
@@ -157,6 +157,7 @@ private:
int save_plot_info();
int save_variables();
// int save_briefing_info();
int save_cutscenes();
int save_fiction();
int save_cmd_brief();
int save_cmd_briefs();
+11
View File
@@ -8130,6 +8130,7 @@ void game_enter_state( int old_state, int new_state )
break;
case GS_STATE_FICTION_VIEWER:
common_maybe_play_cutscene(MOVIE_PRE_FICTION);
fiction_viewer_init();
break;
@@ -8137,6 +8138,7 @@ void game_enter_state( int old_state, int new_state )
if (old_state == GS_STATE_OPTIONS_MENU) {
cmd_brief_unhold();
} else {
common_maybe_play_cutscene(MOVIE_PRE_CMD_BRIEF);
int team_num = 0; // team number used as index for which cmd brief to use.
cmd_brief_init(team_num);
}
@@ -8144,10 +8146,12 @@ void game_enter_state( int old_state, int new_state )
}
case GS_STATE_RED_ALERT:
common_maybe_play_cutscene(MOVIE_PRE_BRIEF);
red_alert_init();
break;
case GS_STATE_BRIEFING:
common_maybe_play_cutscene(MOVIE_PRE_BRIEF);
brief_init();
break;
@@ -8155,6 +8159,7 @@ void game_enter_state( int old_state, int new_state )
game_stop_looped_sounds();
mission_goal_fail_incomplete(); // fail all incomplete goals before entering debriefing
if ( (old_state != GS_STATE_VIEW_MEDALS) && (old_state != GS_STATE_OPTIONS_MENU) ){
common_maybe_play_cutscene(MOVIE_PRE_DEBRIEF);
debrief_init();
}
break;
@@ -8210,6 +8215,12 @@ void game_enter_state( int old_state, int new_state )
break;
case GS_STATE_GAME_PLAY:
// maybe play a cutscene
if((old_state == GS_STATE_BRIEFING) || (old_state == GS_STATE_SHIP_SELECT) ||
(old_state == GS_STATE_WEAPON_SELECT) || (old_state == GS_STATE_RED_ALERT) ) {
common_maybe_play_cutscene(MOVIE_PRE_GAME);
}
// reset time compression to default level so it's right at the beginning of a mission - taylor
if(old_state != GS_STATE_GAME_PAUSED)
{
+45 -2
View File
@@ -2054,6 +2054,50 @@ void parse_player_info2(mission *pm)
Error(LOCATION, "Not enough ship/weapon pools for mission. There are %d teams and only %d pools.", Num_teams, nt);
}
// a little helper for the next function
void parse_single_cutscene (mission *pm, int type)
{
mission_cutscene scene;
scene.type = type;
stuff_string (scene.cutscene_name, F_NAME, NAME_LENGTH);
if ( required_string("+formula:") ) {
scene.formula = get_sexp_main();
}
pm->cutscenes.push_back(scene);
}
void parse_cutscenes(mission *pm)
{
pm->cutscenes.clear();
if (optional_string("#Cutscenes")) {
while(!optional_string("#end")){
if (optional_string("$Fiction Viewer Cutscene:")) {
parse_single_cutscene(pm, MOVIE_PRE_FICTION);
}
if (optional_string("$Command Brief Cutscene:")) {
parse_single_cutscene(pm, MOVIE_PRE_CMD_BRIEF);
}
if (optional_string("$Briefing Cutscene:")) {
parse_single_cutscene(pm, MOVIE_PRE_BRIEF);
}
if (optional_string("$Pre-game Cutscene:")) {
parse_single_cutscene(pm, MOVIE_PRE_GAME);
}
if (optional_string("$Debriefing Cutscene:")) {
parse_single_cutscene(pm, MOVIE_PRE_DEBRIEF);
}
}
}
}
void parse_plot_info(mission *pm)
{
if (optional_string("#Plot Info"))
@@ -4330,8 +4374,6 @@ void process_loadout_objects()
p_object *p_objp = &Parse_objects[i];
if (p_objp->flags2 & P2_SF2_SET_CLASS_DYNAMICALLY)
{
bool successful = is_ship_assignable(p_objp);
if (!(is_ship_assignable(p_objp)))
{
// store the ship so we can come back to it later.
@@ -6156,6 +6198,7 @@ int parse_mission(mission *pm, int flags)
parse_plot_info(pm);
parse_variables();
parse_briefing_info(pm); // TODO: obsolete code, keeping so we don't obsolete existing mission files
parse_cutscenes(pm);
parse_fiction(pm);
parse_cmd_briefs(pm);
parse_briefing(pm, flags);
+18
View File
@@ -671,6 +671,22 @@ typedef struct support_ship_info {
int support_available_for_species; // whether support is available for a given species (this is a bitfield)
} support_ship_info;
// movie type defines
#define MOVIE_PRE_FICTION 0
#define MOVIE_PRE_CMD_BRIEF 1
#define MOVIE_PRE_BRIEF 2
#define MOVIE_PRE_GAME 3
#define MOVIE_PRE_DEBRIEF 4
// defines a mission cutscene.
typedef struct mission_cutscene {
int type;
char cutscene_name[NAME_LENGTH];
int formula;
mission_cutscene() { memset(this, 0, sizeof(mission_cutscene)); formula = -1; };
} mission_cutscene;
typedef struct mission {
char name[NAME_LENGTH];
char author[NAME_LENGTH];
@@ -704,6 +720,8 @@ typedef struct mission {
// Goober5000
ai_profile_t *ai_profile;
std::vector<mission_cutscene> cutscenes;
} mission;
// cargo defines
+20 -2
View File
@@ -436,8 +436,9 @@
#include "network/multiteamselect.h"
#include "network/multi_endgame.h"
#include "missionui/chatbox.h"
#include "cutscene/movie.h"
#include "cutscene/cutscenes.h"
#include "parse/sexp.h"
//////////////////////////////////////////////////////////////////
@@ -732,6 +733,23 @@ void common_music_close()
briefing_stop_music();
}
void common_maybe_play_cutscene(int movie_type)
{
for (uint i = 0; i < The_mission.cutscenes.size(); i++) {
if (movie_type == The_mission.cutscenes[i].type) {
if (!eval_sexp( The_mission.cutscenes[i].formula )) {
continue;
}
if ( strlen(The_mission.cutscenes[i].cutscene_name) ) {
common_music_close();
movie_play( The_mission.cutscenes[i].cutscene_name ); //Play the movie!
cutscene_mark_viewable( The_mission.cutscenes[i].cutscene_name );
}
}
}
}
// function that sets the current palette to the interface palette. This function
// needs to be followed by common_free_interface_palette() to restore the game palette.
void common_set_interface_palette(char *filename)
+2
View File
@@ -117,6 +117,8 @@ void common_music_init( int score_index );
void common_music_do();
void common_music_close();
void common_maybe_play_cutscene(int movie_type);
int common_scroll_down_pressed(int *start, int size, int max_show);
int common_scroll_up_pressed(int *start, int size, int max_show);