/*
* 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 : OWARPT.CPP
// Description : War point
#include
#include
#include
#include
#include
// --------- define constant ---------//
// divide the map into zone, each zone has size WARPOINT_ZONE_SIZE
#define WARPOINT_ZONE_SIZE 8
#define WARPOINT_ZONE_COLUMN ((MAX_MAP_WIDTH + WARPOINT_ZONE_SIZE -1) / WARPOINT_ZONE_SIZE)
#define WARPOINT_ZONE_ROW ((MAX_MAP_HEIGHT + WARPOINT_ZONE_SIZE -1) / WARPOINT_ZONE_SIZE)
#define WARPOINT_STRENGTH 0x100000
#define WARPOINT_STRENGTH_MAX 0x1000000
#define DRAW_PHASE_PERIOD 16
// ---------- begin of function WarPoint::inc ----------//
void WarPoint::inc()
{
if( (strength += WARPOINT_STRENGTH) > WARPOINT_STRENGTH_MAX )
strength = WARPOINT_STRENGTH_MAX;
}
// ---------- end of function WarPoint::inc ----------//
// ---------- begin of function WarPoint::decay ----------//
inline void WarPoint::decay()
{
strength >>= 1;
}
// ---------- end of function WarPoint::decay ----------//
// ------ begin of function WarPointArray::WarPointArray -------//
WarPointArray::WarPointArray()
{
war_point = NULL;
init_flag = 0;
}
// ------ end of function WarPointArray::WarPointArray -------//
// ------ begin of function WarPointArray::~WarPointArray -------//
WarPointArray::~WarPointArray()
{
deinit();
}
// ------ end of function WarPointArray::~WarPointArray -------//
// ------ begin of function WarPointArray::init -------//
void WarPointArray::init()
{
deinit();
// allocate memory for war_point
war_point = (WarPoint *)mem_add( sizeof(WarPoint) * WARPOINT_ZONE_COLUMN * WARPOINT_ZONE_ROW );
memset(war_point, 0, sizeof(WarPoint) * WARPOINT_ZONE_COLUMN * WARPOINT_ZONE_ROW );
draw_phase = 0;
init_flag = 1;
}
// ------ end of function WarPointArray::init -------//
// ------ begin of function WarPointArray::deinit -------//
void WarPointArray::deinit()
{
if( init_flag )
{
mem_del(war_point);
init_flag = 0;
}
}
// ------ end of function WarPointArray::deinit -------//
// ------ begin of function WarPointArray::draw_dot -------//
void WarPointArray::draw_dot()
{
if( ++draw_phase >= DRAW_PHASE_PERIOD )
draw_phase = 0;
if( draw_phase & 1)
return;
static unsigned char dotColor[DRAW_PHASE_PERIOD/2] =
{ 0xa0, 0xa4, 0xa8, 0x00, 0xb0, 0xb4, 0xb8, 0x00 };
unsigned char color = dotColor[draw_phase / 2];
int x,y;
short mapY;
unsigned char *writePtr;
unsigned char *vgaBufPtr = (unsigned char *)vga_back.buf_ptr();
int vgaBufPitch = vga_back.buf_pitch();
for( y = 0, mapY=MAP_Y1; y < WARPOINT_ZONE_ROW; ++y, mapY+=WARPOINT_ZONE_SIZE)
{
WarPoint *warPt = war_point + y * WARPOINT_ZONE_COLUMN;
writePtr = vgaBufPtr + vgaBufPitch * mapY + MAP_X1;
for( x = 0; x < WARPOINT_ZONE_COLUMN; ++x, ++warPt, writePtr+=WARPOINT_ZONE_SIZE)
{
if( warPt->strength > 0 )
{
// draw a cross, UNEXPLORED_COLOR is not needed to check
unsigned char *map1Ptr = writePtr;
unsigned char *map2Ptr = writePtr + WARPOINT_ZONE_SIZE-2;
for( int i = 1; i < WARPOINT_ZONE_SIZE; ++i )
{
*map1Ptr = color;
*map2Ptr = color;
map1Ptr += vgaBufPitch + 1;
map2Ptr += vgaBufPitch - 1;
}
}
}
}
}
// ------ end of function WarPointArray::draw_dot -------//
// ------ begin of function WarPointArray::process -------//
void WarPointArray::process()
{
WarPoint *warPt = war_point;
for( int i = WARPOINT_ZONE_COLUMN * WARPOINT_ZONE_ROW; i > 0; --i, warPt++)
{
warPt->decay();
}
}
// ------ end of function WarPointArray::process -------//
// ------ begin of function WarPointArray::get_ptr -------//
WarPoint *WarPointArray::get_ptr(int xLoc, int yLoc)
{
err_when(!init_flag);
int c = xLoc / WARPOINT_ZONE_SIZE;
int r = yLoc / WARPOINT_ZONE_SIZE;
err_when( c < 0 || c >= WARPOINT_ZONE_COLUMN);
err_when( r < 0 || r >= WARPOINT_ZONE_ROW);
return war_point+ (r * WARPOINT_ZONE_COLUMN + c);
}
// ------ end of function WarPointArray::get_ptr -------//
// ------ begin of function WarPointArray::add_point -------//
void WarPointArray::add_point(int xLoc, int yLoc)
{
get_ptr(xLoc, yLoc)->inc();
}
// ------ end of function WarPointArray::add_point -------//