/*
* 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 : OWORLD_M.CPP
//Description : Object MapMatrix
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//-------- Begin of function MapMatrix::MapMatrix ----------//
MapMatrix::MapMatrix()
{
init( MAP_X1, MAP_Y1, MAP_X2, MAP_Y2,
MAP_WIDTH, MAP_HEIGHT,
MAP_LOC_WIDTH, MAP_LOC_HEIGHT, 1 ); // 1-create a background buffer
}
//---------- End of function MapMatrix::MapMatrix ----------//
//-------- Begin of function MapMatrix::~MapMatrix ----------//
MapMatrix::~MapMatrix()
{
}
//---------- End of function MapMatrix::~MapMatrix ----------//
//---------- Begin of function MapMatrix::init_para ------------//
void MapMatrix::init_para()
{
last_map_mode = MAP_NORMAL;
map_mode = MAP_MODE_TERRAIN;
power_mode = 0;
}
//---------- End of function MapMatrix::init_para ----------//
//--------- Begin of function MapMatrix::paint -----------//
void MapMatrix::paint()
{
disp_mode_button();
}
//----------- End of function MapMatrix::paint ------------//
//------- Begin of function MapMatrix::disp_mode_button ---------//
//
// Display map mode buttons.
//
// [int] putFront - 1-display the buttons on the front buffer
// 0-display the buttons on the back buffer
// (default: 0)
//
void MapMatrix::disp_mode_button(int putFront)
{
char* iconName;
switch(map_mode)
{
case MAP_MODE_TERRAIN:
iconName = "MAP-1";
break;
case MAP_MODE_POWER:
if( power_mode )
iconName = "MAP-2B";
else
iconName = "MAP-2A";
break;
case MAP_MODE_SPOT:
iconName = "MAP-3";
break;
default:
err_here();
}
if( putFront )
image_button.put_front( 579, 2, iconName, 1 );
else
image_button.put_back( 579, 2, iconName, 1 );
}
//----------- End of function MapMatrix::disp_mode_button ------------//
//--------- Begin of function MapMatrix::detect ------------//
int MapMatrix::detect()
{
int x=586;
#define MAP_MODE_BUTTON_WIDTH 40
for( int i=0 ; iexplored() )
{
if( locPtr->fire_str() > 0)
*writePtr = (char) FIRE_COLOR;
else if( locPtr->is_plant() )
*writePtr = plant_res.plant_map_color;
else
{
tilePixel = terrain_res.get_map_tile(locPtr->terrain_id)[tileYOffset + (x & TERRAIN_TILE_X_MASK)];
if( y == image_y1 || x == image_x1)
{
*writePtr = tilePixel;
}
else
{
northWestPtr = locPtr - shadowMapDist;
if( terrain_res[locPtr->terrain_id]->average_type >=
terrain_res[northWestPtr->terrain_id]->average_type)
{
*writePtr = tilePixel;
}
else
{
*writePtr = (char) VGA_GRAY;
}
}
}
}
else
{
*writePtr = UNEXPLORED_COLOR;
}
}
}
break;
case MAP_MODE_SPOT:
for( y=image_y1 ; y<=image_y2 ; y++, writePtr+=lineRemain )
{
for( x=image_x1 ; x<=image_x2 ; x++, writePtr++, locPtr++ )
{
if( locPtr->explored() )
{
if( locPtr->sailable() )
*writePtr = (char) 0x32;
else if( locPtr->has_hill() )
*writePtr = (char) V_BROWN;
// else if( locPtr->is_plant() )
// *writePtr = (char) V_DARK_GREEN;
else
*writePtr = (char) VGA_GRAY+10;
}
else
{
*writePtr = UNEXPLORED_COLOR;
}
}
}
break;
case MAP_MODE_POWER:
for( y=image_y1 ; y<=image_y2 ; y++, writePtr+=lineRemain )
{
for( x=image_x1 ; x<=image_x2 ; x++, writePtr++, locPtr++ )
{
if( locPtr->explored() )
{
if( locPtr->sailable() )
*writePtr = (char) 0x32;
else if( locPtr->has_hill() )
*writePtr = (char) V_BROWN;
else if( locPtr->is_plant() )
*writePtr = (char) V_DARK_GREEN;
else
*writePtr = nationColorArray[locPtr->power_nation_recno];
}
else
{
*writePtr = UNEXPLORED_COLOR;
}
}
}
break;
}
sys.yield();
}
//------------ End of function MapMatrix::draw_map ------------//
//----------- Begin of function MapMatrix::disp ------------//
//
// Display the drawn world map on screen, update the location
// of the map-to-zoom area box.
//
void MapMatrix::disp()
{
if( !just_drawn_flag ) // if the map has just been drawn in draw()
{
if( save_image_buf && map_mode==last_map_mode )
vga_back.put_bitmap( image_x1, image_y1, save_image_buf );
else
{
draw();
last_map_mode = map_mode;
}
}
just_drawn_flag=0;
}
//----------- End of function MapMatrix::disp ------------//
//----------- Begin of function MapMatrix::draw_square ------------//
//
// Calling sequences:
//
// 1. MapMatrix::disp()
// 2. SpriteArray::draw()
// 3. MapMatrix::draw_square()
//
void MapMatrix::draw_square()
{
//-------- draw the map-to-zoom highlight box --------//
static int squareFrameCount=0, squareFrameStep=1;
int x1=image_x1+(cur_x_loc-top_x_loc)*loc_width;
int y1=image_y1+(cur_y_loc-top_y_loc)*loc_height;
int x2=x1+cur_cargo_width *loc_width-1;
int y2=y1+cur_cargo_height*loc_height-1;
vga_back.rect( x1, y1, x2, y2, 1, VGA_YELLOW + squareFrameCount );
squareFrameCount += squareFrameStep;
if( squareFrameCount==0 ) // color with smaller number is brighter
squareFrameStep = 1;
if( squareFrameCount==6 ) // bi-directional color shift
squareFrameStep = -1;
}
//----------- End of function MapMatrix::draw_square ------------//
//-------- Begin of function MapMatrix::toggle_map_mode ------------//
void MapMatrix::toggle_map_mode(int modeId)
{
if( map_mode == modeId )
{
if( map_mode == MAP_MODE_POWER ) // clicking on a pressed button unclick the button
power_mode = !power_mode;
}
else
{
map_mode = modeId;
}
disp_mode_button(1); // 1-display the buttons on the front buffer.
refresh();
}
//---------- End of function MapMatrix::toggle_map_mode ------------//
//----------- Begin of function MapMatrix::detect_area -----------//
//
// Detect for click on a new zoom area, update the zoom window as well
//
// return : 0 - no action
// 1 - pressed on new cargo
// 2 - pressed on new cargo and also scrolled window
//
int MapMatrix::detect_area()
{
if( !mouse.press_area( image_x1,image_y1,image_x2,image_y2, 2 ) &&
!mouse.any_click( image_x1,image_y1,image_x2,image_y2, 2 ) )
{
return 0;
}
int rc = 0;
int lastXLoc = cur_x_loc;
int lastYLoc = cur_y_loc;
//--- if press left button, select zoom area ----//
if( mouse.single_click( image_x1,image_y1,image_x2,image_y2 ) ||
mouse.press_area( image_x1,image_y1,image_x2,image_y2, LEFT_BUTTON ) )
{
int xLoc = top_x_loc + (mouse.cur_x-image_x1)/loc_width;
int yLoc = top_y_loc + (mouse.cur_y-image_y1)/loc_height;
//-- if only single click, don't highlight new firm, only new area --//
cur_x_loc = xLoc - world.zoom_matrix->disp_x_loc/2;
cur_y_loc = yLoc - world.zoom_matrix->disp_y_loc/2;
if( !valid_cur_box() ) // valid_cur_box() return 1 if it has refreshed, 0 if didn't
disp();
rc=1;
}
//------- if the view area has been changed -------//
if( cur_x_loc != lastXLoc || cur_y_loc != lastYLoc )
{
world.zoom_matrix->top_x_loc = cur_x_loc;
world.zoom_matrix->top_y_loc = cur_y_loc;
sys.zoom_need_redraw = 1;
}
return rc;
}
//------------ End of function MapMatrix::detect_area ----------//