1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
enum // block types, order matters!
{
SOLID = 0, // entirely solid cube [only specifies wtex]
CORNER, // half full corner of a wall
FHF, // floor heightfield using neighbour vdelta values
CHF, // idem ceiling
SPACE, // entirely empty cube
SEMISOLID, // generated by mipmapping
MAXTYPE
};
struct sqr
{
uchar type; // one of the above
char floor, ceil; // height, in cubes
uchar wtex, ftex, ctex; // wall/floor/ceil texture ids
uchar r, g, b; // light value at upper left vertex
uchar vdelta; // vertex delta, used for heightfield cubes
char defer; // used in mipmapping, when true this cube is not a perfect mip
char occluded; // true when occluded
uchar utex; // upper wall tex id
uchar tag; // used by triggers
uchar visible; // temporarily used to flag the visibility of a cube (INVISWTEX, INVISUTEX, INVISIBLE)
uchar reserved;
};
struct servsqr // server variant of sqr
{
uchar type; // SOLID, etc. (also contains the two tagclip bits ORed in)
char floor, ceil; // height, in cubes
uchar vdelta; // vertex delta, used for heightfield cubes
};
enum // hardcoded texture numbers
{
DEFAULT_SKY = 0,
DEFAULT_LIQUID,
DEFAULT_WALL,
DEFAULT_FLOOR,
DEFAULT_CEIL
};
enum // stuff encoded in sqr.tag
{
TAGTRIGGERMASK = 0x3F, // room for old fashioned cube 1 triggers
TAGCLIP = 0x40, // clips all objects
TAGPLCLIP = 0x80 // clips only players
};
#define TAGANYCLIP (TAGCLIP|TAGPLCLIP)
enum
{
INVISWTEX = 1<<0,
INVISUTEX = 1<<1,
INVISIBLE = 1<<2
};
enum
{
MHF_AUTOMAPCONFIG = 1<<0, // autogenerate map-config during map save
MHF_DISABLEWATERREFLECT = 1 << 8, // force waterreflect to zero
MHF_LIMITWATERWAVEHEIGHT = 1 << 9, // limit waveheight to 0.1
MHF_DISABLESTENCILSHADOWS = 1 << 10 // force stencilshadow to 0
};
#define MAPVERSION 10 // default map format version to be written (bump if map format changes, see worldio.cpp)
struct header // map file format header
{
char head[4]; // "CUBE"
int version; // any >8bit quantity is little endian
int headersize; // sizeof(header)
int sfactor; // in bits
int numents;
char maptitle[128];
uchar texlists[3][256];
int waterlevel;
uchar watercolor[4];
int maprevision;
int ambient;
int flags; // MHF_*
int timestamp; // UTC unixtime of time of save (yes, this will break in 2038)
int reserved[10];
//char mediareq[128]; // version 7 and 8 only.
};
struct mapsoundline { string name; int maxuses; };
struct _mapconfigdata
{
string notexturename;
vector<mapsoundline> mapsoundlines;
void clear()
{
*notexturename = '\0';
mapsoundlines.shrink(0);
}
};
struct mapdim_s
{ // 0 2 1 3 6 7
int x1, x2, y1, y2, minfloor, maxceil; // outer borders (points to last used cube)
// 4 5
int xspan, yspan; // size of area between x1|y1 and x2|y2
float xm, ym; // middle of the map
};
#define MAS_VDELTA_QUANT 8
#define MAS_VDELTA_TABSIZE 5 // (hardcoded maximum of 15!)
#define MAS_VDELTA_THRES 3
#define MAS_GRID 8
#define MAS_GRID2 (MAS_GRID * MAS_GRID)
#define MAS_RESOLUTION 32 // rays (32 * 8)
struct mapareastats_s
{
int vdd[MAS_VDELTA_TABSIZE]; // vdelta-deltas (detect ugly steep heightfields)
int vdds; // vdd table reduced to an easy to check bitmask
int ppa[MAS_GRID2]; // area visible per probe point
int ppv[MAS_GRID2]; // volume visible per probe point
int total; // number of non-solid cubes on the map
int rest; // area not visible from any probe point
#ifndef STANDALONE
int steepest; // location of steepest vdelta
int ppp[MAS_GRID2]; // probe point position (client-only)
#endif
};
#define SWS(w,x,y,s) (&(w)[((y)<<(s))+(x)])
#define SW(w,x,y) SWS(w,x,y,sfactor)
#define S(x,y) SW(world,x,y) // convenient lookup of a lowest mip cube
#define SMALLEST_FACTOR 6 // determines number of mips there can be
#define DEFAULT_FACTOR 8
#define LARGEST_FACTOR 11 // 10 is already insane
#define MAXENTITIES 65535
#define MAXHEADEREXTRA (1<<20)
#define SOLID(x) ((x)->type==SOLID)
#define MINBORD 2 // 2 cubes from the edge of the world are always solid
#define OUTBORD(x,y) ((x)<MINBORD || (y)<MINBORD || (x)>=ssize-MINBORD || (y)>=ssize-MINBORD)
#define OUTBORDRAD(x,y,rad) (int(x-rad)<MINBORD || int(y-rad)<MINBORD || int(x+rad)>=ssize-MINBORD || (y+rad)>=ssize-MINBORD)
#define WATERLEVELSCALING 10
struct block { int x, y, xs, ys, h; short p[5]; };
// vertex array format
struct vertex { float u, v, x, y, z; uchar r, g, b, a; };
// map statistics
#define MINSPAWNS 5 // minimum number of spawns per team
#define MINFLAGDISTANCE 24 // w/o checking for walls between them // minimum flag entity distance (2D)
struct entitystats_s
{
int entcnt[MAXENTTYPES]; // simple count for every basic ent type
int spawns[3]; // number of spawns with valid attr2
int flags[2]; // number of flags with valid attr2
int flagents[2]; // entity indices of the flag ents
int pickups; // total number of pickup entities
int pickupdistance[LARGEST_FACTOR + 1]; // entity distance values grouped logarithmically
int flagentdistance; // distance of the two flag entities, if existing
int modes_possible; // bitmask of possible gamemodes, depending on flag and spawn entities
bool hasffaspawns; // has enough ffa spawns
bool hasteamspawns; // has enough team spawns
bool hasflags; // has exactly 2 valid flags
int unknownspawns, unknownflags; // attr2 is not valid
int firstclip; // index of first clipped entity
short first[MAXENTTYPES], last[MAXENTTYPES]; // first and last occurence of every basic ent type
};
|