/* * 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 : ORAIN2.CPP // Description : class Rain // Ownership : Gilbert #include #include //------- Begin of function Rain::start_rain --------------// // // short density = no. of drop created per turn (usually 2 to 12) // double slop = slop of the rain drop, 0.0 if no wind (fall vertically) // +ve for right, -ve for left. void Rain::start_rain(int x1, int y1, int x2, int y2, short density, double slope) { bound_x1 = x1; bound_y1 = y1; bound_x2 = x2; bound_y2 = y2; wind_slope = slope; drop_per_turn = density; clear(); last_drop = -1; } //------- End of function Rain::start_rain --------------// //------- Begin of function Rain::clear --------------// // void Rain::clear() { for(int i = 0; i < MAX_RAINDROP; ++i) { drop_flag[i] = 0; spot_flag[i] = 0; } active_drop = 0; active_spot = 0; } //------- End of function Rain::clear --------------// //------- Begin of function Rain::stop_rain --------------// // void Rain::stop_rain() { drop_per_turn = 0; } //------- End of function Rain::stop_rain --------------// //------- Begin of function Rain::new_drops --------------// // void Rain::new_drops() { short dropRemain = drop_per_turn; short maxScan = MAX_RAINDROP; short i = last_drop; while(dropRemain > 0 && maxScan-- > 0) { i = (i + 1) % MAX_RAINDROP; if( !drop_flag[i]) { short fromX = bound_x1+rand_seed()%(bound_x2-bound_x1); short height = (bound_y2-bound_y1)/8 + rand_seed()%(((bound_y2-bound_y1)*7)/8); short speed = height / 4; drop[i].init(this, fromX, (short)bound_y1, short(fromX+height*wind_slope), short(bound_y1+height), speed ); drop_flag[i] = 1; active_drop++; dropRemain--; last_drop = i; } } } //------- End of function Rain::new_drops --------------// //------- Begin of function Rain::new_spot ---------// void Rain::new_spot(short x, short y) { short spotRemain = 1; short maxScan = MAX_RAINDROP; short i = last_spot; while(spotRemain > 0 && maxScan-- > 0) { i = (i + 1) % MAX_RAINDROP; if( !spot_flag[i]) { spot[i].init(this, x,y, drop_per_turn>4 ? 6:4); spot_flag[i] = 1; active_spot++; spotRemain--; last_spot = i; } } } //------- End of function Rain::new_spot ---------// //------- Begin of function Rain::draw_step --------------// // note : call Rain::new_drops before Rain::draw_step // void Rain::draw_step(VgaBuf *vgabuf) { // --------- draw rain spot ------- // int i; for(i = 0; i < MAX_RAINDROP; ++i) { if( spot_flag[i]) { spot[i].draw_step(vgabuf); spot_flag[i] = !spot[i].is_goal(); } } // --------- draw rain drop ------- // for(i = 0; i < MAX_RAINDROP; ++i) { if(drop_flag[i]) { drop[i].draw_step(vgabuf); if( drop[i].is_goal() ) { new_spot(drop[i].dest_x, drop[i].dest_y); drop_flag[i] = 0; } } } } //------- End of function Rain::draw_step --------------// //------- Begin of function Rain::is_all_clear --------------// // int Rain::is_all_clear() { int count = 0; int i; for(i = 0; i < MAX_RAINDROP; ++i) if(drop_flag[i]) count++; // update active_drop; active_drop = count; int count2 = 0; for(i = 0; i < MAX_RAINDROP; ++i) if(spot_flag[i]) count2++; // update active_spot; active_spot = count2; return (count+count2 > 0); } //------- End of function Rain::is_all_clear --------------// //------- Begin of function Rain::rand_seed --------------// // unsigned Rain::rand_seed() { #define MULTIPLIER 0x015a4e35L #define INCREMENT 1 seed = MULTIPLIER * seed + INCREMENT; return seed; } //------- End of function Rain::rand_seed --------------//