/*
* 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 : OROCKRES.H
//Description : Header file of object RockRes
//Owner : Gilbert
#ifndef __OROCKRES_H
#define __OROCKRES_H
#include
#include
// ----------- Define constant ----------//
#define ROCK_BLOCKING_TYPE 'R'
#define DIRT_NON_BLOCKING_TYPE 'D'
#define DIRT_BLOCKING_TYPE 'E'
#define MAX_ROCK_WIDTH 4
#define MAX_ROCK_HEIGHT 4
// ----------- Define struct RockRec -----------//
struct RockRec
{
enum { ROCKID_LEN=5, LOC_LEN=2, RECNO_LEN=4, MAX_FRAME_LEN=2 };
char rock_id[ROCKID_LEN];
char rock_type;
char loc_width[LOC_LEN];
char loc_height[LOC_LEN];
char terrain_1;
char terrain_2;
char first_anim_recno[RECNO_LEN];
char max_frame[MAX_FRAME_LEN];
};
// ----------- Define struct RockBlockRec ---------//
struct RockBlockRec
{
enum { ROCKID_LEN=5, LOC_LEN=2, RECNO_LEN=4 };
char rock_id[ROCKID_LEN];
char loc_x[LOC_LEN];
char loc_y[LOC_LEN];
char rock_recno[RECNO_LEN];
char first_bitmap[RECNO_LEN];
};
// ------------ Define struct RockBitmapRec ---------//
struct RockBitmapRec
{
enum { ROCKID_LEN=5, LOC_LEN=2, FRAME_NO_LEN=2, FILE_NAME_LEN=8,
BITMAP_PTR_LEN=4};
char rock_id[ROCKID_LEN];
char loc_x[LOC_LEN];
char loc_y[LOC_LEN];
char frame[FRAME_NO_LEN];
char file_name[FILE_NAME_LEN];
char bitmap_ptr[BITMAP_PTR_LEN];
};
// ------------ Define struct RockAnimRec --------//
struct RockAnimRec
{
enum { ROCKID_LEN=5, FRAME_NO_LEN=2, DELAY_LEN=3 };
char rock_id[ROCKID_LEN];
char frame[FRAME_NO_LEN];
char delay[DELAY_LEN];
char next_frame[FRAME_NO_LEN];
char alt_next[FRAME_NO_LEN];
};
// ----------- Define struct RockInfo -----------//
struct RockInfo
{
enum { ROCKID_LEN=5 };
char rock_name[ROCKID_LEN+1];
char rock_type;
char loc_width;
char loc_height;
char terrain_1; // TerrainTypeCode
char terrain_2; // TerrainTypeCode
short first_anim_recno;
char max_frame;
short first_block_recno;
short block_offset[MAX_ROCK_HEIGHT][MAX_ROCK_WIDTH]; // make RockRes::locate_block faster
int valid_terrain(char terrainType) { return terrainType >= terrain_1 && terrainType <= terrain_2; }
};
// ----------- Define struct RockBlockInfo ---------//
struct RockBlockInfo
{
char loc_x;
char loc_y;
short rock_recno; // recno in RockRec/RockInfo
short first_bitmap; // recno in RockBitmapRec/RockBitmapInfo
};
// ------------ Define struct RockBitmapInfo ---------//
struct RockBitmapInfo
{
char loc_x; // checking only
char loc_y; // checking only
char frame; // checking only
char* bitmap_ptr;
short width() { return *(short *)bitmap_ptr; }
short height() { return *(((short *)bitmap_ptr)+1); }
void draw(short xLoc, short yLoc);
};
// ------------ Define struct RockAnimInfo --------//
struct RockAnimInfo
{
char frame; // checking only
char delay;
char next_frame;
char alt_next;
char choose_next(long path) { return path ? next_frame : alt_next; }
};
// ------------ Define class RockRes -----------//
class RockRes
{
public:
int init_flag;
int rock_info_count;
RockInfo* rock_info_array;
int rock_block_count;
RockBlockInfo* rock_block_array;
int rock_bitmap_count;
RockBitmapInfo* rock_bitmap_array;
int rock_anim_count;
RockAnimInfo* rock_anim_array;
ResourceDb res_bitmap;
public:
RockRes();
~RockRes();
void init();
void deinit();
RockInfo* get_rock_info(short rockRecno);
RockBlockInfo* get_block_info(short rockBlockRecno);
RockBitmapInfo* get_bitmap_info(short rockBitmapRecno);
RockAnimInfo* get_anim_info(short rockAnimRecno);
char choose_next(short rockRecno, char curFrame, long path);
void draw(short rockRecno, short xLoc, short yLoc, char curFrame);
void draw_block(short rockRecno, short xLoc, short yLoc,
short offsetX, short offsetY, char curFrame);
RockBlockInfo* operator[](short rockBlockRecno)
{ return rock_block_array + rockBlockRecno -1; }
// ###### begin Gilbert 24/9 ########//
// return rockRecno
short search(char *rockTypes, short minWidth, short maxWidth,
short minHeight, short maxHeight, int animatedFlag=-1, int findFirst=0,
char terrainType=0);
// ###### end Gilbert 24/9 ########//
short locate(char *rockName);
// return rockBlockRecno
short locate_block(short rockRecno, short xLoc, short yLoc);
// return rockBitmapRecno
short get_bitmap_recno(short rockBlockRecno, char curFrame);
// return rockAnimRecno
short get_anim_recno(short rockRecno, char curFrame);
private:
void load_info();
void load_block_info();
void load_bitmap_info();
void load_anim_info();
};
extern RockRes rock_res;
#endif