/*
* Seven Kingdoms: Ancient Adversaries
*
* Copyright 1997,1998 Enlight Software Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
//Filename : OGAMSCEN.CPP
//Description : Select Game Scenario
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//--------- declare static vars ----------//
static void init_scenario_var(ScenInfo* scenInfo);
static int sort_scenario_func(const void *arg1, const void *arg2);
//---------- Begin of function Game::select_run_scenario ----------//
//
// Select and play a scenario.
//
// return : 1 - ok, a scenario is selected and run
// 0 - cancel
//
int Game::select_run_scenario()
{
Directory gameDirList[MAX_SCENARIO_PATH];
ScenInfo* scenInfoArray = NULL;
int scenInfoSize = 0;
int dirId;
for( dirId = 0; dirId < MAX_SCENARIO_PATH; ++dirId )
{
if( DIR_SCENARIO_PATH(dirId)[0] )
{
Directory &gameDir = gameDirList[dirId];
{
String str;
str = DIR_SCENARIO_PATH(dirId);
str += "*.SCN";
gameDir.read( str, 1 ); // Read in all file names with the "SCN" extension
}
if( gameDir.size() > 0)
{
//---- append scenario file names in this directory into an array ----//
scenInfoArray = (ScenInfo *)mem_resize( scenInfoArray, sizeof(ScenInfo)*(scenInfoSize+gameDir.size()) );
for( int i = 1; i <= gameDir.size(); ++i, ++scenInfoSize)
{
char txtFileName[20];
scenInfoArray[scenInfoSize].file_name = gameDir[i]->name; // keep the pointers to the file name string
scenInfoArray[scenInfoSize].dir_id = dirId;
{
m.change_file_ext( txtFileName, gameDir[i]->name, "SCT" );
String str;
str = DIR_SCENARIO_PATH(dirId);
str += txtFileName;
FileTxt fileTxtScen(str);
//---- get the name of the scenario ----//
fileTxtScen.read_line( scenInfoArray[scenInfoSize].scen_name, ScenInfo::SCEN_NAME_LEN );
//---- get the difficulty level and score bonus ----//
fileTxtScen.get_token(); // skip "Difficulty:"
scenInfoArray[scenInfoSize].goal_difficulty = (short) fileTxtScen.get_num();
fileTxtScen.get_token(); // skip "Bonus:"
scenInfoArray[scenInfoSize].goal_score_bonus = (short) fileTxtScen.get_num();
}
}
}
}
}
if( scenInfoSize == 0 )
{
box.msg( "Sorry, there is no scenario in the game directory." );
return 0;
}
//-------- sort by difficulty ---------- //
qsort(scenInfoArray, scenInfoSize, sizeof(ScenInfo), sort_scenario_func);
//-------- select and run a scenario --------//
int rc = select_scenario( scenInfoSize, scenInfoArray );
if( rc )
run_scenario( scenInfoArray+rc-1 );
//-------------------------------------------//
mem_del(scenInfoArray);
return rc;
}
//------------ End of function Game::select_run_scenario -----------//
//---------- Begin of function Game::run_scenario ----------//
//
// scenInfo - the pointer to ScenInfo of the selected scenario
//
int Game::run_scenario(ScenInfo* scenInfo)
{
String str;
str = DIR_SCENARIO_PATH(scenInfo->dir_id);
str += scenInfo->file_name;
if( m.is_file_exist(str) )
{
// ###### begin Gilbert 1/11 #########//
// save the name in the config
char playerName[Config::PLAYER_NAME_LEN+1];
strcpy(playerName, config.player_name);
// ###### end Gilbert 1/11 #########//
if( game_file.load_game(str) > 0 )
{
init_scenario_var(scenInfo);
// ##### begin Gilbert 1/11 #######//
// set the nation name of the player
if( nation_array.player_recno )
{
(~nation_array)->nation_name_id = -nation_array.player_recno;
nation_array.set_human_name( nation_array.player_recno, playerName);
}
strcpy(config.player_name, playerName);
// ##### end Gilbert 1/11 #######//
battle.run_loaded();
}
game.deinit();
return 1;
}
return 0;
}
//------------ End of function Game::run_scenario -----------//
//-------- Start of function init_scenario_var ----------//
//
static void init_scenario_var(ScenInfo* scenInfo)
{
//-------- init config var ----------//
config.king_undie_flag = 0;
config.disable_ai_flag = 0;
config.fast_build = 0;
config.show_ai_info = 0;
config.show_all_unit_icon = 0;
config.show_unit_path = 0;
sys.set_speed(9, COMMAND_AUTO);
//------ reset the goal deadline -------//
info.goal_deadline = date.julian( date.year(info.game_date)+config.goal_year_limit,
date.month(info.game_date),
date.day(info.game_date) );
info.goal_difficulty = scenInfo->goal_difficulty;
info.goal_score_bonus = scenInfo->goal_score_bonus;
info.total_play_time = 0;
//------ reset vars in NationBase ---------//
Nation* playerNation = ~nation_array; // we reset a whole block of vars in NationBase which are related to financial info
playerNation->cheat_enabled_flag = 0;
//------- reset financial vars --------//
int resetSize = (char*) playerNation->relation_array
- (char*)(&(playerNation->cur_year_profit));
memset( &(playerNation->cur_year_profit), 0, resetSize );
//------- reset statistic vars -------//
resetSize = (char*)(&(playerNation->own_firm_destroyed))
- (char*)(&(playerNation->enemy_soldier_killed))
+ sizeof(playerNation->own_firm_destroyed);
memset( &(playerNation->enemy_soldier_killed), 0, resetSize );
//--------- update statistic ---------//
nation_array.update_statistic();
//------- reset display mode --------//
sys.view_mode = MODE_NORMAL;
world.map_matrix->map_mode = MAP_MODE_TERRAIN;
world.map_matrix->power_mode = 0;
//------------ reset news ------------//
news_array.reset();
//------ fix firm_build_id problem -----//
Firm* firmPtr;
for( int i=firm_array.size() ; i>0 ; i-- )
{
if( firm_array.is_deleted(i) )
continue;
firmPtr = firm_array[i];
if( firmPtr->firm_id != FIRM_MONSTER )
continue;
int monsterId = ((FirmMonster*)firmPtr)->monster_id;
firmPtr->firm_build_id = firm_res[FIRM_MONSTER]->get_build_id( monster_res[monsterId]->firm_build_code );
}
}
//--------- End of function init_scenario_var -----------//
//-------- Start of function init_scenario_var ----------//
//
int sort_scenario_func(const void *arg1, const void *arg2)
{
return ((ScenInfo *)arg1)->goal_difficulty - ((ScenInfo *)arg2)->goal_difficulty;
}
//-------- End of function init_scenario_var ----------//