/*
* 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 : OSNOW1.CPP
// Description: class SnowLayer
// Onwership : Gilbert
#include
#include
#include
#include
//---------- Define constant -------------//
// #### begin Gilbert 8/5 ######//
const char SNOW_COLOUR1 = char(VGA_GRAY+8);
const char SNOW_COLOUR2 = char(VGA_GRAY+11);
const char SNOW_COLOUR3 = char(VGA_GRAY+14);
// #### end Gilbert 8/5 ######//
//---------- Begin of function SnowLayer::set_bound -----//
//
void SnowLayer::set_bound(int x1, int y1, int x2, int y2)
{
bound_x1 = x1;
bound_y1 = y1;
bound_x2 = x2;
bound_y2 = y2;
}
//---------- End of function SnowLayer::set_bound -----//
//---------- Begin of function SnowLayer::init -----//
//
void SnowLayer::init(short h, short v, short speed, short amp, short r,
double s, char animSpeed, short initPeriod)
{
h_sep = h;
v_sep = v;
seed = r + h*2 + v*5 + speed*7;
fall_speed = speed;
amplitude = amp;
radius = r;
snow_x = bound_x1 + random(h_sep) + r;
snow_y = bound_y1 + r -1;
slide_speed = (short)(s * fall_speed);
blind_site = (char)(h + v) % 3; // random number?
anim_speed = animSpeed;
anim_phase = 0;
period = initPeriod;
}
//---------- End of function SnowLayer::init -----//
//---------- Begin of function SnowLayer::fall -----//
//
void SnowLayer::fall()
{
for( anim_phase += anim_speed; anim_phase >= 10; anim_phase -= 10)
{
snow_y = snow_y + fall_speed;
while( snow_y - radius - bound_y1 >= v_sep)
{
snow_y -= v_sep;
blind_site = (blind_site + 1) % 3;
if(++period > 1000)
period = 1000;
}
snow_x += random(amplitude * 2 + 1) - amplitude + slide_speed;
if( snow_x - radius < bound_x1 )
{
snow_x += h_sep;
blind_site = (blind_site + 2) % 3;
}
else if( snow_x - radius - bound_x1 >= h_sep)
{
snow_x -= h_sep;
blind_site = (blind_site + 1) % 3;
}
}
}
//---------- End of function SnowLayer::fall -----//
//---------- Begin of function SnowLayer::draw_step -----//
// note : blind_site is ranging from 0 to 2.
// if the total (cx+cy) % 3 is equal to blind_site, the snow
// is not displayed.
// Therefore one third of the snow is not displayed.
// The snow layer doesn't look too regular.
//
// blind_site is adjusted in SnowLayer::fall() such that
// snow doesn't disappear suddenly.
//
void SnowLayer::draw_step(VgaBuf *vgabuf)
{
int sx, sy, cx, cy;
int vPitch = vgabuf->buf_pitch();
char *dotPt;
fall();
switch(radius)
{
case 1:
for(sy = snow_y, cy=0; sy < bound_y2 && cy < period; sy+= v_sep, ++cy)
{
for( sx = snow_x, cx=0; sx < bound_x2; sx += h_sep, ++cx)
{
if((cx+cy) % 3 != blind_site)
{
dotPt = vgabuf->buf_ptr() + vPitch*(sy-1) + sx-1;
*dotPt++ = SNOW_COLOUR1;
*dotPt++ = SNOW_COLOUR2;
*dotPt = SNOW_COLOUR1;
dotPt += vPitch - 2;
*dotPt++ = SNOW_COLOUR2;
*dotPt++ = SNOW_COLOUR3;
*dotPt = SNOW_COLOUR2;
dotPt += vPitch - 2;
*dotPt++ = SNOW_COLOUR1;
*dotPt++ = SNOW_COLOUR2;
*dotPt = SNOW_COLOUR1;
}
}
}
case 0:
for(sy = snow_y,cy =0; sy <= bound_y2 && cy < period; sy+= v_sep, ++cy)
{
for( sx = snow_x, cx=0; sx <= bound_x2; sx += h_sep, ++cx)
{
if( (cx+cy) % 3 != blind_site)
{
vgabuf->draw_pixel(sx, sy, SNOW_COLOUR3);
}
}
}
break;
default:
err_now("undefined snow radius");
}
}
//---------- End of function SnowLayer::draw_step -----//
//---------- Begin of function SnowLayer::random -----//
unsigned SnowLayer::random(unsigned bound)
{
#define MULTIPLIER 0x015a4e35L
#define INCREMENT 1
seed = MULTIPLIER * seed + INCREMENT;
return seed % bound;
}
//---------- End of function SnowLayer::random -----//