/*
* 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 : OSYS2.CPP
//Description : System resource management 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
//---------- define static variables ----------//
static int report_disp_frame_no;
static Button3D button_menu;
//-------- Begin of function Sys::detect --------//
//
void Sys::detect()
{
//--- only detect at the even frames when in report mode ---//
if( view_mode != MODE_NORMAL &&
// ###### begin Gilbert 5/11 ######//
!report_disp_frame_no )
// ###### end Gilbert 5/11 ######//
{
return;
}
//--------------------------------------//
mouse.get_event();
if( option_menu.is_active() )
{
option_menu.detect();
return;
}
if( in_game_menu.is_active() )
{
in_game_menu.detect();
return;
}
if( VBrowse::press_record ) // if the user is pulling the records of the browser up and down, calling detect() routines of other controls will confuse it
{
VBrowse::press_vbrowse_ptr->detect();
}
if( mouse.is_key_event() )
{
process_key(mouse.scan_code, mouse.event_skey_state);
}
detect_button(); // detect main buttons on the screen
detect_view();
}
//--------- End of function Sys::detect ---------//
//-------- Begin of function Sys::process --------//
//
void Sys::process()
{
//---- if any of the DirectDraw buffers is lost, restore it ----//
if( vga_front.is_buf_lost() || vga_back.is_buf_lost() )
{
if (!restore())
pause();
}
//------- update frame count and is_sync_frame --------//
frame_count++;
is_sync_frame = frame_count%3==0; // check if sychronization should take place at this frame (for handling one sync per n frames)
//------- play sound effect ------//
se_ctrl.flush();
//--------- process objects -----------//
LOG_MSG(m.get_random_seed());
LOG_MSG("begin unit_array.process()");
unit_array.process();
seek_path.reset_total_node_avail(); // reset node for seek_path
LOG_MSG("end unit_array.process()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin firm_array.process()");
firm_array.process();
LOG_MSG("end firm_array.process()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin town_array.process()");
town_array.process();
LOG_MSG("end town_array.process()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin nation_array.process()");
nation_array.process();
LOG_MSG("end nation_array.process()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin bullet_array.process()");
bullet_array.process();
LOG_MSG("end bullet_array.process()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin world.process()");
world.process();
LOG_MSG("end world.process()");
LOG_MSG(m.get_random_seed());
#ifndef AMPLUS
// AMPLUS version moved to disp_frame
LOG_MSG("begin anim_line.inc_phase()");
anim_line.inc_phase();
LOG_MSG("end anim_line.inc_phase()");
LOG_MSG(m.get_random_seed());
#endif
LOG_MSG("begin tornado_array.process()");
tornado_array.process();
LOG_MSG("begin tornado_array.process()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin snow_ground_array.process()");
snow_ground_array.process();
LOG_MSG("end snow_ground_array.process()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin rock_array.process()");
rock_array.process();
LOG_MSG("end rock_array.process()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin dirt_array.process()");
dirt_array.process();
LOG_MSG("end dirt_array.process()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin effect_array.process()");
effect_array.process();
LOG_MSG("end effect_array.process()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin war_point_array.process()");
war_point_array.process();
LOG_MSG("end war_point_array.process()");
LOG_MSG("begin firm_die.process()");
firm_die_array.process();
LOG_MSG("end firm_die.process()");
//------ check if it's time for the next day ------//
if( ++day_frame_count > FRAMES_PER_DAY )
{
LOG_MSG("begin info.next_day()");
info.next_day();
LOG_MSG("end info.next_day()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin world.next_day()");
world.next_day();
LOG_MSG("end world.next_day()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin site_array.next_day()");
site_array.next_day();
LOG_MSG("end site_array.next_day()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin rebel_array.next_day()");
rebel_array.next_day();
LOG_MSG("end rebel_array.next_day()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin spy_array.next_day()");
spy_array.next_day();
LOG_MSG("end spy_array.next_day()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin sprite_res.update_speed()");
if( config.weather_effect)
sprite_res.update_speed();
LOG_MSG("end sprite_res.update_speed()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin raw_res.next_day()");
raw_res.next_day();
LOG_MSG("end raw_res.next_day()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin talk_res.next_day()");
talk_res.next_day();
LOG_MSG("end talk_res.next_day()");
LOG_MSG(m.get_random_seed());
LOG_MSG("begin region_array.next_day()");
region_array.next_day();
LOG_MSG("end region_array.next_day()");
LOG_MSG(m.get_random_seed());
day_frame_count = 0;
}
//### begin alex 12/9 ###//
//---------- update data structure of selected trading unit ------------//
unit_array.update_selected_trade_unit_info();
//#### end alex 12/9 ####//
//------ display the current frame ------//
LOG_MSG("begin sys.disp_frame");
m.lock_seed();
disp_frame();
m.unlock_seed();
LOG_MSG("end sys.disp_frame");
LOG_MSG(m.get_random_seed() );
//### begin alex 12/9 ###//
//--------- send message for selected trading unit in multiplayer game -------//
unit_array.mp_mark_selected_caravan();
unit_array.mp_mark_selected_ship();
//#### end alex 12/9 ####//
//-----------------------------------------//
/*
#ifdef DEBUG
//------- debug codes used to count town's defender number -------//
Unit *unitPtr;
Town *townPtr;
for(int i=unit_array.size(); i>0; i--)
{
if(unit_array.SpriteArray::is_deleted(i))
continue;
unitPtr = unit_array[i];
if(unitPtr->unit_mode==UNIT_MODE_DEFEND_TOWN)
{
if(town_array.is_deleted(unitPtr->unit_mode_para))
continue;
townPtr = town_array[unitPtr->unit_mode_para];
if(townPtr->nation_recno==unitPtr->nation_recno)
townPtr->debug_defender_count++;
}
}
for(i=town_array.size(); i>0; i--)
{
if(town_array.is_deleted(i))
continue;
townPtr = town_array[i];
err_when(townPtr->debug_defender_count != townPtr->town_defender_count);
townPtr->debug_defender_count = 0;
}
#endif
*/
//-*********** simulate aat ************-//
#ifdef DEBUG
if(debug_sim_game_type==2)
{
//if(m.random(20)==0)
if(m.random(50)==0)
{
#define MAX_ATTACKER 30
int arraySize = unit_array.size();
int i, j, i2, j2;
short nationRecno;
Unit *unitPtr, *targetPtr;
short attackerArray[MAX_ATTACKER];
short attackerCount = 0;
//----------- select attackers -----------//
//for(i=m.random(arraySize)+1, j=1; j<=arraySize; j++, i++)
for(i=int(m.get_random_seed()%arraySize)+1, j=1; j<=arraySize; j++, i++)
{
if(i>arraySize)
i = 1;
if(unit_array.is_deleted(i))
continue;
unitPtr = (Unit*) unit_array[i];
if(!unitPtr->is_visible())
continue;
if(attackerCount)
{
if(unitPtr->nation_recno!=nationRecno)
continue;
}
else
nationRecno = unitPtr->nation_recno;
err_when(i!=unitPtr->sprite_recno);
err_when(i>arraySize);
if(m.random(4)==0)
attackerArray[attackerCount++] = i;
if(attackerCount>=MAX_ATTACKER/2)
break; // array full
}
//--------- selecet victim ----------//
//if(day_frame_count==9 && frame_count==6082)
// int debug =0;
if(m.random(10))
{
//for(i2=m.random(arraySize)+1, j2=1; j2<=arraySize; j2++, i2++)
for(i2=int(m.get_random_seed()%arraySize)+1, j2=1; j2<=arraySize; j2++, i2++)
{
if(i2>arraySize)
i2 = 1;
if(unit_array.is_deleted(i2))
continue;
targetPtr = (Unit*) unit_array[i2];
if(!targetPtr->is_visible())
continue;
if(targetPtr->nation_recno==unitPtr->nation_recno)
continue;
err_when(i2>arraySize);
unit_array.attack(targetPtr->next_x_loc(), targetPtr->next_y_loc(), 0, attackerArray, attackerCount, 0, 0);
break;
}
}
else
unit_array.move_to(m.random(MAX_WORLD_X_LOC), m.random(MAX_WORLD_Y_LOC), 0, attackerArray, attackerCount, 1);
}
}
#endif
//-*********** simulate aat ************-//
}
//--------- End of function Sys::process ---------//
//-------- Begin of function Sys::disp_button --------//
//
void Sys::disp_button()
{
vga.use_back();
button_menu.paint( 720, 6, "MENU-U", "MENU-D" );
button_menu.set_help_code( "GAMEMENU" );
vga.use_front();
}
//--------- End of function Sys::disp_button ---------//
//-------- Begin of function Sys::detect_button --------//
//
void Sys::detect_button()
{
//--------- detect menu button -------//
if( button_menu.detect() )
{
// ##### begin Gilbert 5/11 #######//
// game.in_game_menu();
in_game_menu.enter(!remote.is_enable());
// ##### end Gilbert 5/11 #######//
return;
}
//------- detect view mode buttons -----//
#define VIEW_MODE_BUTTON_WIDTH 58
#define VIEW_MODE_BUTTON_HEIGHT 16
#define VIEW_MODE_BUTTON_X_SPACE 5
int i, x=6, y=8;
static char viewModeArray[] =
{
MODE_NATION, MODE_TOWN, MODE_ECONOMY, MODE_TRADE, MODE_MILITARY, MODE_TECH, MODE_SPY, MODE_RANK
};
for( i=0 ; i<8 ; i++, x+=VIEW_MODE_BUTTON_WIDTH+VIEW_MODE_BUTTON_X_SPACE )
{
if( i==4 ) // the second row
{
x=12;
y=29;
}
if( nation_array.player_recno==0 && i<7 ) // when the player has lost the game, the only report available is ranking report only
continue;
if( mouse.single_click( x, y, x+VIEW_MODE_BUTTON_WIDTH-1, y+VIEW_MODE_BUTTON_HEIGHT-1 ) )
{
int newMode = viewModeArray[i];
if( view_mode == newMode ) // when click on the same mode again, go to the normal mode
set_view_mode(MODE_NORMAL);
else
set_view_mode(newMode);
break;
}
}
}
//--------- End of function Sys::detect_button ---------//
//-------- Begin of function Sys::set_view_mode --------//
//
// viewMode - id. of the view mode.
// [int] viewingNationRecno - which nation the player is viewing at with the reports.
// (default: the player nation)
// [int] viewingSpyRecno - >0 if the spy is viewing secret reports of other nations
//
void Sys::set_view_mode(int viewMode, int viewingNationRecno, int viewingSpyRecno)
{
if( view_mode == viewMode )
return;
//---- if the player's kingdom has been destroyed ----//
err_when( viewingNationRecno && nation_array.is_deleted(viewingNationRecno) );
if( nation_array.is_deleted(info.default_viewing_nation_recno) )
{
if( viewMode != MODE_NORMAL && viewMode != MODE_RANK ) // other reports are not available except the normal and rank report
return;
}
//---- a spy is exposed when he has finished viewing the secrets ----//
if( info.viewing_spy_recno )
{
if( !spy_array.is_deleted(info.viewing_spy_recno) )
{
Spy* spyPtr = spy_array[info.viewing_spy_recno];
int needViewSecretSkill = spy_array.needed_view_secret_skill(info.viewing_spy_recno);
int escapeChance = spyPtr->spy_skill - needViewSecretSkill;
int killFlag = 0;
if( escapeChance > 0 )
{
if( m2.random( escapeChance/15 )==0 ) // use m2 instead of m to maintain mulitplayer sync
killFlag = 1;
}
if( killFlag )
spyPtr->set_exposed(COMMAND_PLAYER);
}
info.viewing_spy_recno = 0;
}
//----------------------------------------------------//
if( viewMode == MODE_NORMAL )
{
info.viewing_nation_recno = info.default_viewing_nation_recno;
}
else
{
if( viewingNationRecno )
info.viewing_nation_recno = viewingNationRecno;
else
info.viewing_nation_recno = info.default_viewing_nation_recno;
info.viewing_spy_recno = viewingSpyRecno;
}
view_mode = viewMode;
disp_view_mode();
disp_view();
}
//--------- End of function Sys::set_view_mode ---------//
//-------- Begin of function Sys::disp_frame --------//
void Sys::disp_frame()
{
if( sys.signal_exit_flag )
return;
if( option_menu.is_active() )
{
// ##### begin Gilbert 3/11 ######//
option_menu.disp(need_redraw_flag);
// ##### end Gilbert 3/11 ######//
blt_virtual_buf();
}
else
{
// -------- re-draw the whole screen if needed, such as after task switching ---------//
if( need_redraw_flag )
{
info.disp_panel();
world.paint();
disp_button();
world.refresh();
disp_view();
if( in_game_menu.is_active() )
{
vga.use_back();
in_game_menu.disp();
vga.use_front();
}
vga.blt_buf(0,0, VGA_WIDTH-1, VGA_HEIGHT-1, 0);
// ###### begin Gilbert 4/11 ######//
disp_view_mode();
// ###### end Gilbert 4/11 ######//
info.disp();
}
else
{
update_view();
info.update();
}
//--------- display the map and info area --------//
disp_map();
blt_virtual_buf();
//---------- display help ----------//
if( !remote.is_enable() ) // help is only available in a single player game as it has to pause the game
help.disp();
}
// ####### end Glbert 24/10 #######//
#ifdef AMPLUS
anim_line.inc_phase(); // originally in Sys::process()
#endif
need_redraw_flag = 0;
}
//-------- End of function Sys::disp_frame --------//
//-------- Begin of function Sys::disp_view --------//
//
// Display the view area.
//
void Sys::disp_view()
{
disp_zoom();
// ###### begin Gilbert 5/11 ########//
report_disp_frame_no = 0; // 0 - mean report can be drawn, clear after disp_zoom, set after display report
// ###### end Gilbert 5/11 ########//
//---- if in report mode, convert the view to gray scale ----//
if( view_mode!=MODE_NORMAL )
{
// ###### begin Gilbert 5/11 ########//
// report_disp_frame_no = frame_count; // the frame no which this report is first displayed
// ###### end Gilbert 5/11 ########//
//------- blt the zoom area to the front screen --------//
vga.use_back();
Vga::opaque_flag = config.opaque_report;
switch( view_mode )
{
case MODE_TRADE:
info.disp_trade(INFO_REPAINT);
break;
case MODE_MILITARY:
info.disp_military(INFO_REPAINT);
break;
case MODE_ECONOMY:
info.disp_economy(INFO_REPAINT);
break;
case MODE_TOWN:
info.disp_town(INFO_REPAINT);
break;
case MODE_NATION:
info.disp_nation(INFO_REPAINT);
break;
case MODE_TECH:
info.disp_tech(INFO_REPAINT);
break;
case MODE_SPY:
info.disp_spy(INFO_REPAINT);
break;
case MODE_RANK:
info.disp_rank(INFO_REPAINT);
break;
case MODE_NEWS_LOG:
info.disp_news_log(INFO_REPAINT);
break;
case MODE_AI_ACTION:
info.disp_ai_action(INFO_REPAINT);
break;
}
vga.use_front();
Vga::opaque_flag = 0;
// ###### begin Gilbert 5/11 ########//
report_disp_frame_no = 1;
// ###### end Gilbert 5/11 ########//
}
}
//-------- End of function Sys::disp_view --------//
//-------- Begin of function Sys::update_view --------//
//
// Display the view area.
//
void Sys::update_view()
{
if( view_mode==MODE_NORMAL )
{
disp_zoom();
// ####### begin Gilbert 5/11 #######//
report_disp_frame_no = 0;
// ####### end Gilbert 5/11 #######//
//------ display tutorial text -------//
if( game.game_mode == GAME_TUTORIAL )
tutor.disp();
//----------- draw profile information -----------//
if( config.show_ai_info )
{
vga.use_back();
/*
char* germanStr = "d ü ä ß ö Ä Ü Ö";
vga_back.bar( ZOOM_X1, ZOOM_Y1, ZOOM_X1+300, ZOOM_Y1+150, VGA_LIGHT_GREEN );
font_san.put( ZOOM_X1+10, ZOOM_Y1+30, germanStr );
font_news.put( ZOOM_X1+10, ZOOM_Y1+50, germanStr );
font_bible.put( ZOOM_X1+10, ZOOM_Y1+70, germanStr );
*/
nation_array.draw_profile();
firm_array.draw_profile();
town_array.draw_profile();
unit_array.draw_profile();
vga.use_front();
}
if( in_game_menu.is_active() )
{
vga.use_back();
in_game_menu.disp();
vga.use_front();
}
//------------------------------------//
vga.blt_buf(ZOOM_X1, ZOOM_Y1, ZOOM_X2, ZOOM_Y2);
}
else
{
//-------------------------------------------//
//
// In report mode, display the background view in odd
// number frames and the report in even number frames.
//
//-------------------------------------------//
// ####### begin Gilbert 5/11 #######//
if( report_disp_frame_no )
{
disp_zoom();
report_disp_frame_no = 0;
}
else
{
vga.use_back();
Vga::opaque_flag = config.opaque_report;
switch( view_mode )
{
case MODE_TRADE:
info.disp_trade(INFO_UPDATE);
break;
case MODE_MILITARY:
info.disp_military(INFO_UPDATE);
break;
case MODE_ECONOMY:
info.disp_economy(INFO_UPDATE);
break;
case MODE_TOWN:
info.disp_town(INFO_UPDATE);
break;
case MODE_NATION:
info.disp_nation(INFO_UPDATE);
break;
case MODE_TECH:
info.disp_tech(INFO_UPDATE);
break;
case MODE_SPY:
info.disp_spy(INFO_UPDATE);
break;
case MODE_RANK:
info.disp_rank(INFO_UPDATE);
break;
case MODE_NEWS_LOG:
info.disp_news_log(INFO_UPDATE);
break;
case MODE_AI_ACTION:
info.disp_ai_action(INFO_UPDATE);
break;
}
if( in_game_menu.is_active() )
{
in_game_menu.disp();
}
vga.use_front();
Vga::opaque_flag = 0;
vga.blt_buf(ZOOM_X1, ZOOM_Y1, ZOOM_X2, ZOOM_Y2);
// ###### begin Gilbert 5/11 #######//
report_disp_frame_no = 1;
// ###### end Gilbert 5/11 #######//
}
}
}
//-------- End of function Sys::update_view --------//
//-------- Begin of function Sys::detect_view --------//
//
void Sys::detect_view()
{
int enableAction; // some action is not enabled, when paused.
#ifdef AMPLUS
enableAction = config.frame_speed > 0 || !remote.is_enable(); // AMPLUS allows action when paused in single player
#else
enableAction = config.frame_speed > 0;
#endif
if( enableAction )
info.detect();
vga.use_back();
switch( view_mode )
{
case MODE_TRADE:
info.detect_trade();
break;
case MODE_MILITARY:
info.detect_military();
break;
case MODE_ECONOMY:
info.detect_economy();
break;
case MODE_TOWN:
info.detect_town();
break;
case MODE_NATION:
info.detect_nation();
break;
case MODE_TECH:
info.detect_tech();
break;
case MODE_SPY:
info.detect_spy();
break;
case MODE_RANK:
info.detect_rank();
break;
case MODE_NEWS_LOG:
info.detect_news_log();
break;
case MODE_AI_ACTION:
info.detect_ai_action();
break;
}
vga.use_front();
//------ detect tutorial controls -------//
if( view_mode==MODE_NORMAL && game.game_mode==GAME_TUTORIAL ) // tutorial text is only displayed in non-report mode
{
if( tutor.detect() )
return;
}
//---- no normal news when the game is displaying the news log ----//
// ##### patch begin Gilbert 31/3 #####//
if( news_array.detect() )
return;
// ##### patch end Gilbert 31/3 #####//
//---- pressing right button in command mode -> cancel command mode ----//
if( mouse.any_click(RIGHT_BUTTON) && power.command_id )
{
power.command_id = 0;
mouse.reset_click();
info.disp();
return;
}
//------ detect selecting objects and laying tracks ------//
//-------- detect world ----------//
if( world.detect() )
return;
if( view_mode == MODE_NORMAL )
{
if( world.detect_firm_town() )
return;
//------ detect selecting objects and laying tracks ------//
if( power.detect_frame() )
return;
}
else
{
mouse_cursor.set_frame(0);
}
//----------- detect action ------------//
if( enableAction && power.detect_action() )
{
if(unit_array.selected_recno && se_res.mark_command_time() )
{
Unit *unitPtr = unit_array[unit_array.selected_recno];
se_res.far_sound( unitPtr->cur_x_loc(), unitPtr->cur_y_loc(), 1, 'S',
unitPtr->sprite_id, "ACK");
}
return;
}
//----- detect right mouse button to select defined unit groups -----//
if( !(mouse.event_skey_state & SHIFT_KEY_MASK) &&
mouse.any_click(ZOOM_X1, ZOOM_Y1, ZOOM_X2, ZOOM_Y2, RIGHT_BUTTON) &&
power.detect_select(mouse.click_x(RIGHT_BUTTON), mouse.click_y(RIGHT_BUTTON),
mouse.click_x(RIGHT_BUTTON),mouse.click_y(RIGHT_BUTTON), 1, 0) ) // 1 - recall group
{
return;
}
//-------- detect world ----------//
// world.detect();
}
//-------- End of function Sys::detect_view --------//
//-------- Begin of function Sys::disp_map --------//
void Sys::disp_map()
{
//------ draw and display the map -------//
if( map_need_redraw ) // requested by other modules to redraw the pre-drawn map background
{
world.map_matrix->draw();
map_need_redraw = 0;
}
world.map_matrix->disp();
//-------- draw dots on the map ---------//
firm_array.draw_dot();
town_array.draw_dot();
site_array.draw_dot();
unit_array.draw_dot();
war_point_array.draw_dot();
tornado_array.draw_dot();
world.map_matrix->draw_square(); // draw a square on the map for current zoomed area
//------- blt the map area to the front screen --------//
vga.blt_buf( MAP_X1, MAP_Y1 , MAP_X2 , MAP_Y2);
}
//-------- End of function Sys::disp_map --------//
//-------- Begin of function Sys::disp_zoom --------//
void Sys::disp_zoom()
{
//--------- set zoom window ----------//
ZoomMatrix* zoomMatrix = world.zoom_matrix;
err_when(zoomMatrix->top_x_loc<0 || zoomMatrix->top_x_loc>=MAX_WORLD_X_LOC);
err_when(zoomMatrix->top_y_loc<0 || zoomMatrix->top_y_loc>=MAX_WORLD_Y_LOC);
World::view_top_x = zoomMatrix->top_x_loc * ZOOM_LOC_WIDTH;
World::view_top_y = zoomMatrix->top_y_loc * ZOOM_LOC_HEIGHT;
//--------- draw map area ---------//
if( zoom_need_redraw ) // requested by other modules to redraw the pre-drawn zoom background
{
long backupSeed = m.get_random_seed();
world.zoom_matrix->draw();
zoom_need_redraw = 0;
}
//-------- disp zoom area --------//
world.zoom_matrix->disp();
//---- draw sprite white sites if in debug mode ----//
#ifdef DEBUG
if(debug2_enable_flag)
world.zoom_matrix->draw_white_site();
#endif
//------- draw foreground objects --------//
world.zoom_matrix->draw_frame();
//----- draw the frame of the selected firm/town -----//
info.draw_selected();
//-------- display news messages ---------//
news_array.disp();
//----- next frame, increase the frame counter -----//
sys.frames_in_this_second++; // no. of frames displayed in this second
if( view_mode==MODE_NORMAL )
disp_frames_per_second();
}
//-------- End of function Sys::disp_zoom --------//
//-------- Begin of function Sys::blt_virtual_buf --------//
//
void Sys::blt_virtual_buf()
{
if( !sys.debug_session )
return;
//--- in a debug sesion, vga_front is not the true front buffer, now copy it to the true one ---//
int frontLocked=0;
if( vga_front.buf_locked )
{
vga_front.unlock_buf();
frontLocked=1;
}
RECT bltRect;
bltRect.left = 0;
bltRect.top = 0;
bltRect.right = VGA_WIDTH-1;
bltRect.bottom = VGA_HEIGHT-1;
int rc = vga_true_front.dd_buf->BltFast(
0, 0,
vga_front.dd_buf, // src surface
&bltRect, // src rect (all of it)
DDBLTFAST_WAIT );
if( frontLocked )
vga_front.lock_buf();
}
//--------- End of function Sys::blt_virtual_buf ---------//
//-------- Begin of function Sys::disp_frames_per_second --------//
//
void Sys::disp_frames_per_second()
{
if( !config.show_ai_info ) // only display this in a debug session
return;
if( game.game_mode == GAME_TUTORIAL ) // don't display in tutorial mode as it overlaps with the tutorial text
return;
//------- get the curren system time ---------//
DWORD curTime = m.get_time(); // in millisecond
//----------- first time calling -------------//
if( last_second_time==0 )
{
last_second_time = curTime;
frames_in_this_second = 0; // no. of frames displayed in this second
return;
}
//------ when passes to the next second -----//
if( curTime >= last_second_time+1000 ) // 1 second = 1000 millisecond
{
frames_per_second = frames_in_this_second;
//------ update var and reset counter -----//
last_second_time += 1000;
frames_in_this_second = 0;
}
//---------- display frame count -----------//
String str;
str = "Frames per second: ";
str += frames_per_second;
vga.use_back();
font_news.disp( ZOOM_X1+10, ZOOM_Y1+10, str, MAP_X2);
vga.use_front();
}
//--------- End of function Sys::disp_frames_per_second ---------//
//--------- Begin of funtion Sys::disp_view_mode ---------//
// observeMode - force observe mode display (darken view mode 1 - 7)
// needed in Game::game_end, nation_array.player_recno has not yet set to 0
void Sys::disp_view_mode(int observeMode)
{
// ------- display highlight ----------//
const int MIN_MODE_TO_DISPLAY = 1;
const int MAX_MODE_TO_DISPLAY = 8;
const int MODE_TO_DISPLAY_COUNT = MAX_MODE_TO_DISPLAY - MIN_MODE_TO_DISPLAY + 1;
static short highLightX[MODE_TO_DISPLAY_COUNT] = { 0, 62, 124, 186, 7, 68, 129, 192};
static short highLightY[MODE_TO_DISPLAY_COUNT] = { 0, 0, 0, 0, 19, 19, 19, 19};
static short darkenX[MODE_TO_DISPLAY_COUNT] = { 7, 69, 132, 195, 13, 75, 139, 201};
static short darkenY[MODE_TO_DISPLAY_COUNT] = { 8, 8, 8, 8, 29, 29, 29, 29};
const int darkenWidth = 58;
const int darkenHeight = 16;
char scrollName[] = "SCROLL-0";
// disable highlight of the mode before
scrollName[7] = 'B';
image_button.put_front( 0,0, scrollName);
// highlight of the mode after
if( view_mode >= MIN_MODE_TO_DISPLAY && view_mode <= MAX_MODE_TO_DISPLAY )
{
// find the size of that scroll
scrollName[7] = '0' + view_mode;
image_button.put_front( highLightX[view_mode-MIN_MODE_TO_DISPLAY],
highLightY[view_mode-MIN_MODE_TO_DISPLAY], scrollName);
}
// darken buttons of view mode 1-7 if nation_array.player_recno == 0
if( observeMode || !nation_array.player_recno )
{
for( int j = 1; j <= 7; ++j )
{
//if( j == view_mode)
// continue;
vga_front.adjust_brightness(
darkenX[j-MIN_MODE_TO_DISPLAY], darkenY[j-MIN_MODE_TO_DISPLAY],
darkenX[j-MIN_MODE_TO_DISPLAY]+darkenWidth-1,
darkenY[j-MIN_MODE_TO_DISPLAY]+darkenHeight-1, -8 );
}
}
}
//--------- End of funtion Sys::disp_view_mode ---------//