diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 53b43f9c6..261463292 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -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 diff --git a/main/endlevel.c b/main/endlevel.c index 5ba9e36ba..473a9a7e1 100644 --- a/main/endlevel.c +++ b/main/endlevel.c @@ -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; diff --git a/main/gameseq.c b/main/gameseq.c index 134824f8b..e4d1345f3 100644 --- a/main/gameseq.c +++ b/main/gameseq.c @@ -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); } diff --git a/main/mission.c b/main/mission.c index bf1385d61..1a757e1c8 100644 --- a/main/mission.c +++ b/main/mission.c @@ -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;ibuiltin_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)) { diff --git a/main/mission.h b/main/mission.h index 6f552210f..e6cc9f624 100644 --- a/main/mission.h +++ b/main/mission.h @@ -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); diff --git a/main/titles.c b/main/titles.c index 65c1b1782..521b92fd8 100644 --- a/main/titles.c +++ b/main/titles.c @@ -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(); +} diff --git a/main/titles.h b/main/titles.h index 30673b457..928daa2f4 100644 --- a/main/titles.h +++ b/main/titles.h @@ -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);