From 5135ba05b60e4a4997871030b9b0b8f8a66a6b45 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sat, 2 Oct 2021 17:32:21 -0600 Subject: [PATCH 1/5] build: delete unused files Co-authored-by: Jonathan --- CMakeLists.txt | 4 - common/lbmlib.cc | 448 ------------------------------------- common/scriplib.cc | 159 ------------- common/trilib.cc | 165 -------------- common/wadlib.cc | 311 ------------------------- include/common/lbmlib.hh | 42 ---- include/common/scriplib.hh | 21 -- include/common/trilib.hh | 18 -- include/common/wadlib.hh | 52 ----- 9 files changed, 1220 deletions(-) delete mode 100644 common/lbmlib.cc delete mode 100644 common/scriplib.cc delete mode 100644 common/trilib.cc delete mode 100644 common/wadlib.cc delete mode 100644 include/common/lbmlib.hh delete mode 100644 include/common/scriplib.hh delete mode 100644 include/common/trilib.hh delete mode 100644 include/common/wadlib.hh diff --git a/CMakeLists.txt b/CMakeLists.txt index 7dec4f91..fe99d71d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,14 +24,10 @@ set(COMMON_INCLUDES ${CMAKE_SOURCE_DIR}/include/common/qvec.hh ${CMAKE_SOURCE_DIR}/include/common/bspfile.hh ${CMAKE_SOURCE_DIR}/include/common/cmdlib.hh - ${CMAKE_SOURCE_DIR}/include/common/lbmlib.hh ${CMAKE_SOURCE_DIR}/include/common/log.hh ${CMAKE_SOURCE_DIR}/include/common/mathlib.hh ${CMAKE_SOURCE_DIR}/include/common/polylib.hh - ${CMAKE_SOURCE_DIR}/include/common/scriplib.hh ${CMAKE_SOURCE_DIR}/include/common/threads.hh - ${CMAKE_SOURCE_DIR}/include/common/trilib.hh - ${CMAKE_SOURCE_DIR}/include/common/wadlib.hh ${CMAKE_SOURCE_DIR}/include/common/bsputils.hh) set(QBSP_INCLUDES diff --git a/common/lbmlib.cc b/common/lbmlib.cc deleted file mode 100644 index f9e2ecea..00000000 --- a/common/lbmlib.cc +++ /dev/null @@ -1,448 +0,0 @@ -/* common/lbmlib.c */ - -#include -#include - -/* - * ============================================================================ - * LBM STUFF - * ============================================================================ - */ - -#define FORMID ('F'+('O'<<8)+((int)'R'<<16)+((int)'M'<<24)) -#define ILBMID ('I'+('L'<<8)+((int)'B'<<16)+((int)'M'<<24)) -#define PBMID ('P'+('B'<<8)+((int)'M'<<16)+((int)' '<<24)) -#define BMHDID ('B'+('M'<<8)+((int)'H'<<16)+((int)'D'<<24)) -#define BODYID ('B'+('O'<<8)+((int)'D'<<16)+((int)'Y'<<24)) -#define CMAPID ('C'+('M'<<8)+((int)'A'<<16)+((int)'P'<<24)) - -bmhd_t bmhd; - -int -Align(int l) -{ - if (l & 1) - return l + 1; - return l; -} - -/* - * ================ - * LBMRLEdecompress - * Source must be evenly aligned! - * ================ - */ -uint8_t * -LBMRLEDecompress(uint8_t *source, uint8_t *unpacked, int bpwidth) -{ - int count; - uint8_t b, rept; - - count = 0; - - do { - rept = *source++; - - if (rept > 0x80) { - rept = (rept ^ 0xff) + 2; - b = *source++; - memset(unpacked, b, rept); - unpacked += rept; - } else if (rept < 0x80) { - rept++; - memcpy(unpacked, source, rept); - unpacked += rept; - source += rept; - } else - rept = 0; /* rept of 0x80 is NOP */ - - count += rept; - - } while (count < bpwidth); - - if (count > bpwidth) - Error("Decompression exceeded width!\n"); - - return source; -} - -#define BPLANESIZE 128 -uint8_t bitplanes[9][BPLANESIZE]; /* max size 1024 by 9 bit planes */ - -/* - * ================= - * MungeBitPlanes8 - * This destroys the bit plane data! - * ================= - */ -void -MungeBitPlanes8(int width, uint8_t *dest) -{ - *dest = width; /* shut up the compiler warning */ - Error("MungeBitPlanes8 not rewritten!"); -#if 0 - asm les di,[dest] - asm mov si, -1 asm mov cx,[width] - - - - - - - - - - mungebyte:asm inc si - asm mov dx, 8 - mungebit:asm shl[BYTE PTR bitplanes + BPLANESIZE * 7 + si], 1 - asm rcl al, 1 - asm shl[BYTE PTR bitplanes + BPLANESIZE * 6 + si], 1 - asm rcl al, 1 - asm shl[BYTE PTR bitplanes + BPLANESIZE * 5 + si], 1 - asm rcl al, 1 - asm shl[BYTE PTR bitplanes + BPLANESIZE * 4 + si], 1 - asm rcl al, 1 - asm shl[BYTE PTR bitplanes + BPLANESIZE * 3 + si], 1 - asm rcl al, 1 - asm shl[BYTE PTR bitplanes + BPLANESIZE * 2 + si], 1 - asm rcl al, 1 - asm shl[BYTE PTR bitplanes + BPLANESIZE * 1 + si], 1 - asm rcl al, 1 - asm shl[BYTE PTR bitplanes + BPLANESIZE * 0 + si], 1 - asm rcl al, 1 - asm stosb - asm dec cx - asm jz done asm dec dx asm jnz mungebit asm jmp mungebyte done: -#endif -} void -MungeBitPlanes4(int width, uint8_t *dest) -{ - *dest = width; /* shut up the compiler warning */ - Error("MungeBitPlanes4 not rewritten!"); -#if 0 - - asm les di,[dest] - asm mov si, -1 asm mov cx,[width] - - - - - - - - - - mungebyte:asm inc si - asm mov dx, 8 - mungebit:asm xor al, al - asm shl[BYTE PTR bitplanes + BPLANESIZE * 3 + si], 1 - asm rcl al, 1 - asm shl[BYTE PTR bitplanes + BPLANESIZE * 2 + si], 1 - asm rcl al, 1 - asm shl[BYTE PTR bitplanes + BPLANESIZE * 1 + si], 1 - asm rcl al, 1 - asm shl[BYTE PTR bitplanes + BPLANESIZE * 0 + si], 1 - asm rcl al, 1 - asm stosb - asm dec cx - asm jz done asm dec dx asm jnz mungebit asm jmp mungebyte done: -#endif -} void -MungeBitPlanes2(int width, uint8_t *dest) -{ - *dest = width; /* shut up the compiler warning */ - Error("MungeBitPlanes2 not rewritten!"); -#if 0 - asm les di,[dest] - asm mov si, -1 asm mov cx,[width] - - - - - - - - - - mungebyte:asm inc si - asm mov dx, 8 - mungebit:asm xor al, al - asm shl[BYTE PTR bitplanes + BPLANESIZE * 1 + si], 1 - asm rcl al, 1 - asm shl[BYTE PTR bitplanes + BPLANESIZE * 0 + si], 1 - asm rcl al, 1 - asm stosb - asm dec cx - asm jz done asm dec dx asm jnz mungebit asm jmp mungebyte done: -#endif -} void -MungeBitPlanes1(int width, uint8_t *dest) -{ - *dest = width; /* shut up the compiler warning */ - Error("MungeBitPlanes1 not rewritten!"); -#if 0 - asm les di,[dest] - asm mov si, -1 asm mov cx,[width] - - - - - - - - - - mungebyte:asm inc si - asm mov dx, 8 - mungebit:asm xor al, al - asm shl[BYTE PTR bitplanes + BPLANESIZE * 0 + si], 1 - asm rcl al, 1 - asm stosb - asm dec cx - asm jz done asm dec dx asm jnz mungebit asm jmp mungebyte done: -#endif -} -/* - * ================= - * LoadLBM - * ================= - */ void -LoadLBM(char *filename, uint8_t **picture, uint8_t **palette) -{ - uint8_t *LBMbuffer, *picbuffer, *cmapbuffer; - int y, p, planes; - uint8_t *LBM_P, *LBMEND_P; - uint8_t *pic_p; - uint8_t *body_p; - unsigned rowsize; - - int formtype, formlength; - int chunktype, chunklength; - void (*mungecall) (int, uint8_t *); - - /* quiet compiler warnings */ - picbuffer = NULL; - cmapbuffer = NULL; - mungecall = NULL; - - /* load the LBM */ - LoadFile(filename, &LBMbuffer); - - /* parse the LBM header */ - LBM_P = LBMbuffer; - if (*(int *)LBMbuffer != LittleLong(FORMID)) - Error("No FORM ID at start of file!\n"); - - LBM_P += 4; - formlength = BigLong(*(int *)LBM_P); - LBM_P += 4; - LBMEND_P = LBM_P + Align(formlength); - - formtype = LittleLong(*(int *)LBM_P); - - if (formtype != ILBMID && formtype != PBMID) - Error("Unrecognized form type: %c%c%c%c\n", formtype & 0xff, - (formtype >> 8) & 0xff, (formtype >> 16) & 0xff, - (formtype >> 24) & 0xff); - LBM_P += 4; - - /* parse chunks */ - while (LBM_P < LBMEND_P) { - chunktype = - LBM_P[0] + (LBM_P[1] << 8) + (LBM_P[2] << 16) + (LBM_P[3] << 24); - LBM_P += 4; - chunklength = - LBM_P[3] + (LBM_P[2] << 8) + (LBM_P[1] << 16) + (LBM_P[0] << 24); - LBM_P += 4; - - switch (chunktype) { - case BMHDID: - memcpy(&bmhd, LBM_P, sizeof(bmhd)); - bmhd.w = BigShort(bmhd.w); - bmhd.h = BigShort(bmhd.h); - bmhd.x = BigShort(bmhd.x); - bmhd.y = BigShort(bmhd.y); - bmhd.pageWidth = BigShort(bmhd.pageWidth); - bmhd.pageHeight = BigShort(bmhd.pageHeight); - break; - - case CMAPID: - cmapbuffer = malloc(768); - memset(cmapbuffer, 0, 768); - memcpy(cmapbuffer, LBM_P, chunklength); - break; - - case BODYID: - body_p = LBM_P; - - pic_p = picbuffer = malloc(bmhd.w * bmhd.h); - if (formtype == PBMID) { - - /* unpack PBM */ - for (y = 0; y < bmhd.h; y++, pic_p += bmhd.w) { - if (bmhd.compression == cm_rle1) { - body_p = LBMRLEDecompress((uint8_t *)body_p, - pic_p, bmhd.w); - } else if (bmhd.compression == cm_none) { - memcpy(pic_p, body_p, bmhd.w); - body_p += Align(bmhd.w); - } - } - - } else { - - /* unpack ILBM */ - planes = bmhd.nPlanes; - if (bmhd.masking == ms_mask) - planes++; - rowsize = (bmhd.w + 15) / 16 * 2; - switch (bmhd.nPlanes) { - case 1: - mungecall = MungeBitPlanes1; - break; - case 2: - mungecall = MungeBitPlanes2; - break; - case 4: - mungecall = MungeBitPlanes4; - break; - case 8: - mungecall = MungeBitPlanes8; - break; - default: - Error("Can't munge %i bit planes!\n", bmhd.nPlanes); - } - - for (y = 0; y < bmhd.h; y++, pic_p += bmhd.w) { - for (p = 0; p < planes; p++) - if (bmhd.compression == cm_rle1) { - body_p = LBMRLEDecompress((uint8_t *)body_p, - bitplanes[p], rowsize); - } else if (bmhd.compression == cm_none) { - memcpy(bitplanes[p], body_p, rowsize); - body_p += rowsize; - } - - mungecall(bmhd.w, pic_p); - } - } - break; - } - - LBM_P += Align(chunklength); - } - - free(LBMbuffer); - - *picture = picbuffer; - *palette = cmapbuffer; -} - - -/* - * ============================================================================ - * WRITE LBM - * ============================================================================ - */ - - -/* - * ============== - * WriteLBMfile - * ============== - */ -void -WriteLBMfile(char *filename, uint8_t *data, int width, int height, uint8_t *palette) -{ - uint8_t *lbm, *lbmptr; - int *formlength, *bmhdlength, *cmaplength, *bodylength; - int length; - bmhd_t basebmhd; - - lbm = lbmptr = malloc(width * height + 1000); - - - /* start FORM */ - *lbmptr++ = 'F'; - *lbmptr++ = 'O'; - *lbmptr++ = 'R'; - *lbmptr++ = 'M'; - - formlength = (int *)lbmptr; - lbmptr += 4; /* leave space for length */ - - *lbmptr++ = 'P'; - *lbmptr++ = 'B'; - *lbmptr++ = 'M'; - *lbmptr++ = ' '; - - /* write BMHD */ - *lbmptr++ = 'B'; - *lbmptr++ = 'M'; - *lbmptr++ = 'H'; - *lbmptr++ = 'D'; - - bmhdlength = (int *)lbmptr; - lbmptr += 4; /* leave space for length */ - - memset(&basebmhd, 0, sizeof(basebmhd)); - basebmhd.w = BigShort((short)width); - basebmhd.h = BigShort((short)height); - basebmhd.nPlanes = BigShort(8); - basebmhd.xAspect = BigShort(5); - basebmhd.yAspect = BigShort(6); - basebmhd.pageWidth = BigShort((short)width); - basebmhd.pageHeight = BigShort((short)height); - - memcpy(lbmptr, &basebmhd, sizeof(basebmhd)); - lbmptr += sizeof(basebmhd); - - length = lbmptr - (uint8_t *)bmhdlength - 4; - *bmhdlength = BigLong(length); - if (length & 1) - *lbmptr++ = 0; /* pad chunk to even offset */ - - /* write CMAP */ - *lbmptr++ = 'C'; - *lbmptr++ = 'M'; - *lbmptr++ = 'A'; - *lbmptr++ = 'P'; - - cmaplength = (int *)lbmptr; - lbmptr += 4; /* leave space for length */ - - memcpy(lbmptr, palette, 768); - lbmptr += 768; - - length = lbmptr - (uint8_t *)cmaplength - 4; - *cmaplength = BigLong(length); - if (length & 1) - *lbmptr++ = 0; /* pad chunk to even offset */ - - /* write BODY */ - *lbmptr++ = 'B'; - *lbmptr++ = 'O'; - *lbmptr++ = 'D'; - *lbmptr++ = 'Y'; - - bodylength = (int *)lbmptr; - lbmptr += 4; /* leave space for length */ - - memcpy(lbmptr, data, width * height); - lbmptr += width * height; - - length = lbmptr - (uint8_t *)bodylength - 4; - *bodylength = BigLong(length); - if (length & 1) - *lbmptr++ = 0; /* pad chunk to even offset */ - - /* done */ - length = lbmptr - (uint8_t *)formlength - 4; - *formlength = BigLong(length); - if (length & 1) - *lbmptr++ = 0; /* pad chunk to even offset */ - - /* write output file */ - SaveFile(filename, lbm, lbmptr - lbm); - free(lbm); -} diff --git a/common/scriplib.cc b/common/scriplib.cc deleted file mode 100644 index 28c9d0d0..00000000 --- a/common/scriplib.cc +++ /dev/null @@ -1,159 +0,0 @@ -/* scriplib.c */ - -#include -#include - -/* - * ============================================================================ - * PARSING STUFF - * ============================================================================ - */ - -char token[MAXTOKEN]; -char *scriptbuffer, *script_p, *scriptend_p; -int grabbed; -int scriptline; -qboolean endofscript; -qboolean tokenready; /* only true if UnGetToken was just called */ - -/* - * ============== - * LoadScriptFile - * ============== - */ -void -LoadScriptFile(char *filename) -{ - int size; - - size = LoadFile(filename, &scriptbuffer); - - script_p = scriptbuffer; - scriptend_p = script_p + size; - scriptline = 1; - endofscript = false; - tokenready = false; -} - - -/* - * ============== - * UnGetToken - * Signals that the current token was not used, and should be reported - * for the next GetToken. Note that - * - * GetToken (true); - * UnGetToken (); - * GetToken (false); - * - * could cross a line boundary. - * ============== - */ -void -UnGetToken(void) -{ - tokenready = true; -} - -/* - * ============== - * GetToken - * ============== - */ -qboolean -GetToken(qboolean crossline) -{ - char *token_p; - - if (tokenready) { /* is a token allready waiting? */ - tokenready = false; - return true; - } - - if (script_p >= scriptend_p) { - if (!crossline) - Error("Line %i is incomplete\n", scriptline); - endofscript = true; - return false; - } - - /* skip space */ - skipspace: - while (*script_p <= 32) { - if (script_p >= scriptend_p) { - if (!crossline) - Error("Line %i is incomplete\n", scriptline); - endofscript = true; - return true; - } - if (*script_p++ == '\n') { - if (!crossline) - Error("Line %i is incomplete\n", scriptline); - scriptline++; - } - } - - if (script_p >= scriptend_p) { - if (!crossline) - Error("Line %i is incomplete\n", scriptline); - endofscript = true; - return true; - } - - if (*script_p == ';' || *script_p == '#') { /* semicolon is comment field */ - /* also make # comment field */ - if (!crossline) - Error("Line %i is incomplete\n", scriptline); - while (*script_p++ != '\n') - if (script_p >= scriptend_p) { - endofscript = true; - return false; - } - goto skipspace; - } - - /* copy token */ - token_p = token; - - while (*script_p > 32 && *script_p != ';') { - *token_p++ = *script_p++; - if (script_p == scriptend_p) - break; - if (token_p == &token[MAXTOKEN]) - Error("Token too large on line %i\n", scriptline); - } - - *token_p = 0; - return true; -} - - -/* - * ============== - * TokenAvailable - * Returns true if there is another token on the line - * ============== - */ -qboolean -TokenAvailable(void) -{ - char *search_p; - - search_p = script_p; - - if (search_p >= scriptend_p) - return false; - - while (*search_p <= 32) { - if (*search_p == '\n') - return false; - search_p++; - if (search_p == scriptend_p) - return false; - } - - if (*search_p == ';') - return false; - - return true; -} diff --git a/common/trilib.cc b/common/trilib.cc deleted file mode 100644 index 25cc2a05..00000000 --- a/common/trilib.cc +++ /dev/null @@ -1,165 +0,0 @@ -/* - * common/trilib.c - * - * library for loading triangles from an Alias triangle file - * - */ - -#include -#include -#include -#include - -/* on disk representation of a face */ - -#define FLOAT_START 99999.0 -#define FLOAT_END -FLOAT_START -#define MAGIC 123322 - -/* #define NOISY 1 */ - -typedef struct { - float v[3]; -} vector; - -typedef struct { - vector n; /* normal */ - vector p; /* point */ - vector c; /* color */ - float u; /* u */ - float v; /* v */ -} aliaspoint_t; - -typedef struct { - aliaspoint_t pt[3]; -} tf_triangle; - -void -ByteSwapTri(tf_triangle * tri) -{ - int i; - - for (i = 0; i < sizeof(tf_triangle) / 4; i++) { - ((int *)tri)[i] = BigLong(((int *)tri)[i]); - } -} - -void -LoadTriangleList(char *filename, triangle_t ** pptri, int *numtriangles) -{ - FILE *input; - float start; - char name[256], tex[256]; - int i, count, magic; - tf_triangle tri; - triangle_t *ptri; - int iLevel; - int exitpattern; - float t; - - t = -FLOAT_START; - *((unsigned char *)&exitpattern + 0) = *((unsigned char *)&t + 3); - *((unsigned char *)&exitpattern + 1) = *((unsigned char *)&t + 2); - *((unsigned char *)&exitpattern + 2) = *((unsigned char *)&t + 1); - *((unsigned char *)&exitpattern + 3) = *((unsigned char *)&t + 0); - - if ((input = fopen(filename, "rb")) == 0) { - fprintf(stderr, "reader: could not open file '%s'\n", filename); - exit(0); - } - - iLevel = 0; - - fread(&magic, sizeof(int), 1, input); - if (BigLong(magic) != MAGIC) { - fprintf(stderr, "File is not a Alias object separated triangle file," - " magic number is wrong.\n"); - exit(0); - } - - ptri = malloc(MAXTRIANGLES * sizeof(triangle_t)); - - *pptri = ptri; - - while (feof(input) == 0) { - fread(&start, sizeof(float), 1, input); - *(int *)&start = BigLong(*(int *)&start); - - if (*(int *)&start != exitpattern) { - if (start == FLOAT_START) { - /* Start of an object or group of objects. */ - i = -1; - do { - /* There are probably better ways to read a string from */ - /* a file, but this does allow you to do error checking */ - /* (which I'm not doing) on a per character basis. */ - ++i; - fread(&(name[i]), sizeof(char), 1, input); - } while (name[i] != '\0'); - - /* indent(); */ - /* fprintf(stdout,"OBJECT START: %s\n",name); */ - fread(&count, sizeof(int), 1, input); - count = BigLong(count); - ++iLevel; - if (count != 0) { - /* indent(); */ - - /* fprintf(stdout,"NUMBER OF TRIANGLES: %d\n",count); */ - - i = -1; - do { - ++i; - fread(&(tex[i]), sizeof(char), 1, input); - } while (tex[i] != '\0'); - - /* indent(); */ - /* fprintf(stdout," Object texture name: '%s'\n",tex); */ - } - - /* Else (count == 0) this is the start of a group, and */ - /* no texture name is present. */ - } else if (start == FLOAT_END) { - /* End of an object or group. Yes, the name should be */ - /* obvious from context, but it is in here just to be */ - /* safe and to provide a little extra information for */ - /* those who do not wish to write a recursive reader. */ - /* Mia culpa. */ - --iLevel; - i = -1; - do { - ++i; - fread(&(name[i]), sizeof(char), 1, input); - } while (name[i] != '\0'); - - /* indent(); */ - /* fprintf(stdout,"OBJECT END: %s\n",name); */ - continue; - } - } - - /* read the triangles */ - for (i = 0; i < count; ++i) { - int j; - - fread(&tri, sizeof(tf_triangle), 1, input); - ByteSwapTri(&tri); - for (j = 0; j < 3; j++) { - int k; - - for (k = 0; k < 3; k++) { - ptri->verts[j][k] = tri.pt[j].p.v[k]; - } - } - - ptri++; - - if ((ptri - *pptri) >= MAXTRIANGLES) - Error("Error: too many triangles; increase MAXTRIANGLES\n"); - } - } - - *numtriangles = ptri - *pptri; - - fclose(input); -} diff --git a/common/wadlib.cc b/common/wadlib.cc deleted file mode 100644 index 46591d00..00000000 --- a/common/wadlib.cc +++ /dev/null @@ -1,311 +0,0 @@ -/* common/wadlib.c */ - -#include -#include -#include -#include -#include -#include -#include -/* #include */ -#include - -#ifdef NeXT -#include -#endif - -#include -#include - -/* ============================================================================ - * WAD READING - * ============================================================================ - */ - -lumpinfo_t *lumpinfo; /* location of each lump on disk */ -int numlumps; - -wadinfo_t header; -FILE *wadhandle; - -/* - * ==================== - * W_OpenWad - * ==================== - */ -void -W_OpenWad(char *filename) -{ - lumpinfo_t *lump_p; - unsigned i; - int length; - - /* open the file and add to directory */ - wadhandle = SafeOpenRead(filename); - SafeRead(wadhandle, &header, sizeof(header)); - - if (strncmp(header.identification, "WAD2", 4)) - Error("Wad file %s doesn't have WAD2 id\n", filename); - - header.numlumps = LittleLong(header.numlumps); - header.infotableofs = LittleLong(header.infotableofs); - - numlumps = header.numlumps; - - length = numlumps * sizeof(lumpinfo_t); - lumpinfo = malloc(length); - lump_p = lumpinfo; - - fseek(wadhandle, header.infotableofs, SEEK_SET); - SafeRead(wadhandle, lumpinfo, length); - - /* Fill in lumpinfo */ - for (i = 0; i < numlumps; i++, lump_p++) { - lump_p->filepos = LittleLong(lump_p->filepos); - lump_p->size = LittleLong(lump_p->size); - } -} - - -void -CleanupName(char *in, char *out) -{ - int i; - - for (i = 0; i < sizeof(((lumpinfo_t *) 0)->name); i++) { - if (!in[i]) - break; - - out[i] = toupper(in[i]); - } - - for (; i < sizeof(((lumpinfo_t *) 0)->name); i++) - out[i] = 0; -} - - -/* - * ==================== - * W_CheckNumForName - * Returns -1 if name not found - * ==================== - */ -int -W_CheckNumForName(char *name) -{ - char cleanname[16]; - int v1, v2, v3, v4; - int i; - lumpinfo_t *lump_p; - - CleanupName(name, cleanname); - - /* make the name into four integers for easy compares */ - v1 = *(int *)cleanname; - v2 = *(int *)&cleanname[4]; - v3 = *(int *)&cleanname[8]; - v4 = *(int *)&cleanname[12]; - - /* find it */ - lump_p = lumpinfo; - for (i = 0; i < numlumps; i++, lump_p++) { - if (*(int *)lump_p->name == v1 - && *(int *)&lump_p->name[4] == v2 - && *(int *)&lump_p->name[8] == v3 - && *(int *)&lump_p->name[12] == v4) - return i; - } - - return -1; -} - - -/* - * ==================== - * W_GetNumForName - * - * Calls W_CheckNumForName, but bombs out if not found - * ==================== - */ -int -W_GetNumForName(char *name) -{ - int i; - - i = W_CheckNumForName(name); - if (i != -1) - return i; - - Error("%s: %s not found!", __func__, name); - return -1; -} - - -/* - * ==================== - * W_LumpLength - * Returns the buffer size needed to load the given lump - * ==================== - */ -int -W_LumpLength(int lump) -{ - if (lump >= numlumps) - Error("%s: %i >= numlumps", __func__, lump); - return lumpinfo[lump].size; -} - - -/* - * ==================== - * W_ReadLumpNum - * Loads the lump into the given buffer, which must be >= W_LumpLength() - * ==================== - */ -void -W_ReadLumpNum(int lump, void *dest) -{ - lumpinfo_t *l; - - if (lump >= numlumps) - Error("%s: %i >= numlumps", __func__, lump); - l = lumpinfo + lump; - - fseek(wadhandle, l->filepos, SEEK_SET); - SafeRead(wadhandle, dest, l->size); -} - - -/* - * ==================== - * W_LoadLumpNum - * ==================== - */ -void * -W_LoadLumpNum(int lump) -{ - void *buf; - - if ((unsigned)lump >= numlumps) - Error("%s: %i >= numlumps", __func__, lump); - - buf = malloc(W_LumpLength(lump)); - W_ReadLumpNum(lump, buf); - - return buf; -} - - -/* - * ==================== - * W_LoadLumpName - * ==================== - */ -void * -W_LoadLumpName(char *name) -{ - return W_LoadLumpNum(W_GetNumForName(name)); -} - - -/* - * ============================================================================ - * WAD CREATION - * ============================================================================ - */ - -FILE *outwad; -lumpinfo_t outinfo[4096]; -int outlumps; - -short (*wadshort) (short l); -int (*wadlong) (int l); - -/* - * =============== - * NewWad - * =============== - */ - -void -NewWad(char *pathname, qboolean bigendien) -{ - outwad = SafeOpenWrite(pathname); - fseek(outwad, sizeof(wadinfo_t), SEEK_SET); - memset(outinfo, 0, sizeof(outinfo)); - - if (bigendien) { - wadshort = BigShort; - wadlong = BigLong; - } else { - wadshort = LittleShort; - wadlong = LittleLong; - } - - outlumps = 0; -} - - -/* - * =============== - * AddLump - * =============== - */ - -void -AddLump(char *name, void *buffer, int length, int type, int compress) -{ - lumpinfo_t *info; - int ofs; - - info = &outinfo[outlumps]; - outlumps++; - - memset(info, 0, sizeof(info)); - - strcpy(info->name, name); - Q_strupr(info->name); - - ofs = ftell(outwad); - info->filepos = wadlong(ofs); - info->size = info->disksize = wadlong(length); - info->type = type; - info->compression = compress; - - /* FIXME: do compression */ - - SafeWrite(outwad, buffer, length); -} - - -/* - * =============== - * WriteWad - * =============== - */ - -void -WriteWad(void) -{ - wadinfo_t header; - int ofs; - - /* write the lumpingo */ - ofs = ftell(outwad); - - SafeWrite(outwad, outinfo, outlumps * sizeof(lumpinfo_t)); - - /* write the header */ - /* a program will be able to tell the ednieness of a wad by the id */ - header.identification[0] = 'W'; - header.identification[1] = 'A'; - header.identification[2] = 'D'; - header.identification[3] = '2'; - - header.numlumps = wadlong(outlumps); - header.infotableofs = wadlong(ofs); - - fseek(outwad, 0, SEEK_SET); - SafeWrite(outwad, &header, sizeof(header)); - fclose(outwad); -} diff --git a/include/common/lbmlib.hh b/include/common/lbmlib.hh deleted file mode 100644 index e865fcf4..00000000 --- a/include/common/lbmlib.hh +++ /dev/null @@ -1,42 +0,0 @@ -/* common/lbmlib.h */ - -#ifndef __COMMON_LBMLIB_H__ -#define __COMMON_LBMLIB_H__ - -typedef unsigned char UBYTE; -typedef short WORD; -typedef unsigned short UWORD; -typedef long LONG; - -typedef enum { - ms_none, - ms_mask, - ms_transcolor, - ms_lasso -} mask_t; - -typedef enum { - cm_none, - cm_rle1 -} compress_t; - -typedef struct { - UWORD w, h; - WORD x, y; - UBYTE nPlanes; - UBYTE masking; - UBYTE compression; - UBYTE pad1; - UWORD transparentColor; - UBYTE xAspect, yAspect; - WORD pageWidth, pageHeight; -} bmhd_t; - -extern bmhd_t bmhd; /* will be in native byte order */ - -void LoadLBM(char *filename, uint8_t **picture, uint8_t **palette); - -void WriteLBMfile(char *filename, uint8_t *data, int width, int height, - uint8_t *palette); - -#endif /* __COMMON_LBMLIB_H__ */ diff --git a/include/common/scriplib.hh b/include/common/scriplib.hh deleted file mode 100644 index 81440fd6..00000000 --- a/include/common/scriplib.hh +++ /dev/null @@ -1,21 +0,0 @@ -/* common/scriplib.h */ - -#ifndef __COMMON_SCRIPLIB_H__ -#define __COMMON_SCRIPLIB_H__ - -#include - -#define MAXTOKEN 128 - -extern char token[MAXTOKEN]; -extern char *scriptbuffer, *script_p, *scriptend_p; -extern int grabbed; -extern int scriptline; -extern qboolean endofscript; - -void LoadScriptFile(char *filename); -qboolean GetToken(qboolean crossline); -void UnGetToken(void); -qboolean TokenAvailable(void); - -#endif /* __COMMON_SCRIPLIB_H__ */ diff --git a/include/common/trilib.hh b/include/common/trilib.hh deleted file mode 100644 index b88753e8..00000000 --- a/include/common/trilib.hh +++ /dev/null @@ -1,18 +0,0 @@ -/* common/trilib.h - * - * Header file for loading triangles from an Alias triangle file - * - */ - -#ifndef __COMMON_TRILIB_H__ -#define __COMMON_TRILIB_H__ - -#define MAXTRIANGLES 2048 - -typedef struct { - vec3_t verts[3]; -} triangle_t; - -void LoadTriangleList(char *filename, triangle_t ** pptri, int *numtriangles); - -#endif /* __COMMON_TRILIB_H__ */ diff --git a/include/common/wadlib.hh b/include/common/wadlib.hh deleted file mode 100644 index 61f2eaee..00000000 --- a/include/common/wadlib.hh +++ /dev/null @@ -1,52 +0,0 @@ -/* common/wadlib.h */ - -#ifndef __COMMON_WADLIB_H__ -#define __COMMON_WADLIB_H__ - -/* wad reading */ - -#define CMP_NONE 0 -#define CMP_LZSS 1 - -#define TYP_NONE 0 -#define TYP_LABEL 1 -#define TYP_LUMPY 64 /* 64 + grab command number */ - -typedef struct { - char identification[4]; /* should be WAD2 or 2DAW */ - int numlumps; - int infotableofs; -} wadinfo_t; - - -typedef struct { - int filepos; - int disksize; - int size; /* uncompressed */ - char type; - char compression; - char pad1, pad2; - char name[16]; /* must be null terminated */ -} lumpinfo_t; - -extern lumpinfo_t *lumpinfo; /* location of each lump on disk */ -extern int numlumps; -extern wadinfo_t header; - -void W_OpenWad(char *filename); -int W_CheckNumForName(char *name); -int W_GetNumForName(char *name); -int W_LumpLength(int lump); -void W_ReadLumpNum(int lump, void *dest); -void *W_LoadLumpNum(int lump); -void *W_LoadLumpName(char *name); - -void CleanupName(char *in, char *out); - -/* wad creation */ - -void NewWad(char *pathname, qboolean bigendien); -void AddLump(char *name, void *buffer, int length, int type, int compress); -void WriteWad(void); - -#endif /* __COMMON_WADLIB_H__ */ From 9e9e21eaae372e64000eac981d880d54825ee0bb Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sat, 25 Sep 2021 15:42:42 -0600 Subject: [PATCH 2/5] qbsp: move BSPX BRUSHLIST struct types out to bspfile.hh --- include/common/bspfile.hh | 21 +++++++++++++++++++++ qbsp/qbsp.cc | 23 +++-------------------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/include/common/bspfile.hh b/include/common/bspfile.hh index 8f8f106b..824264bb 100644 --- a/include/common/bspfile.hh +++ b/include/common/bspfile.hh @@ -626,6 +626,27 @@ typedef struct bspxentry_s struct bspxentry_s *next; } bspxentry_t; +// BRUSHLIST BSPX lump + +struct bspxbrushes_permodel { + int32_t ver; + int32_t modelnum; + int32_t numbrushes; + int32_t numfaces; +}; +struct bspxbrushes_perbrush { + float mins[3]; + float maxs[3]; + int16_t contents; + uint16_t numfaces; +}; +struct bspxbrushes_perface { + float normal[3]; + float dist; +}; + +/* ========================================================================= */ + struct bsp29_t { int nummodels; dmodelq1_t *dmodels_q; diff --git a/qbsp/qbsp.cc b/qbsp/qbsp.cc index 75d478eb..ec854672 100644 --- a/qbsp/qbsp.cc +++ b/qbsp/qbsp.cc @@ -339,26 +339,7 @@ void BSPX_Brushes_AddModel(struct bspxbrushes_s *ctx, int modelnum, brush_t *bru brush_t *b; face_t *f; - struct - { - int ver; - int modelnum; - int numbrushes; - int numfaces; - } permodel; - struct - { - float mins[3]; - float maxs[3]; - short contents; - unsigned short numfaces; - } perbrush; - struct - { - float normal[3]; - float dist; - } perface; - + bspxbrushes_permodel permodel; permodel.numbrushes = 0; permodel.numfaces = 0; for (b = brushes; b; b = b->next) @@ -383,6 +364,7 @@ void BSPX_Brushes_AddModel(struct bspxbrushes_s *ctx, int modelnum, brush_t *bru for (b = brushes; b; b = b->next) { + bspxbrushes_perbrush perbrush; perbrush.numfaces = 0; for (f = b->faces; f; f = f->next) { @@ -428,6 +410,7 @@ void BSPX_Brushes_AddModel(struct bspxbrushes_s *ctx, int modelnum, brush_t *bru for (f = b->faces; f; f = f->next) { + bspxbrushes_perface perface; /*skip axial*/ if (fabs(map.planes[f->planenum].normal[0]) == 1 || fabs(map.planes[f->planenum].normal[1]) == 1 || From a871b5541933be69a178788e96938d4ba9fb304d Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sat, 2 Oct 2021 17:56:45 -0600 Subject: [PATCH 3/5] bspxentry_t: make lumpdata a uint8_t* --- include/common/bspfile.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/common/bspfile.hh b/include/common/bspfile.hh index 824264bb..26185326 100644 --- a/include/common/bspfile.hh +++ b/include/common/bspfile.hh @@ -620,7 +620,7 @@ typedef struct { typedef struct bspxentry_s { char lumpname[24]; - const void *lumpdata; + const uint8_t *lumpdata; size_t lumpsize; struct bspxentry_s *next; From 8fd3f14bf9d401952d373a2620ba9bf634a4a60a Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sat, 2 Oct 2021 17:30:55 -0600 Subject: [PATCH 4/5] bspinfo: json export Co-authored-by: Jonathan --- .gitmodules | 3 + 3rdparty/CMakeLists.txt | 2 + 3rdparty/json | 1 + bspinfo/CMakeLists.txt | 2 +- bspinfo/bspinfo.cc | 246 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 253 insertions(+), 1 deletion(-) create mode 160000 3rdparty/json diff --git a/.gitmodules b/.gitmodules index 0145e2a1..9e6d12d8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "3rdparty/googletest"] path = 3rdparty/googletest url = https://github.com/google/googletest +[submodule "3rdparty/json"] + path = 3rdparty/json + url = https://github.com/ArthurSonzogni/nlohmann_json_cmake_fetchcontent diff --git a/3rdparty/CMakeLists.txt b/3rdparty/CMakeLists.txt index 91ca7e4f..934bf296 100644 --- a/3rdparty/CMakeLists.txt +++ b/3rdparty/CMakeLists.txt @@ -4,3 +4,5 @@ set(BUILD_GMOCK OFF CACHE BOOL "" FORCE) set(INSTALL_GTEST OFF CACHE BOOL "" FORCE) set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) add_subdirectory(googletest EXCLUDE_FROM_ALL) + +add_subdirectory(json EXCLUDE_FROM_ALL) \ No newline at end of file diff --git a/3rdparty/json b/3rdparty/json new file mode 160000 index 00000000..0db99d5e --- /dev/null +++ b/3rdparty/json @@ -0,0 +1 @@ +Subproject commit 0db99d5ed1ba0c4409509db3916e7bd8398ee920 diff --git a/bspinfo/CMakeLists.txt b/bspinfo/CMakeLists.txt index 550221e0..e56c0406 100644 --- a/bspinfo/CMakeLists.txt +++ b/bspinfo/CMakeLists.txt @@ -8,5 +8,5 @@ set(BSPINFO_SOURCES ${COMMON_INCLUDES}) add_executable(bspinfo ${BSPINFO_SOURCES}) -target_link_libraries(bspinfo ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries(bspinfo ${CMAKE_THREAD_LIBS_INIT} fmt::fmt nlohmann_json::nlohmann_json) install(TARGETS bspinfo RUNTIME DESTINATION bin) diff --git a/bspinfo/bspinfo.cc b/bspinfo/bspinfo.cc index b5f5bed0..1c5246a5 100644 --- a/bspinfo/bspinfo.cc +++ b/bspinfo/bspinfo.cc @@ -21,6 +21,247 @@ #include #include +#include +#include +#include +#include +#include + +using namespace nlohmann; + +static std::string hex_string(const uint8_t* bytes, const size_t count) { + std::stringstream str; + + for (size_t i = 0; i < count; ++i) { + fmt::print(str, "{:x}", bytes[i]); + } + + return str.str(); +} + +/** + * returns a JSON array of models + */ +static json serialzie_bspxbrushlist(const uint8_t* const lumpdata, const size_t lumpsize) { + json j = json::array(); + + const uint8_t* p = lumpdata; + + while (p < (lumpdata + lumpsize)) { + bspxbrushes_permodel src_model; + memcpy(&src_model, p, sizeof(bspxbrushes_permodel)); + p += sizeof(src_model); + + json &model = j.insert(j.end(), json::object()).value(); + model["ver"] = src_model.ver; + model["modelnum"] = src_model.modelnum; + model["numbrushes"] = src_model.numbrushes; + model["numfaces"] = src_model.numfaces; + json &brushes = (model.emplace("brushes", json::array())).first.value(); + + for (int32_t i = 0; i < src_model.numbrushes; ++i) { + bspxbrushes_perbrush src_brush; + memcpy(&src_brush, p, sizeof(bspxbrushes_perbrush)); + p += sizeof(src_brush); + + json &brush = brushes.insert(brushes.end(), json::object()).value(); + brush.push_back({ "mins", json::array({ src_brush.mins[0], src_brush.mins[1], src_brush.mins[2] }) }); + brush.push_back({ "maxs", json::array({ src_brush.maxs[0], src_brush.maxs[1], src_brush.maxs[2] }) }); + brush.push_back({ "contents", src_brush.contents }); + json &faces = (brush.emplace("faces", json::array())).first.value(); + + for (int32_t j = 0; j < src_brush.numfaces; ++j) { + bspxbrushes_perface src_face; + memcpy(&src_face, p, sizeof(bspxbrushes_perface)); + p += sizeof(src_face); + + json &face = faces.insert(faces.end(), json::object()).value(); + face.push_back({ "normal", json::array({ src_face.normal[0], src_face.normal[1], src_face.normal[2] }) }); + face.push_back({ "dist", src_face.dist }); + } + } + } + + return j; +} + +static void serialize_bsp(const bspdata_t &bspdata, const char *name) { + const mbsp_t &bsp = bspdata.data.mbsp; + + json j = json::object(); + + if (bsp.nummodels) { + json &models = (j.emplace("models", json::array())).first.value(); + + for (int32_t i = 0; i < bsp.nummodels; i++) { + json &model = models.insert(models.end(), json::object()).value(); + auto &src_model = bsp.dmodels[i]; + + model.push_back({ "mins", json::array({ src_model.mins[0], src_model.mins[1], src_model.mins[2] }) }); + model.push_back({ "maxs", json::array({ src_model.maxs[0], src_model.maxs[1], src_model.maxs[2] }) }); + model.push_back({ "origin", json::array({ src_model.origin[0], src_model.origin[1], src_model.origin[2] }) }); + model.push_back({ "headnode", json::array({ src_model.headnode[0], src_model.headnode[1], src_model.headnode[2], src_model.headnode[3], src_model.headnode[4], src_model.headnode[5], src_model.headnode[6], src_model.headnode[7] }) }); + model.push_back({ "visleafs", src_model.visleafs }); + model.push_back({ "firstface", src_model.firstface }); + model.push_back({ "numfaces", src_model.numfaces }); + } + } + + if (bsp.visdatasize) { + j["visdata"] = hex_string(bsp.dvisdata, bsp.visdatasize); + } + + if (bsp.lightdatasize) { + j["lightdata"] = hex_string(bsp.dlightdata, bsp.lightdatasize); + } + + if (bsp.entdatasize) { + j["entdata"] = std::string(bsp.dentdata, static_cast(bsp.entdatasize)); + } + + if (bsp.numleafs) { + json &leafs = (j.emplace("leafs", json::array())).first.value(); + + for (int32_t i = 0; i < bsp.numleafs; i++) { + json &leaf = leafs.insert(leafs.end(), json::object()).value(); + auto &src_leaf = bsp.dleafs[i]; + + leaf.push_back({ "contents", src_leaf.contents }); + leaf.push_back({ "visofs", src_leaf.visofs }); + leaf.push_back({ "mins", json::array({ src_leaf.mins[0], src_leaf.mins[1], src_leaf.mins[2] }) }); + leaf.push_back({ "maxs", json::array({ src_leaf.maxs[0], src_leaf.maxs[1], src_leaf.maxs[2] }) }); + leaf.push_back({ "firstmarksurface", src_leaf.firstmarksurface }); + leaf.push_back({ "nummarksurfaces", src_leaf.nummarksurfaces }); + leaf.push_back({ "ambient_level", json::array({ src_leaf.ambient_level[0], src_leaf.ambient_level[1], src_leaf.ambient_level[2], src_leaf.ambient_level[3] }) }); + leaf.push_back({ "cluster", src_leaf.cluster }); + leaf.push_back({ "area", src_leaf.area }); + leaf.push_back({ "firstleafbrush", src_leaf.firstleafbrush }); + leaf.push_back({ "numleafbrushes", src_leaf.numleafbrushes }); + } + } + + if (bsp.numplanes) { + json &planes = (j.emplace("planes", json::array())).first.value(); + + for (int32_t i = 0; i < bsp.numplanes; i++) { + json &plane = planes.insert(planes.end(), json::object()).value(); + auto &src_plane = bsp.dplanes[i]; + + plane.push_back({ "normal", json::array({ src_plane.normal[0], src_plane.normal[1], src_plane.normal[2] }) }); + plane.push_back({ "dist", src_plane.dist }); + plane.push_back({ "type", src_plane.type }); + } + } + + if (bsp.numvertexes) { + json &vertexes = (j.emplace("vertexes", json::array())).first.value(); + + for (int32_t i = 0; i < bsp.numvertexes; i++) { + auto &src_vertex = bsp.dvertexes[i]; + + vertexes.insert(vertexes.end(), json::array({src_vertex.point[0], src_vertex.point[1], src_vertex.point[2]})); + } + } + + if (bsp.numnodes) { + json &nodes = (j.emplace("nodes", json::array())).first.value(); + + for (int32_t i = 0; i < bsp.numnodes; i++) { + json &node = nodes.insert(nodes.end(), json::object()).value(); + auto &src_node = bsp.dnodes[i]; + + node.push_back({ "planenum", src_node.planenum }); + node.push_back({ "children", json::array({ src_node.children[0], src_node.children[1] }) }); + node.push_back({ "mins", json::array({ src_node.mins[0], src_node.mins[1], src_node.mins[2] }) }); + node.push_back({ "maxs", json::array({ src_node.maxs[0], src_node.maxs[1], src_node.maxs[2] }) }); + node.push_back({ "firstface", src_node.firstface }); + node.push_back({ "numfaces", src_node.numfaces }); + } + } + + if (bsp.numtexinfo) { + json &texinfos = (j.emplace("texinfo", json::array())).first.value(); + + for (int32_t i = 0; i < bsp.numtexinfo; i++) { + json &texinfo = texinfos.insert(texinfos.end(), json::object()).value(); + auto &src_texinfo = bsp.texinfo[i]; + + texinfo.push_back({ "vecs", json::array({ + json::array({ src_texinfo.vecs[0][0], src_texinfo.vecs[0][1], src_texinfo.vecs[0][2], src_texinfo.vecs[0][3] }), + json::array({ src_texinfo.vecs[1][0], src_texinfo.vecs[1][1], src_texinfo.vecs[1][2], src_texinfo.vecs[1][3] }) + })}); + texinfo.push_back({ "flags", src_texinfo.flags }); + texinfo.push_back({ "miptex", src_texinfo.miptex }); + texinfo.push_back({ "value", src_texinfo.value }); + texinfo.push_back({ "texture", std::string(src_texinfo.texture) }); + texinfo.push_back({ "nexttexinfo", src_texinfo.nexttexinfo }); + } + } + + if (bsp.numclipnodes) { + json &clipnodes = (j.emplace("clipnodes", json::array())).first.value(); + + for (int32_t i = 0; i < bsp.numclipnodes; i++) { + json &clipnode = clipnodes.insert(clipnodes.end(), json::object()).value(); + auto &src_clipnodes = bsp.dclipnodes[i]; + + clipnode.push_back({ "planenum", src_clipnodes.planenum }); + clipnode.push_back({ "children", json::array({ src_clipnodes.children[0], src_clipnodes.children[1] })}); + } + } + + if (bsp.numbrushsides) { + json &brushsides = (j.emplace("brushsides", json::array())).first.value(); + + for (int32_t i = 0; i < bsp.numbrushsides; i++) { + json &brushside = brushsides.insert(brushsides.end(), json::object()).value(); + auto &src_brushside = bsp.dbrushsides[i]; + + brushside.push_back({ "planenum", src_brushside.planenum }); + brushside.push_back({ "texinfo", src_brushside.texinfo }); + } + } + + if (bsp.numbrushes) { + json &brushes = (j.emplace("brushes", json::array())).first.value(); + + for (int32_t i = 0; i < bsp.numbrushes; i++) { + json &brush = brushes.insert(brushes.end(), json::object()).value(); + auto &src_brush = bsp.dbrushes[i]; + + brush.push_back({ "firstside", src_brush.firstside }); + brush.push_back({ "numsides", src_brush.numsides }); + brush.push_back({ "contents", src_brush.contents }); + } + } + + if (bsp.numleafbrushes) { + json &leafbrushes = (j.emplace("leafbrushes", json::array())).first.value(); + + for (int32_t i = 0; i < bsp.numleafbrushes; i++) { + leafbrushes.push_back(bsp.dleafbrushes[i]); + } + } + + if (bspdata.bspxentries) { + json &bspxentries = (j.emplace("bspxentries", json::array())).first.value(); + + for (auto* lump = bspdata.bspxentries; lump; lump = lump->next) { + json &entry = bspxentries.insert(bspxentries.end(), json::object()).value(); + entry["lumpname"] = std::string(lump->lumpname); + + if (!strcmp(lump->lumpname, "BRUSHLIST")) { + entry["models"] = serialzie_bspxbrushlist(lump->lumpdata, lump->lumpsize); + } else { + // unhandled BSPX lump, just write the raw data + entry["lumpdata"] = hex_string(lump->lumpdata, lump->lumpsize); + } + } + } + + std::ofstream(name, std::fstream::out | std::fstream::trunc | std::fstream::binary) << std::setw(4) < Date: Sat, 2 Oct 2021 20:15:43 -0600 Subject: [PATCH 5/5] testmaps: add lava, water, sky, origin to qbspfeatures.map --- testmaps/qbsp-vis.sha256sum | 2 +- testmaps/qbsp.sha256sum | 2 +- testmaps/qbspfeatures.map | 291 ++++++++++++++++++++++++++++++++---- 3 files changed, 265 insertions(+), 30 deletions(-) diff --git a/testmaps/qbsp-vis.sha256sum b/testmaps/qbsp-vis.sha256sum index a13b77c6..08a9797c 100644 --- a/testmaps/qbsp-vis.sha256sum +++ b/testmaps/qbsp-vis.sha256sum @@ -7,4 +7,4 @@ a5eb5b451baab8db48a141285479669656010fc7d3945e30672d609169b040e5 *e1m1-hexen2-2p ecf7a82cfad86c3b8a330645233c17011f77b8fef844130ac85dd6e8972eea8f *e1m1-hlbsp.bsp ce687f32a1059eb60bfb2b3868dc5fa8446a62aefc40f9cb459d0242b16b39ef *e1m1-bspxbrushes.bsp 0feeb8e76b2c3e0a9d8abf1233fc1450e85c6b54ade5a96dea9f965f0fbc2dde *e1m1-bsp29-onlyents.bsp -a77527bae28e0b4840976efb06bec550261688af11a9a4b45cb97144a0aae52b *qbspfeatures.bsp +8536a7000d995ec1c9365aebe492412f0d175ef49b72f30990b621b48145d881 *qbspfeatures.bsp diff --git a/testmaps/qbsp.sha256sum b/testmaps/qbsp.sha256sum index 21e4e743..ef1c575a 100644 --- a/testmaps/qbsp.sha256sum +++ b/testmaps/qbsp.sha256sum @@ -7,4 +7,4 @@ d289427e3c8a7046dce509a83401f6732a9c5f8194f8beb3eee431e33215656c *e1m1-bsp29.bsp 66936b95d27716cbcb28bc6bf8a0191f8d53bc7e2823abcb85cd04fec9d2fcb6 *e1m1-hlbsp.bsp 015c5fb3f350dfb10c031ed3ae44b3e094fbde38c48dec0897d0710fcbc7666c *e1m1-bspxbrushes.bsp af7bc468d76aa1b11d1881a3378877059c6fd33fb37bea555d332e17d0e1e23c *e1m1-bsp29-onlyents.bsp -eef438a0c8bf20cf05f7b91d8b0a36c4e968fe2820c692ea09300482ef83313a *qbspfeatures.bsp +9f6db65a0c8a3eaa369deb3bb3168b5da69f23eb80a12788ff50d3c30b8a469a *qbspfeatures.bsp diff --git a/testmaps/qbspfeatures.map b/testmaps/qbspfeatures.map index bf269de8..9c857a45 100644 --- a/testmaps/qbspfeatures.map +++ b/testmaps/qbspfeatures.map @@ -5,6 +5,8 @@ "mapversion" "220" "classname" "worldspawn" "wad" "deprecated/free_wad.wad;deprecated/fence.wad;deprecated/origin.wad;deprecated/hintskip.wad" +"_wateralpha" "0.5" +"_tb_def" "builtin:Quoth2.fgd" // brush 0 { ( -80 256 16 ) ( -80 257 16 ) ( -80 256 17 ) brown_brick [ 0 -1 0 0 ] [ 0 0 -1 32 ] 0 1 1 @@ -92,7 +94,7 @@ ( 288 -336 80 ) ( 287 -336 80 ) ( 288 -336 81 ) orangestuff8 [ -1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 ( 288 -256 80 ) ( 288 -255 80 ) ( 287 -256 80 ) orangestuff8 [ 1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 ( 208 64 96 ) ( 207 64 96 ) ( 208 65 96 ) orangestuff8 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 -( 208 80 96 ) ( 208 80 97 ) ( 207 80 96 ) orangestuff8 [ 1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 +( 208 -40 96 ) ( 208 -40 97 ) ( 207 -40 96 ) orangestuff8 [ 1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 ( 288 -256 80 ) ( 288 -256 81 ) ( 288 -255 80 ) orangestuff8 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 } // brush 10 @@ -102,19 +104,10 @@ ( 144 80 80 ) ( 144 81 80 ) ( 143 80 80 ) orangestuff8 [ 1 0 0 16 ] [ 0 -1 0 16 ] 180 1 1 ( 64 400 96 ) ( 63 400 96 ) ( 64 401 96 ) orangestuff8 [ -1 0 0 -16 ] [ 0 -1 0 16 ] 180 1 1 ( 64 176 96 ) ( 64 176 97 ) ( 63 176 96 ) orangestuff8 [ 1 0 0 16 ] [ 0 0 -1 0 ] 180 1 1 -( 288 80 80 ) ( 288 80 81 ) ( 288 81 80 ) orangestuff8 [ 0 -1 0 16 ] [ 0 0 -1 0 ] 0 1 1 +( 192 80 80 ) ( 192 80 81 ) ( 192 81 80 ) orangestuff8 [ 0 -1 0 16 ] [ 0 0 -1 0 ] 0 1 1 } // brush 11 { -( 288 192 80 ) ( 288 193 80 ) ( 288 192 81 ) tsl_wall1 [ 0 1 0 0 ] [ 0 0 -1 -32 ] 0 1 1 -( 304 -432 64 ) ( 303 -432 64 ) ( 304 -432 65 ) tsl_wall1 [ -1 0 0 16 ] [ 0 0 -1 -32 ] 180 1 1 -( 304 -256 96 ) ( 304 -255 96 ) ( 303 -256 96 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 -1 0 0 ] 180 1 1 -( 288 192 352 ) ( 287 192 352 ) ( 288 193 352 ) tsl_wall1 [ -1 0 0 16 ] [ 0 -1 0 0 ] 180 1 1 -( 288 176 80 ) ( 288 176 81 ) ( 287 176 80 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 0 -1 -32 ] 180 1 1 -( 304 -256 64 ) ( 304 -256 65 ) ( 304 -255 64 ) tsl_wall1 [ 0 -1 0 0 ] [ 0 0 -1 -32 ] 0 1 1 -} -// brush 12 -{ ( 160 64 88 ) ( 160 65 88 ) ( 160 64 89 ) clip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 192 -272 80 ) ( 191 -272 80 ) ( 192 -272 81 ) clip [ -1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 ( 192 32 16 ) ( 192 33 16 ) ( 191 32 16 ) clip [ 1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 @@ -122,7 +115,7 @@ ( 168 64 88 ) ( 168 64 89 ) ( 167 64 88 ) clip [ 1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 ( 192 32 80 ) ( 192 32 81 ) ( 192 33 80 ) clip [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 } -// brush 13 +// brush 12 { ( 64 32 80 ) ( 64 33 80 ) ( 64 32 81 ) clip [ -6.123233995736766e-17 1 0 -32 ] [ 0 0 -1 0 ] 0 1 1 ( 128 32 80 ) ( 128 32 81 ) ( 129 32 80 ) clip [ -1 -6.123233995736766e-17 0 32 ] [ 0 0 -1 0 ] 180 1 1 @@ -131,7 +124,7 @@ ( 160 64 88 ) ( 161 64 88 ) ( 160 64 89 ) clip [ 1 6.123233995736766e-17 0 -32 ] [ 0 0 -1 0 ] 180 1 1 ( 160 56 88 ) ( 160 56 89 ) ( 160 57 88 ) clip [ 6.123233995736766e-17 -1 0 32 ] [ 0 0 -1 0 ] 0 1 1 } -// brush 14 +// brush 13 { ( -64 -256 16 ) ( -64 64 0 ) ( -64 64 16 ) brownstuff8 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 192 -320 16 ) ( -64 -320 0 ) ( -64 -320 16 ) brownstuff8 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 @@ -140,16 +133,16 @@ ( 192 64 16 ) ( -64 64 0 ) ( 192 64 0 ) brownstuff8 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 192 64 16 ) ( 192 -256 0 ) ( 192 -256 16 ) brownstuff8 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 } -// brush 15 +// brush 14 { -( -64 -256 80 ) ( -64 64 16 ) ( -64 64 80 ) *slime_s1 [ 0 -1 0 -16 ] [ 0 0 -1 0 ] 0 1 1 -( 192 -320 80 ) ( -64 -320 16 ) ( -64 -320 80 ) *slime_s1 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 -( 192 64 16 ) ( -64 -256 16 ) ( 192 -256 16 ) *slime_s1 [ -1 0 0 0 ] [ 0 -1 0 -16 ] 0 1 1 -( 192 64 80 ) ( -64 -256 80 ) ( -64 64 80 ) *slime_s1 [ 1 0 0 0 ] [ 0 -1 0 -16 ] 0 1 1 -( 192 64 80 ) ( -64 64 16 ) ( 192 64 16 ) *slime_s1 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 -( 192 64 80 ) ( 192 -256 16 ) ( 192 -256 80 ) *slime_s1 [ 0 -1 0 -16 ] [ 0 0 -1 0 ] 0 1 1 +( -64 -256 80 ) ( -64 64 16 ) ( -64 64 80 ) *swater4 [ 0 -1 0 -16 ] [ 0 0 -1 0 ] 0 1 1 +( 192 -320 80 ) ( -64 -320 16 ) ( -64 -320 80 ) *swater4 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 192 64 16 ) ( -64 -256 16 ) ( 192 -256 16 ) *swater4 [ -1 0 0 0 ] [ 0 -1 0 -16 ] 0 1 1 +( 192 64 80 ) ( -64 -256 80 ) ( -64 64 80 ) *swater4 [ 1 0 0 0 ] [ 0 -1 0 -16 ] 0 1 1 +( 192 64 80 ) ( -64 64 16 ) ( 192 64 16 ) *swater4 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 192 64 80 ) ( 192 -256 16 ) ( 192 -256 80 ) *swater4 [ 0 -1 0 -16 ] [ 0 0 -1 0 ] 0 1 1 } -// brush 16 +// brush 15 { ( -160 176 88 ) ( -160 177 88 ) ( -160 176 89 ) tsl_wall1 [ 0 1.0000000000000002 0 -32 ] [ 0 0 -1.0000000000000002 -32 ] 0 1 1 ( -160 176 88 ) ( -160 176 89 ) ( -159 176 88 ) tsl_wall1 [ -1 0 0 -16 ] [ 0 0 -1 -32 ] 0 1 1 @@ -158,16 +151,16 @@ ( 288 192 96 ) ( 289 192 96 ) ( 288 192 97 ) tsl_wall1 [ -1 0 0 -16 ] [ 0 0 -1 -32 ] 0 1 1 ( 288 192 96 ) ( 288 192 97 ) ( 288 193 96 ) tsl_wall1 [ 0 -1.0000000000000002 0 0 ] [ 0 0 -1.0000000000000002 -32 ] 0 1 1 } -// brush 17 +// brush 16 { ( -160 -256 352 ) ( -160 -255 352 ) ( -160 -256 353 ) orangestuff8 [ 0 0 -1.0000000000000002 0 ] [ 0 -1.0000000000000002 0 0 ] 180 1 1 ( -160 -432 352 ) ( -160 -432 353 ) ( -159 -432 352 ) orangestuff8 [ -1.0000000000000002 0 0 0 ] [ 0 0 -1.0000000000000002 32 ] 180 1 1 ( -160 -256 352 ) ( -159 -256 352 ) ( -160 -255 352 ) orangestuff8 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 ( 288 176 360 ) ( 288 177 360 ) ( 289 176 360 ) orangestuff8 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 -( 288 176 360 ) ( 289 176 360 ) ( 288 176 361 ) orangestuff8 [ -1.0000000000000002 0 0 0 ] [ 0 0 1.0000000000000002 -16 ] 180 1 1 +( -160 -304 352 ) ( -159 -304 352 ) ( -160 -304 353 ) orangestuff8 [ -1.0000000000000002 0 0 0 ] [ 0 0 -1.0000000000000002 32 ] 180 1 1 ( 288 176 360 ) ( 288 176 361 ) ( 288 177 360 ) orangestuff8 [ 0 0 1.0000000000000002 0 ] [ 0 -1.0000000000000002 0 0 ] 180 1 1 } -// brush 18 +// brush 17 { ( -80 -16 48 ) ( -80 -15 48 ) ( -80 -16 49 ) brown_brick [ 0 1 0 16 ] [ 0 0 -1 32 ] 0 1 1 ( 192 -336 16 ) ( 191 -336 16 ) ( 192 -336 17 ) brown_brick [ -1 0 0 0 ] [ 0 0 -1 32 ] 180 1 1 @@ -176,7 +169,7 @@ ( 64 -320 48 ) ( 64 -320 49 ) ( 63 -320 48 ) brown_brick [ 1 0 0 0 ] [ 0 0 -1 32 ] 180 1 1 ( 208 -144 16 ) ( 208 -144 17 ) ( 208 -143 16 ) brown_brick [ 0 -1 0 -16 ] [ 0 0 -1 32 ] 0 1 1 } -// brush 19 +// brush 18 { ( -160 -112 96 ) ( -160 -111 96 ) ( -160 -112 97 ) orangestuff8 [ 0 1 0 -16 ] [ 0 0 -1 0 ] 0 1 1 ( -80 -432 80 ) ( -81 -432 80 ) ( -80 -432 81 ) orangestuff8 [ -1 0 0 16 ] [ 0 0 -1 0 ] 180 1 1 @@ -185,7 +178,7 @@ ( -160 -336 96 ) ( -160 -336 97 ) ( -161 -336 96 ) orangestuff8 [ 1 0 0 -16 ] [ 0 0 -1 0 ] 180 1 1 ( 288 -432 80 ) ( 288 -432 81 ) ( 288 -431 80 ) orangestuff8 [ 0 -1 0 16 ] [ 0 0 -1 0 ] 0 1 1 } -// brush 20 +// brush 19 { ( -160 -448 88 ) ( -160 -447 88 ) ( -160 -448 89 ) tsl_wall1 [ 0 1.0000000000000002 0 80 ] [ 0 0 -1.0000000000000002 -32 ] 0 1 1 ( -160 -448 88 ) ( -160 -448 89 ) ( -159 -448 88 ) tsl_wall1 [ -1 0 0 -16 ] [ 0 0 -1 -32 ] 0 1 1 @@ -194,6 +187,159 @@ ( 288 -432 96 ) ( 289 -432 96 ) ( 288 -432 97 ) tsl_wall1 [ -1 0 0 -16 ] [ 0 0 -1 -32 ] 0 1 1 ( 288 -432 96 ) ( 288 -432 97 ) ( 288 -431 96 ) tsl_wall1 [ 0 -1.0000000000000002 0 -112 ] [ 0 0 -1.0000000000000002 -32 ] 0 1 1 } +// brush 20 +{ +( -160 -256 352 ) ( -160 -255 352 ) ( -160 -256 353 ) orangestuff8 [ 0 0 -1.0000000000000002 0 ] [ 0 -1.0000000000000002 0 0 ] 180 1 1 +( 288 80 360 ) ( 288 80 361 ) ( 289 80 360 ) orangestuff8 [ -1.0000000000000002 0 0 0 ] [ 0 0 1.0000000000000002 -16 ] 180 1 1 +( -160 -256 352 ) ( -159 -256 352 ) ( -160 -255 352 ) orangestuff8 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 +( 288 176 360 ) ( 288 177 360 ) ( 289 176 360 ) orangestuff8 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 +( 288 176 360 ) ( 289 176 360 ) ( 288 176 361 ) orangestuff8 [ -1.0000000000000002 0 0 0 ] [ 0 0 1.0000000000000002 -16 ] 180 1 1 +( 288 176 360 ) ( 288 176 361 ) ( 288 177 360 ) orangestuff8 [ 0 0 1.0000000000000002 0 ] [ 0 -1.0000000000000002 0 0 ] 180 1 1 +} +// brush 21 +{ +( 96 176 360 ) ( 96 177 360 ) ( 96 176 361 ) orangestuff8 [ 0 0 1.0000000000000002 0 ] [ 0 -1.0000000000000002 0 0 ] 180 1 1 +( -160 -304 352 ) ( -160 -304 353 ) ( -159 -304 352 ) orangestuff8 [ -1.0000000000000002 0 0 0 ] [ 0 0 -1.0000000000000002 32 ] 180 1 1 +( -160 -256 352 ) ( -159 -256 352 ) ( -160 -255 352 ) orangestuff8 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 +( 288 176 360 ) ( 288 177 360 ) ( 289 176 360 ) orangestuff8 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 +( 288 80 360 ) ( 289 80 360 ) ( 288 80 361 ) orangestuff8 [ -1.0000000000000002 0 0 0 ] [ 0 0 1.0000000000000002 -16 ] 180 1 1 +( 288 176 360 ) ( 288 176 361 ) ( 288 177 360 ) orangestuff8 [ 0 0 1.0000000000000002 0 ] [ 0 -1.0000000000000002 0 0 ] 180 1 1 +} +// brush 22 +{ +( -160 -256 352 ) ( -160 -255 352 ) ( -160 -256 353 ) orangestuff8 [ 0 0 -1.0000000000000002 0 ] [ 0 -1.0000000000000002 0 0 ] 180 1 1 +( -160 -304 352 ) ( -160 -304 353 ) ( -159 -304 352 ) orangestuff8 [ -1.0000000000000002 0 0 0 ] [ 0 0 -1.0000000000000002 32 ] 180 1 1 +( -160 -256 352 ) ( -159 -256 352 ) ( -160 -255 352 ) orangestuff8 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 +( 288 176 360 ) ( 288 177 360 ) ( 289 176 360 ) orangestuff8 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 +( 288 80 360 ) ( 289 80 360 ) ( 288 80 361 ) orangestuff8 [ -1.0000000000000002 0 0 0 ] [ 0 0 1.0000000000000002 -16 ] 180 1 1 +( -96 -256 352 ) ( -96 -256 353 ) ( -96 -255 352 ) orangestuff8 [ 0 0 -1.0000000000000002 0 ] [ 0 -1.0000000000000002 0 0 ] 180 1 1 +} +// brush 23 +{ +( -96 -256 360 ) ( -96 -255 360 ) ( -96 -256 361 ) sky3 [ 0 0 -1.0000000000000002 8 ] [ 0 -1.0000000000000002 0 0 ] 180 1 1 +( -160 -304 360 ) ( -160 -304 361 ) ( -159 -304 360 ) sky3 [ -1.0000000000000002 0 0 0 ] [ 0 0 -1.0000000000000002 40 ] 180 1 1 +( -160 -256 360 ) ( -159 -256 360 ) ( -160 -255 360 ) sky3 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 +( 288 176 368 ) ( 288 177 368 ) ( 289 176 368 ) sky3 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 +( 288 80 368 ) ( 289 80 368 ) ( 288 80 369 ) sky3 [ -1.0000000000000002 0 0 0 ] [ 0 0 1.0000000000000002 -24 ] 180 1 1 +( 96 176 368 ) ( 96 176 369 ) ( 96 177 368 ) sky3 [ 0 0 1.0000000000000002 -8 ] [ 0 -1.0000000000000002 0 0 ] 180 1 1 +} +// brush 24 +{ +( 288 192 80 ) ( 288 193 80 ) ( 288 192 81 ) tsl_wall1 [ 0 1 0 0 ] [ 0 0 -1 -32 ] 0 1 1 +( 304 -432 64 ) ( 303 -432 64 ) ( 304 -432 65 ) tsl_wall1 [ -1 0 0 16 ] [ 0 0 -1 -32 ] 180 1 1 +( 304 -256 224 ) ( 304 -255 224 ) ( 303 -256 224 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 -1 0 0 ] 180 1 1 +( 288 192 352 ) ( 287 192 352 ) ( 288 193 352 ) tsl_wall1 [ -1 0 0 16 ] [ 0 -1 0 0 ] 180 1 1 +( 288 176 80 ) ( 288 176 81 ) ( 287 176 80 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 0 -1 -32 ] 180 1 1 +( 304 -256 64 ) ( 304 -256 65 ) ( 304 -255 64 ) tsl_wall1 [ 0 -1 0 0 ] [ 0 0 -1 -32 ] 0 1 1 +} +// brush 25 +{ +( 288 192 80 ) ( 288 193 80 ) ( 288 192 81 ) tsl_wall1 [ 0 1 0 0 ] [ 0 0 -1 -32 ] 0 1 1 +( 304 -192 64 ) ( 303 -192 64 ) ( 304 -192 65 ) tsl_wall1 [ -1 0 0 16 ] [ 0 0 -1 -32 ] 180 1 1 +( 304 -256 96 ) ( 304 -255 96 ) ( 303 -256 96 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 -1 0 0 ] 180 1 1 +( 304 -256 224 ) ( 303 -256 224 ) ( 304 -255 224 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 -1 0 0 ] 180 1 1 +( 288 176 80 ) ( 288 176 81 ) ( 287 176 80 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 0 -1 -32 ] 180 1 1 +( 304 -256 64 ) ( 304 -256 65 ) ( 304 -255 64 ) tsl_wall1 [ 0 -1 0 0 ] [ 0 0 -1 -32 ] 0 1 1 +} +// brush 26 +{ +( 288 192 80 ) ( 288 193 80 ) ( 288 192 81 ) tsl_wall1 [ 0 1 0 0 ] [ 0 0 -1 -32 ] 0 1 1 +( 304 -432 64 ) ( 303 -432 64 ) ( 304 -432 65 ) tsl_wall1 [ -1 0 0 16 ] [ 0 0 -1 -32 ] 180 1 1 +( 304 -256 96 ) ( 304 -255 96 ) ( 303 -256 96 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 -1 0 0 ] 180 1 1 +( 304 -256 224 ) ( 303 -256 224 ) ( 304 -255 224 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 -1 0 0 ] 180 1 1 +( 304 -192 64 ) ( 304 -192 65 ) ( 303 -192 64 ) tsl_wall1 [ -1 0 0 16 ] [ 0 0 -1 -32 ] 180 1 1 +( 304 -256 64 ) ( 304 -256 65 ) ( 304 -255 64 ) tsl_wall1 [ 0 -1 0 0 ] [ 0 0 -1 -32 ] 0 1 1 +} +// brush 27 +{ +( 208 256 16 ) ( 208 257 16 ) ( 208 256 17 ) brown_brick [ 0 -1 0 0 ] [ 0 0 -1 32 ] 0 1 1 +( 192 64 16 ) ( 191 64 16 ) ( 192 64 17 ) brown_brick [ -1 0 0 0 ] [ 0 0 -1 32 ] 180 1 1 +( 192 256 16 ) ( 192 257 16 ) ( 191 256 16 ) brown_brick [ 1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 +( 64 384 96 ) ( 63 384 96 ) ( 64 385 96 ) brown_brick [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 +( 64 80 48 ) ( 64 80 49 ) ( 63 80 48 ) brown_brick [ 1 0 0 0 ] [ 0 0 -1 32 ] 180 1 1 +( 288 256 16 ) ( 288 256 17 ) ( 288 257 16 ) brown_brick [ 0 -1 0 0 ] [ 0 0 -1 32 ] 0 1 1 +} +// brush 28 +{ +( 192 -64 48 ) ( 192 -64 49 ) ( 192 -65 48 ) brown_brick [ 6.123233995736766e-17 1 0 0 ] [ 0 0 -1 32 ] 180 1 1 +( 16 80 16 ) ( 15 80 16 ) ( 16 80 17 ) brown_brick [ 1 -6.123233995736766e-17 0 -16 ] [ 0 0 -1 32 ] 0 1 1 +( 16 64 16 ) ( 15 64 16 ) ( 16 63 16 ) brown_brick [ 6.123233995736766e-17 1 0 0 ] [ 1 -6.123233995736766e-17 0 -16 ] 270 1 1 +( -112 -64 96 ) ( -112 -65 96 ) ( -113 -64 96 ) brown_brick [ -6.123233995736766e-17 -1 0 0 ] [ 1 -6.123233995736766e-17 0 -16 ] 90 1 1 +( 16 176 16 ) ( 16 176 17 ) ( 15 176 16 ) brown_brick [ 1 -6.123233995736766e-17 0 -16 ] [ 0 0 -1 32 ] 0 1 1 +( 208 64 16 ) ( 208 63 16 ) ( 208 64 17 ) brown_brick [ -6.123233995736766e-17 -1 0 0 ] [ 0 0 -1 32 ] 180 1 1 +} +// brush 29 +{ +( 208 176 88 ) ( 208 177 88 ) ( 208 176 89 ) tsl_wall1 [ 0 1.0000000000000002 0 -32 ] [ 0 0 -1.0000000000000002 -32 ] 0 1 1 +( -160 176 88 ) ( -160 176 89 ) ( -159 176 88 ) tsl_wall1 [ -1 0 0 -16 ] [ 0 0 -1 -32 ] 0 1 1 +( -160 176 16 ) ( -159 176 16 ) ( -160 177 16 ) tsl_wall1 [ -1.0000000000000002 0 0 -16 ] [ 0 1.0000000000000002 0 -40 ] 0 1 1 +( -160 176 96 ) ( -160 177 96 ) ( -159 176 96 ) tsl_wall1 [ -1.0000000000000002 0 0 -16 ] [ 0 1.0000000000000002 0 -40 ] 0 1 1 +( 288 192 96 ) ( 289 192 96 ) ( 288 192 97 ) tsl_wall1 [ -1 0 0 -16 ] [ 0 0 -1 -32 ] 0 1 1 +( 288 192 96 ) ( 288 192 97 ) ( 288 193 96 ) tsl_wall1 [ 0 -1.0000000000000002 0 0 ] [ 0 0 -1.0000000000000002 -32 ] 0 1 1 +} +// brush 30 +{ +( 288 192 80 ) ( 288 193 80 ) ( 288 192 81 ) tsl_wall1 [ 0 1 0 0 ] [ 0 0 -1 -32 ] 0 1 1 +( 304 80 64 ) ( 303 80 64 ) ( 304 80 65 ) tsl_wall1 [ -1 0 0 16 ] [ 0 0 -1 -32 ] 180 1 1 +( 304 -256 16 ) ( 304 -255 16 ) ( 303 -256 16 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 -1 0 0 ] 180 1 1 +( 304 -256 96 ) ( 303 -256 96 ) ( 304 -255 96 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 -1 0 0 ] 180 1 1 +( 288 176 80 ) ( 288 176 81 ) ( 287 176 80 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 0 -1 -32 ] 180 1 1 +( 304 -256 64 ) ( 304 -256 65 ) ( 304 -255 64 ) tsl_wall1 [ 0 -1 0 0 ] [ 0 0 -1 -32 ] 0 1 1 +} +// brush 31 +{ +( 208 80 16 ) ( 208 81 16 ) ( 208 80 17 ) orangestuff8 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 208 80 16 ) ( 208 80 17 ) ( 209 80 16 ) orangestuff8 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 208 80 16 ) ( 209 80 16 ) ( 208 81 16 ) orangestuff8 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 288 176 24 ) ( 288 177 24 ) ( 289 176 24 ) orangestuff8 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 288 176 24 ) ( 289 176 24 ) ( 288 176 25 ) orangestuff8 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 288 176 24 ) ( 288 176 25 ) ( 288 177 24 ) orangestuff8 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 32 +{ +( 208 80 72 ) ( 208 81 72 ) ( 208 80 73 ) *lava_s [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 216 80 72 ) ( 216 80 73 ) ( 217 80 72 ) *lava_s [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 216 80 24 ) ( 217 80 24 ) ( 216 81 24 ) *lava_s [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 288 176 80 ) ( 288 177 80 ) ( 289 176 80 ) *lava_s [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 288 176 80 ) ( 289 176 80 ) ( 288 176 81 ) *lava_s [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 288 176 80 ) ( 288 176 81 ) ( 288 177 80 ) *lava_s [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 33 +{ +( 288 80 80 ) ( 288 81 80 ) ( 288 80 81 ) tsl_wall1 [ 0 1 0 -16 ] [ 0 0 -1 -32 ] 0 1 1 +( 304 -32 64 ) ( 303 -32 64 ) ( 304 -32 65 ) tsl_wall1 [ -1 0 0 16 ] [ 0 0 -1 -32 ] 180 1 1 +( 304 -368 16 ) ( 304 -367 16 ) ( 303 -368 16 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 -1 0 16 ] 180 1 1 +( 304 -368 96 ) ( 303 -368 96 ) ( 304 -367 96 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 -1 0 16 ] 180 1 1 +( 288 64 80 ) ( 288 64 81 ) ( 287 64 80 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 0 -1 -32 ] 180 1 1 +( 304 -368 64 ) ( 304 -368 65 ) ( 304 -367 64 ) tsl_wall1 [ 0 -1 0 16 ] [ 0 0 -1 -32 ] 0 1 1 +} +// brush 34 +{ +( 208 152 16 ) ( 208 153 16 ) ( 208 152 17 ) brown_brick [ 0 -1 0 -104 ] [ 0 0 -1 32 ] 0 1 1 +( 192 -40 16 ) ( 191 -40 16 ) ( 192 -40 17 ) brown_brick [ -1 0 0 0 ] [ 0 0 -1 32 ] 180 1 1 +( 192 152 16 ) ( 192 153 16 ) ( 191 152 16 ) brown_brick [ 1 0 0 0 ] [ 0 -1 0 -104 ] 180 1 1 +( 64 280 96 ) ( 63 280 96 ) ( 64 281 96 ) brown_brick [ -1 0 0 0 ] [ 0 -1 0 -104 ] 180 1 1 +( 64 -24 48 ) ( 64 -24 49 ) ( 63 -24 48 ) brown_brick [ 1 0 0 0 ] [ 0 0 -1 32 ] 180 1 1 +( 288 152 16 ) ( 288 152 17 ) ( 288 153 16 ) brown_brick [ 0 -1 0 -104 ] [ 0 0 -1 32 ] 0 1 1 +} +// brush 35 +{ +( 208 -32 72 ) ( 208 -31 72 ) ( 208 -32 73 ) *slime_s1 [ 0 0 -1.0000000000000002 32 ] [ 0 -1.0000000000000002 0 -16 ] 0 1 1 +( 216 -24 72 ) ( 216 -24 73 ) ( 217 -24 72 ) *slime_s1 [ 1.0000000000000002 0 0 0 ] [ 0 0 1.0000000000000002 -8 ] 0 1 1 +( 216 -32 24 ) ( 217 -32 24 ) ( 216 -31 24 ) *slime_s1 [ 1 0 0 0 ] [ 0 -1 0 -16 ] 0 1 1 +( 288 64 80 ) ( 288 65 80 ) ( 289 64 80 ) *slime_s1 [ 1 0 0 0 ] [ 0 -1 0 -16 ] 0 1 1 +( 288 64 80 ) ( 289 64 80 ) ( 288 64 81 ) *slime_s1 [ 1.0000000000000002 0 0 0 ] [ 0 0 -1.0000000000000002 0 ] 0 1 1 +( 288 64 80 ) ( 288 64 81 ) ( 288 65 80 ) *slime_s1 [ 0 0 1.0000000000000002 16 ] [ 0 -1.0000000000000002 0 -16 ] 0 1 1 +} +// brush 36 +{ +( 208 -24 16 ) ( 208 -23 16 ) ( 208 -24 17 ) orangestuff8 [ 0 -1 0 -40 ] [ 0 0 -1 0 ] 0 1 1 +( 208 -24 16 ) ( 208 -24 17 ) ( 209 -24 16 ) orangestuff8 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 208 -24 16 ) ( 209 -24 16 ) ( 208 -23 16 ) orangestuff8 [ -1 0 0 0 ] [ 0 -1 0 -40 ] 0 1 1 +( 288 72 24 ) ( 288 73 24 ) ( 289 72 24 ) orangestuff8 [ 1 0 0 0 ] [ 0 -1 0 -40 ] 0 1 1 +( 288 72 24 ) ( 289 72 24 ) ( 288 72 25 ) orangestuff8 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 288 72 24 ) ( 288 72 25 ) ( 288 73 24 ) orangestuff8 [ 0 1 0 40 ] [ 0 0 -1 0 ] 0 1 1 +} } // entity 1 { @@ -405,7 +551,7 @@ ( 0 -136 264 ) ( 0 -135 264 ) ( 0 -136 265 ) tsl_tower6 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 0 -144 264 ) ( 0 -144 265 ) ( 1 -144 264 ) tsl_tower6 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 0 -136 264 ) ( 1 -136 264 ) ( 0 -135 264 ) tsl_tower6 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 -( 64 -48 352 ) ( 64 -47 352 ) ( 65 -48 352 ) tsl_tower6 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 64 -48 360 ) ( 64 -47 360 ) ( 65 -48 360 ) tsl_tower6 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 ( 64 -40 272 ) ( 65 -40 272 ) ( 64 -40 273 ) tsl_tower6 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 144 -48 272 ) ( 144 -48 273 ) ( 144 -47 272 ) tsl_tower6 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 } @@ -518,7 +664,7 @@ ( 64 -248 264 ) ( 64 -247 264 ) ( 64 -248 265 ) tsl_tower6 [ 0 -1 0 16 ] [ 0 0 -1 0 ] 0 1 1 ( 0 -256 264 ) ( 0 -256 265 ) ( 1 -256 264 ) tsl_tower6 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 0 -248 264 ) ( 1 -248 264 ) ( 0 -247 264 ) tsl_tower6 [ -1 0 0 0 ] [ 0 -1 0 16 ] 0 1 1 -( 64 -160 352 ) ( 64 -159 352 ) ( 65 -160 352 ) tsl_tower6 [ 1 0 0 0 ] [ 0 -1 0 16 ] 0 1 1 +( 64 -160 360 ) ( 64 -159 360 ) ( 65 -160 360 ) tsl_tower6 [ 1 0 0 0 ] [ 0 -1 0 16 ] 0 1 1 ( 64 -152 272 ) ( 65 -152 272 ) ( 64 -152 273 ) tsl_tower6 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 144 -160 272 ) ( 144 -160 273 ) ( 144 -159 272 ) tsl_tower6 [ 0 1 0 -16 ] [ 0 0 -1 0 ] 0 1 1 } @@ -537,3 +683,92 @@ ( 216 -64 16 ) ( 216 -64 17 ) ( 216 -63 16 ) {trigger [ 6.123233995736766e-17 1 0 0 ] [ 0 0 -1 32 ] 0 1 1 } } +// entity 26 +{ +"classname" "rotate_object" +"targetname" "fan" +// brush 0 +{ +( -8 -228 332 ) ( -8 -244 332 ) ( -8 -244 316 ) origin [ 0 -0.5 0 14 ] [ 0 0 -0.5 -2 ] 0 1 1 +( -8 -244 332 ) ( 8 -244 332 ) ( 8 -244 316 ) origin [ 0.5 0 0 -8 ] [ 0 0 -0.5 -2 ] 0 1 1 +( 8 -244 316 ) ( 8 -228 316 ) ( -8 -228 316 ) origin [ -0.5 0 0 8 ] [ 0 -0.5 0 14 ] 0 1 1 +( -8 -228 332 ) ( 8 -228 332 ) ( 8 -244 332 ) origin [ 0.5 0 0 -8 ] [ 0 -0.5 0 14 ] 0 1 1 +( 8 -228 316 ) ( 8 -228 332 ) ( -8 -228 332 ) origin [ -0.5 0 0 8 ] [ 0 0 -0.5 -2 ] 0 1 1 +( 8 -244 332 ) ( 8 -228 332 ) ( 8 -228 316 ) origin [ 0 0.5 0 -14 ] [ 0 0 -0.5 -2 ] 0 1 1 +} +// brush 1 +{ +( -4 -240 328 ) ( -12 -292 328 ) ( -12 -292 320 ) bolt14 [ -6.123233995736766e-17 -1 0 -4 ] [ 0 0 -1 32 ] 0 1 1 +( -12 -292 328 ) ( 12 -292 328 ) ( 12 -292 320 ) bolt14 [ 1 -6.123233995736766e-17 0 4 ] [ 0 0 -1 32 ] 0 1 1 +( -12 -292 320 ) ( 12 -292 320 ) ( 4 -240 320 ) bolt14 [ -6.123233995736766e-17 -1 0 -4 ] [ 1 -6.123233995736766e-17 0 4 ] 90 1 1 +( 4 -240 328 ) ( 12 -292 328 ) ( -12 -292 328 ) bolt14 [ 6.123233995736766e-17 1 0 4 ] [ 1 -6.123233995736766e-17 0 4 ] 270 1 1 +( 4 -240 320 ) ( 4 -240 328 ) ( -4 -240 328 ) bolt14 [ -1 6.123233995736766e-17 0 -4 ] [ 0 0 -1 32 ] 0 1 1 +( 12 -292 320 ) ( 12 -292 328 ) ( 4 -240 328 ) bolt14 [ 6.123233995736766e-17 1 0 4 ] [ 0 0 -1 32 ] 0 1 1 +} +// brush 2 +{ +( -56 -224 328 ) ( -56 -248 328 ) ( -56 -248 320 ) bolt14 [ 0 -1 0 24 ] [ 0 0 -1 32 ] 0 1 1 +( -4 -240 320 ) ( -4 -232 320 ) ( -56 -224 320 ) bolt14 [ -1 0 0 40 ] [ 0 -1 0 24 ] 0 1 1 +( -56 -224 328 ) ( -4 -232 328 ) ( -4 -240 328 ) bolt14 [ 1 0 0 -40 ] [ 0 -1 0 24 ] 0 1 1 +( -56 -248 328 ) ( -4 -240 328 ) ( -4 -240 320 ) bolt14 [ 1 0 0 -40 ] [ 0 0 -1 32 ] 0 1 1 +( -4 -232 320 ) ( -4 -232 328 ) ( -56 -224 328 ) bolt14 [ -1 0 0 40 ] [ 0 0 -1 32 ] 0 1 1 +( -4 -240 328 ) ( -4 -232 328 ) ( -4 -232 320 ) bolt14 [ 0 1 0 -24 ] [ 0 0 -1 32 ] 0 1 1 +} +// brush 3 +{ +( -4 -232 320 ) ( -12 -180 320 ) ( -12 -180 328 ) bolt14 [ -6.123233995736766e-17 -1 0 -4 ] [ 0 0 -1 32 ] 0 1 1 +( -4 -232 328 ) ( 4 -232 328 ) ( 4 -232 320 ) bolt14 [ 1 -6.123233995736766e-17 0 4 ] [ 0 0 -1 32 ] 0 1 1 +( 4 -232 320 ) ( 12 -180 320 ) ( -12 -180 320 ) bolt14 [ -6.123233995736766e-17 -1 0 -4 ] [ 1 -6.123233995736766e-17 0 4 ] 90 1 1 +( -12 -180 328 ) ( 12 -180 328 ) ( 4 -232 328 ) bolt14 [ 6.123233995736766e-17 1 0 4 ] [ 1 -6.123233995736766e-17 0 4 ] 270 1 1 +( 12 -180 320 ) ( 12 -180 328 ) ( -12 -180 328 ) bolt14 [ -1 6.123233995736766e-17 0 -4 ] [ 0 0 -1 32 ] 0 1 1 +( 4 -232 328 ) ( 12 -180 328 ) ( 12 -180 320 ) bolt14 [ 6.123233995736766e-17 1 0 4 ] [ 0 0 -1 32 ] 0 1 1 +} +// brush 4 +{ +( 4 -232 328 ) ( 4 -240 328 ) ( 4 -240 320 ) bolt14 [ 0 -1 0 24 ] [ 0 0 -1 32 ] 0 1 1 +( 4 -240 328 ) ( 56 -248 328 ) ( 56 -248 320 ) bolt14 [ 1 0 0 -40 ] [ 0 0 -1 32 ] 0 1 1 +( 56 -224 320 ) ( 56 -224 328 ) ( 4 -232 328 ) bolt14 [ -1 0 0 40 ] [ 0 0 -1 32 ] 0 1 1 +( 56 -248 320 ) ( 56 -224 320 ) ( 4 -232 320 ) bolt14 [ -1 0 0 40 ] [ 0 -1 0 24 ] 0 1 1 +( 4 -232 328 ) ( 56 -224 328 ) ( 56 -248 328 ) bolt14 [ 1 0 0 -40 ] [ 0 -1 0 24 ] 0 1 1 +( 56 -248 328 ) ( 56 -224 328 ) ( 56 -224 320 ) bolt14 [ 0 1 0 -24 ] [ 0 0 -1 32 ] 0 1 1 +} +// brush 5 +{ +( -4 -240 328 ) ( -4 -232 320 ) ( -4 -232 328 ) bolt14 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 4 -240 328 ) ( -4 -240 320 ) ( -4 -240 328 ) bolt14 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 4 -232 320 ) ( -4 -240 320 ) ( 4 -240 320 ) bolt14 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 4 -232 328 ) ( -4 -240 328 ) ( -4 -232 328 ) bolt14 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 4 -232 328 ) ( -4 -232 320 ) ( 4 -232 320 ) bolt14 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 4 -232 328 ) ( 4 -240 320 ) ( 4 -240 328 ) bolt14 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +// entity 27 +{ +"classname" "func_rotate_entity" +"origin" "0 -236 324" +"target" "fan" +"rotate" "0 90 0" +"spawnflags" "2" +} +// entity 28 +{ +"classname" "func_detail_illusionary" +// brush 0 +{ +( 193.44 -410.08 148 ) ( 193.44 -410.08 96 ) ( 241.44 -346.08 96 ) {trigger [ -1.499759782661858e-32 -1.0000000000000002 -2.449293598294707e-16 -22.079987 ] [ 6.123233995736766e-17 -2.449293598294707e-16 1.0000000000000002 4 ] 288.67493 1 1 +( 200 -412 96 ) ( 196 -412 96 ) ( 196 -412 148 ) {trigger [ -6.123233995736766e-17 2.33486982377251e-16 -1 -4 ] [ 1.0000000000000002 0 -6.123233995736767e-17 -56 ] 270 1 1 +( 244 -348 96 ) ( 196 -412 96 ) ( 200 -412 96 ) {trigger [ -1.4997597826618576e-32 -1 -2.4492935982947064e-16 -24 ] [ 1 0 -6.123233995736766e-17 -56 ] 0 1 1 +( 196 -412 148 ) ( 244 -348 148 ) ( 248 -348 148 ) {trigger [ -1.4997597826618576e-32 -1 -2.4492935982947064e-16 -24 ] [ 1 0 -6.123233995736766e-17 -56 ] 0 1 1 +( 244 -348 148 ) ( 244 -348 96 ) ( 248 -348 96 ) {trigger [ 6.123233995736766e-17 -2.33486982377251e-16 1 12 ] [ 1.0000000000000002 0 -6.123233995736767e-17 -56 ] 90 1 1 +( 248 -348 96 ) ( 200 -412 96 ) ( 200 -412 148 ) {trigger [ -1.499759782661858e-32 -1.0000000000000002 -2.449293598294707e-16 -24 ] [ -6.123233995736769e-17 2.449293598294707e-16 -1.0000000000000002 -8 ] 71.32507 1 1 +} +// brush 1 +{ +( 196 -344 96 ) ( 196 -344 148 ) ( 244 -408 148 ) {trigger [ 7.49879891330929e-33 1.0000000000000002 1.2246467991473535e-16 28 ] [ -6.123233995736769e-17 1.2246467991473535e-16 -1.0000000000000002 -8 ] 311.38965 1 1 +( 244 -408 96 ) ( 244 -408 148 ) ( 248 -408 148 ) {trigger [ -6.123233995736766e-17 1.1102230246251565e-16 -1 0 ] [ 1.0000000000000002 0 -6.123233995736767e-17 -56 ] 270 1 1 +( 196 -344 96 ) ( 244 -408 96 ) ( 248 -408 96 ) {trigger [ 7.498798913309288e-33 1 1.2246467991473532e-16 28 ] [ 1 0 -6.123233995736766e-17 -56 ] 0 1 1 +( 244 -408 148 ) ( 196 -344 148 ) ( 200 -344 148 ) {trigger [ 7.498798913309288e-33 1 1.2246467991473532e-16 28 ] [ 1 0 -6.123233995736766e-17 -56 ] 0 1 1 +( 200 -344 148 ) ( 196 -344 148 ) ( 196 -344 96 ) {trigger [ 6.123233995736766e-17 -1.1102230246251565e-16 1 8 ] [ 1.0000000000000002 0 -6.123233995736767e-17 -56 ] 90 1 1 +( 250.56 -406.08 148 ) ( 202.56 -342.08 148 ) ( 202.56 -342.08 96 ) {trigger [ 7.49879891330929e-33 1.0000000000000002 1.2246467991473535e-16 26.079987 ] [ 6.123233995736766e-17 -1.2246467991473535e-16 1.0000000000000002 4 ] 48.61034 1 1 +} +}