Subversion Repositories eduke32

Rev

Rev 6055 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5 Plagman 1
// "Build Engine & Tools" Copyright (c) 1993-1997 Ken Silverman
2
// Ken Silverman's official web site: "http://www.advsys.net/ken"
3
// See the included license file "BUILDLIC.TXT" for license info.
4
//
5
// This file has been modified from Ken Silverman's original release
2456 hendricks2 6
// by Jonathon Fowler (jf@jonof.id.au)
5 Plagman 7
 
8
#include "compat.h"
9
#include "pragmas.h"
10
 
11
#define MAXWADS 4096
12
#define MAXPOINTS 8192
13
#define MAXLINES 8192
14
#define MAXSIDES 8192
15
#define MAXSECTS 2048
16
#define MAXTHINGS 4096
17
#define MAXTEXTS 1024
18
#define MAXPNAMES 1024
19
#define MAXTHINGTYPES 3072
20
 
21
#define MAXSECTORS 1024
22
#define MAXWALLS 8192
23
#define MAXSPRITES 4096
24
 
25
static unsigned short sqrtable[4096], shlookup[4096+256];
26
 
27
static char iwadata[MAXWADS][9];
584 terminx 28
static int inumwads, iwadstart, iwadplc[MAXWADS], iwadlen[MAXWADS];
5 Plagman 29
 
30
static char pwadata[MAXWADS][9];
584 terminx 31
static int pnumwads, pwadstart, pwadplc[MAXWADS], pwadlen[MAXWADS];
5 Plagman 32
 
33
static short px[MAXPOINTS], py[MAXPOINTS];
34
 
35
typedef struct
36
{
2473 hendricks2 37
    short p1, p2, flags, special, tag;
38
    short side1, side2;   //If side2 = -1, no left
5 Plagman 39
} linedeftype;
40
static linedeftype line[MAXLINES];
41
 
42
typedef struct
43
{
2473 hendricks2 44
    short xoffset, yoffset;
45
    char uppertexture[8], lowertexture[8], middletexture[8];
46
    short sect;
5 Plagman 47
} sidedeftype;
48
static sidedeftype side[MAXSIDES];
49
static short sidetoppic[MAXSIDES], sidebotpic[MAXSIDES], sidemidpic[MAXSIDES];
50
 
51
typedef struct
52
{
2473 hendricks2 53
    short floorz, ceilingz;
54
    char floorpic[8], ceilingpic[8];
55
    short shade, type, tag;
5 Plagman 56
} secttype;
57
static secttype sect[MAXSECTS];
58
static short sectspri[MAXSECTS][8];
59
 
60
typedef struct
61
{
2473 hendricks2 62
    short x, y, ang, type, options;
5 Plagman 63
} thingtype;
64
static thingtype thing[MAXTHINGS];
65
 
66
static char textname[MAXTEXTS][9];
584 terminx 67
static int textoffs[MAXTEXTS];
5 Plagman 68
static short textpname[MAXTEXTS];
69
 
70
static char pname[MAXPNAMES][9];
71
 
2473 hendricks2 72
    //Build map-linking variables
5 Plagman 73
static short picindex[MAXPOINTS], linindex[MAXPOINTS];
74
static short wx[MAXPOINTS], wy[MAXPOINTS], wx2[MAXPOINTS], wy2[MAXPOINTS];
75
static short point2[MAXPOINTS], slist[MAXPOINTS], sectorofwall[MAXPOINTS];
76
 
77
typedef struct
78
{
2473 hendricks2 79
    short wallptr, wallnum;
80
    int ceilingz, floorz;
81
    short ceilingstat, floorstat;
82
    short ceilingpicnum, ceilingheinum;
83
    signed char ceilingshade;
84
    char ceilingpal, ceilingxpanning, ceilingypanning;
85
    short floorpicnum, floorheinum;
86
    signed char floorshade;
87
    char floorpal, floorxpanning, floorypanning;
88
    char visibility, filler;
89
    short lotag, hitag, extra;
5 Plagman 90
} sectortype;
91
 
92
typedef struct
93
{
2473 hendricks2 94
    int x, y;
95
    short point2, nextwall, nextsector, cstat;
96
    short picnum, overpicnum;
97
    signed char shade;
98
    char pal, xrepeat, yrepeat, xpanning, ypanning;
99
    short lotag, hitag, extra;
5 Plagman 100
} walltype;
101
 
102
typedef struct
103
{
2473 hendricks2 104
    int x, y, z;
105
    short cstat, picnum;
106
    signed char shade;
107
    char pal, clipdist, filler;
108
    unsigned char xrepeat, yrepeat;
109
    signed char xoffset, yoffset;
110
    short sectnum, statnum;
111
    short ang, owner, xvel, yvel, zvel;
112
    short lotag, hitag, extra;
5 Plagman 113
} spritetype;
114
 
115
static sectortype sector[MAXSECTORS];
116
static walltype wall[MAXWALLS];
117
static spritetype sprite[MAXSPRITES];
118
 
119
static char tempbuf[16384];
120
static short tempshort[4096];
121
 
122
 
2473 hendricks2 123
    //SCRIPT parsing variables:
5 Plagman 124
static char scriptname[16];
125
static char filebuf[16384];
584 terminx 126
static int filhandle, filpos, fileng;
5 Plagman 127
 
128
static char definemode = 0, define[16384], *defineptr[4096];
584 terminx 129
static int defineval[16384], definecnt = 0, numdefines = 0;
5 Plagman 130
 
131
static char thingtypemode = 0;
584 terminx 132
static int thingnum[1024], thingnum2[1024], thingoff[1024], numthings = 0;
5 Plagman 133
static short thingfield[4096];
134
static char thingop[4096];
584 terminx 135
static int thingval[4096], thingopnum = 0;
5 Plagman 136
 
137
static char texturelookupmode = 0;
138
static short texturelookup[4096];
139
 
140
static char tagtypemode = 0;
584 terminx 141
static int tagnum[1024], tagnum2[1024], tagoff[1024], numtags = 0;
2472 hendricks2 142
static char tagop[4096];
5 Plagman 143
static short tagfield[4096];
584 terminx 144
static int tagval[4096], tagopnum = 0;
5 Plagman 145
 
146
static char sectypemode = 0;
584 terminx 147
static int secnum[1024], secnum2[1024], secoff[1024], numsecs = 0;
5 Plagman 148
static short secfield[4096];
149
static char secop[4096];
584 terminx 150
static int secval[4096], secopnum = 0;
5 Plagman 151
 
152
#define THINGLISTNUM 123
153
static short thinglookup[MAXTHINGTYPES];
3122 hendricks2 154
typedef struct { short num; char name[9]; } thinglisttype;
5 Plagman 155
static thinglisttype thinglist[THINGLISTNUM] =
156
{{1,"PLAYA1"},{2,"PLAYA1"},{3,"PLAYA1"},{4,"PLAYA1"},{11,"PLAYA1"},{14,""},{3004,"POSSA1"},
157
{84,"SSWVA1"},{9,"SPOSA1"},{65,"CPOSA1"},{3001,"TROOA1"},{3002,"SARGA1"},{58,"SARGA1"},
158
{3006,"SKULA1"},{3005,"HEADA1"},{69,"BOS2A1C1"},{3003,"BOSSA1"},{68,"BSPIA1D1"},
159
{71,"PAINA1"},{66,"SKELA1D1"},{67,"FATTA1"},{64,"VILEA1D1"},{7,"SPIDA1D1"},{16,"CYBRA1"},
160
{88,""},{89,""},{87,""},{2005,"CSAWA0"},{2001,"SHOTA0"},{82,"SGN2A0"},{2002,"MGUNA0"},
161
{2003,"LAUNA0"},{2004,"PLASA0"},{2006,"BFUGA0"},{2007,"CLIPA0"},{2008,"SHELA0"},
162
{2010,"ROCKA0"},{2047,"CELLA0"},{2048,"AMMOA0"},{2049,"SBOXA0"},{2046,"BROKA0"},
163
{17,"CELPA0"},{8,"BPAKA0"},{2011,"STIMA0"},{2012,"MEDIA0"},{2014,"BON1A0"},
164
{2015,"BON2A0"},{2018,"ARM1A0"},{2019,"ARM2A0"},{83,"MEGAA0"},{2013,"SOULA0"},
165
{2022,"PINVA0"},{2023,"PSTRA0"},{2024,"PINSA0"},{2025,"SUITA0"},{2026,"PMAPA0"},
166
{2045,"PVISA0"},{5,"BKEYA0"},{40,"BSKUA0"},{13,"RKEYA0"},{38,"RSKUA0"},{6,"YKEYA0"},
167
{39,"YSKUA0"},{2035,"BAR1A0"},{72,"KEENA0"},{48,"ELECA0"},{30,"COL1A0"},{32,"COL3A0"},
168
{31,"COL2A0"},{36,"COL5A0"},{33,"COL4A0"},{37,"COL6A0"},{47,"SMITA0"},{43,"TRE1A0"},
169
{54,"TRE2A0"},{2028,"COLUA0"},{85,"TLMPA0"},{86,"TLP2A0"},{34,"CANDA0"},{35,"CBRAA0"},
170
{44,"TBLUA0"},{45,"TGRNA0"},{46,"TREDA0"},{55,"SMBTA0"},{56,"SMGTA0"},{57,"SMRTA0"},
171
{70,"FCANA0"},{41,"CEYEA0"},{42,"FSKUA0"},{49,"GOR1A0"},{63,"GOR1A0"},{50,"GOR2A0"},
172
{59,"GOR2A0"},{52,"GOR4A0"},{60,"GOR4A0"},{51,"GOR5A0"},{61,"GOR5A0"},{53,"HDB1A0"},
173
{62,"HDB2A0"},{73,"GOR3A0"},{74,"GOR3A0"},{75,"HDB3A0"},{76,"HDB4A0"},{77,"HDB5A0"},
174
{78,"HDB6A0"},{25,"POL1A0"},{26,"BBRNA0"},{27,"POL4A0"},{28,"POL2A0"},{29,"POL3A0"},
175
{10,"PLAYW0"},{12,"PLAYW0"},{24,"POB1A0"},{79,"POB2A0"},{80,"POB2A0"},{81,"BRS1A0"},
176
{15,"PLAYN0"},{18,"POSSL0"},{19,"SPOSL0"},{20,"TROOM0"},{21,"SARGN0"},{22,"HEADL0"},
177
{23,""}};
178
 
179
// These three were nicked from Build's engine.c.
584 terminx 180
static inline unsigned int ksqrtasm(unsigned int a)
5 Plagman 181
{
2473 hendricks2 182
    unsigned short c;
5 Plagman 183
 
2473 hendricks2 184
    if (a & 0xff000000) c = shlookup[(a >> 24) + 4096];
185
    else c = shlookup[a >> 12];
186
    a >>= c&0xff;
187
    a = (a&0xffff0000)|(sqrtable[a]);
188
    a >>= ((c&0xff00) >> 8);
5 Plagman 189
 
2473 hendricks2 190
    return a;
5 Plagman 191
}
192
 
584 terminx 193
static inline int msqrtasm(unsigned int c)
5 Plagman 194
{
2473 hendricks2 195
    unsigned int a,b;
5 Plagman 196
 
2473 hendricks2 197
    a = 0x40000000l;
198
    b = 0x20000000l;
199
    do {
200
        if (c >= a) {
201
            c -= a;
202
            a += b*4;
203
        }
204
        a -= b;
205
        a >>= 1;
206
        b >>= 2;
207
    } while (b);
208
    if (c >= a) a++;
209
    a >>= 1;
210
    return a;
5 Plagman 211
}
212
 
213
static void initksqrt(void)
214
{
2473 hendricks2 215
    int i, j, k;
5 Plagman 216
 
2473 hendricks2 217
    j = 1; k = 0;
218
    for(i=0;i<4096;i++)
219
    {
220
        if (i >= j) { j <<= 2; k++; }
221
        sqrtable[i] = (unsigned short)(msqrtasm((i<<18)+131072)<<1);
222
        shlookup[i] = (k<<1)+((10-k)<<8);
223
        if (i < 256) shlookup[i+4096] = ((k+6)<<1)+((10-(k+6))<<8);
224
    }
5 Plagman 225
}
226
 
227
 
584 terminx 228
int inside(int x, int y, short sectnum)
5 Plagman 229
{
2473 hendricks2 230
    walltype *wal;
231
    int i, x1, y1, x2, y2;
232
    char cnt;
5 Plagman 233
 
2473 hendricks2 234
    cnt = 0;
5 Plagman 235
 
2473 hendricks2 236
    wal = &wall[sector[sectnum].wallptr];
237
    for(i=sector[sectnum].wallnum;i>0;i--)
238
    {
239
        y1 = wal->y-y; y2 = wall[wal->point2].y-y;
240
        if ((y1^y2) < 0)
241
        {
242
            x1 = wal->x-x; x2 = wall[wal->point2].x-x;
5 Plagman 243
 
2473 hendricks2 244
            if ((x1^x2) < 0)
245
                cnt ^= (x1*y2<x2*y1)^(y1<y2);
246
            else if (x1 >= 0)
247
                cnt ^= 1;
248
        }
249
        wal++;
250
    }
251
    return(cnt);
5 Plagman 252
}
253
 
584 terminx 254
int readbyte(void)
5 Plagman 255
{
2473 hendricks2 256
    if (filpos >= fileng) return(-1);
257
    if ((filpos&16383) == 0) Bread(filhandle,filebuf,16384);
258
    filpos++;
259
    return((int)filebuf[(filpos-1)&16383]);
5 Plagman 260
}
261
 
584 terminx 262
int readline(void)
5 Plagman 263
{
2473 hendricks2 264
    int i, ch;
5 Plagman 265
 
2473 hendricks2 266
    do
267
    {
268
        do
269
        {
270
            ch = readbyte();
271
            if (ch < 0) return(0);
272
        } while ((ch == 13) || (ch == 10));
5 Plagman 273
 
2473 hendricks2 274
        i = 0; tempbuf[0] = 0;
275
        while ((ch != 13) && (ch != 10))
276
        {
277
            if (ch < 0) return(0);
278
            if (ch == ';')
279
            {
280
                do
281
                {
282
                    if (ch < 0) return(0);
283
                    ch = readbyte();
284
                } while ((ch != 13) && (ch != 10));
285
                break;
286
            }
287
            if ((ch == 32) || (ch == 9)) ch = ',';
288
            if ((ch != ',') || (i == 0) || (tempbuf[i-1] != ','))
289
                { tempbuf[i++] = ch; tempbuf[i] = 0; }
290
            ch = readbyte();
291
        }
292
        if ((i > 0) && (tempbuf[i-1] == ',')) tempbuf[i-1] = 0;
293
    } while (i <= 0);
294
    return(i);
5 Plagman 295
}
296
 
297
void parsescript(void)
298
{
2473 hendricks2 299
    int i, j, k, l, lasti, breakout, tstart, tend, textnum = 0, frontbackstat;
300
    int spritenumstat, slen;
301
    char ch;
5 Plagman 302
 
2597 hendricks2 303
    Bmemset(sectspri, 0xffffffff, MAXSECTS*8*sizeof(short));
5 Plagman 304
 
2473 hendricks2 305
    if (scriptname[0] == 0)
306
    {
307
        for(i=0;i<4096;i++) texturelookup[i] = i;
308
        return;
309
    }
5 Plagman 310
 
2473 hendricks2 311
    if ((filhandle = Bopen(scriptname,BO_BINARY|BO_RDONLY,BS_IREAD)) == -1)
312
    {
2521 hendricks2 313
        Bprintf("Could not find %s\n",scriptname);
2473 hendricks2 314
        exit(0);
315
    }
7542 hendricks2 316
    filpos = 0; fileng = filelength(filhandle);
2473 hendricks2 317
    while (readline() != 0)
318
    {
319
        i = 0; j = 0; lasti = 0;
320
        while (1)
321
        {
322
            if ((tempbuf[i] == ',') || (tempbuf[i] == 0))
323
            {
324
                if (tempbuf[i] == 0) { breakout = 1; }
325
                else { breakout = 0, tempbuf[i] = 0; }
5 Plagman 326
 
2473 hendricks2 327
                if (j == 0)
328
                {
329
                    if (tempbuf[lasti] == '[')
330
                    {
331
                        definemode = 0;
332
                        thingtypemode = 0;
333
                        texturelookupmode = 0;
334
                        tagtypemode = 0;
335
                        sectypemode = 0;
336
                    }
5 Plagman 337
 
2473 hendricks2 338
                    if (Bstrcasecmp(&tempbuf[lasti],"#define") == 0)
339
                        definemode = 1;
5 Plagman 340
 
2473 hendricks2 341
                    if (thingtypemode == 1)
342
                    {
343
                        thingoff[numthings] = thingopnum;
5 Plagman 344
 
2473 hendricks2 345
                        k = lasti;
346
                        while ((tempbuf[k] != 0) && (tempbuf[k] != '-')) k++;
5 Plagman 347
 
2473 hendricks2 348
                        if (tempbuf[k] == '-')
349
                        {
350
                            tempbuf[k] = 0;
2521 hendricks2 351
                            thingnum[numthings] = Batol(&tempbuf[lasti]);
352
                            thingnum2[numthings] = Batol(&tempbuf[k+1]);
2473 hendricks2 353
                        }
354
                        else
355
                        {
2521 hendricks2 356
                            thingnum[numthings] = Batol(&tempbuf[lasti]);
2473 hendricks2 357
                            thingnum2[numthings] = thingnum[numthings];
358
                        }
5 Plagman 359
 
2473 hendricks2 360
                        numthings++;
361
                    }
362
                    else if (Bstrcasecmp(&tempbuf[lasti],"[THINGTYPES]") == 0)
363
                        thingtypemode = 1;
5 Plagman 364
 
2473 hendricks2 365
                    if (texturelookupmode == 1)
366
                    {
367
                        textnum = 0;
368
                        if ((tempbuf[lasti] >= 48) && (tempbuf[lasti] <= 57))
369
                        {
370
                            k = lasti;
371
                            while ((tempbuf[k] != 0) && (tempbuf[k] != '-')) k++;
5 Plagman 372
 
2473 hendricks2 373
                            if (tempbuf[k] == '-')
374
                            {
375
                                tempbuf[k] = 0;
2521 hendricks2 376
                                tstart = Batol(&tempbuf[lasti]);
377
                                tend = Batol(&tempbuf[k+1]);
2473 hendricks2 378
                                for(k=tstart;k<=tend;k++)
379
                                    tempshort[textnum++] = k;
380
                            }
381
                            else
2521 hendricks2 382
                                tempshort[textnum++] = Batol(&tempbuf[lasti]);
2473 hendricks2 383
                        }
384
                        else
385
                        {
386
                            slen = 0;
387
                            while (tempbuf[lasti+slen] != 0)
388
                            {
389
                                ch = tempbuf[lasti+slen];
390
                                if ((ch >= 97) && (ch <= 122)) tempbuf[lasti+slen] -= 32;
391
                                slen++;
392
                            }
393
                            if (slen > 0)
394
                                for(k=inumwads-1;k>=0;k--)
395
                                    if ((iwadata[k][slen] == 0) || (iwadata[k][slen] == 32))
396
                                        if ((iwadata[k][slen-1] != 0) && (iwadata[k][slen-1] != 32))
397
                                        {
398
                                            for(l=slen-1;l>=0;l--)
399
                                                if (tempbuf[lasti+l] != '?')
400
                                                {
401
                                                    ch = iwadata[k][l];
402
                                                    if ((ch >= 97) && (ch <= 122)) ch -= 32;
403
                                                    if (tempbuf[lasti+l] != ch) break;
404
                                                }
405
                                            if (l < 0) tempshort[textnum++] = k;
406
                                        }
407
                        }
408
                    }
409
                    else if (Bstrcasecmp(&tempbuf[lasti],"[TEXTURELOOKUPS]") == 0)
410
                        texturelookupmode = 1;
5 Plagman 411
 
2473 hendricks2 412
                    if (tagtypemode == 1)
413
                    {
414
                        tagoff[numtags] = tagopnum;
5 Plagman 415
 
2473 hendricks2 416
                        k = lasti;
417
                        while ((tempbuf[k] != 0) && (tempbuf[k] != '-')) k++;
5 Plagman 418
 
2473 hendricks2 419
                        if (tempbuf[k] == '-')
420
                        {
421
                            tempbuf[k] = 0;
2521 hendricks2 422
                            tagnum[numtags] = Batol(&tempbuf[lasti]);
423
                            tagnum2[numtags] = Batol(&tempbuf[k+1]);
2473 hendricks2 424
                        }
425
                        else
426
                        {
2521 hendricks2 427
                            tagnum[numtags] = Batol(&tempbuf[lasti]);
2473 hendricks2 428
                            tagnum2[numtags] = tagnum[numtags];
429
                        }
5 Plagman 430
 
2473 hendricks2 431
                        numtags++;
432
                    }
433
                    else if (Bstrcasecmp(&tempbuf[lasti],"[TAGCONVERSIONS]") == 0)
434
                        tagtypemode = 1;
5 Plagman 435
 
2473 hendricks2 436
                    if (sectypemode == 1)
437
                    {
438
                        secoff[numsecs] = secopnum;
5 Plagman 439
 
2473 hendricks2 440
                        k = lasti;
441
                        while ((tempbuf[k] != 0) && (tempbuf[k] != '-')) k++;
5 Plagman 442
 
2473 hendricks2 443
                        if (tempbuf[k] == '-')
444
                        {
445
                            tempbuf[k] = 0;
2521 hendricks2 446
                            secnum[numsecs] = Batol(&tempbuf[lasti]);
447
                            secnum2[numsecs] = Batol(&tempbuf[k+1]);
2473 hendricks2 448
                        }
449
                        else
450
                        {
2521 hendricks2 451
                            secnum[numsecs] = Batol(&tempbuf[lasti]);
2473 hendricks2 452
                            secnum2[numsecs] = secnum[numsecs];
453
                        }
454
                        numsecs++;
455
                    }
456
                    else if (Bstrcasecmp(&tempbuf[lasti],"[SECTORCONVERSIONS]") == 0)
457
                        sectypemode = 1;
5 Plagman 458
 
2473 hendricks2 459
                }
460
                else if (j > 0)
461
                {
462
                    if (definemode == 1)
463
                    {
464
                        defineptr[numdefines] = (char *)(&define[definecnt]);
465
                        for(k=lasti;k<i;k++) define[definecnt++] = tempbuf[k];
466
                        define[definecnt++] = 0;
467
                        definemode = 2;
468
                    }
469
                    else if (definemode == 2)
470
                    {
2521 hendricks2 471
                        defineval[numdefines++] = Batol(&tempbuf[lasti]);
2473 hendricks2 472
                        definemode = 0;
473
                    }
5 Plagman 474
 
2473 hendricks2 475
                    if (thingtypemode == 1)
476
                    {
477
                        for(k=lasti;k<i;k++) if (tempbuf[k] == '=') break;
478
                        thingop[thingopnum] = 0;
479
                        if (tempbuf[k-1] == '+') thingop[thingopnum] = 1;
480
                        if (tempbuf[k-1] == '-') thingop[thingopnum] = 2;
481
                        if (tempbuf[k-1] == '|') thingop[thingopnum] = 3;
482
                        if (tempbuf[k-1] == '&') thingop[thingopnum] = 4;
483
                        if (tempbuf[k-1] == '^') thingop[thingopnum] = 5;
484
                        if (thingop[thingopnum] != 0) tempbuf[k-1] = 0;
485
                                                         else tempbuf[k] = 0;
5 Plagman 486
 
2473 hendricks2 487
                        if (Bstrcasecmp(&tempbuf[lasti],"x") == 0) thingfield[thingopnum] = 0;
488
                        if (Bstrcasecmp(&tempbuf[lasti],"y") == 0) thingfield[thingopnum] = 1;
489
                        if (Bstrcasecmp(&tempbuf[lasti],"z") == 0) thingfield[thingopnum] = 2;
490
                        if (Bstrcasecmp(&tempbuf[lasti],"cstat") == 0) thingfield[thingopnum] = 3;
491
                        if (Bstrcasecmp(&tempbuf[lasti],"shade") == 0) thingfield[thingopnum] = 4;
492
                        if (Bstrcasecmp(&tempbuf[lasti],"pal") == 0) thingfield[thingopnum] = 5;
493
                        if (Bstrcasecmp(&tempbuf[lasti],"clipdist") == 0) thingfield[thingopnum] = 6;
494
                        if (Bstrcasecmp(&tempbuf[lasti],"xrepeat") == 0) thingfield[thingopnum] = 7;
495
                        if (Bstrcasecmp(&tempbuf[lasti],"yrepeat") == 0) thingfield[thingopnum] = 8;
496
                        if (Bstrcasecmp(&tempbuf[lasti],"xoffset") == 0) thingfield[thingopnum] = 9;
497
                        if (Bstrcasecmp(&tempbuf[lasti],"yoffset") == 0) thingfield[thingopnum] = 10;
498
                        if (Bstrcasecmp(&tempbuf[lasti],"picnum") == 0) thingfield[thingopnum] = 11;
499
                        if (Bstrcasecmp(&tempbuf[lasti],"ang") == 0) thingfield[thingopnum] = 12;
500
                        if (Bstrcasecmp(&tempbuf[lasti],"xvel") == 0) thingfield[thingopnum] = 13;
501
                        if (Bstrcasecmp(&tempbuf[lasti],"yvel") == 0) thingfield[thingopnum] = 14;
502
                        if (Bstrcasecmp(&tempbuf[lasti],"zvel") == 0) thingfield[thingopnum] = 15;
503
                        if (Bstrcasecmp(&tempbuf[lasti],"owner") == 0) thingfield[thingopnum] = 16;
504
                        if (Bstrcasecmp(&tempbuf[lasti],"sectnum") == 0) thingfield[thingopnum] = 17;
505
                        if (Bstrcasecmp(&tempbuf[lasti],"statnum") == 0) thingfield[thingopnum] = 18;
506
                        if (Bstrcasecmp(&tempbuf[lasti],"lotag") == 0) thingfield[thingopnum] = 19;
507
                        if (Bstrcasecmp(&tempbuf[lasti],"hitag") == 0) thingfield[thingopnum] = 20;
508
                        if (Bstrcasecmp(&tempbuf[lasti],"extra") == 0) thingfield[thingopnum] = 21;
5 Plagman 509
 
2473 hendricks2 510
                        if ((tempbuf[k+1] >= 48) && (tempbuf[k+1] <= 57))
2521 hendricks2 511
                            thingval[thingopnum] = Batol(&tempbuf[k+1]);
2473 hendricks2 512
                        else
513
                        {
514
                            for(l=0;l<numdefines;l++)
515
                                if (Bstrcasecmp(defineptr[l],&tempbuf[k+1]) == 0)
516
                                    { thingval[thingopnum] = defineval[l]; break; }
517
                        }
5 Plagman 518
 
2473 hendricks2 519
                        thingopnum++;
520
                    }
5 Plagman 521
 
2473 hendricks2 522
                    if ((texturelookupmode == 1) && (j == 1))
523
                    {
524
                        if ((tempbuf[lasti] >= 48) && (tempbuf[lasti] <= 57))
2521 hendricks2 525
                            l = Batol(&tempbuf[lasti]);
2473 hendricks2 526
                        else
527
                        {
528
                            for(l=0;l<numdefines;l++)
529
                                if (Bstrcasecmp(defineptr[l],&tempbuf[lasti]) == 0)
530
                                    { l = defineval[l]; break; }
531
                        }
532
                        for(k=textnum-1;k>=0;k--) texturelookup[tempshort[k]] = l;
533
                    }
5 Plagman 534
 
2473 hendricks2 535
                    if (tagtypemode == 1)
536
                    {
537
                        for(k=lasti;k<i;k++) if (tempbuf[k] == '=') break;
538
                        tagop[tagopnum] = 0;
539
                        if (tempbuf[k-1] == '+') tagop[tagopnum] = 1;
540
                        if (tempbuf[k-1] == '-') tagop[tagopnum] = 2;
541
                        if (tempbuf[k-1] == '|') tagop[tagopnum] = 3;
542
                        if (tempbuf[k-1] == '&') tagop[tagopnum] = 4;
543
                        if (tempbuf[k-1] == '^') tagop[tagopnum] = 5;
544
                        if (tagop[tagopnum] != 0) tempbuf[k-1] = 0;
545
                                                         else tempbuf[k] = 0;
5 Plagman 546
 
2473 hendricks2 547
                            //Pick off first letter - is it f or b?
548
                        frontbackstat = 0;
549
                        if ((tempbuf[lasti] == 'b') || (tempbuf[lasti] == 'B')) frontbackstat = 1;
550
                        lasti++;
5 Plagman 551
 
2473 hendricks2 552
                        spritenumstat = 0;
553
                        if ((tempbuf[lasti] >= 48) && (tempbuf[lasti] <= 57))  //1 DIGIT ONLY!
554
                        {
555
                            spritenumstat = tempbuf[lasti]-48;
556
                            lasti++;
557
                        }
5 Plagman 558
 
2473 hendricks2 559
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.x") == 0) tagfield[tagopnum] = 0;
560
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.y") == 0) tagfield[tagopnum] = 1;
561
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.z") == 0) tagfield[tagopnum] = 2;
562
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.cstat") == 0) tagfield[tagopnum] = 3;
563
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.shade") == 0) tagfield[tagopnum] = 4;
564
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.pal") == 0) tagfield[tagopnum] = 5;
565
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.clipdist") == 0) tagfield[tagopnum] = 6;
566
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.xrepeat") == 0) tagfield[tagopnum] = 7;
567
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.yrepeat") == 0) tagfield[tagopnum] = 8;
568
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.xoffset") == 0) tagfield[tagopnum] = 9;
569
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.yoffset") == 0) tagfield[tagopnum] = 10;
570
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.picnum") == 0) tagfield[tagopnum] = 11;
571
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.ang") == 0) tagfield[tagopnum] = 12;
572
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.xvel") == 0) tagfield[tagopnum] = 13;
573
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.yvel") == 0) tagfield[tagopnum] = 14;
574
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.zvel") == 0) tagfield[tagopnum] = 15;
575
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.owner") == 0) tagfield[tagopnum] = 16;
576
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.sectnum") == 0) tagfield[tagopnum] = 17;
577
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.statnum") == 0) tagfield[tagopnum] = 18;
578
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.lotag") == 0) tagfield[tagopnum] = 19;
579
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.hitag") == 0) tagfield[tagopnum] = 20;
580
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.extra") == 0) tagfield[tagopnum] = 21;
5 Plagman 581
 
2473 hendricks2 582
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.wallptr") == 0) tagfield[tagopnum] = 32;
583
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.wallnum") == 0) tagfield[tagopnum] = 33;
584
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.ceilingpicnum") == 0) tagfield[tagopnum] = 34;
585
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.floorpicnum") == 0) tagfield[tagopnum] = 35;
586
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.ceilingheinum") == 0) tagfield[tagopnum] = 36;
587
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.floorheinum") == 0) tagfield[tagopnum] = 37;
588
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.ceilingz") == 0) tagfield[tagopnum] = 38;
589
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.floorz") == 0) tagfield[tagopnum] = 39;
590
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.ceilingshade") == 0) tagfield[tagopnum] = 40;
591
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.floorshade") == 0) tagfield[tagopnum] = 41;
592
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.ceilingxpanning") == 0) tagfield[tagopnum] = 42;
593
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.floorxpanning") == 0) tagfield[tagopnum] = 43;
594
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.ceilingypanning") == 0) tagfield[tagopnum] = 44;
595
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.floorypanning") == 0) tagfield[tagopnum] = 45;
596
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.ceilingstat") == 0) tagfield[tagopnum] = 46;
597
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.floorstat") == 0) tagfield[tagopnum] = 47;
598
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.ceilingpal") == 0) tagfield[tagopnum] = 48;
599
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.floorpal") == 0) tagfield[tagopnum] = 49;
600
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.visibility") == 0) tagfield[tagopnum] = 50;
601
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.lotag") == 0) tagfield[tagopnum] = 51;
602
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.hitag") == 0) tagfield[tagopnum] = 52;
603
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.extra") == 0) tagfield[tagopnum] = 53;
5 Plagman 604
 
2473 hendricks2 605
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.x") == 0) tagfield[tagopnum] = 64;
606
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.y") == 0) tagfield[tagopnum] = 65;
607
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.point2") == 0) tagfield[tagopnum] = 66;
608
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.nextsector") == 0) tagfield[tagopnum] = 67;
609
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.nextwall") == 0) tagfield[tagopnum] = 68;
610
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.picnum") == 0) tagfield[tagopnum] = 69;
611
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.overpicnum") == 0) tagfield[tagopnum] = 70;
612
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.shade") == 0) tagfield[tagopnum] = 71;
613
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.pal") == 0) tagfield[tagopnum] = 72;
614
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.cstat") == 0) tagfield[tagopnum] = 73;
615
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.xrepeat") == 0) tagfield[tagopnum] = 74;
616
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.yrepeat") == 0) tagfield[tagopnum] = 75;
617
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.xpanning") == 0) tagfield[tagopnum] = 76;
618
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.ypanning") == 0) tagfield[tagopnum] = 77;
619
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.lotag") == 0) tagfield[tagopnum] = 78;
620
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.hitag") == 0) tagfield[tagopnum] = 79;
621
                        if (Bstrcasecmp(&tempbuf[lasti],"wall.extra") == 0) tagfield[tagopnum] = 80;
5 Plagman 622
 
2473 hendricks2 623
                        tagfield[tagopnum] += (frontbackstat<<7) + (spritenumstat<<8);
5 Plagman 624
 
2473 hendricks2 625
                        if ((tempbuf[k+1] >= 48) && (tempbuf[k+1] <= 57))
2521 hendricks2 626
                            tagval[tagopnum] = Batol(&tempbuf[k+1]);
2473 hendricks2 627
                        else if (Bstrcasecmp("tag",&tempbuf[k+1]) == 0)
628
                            tagval[tagopnum] = INT32_MIN;
629
                        else
630
                        {
631
                            for(l=0;l<numdefines;l++)
632
                                if (Bstrcasecmp(defineptr[l],&tempbuf[k+1]) == 0)
633
                                    { tagval[tagopnum] = defineval[l]; break; }
634
                        }
5 Plagman 635
 
2473 hendricks2 636
                        tagopnum++;
637
                    }
5 Plagman 638
 
2473 hendricks2 639
                    if (sectypemode == 1)
640
                    {
641
                        for(k=lasti;k<i;k++) if (tempbuf[k] == '=') break;
642
                        secop[secopnum] = 0;
643
                        if (tempbuf[k-1] == '+') secop[secopnum] = 1;
644
                        if (tempbuf[k-1] == '-') secop[secopnum] = 2;
645
                        if (tempbuf[k-1] == '|') secop[secopnum] = 3;
646
                        if (tempbuf[k-1] == '&') secop[secopnum] = 4;
647
                        if (tempbuf[k-1] == '^') secop[secopnum] = 5;
648
                        if (secop[secopnum] != 0) tempbuf[k-1] = 0;
649
                                                     else tempbuf[k] = 0;
5 Plagman 650
 
2473 hendricks2 651
                        spritenumstat = 0;
652
                        if ((tempbuf[lasti] >= 48) && (tempbuf[lasti] <= 57))  //1 DIGIT ONLY!
653
                        {
654
                            spritenumstat = tempbuf[lasti]-48;
655
                            lasti++;
656
                        }
5 Plagman 657
 
2473 hendricks2 658
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.x") == 0) secfield[secopnum] = 0;
659
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.y") == 0) secfield[secopnum] = 1;
660
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.z") == 0) secfield[secopnum] = 2;
661
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.cstat") == 0) secfield[secopnum] = 3;
662
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.shade") == 0) secfield[secopnum] = 4;
663
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.pal") == 0) secfield[secopnum] = 5;
664
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.clipdist") == 0) secfield[secopnum] = 6;
665
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.xrepeat") == 0) secfield[secopnum] = 7;
666
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.yrepeat") == 0) secfield[secopnum] = 8;
667
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.xoffset") == 0) secfield[secopnum] = 9;
668
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.yoffset") == 0) secfield[secopnum] = 10;
669
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.picnum") == 0) secfield[secopnum] = 11;
670
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.ang") == 0) secfield[secopnum] = 12;
671
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.xvel") == 0) secfield[secopnum] = 13;
672
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.yvel") == 0) secfield[secopnum] = 14;
673
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.zvel") == 0) secfield[secopnum] = 15;
674
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.owner") == 0) secfield[secopnum] = 16;
675
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.sectnum") == 0) secfield[secopnum] = 17;
676
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.statnum") == 0) secfield[secopnum] = 18;
677
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.lotag") == 0) secfield[secopnum] = 19;
678
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.hitag") == 0) secfield[secopnum] = 20;
679
                        if (Bstrcasecmp(&tempbuf[lasti],"sprite.extra") == 0) secfield[secopnum] = 21;
5 Plagman 680
 
2473 hendricks2 681
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.wallptr") == 0) secfield[secopnum] = 32;
682
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.wallnum") == 0) secfield[secopnum] = 33;
683
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.ceilingpicnum") == 0) secfield[secopnum] = 34;
684
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.floorpicnum") == 0) secfield[secopnum] = 35;
685
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.ceilingheinum") == 0) secfield[secopnum] = 36;
686
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.floorheinum") == 0) secfield[secopnum] = 37;
687
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.ceilingz") == 0) secfield[secopnum] = 38;
688
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.floorz") == 0) secfield[secopnum] = 39;
689
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.ceilingshade") == 0) secfield[secopnum] = 40;
690
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.floorshade") == 0) secfield[secopnum] = 41;
691
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.ceilingxpanning") == 0) secfield[secopnum] = 42;
692
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.floorxpanning") == 0) secfield[secopnum] = 43;
693
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.ceilingypanning") == 0) secfield[secopnum] = 44;
694
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.floorypanning") == 0) secfield[secopnum] = 45;
695
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.ceilingstat") == 0) secfield[secopnum] = 46;
696
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.floorstat") == 0) secfield[secopnum] = 47;
697
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.ceilingpal") == 0) secfield[secopnum] = 48;
698
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.floorpal") == 0) secfield[secopnum] = 49;
699
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.visibility") == 0) secfield[secopnum] = 50;
700
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.lotag") == 0) secfield[secopnum] = 51;
701
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.hitag") == 0) secfield[secopnum] = 52;
702
                        if (Bstrcasecmp(&tempbuf[lasti],"sector.extra") == 0) secfield[secopnum] = 53;
5 Plagman 703
 
2473 hendricks2 704
                        secfield[secopnum] += (spritenumstat<<8);
5 Plagman 705
 
2473 hendricks2 706
                        if ((tempbuf[k+1] >= 48) && (tempbuf[k+1] <= 57))
2521 hendricks2 707
                            secval[secopnum] = Batol(&tempbuf[k+1]);
2473 hendricks2 708
                        else if (Bstrcasecmp("tag",&tempbuf[k+1]) == 0)
709
                            secval[secopnum] = INT32_MIN;
710
                        else
711
                        {
712
                            for(l=0;l<numdefines;l++)
713
                                if (Bstrcasecmp(defineptr[l],&tempbuf[k+1]) == 0)
714
                                    { secval[secopnum] = defineval[l]; break; }
715
                        }
5 Plagman 716
 
2473 hendricks2 717
                        secopnum++;
718
                    }
5 Plagman 719
 
2473 hendricks2 720
                }
721
                if (breakout == 1) break;
722
                lasti = i+1; j++;
723
            }
724
            i++;
725
        }
726
    }
727
    thingoff[numthings] = thingopnum;
728
    tagoff[numtags] = tagopnum;
729
    secoff[numsecs] = secopnum;
730
    close(filhandle);
5 Plagman 731
}
732
 
584 terminx 733
int getspritefield(int i, int fieldnum)
5 Plagman 734
{
2473 hendricks2 735
    switch(fieldnum)
736
    {
737
        case 0: return((int)sprite[i].x);
738
        case 1: return((int)sprite[i].y);
739
        case 2: return((int)sprite[i].z);
740
        case 3: return((int)sprite[i].cstat);
741
        case 4: return((int)sprite[i].shade);
742
        case 5: return((int)sprite[i].pal);
743
        case 6: return((int)sprite[i].clipdist);
744
        case 7: return((int)sprite[i].xrepeat);
745
        case 8: return((int)sprite[i].yrepeat);
746
        case 9: return((int)sprite[i].xoffset);
747
        case 10: return((int)sprite[i].yoffset);
748
        case 11: return((int)sprite[i].picnum);
749
        case 12: return((int)sprite[i].ang);
750
        case 13: return((int)sprite[i].xvel);
751
        case 14: return((int)sprite[i].yvel);
752
        case 15: return((int)sprite[i].zvel);
753
        case 16: return((int)sprite[i].owner);
754
        case 17: return((int)sprite[i].sectnum);
755
        case 18: return((int)sprite[i].statnum);
756
        case 19: return((int)sprite[i].lotag);
757
        case 20: return((int)sprite[i].hitag);
758
        case 21: return((int)sprite[i].extra);
759
    }
760
    return(0);
5 Plagman 761
}
762
 
584 terminx 763
void setspritefield(int i, int fieldnum, int newval)
5 Plagman 764
{
2473 hendricks2 765
    switch(fieldnum)
766
    {
767
        case 0: sprite[i].x = newval; break;
768
        case 1: sprite[i].y = newval; break;
769
        case 2: sprite[i].z = newval; break;
770
        case 3: sprite[i].cstat = newval; break;
771
        case 4: sprite[i].shade = newval; break;
772
        case 5: sprite[i].pal = newval; break;
773
        case 6: sprite[i].clipdist = newval; break;
774
        case 7: sprite[i].xrepeat = newval; break;
775
        case 8: sprite[i].yrepeat = newval; break;
776
        case 9: sprite[i].xoffset = newval; break;
777
        case 10: sprite[i].yoffset = newval; break;
778
        case 11: sprite[i].picnum = newval; break;
779
        case 12: sprite[i].ang = newval; break;
780
        case 13: sprite[i].xvel = newval; break;
781
        case 14: sprite[i].yvel = newval; break;
782
        case 15: sprite[i].zvel = newval; break;
783
        case 16: sprite[i].owner = newval; break;
784
        case 17: sprite[i].sectnum = newval; break;
785
        case 18: sprite[i].statnum = newval; break;
786
        case 19: sprite[i].lotag = newval; break;
787
        case 20: sprite[i].hitag = newval; break;
788
        case 21: sprite[i].extra = newval; break;
789
    }
5 Plagman 790
}
791
 
584 terminx 792
int getwallfield(int i, int fieldnum)
5 Plagman 793
{
2473 hendricks2 794
    switch(fieldnum)
795
    {
796
        case 64: return((int)wall[i].x);
797
        case 65: return((int)wall[i].y);
798
        case 66: return((int)wall[i].point2);
799
        case 67: return((int)wall[i].nextsector);
800
        case 68: return((int)wall[i].nextwall);
801
        case 69: return((int)wall[i].picnum);
802
        case 70: return((int)wall[i].overpicnum);
803
        case 71: return((int)wall[i].shade);
804
        case 72: return((int)wall[i].pal);
805
        case 73: return((int)wall[i].cstat);
806
        case 74: return((int)wall[i].xrepeat);
807
        case 75: return((int)wall[i].yrepeat);
808
        case 76: return((int)wall[i].xpanning);
809
        case 77: return((int)wall[i].ypanning);
810
        case 78: return((int)wall[i].lotag);
811
        case 79: return((int)wall[i].hitag);
812
        case 80: return((int)wall[i].extra);
813
    }
814
    return(0);
5 Plagman 815
}
816
 
584 terminx 817
void setwallfield(int i, int fieldnum, int newval)
5 Plagman 818
{
2473 hendricks2 819
    switch(fieldnum)
820
    {
821
        case 64: wall[i].x = newval; break;
822
        case 65: wall[i].y = newval; break;
823
        case 66: wall[i].point2 = newval; break;
824
        case 67: wall[i].nextsector = newval; break;
825
        case 68: wall[i].nextwall = newval; break;
826
        case 69: wall[i].picnum = newval; break;
827
        case 70: wall[i].overpicnum = newval; break;
828
        case 71: wall[i].shade = newval; break;
829
        case 72: wall[i].pal = newval; break;
830
        case 73: wall[i].cstat = newval; break;
831
        case 74: wall[i].xrepeat = newval; break;
832
        case 75: wall[i].yrepeat = newval; break;
833
        case 76: wall[i].xpanning = newval; break;
834
        case 77: wall[i].ypanning = newval; break;
835
        case 78: wall[i].lotag = newval; break;
836
        case 79: wall[i].hitag = newval; break;
837
        case 80: wall[i].extra = newval; break;
838
    }
5 Plagman 839
}
840
 
584 terminx 841
int getsectorfield(int i, int fieldnum)
5 Plagman 842
{
2473 hendricks2 843
    switch(fieldnum)
844
    {
845
        case 32: return((int)sector[i].wallptr);
846
        case 33: return((int)sector[i].wallnum);
847
        case 34: return((int)sector[i].ceilingpicnum);
848
        case 35: return((int)sector[i].floorpicnum);
849
        case 36: return((int)sector[i].ceilingheinum);
850
        case 37: return((int)sector[i].floorheinum);
851
        case 38: return((int)sector[i].ceilingz);
852
        case 39: return((int)sector[i].floorz);
853
        case 40: return((int)sector[i].ceilingshade);
854
        case 41: return((int)sector[i].floorshade);
855
        case 42: return((int)sector[i].ceilingxpanning);
856
        case 43: return((int)sector[i].floorxpanning);
857
        case 44: return((int)sector[i].ceilingypanning);
858
        case 45: return((int)sector[i].floorypanning);
859
        case 46: return((int)sector[i].ceilingstat);
860
        case 47: return((int)sector[i].floorstat);
861
        case 48: return((int)sector[i].ceilingpal);
862
        case 49: return((int)sector[i].floorpal);
863
        case 50: return((int)sector[i].visibility);
864
        case 51: return((int)sector[i].lotag);
865
        case 52: return((int)sector[i].hitag);
866
        case 53: return((int)sector[i].extra);
867
    }
868
    return(0);
5 Plagman 869
}
870
 
584 terminx 871
void setsectorfield(int i, int fieldnum, int newval)
5 Plagman 872
{
2473 hendricks2 873
    switch(fieldnum)
874
    {
875
        case 32: sector[i].wallptr = newval; break;
876
        case 33: sector[i].wallnum = newval; break;
877
        case 34: sector[i].ceilingpicnum = newval; break;
878
        case 35: sector[i].floorpicnum = newval; break;
879
        case 36: sector[i].ceilingheinum = newval; break;
880
        case 37: sector[i].floorheinum = newval; break;
881
        case 38: sector[i].ceilingz = newval; break;
882
        case 39: sector[i].floorz = newval; break;
883
        case 40: sector[i].ceilingshade = newval; break;
884
        case 41: sector[i].floorshade = newval; break;
885
        case 42: sector[i].ceilingxpanning = newval; break;
886
        case 43: sector[i].floorxpanning = newval; break;
887
        case 44: sector[i].ceilingypanning = newval; break;
888
        case 45: sector[i].floorypanning = newval; break;
889
        case 46: sector[i].ceilingstat = newval; break;
890
        case 47: sector[i].floorstat = newval; break;
891
        case 48: sector[i].ceilingpal = newval; break;
892
        case 49: sector[i].floorpal = newval; break;
893
        case 50: sector[i].visibility = newval; break;
894
        case 51: sector[i].lotag = newval; break;
895
        case 52: sector[i].hitag = newval; break;
896
        case 53: sector[i].extra = newval; break;
897
    }
5 Plagman 898
}
899
 
6038 hendricks2 900
int getwadindex(char const * nam)
5 Plagman 901
{
2473 hendricks2 902
    int i, j;
5 Plagman 903
 
2473 hendricks2 904
    i = 0;
905
    for(j=2048;j>0;j>>=1)
906
        if (i+j < inumwads)
907
            if (Bstrcasecmp(iwadata[slist[i+j]],nam) <= 0) i += j;
908
    if (Bstrcasecmp(iwadata[slist[i]],nam) == 0) return(slist[i]);
909
    return(-1);
5 Plagman 910
}
911
 
912
int main(int argc, char **argv)
913
{
2473 hendricks2 914
    char argstring[5][80];
915
    char iwadfil[80], pwadfil[80], doommap[16], buildmap[16], picstr[16];
916
    int w, numtexts, startnumtexts, danumtexts, numpnames;
917
    int x, y, z, zz, zzz, zzx, zx, cx, cy, gap, i, j, k, l, offs;
918
    int dnumpoints = 0, dnumlines = 0, dnumsides, dnumsectors, dnumthings;
919
    int minx, maxx, miny, maxy, numwalls, wadtype;
920
    int startnumwalls, l1, l2, startpoint2;
921
    int fil, ifil, pfil, x1, y1, x2, y2, startwall, endwall;
922
    int mapversion, posx, posy, posz, boardwadindex;
923
    short ang, cursectnum;
5 Plagman 924
 
2521 hendricks2 925
    Bprintf("Wad2Map!                                       Copyright 1995 by Ken Silverman\n");
5 Plagman 926
 
2473 hendricks2 927
    if ((argc < 3) || (argc > 5))
928
    {
2521 hendricks2 929
        Bprintf("Command line parameters: Wad2Map (PWADName) IWADName MapName (ScriptName)\n");
930
        Bprintf("   Ex #1: wad2map c:\\doom\\doom.wad e1m1\n");
931
        Bprintf("   Ex #2: wad2map c:\\doom\\doom.wad e1m1 kenbuild.txt\n");
932
        Bprintf("   Ex #3: wad2map c:\\doom\\mypwad.wad c:\\doom\\doom.wad e1m1\n");
933
        Bprintf("   Ex #4: wad2map c:\\doom\\mypwad.wad c:\\doom\\doom.wad e1m1 kenbuild.txt\n");
2473 hendricks2 934
        exit(0);
935
    }
5 Plagman 936
 
2473 hendricks2 937
    for(i=1;i<argc;i++) strcpy(argstring[i],argv[i]);
5 Plagman 938
 
2473 hendricks2 939
    strcpy(iwadfil,argstring[1]);     //"c:\games\doom\doom.wad"
940
    if (strchr(iwadfil,'.') == 0) strcat(iwadfil,".wad");
941
    if ((ifil = Bopen(iwadfil,BO_BINARY|BO_RDONLY,BS_IREAD)) == -1)
2521 hendricks2 942
        { Bprintf("Could not find %s\n",iwadfil); exit(0); }
5 Plagman 943
 
2473 hendricks2 944
    Bread(ifil,&wadtype,4);
945
    if (wadtype == 0x44415749) wadtype = 0;       //IWAD
946
    else if (wadtype == 0x44415750) wadtype = 1;  //PWAD
2521 hendricks2 947
    else { Bclose(ifil); Bprintf("Invalid WAD header\n"); exit(0); }
5 Plagman 948
 
2473 hendricks2 949
    strcpy(pwadfil,iwadfil); pfil = ifil;
950
    if (wadtype == 1)
951
    {
952
        strcpy(iwadfil,argstring[2]);
953
        if (strchr(iwadfil,'.') == 0) strcat(iwadfil,".wad");
954
        if ((ifil = Bopen(iwadfil,BO_BINARY|BO_RDONLY,BS_IREAD)) == -1)
2521 hendricks2 955
            { Bclose(pfil); Bprintf("Could not find %s\n",iwadfil); exit(0); }
5 Plagman 956
 
2473 hendricks2 957
        Bread(ifil,&wadtype,4);
958
        if (wadtype != 0x44415749)        //!= IWAD
959
        {
960
            Bclose(ifil); Bclose(pfil);
2521 hendricks2 961
            Bprintf("Wad a' you think I am?  That ain't no IWAD!\n");
2473 hendricks2 962
            exit(0);
963
        }
5 Plagman 964
 
2473 hendricks2 965
        strcpy(doommap,argstring[3]);     //"E1M1"
966
        if (strchr(doommap,'.') != 0) *strchr(doommap,'.') = 0;
967
        scriptname[0] = 0;
968
        if (argc == 5)
969
        {
970
            strcpy(scriptname,argstring[4]);
971
            if (strchr(scriptname,'.') == 0) strcat(scriptname,".txt");
972
        }
973
    }
974
    else
975
    {
976
        strcpy(doommap,argstring[2]);     //"E1M1"
977
        if (strchr(doommap,'.') != 0) *strchr(doommap,'.') = 0;
978
        scriptname[0] = 0;
979
        if (argc == 4)
980
        {
981
            strcpy(scriptname,argstring[3]);
982
            if (strchr(scriptname,'.') == 0) strcat(scriptname,".txt");
983
        }
984
    }
5 Plagman 985
 
2473 hendricks2 986
    initksqrt();
5 Plagman 987
 
2473 hendricks2 988
    Bread(ifil,&inumwads,4); Bread(ifil,&iwadstart,4);
989
    Blseek(ifil,iwadstart,BSEEK_SET);
990
    for(z=0;z<inumwads;z++)
991
    {
992
        if ((z&1023) == 0) Bread(ifil,tempbuf,16384);
993
        zz = ((z&1023)<<4);
994
        iwadplc[z] = ((int)tempbuf[zz]) + (((int)tempbuf[zz+1])<<8) + (((int)tempbuf[zz+2])<<16) + (((int)tempbuf[zz+3])<<24);
995
        zz += 4;
996
        iwadlen[z] = ((int)tempbuf[zz]) + (((int)tempbuf[zz+1])<<8) + (((int)tempbuf[zz+2])<<16) + (((int)tempbuf[zz+3])<<24);
997
        zz += 4;
998
        iwadata[z][0] = tempbuf[zz+0]; iwadata[z][1] = tempbuf[zz+1];
999
        iwadata[z][2] = tempbuf[zz+2]; iwadata[z][3] = tempbuf[zz+3];
1000
        iwadata[z][4] = tempbuf[zz+4]; iwadata[z][5] = tempbuf[zz+5];
1001
        iwadata[z][6] = tempbuf[zz+6]; iwadata[z][7] = tempbuf[zz+7];
1002
        iwadata[z][8] = 0;
1003
    }
5 Plagman 1004
 
2473 hendricks2 1005
    parsescript();
5 Plagman 1006
 
2473 hendricks2 1007
    for(z=0;z<inumwads;z++) slist[z] = z;
5 Plagman 1008
 
2473 hendricks2 1009
    for(gap=(inumwads>>1);gap>0;gap>>=1)
1010
        for(z=0;z<inumwads-gap;z++)
1011
            for(zz=z;zz>=0;zz-=gap)
1012
            {
1013
                if (Bstrcasecmp(iwadata[slist[zz]],iwadata[slist[zz+gap]]) <= 0) break;
1014
                i = slist[zz]; slist[zz] = slist[zz+gap]; slist[zz+gap] = i;
1015
            }
5 Plagman 1016
 
2473 hendricks2 1017
    if (ifil != pfil)
1018
    {
1019
        Bread(pfil,&pnumwads,4);
1020
        Bread(pfil,&pwadstart,4);
1021
        Blseek(pfil,pwadstart,SEEK_SET);
1022
        for(z=0;z<pnumwads;z++)
1023
        {
1024
            if ((z&1023) == 0) Bread(ifil,tempbuf,16384);
1025
            zz = ((z&1023)<<4);
1026
            pwadplc[z] = ((int)tempbuf[zz]) + (((int)tempbuf[zz+1])<<8) + (((int)tempbuf[zz+2])<<16) + (((int)tempbuf[zz+3])<<24);
1027
            zz += 4;
1028
            pwadlen[z] = ((int)tempbuf[zz]) + (((int)tempbuf[zz+1])<<8) + (((int)tempbuf[zz+2])<<16) + (((int)tempbuf[zz+3])<<24);
1029
            zz += 4;
1030
            pwadata[z][0] = tempbuf[zz+0]; pwadata[z][1] = tempbuf[zz+1];
1031
            pwadata[z][2] = tempbuf[zz+2]; pwadata[z][3] = tempbuf[zz+3];
1032
            pwadata[z][4] = tempbuf[zz+4]; pwadata[z][5] = tempbuf[zz+5];
1033
            pwadata[z][6] = tempbuf[zz+6]; pwadata[z][7] = tempbuf[zz+7];
1034
            pwadata[z][8] = 0;
1035
        }
1036
    }
1037
    else
1038
    {
1039
        pnumwads = inumwads;
1040
        pwadstart = iwadstart;
1041
        for(z=0;z<inumwads;z++)
1042
        {
1043
            pwadplc[z] = iwadplc[z];
1044
            pwadlen[z] = iwadlen[z];
1045
            pwadata[z][0] = iwadata[z][0]; pwadata[z][1] = iwadata[z][1];
1046
            pwadata[z][2] = iwadata[z][2]; pwadata[z][3] = iwadata[z][3];
1047
            pwadata[z][4] = iwadata[z][4]; pwadata[z][5] = iwadata[z][5];
1048
            pwadata[z][6] = iwadata[z][6]; pwadata[z][7] = iwadata[z][7];
1049
            pwadata[z][8] = iwadata[z][8];
1050
        }
1051
    }
5 Plagman 1052
 
2597 hendricks2 1053
    Bmemset(sector, 0, MAXSECTORS*sizeof(sectortype));
1054
    Bmemset(wall, 0, MAXWALLS*sizeof(walltype));
1055
    Bmemset(sprite, 0, MAXSPRITES*sizeof(spritetype));
2473 hendricks2 1056
    for(i=0;i<MAXSECTORS;i++) sector[i].extra = -1;
1057
    for(i=0;i<MAXWALLS;i++) wall[i].extra = -1;
1058
    for(i=0;i<MAXSPRITES;i++) sprite[i].extra = -1;
5 Plagman 1059
 
2473 hendricks2 1060
    if ((w = getwadindex("TEXTURE1")) < 0)
2521 hendricks2 1061
        { Bprintf("TEXTURE1 not found!\n"); exit(0); }
2473 hendricks2 1062
    Blseek(ifil,iwadplc[w],BSEEK_SET);
1063
    Bread(ifil,&numtexts,4);
1064
    Bread(ifil,textoffs,numtexts*sizeof(int));
1065
    for(z=0;z<numtexts;z++)
1066
    {
1067
        Blseek(ifil,iwadplc[w]+textoffs[z],BSEEK_SET);
1068
        Bread(ifil,tempbuf,32);
1069
        textname[z][0] = tempbuf[0]; textname[z][1] = tempbuf[1];
1070
        textname[z][2] = tempbuf[2]; textname[z][3] = tempbuf[3];
1071
        textname[z][4] = tempbuf[4]; textname[z][5] = tempbuf[5];
1072
        textname[z][6] = tempbuf[6]; textname[z][7] = tempbuf[7];
1073
        textname[z][8] = 0;
1074
        textpname[z] = ((int)tempbuf[26]) + (((int)tempbuf[27])<<8);
1075
    }
5 Plagman 1076
 
2473 hendricks2 1077
    if ((w = getwadindex("TEXTURE2")) >= 0)
1078
    {
1079
        Blseek(ifil,iwadplc[w],BSEEK_SET);
1080
        startnumtexts = numtexts;
1081
        Bread(ifil,&danumtexts,4); numtexts += danumtexts;
1082
        Bread(ifil,&textoffs[startnumtexts],(numtexts-startnumtexts)*sizeof(int));
1083
        for(z=startnumtexts;z<numtexts;z++)
1084
        {
1085
            Blseek(ifil,iwadplc[w]+textoffs[z],BSEEK_SET);
1086
            Bread(ifil,tempbuf,32);
1087
            textname[z][0] = tempbuf[0]; textname[z][1] = tempbuf[1];
1088
            textname[z][2] = tempbuf[2]; textname[z][3] = tempbuf[3];
1089
            textname[z][4] = tempbuf[4]; textname[z][5] = tempbuf[5];
1090
            textname[z][6] = tempbuf[6]; textname[z][7] = tempbuf[7];
1091
            textname[z][8] = 0;
1092
            textpname[z] = ((int)tempbuf[26]) + (((int)tempbuf[27])<<8);
1093
        }
1094
    }
5 Plagman 1095
 
2473 hendricks2 1096
    if ((w = getwadindex("PNAMES")) < 0)
2521 hendricks2 1097
        { Bprintf("PNAMES not found!\n"); exit(0); }
2473 hendricks2 1098
    Blseek(ifil,iwadplc[w],BSEEK_SET);
1099
    Bread(ifil,&numpnames,4);
1100
    Bread(ifil,tempbuf,numpnames*8);
1101
    for(z=0;z<numpnames;z++)
1102
    {
1103
        zz = (z<<3);
1104
        pname[z][0] = tempbuf[zz+0]; pname[z][1] = tempbuf[zz+1];
1105
        pname[z][2] = tempbuf[zz+2]; pname[z][3] = tempbuf[zz+3];
1106
        pname[z][4] = tempbuf[zz+4]; pname[z][5] = tempbuf[zz+5];
1107
        pname[z][6] = tempbuf[zz+6]; pname[z][7] = tempbuf[zz+7];
1108
        pname[z][8] = 0;
1109
    }
5 Plagman 1110
 
2473 hendricks2 1111
    if ((w = getwadindex(doommap)) < 0)
2521 hendricks2 1112
        { Bprintf("Board not found!\n"); exit(0); }
2473 hendricks2 1113
    boardwadindex = w;
1114
    for(w=boardwadindex+10;w>=boardwadindex;w--)
1115
    {
1116
        Blseek(pfil,pwadplc[w],BSEEK_SET);
5 Plagman 1117
 
2473 hendricks2 1118
        if (Bstrcasecmp(pwadata[w],"VERTEXES") == 0)
1119
        {
1120
            dnumpoints = (pwadlen[w]>>2);
1121
            Bread(pfil,tempbuf,pwadlen[w]);
1122
            offs = 0;
1123
            for(z=0;z<dnumpoints;z++)
1124
            {
1125
                px[z] = ((short)tempbuf[offs])+(((short)tempbuf[offs+1])<<8);
1126
                py[z] = -(((short)tempbuf[offs+2])+(((short)tempbuf[offs+3])<<8));
1127
                offs += 4;
1128
            }
1129
        }
1130
        if (Bstrcasecmp(pwadata[w],"LINEDEFS") == 0)
1131
        {
1132
            dnumlines = pwadlen[w]/sizeof(linedeftype);
1133
            Bread(pfil,line,sizeof(linedeftype)*dnumlines);
1134
        }
1135
        if (Bstrcasecmp(pwadata[w],"SIDEDEFS") == 0)
1136
        {
1137
            dnumsides = pwadlen[w]/sizeof(sidedeftype);
1138
            Bread(pfil,side,pwadlen[w]);
1139
            for(z=0;z<dnumsides;z++)
1140
            {
1141
                for(i=0;i<8;i++) picstr[i] = side[z].uppertexture[i];
1142
                picstr[8] = 0;
5 Plagman 1143
 
2473 hendricks2 1144
                sidetoppic[z] = -1;
1145
                if (picstr[0] != '-')
1146
                    for(zx=0;zx<numtexts;zx++)
1147
                        if (Bstrcasecmp(picstr,textname[zx]) == 0)
1148
                            { sidetoppic[z] = getwadindex(pname[textpname[zx]]); break; }
5 Plagman 1149
 
2473 hendricks2 1150
                for(i=0;i<8;i++) picstr[i] = side[z].lowertexture[i];
1151
                picstr[8] = 0;
5 Plagman 1152
 
2473 hendricks2 1153
                sidebotpic[z] = -1;
1154
                if (picstr[0] != '-')
1155
                    for(zx=0;zx<numtexts;zx++)
1156
                        if (Bstrcasecmp(picstr,textname[zx]) == 0)
1157
                            { sidebotpic[z] = getwadindex(pname[textpname[zx]]); break; }
5 Plagman 1158
 
2473 hendricks2 1159
                for(i=0;i<8;i++) picstr[i] = side[z].middletexture[i];
1160
                picstr[8] = 0;
5 Plagman 1161
 
2473 hendricks2 1162
                sidemidpic[z] = -1;
1163
                if (picstr[0] != '-')
1164
                    for(zx=0;zx<numtexts;zx++)
1165
                        if (Bstrcasecmp(picstr,textname[zx]) == 0)
1166
                            { sidemidpic[z] = getwadindex(pname[textpname[zx]]); break; }
1167
            }
1168
        }
1169
        if (Bstrcasecmp(pwadata[w],"SECTORS") == 0)
1170
        {
1171
            dnumsectors = pwadlen[w]/sizeof(secttype);
1172
            Bread(pfil,sect,pwadlen[w]);
1173
            for(z=0;z<dnumsectors;z++)
1174
            {
1175
                for(i=0;i<8;i++) picstr[i] = sect[z].floorpic[i];
1176
                picstr[8] = 0;
1177
                sector[z].floorpicnum = getwadindex(picstr);
5 Plagman 1178
 
2473 hendricks2 1179
                for(i=0;i<8;i++) picstr[i] = sect[z].ceilingpic[i];
1180
                picstr[8] = 0;
1181
                sector[z].ceilingpicnum = getwadindex(picstr);
1182
            }
1183
        }
1184
        if (Bstrcasecmp(pwadata[w],"THINGS") == 0)
1185
        {
1186
            dnumthings = pwadlen[w]/sizeof(thingtype);
1187
            Bread(pfil,thing,pwadlen[w]);
1188
        }
1189
    }
1190
    close(ifil);
1191
    if (ifil != pfil) close(pfil);
5 Plagman 1192
 
1193
 
2473 hendricks2 1194
    minx = 32767; maxx = -32768;
1195
    miny = 32767; maxy = -32768;
1196
    for(z=0;z<dnumpoints;z++)
1197
    {
1198
        x = px[z]; y = py[z];
1199
        if (x < minx) minx = x;
1200
        if (x > maxx) maxx = x;
1201
        if (y < miny) miny = y;
1202
        if (y > maxy) maxy = y;
1203
    }
1204
    cx = (((minx+maxx)>>1)&0xffffffc0);
1205
    cy = (((miny+maxy)>>1)&0xffffffc0);
5 Plagman 1206
 
2473 hendricks2 1207
    numwalls = 0;
5 Plagman 1208
 
2473 hendricks2 1209
    for(z=0;z<dnumsectors;z++)
1210
    {
1211
        startnumwalls = numwalls;
1212
        for(zz=0;zz<dnumlines;zz++)
1213
        {
1214
            if (z == side[line[zz].side1].sect)
1215
            {
1216
                wx[numwalls] = px[line[zz].p1]; wy[numwalls] = py[line[zz].p1];
1217
                wx2[numwalls] = px[line[zz].p2]; wy2[numwalls] = py[line[zz].p2];
1218
                picindex[numwalls] = line[zz].side1; linindex[numwalls++] = zz;
1219
            }
1220
            if ((line[zz].side2 >= 0) && (z == side[line[zz].side2].sect))
1221
            {
1222
                wx[numwalls] = px[line[zz].p2]; wy[numwalls] = py[line[zz].p2];
1223
                wx2[numwalls] = px[line[zz].p1]; wy2[numwalls] = py[line[zz].p1];
1224
                picindex[numwalls] = line[zz].side2; linindex[numwalls++] = zz;
1225
            }
1226
        }
1227
 
1228
        startpoint2 = startnumwalls;
1229
        for(zz=startnumwalls;zz<numwalls;zz++)
1230
        {
2472 hendricks2 1231
            x = wx2[zz];
1232
            y = wy2[zz];
2473 hendricks2 1233
            j = 0;
1234
            for(zzz=zz+1;zzz<numwalls;zzz++)
1235
                if ((wx[zzz] == x) && (wy[zzz] == y))
1236
                {
1237
                    if (j == 0)
1238
                    {
1239
                        i = wx[zz+1]; wx[zz+1] = wx[zzz]; wx[zzz] = i;
1240
                        i = wy[zz+1]; wy[zz+1] = wy[zzz]; wy[zzz] = i;
1241
                        i = wx2[zz+1]; wx2[zz+1] = wx2[zzz]; wx2[zzz] = i;
1242
                        i = wy2[zz+1]; wy2[zz+1] = wy2[zzz]; wy2[zzz] = i;
1243
                        i = picindex[zz+1]; picindex[zz+1] = picindex[zzz]; picindex[zzz] = i;
1244
                        i = linindex[zz+1]; linindex[zz+1] = linindex[zzz]; linindex[zzz] = i;
1245
                        j = 1;
1246
                    }
1247
                    else
1248
                    {
1249
                        j = 1;
1250
                        l1 = (x-wx[zz])*(wy2[zz+1]-y) - (y-wy[zz])*(wx2[zz+1]-x);
1251
                        l2 = (x-wx[zz])*(wy2[zzz]-y) - (y-wy[zz])*(wx2[zzz]-x);
1252
                        if (l1 == 0) j = 2;       //Don't want collinear lines!
1253
                        else if ((l1 < 0) && (l2 > 0)) j = 2;
1254
                        else if ((wx2[zz+1]-x)*(wy2[zzz]-y) > (wy2[zz+1]-y)*(wx2[zzz]-x)) j = 2;
5 Plagman 1255
 
2473 hendricks2 1256
                        if (j == 2)
1257
                        {
1258
                            i = wx[zz+1]; wx[zz+1] = wx[zzz]; wx[zzz] = i;
1259
                            i = wy[zz+1]; wy[zz+1] = wy[zzz]; wy[zzz] = i;
1260
                            i = wx2[zz+1]; wx2[zz+1] = wx2[zzz]; wx2[zzz] = i;
1261
                            i = wy2[zz+1]; wy2[zz+1] = wy2[zzz]; wy2[zzz] = i;
1262
                            i = picindex[zz+1]; picindex[zz+1] = picindex[zzz]; picindex[zzz] = i;
1263
                            i = linindex[zz+1]; linindex[zz+1] = linindex[zzz]; linindex[zzz] = i;
1264
                        }
1265
                    }
1266
                    point2[zz] = zz+1;
1267
                }
1268
            if (j == 0) point2[zz] = startpoint2, startpoint2 = zz+1;
1269
        }
5 Plagman 1270
 
2473 hendricks2 1271
        sector[z].wallptr = startnumwalls;
1272
        sector[z].wallnum = numwalls-startnumwalls;
1273
    }
5 Plagman 1274
 
2473 hendricks2 1275
        //Collect sectors
1276
    for(z=0;z<dnumsectors;z++)
1277
    {
1278
        if (Bstrcasecmp(iwadata[sector[z].ceilingpicnum],"F_SKY1") == 0) sector[z].ceilingstat |= 1;
1279
        if (Bstrcasecmp(iwadata[sector[z].floorpicnum],"F_SKY1") == 0) sector[z].floorstat |= 1;
1280
        sector[z].ceilingz = -(sect[z].ceilingz<<8);
1281
        sector[z].floorz = -(sect[z].floorz<<8);
5 Plagman 1282
 
2473 hendricks2 1283
        startwall = sector[z].wallptr;
1284
        endwall = startwall + sector[z].wallnum;
1285
        for(zz=startwall;zz<endwall;zz++) sectorofwall[zz] = z;
5 Plagman 1286
 
2473 hendricks2 1287
        j = 28-(sect[z].shade>>3);
1288
        if ((sector[z].ceilingstat&1) == 0) sector[z].ceilingshade = j;
1289
        if ((sector[z].floorstat&1) == 0) sector[z].floorshade = j;
1290
        for(i=startwall;i<endwall;i++) wall[i].shade = j;
1291
    }
5 Plagman 1292
 
1293
 
2473 hendricks2 1294
    for(i=0;i<MAXTHINGTYPES;i++) thinglookup[i] = -1;
5 Plagman 1295
 
2473 hendricks2 1296
    for(i=0;i<THINGLISTNUM;i++)
1297
        thinglookup[thinglist[i].num] = getwadindex(thinglist[i].name);
5 Plagman 1298
 
2473 hendricks2 1299
    for(i=0;i<MAXTHINGTYPES;i++)
1300
        if (thinglookup[i] == -1)   //Make bad type numbers into cans
1301
            thinglookup[i] = thinglookup[2035];
5 Plagman 1302
 
1303
 
2473 hendricks2 1304
    for(z=0;z<numwalls;z++) slist[z] = z;
5 Plagman 1305
 
2473 hendricks2 1306
    for(gap=(numwalls>>1);gap>0;gap>>=1)
1307
        for(z=0;z<numwalls-gap;z++)
1308
            for(zz=z;zz>=0;zz-=gap)
1309
            {
1310
                if (wx[slist[zz]] <= wx[slist[zz+gap]]) break;
1311
                i = slist[zz]; slist[zz] = slist[zz+gap]; slist[zz+gap] = i;
1312
            }
5 Plagman 1313
 
2473 hendricks2 1314
    for(z=0;z<numwalls;z++)
1315
    {
1316
        wall[z].x = (((int)wx[z]-cx)<<4);
1317
        wall[z].y = (((int)wy[z]-cy)<<4);
1318
        wall[z].point2 = point2[z];
5 Plagman 1319
 
2473 hendricks2 1320
        wall[z].nextwall = -1;
1321
        wall[z].nextsector = -1;
5 Plagman 1322
 
2473 hendricks2 1323
        x1 = wx[z]; x2 = wx[point2[z]];
1324
        y1 = wy[z]; y2 = wy[point2[z]];
5 Plagman 1325
 
2473 hendricks2 1326
        zz = 0; zzz = 2048;
1327
        do
1328
        {
1329
            if ((zz+zzz < numwalls) && (wx[slist[zz+zzz]] < x2)) zz += zzz;
1330
            zzz >>= 1;
1331
            if ((zz+zzz < numwalls) && (wx[slist[zz+zzz]] < x2)) zz += zzz;
1332
            zzz >>= 1;
1333
        } while (zzz > 0);
5 Plagman 1334
 
2473 hendricks2 1335
        do
1336
        {
1337
            zzx = slist[zz];
1338
            if (wx[zzx] > x2) break;
1339
            if (wy[zzx] == y2)
1340
                if ((wx[point2[zzx]] == x1) && (wy[point2[zzx]] == y1))
1341
                {
1342
                    wall[z].nextwall = zzx;
1343
                    wall[z].nextsector = sectorofwall[zzx];
1344
                    break;
1345
                }
1346
            zz++;
1347
        } while (zz < numwalls);
5 Plagman 1348
 
2473 hendricks2 1349
        if (wall[z].nextwall < 0)
1350
        {
1351
            wall[z].picnum = sidemidpic[picindex[z]];
1352
            wall[z].overpicnum = 0;
1353
        }
1354
        else
1355
        {
1356
            wall[z].picnum = sidetoppic[picindex[z]];
1357
            if (wall[z].picnum <= 0) wall[z].picnum = sidebotpic[picindex[z]];
1358
            if ((wall[z].picnum <= 0) && (wall[z].nextwall >= 0))
1359
            {
1360
                zx = picindex[wall[z].nextwall];
1361
                wall[z].picnum = sidetoppic[zx];
1362
                if (wall[z].picnum <= 0) wall[z].picnum = sidebotpic[zx];
1363
            }
1364
            wall[z].overpicnum = sidemidpic[picindex[z]];
1365
            if (wall[z].overpicnum >= 0) wall[z].cstat |= (1+4+16);
1366
        }
1367
        wall[z].xrepeat = 8;
1368
        wall[z].yrepeat = 8;
1369
        wall[z].xpanning = (char)((-side[picindex[z]].xoffset)&255);
1370
        wall[z].ypanning = (char)(((side[picindex[z]].yoffset<<1))&255);
5 Plagman 1371
 
2473 hendricks2 1372
        if (line[linindex[z]].flags&1) wall[z].cstat |= 1;
1373
        //if (wall[z].nextwall >= 0) wall[z].cstat |= 4;
1374
        //if ((line[linindex[z]].flags&24) && (wall[z].nextwall >= 0))
1375
        //   wall[z].cstat |= 4;
1376
    }
5 Plagman 1377
 
2473 hendricks2 1378
    for(z=0;z<dnumthings;z++)
1379
    {
1380
        sprite[z].x = (((int)thing[z].x-cx)<<4);
1381
        sprite[z].y = (((int)-thing[z].y-cy)<<4);
5 Plagman 1382
 
2473 hendricks2 1383
        sprite[z].sectnum = 0;
1384
        for(zz=0;zz<dnumsectors;zz++)
1385
            if (inside(sprite[z].x,sprite[z].y,(short)zz) != 0)
1386
                { sprite[z].sectnum = zz; break; }
5 Plagman 1387
 
2473 hendricks2 1388
        sprite[z].z = -(sect[sprite[z].sectnum].floorz<<8);
1389
        sprite[z].clipdist = 32;
1390
        sprite[z].xrepeat = 64;
1391
        sprite[z].yrepeat = 64;
1392
        sprite[z].picnum = thinglookup[thing[z].type];
1393
        sprite[z].ang = ((-((thing[z].ang<<11)/360))&2047);
5 Plagman 1394
 
1395
 
2473 hendricks2 1396
        for(i=0;i<numthings;i++)
1397
            if ((thing[z].type >= thingnum[i]) && (thing[z].type <= thingnum2[i]))
1398
                for(j=thingoff[i];j<thingoff[i+1];j++)
1399
                {
1400
                    k = thingfield[j]; zz = thingval[j];
1401
                    switch(thingop[j])
1402
                    {
1403
                        case 0: setspritefield(z,k,zz); break;
1404
                        case 1: setspritefield(z,k,getspritefield(z,k)+zz); break;
1405
                        case 2: setspritefield(z,k,getspritefield(z,k)-zz); break;
1406
                        case 3: setspritefield(z,k,getspritefield(z,k)|zz); break;
1407
                        case 4: setspritefield(z,k,getspritefield(z,k)&zz); break;
1408
                        case 5: setspritefield(z,k,getspritefield(z,k)^zz); break;
1409
                    }
1410
                }
1411
    }
5 Plagman 1412
 
2473 hendricks2 1413
    for(zx=0;zx<numwalls;zx++)
1414
    {
1415
        z = linindex[zx];
1416
        for(i=0;i<numtags;i++)
1417
        {
1418
            if ((line[z].special < tagnum[i]) || (line[z].special > tagnum2[i])) continue;
5 Plagman 1419
 
2473 hendricks2 1420
            for(j=tagoff[i];j<tagoff[i+1];j++)
1421
            {
1422
                k = (tagfield[j]&127);
1423
                zz = tagval[j]; if (zz == INT32_MIN) zz = line[z].tag;
1424
                if (k < 32)
1425
                {
1426
                    l = sectorofwall[zx];
1427
                    if (wall[zx].nextsector >= 0)
1428
                        if ((tagfield[j]&128) ^ (picindex[zx] == line[z].side1))
1429
                            l = wall[zx].nextsector;
5 Plagman 1430
 
2473 hendricks2 1431
                    zzz = sectspri[l][(tagfield[j]>>8)&7];
1432
                    if (zzz < 0)
1433
                    {
1434
                        zzz = dnumthings++;
1435
                        sectspri[l][(tagfield[j]>>8)&7] = zzz;
1436
                        zzx = sector[l].wallptr; x1 = wall[zzx].x; y1 = wall[zzx].y;
1437
                        zzx = wall[zzx].point2; x2 = wall[zzx].x; y2 = wall[zzx].y;
1438
                        sprite[zzz].x = ((x1+x2)>>1) + ksgn(y1-y2);
1439
                        sprite[zzz].y = ((y1+y2)>>1) + ksgn(x2-x1);
1440
                        sprite[zzz].sectnum = l;
1441
                        sprite[zzz].z = sector[l].floorz;
1442
                        sprite[zzz].clipdist = 32;
1443
                        sprite[zzz].xrepeat = 64;
1444
                        sprite[zzz].yrepeat = 64;
1445
                    }
5 Plagman 1446
 
2473 hendricks2 1447
                    switch(tagop[j])
1448
                    {
1449
                        case 0: setspritefield(zzz,k,zz); break;
1450
                        case 1: setspritefield(zzz,k,getspritefield(zzz,k)+zz); break;
1451
                        case 2: setspritefield(zzz,k,getspritefield(zzz,k)-zz); break;
1452
                        case 3: setspritefield(zzz,k,getspritefield(zzz,k)|zz); break;
1453
                        case 4: setspritefield(zzz,k,getspritefield(zzz,k)&zz); break;
1454
                        case 5: setspritefield(zzz,k,getspritefield(zzz,k)^zz); break;
1455
                    }
1456
                }
1457
                else if (k < 64)
1458
                {
1459
                    l = sectorofwall[zx];
1460
                    if (wall[zx].nextsector >= 0)
1461
                        if ((tagfield[j]&128) ^ (picindex[zx] == line[z].side1))
1462
                            l = wall[zx].nextsector;
5 Plagman 1463
 
2473 hendricks2 1464
                    switch(tagop[j])
1465
                    {
1466
                        case 0: setsectorfield(l,k,zz); break;
1467
                        case 1: setsectorfield(l,k,getsectorfield(l,k)+zz); break;
1468
                        case 2: setsectorfield(l,k,getsectorfield(l,k)-zz); break;
1469
                        case 3: setsectorfield(l,k,getsectorfield(l,k)|zz); break;
1470
                        case 4: setsectorfield(l,k,getsectorfield(l,k)&zz); break;
1471
                        case 5: setsectorfield(l,k,getsectorfield(l,k)^zz); break;
1472
                    }
1473
                }
1474
                else if (k < 96)
1475
                {
1476
                    l = zx;
1477
                    if (wall[zx].nextwall >= 0)
1478
                        if ((tagfield[j]&128) ^ (picindex[zx] == line[z].side1))
1479
                            l = wall[zx].nextwall;
5 Plagman 1480
 
2473 hendricks2 1481
                    switch(tagop[j])
1482
                    {
1483
                        case 0: setwallfield(l,k,zz); break;
1484
                        case 1: setwallfield(l,k,getwallfield(l,k)+zz); break;
1485
                        case 2: setwallfield(l,k,getwallfield(l,k)-zz); break;
1486
                        case 3: setwallfield(l,k,getwallfield(l,k)|zz); break;
1487
                        case 4: setwallfield(l,k,getwallfield(l,k)&zz); break;
1488
                        case 5: setwallfield(l,k,getwallfield(l,k)^zz); break;
1489
                    }
1490
                }
1491
            }
1492
        }
1493
    }
5 Plagman 1494
 
2473 hendricks2 1495
    for(l=0;l<dnumsectors;l++)
1496
        for(i=0;i<numsecs;i++)
1497
            if ((sect[l].type >= secnum[i]) && (sect[l].type <= secnum2[i]))
1498
            {
1499
                for(j=secoff[i];j<secoff[i+1];j++)
1500
                {
1501
                    k = (secfield[j]&127);
1502
                    zz = secval[j]; if (zz == INT32_MIN) zz = sect[l].tag;
1503
                    if (k < 32)
1504
                    {
1505
                        zzz = sectspri[l][(secfield[j]>>8)&7];
1506
                        if (zzz < 0)
1507
                        {
1508
                            zzz = dnumthings++;
1509
                            sectspri[l][(secfield[j]>>8)&7] = zzz;
1510
                            zzx = sector[l].wallptr; x1 = wall[zzx].x; y1 = wall[zzx].y;
1511
                            zzx = wall[zzx].point2; x2 = wall[zzx].x; y2 = wall[zzx].y;
1512
                            sprite[zzz].x = ((x1+x2)>>1) + ksgn(y1-y2);
1513
                            sprite[zzz].y = ((y1+y2)>>1) + ksgn(x2-x1);
1514
                            sprite[zzz].sectnum = l;
1515
                            sprite[zzz].z = sector[l].floorz;
1516
                            sprite[zzz].clipdist = 32;
1517
                            sprite[zzz].xrepeat = 64;
1518
                            sprite[zzz].yrepeat = 64;
1519
                        }
5 Plagman 1520
 
2473 hendricks2 1521
                        switch(secop[j])
1522
                        {
1523
                            case 0: setspritefield(zzz,k,zz); break;
1524
                            case 1: setspritefield(zzz,k,getspritefield(zzz,k)+zz); break;
1525
                            case 2: setspritefield(zzz,k,getspritefield(zzz,k)-zz); break;
1526
                            case 3: setspritefield(zzz,k,getspritefield(zzz,k)|zz); break;
1527
                            case 4: setspritefield(zzz,k,getspritefield(zzz,k)&zz); break;
1528
                            case 5: setspritefield(zzz,k,getspritefield(zzz,k)^zz); break;
1529
                        }
1530
                    }
1531
                    else if (k < 64)
1532
                    {
1533
                        switch(secop[j])
1534
                        {
1535
                            case 0: setsectorfield(l,k,zz); break;
1536
                            case 1: setsectorfield(l,k,getsectorfield(l,k)+zz); break;
1537
                            case 2: setsectorfield(l,k,getsectorfield(l,k)-zz); break;
1538
                            case 3: setsectorfield(l,k,getsectorfield(l,k)|zz); break;
1539
                            case 4: setsectorfield(l,k,getsectorfield(l,k)&zz); break;
1540
                            case 5: setsectorfield(l,k,getsectorfield(l,k)^zz); break;
1541
                        }
1542
                    }
1543
                }
1544
            }
5 Plagman 1545
 
2473 hendricks2 1546
    for(z=0;z<dnumsectors;z++)
1547
    {
1548
        sector[z].ceilingpicnum = texturelookup[sector[z].ceilingpicnum];
1549
        sector[z].floorpicnum = texturelookup[sector[z].floorpicnum];
1550
    }
1551
    for(z=0;z<numwalls;z++)
1552
    {
1553
        x = wall[wall[z].point2].x-wall[z].x;
1554
        y = wall[wall[z].point2].y-wall[z].y;
1555
        if ((klabs(x) >= 32768) || (klabs(y) >= 32768))
1556
            wall[z].xrepeat = 255;
1557
        else
1558
        {
1559
            zx = mulscale10(ksqrtasm(x*x+y*y),wall[z].yrepeat);
1560
            wall[z].xrepeat = (char)min(max(zx,1),255);
1561
        }
5 Plagman 1562
 
2473 hendricks2 1563
        wall[z].picnum = texturelookup[wall[z].picnum];
1564
        wall[z].overpicnum = texturelookup[wall[z].overpicnum];
1565
    }
5 Plagman 1566
 
2473 hendricks2 1567
    mapversion = 7; posx = 0; posy = 0; posz = 0; ang = 1536; cursectnum = 0;
5 Plagman 1568
 
2473 hendricks2 1569
        //WATCH OUT THAT FOR DNUMTHINGS BEING HIGHER THAN NUMBER ON DOOM MAP!
1570
    for(i=0;i<dnumthings;i++)
1571
        if (thing[i].type == 1)
1572
        {
1573
            posx = (((int)thing[i].x-cx)<<4);
1574
            posy = (((int)-thing[i].y-cy)<<4);
5 Plagman 1575
 
2473 hendricks2 1576
            cursectnum = 0;
1577
            for(zz=0;zz<dnumsectors;zz++)
1578
                if (inside(posx,posy,(short)zz) != 0)
1579
                    { cursectnum = zz; break; }
5 Plagman 1580
 
2473 hendricks2 1581
            posz = -(sect[cursectnum].floorz<<8) - (32<<8);
1582
            ang = ((-((thing[i].ang<<11)/360))&2047);
1583
            break;
1584
        }
5 Plagman 1585
 
2473 hendricks2 1586
    //getch();
5 Plagman 1587
 
2473 hendricks2 1588
    //setvmode(0x3);
5 Plagman 1589
 
2473 hendricks2 1590
    strcpy(buildmap,doommap);
1591
    if (strchr(buildmap,'.') == 0) strcat(buildmap,".map");
1592
    if ((fil = Bopen(buildmap,BO_BINARY|BO_TRUNC|BO_CREAT|BO_WRONLY,BS_IREAD|BS_IWRITE)) == -1)
1593
    {
2521 hendricks2 1594
        Bprintf("Could not write to %s\n",buildmap);
2473 hendricks2 1595
        exit(0);
1596
    }
1597
    Bwrite(fil,&mapversion,4);
1598
    Bwrite(fil,&posx,4);
1599
    Bwrite(fil,&posy,4);
1600
    Bwrite(fil,&posz,4);
1601
    Bwrite(fil,&ang,2);
1602
    Bwrite(fil,&cursectnum,2);
1603
    Bwrite(fil,&dnumsectors,2);
1604
    Bwrite(fil,sector,sizeof(sectortype)*dnumsectors);
1605
    Bwrite(fil,&numwalls,2);
1606
    Bwrite(fil,wall,sizeof(walltype)*numwalls);
1607
    Bwrite(fil,&dnumthings,2);
1608
    Bwrite(fil,sprite,sizeof(spritetype)*dnumthings);
1609
    Bclose(fil);
5 Plagman 1610
 
2521 hendricks2 1611
    Bprintf("Map converted.\n");
5 Plagman 1612
 
2473 hendricks2 1613
    return 0;
5 Plagman 1614
}
1615
 
1616