/* * 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 : OGAME.CPP //Description : Main Game Object #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 #include #include #include #include #include // ##### begin Gilbert 2/10 #######// #include // ##### end Gilbert 2/10 #######// //---------------- DETECT_SPREAD ----------------// // // Spread out 2 tiles on all direction when detecting sprite. // A bigger value is required for bigger sprite. // this should be a number big enough to cover the biggest // sprite in the game. // // It would be equal to the size of the biggest // sprite in the game + 1 (+1 for the difference // between (next_x & cur_x). // //-----------------------------------------------// //-------- Begin of function Game::Game --------// // Game::Game() { init_flag = 0; game_mode = GAME_PREGAME; init_remap_table(); // initialize color remap table } //--------- End of function Game::Game ---------// //-------- Begin of function Game::init --------// // // Note: all functions called in this function cannot call // m.random(). Otherwise, it will cause random seed // sync error. // // [int] loadGameCall - weather this function is called // when a game is being loaded // (default: 0) // int Game::init(int loadGameCall) { if( init_flag ) deinit(); int originalRandomSeed = m.get_random_seed(); music.stop(); // ----- set waiting cursor -------- // int oldCursor = mouse_cursor.get_icon(); mouse_cursor.set_icon(CURSOR_WAITING); //------- init game data class ---------// game_set.open_set(1); // open the default game set char tpictFile[] = DIR_RES"I_TPICT?.RES"; *(strstr( tpictFile, "?")) = '0' + config.terrain_set; image_tpict.init(tpictFile,1,0); // config.terrain_set dependent, must load before town_res.init and terrain_res.init terrain_res.init(); plant_res.init(); tech_res.init(); god_res.init(); sprite_res.init(); // sprite resource object must been initialized after game_set as it relies on game_set for info. sprite_frame_res.init(); unit_res.init(); monster_res.init(); raw_res.init(); race_res.init(); firm_res.init(); // ##### begin Gilbert 2/10 #######// firm_die_res.init(); // ##### end Gilbert 2/10 #######// town_res.init(); hill_res.init(); snow_res.init(); rock_res.init(); explored_mask.init(vga.vga_color_table); se_res.init1(); se_res.init2(&se_ctrl); talk_res.init(); //------- init game data class ---------// nation_array.init(); firm_array.init(); // ##### begin Gilbert 2/10 #######// firm_die_array.init(); // ##### end Gilbert 2/10 #######// town_array.init(); unit_array.init(); bullet_array.init(); rebel_array.init(); spy_array.init(); site_array.init(); rock_array.init(); dirt_array.init(); effect_array.init(); tornado_array.init(); war_point_array.init(); //------ init game surface class ----------// power.init(); world.init(); battle.init(); news_array.init(); if( !loadGameCall ) info.init(); // it reads in the panel texture and copy it to vga_back's buffer //---------------------------------------------// int quakeFreq; if( config.random_event_frequency ) { quakeFreq = 2000 - config.random_event_frequency * 400 + info.random_seed%300; } else { quakeFreq = 0x0fffffff; } weather.init_date(info.game_year, info.game_month, info.game_day, config.latitude, quakeFreq); //---------------------------------------------// weather_forecast[0] = weather; weather_forecast[0].next_day(); for(int foreDay=1; foreDay < MAX_WEATHER_FORECAST; ++foreDay) { weather_forecast[foreDay] = weather_forecast[foreDay-1]; weather_forecast[foreDay].next_day(); } snow_ground_array.init(weather.snow_scale(), info.game_year); //------------ run demo ------------// err_when( originalRandomSeed != m.get_random_seed() ); // ----- restore from waiting cursor -------- // mouse_cursor.restore_icon(oldCursor); game_has_ended = 0; init_flag=1; return TRUE; } //--------- End of function Game::init ---------// //-------- Begin of function Game::deinit --------// // // [int] loadGameCall - weather this function is called // when a game is being loaded // (default: 0) // void Game::deinit(int loadGameCall) { if( !init_flag ) return; power.disable(); // disable power, which handle mouse inputs music.stop(); audio.stop_wav(); //----- set waiting cursor -------- // int oldCursor = mouse_cursor.get_icon(); mouse_cursor.set_icon(CURSOR_WAITING); //------- deinit game data class ---------// nation_array.deinit(); firm_array.deinit(); // ##### begin Gilbert 2/10 #######// firm_die_array.deinit(); // ##### end Gilbert 2/10 #######// town_array.deinit(); unit_array.deinit(); bullet_array.deinit(); rebel_array.deinit(); spy_array.deinit(); region_array.deinit(); site_array.deinit(); rock_array.deinit(); dirt_array.deinit(); effect_array.deinit(); tornado_array.deinit(); war_point_array.deinit(); //------ deinit game surface class -------// world.deinit(); battle.deinit(); news_array.deinit(); if( !loadGameCall ) info.deinit(); //------- deinit game data class ---------// image_tpict.deinit(); terrain_res.deinit(); plant_res.deinit(); tech_res.deinit(); god_res.deinit(); monster_res.deinit(); sprite_res.deinit(); sprite_frame_res.deinit(); unit_res.deinit(); raw_res.deinit(); race_res.deinit(); firm_res.deinit(); // ##### begin Gilbert 2/10 #######// firm_die_res.deinit(); // ##### end Gilbert 2/10 #######// town_res.deinit(); hill_res.deinit(); snow_res.deinit(); rock_res.deinit(); explored_mask.deinit(); se_res.deinit(); talk_res.deinit(); game_set.close_set(); // close the game set //----- restore from waiting cursor -------- // mouse_cursor.restore_icon(oldCursor); init_flag=0; } //--------- End of function Game::deinit ---------// //--------- Begin of function Game::init_remap_table --------// void Game::init_remap_table() { //------------- Define constant ------------// #define FIRST_REMAP_KEY 0xE0 // the source color code of the colors to be remapped #define REMAP_KEY_COUNT 8 //-------- define color remap scheme -------// static ColorRemapMethod remap_method_array[] = { { 0xBC, 0xDC }, // the first remap table is for independent units { 0xA0, 0xC0 }, // following are eight remap table for each color code { 0xA4, 0xC4 }, { 0xA8, 0xC8 }, { 0xAC, 0xCC }, { 0xB0, 0xD0 }, { 0xB4, 0xD4 }, { 0xB8, 0xD8 }, { 0xBC, 0xDC }, }; //---- define the main color code for each color scheme ----// static int main_color_array[] = { 0xDC, 0xC0, 0xC4, 0xC8, 0xCC, 0xD0, 0xD4, 0xD8, }; //-------- initialize color remap table -------// int i, j; ColorRemap *colorRemap = color_remap_array; for( i=0 ; imain_color = main_color_array[i]; for( j=0 ; j<256 ; j++ ) colorRemap->color_table[j] = j; for( j=0 ; j<4 ; j++ ) colorRemap->color_table[FIRST_REMAP_KEY+j] = (char) (remap_method_array[i].primary_color+j); for( j=0 ; j<4 ; j++ ) colorRemap->color_table[FIRST_REMAP_KEY+4+j] = (char) (remap_method_array[i].secondary_color+j); // for( j=0 ; j<4 ; j++ ) // colorRemap->color_table[FIRST_REMAP_KEY+j] = (char) (remap_method_array[i].secondary_color+j); } } //---------- End of function Game::init_remap_table --------// //--------- Begin of function Game::get_color_remap_table --------// // // nationRecno - 0 for independent nation // selectedFlag - whether display outline around the bitmap // char* Game::get_color_remap_table(int nationRecno, int selectedFlag) { ColorRemap* colorRemap; char* colorRemapTable; // ###### begin Gilbert 1/10 ######// if( nationRecno==0 || nation_array.is_deleted(nationRecno) ) // independent units // ###### end Gilbert 1/10 ######// colorRemap = color_remap_array; else colorRemap = color_remap_array+nation_array[nationRecno]->color_scheme_id; colorRemapTable = colorRemap->color_table; //--------- set outline color ---------// #define FIRST_CYCLE_COLOR 0xEF #define CYCLE_COLOR_COUNT 1 #define CYCLE_FRAME_INTERVAL 3 if( selectedFlag ) { int cycleId=0; /* if( CYCLE_COLOR_COUNT==1 ) { cycleId = 0; } else { cycleId = sys.frame_count / CYCLE_FRAME_INTERVAL % (CYCLE_COLOR_COUNT*2-2); if( cycleId >= CYCLE_COLOR_COUNT ) // cycle in reserved order cycleId = CYCLE_COLOR_COUNT*2-2 - cycleId; } */ colorRemapTable[OUTLINE_CODE] = FIRST_CYCLE_COLOR + cycleId; colorRemapTable[OUTLINE_SHADOW_CODE] = FIRST_CYCLE_COLOR + cycleId; } else { colorRemapTable[OUTLINE_CODE] = (char) TRANSPARENT_CODE; colorRemapTable[OUTLINE_SHADOW_CODE] = (char) SHADOW_CODE; } return colorRemapTable; } //--------- End of function Game::get_color_remap_table --------//