In Endlevel sequence, re-align big explosion to draw in front of exit model, relative to viewer; Re-organized tex files for Briefings and Endings and created more general code to play them; Re-aligned Dravis' head

This commit is contained in:
zicodxx 2010-03-25 23:37:19 +00:00
parent 73ba0a078f
commit 19ad0ace53
7 changed files with 125 additions and 69 deletions

View file

@ -1,5 +1,9 @@
D2X-Rebirth Changelog
20100326
--------
main/endlevel.c, main/gameseq.c, main/mission.c, main/mission.h, main/titles.c, main/titles.h: In Endlevel sequence, re-align big explosion to draw in front of exit model, relative to viewer; Re-organized tex files for Briefings and Endings and created more general code to play them; Re-aligned Dravis' head
20100325
--------
main/titles.c: Make sure got_z is not reset to 0 for Descent 1 missions - fixing crash, also make sure briefing hum is not played through more than one channel

View file

@ -574,13 +574,15 @@ void do_endlevel_frame()
if (vm_vec_dot(&tvec,&mine_exit_orient.fvec) > 0) {
object *tobj;
vms_vector mov_vec;
outside_mine = 1;
tobj = object_create_explosion(exit_segnum,&mine_side_exit_point,i2f(50),VCLIP_BIG_PLAYER_EXPLOSION);
// Move explosion a bit to draw it in front of mine exit model
vm_vec_scale_add(&tobj->pos,&tobj->pos,&tobj->orient.rvec,i2f(20));
// Move explosion to Viewer to draw it in front of mine exit model
vm_vec_normalized_dir_quick(&mov_vec,&Viewer->pos,&tobj->pos);
vm_vec_scale_add2(&tobj->pos,&mov_vec,i2f(30));
if (tobj) {
external_explosion = *tobj;

View file

@ -1300,22 +1300,16 @@ void DoEndGame(void)
init_subtitles(ENDMOVIE ".tex"); //ingore errors
played = PlayMovie(ENDMOVIE,MOVIE_REQUIRED);
close_subtitles();
if (!played) {
if (is_D2_OEM)
{
songs_play_song( SONG_TITLE, 0 );
do_briefing_screens("end2oem.tex",1);
}
else
{
songs_play_song( SONG_ENDGAME, 0 );
do_briefing_screens("ending2.tex",1);
}
if (!played)
{
do_end_briefing_screens(Ending_text_filename);
}
} else if (!(Game_mode & GM_MULTI)) { //not multi
}
else if (!(Game_mode & GM_MULTI)) //not multi
{
char tname[FILENAME_LEN];
sprintf(tname,"%s.tex",Current_mission_filename);
do_briefing_screens (tname,Last_level+1); //level past last is endgame breifing
do_end_briefing_screens (Ending_text_filename);
//try doing special credits
sprintf(tname,"%s.ctb",Current_mission_filename);
@ -1324,10 +1318,6 @@ void DoEndGame(void)
key_flush();
#ifdef SHAREWARE
show_order_form();
#endif
#ifdef NETWORK
if (Game_mode & GM_MULTI)
multi_endlevel_score();
@ -1789,12 +1779,12 @@ void ShowLevelIntro(int level_num)
if (is_SHAREWARE || is_MAC_SHARE)
{
if (level_num==1)
do_briefing_screens ("brief2.tex", 1);
do_briefing_screens (Briefing_text_filename, 1);
}
else if (is_D2_OEM)
{
if (level_num == 1 && !intro_played)
do_briefing_screens("brief2o.tex", 1);
do_briefing_screens(Briefing_text_filename, 1);
}
else // full version
{
@ -1809,17 +1799,12 @@ void ShowLevelIntro(int level_num)
}
}
do_briefing_screens ("robot.tex",level_num);
do_briefing_screens (Briefing_text_filename,level_num);
}
}
else { //not the built-in mission. check for add-on briefing
if (EMULATING_D1)
do_briefing_screens(Briefing_text_filename, level_num);
else {
char tname[FILENAME_LEN];
sprintf(tname, "%s.tex", Current_mission_filename);
do_briefing_screens(tname, level_num);
}
else //not the built-in mission (maybe d1, too). check for add-on briefing
{
do_briefing_screens(Briefing_text_filename, level_num);
}

View file

@ -40,12 +40,6 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#include "u_mem.h"
#include "ignorecase.h"
//values for d1 built-in mission
#define BIM_LAST_LEVEL 27
#define BIM_LAST_SECRET_LEVEL -3
#define BIM_BRIEFING_FILE "briefing.tex"
#define BIM_ENDING_FILE "endreg.tex"
//mission list entry
typedef struct mle {
char *filename; // filename without extension
@ -85,6 +79,9 @@ int load_mission_d1(void)
//build level names
for (i=0;i<Last_level;i++)
sprintf(Level_names[i], "level%02d.sdl", i+1);
strcpy(Briefing_text_filename,BIMD1_BRIEFING_FILE);
strcpy(Ending_text_filename,BIMD1_ENDING_FILE_SHARE);
break;
case D1_MAC_SHARE_MISSION_HOGSIZE:
@ -96,7 +93,10 @@ int load_mission_d1(void)
//build level names
for (i=0;i<Last_level;i++)
sprintf(Level_names[i], "level%02d.sdl", i+1);
strcpy(Briefing_text_filename,BIMD1_BRIEFING_FILE);
strcpy(Ending_text_filename,BIMD1_ENDING_FILE_SHARE);
break;
case D1_OEM_MISSION_HOGSIZE:
case D1_OEM_10_MISSION_HOGSIZE:
@ -113,7 +113,10 @@ int load_mission_d1(void)
sprintf(Secret_level_names[i], "levels%1d.rdl", i+1);
Secret_level_table[0] = 10;
strcpy(Briefing_text_filename,BIMD1_BRIEFING_FILE);
strcpy(Ending_text_filename,BIMD1_ENDING_FILE_OEM);
break;
default:
Int3(); // fall through
@ -122,8 +125,8 @@ int load_mission_d1(void)
case D1_MAC_MISSION_HOGSIZE:
N_secret_levels = 3;
Last_level = BIM_LAST_LEVEL;
Last_secret_level = BIM_LAST_SECRET_LEVEL;
Last_level = BIMD1_LAST_LEVEL;
Last_secret_level = BIMD1_LAST_SECRET_LEVEL;
//build level names
for (i=0;i<Last_level;i++)
@ -134,11 +137,12 @@ int load_mission_d1(void)
Secret_level_table[0] = 10;
Secret_level_table[1] = 21;
Secret_level_table[2] = 24;
strcpy(Briefing_text_filename,BIMD1_BRIEFING_FILE);
strcpy(Ending_text_filename,BIMD1_ENDING_FILE);
break;
}
strcpy(Briefing_text_filename,BIM_BRIEFING_FILE);
strcpy(Ending_text_filename,BIM_ENDING_FILE);
return 1;
}
@ -613,8 +617,8 @@ int load_mission(mle *mission)
//init vars
Last_level = 0;
Last_secret_level = 0;
Briefing_text_filename[0] = 0;
Ending_text_filename[0] = 0;
memset(&Briefing_text_filename, '\0', sizeof(Briefing_text_filename));
memset(&Ending_text_filename, '\0', sizeof(Ending_text_filename));
// for Descent 1 missions, load descent.hog
if (EMULATING_D1) {
@ -628,9 +632,13 @@ int load_mission(mle *mission)
switch (Current_mission->builtin_hogsize) {
case SHAREWARE_MISSION_HOGSIZE:
case MAC_SHARE_MISSION_HOGSIZE:
strcpy(Briefing_text_filename,BIMD2_BRIEFING_FILE_SHARE);
strcpy(Ending_text_filename,BIMD2_ENDING_FILE_SHARE);
return load_mission_shareware();
break;
case OEM_MISSION_HOGSIZE:
strcpy(Briefing_text_filename,BIMD2_BRIEFING_FILE_OEM);
strcpy(Ending_text_filename,BIMD2_ENDING_FILE_OEM);
return load_mission_oem();
break;
default:
@ -638,6 +646,7 @@ int load_mission(mle *mission)
case FULL_MISSION_HOGSIZE:
case FULL_10_MISSION_HOGSIZE:
case MAC_FULL_MISSION_HOGSIZE:
strcpy(Briefing_text_filename,BIMD2_BRIEFING_FILE);
// continue on... (use d2.mn2 from hogfile)
break;
}
@ -676,6 +685,9 @@ int load_mission(mle *mission)
PHYSFSEXT_locateCorrectCase(buf);
if (cfexist(buf))
cfile_init(buf, 0);
snprintf(Briefing_text_filename, sizeof(Briefing_text_filename), "%s.tex",Current_mission_filename);
snprintf(Ending_text_filename, sizeof(Ending_text_filename), "%s.tex",Current_mission_filename);
}
while (cfgets(buf,80,mfile)) {

View file

@ -109,6 +109,20 @@ extern Mission *Current_mission; // current mission
#define EMULATING_D1 (Current_mission->descent_version == 1)
#define ANARCHY_ONLY_MISSION (Current_mission->anarchy_only_flag == 1)
//values for d1 built-in mission
#define BIMD1_LAST_LEVEL 27
#define BIMD1_LAST_SECRET_LEVEL -3
#define BIMD1_BRIEFING_FILE "briefing.tex"
#define BIMD1_ENDING_FILE "endreg.tex"
#define BIMD1_ENDING_FILE_OEM "endsat.tex"
#define BIMD1_ENDING_FILE_SHARE "ending.tex"
//values for d2 built-in mission
#define BIMD2_BRIEFING_FILE "robot.tex"
#define BIMD2_BRIEFING_FILE_OEM "brief2o.tex"
#define BIMD2_BRIEFING_FILE_SHARE "brief2.tex"
#define BIMD2_ENDING_FILE_OEM "end2oem.tex"
#define BIMD2_ENDING_FILE_SHARE "ending2.tex"
//loads the named mission if it exists.
//Returns true if mission loaded ok, else false.
int load_mission_by_name (char *mission_name);

View file

@ -324,7 +324,7 @@ void show_order_form()
//-----------------------------------------------------------------------------
typedef struct {
char bs_name[14]; // filename, eg merc01. Assumes .lbm suffix.
char bs_name[16]; // filename, eg merc01. Assumes .lbm suffix.
sbyte level_num;
sbyte message_num;
short text_ulx, text_uly; // upper left x,y of text window
@ -334,14 +334,8 @@ typedef struct {
#define BRIEFING_SECRET_NUM 31 // This must correspond to the first secret level which must come at the end of the list.
#define BRIEFING_OFFSET_NUM 4 // This must correspond to the first level screen (ie, past the bald guy briefing screens)
#define SHAREWARE_ENDING_LEVEL_NUM 0x7f
#define REGISTERED_ENDING_LEVEL_NUM 0x7e
#ifdef SHAREWARE
#define ENDING_LEVEL_NUM SHAREWARE_ENDING_LEVEL_NUM
#else
#define ENDING_LEVEL_NUM REGISTERED_ENDING_LEVEL_NUM
#endif
#define ENDING_LEVEL_NUM_OEMSHARE 0x7f
#define ENDING_LEVEL_NUM_REGISTER 0x7e
#define MAX_BRIEFING_SCREENS 60
@ -365,7 +359,6 @@ briefing_screen D1_Briefing_screens[] = {
{ "merc01.pcx", 6, 11, 10, 15, 300, 200 }, // level 6
{ "merc01.pcx", 7, 12, 10, 15, 300, 200 }, // level 7
#ifndef SHAREWARE
{ "brief03.pcx", 8, 13, 20, 22, 257, 177 },
{ "mars01.pcx", 8, 14, 10, 100, 300, 200 }, // level 8
{ "mars01.pcx", 9, 15, 10, 100, 300, 200 }, // level 9
@ -400,15 +393,11 @@ briefing_screen D1_Briefing_screens[] = {
{ "aster01.pcx", -1, 38, 10, 90, 300, 200 }, // secret level -1
{ "aster01.pcx", -2, 39, 10, 90, 300, 200 }, // secret level -2
{ "aster01.pcx", -3, 40, 10, 90, 300, 200 }, // secret level -3
#endif
{ "end01.pcx", SHAREWARE_ENDING_LEVEL_NUM, 1, 23, 40, 320, 200 }, // shareware end
#ifndef SHAREWARE
{ "end02.pcx", REGISTERED_ENDING_LEVEL_NUM, 1, 5, 5, 300, 200 }, // registered end
{ "end01.pcx", REGISTERED_ENDING_LEVEL_NUM, 2, 23, 40, 320, 200 }, // registered end
{ "end03.pcx", REGISTERED_ENDING_LEVEL_NUM, 3, 5, 5, 300, 200 }, // registered end
#endif
{ "end01.pcx", ENDING_LEVEL_NUM_OEMSHARE, 1, 23, 40, 320, 200 }, // OEM and shareware end
{ "end02.pcx", ENDING_LEVEL_NUM_REGISTER, 1, 5, 5, 300, 200 }, // registered end
{ "end01.pcx", ENDING_LEVEL_NUM_REGISTER, 2, 23, 40, 320, 200 }, // registered end
{ "end03.pcx", ENDING_LEVEL_NUM_REGISTER, 3, 5, 5, 300, 200 }, // registered end
};
#define NUM_D1_BRIEFING_SCREENS (sizeof(D1_Briefing_screens)/sizeof(briefing_screen))
@ -463,7 +452,7 @@ void briefing_init(briefing *br, short level_num)
br->cur_screen = 0;
br->screen = NULL;
gr_init_bitmap_data (&br->background);
strcpy(br->background_name, DEFAULT_BRIEFING_BKG);
strncpy(br->background_name, DEFAULT_BRIEFING_BKG, sizeof(br->background_name));
br->hum_channel = br->printing_channel = -1;
br->robot_canv = NULL;
br->robot_playing = 0;
@ -1049,8 +1038,7 @@ void show_briefing_bitmap(grs_bitmap *bmp)
{
grs_canvas *curcanv_save, *bitmap_canv;
bitmap_canv = gr_create_sub_canvas(grd_curcanv, 220*((double)SWIDTH/(HIRESMODE ? 640 : 320)), 45*((double)SHEIGHT/(HIRESMODE ? 480 : 200)),
bmp->bm_w, bmp->bm_h);
bitmap_canv = gr_create_sub_canvas(grd_curcanv, rescale_x(220), rescale_y(55), (bmp->bm_w*(SWIDTH/(HIRESMODE ? 640 : 320))),(bmp->bm_h*(SHEIGHT/(HIRESMODE ? 480 : 200))));
curcanv_save = grd_curcanv;
gr_set_current_canvas(bitmap_canv);
#ifdef OGL
@ -1161,8 +1149,8 @@ int load_briefing_screen(briefing *br, char *fname)
free_briefing_screen(br);
gr_init_bitmap_data(&br->background);
strcpy (br->background_name,fname);
if (stricmp(br->background_name, fname))
strncpy (br->background_name,fname, sizeof(br->background_name));
if ((pcx_error = pcx_read_bitmap(fname, &br->background, BM_LINEAR, gr_palette))!=PCX_ERROR_NONE)
Error( "Error loading briefing screen <%s>, PCX load error: %s (%i)\n",fname, pcx_errormsg(pcx_error), pcx_error);
@ -1465,3 +1453,53 @@ void do_briefing_screens(char *filename, int level_num)
while (window_exists(wind))
event_process();
}
void do_end_briefing_screens(char *filename)
{
int level_num_screen = Current_level_num, showorder = 0;
if (!strlen(filename))
return; // no filename, no ending
if (EMULATING_D1)
{
if (stricmp(filename, BIMD1_ENDING_FILE_OEM) == 0)
{
songs_play_song( SONG_ENDGAME, 0 );
level_num_screen = ENDING_LEVEL_NUM_OEMSHARE;
}
else if (stricmp(filename, BIMD1_ENDING_FILE_SHARE) == 0)
{
songs_play_song( SONG_BRIEFING, 1 );
level_num_screen = ENDING_LEVEL_NUM_OEMSHARE;
}
else
{
songs_play_song( SONG_ENDGAME, 0 );
level_num_screen = ENDING_LEVEL_NUM_REGISTER;
}
}
else if (PLAYING_BUILTIN_MISSION)
{
if (stricmp(filename, BIMD2_ENDING_FILE_OEM) == 0)
{
songs_play_song( SONG_TITLE, 0 );
level_num_screen = 1;
showorder = 1;
}
else if (stricmp(filename, BIMD2_ENDING_FILE_SHARE) == 0)
{
songs_play_song( SONG_ENDGAME, 0 );
level_num_screen = 1;
showorder = 1;
}
}
else
{
level_num_screen = Current_level_num + 1;
}
do_briefing_screens(filename, level_num_screen);
if (showorder)
show_order_form();
}

View file

@ -23,6 +23,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
extern void show_titles(void);
extern void show_loading_screen(ubyte *title_pal);
extern void do_briefing_screens(char *filename, int level_num);
extern void do_end_briefing_screens(char *filename);
extern char * get_briefing_screen( int level_num );
extern void show_endgame_briefing(void);
extern void show_order_form(void);