File: world.h

package info (click to toggle)
assaultcube 1.3.0.2%2Bdfsg-5
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid, trixie
  • size: 4,344 kB
  • sloc: cpp: 56,878; sh: 11,155; ansic: 4,544; makefile: 385
file content (170 lines) | stat: -rw-r--r-- 6,847 bytes parent folder | download
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
};