/* * 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 : OCONFIG.CPP //Description : Config Object #include #include #include #include #include #include #include #include "gettext.h" #include DBGLOG_DEFAULT_CHANNEL(Config); // ------- define difficult table ---------// static char table_ai_nation_count[5] = { 2, 4, 6, 6, 6 }; static short table_start_up_cash[5] = { OPTION_HIGH, OPTION_HIGH, OPTION_MODERATE, OPTION_MODERATE, OPTION_LOW }; static short table_ai_start_up_cash[5] = { OPTION_LOW, OPTION_MODERATE, OPTION_MODERATE, OPTION_HIGH, OPTION_VERY_HIGH }; static char table_ai_aggressiveness[5] = { OPTION_LOW, OPTION_LOW, OPTION_MODERATE, OPTION_HIGH, OPTION_VERY_HIGH }; static short table_start_up_independent_town[5] = { 30, 30, 15, 15, 7 }; static short table_start_up_raw_site[5] = { 7, 6, 6, 4, 3, }; static char table_explore_whole_map[5] = { 1, 1, 1, 1, 0 }; static char table_fog_of_war[5] = { 0, 0, 0, 1, 1 }; static char table_new_independent_town_emerge[5] = { 1, 1, 1, 1, 1 }; static char table_independent_town_resistance[5] = { OPTION_LOW, OPTION_LOW, OPTION_MODERATE, OPTION_HIGH, OPTION_HIGH }; static char table_random_event_frequency[5] = { OPTION_NONE, OPTION_LOW, OPTION_MODERATE, OPTION_MODERATE, OPTION_MODERATE }; static char table_new_nation_emerge[5] = { 0, 0, 0, 1, 1 }; static char table_monster_type[5] = { OPTION_MONSTER_DEFENSIVE, OPTION_MONSTER_DEFENSIVE, OPTION_MONSTER_DEFENSIVE, OPTION_MONSTER_OFFENSIVE, OPTION_MONSTER_OFFENSIVE }; static char table_start_up_has_mine_nearby[5] = { 1, 1, 0, 0, 0 }; static char table_random_start_up[5] = { 0, 0, 0, 1, 1 }; //--------- Begin of function Config::init -----------// void Config::init() { default_game_setting(); default_cheat_setting(); default_local_game_setting(); default_preference(); } //--------- End of function Config::init --------// //--------- Begin of function Config::deinit -----------// void Config::deinit() { config.save("CONFIG.DAT"); // save the config when the game quits default_game_setting(); default_local_game_setting(); default_preference(); } //--------- End of function Config::deinit --------// //--------- Begin of function Config::default_game_setting ---------// void Config::default_game_setting() { // -------- GLOBAL GAME SETTING -------- // ai_nation_count = 6 ; start_up_cash = OPTION_MODERATE; // start_up_food = MEDIUM_STARTUP_RESOURCE; ai_start_up_cash = OPTION_MODERATE; // ai_start_up_food = MEDIUM_STARTUP_RESOURCE; ai_aggressiveness = OPTION_MODERATE; start_up_independent_town = 15; start_up_raw_site = 6; difficulty_level = OPTION_CUSTOM; explore_whole_map = 1; fog_of_war = 0; terrain_set = 1; latitude = 45; weather_effect = 1; // damage done by weather land_mass = OPTION_MODERATE; new_independent_town_emerge = 1; independent_town_resistance = OPTION_MODERATE; random_event_frequency = OPTION_NONE; monster_type = OPTION_MONSTER_DEFENSIVE; new_nation_emerge = 1; start_up_has_mine_nearby = 0; random_start_up = 0; change_difficulty(OPTION_VERY_EASY); //-------- goal --------// goal_destroy_monster = 0; goal_population_flag = 0; goal_economic_score_flag = 0; goal_total_score_flag = 0; goal_year_limit_flag = 0; goal_population = 300; goal_economic_score = 300; goal_total_score = 600; goal_year_limit = 20; // game setting on fire fire_spread_rate = 0; // 0 to disable, 10 for normal wind_spread_fire_rate = 5; // 0 to disable, 5 for normal fire_fade_rate = 2; // 1 for slow, 2 for fast fire_restore_prob = 80; // 0 to 100, 5 for normal (with spreading) rain_reduce_fire_rate = 5; // 0 to 20, 5 for normal fire_damage = 2; // 0 to disable 2 for normal } //--------- End of function Config::default_game_setting ---------// //--------- Begin of function Config::default_game_setting ---------// void Config::default_cheat_setting() { show_ai_info = sys.debug_session; fast_build = sys.debug_session; disable_ai_flag = 0; king_undie_flag = sys.testing_session; } //--------- End of function Config::default_game_setting ---------// //--------- Begin of function Config::default_local_game_setting ---------// void Config::default_local_game_setting() { race_id = 1; strcpy(player_name, "New Player"); player_nation_color = 1; expired_flag = 0; } //--------- End of function Config::default_local_game_setting ---------// //--------- Begin of function Config::default_preference ---------// void Config::default_preference() { opaque_report = 0; // opaque report instead of transparent report disp_news_flag = OPTION_DISPLAY_ALL_NEWS; scroll_speed = 5; frame_speed = 12; help_mode = DETAIL_HELP; disp_town_name = 1; disp_spy_sign = 1; show_all_unit_icon = 1; // 0:show icon when pointed, 1:always show_unit_path = 3; // bit 0 show unit path on ZoomMatrix, bit 1 for MapMatrix // music setting music_flag = 1; cd_music_volume = 100; wav_music_volume = 100; // sound effect setting sound_effect_flag = 1; sound_effect_volume = 100; pan_control = 1; // weather visual effect flags lightning_visual = 1; earthquake_visual = 1; rain_visual = 1; snow_visual = 1; snow_ground = 0; // 0=disable, 1=i_snow, 2=snow_res // weather audio effect flags lightning_audio = 1; earthquake_audio = 1; rain_audio = 1; snow_audio = 0; // not used wind_audio = 1; // weather visual effect parameters lightning_brightness = 20; cloud_darkness = 5; // weather audio effect parameters lightning_volume = 100; earthquake_volume = 100; rain_volume = 90; snow_volume = 100; wind_volume = 70; // other blacken_map = 1; explore_mask_method = 2; fog_mask_method = 2; enable_weather_visual(); enable_weather_audio(); cloud_darkness = 0; } //--------- End of function Config::default_preference ---------// //--------- Begin of function Config::change_game_setting --------// // for synchronize the game setting with the host before a multiplayer game void Config::change_game_setting( Config &c ) { //-------- game settings ---------// ai_nation_count = c.ai_nation_count; start_up_cash = c.start_up_cash; // start_up_food = c.start_up_food; ai_start_up_cash = c.ai_start_up_cash; // ai_start_up_food = c.ai_start_up_food; ai_aggressiveness = c.ai_aggressiveness; start_up_independent_town = c.start_up_independent_town; start_up_raw_site = c.start_up_raw_site; difficulty_level = c.difficulty_level; explore_whole_map = c.explore_whole_map; fog_of_war = c.fog_of_war; terrain_set = c.terrain_set; latitude = c.latitude; weather_effect = c.weather_effect; land_mass = c.land_mass; new_independent_town_emerge = c.new_independent_town_emerge; independent_town_resistance = c.independent_town_resistance; random_event_frequency = c.random_event_frequency; monster_type = c.monster_type; new_nation_emerge = c.new_nation_emerge; start_up_has_mine_nearby = c.start_up_has_mine_nearby; random_start_up = c.random_start_up; // --------- goal ---------// goal_destroy_monster = c.goal_destroy_monster; goal_population_flag = c.goal_population_flag; goal_economic_score_flag = c.goal_economic_score_flag; goal_total_score_flag = c.goal_total_score_flag; goal_year_limit_flag = c.goal_year_limit_flag; goal_population = c.goal_population; goal_economic_score = c.goal_economic_score; goal_total_score = c.goal_total_score; goal_year_limit = c.goal_year_limit; // ------- game setting on fire ---------// fire_spread_rate = c.fire_spread_rate; wind_spread_fire_rate = c.wind_spread_fire_rate; fire_fade_rate = c.fire_fade_rate; fire_restore_prob = c.fire_restore_prob; rain_reduce_fire_rate = c.rain_reduce_fire_rate; fire_damage = c.fire_damage; } //--------- End of function Config::change_game_setting --------// //--------- Begin of function Config::change_game_setting --------// // for saving config after changing option void Config::change_preference( Config &c ) { opaque_report = c.opaque_report; disp_news_flag = c.disp_news_flag; scroll_speed = c.scroll_speed; frame_speed = c.frame_speed; help_mode = c.help_mode; disp_town_name = c.disp_town_name; disp_spy_sign = c.disp_spy_sign; show_all_unit_icon = c.show_all_unit_icon; show_unit_path = c.show_unit_path; //------- sound effect --------// music_flag = c.music_flag; cd_music_volume = c.cd_music_volume; wav_music_volume = c.wav_music_volume; sound_effect_flag = c.sound_effect_flag; sound_effect_volume = c.sound_effect_volume; pan_control = c.pan_control; //------- weather visual effect flags -------// lightning_visual = c.lightning_visual; earthquake_visual = c.earthquake_visual; rain_visual = c.rain_visual; snow_visual = c.snow_visual; snow_ground = c.snow_ground; //-------- weather audio effect flags -------// lightning_audio = c.lightning_audio; earthquake_audio = c.earthquake_audio; rain_audio = c.rain_audio; snow_audio = c.snow_audio; wind_audio = c.wind_audio; //--------- weather visual effect parameters --------// lightning_brightness = c.lightning_brightness; cloud_darkness = c.cloud_darkness; //-------- weather audio effect parameters ----------// lightning_volume = c.lightning_volume; earthquake_volume = c.earthquake_volume; rain_volume = c.rain_volume; snow_volume = c.snow_volume; wind_volume = c.wind_volume; //------------ map prefernce -------------// blacken_map = c.blacken_map; explore_mask_method = c.explore_mask_method; fog_mask_method = c.fog_mask_method; } //--------- Begin of function Config::enable_weather_visual --------// void Config::enable_weather_visual() { lightning_visual = 1; earthquake_visual = 1; rain_visual = 1; snow_visual = 1; snow_ground = 0; // 0=disable, 1=i_snow, 2=snow_res cloud_darkness = 1; } //--------- End of function Config::enable_weather_visual --------// //--------- Begin of function Config::disable_weather_visual --------// void Config::disable_weather_visual() { lightning_visual = 0; earthquake_visual = 0; rain_visual = 0; snow_visual = 0; snow_ground = 0; // 0=disable, 1=i_snow, 2=snow_res cloud_darkness = 0; } //--------- End of function Config::disable_weather_visual --------// //--------- Begin of function Config::enable_weather_audio --------// void Config::enable_weather_audio() { lightning_audio = 1; earthquake_audio = 1; rain_audio = 1; snow_audio = 1; // not used wind_audio = 1; } //--------- End of function Config::enable_weather_audio --------// //--------- Begin of function Config::disable_weather_audio --------// void Config::disable_weather_audio() { lightning_audio = 0; earthquake_audio = 0; rain_audio = 0; snow_audio = 0; // not used wind_audio = 0; } //--------- End of function Config::disable_weather_audio --------// //--------- Begin of function Config::save -------------// int Config::save(const char *filename) { FilePath full_path(sys.dir_config); File configFile; full_path += filename; if( full_path.error_flag ) return 0; if( !configFile.file_create(full_path) ) return 0; int retFlag = write_file(&configFile); configFile.file_close(); return retFlag; } //--------- End of function Config::save -------------// //--------- Begin of function Config::load -------------// // // if load() fails, call init to re-initialize it // int Config::load(const char *filename) { FilePath full_path(sys.dir_config); File configFile; full_path += filename; if( full_path.error_flag ) return 0; if( !misc.is_file_exist(full_path) || !configFile.file_open(full_path) ) return 0; int retFlag = 0; // check file size is the same if( configFile.file_size() == 144 ) { retFlag = read_file(&configFile); } configFile.file_close(); return retFlag; } //--------- End of function Config::load -------------// //--------- Begin of function Config::reset_game_setting ---------// void Config::reset_cheat_setting() { show_ai_info = 0; fast_build = 0; disable_ai_flag = 0; king_undie_flag = 0; } //--------- End of function Config::reset_game_setting ---------// //------- Begin of function Config::single_player_difficulty --------// int Config::single_player_difficulty() { int score = 10; score += ai_nation_count * 6; if( !explore_whole_map) score += 7; if( fog_of_war ) score += 7; score += (7 - start_up_raw_site) * 5; // if( start_up_cash <= SMALL_STARTUP_RESOURCE ) // score += 16; // else if( start_up_cash < LARGE_STARTUP_RESOURCE ) // score += 8; // else // score += 0; score += (4 - start_up_cash) * 6; // if( ai_start_up_cash <= SMALL_STARTUP_RESOURCE ) // score += 0; // else if( ai_start_up_cash < LARGE_STARTUP_RESOURCE ) // score += 8; // else // score += 16; score += (ai_start_up_cash - 1 ) * 6; score += (ai_aggressiveness -1) * 10; score += (independent_town_resistance -1) * 5; if( new_nation_emerge ) score += 6; score += random_event_frequency * 2; switch( monster_type ) { case OPTION_MONSTER_NONE: break; case OPTION_MONSTER_DEFENSIVE: score += 6; break; case OPTION_MONSTER_OFFENSIVE: score += 16; break; default: err_here(); } if( !start_up_has_mine_nearby ) score += 6; return score; } //------- End of function Config::single_player_difficulty --------// //------- Begin of function Config::multi_player_difficulty --------// int Config::multi_player_difficulty(int remotePlayers) { short totalOpp = ai_nation_count + remotePlayers; if( totalOpp > MAX_NATION-1 ) totalOpp = MAX_NATION-1; return single_player_difficulty() + (totalOpp - ai_nation_count) * 6; } //------- End of function Config::multi_player_difficulty --------// //------- Begin of function Config::multi_player_difficulty --------// void Config::change_difficulty(int difficulty) { err_when( difficulty < OPTION_VERY_EASY || difficulty > OPTION_VERY_HARD ); difficulty_level = difficulty; ai_nation_count = table_ai_nation_count[difficulty]; start_up_cash = table_start_up_cash[difficulty]; // start_up_food = table_start_up_food[difficulty]; ai_start_up_cash = table_ai_start_up_cash[difficulty]; // ai_start_up_food = table_ai_start_up_food[difficulty]; ai_aggressiveness = table_ai_aggressiveness[difficulty]; start_up_independent_town = table_start_up_independent_town[difficulty]; start_up_raw_site = table_start_up_raw_site[difficulty]; explore_whole_map = table_explore_whole_map[difficulty]; fog_of_war = table_fog_of_war[difficulty]; new_independent_town_emerge = table_new_independent_town_emerge[difficulty]; independent_town_resistance = table_independent_town_resistance[difficulty]; random_event_frequency = table_random_event_frequency[difficulty]; new_nation_emerge = table_new_nation_emerge[difficulty]; monster_type = table_monster_type[difficulty]; start_up_has_mine_nearby = table_start_up_has_mine_nearby[difficulty]; random_start_up = table_random_start_up[difficulty]; } //------- End of function Config::change_difficulty --------//