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 }; enum // hardcoded texture numbers { DEFAULT_SKY = 0, DEFAULT_LIQUID, DEFAULT_WALL, DEFAULT_FLOOR, DEFAULT_CEIL }; #define MAPVERSION 6 // 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 reserved[14]; }; struct mapstats { struct header hdr; int entcnt[MAXENTTYPES]; uchar *enttypes; int spawns[3]; int flags[2]; bool hasffaspawns; bool hasteamspawns; bool hasflags; }; #define TRANSFORMOLDENTITIES(headr) \ if(e.type==LIGHT) \ { \ if(!e.attr2) e.attr2 = 255; /* needed for MAPVERSION<=2 */ \ if(e.attr1>32) e.attr1 = 32; /* 12_03 and below */ \ } \ if(headr.versiontype==SOLID) #define MINBORD 2 // 2 cubes from the edge of the world are always solid #define OUTBORD(x,y) ((x)=ssize-MINBORD || (y)>=ssize-MINBORD) #define OUTBORDRAD(x,y,rad) (int(x-rad)=ssize-MINBORD || (y+rad)>=ssize-MINBORD) struct block { int x, y, xs, ys; }; // vertex array format struct vertex { float u, v, x, y, z; uchar r, g, b, a; };