/*
* 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 : AM.CPP
//Description : Ambition Entry Program
#include
#include
#ifdef ENABLE_INTRO_VIDEO
#include
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifdef ENABLE_INTRO_VIDEO
#include
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//### begin alex 3/10 ###//
#include
//#### end alex 3/10 ####//
#include
#include
// ###### begin Gilbert 23/10 #######//
#include
#include
// ###### end Gilbert 23/10 #######//
//------- define game version constant --------//
#ifdef AMPLUS
char *GAME_VERSION_STR = "2.13.2";
const int GAME_VERSION = 212; // Version 2.00, don't change it unless the format of save game files has been changed
#else
char *GAME_VERSION_STR = "1.11";
const int GAME_VERSION = 111; // Version 1.00, don't change it unless the format of save game files has been changed
#endif
//-------- System class ----------//
#ifndef NO_MEM_CLASS
Mem mem; // constructor only init var and allocate memory
#endif
Error err; // constructor only call set_new_handler()d
Mouse mouse;
MouseCursor mouse_cursor;
Misc m, m2;
DateInfo date;
Vga vga;
VgaBuf vga_front, vga_back, vga_true_front;
#ifdef ENABLE_INTRO_VIDEO
Video video;
#endif
Audio audio;
Music music;
MultiPlayerType mp_obj;
// MultiPlayerDP mp_dp;
// MultiPlayerIM mp_im;
Sys sys;
Translate translate; // constructor only memset()
SeekPath seek_path;
SeekPathS2 seek_path_s2;
SeekPathReuse seek_path_reuse;
Flame flame[FLAME_GROW_STEP];
Remote remote;
ErrorControl ec_remote;
AnimLine anim_line;
SECtrl se_ctrl(&audio);
SERes se_res;
Log msg_log;
#ifdef DEBUG
LongLog * long_log;
#endif
//### begin alex 3/10 ###//
GroupSelect group_select;
//#### end alex 3/10 ####//
//------- Resource class ----------//
Font font_san, font_std, font_small, font_mid, font_news;
Font font_hitpoint, font_bible, font_bard;
#if( defined(GERMAN) || defined(FRENCH) || defined(SPANISH) )
Font font_hall;
#endif
Box box;
ImageRes image_icon, image_interface, image_menu,
image_button, image_spict;
ImageRes image_encyc;
ImageRes image_tpict;
ImageRes image_tutorial;
#ifdef AMPLUS
ImageRes image_menu_plus;
ImageRes& image_menu2 = image_menu_plus;
#else
ImageRes& image_menu2 = image_menu;
#endif
SpriteRes sprite_res;
SpriteFrameRes sprite_frame_res;
UnitRes unit_res;
TerrainRes terrain_res;
PlantRes plant_res;
WallRes wall_res;
RawRes raw_res;
FirmRes firm_res;
FirmDieRes firm_die_res;
RaceRes race_res;
TownRes town_res;
HillRes hill_res;
TalkRes talk_res;
TechRes tech_res;
GodRes god_res;
MonsterRes monster_res;
SnowRes snow_res;
RockRes rock_res;
ExploredMask explored_mask;
Help help;
Tutor tutor;
//-------- Game Data class -----------//
UnitArray unit_array(100); // 100-initial array size
BulletArray bullet_array(100);
SiteArray site_array;
TownArray town_array;
NationArray nation_array;
FirmArray firm_array;
FirmDieArray firm_die_array;
TornadoArray tornado_array(10);
RebelArray rebel_array;
SpyArray spy_array;
SnowGroundArray snow_ground_array;
RockArray rock_array;
RockArray dirt_array;
SpriteArray effect_array(50);
RegionArray region_array;
NewsArray news_array;
WarPointArray war_point_array;
CrcStore crc_store;
//--------- Game Surface class ------------//
Info info;
Weather weather, weather_forecast[MAX_WEATHER_FORECAST];
MagicWeather magic_weather;
Config config;
Game game;
GameSet game_set; // no constructor
Battle battle;
Power power;
World world;
GameFileArray game_file_array;
GameFile game_file;
// ###### begin Gilbert 23/10 #######//
OptionMenu option_menu;
InGameMenu in_game_menu;
// ###### end Gilbert 23/10 #######//
//----------- Global Variables -----------//
char game_design_mode=0;
char game_demo_mode=0;
char debug2_enable_flag=0;
File seedCompareFile;
char debug_seed_status_flag=0;
int debug_sim_game_type = 0;
int unit_search_node_used=0;
short nation_hand_over_flag=0;
int unit_search_tries = 0; // the number of tries used in the current searching
char unit_search_tries_flag = 0; // indicate num of tries is set, reset after searching
char new_config_dat_flag=0;
#ifdef DEBUG
int check_unit_dir1, check_unit_dir2;
unsigned long last_unit_ai_profile_time = 0L;
unsigned long unit_ai_profile_time = 0L;
unsigned long last_unit_profile_time = 0L;
unsigned long unit_profile_time = 0L;
unsigned long seek_path_profile_time = 0L;
unsigned long last_seek_path_profile_time = 0L;
unsigned long last_sprite_array_profile_time = 0L;
unsigned long sprite_array_profile_time = 0L;
unsigned long last_sprite_idle_profile_time = 0L;
unsigned long sprite_idle_profile_time = 0L;
unsigned long last_sprite_move_profile_time = 0L;
unsigned long sprite_move_profile_time = 0L;
unsigned long last_sprite_wait_profile_time = 0L;
unsigned long sprite_wait_profile_time = 0L;
unsigned long last_sprite_attack_profile_time = 0L;
unsigned long sprite_attack_profile_time = 0L;
unsigned long last_unit_attack_profile_time = 0L;
unsigned long unit_attack_profile_time = 0L;
unsigned long last_unit_assign_profile_time = 0L;
unsigned long unit_assign_profile_time = 0L;
#endif
//------- Define static functions --------//
static void extra_error_handler();
//---------- Begin of function WinMain ----------//
//¹ç
// WinMain - initialization, message loop
//
// Compilation constants:
//
// DEBUG - normal debugging
// DEBUG2 - shortest path searching and unit action debugging
// DEBUG3 - debugging some functions (e.g. Location::get_loc()) which
// will cause major slowdown.
//
int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
//try to read from CONFIG.DAT, moved to AM.CPP
if( !config.load("CONFIG.DAT") )
{
new_config_dat_flag = 1;
config.init();
}
//--------------------------------------//
#ifdef IMAGICMP
static char lobbyLaunchCmdLine[] = "IM";
#else
static char lobbyLaunchCmdLine[] = "-!lobby!";
#endif
#ifdef ENABLE_INTRO_VIDEO
//----------- play movie ---------------//
sys.set_game_dir();
if( strstr(lpCmdLine, lobbyLaunchCmdLine) == NULL ) // skip if launch from lobby
{
String movieFileStr;
movieFileStr = DIR_MOVIE;
movieFileStr += "INTRO.AVI";
video.set_skip_on_fail();
// ###### begin Gilbert 29/10 #####//
if( !m.is_file_exist("SKIPAVI.SYS") && m.is_file_exist(movieFileStr) )
// ###### end Gilbert 29/10 #####//
{
//---------- play the movie now ---------//
video.init();
if( video.init_success )
{
video.play_until_end( movieFileStr, hInstance, 60 );
}
else
{
// display a message box (note:sys.main_hwnd is not valid)
// MessageBox( NULL, "Cannot initialize ActiveMovie",
// "Seven Kingdoms", MB_OK | MB_ICONWARNING | MB_DEFBUTTON1 | MB_TASKMODAL );
}
video.deinit();
}
}
#endif // ENABLE_INTRO_VIDEO
if( !sys.init(hInstance) )
return FALSE;
err.set_extra_handler( extra_error_handler ); // set extra error handler, save the game when a error happens
#ifdef DEMO
game.demo_disp_logo();
game.main_menu();
#else
if( strstr(lpCmdLine, lobbyLaunchCmdLine) == NULL )
game.main_menu();
#ifndef DISABLE_MULTI_PLAYER
else
game.multi_player_menu(lpCmdLine); // if detect launched from lobby
#endif // DISABLE_MULTI_PLAYER
#endif
sys.deinit();
return 1;
}
//---------- End of function WinMain ----------//
//----------- Begin of function Msg ----------//
//
// Routine for displaying debug messages
//
#ifdef DEBUG
void __cdecl debug_msg( char* fmt, ... )
{
char buff[256];
lstrcpy( buff, "SEVEN KINGDOMS: " );
wvsprintf( buff+lstrlen(buff), fmt, (char*)(&fmt+1) );
lstrcat( buff, "\r\n" );
OutputDebugString( buff );
}
#endif
//----------- End of function Msg ----------//
//------- Begin of function extra_error_handler -----------//
static void extra_error_handler()
{
if( game.game_mode != GAME_SINGLE_PLAYER )
return;
game_file_array.save_new_game("ERROR.SAV"); // save a new game immediately without prompting menu
box.msg( "Error encountered. The game has been saved to ERROR.SAV" );
}
//----------- End of function extra_error_handler -------------//