/* * 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 : OGAMSING.CPP //Description : Single player game interface #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //---------- Define option modes --------// enum { OPTION_BASIC, OPTION_ADVANCED, OPTION_ADVANCE2, OPTION_GOAL, }; static char option_mode; //--------- Define constant ----------// enum { BASIC_OPTION_X_SPACE = 78, BASIC_OPTION_HEIGHT = 32 }; enum { COLOR_OPTION_X_SPACE = 35, COLOR_OPTION_HEIGHT = 32 }; enum { ADVANCED_OPTION_X_SPACE = 89, ADVANCED_OPTION_Y_SPACE = 34, ADVANCED_OPTION_HEIGHT = 32 }; static char race_table[MAX_RACE] = // race translation table #if(MAX_RACE == 10) { RACE_CHINESE, RACE_EGYPTIAN, RACE_GREEK, RACE_JAPANESE, RACE_MAYA, RACE_INDIAN, RACE_NORMAN, RACE_PERSIAN, RACE_VIKING, RACE_ZULU }; #else { RACE_CHINESE, RACE_GREEK, RACE_JAPANESE, RACE_MAYA, RACE_PERSIAN, RACE_NORMAN, RACE_VIKING }; #endif static char reverse_race_table[MAX_RACE] = // race translation table #if(MAX_RACE == 10) { 6, 4, 2, 8, 7, 0, 3, 1, 5, 9 }; #else { 5, 3, 1, 6, 4, 0, 2 }; #endif //------- Declare static functions -------// static int select_option(); //-------- Begin of function Game::single_player_game --------// // // noAI - if there should be no AI in the game. // void Game::single_player_game(int noAI) { if( !select_option() ) return; // ------ attempt to save the config -------// config.save("CONFIG.DAT"); //------ start single player game ----------// init(); battle.run(0); // 0-not multiplayer game deinit(); } //--------- End of function Game::single_player_game ---------// // define bit flag for refreshFlag static void disp_virtual_button(ButtonCustom *, int); static void disp_virtual_tick(ButtonCustom *, int); #define SGOPTION_PAGE 0x40000000 #define SGOPTION_RACE 0x00000001 #define SGOPTION_COLOR 0x00000002 #define SGOPTION_AI_NATION 0x00000004 #define SGOPTION_DIFFICULTY 0x00000008 #define SGOPTION_TERRAIN 0x00000010 #define SGOPTION_LAND_MASS 0x00000020 #define SGOPTION_NAME_FIELD 0x00000040 #define SGOPTION_MAP_ID 0x00000080 #define SGOPTION_EXPLORED 0x00000100 #define SGOPTION_FOG 0x00000200 #define SGOPTION_TREASURE 0x00000400 #define SGOPTION_AI_TREASURE 0x00000800 #define SGOPTION_AI_AGGRESSIVE 0x00001000 #define SGOPTION_FRYHTANS 0x00002000 #define SGOPTION_RANDOM_STARTUP 0x00004000 #define SGOPTION_RAW 0x00010000 #define SGOPTION_NEAR_RAW 0x00020000 #define SGOPTION_START_TOWN 0x00040000 #define SGOPTION_TOWN_STRENGTH 0x00080000 #define SGOPTION_TOWN_EMERGE 0x00100000 #define SGOPTION_KINGDOM_EMERGE 0x00200000 #define SGOPTION_RANDOM_EVENT 0x00400000 #define SGOPTION_CLEAR_ENEMY 0x01000000 #define SGOPTION_CLEAR_MONSTER 0x02000000 #define SGOPTION_ENOUGH_PEOPLE 0x04000000 #define SGOPTION_ENOUGH_INCOME 0x08000000 #define SGOPTION_ENOUGH_SCORE 0x10000000 #define SGOPTION_TIME_LIMIT 0x20000000 #define SGOPTION_ALL 0x7fffffff static int select_option() { const int offsetY = 124; char optionMode = OPTION_BASIC; char menuTitleBitmap[] = "TOP-NSPG"; Config tempConfig = config; // last multi-player game may set ai_nation_count to zero if( tempConfig.ai_nation_count < 1 ) tempConfig.ai_nation_count = MAX_NATION-1; // some setting may be modified in the last game if( tempConfig.difficulty_level != OPTION_CUSTOM ) tempConfig.change_difficulty(tempConfig.difficulty_level); int i; long refreshFlag = SGOPTION_ALL; int retFlag = 0; // --------- initialize race button group ---------- // ButtonCustomGroup raceGroup(MAX_RACE); for( i = 0; i < MAX_RACE; ++i ) { #if(MAX_RACE == 10) raceGroup[i].create(222+(i%5)*BASIC_OPTION_X_SPACE, offsetY+81+(i/5)*BASIC_OPTION_HEIGHT, 222+(i%5+1)*BASIC_OPTION_X_SPACE-1, offsetY+81+(i/5+1)*BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&raceGroup, race_table[i]), 0, 0); #define Y_SHIFT_FLAG 1 #else raceGroup[i].create(118+i*BASIC_OPTION_X_SPACE, offsetY+103, 118+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+103+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&raceGroup, race_table[i]), 0, 0); #define Y_SHIFT_FLAG 0 #endif } // --------- initialize color button group ---------- // ButtonCustomGroup colorGroup(MAX_COLOR_SCHEME); for( i = 0; i < MAX_COLOR_SCHEME; ++i ) { #if(Y_SHIFT_FLAG) #define Y_SHIFT 14 #else #define Y_SHIFT 0 #endif colorGroup[i].create(195+i*COLOR_OPTION_X_SPACE, offsetY+149+Y_SHIFT, 195+(i+1)*COLOR_OPTION_X_SPACE-1, offsetY+149+Y_SHIFT+COLOR_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&colorGroup, i+1), 0, 0); #undef Y_SHIFT } // ---------- initialize ai_nation_count buttons --------// ButtonCustom aiNationInc, aiNationDec; { #if(Y_SHIFT_FLAG) #define Y_SHIFT 14 #else #define Y_SHIFT 0 #endif aiNationInc.create(595, offsetY+149+Y_SHIFT, 595+COLOR_OPTION_X_SPACE-1, offsetY+149+Y_SHIFT+COLOR_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(NULL, +1) ); aiNationDec.create(630, offsetY+149+Y_SHIFT, 630+COLOR_OPTION_X_SPACE-1, offsetY+149+Y_SHIFT+COLOR_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(NULL, -1) ); #undef Y_SHIFT } // ---------- initialize difficulty_level button group -------// ButtonCustomGroup diffGroup(6); for( i = 0; i < 6; ++i ) { #if(Y_SHIFT_FLAG) #define Y_SHIFT 17 #else #define Y_SHIFT 0 #endif diffGroup[i].create( 205+i*BASIC_OPTION_X_SPACE, offsetY+194+Y_SHIFT, 205+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+194+Y_SHIFT+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&diffGroup, i), 0, 0); #undef Y_SHIFT } // --------- initialize terrain_set button group -------// ButtonCustomGroup terrainGroup(3); for( i = 0; i < 3; ++i ) { #if(Y_SHIFT_FLAG) #define Y_SHIFT 17 #else #define Y_SHIFT 0 #endif #ifdef AMPLUS terrainGroup[i].create(168+i*BASIC_OPTION_X_SPACE, offsetY+258+Y_SHIFT, 168+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+258+Y_SHIFT+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&terrainGroup, i+1), 0, 0); #else // BUGHERE : terrain_set 2 is disable, exchange the position of button 1 and 2 int k = i; switch(i) { case 1: k = 2; break; case 2: k = 1; break; } terrainGroup[i].create(205+k*BASIC_OPTION_X_SPACE, offsetY+258+Y_SHIFT, 205+(k+1)*BASIC_OPTION_X_SPACE-1, offsetY+258+Y_SHIFT+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&terrainGroup, i+1), 0, 0); if( i == 1 ) terrainGroup[i].enable_flag = 0; #endif #undef Y_SHIFT } // --------- initialize land_mass button group -------// ButtonCustomGroup landGroup(3); for( i = 0; i < 3; ++i ) { #if(Y_SHIFT_FLAG) #define Y_SHIFT 17 #else #define Y_SHIFT 0 #endif landGroup[i].create(439+i*BASIC_OPTION_X_SPACE, offsetY+258+Y_SHIFT, 439+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+258+Y_SHIFT+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&landGroup, i+1), 0, 0); #undef Y_SHIFT } GetA playerNameField; // ####### begin Gilbert 3/11 #######// // playerNameField.init( 318, offsetY+327, 690, tempConfig.player_name, // tempConfig.PLAYER_NAME_LEN, &font_san, 0, 1); playerNameField.init( 318, offsetY+322, 690, tempConfig.player_name, tempConfig.PLAYER_NAME_LEN, &font_bard, 0, 1); // ####### end Gilbert 3/11 #######// // --------- initialize info.random_seed field ----------// const int mapIdSize = 11; // enough to hold a dword in decimal char mapIdStr[mapIdSize+1]; info.init_random_seed(0); ltoa( info.random_seed , mapIdStr, 10); GetA mapIdField; #if(defined(SPANISH)) #define MAPID_X1 586 #elif(defined(FRENCH)) #define MAPID_X1 572 #else #define MAPID_X1 564 #endif mapIdField.init( MAPID_X1, offsetY+112, 700, mapIdStr, mapIdSize, &font_san, 0, 1); #undef MAPID_X1 // --------- initialize explore_whole_map button group -------// ButtonCustomGroup exploreGroup(2); for( i = 0; i < 2; ++i ) { exploreGroup[i].create(335+i*BASIC_OPTION_X_SPACE, offsetY+103, 335+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+103+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&exploreGroup, 1-i), 0, 0); } // --------- initialize fog_of_war button group -------// ButtonCustomGroup fogGroup(2); for( i = 0; i < 2; ++i ) { fogGroup[i].create(335+i*BASIC_OPTION_X_SPACE, offsetY+135, 335+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+135+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&fogGroup, 1-i), 0, 0); } // --------- initialize start_up_cash/start_up_food button group -------// ButtonCustomGroup treasureGroup(4); for( i = 0; i < 4; ++i ) { treasureGroup[i].create(335+i*BASIC_OPTION_X_SPACE, offsetY+167, 335+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+167+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&treasureGroup, i+1), 0, 0); } // --------- initialize ai_start_up_cash/food button group -------// ButtonCustomGroup aiTreasureGroup(4); for( i = 0; i < 4; ++i ) { aiTreasureGroup[i].create(335+i*BASIC_OPTION_X_SPACE, offsetY+199, 335+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+199+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&aiTreasureGroup, i+1), 0, 0); } // --------- initialize ai_aggressiveness -------// ButtonCustomGroup aiAggressiveGroup(4); for( i = 0; i < 4; ++i ) { aiAggressiveGroup[i].create(335+i*BASIC_OPTION_X_SPACE, offsetY+231, 335+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+231+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&aiAggressiveGroup, i+1), 0, 0); } // --------- initialize monster_type -------// ButtonCustomGroup monsterGroup(3); for( i = 0; i < 3; ++i ) { monsterGroup[i].create(335+i*BASIC_OPTION_X_SPACE, offsetY+263, 335+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+263+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&monsterGroup, i), 0, 0); } // --------- initialize random startup button group -------// ButtonCustomGroup randomStartUpGroup(2); for( i = 0; i < 2; ++i ) { randomStartUpGroup[i].create(335+i*BASIC_OPTION_X_SPACE, offsetY+295, 335+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+295+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&randomStartUpGroup, 1-i), 0, 0); } // -------- initialize start_up_raw_site buttons --------- // ButtonCustom rawSiteInc, rawSiteDec; rawSiteInc.create( 368, offsetY+100, 368+COLOR_OPTION_X_SPACE-1, offsetY+100+COLOR_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(NULL,0)); rawSiteDec.create( 403, offsetY+100, 403+COLOR_OPTION_X_SPACE-1, offsetY+100+COLOR_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(NULL,0)); // --------- initialize start_up_has_mine_nearby button group --------// ButtonCustomGroup nearRawGroup(2); for( i = 0; i < 2; ++i ) { nearRawGroup[i].create(332+i*BASIC_OPTION_X_SPACE, offsetY+132, 332+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+132+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&nearRawGroup, 1-i), 0, 0); } // --------- initialize start_up_independent_town button group --------// static short startTownArray[3] = { 7, 15, 30 }; ButtonCustomGroup townStartGroup(3); for( i = 0; i < 3; ++i ) { townStartGroup[i].create(332+i*BASIC_OPTION_X_SPACE, offsetY+164, 332+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+164+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&townStartGroup, startTownArray[i]), 0, 0); } // --------- initialize independent_town_resistance button group --------// ButtonCustomGroup townResistGroup(3); for( i = 0; i < 3; ++i ) { townResistGroup[i].create(332+i*BASIC_OPTION_X_SPACE, offsetY+196, 332+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+196+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&townResistGroup, i+1), 0, 0); } // --------- initialize new_independent_town_emerge button group --------// ButtonCustomGroup townEmergeGroup(2); for( i = 0; i < 2; ++i ) { townEmergeGroup[i].create(332+i*BASIC_OPTION_X_SPACE, offsetY+228, 332+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+228+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&townEmergeGroup, 1-i), 0, 0); } // --------- initialize new_nation_emerge button group --------// ButtonCustomGroup nationEmergeGroup(2); for( i = 0; i < 2; ++i ) { nationEmergeGroup[i].create(332+i*BASIC_OPTION_X_SPACE, offsetY+260, 332+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+260+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&nationEmergeGroup, 1-i), 0, 0); } // --------- initialize random_event_frequency button group --------// ButtonCustomGroup randomEventGroup(4); for( i = 0; i < 4; ++i ) { randomEventGroup[i].create(332+i*BASIC_OPTION_X_SPACE, offsetY+292, 332+(i+1)*BASIC_OPTION_X_SPACE-1, offsetY+292+BASIC_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(&randomEventGroup, i), 0, 0); } // ---------- initialize goal buttons ----------// ButtonCustom clearEnemyButton, clearMonsterButton, enoughPeopleButton, enoughIncomeButton, enoughScoreButton, timeLimitButton; ButtonCustom peopleInc, peopleDec, incomeInc, incomeDec, scoreInc, scoreDec, yearInc, yearDec; clearEnemyButton.create( 214, offsetY+145, 214+19, offsetY+145+19, disp_virtual_tick, ButtonCustomPara(NULL, 0), 0, 1); clearEnemyButton.enable_flag = 0;; clearMonsterButton.create( 214, offsetY+178, 214+19, offsetY+178+19, disp_virtual_tick, ButtonCustomPara(NULL, 0), 0, tempConfig.goal_destroy_monster); enoughPeopleButton.create( 214, offsetY+211, 214+19, offsetY+211+19, disp_virtual_tick, ButtonCustomPara(NULL, 0), 0, tempConfig.goal_population_flag); enoughIncomeButton.create( 214, offsetY+244, 214+19, offsetY+244+19, // -9 disp_virtual_tick, ButtonCustomPara(NULL, 0), 0, tempConfig.goal_economic_score_flag); enoughScoreButton.create( 214, offsetY+277, 214+19, offsetY+277+19, disp_virtual_tick, ButtonCustomPara(NULL, 0), 0, tempConfig.goal_total_score_flag); timeLimitButton.create( 214, offsetY+309, 214+19, offsetY+309+19, // +23 disp_virtual_tick, ButtonCustomPara(NULL, 0), 0, tempConfig.goal_year_limit_flag); peopleInc.create( 529, offsetY+206, 529+COLOR_OPTION_X_SPACE-1, offsetY+206+COLOR_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(NULL, 0) ); peopleDec.create( 564, offsetY+206, 564+COLOR_OPTION_X_SPACE-1, offsetY+206+COLOR_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(NULL, 0) ); incomeInc.create( 529, offsetY+238, 529+COLOR_OPTION_X_SPACE-1, offsetY+238+COLOR_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(NULL, 0) ); incomeDec.create( 564, offsetY+238, 564+COLOR_OPTION_X_SPACE-1, offsetY+238+COLOR_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(NULL, 0) ); scoreInc.create( 529, offsetY+270, 529+COLOR_OPTION_X_SPACE-1, offsetY+270+COLOR_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(NULL, 0) ); scoreDec.create( 564, offsetY+270, 564+COLOR_OPTION_X_SPACE-1, offsetY+270+COLOR_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(NULL, 0) ); yearInc.create( 529, offsetY+302, 529+COLOR_OPTION_X_SPACE-1, offsetY+302+COLOR_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(NULL, 0) ); yearDec.create( 564, offsetY+302, 564+COLOR_OPTION_X_SPACE-1, offsetY+302+COLOR_OPTION_HEIGHT-1, disp_virtual_button, ButtonCustomPara(NULL, 0) ); Button3D startButton, returnButton; // startButton.create(250, 553, "BB-START", "BB-START", 1, 0); // returnButton.create(440, 553, "BB-RETURN", "BB-RETURN", 1, 0); startButton.create(194, 538, "START-U", "START-D", 1, 0); returnButton.create(440, 538, "CANCEL-U", "CANCEL-D", 1, 0); vga_front.unlock_buf(); while(1) { MSG msg; if (PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE)) { if (!GetMessage( &msg, NULL, 0, 0)) { sys.signal_exit_flag = 1; // BUGHERE : vga_front is unlocked return 0; } TranslateMessage(&msg); DispatchMessage(&msg); continue; } else if( sys.paused_flag || !sys.active_flag ) { WaitMessage(); continue; } if( sys.need_redraw_flag ) { refreshFlag = SGOPTION_ALL; sys.need_redraw_flag = 0; } vga_front.lock_buf(); sys.yield(); mouse.get_event(); // -------- display ----------// if( refreshFlag ) { // ------- display basic option ---------// if( optionMode == OPTION_BASIC ) { if( refreshFlag & SGOPTION_PAGE ) { image_menu.put_to_buf( &vga_back, "SPG-BSC"); #if(MAX_RACE == 10) // protection : image_menu.put_to_buf( &vga_back, "SPG-BSC"); // ensure the user has the release version (I_MENU.RES) // image_menu2.put_to_buf( &vga_back, "SPG-BSC") get the real one image_menu2.put_to_buf( &vga_back, "SPG-BSC"); #endif image_menu.put_back( 234, 15, menuTitleBitmap); vga.blt_buf(0,0,VGA_WIDTH-1,VGA_HEIGHT-1,0); } if( refreshFlag & SGOPTION_RACE ) raceGroup.paint( reverse_race_table[tempConfig.race_id-1] ); if( refreshFlag & SGOPTION_COLOR ) colorGroup.paint( tempConfig.player_nation_color-1 ); if( refreshFlag & SGOPTION_AI_NATION ) { #if(Y_SHIFT_FLAG) #define Y_SHIFT 14 #else #define Y_SHIFT 0 #endif font_san.center_put(564, offsetY+154+Y_SHIFT, 564+25, offsetY+154+Y_SHIFT+21, m.format(tempConfig.ai_nation_count), 1); aiNationInc.paint(); aiNationDec.paint(); #undef Y_SHIFT } if( refreshFlag & SGOPTION_DIFFICULTY ) diffGroup.paint(tempConfig.difficulty_level); if( refreshFlag & SGOPTION_TERRAIN ) terrainGroup.paint(tempConfig.terrain_set-1); if( refreshFlag & SGOPTION_LAND_MASS ) landGroup.paint(tempConfig.land_mass-1); if( refreshFlag & SGOPTION_NAME_FIELD ) playerNameField.paint(); } // ------- display advanced option ---------// if( optionMode == OPTION_ADVANCED ) { if( refreshFlag & SGOPTION_PAGE ) { image_menu.put_to_buf( &vga_back, "SPG-O1"); image_menu.put_back( 234, 15, menuTitleBitmap); vga.blt_buf(0,0,VGA_WIDTH-1,VGA_HEIGHT-1,0); } if( refreshFlag & SGOPTION_MAP_ID ) mapIdField.paint(); if( refreshFlag & SGOPTION_EXPLORED ) exploreGroup.paint(1-tempConfig.explore_whole_map); if( refreshFlag & SGOPTION_FOG ) fogGroup.paint(1-tempConfig.fog_of_war); if( refreshFlag & SGOPTION_TREASURE ) treasureGroup.paint( tempConfig.start_up_cash-1 ); if( refreshFlag & SGOPTION_AI_TREASURE ) aiTreasureGroup.paint( tempConfig.ai_start_up_cash-1 ); if( refreshFlag & SGOPTION_AI_AGGRESSIVE ) aiAggressiveGroup.paint(tempConfig.ai_aggressiveness-1); if( refreshFlag & SGOPTION_FRYHTANS ) monsterGroup.paint(tempConfig.monster_type); if( refreshFlag & SGOPTION_RANDOM_STARTUP ) randomStartUpGroup.paint(1-tempConfig.random_start_up); } // ------- display advanced option ---------// if( optionMode == OPTION_ADVANCE2 ) { if( refreshFlag & SGOPTION_PAGE ) { image_menu.put_to_buf( &vga_back, "SPG-O2"); image_menu.put_back( 234, 15, menuTitleBitmap); vga.blt_buf(0,0,VGA_WIDTH-1,VGA_HEIGHT-1,0); } if( refreshFlag & SGOPTION_RAW ) { font_san.center_put(337, offsetY+105, 337+25, offsetY+105+21, m.format(tempConfig.start_up_raw_site), 1); rawSiteInc.paint(); rawSiteDec.paint(); } if( refreshFlag & SGOPTION_NEAR_RAW ) nearRawGroup.paint(1-tempConfig.start_up_has_mine_nearby); if( refreshFlag & SGOPTION_START_TOWN ) townStartGroup.paint( tempConfig.start_up_independent_town >= 30 ? 2 : tempConfig.start_up_independent_town <= 7 ? 0 : 1 ); if( refreshFlag & SGOPTION_TOWN_STRENGTH ) townResistGroup.paint(tempConfig.independent_town_resistance-1); if( refreshFlag & SGOPTION_TOWN_EMERGE ) townEmergeGroup.paint(1-tempConfig.new_independent_town_emerge); if( refreshFlag & SGOPTION_KINGDOM_EMERGE ) nationEmergeGroup.paint(1-tempConfig.new_nation_emerge); if( refreshFlag & SGOPTION_RANDOM_EVENT ) randomEventGroup.paint(tempConfig.random_event_frequency); } // ------- display goal option ---------// if( optionMode == OPTION_GOAL ) { if( refreshFlag & SGOPTION_PAGE ) { image_menu.put_to_buf( &vga_back, "SPG-GOAL"); image_menu.put_back( 234, 15, menuTitleBitmap); vga.blt_buf(0,0,VGA_WIDTH-1,VGA_HEIGHT-1,0); } if( refreshFlag & SGOPTION_CLEAR_ENEMY ) clearEnemyButton.paint(); if( refreshFlag & SGOPTION_CLEAR_MONSTER ) clearMonsterButton.paint(tempConfig.goal_destroy_monster); if( refreshFlag & SGOPTION_ENOUGH_PEOPLE ) { enoughPeopleButton.paint(tempConfig.goal_population_flag); font_san.center_put( 456, offsetY+211, 456+67, offsetY+211+21, m.format(tempConfig.goal_population) ,1); peopleInc.paint(); peopleDec.paint(); } if( refreshFlag & SGOPTION_ENOUGH_INCOME ) { enoughIncomeButton.paint(tempConfig.goal_economic_score_flag); font_san.center_put( 456, offsetY+243, 456+67, offsetY+243+21, m.format(tempConfig.goal_economic_score), 1); incomeInc.paint(); incomeDec.paint(); } if( refreshFlag & SGOPTION_ENOUGH_SCORE ) { enoughScoreButton.paint(tempConfig.goal_total_score_flag); font_san.center_put( 456, offsetY+275, 456+67, offsetY+275+21, m.format(tempConfig.goal_total_score), 1); scoreInc.paint(); scoreDec.paint(); } if( refreshFlag & SGOPTION_TIME_LIMIT ) { timeLimitButton.paint(tempConfig.goal_year_limit_flag); font_san.center_put( 456, offsetY+307, 456+33, offsetY+307+21, m.format(tempConfig.goal_year_limit), 1); yearInc.paint(); yearDec.paint(); } } // ------- display difficulty -------// if( refreshFlag & SGOPTION_DIFFICULTY ) { font_san.center_put( 718, offsetY+74, 780, offsetY+108, m.format(tempConfig.single_player_difficulty()), 1 ); } // -------- repaint button -------// if( refreshFlag & SGOPTION_PAGE ) { startButton.paint(); returnButton.paint(); } refreshFlag = 0; } sys.blt_virtual_buf(); if( config.music_flag ) { if( !music.is_playing(1) ) music.play(1, sys.cdrom_drive ? MUSIC_CD_THEN_WAV : 0 ); } else music.stop(); // --------- detect basic option -------- // if( optionMode == OPTION_BASIC ) { if( raceGroup.detect() >= 0) { tempConfig.race_id = raceGroup[raceGroup()].custom_para.value; //refreshFlag |= SGOPTION_RACE; } else if( colorGroup.detect() >= 0) { tempConfig.player_nation_color = colorGroup[colorGroup()].custom_para.value; //refreshFlag |= SGOPTION_COLOR; } else if( aiNationInc.detect() ) { tempConfig.ai_nation_count++; if( tempConfig.ai_nation_count >= MAX_NATION ) tempConfig.ai_nation_count = MAX_NATION-1; tempConfig.difficulty_level = OPTION_CUSTOM; refreshFlag |= SGOPTION_AI_NATION | SGOPTION_DIFFICULTY; } else if( aiNationDec.detect() ) { tempConfig.ai_nation_count--; if( tempConfig.ai_nation_count <= 0 ) tempConfig.ai_nation_count = 1; tempConfig.difficulty_level = OPTION_CUSTOM; refreshFlag |= SGOPTION_AI_NATION | SGOPTION_DIFFICULTY; } else if( diffGroup.detect() >= 0) { if( diffGroup[diffGroup()].custom_para.value != OPTION_CUSTOM ) { tempConfig.change_difficulty(diffGroup[diffGroup()].custom_para.value); // all but SGOPTION_PAGE; refreshFlag |= SGOPTION_ALL & ~SGOPTION_PAGE; } } else if( terrainGroup.detect() >= 0) { tempConfig.terrain_set = terrainGroup[terrainGroup()].custom_para.value; static short latitudeArray[3] = { 45, 70, 20 }; err_when( tempConfig.terrain_set <= 0 || tempConfig.terrain_set > 3 ); tempConfig.latitude = latitudeArray[tempConfig.terrain_set-1]; //refreshFlag |= SGOPTION_TERRAIN; } else if( landGroup.detect() >= 0) { tempConfig.land_mass = landGroup[landGroup()].custom_para.value; //refreshFlag |= SGOPTION_LAND_MASS; } else if( playerNameField.detect() ) { refreshFlag |= SGOPTION_NAME_FIELD; } } // -------- detect advanced option ---------// if( optionMode == OPTION_ADVANCED ) { if( mapIdField.detect() ) { refreshFlag |= SGOPTION_MAP_ID; } else if( exploreGroup.detect() >= 0 ) { tempConfig.explore_whole_map = exploreGroup[exploreGroup()].custom_para.value; tempConfig.difficulty_level = OPTION_CUSTOM; // refreshFlag |= SGOPTION_EXPLORED; refreshFlag |= SGOPTION_DIFFICULTY; } else if( fogGroup.detect() >= 0 ) { tempConfig.fog_of_war = fogGroup[fogGroup()].custom_para.value; tempConfig.difficulty_level = OPTION_CUSTOM; // refreshFlag |= SGOPTION_FOG refreshFlag |= SGOPTION_DIFFICULTY; } else if( treasureGroup.detect() >= 0 ) { tempConfig.start_up_cash = treasureGroup[treasureGroup()].custom_para.value; tempConfig.difficulty_level = OPTION_CUSTOM; // refreshFlag |= SGOPTION_TREASURE; refreshFlag |= SGOPTION_DIFFICULTY; } else if( aiTreasureGroup.detect() >= 0 ) { tempConfig.ai_start_up_cash = aiTreasureGroup[aiTreasureGroup()].custom_para.value; tempConfig.difficulty_level = OPTION_CUSTOM; // refreshFlag |= SGOPTION_AI_TREASURE; refreshFlag |= SGOPTION_DIFFICULTY; } else if( aiAggressiveGroup.detect() >= 0 ) { tempConfig.ai_aggressiveness = aiAggressiveGroup[aiAggressiveGroup()].custom_para.value; tempConfig.difficulty_level = OPTION_CUSTOM; // refreshFlag |= SGOPTION_AI_AGGRESSIVE; refreshFlag |= SGOPTION_DIFFICULTY; } else if( monsterGroup.detect() >= 0 ) { tempConfig.monster_type = monsterGroup[monsterGroup()].custom_para.value; tempConfig.difficulty_level = OPTION_CUSTOM; // refreshFlag |= SGOPTION_FRYHTANS; refreshFlag |= SGOPTION_DIFFICULTY; } else if( randomStartUpGroup.detect() >= 0) { tempConfig.random_start_up = randomStartUpGroup[randomStartUpGroup()].custom_para.value; tempConfig.difficulty_level = OPTION_CUSTOM; // refreshFlag |= SGOPTION_RANDOM_STARTUP; refreshFlag |= SGOPTION_DIFFICULTY; } } // -------- detect advanced option ---------// if( optionMode == OPTION_ADVANCE2 ) { if( rawSiteInc.detect() ) { if( ++tempConfig.start_up_raw_site > 7 ) tempConfig.start_up_raw_site = 7; tempConfig.difficulty_level = OPTION_CUSTOM; refreshFlag |= SGOPTION_RAW | SGOPTION_DIFFICULTY; } else if( rawSiteDec.detect() ) { if( --tempConfig.start_up_raw_site < 1 ) tempConfig.start_up_raw_site = 1; tempConfig.difficulty_level = OPTION_CUSTOM; refreshFlag |= SGOPTION_RAW | SGOPTION_DIFFICULTY; } else if( nearRawGroup.detect() >= 0) { tempConfig.start_up_has_mine_nearby = nearRawGroup[nearRawGroup()].custom_para.value; tempConfig.difficulty_level = OPTION_CUSTOM; // refreshFlag |= SGOPTION_NEAR_RAW; refreshFlag |= SGOPTION_DIFFICULTY; } else if( townStartGroup.detect() >= 0) { tempConfig.start_up_independent_town = townStartGroup[townStartGroup()].custom_para.value; tempConfig.difficulty_level = OPTION_CUSTOM; // resfreshFlag |= SGOPTION_START_TOWN; refreshFlag |= SGOPTION_DIFFICULTY; } else if( townResistGroup.detect() >= 0) { tempConfig.independent_town_resistance = townResistGroup[townResistGroup()].custom_para.value; tempConfig.difficulty_level = OPTION_CUSTOM; // resfreshFlag |= SGOPTION_TOWN_RESIST; refreshFlag |= SGOPTION_DIFFICULTY; } else if( townEmergeGroup.detect() >= 0) { tempConfig.new_independent_town_emerge = townEmergeGroup[townEmergeGroup()].custom_para.value; tempConfig.difficulty_level = OPTION_CUSTOM; // refreshFlag |= SGOPTION_TOWN_EMERGE; refreshFlag |= SGOPTION_DIFFICULTY; } else if( nationEmergeGroup.detect() >= 0) { tempConfig.new_nation_emerge = nationEmergeGroup[nationEmergeGroup()].custom_para.value; tempConfig.difficulty_level = OPTION_CUSTOM; // refreshFlag |= SGOPTION_NATION_EMERGE; refreshFlag |= SGOPTION_DIFFICULTY; } else if( randomEventGroup.detect() >= 0) { tempConfig.random_event_frequency = randomEventGroup[randomEventGroup()].custom_para.value; tempConfig.difficulty_level = OPTION_CUSTOM; // refreshFlag |= SGOPTION_RANDOM_EVENT; refreshFlag |= SGOPTION_DIFFICULTY; } } // -------- detect goal option ----------// if( optionMode == OPTION_GOAL ) { if( clearEnemyButton.detect() ) { } else if( clearMonsterButton.detect() ) { tempConfig.goal_destroy_monster = clearMonsterButton.pushed_flag; } else if( enoughPeopleButton.detect() ) { tempConfig.goal_population_flag = enoughPeopleButton.pushed_flag; } else if( enoughIncomeButton.detect() ) { tempConfig.goal_economic_score_flag = enoughIncomeButton.pushed_flag; } else if( enoughScoreButton.detect() ) { tempConfig.goal_total_score_flag = enoughScoreButton.pushed_flag; } else if( timeLimitButton.detect() ) { tempConfig.goal_year_limit_flag = timeLimitButton.pushed_flag; } else if( peopleInc.detect() ) { tempConfig.goal_population += 100; if( tempConfig.goal_population > 5000 ) tempConfig.goal_population = 5000; refreshFlag |= SGOPTION_ENOUGH_PEOPLE; } else if( peopleDec.detect() ) { tempConfig.goal_population -= 100; if( tempConfig.goal_population < 100 ) tempConfig.goal_population = 100; refreshFlag |= SGOPTION_ENOUGH_PEOPLE; } else if( incomeInc.detect() ) { tempConfig.goal_economic_score += 100; if( tempConfig.goal_economic_score > 5000 ) { tempConfig.goal_economic_score = 5000; } refreshFlag |= SGOPTION_ENOUGH_INCOME; } else if( incomeDec.detect() ) { tempConfig.goal_economic_score -= 100; if( tempConfig.goal_economic_score < 100 ) { tempConfig.goal_economic_score = 100; } refreshFlag |= SGOPTION_ENOUGH_INCOME; } else if( scoreInc.detect() ) { if( tempConfig.goal_total_score >= 2000 ) tempConfig.goal_total_score += 500; else tempConfig.goal_total_score += 100; if( tempConfig.goal_total_score > 10000 ) tempConfig.goal_total_score = 10000; refreshFlag |= SGOPTION_ENOUGH_SCORE; } else if( scoreDec.detect() ) { if( tempConfig.goal_total_score > 2000 ) tempConfig.goal_total_score -= 500; else tempConfig.goal_total_score -= 100; if( tempConfig.goal_total_score < 100 ) tempConfig.goal_total_score = 100; refreshFlag |= SGOPTION_ENOUGH_SCORE; } else if( yearInc.detect() ) { if( tempConfig.goal_year_limit >= 20 ) tempConfig.goal_year_limit += 5; else tempConfig.goal_year_limit++; if( tempConfig.goal_year_limit > 100 ) { tempConfig.goal_year_limit = 100; } refreshFlag |= SGOPTION_TIME_LIMIT; } else if( yearDec.detect() ) { if( tempConfig.goal_year_limit > 20 ) tempConfig.goal_year_limit -= 5; else tempConfig.goal_year_limit--; if( tempConfig.goal_year_limit < 1 ) { tempConfig.goal_year_limit = 1; } refreshFlag |= SGOPTION_TIME_LIMIT; } } // --------- detect switch option button ------// if( mouse.single_click(96, offsetY+12, 218, offsetY+54) ) { if( optionMode != OPTION_BASIC ) { optionMode = OPTION_BASIC; refreshFlag = SGOPTION_ALL; } } else if( mouse.single_click(236, offsetY+12, 363, offsetY+54) ) { if( optionMode != OPTION_ADVANCED ) { optionMode = OPTION_ADVANCED; refreshFlag = SGOPTION_ALL; } } else if( mouse.single_click(380, offsetY+12, 506, offsetY+54) ) { if( optionMode != OPTION_ADVANCE2 ) { optionMode = OPTION_ADVANCE2; refreshFlag = SGOPTION_ALL; } } else if( mouse.single_click(523, offsetY+12, 649, offsetY+54) ) { if( optionMode != OPTION_GOAL ) { optionMode = OPTION_GOAL; refreshFlag = SGOPTION_ALL; } } // --------- detect input name --------// // --------- detect start button --------// if( startButton.detect() ) { retFlag = 1; break; // break while(1) } else if( returnButton.detect() ) { retFlag = 0; break; // break while(1) } vga_front.unlock_buf(); } if( !vga_front.buf_locked ) vga_front.lock_buf(); if( retFlag ) { info.init_random_seed( atol(mapIdStr) ); tempConfig.difficulty_rating = tempConfig.single_player_difficulty(); // BUGHERE : terrain_set 2 is not available #ifndef AMPLUS if( tempConfig.terrain_set == 2 ) tempConfig.terrain_set = 1; #endif config = tempConfig; } return retFlag; } #ifdef Y_SHIFT #error #endif #undef Y_SHIFT_FLAG static void disp_virtual_button(ButtonCustom *button, int) { mouse.hide_area(button->x1, button->y1, button->x2, button->y2); if( !button->pushed_flag ) { // copy from back buffer to front buffer IMGcopy(vga_front.buf_ptr(), vga_front.buf_pitch(), vga_back.buf_ptr(), vga_back.buf_pitch(), button->x1, button->y1, button->x2, button->y2 ); } else { // copy from back buffer to front buffer, but the area is // darkened by 2 scale IMGcopyRemap(vga_front.buf_ptr(), vga_front.buf_pitch(), vga_back.buf_ptr(), vga_back.buf_pitch(), button->x1, button->y1, button->x2, button->y2, vga.vga_color_table->get_table(-2) ); // draw black frame if( button->x2-button->x1+1 == BASIC_OPTION_X_SPACE && button->y2-button->y1+1 == BASIC_OPTION_HEIGHT ) { image_interface.put_front(button->x1, button->y1, "BAS_DOWN"); } else if( button->x2-button->x1+1 == COLOR_OPTION_X_SPACE && button->y2-button->y1+1 == COLOR_OPTION_HEIGHT ) { image_interface.put_front(button->x1, button->y1, "COL_DOWN"); } } mouse.show_area(); } static void disp_virtual_tick(ButtonCustom *button, int ) { mouse.hide_area(button->x1, button->y1, button->x2, button->y2); // copy from back buffer to front buffer IMGcopy(vga_front.buf_ptr(), vga_front.buf_pitch(), vga_back.buf_ptr(), vga_back.buf_pitch(), button->x1, button->y1, button->x2, button->y2 ); if( button->pushed_flag ) image_menu.put_front( button->x1+3, button->y1+3, "NMPG-RCH" ); mouse.show_area(); }