/* * 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 : OSNOWRES.CPP // Description : Snow Resource // Onwer : Gilbert #include #include #include #include #include // --------- define constant --------// #define SNOW_DB "SNOWG" // ------- Begin of function SnowInfo::draw_at ------// void SnowInfo::draw_at(short absX, short absY) { //----------- calculate absolute positions ------------// int absX1 = absX + offset_x; int absY1 = absY + offset_y; //----------- use fast method for non-gate square short bitmapWidth = bitmap_width(); short bitmapHeight = bitmap_height(); int absX2 = absX1 + bitmapWidth - 1; int absY2 = absY1 + bitmapHeight - 1; //-------- check if the firm is within the view area --------// int x1 = absX1 - World::view_top_x; if( x1 <= -bitmapWidth || x1 >= ZOOM_WIDTH ) // out of the view area, not even a slight part of it appears in the view area return; int y1 = absY1 - World::view_top_y; if( y1 <= -bitmapHeight || y1 >= ZOOM_HEIGHT ) return; //------- decide which approach to use for displaying -----// int x2 = absX2 - World::view_top_x; int y2 = absY2 - World::view_top_y; //---- only portion of the sprite is inside the view area ------// if( x1 < 0 || x2 >= ZOOM_WIDTH || y1 < 0 || y2 >= ZOOM_HEIGHT ) { // no put_bitmap_area_remap vga_back.put_bitmap_area_trans_decompress( x1+ZOOM_X1, y1+ZOOM_Y1, bitmap_ptr, max(0,x1)-x1, max(0,y1)-y1, min(ZOOM_WIDTH-1,x2)-x1, min(ZOOM_HEIGHT-1,y2)-y1); } else //---- the whole sprite is inside the view area ------// { vga_back.put_bitmap_trans_decompress( x1+ZOOM_X1, y1+ZOOM_Y1, bitmap_ptr); } } // ------- End of function SnowInfo::draw_at ------// // ------- Begin of function SnowRes::SnowRes ------// SnowRes::SnowRes() { init_flag = 0; } // ------- End of function SnowRes::SnowRes ------// // ------- Begin of function SnowRes::~SnowRes ------// SnowRes::~SnowRes() { deinit(); } // ------- End of function SnowRes::~SnowRes ------// // ------- Begin of function SnowRes::init ------// void SnowRes::init() { deinit(); //----- open snow ground bitmap resource file -------// String str; str = DIR_RES; str += "I_SNOW.RES"; res_bitmap.init_imported(str,1); // 1-read all into buffer //------- load database information --------// load_info(); init_flag=1; } // ------- End of function SnowRes::init ------// // ------- Begin of function SnowRes::deinit ------// void SnowRes::deinit() { if( init_flag ) { mem_del( snow_info_array ); mem_del( root_info_array ); init_flag = 0; } } // ------- End of function SnowRes::deinit ------// // ------- Begin of function SnowRes::load_info ------// void SnowRes::load_info() { SnowRec *snowRec; SnowInfo *snowInfo; int i; long bitmapOffset; //---- read in snow map count and initialize snow info array ----// Database *dbSnow = game_set.open_db(SNOW_DB); // only one database can be opened at a time snow_info_count = (int) dbSnow->rec_count(); snow_info_array = (SnowInfo *) mem_add(sizeof(SnowInfo) * snow_info_count ); memset( snow_info_array, 0, sizeof(SnowInfo) * snow_info_count ); root_count = 0; //---------- read in SNOWG.DBF ---------// for( i=0 ; iread(i+1); snowInfo = snow_info_array+i; snowInfo->snow_map_id = i+1; memcpy( &bitmapOffset, snowRec->bitmap_ptr, sizeof(long) ); snowInfo->bitmap_ptr = res_bitmap.read_imported(bitmapOffset); if( snowRec->offset_x[0] != '\0' && snowRec->offset_x[0] != ' ') snowInfo->offset_x = (short) m.atoi(snowRec->offset_x, snowRec->OFFSET_LEN); else snowInfo->offset_x = -(snowInfo->bitmap_width() / 2); if( snowRec->offset_y[0] != '\0' && snowRec->offset_y[0] != ' ') snowInfo->offset_y = (short) m.atoi(snowRec->offset_y, snowRec->OFFSET_LEN); else snowInfo->offset_y = -(snowInfo->bitmap_height() / 2); snowInfo->next_count = 0; snowInfo->prev_count = 0; if( snowRec->next_file1[0] != '\0' && snowRec->next_file1[0] != ' ') { snowInfo->next_file[snowInfo->next_count++] = snow_info_array + m.atoi( snowRec->next_ptr1, snowRec->RECNO_LEN) -1; } if( snowRec->next_file2[0] != '\0' && snowRec->next_file2[0] != ' ') { snowInfo->next_file[snowInfo->next_count++] = snow_info_array + m.atoi( snowRec->next_ptr2, snowRec->RECNO_LEN) -1; } if( snowRec->next_file3[0] != '\0' && snowRec->next_file3[0] != ' ') { snowInfo->next_file[snowInfo->next_count++] = snow_info_array + m.atoi( snowRec->next_ptr3, snowRec->RECNO_LEN) -1; } if( snowRec->next_file4[0] != '\0' && snowRec->next_file4[0] != ' ') { snowInfo->next_file[snowInfo->next_count++] = snow_info_array + m.atoi( snowRec->next_ptr4, snowRec->RECNO_LEN) -1; } if( snowRec->prev_file1[0] != '\0' && snowRec->prev_file1[0] != ' ') { snowInfo->prev_file[snowInfo->prev_count++] = snow_info_array + m.atoi( snowRec->prev_ptr1, snowRec->RECNO_LEN) -1; } if( snowRec->prev_file2[0] != '\0' && snowRec->prev_file2[0] != ' ') { snowInfo->prev_file[snowInfo->prev_count++] = snow_info_array + m.atoi( snowRec->prev_ptr2, snowRec->RECNO_LEN) -1; } if(snowInfo->is_root()) { root_count++; } } root_info_array = (SnowInfo **)mem_add(sizeof(SnowInfo *) * root_count); unsigned j = 0; for( i=0 ; iis_root()) { root_info_array[j++] = snowInfo; if( j >= root_count) break; } } } // ------- End of function SnowRes::load_info ------// // ------- Begin of function SnowRes::rand_root ------// int SnowRes::rand_root(unsigned rand) { err_when(!init_flag); if( root_count > 0) { return root_info_array[rand % root_count]->snow_map_id; } return NULL; } // ------- End of function SnowRes::rand_root ------// #ifdef DEBUG // ------- Begin of function SnowRes::operator[] ------// SnowInfo * SnowRes::operator[](int snowMapId) { err_when( snowMapId < 1 || snowMapId > snow_info_count ); err_when( snow_info_array[snowMapId-1].snow_map_id != snowMapId); return snow_info_array + snowMapId -1; } // ------- End of function SnowRes::operator[] ------// #endif