made code for level progression more similar between D1X and D2X

This commit is contained in:
zico 2015-03-23 02:43:31 +01:00
parent 1e5acb5f6e
commit 8292efe622

View file

@ -118,7 +118,6 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#include "custom.h"
#define GLITZ_BACKGROUND Menu_pcx_name
static int AdvanceLevel(int secret_flag);
#elif defined(DXX_BUILD_DESCENT_II)
#include "movie.h"
#define GLITZ_BACKGROUND STARS_BACKGROUND
@ -127,8 +126,8 @@ static void StartNewLevelSecret(int level_num, int page_in_textures);
static void InitPlayerPosition(int random_flag);
static void DoEndGame(void);
static void filter_objects_from_level();
static void AdvanceLevel(int secret_flag);
#endif
static void AdvanceLevel(int secret_flag);
static void StartLevel(int random_flag);
static void copy_defaults_to_robot_all(void);
@ -1195,232 +1194,31 @@ void PlayerFinishedLevel(int secret_flag)
//credit the player for hostages
Players[Player_num].hostages_rescued_total += Players[Player_num].hostages_on_board;
#if defined(DXX_BUILD_DESCENT_I)
int rval;
int was_multi = 0;
if (!(Game_mode & GM_MULTI) && (secret_flag)) {
array<newmenu_item, 1> m{{
nm_item_text(" "), //TXT_SECRET_EXIT;
}};
newmenu_do2(NULL, TXT_SECRET_EXIT, m.size(), m.data(), unused_newmenu_subfunction, unused_newmenu_userdata, 0, Menu_pcx_name);
}
// -- mk mk mk -- used to be here -- mk mk mk --
if (Game_mode & GM_NETWORK)
{
if (secret_flag)
Players[Player_num].connected = CONNECT_FOUND_SECRET; // Finished and went to secret level
else
Players[Player_num].connected = CONNECT_WAITING; // Finished but did not die
}
last_drawn_cockpit = -1;
if (Current_level_num == Last_level) {
if ((Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP))
{
was_multi = 1;
multi_endlevel_score();
rval = AdvanceLevel(secret_flag); //now go on to the next one (if one)
}
else
{ // Note link to above else!
rval = AdvanceLevel(secret_flag); //now go on to the next one (if one)
DoEndLevelScoreGlitz(0); //give bonuses
}
} else {
if (Game_mode & GM_MULTI)
multi_endlevel_score();
else
DoEndLevelScoreGlitz(0); //give bonuses
rval = AdvanceLevel(secret_flag); //now go on to the next one (if one)
}
if (!was_multi && rval) {
if (PLAYING_BUILTIN_MISSION)
scores_maybe_add_player(0);
if (Game_wind)
window_close(Game_wind); // Exit out of game loop
}
else if (rval && Game_wind)
window_close(Game_wind);
#elif defined(DXX_BUILD_DESCENT_II)
Assert(!secret_flag);
#endif
if (Game_mode & GM_NETWORK)
Players[Player_num].connected = CONNECT_WAITING; // Finished but did not die
last_drawn_cockpit = -1;
AdvanceLevel(secret_flag); //now go on to the next one (if one)
#endif
if (Game_wind)
window_set_visible(Game_wind, 1);
reset_time();
}
#if defined(DXX_BUILD_DESCENT_I)
static int AdvanceLevel(int secret_flag)
{
Control_center_destroyed = 0;
#ifdef EDITOR
if (Current_level_num == 0)
{
return 1; //not a real level
}
#endif
key_flush();
if (Game_mode & GM_MULTI)
{
int result;
result = multi_endlevel(&secret_flag); // Wait for other players to reach this point
if (result) // failed to sync
{
return (Current_level_num == Last_level);
}
}
key_flush();
if (Current_level_num == Last_level) { //player has finished the game!
if ((Newdemo_state == ND_STATE_RECORDING) || (Newdemo_state == ND_STATE_PAUSED))
newdemo_stop_recording();
do_end_briefing_screens(Ending_text_filename);
return 1;
} else {
Next_level_num = Current_level_num+1; //assume go to next normal level
if (secret_flag) { //go to secret level instead
int i;
for (i=0;i<-Last_secret_level;i++)
if (Secret_level_table[i]==Current_level_num) {
Next_level_num = -(i+1);
break;
}
Assert(i<-Last_secret_level); //couldn't find which secret level
}
if (Current_level_num < 0) { //on secret level, where to go?
Assert(!secret_flag); //shouldn't be going to secret level
Assert(Current_level_num<=-1 && Current_level_num>=Last_secret_level);
Next_level_num = Secret_level_table[(-Current_level_num)-1]+1;
}
StartNewLevel(Next_level_num);
}
key_flush();
return 0;
}
//called when the player has died
void DoPlayerDead()
{
if (Game_wind)
window_set_visible(Game_wind, 0);
reset_palette_add();
gr_palette_load (gr_palette);
dead_player_end(); //terminate death sequence (if playing)
#ifdef EDITOR
if (Game_mode == GM_EDITOR) { //test mine, not real level
object * player = &Objects[Players[Player_num].objnum];
//nm_messagebox( "You're Dead!", 1, "Continue", "Not a real game, though." );
if (Game_wind)
window_set_visible(Game_wind, 1);
load_level("gamesave.lvl");
init_player_stats_new_ship(Player_num);
player->flags &= ~OF_SHOULD_BE_DEAD;
StartLevel(0);
return;
}
#endif
if ( Game_mode&GM_MULTI )
{
multi_do_death(Players[Player_num].objnum);
}
else
{ //Note link to above else!
Players[Player_num].lives--;
if (Players[Player_num].lives == 0)
{
DoGameOver();
return;
}
}
if ( Control_center_destroyed ) {
//clear out stuff so no bonus
Players[Player_num].hostages_on_board = 0;
Players[Player_num].energy = 0;
Players[Player_num].shields = 0;
Players[Player_num].connected = CONNECT_DIED_IN_MINE;
do_screen_message(TXT_DIED_IN_MINE); // Give them some indication of what happened
int rval;
if (Current_level_num == Last_level) {
if ((Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP))
{
multi_endlevel_score();
rval = AdvanceLevel(0); //if finished, go on to next level
}
else
{ // Note link to above else!
rval = AdvanceLevel(0); //if finished, go on to next level
DoEndLevelScoreGlitz(0);
}
init_player_stats_new_ship(Player_num);
last_drawn_cockpit = -1;
} else {
if (Game_mode & GM_MULTI)
multi_endlevel_score();
else
DoEndLevelScoreGlitz(0); // Note above link!
rval = AdvanceLevel(0); //if finished, go on to next level
init_player_stats_new_ship(Player_num);
last_drawn_cockpit = -1;
}
if (rval) {
if (PLAYING_BUILTIN_MISSION)
scores_maybe_add_player(0);
if (Game_wind)
window_close(Game_wind); // Exit out of game loop
}
} else {
init_player_stats_new_ship(Player_num);
StartLevel(1);
}
if (Game_wind)
window_set_visible(Game_wind, 1);
reset_time();
}
#elif defined(DXX_BUILD_DESCENT_II)
#if defined(DXX_BUILD_DESCENT_II)
#define MOVIE_REQUIRED 1
#define ENDMOVIE "end"
#endif
//called when the player has finished the last level
static void DoEndGame(void)
@ -1436,16 +1234,18 @@ static void DoEndGame(void)
if (PLAYING_BUILTIN_MISSION && !(Game_mode & GM_MULTI))
{ //only built-in mission, & not multi
#if defined(DXX_BUILD_DESCENT_II)
int played=MOVIE_NOT_PLAYED; //default is not played
played = PlayMovie(ENDMOVIE ".tex", ENDMOVIE,MOVIE_REQUIRED);
if (!played)
#endif
{
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];
do_end_briefing_screens (Ending_text_filename);
@ -1466,7 +1266,9 @@ static void DoEndGame(void)
if (PLAYING_BUILTIN_MISSION && !((Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP))) {
gr_set_current_canvas( NULL );
gr_clear_canvas(BM_XRGB(0,0,0));
#if defined(DXX_BUILD_DESCENT_II)
load_palette(D2_DEFAULT_PALETTE,0,1);
#endif
scores_maybe_add_player(0);
}
@ -1479,8 +1281,9 @@ static void DoEndGame(void)
// Return true if game over.
static void AdvanceLevel(int secret_flag)
{
#if defined(DXX_BUILD_DESCENT_II)
Assert(!secret_flag);
#endif
if (Current_level_num != Last_level) {
if (Game_mode & GM_MULTI)
multi_endlevel_score();
@ -1511,11 +1314,34 @@ static void AdvanceLevel(int secret_flag)
}
}
if (Current_level_num == Last_level) { //player has finished the game!
if (Current_level_num == Last_level) { //player has finished the game!
DoEndGame();
} else {
#if defined(DXX_BUILD_DESCENT_I)
Next_level_num = Current_level_num+1; //assume go to next normal level
if (secret_flag) { //go to secret level instead
int i;
for (i=0;i<-Last_secret_level;i++)
if (Secret_level_table[i]==Current_level_num) {
Next_level_num = -(i+1);
break;
}
Assert(i<-Last_secret_level); //couldn't find which secret level
}
if (Current_level_num < 0) { //on secret level, where to go?
Assert(!secret_flag); //shouldn't be going to secret level
Assert(Current_level_num<=-1 && Current_level_num>=Last_secret_level);
Next_level_num = Secret_level_table[(-Current_level_num)-1]+1;
}
#elif defined(DXX_BUILD_DESCENT_II)
//NMN 04/08/07 If we are in a secret level and playing a D1
// level, then use Entered_from_level # instead
if (Current_level_num < 0 && EMULATING_D1)
@ -1525,9 +1351,8 @@ static void AdvanceLevel(int secret_flag)
Next_level_num = Current_level_num+1; //assume go to next normal level
}
// END NMN
#endif
StartNewLevel(Next_level_num);
}
}
@ -1579,7 +1404,7 @@ void DoPlayerDead()
Players[Player_num].connected = CONNECT_DIED_IN_MINE;
do_screen_message(TXT_DIED_IN_MINE); // Give them some indication of what happened
#if defined(DXX_BUILD_DESCENT_II)
if (Current_level_num < 0) {
if (PHYSFSX_exists(SECRETB_FILENAME,0))
{
@ -1596,14 +1421,16 @@ void DoPlayerDead()
init_player_stats_new_ship(Player_num); // New, MK, 05/29/96!, fix bug with dying in secret level, advance to next level, keep powerups!
}
}
} else {
} else
#endif
{
AdvanceLevel(0); //if finished, go on to next level
init_player_stats_new_ship(Player_num);
last_drawn_cockpit = -1;
}
#if defined(DXX_BUILD_DESCENT_II)
} else if (Current_level_num < 0) {
if (PHYSFSX_exists(SECRETB_FILENAME,0))
{
@ -1623,6 +1450,7 @@ void DoPlayerDead()
init_player_stats_new_ship(Player_num); // New, MK, 05/29/96!, fix bug with dying in secret level, advance to next level, keep powerups!
}
}
#endif
} else {
init_player_stats_new_ship(Player_num);
StartLevel(1);
@ -1634,7 +1462,6 @@ void DoPlayerDead()
window_set_visible(Game_wind, 1);
reset_time();
}
#endif
//called when the player is starting a new level for normal game mode and restore state
// secret_flag set if came from a secret level
@ -1646,7 +1473,7 @@ void StartNewLevelSub(int level_num, int page_in_textures, int secret_flag)
#if defined(DXX_BUILD_DESCENT_I)
secret_flag = 0;
#elif defined(DXX_BUILD_DESCENT_II)
BigWindowSwitch=0;
BigWindowSwitch=0;
#endif