summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTravis Bradshaw <travis.bradshaw@idsoftware.com>2012-01-31 15:51:12 -0600
committerTravis Bradshaw <travis.bradshaw@idsoftware.com>2012-01-31 15:51:12 -0600
commite4cb063480f9256b902aa00f47d18fa23f5bda12 (patch)
tree0806163298ad552d8a20a83870b7b7587f4b754b
parent6df9737f9cbaf410853514463ef59e215fc698ba (diff)
downloadquaketools-e4cb063480f9256b902aa00f47d18fa23f5bda12.tar.gz
quaketools-e4cb063480f9256b902aa00f47d18fa23f5bda12.tar.bz2
quaketools-e4cb063480f9256b902aa00f47d18fa23f5bda12.zip
Source release of QuakeEd, the map editing application on NEXTSTEP for Quake.
-rw-r--r--QuakeEd/.nfs707233
-rw-r--r--QuakeEd/Brush.h55
-rw-r--r--QuakeEd/CameraView.h61
-rw-r--r--QuakeEd/CameraView.m970
-rw-r--r--QuakeEd/Clipper.h24
-rw-r--r--QuakeEd/Clipper.m227
-rw-r--r--QuakeEd/Dict.h47
-rw-r--r--QuakeEd/Dict.m583
-rw-r--r--QuakeEd/DictList.h12
-rw-r--r--QuakeEd/DictList.m69
-rw-r--r--QuakeEd/DownArrow.tiffbin0 -> 256 bytes
-rw-r--r--QuakeEd/English.lproj/Info.nib/data.classes1
-rw-r--r--QuakeEd/English.lproj/Info.nib/data.nibbin0 -> 1000 bytes
-rw-r--r--QuakeEd/English.lproj/QuakeEd.nib/data.classes220
-rw-r--r--QuakeEd/English.lproj/QuakeEd.nib/data.nibbin0 -> 29981 bytes
-rw-r--r--QuakeEd/Entity.h40
-rw-r--r--QuakeEd/Entity.m485
-rw-r--r--QuakeEd/EntityClass.h42
-rw-r--r--QuakeEd/EntityClass.m266
-rw-r--r--QuakeEd/InspectorControl.h71
-rw-r--r--QuakeEd/InspectorControl.m128
-rw-r--r--QuakeEd/KeypairView.h16
-rw-r--r--QuakeEd/KeypairView.m96
-rw-r--r--QuakeEd/Makefile62
-rw-r--r--QuakeEd/Makefile.postamble115
-rw-r--r--QuakeEd/Makefile.preamble108
-rw-r--r--QuakeEd/Map.h68
-rw-r--r--QuakeEd/Map.m1121
-rw-r--r--QuakeEd/PB.gdbinit7
-rw-r--r--QuakeEd/PB.project26
-rw-r--r--QuakeEd/PopScrollView.h11
-rw-r--r--QuakeEd/PopScrollView.m87
-rw-r--r--QuakeEd/Preferences.h78
-rw-r--r--QuakeEd/Preferences.m330
-rw-r--r--QuakeEd/Project.h108
-rw-r--r--QuakeEd/Project.m526
-rw-r--r--QuakeEd/QuakeEd.h98
-rw-r--r--QuakeEd/QuakeEd.iconheader2
-rw-r--r--QuakeEd/QuakeEd.m1026
-rw-r--r--QuakeEd/QuakeEd_main.m15
-rw-r--r--QuakeEd/README33
-rw-r--r--QuakeEd/SetBrush.h158
-rw-r--r--QuakeEd/SetBrush.m2034
-rw-r--r--QuakeEd/TexturePalette.h113
-rw-r--r--QuakeEd/TexturePalette.m818
-rw-r--r--QuakeEd/TextureView.h12
-rw-r--r--QuakeEd/TextureView.m152
-rw-r--r--QuakeEd/Things.h42
-rw-r--r--QuakeEd/Things.m317
-rw-r--r--QuakeEd/UpArrow.tiffbin0 -> 258 bytes
-rw-r--r--QuakeEd/UserPath.h72
-rw-r--r--QuakeEd/UserPath.m209
-rw-r--r--QuakeEd/XYView.h66
-rw-r--r--QuakeEd/XYView.m1384
-rw-r--r--QuakeEd/ZScrollView.h11
-rw-r--r--QuakeEd/ZScrollView.m71
-rw-r--r--QuakeEd/ZView.h42
-rw-r--r--QuakeEd/ZView.m872
-rw-r--r--QuakeEd/cmdlib.c611
-rw-r--r--QuakeEd/cmdlib.h62
-rw-r--r--QuakeEd/help.txt175
-rw-r--r--QuakeEd/i_90d.tiffbin0 -> 1346 bytes
-rw-r--r--QuakeEd/i_add.tiffbin0 -> 1346 bytes
-rw-r--r--QuakeEd/i_brushes.tiffbin0 -> 1346 bytes
-rw-r--r--QuakeEd/i_fliph.tiffbin0 -> 1346 bytes
-rw-r--r--QuakeEd/i_flipv.tiffbin0 -> 1346 bytes
-rw-r--r--QuakeEd/i_quakeed.tiffbin0 -> 29799 bytes
-rw-r--r--QuakeEd/i_sub.tiffbin0 -> 1346 bytes
-rw-r--r--QuakeEd/inspectors.tiffbin0 -> 231654 bytes
-rw-r--r--QuakeEd/jrbase1.map11858
-rw-r--r--QuakeEd/mainwindow.tiffbin0 -> 45188 bytes
-rw-r--r--QuakeEd/mathlib.c93
-rw-r--r--QuakeEd/mathlib.h31
-rw-r--r--QuakeEd/misc.m274
-rw-r--r--QuakeEd/qedefs.h56
-rw-r--r--QuakeEd/quake.qpr13
-rw-r--r--QuakeEd/readme.txt33
-rw-r--r--QuakeEd/render.h13
-rw-r--r--QuakeEd/render.m748
-rw-r--r--QuakeEd/short.tiffbin0 -> 1346 bytes
-rw-r--r--QuakeEd/tall.tiffbin0 -> 1346 bytes
-rw-r--r--QuakeEd/triggers.qc738
82 files changed, 28345 insertions, 0 deletions
diff --git a/QuakeEd/.nfs7072 b/QuakeEd/.nfs7072
new file mode 100644
index 0000000..579785b
--- /dev/null
+++ b/QuakeEd/.nfs7072
@@ -0,0 +1,33 @@
+
+5/18/96
+
+This is a dump of the current source code for QuakeEd, our map editing application.
+
+This does not include everything necessary to build maps. There are graphics files, prog files, and other utilities needed. I plan on releasing a full development set of tools after the game ships. This is just intended to help out anyone working on their own map editor.
+
+This is a NEXTSTEP application, so hardly anyone is going to be able to use the code as is. This is not an OPENSTEP application. It doesn't even use the foundation kit, so porting to gnustep or openstep-solaris/mach/nt would not be trivial.
+
+There are lots of mixed case and >8 character filenames, so I'm using unix gzip (compressed) format.
+
+Because most people won't have access to a NEXTSTEP machine, I took pictures of some of the more important stuff from interface builder:
+
+mainwindow.tiff : a screenshot of the primary window
+inspectors.tiff : a screenshot of the important inspector views
+help.txt : a dump of the (minimal) help inspector's contents.
+
+I included some sample data to help you follow the code:
+
+quake.qpr : our current project file
+jrbase1.map : a sample map
+triggers.qc : a sample qc source file that includes some /*QUAKED comments
+
+There will not be any major changes to this code base. I am eagerly looking forward to writing a brand new editor for windows NT + open GL as soon as Quake ships.
+
+This application was really not a very good fit for NEXTSTEP. The display postscript model fundamentally doesn't fit very well with what we need here -- if you run in an 8 bit color mode, the line drawing runs at an ok speed, but the texture view goes half the speed it should as it dithers from 24 bit color down to 8 bit. If you run in 24 bit color mode, you get less screen real estate and significantly slower line drawing as a 3 megabyte XY view is flushed. Sigh. If anyone does actually run this on NEXTSTEP be advised that you want a fast machine. I never had the time to properly optimize QuakeEd.
+
+The texture view rendering code in here is crap. Anyone coding a new editor is strongly advised to just use an available optimized library, like open GL or direct 3D.
+
+
+John Carmack
+Id Software
+johnc@idsoftware.com
diff --git a/QuakeEd/Brush.h b/QuakeEd/Brush.h
new file mode 100644
index 0000000..94b449f
--- /dev/null
+++ b/QuakeEd/Brush.h
@@ -0,0 +1,55 @@
+#import <appkit/appkit.h>
+#import "SetBrush.h"
+#import "EditWindow.h"
+
+extern id brush_i;
+
+extern BOOL brushdraw; // YES when drawing cutbrushes and ents
+
+@interface Brush : SetBrush
+{
+ id cutbrushes_i;
+ id cutentities_i;
+ boolean updatemask[MAXBRUSHVERTEX];
+ BOOL dontdraw; // for modal instance loops
+ BOOL deleted; // when not visible at all
+}
+
+- init;
+
+- initFromSetBrush: br;
+
+- deselect;
+- (BOOL)isSelected;
+
+- (BOOL)XYmouseDown: (NXPoint *)pt; // return YES if brush handled
+- (BOOL)ZmouseDown: (NXPoint *)pt; // return YES if brush handled
+
+- _keyDown:(NXEvent *)theEvent;
+
+- (NXPoint)centerPoint; // for camera flyby mode
+
+- InstanceSize;
+- XYDrawSelf;
+- ZDrawSelf;
+- CameraDrawSelf;
+
+- flipHorizontal: sender;
+- flipVertical: sender;
+- rotate90: sender;
+
+- makeTall: sender;
+- makeShort: sender;
+- makeWide: sender;
+- makeNarrow: sender;
+
+- placeEntity: sender;
+
+- cut: sender;
+- copy: sender;
+
+- addBrush;
+
+@end
+
+
diff --git a/QuakeEd/CameraView.h b/QuakeEd/CameraView.h
new file mode 100644
index 0000000..03ddc06
--- /dev/null
+++ b/QuakeEd/CameraView.h
@@ -0,0 +1,61 @@
+#import <appkit/appkit.h>
+#import "mathlib.h"
+#import "SetBrush.h"
+
+extern id cameraview_i;
+
+extern byte renderlist[1024*1024*4];
+
+void CameraMoveto(vec3_t p);
+void CameraLineto(vec3_t p);
+
+extern BOOL timedrawing;
+
+@interface CameraView : View
+{
+ float xa, ya, za;
+ float move;
+
+ float *zbuffer;
+ unsigned *imagebuffer;
+
+ BOOL angleChange; // JR 6.8.95
+
+ vec3_t origin;
+ vec3_t matrix[3];
+
+ NXPoint dragspot;
+
+ drawmode_t drawmode;
+
+// UI links
+ id mode_radio_i;
+
+}
+
+- setXYOrigin: (NXPoint *)pt;
+- setZOrigin: (float)pt;
+
+- setOrigin: (vec3_t)org angle: (float)angle;
+- getOrigin: (vec3_t)org;
+
+- (float)yawAngle;
+
+- matrixFromAngles;
+- _keyDown: (NXEvent *)theEvent;
+
+- drawMode: sender;
+- setDrawMode: (drawmode_t)mode;
+
+- homeView: sender;
+
+- XYDrawSelf; // for drawing viewpoint in XY view
+- ZDrawSelf; // for drawing viewpoint in XY view
+- (BOOL)XYmouseDown: (NXPoint *)pt flags:(int)flags; // return YES if brush handled
+- (BOOL)ZmouseDown: (NXPoint *)pt flags:(int)flags; // return YES if brush handled
+
+- upFloor:sender;
+- downFloor: sender;
+
+@end
+
diff --git a/QuakeEd/CameraView.m b/QuakeEd/CameraView.m
new file mode 100644
index 0000000..9ee6771
--- /dev/null
+++ b/QuakeEd/CameraView.m
@@ -0,0 +1,970 @@
+#import "qedefs.h"
+
+id cameraview_i;
+
+BOOL timedrawing = 0;
+
+@implementation CameraView
+
+/*
+==================
+initFrame:
+==================
+*/
+- initFrame:(const NXRect *)frameRect
+{
+ int size;
+
+ [super initFrame: frameRect];
+
+ cameraview_i = self;
+
+ xa = ya = za = 0;
+
+ [self matrixFromAngles];
+
+ origin[0] = 64;
+ origin[1] = 64;
+ origin[2] = 48;
+
+ move = 16;
+
+ size = bounds.size.width * bounds.size.height;
+ zbuffer = malloc (size*4);
+ imagebuffer = malloc (size*4);
+
+ return self;
+}
+
+- setXYOrigin: (NXPoint *)pt
+{
+ origin[0] = pt->x;
+ origin[1] = pt->y;
+ return self;
+}
+
+- setZOrigin: (float)pt
+{
+ origin[2] = pt;
+ return self;
+}
+
+- setOrigin: (vec3_t)org angle: (float)angle
+{
+ VectorCopy (org, origin);
+ ya = angle;
+ [self matrixFromAngles];
+ return self;
+}
+
+- getOrigin: (vec3_t)org
+{
+ VectorCopy (origin, org);
+ return self;
+}
+
+- (float)yawAngle
+{
+ return ya;
+}
+
+- upFloor:sender
+{
+ sb_floor_dir = 1;
+ sb_floor_dist = 99999;
+ [map_i makeAllPerform: @selector(feetToFloor)];
+ if (sb_floor_dist == 99999)
+ {
+ qprintf ("already on top floor");
+ return self;
+ }
+ qprintf ("up floor");
+ origin[2] += sb_floor_dist;
+ [quakeed_i updateCamera];
+ return self;
+}
+
+- downFloor: sender
+{
+ sb_floor_dir = -1;
+ sb_floor_dist = -99999;
+ [map_i makeAllPerform: @selector(feetToFloor)];
+ if (sb_floor_dist == -99999)
+ {
+ qprintf ("already on bottom floor");
+ return self;
+ }
+ qprintf ("down floor");
+ origin[2] += sb_floor_dist;
+ [quakeed_i updateCamera];
+ return self;
+}
+
+/*
+===============================================================================
+
+UI TARGETS
+
+===============================================================================
+*/
+
+/*
+============
+homeView
+============
+*/
+- homeView: sender
+{
+ xa = za = 0;
+
+ [self matrixFromAngles];
+
+ [quakeed_i updateAll];
+
+ qprintf ("homed view angle");
+
+ return self;
+}
+
+- drawMode: sender
+{
+ drawmode = [sender selectedCol];
+ [quakeed_i updateCamera];
+ return self;
+}
+
+- setDrawMode: (drawmode_t)mode
+{
+ drawmode = mode;
+ [mode_radio_i selectCellAt:0: mode];
+ [quakeed_i updateCamera];
+ return self;
+}
+
+/*
+===============================================================================
+
+TRANSFORMATION METHODS
+
+===============================================================================
+*/
+
+- matrixFromAngles
+{
+ if (xa > M_PI*0.4)
+ xa = M_PI*0.4;
+ if (xa < -M_PI*0.4)
+ xa = -M_PI*0.4;
+
+// vpn
+ matrix[2][0] = cos(xa)*cos(ya);
+ matrix[2][1] = cos(xa)*sin(ya);
+ matrix[2][2] = sin(xa);
+
+// vup
+ matrix[1][0] = cos(xa+M_PI/2)*cos(ya);
+ matrix[1][1] = cos(xa+M_PI/2)*sin(ya);
+ matrix[1][2] = sin(xa+M_PI/2);
+
+// vright
+ CrossProduct (matrix[2], matrix[1], matrix[0]);
+
+ return self;
+}
+
+
+- inverseTransform: (vec_t *)invec to:(vec_t *)outvec
+{
+ vec3_t inverse[3];
+ vec3_t temp;
+ int i,j;
+
+ for (i=0 ; i<3 ; i++)
+ for (j=0 ; j<3 ; j++)
+ inverse[i][j] = matrix[j][i];
+
+ temp[0] = DotProduct(invec, inverse[0]);
+ temp[1] = DotProduct(invec, inverse[1]);
+ temp[2] = DotProduct(invec, inverse[2]);
+
+ VectorAdd (temp, origin, outvec);
+
+ return self;
+}
+
+
+
+/*
+===============================================================================
+
+ DRAWING METHODS
+
+===============================================================================
+*/
+
+typedef struct
+{
+ vec3_t trans;
+ int clipflags;
+ vec3_t screen; // only valid if clipflags == 0
+} campt_t;
+#define CLIP_RIGHT 1
+#define CLIP_LEFT 2
+#define CLIP_TOP 4
+#define CLIP_BOTTOM 8
+#define CLIP_FRONT 16
+
+int cam_cur;
+campt_t campts[2];
+
+vec3_t r_matrix[3];
+vec3_t r_origin;
+float mid_x, mid_y;
+float topscale = (240.0/3)/160;
+float bottomscale = (240.0*2/3)/160;
+
+extern plane_t frustum[5];
+
+void MakeCampt (vec3_t in, campt_t *pt)
+{
+ vec3_t temp;
+ float scale;
+
+// transform the points
+ VectorSubtract (in, r_origin, temp);
+
+ pt->trans[0] = DotProduct(temp, r_matrix[0]);
+ pt->trans[1] = DotProduct(temp, r_matrix[1]);
+ pt->trans[2] = DotProduct(temp, r_matrix[2]);
+
+// check clip flags
+ if (pt->trans[2] < 1)
+ pt->clipflags = CLIP_FRONT;
+ else
+ pt->clipflags = 0;
+
+ if (pt->trans[0] > pt->trans[2])
+ pt->clipflags |= CLIP_RIGHT;
+ else if (-pt->trans[0] > pt->trans[2])
+ pt->clipflags |= CLIP_LEFT;
+
+ if (pt->trans[1] > pt->trans[2]*topscale )
+ pt->clipflags |= CLIP_TOP;
+ else if (-pt->trans[1] > pt->trans[2]*bottomscale )
+ pt->clipflags |= CLIP_BOTTOM;
+
+ if (pt->clipflags)
+ return;
+
+// project
+ scale = mid_x/pt->trans[2];
+ pt->screen[0] = mid_x + pt->trans[0]*scale;
+ pt->screen[1] = mid_y + pt->trans[1]*scale;
+}
+
+
+void CameraMoveto(vec3_t p)
+{
+ campt_t *pt;
+
+ if (upath->numberOfPoints > 2048)
+ lineflush ();
+
+ pt = &campts[cam_cur];
+ cam_cur ^= 1;
+ MakeCampt (p,pt);
+ if (!pt->clipflags)
+ { // onscreen, so move there immediately
+ UPmoveto (upath, pt->screen[0], pt->screen[1]);
+ }
+}
+
+void ClipLine (vec3_t p1, vec3_t p2, int planenum)
+{
+ float d, d2, frac;
+ vec3_t new;
+ plane_t *pl;
+ float scale;
+
+ if (planenum == 5)
+ { // draw it!
+ scale = mid_x/p1[2];
+ new[0] = mid_x + p1[0]*scale;
+ new[1] = mid_y + p1[1]*scale;
+ UPmoveto (upath, new[0], new[1]);
+
+ scale = mid_x/p2[2];
+ new[0] = mid_x + p2[0]*scale;
+ new[1] = mid_y + p2[1]*scale;
+ UPlineto (upath, new[0], new[1]);
+ return;
+ }
+
+ pl = &frustum[planenum];
+
+ d = DotProduct (p1, pl->normal) - pl->dist;
+ d2 = DotProduct (p2, pl->normal) - pl->dist;
+ if (d <= ON_EPSILON && d2 <= ON_EPSILON)
+ { // off screen
+ return;
+ }
+
+ if (d >= 0 && d2 >= 0)
+ { // on front
+ ClipLine (p1, p2, planenum+1);
+ return;
+ }
+
+ frac = d/(d-d2);
+ new[0] = p1[0] + frac*(p2[0]-p1[0]);
+ new[1] = p1[1] + frac*(p2[1]-p1[1]);
+ new[2] = p1[2] + frac*(p2[2]-p1[2]);
+
+ if (d > 0)
+ ClipLine (p1, new, planenum+1);
+ else
+ ClipLine (new, p2, planenum+1);
+}
+
+int c_off, c_on, c_clip;
+
+void CameraLineto(vec3_t p)
+{
+ campt_t *p1, *p2;
+ int bits;
+
+ p2 = &campts[cam_cur];
+ cam_cur ^= 1;
+ p1 = &campts[cam_cur];
+ MakeCampt (p, p2);
+
+ if (p1->clipflags & p2->clipflags)
+ {
+ c_off++;
+ return; // entirely off screen
+ }
+
+ bits = p1->clipflags | p2->clipflags;
+
+ if (! bits )
+ {
+ c_on++;
+ UPmoveto (upath, p1->screen[0], p1->screen[1]);
+ UPlineto (upath, p2->screen[0], p2->screen[1]);
+ return; // entirely on screen
+ }
+
+// needs to be clipped
+ c_clip++;
+
+ ClipLine (p1->trans, p2->trans, 0);
+}
+
+
+/*
+=============
+drawSolid
+=============
+*/
+- drawSolid
+{
+ unsigned char *planes[5];
+
+//
+// draw it
+//
+ VectorCopy (origin, r_origin);
+ VectorCopy (matrix[0], r_matrix[0]);
+ VectorCopy (matrix[1], r_matrix[1]);
+ VectorCopy (matrix[2], r_matrix[2]);
+
+ r_width = bounds.size.width;
+ r_height = bounds.size.height;
+ r_picbuffer = imagebuffer;
+ r_zbuffer = zbuffer;
+
+ r_drawflat = (drawmode == dr_flat);
+
+ REN_BeginCamera ();
+ REN_ClearBuffers ();
+
+//
+// render the setbrushes
+//
+ [map_i makeAllPerform: @selector(CameraRenderSelf)];
+
+//
+// display the output
+//
+ [[self window] setBackingType:NX_RETAINED];
+
+ planes[0] = (unsigned char *)imagebuffer;
+ NXDrawBitmap(
+ &bounds,
+ r_width,
+ r_height,
+ 8,
+ 3,
+ 32,
+ r_width*4,
+ NO,
+ NO,
+ NX_RGBColorSpace,
+ planes
+ );
+
+ NXPing ();
+ [[self window] setBackingType:NX_BUFFERED];
+
+
+
+ return self;
+}
+
+
+/*
+===================
+drawWire
+===================
+*/
+- drawWire: (const NXRect *)rect
+{
+// copy current info to globals for the C callbacks
+ mid_x = bounds.size.width / 2;
+ mid_y = 2 * bounds.size.height / 3;
+
+ VectorCopy (origin, r_origin);
+ VectorCopy (matrix[0], r_matrix[0]);
+ VectorCopy (matrix[1], r_matrix[1]);
+ VectorCopy (matrix[2], r_matrix[2]);
+
+ r_width = bounds.size.width;
+ r_height = bounds.size.height;
+ r_picbuffer = imagebuffer;
+ r_zbuffer = zbuffer;
+
+ REN_BeginCamera ();
+
+// erase window
+ NXEraseRect (rect);
+
+// draw all entities
+ linestart (0,0,0);
+ [map_i makeUnselectedPerform: @selector(CameraDrawSelf)];
+ lineflush ();
+
+ return self;
+}
+
+/*
+===================
+drawSelf
+===================
+*/
+- drawSelf:(const NXRect *)rects :(int)rectCount
+{
+ static float drawtime; // static to shut up compiler warning
+
+ if (timedrawing)
+ drawtime = I_FloatTime ();
+
+ if (drawmode == dr_texture || drawmode == dr_flat)
+ [self drawSolid];
+ else
+ [self drawWire: rects];
+
+ if (timedrawing)
+ {
+ NXPing ();
+ drawtime = I_FloatTime() - drawtime;
+ printf ("CameraView drawtime: %5.3f\n", drawtime);
+ }
+
+ return self;
+}
+
+
+/*
+=============
+XYDrawSelf
+=============
+*/
+- XYDrawSelf
+{
+
+ PSsetrgbcolor (0,0,1.0);
+ PSsetlinewidth (0.15);
+ PSmoveto (origin[0]-16,origin[1]);
+ PSrlineto (16,8);
+ PSrlineto (16,-8);
+ PSrlineto (-16,-8);
+ PSrlineto (-16,8);
+ PSrlineto (32,0);
+
+ PSmoveto (origin[0],origin[1]);
+ PSrlineto (64*cos(ya+M_PI/4), 64*sin(ya+M_PI/4));
+ PSmoveto (origin[0],origin[1]);
+ PSrlineto (64*cos(ya-M_PI/4), 64*sin(ya-M_PI/4));
+
+ PSstroke ();
+
+ return self;
+}
+
+/*
+=============
+ZDrawSelf
+=============
+*/
+- ZDrawSelf
+{
+ PSsetrgbcolor (0,0,1.0);
+ PSsetlinewidth (0.15);
+
+ PSmoveto (-16,origin[2]);
+ PSrlineto (16,8);
+ PSrlineto (16,-8);
+ PSrlineto (-16,-8);
+ PSrlineto (-16,8);
+ PSrlineto (32,0);
+
+ PSmoveto (-15,origin[2]-47);
+ PSrlineto (29,0);
+ PSrlineto (0,54);
+ PSrlineto (-29,0);
+ PSrlineto (0,-54);
+
+ PSstroke ();
+
+ return self;
+}
+
+
+/*
+===============================================================================
+
+ XYZ mouse view methods
+
+===============================================================================
+*/
+
+/*
+================
+modalMoveLoop
+================
+*/
+- modalMoveLoop: (NXPoint *)basept :(vec3_t)movemod : converter
+{
+ vec3_t originbase;
+ NXEvent *event;
+ NXPoint newpt;
+// NXPoint brushpt;
+ vec3_t delta;
+// id ent;
+ int i;
+// vec3_t temp;
+
+ qprintf ("moving camera position");
+
+ VectorCopy (origin, originbase);
+
+//
+// modal event loop using instance drawing
+//
+ goto drawentry;
+
+ while (event->type != NX_LMOUSEUP && event->type != NX_RMOUSEUP)
+ {
+ //
+ // calculate new point
+ //
+ newpt = event->location;
+ [converter convertPoint:&newpt fromView:NULL];
+
+ delta[0] = newpt.x-basept->x;
+ delta[1] = newpt.y-basept->y;
+ delta[2] = delta[1]; // height change
+
+ for (i=0 ; i<3 ; i++)
+ origin[i] = originbase[i]+movemod[i]*delta[i];
+
+#if 0 // FIXME
+ //
+ // if command is down, look towards brush or entity
+ //
+ if (event->flags & NX_SHIFTMASK)
+ {
+ ent = [quakemap_i selectedEntity];
+ if (ent)
+ {
+ [ent origin: temp];
+ brushpt.x = temp[0];
+ brushpt.y = temp[1];
+ }
+ else
+ brushpt = [brush_i centerPoint];
+ ya = atan2 (brushpt.y - newpt.y, brushpt.x - newpt.x);
+ [self matrixFromAngles];
+ }
+#endif
+
+drawentry:
+ //
+ // instance draw new frame
+ //
+ [quakeed_i newinstance];
+ [self display];
+
+ event = [NXApp getNextEvent: NX_LMOUSEUPMASK | NX_LMOUSEDRAGGEDMASK
+ | NX_RMOUSEUPMASK | NX_RMOUSEDRAGGEDMASK | NX_APPDEFINEDMASK];
+
+ if (event->type == NX_KEYDOWN)
+ {
+ [self _keyDown: event];
+ [self display];
+ goto drawentry;
+ }
+
+ }
+
+ return self;
+}
+
+//============================================================================
+
+/*
+===============
+XYmouseDown
+===============
+*/
+- (BOOL)XYmouseDown: (NXPoint *)pt flags:(int)flags // return YES if brush handled
+{
+ vec3_t movemod;
+
+ if (fabs(pt->x - origin[0]) > 16
+ || fabs(pt->y - origin[1]) > 16 )
+ return NO;
+
+#if 0
+ if (flags & NX_ALTERNATEMASK)
+ { // up / down drag
+ movemod[0] = 0;
+ movemod[1] = 0;
+ movemod[2] = 1;
+ }
+ else
+#endif
+ {
+ movemod[0] = 1;
+ movemod[1] = 1;
+ movemod[2] = 0;
+ }
+
+ [self modalMoveLoop: pt : movemod : xyview_i];
+
+ return YES;
+}
+
+
+/*
+===============
+ZmouseDown
+===============
+*/
+- (BOOL)ZmouseDown: (NXPoint *)pt flags:(int)flags // return YES if brush handled
+{
+ vec3_t movemod;
+
+ if (fabs(pt->y - origin[2]) > 16
+ || pt->x < -8 || pt->x > 8 )
+ return NO;
+
+ movemod[0] = 0;
+ movemod[1] = 0;
+ movemod[2] = 1;
+
+ [self modalMoveLoop: pt : movemod : zview_i];
+
+ return YES;
+}
+
+
+//=============================================================================
+
+/*
+===================
+viewDrag:
+===================
+*/
+- viewDrag:(NXPoint *)pt
+{
+ float dx,dy;
+ NXEvent *event;
+ NXPoint newpt;
+
+//
+// modal event loop using instance drawing
+//
+ goto drawentry;
+
+ while (event->type != NX_RMOUSEUP)
+ {
+ //
+ // calculate new point
+ //
+ newpt = event->location;
+ [self convertPoint:&newpt fromView:NULL];
+
+ dx = newpt.x - pt->x;
+ dy = newpt.y - pt->y;
+ *pt = newpt;
+
+ ya -= dx/bounds.size.width*M_PI/2 * 4;
+ xa += dy/bounds.size.width*M_PI/2 * 4;
+
+ [self matrixFromAngles];
+
+drawentry:
+ [quakeed_i newinstance];
+ [self display];
+
+ event = [NXApp getNextEvent:
+ NX_KEYDOWNMASK | NX_RMOUSEUPMASK | NX_RMOUSEDRAGGEDMASK];
+
+ if (event->type == NX_KEYDOWN)
+ {
+ [self _keyDown: event];
+ [self display];
+ goto drawentry;
+ }
+
+ }
+
+ return self;
+}
+
+
+//=============================================================================
+
+/*
+===================
+mouseDown
+===================
+*/
+- mouseDown:(NXEvent *)theEvent
+{
+ NXPoint pt;
+ int i;
+ vec3_t p1, p2;
+ float forward, right, up;
+ int flags;
+
+ pt = theEvent->location;
+
+ [self convertPoint:&pt fromView:NULL];
+
+ VectorCopy (origin, p1);
+ forward = 160;
+ right = pt.x - 160;
+ up = pt.y - 240*2/3;
+ for (i=0 ; i<3 ; i++)
+ p2[i] = forward*matrix[2][i] + up*matrix[1][i] + right*matrix[0][i];
+ for (i=0 ; i<3 ; i++)
+ p2[i] = p1[i] + 100*p2[i];
+
+ flags = theEvent->flags & (NX_SHIFTMASK | NX_CONTROLMASK | NX_ALTERNATEMASK | NX_COMMANDMASK);
+
+//
+// bare click to select a texture
+//
+ if (flags == 0)
+ {
+ [map_i getTextureRay: p1 : p2];
+ return self;
+ }
+
+//
+// shift click to select / deselect a brush from the world
+//
+ if (flags == NX_SHIFTMASK)
+ {
+ [map_i selectRay: p1 : p2 : NO];
+ return self;
+ }
+
+
+//
+// cmd-shift click to set a target/targetname entity connection
+//
+ if (flags == (NX_SHIFTMASK|NX_COMMANDMASK) )
+ {
+ [map_i entityConnect: p1 : p2];
+ return self;
+ }
+
+//
+// alt click = set entire brush texture
+//
+ if (flags == NX_ALTERNATEMASK)
+ {
+ if (drawmode != dr_texture)
+ {
+ qprintf ("No texture setting except in texture mode!\n");
+ NopSound ();
+ return self;
+ }
+ [map_i setTextureRay: p1 : p2 : YES];
+ [quakeed_i updateAll];
+ return self;
+ }
+
+//
+// ctrl-alt click = set single face texture
+//
+ if (flags == (NX_CONTROLMASK | NX_ALTERNATEMASK) )
+ {
+ if (drawmode != dr_texture)
+ {
+ qprintf ("No texture setting except in texture mode!\n");
+ NopSound ();
+ return self;
+ }
+ [map_i setTextureRay: p1 : p2 : NO];
+ [quakeed_i updateAll];
+ return self;
+ }
+
+
+ qprintf ("bad flags for click");
+ NopSound ();
+
+ return self;
+}
+
+/*
+===================
+rightMouseDown
+===================
+*/
+- rightMouseDown:(NXEvent *)theEvent
+{
+ NXPoint pt;
+ int flags;
+
+ pt = theEvent->location;
+
+ [self convertPoint:&pt fromView:NULL];
+
+ flags = theEvent->flags & (NX_SHIFTMASK | NX_CONTROLMASK | NX_ALTERNATEMASK | NX_COMMANDMASK);
+
+//
+// click = drag camera
+//
+ if (flags == 0)
+ {
+ qprintf ("looking");
+ [self viewDrag: &pt];
+ qprintf ("");
+ return self;
+ }
+
+ qprintf ("bad flags for click");
+ NopSound ();
+
+ return self;
+}
+
+/*
+===============
+keyDown
+===============
+*/
+
+#define KEY_RIGHTARROW 0xae
+#define KEY_LEFTARROW 0xac
+#define KEY_UPARROW 0xad
+#define KEY_DOWNARROW 0xaf
+
+
+- _keyDown: (NXEvent *)theEvent
+{
+ int ch;
+
+ ch = tolower(theEvent->data.key.charCode);
+
+ switch (ch)
+ {
+ case 13:
+ return self;
+
+ case 'a':
+ case 'A':
+ xa += M_PI/8;
+ [self matrixFromAngles];
+ [quakeed_i updateCamera];
+ return self;
+
+ case 'z':
+ case 'Z':
+ xa -= M_PI/8;
+ [self matrixFromAngles];
+ [quakeed_i updateCamera];
+ return self;
+
+ case KEY_RIGHTARROW:
+ ya -= M_PI*move/(64*2);
+ [self matrixFromAngles];
+ [quakeed_i updateCamera];
+ break;
+
+ case KEY_LEFTARROW:
+ ya += M_PI*move/(64*2);
+ [self matrixFromAngles];
+ [quakeed_i updateCamera];
+ break;
+
+ case KEY_UPARROW:
+ origin[0] += move*cos(ya);
+ origin[1] += move*sin(ya);
+ [quakeed_i updateCamera];
+ break;
+
+ case KEY_DOWNARROW:
+ origin[0] -= move*cos(ya);
+ origin[1] -= move*sin(ya);
+ [quakeed_i updateCamera];
+ break;
+
+ case '.':
+ origin[0] += move*cos(ya-M_PI_2);
+ origin[1] += move*sin(ya-M_PI_2);
+ [quakeed_i updateCamera];
+ break;
+
+ case ',':
+ origin[0] -= move*cos(ya-M_PI_2);
+ origin[1] -= move*sin(ya-M_PI_2);
+ [quakeed_i updateCamera];
+ break;
+
+ case 'd':
+ case 'D':
+ origin[2] += move;
+ [quakeed_i updateCamera];
+ break;
+
+ case 'c':
+ case 'C':
+ origin[2] -= move;
+ [quakeed_i updateCamera];
+ break;
+
+ }
+
+
+ return self;
+}
+
+
+@end
+
diff --git a/QuakeEd/Clipper.h b/QuakeEd/Clipper.h
new file mode 100644
index 0000000..7756d2d
--- /dev/null
+++ b/QuakeEd/Clipper.h
@@ -0,0 +1,24 @@
+
+extern id clipper_i;
+
+@interface Clipper : Object
+{
+ int num;
+ vec3_t pos[3];
+ plane_t plane;
+}
+
+- (BOOL)hide;
+- XYClick: (NXPoint)pt;
+- (BOOL)XYDrag: (NXPoint *)pt;
+- ZClick: (NXPoint)pt;
+- carve;
+- flipNormal;
+- (BOOL)getFace: (face_t *)pl;
+
+- cameraDrawSelf;
+- XYDrawSelf;
+- ZDrawSelf;
+
+@end
+
diff --git a/QuakeEd/Clipper.m b/QuakeEd/Clipper.m
new file mode 100644
index 0000000..f6ba911
--- /dev/null
+++ b/QuakeEd/Clipper.m
@@ -0,0 +1,227 @@
+
+#include "qedefs.h"
+
+id clipper_i;
+
+@implementation Clipper
+
+- init
+{
+ [super init];
+ clipper_i = self;
+ return self;
+}
+
+- (BOOL)hide
+{
+ int oldnum;
+
+ oldnum = num;
+ num = 0;
+ return (oldnum > 0);
+}
+
+- flipNormal
+{
+ vec3_t temp;
+
+ if (num == 2)
+ {
+ VectorCopy (pos[0], temp);
+ VectorCopy (pos[1], pos[0]);
+ VectorCopy (temp, pos[1]);
+ }
+ else if (num == 3)
+ {
+ VectorCopy (pos[0], temp);
+ VectorCopy (pos[2], pos[0]);
+ VectorCopy (temp, pos[2]);
+ }
+ else
+ {
+ qprintf ("no clipplane");
+ NXBeep ();
+ }
+
+ return self;
+}
+
+- (BOOL)getFace: (face_t *)f
+{
+ vec3_t v1, v2, norm;
+ int i;
+
+ VectorCopy (vec3_origin, plane.normal);
+ plane.dist = 0;
+ if (num < 2)
+ return NO;
+ if (num == 2)
+ {
+ VectorCopy (pos[0], pos[2]);
+ pos[2][2] += 16;
+ }
+
+ for (i=0 ; i<3 ; i++)
+ VectorCopy (pos[i], f->planepts[i]);
+
+ VectorSubtract (pos[2], pos[0], v1);
+ VectorSubtract (pos[1], pos[0], v2);
+
+ CrossProduct (v1, v2, norm);
+ VectorNormalize (norm);
+
+ if ( !norm[0] && !norm[1] && !norm[2] )
+ return NO;
+
+ [texturepalette_i getTextureDef: &f->texture];
+
+ return YES;
+}
+
+/*
+================
+XYClick
+================
+*/
+- XYClick: (NXPoint)pt
+{
+ int i;
+ vec3_t new;
+
+ new[0] = [xyview_i snapToGrid: pt.x];
+ new[1] = [xyview_i snapToGrid: pt.y];
+ new[2] = [map_i currentMinZ];
+
+// see if a point is allready there
+ for (i=0 ; i<num ; i++)
+ {
+ if (new[0] == pos[i][0] && new[1] == pos[i][1])
+ {
+ if (pos[i][2] == [map_i currentMinZ])
+ pos[i][2] = [map_i currentMaxZ];
+ else
+ pos[i][2] = [map_i currentMinZ];
+ [quakeed_i updateAll];
+ return self;
+ }
+ }
+
+
+ if (num == 3)
+ num = 0;
+
+ VectorCopy (new, pos[num]);
+ num++;
+
+ [quakeed_i updateAll];
+
+ return self;
+}
+
+/*
+================
+XYDrag
+================
+*/
+- (BOOL)XYDrag: (NXPoint *)pt
+{
+ int i;
+
+ for (i=0 ; i<3 ; i++)
+ {
+ if (fabs(pt->x - pos[i][0] > 10) || fabs(pt->y - pos[i][1] > 10) )
+ continue;
+ // drag this point
+
+ }
+
+ return NO;
+}
+
+- ZClick: (NXPoint)pt
+{
+ return self;
+}
+
+//=============================================================================
+
+- carve
+{
+ [map_i makeSelectedPerform: @selector(carveByClipper)];
+ num = 0;
+ return self;
+}
+
+
+- cameraDrawSelf
+{
+ vec3_t mid;
+ int i;
+
+ linecolor (1,0.5,0);
+
+ for (i=0 ; i<num ; i++)
+ {
+ VectorCopy (pos[i], mid);
+ mid[0] -= 8;
+ mid[1] -= 8;
+ CameraMoveto (mid);
+ mid[0] += 16;
+ mid[1] += 16;
+ CameraLineto (mid);
+
+ VectorCopy (pos[i], mid);
+ mid[0] -= 8;
+ mid[1] += 8;
+ CameraMoveto (mid);
+ mid[0] += 16;
+ mid[1] -= 16;
+ CameraLineto (mid);
+ }
+
+ return self;
+}
+
+- XYDrawSelf
+{
+ int i;
+ char text[8];
+
+ PSsetrgbcolor (1,0.5,0);
+ PSselectfont("Helvetica-Medium",10/[xyview_i currentScale]);
+ PSrotate(0);
+
+ for (i=0 ; i<num ; i++)
+ {
+ PSmoveto (pos[i][0]-4, pos[i][1]-4);
+ sprintf (text, "%i", i);
+ PSshow (text);
+ PSstroke ();
+ PSarc ( pos[i][0], pos[i][1], 10, 0, 360);
+ PSstroke ();
+ }
+ return self;
+}
+
+- ZDrawSelf
+{
+ int i;
+ char text[8];
+
+ PSsetrgbcolor (1,0.5,0);
+ PSselectfont("Helvetica-Medium",10/[zview_i currentScale]);
+ PSrotate(0);
+
+ for (i=0 ; i<num ; i++)
+ {
+ PSmoveto (-28+i*8 - 4, pos[i][2]-4);
+ sprintf (text, "%i", i);
+ PSshow (text);
+ PSstroke ();
+ PSarc ( -28+i*8, pos[i][2], 10, 0, 360);
+ PSstroke ();
+ }
+ return self;
+}
+
+@end
diff --git a/QuakeEd/Dict.h b/QuakeEd/Dict.h
new file mode 100644
index 0000000..3f88acb
--- /dev/null
+++ b/QuakeEd/Dict.h
@@ -0,0 +1,47 @@
+
+#import <appkit/appkit.h>
+
+typedef struct
+{
+ char *key;
+ char *value;
+} dict_t;
+
+@interface Dict:Storage
+{
+}
+
+- initFromFile:(FILE *)fp;
+
+- (id) parseMultipleFrom:(char *)value;
+- (int) getValueUnits:(char *)key;
+- delString:(char *)string fromValue:(char *)key;
+- addString:(char *)string toValue:(char *)key;
+- (char *)convertListToString:(id)list;
+- (char *)getStringFor:(char *)name;
+- removeKeyword:(char *)key;
+- (unsigned int)getValueFor:(char *)name;
+- changeStringFor:(char *)key to:(char *)value;
+- (dict_t *) findKeyword:(char *)key;
+
+- writeBlockTo:(FILE *)fp;
+- writeFile:(char *)path;
+
+// INTERNAL
+- init;
+- (id) parseBraceBlock:(FILE *)fp;
+- setupMultiple:(char *)value;
+- (char *)getNextParameter;
+
+@end
+
+int GetNextChar(FILE *fp);
+void CopyUntilWhitespc(FILE *fp,char *buffer);
+void CopyUntilQuote(FILE *fp,char *buffer);
+int FindBrace(FILE *fp);
+int FindQuote(FILE *fp);
+int FindWhitespc(FILE *fp);
+int FindNonwhitespc(FILE *fp);
+
+char *FindWhitespcInBuffer(char *buffer);
+char *FindNonwhitespcInBuffer(char *buffer);
diff --git a/QuakeEd/Dict.m b/QuakeEd/Dict.m
new file mode 100644
index 0000000..546d617
--- /dev/null
+++ b/QuakeEd/Dict.m
@@ -0,0 +1,583 @@
+
+#import "qedefs.h"
+
+@implementation Dict
+
+- init
+{
+ [super initCount:0
+ elementSize:sizeof(dict_t)
+ description:NULL];
+ return self;
+}
+
+- print
+{
+ int i;
+ dict_t *d;
+
+ for (i=0 ; i<numElements ; i++)
+ {
+ d = [self elementAt: i];
+ printf ("%s : %s\n",d->key, d->value);
+ }
+ return self;
+}
+
+/*
+===========
+copyFromZone
+
+JDC
+===========
+*/
+- copyFromZone:(NXZone *)zone
+{
+ id new;
+ int i;
+ dict_t *d;
+ char *old;
+
+ new = [super copyFromZone: zone];
+ for (i=0 ; i<numElements ; i++)
+ {
+ d = [self elementAt: i];
+ old = d->key;
+ d->key = malloc(strlen(old)+1);
+ strcpy (d->key, old);
+
+ old = d->value;
+ d->value = malloc(strlen(old)+1);
+ strcpy (d->value, old);
+ }
+
+ return new;
+}
+
+- initFromFile:(FILE *)fp
+{
+ [self init];
+ return [self parseBraceBlock:fp];
+}
+
+//===============================================
+//
+// Dictionary pair functions
+//
+//===============================================
+
+//
+// Write a { } block out to a FILE*
+//
+- writeBlockTo:(FILE *)fp
+{
+ int max;
+ int i;
+ dict_t *d;
+
+ fprintf(fp,"{\n");
+ max = [super count];
+ for (i = 0;i < max;i++)
+ {
+ d = [super elementAt:i];
+ fprintf(fp,"\t{\"%s\"\t\"%s\"}\n",d->key,d->value);
+ }
+ fprintf(fp,"}\n");
+
+ return self;
+}
+
+//
+// Write a single { } block out
+//
+- writeFile:(char *)path
+{
+ FILE *fp;
+
+ fp = fopen(path,"w+t");
+ if (fp != NULL)
+ {
+ printf("Writing dictionary file %s.\n",path);
+ fprintf(fp,"// QE_Project file %s\n",path);
+ [self writeBlockTo:fp];
+ fclose(fp);
+ }
+ else
+ {
+ printf("Error writing %s!\n",path);
+ return NULL;
+ }
+
+ return self;
+}
+
+//===============================================
+//
+// Utility methods
+//
+//===============================================
+
+//
+// Find a keyword in storage
+// Returns * to dict_t, otherwise NULL
+//
+- (dict_t *) findKeyword:(char *)key
+{
+ int max;
+ int i;
+ dict_t *d;
+
+ max = [super count];
+ for (i = 0;i < max;i++)
+ {
+ d = [super elementAt:i];
+ if (!strcmp(d->key,key))
+ return d;
+ }
+
+ return NULL;
+}
+
+//
+// Change a keyword's string
+//
+- changeStringFor:(char *)key to:(char *)value
+{
+ dict_t *d;
+ dict_t newd;
+
+ d = [self findKeyword:key];
+ if (d != NULL)
+ {
+ free(d->value);
+ d->value = malloc(strlen(value)+1);
+ strcpy(d->value,value);
+ }
+ else
+ {
+ newd.key = malloc(strlen(key)+1);
+ strcpy(newd.key,key);
+ newd.value = malloc(strlen(value)+1);
+ strcpy(newd.value,value);
+ [self addElement:&newd];
+ }
+ return self;
+}
+
+//
+// Search for keyword, return the string *
+//
+- (char *)getStringFor:(char *)name
+{
+ dict_t *d;
+
+ d = [self findKeyword:name];
+ if (d != NULL)
+ return d->value;
+
+ return "";
+}
+
+//
+// Search for keyword, return the value
+//
+- (unsigned int)getValueFor:(char *)name
+{
+ dict_t *d;
+
+ d = [self findKeyword:name];
+ if (d != NULL)
+ return atol(d->value);
+
+ return 0;
+}
+
+//
+// Return # of units in keyword's value
+//
+- (int) getValueUnits:(char *)key
+{
+ id temp;
+ int count;
+
+ temp = [self parseMultipleFrom:key];
+ count = [temp count];
+ [temp free];
+
+ return count;
+}
+
+//
+// Convert List to string
+//
+- (char *)convertListToString:(id)list
+{
+ int i;
+ int max;
+ char tempstr[4096];
+ char *s;
+ char *newstr;
+
+ max = [list count];
+ tempstr[0] = 0;
+ for (i = 0;i < max;i++)
+ {
+ s = [list elementAt:i];
+ strcat(tempstr,s);
+ strcat(tempstr," ");
+ }
+ newstr = malloc(strlen(tempstr)+1);
+ strcpy(newstr,tempstr);
+
+ return newstr;
+}
+
+//
+// JDC: I wrote this to simplify removing vectors
+//
+- removeKeyword:(char *)key
+{
+ dict_t *d;
+
+ d = [self findKeyword:key];
+ if (d == NULL)
+ return self;
+ [self removeElementAt:d - (dict_t*)dataPtr];
+ return self;
+}
+
+//
+// Delete string from keyword's value
+//
+- delString:(char *)string fromValue:(char *)key
+{
+ id temp;
+ int count;
+ int i;
+ char *s;
+ dict_t *d;
+
+ d = [self findKeyword:key];
+ if (d == NULL)
+ return NULL;
+ temp = [self parseMultipleFrom:key];
+ count = [temp count];
+ for (i = 0;i < count;i++)
+ {
+ s = [temp elementAt:i];
+ if (!strcmp(s,string))
+ {
+ [temp removeElementAt:i];
+ free(d->value);
+ d->value = [self convertListToString:temp];
+ [temp free];
+
+ break;
+ }
+ }
+ return self;
+}
+
+//
+// Add string to keyword's value
+//
+- addString:(char *)string toValue:(char *)key
+{
+ char *newstr;
+ char spacing[] = "\t";
+ dict_t *d;
+
+ d = [self findKeyword:key];
+ if (d == NULL)
+ return NULL;
+ newstr = malloc(strlen(string) + strlen(d->value) + strlen(spacing) + 1);
+ strcpy(newstr,d->value);
+ strcat(newstr,spacing);
+ strcat(newstr,string);
+ free(d->value);
+ d->value = newstr;
+
+ return self;
+}
+
+//===============================================
+//
+// Use these for multiple parameters in a keyword value
+//
+//===============================================
+char *searchStr;
+char item[4096];
+
+- setupMultiple:(char *)value
+{
+ searchStr = value;
+ return self;
+}
+
+- (char *)getNextParameter
+{
+ char *s;
+
+ if (!searchStr)
+ return NULL;
+ strcpy(item,searchStr);
+ s = FindWhitespcInBuffer(item);
+ if (!*s)
+ searchStr = NULL;
+ else
+ {
+ *s = 0;
+ searchStr = FindNonwhitespcInBuffer(s+1);
+ }
+ return item;
+}
+
+//
+// Parses a keyvalue string & returns a Storage full of those items
+//
+- (id) parseMultipleFrom:(char *)key
+{
+ #define ITEMSIZE 128
+ id stuff;
+ char string[ITEMSIZE];
+ char *s;
+
+ s = [self getStringFor:key];
+ if (s == NULL)
+ return NULL;
+
+ stuff = [[Storage alloc]
+ initCount:0
+ elementSize:ITEMSIZE
+ description:NULL];
+
+ [self setupMultiple:s];
+ while((s = [self getNextParameter]))
+ {
+ bzero(string,ITEMSIZE);
+ strcpy(string,s);
+ [stuff addElement:string];
+ }
+
+ return stuff;
+}
+
+//===============================================
+//
+// Dictionary pair parsing
+//
+//===============================================
+
+//
+// parse all keyword/value pairs within { } 's
+//
+- (id) parseBraceBlock:(FILE *)fp
+{
+ int c;
+ dict_t pair;
+ char string[1024];
+
+ c = FindBrace(fp);
+ if (c == -1)
+ return NULL;
+
+ while((c = FindBrace(fp)) != '}')
+ {
+ if (c == -1)
+ return NULL;
+// c = FindNonwhitespc(fp);
+// if (c == -1)
+// return NULL;
+// CopyUntilWhitespc(fp,string);
+
+// JDC: fixed to allow quoted keys
+ c = FindNonwhitespc(fp);
+ if (c == -1)
+ return NULL;
+ c = fgetc(fp);
+ if ( c == '\"')
+ CopyUntilQuote(fp,string);
+ else
+ {
+ ungetc (c,fp);
+ CopyUntilWhitespc(fp,string);
+ }
+
+ pair.key = malloc(strlen(string)+1);
+ strcpy(pair.key,string);
+
+ c = FindQuote(fp);
+ CopyUntilQuote(fp,string);
+ pair.value = malloc(strlen(string)+1);
+ strcpy(pair.value,string);
+
+ [super addElement:&pair];
+ c = FindBrace(fp);
+ }
+
+ return self;
+}
+
+@end
+
+//===============================================
+//
+// C routines for string parsing
+//
+//===============================================
+int GetNextChar(FILE *fp)
+{
+ int c;
+ int c2;
+
+ c = getc(fp);
+ if (c == EOF)
+ return -1;
+ if (c == '/') // parse comments
+ {
+ c2 = getc(fp);
+ if (c2 == '/')
+ {
+ while((c2 = getc(fp)) != '\n');
+ c = getc(fp);
+ }
+ else
+ ungetc(c2,fp);
+ }
+ return c;
+}
+
+void CopyUntilWhitespc(FILE *fp,char *buffer)
+{
+ int count = 800;
+ int c;
+
+ while(count--)
+ {
+ c = GetNextChar(fp);
+ if (c == EOF)
+ return;
+ if (c <= ' ')
+ {
+ *buffer = 0;
+ return;
+ }
+ *buffer++ = c;
+ }
+}
+
+void CopyUntilQuote(FILE *fp,char *buffer)
+{
+ int count = 800;
+ int c;
+
+ while(count--)
+ {
+ c = GetNextChar(fp);
+ if (c == EOF)
+ return;
+ if (c == '\"')
+ {
+ *buffer = 0;
+ return;
+ }
+ *buffer++ = c;
+ }
+}
+
+int FindBrace(FILE *fp)
+{
+ int count = 800;
+ int c;
+
+ while(count--)
+ {
+ c = GetNextChar(fp);
+ if (c == EOF)
+ return -1;
+ if (c == '{' ||
+ c == '}')
+ return c;
+ }
+ return -1;
+}
+
+int FindQuote(FILE *fp)
+{
+ int count = 800;
+ int c;
+
+ while(count--)
+ {
+ c = GetNextChar(fp);
+ if (c == EOF)
+ return -1;
+ if (c == '\"')
+ return c;
+ }
+ return -1;
+}
+
+int FindWhitespc(FILE *fp)
+{
+ int count = 800;
+ int c;
+
+ while(count--)
+ {
+ c = GetNextChar(fp);
+ if (c == EOF)
+ return -1;
+ if (c <= ' ')
+ {
+ ungetc(c,fp);
+ return c;
+ }
+ }
+ return -1;
+}
+
+int FindNonwhitespc(FILE *fp)
+{
+ int count = 800;
+ int c;
+
+ while(count--)
+ {
+ c = GetNextChar(fp);
+ if (c == EOF)
+ return -1;
+ if (c > ' ')
+ {
+ ungetc(c,fp);
+ return c;
+ }
+ }
+ return -1;
+}
+
+char *FindWhitespcInBuffer(char *buffer)
+{
+ int count = 1000;
+ char *b = buffer;
+
+ while(count--)
+ if (*b <= ' ')
+ return b;
+ else
+ b++;
+ return NULL;
+}
+
+char *FindNonwhitespcInBuffer(char *buffer)
+{
+ int count = 1000;
+ char *b = buffer;
+
+ while(count--)
+ if (*b > ' ')
+ return b;
+ else
+ b++;
+ return NULL;
+}
diff --git a/QuakeEd/DictList.h b/QuakeEd/DictList.h
new file mode 100644
index 0000000..947ba60
--- /dev/null
+++ b/QuakeEd/DictList.h
@@ -0,0 +1,12 @@
+
+#import <appkit/appkit.h>
+
+@interface DictList:List
+{
+}
+
+- initListFromFile:(FILE *)fp;
+- writeListFile:(char *)filename;
+- (id) findDictKeyword:(char *)key;
+
+@end
diff --git a/QuakeEd/DictList.m b/QuakeEd/DictList.m
new file mode 100644
index 0000000..0d24b35
--- /dev/null
+++ b/QuakeEd/DictList.m
@@ -0,0 +1,69 @@
+
+#import "qedefs.h"
+
+@implementation DictList
+
+//
+// Read in variable # of objects from FILE *
+//
+- initListFromFile:(FILE *)fp
+{
+ id d;
+
+ [super init];
+ do
+ {
+ d = [(Dict *)[Dict alloc] initFromFile:fp];
+ if (d != NULL)
+ [self addObject:d];
+ } while(d != NULL);
+ [d free];
+
+ return self;
+}
+
+//
+// Write out list file
+//
+- writeListFile:(char *)filename
+{
+ FILE *fp;
+ int i;
+ id obj;
+
+ fp = fopen(filename,"w+t");
+ if (fp == NULL)
+ return NULL;
+
+ fprintf(fp,"// Object List written by QuakeEd\n");
+
+ for (i = 0;i < maxElements;i++)
+ {
+ obj = [self objectAt:i];
+ [obj writeBlockTo:fp];
+ }
+ fclose(fp);
+
+ return self;
+}
+
+//
+// Find the keyword in all the Dict objects
+//
+- (id) findDictKeyword:(char *)key
+{
+ int i;
+ dict_t *d;
+ id dict;
+
+ for (i = 0;i < maxElements;i++)
+ {
+ dict = [self objectAt:i];
+ d = [(Dict *)dict findKeyword:key];
+ if (d != NULL)
+ return dict;
+ }
+ return NULL;
+}
+
+@end
diff --git a/QuakeEd/DownArrow.tiff b/QuakeEd/DownArrow.tiff
new file mode 100644
index 0000000..cd0ce14
--- /dev/null
+++ b/QuakeEd/DownArrow.tiff
Binary files differ
diff --git a/QuakeEd/English.lproj/Info.nib/data.classes b/QuakeEd/English.lproj/Info.nib/data.classes
new file mode 100644
index 0000000..b0bfacf
--- /dev/null
+++ b/QuakeEd/English.lproj/Info.nib/data.classes
@@ -0,0 +1 @@
+FirstResponder = {ACTIONS = {}; SUPERCLASS = Object; };
diff --git a/QuakeEd/English.lproj/Info.nib/data.nib b/QuakeEd/English.lproj/Info.nib/data.nib
new file mode 100644
index 0000000..4f8b796
--- /dev/null
+++ b/QuakeEd/English.lproj/Info.nib/data.nib
Binary files differ
diff --git a/QuakeEd/English.lproj/QuakeEd.nib/data.classes b/QuakeEd/English.lproj/QuakeEd.nib/data.classes
new file mode 100644
index 0000000..c0b0401
--- /dev/null
+++ b/QuakeEd/English.lproj/QuakeEd.nib/data.classes
@@ -0,0 +1,220 @@
+XYView = {
+ ACTIONS = {
+ "textureViewDown:" = "textureViewDown:";
+ "textureViewUp:" = "textureViewUp:";
+ };
+ OUTLETS = {};
+ SUPERCLASS = View;
+};
+TexturePalette = {
+ ACTIONS = {
+ "clearTexinfo:" = "clearTexinfo:";
+ "decRotate:" = "decRotate:";
+ "decXScale:" = "decXScale:";
+ "decXShift:" = "decXShift:";
+ "decYScale:" = "decYScale:";
+ "decYShift:" = "decYShift:";
+ "incRotate:" = "incRotate:";
+ "incXScale:" = "incXScale:";
+ "incXShift:" = "incXShift:";
+ "incYScale:" = "incYScale:";
+ "incYShift:" = "incYShift:";
+ "onlyShowMapTextures:" = "onlyShowMapTextures:";
+ "searchForTexture:" = "searchForTexture:";
+ "texturedefChanged:" = "texturedefChanged:";
+ };
+ OUTLETS = {
+ field_Rotate_i = field_Rotate_i;
+ field_Xscale_i = field_Xscale_i;
+ field_Xshift_i = field_Xshift_i;
+ field_Yscale_i = field_Yscale_i;
+ field_Yshift_i = field_Yshift_i;
+ searchField_i = searchField_i;
+ sizeField_i = sizeField_i;
+ textureList_i = textureList_i;
+ textureView_i = textureView_i;
+ };
+ SUPERCLASS = Object;
+};
+EntityPanel = {
+ ACTIONS = {
+ "addPair:" = "addPair:";
+ "delPair:" = "delPair:";
+ "setAngle:" = "setAngle:";
+ "setFlags:" = "setFlags:";
+ };
+ OUTLETS = {flags_i = flags_i; keyInput_i = keyInput_i; valueInput_i = valueInput_i; };
+ SUPERCLASS = Object;
+};
+Project = {
+ ACTIONS = {
+ "clearBspOutput:" = "clearBspOutput:";
+ "clickedOnMap:" = "clickedOnMap:";
+ "clickedOnWad:" = "clickedOnWad:";
+ "saveSettings:" = "saveSettings:";
+ };
+ OUTLETS = {
+ BSPoutput_i = BSPoutput_i;
+ basepathinfo_i = basepathinfo_i;
+ currentmap_i = currentmap_i;
+ descList = descList;
+ mapList = mapList;
+ mapbrowse_i = mapbrowse_i;
+ pis_basepath_i = pis_basepath_i;
+ pis_fastvis_i = pis_fastvis_i;
+ pis_fullvis_i = pis_fullvis_i;
+ pis_leaktest_i = pis_leaktest_i;
+ pis_novis_i = pis_novis_i;
+ pis_panel_i = pis_panel_i;
+ pis_relight_i = pis_relight_i;
+ pis_wads_i = pis_wads_i;
+ projectInfo = projectInfo;
+ };
+ SUPERCLASS = Object;
+};
+PopScrollView = {ACTIONS = {}; OUTLETS = {}; SUPERCLASS = ScrollView; };
+FirstResponder = {ACTIONS = {}; SUPERCLASS = Object; };
+SetBrush = {ACTIONS = {}; OUTLETS = {}; SUPERCLASS = Storage; };
+CameraView = {
+ ACTIONS = {"drawMode:" = "drawMode:"; "homeView:" = "homeView:"; };
+ OUTLETS = {mode_radio_i = mode_radio_i; };
+ SUPERCLASS = View;
+};
+Things = {
+ ACTIONS = {
+ "addPair:" = "addPair:";
+ "delPair:" = "delPair:";
+ "doubleClickEntity:" = "doubleClickEntity:";
+ "newprog_path:" = "newprog_path:";
+ "reloadEntityClasses:" = "reloadEntityClasses:";
+ "selectEntity:" = "selectEntity:";
+ "setAngle:" = "setAngle:";
+ "setFlags:" = "setFlags:";
+ };
+ OUTLETS = {
+ entity_browser_i = entity_browser_i;
+ entity_comment_i = entity_comment_i;
+ flags_i = flags_i;
+ keyInput_i = keyInput_i;
+ prog_path_i = prog_path_i;
+ valueInput_i = valueInput_i;
+ };
+ SUPERCLASS = Object;
+};
+Map = {
+ ACTIONS = {
+ "cloneSelection:" = "cloneSelection:";
+ "flip_x:" = "flip_x:";
+ "flip_y:" = "flip_y:";
+ "flip_z:" = "flip_z:";
+ "makeEntity:" = "makeEntity:";
+ "rotate_x:" = "rotate_x:";
+ "rotate_y:" = "rotate_y:";
+ "rotate_z:" = "rotate_z:";
+ "selectCompleteEntity:" = "selectCompleteEntity:";
+ "selectCompletelyInside:" = "selectCompletelyInside:";
+ "selectPartiallyInside:" = "selectPartiallyInside:";
+ "shortBrush:" = "shortBrush:";
+ "subtractSelection:" = "subtractSelection:";
+ "tallBrush:" = "tallBrush:";
+ };
+ OUTLETS = {currentEntity = currentEntity; oldselection = oldselection; };
+ SUPERCLASS = List;
+};
+Entity = {ACTIONS = {}; OUTLETS = {}; SUPERCLASS = Object; };
+Clipper = {ACTIONS = {}; OUTLETS = {}; SUPERCLASS = Object; };
+InspectorView = {ACTIONS = {}; OUTLETS = {}; SUPERCLASS = View; };
+QuakeEd = {
+ ACTIONS = {
+ "BSP_FastVis:" = "BSP_FastVis:";
+ "BSP_Full:" = "BSP_Full:";
+ "BSP_NoVis:" = "BSP_NoVis:";
+ "BSP_entities:" = "BSP_entities:";
+ "BSP_leaktest:" = "BSP_leaktest:";
+ "BSP_relight:" = "BSP_relight:";
+ "BSP_stop:" = "BSP_stop:";
+ "appDidInit:" = "appDidInit:";
+ "appWillTerminate:" = "appWillTerminate:";
+ "applyRegion:" = "applyRegion:";
+ "centerCamera:" = "centerCamera:";
+ "centerZChecker:" = "centerZChecker:";
+ "changeXYLookUp:" = "changeXYLookUp:";
+ "clear:" = "clear:";
+ "open:" = "open:";
+ "openProject:" = "openProject:";
+ "save:" = "save:";
+ "saveAs:" = "saveAs:";
+ "setBrushRegion:" = "setBrushRegion:";
+ "setXYRegion:" = "setXYRegion:";
+ "textCommand:" = "textCommand:";
+ "updateAll:" = "updateAll:";
+ };
+ OUTLETS = {
+ brushcount_i = brushcount_i;
+ cmd_in_i = cmd_in_i;
+ cmd_out_i = cmd_out_i;
+ entitycount_i = entitycount_i;
+ filter_clip_i = filter_clip_i;
+ filter_entities_i = filter_entities_i;
+ filter_light_i = filter_light_i;
+ filter_path_i = filter_path_i;
+ filter_water_i = filter_water_i;
+ filter_world_i = filter_world_i;
+ regionbutton_i = regionbutton_i;
+ show_coordinates_i = show_coordinates_i;
+ show_names_i = show_names_i;
+ xy_drawmode_i = xy_drawmode_i;
+ };
+ SUPERCLASS = Window;
+};
+InspectorControl = {
+ ACTIONS = {"changeInspector:" = "changeInspector:"; };
+ OUTLETS = {
+ b_textureField_i = b_textureField_i;
+ contentList = contentList;
+ inspectorSubview_i = inspectorSubview_i;
+ inspectorView_i = inspectorView_i;
+ inspectors_i = inspectors_i;
+ itemHelp_i = itemHelp_i;
+ itemList = itemList;
+ itemOutput_i = itemOutput_i;
+ itemPrefs_i = itemPrefs_i;
+ itemProject_i = itemProject_i;
+ itemSettings_i = itemSettings_i;
+ itemTextures_i = itemTextures_i;
+ itemThings_i = itemThings_i;
+ obj_genkeypair_i = obj_genkeypair_i;
+ obj_textures_i = obj_textures_i;
+ popUpButton_i = popUpButton_i;
+ popUpMatrix_i = popUpMatrix_i;
+ printList = printList;
+ win_help_i = win_help_i;
+ win_output_i = win_output_i;
+ win_prefs_i = win_prefs_i;
+ win_project_i = win_project_i;
+ win_settings_i = win_settings_i;
+ win_textures_i = win_textures_i;
+ win_things_i = win_things_i;
+ windowList = windowList;
+ };
+ SUPERCLASS = Object;
+};
+Preferences = {
+ ACTIONS = {
+ "UIChanged:" = "UIChanged:";
+ "setBspSound:" = "setBspSound:";
+ "setCurrentProject:" = "setCurrentProject:";
+ };
+ OUTLETS = {
+ brushOffset_i = brushOffset_i;
+ bspSoundField_i = bspSoundField_i;
+ bspSound_i = bspSound_i;
+ showBSP_i = showBSP_i;
+ startproject_i = startproject_i;
+ startwad_i = startwad_i;
+ xlight_i = xlight_i;
+ ylight_i = ylight_i;
+ zlight_i = zlight_i;
+ };
+ SUPERCLASS = Object;
+};
diff --git a/QuakeEd/English.lproj/QuakeEd.nib/data.nib b/QuakeEd/English.lproj/QuakeEd.nib/data.nib
new file mode 100644
index 0000000..3936642
--- /dev/null
+++ b/QuakeEd/English.lproj/QuakeEd.nib/data.nib
Binary files differ
diff --git a/QuakeEd/Entity.h b/QuakeEd/Entity.h
new file mode 100644
index 0000000..e48b2b5
--- /dev/null
+++ b/QuakeEd/Entity.h
@@ -0,0 +1,40 @@
+
+#define MAX_KEY 64
+#define MAX_VALUE 128
+typedef struct epair_s
+{
+ struct epair_s *next;
+ char key[MAX_KEY];
+ char value[MAX_VALUE];
+} epair_t;
+
+// an Entity is a list of brush objects, with additional key / value info
+
+@interface Entity : List
+{
+ epair_t *epairs;
+ BOOL modifiable;
+}
+
+- initClass: (char *)classname;
+- initFromTokens;
+
+- free;
+
+- (BOOL)modifiable;
+- setModifiable: (BOOL)m;
+
+- (char *)targetname;
+
+- writeToFILE: (FILE *)f region:(BOOL)reg;
+
+- (char *)valueForQKey: (char *)k;
+- getVector: (vec3_t)v forKey: (char *)k;
+- setKey:(char *)k toValue:(char *)v;
+- (int)numPairs;
+- (epair_t *)epairs;
+- removeKeyPair: (char *)key;
+
+@end
+
+
diff --git a/QuakeEd/Entity.m b/QuakeEd/Entity.m
new file mode 100644
index 0000000..5e16dd3
--- /dev/null
+++ b/QuakeEd/Entity.m
@@ -0,0 +1,485 @@
+
+#include "qedefs.h"
+
+@implementation Entity
+
+vec3_t bad_mins = {-8, -8, -8};
+vec3_t bad_maxs = {8, 8, 8};
+
+- createFixedBrush: (vec3_t)org
+{
+ vec3_t emins, emaxs;
+ float *v, *v2, *color;
+ id new;
+ texturedef_t td;
+
+// get class
+ new = [entity_classes_i classForName: [self valueForQKey: "classname"]];
+ if (new)
+ {
+ v = [new mins];
+ v2 = [new maxs];
+ }
+ else
+ {
+ v = bad_mins;
+ v2 = bad_maxs;
+ }
+
+ color = [new drawColor];
+
+ modifiable = NO;
+ memset(&td,0,sizeof(td));
+ strcpy (td.texture,"entity");
+
+ VectorAdd (org, v, emins);
+ VectorAdd (org, v2, emaxs);
+ new = [[SetBrush alloc] initOwner: self mins:emins maxs:emaxs
+ texture: &td];
+ [new setEntityColor: color];
+
+ [self addObject: new];
+
+ return self;
+}
+
+- copyFromZone:(NXZone *)zone
+{
+ id new, nb;
+ epair_t *e;
+ int i;
+
+ new = [[Entity alloc] init];
+ [new setModifiable: modifiable];
+
+ for (e=epairs ; e ; e=e->next)
+ { // don't copy target and targetname fields
+ if (strncmp(e->key,"target",6))
+ [new setKey: e->key toValue: e->value];
+ }
+
+ for (i=0 ; i<numElements ; i++)
+ {
+ nb = [[self objectAt: i] copy];
+ [nb setParent: new];
+ [new addObject: nb];
+ }
+
+ return new;
+}
+
+- initClass: (char *)classname
+{
+ id new;
+ esize_t esize;
+ char value[80];
+ vec3_t min, max;
+ float *v;
+
+ [super init];
+
+ modifiable = YES;
+
+ [self setKey: "classname" toValue:classname];
+
+// get class
+ new = [entity_classes_i classForName: [self valueForQKey: "classname"]];
+ if (!new)
+ esize = esize_model;
+ else
+ esize = [new esize];
+
+// create a brush if needed
+ if (esize == esize_fixed)
+ {
+ v = [new mins];
+ [[map_i selectedBrush] getMins: min maxs: max];
+ VectorSubtract (min, v, min);
+
+ sprintf (value, "%i %i %i",(int)min[0], (int)min[1], (int)min[2]);
+ [self setKey:"origin" toValue: value];
+
+ [self createFixedBrush: min];
+ }
+ else
+ modifiable = YES;
+
+ return self;
+}
+
+
+- free
+{
+ epair_t *e, *n;
+
+ for (e=epairs ; e ; e=n)
+ {
+ n = e->next;
+ free (e);
+ }
+ return [super free];
+}
+
+- (BOOL)modifiable
+{
+ return modifiable;
+}
+
+- setModifiable: (BOOL)m
+{
+ modifiable = m;
+ return self;
+}
+
+- removeObject: o
+{
+ o = [super removeObject: o];
+ if (numElements)
+ return o;
+// the entity is empty, so remove the entire thing
+ if ( self == [map_i objectAt: 0])
+ return o; // never remove the world
+
+ [map_i removeObject: self];
+ [self free];
+
+ return o;
+}
+
+
+- (char *)valueForQKey: (char *)k
+{
+ epair_t *e;
+ static char ret[64];
+
+ for (e=epairs ; e ; e=e->next)
+ if (!strcmp(k,e->key))
+ {
+ strcpy (ret, e->value);
+ return ret;
+ }
+ return "";
+}
+
+- getVector: (vec3_t)v forKey: (char *)k
+{
+ char *c;
+
+ c = [self valueForQKey: k];
+
+ v[0] = v[1] = v[2] = 0;
+
+ sscanf (c, "%f %f %f", &v[0], &v[1], &v[2]);
+
+ return self;
+}
+
+- print
+{
+ epair_t *e;
+
+ for (e=epairs ; e ; e=e->next)
+ printf ("%20s : %20s\n",e->key, e->value);
+
+ return self;
+}
+
+- setKey:(char *)k toValue:(char *)v
+{
+ epair_t *e;
+
+ if (strlen(k) > MAX_KEY)
+ Error ("setKey: %s > MAX_KEY", k);
+ if (strlen(v) > MAX_VALUE)
+ Error ("setKey: %s > MAX_VALUE", v);
+
+ while (*k && *k <= ' ')
+ k++;
+ if (!*k)
+ return self; // don't set NULL values
+
+ for (e=epairs ; e ; e=e->next)
+ if (!strcmp(k,e->key))
+ {
+ memset (e->value, 0, sizeof(e->value));
+ strcpy (e->value, v);
+ return self;
+ }
+
+ e = malloc (sizeof(epair_t));
+ memset (e, 0, sizeof(epair_t));
+
+ strcpy (e->key, k);
+ strcpy (e->value, v);
+ e->next = epairs;
+ epairs = e;
+
+ return self;
+}
+
+- (int)numPairs
+{
+ int i;
+ epair_t *e;
+
+ i=0;
+ for (e=epairs ; e ; e=e->next)
+ i++;
+ return i;
+}
+
+- (epair_t *)epairs
+{
+ return epairs;
+}
+
+- removeKeyPair: (char *)key
+{
+ epair_t *e, *e2;
+
+ if (!epairs)
+ return self;
+ e = epairs;
+ if (!strcmp(e->key, key))
+ {
+ epairs = e->next;
+ free (e);
+ return self;
+ }
+
+ for (; e ; e=e->next)
+ {
+ if (e->next && !strcmp(e->next->key, key))
+ {
+ e2 = e->next;
+ e->next = e2->next;
+ free (e2);
+ return self;
+ }
+ }
+
+ printf ("WARNING: removeKeyPair: %s not found\n", key);
+ return self;
+}
+
+
+/*
+=============
+targetname
+
+If the entity does not have a "targetname" key, a unique one is generated
+=============
+*/
+- (char *)targetname
+{
+ char *t;
+ int i, count;
+ id ent;
+ int tval, maxt;
+ char name[20];
+
+ t = [self valueForQKey: "targetname"];
+ if (t && t[0])
+ return t;
+
+// make a unique name of the form t<number>
+ count = [map_i count];
+ maxt = 0;
+ for (i=1 ; i<count ; i++)
+ {
+ ent = [map_i objectAt: i];
+ t = [ent valueForQKey: "targetname"];
+ if (!t || t[0] != 't')
+ continue;
+ tval = atoi (t+1);
+ if (tval > maxt)
+ maxt = tval;
+ }
+
+ sprintf (name,"t%i",maxt+1);
+
+ [self setKey: "targetname" toValue: name];
+
+ return [self valueForQKey: "targetname"]; // so it's not on the stack
+}
+
+/*
+==============================================================================
+
+FILE METHODS
+
+==============================================================================
+*/
+
+int nument;
+
+- initFromTokens
+{
+ char key[MAXTOKEN];
+ id eclass, brush;
+ char *spawn;
+ vec3_t emins, emaxs;
+ vec3_t org;
+ texturedef_t td;
+ esize_t esize;
+ int i, c;
+ float *color;
+
+ [self init];
+
+ if (!GetToken (true))
+ {
+ [self free];
+ return nil;
+ }
+
+ if (strcmp (token, "{") )
+ Error ("initFromFileP: { not found");
+
+ do
+ {
+ if (!GetToken (true))
+ break;
+ if (!strcmp (token, "}") )
+ break;
+ if (!strcmp (token, "{") )
+ { // read a brush
+ brush = [[SetBrush alloc] initFromTokens: self];
+ [self addObject: brush];
+ }
+ else
+ { // read a key / value pair
+ strcpy (key, token);
+ GetToken (false);
+ [self setKey: key toValue:token];
+ }
+ } while (1);
+
+ nument++;
+
+// get class
+ spawn = [self valueForQKey: "classname"];
+ eclass = [entity_classes_i classForName: spawn];
+
+ esize = [eclass esize];
+
+ [self getVector: org forKey: "origin"];
+
+ if ([self count] && esize != esize_model)
+ {
+ printf ("WARNING:Entity with brushes and wrong model type\n");
+ [self empty];
+ }
+
+ if (![self count] && esize == esize_model)
+ {
+ printf ("WARNING:Entity with no brushes and esize_model\n");
+ [texturepalette_i getTextureDef: &td];
+ for (i=0 ; i<3 ; i++)
+ {
+ emins[i] = org[i] - 8;
+ emaxs[i] = org[i] + 8;
+ }
+ brush = [[SetBrush alloc] initOwner: self mins:emins maxs:emaxs
+ texture: &td];
+ [self addObject: brush];
+ }
+
+// create a brush if needed
+ if (esize == esize_fixed)
+ [self createFixedBrush: org];
+ else
+ modifiable = YES;
+
+// set all the brush colors
+ color = [eclass drawColor];
+
+ c = [self count];
+ for (i=0 ; i<c ; i++)
+ {
+ brush = [self objectAt: i];
+ [brush setEntityColor: color];
+ }
+
+ return self;
+}
+
+
+- writeToFILE: (FILE *)f region:(BOOL)reg;
+{
+ epair_t *e;
+ int i;
+ id new;
+ char value[80];
+ vec3_t mins, maxs, org;
+ float *v;
+ BOOL temporg;
+ char oldang[80];
+
+ temporg = NO;
+ if (reg)
+ {
+ if ( !strcmp ([self valueForQKey: "classname"], "info_player_start") )
+ { // move the playerstart temporarily to the camera position
+ temporg = YES;
+ strcpy (oldang, [self valueForQKey: "angle"]);
+ sprintf (value, "%i", (int)([cameraview_i yawAngle]*180/M_PI));
+ [self setKey: "angle" toValue: value];
+ }
+ else if ( self != [map_i objectAt: 0]
+ && [[self objectAt: 0] regioned] )
+ return self; // skip the entire entity definition
+ }
+
+ fprintf (f,"{\n");
+
+// set an origin epair
+ if (!modifiable)
+ {
+ [[self objectAt: 0] getMins: mins maxs: maxs];
+ if (temporg)
+ {
+ [cameraview_i getOrigin: mins];
+ mins[0] -= 16;
+ mins[1] -= 16;
+ mins[2] -= 48;
+ }
+ new = [entity_classes_i classForName:
+ [self valueForQKey: "classname"]];
+ if (new)
+ v = [new mins];
+ else
+ v = vec3_origin;
+
+ VectorSubtract (mins, v, org);
+ sprintf (value, "%i %i %i",(int)org[0], (int)org[1], (int)org[2]);
+ [self setKey:"origin" toValue: value];
+ }
+
+ for (e=epairs ; e ; e=e->next)
+ fprintf (f,"\"%s\"\t\"%s\"\n", e->key, e->value);
+
+// fixed size entities don't save out brushes
+ if ( modifiable )
+ {
+ for (i=0 ; i<numElements ; i++)
+ [[self objectAt: i] writeToFILE: f region: reg];
+ }
+
+ fprintf (f,"}\n");
+
+ if (temporg)
+ [self setKey: "angle" toValue: oldang];
+
+ return self;
+}
+
+/*
+==============================================================================
+
+INTERACTION
+
+==============================================================================
+*/
+
+@end
diff --git a/QuakeEd/EntityClass.h b/QuakeEd/EntityClass.h
new file mode 100644
index 0000000..f6d17e6
--- /dev/null
+++ b/QuakeEd/EntityClass.h
@@ -0,0 +1,42 @@
+#import <appkit/appkit.h>
+#import "mathlib.h"
+
+typedef enum {esize_model, esize_fixed} esize_t;
+
+#define MAX_FLAGS 8
+
+@interface EntityClass : Object
+{
+ char *name;
+ esize_t esize;
+ vec3_t mins, maxs;
+ vec3_t color;
+ char *comments;
+ char flagnames[MAX_FLAGS][32];
+}
+
+- initFromText: (char *)text;
+- (char *)classname;
+- (esize_t)esize;
+- (float *)mins; // only for esize_fixed
+- (float *)maxs; // only for esize_fixed
+- (float *)drawColor;
+- (char *)comments;
+- (char *)flagName: (unsigned)flagnum;
+
+@end
+
+extern id entity_classes_i;
+
+@interface EntityClassList : List
+{
+ id nullclass;
+ char *source_path;
+}
+
+- initForSourceDirectory: (char *)path;
+- (id)classForName: (char *)name;
+- (void)scanDirectory;
+
+@end
+
diff --git a/QuakeEd/EntityClass.m b/QuakeEd/EntityClass.m
new file mode 100644
index 0000000..4229cb0
--- /dev/null
+++ b/QuakeEd/EntityClass.m
@@ -0,0 +1,266 @@
+
+#import "qedefs.h"
+
+@implementation EntityClass
+
+/*
+
+the classname, color triple, and bounding box are parsed out of comments
+A ? size means take the exact brush size.
+
+/*QUAKED <classname> (0 0 0) ?
+/*QUAKED <classname> (0 0 0) (-8 -8 -8) (8 8 8)
+
+Flag names can follow the size description:
+
+/*QUAKED func_door (0 .5 .8) ? START_OPEN STONE_SOUND DOOR_DONT_LINK GOLD_KEY SILVER_KEY
+
+*/
+char *debugname;
+- initFromText: (char *)text
+{
+ char *t;
+ int len;
+ int r, i;
+ char parms[256], *p;
+
+ [super init];
+
+ text += strlen("/*QUAKED ");
+
+// grab the name
+ text = COM_Parse (text);
+ name = malloc (strlen(com_token)+1);
+ strcpy (name, com_token);
+ debugname = name;
+
+// grab the color
+ r = sscanf (text," (%f %f %f)", &color[0], &color[1], &color[2]);
+ if (r != 3)
+ return NULL;
+
+ while (*text != ')')
+ {
+ if (!*text)
+ return NULL;
+ text++;
+ }
+ text++;
+
+// get the size
+ text = COM_Parse (text);
+ if (com_token[0] == '(')
+ { // parse the size as two vectors
+ esize = esize_fixed;
+ r = sscanf (text,"%f %f %f) (%f %f %f)", &mins[0], &mins[1], &mins[2], &maxs[0], &maxs[1], &maxs[2]);
+ if (r != 6)
+ return NULL;
+
+ for (i=0 ; i<2 ; i++)
+ {
+ while (*text != ')')
+ {
+ if (!*text)
+ return NULL;
+ text++;
+ }
+ text++;
+ }
+ }
+ else
+ { // use the brushes
+ esize = esize_model;
+ }
+
+// get the flags
+
+
+// copy to the first /n
+ p = parms;
+ while (*text && *text != '\n')
+ *p++ = *text++;
+ *p = 0;
+ text++;
+
+// any remaining words are parm flags
+ p = parms;
+ for (i=0 ; i<8 ; i++)
+ {
+ p = COM_Parse (p);
+ if (!p)
+ break;
+ strcpy (flagnames[i], com_token);
+ }
+
+// find the length until close comment
+ for (t=text ; t[0] && !(t[0]=='*' && t[1]=='/') ; t++)
+ ;
+
+// copy the comment block out
+ len = t-text;
+ comments = malloc (len+1);
+ memcpy (comments, text, len);
+ comments[len] = 0;
+
+ return self;
+}
+
+- (esize_t)esize
+{
+ return esize;
+}
+
+- (char *)classname
+{
+ return name;
+}
+
+- (float *)mins
+{
+ return mins;
+}
+
+- (float *)maxs
+{
+ return maxs;
+}
+
+- (float *)drawColor
+{
+ return color;
+}
+
+- (char *)comments
+{
+ return comments;
+}
+
+
+- (char *)flagName: (unsigned)flagnum
+{
+ if (flagnum >= MAX_FLAGS)
+ Error ("EntityClass flagName: bad number");
+ return flagnames[flagnum];
+}
+
+@end
+
+//===========================================================================
+
+@implementation EntityClassList
+
+/*
+=================
+insertEC:
+=================
+*/
+- (void)insertEC: ec
+{
+ char *name;
+ int i;
+
+ name = [ec classname];
+ for (i=0 ; i<numElements ; i++)
+ {
+ if (strcasecmp (name, [[self objectAt: i] classname]) < 0)
+ {
+ [self insertObject: ec at:i];
+ return;
+ }
+ }
+ [self addObject: ec];
+}
+
+
+/*
+=================
+scanFile
+=================
+*/
+- (void)scanFile: (char *)filename
+{
+ int size;
+ char *data;
+ id cl;
+ int i;
+ char path[1024];
+
+ sprintf (path,"%s/%s", source_path, filename);
+
+ size = LoadFile (path, (void *)&data);
+
+ for (i=0 ; i<size ; i++)
+ if (!strncmp(data+i, "/*QUAKED",8))
+ {
+ cl = [[EntityClass alloc] initFromText: data+i];
+ if (cl)
+ [self insertEC: cl];
+ else
+ printf ("Error parsing: %s in %s\n",debugname, filename);
+ }
+
+ free (data);
+}
+
+
+/*
+=================
+scanDirectory
+=================
+*/
+- (void)scanDirectory
+{
+ int count, i;
+ struct direct **namelist, *ent;
+
+ [self empty];
+
+ count = scandir(source_path, &namelist, NULL, NULL);
+
+ for (i=0 ; i<count ; i++)
+ {
+ ent = namelist[i];
+ if (ent->d_namlen <= 3)
+ continue;
+ if (!strcmp (ent->d_name+ent->d_namlen-3,".qc"))
+ [self scanFile: ent->d_name];
+ }
+}
+
+
+id entity_classes_i;
+
+
+- initForSourceDirectory: (char *)path
+{
+ [super init];
+
+ source_path = path;
+ [self scanDirectory];
+
+ entity_classes_i = self;
+
+ nullclass = [[EntityClass alloc] initFromText:
+"/*QUAKED UNKNOWN_CLASS (0 0.5 0) ?"];
+
+ return self;
+}
+
+- (id)classForName: (char *)name
+{
+ int i;
+ id o;
+
+ for (i=0 ; i<numElements ; i++)
+ {
+ o = [self objectAt: i];
+ if (!strcmp (name,[o classname]) )
+ return o;
+ }
+
+ return nullclass;
+}
+
+
+@end
+
diff --git a/QuakeEd/InspectorControl.h b/QuakeEd/InspectorControl.h
new file mode 100644
index 0000000..f8cad3d
--- /dev/null
+++ b/QuakeEd/InspectorControl.h
@@ -0,0 +1,71 @@
+
+#import <appkit/appkit.h>
+
+#define MINIWINICON "DoomEdIcon"
+
+typedef enum
+{
+ i_project,
+ i_textures,
+ i_things,
+ i_prefs,
+ i_settings,
+ i_output,
+ i_help,
+ i_end
+} insp_e;
+
+extern id inspcontrol_i;
+
+@interface InspectorControl:Object
+{
+ id inspectorView_i; // inspector view
+ id inspectorSubview_i; // inspector view's current subview (gets replaced)
+
+ id contentList; // List of contentviews (corresponds to
+ // insp_e enum order)
+ id windowList; // List of Windows (corresponds to
+ // insp_e enum order)
+
+ id obj_textures_i; // TexturePalette object (for delegating)
+ id obj_genkeypair_i; // GenKeyPair object
+
+ id popUpButton_i; // PopUpList title button
+ id popUpMatrix_i; // PopUpList matrix
+ id itemList; // List of popUp buttons
+
+ insp_e currentInspectorType; // keep track of current inspector
+ //
+ // Add id's here for new inspectors
+ // **NOTE: Make sure PopUpList has correct TAG value that
+ // corresponds to the enums above!
+
+ // Windows
+ id win_project_i; // project
+ id win_textures_i; // textures
+ id win_things_i; // things
+ id win_prefs_i; // preferences
+ id win_settings_i; // project settings
+ id win_output_i; // bsp output
+ id win_help_i; // documentation
+
+ // PopUpList objs
+ id itemProject_i; // project
+ id itemTextures_i; // textures
+ id itemThings_i; // things
+ id itemPrefs_i; // preferences
+ id itemSettings_i; // project settings
+ id itemOutput_i; // bsp output
+ id itemHelp_i; // docs
+}
+
+- awakeFromNib;
+- changeInspector:sender;
+- changeInspectorTo:(insp_e)which;
+- (insp_e)getCurrentInspector;
+
+@end
+
+@protocol InspectorControl
+- windowResized;
+@end
diff --git a/QuakeEd/InspectorControl.m b/QuakeEd/InspectorControl.m
new file mode 100644
index 0000000..fcc8dd9
--- /dev/null
+++ b/QuakeEd/InspectorControl.m
@@ -0,0 +1,128 @@
+
+#import "qedefs.h"
+
+// Add .h-files here for new inspectors
+#import "Things.h"
+#import "TexturePalette.h"
+#import "Preferences.h"
+
+id inspcontrol_i;
+
+@implementation InspectorControl
+
+- awakeFromNib
+{
+ inspcontrol_i = self;
+
+ currentInspectorType = -1;
+
+ contentList = [[List alloc] init];
+ windowList = [[List alloc] init];
+ itemList = [[List alloc] init];
+
+ // ADD NEW INSPECTORS HERE...
+
+ [windowList addObject:win_project_i];
+ [contentList addObject:[win_project_i contentView]];
+ [itemProject_i setKeyEquivalent:'1'];
+ [itemList addObject:itemProject_i];
+
+ [windowList addObject:win_textures_i];
+ [contentList addObject:[win_textures_i contentView]];
+ [itemTextures_i setKeyEquivalent:'2'];
+ [itemList addObject:itemTextures_i];
+
+ [windowList addObject:win_things_i];
+ [contentList addObject:[win_things_i contentView]];
+ [itemThings_i setKeyEquivalent:'3'];
+ [itemList addObject:itemThings_i];
+
+ [windowList addObject:win_prefs_i];
+ [contentList addObject:[win_prefs_i contentView]];
+ [itemPrefs_i setKeyEquivalent:'4'];
+ [itemList addObject:itemPrefs_i];
+
+ [windowList addObject:win_settings_i];
+ [contentList addObject:[win_settings_i contentView]];
+ [itemSettings_i setKeyEquivalent:'5'];
+ [itemList addObject:itemSettings_i];
+
+ [windowList addObject:win_output_i];
+ [contentList addObject:[win_output_i contentView]];
+ [itemOutput_i setKeyEquivalent:'6'];
+ [itemList addObject:itemOutput_i];
+
+ [windowList addObject:win_help_i];
+ [contentList addObject:[win_help_i contentView]];
+ [itemHelp_i setKeyEquivalent:'7'];
+ [itemList addObject:itemHelp_i];
+
+ // Setup inspector window with project subview first
+
+ [inspectorView_i setAutoresizeSubviews:YES];
+
+ inspectorSubview_i = [contentList objectAt:i_project];
+ [inspectorView_i addSubview:inspectorSubview_i];
+
+ currentInspectorType = -1;
+ [self changeInspectorTo:i_project];
+
+ return self;
+}
+
+
+//
+// Sent by the PopUpList in the Inspector
+// Each cell in the PopUpList must have the correct tag
+//
+- changeInspector:sender
+{
+ id cell;
+
+ cell = [sender selectedCell];
+ [self changeInspectorTo:[cell tag]];
+ return self;
+}
+
+//
+// Change to specific Inspector
+//
+- changeInspectorTo:(insp_e)which
+{
+ id newView;
+ NXRect r;
+ id cell;
+ NXRect f;
+
+ if (which == currentInspectorType)
+ return self;
+
+ currentInspectorType = which;
+ newView = [contentList objectAt:which];
+
+ cell = [itemList objectAt:which]; // set PopUpButton title
+ [popUpButton_i setTitle:[cell title]];
+
+ [inspectorView_i replaceSubview:inspectorSubview_i with:newView];
+ [inspectorView_i getFrame:&r];
+ inspectorSubview_i = newView;
+ [inspectorSubview_i setAutosizing:NX_WIDTHSIZABLE | NX_HEIGHTSIZABLE];
+ [inspectorSubview_i sizeTo:r.size.width - 4 :r.size.height - 4];
+
+ [inspectorSubview_i lockFocus];
+ [inspectorSubview_i getBounds:&f];
+ PSsetgray(NX_LTGRAY);
+ NXRectFill(&f);
+ [inspectorSubview_i unlockFocus];
+ [inspectorView_i display];
+
+ return self;
+}
+
+- (insp_e)getCurrentInspector
+{
+ return currentInspectorType;
+}
+
+
+@end
diff --git a/QuakeEd/KeypairView.h b/QuakeEd/KeypairView.h
new file mode 100644
index 0000000..c2235d9
--- /dev/null
+++ b/QuakeEd/KeypairView.h
@@ -0,0 +1,16 @@
+
+extern id keypairview_i;
+
+@interface KeypairView:View
+{
+}
+
+- calcViewSize;
+
+#define SPACING 4
+#define FONTSIZE 12
+#define EXTRASPC 2
+
+#define LINEHEIGHT 16
+
+@end
diff --git a/QuakeEd/KeypairView.m b/QuakeEd/KeypairView.m
new file mode 100644
index 0000000..5cbb398
--- /dev/null
+++ b/QuakeEd/KeypairView.m
@@ -0,0 +1,96 @@
+
+#import "qedefs.h"
+
+id keypairview_i;
+
+@implementation KeypairView
+
+/*
+==================
+initFrame:
+==================
+*/
+- initFrame:(const NXRect *)frameRect
+{
+ [super initFrame:frameRect];
+ keypairview_i = self;
+ return self;
+}
+
+
+- calcViewSize
+{
+ NXCoord w;
+ NXCoord h;
+ NXRect b;
+ NXPoint pt;
+ int count;
+ id ent;
+
+ ent = [map_i currentEntity];
+ count = [ent numPairs];
+
+ [superview setFlipped: YES];
+
+ [superview getBounds:&b];
+ w = b.size.width;
+ h = LINEHEIGHT*count + SPACING;
+ [self sizeTo:w :h];
+ pt.x = pt.y = 0;
+ [self scrollPoint: &pt];
+ return self;
+}
+
+- drawSelf:(const NXRect *)rects :(int)rectCount
+{
+ epair_t *pair;
+ int y;
+
+ PSsetgray(NXGrayComponent(NX_COLORLTGRAY));
+ PSrectfill(0,0,bounds.size.width,bounds.size.height);
+
+ PSselectfont("Helvetica-Bold",FONTSIZE);
+ PSrotate(0);
+ PSsetgray(0);
+
+ pair = [[map_i currentEntity] epairs];
+ y = bounds.size.height - LINEHEIGHT;
+ for ( ; pair ; pair=pair->next)
+ {
+ PSmoveto(SPACING, y);
+ PSshow(pair->key);
+ PSmoveto(100, y);
+ PSshow(pair->value);
+ y -= LINEHEIGHT;
+ }
+ PSstroke();
+
+ return self;
+}
+
+- mouseDown:(NXEvent *)theEvent
+{
+ NXPoint loc;
+ int i;
+ epair_t *p;
+
+ loc = theEvent->location;
+ [self convertPoint:&loc fromView:NULL];
+
+ i = (bounds.size.height - loc.y - 4) / LINEHEIGHT;
+
+ p = [[map_i currentEntity] epairs];
+ while ( i )
+ {
+ p=p->next;
+ if (!p)
+ return self;
+ i--;
+ }
+ if (p)
+ [things_i setSelectedKey: p];
+
+ return self;
+}
+
+@end
diff --git a/QuakeEd/Makefile b/QuakeEd/Makefile
new file mode 100644
index 0000000..2a82751
--- /dev/null
+++ b/QuakeEd/Makefile
@@ -0,0 +1,62 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = QuakeEd
+
+PROJECTVERSION = 1.1
+LANGUAGE = English
+
+APPICON = i_quakeed.tiff
+LOCAL_RESOURCES = QuakeEd.nib
+
+GLOBAL_RESOURCES = DownArrow.tiff i_90d.tiff i_add.tiff i_brushes.tiff\
+ i_fliph.tiff i_flipv.tiff i_quakeed.tiff i_sub.tiff\
+ short.tiff tall.tiff UpArrow.tiff
+
+CLASSES = CameraView.m Clipper.m Dict.m DictList.m Entity.m\
+ EntityClass.m InspectorControl.m KeypairView.m Map.m\
+ PopScrollView.m Preferences.m Project.m QuakeEd.m SetBrush.m\
+ TexturePalette.m TextureView.m Things.m UserPath.m XYView.m\
+ ZScrollView.m ZView.m
+
+HFILES = CameraView.h Clipper.h Dict.h DictList.h Entity.h\
+ EntityClass.h InspectorControl.h KeypairView.h Map.h\
+ PopScrollView.h Preferences.h Project.h QuakeEd.h SetBrush.h\
+ TexturePalette.h TextureView.h Things.h UserPath.h XYView.h\
+ ZScrollView.h ZView.h render.h cmdlib.h mathlib.h
+
+MFILES = misc.m QuakeEd_main.m render.m
+
+CFILES = cmdlib.c mathlib.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = /NextDeveloper/Makefiles/app
+MAKEFILE = app.make
+INSTALLDIR = /LocalApps
+INSTALLFLAGS = -c -s -m 755
+SOURCEMODE = 444
+
+ICONSECTIONS = -sectcreate __ICON app i_quakeed.tiff
+
+LIBS = -lMedia_s -lNeXT_s
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/QuakeEd/Makefile.postamble b/QuakeEd/Makefile.postamble
new file mode 100644
index 0000000..948802c
--- /dev/null
+++ b/QuakeEd/Makefile.postamble
@@ -0,0 +1,115 @@
+###############################################################################
+# NeXT Makefile.postamble Template
+# Copyright 1993, NeXT Computer, Inc.
+#
+# This Makefile is used for configuring the standard app makefiles associated
+# with ProjectBuilder.
+#
+# Use this template to set attributes for a project, sub-project, bundle, or
+# palette. Each node in the project's tree of sub-projects and bundles
+# should have it's own Makefile.preamble and Makefile.postamble. Additional
+# rules (e.g., after_install) that are defined by the developer should be
+# defined in this file.
+#
+###############################################################################
+#
+# Here are the variables exported by the common "app" makefiles that can be
+# used in any customizations you make to the template below:
+#
+# PRODUCT_ROOT - Name of top-level app-wrapper (e.g., Webster.app)
+# OFILE_DIR - Directory into which .o object files are generated.
+# (Note that this name is calculated based on the target
+# architectures specified in Project Builder).
+# DERIVED_SRC_DIR - Directory used for all other derived files
+# ALL_CFLAGS - All the flags passed to the cc(1) driver for compilations
+#
+# NAME - name of application, bundle, subproject, palette, etc.
+# LANGUAGE - langage in which the project is written (default "English")
+# ENGLISH - boolean flag set iff $(LANGUAGE) = "English"
+# JAPANESE - boolean flag set iff $(LANGUAGE) = "Japanese"
+# LOCAL_RESOURCES - localized resources (e.g. nib's, images) of project
+# GLOBAL_RESOURCES - non-localized resources of project
+# PROJECTVERSION - version of ProjectBuilder that output Makefile
+# APPICON - application icon file
+# DOCICONS - dock icon files
+# ICONSECTIONS - Specifies icon sections when linking executable
+#
+# CLASSES - Class implementation files in project.
+# HFILES - Header files in project.
+# MFILES - Other Objective-C source files in project.
+# CFILES - Other C source files in project.
+# PSWFILES - .psw files in the project
+# PSWMFILES - .pswm files in the project
+# SUBPROJECTS - Subprojects of this project
+# BUNDLES - Bundle subprojects of this project
+# OTHERSRCS - Other miscellaneous sources of this project
+# OTHERLINKED - Source files not matching a standard source extention
+#
+# LIBS - Libraries to link with when making app target
+# DEBUG_LIBS - Libraries to link with when making debug target
+# PROF_LIBS - Libraries to link with when making profile target
+# OTHERLINKEDOFILES - Other relocatable files to (always) link in.
+#
+# APP_MAKEFILE_DIR - Directory in which to find generic set of Makefiles
+# MAKEFILEDIR - Directory in which to find $(MAKEFILE)
+# MAKEFILE - Top level mechanism Makefile (e.g., app.make, bundle.make)
+# INSTALLDIR - Directory app will be installed into by 'install' target
+
+
+# Change defaults assumed by the standard app makefiles here. Edit the
+# following default values as appropriate. (Note that if no Makefile.postamble
+# exists, these values will have defaults set in common.make).
+
+# Add Makefile.preamble, Makefile.postamble, and Makefile.dependencies here if
+# you would like changes to them to invalidate previous builds. The project
+# depends on $(MAKEFILES) so that changes to Makefiles will trigger a re-build.
+#MAKEFILES = Makefile
+
+# Optimization flag passed to compiler:
+#OPTIMIZATION_CFLAG = -O
+
+# Flags always passed to compiler:
+#COMMON_CFLAGS = $(PROJECT_SPECIFIC_CFLAGS) -g -Wall
+
+# Flags passed to compiler in normal 'app' compiles:
+#NORMAL_CFLAGS = $(COMMON_CFLAGS) $(OPTIMIZATION_CFLAG)
+
+# Flags passed to compiler in 'debug' compiles:
+#DEBUG_CFLAGS = $(COMMON_CFLAGS) -DDEBUG
+
+# Flags passed to compiler in 'profile' compiles
+#PROFILE_CFLAGS = $(COMMON_CFLAGS) -pg $(OPTIMIZATION_CFLAG) -DPROFILE
+
+# Flags passed to yacc
+#YFLAGS = -d
+
+# Ownership and permissions of files installed by 'install' target
+#INSTALL_AS_USER = root # User to chown app to
+#INSTALL_AS_GROUP = wheel # Group to chgrp app to
+#INSTALL_PERMISSIONS = # If set, 'install' chmod's executable to this
+
+# Options to strip for bundles, apps with bundles, and apps without bundles,
+# respectively.
+#RELOCATABLE_STRIP_OPTS = -x -u
+#DYLD_APP_STRIP_OPTS = -A -n
+#APP_STRIP_OPTS =
+#TOOL_STRIP_OPTS =
+#LIBRARY_STRIP_OPTS = -x -S # Note: -S strips debugging symbols
+# (Note: APP_STRIP_OPTS and TOOL_STRIP_OPTS default to empty, but
+# developers doing their own dynamic loading should set this to
+# $(DYLD_APP_STRIP_OPTS)).
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here. Typical
+# user-defined rules are before_install and after_install (please don't
+# redefine things like install or app, as they are owned by the top-level
+# Makefile API), which are rules that get invoked before and after the install
+# target runs. Such rules should be specified with the '::' syntax rather than
+# a single colon.
+
+
+
+
+
+
diff --git a/QuakeEd/Makefile.preamble b/QuakeEd/Makefile.preamble
new file mode 100644
index 0000000..9983c5d
--- /dev/null
+++ b/QuakeEd/Makefile.preamble
@@ -0,0 +1,108 @@
+###############################################################################
+# NeXT Makefile.preamble Template
+# Copyright 1993, NeXT Computer, Inc.
+#
+# This Makefile is used for configuring the standard app makefiles associated
+# with ProjectBuilder.
+#
+# Use this template to set attributes for a project, sub-project, bundle, or
+# palette. Each node in the project's tree of sub-projects and bundles
+# should have it's own Makefile.preamble and Makefile.postamble.
+#
+###############################################################################
+## Configure the flags passed to $(CC) here. These flags will also be
+## inherited by all nested sub-projects and bundles. Put your -I, -D, -U, and
+## -L flags here. To change the default flags that get passed to ${CC}
+## (e.g. change -O to -O2), see Makefile.postamble.
+
+# Flags passed to compiler (in addition to -g, -O, etc)
+OTHER_CFLAGS =
+# Flags passed to ld (in addition to -ObjC, etc.)
+OTHER_LDFLAGS =
+BUNDLELDFLAGS = # use iff project is a bundle
+PALETTELDFLAGS = # use iff project is a palette
+
+## Specify which headers in this project should be published to the outside
+## world in a flat header directory given in PUBLIC_HEADER_DIR (which will be
+## prepended by DSTROOT, below. Any subset of these public headers can be
+## precompiled automatically after installation, with extra user-defined flags.
+PUBLIC_HEADER_DIR =
+PUBLIC_HEADERS =
+PUBLIC_PRECOMPILED_HEADERS =
+PUBLIC_PRECOMPILED_HEADERS_CFLAGS =
+
+## Configure what is linked in at each level here. Libraries are only used in
+## the final 'app' linking step. Final 'app' linking is only done via the
+## 'app', 'debug', and 'profile' targets when they are invoked for
+## the top-level app.
+
+# Additional relocatables to be linked in at this level
+OTHER_OFILES =
+# Additional libs to link apps against ('app' target)
+OTHER_LIBS =
+# Additional libs to link apps against ('debug' target)
+OTHER_DEBUG_LIBS =
+# Additional libs to link apps against ('profile' target)
+OTHER_PROF_LIBS =
+
+# More 'app' libraries when $(JAPANESE) = "YES"
+OTHER_JAPANESE_LIBS =
+# More 'debug' libraries when $(JAPANESE) = "YES"
+OTHER_JAPANESE_DEBUG_LIBS =
+# More 'profile' libs when $(JAPANESE) = "YES"
+OTHER_JAPANESE_PROF_LIBS =
+
+# If this is a bundle, and you *know* the enclosing application will not
+# be linking with a library which you require in your bundle code, then
+# mention it here so that it gets linked into the bundle. Note that this
+# is wasteful but sometimes necessary.
+BUNDLE_LIBS =
+
+## Configure how things get built here. Additional dependencies, sourcefiles,
+## derived files, and build order should be specified here.
+
+# Other dependencies of this project
+OTHER_PRODUCT_DEPENDS =
+# Built *before* building subprojects/bundles
+OTHER_INITIAL_TARGETS =
+# Other source files maintained by .pre/postamble
+OTHER_SOURCEFILES =
+# Additional files to be removed by `make clean'
+OTHER_GARBAGE =
+# Precompiled headers to be built before any compilation occurs (e.g., draw.p)
+PRECOMPS =
+
+# Targets to be built before installation
+OTHER_INSTALL_DEPENDS =
+
+# A virtual root directory (other than /) to be prepended to the $(INSTALLDIR)
+# passed from ProjectBuilder.
+DSTROOT =
+
+# Set the following to "YES" if you want the old behavior of recursively
+# cleaning all nested subprojects during 'make clean'.
+CLEAN_ALL_SUBPROJECTS =
+
+## Add more obscure source files here to cause them to be automatically
+## processed by the appropriate tool. Note that these files should also be
+## added to "Supporting Files" in ProjectBuilder. The desired .o files that
+## result from these files should also be added to OTHER_OFILES above so they
+## will be linked in.
+
+# .msg files that should have msgwrap run on them
+MSGFILES =
+# .defs files that should have mig run on them
+DEFSFILES =
+# .mig files (no .defs files) that should have mig run on them
+MIGFILES =
+
+## Add additional Help directories here (add them to the project as "Other
+## Resources" in Project Builder) so that they will be compressed into .store
+## files and copied into the app wrapper. If the help directories themselves
+## need to also be in the app wrapper, then a cp command will need to be added
+## in an after_install target.
+OTHER_HELP_DIRS =
+
+# Don't add more rules here unless you want the first one to be the default
+# target for make! Put all your targets in Makefile.postamble.
+
diff --git a/QuakeEd/Map.h b/QuakeEd/Map.h
new file mode 100644
index 0000000..57e1386
--- /dev/null
+++ b/QuakeEd/Map.h
@@ -0,0 +1,68 @@
+
+// Map is a list of Entity objects
+
+extern id map_i;
+
+@interface Map : List
+{
+ id currentEntity;
+ id oldselection; // temp when loading a new map
+ float minz, maxz;
+}
+
+- newMap;
+
+- writeStats;
+
+- readMapFile: (char *)fname;
+- writeMapFile: (char *)fname useRegion: (BOOL)reg;
+
+- entityConnect: (vec3_t)p1 : (vec3_t)p2;
+
+- selectRay: (vec3_t)p1 : (vec3_t)p2 : (BOOL)ef;
+- grabRay: (vec3_t)p1 : (vec3_t)p2;
+- setTextureRay: (vec3_t)p1 : (vec3_t)p2 : (BOOL)allsides;
+- getTextureRay: (vec3_t)p1 : (vec3_t)p2;
+
+- currentEntity;
+- setCurrentEntity: ent;
+
+- (float)currentMinZ;
+- setCurrentMinZ: (float)m;
+- (float)currentMaxZ;
+- setCurrentMaxZ: (float)m;
+
+- (int)numSelected;
+- selectedBrush; // returns the first selected brush
+
+//
+// operations on current selection
+//
+- makeSelectedPerform: (SEL)sel;
+- makeUnselectedPerform: (SEL)sel;
+- makeAllPerform: (SEL)sel;
+- makeGlobalPerform: (SEL)sel; // in and out of region
+
+- cloneSelection: sender;
+
+- makeEntity: sender;
+
+- subtractSelection: sender;
+
+- selectCompletelyInside: sender;
+- selectPartiallyInside: sender;
+
+- tallBrush: sender;
+- shortBrush: sender;
+
+- rotate_x: sender;
+- rotate_y: sender;
+- rotate_z: sender;
+
+- flip_x: sender;
+- flip_y: sender;
+- flip_z: sender;
+
+- selectCompleteEntity: sender;
+
+@end
diff --git a/QuakeEd/Map.m b/QuakeEd/Map.m
new file mode 100644
index 0000000..9185e6d
--- /dev/null
+++ b/QuakeEd/Map.m
@@ -0,0 +1,1121 @@
+
+#include "qedefs.h"
+
+id map_i;
+
+@implementation Map
+
+/*
+===============================================================================
+
+FILE METHODS
+
+===============================================================================
+*/
+
+- init
+{
+ [super init];
+ map_i = self;
+ minz = 0;
+ maxz = 80;
+
+ oldselection = [[List alloc] init];
+
+ return self;
+}
+
+- saveSelected
+{
+ int i, c;
+ id o, w;
+
+ [oldselection empty];
+ w = [self objectAt: 0];
+ c = [w count];
+ sb_newowner = oldselection;
+ for (i=0 ; i<c ; i++)
+ {
+ o = [w objectAt: 0];
+ if ([o selected])
+ [o moveToEntity];
+ else
+ {
+ [w removeObjectAt: 0];
+ [o free];
+ }
+ }
+
+ c = [self count];
+ for (i=0 ; i<c ; i++)
+ {
+ o = [self objectAt: 0];
+ [self removeObjectAt: 0];
+ [o freeObjects];
+ [o free];
+ }
+
+ return self;
+}
+
+- addSelected
+{
+ int i, c;
+ id n, w;
+
+ c = [oldselection count];
+ w = [self objectAt: 0]; // world object
+
+ sb_newowner = w;
+ for (i=0 ; i<c ; i++)
+ {
+ n = [oldselection objectAt:i];
+ [n moveToEntity];
+ i--;
+ c--;
+ }
+ [oldselection empty];
+
+ return self;
+}
+
+
+- newMap
+{
+ id ent;
+
+ [self saveSelected];
+ ent = [[Entity alloc] initClass: "worldspawn"];
+ [self addObject: ent];
+ currentEntity = NULL;
+ [self setCurrentEntity: ent];
+ [self addSelected];
+
+ return self;
+}
+
+- currentEntity
+{
+ return currentEntity;
+}
+
+- setCurrentEntity: ent
+{
+ id old;
+
+ old = currentEntity;
+ currentEntity = ent;
+ if (old != ent)
+ {
+ [things_i newCurrentEntity]; // update inspector
+ [inspcontrol_i changeInspectorTo:i_things];
+ }
+
+ return self;
+}
+
+- (float)currentMinZ
+{
+ float grid;
+
+ grid = [xyview_i gridsize];
+ minz = grid * rint(minz/grid);
+ return minz;
+}
+
+- setCurrentMinZ: (float)m
+{
+ if (m > -2048)
+ minz = m;
+ return self;
+}
+
+- (float)currentMaxZ
+{
+ float grid;
+
+ [self currentMinZ]; // grid align
+
+ grid = [xyview_i gridsize];
+ maxz = grid * rint(maxz/grid);
+
+ if (maxz <= minz)
+ maxz = minz + grid;
+ return maxz;
+}
+
+- setCurrentMaxZ: (float)m
+{
+ if (m < 2048)
+ maxz = m;
+ return self;
+}
+
+- removeObject: o
+{
+ o = [super removeObject: o];
+
+ if (o == currentEntity)
+ { // select the world
+ [self setCurrentEntity: [self objectAt: 0]];
+ }
+
+ return o;
+}
+
+- writeStats
+{
+ FILE *f;
+ extern int c_updateall;
+ struct timeval tp;
+ struct timezone tzp;
+
+ gettimeofday(&tp, &tzp);
+
+ f = fopen (FN_DEVLOG, "a");
+ fprintf (f,"%i %i\n", (int)tp.tv_sec, c_updateall);
+ c_updateall = 0;
+ fclose (f);
+ return self;
+}
+
+- (int)numSelected
+{
+ int i, c;
+ int num;
+
+ num = 0;
+ c = [currentEntity count];
+ for (i=0 ; i<c ; i++)
+ if ( [[currentEntity objectAt: i] selected] )
+ num++;
+ return num;
+}
+
+- selectedBrush
+{
+ int i, c;
+ int num;
+
+ num = 0;
+ c = [currentEntity count];
+ for (i=0 ; i<c ; i++)
+ if ( [[currentEntity objectAt: i] selected] )
+ return [currentEntity objectAt: i];
+ return nil;
+}
+
+
+/*
+=================
+readMapFile
+=================
+*/
+- readMapFile: (char *)fname
+{
+ char *dat, *cl;
+ id new;
+ id ent;
+ int i, c;
+ vec3_t org;
+ float angle;
+
+ [self saveSelected];
+
+ qprintf ("loading %s\n", fname);
+
+ LoadFile (fname, (void **)&dat);
+ StartTokenParsing (dat);
+
+ do
+ {
+ new = [[Entity alloc] initFromTokens];
+ if (!new)
+ break;
+ [self addObject: new];
+ } while (1);
+
+ free (dat);
+
+ [self setCurrentEntity: [self objectAt: 0]];
+
+ [self addSelected];
+
+// load the apropriate texture wad
+ dat = [currentEntity valueForQKey: "wad"];
+ if (dat && dat[0])
+ {
+ if (dat[0] == '/') // remove old style fullpaths
+ [currentEntity removeKeyPair: "wad"];
+ else
+ {
+ if (strcmp ([texturepalette_i currentWad], dat) )
+ [project_i setTextureWad: dat];
+ }
+ }
+
+// center the camera and XY view on the playerstart
+ c = [self count];
+ for (i=1 ; i<c ; i++)
+ {
+ ent = [self objectAt: i];
+ cl = [ent valueForQKey: "classname"];
+ if (cl && !strcasecmp (cl,"info_player_start"))
+ {
+ angle = atof( [ent valueForQKey: "angle"] );
+ angle = angle/180*M_PI;
+ [ent getVector: org forKey: "origin"];
+ [cameraview_i setOrigin: org angle:angle];
+ [xyview_i centerOn: org];
+ break;
+ }
+ }
+
+ return self;
+}
+
+/*
+=================
+writeMapFile
+=================
+*/
+- writeMapFile: (char *)fname useRegion: (BOOL)reg
+{
+ FILE *f;
+ int i;
+
+ qprintf ("writeMapFile: %s", fname);
+
+ f = fopen (fname,"w");
+ if (!f)
+ Error ("couldn't write %s", fname);
+
+ for (i=0 ; i<numElements ; i++)
+ [[self objectAt: i] writeToFILE: f region: reg];
+
+ fclose (f);
+
+ return self;
+}
+
+/*
+==============================================================================
+
+DRAWING
+
+==============================================================================
+*/
+
+- ZDrawSelf
+{
+ int i, count;
+
+ count = [self count];
+
+ for (i=0 ; i<count ; i++)
+ [[self objectAt: i] ZDrawSelf];
+
+ return self;
+}
+
+- RenderSelf: (void (*) (face_t *))callback
+{
+ int i, count;
+
+ count = [self count];
+
+ for (i=0 ; i<count ; i++)
+ [[self objectAt: i] RenderSelf: callback];
+
+ return self;
+}
+
+
+//============================================================================
+
+
+/*
+===================
+entityConnect
+
+A command-shift-click on an entity while an entity is selected will
+make a target connection from the original entity.
+===================
+*/
+- entityConnect: (vec3_t)p1 : (vec3_t)p2
+{
+ id oldent, ent;
+
+ oldent = [self currentEntity];
+ if (oldent == [self objectAt: 0])
+ {
+ qprintf ("Must have a non-world entity selected to connect");
+ return self;
+ }
+
+ [self selectRay: p1 : p2 : YES];
+ ent = [self currentEntity];
+ if (ent == oldent)
+ {
+ qprintf ("Must click on a different entity to connect");
+ return self;
+ }
+
+ if (ent == [self objectAt: 0])
+ {
+ qprintf ("Must click on a non-world entity to connect");
+ return self;
+ }
+
+ [oldent setKey:"target" toValue: [ent targetname]];
+ [quakeed_i updateAll];
+
+ return self;
+}
+
+
+/*
+=================
+selectRay
+
+If ef is true, any entity brush along the ray will be selected in preference
+to intervening world brushes
+=================
+*/
+- selectRay: (vec3_t)p1 : (vec3_t)p2 : (BOOL)ef
+{
+ int i, j, c, c2;
+ id ent, bestent;
+ id brush, bestbrush;
+ int face, bestface;
+ float time, besttime;
+ texturedef_t *td;
+
+ bestent = nil;
+ bestface = -1;
+ bestbrush = nil;
+ besttime = 99999;
+
+ c = [self count];
+ for (i=c-1 ; i>=0 ; i--)
+ {
+ ent = [self objectAt: i];
+ c2 = [ent count];
+ for (j=0 ; j<c2 ; j++)
+ {
+ brush = [ent objectAt: j];
+ [brush hitByRay: p1 : p2 : &time : &face];
+ if (time < 0 || time >besttime)
+ continue;
+ bestent = ent;
+ besttime = time;
+ bestbrush = brush;
+ bestface = face;
+ }
+ if (i == 1 && ef && bestbrush)
+ break; // found an entity, so don't check the world
+ }
+
+ if (besttime == 99999)
+ {
+ qprintf ("trace missed");
+ return self;
+ }
+
+ if ( [bestbrush regioned] )
+ {
+ qprintf ("WANRING: clicked on regioned brush");
+ return self;
+ }
+
+ if (bestent != currentEntity)
+ {
+ [self makeSelectedPerform: @selector(deselect)];
+ [self setCurrentEntity: bestent];
+ }
+
+ [quakeed_i disableFlushWindow];
+ if ( ![bestbrush selected] )
+ {
+ if ( [map_i numSelected] == 0)
+ { // don't grab texture if others are selected
+ td = [bestbrush texturedefForFace: bestface];
+ [texturepalette_i setTextureDef: td];
+ }
+
+ [bestbrush setSelected: YES];
+ qprintf ("selected entity %i brush %i face %i", [self indexOf:bestent], [bestent indexOf: bestbrush], bestface);
+ }
+ else
+ {
+ [bestbrush setSelected: NO];
+ qprintf ("deselected entity %i brush %i face %i", [self indexOf:bestent], [bestent indexOf: bestbrush], bestface);
+ }
+
+ [quakeed_i reenableFlushWindow];
+ [quakeed_i updateAll];
+
+ return self;
+}
+
+/*
+=================
+grabRay
+
+only checks the selected brushes
+Returns the brush hit, or nil if missed.
+=================
+*/
+- grabRay: (vec3_t)p1 : (vec3_t)p2
+{
+ int i, j, c, c2;
+ id ent;
+ id brush, bestbrush;
+ int face;
+ float time, besttime;
+
+ bestbrush = nil;
+ besttime = 99999;
+
+ c = [self count];
+ for (i=0 ; i<c ; i++)
+ {
+ ent = [self objectAt: i];
+ c2 = [ent count];
+ for (j=0 ; j<c2 ; j++)
+ {
+ brush = [ent objectAt: j];
+ if (![brush selected])
+ continue;
+ [brush hitByRay: p1 : p2 : &time : &face];
+ if (time < 0 || time >besttime)
+ continue;
+ besttime = time;
+ bestbrush = brush;
+ }
+ }
+
+ if (besttime == 99999)
+ return nil;
+
+ return bestbrush;
+}
+
+/*
+=================
+getTextureRay
+=================
+*/
+- getTextureRay: (vec3_t)p1 : (vec3_t)p2
+{
+ int i, j, c, c2;
+ id ent, bestent;
+ id brush, bestbrush;
+ int face, bestface;
+ float time, besttime;
+ texturedef_t *td;
+ vec3_t mins, maxs;
+
+
+ bestbrush = nil;
+ bestent = nil;
+ besttime = 99999;
+ bestface = -1;
+ c = [self count];
+ for (i=0 ; i<c ; i++)
+ {
+ ent = [self objectAt: i];
+ c2 = [ent count];
+ for (j=0 ; j<c2 ; j++)
+ {
+ brush = [ent objectAt: j];
+ [brush hitByRay: p1 : p2 : &time : &face];
+ if (time < 0 || time >besttime)
+ continue;
+ bestent = ent;
+ bestface = face;
+ besttime = time;
+ bestbrush = brush;
+ }
+ }
+
+ if (besttime == 99999)
+ return nil;
+
+ if ( ![bestent modifiable])
+ {
+ qprintf ("can't modify spawned entities");
+ return self;
+ }
+
+ td = [bestbrush texturedefForFace: bestface];
+ [texturepalette_i setTextureDef: td];
+
+ qprintf ("grabbed texturedef and sizes");
+
+ [bestbrush getMins: mins maxs: maxs];
+
+ minz = mins[2];
+ maxz = maxs[2];
+
+ return bestbrush;
+}
+
+/*
+=================
+setTextureRay
+=================
+*/
+- setTextureRay: (vec3_t)p1 : (vec3_t)p2 : (BOOL)allsides;
+{
+ int i, j, c, c2;
+ id ent, bestent;
+ id brush, bestbrush;
+ int face, bestface;
+ float time, besttime;
+ texturedef_t td;
+
+ bestent = nil;
+ bestface = -1;
+ bestbrush = nil;
+ besttime = 99999;
+
+ c = [self count];
+ for (i=0 ; i<c ; i++)
+ {
+ ent = [self objectAt: i];
+ c2 = [ent count];
+ for (j=0 ; j<c2 ; j++)
+ {
+ brush = [ent objectAt: j];
+ [brush hitByRay: p1 : p2 : &time : &face];
+ if (time < 0 || time >besttime)
+ continue;
+ bestent = ent;
+ besttime = time;
+ bestbrush = brush;
+ bestface = face;
+ }
+ }
+
+ if (besttime == 99999)
+ {
+ qprintf ("trace missed");
+ return self;
+ }
+
+ if ( ![bestent modifiable])
+ {
+ qprintf ("can't modify spawned entities");
+ return self;
+ }
+
+ if ( [bestbrush regioned] )
+ {
+ qprintf ("WANRING: clicked on regioned brush");
+ return self;
+ }
+
+ [texturepalette_i getTextureDef: &td];
+
+ [quakeed_i disableFlushWindow];
+ if (allsides)
+ {
+ [bestbrush setTexturedef: &td];
+ qprintf ("textured entity %i brush %i", [self indexOf:bestent], [bestent indexOf: bestbrush]);
+ }
+ else
+ {
+ [bestbrush setTexturedef: &td forFace: bestface];
+ qprintf ("deselected entity %i brush %i face %i", [self indexOf:bestent], [bestent indexOf: bestbrush], bestface);
+ }
+ [quakeed_i reenableFlushWindow];
+
+ [quakeed_i updateAll];
+
+ return self;
+}
+
+
+/*
+==============================================================================
+
+OPERATIONS ON SELECTIONS
+
+==============================================================================
+*/
+
+- makeSelectedPerform: (SEL)sel
+{
+ int i,j, c, c2;
+ id ent, brush;
+ int total;
+
+ total = 0;
+ c = [self count];
+ for (i=c-1 ; i>=0 ; i--)
+ {
+ ent = [self objectAt: i];
+ c2 = [ent count];
+ for (j = c2-1 ; j >=0 ; j--)
+ {
+ brush = [ent objectAt: j];
+ if (! [brush selected] )
+ continue;
+ if ([brush regioned])
+ continue;
+ total++;
+ [brush perform:sel];
+ }
+ }
+
+// if (!total)
+// qprintf ("nothing selected");
+
+ return self;
+}
+
+- makeUnselectedPerform: (SEL)sel
+{
+ int i,j, c, c2;
+ id ent, brush;
+
+ c = [self count];
+ for (i=c-1 ; i>=0 ; i--)
+ {
+ ent = [self objectAt: i];
+ c2 = [ent count];
+ for (j = c2-1 ; j >=0 ; j--)
+ {
+ brush = [ent objectAt: j];
+ if ( [brush selected] )
+ continue;
+ if ([brush regioned])
+ continue;
+ [brush perform:sel];
+ }
+ }
+
+ return self;
+}
+
+- makeAllPerform: (SEL)sel
+{
+ int i,j, c, c2;
+ id ent, brush;
+
+ c = [self count];
+ for (i=c-1 ; i>=0 ; i--)
+ {
+ ent = [self objectAt: i];
+ c2 = [ent count];
+ for (j = c2-1 ; j >=0 ; j--)
+ {
+ brush = [ent objectAt: j];
+ if ([brush regioned])
+ continue;
+ [brush perform:sel];
+ }
+ }
+
+ return self;
+}
+
+- makeGlobalPerform: (SEL)sel // in and out of region
+{
+ int i,j, c, c2;
+ id ent, brush;
+
+ c = [self count];
+ for (i=c-1 ; i>=0 ; i--)
+ {
+ ent = [self objectAt: i];
+ c2 = [ent count];
+ for (j = c2-1 ; j >=0 ; j--)
+ {
+ brush = [ent objectAt: j];
+ [brush perform:sel];
+ }
+ }
+
+ return self;
+}
+
+
+void sel_identity (void)
+{
+ sel_x[0]=1; sel_x[1]=0; sel_x[2]=0;
+ sel_y[0]=0; sel_y[1]=1; sel_y[2]=0;
+ sel_z[0]=0; sel_z[1]=0; sel_z[2]=1;
+}
+
+- transformSelection
+{
+ if ( ![currentEntity modifiable])
+ {
+ qprintf ("can't modify spawned entities");
+ return self;
+ }
+
+// find an origin to apply the transformation to
+ sb_mins[0] = sb_mins[1] = sb_mins[2] = 99999;
+ sb_maxs[0] = sb_maxs[1] = sb_maxs[2] = -99999;
+ [self makeSelectedPerform: @selector(addToBBox)];
+ sel_org[0] = [xyview_i snapToGrid: (sb_mins[0] + sb_maxs[0])/2];
+ sel_org[1] = [xyview_i snapToGrid: (sb_mins[1] + sb_maxs[1])/2];
+ sel_org[2] = [xyview_i snapToGrid: (sb_mins[2] + sb_maxs[2])/2];
+
+// do it!
+ [self makeSelectedPerform: @selector(transform)];
+
+ [quakeed_i updateAll];
+ return self;
+}
+
+
+void swapvectors (vec3_t a, vec3_t b)
+{
+ vec3_t temp;
+
+ VectorCopy (a, temp);
+ VectorCopy (b, a);
+ VectorSubtract (vec3_origin, temp, b);
+}
+
+/*
+===============================================================================
+
+UI operations
+
+===============================================================================
+*/
+
+- rotate_x: sender
+{
+ sel_identity ();
+ swapvectors(sel_y, sel_z);
+ [self transformSelection];
+ return self;
+}
+
+- rotate_y: sender
+{
+ sel_identity ();
+ swapvectors(sel_x, sel_z);
+ [self transformSelection];
+ return self;
+}
+
+- rotate_z: sender
+{
+ sel_identity ();
+ swapvectors(sel_x, sel_y);
+ [self transformSelection];
+ return self;
+}
+
+
+- flip_x: sender
+{
+ sel_identity ();
+ sel_x[0] = -1;
+ [self transformSelection];
+ [map_i makeSelectedPerform: @selector(flipNormals)];
+ return self;
+}
+
+- flip_y: sender
+{
+ sel_identity ();
+ sel_y[1] = -1;
+ [self transformSelection];
+ [map_i makeSelectedPerform: @selector(flipNormals)];
+ return self;
+}
+
+
+- flip_z: sender
+{
+ sel_identity ();
+ sel_z[2] = -1;
+ [self transformSelection];
+ [map_i makeSelectedPerform: @selector(flipNormals)];
+ return self;
+}
+
+
+- cloneSelection: sender
+{
+ int i,j , c, originalElements;
+ id o, b;
+ id new;
+
+ sb_translate[0] = sb_translate[1] = [xyview_i gridsize];
+ sb_translate[2] = 0;
+
+// copy individual brushes in the world entity
+ o = [self objectAt: 0];
+ c = [o count];
+ for (i=0 ; i<c ; i++)
+ {
+ b = [o objectAt: i];
+ if (![b selected])
+ continue;
+
+ // copy the brush, then translate the original
+ new = [b copy];
+ [new setSelected: YES];
+ [new translate];
+ [b setSelected: NO];
+ [o addObject: new];
+ }
+
+// copy entire entities otherwise
+ originalElements = numElements; // don't copy the new ones
+ for (i=1 ; i<originalElements ; i++)
+ {
+ o = [self objectAt: i];
+ if (![[o objectAt: 0] selected])
+ continue;
+
+ new = [o copy];
+ [self addObject: new];
+
+ c = [o count];
+ for (j=0 ; j<c ; j++)
+ [[o objectAt: j] setSelected: NO];
+
+ c = [new count];
+ for (j=0 ; j<c ; j++)
+ {
+ b = [new objectAt: j];
+ [b translate];
+ [b setSelected: YES];
+ }
+ }
+
+ [quakeed_i updateAll];
+
+ return self;
+}
+
+
+- selectCompleteEntity: sender
+{
+ id o;
+ int i, c;
+
+ o = [self selectedBrush];
+ if (!o)
+ {
+ qprintf ("nothing selected");
+ return self;
+ }
+ o = [o parent];
+ c = [o count];
+ for (i=0 ; i<c ; i++)
+ [[o objectAt: i] setSelected: YES];
+ qprintf ("%i brushes selected", c);
+
+ [quakeed_i updateAll];
+
+ return self;
+}
+
+- makeEntity: sender
+{
+ if (currentEntity != [self objectAt: 0])
+ {
+ qprintf ("ERROR: can't makeEntity inside an entity");
+ NXBeep ();
+ return self;
+ }
+
+ if ( [self numSelected] == 0)
+ {
+ qprintf ("ERROR: must have a seed brush to make an entity");
+ NXBeep ();
+ return self;
+ }
+
+ sb_newowner = [[Entity alloc] initClass: [things_i spawnName]];
+
+ if ( [sb_newowner modifiable] )
+ [self makeSelectedPerform: @selector(moveToEntity)];
+ else
+ { // throw out seed brush and select entity fixed brush
+ [self makeSelectedPerform: @selector(remove)];
+ [[sb_newowner objectAt: 0] setSelected: YES];
+ }
+
+ [self addObject: sb_newowner];
+ [self setCurrentEntity: sb_newowner];
+
+ [quakeed_i updateAll];
+
+ return self;
+}
+
+
+- selbox: (SEL)selector
+{
+ id b;
+
+ if ([self numSelected] != 1)
+ {
+ qprintf ("must have a single brush selected");
+ return self;
+ }
+
+ b = [self selectedBrush];
+ [b getMins: select_min maxs: select_max];
+ [b remove];
+
+ [self makeUnselectedPerform: selector];
+
+ qprintf ("identified contents");
+ [quakeed_i updateAll];
+
+ return self;
+}
+
+- selectCompletelyInside: sender
+{
+ return [self selbox: @selector(selectComplete)];
+}
+
+- selectPartiallyInside: sender
+{
+ return [self selbox: @selector(selectPartial)];
+}
+
+
+- tallBrush: sender
+{
+ id b;
+ vec3_t mins, maxs;
+ texturedef_t td;
+
+ if ([self numSelected] != 1)
+ {
+ qprintf ("must have a single brush selected");
+ return self;
+ }
+
+ b = [self selectedBrush];
+ td = *[b texturedef];
+ [b getMins: mins maxs: maxs];
+ [b remove];
+
+ mins[2] = -2048;
+ maxs[2] = 2048;
+
+ b = [[SetBrush alloc] initOwner: [map_i objectAt:0] mins: mins maxs: maxs texture: &td];
+ [[map_i objectAt: 0] addObject: b];
+ [b setSelected: YES];
+ [quakeed_i updateAll];
+
+ return self;
+}
+
+- shortBrush: sender
+{
+ id b;
+ vec3_t mins, maxs;
+ texturedef_t td;
+
+ if ([self numSelected] != 1)
+ {
+ qprintf ("must have a single brush selected");
+ return self;
+ }
+
+ b = [self selectedBrush];
+ td = *[b texturedef];
+ [b getMins: mins maxs: maxs];
+ [b remove];
+
+ mins[2] = 0;
+ maxs[2] = 16;
+
+ b = [[SetBrush alloc] initOwner: [map_i objectAt:0] mins: mins maxs: maxs texture: &td];
+ [[map_i objectAt: 0] addObject: b];
+ [b setSelected: YES];
+ [quakeed_i updateAll];
+
+ return self;
+}
+
+/*
+==================
+subtractSelection
+==================
+*/
+- subtractSelection: semder
+{
+ int i, j, c, c2;
+ id o, o2;
+ id sellist, sourcelist;
+
+ qprintf ("performing brush subtraction...");
+
+ sourcelist = [[List alloc] init];
+ sellist = [[List alloc] init];
+ carve_in = [[List alloc] init];
+ carve_out = [[List alloc] init];
+
+ c = [currentEntity count];
+ for (i=0 ; i<c ; i++)
+ {
+ o = [currentEntity objectAt: i];
+ if ([o selected])
+ [sellist addObject: o];
+ else
+ [sourcelist addObject: o];
+ }
+
+
+ c = [sellist count];
+ for (i=0 ; i<c ; i++)
+ {
+ o = [sellist objectAt: i];
+ [o setCarveVars];
+
+ c2 = [sourcelist count];
+ for (j=0 ; j<c2 ; j++)
+ {
+ o2 = [sourcelist objectAt: j];
+ [o2 carve];
+ [carve_in freeObjects];
+ }
+
+ [sourcelist free]; // the individual have been moved/freed
+ sourcelist = carve_out;
+ carve_out = [[List alloc] init];
+ }
+
+// add the selection back to the remnants
+ [currentEntity empty];
+ [currentEntity appendList: sourcelist];
+ [currentEntity appendList: sellist];
+
+ [sourcelist free];
+ [sellist free];
+ [carve_in free];
+ [carve_out free];
+
+ if (![currentEntity count])
+ {
+ o = currentEntity;
+ [self removeObject: o];
+ [o free];
+ }
+
+ qprintf ("subtracted selection");
+ [quakeed_i updateAll];
+
+ return self;
+}
+
+
+@end
diff --git a/QuakeEd/PB.gdbinit b/QuakeEd/PB.gdbinit
new file mode 100644
index 0000000..ec04a06
--- /dev/null
+++ b/QuakeEd/PB.gdbinit
@@ -0,0 +1,7 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+view
+
diff --git a/QuakeEd/PB.project b/QuakeEd/PB.project
new file mode 100644
index 0000000..7640a7f
--- /dev/null
+++ b/QuakeEd/PB.project
@@ -0,0 +1,26 @@
+INSTALLDIR = /LocalApps;
+APPICON = i_quakeed.tiff;
+GENERATEMAIN = YES;
+DOCICONFILES = ();
+FILESTABLE = {
+ C_FILES = (cmdlib.c, mathlib.c);
+ OTHER_LIBS = (Media_s, NeXT_s);
+ CLASSES = (CameraView.m, Clipper.m, Dict.m, DictList.m, Entity.m, EntityClass.m, InspectorControl.m, KeypairView.m, Map.m, PopScrollView.m, Preferences.m, Project.m, QuakeEd.m, SetBrush.m, TexturePalette.m, TextureView.m, Things.m, UserPath.m, XYView.m, ZScrollView.m, ZView.m);
+ OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble);
+ INTERFACES = (QuakeEd.nib);
+ H_FILES = (CameraView.h, Clipper.h, Dict.h, DictList.h, Entity.h, EntityClass.h, InspectorControl.h, KeypairView.h, Map.h, PopScrollView.h, Preferences.h, Project.h, QuakeEd.h, SetBrush.h, TexturePalette.h, TextureView.h, Things.h, UserPath.h, XYView.h, ZScrollView.h, ZView.h, render.h, cmdlib.h, mathlib.h);
+ IMAGES = (DownArrow.tiff, i_90d.tiff, i_add.tiff, i_brushes.tiff, i_fliph.tiff, i_flipv.tiff, i_quakeed.tiff, i_sub.tiff, short.tiff, tall.tiff, UpArrow.tiff);
+ OTHER_LINKED = ();
+ M_FILES = (misc.m, QuakeEd_main.m, render.m);
+};
+APPCLASS = Application;
+MAINNIB = QuakeEd;
+DOCEXTENSIONS = ();
+PROJECTTYPE = Application;
+PROJECTVERSION = 1.1;
+LOCALIZABLE_FILES = {
+ QuakeEd.nib;
+};
+PROJECTNAME = QuakeEd;
+SYSTEMEXTENSIONS = ();
+LANGUAGE = English;
diff --git a/QuakeEd/PopScrollView.h b/QuakeEd/PopScrollView.h
new file mode 100644
index 0000000..96f836a
--- /dev/null
+++ b/QuakeEd/PopScrollView.h
@@ -0,0 +1,11 @@
+#import <appkit/appkit.h>
+
+@interface PopScrollView : ScrollView
+{
+ id button1, button2;
+}
+
+- initFrame:(const NXRect *)frameRect button1: b1 button2: b2;
+- tile;
+
+@end \ No newline at end of file
diff --git a/QuakeEd/PopScrollView.m b/QuakeEd/PopScrollView.m
new file mode 100644
index 0000000..18edb03
--- /dev/null
+++ b/QuakeEd/PopScrollView.m
@@ -0,0 +1,87 @@
+
+#import "qedefs.h"
+
+@implementation PopScrollView
+
+/*
+====================
+initFrame: button:
+
+Initizes a scroll view with a button at it's lower right corner
+====================
+*/
+
+- initFrame:(const NXRect *)frameRect button1:b1 button2:b2
+{
+ [super initFrame: frameRect];
+
+ [self addSubview: b1];
+ [self addSubview: b2];
+
+ button1 = b1;
+ button2 = b2;
+
+ [self setHorizScrollerRequired: YES];
+ [self setVertScrollerRequired: YES];
+
+ [self setBorderType: NX_BEZEL];
+
+ return self;
+}
+
+
+/*
+================
+tile
+
+Adjust the size for the pop up scale menu
+=================
+*/
+
+- tile
+{
+ NXRect scrollerframe;
+ NXRect buttonframe, buttonframe2;
+ NXRect newframe;
+
+ [super tile];
+ [button1 getFrame: &buttonframe];
+ [button2 getFrame: &buttonframe2];
+ [hScroller getFrame: &scrollerframe];
+
+ newframe.origin.y = scrollerframe.origin.y;
+ newframe.origin.x = frame.size.width - buttonframe.size.width;
+ newframe.size.width = buttonframe.size.width;
+ newframe.size.height = scrollerframe.size.height;
+ scrollerframe.size.width -= newframe.size.width;
+ [button1 setFrame: &newframe];
+ newframe.size.width = buttonframe2.size.width;
+ newframe.origin.x -= newframe.size.width;
+ [button2 setFrame: &newframe];
+ scrollerframe.size.width -= newframe.size.width;
+
+ [hScroller setFrame: &scrollerframe];
+
+ return self;
+}
+
+
+- superviewSizeChanged:(const NXSize *)oldSize
+{
+ [super superviewSizeChanged: oldSize];
+
+ [[self docView] newSuperBounds];
+
+ return self;
+}
+
+
+-(BOOL) acceptsFirstResponder
+{
+ return YES;
+}
+
+
+
+@end
+
diff --git a/QuakeEd/Preferences.h b/QuakeEd/Preferences.h
new file mode 100644
index 0000000..a27d81a
--- /dev/null
+++ b/QuakeEd/Preferences.h
@@ -0,0 +1,78 @@
+
+extern id preferences_i;
+
+extern float lightaxis[3];
+
+// these are personal preferences saved in NeXT defaults, not project
+// parameters saved in the quake.qe_project file
+
+@interface Preferences:Object
+{
+ id bspSound_i; // actual sound object
+
+// internal state
+ char projectpath[1024];
+ char bspSound[1024];
+
+ BOOL brushOffset;
+ BOOL showBSP;
+
+ float xlight;
+ float ylight;
+ float zlight; // 0.0 - 1.0
+
+ int startwad; // 0 - 2
+
+// UI targets
+ id startproject_i; // TextField
+
+ id bspSoundField_i; // TextField of bspSound
+
+ id brushOffset_i; // Brush Offset checkbox
+ id showBSP_i; // Show BSP Output checkbox
+
+ id startwad_i; // which wad to load at startup
+
+ id xlight_i; // X-side lighting
+ id ylight_i; // Y-side lighting
+ id zlight_i; // Z-side lighting
+}
+
+- readDefaults;
+
+//
+// validate and set methods called by UI or defaults
+//
+- setProjectPath:(char *)path;
+- setBspSoundPath:(char *)path; // set the path of the soundfile externally
+- setShowBSP:(int)state; // set the state of ShowBSP
+- setBrushOffset:(int)state; // set the state of BrushOffset
+- setStartWad:(int)value; // set start wad (0-2)
+- setXlight:(float)value; // set Xlight value for CameraView
+- setYlight:(float)value; // set Ylight value for CameraView
+- setZlight:(float)value; // set Zlight value for CameraView
+
+//
+// UI targets
+//
+- setBspSound:sender; // use OpenPanel to select sound
+- setCurrentProject:sender; // make current roject the default
+- UIChanged: sender; // target for all checks and fields
+
+//
+// methods used by other objects to retreive defaults
+//
+- playBspSound;
+
+- (char *)getProjectPath;
+- (int)getBrushOffset; // get the state
+- (int)getShowBSP; // get the state
+
+- (float)getXlight; // get Xlight value
+- (float)getYlight; // get Ylight value
+- (float)getZlight; // get Zlight value
+
+- (int)getStartWad;
+
+
+@end
diff --git a/QuakeEd/Preferences.m b/QuakeEd/Preferences.m
new file mode 100644
index 0000000..e3611a7
--- /dev/null
+++ b/QuakeEd/Preferences.m
@@ -0,0 +1,330 @@
+
+#import "qedefs.h"
+
+id preferences_i;
+
+#define DEFOWNER "QuakeEd2"
+
+float lightaxis[3] = {1, 0.6, 0.75};
+
+@implementation Preferences
+
+- init
+{
+ [super init];
+ preferences_i = self;
+ return self;
+}
+
+int _atoi (char *c)
+{
+ if (!c)
+ return 0;
+ return atoi(c);
+}
+
+int _atof (char *c)
+{
+ if (!c)
+ return 0;
+ return atof(c);
+}
+
+void WriteNumericDefault (char *name, float value)
+{
+ char str[128];
+
+ sprintf (str,"%f", value);
+ NXWriteDefault (DEFOWNER, name, str);
+}
+void WriteStringDefault (char *name, char *value)
+{
+ NXWriteDefault (DEFOWNER, name, value);
+}
+
+//
+// Read in at start of program
+//
+- readDefaults
+{
+ char *string;
+ float value;
+
+ string = (char *)NXGetDefaultValue(DEFOWNER,"ProjectPath");
+ [self setProjectPath: string];
+
+ string = (char *)NXGetDefaultValue(DEFOWNER,"BspSoundPath");
+ [self setBspSoundPath:string];
+
+ value = _atoi((char *)NXGetDefaultValue(DEFOWNER,"ShowBSPOutput"));
+ [self setShowBSP:value];
+
+ value = _atoi((char *)NXGetDefaultValue(DEFOWNER,"OffsetBrushCopy"));
+ [self setBrushOffset:value];
+
+ value = _atoi((char *)NXGetDefaultValue(DEFOWNER,"StartWad"));
+ [self setStartWad:value];
+
+ value = _atof((char *)NXGetDefaultValue(DEFOWNER,"Xlight"));
+ [self setXlight:value];
+
+ value = _atof((char *)NXGetDefaultValue(DEFOWNER,"Ylight"));
+ [self setYlight:value];
+
+ value = _atof((char *)NXGetDefaultValue(DEFOWNER,"Zlight"));
+ [self setZlight:value];
+
+ return self;
+}
+
+
+- setProjectPath:(char *)path
+{
+ if (!path)
+ path = "";
+ strcpy (projectpath, path);
+ [startproject_i setStringValue: path];
+ WriteStringDefault ("ProjectPath", path);
+ return self;
+}
+
+- setCurrentProject:sender
+{
+ [startproject_i setStringValue: [project_i currentProjectFile]];
+ [self UIChanged: self];
+ return self;
+}
+
+- (char *)getProjectPath
+{
+ return projectpath;
+}
+
+
+//
+//===============================================
+// BSP sound stuff
+//===============================================
+//
+// Set the BSP sound using an OpenPanel
+//
+- setBspSound:sender
+{
+ id panel;
+ char *types[]={"snd",NULL};
+ int rtn;
+ char **filename;
+ char path[1024], file[64];
+
+ panel = [OpenPanel new];
+
+ ExtractFilePath (bspSound, path);
+ ExtractFileBase (bspSound, file);
+
+ rtn = [panel
+ runModalForDirectory:path
+ file: file
+ types: types];
+
+ if (rtn)
+ {
+ filename = (char **)[panel filenames];
+ strcpy(bspSound,[panel directory]);
+ strcat(bspSound,"/");
+ strcat(bspSound,filename[0]);
+ [self setBspSoundPath:bspSound];
+ [self playBspSound];
+ }
+
+ return self;
+}
+
+
+//
+// Play the BSP sound
+//
+- playBspSound
+{
+ [bspSound_i play];
+ return self;
+}
+
+
+//
+// Set the bspSound path
+//
+- setBspSoundPath:(char *)path
+{
+ if (!path)
+ path = "";
+ strcpy(bspSound,path);
+
+ if (bspSound_i)
+ [bspSound_i free];
+ bspSound_i = [[Sound alloc] initFromSoundfile:bspSound];
+ if (!bspSound_i)
+ {
+ strcpy (bspSound, "/NextLibrary/Sounds/Funk.snd");
+ bspSound_i = [[Sound alloc] initFromSoundfile:bspSound];
+ }
+
+ [bspSoundField_i setStringValue:bspSound];
+
+ WriteStringDefault ("BspSoundPath", bspSound);
+
+ return self;
+}
+
+//===============================================
+// Show BSP Output management
+//===============================================
+
+//
+// Set the state
+//
+- setShowBSP:(int)state
+{
+ showBSP = state;
+ [showBSP_i setIntValue:state];
+ WriteNumericDefault ("ShowBSPOutput", showBSP);
+
+ return self;
+}
+
+//
+// Get the state
+//
+- (int)getShowBSP
+{
+ return showBSP;
+}
+
+
+//===============================================
+// "Offset Brush ..." management
+//===============================================
+
+//
+// Set the state
+//
+- setBrushOffset:(int)state
+{
+ brushOffset = state;
+ [brushOffset_i setIntValue:state];
+ WriteNumericDefault ("OffsetBrushCopy", state);
+ return self;
+}
+
+//
+// Get the state
+//
+- (int)getBrushOffset
+{
+ return brushOffset;
+}
+
+//===============================================
+// StartWad
+//===============================================
+
+- setStartWad:(int)value // set start wad (0-2)
+{
+ startwad = value;
+ if (startwad<0 || startwad>2)
+ startwad = 0;
+
+ [startwad_i selectCellAt:startwad : 0];
+
+ WriteNumericDefault ("StartWad", value);
+ return self;
+}
+
+- (int)getStartWad
+{
+ return startwad;
+}
+
+
+//===============================================
+// X,Y,Z light values
+//===============================================
+//
+// Set the state
+//
+- setXlight:(float)value
+{
+ xlight = value;
+ if (xlight < 0.25 || xlight > 1)
+ xlight = 0.6;
+ lightaxis[1] = xlight;
+ [xlight_i setFloatValue:xlight];
+ WriteNumericDefault ("Xlight", xlight);
+ return self;
+}
+- setYlight:(float)value
+{
+ ylight = value;
+ if (ylight < 0.25 || ylight > 1)
+ ylight = 0.75;
+ lightaxis[2] = ylight;
+ [ylight_i setFloatValue:ylight];
+ WriteNumericDefault ("Ylight", ylight);
+ return self;
+}
+- setZlight:(float)value
+{
+ zlight = value;
+ if (zlight < 0.25 || zlight > 1)
+ zlight = 1;
+ lightaxis[0] = zlight;
+ [zlight_i setFloatValue:zlight];
+ WriteNumericDefault ("Zlight", zlight);
+ return self;
+}
+
+//
+// Get the state
+//
+- (float)getXlight
+{
+ return [xlight_i floatValue];
+}
+- (float)getYlight
+{
+ return [ylight_i floatValue];
+}
+- (float)getZlight
+{
+ return [zlight_i floatValue];
+}
+
+
+
+/*
+============
+UIChanged
+
+Grab all the current UI state
+============
+*/
+-UIChanged: sender
+{
+ qprintf ("defaults updated");
+
+ [self setProjectPath: (char *)[startproject_i stringValue]];
+ [self setBspSoundPath: (char *)[bspSoundField_i stringValue]];
+ [self setShowBSP: [showBSP_i intValue]];
+ [self setBrushOffset: [brushOffset_i intValue]];
+ [self setStartWad: [startwad_i selectedRow]];
+ [self setXlight: [xlight_i floatValue]];
+ [self setYlight: [ylight_i floatValue]];
+ [self setZlight: [zlight_i floatValue]];
+
+ [map_i makeGlobalPerform: @selector(flushTextures)];
+ [quakeed_i updateAll];
+
+ return self;
+}
+
+
+@end
diff --git a/QuakeEd/Project.h b/QuakeEd/Project.h
new file mode 100644
index 0000000..9dd973a
--- /dev/null
+++ b/QuakeEd/Project.h
@@ -0,0 +1,108 @@
+
+#import <appkit/appkit.h>
+#include <sys/stat.h>
+
+#define BASEPATHKEY "basepath"
+#define MAPNAMESKEY "maps"
+#define DESCKEY "desc"
+#define WADSKEY "wads"
+#define BSPFULLVIS "bspfullvis"
+#define BSPFASTVIS "bspfastvis"
+#define BSPNOVIS "bspnovis"
+#define BSPRELIGHT "bsprelight"
+#define BSPLEAKTEST "bspleaktest"
+#define BSPENTITIES "bspentities"
+
+#define SUBDIR_ENT "progs" // subdir names in heirarchy
+#define SUBDIR_MAPS "maps"
+#define SUBDIR_GFX "gfx"
+
+extern id project_i;
+
+@interface Project:Object
+{
+ id projectInfo; // dictionary storage of project info
+
+ id basepathinfo_i; // outlet to base path info textfield
+ id mapbrowse_i; // outlet to QuakeEd Maps browser
+ id currentmap_i; // outlet to current map textfield
+ id mapList; // list of map names (Storage)
+ id descList; // list of map descriptions (Storage)
+ id wadList; // list of wad names (Storage)
+
+ id pis_panel_i; // outlet to Project Info Settings (PIS) panel
+
+ id pis_basepath_i; // outlet to PIS->base path
+ id pis_wads_i; // outlet to PIS->wad browser
+ id pis_fullvis_i; // outlet to PIS->full vis command
+ id pis_fastvis_i; // outlet to PIS->fast vis command
+ id pis_novis_i; // outlet to PIS->no vis command
+ id pis_relight_i; // outlet to PIS->relight command
+ id pis_leaktest_i; // outlet to PIS->leak test command
+
+ id BSPoutput_i; // outlet to Text
+
+ char path_projectinfo[128]; // path of QE_Project file
+
+ char path_basepath[128]; // base path of heirarchy
+
+ char path_progdir[128]; // derived from basepath
+ char path_mapdirectory[128]; // derived from basepath
+ char path_finalmapdir[128]; // derived from basepath
+
+ char path_wad8[128]; // path of texture WAD for cmd-8 key
+ char path_wad9[128]; // path of texture WAD for cmd-9 key
+ char path_wad0[128]; // path of texture WAD for cmd-0 key
+
+ char string_fullvis[1024]; // cmd-line parm
+ char string_fastvis[1024]; // cmd-line parm
+ char string_novis[1024]; // cmd-line parm
+ char string_relight[1024]; // cmd-line parm
+ char string_leaktest[1024]; // cmd-line parm
+ char string_entities[1024]; // cmd-line parm
+
+ int showDescriptions; // 1 = show map descs in browser
+
+ time_t lastModified; // last time project file was modified
+}
+
+- initProject;
+- initVars;
+
+- (char *)currentProjectFile;
+
+- setTextureWad: (char *)wf;
+
+- addToOutput:(char *)string;
+- clearBspOutput:sender;
+- initProjSettings;
+- changeChar:(char)f to:(char)t in:(id)obj;
+- (int)searchForString:(char *)str in:(id)obj;
+
+- parseProjectFile; // read defaultsdatabase for project path
+- openProjectFile:(char *)path; // called by openProject and newProject
+- openProject;
+- clickedOnMap:sender; // called if clicked on map in browser
+- clickedOnWad:sender; // called if clicked on wad in browser
+
+// methods to querie the project file
+
+- (char *)getMapDirectory;
+- (char *)getFinalMapDirectory;
+- (char *)getProgDirectory;
+
+- (char *)getWAD8;
+- (char *)getWAD9;
+- (char *)getWAD0;
+
+- (char *)getFullVisCmd;
+- (char *)getFastVisCmd;
+- (char *)getNoVisCmd;
+- (char *)getRelightCmd;
+- (char *)getLeaktestCmd;
+- (char *)getEntitiesCmd;
+
+@end
+
+void changeString(char cf,char ct,char *string);
+
diff --git a/QuakeEd/Project.m b/QuakeEd/Project.m
new file mode 100644
index 0000000..e9b36b3
--- /dev/null
+++ b/QuakeEd/Project.m
@@ -0,0 +1,526 @@
+//======================================
+//
+// QuakeEd Project Management
+//
+//======================================
+
+#import "qedefs.h"
+
+
+id project_i;
+
+@implementation Project
+
+- init
+{
+ project_i = self;
+
+ return self;
+}
+
+//===========================================================
+//
+// Project code
+//
+//===========================================================
+- initVars
+{
+ char *s;
+
+ s = [preferences_i getProjectPath];
+ StripFilename(s);
+ strcpy(path_basepath,s);
+
+ strcpy(path_progdir,s);
+ strcat(path_progdir,"/"SUBDIR_ENT);
+
+ strcpy(path_mapdirectory,s);
+ strcat(path_mapdirectory,"/"SUBDIR_MAPS); // source dir
+
+ strcpy(path_finalmapdir,s);
+ strcat(path_finalmapdir,"/"SUBDIR_MAPS); // dest dir
+
+ [basepathinfo_i setStringValue:s]; // in Project Inspector
+
+ #if 0
+ if ((s = [projectInfo getStringFor:BASEPATHKEY]))
+ {
+ strcpy(path_basepath,s);
+
+ strcpy(path_progdir,s);
+ strcat(path_progdir,"/"SUBDIR_ENT);
+
+ strcpy(path_mapdirectory,s);
+ strcat(path_mapdirectory,"/"SUBDIR_MAPS); // source dir
+
+ strcpy(path_finalmapdir,s);
+ strcat(path_finalmapdir,"/"SUBDIR_MAPS); // dest dir
+
+ [basepathinfo_i setStringValue:s]; // in Project Inspector
+ }
+ #endif
+
+ if ((s = [projectInfo getStringFor:BSPFULLVIS]))
+ {
+ strcpy(string_fullvis,s);
+ changeString('@','\"',string_fullvis);
+ }
+
+ if ((s = [projectInfo getStringFor:BSPFASTVIS]))
+ {
+ strcpy(string_fastvis,s);
+ changeString('@','\"',string_fastvis);
+ }
+
+ if ((s = [projectInfo getStringFor:BSPNOVIS]))
+ {
+ strcpy(string_novis,s);
+ changeString('@','\"',string_novis);
+ }
+
+ if ((s = [projectInfo getStringFor:BSPRELIGHT]))
+ {
+ strcpy(string_relight,s);
+ changeString('@','\"',string_relight);
+ }
+
+ if ((s = [projectInfo getStringFor:BSPLEAKTEST]))
+ {
+ strcpy(string_leaktest,s);
+ changeString('@','\"',string_leaktest);
+ }
+
+ if ((s = [projectInfo getStringFor:BSPENTITIES]))
+ {
+ strcpy(string_entities,s);
+ changeString('@','\"', string_entities);
+ }
+
+ // Build list of wads
+ wadList = [projectInfo parseMultipleFrom:WADSKEY];
+
+ // Build list of maps & descriptions
+ mapList = [projectInfo parseMultipleFrom:MAPNAMESKEY];
+ descList = [projectInfo parseMultipleFrom:DESCKEY];
+ [self changeChar:'_' to:' ' in:descList];
+
+ [self initProjSettings];
+
+ return self;
+}
+
+//
+// Init Project Settings fields
+//
+- initProjSettings
+{
+ [pis_basepath_i setStringValue:path_basepath];
+ [pis_fullvis_i setStringValue:string_fullvis];
+ [pis_fastvis_i setStringValue:string_fastvis];
+ [pis_novis_i setStringValue:string_novis];
+ [pis_relight_i setStringValue:string_relight];
+ [pis_leaktest_i setStringValue:string_leaktest];
+
+ return self;
+}
+
+//
+// Add text to the BSP Output window
+//
+- addToOutput:(char *)string
+{
+ int end;
+
+ end = [BSPoutput_i textLength];
+ [BSPoutput_i setSel:end :end];
+ [BSPoutput_i replaceSel:string];
+
+ end = [BSPoutput_i textLength];
+ [BSPoutput_i setSel:end :end];
+ [BSPoutput_i scrollSelToVisible];
+
+ return self;
+}
+
+- clearBspOutput:sender
+{
+ [BSPoutput_i selectAll:self];
+ [BSPoutput_i replaceSel:"\0"];
+
+ return self;
+}
+
+- print
+{
+ [BSPoutput_i printPSCode:self];
+ return self;
+}
+
+
+- initProject
+{
+ [self parseProjectFile];
+ if (projectInfo == NULL)
+ return self;
+ [self initVars];
+ [mapbrowse_i reuseColumns:YES];
+ [mapbrowse_i loadColumnZero];
+ [pis_wads_i reuseColumns:YES];
+ [pis_wads_i loadColumnZero];
+
+ [things_i initEntities];
+
+ return self;
+}
+
+//
+// Change a character to another in a Storage list of strings
+//
+- changeChar:(char)f to:(char)t in:(id)obj
+{
+ int i;
+ int max;
+ char *string;
+
+ max = [obj count];
+ for (i = 0;i < max;i++)
+ {
+ string = [obj elementAt:i];
+ changeString(f,t,string);
+ }
+ return self;
+}
+
+//
+// Fill the QuakeEd Maps or wads browser
+// (Delegate method - delegated in Interface Builder)
+//
+- (int)browser:sender fillMatrix:matrix inColumn:(int)column
+{
+ id cell, list;
+ int max;
+ char *name;
+ int i;
+
+ if (sender == mapbrowse_i)
+ list = mapList;
+ else if (sender == pis_wads_i)
+ list = wadList;
+ else
+ {
+ list = nil;
+ Error ("Project: unknown browser to fill");
+ }
+
+ max = [list count];
+ for (i = 0 ; i<max ; i++)
+ {
+ name = [list elementAt:i];
+ [matrix addRow];
+ cell = [matrix cellAt:i :0];
+ [cell setStringValue:name];
+ [cell setLeaf:YES];
+ [cell setLoaded:YES];
+ }
+ return i;
+}
+
+//
+// Clicked on a map name or description!
+//
+- clickedOnMap:sender
+{
+ id matrix;
+ int row;
+ char fname[1024];
+ id panel;
+
+ matrix = [sender matrixInColumn:0];
+ row = [matrix selectedRow];
+ sprintf(fname,"%s/%s.map",path_mapdirectory,
+ (char *)[mapList elementAt:row]);
+
+ panel = NXGetAlertPanel("Loading...",
+ "Loading map. Please wait.",NULL,NULL,NULL);
+ [panel orderFront:NULL];
+
+ [quakeed_i doOpen:fname];
+
+ [panel performClose:NULL];
+ NXFreeAlertPanel(panel);
+ return self;
+}
+
+
+- setTextureWad: (char *)wf
+{
+ int i, c;
+ char *name;
+
+ qprintf ("loading %s", wf);
+
+// set the row in the settings inspector wad browser
+ c = [wadList count];
+ for (i=0 ; i<c ; i++)
+ {
+ name = (char *)[wadList elementAt:i];
+ if (!strcmp(name, wf))
+ {
+ [[pis_wads_i matrixInColumn:0] selectCellAt: i : 0];
+ break;
+ }
+ }
+
+// update the texture inspector
+ [texturepalette_i initPaletteFromWadfile:wf ];
+ [[map_i objectAt: 0] setKey:"wad" toValue: wf];
+// [inspcontrol_i changeInspectorTo:i_textures];
+
+ [quakeed_i updateAll];
+
+ return self;
+}
+
+//
+// Clicked on a wad name
+//
+- clickedOnWad:sender
+{
+ id matrix;
+ int row;
+ char *name;
+
+ matrix = [sender matrixInColumn:0];
+ row = [matrix selectedRow];
+
+ name = (char *)[wadList elementAt:row];
+ [self setTextureWad: name];
+
+ return self;
+}
+
+
+//
+// Read in the <name>.QE_Project file
+//
+- parseProjectFile
+{
+ char *path;
+ int rtn;
+
+ path = [preferences_i getProjectPath];
+ if (!path || !path[0] || access(path,0))
+ {
+ rtn = NXRunAlertPanel("Project Error!",
+ "A default project has not been found.\n"
+ , "Open Project", NULL, NULL);
+ if ([self openProject] == nil)
+ while (1) // can't run without a project
+ [NXApp terminate: self];
+ return self;
+ }
+
+ [self openProjectFile:path];
+ return self;
+}
+
+//
+// Loads and parses a project file
+//
+- openProjectFile:(char *)path
+{
+ FILE *fp;
+ struct stat s;
+
+ strcpy(path_projectinfo,path);
+
+ projectInfo = NULL;
+ fp = fopen(path,"r+t");
+ if (fp == NULL)
+ return self;
+
+ stat(path,&s);
+ lastModified = s.st_mtime;
+
+ projectInfo = [(Dict *)[Dict alloc] initFromFile:fp];
+ fclose(fp);
+
+ return self;
+}
+
+- (char *)currentProjectFile
+{
+ return path_projectinfo;
+}
+
+//
+// Open a project file
+//
+- openProject
+{
+ char path[128];
+ id openpanel;
+ int rtn;
+ char *projtypes[2] = {"qpr",NULL};
+ char **filenames;
+ char *dir;
+
+ openpanel = [OpenPanel new];
+ [openpanel allowMultipleFiles:NO];
+ [openpanel chooseDirectories:NO];
+ rtn = [openpanel runModalForTypes:projtypes];
+ if (rtn == NX_OKTAG)
+ {
+ (const char *const *)filenames = [openpanel filenames];
+ dir = (char *)[openpanel directory];
+ sprintf(path,"%s/%s",dir,filenames[0]);
+ strcpy(path_projectinfo,path);
+ [self openProjectFile:path];
+ return self;
+ }
+
+ return nil;
+}
+
+
+//
+// Search for a string in a List of strings
+//
+- (int)searchForString:(char *)str in:(id)obj
+{
+ int i;
+ int max;
+ char *s;
+
+ max = [obj count];
+ for (i = 0;i < max; i++)
+ {
+ s = (char *)[obj elementAt:i];
+ if (!strcmp(s,str))
+ return 1;
+ }
+ return 0;
+}
+
+- (char *)getMapDirectory
+{
+ return path_mapdirectory;
+}
+
+- (char *)getFinalMapDirectory
+{
+ return path_finalmapdir;
+}
+
+- (char *)getProgDirectory
+{
+ return path_progdir;
+}
+
+
+//
+// Return the WAD name for cmd-8
+//
+- (char *)getWAD8
+{
+ if (!path_wad8[0])
+ return NULL;
+ return path_wad8;
+}
+
+//
+// Return the WAD name for cmd-9
+//
+- (char *)getWAD9
+{
+ if (!path_wad9[0])
+ return NULL;
+ return path_wad9;
+}
+
+//
+// Return the WAD name for cmd-0
+//
+- (char *)getWAD0
+{
+ if (!path_wad0[0])
+ return NULL;
+ return path_wad0;
+}
+
+//
+// Return the FULLVIS cmd string
+//
+- (char *)getFullVisCmd
+{
+ if (!string_fullvis[0])
+ return NULL;
+ return string_fullvis;
+}
+
+//
+// Return the FASTVIS cmd string
+//
+- (char *)getFastVisCmd
+{
+ if (!string_fastvis[0])
+ return NULL;
+ return string_fastvis;
+}
+
+//
+// Return the NOVIS cmd string
+//
+- (char *)getNoVisCmd
+{
+ if (!string_novis[0])
+ return NULL;
+ return string_novis;
+}
+
+//
+// Return the RELIGHT cmd string
+//
+- (char *)getRelightCmd
+{
+ if (!string_relight[0])
+ return NULL;
+ return string_relight;
+}
+
+//
+// Return the LEAKTEST cmd string
+//
+- (char *)getLeaktestCmd
+{
+ if (!string_leaktest[0])
+ return NULL;
+ return string_leaktest;
+}
+
+- (char *)getEntitiesCmd
+{
+ if (!string_entities[0])
+ return NULL;
+ return string_entities;
+}
+
+@end
+
+//====================================================
+// C Functions
+//====================================================
+
+//
+// Change a character to a different char in a string
+//
+void changeString(char cf,char ct,char *string)
+{
+ int j;
+
+ for (j = 0;j < strlen(string);j++)
+ if (string[j] == cf)
+ string[j] = ct;
+}
+
+
diff --git a/QuakeEd/QuakeEd.h b/QuakeEd/QuakeEd.h
new file mode 100644
index 0000000..e7a20df
--- /dev/null
+++ b/QuakeEd/QuakeEd.h
@@ -0,0 +1,98 @@
+
+extern id quakeed_i;
+
+extern BOOL filter_light, filter_path, filter_entities;
+extern BOOL filter_clip_brushes, filter_water_brushes, filter_world;
+
+extern UserPath *upath;
+
+extern id g_cmd_out_i;
+
+double I_FloatTime (void);
+
+void NopSound (void);
+
+void qprintf (char *fmt, ...); // prints text to cmd_out_i
+
+@interface QuakeEd : Window
+{
+ BOOL dirty;
+ char filename[1024]; // full path with .map extension
+
+// UI objects
+ id brushcount_i;
+ id entitycount_i;
+ id regionbutton_i;
+
+ id show_coordinates_i;
+ id show_names_i;
+
+ id filter_light_i;
+ id filter_path_i;
+ id filter_entities_i;
+ id filter_clip_i;
+ id filter_water_i;
+ id filter_world_i;
+
+ id cmd_in_i; // text fields
+ id cmd_out_i;
+
+ id xy_drawmode_i; // passed over to xyview after init
+}
+
+- setDefaultFilename;
+- (char *)currentFilename;
+
+- updateAll; // when a model has been changed
+- updateCamera; // when the camera has moved
+- updateXY;
+- updateZ;
+
+- updateAll:sender;
+
+- newinstance; // force next flushwindow to clear all instance drawing
+- redrawInstance; // erase and redraw all instance now
+
+- appDidInit:sender;
+- appWillTerminate:sender;
+
+- openProject:sender;
+
+- textCommand: sender;
+
+- applyRegion: sender;
+
+- (BOOL)dirty;
+
+- clear: sender;
+- centerCamera: sender;
+- centerZChecker: sender;
+
+- changeXYLookUp: sender;
+
+- setBrushRegion: sender;
+- setXYRegion: sender;
+
+- open: sender;
+- save: sender;
+- saveAs: sender;
+
+- doOpen: (char *)fname;
+
+- saveBSP:(char *)cmdline dialog:(BOOL)wt;
+
+- BSP_Full: sender;
+- BSP_FastVis: sender;
+- BSP_NoVis: sender;
+- BSP_relight: sender;
+- BSP_stop: sender;
+- BSP_entities: sender;
+
+//
+// UI querie for other objects
+//
+- (BOOL)showCoordinates;
+- (BOOL)showNames;
+
+@end
+
diff --git a/QuakeEd/QuakeEd.iconheader b/QuakeEd/QuakeEd.iconheader
new file mode 100644
index 0000000..d0a0cd3
--- /dev/null
+++ b/QuakeEd/QuakeEd.iconheader
@@ -0,0 +1,2 @@
+F QuakeEd.app QuakeEd app
+F QuakeEd QuakeEd app
diff --git a/QuakeEd/QuakeEd.m b/QuakeEd/QuakeEd.m
new file mode 100644
index 0000000..f8037d1
--- /dev/null
+++ b/QuakeEd/QuakeEd.m
@@ -0,0 +1,1026 @@
+
+#import "qedefs.h"
+
+id quakeed_i;
+id entclasses_i;
+
+id g_cmd_out_i;
+
+BOOL autodirty;
+BOOL filter_light, filter_path, filter_entities;
+BOOL filter_clip_brushes, filter_water_brushes, filter_world;
+
+BOOL running;
+
+int bsppid;
+
+#if 0
+// example command strings
+
+char *fullviscmd = "rsh satan \"/LocalApps/qbsp $1 $2 ; /LocalApps/light $2 ; /LocalApps/vis $2\"";
+char *fastviscmd = "rsh satan \"/LocalApps/qbsp $1 $2 ; /LocalApps/light $2 ; /LocalApps/vis -fast $2\"";
+char *noviscmd = "rsh satan \"/LocalApps/qbsp $1 $2 ; /LocalApps/light $2\"";
+char *relightcmd = "rsh satan \"/LocalApps/light $2\"";
+char *leakcmd = "rsh satan \"/LocalApps/qbsp -mark -notjunc $1 $2\"";
+#endif
+
+void NopSound (void)
+{
+ NXBeep ();
+}
+
+UserPath *upath;
+
+
+void My_Malloc_Error (int code)
+{
+// recursive toast Error ("Malloc error: %i\n", code);
+ write (1, "malloc error!\n", strlen("malloc error!\n")+1);
+}
+
+/*
+===============
+AutoSave
+
+Every five minutes, save a modified map
+===============
+*/
+void AutoSave(DPSTimedEntry tag, double now, void *userData)
+{
+// automatic backup
+ if (autodirty)
+ {
+ autodirty = NO;
+ [map_i writeMapFile: FN_AUTOSAVE useRegion: NO];
+ }
+ [map_i writeStats];
+}
+
+
+void DisplayCmdOutput (void)
+{
+ char *buffer;
+
+ LoadFile (FN_CMDOUT, (void **)&buffer);
+ unlink (FN_CMDOUT);
+ [project_i addToOutput:buffer];
+ free (buffer);
+
+ if ([preferences_i getShowBSP])
+ [inspcontrol_i changeInspectorTo:i_output];
+
+ [preferences_i playBspSound];
+
+ NXPing ();
+}
+
+/*
+===============
+CheckCmdDone
+
+See if the BSP is done
+===============
+*/
+DPSTimedEntry cmdte;
+void CheckCmdDone(DPSTimedEntry tag, double now, void *userData)
+{
+ union wait statusp;
+ struct rusage rusage;
+
+ if (!wait4(bsppid, &statusp, WNOHANG, &rusage))
+ return;
+ DisplayCmdOutput ();
+ bsppid = 0;
+ DPSRemoveTimedEntry( cmdte );
+}
+
+//============================================================================
+
+@implementation QuakeEd
+
+/*
+===============
+init
+===============
+*/
+- initContent:(const NXRect *)contentRect
+style:(int)aStyle
+backing:(int)backingType
+buttonMask:(int)mask
+defer:(BOOL)flag
+{
+ [super initContent:contentRect
+ style:aStyle
+ backing:backingType
+ buttonMask:mask
+ defer:flag];
+
+ [self addToEventMask:
+ NX_RMOUSEDRAGGEDMASK|NX_LMOUSEDRAGGEDMASK];
+
+ malloc_error(My_Malloc_Error);
+
+ quakeed_i = self;
+ dirty = autodirty = NO;
+
+ DPSAddTimedEntry(5*60, AutoSave, self, NX_BASETHRESHOLD);
+
+ upath = newUserPath ();
+
+ return self;
+}
+
+- setDefaultFilename
+{
+ strcpy (filename, FN_TEMPSAVE);
+ [self setTitleAsFilename:filename];
+
+ return self;
+}
+
+
+- (BOOL)dirty
+{
+ return dirty;
+}
+
+/*
+===============================================================================
+
+ DISPLAY UPDATING (handles both camera and XYView)
+
+===============================================================================
+*/
+
+BOOL updateinflight;
+
+BOOL clearinstance;
+
+BOOL updatexy;
+BOOL updatez;
+BOOL updatecamera;
+
+void postappdefined (void)
+{
+ NXEvent ev;
+
+ if (updateinflight)
+ return;
+
+// post an event at the end of the que
+ ev.type = NX_APPDEFINED;
+ if (DPSPostEvent(&ev, 0) == -1)
+ printf ("WARNING: DPSPostEvent: full\n");
+//printf ("posted\n");
+ updateinflight = YES;
+}
+
+
+int c_updateall;
+- updateAll // when a model has been changed
+{
+ updatecamera = updatexy = updatez = YES;
+ c_updateall++;
+ postappdefined ();
+ return self;
+}
+
+- updateAll:sender
+{
+ [self updateAll];
+ return self;
+}
+
+- updateCamera // when the camera has moved
+{
+ updatecamera = YES;
+ clearinstance = YES;
+
+ postappdefined ();
+ return self;
+}
+
+- updateXY
+{
+ updatexy = YES;
+ postappdefined ();
+ return self;
+}
+
+- updateZ
+{
+ updatez = YES;
+ postappdefined ();
+ return self;
+}
+
+
+- newinstance
+{
+ clearinstance = YES;
+ return self;
+}
+
+- redrawInstance
+{
+ clearinstance = YES;
+ [self flushWindow];
+ return self;
+}
+
+/*
+===============
+flushWindow
+
+instance draw the brush after each flush
+===============
+*/
+-flushWindow
+{
+ [super flushWindow];
+
+ if (!running || in_error)
+ return self; // don't lock focus before nib is finished loading
+
+ if (_flushDisabled)
+ return self;
+
+ [cameraview_i lockFocus];
+ if (clearinstance)
+ {
+ PSnewinstance ();
+ clearinstance = NO;
+ }
+
+ PSsetinstance (1);
+ linestart (0,0,0);
+ [map_i makeSelectedPerform: @selector(CameraDrawSelf)];
+ [clipper_i cameraDrawSelf];
+ lineflush ();
+ PSsetinstance (0);
+ [cameraview_i unlockFocus];
+
+ [xyview_i lockFocus];
+ PSsetinstance (1);
+ linestart (0,0,0);
+ [map_i makeSelectedPerform: @selector(XYDrawSelf)];
+ lineflush ();
+ [cameraview_i XYDrawSelf];
+ [zview_i XYDrawSelf];
+ [clipper_i XYDrawSelf];
+ PSsetinstance (0);
+ [xyview_i unlockFocus];
+
+ [zview_i lockFocus];
+ PSsetinstance (1);
+ [map_i makeSelectedPerform: @selector(ZDrawSelf)];
+ [cameraview_i ZDrawSelf];
+ [clipper_i ZDrawSelf];
+ PSsetinstance (0);
+ [zview_i unlockFocus];
+
+ return self;
+}
+
+
+/*
+==============================================================================
+
+App delegate methods
+
+==============================================================================
+*/
+
+- applicationDefined:(NXEvent *)theEvent
+{
+ NXEvent ev, *evp;
+
+ updateinflight = NO;
+
+//printf ("serviced\n");
+
+// update screen
+ evp = [NXApp peekNextEvent:-1 into:&ev];
+ if (evp)
+ {
+ postappdefined();
+ return self;
+ }
+
+
+ [self disableFlushWindow];
+
+ if ([map_i count] != [entitycount_i intValue])
+ [entitycount_i setIntValue: [map_i count]];
+ if ([[map_i currentEntity] count] != [brushcount_i intValue])
+ [brushcount_i setIntValue: [[map_i currentEntity] count]];
+
+ if (updatecamera)
+ [cameraview_i display];
+ if (updatexy)
+ [xyview_i display];
+ if (updatez)
+ [zview_i display];
+
+ updatecamera = updatexy = updatez = NO;
+
+ [self reenableFlushWindow];
+ [self flushWindow];
+
+// NXPing ();
+
+ return self;
+}
+
+- appDidInit:sender
+{
+ NXScreen const *screens;
+ int screencount;
+
+ running = YES;
+ g_cmd_out_i = cmd_out_i; // for qprintf
+
+ [preferences_i readDefaults];
+ [project_i initProject];
+
+ [xyview_i setModeRadio: xy_drawmode_i]; // because xy view is inside
+ // scrollview and can't be
+ // connected directly in IB
+
+ [self setFrameAutosaveName:"EditorWinFrame"];
+ [self clear: self];
+
+// go to my second monitor
+ [NXApp getScreens:&screens count:&screencount];
+ if (screencount == 2)
+ [self moveTopLeftTo:0 : screens[1].screenBounds.size.height
+ screen:screens+1];
+
+ [self makeKeyAndOrderFront: self];
+
+//[self doOpen: "/raid/quake/id1_/maps/amlev1.map"]; // DEBUG
+ [map_i newMap];
+
+ qprintf ("ready.");
+
+//malloc_debug(-1); // DEBUG
+
+ return self;
+}
+
+- appWillTerminate:sender
+{
+// FIXME: save dialog if dirty
+ return self;
+}
+
+
+//===========================================================================
+
+- textCommand: sender
+{
+ char const *t;
+
+ t = [sender stringValue];
+
+ if (!strcmp (t, "texname"))
+ {
+ texturedef_t *td;
+ id b;
+
+ b = [map_i selectedBrush];
+ if (!b)
+ {
+ qprintf ("nothing selected");
+ return self;
+ }
+ td = [b texturedef];
+ qprintf (td->texture);
+ return self;
+ }
+ else
+ qprintf ("Unknown command\n");
+ return self;
+}
+
+
+- openProject:sender
+{
+ [project_i openProject];
+ return self;
+}
+
+
+- clear: sender
+{
+ [map_i newMap];
+
+ [self updateAll];
+ [regionbutton_i setIntValue: 0];
+ [self setDefaultFilename];
+
+ return self;
+}
+
+
+- centerCamera: sender
+{
+ NXRect sbounds;
+
+ [[xyview_i superview] getBounds: &sbounds];
+
+ sbounds.origin.x += sbounds.size.width/2;
+ sbounds.origin.y += sbounds.size.height/2;
+
+ [cameraview_i setXYOrigin: &sbounds.origin];
+ [self updateAll];
+
+ return self;
+}
+
+- centerZChecker: sender
+{
+ NXRect sbounds;
+
+ [[xyview_i superview] getBounds: &sbounds];
+
+ sbounds.origin.x += sbounds.size.width/2;
+ sbounds.origin.y += sbounds.size.height/2;
+
+ [zview_i setPoint: &sbounds.origin];
+ [self updateAll];
+
+ return self;
+}
+
+- changeXYLookUp: sender
+{
+ if ([sender intValue])
+ {
+ xy_viewnormal[2] = 1;
+ }
+ else
+ {
+ xy_viewnormal[2] = -1;
+ }
+ [self updateAll];
+ return self;
+}
+
+/*
+==============================================================================
+
+REGION MODIFICATION
+
+==============================================================================
+*/
+
+
+/*
+==================
+applyRegion:
+==================
+*/
+- applyRegion: sender
+{
+ filter_clip_brushes = [filter_clip_i intValue];
+ filter_water_brushes = [filter_water_i intValue];
+ filter_light = [filter_light_i intValue];
+ filter_path = [filter_path_i intValue];
+ filter_entities = [filter_entities_i intValue];
+ filter_world = [filter_world_i intValue];
+
+ if (![regionbutton_i intValue])
+ {
+ region_min[0] = region_min[1] = region_min[2] = -9999;
+ region_max[0] = region_max[1] = region_max[2] = 9999;
+ }
+
+ [map_i makeGlobalPerform: @selector(newRegion)];
+
+ [self updateAll];
+
+ return self;
+}
+
+- setBrushRegion: sender
+{
+ id b;
+
+// get the bounds of the current selection
+
+ if ([map_i numSelected] != 1)
+ {
+ qprintf ("must have a single brush selected");
+ return self;
+ }
+
+ b = [map_i selectedBrush];
+ [b getMins: region_min maxs: region_max];
+ [b remove];
+
+// turn region on
+ [regionbutton_i setIntValue: 1];
+ [self applyRegion: self];
+
+ return self;
+}
+
+- setXYRegion: sender
+{
+ NXRect bounds;
+
+// get xy size
+ [[xyview_i superview] getBounds: &bounds];
+
+ region_min[0] = bounds.origin.x;
+ region_min[1] = bounds.origin.y;
+ region_min[2] = -99999;
+ region_max[0] = bounds.origin.x + bounds.size.width;
+ region_max[1] = bounds.origin.y + bounds.size.height;
+ region_max[2] = 99999;
+
+// turn region on
+ [regionbutton_i setIntValue: 1];
+ [self applyRegion: self];
+
+ return self;
+}
+
+//
+// UI querie for other objects
+//
+- (BOOL)showCoordinates
+{
+ return [show_coordinates_i intValue];
+}
+
+- (BOOL)showNames
+{
+ return [show_names_i intValue];
+}
+
+
+/*
+==============================================================================
+
+BSP PROCESSING
+
+==============================================================================
+*/
+
+void ExpandCommand (char *in, char *out, char *src, char *dest)
+{
+ while (*in)
+ {
+ if (in[0] == '$')
+ {
+ if (in[1] == '1')
+ {
+ strcpy (out, src);
+ out += strlen(src);
+ }
+ else if (in[1] == '2')
+ {
+ strcpy (out, dest);
+ out += strlen(dest);
+ }
+ in += 2;
+ continue;
+ }
+ *out++ = *in++;
+ }
+ *out = 0;
+}
+
+
+/*
+=============
+saveBSP
+=============
+*/
+- saveBSP:(char *)cmdline dialog:(BOOL)wt
+{
+ char expandedcmd[1024];
+ char mappath[1024];
+ char bsppath[1024];
+ int oldLightFilter;
+ int oldPathFilter;
+ char *destdir;
+
+ if (bsppid)
+ {
+ NXBeep();
+ return self;
+ }
+
+//
+// turn off the filters so all entities get saved
+//
+ oldLightFilter = [filter_light_i intValue];
+ oldPathFilter = [filter_path_i intValue];
+ [filter_light_i setIntValue:0];
+ [filter_path_i setIntValue:0];
+ [self applyRegion: self];
+
+ if ([regionbutton_i intValue])
+ {
+ strcpy (mappath, filename);
+ StripExtension (mappath);
+ strcat (mappath, ".reg");
+ [map_i writeMapFile: mappath useRegion: YES];
+ wt = YES; // allways pop the dialog on region ops
+ }
+ else
+ strcpy (mappath, filename);
+
+// save the entire thing, just in case there is a problem
+ [self save: self];
+
+ [filter_light_i setIntValue:oldLightFilter];
+ [filter_path_i setIntValue:oldPathFilter];
+ [self applyRegion: self];
+
+//
+// write the command to the bsp host
+//
+ destdir = [project_i getFinalMapDirectory];
+
+ strcpy (bsppath, destdir);
+ strcat (bsppath, "/");
+ ExtractFileBase (mappath, bsppath + strlen(bsppath));
+ strcat (bsppath, ".bsp");
+
+ ExpandCommand (cmdline, expandedcmd, mappath, bsppath);
+
+ strcat (expandedcmd, " > ");
+ strcat (expandedcmd, FN_CMDOUT);
+ strcat (expandedcmd, "\n");
+ printf ("system: %s", expandedcmd);
+
+ [project_i addToOutput: "\n\n========= BUSY =========\n\n"];
+ [project_i addToOutput: expandedcmd];
+
+ if ([preferences_i getShowBSP])
+ [inspcontrol_i changeInspectorTo:i_output];
+
+ if (wt)
+ {
+ id panel;
+
+ panel = NXGetAlertPanel("BSP In Progress",expandedcmd,NULL,NULL,NULL);
+ [panel makeKeyAndOrderFront:NULL];
+ system(expandedcmd);
+ NXFreeAlertPanel(panel);
+ [self makeKeyAndOrderFront:NULL];
+ DisplayCmdOutput ();
+ }
+ else
+ {
+ cmdte = DPSAddTimedEntry(1, CheckCmdDone, self, NX_BASETHRESHOLD);
+ if (! (bsppid = fork ()) )
+ {
+ system (expandedcmd);
+ exit (0);
+ }
+ }
+
+ return self;
+}
+
+
+- BSP_Full: sender
+{
+ [self saveBSP:[project_i getFullVisCmd] dialog: NO];
+ return self;
+}
+
+- BSP_FastVis: sender
+{
+ [self saveBSP:[project_i getFastVisCmd] dialog: NO];
+ return self;
+}
+
+- BSP_NoVis: sender
+{
+ [self saveBSP:[project_i getNoVisCmd] dialog: NO];
+ return self;
+}
+
+- BSP_relight: sender
+{
+ [self saveBSP:[project_i getRelightCmd] dialog: NO];
+ return self;
+}
+
+- BSP_entities: sender
+{
+ [self saveBSP:[project_i getEntitiesCmd] dialog: NO];
+ return self;
+}
+
+- BSP_stop: sender
+{
+ if (!bsppid)
+ {
+ NXBeep();
+ return self;
+ }
+
+ kill (bsppid, 9);
+ CheckCmdDone (cmdte, 0, NULL);
+ [project_i addToOutput: "\n\n========= STOPPED =========\n\n"];
+
+ return self;
+}
+
+
+
+/*
+==============
+doOpen:
+
+Called by open or the project panel
+==============
+*/
+- doOpen: (char *)fname;
+{
+ strcpy (filename, fname);
+
+ [map_i readMapFile:filename];
+
+ [regionbutton_i setIntValue: 0];
+ [self setTitleAsFilename:fname];
+ [self updateAll];
+
+ qprintf ("%s loaded\n", fname);
+
+ return self;
+}
+
+
+/*
+==============
+open
+==============
+*/
+- open: sender;
+{
+ id openpanel;
+ static char *suffixlist[] = {"map", 0};
+
+ openpanel = [OpenPanel new];
+
+ if ( [openpanel
+ runModalForDirectory: [project_i getMapDirectory]
+ file: ""
+ types: suffixlist] != NX_OKTAG)
+ return self;
+
+ [self doOpen: (char *)[openpanel filename]];
+
+ return self;
+}
+
+
+/*
+==============
+save:
+==============
+*/
+- save: sender;
+{
+ char backup[1024];
+
+// force a name change if using tempname
+ if (!strcmp (filename, FN_TEMPSAVE) )
+ return [self saveAs: self];
+
+ dirty = autodirty = NO;
+
+ strcpy (backup, filename);
+ StripExtension (backup);
+ strcat (backup, ".bak");
+ rename (filename, backup); // copy old to .bak
+
+ [map_i writeMapFile: filename useRegion: NO];
+
+ return self;
+}
+
+
+/*
+==============
+saveAs
+==============
+*/
+- saveAs: sender;
+{
+ id panel_i;
+ char dir[1024];
+
+ panel_i = [SavePanel new];
+ ExtractFileBase (filename, dir);
+ [panel_i setRequiredFileType: "map"];
+ if ( [panel_i runModalForDirectory:[project_i getMapDirectory] file: dir] != NX_OKTAG)
+ return self;
+
+ strcpy (filename, [panel_i filename]);
+
+ [self setTitleAsFilename:filename];
+
+ [self save: self];
+
+ return self;
+}
+
+
+/*
+===============================================================================
+
+ OTHER METHODS
+
+===============================================================================
+*/
+
+
+//
+// AJR - added this for Project info
+//
+- (char *)currentFilename
+{
+ return filename;
+}
+
+- deselect: sender
+{
+ if ([clipper_i hide]) // first click hides clipper only
+ return [self updateAll];
+
+ [map_i setCurrentEntity: [map_i objectAt: 0]]; // make world selected
+ [map_i makeSelectedPerform: @selector(deselect)];
+ [self updateAll];
+
+ return self;
+}
+
+
+/*
+===============
+keyDown
+===============
+*/
+
+#define KEY_RIGHTARROW 0xae
+#define KEY_LEFTARROW 0xac
+#define KEY_UPARROW 0xad
+#define KEY_DOWNARROW 0xaf
+
+- keyDown:(NXEvent *)theEvent
+{
+ int ch;
+
+// function keys
+ switch (theEvent->data.key.keyCode)
+ {
+ case 60: // F2
+ [cameraview_i setDrawMode: dr_wire];
+ qprintf ("wire draw mode");
+ return self;
+ case 61: // F3
+ [cameraview_i setDrawMode: dr_flat];
+ qprintf ("flat draw mode");
+ return self;
+ case 62: // F4
+ [cameraview_i setDrawMode: dr_texture];
+ qprintf ("texture draw mode");
+ return self;
+
+ case 63: // F5
+ [xyview_i setDrawMode: dr_wire];
+ qprintf ("wire draw mode");
+ return self;
+ case 64: // F6
+ qprintf ("texture draw mode");
+ return self;
+
+ case 66: // F8
+ [cameraview_i homeView: self];
+ return self;
+
+ case 88: // F12
+ [map_i subtractSelection: self];
+ return self;
+
+ case 106: // page up
+ [cameraview_i upFloor: self];
+ return self;
+
+ case 107: // page down
+ [cameraview_i downFloor: self];
+ return self;
+
+ case 109: // end
+ [self deselect: self];
+ return self;
+ }
+
+// portable things
+ ch = tolower(theEvent->data.key.charCode);
+
+ switch (ch)
+ {
+ case KEY_RIGHTARROW:
+ case KEY_LEFTARROW:
+ case KEY_UPARROW:
+ case KEY_DOWNARROW:
+ case 'a':
+ case 'z':
+ case 'd':
+ case 'c':
+ case '.':
+ case ',':
+ [cameraview_i _keyDown: theEvent];
+ break;
+
+ case 27: // escape
+ autodirty = dirty = YES;
+ [self deselect: self];
+ return self;
+
+ case 127: // delete
+ autodirty = dirty = YES;
+ [map_i makeSelectedPerform: @selector(remove)];
+ [clipper_i hide];
+ [self updateAll];
+ break;
+
+ case '/':
+ [clipper_i flipNormal];
+ [self updateAll];
+ break;
+
+ case 13: // enter
+ [clipper_i carve];
+ [self updateAll];
+ qprintf ("carved brush");
+ break;
+
+ case ' ':
+ [map_i cloneSelection: self];
+ break;
+
+
+//
+// move selection keys
+//
+ case '2':
+ VectorCopy (vec3_origin, sb_translate);
+ sb_translate[1] = -[xyview_i gridsize];
+ [map_i makeSelectedPerform: @selector(translate)];
+ [self updateAll];
+ break;
+ case '8':
+ VectorCopy (vec3_origin, sb_translate);
+ sb_translate[1] = [xyview_i gridsize];
+ [map_i makeSelectedPerform: @selector(translate)];
+ [self updateAll];
+ break;
+
+ case '4':
+ VectorCopy (vec3_origin, sb_translate);
+ sb_translate[0] = -[xyview_i gridsize];
+ [map_i makeSelectedPerform: @selector(translate)];
+ [self updateAll];
+ break;
+ case '6':
+ VectorCopy (vec3_origin, sb_translate);
+ sb_translate[0] = [xyview_i gridsize];
+ [map_i makeSelectedPerform: @selector(translate)];
+ [self updateAll];
+ break;
+
+ case '-':
+ VectorCopy (vec3_origin, sb_translate);
+ sb_translate[2] = -[xyview_i gridsize];
+ [map_i makeSelectedPerform: @selector(translate)];
+ [self updateAll];
+ break;
+ case '+':
+ VectorCopy (vec3_origin, sb_translate);
+ sb_translate[2] = [xyview_i gridsize];
+ [map_i makeSelectedPerform: @selector(translate)];
+ [self updateAll];
+ break;
+
+ default:
+ qprintf ("undefined keypress");
+ NopSound ();
+ break;
+ }
+
+ return self;
+}
+
+
+@end
diff --git a/QuakeEd/QuakeEd_main.m b/QuakeEd/QuakeEd_main.m
new file mode 100644
index 0000000..b8d4077
--- /dev/null
+++ b/QuakeEd/QuakeEd_main.m
@@ -0,0 +1,15 @@
+/* Generated by the NeXT Project Builder
+ NOTE: Do NOT change this file -- Project Builder maintains it.
+*/
+
+#import <appkit/appkit.h>
+
+void main(int argc, char *argv[]) {
+
+ [Application new];
+ if ([NXApp loadNibSection:"QuakeEd.nib" owner:NXApp withNames:NO])
+ [NXApp run];
+
+ [NXApp free];
+ exit(0);
+}
diff --git a/QuakeEd/README b/QuakeEd/README
new file mode 100644
index 0000000..0e5e91e
--- /dev/null
+++ b/QuakeEd/README
@@ -0,0 +1,33 @@
+
+5/18/96
+
+This is a dump of the current source code for QuakeEd, our map editing application.
+
+This does not include everything necessary to build maps. There are graphics files, prog files, and other utilities needed. I plan on releasing a full development set of tools after the game ships. This is just intended to help out anyone working on their own map editor.
+
+This is a NEXTSTEP application, so hardly anyone is going to be able to use the code as is. This is not an OPENSTEP application. It doesn't even use the foundation kit, so porting to gnustep or openstep-solaris/mach/nt would not be trivial.
+
+There are lots of mixed case and >8 character filenames, so I'm using unix gnutar (compressed) format.
+
+Because most people won't have access to a NEXTSTEP machine, I took pictures of some of the more important stuff from interface builder:
+
+mainwindow.tiff : a screenshot of the primary window
+inspectors.tiff : a screenshot of the important inspector views
+help.txt : a dump of the (minimal) help inspector's contents.
+
+I included some sample data to help you follow the code:
+
+quake.qpr : our current project file
+jrbase1.map : a sample map
+triggers.qc : a sample qc source file that includes some /*QUAKED comments
+
+There will not be any major changes to this code base. I am eagerly looking forward to writing a brand new editor for windows NT + open GL as soon as Quake ships.
+
+This application was really not a very good fit for NEXTSTEP. The display postscript model fundamentally doesn't fit very well with what we need here -- if you run in an 8 bit color mode, the line drawing runs at an ok speed, but the texture view goes half the speed it should as it dithers from 24 bit color down to 8 bit. If you run in 24 bit color mode, you get less screen real estate and significantly slower line drawing as a 3 megabyte XY view is flushed. Sigh. If anyone does actually run this on NEXTSTEP be advised that you want a fast machine. I never had the time to properly optimize QuakeEd.
+
+The texture view rendering code in here is crap. Anyone coding a new editor is strongly advised to just use an available optimized library, like open GL or direct 3D.
+
+
+John Carmack
+Id Software
+johnc@idsoftware.com
diff --git a/QuakeEd/SetBrush.h b/QuakeEd/SetBrush.h
new file mode 100644
index 0000000..44e0de5
--- /dev/null
+++ b/QuakeEd/SetBrush.h
@@ -0,0 +1,158 @@
+
+
+#define MAX_FACES 16
+
+typedef float vec5_t[5];
+
+typedef struct
+{
+ int numpoints;
+ vec5_t points[8]; // variable sized
+} winding_t;
+
+#define MAX_POINTS_ON_WINDING 64
+
+typedef struct
+{
+ vec3_t normal;
+ float dist;
+} plane_t;
+
+typedef struct
+{
+// implicit rep
+ vec3_t planepts[3];
+ texturedef_t texture;
+
+// cached rep
+ plane_t plane;
+ qtexture_t *qtexture;
+ float light; // 0 - 1.0
+ winding_t *w;
+} face_t;
+
+#define ON_EPSILON 0.1
+#define FP_EPSILON 0.01
+#define VECTOR_EPSILON 0.0001
+
+#define SIDE_FRONT 0
+#define SIDE_BACK 1
+#define SIDE_ON 2
+
+
+winding_t *ClipWinding (winding_t *in, plane_t *split);
+winding_t *CopyWinding (winding_t *w);
+winding_t *NewWinding (int points);
+
+
+@interface SetBrush : Object
+{
+ BOOL regioned; // not active
+ BOOL selected;
+
+ BOOL invalid; // not a proper polyhedron
+
+ id parent; // the entity this brush is in
+ vec3_t bmins, bmaxs;
+ vec3_t entitycolor;
+ int numfaces;
+ face_t faces[MAX_FACES];
+}
+
+- initOwner: own mins:(float *)mins maxs:(float *)maxs texture:(texturedef_t *)tex;
+- initFromTokens: own;
+- setMins:(float *)mins maxs:(float *)maxs;
+
+- parent;
+- setParent: (id)p;
+
+- setEntityColor: (vec3_t)color;
+
+- calcWindings;
+
+- writeToFILE: (FILE *)f region: (BOOL)reg;
+
+- (BOOL)selected;
+- (BOOL)regioned;
+- setSelected: (BOOL)s;
+- setRegioned: (BOOL)s;
+
+- getMins: (vec3_t)mins maxs: (vec3_t)maxs;
+
+- (BOOL)containsPoint: (vec3_t)pt;
+
+- freeWindings;
+- removeIfInvalid;
+
+extern vec3_t region_min, region_max;
+- newRegion;
+
+- (texturedef_t *)texturedef;
+- (texturedef_t *)texturedefForFace: (int)f;
+- setTexturedef: (texturedef_t *)tex;
+- setTexturedef: (texturedef_t *)tex forFace:(int)f;
+
+- XYDrawSelf;
+- ZDrawSelf;
+- CameraDrawSelf;
+- XYRenderSelf;
+- CameraRenderSelf;
+
+- hitByRay: (vec3_t)p1 : (vec3_t) p2 : (float *)time : (int *)face;
+
+//
+// single brush actions
+//
+extern int numcontrolpoints;
+extern float *controlpoints[MAX_FACES*3];
+- getZdragface: (vec3_t)dragpoint;
+- getXYdragface: (vec3_t)dragpoint;
+- getXYShearPoints: (vec3_t)dragpoint;
+
+- addFace: (face_t *)f;
+
+//
+// multiple brush actions
+//
+- carveByClipper;
+
+extern vec3_t sb_translate;
+- translate;
+
+extern id carve_in, carve_out;
+- select;
+- deselect;
+- remove;
+- flushTextures;
+
+extern vec3_t sb_mins, sb_maxs;
+- addToBBox;
+
+extern vec3_t sel_x, sel_y, sel_z;
+extern vec3_t sel_org;
+- transform;
+
+- flipNormals;
+
+- carve;
+- setCarveVars;
+
+extern id sb_newowner;
+- moveToEntity;
+
+- takeCurrentTexture;
+
+extern vec3_t select_min, select_max;
+- selectPartial;
+- selectComplete;
+- regionPartial;
+- regionComplete;
+
+extern float sb_floor_dir, sb_floor_dist;
+- feetToFloor;
+
+- (int) getNumBrushFaces;
+- (face_t *)getBrushFace: (int)which;
+
+@end
+
diff --git a/QuakeEd/SetBrush.m b/QuakeEd/SetBrush.m
new file mode 100644
index 0000000..855cb78
--- /dev/null
+++ b/QuakeEd/SetBrush.m
@@ -0,0 +1,2034 @@
+#import "qedefs.h"
+
+@implementation SetBrush
+
+/*
+==================
+textureAxisFromPlane
+==================
+*/
+#if 1
+vec3_t baseaxis[18] =
+{
+{0,0,1}, {1,0,0}, {0,-1,0}, // floor
+{0,0,-1}, {1,0,0}, {0,-1,0}, // ceiling
+{1,0,0}, {0,1,0}, {0,0,-1}, // west wall
+{-1,0,0}, {0,1,0}, {0,0,-1}, // east wall
+{0,1,0}, {1,0,0}, {0,0,-1}, // south wall
+{0,-1,0}, {1,0,0}, {0,0,-1} // north wall
+};
+#else
+vec3_t baseaxis[18] =
+{
+{0,0,1}, {1,0,0}, {0,-1,0}, // floor
+{0,0,-1}, {1,0,0}, {0,1,0}, // ceiling
+{1,0,0}, {0,1,0}, {0,0,-1}, // west wall
+{-1,0,0}, {0,-1,0}, {0,0,-1}, // east wall
+{0,1,0}, {-1,0,0}, {0,0,-1}, // south wall
+{0,-1,0}, {1,0,0}, {0,0,-1} // north wall
+};
+#endif
+
+
+float TextureAxisFromPlane(plane_t *pln, float *xv, float *yv)
+{
+ int bestaxis;
+ float dot,best;
+ int i;
+
+ best = 0;
+ bestaxis = 0;
+
+ for (i=0 ; i<6 ; i++)
+ {
+ dot = DotProduct (pln->normal, baseaxis[i*3]);
+ if (dot > best)
+ {
+ best = dot;
+ bestaxis = i;
+ }
+ }
+
+ VectorCopy (baseaxis[bestaxis*3+1], xv);
+ VectorCopy (baseaxis[bestaxis*3+2], yv);
+
+ return lightaxis[bestaxis>>1];
+}
+
+#define BOGUS_RANGE 18000
+
+/*
+=================
+CheckFace
+
+Note: this will not catch 0 area polygons
+=================
+*/
+void CheckFace (face_t *f)
+{
+ int i, j;
+ float *p1, *p2;
+ float d, edgedist;
+ vec3_t dir, edgenormal;
+ winding_t *w;
+
+ w = f->w;
+ if (!w)
+ Error ("CheckFace: no winding");
+
+ if (w->numpoints < 3)
+ Error ("CheckFace: %i points",w->numpoints);
+
+ for (i=0 ; i<w->numpoints ; i++)
+ {
+ p1 = w->points[i];
+
+ for (j=0 ; j<3 ; j++)
+ if (p1[j] > BOGUS_RANGE || p1[j] < -BOGUS_RANGE)
+ Error ("CheckFace: BUGUS_RANGE: %f",p1[j]);
+
+ j = i+1 == w->numpoints ? 0 : i+1;
+
+ // check the point is on the face plane
+ d = DotProduct (p1, f->plane.normal) - f->plane.dist;
+ if (d < -ON_EPSILON || d > ON_EPSILON)
+ Error ("CheckFace: point off plane");
+
+ // check the edge isn't degenerate
+ p2 = w->points[j];
+ VectorSubtract (p2, p1, dir);
+
+ if (VectorLength (dir) < ON_EPSILON)
+ Error ("CheckFace: degenerate edge");
+
+ CrossProduct (f->plane.normal, dir, edgenormal);
+ VectorNormalize (edgenormal);
+ edgedist = DotProduct (p1, edgenormal);
+ edgedist += ON_EPSILON;
+
+ // all other points must be on front side
+ for (j=0 ; j<w->numpoints ; j++)
+ {
+ if (j == i)
+ continue;
+ d = DotProduct (w->points[j], edgenormal);
+ if (d > edgedist)
+ Error ("CheckFace: non-convex");
+ }
+ }
+}
+
+
+/*
+=============================================================================
+
+ TURN PLANES INTO GROUPS OF FACES
+
+=============================================================================
+*/
+
+
+/*
+==================
+NewWinding
+==================
+*/
+winding_t *NewWinding (int points)
+{
+ winding_t *w;
+ int size;
+
+ if (points > MAX_POINTS_ON_WINDING)
+ Error ("NewWinding: %i points", points);
+
+ size = (int)((winding_t *)0)->points[points];
+ w = malloc (size);
+ memset (w, 0, size);
+
+ return w;
+}
+
+
+/*
+==================
+CopyWinding
+==================
+*/
+winding_t *CopyWinding (winding_t *w)
+{
+ int size;
+ winding_t *c;
+
+ size = (int)((winding_t *)0)->points[w->numpoints];
+ c = malloc (size);
+ memcpy (c, w, size);
+ return c;
+}
+
+
+/*
+==================
+ClipWinding
+
+Clips the winding to the plane, returning the new winding on the positive side
+Frees the input winding.
+==================
+*/
+winding_t *ClipWinding (winding_t *in, plane_t *split)
+{
+ float dists[MAX_POINTS_ON_WINDING];
+ int sides[MAX_POINTS_ON_WINDING];
+ int counts[3];
+ float dot;
+ int i, j;
+ float *p1, *p2, *mid;
+ winding_t *neww;
+ int maxpts;
+
+ counts[0] = counts[1] = counts[2] = 0;
+
+// determine sides for each point
+ for (i=0 ; i<in->numpoints ; i++)
+ {
+ dot = DotProduct (in->points[i], split->normal);
+ dot -= split->dist;
+ dists[i] = dot;
+ if (dot > ON_EPSILON)
+ sides[i] = SIDE_FRONT;
+ else if (dot < -ON_EPSILON)
+ sides[i] = SIDE_BACK;
+ else
+ {
+ sides[i] = SIDE_ON;
+ }
+ counts[sides[i]]++;
+ }
+ sides[i] = sides[0];
+ dists[i] = dists[0];
+
+ if (!counts[0] && !counts[1])
+ return in;
+
+ if (!counts[0])
+ {
+ free (in);
+ return NULL;
+ }
+ if (!counts[1])
+ return in;
+
+ maxpts = in->numpoints+4; // can't use counts[0]+2 because
+ // of fp grouping errors
+ neww = NewWinding (maxpts);
+
+ for (i=0 ; i<in->numpoints ; i++)
+ {
+ p1 = in->points[i];
+
+ mid = neww->points[neww->numpoints];
+
+ if (sides[i] == SIDE_FRONT || sides[i] == SIDE_ON)
+ {
+ VectorCopy (p1, mid);
+ mid[3] = p1[3];
+ mid[4] = p1[4];
+ neww->numpoints++;
+ if (sides[i] == SIDE_ON)
+ continue;
+ mid = neww->points[neww->numpoints];
+ }
+
+ if (sides[i+1] == SIDE_ON || sides[i+1] == sides[i])
+ continue;
+
+ // generate a split point
+ if (i == in->numpoints - 1)
+ p2 = in->points[0];
+ else
+ p2 = p1 + 5;
+
+ neww->numpoints++;
+
+ dot = dists[i] / (dists[i]-dists[i+1]);
+ for (j=0 ; j<3 ; j++)
+ { // avoid round off error when possible
+ if (split->normal[j] == 1)
+ mid[j] = split->dist;
+ else if (split->normal[j] == -1)
+ mid[j] = -split->dist;
+ mid[j] = p1[j] + dot*(p2[j]-p1[j]);
+ }
+ mid[3] = p1[3] + dot*(p2[3]-p1[3]);
+ mid[4] = p1[4] + dot*(p2[4]-p1[4]);
+ }
+
+ if (neww->numpoints > maxpts)
+ Error ("ClipWinding: points exceeded estimate");
+
+// free the original winding
+ free (in);
+
+ return neww;
+}
+
+/*
+=================
+BasePolyForPlane
+
+There has GOT to be a better way of doing this...
+=================
+*/
+winding_t *BasePolyForPlane (face_t *f)
+{
+ int i, x;
+ float max, v;
+ vec3_t org, vright, vup;
+ vec3_t xaxis, yaxis;
+ winding_t *w;
+ texturedef_t *td;
+ plane_t *p;
+ float ang, sinv, cosv;
+ float s, t, ns, nt;
+
+ p = &f->plane;
+
+// find the major axis
+
+ max = -BOGUS_RANGE;
+ x = -1;
+ for (i=0 ; i<3; i++)
+ {
+ v = fabs(p->normal[i]);
+ if (v > max)
+ {
+ x = i;
+ max = v;
+ }
+ }
+ if (x==-1)
+ Error ("BasePolyForPlane: no axis found");
+
+ VectorCopy (vec3_origin, vup);
+ switch (x)
+ {
+ case 0:
+ case 1:
+ vup[2] = 1;
+ break;
+ case 2:
+ vup[0] = 1;
+ break;
+ }
+
+ v = DotProduct (vup, p->normal);
+ VectorMA (vup, -v, p->normal, vup);
+ VectorNormalize (vup);
+
+ VectorScale (p->normal, p->dist, org);
+
+ CrossProduct (vup, p->normal, vright);
+
+ VectorScale (vup, 8192, vup);
+ VectorScale (vright, 8192, vright);
+
+// project a really big axis aligned box onto the plane
+ w = NewWinding (4);
+ w->numpoints = 4;
+
+ VectorSubtract (org, vright, w->points[0]);
+ VectorAdd (w->points[0], vup, w->points[0]);
+
+ VectorAdd (org, vright, w->points[1]);
+ VectorAdd (w->points[1], vup, w->points[1]);
+
+ VectorAdd (org, vright, w->points[2]);
+ VectorSubtract (w->points[2], vup, w->points[2]);
+
+ VectorSubtract (org, vright, w->points[3]);
+ VectorSubtract (w->points[3], vup, w->points[3]);
+
+// set texture values
+ f->light = TextureAxisFromPlane(&f->plane, xaxis, yaxis);
+ td = &f->texture;
+
+// rotate axis
+ ang = td->rotate / 180 * M_PI;
+ sinv = sin(ang);
+ cosv = cos(ang);
+
+ if (!td->scale[0])
+ td->scale[0] = 1;
+ if (!td->scale[1])
+ td->scale[1] = 1;
+
+ for (i=0 ; i<4 ; i++)
+ {
+ s = DotProduct (w->points[i], xaxis);
+ t = DotProduct (w->points[i], yaxis);
+
+ ns = cosv * s - sinv * t;
+ nt = sinv * s + cosv * t;
+
+ w->points[i][3] = ns/td->scale[0] + td->shift[0];
+ w->points[i][4] = nt/td->scale[1] + td->shift[1];
+ }
+
+ return w;
+}
+
+/*
+===========
+calcWindings
+
+recalc the faces and mins / maxs from the planes
+If a face has a NULL winding, it is an overconstraining plane and
+can be removed.
+===========
+*/
+- calcWindings
+{
+ int i,j, k;
+ float v;
+ face_t *f;
+ winding_t *w;
+ plane_t plane;
+ vec3_t t1, t2, t3;
+ BOOL useplane[MAX_FACES];
+
+ bmins[0] = bmins[1] = bmins[2] = 99999;
+ bmaxs[0] = bmaxs[1] = bmaxs[2] = -99999;
+ invalid = NO;
+
+ [self freeWindings];
+
+ for (i=0 ; i<MAX_FACES ; i++)
+ {
+ f = &faces[i];
+
+ // calc a plane from the points
+ for (j=0 ; j<3 ; j++)
+ {
+ t1[j] = f->planepts[0][j] - f->planepts[1][j];
+ t2[j] = f->planepts[2][j] - f->planepts[1][j];
+ t3[j] = f->planepts[1][j];
+ }
+
+ CrossProduct(t1,t2, f->plane.normal);
+ if (VectorCompare (f->plane.normal, vec3_origin))
+ {
+ useplane[i] = NO;
+ break;
+ }
+ VectorNormalize (f->plane.normal);
+ f->plane.dist = DotProduct (t3, f->plane.normal);
+
+ // if the plane duplicates another plane, ignore it
+ // (assume it is a brush being edited that will be fixed)
+ useplane[i] = YES;
+ for (j=0 ; j< i ; j++)
+ {
+ if ( f->plane.normal[0] == faces[j].plane.normal[0]
+ && f->plane.normal[1] == faces[j].plane.normal[1]
+ && f->plane.normal[2] == faces[j].plane.normal[2]
+ && f->plane.dist == faces[j].plane.dist )
+ {
+ useplane[i] = NO;
+ break;
+ }
+ }
+
+ }
+
+ for (i=0 ; i<numfaces ; i++)
+ {
+ if (!useplane[i])
+ continue; // duplicate plane
+
+ f = &faces[i];
+
+ w = BasePolyForPlane (f);
+ for (j=0 ; j<numfaces && w ; j++)
+ {
+ if (j == i)
+ continue;
+
+ // flip the plane, because we want to keep the back side
+ VectorSubtract (vec3_origin, faces[j].plane.normal, plane.normal);
+ plane.dist = -faces[j].plane.dist;
+
+ w = ClipWinding (w, &plane);
+ }
+ f->w = w;
+ if (w)
+ {
+ CheckFace (f);
+ for (j=0 ; j<w->numpoints ; j++)
+ {
+ for (k=0 ; k<3 ; k++)
+ {
+ v = w->points[j][k];
+ if (fabs(v - rint(v)) < FP_EPSILON)
+ v = w->points[j][k] = rint(v);
+ if (v < bmins[k])
+ bmins[k] = v;
+ if (v > bmaxs[k])
+ bmaxs[k] = v;
+ }
+ }
+ }
+ }
+
+ if (bmins[0] == 99999)
+ {
+ invalid = YES;
+ VectorCopy (vec3_origin, bmins);
+ VectorCopy (vec3_origin, bmaxs);
+ return nil;
+ }
+
+ return self;
+}
+
+//============================================================================
+
+/*
+===========
+initOwner:::
+===========
+*/
+- initOwner: own mins:(float *)mins maxs:(float *)maxs texture:(texturedef_t *)tex
+{
+ [super init];
+
+ parent = own;
+
+ [self setTexturedef: tex];
+ [self setMins: mins maxs: maxs];
+ return self;
+}
+
+- setMins:(float *)mins maxs:(float *)maxs
+{
+ int i, j;
+ vec3_t pts[4][2];
+
+ for (i=0 ; i<3 ; i++)
+ {
+ if (maxs[i] - mins[i] <= 0)
+ {
+ VectorCopy (mins, bmins);
+ VectorCopy (maxs, bmaxs);
+ invalid = YES;
+ numfaces = 0;
+ return self;
+ }
+ }
+
+ pts[0][0][0] = mins[0];
+ pts[0][0][1] = mins[1];
+
+ pts[1][0][0] = mins[0];
+ pts[1][0][1] = maxs[1];
+
+ pts[2][0][0] = maxs[0];
+ pts[2][0][1] = maxs[1];
+
+ pts[3][0][0] = maxs[0];
+ pts[3][0][1] = mins[1];
+
+ for (i=0 ; i<4 ; i++)
+ {
+ pts[i][0][2] = mins[2];
+ pts[i][1][0] = pts[i][0][0];
+ pts[i][1][1] = pts[i][0][1];
+ pts[i][1][2] = maxs[2];
+ }
+
+ numfaces = 6;
+ for (i=0 ; i<4 ; i++)
+ {
+ j = (i+1)%4;
+ faces[i].planepts[0][0] = pts[j][1][0];
+ faces[i].planepts[0][1] = pts[j][1][1];
+ faces[i].planepts[0][2] = pts[j][1][2];
+
+ faces[i].planepts[1][0] = pts[i][1][0];
+ faces[i].planepts[1][1] = pts[i][1][1];
+ faces[i].planepts[1][2] = pts[i][1][2];
+
+ faces[i].planepts[2][0] = pts[i][0][0];
+ faces[i].planepts[2][1] = pts[i][0][1];
+ faces[i].planepts[2][2] = pts[i][0][2];
+ }
+
+ faces[4].planepts[0][0] = pts[0][1][0];
+ faces[4].planepts[0][1] = pts[0][1][1];
+ faces[4].planepts[0][2] = pts[0][1][2];
+
+ faces[4].planepts[1][0] = pts[1][1][0];
+ faces[4].planepts[1][1] = pts[1][1][1];
+ faces[4].planepts[1][2] = pts[1][1][2];
+
+ faces[4].planepts[2][0] = pts[2][1][0];
+ faces[4].planepts[2][1] = pts[2][1][1];
+ faces[4].planepts[2][2] = pts[2][1][2];
+
+
+ faces[5].planepts[0][0] = pts[2][0][0];
+ faces[5].planepts[0][1] = pts[2][0][1];
+ faces[5].planepts[0][2] = pts[2][0][2];
+
+ faces[5].planepts[1][0] = pts[1][0][0];
+ faces[5].planepts[1][1] = pts[1][0][1];
+ faces[5].planepts[1][2] = pts[1][0][2];
+
+ faces[5].planepts[2][0] = pts[0][0][0];
+ faces[5].planepts[2][1] = pts[0][0][1];
+ faces[5].planepts[2][2] = pts[0][0][2];
+
+
+ [self calcWindings];
+ return self;
+}
+
+- parent
+{
+ return parent;
+}
+
+- setParent: (id)p
+{
+ parent = p;
+ return self;
+}
+
+- setEntityColor: (vec3_t)color
+{
+ VectorCopy (color, entitycolor);
+ return self;
+}
+
+- freeWindings
+{
+ int i;
+
+ for (i=0 ; i<MAX_FACES ; i++)
+ if (faces[i].w)
+ {
+ free (faces[i].w);
+ faces[i].w = NULL;
+ }
+ return self;
+}
+
+- copyFromZone:(NXZone *)zone
+{
+ id new;
+
+ [self freeWindings];
+ new = [super copyFromZone: zone];
+
+ [self calcWindings];
+ [new calcWindings];
+
+ return new;
+}
+
+- free
+{
+ [self freeWindings];
+ return [super free];
+}
+
+/*
+===========
+initOwner: fromTokens
+===========
+*/
+int numsb;
+- initFromTokens: own
+{
+ face_t *f;
+ int i,j;
+
+ [self init];
+
+ parent = own;
+
+ f = faces;
+ numfaces = 0;
+ do
+ {
+ if (!GetToken (true))
+ break;
+ if (!strcmp (token, "}") )
+ break;
+
+ for (i=0 ; i<3 ; i++)
+ {
+ if (i != 0)
+ GetToken (true);
+ if (strcmp (token, "(") )
+ Error ("parsing map file");
+
+ for (j=0 ; j<3 ; j++)
+ {
+ GetToken (false);
+ f->planepts[i][j] = atoi(token);
+ }
+
+ GetToken (false);
+ if (strcmp (token, ")") )
+ Error ("parsing map file");
+ }
+
+ GetToken (false);
+ strcpy (f->texture.texture, token);
+ GetToken (false);
+ f->texture.shift[0] = atof(token);
+ GetToken (false);
+ f->texture.shift[1] = atof(token);
+ GetToken (false);
+ f->texture.rotate = atof(token);
+ GetToken (false);
+ f->texture.scale[0] = atof(token);
+ GetToken (false);
+ f->texture.scale[1] = atof(token);
+
+#if 0
+ flags = atoi(token);
+
+ flags &= 7;
+
+ f->texture.rotate = 0;
+ f->texture.scale[0] = 1;
+ f->texture.scale[1] = 1;
+
+#define TEX_FLIPAXIS 1
+#define TEX_FLIPS 2
+#define TEX_FLIPT 4
+
+ if (flags & TEX_FLIPAXIS)
+ {
+ f->texture.rotate = 90;
+ if ( !(flags & TEX_FLIPT) )
+ f->texture.scale[0] = -1;
+ if (flags & TEX_FLIPS)
+ f->texture.scale[1] = -1;
+ }
+ else
+ {
+ if (flags & TEX_FLIPS)
+ f->texture.scale[0] = -1;
+ if (flags & TEX_FLIPT)
+ f->texture.scale[1] = -1;
+ }
+#endif
+ f++;
+ numfaces++;
+ } while (1);
+
+ numsb++;
+
+ [self calcWindings];
+
+ return self;
+}
+
+/*
+===========
+writeToFILE
+===========
+*/
+- writeToFILE: (FILE *)f region: (BOOL)reg
+{
+ int i,j;
+ face_t *fa;
+ texturedef_t *td;
+
+
+ if (reg && regioned)
+ return self;
+
+ fprintf (f, "{\n");
+ for (i=0 ; i<numfaces ; i++)
+ {
+ fa = &faces[i];
+ for (j=0 ; j<3 ; j++)
+ fprintf (f,"( %d %d %d ) ", (int)fa->planepts[j][0], (int)fa->planepts[j][1], (int)fa->planepts[j][2]);
+ td = &fa->texture;
+ fprintf (f,"%s %d %d %d %f %f\n", td->texture, (int)td->shift[0], (int)td->shift[1], (int)td->rotate, td->scale[0], td->scale[1]);
+ }
+ fprintf (f, "}\n");
+
+ return self;
+}
+
+
+
+/*
+==============================================================================
+
+INTERACTION
+
+==============================================================================
+*/
+
+- getMins: (vec3_t)mins maxs: (vec3_t)maxs
+{
+ VectorCopy (bmins, mins);
+ VectorCopy (bmaxs, maxs);
+ return self;
+}
+
+
+- (BOOL)selected
+{
+ return selected;
+}
+
+- setSelected: (BOOL)s
+{
+ selected = s;
+ return self;
+}
+
+- (BOOL)regioned
+{
+ return regioned;
+}
+
+- setRegioned: (BOOL)s
+{
+ regioned = s;
+ return self;
+}
+
+
+/*
+===========
+setTexturedef
+===========
+*/
+- setTexturedef: (texturedef_t *)tex
+{
+ int i;
+
+ for (i=0 ; i<MAX_FACES ; i++)
+ {
+ faces[i].texture = *tex;
+ faces[i].qtexture = NULL; // recache next render
+ }
+
+ [self calcWindings]; // in case texture coords changed
+ return self;
+}
+
+- setTexturedef: (texturedef_t *)tex forFace:(int)f
+{
+ if ( (unsigned)f > numfaces)
+ Error ("setTexturedef:forFace: bad face number %i",f);
+
+ faces[f].texture = *tex;
+ faces[f].qtexture = NULL; // recache next render
+
+ [self calcWindings]; // in case texture coords changed
+ return self;
+}
+
+/*
+===========
+texturedef
+===========
+*/
+- (texturedef_t *)texturedef
+{
+ return &faces[0].texture;
+}
+
+- (texturedef_t *)texturedefForFace: (int)f
+{
+ return &faces[f].texture;
+}
+
+
+/*
+===========
+removeIfInvalid
+
+So created veneers don't stay around
+===========
+*/
+- removeIfInvalid
+{
+ int i, j;
+
+ for (i=0 ; i<numfaces ; i++)
+ {
+ if (faces[i].w)
+ continue;
+ for (j=i+1 ; j<numfaces ; j++)
+ faces[j-1] = faces[j];
+ i--;
+ numfaces--;
+ }
+ for ( ; i<MAX_FACES ; i++)
+ faces[i].w = NULL;
+
+ if (numfaces<4)
+ {
+ invalid = YES;
+ [self remove];
+ return nil;
+ }
+ return self;
+}
+
+/*
+===========
+containsPoint
+
+===========
+*/
+- (BOOL)containsPoint: (vec3_t)pt
+{
+ int i;
+
+ for (i=0 ; i<numfaces ; i++)
+ if (DotProduct (faces[i].plane.normal, pt) >= faces[i].plane.dist)
+ return NO;
+ return YES;
+}
+
+/*
+===========
+clipRay
+
+===========
+*/
+- clipRay: (vec3_t)p1 : (vec3_t) p2
+ :(vec3_t)frontpoint : (int *)f_face
+ :(vec3_t)backpoint : (int *)b_face
+{
+ int frontface, backface;
+ int i, j;
+ face_t *f;
+ float d1, d2, m;
+ float *start;
+
+ start = p1;
+
+ frontface = -2;
+ backface = -2;
+
+ f = faces;
+ for (i=0 ; i<numfaces ; i++, f++)
+ {
+ if (!f->w)
+ continue; // clipped off plane
+ d1 = DotProduct (p1, f->plane.normal) - f->plane.dist;
+ d2 = DotProduct (p2, f->plane.normal) - f->plane.dist;
+ if (d1 >= 0 && d2 >= 0)
+ { // the entire ray is in front of the polytope
+ *f_face = -1;
+ *b_face = -1;
+ return self;
+ }
+ if (d1 > 0 && d2 < 0)
+ { // new front plane
+ frontface = i;
+ m = d1 / (d1-d2);
+ for (j=0 ; j<3 ; j++)
+ frontpoint[j] = p1[j] + m*(p2[j]-p1[j]);
+ p1 = frontpoint;
+ }
+ if (d1 < 0 && d2 > 0)
+ { // new back plane
+ backface = i;
+ m = d1 / (d1-d2);
+ for (j=0 ; j<3 ; j++)
+ backpoint[j] = p1[j] + m*(p2[j]-p1[j]);
+ p2 = backpoint;
+ }
+ }
+
+ *f_face = frontface;
+ *b_face = backface;
+
+ return self;
+}
+
+
+/*
+===========
+hitByRay
+
+===========
+*/
+- hitByRay: (vec3_t)p1 : (vec3_t) p2 : (float *)time : (int *)face
+{
+ vec3_t frontpoint, backpoint, dir;
+ int frontface, backface;
+
+ if (regioned)
+ {
+ *time = -1;
+ *face = -1;
+ return self;
+ }
+
+ [self clipRay: p1 : p2 : frontpoint: &frontface : backpoint : &backface];
+
+ if (frontface == -2 && backface == -2)
+ { // entire ray is inside the brush, select first face
+ *time = 0;
+ *face = 0;
+ return self;
+ }
+
+
+ if (frontface < 0)
+ { // ray started inside the polytope, don't select it
+ *time = -1;
+ *face = -1;
+ return self;
+ }
+
+ VectorSubtract (p2, p1, dir);
+ VectorNormalize (dir);
+ VectorSubtract (frontpoint, p1, frontpoint);
+ *time = DotProduct (frontpoint, dir);
+
+ if (*time < 0)
+ Error ("hitByRay: negative t");
+
+ *face = frontface;
+
+ return self;
+}
+
+
+/*
+==============================================================================
+
+DRAWING ROUTINES
+
+==============================================================================
+*/
+
+BOOL fakebrush;
+
+- drawConnections
+{
+ id obj;
+ int c, i;
+ vec3_t dest, origin;
+ vec3_t mid;
+ vec3_t forward, right;
+ char *targname;
+ vec3_t min, max, temp;
+ char targ[64];
+
+ strcpy (targ, [parent valueForQKey: "target"]);
+
+ if (!targ || !targ[0])
+ return self;
+
+ origin[0] = (bmins[0] + bmaxs[0]) /2;
+ origin[1] = (bmins[1] + bmaxs[1]) /2;
+
+ c = [map_i count];
+ for (i=0 ; i<c ; i++)
+ {
+ obj = [map_i objectAt: i];
+ targname = [obj valueForQKey: "targetname"];
+ if (strcmp (targ, targname))
+ continue;
+
+ [[obj objectAt:0] getMins: min maxs: max];
+ dest[0] = (min[0] + max[0]) /2;
+ dest[1] = (min[1] + max[1]) /2;
+
+ XYmoveto (origin);
+ XYlineto (dest);
+
+ forward[0] = dest[0] - origin[0];
+ forward[1] = dest[1] - origin[1];
+ forward[2] = 0;
+
+ if (!forward[0] && !forward[1])
+ continue;
+
+ VectorNormalize (forward);
+ forward[0] = 8*forward[0];
+ forward[1] = 8*forward[1];
+ right[0] = forward[1];
+ right[1] = -forward[0];
+
+ mid[0] = (dest[0] + origin[0])/2;
+ mid[1] = (dest[1] + origin[1])/2;
+
+ temp[0] = mid[0] + right[0] - forward[0];
+ temp[1] = mid[1] + right[1] - forward[1];
+ XYmoveto (temp);
+ XYlineto (mid);
+ temp[0] = mid[0] - right[0] - forward[0];
+ temp[1] = mid[1] - right[1] - forward[1];
+ XYlineto (temp);
+
+ }
+
+ return self;
+}
+
+- (BOOL)fakeBrush: (SEL)call
+{
+ id copy;
+ face_t face;
+
+ if (!selected || fakebrush)
+ return NO;
+
+ if (![clipper_i getFace: &face])
+ return NO;
+
+ fakebrush = YES;
+ copy = [self copy];
+ copy = [copy addFace: &face];
+ if (copy)
+ {
+ [copy perform:call];
+ [copy free];
+ }
+ fakebrush = NO;
+ return YES;
+}
+
+/*
+===========
+XYDrawSelf
+===========
+*/
+- XYDrawSelf
+{
+ int i, j;
+ winding_t *w;
+ vec3_t mid, end, s1, s2;
+ char *val;
+ float ang;
+ id worldent, currentent;
+ BOOL keybrush;
+
+ if ([self fakeBrush: @selector(XYDrawSelf)])
+ return self;
+
+ [xyview_i addToScrollRange: bmins[0] : bmins[1]];
+ [xyview_i addToScrollRange: bmaxs[0] : bmaxs[1]];
+
+ worldent = [map_i objectAt: 0];
+ currentent = [map_i currentEntity];
+
+ if (parent != worldent && self == [parent objectAt: 0])
+ keybrush = YES;
+ else
+ keybrush = NO;
+
+ if (parent != worldent && worldent == currentent)
+ linecolor (entitycolor[0], entitycolor[1], entitycolor[2]);
+ else if (selected)
+ linecolor (1,0,0); // selected
+ else if (parent == currentent)
+ linecolor (0,0,0); // unselected, but in same entity
+ else
+ linecolor (0,0.5,0); // other entity green
+
+ if (keybrush)
+ [self drawConnections]; // target line
+
+ if (!selected &&
+ ( bmaxs[0] < xy_draw_rect.origin.x
+ || bmaxs[1] < xy_draw_rect.origin.y
+ || bmins[0] > xy_draw_rect.origin.x + xy_draw_rect.size.width
+ || bmins[1] > xy_draw_rect.origin.y + xy_draw_rect.size.height) )
+ return self; // off view, don't bother
+
+ for (i=0 ; i<numfaces ; i++)
+ {
+ w = faces[i].w;
+ if (!w)
+ continue;
+ if (DotProduct (faces[i].plane.normal,xy_viewnormal) > -VECTOR_EPSILON)
+ continue;
+
+ XYmoveto (w->points[w->numpoints-1]);
+ for (j=0 ; j<w->numpoints ; j++)
+ XYlineto (w->points[j]);
+ }
+
+ if (keybrush)
+ {
+// angle arrow
+ val = [parent valueForQKey: "angle"];
+ if (val && val[0])
+ {
+ ang = atof(val) * M_PI / 180;
+ if (ang > 0) // negative values are up/down flags
+ {
+ mid[0] = (bmins[0]+bmaxs[0])/2;
+ mid[1] = (bmins[1]+bmaxs[1])/2;
+
+ end[0] = mid[0] + 16*cos(ang);
+ end[1] = mid[1] + 16*sin(ang);
+
+ s1[0] = mid[0] + 12*cos(ang+0.4);
+ s1[1] = mid[1] + 12*sin(ang+0.4);
+
+ s2[0] = mid[0] + 12*cos(ang-0.4);
+ s2[1] = mid[1] + 12*sin(ang-0.4);
+
+ XYmoveto ( mid);
+ XYlineto ( end );
+ XYmoveto ( s1);
+ XYlineto ( end );
+ XYlineto ( s2 );
+ }
+ }
+ }
+
+ return self;
+}
+
+/*
+===========
+ZDrawSelf
+===========
+*/
+- ZDrawSelf
+{
+ int i;
+ vec3_t p1, p2;
+ vec3_t frontpoint, backpoint;
+ int frontface, backface;
+ qtexture_t *q;
+
+ if ([self fakeBrush: @selector(ZDrawSelf)])
+ return self;
+
+ [zview_i addToHeightRange: bmins[2]];
+ [zview_i addToHeightRange: bmaxs[2]];
+
+ if (selected)
+ {
+ PSmoveto (1, bmaxs[2]);
+ PSlineto (23, bmaxs[2]);
+ PSlineto (23, bmins[2]);
+ PSlineto (1, bmins[2]);
+ PSlineto (1, bmaxs[2]);
+ PSsetrgbcolor (1,0,0);
+ PSstroke ();
+ }
+
+ [zview_i getPoint: (NXPoint *)p1];
+
+ for (i=0 ; i<2 ; i++)
+ if (bmins[i] >= p1[i] || bmaxs[i] <= p1[i])
+ return self;
+
+ p1[2] = 4096;
+ p2[0] = p1[0];
+ p2[1] = p1[1];
+ p2[2] = -4096;
+
+ [self clipRay: p1 : p2 : frontpoint: &frontface : backpoint : &backface];
+
+ if (frontface == -1 || backface == -1)
+ return self;
+
+ q = TEX_ForName (faces[frontface].texture.texture);
+
+ PSmoveto (-8, frontpoint[2]);
+ PSlineto (8, frontpoint[2]);
+ PSlineto (8, backpoint[2]);
+ PSlineto (-8, backpoint[2]);
+ PSlineto (-8, frontpoint[2]);
+
+ PSsetrgbcolor (q->flatcolor.chan[0]/255.0
+ , q->flatcolor.chan[1]/255.0
+ , q->flatcolor.chan[2]/255.0);
+ PSfill ();
+
+ PSmoveto (-12, frontpoint[2]);
+ PSlineto (12, frontpoint[2]);
+ PSlineto (12, backpoint[2]);
+ PSlineto (-12, backpoint[2]);
+ PSlineto (-12, frontpoint[2]);
+
+ PSsetrgbcolor (0,0,0);
+ PSstroke ();
+
+ return self;
+}
+
+/*
+===========
+CameraDrawSelf
+===========
+*/
+- CameraDrawSelf
+{
+ int i, j;
+ winding_t *w;
+ id worldent, currentent;
+
+ if ([self fakeBrush: @selector(CameraDrawSelf)])
+ return self;
+
+ worldent = [map_i objectAt: 0];
+ currentent = [map_i currentEntity];
+
+ if (parent != worldent && worldent == currentent)
+ linecolor (entitycolor[0], entitycolor[1], entitycolor[2]);
+ else if (selected)
+ linecolor (1,0,0);
+ else if (parent == [map_i currentEntity])
+ linecolor (0,0,0);
+ else
+ linecolor (0,0.5,0);
+
+ for (i=0 ; i<numfaces ; i++)
+ {
+ w = faces[i].w;
+ if (!w)
+ continue;
+ CameraMoveto (w->points[w->numpoints-1]);
+ for (j=0 ; j<w->numpoints ; j++)
+ CameraLineto (w->points[j]);
+ }
+ return self;
+}
+
+
+/*
+===========
+XYRenderSelf
+===========
+*/
+- XYRenderSelf
+{
+ int i;
+
+ if ([self fakeBrush: @selector(XYRenderSelf)])
+ return self;
+
+ for (i=0 ; i<numfaces ; i++)
+ REN_DrawXYFace (&faces[i]);
+
+ return self;
+}
+
+/*
+===========
+CameraRenderSelf
+===========
+*/
+- CameraRenderSelf
+{
+ int i;
+ BOOL olddraw;
+ extern qtexture_t badtex;
+ pixel32_t p;
+
+ if ([self fakeBrush: @selector(CameraRenderSelf)])
+ return self;
+// hack to draw entity boxes as single flat color
+ if ( ![parent modifiable] )
+ {
+ olddraw = r_drawflat;
+ r_drawflat = YES;
+
+ p = badtex.flatcolor;
+
+ badtex.flatcolor.chan[0] = entitycolor[0]*255;
+ badtex.flatcolor.chan[1] = entitycolor[1]*255;
+ badtex.flatcolor.chan[2] = entitycolor[2]*255;
+
+ for (i=0 ; i<numfaces ; i++)
+ REN_DrawCameraFace (&faces[i]);
+
+ badtex.flatcolor = p;
+ r_drawflat = olddraw;
+ }
+ else
+ {
+ for (i=0 ; i<numfaces ; i++)
+ REN_DrawCameraFace (&faces[i]);
+ }
+
+ return self;
+}
+
+/*
+==============================================================================
+
+SINGLE BRUSH ACTIONS
+
+==============================================================================
+*/
+
+face_t *dragface, *dragface2;
+
+int numcontrolpoints;
+float *controlpoints[MAX_FACES*3];
+
+- (BOOL)checkModifiable
+{
+// int i;
+
+ if ( [parent modifiable] )
+ return YES;
+
+// don't stretch spawned entities, move all points
+#if 0
+ numcontrolpoints = numfaces*3;
+
+ for (i=0 ; i<numcontrolpoints ; i++)
+ controlpoints[i] = faces[i/3].planepts[i%3];
+#endif
+ return NO;
+}
+
+- getZdragface: (vec3_t)dragpoint
+{
+ int i, j;
+ float d;
+
+
+ if (![self checkModifiable])
+ return self;
+
+ numcontrolpoints = 0;
+
+ for (i=0 ; i<numfaces ; i++)
+ {
+ if (!faces[i].w)
+ continue;
+ if (faces[i].plane.normal[2] == 1)
+ d = dragpoint[2] - faces[i].plane.dist;
+ else if (faces[i].plane.normal[2] == -1)
+ d = -faces[i].plane.dist - dragpoint[2];
+ else
+ continue;
+
+ if (d <= 0)
+ continue;
+
+ for (j=0 ; j<3 ; j++)
+ {
+ controlpoints[numcontrolpoints] = faces[i].planepts[j];
+ numcontrolpoints++;
+ }
+ }
+
+ return self;
+}
+
+- getXYdragface: (vec3_t)dragpoint
+{
+ int i,j;
+ float d;
+
+ numcontrolpoints = 0;
+
+ if (![self checkModifiable])
+ return self;
+
+ for (i=0 ; i<numfaces ; i++)
+ {
+ if (!faces[i].w)
+ continue;
+ if (faces[i].plane.normal[2])
+ continue;
+
+ d = DotProduct(faces[i].plane.normal, dragpoint) - faces[i].plane.dist;
+ if (d <= 0)
+ continue;
+
+ for (j=0 ; j<3 ; j++)
+ {
+ controlpoints[numcontrolpoints] = faces[i].planepts[j];
+ numcontrolpoints++;
+ }
+ }
+
+ return self;
+}
+
+- getXYShearPoints: (vec3_t)dragpoint
+{
+ int i,j, k;
+ int facectl;
+ float d;
+ int numdragplanes;
+ BOOL dragplane[MAX_FACES];
+ winding_t *w;
+ face_t *f;
+ BOOL onplane[MAX_POINTS_ON_WINDING];
+
+
+ if (![self checkModifiable])
+ return self;
+
+ numcontrolpoints = 0;
+ numdragplanes = 0;
+ for (i=0 ; i<numfaces ; i++)
+ {
+ dragplane[i] = NO;
+ if (!faces[i].w)
+ continue;
+// if (faces[i].plane.normal[2])
+// continue;
+
+ d = DotProduct(faces[i].plane.normal, dragpoint) - faces[i].plane.dist;
+ if (d <= -ON_EPSILON)
+ continue;
+
+ dragplane[i] = YES;
+ numdragplanes++;
+ }
+
+// find faces that just share an edge with a drag plane
+ for (i=0 ; i<numfaces ; i++)
+ {
+ f = &faces[i];
+ w = f->w;
+ if (!w)
+ continue;
+ if (dragplane[i] && numdragplanes == 1)
+ {
+ for (j=0 ; j<3 ; j++)
+ {
+ controlpoints[numcontrolpoints] = faces[i].planepts[j];
+ numcontrolpoints++;
+ }
+ continue;
+ }
+ if (!dragplane[i] && numdragplanes > 1)
+ continue;
+
+ facectl = 0;
+ for (j=0 ; j<w->numpoints ; j++)
+ {
+ onplane[j] = NO;
+ for (k=0 ; k<numfaces ; k++)
+ {
+ if (!dragplane[k])
+ continue;
+ if (k == i)
+ continue;
+ d = DotProduct (w->points[j], faces[k].plane.normal)
+ - faces[k].plane.dist;
+ if (fabs(d) > ON_EPSILON)
+ continue;
+ onplane[j] = YES;
+ facectl++;
+ break;
+ }
+ }
+ if (facectl == 0)
+ continue;
+
+ // find one or two static points to go with the controlpoints
+ // and change the plane points
+ k = 0;
+ for (j=0 ; j<w->numpoints ; j++)
+ {
+ if (!onplane[j])
+ continue;
+ if (facectl >= 2 && !onplane[(j+1)%w->numpoints])
+ continue;
+ if (facectl == 3 && !onplane[(j+2)%w->numpoints])
+ continue;
+
+ VectorCopy (w->points[j], f->planepts[k]);
+ controlpoints[numcontrolpoints] = f->planepts[k];
+ numcontrolpoints++;
+ k++;
+
+ if (facectl >= 2)
+ {
+ VectorCopy (w->points[(j+1)%w->numpoints], f->planepts[k]);
+ controlpoints[numcontrolpoints] = f->planepts[k];
+ numcontrolpoints++;
+ k++;
+ }
+ if (facectl == 3)
+ {
+ VectorCopy (w->points[(j+2)%w->numpoints], f->planepts[k]);
+ controlpoints[numcontrolpoints] = f->planepts[k];
+ numcontrolpoints++;
+ k++;
+ }
+ break;
+ }
+
+ for ( ; j<w->numpoints && k != 3 ; j++)
+ if (!onplane[j])
+ {
+ VectorCopy (w->points[j], f->planepts[k]);
+ k++;
+ }
+
+ for (j=0 ; j<w->numpoints && k != 3 ; j++)
+ if (!onplane[j])
+ {
+ VectorCopy (w->points[j], f->planepts[k]);
+ k++;
+ }
+
+ if (k != 3)
+ {
+// Error ("getXYShearPoints: didn't get three points on plane");
+ numcontrolpoints = 0;
+ return self;
+ }
+
+ for (j=0 ; j<3 ; j++)
+ for (k=0 ; k<3 ; k++)
+ f->planepts[j][k] = rint(f->planepts[j][k]);
+ }
+
+ return self;
+}
+
+/*
+==============================================================================
+
+MULTIPLE BRUSH ACTIONS
+
+==============================================================================
+*/
+
+vec3_t region_min, region_max;
+
+/*
+===========
+newRegion
+
+Set the regioned flag based on if the object is containted in region_min/max
+===========
+*/
+- newRegion
+{
+ int i;
+ char *name;
+
+// filter away entities
+ if (parent != [map_i objectAt: 0])
+ {
+ if (filter_entities)
+ {
+ regioned = YES;
+ return self;
+ }
+
+ name = [parent valueForQKey: "classname"];
+
+ if ( (filter_light && !strncmp(name,"light",5) )
+ || (filter_path && !strncmp(name,"path",4) ) )
+ {
+ regioned = YES;
+ return self;
+ }
+ }
+ else if (filter_world)
+ {
+ regioned = YES;
+ return self;
+ }
+
+ if (filter_clip_brushes && !strcasecmp(faces[0].texture.texture, "clip"))
+ {
+ regioned = YES;
+ return self;
+ }
+
+ if (filter_water_brushes && faces[0].texture.texture[0] == '*')
+ {
+ regioned = YES;
+ return self;
+ }
+
+ for (i=0 ; i<3 ; i++)
+ {
+ if (region_min[i] >= bmaxs[i] || region_max[i] <= bmins[i])
+ {
+ if (selected)
+ [self deselect];
+ regioned = YES;
+ return self;
+ }
+ }
+
+ regioned = NO;
+ return self;
+}
+
+vec3_t select_min, select_max;
+- selectPartial
+{
+ int i;
+ for (i=0 ; i<3 ; i++)
+ if (select_min[i] >= bmaxs[i] || select_max[i] <= bmins[i])
+ return self;
+ selected = YES;
+ return self;
+}
+
+- selectComplete
+{
+ int i;
+ for (i=0 ; i<3 ; i++)
+ if (select_min[i] > bmins[i] || select_max[i] < bmaxs[i])
+ return self;
+ selected = YES;
+ return self;
+}
+
+
+- regionPartial
+{
+ int i;
+ for (i=0 ; i<3 ; i++)
+ if (select_min[i] >= bmaxs[i] || select_max[i] <= bmins[i])
+ return self;
+ selected = YES;
+ return self;
+}
+
+- regionComplete
+{
+ int i;
+ for (i=0 ; i<3 ; i++)
+ if (select_min[i] > bmins[i] || select_max[i] < bmaxs[i])
+ return self;
+ selected = YES;
+ return self;
+}
+
+
+id sb_newowner;
+- moveToEntity
+{
+ id eclass;
+ float *c;
+
+ [parent removeObject: self];
+ parent = sb_newowner;
+
+// hack to allow them to be copied to another map
+ if ( [parent respondsTo:@selector(valueForQKey:)])
+ {
+ eclass = [entity_classes_i classForName: [parent valueForQKey: "classname"]];
+ c = [eclass drawColor];
+ [self setEntityColor: c];
+ }
+
+ [parent addObject: self];
+ return self;
+}
+
+vec3_t sb_translate;
+
+- translate
+{
+ int i, j;
+
+// move the planes
+ for (i=0; i<numfaces ; i++)
+ for (j=0 ; j<3 ; j++)
+ {
+ VectorAdd (faces[i].planepts[j], sb_translate, faces[i].planepts[j]);
+ }
+
+ [self calcWindings];
+
+ return self;
+}
+
+vec3_t sb_mins, sb_maxs;
+- addToBBox
+{
+ int k;
+
+ if (numfaces < 4)
+ return self;
+
+ for (k=0 ; k<3 ; k++)
+ {
+ if (bmins[k] < sb_mins[k])
+ sb_mins[k] = bmins[k];
+ if (bmaxs[k] > sb_maxs[k])
+ sb_maxs[k] = bmaxs[k];
+ }
+
+ return self;
+}
+
+- flushTextures
+{ // call when texture palette changes
+ int i;
+
+ for (i=0 ; i<MAX_FACES ; i++)
+ faces[i].qtexture = NULL;
+
+ [self calcWindings];
+
+ return self;
+}
+
+- select
+{
+ [map_i setCurrentEntity: parent];
+ selected = YES;
+ return self;
+}
+
+- deselect
+{
+ selected = NO;
+
+// the last selected brush determines
+ if (invalid)
+ printf ("WARNING: deselected invalid brush\n");
+ [map_i setCurrentMinZ: bmins[2]];
+ [map_i setCurrentMaxZ: bmaxs[2]];
+
+ return self;
+}
+
+- remove
+{
+// the last selected brush determines
+ if (!invalid)
+ {
+ [map_i setCurrentMinZ: bmins[2]];
+ [map_i setCurrentMaxZ: bmaxs[2]];
+ }
+
+ [parent removeObject: self];
+ [self free];
+
+ return nil;
+}
+
+
+vec3_t sel_x, sel_y, sel_z;
+vec3_t sel_org;
+- transform
+{
+ int i,j;
+ vec3_t old;
+ float *p;
+
+ for (i=0 ; i<numfaces ; i++)
+ for (j=0 ; j<3 ; j++)
+ {
+ p = faces[i].planepts[j];
+ VectorCopy (p, old);
+ VectorSubtract (old, sel_org, old);
+ p[0] = DotProduct (old, sel_x);
+ p[1] = DotProduct (old, sel_y);
+ p[2] = DotProduct (old, sel_z);
+ VectorAdd (p, sel_org, p);
+ }
+
+ [self calcWindings];
+
+ return self;
+}
+
+- flipNormals // used after an inside-out transform (flip x/y/z)
+{
+ int i;
+ vec3_t temp;
+
+ for (i=0 ; i<numfaces ; i++)
+ {
+ VectorCopy (faces[i].planepts[0], temp);
+ VectorCopy (faces[i].planepts[2], faces[i].planepts[0]);
+ VectorCopy (temp, faces[i].planepts[2]);
+ }
+ [self calcWindings];
+ return self;
+}
+
+- carveByClipper
+{
+ face_t face;
+
+ if (![clipper_i getFace: &face])
+ return self;
+
+ [self addFace: &face];
+
+ return self;
+}
+
+
+- takeCurrentTexture
+{
+ texturedef_t td;
+
+ [texturepalette_i getTextureDef: &td];
+ [self setTexturedef: &td];
+
+ return self;
+}
+
+
+float sb_floor_dir, sb_floor_dist;
+- feetToFloor
+{
+ float oldz;
+ vec3_t p1, p2;
+ int frontface, backface;
+ vec3_t frontpoint, backpoint;
+ float dist;
+
+ [cameraview_i getOrigin: p1];
+ VectorCopy (p1, p2);
+ oldz = p1[2] - 48;
+
+ p1[2] = 4096;
+ p2[2] = -4096;
+
+ [self clipRay: p1 : p2 : frontpoint : &frontface : backpoint : &backface];
+ if (frontface == -1)
+ return self;
+
+ dist = frontpoint[2] - oldz;
+
+ if (sb_floor_dir == 1)
+ {
+ if (dist > 0 && dist < sb_floor_dist)
+ sb_floor_dist = dist;
+ }
+ else
+ {
+ if (dist < 0 && dist > sb_floor_dist)
+ sb_floor_dist = dist;
+ }
+ return self;
+}
+
+
+/*
+===============================================================================
+
+BRUSH SUBTRACTION
+
+===============================================================================
+*/
+
+vec3_t carvemin, carvemax;
+int numcarvefaces;
+face_t *carvefaces;
+id carve_in, carve_out;
+
+// returns the new brush formed after the addition of the given plane
+// nil is returned if it faced all of the original setbrush
+- addFace: (face_t *)f
+{
+ if (numfaces == MAX_FACES)
+ Error ("addFace: numfaces == MAX_FACES");
+
+ faces[numfaces] = *f;
+ faces[numfaces].texture = faces[0].texture;
+ faces[numfaces].qtexture = NULL;
+ faces[numfaces].w = NULL;
+ numfaces++;
+ [self calcWindings];
+
+// remove any degenerate faces
+ return [self removeIfInvalid];
+}
+
+- clipByFace: (face_t *)fa front:(id *)f back:(id *)b
+{
+ id front, back;
+ face_t fb;
+ vec3_t temp;
+
+ fb = *fa;
+ VectorCopy (fb.planepts[0], temp);
+ VectorCopy (fb.planepts[2], fb.planepts[0]);
+ VectorCopy (temp, fb.planepts[2]);
+
+ front = [self copy];
+ back = [self copy];
+
+ *b = [back addFace: fa];
+ *f = [front addFace: &fb];
+
+ return self;
+}
+
+- carve
+{
+ int i;
+ id front, back;
+
+#if 0
+ if ( (i = NXMallocCheck()) )
+ Error ("MallocCheck failure");
+#endif
+
+// check bboxes
+ for (i=0 ; i<3 ; i++)
+ if (bmins[i] >= carvemax[i] || bmaxs[i] <= carvemin[i])
+ {
+ [carve_out addObject: self];
+ return self;
+ }
+
+// carve by the planes
+ back = self;
+ for (i=0 ; i<numcarvefaces ; i++)
+ {
+ [back clipByFace: &carvefaces[i] front:&front back:&back];
+ if (front)
+ [carve_out addObject: front];
+ if (!back)
+ return nil; // nothing completely inside
+ }
+
+ [carve_in addObject: back];
+ return self;
+}
+
+/*
+==================
+setCarveVars
+==================
+*/
+- setCarveVars
+{
+ VectorCopy (bmins, carvemin);
+ VectorCopy (bmaxs, carvemax);
+ numcarvefaces = numfaces;
+ carvefaces = faces;
+
+ return self;
+}
+
+- (int) getNumBrushFaces
+{
+ return numfaces;
+}
+
+- (face_t *) getBrushFace: (int)which
+{
+ return &faces[which];
+}
+
+@end
diff --git a/QuakeEd/TexturePalette.h b/QuakeEd/TexturePalette.h
new file mode 100644
index 0000000..e13048b
--- /dev/null
+++ b/QuakeEd/TexturePalette.h
@@ -0,0 +1,113 @@
+
+typedef union
+{
+ byte chan[4];
+ unsigned p;
+} pixel32_t;
+
+
+typedef struct
+{
+ char texture[16];
+ float rotate;
+ float shift[2];
+ float scale[2];
+} texturedef_t;
+
+
+typedef struct
+{
+ char name[16];
+
+ int width;
+ int height;
+ NXBitmapImageRep *rep;
+ void *data;
+ pixel32_t flatcolor;
+} qtexture_t;
+
+#define MAX_TEXTURES 1024
+
+extern int tex_count;
+extern qtexture_t qtextures[MAX_TEXTURES];
+
+void TEX_InitFromWad (char *path);
+qtexture_t *TEX_ForName (char *name);
+
+
+typedef struct
+{
+ id image; // NXImage
+ NXRect r;
+ char *name;
+ int index;
+ int display; // flag (on/off)
+} texpal_t;
+
+#define TEX_INDENT 10
+#define TEX_SPACING 16
+
+extern id texturepalette_i;
+
+@interface TexturePalette:Object
+{
+ char currentwad[1024];
+ id textureList_i;
+ id textureView_i;
+ id searchField_i;
+ id sizeField_i;
+
+ id field_Xshift_i;
+ id field_Yshift_i;
+ id field_Xscale_i;
+ id field_Yscale_i;
+ id field_Rotate_i;
+
+ int viewWidth;
+ int viewHeight;
+ int selectedTexture;
+}
+
+- (char*)currentWad;
+- initPaletteFromWadfile:(char *)wf;
+- computeTextureViewSize;
+- alphabetize;
+- getList;
+- (int)getSelectedTexture;
+- setSelectedTexture:(int)which;
+- (int)getSelectedTexIndex;
+
+// Called externally
+- (char *)getSelTextureName;
+- setTextureByName:(char *)name;
+
+// New methods to replace the 2 above ones
+- setTextureDef:(texturedef_t *)td;
+- getTextureDef:(texturedef_t *)td;
+
+// Action methods
+- searchForTexture:sender;
+
+- clearTexinfo: sender;
+
+- incXShift:sender;
+- decXShift:sender;
+
+- incYShift:sender;
+- decYShift:sender;
+
+- incRotate: sender;
+- decRotate: sender;
+
+- incXScale:sender;
+- decXScale:sender;
+
+- incYScale:sender;
+- decYScale:sender;
+
+- texturedefChanged: sender;
+- onlyShowMapTextures:sender;
+- (int) searchForTextureInPalette:(char *)texture;
+- setDisplayFlag:(int)index to:(int)value;
+
+@end
diff --git a/QuakeEd/TexturePalette.m b/QuakeEd/TexturePalette.m
new file mode 100644
index 0000000..5796583
--- /dev/null
+++ b/QuakeEd/TexturePalette.m
@@ -0,0 +1,818 @@
+
+#import "qedefs.h"
+
+id texturepalette_i;
+
+
+#define TYP_MIPTEX 67
+
+int tex_count;
+qtexture_t qtextures[MAX_TEXTURES];
+
+typedef struct
+{
+ char name[16];
+ unsigned width, height;
+ unsigned offsets[4]; // four mip maps stored
+} miptex_t;
+
+unsigned tex_palette[256];
+
+unsigned badtex_d[] =
+{
+0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+0,0,0,0,0,0,0,0,
+0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+0,0,0,0,0,0,0,0,
+0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+0,0,0,0,0,0,0,0,
+0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+0,0,0,0,0,0,0,0,
+0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+0,0,0,0,0,0,0,0,
+0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+0,0,0,0,0,0,0,0,
+0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+0,0,0,0,0,0,0,0,
+0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+0,0,0,0,0,0,0,0,
+
+0,0,0,0,0,0,0,0,
+0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+0,0,0,0,0,0,0,0,
+0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+0,0,0,0,0,0,0,0,
+0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+0,0,0,0,0,0,0,0,
+0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+0,0,0,0,0,0,0,0,
+0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+0,0,0,0,0,0,0,0,
+0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+0,0,0,0,0,0,0,0,
+0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+0,0,0,0,0,0,0,0,
+0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff
+};
+
+qtexture_t badtex = {"notexture",16,16,NULL, badtex_d, {0,0,255,255}};
+
+/*
+==============
+TEX_InitPalette
+==============
+*/
+void TEX_InitPalette (byte *pal)
+{
+ int r,g,b,v;
+ int i;
+
+ for (i=0 ; i<256 ; i++)
+ {
+ r = pal[0];
+ g = pal[1];
+ b = pal[2];
+ pal += 3;
+
+ v = (r<<24) + (g<<16) + (b<<8) + 255;
+ v = BigLong (v);
+
+ tex_palette[i] = v;
+ }
+}
+
+
+/*
+=================
+TEX_ImageFromMiptex
+=================
+*/
+void TEX_ImageFromMiptex (miptex_t *qtex)
+{
+ NXBitmapImageRep *bm;
+ byte *source;
+ unsigned *dest;
+ int width, height, i, count;
+ qtexture_t *q;
+ int tr, tg, tb;
+
+ width = LittleLong(qtex->width);
+ height = LittleLong(qtex->height);
+
+ bm = [[NXBitmapImageRep alloc]
+ initData: NULL
+ pixelsWide: width
+ pixelsHigh: height
+ bitsPerSample: 8
+ samplesPerPixel:3
+ hasAlpha: NO
+ isPlanar: NO
+ colorSpace: NX_RGBColorSpace
+ bytesPerRow: width*4
+ bitsPerPixel: 32];
+
+ dest = (unsigned *)[bm data];
+ count = width*height;
+ source = (byte *)qtex + LittleLong(qtex->offsets[0]);
+
+ q = &qtextures[tex_count];
+ tex_count++;
+
+ q->width = width;
+ q->height = height;
+ q->rep = bm;
+ q->data = dest;
+
+ tr = tg = tb = 0;
+
+ for (i=0 ; i<count ; i++)
+ {
+ dest[i] = tex_palette[source[i]];
+ tr += ((pixel32_t *)&dest[i])->chan[0];
+ tg += ((pixel32_t *)&dest[i])->chan[1];
+ tb += ((pixel32_t *)&dest[i])->chan[2];
+ }
+
+ q->flatcolor.chan[0] = tr / count;
+ q->flatcolor.chan[1] = tg / count;
+ q->flatcolor.chan[2] = tb / count;
+ q->flatcolor.chan[3] = 0xff;
+}
+
+//=============================================================================
+
+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;
+
+/*
+=================
+TEX_InitFromWad
+=================
+*/
+void TEX_InitFromWad (char *path)
+{
+ int i;
+ char local[1024];
+ char newpath[1024];
+ byte *wadfile;
+ wadinfo_t *wadinfo;
+ lumpinfo_t *lumpinfo;
+ int numlumps;
+ float start, stop;
+
+ start = I_FloatTime ();
+
+ strcpy(newpath, [preferences_i getProjectPath]);
+ strcat(newpath,"/");
+ strcat(newpath, path);
+
+// free any textures
+ for (i=0 ; i<tex_count ; i++)
+ [qtextures[i].rep free];
+ tex_count = 0;
+
+// try and use the cached wadfile
+ sprintf (local, "/qcache%s", newpath);
+
+ Sys_UpdateFile (local, newpath);
+
+ LoadFile (local, (void **)&wadfile);
+ wadinfo = (wadinfo_t *)wadfile;
+
+ if (strncmp (wadfile, "WAD2", 4))
+ {
+ unlink (local);
+ Error ("TEX_InitFromWad: %s isn't a wadfile", newpath);
+ }
+
+ numlumps = LittleLong (wadinfo->numlumps);
+ lumpinfo = (lumpinfo_t *)(wadfile + LittleLong (wadinfo->infotableofs));
+
+ if (strcmp (lumpinfo->name, "PALETTE"))
+ {
+ unlink (local);
+ Error ("TEX_InitFromWad: %s doesn't have palette as 0",path);
+ }
+
+ TEX_InitPalette (wadfile + LittleLong(lumpinfo->filepos));
+
+ lumpinfo++;
+ for (i=1 ; i<numlumps ; i++, lumpinfo++)
+ {
+ if (lumpinfo->type != TYP_MIPTEX)
+ Error ("TEX_InitFromWad: %s is not a miptex!",lumpinfo->name);
+ CleanupName (lumpinfo->name,qtextures[tex_count].name);
+ TEX_ImageFromMiptex ( (miptex_t *)(wadfile +
+ LittleLong(lumpinfo->filepos) ));
+ }
+
+ free (wadfile);
+
+ stop = I_FloatTime ();
+
+ qprintf ("loaded %s (%5.1f)", local, stop - start);
+}
+
+/*
+=================
+TEX_NumForName
+=================
+*/
+qtexture_t *TEX_ForName (char *name)
+{
+ char newname[16];
+ int i;
+ qtexture_t *q;
+
+ CleanupName (name, newname);
+
+ for (i=0,q = qtextures ; i< tex_count ; i++, q++)
+ {
+ if (!strcmp(name, q->name))
+ return q;
+ }
+
+ return &badtex;
+}
+
+
+
+//===========================================================================
+
+@implementation TexturePalette
+
+- init
+{
+ [super init];
+ texturepalette_i = self;
+ selectedTexture = -1;
+ return self;
+}
+
+- display
+{
+ [[textureView_i superview] display];
+ return self;
+}
+
+
+- (char *)currentWad
+{
+ return currentwad;
+}
+
+- initPaletteFromWadfile:(char *)wf
+{
+ int i;
+ texpal_t t;
+ qtexture_t *q;
+
+ strcpy (currentwad, wf);
+ [map_i makeGlobalPerform: @selector(flushTextures)];
+ selectedTexture = -1;
+
+ // Init textures WAD
+ TEX_InitFromWad(wf);
+
+ // Create STORAGE
+ if (textureList_i)
+ [textureList_i empty];
+ else
+ textureList_i = [[Storage alloc]
+ initCount:0
+ elementSize:sizeof(texpal_t)
+ description:NULL];
+
+ // Init STORAGE
+
+ for (i = 0,q=qtextures;i < tex_count; i++,q++)
+ {
+ t.image = q->rep;
+ t.r.size.width = [t.image pixelsWide];
+ if (t.r.size.width < 64)
+ t.r.size.width = 64;
+ t.r.size.height = [t.image pixelsHigh] + TEX_SPACING;
+ t.name = q->name;
+ t.index = i;
+ t.display = 1;
+ [textureList_i addElement:&t];
+ }
+
+ // Calculate size of TextureView
+ [self alphabetize];
+ [self computeTextureViewSize];
+ [textureView_i setParent:self];
+ [self setSelectedTexture:0];
+
+ return self;
+}
+
+
+
+// Return texture STORAGE list
+- getList
+{
+ return textureList_i;
+}
+
+// Alphabetize texture list - reverse order!
+- alphabetize
+{
+ int i;
+ int max;
+ texpal_t *t1p;
+ texpal_t *t2p;
+ texpal_t t1;
+ texpal_t t2;
+ int found;
+
+ max = [textureList_i count];
+ found = 1;
+ while(found)
+ {
+ found = 0;
+ for (i = 0;i < max-1;i++)
+ {
+ t1p = [textureList_i elementAt:i];
+ t2p = [textureList_i elementAt:i+1];
+ if (strcmp(t1p->name,t2p->name) < 0)
+ {
+ t1 = *t1p;
+ t2 = *t2p;
+ [textureList_i replaceElementAt:i with:&t2];
+ [textureList_i replaceElementAt:i+1 with:&t1];
+ found = 1;
+ }
+ }
+ }
+ return self;
+}
+
+- computeTextureViewSize
+{
+ int i;
+ int max;
+ int x;
+ texpal_t *t;
+ int y;
+ id view;
+ NXRect b;
+ int maxwidth;
+ int maxheight;
+ NXPoint pt;
+
+ max = [textureList_i count];
+ y = 0;
+ maxheight = 0;
+ x = TEX_INDENT;
+
+ view = [textureView_i superview];
+ [view getBounds:&b];
+ maxwidth = b.size.width;
+
+ for (i = 0;i < max; i++)
+ {
+ t = [textureList_i elementAt:i];
+ if (x + t->r.size.width + TEX_INDENT > maxwidth)
+ {
+ x = TEX_INDENT;
+ y += maxheight;
+ maxheight = 0;
+ }
+ if (t->r.size.height > maxheight)
+ maxheight = t->r.size.height;
+ t->r.origin.x = x;
+ t->r.origin.y = y;
+ x += t->r.size.width + TEX_INDENT;
+ if (i == max - 1)
+ y += t->r.size.height;
+ }
+
+ viewWidth = maxwidth;
+ viewHeight = y + TEX_SPACING;
+ [textureView_i sizeTo:viewWidth :viewHeight];
+ pt.x = pt.y = 0;
+ [textureView_i scrollPoint:&pt];
+
+ return self;
+}
+
+- windowResized
+{
+ [self computeTextureViewSize];
+ return self;
+}
+
+- texturedefChanged: sender
+{
+ if ([map_i numSelected])
+ {
+ if ( [[map_i currentEntity] modifiable] )
+ {
+ [map_i makeSelectedPerform: @selector(takeCurrentTexture)];
+ [quakeed_i updateAll];
+ }
+ else
+ qprintf ("can't modify spawned entities");
+ }
+ [quakeed_i makeFirstResponder: quakeed_i];
+ return self;
+}
+
+- clearTexinfo: sender
+{
+ [field_Xshift_i setFloatValue:0];
+ [field_Yshift_i setFloatValue:0];
+ [field_Xscale_i setFloatValue:1];
+ [field_Yscale_i setFloatValue:1];
+ [field_Rotate_i setFloatValue:0];
+
+ [self texturedefChanged: self];
+
+ return self;
+}
+
+//
+// Set the selected texture
+//
+- setSelectedTexture:(int)which
+{
+ texpal_t *t;
+ NXRect r;
+ char string[16];
+
+// wipe the fields
+ [self clearTexinfo: self];
+
+ if (which != selectedTexture)
+ {
+ [textureView_i deselect];
+ selectedTexture = which;
+ t = [textureList_i elementAt:which];
+ r = t->r;
+ r.size.width += TEX_INDENT*2;
+ r.size.height += TEX_INDENT*2;
+ r.origin.x -= TEX_INDENT;
+ r.origin.y -= TEX_INDENT;
+ [textureView_i scrollRectToVisible:&r];
+ [textureView_i display];
+ sprintf(string,"%d x %d",(int)t->r.size.width,
+ (int)t->r.size.height - TEX_SPACING);
+ [sizeField_i setStringValue:string];
+ }
+
+ [self texturedefChanged:self];
+
+ return self;
+}
+
+//
+// Return the selected texture index
+//
+- (int)getSelectedTexture
+{
+ return selectedTexture;
+}
+
+//
+// Return the original tex_ index of the selected texture
+// so the texture info can be indexed from tex_images, etc.
+//
+- (int)getSelectedTexIndex
+{
+ texpal_t *t;
+
+ if (selectedTexture == -1)
+ return -1;
+ t = [textureList_i elementAt:selectedTexture];
+ return t->index;
+}
+
+//
+// Return the name of the selected texture
+//
+- (char *)getSelTextureName
+{
+ texpal_t *t;
+
+ if (selectedTexture == -1)
+ return NULL;
+ t = [textureList_i elementAt:selectedTexture];
+ return t->name;
+}
+
+//
+// Set selected texture by texture name
+//
+- setTextureByName:(char *)name
+{
+ texpal_t *t;
+ int i;
+ int max;
+
+ max = [textureList_i count];
+ CleanupName(name,name);
+ for (i = 0;i < max;i++)
+ {
+ t = [textureList_i elementAt:i];
+ if (!strcmp(t->name,name))
+ {
+ [self setSelectedTexture: i];
+ return self;
+ }
+ }
+ return self;
+}
+
+//===================================================
+//
+// Action methods
+//
+//===================================================
+
+
+//
+// Search for texture named in searchField
+//
+- searchForTexture:sender
+{
+ int i;
+ int max;
+ int len;
+ char name[32];
+ texpal_t *t;
+
+ if (selectedTexture == -1)
+ return self;
+
+ max = [textureList_i count];
+ strcpy(name,(const char *)[sender stringValue]);
+ [sender setStringValue:strupr(name)];
+ len = strlen(name);
+
+ for (i = selectedTexture-1;i >= 0; i--)
+ {
+ t = [textureList_i elementAt:i];
+ if (!strncmp(t->name,name,len))
+ {
+ [self setTextureByName:t->name];
+ [sender selectText:sender];
+ [self texturedefChanged:self];
+ return self;
+ }
+ }
+
+ for (i = max-1;i >= selectedTexture; i--)
+ {
+ t = [textureList_i elementAt:i];
+ if (!strncmp(t->name,name,len))
+ {
+ [self setTextureByName:t->name];
+ [sender selectText:sender];
+ [self texturedefChanged:self];
+ return self;
+ }
+ }
+
+ [self texturedefChanged:self];
+ return self;
+}
+
+//
+// Set texture def from outside TexturePalette
+//
+- setTextureDef:(texturedef_t *)td
+{
+ [self setTextureByName:td->texture];
+
+ [field_Xshift_i setFloatValue:td->shift[0]];
+ [field_Yshift_i setFloatValue:td->shift[1]];
+ [field_Xscale_i setFloatValue:td->scale[0]];
+ [field_Yscale_i setFloatValue:td->scale[1]];
+ [field_Rotate_i setFloatValue:td->rotate];
+
+ [self texturedefChanged:self];
+
+ return self;
+}
+
+//
+// Return the current texture def to passed *
+//
+- getTextureDef:(texturedef_t *)td
+{
+ if (selectedTexture == -1)
+ {
+ memset (td, 0, sizeof(*td));
+ strcpy (td->texture, "notexture");
+ return self;
+ }
+
+ strncpy(td->texture,[self getSelTextureName],16);
+
+ td->shift[0] = [field_Xshift_i floatValue];
+ td->shift[1] = [field_Yshift_i floatValue];
+ td->scale[0] = [field_Xscale_i floatValue];
+ td->scale[1] = [field_Yscale_i floatValue];
+ td->rotate = [field_Rotate_i floatValue];
+
+ return self;
+}
+
+//============================================================================
+
+//
+// Change value in a field
+//
+- changeField:(id)field by:(int)amount
+{
+ int val;
+
+ val = [field intValue];
+ val += amount;
+ [field setIntValue:val];
+
+ [self texturedefChanged:self];
+
+ return self;
+}
+
+//
+// Inc/Dec the XShift field
+//
+- incXShift:sender
+{
+ [self changeField:field_Xshift_i by:8];
+ return self;
+}
+- decXShift:sender
+{
+ [self changeField:field_Xshift_i by:-8];
+ return self;
+}
+
+//
+// Inc/Dec the YShift field
+//
+- incYShift:sender
+{
+ [self changeField:field_Yshift_i by:8];
+ return self;
+}
+- decYShift:sender
+{
+ [self changeField:field_Yshift_i by:-8];
+ return self;
+}
+
+//
+// Inc/Dec the Rotate field
+//
+- incRotate:sender
+{
+ [self changeField:field_Rotate_i by:90];
+ return self;
+}
+- decRotate:sender
+{
+ [self changeField:field_Rotate_i by:-90];
+ return self;
+}
+
+//
+// Inc/Dec the Xscale field
+//
+- incXScale:sender
+{
+ [field_Xscale_i setIntValue: 1];
+ [self texturedefChanged:self];
+ return self;
+}
+- decXScale:sender
+{
+ [field_Xscale_i setIntValue: -1];
+ [self texturedefChanged:self];
+ return self;
+}
+
+//
+// Inc/Dec the Yscale field
+//
+- incYScale:sender
+{
+ [field_Yscale_i setIntValue: 1];
+ [self texturedefChanged:self];
+ return self;
+}
+- decYScale:sender
+{
+ [field_Yscale_i setIntValue: -1];
+ [self texturedefChanged:self];
+ return self;
+}
+
+
+//============================================================================
+
+
+//
+// Search for texture in entire palette
+// Return index of texturedef, or -1 if unsuccessful
+//
+- (int) searchForTextureInPalette:(char *)texture
+{
+ int i;
+ int max;
+ char name[32];
+ texpal_t *t;
+
+ if (selectedTexture == -1)
+ return -1;
+
+ max = [textureList_i count];
+ strcpy(name,texture);
+
+ for (i = 0; i < max; i++)
+ {
+ t = [textureList_i elementAt:i];
+ if (!strcmp(t->name,name))
+ return i;
+ }
+ return -1;
+};
+
+//
+// Scan thru map & only display textures that are in map
+//
+- onlyShowMapTextures:sender
+{
+ int max;
+ int i;
+ int j;
+ id brushes;
+ SetBrush *b;
+ int numfaces;
+ face_t *f;
+ int index;
+
+ // Turn 'em off
+ if ([sender intValue])
+ {
+ max = [textureList_i count];
+ for (i = 0;i < max; i++)
+ [self setDisplayFlag:i to:0];
+
+ brushes = [map_i objectAt:0];
+ max = [brushes count];
+ for (i = 0;i < max; i++)
+ {
+ b = (SetBrush *)[brushes objectAt:i];
+ numfaces = [b getNumBrushFaces];
+ for (j = 0; j < numfaces; j++)
+ {
+ f = [b getBrushFace:j];
+ index = [self searchForTextureInPalette:f->texture.texture];
+ if (index >= 0)
+ [self setDisplayFlag:index to:1];
+ }
+ }
+ }
+ // Turn 'em on
+ else
+ {
+ max = [textureList_i count];
+ for (i = 0;i < max; i++)
+ [self setDisplayFlag:i to:1];
+ }
+
+ [textureView_i display];
+
+ return self;
+}
+
+- setDisplayFlag:(int)index to:(int)value
+{
+ texpal_t *tp;
+
+ tp = [textureList_i elementAt:index];
+ tp->display = value;
+ return self;
+};
+
+@end
diff --git a/QuakeEd/TextureView.h b/QuakeEd/TextureView.h
new file mode 100644
index 0000000..6b490ca
--- /dev/null
+++ b/QuakeEd/TextureView.h
@@ -0,0 +1,12 @@
+
+
+@interface TextureView:View
+{
+ id parent_i;
+ int deselectIndex;
+}
+
+- setParent:(id)from;
+- deselect;
+
+@end
diff --git a/QuakeEd/TextureView.m b/QuakeEd/TextureView.m
new file mode 100644
index 0000000..feb3810
--- /dev/null
+++ b/QuakeEd/TextureView.m
@@ -0,0 +1,152 @@
+
+#import "qedefs.h"
+
+/*
+
+NOTE: I am specifically not using cached image reps, because the data is also needed for texturing the views, and a cached rep would waste tons of space.
+
+*/
+
+@implementation TextureView
+
+- init
+{
+ deselectIndex = -1;
+ return self;
+}
+
+- setParent:(id)from
+{
+ parent_i = from;
+ return self;
+}
+
+- (BOOL)acceptsFirstMouse
+{
+ return YES;
+}
+
+- drawSelf:(const NXRect *)rects :(int)rectCount
+{
+ int i;
+ int max;
+ id list_i;
+ texpal_t *t;
+ int x;
+ int y;
+ NXPoint p;
+ NXRect r;
+ int selected;
+
+ selected = [parent_i getSelectedTexture];
+ list_i = [parent_i getList];
+ PSselectfont("Helvetica-Medium",FONTSIZE);
+ PSrotate(0);
+
+ PSsetgray(NX_LTGRAY);
+ PSrectfill(rects->origin.x, rects->origin.y,
+ rects->size.width, rects->size.height);
+
+ if (!list_i) // WADfile didn't init
+ return self;
+
+ if (deselectIndex != -1)
+ {
+ t = [list_i elementAt:deselectIndex];
+ r = t->r;
+ r.origin.x -= TEX_INDENT;
+ r.origin.y -= TEX_INDENT;
+ r.size.width += TEX_INDENT*2;
+ r.size.height += TEX_INDENT*2;
+
+ PSsetgray(NXGrayComponent(NX_COLORLTGRAY));
+ PSrectfill(r.origin.x, r.origin.y,
+ r.size.width, r.size.height);
+ p = t->r.origin;
+ p.y += TEX_SPACING;
+ [t->image drawAt:&p];
+ PSsetgray(0);
+ x = t->r.origin.x;
+ y = t->r.origin.y + 7;
+ PSmoveto(x,y);
+ PSshow(t->name);
+ PSstroke();
+ deselectIndex = -1;
+ }
+
+ max = [list_i count];
+ PSsetgray(0);
+
+ for (i = 0;i < max; i++)
+ {
+ t = [list_i elementAt:i];
+ r = t->r;
+ r.origin.x -= TEX_INDENT/2;
+ r.size.width += TEX_INDENT;
+ r.origin.y += 4;
+ if (NXIntersectsRect(&rects[0],&r) == YES &&
+ t->display)
+ {
+ if (selected == i)
+ {
+ PSsetgray(1);
+ PSrectfill(r.origin.x,r.origin.y,
+ r.size.width,r.size.height);
+ PSsetrgbcolor(1,0,0);
+ PSrectstroke(r.origin.x, r.origin.y,
+ r.size.width, r.size.height);
+ PSsetgray(0);
+ }
+
+ p = t->r.origin;
+ p.y += TEX_SPACING;
+ [t->image drawAt:&p];
+ x = t->r.origin.x;
+ y = t->r.origin.y + 7;
+ PSmoveto(x,y);
+ PSshow(t->name);
+ }
+ }
+ PSstroke();
+ return self;
+}
+
+- deselect
+{
+ deselectIndex = [parent_i getSelectedTexture];
+ return self;
+}
+
+- mouseDown:(NXEvent *)theEvent
+{
+ NXPoint loc;
+ int i;
+ int max;
+ int oldwindowmask;
+ texpal_t *t;
+ id list;
+ NXRect r;
+
+ oldwindowmask = [window addToEventMask:NX_LMOUSEDRAGGEDMASK];
+ loc = theEvent->location;
+ [self convertPoint:&loc fromView:NULL];
+
+ list = [parent_i getList];
+ max = [list count];
+ for (i = 0;i < max; i++)
+ {
+ t = [list elementAt:i];
+ r = t->r;
+ if (NXPointInRect(&loc,&r) == YES)
+ {
+ [self deselect];
+ [parent_i setSelectedTexture:i];
+ break;
+ }
+ }
+
+ [window setEventMask:oldwindowmask];
+ return self;
+}
+
+@end
diff --git a/QuakeEd/Things.h b/QuakeEd/Things.h
new file mode 100644
index 0000000..85a8d9f
--- /dev/null
+++ b/QuakeEd/Things.h
@@ -0,0 +1,42 @@
+
+#import <appkit/appkit.h>
+
+extern id things_i;
+
+#define ENTITYNAMEKEY "spawn"
+
+@interface Things:Object
+{
+ id entity_browser_i; // browser
+ id entity_comment_i; // scrolling text window
+
+ id prog_path_i;
+
+ int lastSelected; // last row selected in browser
+
+ id keyInput_i;
+ id valueInput_i;
+ id flags_i;
+}
+
+- initEntities;
+
+- newCurrentEntity;
+- setSelectedKey:(epair_t *)ep;
+
+- clearInputs;
+- (char *)spawnName;
+
+// UI targets
+- reloadEntityClasses: sender;
+- selectEntity: sender;
+- doubleClickEntity: sender;
+
+// Action methods
+- addPair:sender;
+- delPair:sender;
+- setAngle:sender;
+- setFlags:sender;
+
+
+@end
diff --git a/QuakeEd/Things.m b/QuakeEd/Things.m
new file mode 100644
index 0000000..72b0e3d
--- /dev/null
+++ b/QuakeEd/Things.m
@@ -0,0 +1,317 @@
+
+#import "qedefs.h"
+
+id things_i;
+
+@implementation Things
+
+- init
+{
+ [super init];
+
+ things_i = self;
+ lastSelected = 0;
+
+ return self;
+}
+
+//
+// Load the TEXT object with the entity comment
+//
+- loadEntityComment:(id)obj
+{
+ [entity_comment_i selectAll:self];
+ [entity_comment_i replaceSel:[obj comments]];
+
+ return self;
+}
+
+
+- initEntities
+{
+ char *path;
+
+ path = [project_i getProgDirectory];
+
+ [prog_path_i setStringValue: path];
+
+ [[EntityClassList alloc] initForSourceDirectory: path];
+
+ [self loadEntityComment:[entity_classes_i objectAt:lastSelected]];
+ [entity_browser_i loadColumnZero];
+ [[entity_browser_i matrixInColumn:0] selectCellAt:lastSelected :0];
+
+ [entity_browser_i setDoubleAction: @selector(doubleClickEntity:)];
+
+ return self;
+}
+
+- selectEntity: sender
+{
+ id matr;
+
+ matr = [sender matrixInColumn: 0];
+ lastSelected = [matr selectedRow];
+ [self loadEntityComment:[entity_classes_i objectAt:lastSelected]];
+ [quakeed_i makeFirstResponder: quakeed_i];
+
+ return self;
+}
+
+- doubleClickEntity: sender
+{
+ [map_i makeEntity: sender];
+ [quakeed_i makeFirstResponder: quakeed_i];
+ return self;
+}
+
+- (char *)spawnName
+{
+ return [[entity_classes_i objectAt:lastSelected] classname];
+}
+
+
+//
+// Flush entity classes & reload them!
+//
+- reloadEntityClasses: sender
+{
+ EntityClass *ent;
+ char *path;
+
+ path = (char *)[prog_path_i stringValue];
+ if (!path || !path[0])
+ {
+ path = [project_i getProgDirectory];
+ [prog_path_i setStringValue: path];
+ }
+
+ // Free all entity info in memory...
+ [entity_classes_i freeObjects];
+ [entity_classes_i free];
+
+ // Now, RELOAD!
+ [[EntityClassList alloc] initForSourceDirectory: path];
+
+ lastSelected = 0;
+ ent = [entity_classes_i objectAt:lastSelected];
+ [self loadEntityComment:[entity_classes_i objectAt:lastSelected]];
+
+ [entity_browser_i loadColumnZero];
+ [[entity_browser_i matrixInColumn:0] selectCellAt:lastSelected :0];
+
+ [self newCurrentEntity]; // in case flags changed
+
+ return self;
+}
+
+
+- selectClass: (char *)class
+{
+ id classent;
+
+ classent = [entity_classes_i classForName:class];
+ if (!classent)
+ return self;
+ lastSelected = [entity_classes_i indexOf: classent];
+
+ if (lastSelected < 0)
+ lastSelected = 0;
+
+ [self loadEntityComment:classent];
+ [[entity_browser_i matrixInColumn:0] selectCellAt:lastSelected :0];
+ [[entity_browser_i matrixInColumn:0] scrollCellToVisible:lastSelected :0];
+
+ return self;
+}
+
+
+- newCurrentEntity
+{
+ id ent, classent, cell;
+ char *classname;
+ int r, c;
+ char *flagname;
+ int flags;
+
+ ent = [map_i currentEntity];
+ classname = [ent valueForQKey: "classname"];
+ if (ent != [map_i objectAt: 0])
+ [self selectClass: classname]; // don't reset for world
+ classent = [entity_classes_i classForName:classname];
+ flagname = [ent valueForQKey: "spawnflags"];
+ if (!flagname)
+ flags = 0;
+ else
+ flags = atoi(flagname);
+
+ [flags_i setAutodisplay: NO];
+ for (r=0 ; r<4 ; r++)
+ for (c=0 ; c<3 ; c++)
+ {
+ cell = [flags_i cellAt: r : c];
+ if (c < 2)
+ {
+ flagname = [classent flagName: c*4 + r];
+ [cell setTitle: flagname];
+ }
+ [cell setIntValue: (flags & (1<< ((c*4)+r)) ) > 0];
+ }
+ [flags_i setAutodisplay: YES];
+ [flags_i display];
+
+// [keyInput_i setStringValue: ""];
+// [valueInput_i setStringValue: ""];
+
+ [keypairview_i calcViewSize];
+ [keypairview_i display];
+
+ [quakeed_i makeFirstResponder: quakeed_i];
+ return self;
+}
+
+//
+// Clicked in the Keypair view - set as selected
+//
+- setSelectedKey:(epair_t *)ep;
+{
+ [keyInput_i setStringValue:ep->key];
+ [valueInput_i setStringValue:ep->value];
+ [valueInput_i selectText:self];
+ return self;
+}
+
+- clearInputs
+{
+// [keyInput_i setStringValue: ""];
+// [valueInput_i setStringValue: ""];
+
+ [quakeed_i makeFirstResponder: quakeed_i];
+ return self;
+}
+
+//
+// Action methods
+//
+
+-addPair:sender
+{
+ char *key, *value;
+
+ key = (char *)[keyInput_i stringValue];
+ value = (char *)[valueInput_i stringValue];
+
+ [ [map_i currentEntity] setKey: key toValue: value ];
+
+ [keypairview_i calcViewSize];
+ [keypairview_i display];
+
+ [self clearInputs];
+ [quakeed_i updateXY];
+
+ return self;
+}
+
+-delPair:sender
+{
+ [quakeed_i makeFirstResponder: quakeed_i];
+
+ [ [map_i currentEntity] removeKeyPair: (char *)[keyInput_i stringValue] ];
+
+ [keypairview_i calcViewSize];
+ [keypairview_i display];
+
+ [self clearInputs];
+
+ [quakeed_i updateXY];
+
+ return self;
+}
+
+
+//
+// Set the key/value fields to "angle <button value>"
+//
+- setAngle:sender
+{
+ const char *title;
+ char value[10];
+
+ title = [[sender selectedCell] title];
+ if (!strcmp(title,"Up"))
+ strcpy (value, "-1");
+ else if (!strcmp(title,"Dn"))
+ strcpy (value, "-2");
+ else
+ strcpy (value, title);
+
+ [keyInput_i setStringValue:"angle"];
+ [valueInput_i setStringValue:value];
+ [self addPair:NULL];
+
+ [self clearInputs];
+
+ [quakeed_i updateXY];
+
+ return self;
+}
+
+- setFlags:sender
+{
+ int flags;
+ int r, c, i;
+ id cell;
+ char str[20];
+
+ [self clearInputs];
+ flags = 0;
+
+ for (r=0 ; r<4 ; r++)
+ for (c=0 ; c<3 ; c++)
+ {
+ cell = [flags_i cellAt: r : c];
+ i = ([cell intValue] > 0);
+ flags |= (i<< ((c*4)+r));
+ }
+
+ if (!flags)
+ [[map_i currentEntity] removeKeyPair: "spawnflags"];
+ else
+ {
+ sprintf (str, "%i", flags);
+ [[map_i currentEntity] setKey: "spawnflags" toValue: str];
+ }
+
+ [keypairview_i calcViewSize];
+ [keypairview_i display];
+
+ return self;
+}
+
+
+//
+// Fill the Entity browser
+// (Delegate method - delegated in Interface Builder)
+//
+- (int)browser:sender fillMatrix:matrix inColumn:(int)column
+{
+ id cell;
+ int max;
+ int i;
+ id object;
+
+ max = [entity_classes_i count];
+ i = 0;
+ while(max--)
+ {
+ object = [entity_classes_i objectAt:i];
+ [matrix addRow];
+ cell = [matrix cellAt:i++ :0];
+ [cell setStringValue:[object classname]];
+ [cell setLeaf:YES];
+ [cell setLoaded:YES];
+ }
+ return i;
+}
+
+@end
diff --git a/QuakeEd/UpArrow.tiff b/QuakeEd/UpArrow.tiff
new file mode 100644
index 0000000..61e1a61
--- /dev/null
+++ b/QuakeEd/UpArrow.tiff
Binary files differ
diff --git a/QuakeEd/UserPath.h b/QuakeEd/UserPath.h
new file mode 100644
index 0000000..805eac4
--- /dev/null
+++ b/QuakeEd/UserPath.h
@@ -0,0 +1,72 @@
+/*
+ * UserPath.h by Bruce Blumberg, NeXT Computer, Inc.
+ *
+ * You may freely copy,distribute and re-use the code in this example. NeXT
+ * disclaims any warranty of any kind, expressed or implied, as to its fitness
+ * for any particular purpose
+ *
+ * This file and its associated .m file define a data structure and set of
+ * functions aimed at facilitating the use of user paths. Here is a simple
+ * example:
+ *
+ * UserPath *arect;
+ * arect = newUserPath(); // creates an empty user path
+ * beginUserPath(arect,YES); // initialize user path and cache
+ * UPmoveto(arect,0.0,0.0); // add moveto to userpath; update bounding box
+ * UPrlineto(arect,0.0,100.0); // add rlineto to path; update bounding box
+ * UPrlineto(arect,100.0,0.0); // add rlineto to path; update bounding box
+ * UPrlineto(arect,0.0,-100.0); // add rlineto to path; update bounding box
+ * closePath(arect); // close path
+ * endUserPath(arect,dps_stroke); // close user path and specify operator
+ * sendUserPath(arect);
+ *
+ * As you will note, the set of routines manage the allocation and growth of
+ * the operator and operand arrays, as well as the calculation of the bounding
+ * box. A user path created via these functions may be optionally cached down
+ * at the window server, or repeatedly sent down. The user paths created by
+ * this set of functions are all allocated in a unique zone.
+ *
+ * Note: the associated file is a .m file because it pulls in some .h files
+ * which reference objective C methods.
+ */
+
+#import <objc/objc.h>
+#import <dpsclient/dpsclient.h>
+
+typedef struct _UP {
+ float *points;
+ int numberOfPoints;
+ char *ops;
+ NXPoint cp;
+ int numberOfOps;
+ int max;
+ float bbox[4];
+ int opForUserPath;
+ BOOL ping;
+} UserPath;
+
+/* UserPath functions */
+NXZone *userPathZone();
+UserPath *newUserPath();
+void freeUserPath(UserPath *up);
+void debugUserPath(UserPath *up, BOOL shouldPing);
+void growUserPath(UserPath *up);
+void beginUserPath(UserPath *up, BOOL cache);
+void endUserPath(UserPath *up, int op);
+int sendUserPath(UserPath *up);
+void UPmoveto(UserPath *up, float x, float y);
+void UPrmoveto(UserPath *up, float x, float y);
+void UPlineto(UserPath *up, float x, float y);
+void UPrlineto(UserPath *up, float x, float y);
+void UPcurveto(UserPath *up, float x1, float y1, float x2, float y2, float x3,
+ float y3);
+void UPrcurveto(UserPath *up, float dx1, float dy1, float dx2, float dy2,
+ float dx3, float dy3);
+void UParc(UserPath *up, float x, float y, float r, float ang1, float ang2);
+void UParcn(UserPath *up, float x, float y, float r, float ang1, float ang2);
+void UParct(UserPath *up, float x1, float y1, float x2, float y2, float r);
+void closePath(UserPath *up);
+void addPts(UserPath *up, float x, float y);
+void addOp(UserPath *up, int op);
+void add(UserPath *up, int op, float x, float y);
+void checkBBox(UserPath *up, float x, float y);
diff --git a/QuakeEd/UserPath.m b/QuakeEd/UserPath.m
new file mode 100644
index 0000000..fe5fcc7
--- /dev/null
+++ b/QuakeEd/UserPath.m
@@ -0,0 +1,209 @@
+/*
+ * UserPath.m by Bruce Blumberg, NeXT Computer, Inc.
+ *
+ * You may freely copy,distribute and re-use the code in this example. NeXT
+ * disclaims any warranty of any kind, expressed or implied, as to its fitness
+ * for any particular purpose
+ *
+ */
+
+#import "UserPath.h"
+#import <mach/mach_init.h>
+#import <appkit/graphics.h>
+#import <appkit/errors.h>
+#import <math.h>
+#import <libc.h>
+
+static NXZone *upZone = NULL;
+
+NXZone *userPathZone()
+/* Creates a unique zone for use by all user paths */
+{
+ if (!upZone) {
+ upZone = NXCreateZone(vm_page_size, vm_page_size, 1);
+ }
+
+ return upZone;
+}
+
+UserPath *newUserPath()
+/* Creates a new User Path in the zone returned by userPathZone */
+{
+ UserPath *up;
+
+ up = (UserPath *)NXZoneMalloc(userPathZone(), sizeof(UserPath));
+ up->max = 8192; // JDC
+ up->points = (float *)NXZoneMalloc(userPathZone(),
+ sizeof(float) * up->max);
+ up->ops = (char *)NXZoneMalloc(userPathZone(),
+ (2 + (up->max / 2)) * sizeof(char));
+ up->ping = NO;
+
+ return up;
+}
+
+void freeUserPath(UserPath *up)
+/* Frees User Path and its associated buffers */
+{
+ free(up->points);
+ free(up->ops);
+ free(up);
+
+ return;
+}
+
+void growUserPath(UserPath *up)
+/*
+ * grows the associated buffers as necessary. buffer size doubles on each
+ * call. You never need to call grow directly as it is called as needed by the
+ * methods and functions which add elements into the buffer
+ */
+{
+ /* double the size of the internal buffers */
+printf ("growUserPath\n");
+ up->max *= 2;
+ up->points = (float *)NXZoneRealloc(userPathZone(), up->points,
+ sizeof(float) * up->max);
+ up->ops = (char *)NXZoneRealloc(userPathZone(), up->ops,
+ (2 + (up->max / 2)) * sizeof(char));
+
+ return;
+}
+
+void beginUserPath(UserPath *up, BOOL cache)
+/*
+ * Call this to start generating a user path. The cache argument specifies if
+ * you want the user path cached at the server (i.e. dps_ucache). In either
+ * case, the UserPath object will automatically calculate the bounding box for
+ * the path and add the dps_setbbox operator.
+ */
+{
+ up->numberOfPoints = up->numberOfOps = 0;
+ up->cp.x = up->cp.y = 0;
+ up->bbox[0] = up->bbox[1] = 1.0e6;
+ up->bbox[2] = up->bbox[3] = -1.0e6;
+ if (cache) {
+ up->ops[up->numberOfOps++] = dps_ucache;
+ }
+ up->ops[up->numberOfOps++] = dps_setbbox;
+ up->opForUserPath = 0;
+
+ return;
+}
+
+void endUserPath(UserPath *up, int op)
+/*
+ * Call this to stop filling the path. Note this does not send the userpath to
+ * the server -- use sendUserPath. The op argument should be one of the
+ * following:
+ * dps_uappend, dps_ufill ,dps_ueofill, dps_ustroke, dps_ustrokepath,
+ * dps_inufill, dps_inueofill, dps_inustroke, dps_def, dps_put.
+ * These are defined in <dpsclient/dpsNext.h.
+ */
+{
+ up->opForUserPath = op;
+
+ return;
+}
+
+
+void UPdebug(UserPath *up, BOOL shouldPing)
+/*
+ * Sets ping to YES so that after each time a user path is sent down to the
+ * window server, an NXPing() is sent after. The purpose is to catch PostScript
+ * errors that may be generated by the user path. sendUserPath brackets the
+ * download and the NXPing() in an NX_DURING... NX_HANDLER construct. Normally
+ * ping is NO.
+ */
+{
+ up->ping = shouldPing;
+
+ return;
+}
+
+int sendUserPath(UserPath *up)
+/*
+ * Call this to send the path down to the server. If ping==YES (set via
+ * debug:), the function will send an NXPing() after the Path. In any event,
+ * code is bracketed by a NX_DURING ... NX_HANDLER construct which will try to
+ * catch postscript errors. If ping==NO (the default) it is unlikely to catch
+ * errors, with ping==YES it will. Whether you can recover or not is another
+ * matter. sendUserPath returns 0 on success and -1 on failure. If no previous
+ * endUserPath: has been sent, will return -2 and will not send the path to the
+ * server.
+ */
+{
+ NXHandler exception;
+
+ exception.code = 0;
+ if (up->opForUserPath != 0) {
+ NX_DURING
+ DPSDoUserPath(up->points, up->numberOfPoints, dps_float, up->ops,
+ up->numberOfOps, up->bbox, up->opForUserPath);
+ if (up->ping) {
+ NXPing();
+ }
+
+ NX_HANDLER
+ exception = NXLocalHandler;
+ NX_ENDHANDLER
+ if (exception.code) {
+ NXReportError(&exception);
+ if (exception.code == dps_err_ps) {
+ return -1;
+ }
+ } else {
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+
+void UPmoveto(UserPath *up, float x, float y)
+/* adds <x y moveto> to user path and updates bounding box */
+{
+ up->ops[up->numberOfOps++] = dps_moveto;
+ up->points[up->numberOfPoints++] = x;
+ up->points[up->numberOfPoints++] = y;
+
+ if (x < up->bbox[0]) {
+ up->bbox[0] = x;
+ }
+ if (y < up->bbox[1]) {
+ up->bbox[1] = y;
+ }
+ if (x > up->bbox[2]) {
+ up->bbox[2] = x;
+ }
+ if (y > up->bbox[3]) {
+ up->bbox[3] = y;
+ }
+
+ return;
+}
+
+
+void UPlineto(UserPath *up, float x, float y)
+/* adds <x y lineto> to user path and updates bounding box */
+{
+ up->ops[up->numberOfOps++] = dps_lineto;
+ up->points[up->numberOfPoints++] = x;
+ up->points[up->numberOfPoints++] = y;
+
+ if (x < up->bbox[0]) {
+ up->bbox[0] = x;
+ }
+ if (y < up->bbox[1]) {
+ up->bbox[1] = y;
+ }
+ if (x > up->bbox[2]) {
+ up->bbox[2] = x;
+ }
+ if (y > up->bbox[3]) {
+ up->bbox[3] = y;
+ }
+ return;
+}
+
diff --git a/QuakeEd/XYView.h b/QuakeEd/XYView.h
new file mode 100644
index 0000000..c062af1
--- /dev/null
+++ b/QuakeEd/XYView.h
@@ -0,0 +1,66 @@
+
+#import <appkit/appkit.h>
+#import "mathlib.h"
+#import "SetBrush.h"
+
+extern id xyview_i;
+
+#define MINSCALE 0.125
+#define MAXSCALE 2.0
+
+
+extern vec3_t xy_viewnormal; // v_forward for xy view
+extern float xy_viewdist; // clip behind this plane
+
+extern NXRect xy_draw_rect;
+
+void linestart (float r, float g, float b);
+void lineflush (void);
+void linecolor (float r, float g, float b);
+
+void XYmoveto (vec3_t pt);
+void XYlineto (vec3_t pt);
+
+typedef enum {dr_wire, dr_flat, dr_texture} drawmode_t;
+
+
+@interface XYView : View
+{
+ NXRect realbounds, newrect, combinedrect;
+ NXPoint midpoint;
+ int gridsize;
+ float scale;
+
+// for textured view
+ int xywidth, xyheight;
+ float *xyzbuffer;
+ unsigned *xypicbuffer;
+
+ drawmode_t drawmode;
+
+// UI links
+ id mode_radio_i;
+}
+
+- (float)currentScale;
+
+- setModeRadio: m;
+
+- drawMode: sender;
+- setDrawMode: (drawmode_t)mode;
+
+- newSuperBounds;
+- newRealBounds: (NXRect *)nb;
+
+- addToScrollRange: (float)x :(float)y;
+- setOrigin: (NXPoint *)pt scale: (float)sc;
+- centerOn: (vec3_t)org;
+
+- drawMode: sender;
+
+- superviewChanged;
+
+- (int)gridsize;
+- (float)snapToGrid: (float)f;
+
+@end
diff --git a/QuakeEd/XYView.m b/QuakeEd/XYView.m
new file mode 100644
index 0000000..2fb1e9c
--- /dev/null
+++ b/QuakeEd/XYView.m
@@ -0,0 +1,1384 @@
+#import "qedefs.h"
+
+id xyview_i;
+
+id scalemenu_i, gridmenu_i, scrollview_i, gridbutton_i, scalebutton_i;
+
+vec3_t xy_viewnormal; // v_forward for xy view
+float xy_viewdist; // clip behind this plane
+
+@implementation XYView
+
+/*
+==================
+initFrame:
+==================
+*/
+- initFrame:(const NXRect *)frameRect
+{
+ [super initFrame:frameRect];
+ [self allocateGState];
+
+ NXSetRect (&realbounds, 0,0,0,0);
+
+ gridsize = 16;
+ scale = 1.0;
+ xyview_i = self;
+
+ xy_viewnormal[2] = -1;
+ xy_viewdist = -1024;
+
+//
+// initialize the pop up menus
+//
+ scalemenu_i = [[PopUpList alloc] init];
+ [scalemenu_i setTarget: self];
+ [scalemenu_i setAction: @selector(scaleMenuTarget:)];
+
+ [scalemenu_i addItem: "12.5%"];
+ [scalemenu_i addItem: "25%"];
+ [scalemenu_i addItem: "50%"];
+ [scalemenu_i addItem: "75%"];
+ [scalemenu_i addItem: "100%"];
+ [scalemenu_i addItem: "200%"];
+ [scalemenu_i addItem: "300%"];
+ [[scalemenu_i itemList] selectCellAt: 4 : 0];
+
+ scalebutton_i = NXCreatePopUpListButton(scalemenu_i);
+
+
+ gridmenu_i = [[PopUpList alloc] init];
+ [gridmenu_i setTarget: self];
+ [gridmenu_i setAction: @selector(gridMenuTarget:)];
+
+ [gridmenu_i addItem: "grid 1"];
+ [gridmenu_i addItem: "grid 2"];
+ [gridmenu_i addItem: "grid 4"];
+ [gridmenu_i addItem: "grid 8"];
+ [gridmenu_i addItem: "grid 16"];
+ [gridmenu_i addItem: "grid 32"];
+ [gridmenu_i addItem: "grid 64"];
+
+ [[gridmenu_i itemList] selectCellAt: 4 : 0];
+
+ gridbutton_i = NXCreatePopUpListButton(gridmenu_i);
+
+// initialize the scroll view
+ scrollview_i = [[PopScrollView alloc]
+ initFrame: frameRect
+ button1: scalebutton_i
+ button2: gridbutton_i
+ ];
+ [scrollview_i setLineScroll: 64];
+ [scrollview_i setAutosizing: NX_WIDTHSIZABLE | NX_HEIGHTSIZABLE];
+
+// link objects together
+ [[scrollview_i setDocView: self] free];
+
+ return scrollview_i;
+
+}
+
+- (BOOL)acceptsFirstResponder
+{
+ return YES;
+}
+
+- setModeRadio: m
+{ // this should be set from IB, but because I toss myself in a popscrollview
+// the connection gets lost
+ mode_radio_i = m;
+ [mode_radio_i setTarget: self];
+ [mode_radio_i setAction: @selector(drawMode:)];
+ return self;
+}
+
+- drawMode: sender
+{
+ drawmode = [sender selectedCol];
+ [quakeed_i updateXY];
+ return self;
+}
+
+- setDrawMode: (drawmode_t)mode
+{
+ drawmode = mode;
+ [mode_radio_i selectCellAt:0: mode];
+ [quakeed_i updateXY];
+ return self;
+}
+
+
+- (float)currentScale
+{
+ return scale;
+}
+
+/*
+===================
+setOrigin:scale:
+===================
+*/
+- setOrigin: (NXPoint *)pt scale: (float)sc
+{
+ NXRect sframe;
+ NXRect newbounds;
+
+//
+// calculate the area visible in the cliprect
+//
+ scale = sc;
+
+ [superview getFrame: &sframe];
+ [superview getFrame: &newbounds];
+ newbounds.origin = *pt;
+ newbounds.size.width /= scale;
+ newbounds.size.height /= scale;
+
+//
+// union with the realbounds
+//
+ NXUnionRect (&realbounds, &newbounds);
+
+//
+// redisplay everything
+//
+ [quakeed_i disableDisplay];
+
+//
+// size this view
+//
+ [self sizeTo: newbounds.size.width : newbounds.size.height];
+ [self setDrawOrigin: newbounds.origin.x : newbounds.origin.y];
+ [self moveTo: newbounds.origin.x : newbounds.origin.y];
+
+//
+// scroll and scale the clip view
+//
+ [superview setDrawSize
+ : sframe.size.width/scale
+ : sframe.size.height/scale];
+ [superview setDrawOrigin: pt->x : pt->y];
+
+ [quakeed_i reenableDisplay];
+ [scrollview_i display];
+
+ return self;
+}
+
+- centerOn: (vec3_t)org
+{
+ NXRect sbounds;
+ NXPoint mid, delta;
+
+ [[xyview_i superview] getBounds: &sbounds];
+
+ mid.x = sbounds.origin.x + sbounds.size.width/2;
+ mid.y = sbounds.origin.y + sbounds.size.height/2;
+
+ delta.x = org[0] - mid.x;
+ delta.y = org[1] - mid.y;
+
+ sbounds.origin.x += delta.x;
+ sbounds.origin.y += delta.y;
+
+ [self setOrigin: &sbounds.origin scale: scale];
+ return self;
+}
+
+/*
+==================
+newSuperBounds
+
+When superview is resized
+==================
+*/
+- newSuperBounds
+{
+ NXRect r;
+
+ [superview getBounds: &r];
+ [self newRealBounds: &r];
+
+ return self;
+}
+
+/*
+===================
+newRealBounds
+
+Called when the realbounds rectangle is changed.
+Should only change the scroll bars, not cause any redraws.
+If realbounds has shrunk, nothing will change.
+===================
+*/
+- newRealBounds: (NXRect *)nb
+{
+ NXRect sbounds;
+
+ realbounds = *nb;
+
+//
+// calculate the area visible in the cliprect
+//
+ [superview getBounds: &sbounds];
+ NXUnionRect (nb, &sbounds);
+
+//
+// size this view
+//
+ [quakeed_i disableDisplay];
+
+ [self suspendNotifyAncestorWhenFrameChanged:YES];
+ [self sizeTo: sbounds.size.width : sbounds.size.height];
+ [self setDrawOrigin: sbounds.origin.x : sbounds.origin.y];
+ [self moveTo: sbounds.origin.x : sbounds.origin.y];
+ [self suspendNotifyAncestorWhenFrameChanged:NO];
+
+ [scrollview_i reflectScroll: superview];
+ [quakeed_i reenableDisplay];
+
+ [[scrollview_i horizScroller] display];
+ [[scrollview_i vertScroller] display];
+
+ return self;
+}
+
+
+/*
+====================
+scaleMenuTarget:
+
+Called when the scaler popup on the window is used
+====================
+*/
+
+- scaleMenuTarget: sender
+{
+ char const *item;
+ NXRect visrect, sframe;
+ float nscale;
+
+ item = [[sender selectedCell] title];
+ sscanf (item,"%f",&nscale);
+ nscale /= 100;
+
+ if (nscale == scale)
+ return NULL;
+
+// keep the center of the view constant
+ [superview getBounds: &visrect];
+ [superview getFrame: &sframe];
+ visrect.origin.x += visrect.size.width/2;
+ visrect.origin.y += visrect.size.height/2;
+
+ visrect.origin.x -= sframe.size.width/2/nscale;
+ visrect.origin.y -= sframe.size.height/2/nscale;
+
+ [self setOrigin: &visrect.origin scale: nscale];
+
+ return self;
+}
+
+/*
+==============
+zoomIn
+==============
+*/
+- zoomIn: (NXPoint *)constant
+{
+ id itemlist;
+ int selected, numrows, numcollumns;
+
+ NXRect visrect;
+ NXPoint ofs, new;
+
+//
+// set the popup
+//
+ itemlist = [scalemenu_i itemList];
+ [itemlist getNumRows: &numrows numCols:&numcollumns];
+
+ selected = [itemlist selectedRow] + 1;
+ if (selected >= numrows)
+ return NULL;
+
+ [itemlist selectCellAt: selected : 0];
+ [scalebutton_i setTitle: [[itemlist selectedCell] title]];
+
+//
+// zoom the view
+//
+ [superview getBounds: &visrect];
+ ofs.x = constant->x - visrect.origin.x;
+ ofs.y = constant->y - visrect.origin.y;
+
+ new.x = constant->x - ofs.x / 2;
+ new.y = constant->y - ofs.y / 2;
+
+ [self setOrigin: &new scale: scale*2];
+
+ return self;
+}
+
+
+/*
+==============
+zoomOut
+==============
+*/
+- zoomOut: (NXPoint *)constant
+{
+ id itemlist;
+ int selected, numrows, numcollumns;
+
+ NXRect visrect;
+ NXPoint ofs, new;
+
+//
+// set the popup
+//
+ itemlist = [scalemenu_i itemList];
+ [itemlist getNumRows: &numrows numCols:&numcollumns];
+
+ selected = [itemlist selectedRow] - 1;
+ if (selected < 0)
+ return NULL;
+
+ [itemlist selectCellAt: selected : 0];
+ [scalebutton_i setTitle: [[itemlist selectedCell] title]];
+
+//
+// zoom the view
+//
+ [superview getBounds: &visrect];
+ ofs.x = constant->x - visrect.origin.x;
+ ofs.y = constant->y - visrect.origin.y;
+
+ new.x = constant->x - ofs.x * 2;
+ new.y = constant->y - ofs.y * 2;
+
+ [self setOrigin: &new scale: scale/2];
+
+ return self;
+}
+
+
+/*
+====================
+gridMenuTarget:
+
+Called when the scaler popup on the window is used
+====================
+*/
+
+- gridMenuTarget: sender
+{
+ char const *item;
+ int grid;
+
+ item = [[sender selectedCell] title];
+ sscanf (item,"grid %d",&grid);
+
+ if (grid == gridsize)
+ return NULL;
+
+ gridsize = grid;
+ [quakeed_i updateAll];
+
+ return self;
+}
+
+
+/*
+====================
+snapToGrid
+====================
+*/
+- (float) snapToGrid: (float)f
+{
+ int i;
+
+ i = rint(f/gridsize);
+
+ return i*gridsize;
+}
+
+- (int)gridsize
+{
+ return gridsize;
+}
+
+
+
+/*
+===================
+addToScrollRange::
+===================
+*/
+- addToScrollRange: (float)x :(float)y;
+{
+ if (x < newrect.origin.x)
+ {
+ newrect.size.width += newrect.origin.x - x;
+ newrect.origin.x = x;
+ }
+
+ if (y < newrect.origin.y)
+ {
+ newrect.size.height += newrect.origin.y - y;
+ newrect.origin.y = y;
+ }
+
+ if (x > newrect.origin.x + newrect.size.width)
+ newrect.size.width += x - (newrect.origin.x+newrect.size.width);
+
+ if (y > newrect.origin.y + newrect.size.height)
+ newrect.size.height += y - (newrect.origin.y+newrect.size.height);
+
+ return self;
+}
+
+/*
+===================
+superviewChanged
+===================
+*/
+- superviewChanged
+{
+ [self newRealBounds: &realbounds];
+
+ return self;
+}
+
+
+/*
+===============================================================================
+
+ DRAWING METHODS
+
+===============================================================================
+*/
+
+vec3_t cur_linecolor;
+
+void linestart (float r, float g, float b)
+{
+ beginUserPath (upath,NO);
+ cur_linecolor[0] = r;
+ cur_linecolor[1] = g;
+ cur_linecolor[2] = b;
+}
+
+void lineflush (void)
+{
+ if (!upath->numberOfPoints)
+ return;
+ endUserPath (upath, dps_ustroke);
+ PSsetrgbcolor (cur_linecolor[0], cur_linecolor[1], cur_linecolor[2]);
+ sendUserPath (upath);
+ beginUserPath (upath,NO);
+}
+
+void linecolor (float r, float g, float b)
+{
+ if (cur_linecolor[0] == r && cur_linecolor[1] == g && cur_linecolor[2] == b)
+ return; // do nothing
+ lineflush ();
+ cur_linecolor[0] = r;
+ cur_linecolor[1] = g;
+ cur_linecolor[2] = b;
+}
+
+void XYmoveto (vec3_t pt)
+{
+ if (upath->numberOfPoints > 2048)
+ lineflush ();
+ UPmoveto (upath, pt[0], pt[1]);
+}
+
+void XYlineto (vec3_t pt)
+{
+ UPlineto (upath, pt[0], pt[1]);
+}
+
+/*
+============
+drawGrid
+
+Draws tile markings every 64 units, and grid markings at the grid scale if
+the grid lines are greater than or equal to 4 pixels apart
+
+Rect is in global world (unscaled) coordinates
+============
+*/
+
+- drawGrid: (const NXRect *)rect
+{
+ int x,y, stopx, stopy;
+ float top,bottom,right,left;
+ char text[10];
+ BOOL showcoords;
+
+ showcoords = [quakeed_i showCoordinates];
+
+ left = rect->origin.x-1;
+ bottom = rect->origin.y-1;
+ right = rect->origin.x+rect->size.width+2;
+ top = rect->origin.y+rect->size.height+2;
+
+ PSsetlinewidth (0.15);
+
+//
+// grid
+//
+// can't just divide by grid size because of negetive coordinate
+// truncating direction
+//
+ if (gridsize >= 4/scale)
+ {
+ y = floor(bottom/gridsize);
+ stopy = floor(top/gridsize);
+ x = floor(left/gridsize);
+ stopx = floor(right/gridsize);
+
+ y *= gridsize;
+ stopy *= gridsize;
+ x *= gridsize;
+ stopx *= gridsize;
+ if (y<bottom)
+ y+= gridsize;
+ if (x<left)
+ x+= gridsize;
+ if (stopx >= right)
+ stopx -= gridsize;
+ if (stopy >= top)
+ stopy -= gridsize;
+
+ beginUserPath (upath,NO);
+
+ for ( ; y<=stopy ; y+= gridsize)
+ if (y&63)
+ {
+ UPmoveto (upath, left, y);
+ UPlineto (upath, right, y);
+ }
+
+ for ( ; x<=stopx ; x+= gridsize)
+ if (x&63)
+ {
+ UPmoveto (upath, x, top);
+ UPlineto (upath, x, bottom);
+ }
+ endUserPath (upath, dps_ustroke);
+PSsetrgbcolor (0.8,0.8,1.0); // thin grid color
+ sendUserPath (upath);
+
+ }
+
+//
+// tiles
+//
+ PSsetgray (0); // for text
+
+ if (scale > 4.0/64)
+ {
+ y = floor(bottom/64);
+ stopy = floor(top/64);
+ x = floor(left/64);
+ stopx = floor(right/64);
+
+ y *= 64;
+ stopy *= 64;
+ x *= 64;
+ stopx *= 64;
+ if (y<bottom)
+ y+= 64;
+ if (x<left)
+ x+= 64;
+ if (stopx >= right)
+ stopx -= 64;
+ if (stopy >= top)
+ stopy -= 64;
+
+ beginUserPath (upath,NO);
+
+ for ( ; y<=stopy ; y+= 64)
+ {
+ if (showcoords)
+ {
+ sprintf (text, "%i",y);
+ PSmoveto(left,y);
+ PSshow(text);
+ }
+ UPmoveto (upath, left, y);
+ UPlineto (upath, right, y);
+ }
+
+ for ( ; x<=stopx ; x+= 64)
+ {
+ if (showcoords)
+ {
+ sprintf (text, "%i",x);
+ PSmoveto(x,bottom+2);
+ PSshow(text);
+ }
+ UPmoveto (upath, x, top);
+ UPlineto (upath, x, bottom);
+ }
+
+ endUserPath (upath, dps_ustroke);
+ PSsetgray (12.0/16);
+ sendUserPath (upath);
+ }
+
+ return self;
+}
+
+/*
+==================
+drawWire
+==================
+*/
+- drawWire: (const NXRect *)rects
+{
+ NXRect visRect;
+ int i,j, c, c2;
+ id ent, brush;
+ vec3_t mins, maxs;
+ BOOL drawnames;
+
+ drawnames = [quakeed_i showNames];
+
+ if ([quakeed_i showCoordinates]) // if coords are showing, update everything
+ {
+ [self getVisibleRect:&visRect];
+ rects = &visRect;
+ xy_draw_rect = *rects;
+ }
+
+
+ NXRectClip(rects);
+
+// erase window
+ NXEraseRect (rects);
+
+// draw grid
+ [self drawGrid: rects];
+
+// draw all entities, world first so entities take priority
+ linestart (0,0,0);
+
+ c = [map_i count];
+ for (i=0 ; i<c ; i++)
+ {
+ ent = [map_i objectAt: i];
+ c2 = [ent count];
+ for (j = c2-1 ; j >=0 ; j--)
+ {
+ brush = [ent objectAt: j];
+ if ( [brush selected] )
+ continue;
+ if ([brush regioned])
+ continue;
+ [brush XYDrawSelf];
+ }
+ if (i > 0 && drawnames)
+ { // draw entity names
+ brush = [ent objectAt: 0];
+ if (![brush regioned])
+ {
+ [brush getMins: mins maxs: maxs];
+ PSmoveto(mins[0], mins[1]);
+ PSsetrgbcolor (0,0,0);
+ PSshow([ent valueForQKey: "classname"]);
+ }
+ }
+ }
+
+ lineflush ();
+
+// resize if needed
+ newrect.origin.x -= gridsize;
+ newrect.origin.y -= gridsize;
+ newrect.size.width += 2*gridsize;
+ newrect.size.height += 2*gridsize;
+ if (!NXEqualRect (&newrect, &realbounds))
+ [self newRealBounds: &newrect];
+
+ return self;
+}
+
+
+/*
+=============
+drawSolid
+=============
+*/
+- drawSolid
+{
+ unsigned char *planes[5];
+ NXRect visRect;
+
+ [self getVisibleRect:&visRect];
+
+//
+// draw the image into imagebuffer
+//
+ r_origin[0] = visRect.origin.x;
+ r_origin[1] = visRect.origin.y;
+
+ r_origin[2] = scale/2; // using Z as a scale for the 2D projection
+
+ r_width = visRect.size.width*r_origin[2];
+ r_height = visRect.size.height*r_origin[2];
+
+ if (r_width != xywidth || r_height != xyheight)
+ {
+ xywidth = r_width;
+ xyheight = r_height;
+
+ if (xypicbuffer)
+ {
+ free (xypicbuffer);
+ free (xyzbuffer);
+ }
+ xypicbuffer = malloc (r_width*(r_height+1)*4);
+ xyzbuffer = malloc (r_width*(r_height+1)*4);
+ }
+
+ r_picbuffer = xypicbuffer;
+ r_zbuffer = xyzbuffer;
+
+ REN_BeginXY ();
+ REN_ClearBuffers ();
+
+//
+// render the entities
+//
+ [map_i makeAllPerform: @selector(XYRenderSelf)];
+
+//
+// display the output
+//
+ [self lockFocus];
+ [[self window] setBackingType:NX_RETAINED];
+
+ planes[0] = (unsigned char *)r_picbuffer;
+ NXDrawBitmap(
+ &visRect,
+ r_width,
+ r_height,
+ 8,
+ 3,
+ 32,
+ r_width*4,
+ NO,
+ NO,
+ NX_RGBColorSpace,
+ planes
+ );
+
+ NXPing ();
+ [[self window] setBackingType:NX_BUFFERED];
+ [self unlockFocus];
+
+ return self;
+}
+
+/*
+===================
+drawSelf
+===================
+*/
+NXRect xy_draw_rect;
+- drawSelf:(const NXRect *)rects :(int)rectCount
+{
+ static float drawtime; // static to shut up compiler warning
+
+ if (timedrawing)
+ drawtime = I_FloatTime ();
+
+ xy_draw_rect = *rects;
+ newrect.origin.x = newrect.origin.y = 99999;
+ newrect.size.width = newrect.size.height = -2*99999;
+
+// setup for text
+ PSselectfont("Helvetica-Medium",10/scale);
+ PSrotate(0);
+
+ if (drawmode == dr_texture || drawmode == dr_flat)
+ [self drawSolid];
+ else
+ [self drawWire: rects];
+
+ if (timedrawing)
+ {
+ NXPing ();
+ drawtime = I_FloatTime() - drawtime;
+ printf ("CameraView drawtime: %5.3f\n", drawtime);
+ }
+
+ return self;
+}
+
+
+
+/*
+===============================================================================
+
+ USER INTERACTION
+
+===============================================================================
+*/
+
+/*
+================
+dragLoop:
+================
+*/
+static NXPoint oldreletive;
+- dragFrom: (NXEvent *)startevent
+ useGrid: (BOOL)ug
+ callback: (void (*) (float dx, float dy)) callback
+{
+ NXEvent *event;
+ NXPoint startpt, newpt;
+ NXPoint reletive, delta;
+
+ startpt = startevent->location;
+ [self convertPoint:&startpt fromView:NULL];
+
+ oldreletive.x = oldreletive.y = 0;
+
+ if (ug)
+ {
+ startpt.x = [self snapToGrid: startpt.x];
+ startpt.y = [self snapToGrid: startpt.y];
+ }
+
+ while (1)
+ {
+ event = [NXApp getNextEvent: NX_LMOUSEUPMASK | NX_LMOUSEDRAGGEDMASK
+ | NX_RMOUSEUPMASK | NX_RMOUSEDRAGGEDMASK | NX_APPDEFINEDMASK];
+
+ if (event->type == NX_LMOUSEUP || event->type == NX_RMOUSEUP)
+ break;
+ if (event->type == NX_APPDEFINED)
+ { // doesn't work. grrr.
+ [quakeed_i applicationDefined:event];
+ continue;
+ }
+
+ newpt = event->location;
+ [self convertPoint:&newpt fromView:NULL];
+
+ if (ug)
+ {
+ newpt.x = [self snapToGrid: newpt.x];
+ newpt.y = [self snapToGrid: newpt.y];
+ }
+
+ reletive.x = newpt.x - startpt.x;
+ reletive.y = newpt.y - startpt.y;
+ if (reletive.x == oldreletive.x && reletive.y == oldreletive.y)
+ continue;
+
+ delta.x = reletive.x - oldreletive.x;
+ delta.y = reletive.y - oldreletive.y;
+ oldreletive = reletive;
+
+ callback (delta.x , delta.y );
+
+ }
+
+ return self;
+}
+
+//============================================================================
+
+
+void DragCallback (float dx, float dy)
+{
+ sb_translate[0] = dx;
+ sb_translate[1] = dy;
+ sb_translate[2] = 0;
+
+ [map_i makeSelectedPerform: @selector(translate)];
+
+ [quakeed_i redrawInstance];
+}
+
+- selectionDragFrom: (NXEvent*)theEvent
+{
+ qprintf ("dragging selection");
+ [self dragFrom: theEvent
+ useGrid: YES
+ callback: DragCallback ];
+ [quakeed_i updateAll];
+ qprintf ("");
+ return self;
+
+}
+
+//============================================================================
+
+void ScrollCallback (float dx, float dy)
+{
+ NXRect basebounds;
+ NXPoint neworg;
+ float scale;
+
+ [ [xyview_i superview] getBounds: &basebounds];
+ [xyview_i convertRectFromSuperview: &basebounds];
+
+ neworg.x = basebounds.origin.x - dx;
+ neworg.y = basebounds.origin.y - dy;
+
+ scale = [xyview_i currentScale];
+
+ oldreletive.x -= dx;
+ oldreletive.y -= dy;
+ [xyview_i setOrigin: &neworg scale: scale];
+}
+
+- scrollDragFrom: (NXEvent*)theEvent
+{
+ qprintf ("scrolling view");
+ [self dragFrom: theEvent
+ useGrid: YES
+ callback: ScrollCallback ];
+ qprintf ("");
+ return self;
+
+}
+
+//============================================================================
+
+vec3_t direction;
+
+void DirectionCallback (float dx, float dy)
+{
+ vec3_t org;
+ float ya;
+
+ direction[0] += dx;
+ direction[1] += dy;
+
+ [cameraview_i getOrigin: org];
+
+ if (direction[0] == org[0] && direction[1] == org[1])
+ return;
+
+ ya = atan2 (direction[1] - org[1], direction[0] - org[0]);
+
+ [cameraview_i setOrigin: org angle: ya];
+ [quakeed_i newinstance];
+ [cameraview_i display];
+}
+
+- directionDragFrom: (NXEvent*)theEvent
+{
+ NXPoint pt;
+
+ qprintf ("changing camera direction");
+
+ pt= theEvent->location;
+ [self convertPoint:&pt fromView:NULL];
+
+ direction[0] = pt.x;
+ direction[1] = pt.y;
+
+ DirectionCallback (0,0);
+
+ [self dragFrom: theEvent
+ useGrid: NO
+ callback: DirectionCallback ];
+ qprintf ("");
+ return self;
+}
+
+//============================================================================
+
+id newbrush;
+vec3_t neworg, newdrag;
+
+void NewCallback (float dx, float dy)
+{
+ vec3_t min, max;
+ int i;
+
+ newdrag[0] += dx;
+ newdrag[1] += dy;
+
+ for (i=0 ; i<3 ; i++)
+ {
+ if (neworg[i] < newdrag[i])
+ {
+ min[i] = neworg[i];
+ max[i] = newdrag[i];
+ }
+ else
+ {
+ min[i] = newdrag[i];
+ max[i] = neworg[i];
+ }
+ }
+
+ [newbrush setMins: min maxs: max];
+
+ [quakeed_i redrawInstance];
+}
+
+- newBrushDragFrom: (NXEvent*)theEvent
+{
+ id owner;
+ texturedef_t td;
+ NXPoint pt;
+
+ qprintf ("sizing new brush");
+
+ pt= theEvent->location;
+ [self convertPoint:&pt fromView:NULL];
+
+ neworg[0] = [self snapToGrid: pt.x];
+ neworg[1] = [self snapToGrid: pt.y];
+ neworg[2] = [map_i currentMinZ];
+
+ newdrag[0] = neworg[0];
+ newdrag[1] = neworg[1];
+ newdrag[2] = [map_i currentMaxZ];
+
+ owner = [map_i currentEntity];
+
+ [texturepalette_i getTextureDef: &td];
+
+ newbrush = [[SetBrush alloc] initOwner: owner
+ mins: neworg maxs: newdrag texture: &td];
+ [owner addObject: newbrush];
+
+ [newbrush setSelected: YES];
+
+ [self dragFrom: theEvent
+ useGrid: YES
+ callback: NewCallback ];
+
+ [newbrush removeIfInvalid];
+
+ [quakeed_i updateCamera];
+ qprintf ("");
+ return self;
+
+}
+
+//============================================================================
+
+void ControlCallback (float dx, float dy)
+{
+ int i;
+
+ for (i=0 ; i<numcontrolpoints ; i++)
+ {
+ controlpoints[i][0] += dx;
+ controlpoints[i][1] += dy;
+ }
+
+ [[map_i selectedBrush] calcWindings];
+ [quakeed_i redrawInstance];
+}
+
+- (BOOL)planeDragFrom: (NXEvent*)theEvent
+{
+ NXPoint pt;
+ vec3_t dragpoint;
+
+ if ([map_i numSelected] != 1)
+ return NO;
+
+ pt= theEvent->location;
+ [self convertPoint:&pt fromView:NULL];
+
+ dragpoint[0] = pt.x;
+ dragpoint[1] = pt.y;
+ dragpoint[2] = 2048;
+
+ [[map_i selectedBrush] getXYdragface: dragpoint];
+ if (!numcontrolpoints)
+ return NO;
+
+ qprintf ("dragging brush plane");
+
+ pt= theEvent->location;
+ [self convertPoint:&pt fromView:NULL];
+
+ [self dragFrom: theEvent
+ useGrid: YES
+ callback: ControlCallback ];
+
+ [[map_i selectedBrush] removeIfInvalid];
+
+ [quakeed_i updateAll];
+
+ qprintf ("");
+ return YES;
+}
+
+- (BOOL)shearDragFrom: (NXEvent*)theEvent
+{
+ NXPoint pt;
+ vec3_t dragpoint;
+ vec3_t p1, p2;
+ float time;
+ id br;
+ int face;
+
+ if ([map_i numSelected] != 1)
+ return NO;
+ br = [map_i selectedBrush];
+
+ pt= theEvent->location;
+ [self convertPoint:&pt fromView:NULL];
+
+// if the XY point is inside the brush, make the point on top
+ p1[0] = pt.x;
+ p1[1] = pt.y;
+ VectorCopy (p1, p2);
+
+ p1[2] = -2048*xy_viewnormal[2];
+ p2[2] = 2048*xy_viewnormal[2];
+
+ VectorCopy (p1, dragpoint);
+ [br hitByRay: p1 : p2 : &time : &face];
+
+ if (time > 0)
+ {
+ dragpoint[2] = p1[2] + (time-0.01)*xy_viewnormal[2];
+ }
+ else
+ {
+ [br getMins: p1 maxs: p2];
+ dragpoint[2] = (p1[2] + p2[2])/2;
+ }
+
+
+ [br getXYShearPoints: dragpoint];
+ if (!numcontrolpoints)
+ return NO;
+
+ qprintf ("dragging brush plane");
+
+ pt= theEvent->location;
+ [self convertPoint:&pt fromView:NULL];
+
+ [self dragFrom: theEvent
+ useGrid: YES
+ callback: ControlCallback ];
+
+ [br removeIfInvalid];
+
+ [quakeed_i updateAll];
+ qprintf ("");
+ return YES;
+}
+
+
+/*
+===============================================================================
+
+ INPUT METHODS
+
+===============================================================================
+*/
+
+
+/*
+===================
+mouseDown
+===================
+*/
+- mouseDown:(NXEvent *)theEvent
+{
+ NXPoint pt;
+ id ent;
+ vec3_t p1, p2;
+ int flags;
+
+ pt= theEvent->location;
+ [self convertPoint:&pt fromView:NULL];
+
+ p1[0] = p2[0] = pt.x;
+ p1[1] = p2[1] = pt.y;
+ p1[2] = xy_viewnormal[2] * -4096;
+ p2[2] = xy_viewnormal[2] * 4096;
+
+ flags = theEvent->flags & (NX_SHIFTMASK | NX_CONTROLMASK | NX_ALTERNATEMASK | NX_COMMANDMASK);
+
+//
+// shift click to select / deselect a brush from the world
+//
+ if (flags == NX_SHIFTMASK)
+ {
+ [map_i selectRay: p1 : p2 : YES];
+ return self;
+ }
+
+//
+// cmd-shift click to set a target/targetname entity connection
+//
+ if (flags == (NX_SHIFTMASK|NX_COMMANDMASK) )
+ {
+ [map_i entityConnect: p1 : p2];
+ return self;
+ }
+
+//
+// bare click to either drag selection, or rubber band a new brush
+//
+ if ( flags == 0 )
+ {
+ // if double click, position Z checker
+ if (theEvent->data.mouse.click > 1)
+ {
+ qprintf ("positioned Z checker");
+ [zview_i setPoint: &pt];
+ [quakeed_i newinstance];
+ [quakeed_i updateZ];
+ return self;
+ }
+
+ // check eye
+ if ( [cameraview_i XYmouseDown: &pt flags: theEvent->flags] )
+ return self; // camera move
+
+ // check z post
+ if ( [zview_i XYmouseDown: &pt] )
+ return self; // z view move
+
+ // check clippers
+ if ( [clipper_i XYDrag: &pt] )
+ return self;
+
+ // check single plane dragging
+ if ( [self planeDragFrom: theEvent] )
+ return self;
+
+ // check selection
+ ent = [map_i grabRay: p1 : p2];
+ if (ent)
+ return [self selectionDragFrom: theEvent];
+
+ if ([map_i numSelected])
+ {
+ qprintf ("missed");
+ return self;
+ }
+
+ return [self newBrushDragFrom: theEvent];
+ }
+
+//
+// control click = position and drag camera
+//
+ if (flags == NX_CONTROLMASK)
+ {
+ [cameraview_i setXYOrigin: &pt];
+ [quakeed_i newinstance];
+ [cameraview_i display];
+ [cameraview_i XYmouseDown: &pt flags: theEvent->flags];
+ qprintf ("");
+ return self;
+ }
+
+//
+// command click = drag Z checker
+//
+ if (flags == NX_COMMANDMASK)
+ {
+// check single plane dragging
+[self shearDragFrom: theEvent];
+return self;
+
+ qprintf ("moving Z checker");
+ [zview_i setXYOrigin: &pt];
+ [quakeed_i updateAll];
+ [zview_i XYmouseDown: &pt];
+ qprintf ("");
+ return self;
+ }
+
+//
+// alt click = set entire brush texture
+//
+ if (flags == NX_ALTERNATEMASK)
+ {
+ if (drawmode != dr_texture)
+ {
+ qprintf ("No texture setting except in texture mode!\n");
+ NopSound ();
+ return self;
+ }
+ [map_i setTextureRay: p1 : p2 : YES];
+ [quakeed_i updateAll];
+ return self;
+ }
+
+//
+// ctrl-alt click = set single face texture
+//
+ if (flags == (NX_CONTROLMASK | NX_ALTERNATEMASK) )
+ {
+ if (drawmode != dr_texture)
+ {
+ qprintf ("No texture setting except in texture mode!\n");
+ NopSound ();
+ return self;
+ }
+ [map_i setTextureRay: p1 : p2 : NO];
+ [quakeed_i updateAll];
+ return self;
+ }
+
+ qprintf ("bad flags for click");
+ NopSound ();
+ return self;
+}
+
+/*
+===================
+rightMouseDown
+===================
+*/
+- rightMouseDown:(NXEvent *)theEvent
+{
+ NXPoint pt;
+ int flags;
+
+ pt= theEvent->location;
+ [self convertPoint:&pt fromView:NULL];
+
+ flags = theEvent->flags & (NX_SHIFTMASK | NX_CONTROLMASK | NX_ALTERNATEMASK | NX_COMMANDMASK);
+
+ if (flags == NX_COMMANDMASK)
+ {
+ return [self scrollDragFrom: theEvent];
+ }
+
+ if (flags == NX_ALTERNATEMASK)
+ {
+ return [clipper_i XYClick: pt];
+ }
+
+ if (flags == 0 || flags == NX_CONTROLMASK)
+ {
+ return [self directionDragFrom: theEvent];
+ }
+
+ qprintf ("bad flags for click");
+ NopSound ();
+
+ return self;
+}
+
+
+@end
+
diff --git a/QuakeEd/ZScrollView.h b/QuakeEd/ZScrollView.h
new file mode 100644
index 0000000..cfe2204
--- /dev/null
+++ b/QuakeEd/ZScrollView.h
@@ -0,0 +1,11 @@
+#import <appkit/appkit.h>
+
+@interface ZScrollView : ScrollView
+{
+ id button1;
+}
+
+- initFrame:(const NXRect *)frameRect button1: b1;
+- tile;
+
+@end \ No newline at end of file
diff --git a/QuakeEd/ZScrollView.m b/QuakeEd/ZScrollView.m
new file mode 100644
index 0000000..479d80e
--- /dev/null
+++ b/QuakeEd/ZScrollView.m
@@ -0,0 +1,71 @@
+#import "qedefs.h"
+
+@implementation ZScrollView
+
+/*
+====================
+initFrame: button:
+
+Initizes a scroll view with a button at it's lower right corner
+====================
+*/
+
+- initFrame:(const NXRect *)frameRect button1:b1
+{
+ [super initFrame: frameRect];
+
+ [self addSubview: b1];
+
+ button1 = b1;
+
+ [self setHorizScrollerRequired: YES];
+ [self setVertScrollerRequired: YES];
+
+ [self setBorderType: NX_BEZEL];
+
+ return self;
+}
+
+
+/*
+================
+tile
+
+Adjust the size for the pop up scale menu
+=================
+*/
+
+- tile
+{
+ NXRect scrollerframe;
+
+ [super tile];
+ [hScroller getFrame: &scrollerframe];
+ [button1 setFrame: &scrollerframe];
+
+ scrollerframe.size.width = 0;
+ [hScroller setFrame: &scrollerframe];
+
+ return self;
+}
+
+
+
+-(BOOL) acceptsFirstResponder
+{
+ return YES;
+}
+
+- superviewSizeChanged:(const NXSize *)oldSize
+{
+ [super superviewSizeChanged: oldSize];
+
+ [[self docView] newSuperBounds];
+
+ return self;
+}
+
+
+
+@end
+
diff --git a/QuakeEd/ZView.h b/QuakeEd/ZView.h
new file mode 100644
index 0000000..bf0aaf8
--- /dev/null
+++ b/QuakeEd/ZView.h
@@ -0,0 +1,42 @@
+
+#import <appkit/appkit.h>
+#import "mathlib.h"
+
+extern id zview_i;
+
+// zplane controls the objects displayed in the xyview
+extern float zplane;
+extern float zplanedir;
+
+@interface ZView : View
+{
+ float minheight, maxheight;
+ float oldminheight, oldmaxheight;
+ float topbound, bottombound; // for floor clipping
+
+ float scale;
+
+ vec3_t origin;
+}
+
+- clearBounds;
+- getBounds: (float *)top :(float *)bottom;
+
+- getPoint: (NXPoint *)pt;
+- setPoint: (NXPoint *)pt;
+
+- addToHeightRange: (float)height;
+
+- newRealBounds;
+- newSuperBounds;
+
+- XYDrawSelf;
+
+- (BOOL)XYmouseDown: (NXPoint *)pt;
+
+- setXYOrigin: (NXPoint *)pt;
+
+- setOrigin: (NXPoint *)pt scale: (float)sc;
+
+@end
+
diff --git a/QuakeEd/ZView.m b/QuakeEd/ZView.m
new file mode 100644
index 0000000..bdf3356
--- /dev/null
+++ b/QuakeEd/ZView.m
@@ -0,0 +1,872 @@
+
+#import "qedefs.h"
+
+id zview_i;
+
+id zscrollview_i, zscalemenu_i, zscalebutton_i;
+
+float zplane;
+float zplanedir;
+
+@implementation ZView
+
+/*
+==================
+initFrame:
+==================
+*/
+- initFrame:(const NXRect *)frameRect
+{
+ NXPoint pt;
+
+ origin[0] = 0.333;
+ origin[1] = 0.333;
+
+ [super initFrame:frameRect];
+ [self allocateGState];
+ [self clearBounds];
+
+ zview_i = self;
+ scale = 1;
+
+//
+// initialize the pop up menus
+//
+ zscalemenu_i = [[PopUpList alloc] init];
+ [zscalemenu_i setTarget: self];
+ [zscalemenu_i setAction: @selector(scaleMenuTarget:)];
+
+ [zscalemenu_i addItem: "12.5%"];
+ [zscalemenu_i addItem: "25%"];
+ [zscalemenu_i addItem: "50%"];
+ [zscalemenu_i addItem: "75%"];
+ [zscalemenu_i addItem: "100%"];
+ [zscalemenu_i addItem: "200%"];
+ [zscalemenu_i addItem: "300%"];
+ [[zscalemenu_i itemList] selectCellAt: 4 : 0];
+
+ zscalebutton_i = NXCreatePopUpListButton(zscalemenu_i);
+
+
+// initialize the scroll view
+ zscrollview_i = [[ZScrollView alloc]
+ initFrame: frameRect
+ button1: zscalebutton_i
+ ];
+ [zscrollview_i setAutosizing: NX_WIDTHSIZABLE | NX_HEIGHTSIZABLE];
+
+ [[zscrollview_i setDocView: self] free];
+
+// [superview setDrawOrigin: 0 : 0];
+
+ minheight = 0;
+ maxheight = 64;
+
+ pt.x = -bounds.size.width;
+ pt.y = -128;
+
+ [self newRealBounds];
+
+ [self setOrigin: &pt scale: 1];
+
+ return zscrollview_i;
+}
+
+- setXYOrigin: (NXPoint *)pt
+{
+ origin[0] = pt->x + 0.333;
+ origin[1] = pt->y + 0.333;
+ return self;
+}
+
+- (float)currentScale
+{
+ return scale;
+}
+
+/*
+===================
+setOrigin:scale:
+===================
+*/
+- setOrigin: (NXPoint *)pt scale: (float)sc
+{
+ NXRect sframe;
+ NXRect newbounds;
+
+//
+// calculate the area visible in the cliprect
+//
+ scale = sc;
+
+ [superview getFrame: &sframe];
+ [superview getFrame: &newbounds];
+ newbounds.origin = *pt;
+ newbounds.size.width /= scale;
+ newbounds.size.height /= scale;
+
+//
+// union with the realbounds
+//
+ if (newbounds.origin.y > oldminheight)
+ {
+ newbounds.size.height += newbounds.origin.y - oldminheight;
+ newbounds.origin.y = oldminheight;
+ }
+ if (newbounds.origin.y+newbounds.size.height < oldmaxheight)
+ {
+ newbounds.size.height += oldmaxheight
+ - (newbounds.origin.y + newbounds.size.height);
+ }
+
+//
+// redisplay everything
+//
+ [quakeed_i disableDisplay];
+
+//
+// size this view
+//
+ [self sizeTo: newbounds.size.width : newbounds.size.height];
+ [self setDrawOrigin: -newbounds.size.width/2 : newbounds.origin.y];
+ [self moveTo: -newbounds.size.width/2 : newbounds.origin.y];
+
+//
+// scroll and scale the clip view
+//
+ [superview setDrawSize
+ : sframe.size.width/scale
+ : sframe.size.height/scale];
+ [superview setDrawOrigin: pt->x : pt->y];
+
+ [quakeed_i reenableDisplay];
+ [zscrollview_i display];
+
+ return self;
+}
+
+
+/*
+====================
+scaleMenuTarget:
+
+Called when the scaler popup on the window is used
+====================
+*/
+- scaleMenuTarget: sender
+{
+ char const *item;
+ NXRect visrect, sframe;
+ float nscale;
+
+ item = [[sender selectedCell] title];
+ sscanf (item,"%f",&nscale);
+ nscale /= 100;
+
+ if (nscale == scale)
+ return NULL;
+
+// keep the center of the view constant
+ [superview getBounds: &visrect];
+ [superview getFrame: &sframe];
+ visrect.origin.x += visrect.size.width/2;
+ visrect.origin.y += visrect.size.height/2;
+
+ visrect.origin.x -= sframe.size.width/2/nscale;
+ visrect.origin.y -= sframe.size.height/2/nscale;
+
+ [self setOrigin: &visrect.origin scale: nscale];
+
+ return self;
+}
+
+
+- clearBounds
+{
+ topbound = 999999;
+ bottombound = -999999;
+
+ return self;
+}
+
+- getBounds: (float *)top :(float *)bottom;
+{
+ *top = topbound;
+ *bottom = bottombound;
+ return self;
+}
+
+
+/*
+==================
+addToHeightRange:
+==================
+*/
+- addToHeightRange: (float)height
+{
+ if (height < minheight)
+ minheight = height;
+ if (height > maxheight)
+ maxheight = height;
+ return self;
+}
+
+
+/*
+==================
+newSuperBounds
+
+When superview is resized
+==================
+*/
+- newSuperBounds
+{
+ oldminheight++;
+ [self newRealBounds];
+
+ return self;
+}
+
+
+/*
+===================
+newRealBounds
+
+Should only change the scroll bars, not cause any redraws.
+If realbounds has shrunk, nothing will change.
+===================
+*/
+- newRealBounds
+{
+ NXRect sbounds;
+ float vistop, visbottom;
+
+ if (minheight == oldminheight && maxheight == oldmaxheight)
+ return self;
+
+ oldminheight = minheight;
+ oldmaxheight = maxheight;
+
+ minheight -= 16;
+ maxheight += 16;
+
+//
+// calculate the area visible in the cliprect
+//
+ [superview getBounds: &sbounds];
+ visbottom = sbounds.origin.y;
+ vistop = visbottom + sbounds.size.height;
+
+ if (vistop > maxheight)
+ maxheight = vistop;
+ if (visbottom < minheight)
+ minheight = visbottom;
+ if (minheight == bounds.origin.y && maxheight-minheight == bounds.size.height)
+ return self;
+
+ sbounds.origin.y = minheight;
+ sbounds.size.height = maxheight - minheight;
+
+//
+// size this view
+//
+ [quakeed_i disableDisplay];
+
+ [self suspendNotifyAncestorWhenFrameChanged:YES];
+ [self sizeTo: sbounds.size.width : sbounds.size.height];
+ [self setDrawOrigin: -sbounds.size.width/2 : sbounds.origin.y];
+ [self moveTo: -sbounds.size.width/2 : sbounds.origin.y];
+ [self suspendNotifyAncestorWhenFrameChanged:NO];
+ [[superview superview] reflectScroll: superview];
+
+ [quakeed_i reenableDisplay];
+
+ [[[[self superview] superview] vertScroller] display];
+
+ return self;
+}
+
+
+
+/*
+============
+drawGrid
+
+Draws tile markings every 64 units, and grid markings at the grid scale if
+the grid lines are >= 4 pixels apart
+
+Rect is in global world (unscaled) coordinates
+============
+*/
+
+- drawGrid: (const NXRect *)rect
+{
+ int y, stopy;
+ float top,bottom;
+ int left, right;
+ int gridsize;
+ char text[10];
+ BOOL showcoords;
+
+ showcoords = [quakeed_i showCoordinates];
+
+ PSsetlinewidth (0);
+
+ gridsize = [xyview_i gridsize];
+
+ left = bounds.origin.x;
+ right = 24;
+
+ bottom = rect->origin.y-1;
+ top = rect->origin.y+rect->size.height+2;
+
+//
+// grid
+//
+// can't just divide by grid size because of negetive coordinate
+// truncating direction
+//
+ if (gridsize>= 4/scale)
+ {
+ y = floor(bottom/gridsize);
+ stopy = floor(top/gridsize);
+
+ y *= gridsize;
+ stopy *= gridsize;
+ if (y<bottom)
+ y+= gridsize;
+
+ beginUserPath (upath,NO);
+
+ for ( ; y<=stopy ; y+= gridsize)
+ if (y&31)
+ {
+ UPmoveto (upath, left, y);
+ UPlineto (upath, right, y);
+ }
+
+ endUserPath (upath, dps_ustroke);
+ PSsetrgbcolor (0.8,0.8,1.0); // thin grid color
+ sendUserPath (upath);
+ }
+
+//
+// half tiles
+//
+ y = floor(bottom/32);
+ stopy = floor(top/32);
+
+ if ( ! (((int)y + 4096) & 1) )
+ y++;
+ y *= 32;
+ stopy *= 32;
+ if (stopy >= top)
+ stopy -= 32;
+
+ beginUserPath (upath,NO);
+
+ for ( ; y<=stopy ; y+= 64)
+ {
+ UPmoveto (upath, left, y);
+ UPlineto (upath, right, y);
+ }
+
+ endUserPath (upath, dps_ustroke);
+ PSsetgray (12.0/16.0);
+ sendUserPath (upath);
+
+//
+// tiles
+//
+ y = floor(bottom/64);
+ stopy = floor(top/64);
+
+ y *= 64;
+ stopy *= 64;
+ if (y<bottom)
+ y+= 64;
+ if (stopy >= top)
+ stopy -= 64;
+
+ beginUserPath (upath,NO);
+ PSsetgray (0); // for text
+ PSselectfont("Helvetica-Medium",10/scale);
+ PSrotate(0);
+
+ for ( ; y<=stopy ; y+= 64)
+ {
+ if (showcoords)
+ {
+ sprintf (text, "%i",y);
+ PSmoveto(left,y);
+ PSshow(text);
+ }
+ UPmoveto (upath, left+24, y);
+ UPlineto (upath, right, y);
+ }
+
+// divider
+ UPmoveto (upath, 0, bounds.origin.y);
+ UPlineto (upath, 0, bounds.origin.y + bounds.size.height);
+
+ endUserPath (upath, dps_ustroke);
+ PSsetgray (10.0/16.0);
+ sendUserPath (upath);
+
+//
+// origin
+//
+ PSsetlinewidth (5);
+ PSsetgray (4.0/16.0);
+ PSmoveto (right,0);
+ PSlineto (left,0);
+ PSstroke ();
+ PSsetlinewidth (0.15);
+
+ return self;
+}
+
+
+- drawZplane
+{
+ PSsetrgbcolor (0.2, 0.2, 0);
+ PSarc (0, zplane, 4, 0, M_PI*2);
+ PSfill ();
+ return self;
+}
+
+/*
+===============================================================================
+drawSelf
+===============================================================================
+*/
+
+- drawSelf:(const NXRect *)rects :(int)rectCount
+{
+ NXRect visRect;
+
+ minheight = 999999;
+ maxheight = -999999;
+
+// allways draw the entire bar
+ [self getVisibleRect:&visRect];
+ rects = &visRect;
+
+// erase window
+ NXEraseRect (&rects[0]);
+
+// draw grid
+ [self drawGrid: &rects[0]];
+
+// draw zplane
+// [self drawZplane];
+
+// draw all entities
+ [map_i makeUnselectedPerform: @selector(ZDrawSelf)];
+
+// possibly resize the view
+ [self newRealBounds];
+
+ return self;
+}
+
+/*
+==============
+XYDrawSelf
+==============
+*/
+- XYDrawSelf
+{
+ PSsetrgbcolor (0,0.5,1.0);
+ PSsetlinewidth (0.15);
+ PSmoveto (origin[0]-16, origin[1]-16);
+ PSrlineto (32,32);
+ PSmoveto (origin[0]-16, origin[1]+16);
+ PSrlineto (32,-32);
+ PSstroke ();
+
+ return self;
+}
+
+
+/*
+==============
+getPoint: (NXPoint *)pt
+==============
+*/
+- getPoint: (NXPoint *)pt
+{
+ pt->x = origin[0] + 0.333; // offset a bit to avoid edge cases
+ pt->y = origin[1] + 0.333;
+ return self;
+}
+
+- setPoint: (NXPoint *)pt
+{
+ origin[0] = pt->x;
+ origin[1] = pt->y;
+ return self;
+}
+
+
+/*
+==============================================================================
+
+MOUSE CLICKING
+
+==============================================================================
+*/
+
+
+/*
+================
+dragLoop:
+================
+*/
+static NXPoint oldreletive;
+- dragFrom: (NXEvent *)startevent
+ useGrid: (BOOL)ug
+ callback: (void (*) (float dy)) callback
+{
+ NXEvent *event;
+ NXPoint startpt, newpt;
+ NXPoint reletive, delta;
+ int gridsize;
+
+ gridsize = [xyview_i gridsize];
+
+ startpt = startevent->location;
+ [self convertPoint:&startpt fromView:NULL];
+
+ oldreletive.x = oldreletive.y = 0;
+
+ while (1)
+ {
+ event = [NXApp getNextEvent:
+ NX_LMOUSEUPMASK | NX_LMOUSEDRAGGEDMASK
+ | NX_RMOUSEUPMASK | NX_RMOUSEDRAGGEDMASK];
+ if (event->type == NX_LMOUSEUP || event->type == NX_RMOUSEUP)
+ break;
+
+ newpt = event->location;
+ [self convertPoint:&newpt fromView:NULL];
+
+ reletive.y = newpt.y - startpt.y;
+
+ if (ug)
+ { // we want truncate towards 0 behavior here
+ reletive.y = gridsize * (int)(reletive.y / gridsize);
+ }
+
+ if (reletive.y == oldreletive.y)
+ continue;
+
+ delta.y = reletive.y - oldreletive.y;
+ oldreletive = reletive;
+ callback (delta.y);
+ }
+
+ return self;
+}
+
+//============================================================================
+
+
+void ZDragCallback (float dy)
+{
+ sb_translate[0] = 0;
+ sb_translate[1] = 0;
+ sb_translate[2] = dy;
+
+ [map_i makeSelectedPerform: @selector(translate)];
+
+ [quakeed_i redrawInstance];
+}
+
+- selectionDragFrom: (NXEvent*)theEvent
+{
+ qprintf ("dragging selection");
+ [self dragFrom: theEvent
+ useGrid: YES
+ callback: ZDragCallback ];
+ [quakeed_i updateCamera];
+ qprintf ("");
+ return self;
+
+}
+
+//============================================================================
+
+void ZScrollCallback (float dy)
+{
+ NXRect basebounds;
+ NXPoint neworg;
+ float scale;
+
+ [ [zview_i superview] getBounds: &basebounds];
+ [zview_i convertRectFromSuperview: &basebounds];
+
+ neworg.y = basebounds.origin.y - dy;
+
+ scale = [zview_i currentScale];
+
+ oldreletive.y -= dy;
+ [zview_i setOrigin: &neworg scale: scale];
+}
+
+- scrollDragFrom: (NXEvent*)theEvent
+{
+ qprintf ("scrolling view");
+ [self dragFrom: theEvent
+ useGrid: YES
+ callback: ZScrollCallback ];
+ qprintf ("");
+ return self;
+}
+
+//============================================================================
+
+void ZControlCallback (float dy)
+{
+ int i;
+
+ for (i=0 ; i<numcontrolpoints ; i++)
+ controlpoints[i][2] += dy;
+
+ [[map_i selectedBrush] calcWindings];
+ [quakeed_i redrawInstance];
+}
+
+- (BOOL)planeDragFrom: (NXEvent*)theEvent
+{
+ NXPoint pt;
+ vec3_t dragpoint;
+
+ if ([map_i numSelected] != 1)
+ return NO;
+
+ pt= theEvent->location;
+ [self convertPoint:&pt fromView:NULL];
+
+ dragpoint[0] = origin[0];
+ dragpoint[1] = origin[1];
+ dragpoint[2] = pt.y;
+
+ [[map_i selectedBrush] getZdragface: dragpoint];
+ if (!numcontrolpoints)
+ return NO;
+
+ qprintf ("dragging brush plane");
+
+ pt= theEvent->location;
+ [self convertPoint:&pt fromView:NULL];
+
+ [self dragFrom: theEvent
+ useGrid: YES
+ callback: ZControlCallback ];
+
+ [[map_i selectedBrush] removeIfInvalid];
+
+ [quakeed_i updateCamera];
+ qprintf ("");
+ return YES;
+}
+
+
+//============================================================================
+
+/*
+===================
+mouseDown
+===================
+*/
+- mouseDown:(NXEvent *)theEvent
+{
+ NXPoint pt;
+ int flags;
+ vec3_t p1;
+
+ pt= theEvent->location;
+ [self convertPoint:&pt fromView:NULL];
+
+ p1[0] = origin[0];
+ p1[1] = origin[1];
+ p1[2] = pt.y;
+
+ flags = theEvent->flags & (NX_SHIFTMASK | NX_CONTROLMASK | NX_ALTERNATEMASK | NX_COMMANDMASK);
+
+//
+// shift click to select / deselect a brush from the world
+//
+ if (flags == NX_SHIFTMASK)
+ {
+ [map_i selectRay: p1 : p1 : NO];
+ return self;
+ }
+
+//
+// alt click = set entire brush texture
+//
+ if (flags == NX_ALTERNATEMASK)
+ {
+ [map_i setTextureRay: p1 : p1 : YES];
+ return self;
+ }
+
+//
+// control click = position view
+//
+ if (flags == NX_CONTROLMASK)
+ {
+ [cameraview_i setZOrigin: pt.y];
+ [quakeed_i updateAll];
+ [cameraview_i ZmouseDown: &pt flags:theEvent->flags];
+ return self;
+ }
+
+//
+// bare click to drag icons or new brush drag
+//
+ if ( flags == 0 )
+ {
+// check eye
+ if ( [cameraview_i ZmouseDown: &pt flags:theEvent->flags] )
+ return self;
+
+ if ([map_i numSelected])
+ {
+ if ( pt.x > 0)
+ {
+ if ([self planeDragFrom: theEvent])
+ return self;
+ }
+ [self selectionDragFrom: theEvent];
+ return self;
+ }
+
+ }
+
+ qprintf ("bad flags for click");
+ NopSound ();
+ return self;
+}
+
+/*
+===================
+rightMouseDown
+===================
+*/
+- rightMouseDown:(NXEvent *)theEvent
+{
+ NXPoint pt;
+ int flags;
+
+ pt= theEvent->location;
+ [self convertPoint:&pt fromView:NULL];
+
+ flags = theEvent->flags & (NX_SHIFTMASK | NX_CONTROLMASK | NX_ALTERNATEMASK | NX_COMMANDMASK);
+
+
+//
+// click = scroll view
+//
+ if (flags == 0)
+ {
+ return [self scrollDragFrom: theEvent];
+ }
+
+ qprintf ("bad flags for click");
+ NopSound ();
+
+ return self;
+}
+
+
+/*
+===============================================================================
+
+ XY mouse view methods
+
+===============================================================================
+*/
+
+/*
+================
+modalMoveLoop
+================
+*/
+- modalMoveLoop: (NXPoint *)basept :(vec3_t)movemod : converter
+{
+ vec3_t originbase;
+ NXEvent *event;
+ NXPoint newpt;
+ vec3_t delta;
+
+ int i;
+
+ VectorCopy (origin, originbase);
+
+//
+// modal event loop using instance drawing
+//
+ goto drawentry;
+
+ while (event->type != NX_LMOUSEUP)
+ {
+ //
+ // calculate new point
+ //
+ newpt = event->location;
+ [converter convertPoint:&newpt fromView:NULL];
+
+ delta[0] = newpt.x-basept->x;
+ delta[1] = newpt.y-basept->y;
+ delta[2] = delta[1]; // height change
+
+ for (i=0 ; i<3 ; i++)
+ origin[i] = originbase[i]+movemod[i]*delta[i];
+
+
+drawentry:
+ //
+ // instance draw new frame
+ //
+ [quakeed_i newinstance];
+ [self display];
+ NXPing ();
+
+ event = [NXApp getNextEvent:
+ NX_LMOUSEUPMASK | NX_LMOUSEDRAGGEDMASK];
+ }
+
+//
+// draw the brush back into the window buffer
+//
+// [xyview_i display];
+
+ return self;
+}
+
+/*
+===============
+XYmouseDown
+===============
+*/
+- (BOOL)XYmouseDown: (NXPoint *)pt
+{
+ vec3_t movemod;
+
+ if (fabs(pt->x - origin[0]) > 16
+ || fabs(pt->y - origin[1]) > 16)
+ return NO;
+
+ movemod[0] = 1;
+ movemod[1] = 1;
+ movemod[2] = 0;
+
+ [self modalMoveLoop: pt : movemod : xyview_i];
+
+ return YES;
+}
+
+@end
diff --git a/QuakeEd/cmdlib.c b/QuakeEd/cmdlib.c
new file mode 100644
index 0000000..52cb170
--- /dev/null
+++ b/QuakeEd/cmdlib.c
@@ -0,0 +1,611 @@
+// cmdlib.c
+
+#include "cmdlib.h"
+
+#define PATHSEPERATOR '/'
+
+
+/*
+================
+I_FloatTime
+================
+*/
+double I_FloatTime (void)
+{
+ struct timeval tp;
+ struct timezone tzp;
+ static int secbase;
+
+ gettimeofday(&tp, &tzp);
+
+ if (!secbase)
+ {
+ secbase = tp.tv_sec;
+ return tp.tv_usec/1000000.0;
+ }
+
+ return (tp.tv_sec - secbase) + tp.tv_usec/1000000.0;
+}
+
+
+char com_token[1024];
+boolean com_eof;
+
+/*
+==============
+COM_Parse
+
+Parse a token out of a string
+==============
+*/
+char *COM_Parse (char *data)
+{
+ int c;
+ int len;
+
+ com_eof = false;
+
+ len = 0;
+ com_token[0] = 0;
+
+ if (!data)
+ return NULL;
+
+// skip whitespace
+skipwhite:
+ while ( (c = *data) <= ' ')
+ {
+ if (c == 0)
+ {
+ com_eof = true;
+ return NULL; // end of file;
+ }
+ data++;
+ }
+
+// skip // comments
+ if (c=='/' && data[1] == '/')
+ {
+ while (*data && *data != '\n')
+ data++;
+ goto skipwhite;
+ }
+
+
+// handle quoted strings specially
+ if (c == '\"')
+ {
+ data++;
+ do
+ {
+ c = *data++;
+ if (c=='\"')
+ {
+ com_token[len] = 0;
+ return data;
+ }
+ com_token[len] = c;
+ len++;
+ } while (1);
+ }
+
+// parse single characters
+ if (c=='{' || c=='}'|| c==')'|| c=='(' || c=='\'' || c==':')
+ {
+ com_token[len] = c;
+ len++;
+ com_token[len] = 0;
+ return data+1;
+ }
+
+// parse a regular word
+ do
+ {
+ com_token[len] = c;
+ data++;
+ len++;
+ c = *data;
+ if (c=='{' || c=='}'|| c==')'|| c=='(' || c=='\'' || c==':')
+ break;
+ } while (c>32);
+
+ com_token[len] = 0;
+ return data;
+}
+
+/*
+================
+=
+= filelength
+=
+================
+*/
+
+int filelength (int handle)
+{
+ struct stat fileinfo;
+
+ if (fstat (handle,&fileinfo) == -1)
+ {
+ fprintf (stderr,"Error fstating");
+ exit (1);
+ }
+
+ return fileinfo.st_size;
+}
+
+int tell (int handle)
+{
+ return lseek (handle, 0, L_INCR);
+}
+
+char *strupr (char *start)
+{
+ char *in;
+ in = start;
+ while (*in)
+ {
+ *in = toupper(*in);
+ in++;
+ }
+ return start;
+}
+
+char *strlower (char *start)
+{
+ char *in;
+ in = start;
+ while (*in)
+ {
+ *in = tolower(*in);
+ in++;
+ }
+ return start;
+}
+
+char *getcwd (char *path, int length)
+{
+ return getwd(path);
+}
+
+
+/* globals for command line args */
+extern int NXArgc;
+extern char **NXArgv;
+#define myargc NXArgc
+#define myargv NXArgv
+
+
+/*
+=============================================================================
+
+ MISC FUNCTIONS
+
+=============================================================================
+*/
+
+
+/*
+=================
+=
+= CheckParm
+=
+= Checks for the given parameter in the program's command line arguments
+=
+= Returns the argument number (1 to argc-1) or 0 if not present
+=
+=================
+*/
+
+int CheckParm (char *check)
+{
+ int i;
+
+ for (i = 1;i<myargc;i++)
+ {
+ if ( !stricmp(check, myargv[i]) )
+ return i;
+ }
+
+ return 0;
+}
+
+
+
+
+int SafeOpenWrite (char *filename)
+{
+ int handle;
+
+ umask (0);
+
+ handle = open(filename,O_RDWR | O_CREAT | O_TRUNC
+ , 0666);
+
+ if (handle == -1)
+ Error ("Error opening %s: %s",filename,strerror(errno));
+
+ return handle;
+}
+
+int SafeOpenRead (char *filename)
+{
+ int handle;
+
+ handle = open(filename,O_RDONLY);
+
+ if (handle == -1)
+ Error ("Error opening %s: %s",filename,strerror(errno));
+
+ return handle;
+}
+
+
+void SafeRead (int handle, void *buffer, long count)
+{
+ int iocount;
+
+ iocount = read (handle,buffer,count);
+ if (iocount != count)
+ Error ("File read failure");
+}
+
+
+void SafeWrite (int handle, void *buffer, long count)
+{
+ int iocount;
+
+ iocount = write (handle,buffer,count);
+ if (iocount != count)
+ Error ("File write failure");
+}
+
+
+void *SafeMalloc (long size)
+{
+ void *ptr;
+
+ ptr = malloc (size);
+
+ if (!ptr)
+ Error ("Malloc failure for %lu bytes",size);
+
+ return ptr;
+}
+
+
+/*
+==============
+=
+= LoadFile
+=
+= appends a 0 byte
+==============
+*/
+
+long LoadFile (char *filename, void **bufferptr)
+{
+ int handle;
+ long length;
+ void *buffer;
+
+ handle = SafeOpenRead (filename);
+ length = filelength (handle);
+ buffer = SafeMalloc (length+1);
+ ((char *)buffer)[length] = 0;
+ SafeRead (handle, buffer, length);
+ close (handle);
+
+ *bufferptr = buffer;
+ return length;
+}
+
+
+/*
+==============
+=
+= SaveFile
+=
+==============
+*/
+
+void SaveFile (char *filename, void *buffer, long count)
+{
+ int handle;
+
+ handle = SafeOpenWrite (filename);
+ SafeWrite (handle, buffer, count);
+ close (handle);
+}
+
+
+
+void DefaultExtension (char *path, char *extension)
+{
+ char *src;
+//
+// if path doesn't have a .EXT, append extension
+// (extension should include the .)
+//
+ src = path + strlen(path) - 1;
+
+ while (*src != PATHSEPERATOR && src != path)
+ {
+ if (*src == '.')
+ return; // it has an extension
+ src--;
+ }
+
+ strcat (path, extension);
+}
+
+
+void DefaultPath (char *path, char *basepath)
+{
+ char temp[128];
+
+ if (path[0] == PATHSEPERATOR)
+ return; // absolute path location
+ strcpy (temp,path);
+ strcpy (path,basepath);
+ strcat (path,temp);
+}
+
+
+void StripFilename (char *path)
+{
+ int length;
+
+ length = strlen(path)-1;
+ while (length > 0 && path[length] != PATHSEPERATOR)
+ length--;
+ path[length] = 0;
+}
+
+void StripExtension (char *path)
+{
+ int length;
+
+ length = strlen(path)-1;
+ while (length > 0 && path[length] != '.')
+ length--;
+ if (length)
+ path[length] = 0;
+}
+
+
+/*
+====================
+=
+= Extract file parts
+=
+====================
+*/
+
+void ExtractFilePath (char *path, char *dest)
+{
+ char *src;
+
+ src = path + strlen(path) - 1;
+
+//
+// back up until a \ or the start
+//
+ while (src != path && *(src-1) != PATHSEPERATOR)
+ src--;
+
+ memcpy (dest, path, src-path);
+ dest[src-path] = 0;
+}
+
+void ExtractFileBase (char *path, char *dest)
+{
+ char *src;
+
+ src = path + strlen(path) - 1;
+
+//
+// back up until a \ or the start
+//
+ while (src != path && *(src-1) != PATHSEPERATOR)
+ src--;
+
+ while (*src && *src != '.')
+ {
+ *dest++ = *src++;
+ }
+ *dest = 0;
+}
+
+void ExtractFileExtension (char *path, char *dest)
+{
+ char *src;
+
+ src = path + strlen(path) - 1;
+
+//
+// back up until a . or the start
+//
+ while (src != path && *(src-1) != '.')
+ src--;
+ if (src == path)
+ {
+ *dest = 0; // no extension
+ return;
+ }
+
+ strcpy (dest,src);
+}
+
+
+/*
+==============
+=
+= ParseNum / ParseHex
+=
+==============
+*/
+
+long ParseHex (char *hex)
+{
+ char *str;
+ long num;
+
+ num = 0;
+ str = hex;
+
+ while (*str)
+ {
+ num <<= 4;
+ if (*str >= '0' && *str <= '9')
+ num += *str-'0';
+ else if (*str >= 'a' && *str <= 'f')
+ num += 10 + *str-'a';
+ else if (*str >= 'A' && *str <= 'F')
+ num += 10 + *str-'A';
+ else
+ Error ("Bad hex number: %s",hex);
+ str++;
+ }
+
+ return num;
+}
+
+
+long ParseNum (char *str)
+{
+ if (str[0] == '$')
+ return ParseHex (str+1);
+ if (str[0] == '0' && str[1] == 'x')
+ return ParseHex (str+2);
+ return atol (str);
+}
+
+
+int GetKey (void)
+{
+ return getchar ();
+}
+
+
+/*
+============================================================================
+
+ BYTE ORDER FUNCTIONS
+
+============================================================================
+*/
+
+#ifdef __BIG_ENDIAN__
+
+short LittleShort (short l)
+{
+ byte b1,b2;
+
+ b1 = l&255;
+ b2 = (l>>8)&255;
+
+ return (b1<<8) + b2;
+}
+
+short BigShort (short l)
+{
+ return l;
+}
+
+
+long LittleLong (long l)
+{
+ byte b1,b2,b3,b4;
+
+ b1 = l&255;
+ b2 = (l>>8)&255;
+ b3 = (l>>16)&255;
+ b4 = (l>>24)&255;
+
+ return ((long)b1<<24) + ((long)b2<<16) + ((long)b3<<8) + b4;
+}
+
+long BigLong (long l)
+{
+ return l;
+}
+
+
+float LittleFloat (float l)
+{
+ union {byte b[4]; float f;} in, out;
+
+ in.f = l;
+ out.b[0] = in.b[3];
+ out.b[1] = in.b[2];
+ out.b[2] = in.b[1];
+ out.b[3] = in.b[0];
+
+ return out.f;
+}
+
+float BigFloat (float l)
+{
+ return l;
+}
+
+
+#else
+
+
+short BigShort (short l)
+{
+ byte b1,b2;
+
+ b1 = l&255;
+ b2 = (l>>8)&255;
+
+ return (b1<<8) + b2;
+}
+
+short LittleShort (short l)
+{
+ return l;
+}
+
+
+long BigLong (long l)
+{
+ byte b1,b2,b3,b4;
+
+ b1 = l&255;
+ b2 = (l>>8)&255;
+ b3 = (l>>16)&255;
+ b4 = (l>>24)&255;
+
+ return ((long)b1<<24) + ((long)b2<<16) + ((long)b3<<8) + b4;
+}
+
+long LittleLong (long l)
+{
+ return l;
+}
+
+float BigFloat (float l)
+{
+ union {byte b[4]; float f;} in, out;
+
+ in.f = l;
+ out.b[0] = in.b[3];
+ out.b[1] = in.b[2];
+ out.b[2] = in.b[1];
+ out.b[3] = in.b[0];
+
+ return out.f;
+}
+
+float LittleFloat (float l)
+{
+ return l;
+}
+
+
+
+#endif
+
diff --git a/QuakeEd/cmdlib.h b/QuakeEd/cmdlib.h
new file mode 100644
index 0000000..4ebef86
--- /dev/null
+++ b/QuakeEd/cmdlib.h
@@ -0,0 +1,62 @@
+// cmdlib.h
+
+#ifndef __CMDLIB__
+#define __CMDLIB__
+
+#include <libc.h>
+#include <errno.h>
+#include <ctype.h>
+
+#define strcmpi strcasecmp
+#define stricmp strcasecmp
+char *strupr (char *in);
+char *strlower (char *in);
+int filelength (int handle);
+int tell (int handle);
+
+#ifndef __BYTEBOOL__
+#define __BYTEBOOL__
+typedef enum {false, true} boolean;
+typedef unsigned char byte;
+#endif
+
+double I_FloatTime (void);
+
+int GetKey (void);
+
+void Error (char *error, ...);
+int CheckParm (char *check);
+
+int SafeOpenWrite (char *filename);
+int SafeOpenRead (char *filename);
+void SafeRead (int handle, void *buffer, long count);
+void SafeWrite (int handle, void *buffer, long count);
+void *SafeMalloc (long size);
+
+long LoadFile (char *filename, void **bufferptr);
+void SaveFile (char *filename, void *buffer, long count);
+
+void DefaultExtension (char *path, char *extension);
+void DefaultPath (char *path, char *basepath);
+void StripFilename (char *path);
+void StripExtension (char *path);
+
+void ExtractFilePath (char *path, char *dest);
+void ExtractFileBase (char *path, char *dest);
+void ExtractFileExtension (char *path, char *dest);
+
+long ParseNum (char *str);
+
+short BigShort (short l);
+short LittleShort (short l);
+long BigLong (long l);
+long LittleLong (long l);
+float BigFloat (float l);
+float LittleFloat (float l);
+
+extern char com_token[1024];
+extern boolean com_eof;
+
+char *COM_Parse (char *data);
+
+#endif
diff --git a/QuakeEd/help.txt b/QuakeEd/help.txt
new file mode 100644
index 0000000..92e9eb1
--- /dev/null
+++ b/QuakeEd/help.txt
@@ -0,0 +1,175 @@
+QuakeEd 2.0
+by John Carmack and John Romero
+
+Terms:
+
+Brush
+A convex polyhedron with a textruedef for each face.
+
+Entity
+A set of brushes and key/value attributes. The world is allways entity 0. Lights, doors, monsters, etc are all entities. Entities can either have a fixed, non-modifiable size (monsters, lights, etc), or can be represented by an arbitrary collection of brushes (doors, plats, bridges, etc).
+
+An entity is created by selecting one or more brushes in the world, then selecting a class in the Entity Browser, then clicking Create Entity (or double click the class name). If the entity class has a fixed size, the selected brushes are removed and a fixed sized brush is put in their place. Otherwise, the selected brushes are removed from the world entity and made the contents of the newly created entity.
+
+Current Entity
+
+Selection
+The current selection of brushes is drawn with a red outline.
+
+The selection is not cleared when loading a new map, so selections can be brought over from other files.
+
+Texturedef
+A texture name with offset numbers and flip flags. Determines what will be drawn on a brush face. By default, all faces of a brush have the same texturedef, but you can explicityly change single faces if desired.
+
+
+
+Using QuakeEd:
+
+The NeXT "cmd" key is the alt key on the left side of the space bar. "alt" is the alt key on the right side.
+
+Camera View
+
+click
+Sets the current texturedef to the value of the face clicked on.
+
+Does not change any selection status.
+
+f there are any brushes selected, they will all be changed to this texturedef.
+
+If there are no brushes selected, the height of the next new brush created will be set based on the size of the brush clicked on.
+
+
+shift-click
+Toggles the selection status of the clicked on brush.
+
+If the brush is part of a different entity than the current entity, all brushes in current are deselected before selecting the new brush. The current entity inpector is then changed to reflect the new entity.
+
+alt-click
+Sets the entire brush clicked on to the current texturedef. Does not change any selection status.
+
+alt-ctrl-click
+Sets the single face clicked on to the current texturedef without changing the other faces.
+
+
+right-click drag
+Change camera angle.
+
+
+XYView
+
+double click
+Positions the Z checker at the click point.
+
+click drag with no selection
+The camera or Z checker will be dragged if directly clicked on, otherwise a new rectilinear brush will be dragged out from the click point. The initial height of the brush is determined by the last brush selected or camera-clicked on.
+
+If the button is released when the new brush has no volume (a veneer), the brush is discarded.
+
+click drag with a single brush selected
+If the click is inside the selected brush, the brush will be dragged around without changing its shape.
+
+If the click is outside the brush, dragging will move the planes that face the click point. Planes will only move directly along their normals, so a recrilinear brush will stay rectilinear.
+
+Spawned entity brushes (monsters, etc) can not be resized at all.
+
+click drag with multiple brushes selected
+No group shape changes are allowed, so the click must be inside one of the brushes, and all brushes are moved together.
+
+cmd-click drag with a single brush selected
+Holds the plane that faces the click point, and shears the adjacent planes. To grab a single corner, click outside the brush in the overlap area between two planes. If you click inside the brush, the top plane will be held.
+
+shift-click
+Toggles the selection status of the clicked on brush as in the camera view.
+
+Entities are allways checked before the world, so you can shift-click on entities even if there is a ceiling above them.
+
+cmd-shift click
+Connects two entities. The current entity has a target key generated, and the clicked on entity has a targetname key created.
+
+alt-click
+alt-ctrl-click
+Sets textures as in the camera view.
+
+ctrl-click
+Moves the camera to the point clicked on. It can be dragged dynamically if desired.
+
+right click
+right ctrl-click
+Points the camera towards the click point. It can be dragged if desired.
+
+cmd-right click drag
+Slides the XY view to expose more space.
+
+alt-right click
+Positions a clipper tool endpoint. The first click places it at the minimum Z of the selection. A second click at the same point moves it to the maximum Z of the selection.
+
+Two clipper points will carve as a straight line in the XY view. Three points (one of which must be at the max point instead of the min) will carve a slope.
+
+Escape removes the current clippers, and enter actually cuts the selection.
+
+
+ZView
+
+click drag
+The camera icon can be dragged if it is clicked on, otherwise no action if there is not a selection.
+
+If multiple brushes are selected, they will allways be dragged as a unit, no matter where the click is.
+
+If a single brush is selected, the location of the click determines if the drag will move the entire brush or just the top or bottom plane.
+
+A click anywhere on the left side of the Z view will drag the full brush. If the click is on the right side, it will drag just the plane closest to it, changing the size of the brush. Clicking inside a brush on the right side also drags the full brush.
+
+shift-click
+Toggles the selection status of the clicked on brush as in the camera view.
+
+alt-click
+Sets the entire brush texture as in the camera view. (alt-ctrl click is meaningless without a direction)
+
+ctrl-click
+Moves the camera to the height clicked on. It can be dragged dynamically if desired.
+
+right click drag
+Slides the Z view to expose more space.
+
+
+Keyboard
+
+F2 : set camera wire draw mode
+F3 : set camera solid draw mode
+F4 : set camera textured draw mode
+
+F5 : set XY wire draw mode
+F6 : set XY textured draw mode
+
+F8 : Home camera pitch angle
+
+F12 : geometrically subtract the selection from the rest of the world.
+
+PageUp : moves the camera view to the next floor up.
+PageDown : moves the camera view to the next floor down.
+
+cursor arrows, a z d c , .
+Step move the camera with quake controls.
+
+Esc or End: deselect all selected brushes
+Backspace : delete all selected brushes
+
+/ : Flip the normal on the clipper tool
+
+Enter : Carve selected brushes by the clipper tool
+
+Space : clone all selected brushes. deselects the originals and selects the copies after offsetting by the grid size.
+
+Keypad arrows: moves the current selection in gridsize incrmenets.
+
++ - : moves the current selection up or down by gridsize increments.
+
+cmd-1 - cmd-7 : change inspectors
+
+
+Text commands
+
+Obscure commands are entered by typing the command into the command field (under the output field).
+
+texname : prints the names of the textures on the selected brush. Used to track down problems with accidentally taking graphics out of a wadfile.
+
diff --git a/QuakeEd/i_90d.tiff b/QuakeEd/i_90d.tiff
new file mode 100644
index 0000000..932893d
--- /dev/null
+++ b/QuakeEd/i_90d.tiff
Binary files differ
diff --git a/QuakeEd/i_add.tiff b/QuakeEd/i_add.tiff
new file mode 100644
index 0000000..a85e40d
--- /dev/null
+++ b/QuakeEd/i_add.tiff
Binary files differ
diff --git a/QuakeEd/i_brushes.tiff b/QuakeEd/i_brushes.tiff
new file mode 100644
index 0000000..91bb328
--- /dev/null
+++ b/QuakeEd/i_brushes.tiff
Binary files differ
diff --git a/QuakeEd/i_fliph.tiff b/QuakeEd/i_fliph.tiff
new file mode 100644
index 0000000..905e17d
--- /dev/null
+++ b/QuakeEd/i_fliph.tiff
Binary files differ
diff --git a/QuakeEd/i_flipv.tiff b/QuakeEd/i_flipv.tiff
new file mode 100644
index 0000000..d3d97d6
--- /dev/null
+++ b/QuakeEd/i_flipv.tiff
Binary files differ
diff --git a/QuakeEd/i_quakeed.tiff b/QuakeEd/i_quakeed.tiff
new file mode 100644
index 0000000..32ef81b
--- /dev/null
+++ b/QuakeEd/i_quakeed.tiff
Binary files differ
diff --git a/QuakeEd/i_sub.tiff b/QuakeEd/i_sub.tiff
new file mode 100644
index 0000000..4830c28
--- /dev/null
+++ b/QuakeEd/i_sub.tiff
Binary files differ
diff --git a/QuakeEd/inspectors.tiff b/QuakeEd/inspectors.tiff
new file mode 100644
index 0000000..111e431
--- /dev/null
+++ b/QuakeEd/inspectors.tiff
Binary files differ
diff --git a/QuakeEd/jrbase1.map b/QuakeEd/jrbase1.map
new file mode 100644
index 0000000..4531fde
--- /dev/null
+++ b/QuakeEd/jrbase1.map
@@ -0,0 +1,11858 @@
+{
+"message" "Entering the Military Base"
+"wad" "gfx/base.wad"
+"classname" "worldspawn"
+{
+( 448 -320 64 ) ( 448 -384 64 ) ( 448 -384 0 ) SLIPBOTSD 0 0 90 -1.000000 1.000000
+( 512 -320 64 ) ( 448 -320 64 ) ( 448 -320 0 ) SLIPBOTSD 0 0 90 -1.000000 1.000000
+( 512 -384 64 ) ( 512 -320 64 ) ( 512 -320 0 ) SLIPBOTSD 0 0 90 -1.000000 1.000000
+( 448 -384 64 ) ( 512 -384 64 ) ( 512 -384 0 ) SLIPBOTSD 0 0 90 -1.000000 1.000000
+( 448 -384 64 ) ( 448 -320 64 ) ( 512 -320 64 ) +0SLIPBOT 0 0 0 1.000000 1.000000
+( 512 -320 48 ) ( 448 -320 48 ) ( 448 -384 48 ) SLIPBOTSD 0 0 90 -1.000000 1.000000
+}
+{
+( 512 -368 64 ) ( 512 -384 64 ) ( 512 -384 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+( 528 -368 64 ) ( 512 -368 64 ) ( 512 -368 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+( 528 -384 64 ) ( 528 -368 64 ) ( 528 -368 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+( 512 -384 64 ) ( 528 -384 64 ) ( 528 -384 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+( 512 -384 64 ) ( 512 -368 64 ) ( 528 -368 64 ) SLIPLITE 0 0 0 1.000000 1.000000
+( 528 -368 48 ) ( 512 -368 48 ) ( 512 -384 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+}
+{
+( 512 -320 64 ) ( 512 -336 64 ) ( 512 -336 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+( 528 -320 64 ) ( 512 -320 64 ) ( 512 -320 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+( 528 -336 64 ) ( 528 -320 64 ) ( 528 -320 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+( 512 -336 64 ) ( 528 -336 64 ) ( 528 -336 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+( 512 -336 64 ) ( 512 -320 64 ) ( 528 -320 64 ) SLIPLITE 0 0 0 1.000000 1.000000
+( 528 -320 48 ) ( 512 -320 48 ) ( 512 -336 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+}
+{
+( 432 -368 64 ) ( 432 -384 64 ) ( 432 -384 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+( 448 -368 64 ) ( 432 -368 64 ) ( 432 -368 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+( 448 -384 64 ) ( 448 -368 64 ) ( 448 -368 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+( 432 -384 64 ) ( 448 -384 64 ) ( 448 -384 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+( 432 -384 64 ) ( 432 -368 64 ) ( 448 -368 64 ) SLIPLITE 0 0 0 1.000000 1.000000
+( 448 -368 48 ) ( 432 -368 48 ) ( 432 -384 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+}
+{
+( 432 -320 64 ) ( 432 -336 64 ) ( 432 -336 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+( 448 -320 64 ) ( 432 -320 64 ) ( 432 -320 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+( 448 -336 64 ) ( 448 -320 64 ) ( 448 -320 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+( 432 -336 64 ) ( 448 -336 64 ) ( 448 -336 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+( 432 -336 64 ) ( 432 -320 64 ) ( 448 -320 64 ) SLIPLITE 0 0 0 1.000000 1.000000
+( 448 -320 48 ) ( 432 -320 48 ) ( 432 -336 48 ) SLIPSIDE 0 0 0 1.000000 1.000000
+}
+{
+( 304 328 0 ) ( 304 136 0 ) ( 304 136 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 520 384 0 ) ( 328 384 0 ) ( 328 384 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 656 56 0 ) ( 656 248 0 ) ( 656 248 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 384 -16 0 ) ( 576 -16 0 ) ( 576 -16 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 384 64 0 ) ( 384 256 0 ) ( 576 256 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 576 256 -16 ) ( 384 256 -16 ) ( 384 64 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 304 192 16 ) ( 304 136 16 ) ( 304 136 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 320 136 16 ) ( 320 192 16 ) ( 320 192 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 136 192 ) ( 304 192 192 ) ( 320 192 192 ) TECH08_1 0 0 0 1.000000 1.000000
+( 320 192 0 ) ( 304 192 0 ) ( 304 136 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 296 320 -16 ) ( 296 320 176 ) ( 312 320 176 ) TECH04_3 0 0 0 1.000000 1.000000
+( 320 336 0 ) ( 320 336 16 ) ( 288 336 16 ) TECH08_1 0 0 0 1.000000 1.000000
+}
+{
+( 304 192 16 ) ( 304 136 16 ) ( 304 136 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 320 384 16 ) ( 304 384 16 ) ( 304 384 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 320 136 16 ) ( 320 192 16 ) ( 320 192 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 320 192 0 ) ( 304 192 0 ) ( 304 136 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 288 336 16 ) ( 320 336 16 ) ( 320 336 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 288 336 16 ) ( 288 384 16 ) ( 320 384 16 ) TECH08_1 0 0 0 1.000000 1.000000
+}
+{
+( 304 192 16 ) ( 304 136 16 ) ( 304 136 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 320 136 16 ) ( 320 192 16 ) ( 320 192 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 296 0 16 ) ( 312 0 16 ) ( 312 0 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 136 192 ) ( 304 192 192 ) ( 320 192 192 ) TECH08_1 0 0 0 1.000000 1.000000
+( 320 192 0 ) ( 304 192 0 ) ( 304 136 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 320 64 -16 ) ( 320 64 176 ) ( 304 64 176 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 304 192 16 ) ( 304 136 16 ) ( 304 136 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 320 136 16 ) ( 320 192 16 ) ( 320 192 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 136 192 ) ( 304 192 192 ) ( 320 192 192 ) TECH08_1 0 0 0 1.000000 1.000000
+( 312 320 176 ) ( 296 320 176 ) ( 296 320 -16 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 64 176 ) ( 320 64 176 ) ( 320 64 -16 ) TECH08_1 0 0 0 1.000000 1.000000
+( 320 128 112 ) ( 304 128 112 ) ( 304 64 112 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 304 192 16 ) ( 304 136 16 ) ( 304 136 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 320 136 16 ) ( 320 192 16 ) ( 320 192 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 320 192 0 ) ( 304 192 0 ) ( 304 136 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 312 320 176 ) ( 296 320 176 ) ( 296 320 -16 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 64 176 ) ( 320 64 176 ) ( 320 64 -16 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 64 48 ) ( 304 128 48 ) ( 320 128 48 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 640 192 16 ) ( 640 136 16 ) ( 640 136 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 640 384 16 ) ( 624 384 16 ) ( 624 384 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 656 136 16 ) ( 656 192 16 ) ( 656 192 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 640 136 192 ) ( 640 192 192 ) ( 656 192 192 ) TECH08_1 0 0 0 1.000000 1.000000
+( 656 192 0 ) ( 640 192 0 ) ( 640 136 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 640 320 48 ) ( 640 320 112 ) ( 656 320 112 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 640 192 16 ) ( 640 136 16 ) ( 640 136 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 656 136 16 ) ( 656 192 16 ) ( 656 192 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 632 0 16 ) ( 648 0 16 ) ( 648 0 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 640 136 192 ) ( 640 192 192 ) ( 656 192 192 ) TECH08_1 0 0 0 1.000000 1.000000
+( 656 192 0 ) ( 640 192 0 ) ( 640 136 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 656 64 48 ) ( 656 64 112 ) ( 640 64 112 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 640 192 16 ) ( 640 136 16 ) ( 640 136 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 656 136 16 ) ( 656 192 16 ) ( 656 192 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 640 136 192 ) ( 640 192 192 ) ( 656 192 192 ) TECH08_1 0 0 0 1.000000 1.000000
+( 656 320 112 ) ( 640 320 112 ) ( 640 320 48 ) TECH08_1 0 0 0 1.000000 1.000000
+( 640 64 112 ) ( 656 64 112 ) ( 656 64 48 ) TECH08_1 0 0 0 1.000000 1.000000
+( 656 320 112 ) ( 640 320 112 ) ( 640 64 112 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 640 192 16 ) ( 640 136 16 ) ( 640 136 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 656 136 16 ) ( 656 192 16 ) ( 656 192 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 656 192 0 ) ( 640 192 0 ) ( 640 136 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 656 320 112 ) ( 640 320 112 ) ( 640 320 48 ) TECH08_1 0 0 0 1.000000 1.000000
+( 640 64 112 ) ( 656 64 112 ) ( 656 64 48 ) TECH08_1 0 0 0 1.000000 1.000000
+( 640 64 48 ) ( 640 320 48 ) ( 656 320 48 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 640 192 208 ) ( 640 192 176 ) ( 640 0 176 ) TECH01_7 0 0 0 1.000000 1.000000
+( 608 192 208 ) ( 640 192 208 ) ( 640 0 208 ) TECH01_7 0 0 0 1.000000 1.000000
+( 608 384 208 ) ( 608 384 176 ) ( 640 384 176 ) TECH01_7 0 0 0 1.000000 1.000000
+( 640 0 176 ) ( 608 0 176 ) ( 608 0 208 ) TECH01_7 0 0 0 1.000000 1.000000
+( 608 0 208 ) ( 640 0 176 ) ( 608 16 208 ) TECH01_7 0 0 0 1.000000 1.000000
+}
+{
+( 320 0 176 ) ( 320 192 176 ) ( 320 192 208 ) TECH01_7 0 0 0 1.000000 1.000000
+( 320 0 208 ) ( 320 192 208 ) ( 352 192 208 ) TECH01_7 0 0 0 1.000000 1.000000
+( 320 384 176 ) ( 352 384 176 ) ( 352 384 208 ) TECH01_7 0 0 0 1.000000 1.000000
+( 352 0 208 ) ( 352 0 176 ) ( 320 0 176 ) TECH01_7 0 0 0 1.000000 1.000000
+( 352 16 208 ) ( 320 0 176 ) ( 352 0 208 ) TECH01_7 0 0 0 1.000000 1.000000
+}
+{
+( 320 256 240 ) ( 320 64 240 ) ( 320 64 208 ) TECH01_7 0 0 0 1.000000 1.000000
+( 536 384 240 ) ( 472 384 240 ) ( 472 384 208 ) TECH01_7 0 0 0 1.000000 1.000000
+( 640 64 240 ) ( 640 256 240 ) ( 640 256 208 ) TECH01_7 0 0 0 1.000000 1.000000
+( 480 0 240 ) ( 544 0 240 ) ( 544 0 208 ) TECH01_7 0 0 0 1.000000 1.000000
+( 480 64 240 ) ( 480 256 240 ) ( 544 256 240 ) TECH01_7 0 0 0 1.000000 1.000000
+( 544 256 208 ) ( 480 256 208 ) ( 480 64 208 ) TECH01_7 0 0 0 1.000000 1.000000
+}
+{
+( 704 0 208 ) ( 704 0 176 ) ( 512 0 176 ) TECH01_7 0 0 0 1.000000 1.000000
+( 704 32 208 ) ( 704 0 208 ) ( 512 0 208 ) TECH01_7 0 0 0 1.000000 1.000000
+( 640 32 208 ) ( 640 32 176 ) ( 640 0 176 ) TECH01_7 0 0 0 1.000000 1.000000
+( 320 8 176 ) ( 320 40 176 ) ( 320 40 208 ) TECH01_7 0 0 0 1.000000 1.000000
+( 512 32 208 ) ( 512 0 176 ) ( 528 32 208 ) TECH01_7 0 0 0 1.000000 1.000000
+}
+{
+( 448 128 208 ) ( 448 64 208 ) ( 448 64 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 512 128 208 ) ( 448 128 208 ) ( 448 128 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 512 64 208 ) ( 512 128 208 ) ( 512 128 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 64 208 ) ( 512 64 208 ) ( 512 64 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 64 208 ) ( 448 128 208 ) ( 512 128 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 512 128 192 ) ( 448 128 192 ) ( 448 64 192 ) TLIGHT02 0 0 0 1.000000 1.000000
+}
+{
+( 304 0 192 ) ( 304 -16 192 ) ( 304 -16 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 656 0 192 ) ( 304 0 192 ) ( 304 0 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 -16 192 ) ( 656 -16 192 ) ( 656 -16 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 -16 192 ) ( 304 0 192 ) ( 656 0 192 ) TECH08_1 0 0 0 1.000000 1.000000
+( 656 0 0 ) ( 304 0 0 ) ( 304 -16 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 416 -16 0 ) ( 416 -16 192 ) ( 416 0 192 ) TECH08_1 64 0 0 1.000000 1.000000
+}
+{
+( 656 0 192 ) ( 304 0 192 ) ( 304 0 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 656 -16 192 ) ( 656 0 192 ) ( 656 0 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 -16 192 ) ( 656 -16 192 ) ( 656 -16 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 -16 192 ) ( 304 0 192 ) ( 656 0 192 ) TECH08_1 0 0 0 1.000000 1.000000
+( 656 0 0 ) ( 304 0 0 ) ( 304 -16 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 544 0 0 ) ( 544 0 192 ) ( 544 -16 192 ) TECH08_1 64 0 0 1.000000 1.000000
+}
+{
+( 656 0 192 ) ( 304 0 192 ) ( 304 0 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 -16 192 ) ( 656 -16 192 ) ( 656 -16 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 -16 192 ) ( 304 0 192 ) ( 656 0 192 ) TECH08_1 0 0 0 1.000000 1.000000
+( 416 0 192 ) ( 416 -16 192 ) ( 416 -16 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 544 -16 192 ) ( 544 0 192 ) ( 544 0 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 544 0 128 ) ( 416 0 128 ) ( 416 -16 128 ) TECH08_1 0 0 0 1.000000 1.000000
+}
+{
+( 448 320 208 ) ( 448 256 208 ) ( 448 256 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 512 320 208 ) ( 448 320 208 ) ( 448 320 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 512 256 208 ) ( 512 320 208 ) ( 512 320 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 256 208 ) ( 512 256 208 ) ( 512 256 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 256 208 ) ( 448 320 208 ) ( 512 320 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 512 320 192 ) ( 448 320 192 ) ( 448 256 192 ) TLIGHT02 0 0 0 1.000000 1.000000
+}
+{
+( 224 64 192 ) ( 224 48 192 ) ( 224 48 0 ) TECH09_3 0 0 0 1.000000 1.000000
+( 304 64 192 ) ( 240 64 192 ) ( 240 64 0 ) COMP1_3 16 240 0 1.000000 1.000000
+( 304 48 192 ) ( 304 64 192 ) ( 304 64 0 ) TECH09_3 0 0 0 1.000000 1.000000
+( 240 48 192 ) ( 304 48 192 ) ( 304 48 0 ) TECH09_3 0 0 0 1.000000 1.000000
+( 240 48 112 ) ( 240 64 112 ) ( 304 64 112 ) TECH09_3 0 0 0 1.000000 1.000000
+( 304 64 48 ) ( 240 64 48 ) ( 240 48 48 ) TECH09_3 0 0 0 1.000000 1.000000
+}
+{
+( 224 336 192 ) ( 224 48 192 ) ( 224 48 0 ) COMP1_1 0 240 0 1.000000 1.000000
+( 248 320 192 ) ( 232 320 192 ) ( 232 320 0 ) COMP1_1 0 240 0 1.000000 1.000000
+( 240 48 192 ) ( 240 336 192 ) ( 240 336 0 ) COMP1_1 0 240 0 1.000000 1.000000
+( 232 256 192 ) ( 248 256 192 ) ( 248 256 0 ) COMP1_1 0 240 0 1.000000 1.000000
+( 224 48 112 ) ( 224 336 112 ) ( 240 336 112 ) COMP1_1 0 240 0 1.000000 1.000000
+( 240 336 48 ) ( 224 336 48 ) ( 224 48 48 ) COMP1_1 0 240 0 1.000000 1.000000
+}
+{
+( 224 336 112 ) ( 224 320 112 ) ( 224 320 48 ) TECH09_3 0 0 0 1.000000 1.000000
+( 304 336 112 ) ( 240 336 112 ) ( 240 336 48 ) TECH09_3 0 0 0 1.000000 1.000000
+( 304 320 112 ) ( 304 336 112 ) ( 304 336 48 ) TECH09_3 0 0 0 1.000000 1.000000
+( 240 320 112 ) ( 304 320 112 ) ( 304 320 48 ) COMP1_3 16 240 0 1.000000 1.000000
+( 240 320 112 ) ( 240 336 112 ) ( 304 336 112 ) TECH09_3 0 0 0 1.000000 1.000000
+( 304 336 48 ) ( 240 336 48 ) ( 240 320 48 ) TECH09_3 0 0 0 1.000000 1.000000
+}
+{
+( 240 320 48 ) ( 240 64 48 ) ( 240 64 -16 ) COMP1_4 16 0 0 1.000000 1.000000
+( 304 320 48 ) ( 240 320 48 ) ( 240 320 -16 ) COMP1_4 16 0 0 1.000000 1.000000
+( 304 64 48 ) ( 304 320 48 ) ( 304 320 -16 ) COMP1_4 16 0 0 1.000000 1.000000
+( 240 64 48 ) ( 304 64 48 ) ( 304 64 -16 ) COMP1_4 16 0 0 1.000000 1.000000
+( 240 64 48 ) ( 240 320 48 ) ( 304 320 48 ) COMP1_4 16 0 0 1.000000 1.000000
+( 304 320 32 ) ( 240 320 32 ) ( 240 64 32 ) COMP1_4 16 0 0 1.000000 1.000000
+}
+{
+( 224 144 192 ) ( 224 -144 192 ) ( 224 -144 0 ) COMP1_1 0 240 0 1.000000 1.000000
+( 248 128 192 ) ( 232 128 192 ) ( 232 128 0 ) COMP1_1 0 240 0 1.000000 1.000000
+( 240 -144 192 ) ( 240 144 192 ) ( 240 144 0 ) COMP1_1 0 240 0 1.000000 1.000000
+( 232 64 192 ) ( 248 64 192 ) ( 248 64 0 ) COMP1_1 0 240 0 1.000000 1.000000
+( 224 -144 112 ) ( 224 144 112 ) ( 240 144 112 ) COMP1_1 0 240 0 1.000000 1.000000
+( 240 144 48 ) ( 224 144 48 ) ( 224 -144 48 ) COMP1_1 0 240 0 1.000000 1.000000
+}
+{
+( 224 208 192 ) ( 224 -80 192 ) ( 224 -80 0 ) COMP1_2 0 240 0 1.000000 1.000000
+( 248 192 192 ) ( 232 192 192 ) ( 232 192 0 ) COMP1_2 0 240 0 1.000000 1.000000
+( 240 -80 192 ) ( 240 208 192 ) ( 240 208 0 ) COMP1_2 0 240 0 1.000000 1.000000
+( 232 128 192 ) ( 248 128 192 ) ( 248 128 0 ) COMP1_2 0 240 0 1.000000 1.000000
+( 224 -80 112 ) ( 224 208 112 ) ( 240 208 112 ) COMP1_2 0 240 0 1.000000 1.000000
+( 240 208 48 ) ( 224 208 48 ) ( 224 -80 48 ) COMP1_2 0 240 0 1.000000 1.000000
+}
+{
+( 224 272 192 ) ( 224 -16 192 ) ( 224 -16 0 ) COMP1_3 0 240 0 1.000000 1.000000
+( 248 256 192 ) ( 232 256 192 ) ( 232 256 0 ) COMP1_3 0 240 0 1.000000 1.000000
+( 240 -16 192 ) ( 240 272 192 ) ( 240 272 0 ) COMP1_3 0 240 0 1.000000 1.000000
+( 232 192 192 ) ( 248 192 192 ) ( 248 192 0 ) COMP1_3 0 240 0 1.000000 1.000000
+( 224 -16 112 ) ( 224 272 112 ) ( 240 272 112 ) COMP1_3 0 240 0 1.000000 1.000000
+( 240 272 48 ) ( 224 272 48 ) ( 224 -16 48 ) COMP1_3 0 240 0 1.000000 1.000000
+}
+{
+( 240 96 128 ) ( 240 64 128 ) ( 240 64 64 ) TLIGHT02 0 0 0 1.000000 1.000000
+( 304 320 128 ) ( 264 320 128 ) ( 264 320 64 ) TLIGHT02 0 0 0 1.000000 1.000000
+( 304 288 128 ) ( 304 320 128 ) ( 304 320 64 ) TLIGHT02 0 0 0 1.000000 1.000000
+( 240 64 128 ) ( 280 64 128 ) ( 280 64 64 ) TLIGHT02 0 0 0 1.000000 1.000000
+( 264 288 128 ) ( 264 320 128 ) ( 304 320 128 ) TLIGHT02 0 0 0 1.000000 1.000000
+( 304 320 112 ) ( 264 320 112 ) ( 264 288 112 ) TLIGHT02 0 0 0 1.000000 1.000000
+}
+{
+( 320 384 16 ) ( 320 0 16 ) ( 320 0 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 384 384 16 ) ( 320 384 16 ) ( 320 384 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 384 0 16 ) ( 384 384 16 ) ( 384 384 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( 320 0 16 ) ( 384 0 16 ) ( 384 0 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 320 0 16 ) ( 320 384 16 ) ( 384 384 16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 384 384 0 ) ( 320 384 0 ) ( 320 0 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 320 48 16 ) ( 320 0 16 ) ( 320 0 0 ) TECH04_3 0 16 0 1.000000 1.000000
+( 352 48 16 ) ( 320 48 16 ) ( 320 48 0 ) TECH04_3 0 16 0 1.000000 1.000000
+( 352 0 16 ) ( 352 48 16 ) ( 352 48 0 ) TECH04_3 0 16 0 1.000000 1.000000
+( 320 0 16 ) ( 352 0 16 ) ( 352 0 0 ) TECH04_3 0 16 0 1.000000 1.000000
+( 320 0 192 ) ( 320 48 192 ) ( 352 48 192 ) TECH04_3 0 16 0 1.000000 1.000000
+( 352 48 16 ) ( 320 48 16 ) ( 320 0 16 ) TECH04_3 0 16 0 1.000000 1.000000
+}
+{
+( 608 48 16 ) ( 608 0 16 ) ( 608 0 0 ) TECH04_3 0 16 0 1.000000 1.000000
+( 640 48 16 ) ( 608 48 16 ) ( 608 48 0 ) TECH04_3 0 16 0 1.000000 1.000000
+( 640 0 16 ) ( 640 48 16 ) ( 640 48 0 ) TECH04_3 0 16 0 1.000000 1.000000
+( 608 0 16 ) ( 640 0 16 ) ( 640 0 0 ) TECH04_3 0 16 0 1.000000 1.000000
+( 608 0 192 ) ( 608 48 192 ) ( 640 48 192 ) TECH04_3 0 16 0 1.000000 1.000000
+( 640 48 16 ) ( 608 48 16 ) ( 608 0 16 ) TECH04_3 0 16 0 1.000000 1.000000
+}
+{
+( 736 48 0 ) ( 736 48 192 ) ( 736 64 192 ) COMP1_6 240 240 0 1.000000 1.000000
+( 720 64 0 ) ( 720 64 192 ) ( 656 64 192 ) COMP1_6 240 240 0 1.000000 1.000000
+( 656 48 0 ) ( 656 48 192 ) ( 720 48 192 ) COMP1_6 240 240 0 1.000000 1.000000
+( 656 64 112 ) ( 720 64 112 ) ( 720 48 112 ) COMP1_6 240 240 0 1.000000 1.000000
+( 720 48 48 ) ( 720 64 48 ) ( 656 64 48 ) COMP1_6 240 240 0 1.000000 1.000000
+( 720 64 48 ) ( 720 64 112 ) ( 720 48 112 ) COMP1_1 0 240 0 1.000000 1.000000
+}
+{
+( 736 48 0 ) ( 736 48 192 ) ( 736 336 192 ) COMP1_1 0 240 0 1.000000 1.000000
+( 728 320 0 ) ( 728 320 192 ) ( 712 320 192 ) COMP1_1 0 240 0 1.000000 1.000000
+( 720 336 0 ) ( 720 336 192 ) ( 720 48 192 ) COMP1_1 0 240 0 1.000000 1.000000
+( 712 256 0 ) ( 712 256 192 ) ( 728 256 192 ) COMP1_1 0 240 0 1.000000 1.000000
+( 720 336 112 ) ( 736 336 112 ) ( 736 48 112 ) COMP1_1 0 240 0 1.000000 1.000000
+( 736 48 48 ) ( 736 336 48 ) ( 720 336 48 ) COMP1_1 0 240 0 1.000000 1.000000
+}
+{
+( 736 320 48 ) ( 736 320 112 ) ( 736 336 112 ) COMP1_6 240 240 0 1.000000 1.000000
+( 720 336 48 ) ( 720 336 112 ) ( 656 336 112 ) COMP1_6 240 240 0 1.000000 1.000000
+( 656 336 48 ) ( 656 336 112 ) ( 656 320 112 ) COMP1_6 240 240 0 1.000000 1.000000
+( 656 320 48 ) ( 656 320 112 ) ( 720 320 112 ) COMP1_3 -16 240 0 1.000000 1.000000
+( 656 336 112 ) ( 720 336 112 ) ( 720 320 112 ) COMP1_6 240 240 0 1.000000 1.000000
+( 720 320 48 ) ( 720 336 48 ) ( 656 336 48 ) COMP1_6 240 240 0 1.000000 1.000000
+}
+{
+( 720 64 -16 ) ( 720 64 48 ) ( 720 320 48 ) COMP1_4 16 0 0 1.000000 1.000000
+( 720 320 -16 ) ( 720 320 48 ) ( 656 320 48 ) COMP1_4 16 0 0 1.000000 1.000000
+( 656 320 -16 ) ( 656 320 48 ) ( 656 64 48 ) COMP1_4 16 0 0 1.000000 1.000000
+( 656 -48 -16 ) ( 656 -48 48 ) ( 720 -48 48 ) COMP1_4 16 0 0 1.000000 1.000000
+( 656 320 48 ) ( 720 320 48 ) ( 720 64 48 ) COMP1_4 16 0 0 1.000000 1.000000
+( 720 64 32 ) ( 720 320 32 ) ( 656 320 32 ) COMP1_4 16 0 0 1.000000 1.000000
+}
+{
+( 736 -144 0 ) ( 736 -144 192 ) ( 736 144 192 ) COMP1_1 0 240 0 1.000000 1.000000
+( 728 128 0 ) ( 728 128 192 ) ( 712 128 192 ) COMP1_1 0 240 0 1.000000 1.000000
+( 720 144 0 ) ( 720 144 192 ) ( 720 -144 192 ) COMP1_1 0 240 0 1.000000 1.000000
+( 712 64 0 ) ( 712 64 192 ) ( 728 64 192 ) COMP1_1 0 240 0 1.000000 1.000000
+( 720 144 112 ) ( 736 144 112 ) ( 736 -144 112 ) COMP1_1 0 240 0 1.000000 1.000000
+( 736 -144 48 ) ( 736 144 48 ) ( 720 144 48 ) COMP1_1 0 240 0 1.000000 1.000000
+}
+{
+( 736 -80 0 ) ( 736 -80 192 ) ( 736 208 192 ) COMP1_3 0 240 0 1.000000 1.000000
+( 728 192 0 ) ( 728 192 192 ) ( 712 192 192 ) COMP1_3 0 240 0 1.000000 1.000000
+( 720 208 0 ) ( 720 208 192 ) ( 720 -80 192 ) COMP1_3 0 240 0 1.000000 1.000000
+( 712 128 0 ) ( 712 128 192 ) ( 728 128 192 ) COMP1_3 0 240 0 1.000000 1.000000
+( 720 208 112 ) ( 736 208 112 ) ( 736 -80 112 ) COMP1_3 0 240 0 1.000000 1.000000
+( 736 -80 48 ) ( 736 208 48 ) ( 720 208 48 ) COMP1_3 0 240 0 1.000000 1.000000
+}
+{
+( 736 -16 0 ) ( 736 -16 192 ) ( 736 272 192 ) COMP1_2 0 240 0 1.000000 1.000000
+( 728 256 0 ) ( 728 256 192 ) ( 712 256 192 ) COMP1_2 0 240 0 1.000000 1.000000
+( 720 272 0 ) ( 720 272 192 ) ( 720 -16 192 ) COMP1_2 0 240 0 1.000000 1.000000
+( 712 192 0 ) ( 712 192 192 ) ( 728 192 192 ) COMP1_2 0 240 0 1.000000 1.000000
+( 720 272 112 ) ( 736 272 112 ) ( 736 -16 112 ) COMP1_2 0 240 0 1.000000 1.000000
+( 736 -16 48 ) ( 736 272 48 ) ( 720 272 48 ) COMP1_2 0 240 0 1.000000 1.000000
+}
+{
+( 720 64 64 ) ( 720 64 128 ) ( 720 96 128 ) TLIGHT10 0 0 0 1.000000 1.000000
+( 696 320 64 ) ( 696 320 128 ) ( 656 320 128 ) TLIGHT10 0 0 0 1.000000 1.000000
+( 656 320 64 ) ( 656 320 128 ) ( 656 288 128 ) TLIGHT10 0 0 0 1.000000 1.000000
+( 672 -48 64 ) ( 672 -48 128 ) ( 712 -48 128 ) TLIGHT10 0 0 0 1.000000 1.000000
+( 656 320 128 ) ( 696 320 128 ) ( 696 288 128 ) TLIGHT10 0 0 0 1.000000 1.000000
+( 696 288 112 ) ( 696 320 112 ) ( 656 320 112 ) TLIGHT10 0 0 0 1.000000 1.000000
+}
+{
+( 640 0 0 ) ( 640 0 16 ) ( 640 384 16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 648 768 0 ) ( 648 768 16 ) ( 584 768 16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 576 384 0 ) ( 576 384 16 ) ( 576 0 16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 576 0 0 ) ( 576 0 16 ) ( 640 0 16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 576 384 16 ) ( 640 384 16 ) ( 640 0 16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 640 0 0 ) ( 640 384 0 ) ( 576 384 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 608 384 16 ) ( 608 336 16 ) ( 608 336 0 ) TECH04_3 0 16 0 1.000000 1.000000
+( 640 384 16 ) ( 608 384 16 ) ( 608 384 0 ) TECH04_3 0 16 0 1.000000 1.000000
+( 640 336 16 ) ( 640 384 16 ) ( 640 384 0 ) TECH04_3 0 16 0 1.000000 1.000000
+( 608 336 16 ) ( 640 336 16 ) ( 640 336 0 ) TECH04_3 0 16 0 1.000000 1.000000
+( 608 336 192 ) ( 608 384 192 ) ( 640 384 192 ) TECH04_3 0 16 0 1.000000 1.000000
+( 640 384 16 ) ( 608 384 16 ) ( 608 336 16 ) TECH04_3 0 16 0 1.000000 1.000000
+}
+{
+( 320 384 192 ) ( 320 336 192 ) ( 320 336 16 ) TECH04_3 32 0 90 -1.000000 1.000000
+( 392 384 192 ) ( 352 384 192 ) ( 352 384 16 ) TECH04_3 32 0 90 -1.000000 1.000000
+( 608 336 192 ) ( 608 384 192 ) ( 608 384 16 ) TECH04_3 32 0 90 -1.000000 1.000000
+( 352 336 192 ) ( 392 336 192 ) ( 392 336 16 ) TECH04_3 32 0 90 -1.000000 1.000000
+( 352 336 208 ) ( 352 384 208 ) ( 392 384 208 ) TECH04_3 32 0 90 -1.000000 1.000000
+( 392 384 160 ) ( 352 384 160 ) ( 352 336 160 ) TECH04_3 32 0 90 -1.000000 1.000000
+}
+{
+( 528 -16 -16 ) ( 544 -16 -16 ) ( 544 -16 48 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 528 -208 48 ) ( 544 -208 48 ) ( 544 -208 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 528 -208 -16 ) ( 544 -208 -16 ) ( 544 -16 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 576 -216 48 ) ( 576 -24 48 ) ( 576 -24 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 384 -8 -16 ) ( 384 -8 48 ) ( 384 -200 48 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 544 -16 0 ) ( 528 -208 48 ) ( 528 -16 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 384 -208 48 ) ( 384 -320 48 ) ( 384 -320 32 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 576 -208 48 ) ( 384 -208 48 ) ( 384 -208 32 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 576 -320 48 ) ( 576 -208 48 ) ( 576 -208 32 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 384 -416 48 ) ( 576 -416 48 ) ( 576 -416 32 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 384 -320 48 ) ( 384 -208 48 ) ( 576 -208 48 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 576 -208 32 ) ( 384 -208 32 ) ( 384 -320 32 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 576 -16 192 ) ( 576 -48 192 ) ( 576 -48 0 ) TECH08_1 96 0 0 1.000000 1.000000
+( 592 -16 192 ) ( 576 -16 192 ) ( 576 -16 0 ) TECH08_1 96 0 0 1.000000 1.000000
+( 592 -48 192 ) ( 592 -16 192 ) ( 592 -16 0 ) TECH08_1 96 0 0 1.000000 1.000000
+( 568 -416 192 ) ( 584 -416 192 ) ( 584 -416 0 ) TECH08_1 96 0 0 1.000000 1.000000
+( 576 -48 192 ) ( 576 -16 192 ) ( 592 -16 192 ) TECH08_1 96 0 0 1.000000 1.000000
+( 592 -16 0 ) ( 576 -16 0 ) ( 576 -48 0 ) TECH08_1 96 0 0 1.000000 1.000000
+}
+{
+( 368 -16 192 ) ( 368 -48 192 ) ( 368 -48 0 ) TECH08_1 144 0 0 1.000000 1.000000
+( 384 -16 192 ) ( 368 -16 192 ) ( 368 -16 0 ) TECH08_1 144 0 0 1.000000 1.000000
+( 384 -48 192 ) ( 384 -16 192 ) ( 384 -16 0 ) TECH08_1 144 0 0 1.000000 1.000000
+( 360 -416 192 ) ( 376 -416 192 ) ( 376 -416 0 ) TECH08_1 144 0 0 1.000000 1.000000
+( 368 -48 192 ) ( 368 -16 192 ) ( 384 -16 192 ) TECH08_1 144 0 0 1.000000 1.000000
+( 384 -16 0 ) ( 368 -16 0 ) ( 368 -48 0 ) TECH08_1 144 0 0 1.000000 1.000000
+}
+{
+( 368 -416 192 ) ( 368 -432 192 ) ( 368 -432 0 ) TECH08_1 144 0 0 1.000000 1.000000
+( 592 -416 192 ) ( 368 -416 192 ) ( 368 -416 0 ) TECH08_1 144 0 0 1.000000 1.000000
+( 592 -432 192 ) ( 592 -416 192 ) ( 592 -416 0 ) TECH08_1 144 0 0 1.000000 1.000000
+( 368 -432 192 ) ( 592 -432 192 ) ( 592 -432 0 ) TECH08_1 144 0 0 1.000000 1.000000
+( 368 -432 192 ) ( 368 -416 192 ) ( 592 -416 192 ) TECH08_1 144 0 0 1.000000 1.000000
+( 592 -416 0 ) ( 368 -416 0 ) ( 368 -432 0 ) TECH08_1 144 0 0 1.000000 1.000000
+}
+{
+( 384 -64 192 ) ( 384 -96 192 ) ( 384 -96 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 400 -64 192 ) ( 384 -64 192 ) ( 384 -64 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 408 -96 192 ) ( 408 -64 192 ) ( 408 -64 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 384 -96 192 ) ( 400 -96 192 ) ( 400 -96 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 384 -96 192 ) ( 384 -64 192 ) ( 400 -64 192 ) TECH04_3 0 0 0 1.000000 1.000000
+( 400 -64 0 ) ( 384 -64 0 ) ( 384 -96 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 552 -64 192 ) ( 552 -96 192 ) ( 552 -96 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 568 -64 192 ) ( 552 -64 192 ) ( 552 -64 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 576 -96 192 ) ( 576 -64 192 ) ( 576 -64 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 552 -96 192 ) ( 568 -96 192 ) ( 568 -96 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 552 -96 192 ) ( 552 -64 192 ) ( 568 -64 192 ) TECH04_3 0 0 0 1.000000 1.000000
+( 568 -64 0 ) ( 552 -64 0 ) ( 552 -96 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 384 -192 192 ) ( 384 -224 192 ) ( 384 -224 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 400 -192 192 ) ( 384 -192 192 ) ( 384 -192 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 408 -224 192 ) ( 408 -192 192 ) ( 408 -192 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 384 -224 192 ) ( 400 -224 192 ) ( 400 -224 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 384 -224 192 ) ( 384 -192 192 ) ( 400 -192 192 ) TECH04_3 0 0 0 1.000000 1.000000
+( 400 -192 0 ) ( 384 -192 0 ) ( 384 -224 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 552 -192 192 ) ( 552 -224 192 ) ( 552 -224 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 568 -192 192 ) ( 552 -192 192 ) ( 552 -192 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 576 -224 192 ) ( 576 -192 192 ) ( 576 -192 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 552 -224 192 ) ( 568 -224 192 ) ( 568 -224 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 552 -224 192 ) ( 552 -192 192 ) ( 568 -192 192 ) TECH04_3 0 0 0 1.000000 1.000000
+( 568 -192 0 ) ( 552 -192 0 ) ( 552 -224 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 384 -320 192 ) ( 384 -352 192 ) ( 384 -352 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 400 -320 192 ) ( 384 -320 192 ) ( 384 -320 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 408 -352 192 ) ( 408 -320 192 ) ( 408 -320 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 384 -352 192 ) ( 400 -352 192 ) ( 400 -352 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 384 -352 192 ) ( 384 -320 192 ) ( 400 -320 192 ) TECH04_3 0 0 0 1.000000 1.000000
+( 400 -320 0 ) ( 384 -320 0 ) ( 384 -352 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 552 -320 192 ) ( 552 -352 192 ) ( 552 -352 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 568 -320 192 ) ( 552 -320 192 ) ( 552 -320 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 576 -352 192 ) ( 576 -320 192 ) ( 576 -320 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 552 -352 192 ) ( 568 -352 192 ) ( 568 -352 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 552 -352 192 ) ( 552 -320 192 ) ( 568 -320 192 ) TECH04_3 0 0 0 1.000000 1.000000
+( 568 -320 0 ) ( 552 -320 0 ) ( 552 -352 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 384 -16 208 ) ( 384 -32 208 ) ( 384 -32 16 ) TECH01_1 0 0 90 -1.000000 1.000000
+( 400 -16 208 ) ( 384 -16 208 ) ( 384 -16 16 ) TECH01_1 0 0 90 -1.000000 1.000000
+( 576 -160 208 ) ( 576 -144 208 ) ( 576 -144 16 ) TECH01_1 0 0 90 -1.000000 1.000000
+( 552 -416 208 ) ( 568 -416 208 ) ( 568 -416 16 ) TECH01_1 0 0 90 -1.000000 1.000000
+( 384 -32 208 ) ( 384 -16 208 ) ( 400 -16 208 ) TECH01_1 0 0 90 -1.000000 1.000000
+( 400 -16 192 ) ( 384 -16 192 ) ( 384 -32 192 ) TECH01_1 0 0 90 -1.000000 1.000000
+}
+{
+( 408 -64 192 ) ( 408 -96 192 ) ( 408 -96 0 ) TECH04_3 224 0 0 1.000000 1.000000
+( 552 -64 192 ) ( 408 -64 192 ) ( 408 -64 0 ) TECH04_3 224 0 0 1.000000 1.000000
+( 552 -96 192 ) ( 552 -64 192 ) ( 552 -64 0 ) TECH04_3 224 0 0 1.000000 1.000000
+( 408 -96 192 ) ( 552 -96 192 ) ( 552 -96 0 ) TECH04_3 224 0 0 1.000000 1.000000
+( 408 -96 192 ) ( 408 -64 192 ) ( 552 -64 192 ) TECH04_3 224 0 0 1.000000 1.000000
+( 552 -64 160 ) ( 408 -64 160 ) ( 408 -96 160 ) TECH04_3 0 16 90 -1.000000 1.000000
+}
+{
+( 408 -192 192 ) ( 408 -224 192 ) ( 408 -224 0 ) TECH04_3 224 0 0 1.000000 1.000000
+( 552 -192 192 ) ( 408 -192 192 ) ( 408 -192 0 ) TECH04_3 224 0 0 1.000000 1.000000
+( 552 -224 192 ) ( 552 -192 192 ) ( 552 -192 0 ) TECH04_3 224 0 0 1.000000 1.000000
+( 408 -224 192 ) ( 552 -224 192 ) ( 552 -224 0 ) TECH04_3 224 0 0 1.000000 1.000000
+( 408 -224 192 ) ( 408 -192 192 ) ( 552 -192 192 ) TECH04_3 224 0 0 1.000000 1.000000
+( 552 -192 160 ) ( 408 -192 160 ) ( 408 -224 160 ) TECH04_3 0 16 90 -1.000000 1.000000
+}
+{
+( 408 -320 192 ) ( 408 -352 192 ) ( 408 -352 0 ) TECH04_3 224 0 0 1.000000 1.000000
+( 552 -320 192 ) ( 408 -320 192 ) ( 408 -320 0 ) TECH04_3 224 0 0 1.000000 1.000000
+( 552 -352 192 ) ( 552 -320 192 ) ( 552 -320 0 ) TECH04_3 224 0 0 1.000000 1.000000
+( 408 -352 192 ) ( 552 -352 192 ) ( 552 -352 0 ) TECH04_3 224 0 0 1.000000 1.000000
+( 408 -352 192 ) ( 408 -320 192 ) ( 552 -320 192 ) TECH04_3 224 0 0 1.000000 1.000000
+( 552 -320 160 ) ( 408 -320 160 ) ( 408 -352 160 ) TECH04_3 0 16 90 -1.000000 1.000000
+}
+{
+( 320 512 32 ) ( 320 384 32 ) ( 320 384 16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 384 512 32 ) ( 320 512 32 ) ( 320 512 16 ) TECH04_3 0 0 0 1.000000 1.000000
+( 384 384 32 ) ( 384 512 32 ) ( 384 512 16 ) TECH04_3 0 0 0 1.000000 1.000000
+( 320 384 32 ) ( 384 384 32 ) ( 384 384 16 ) TECH04_3 0 0 0 1.000000 1.000000
+( 320 384 32 ) ( 320 512 32 ) ( 384 512 32 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 384 512 0 ) ( 320 512 0 ) ( 320 384 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 320 704 0 ) ( 320 384 0 ) ( 320 384 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 576 768 0 ) ( 320 768 0 ) ( 320 768 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 576 384 0 ) ( 576 704 0 ) ( 576 704 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 320 384 0 ) ( 576 384 0 ) ( 576 384 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 320 384 0 ) ( 320 704 0 ) ( 576 704 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 576 704 -16 ) ( 320 704 -16 ) ( 320 384 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 320 704 32 ) ( 320 640 32 ) ( 320 640 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 384 768 32 ) ( 320 768 32 ) ( 320 768 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 384 640 32 ) ( 384 704 32 ) ( 384 704 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 320 640 32 ) ( 384 640 32 ) ( 384 640 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 320 640 48 ) ( 320 704 48 ) ( 384 704 48 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 384 704 32 ) ( 320 704 32 ) ( 320 640 32 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 384 760 32 ) ( 384 696 32 ) ( 384 696 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 384 768 32 ) ( 320 768 32 ) ( 320 768 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 704 696 32 ) ( 704 760 32 ) ( 704 760 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 320 704 32 ) ( 384 704 32 ) ( 384 704 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 320 704 64 ) ( 320 768 64 ) ( 384 768 64 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 384 768 48 ) ( 320 768 48 ) ( 320 704 48 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 304 512 192 ) ( 304 384 192 ) ( 304 384 0 ) TECH10_3 0 160 0 1.000000 1.000000
+( 312 416 192 ) ( 296 416 192 ) ( 296 416 0 ) TECH10_3 0 160 0 1.000000 1.000000
+( 320 384 192 ) ( 320 512 192 ) ( 320 512 0 ) TECH10_3 0 160 0 1.000000 1.000000
+( 304 384 192 ) ( 320 384 192 ) ( 320 384 0 ) TECH10_3 0 160 0 1.000000 1.000000
+( 304 384 208 ) ( 304 512 208 ) ( 320 512 208 ) TECH10_3 0 160 0 1.000000 1.000000
+( 320 512 0 ) ( 304 512 0 ) ( 304 384 0 ) TECH10_3 0 160 0 1.000000 1.000000
+}
+{
+( 304 488 208 ) ( 304 416 208 ) ( 304 416 0 ) TECH08_1 224 160 0 1.000000 1.000000
+( 336 496 208 ) ( 320 496 208 ) ( 320 496 0 ) TECH08_1 224 160 0 1.000000 1.000000
+( 320 416 208 ) ( 320 488 208 ) ( 320 488 0 ) TECH08_1 224 160 0 1.000000 1.000000
+( 304 416 208 ) ( 320 416 208 ) ( 320 416 0 ) TECH08_1 224 160 0 1.000000 1.000000
+( 304 416 208 ) ( 304 488 208 ) ( 320 488 208 ) TECH08_1 224 160 0 1.000000 1.000000
+( 320 488 0 ) ( 304 488 0 ) ( 304 416 0 ) TECH08_1 224 160 0 1.000000 1.000000
+}
+{
+( 304 512 208 ) ( 304 496 208 ) ( 304 496 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 320 512 208 ) ( 304 512 208 ) ( 304 512 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 320 496 208 ) ( 320 512 208 ) ( 320 512 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 304 496 208 ) ( 320 496 208 ) ( 320 496 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 304 496 208 ) ( 304 512 208 ) ( 320 512 208 ) TECH04_3 0 0 0 1.000000 1.000000
+( 320 512 0 ) ( 304 512 0 ) ( 304 496 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 304 656 208 ) ( 304 640 208 ) ( 304 640 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 320 656 208 ) ( 304 656 208 ) ( 304 656 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 320 640 208 ) ( 320 656 208 ) ( 320 656 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 304 640 208 ) ( 320 640 208 ) ( 320 640 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 304 640 208 ) ( 304 656 208 ) ( 320 656 208 ) TECH04_3 0 0 0 1.000000 1.000000
+( 320 656 0 ) ( 304 656 0 ) ( 304 640 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 256 640 208 ) ( 256 512 208 ) ( 256 512 0 ) TECH08_1 176 0 0 1.000000 1.000000
+( 272 640 208 ) ( 256 640 208 ) ( 256 640 0 ) TECH08_1 176 0 0 1.000000 1.000000
+( 272 512 208 ) ( 272 640 208 ) ( 272 640 0 ) TECH08_1 176 0 0 1.000000 1.000000
+( 256 512 208 ) ( 272 512 208 ) ( 272 512 0 ) TECH08_1 176 0 0 1.000000 1.000000
+( 256 512 208 ) ( 256 640 208 ) ( 272 640 208 ) TECH08_1 176 0 0 1.000000 1.000000
+( 272 640 144 ) ( 256 640 144 ) ( 256 512 144 ) TECH08_1 176 0 0 1.000000 1.000000
+}
+{
+( 192 640 192 ) ( 192 512 192 ) ( 192 512 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 256 704 192 ) ( 240 704 192 ) ( 240 704 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 272 512 192 ) ( 272 640 192 ) ( 272 640 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 240 448 192 ) ( 256 448 192 ) ( 256 448 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 240 512 144 ) ( 240 640 144 ) ( 256 640 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( 256 640 128 ) ( 240 640 128 ) ( 240 512 128 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 304 768 208 ) ( 304 656 208 ) ( 304 656 0 ) TECH10_3 16 128 0 1.000000 1.000000
+( 320 688 208 ) ( 304 688 208 ) ( 304 688 0 ) TECH10_3 16 128 0 1.000000 1.000000
+( 320 656 208 ) ( 320 768 208 ) ( 320 768 0 ) TECH10_3 16 128 0 1.000000 1.000000
+( 304 656 208 ) ( 320 656 208 ) ( 320 656 0 ) TECH10_3 16 128 0 1.000000 1.000000
+( 304 656 208 ) ( 304 768 208 ) ( 320 768 208 ) TECH10_3 16 128 0 1.000000 1.000000
+( 320 768 0 ) ( 304 768 0 ) ( 304 656 0 ) TECH10_3 16 128 0 1.000000 1.000000
+}
+{
+( 304 768 208 ) ( 304 688 208 ) ( 304 688 0 ) TECH08_1 192 0 0 1.000000 1.000000
+( 320 768 208 ) ( 304 768 208 ) ( 304 768 0 ) TECH08_1 192 0 0 1.000000 1.000000
+( 320 688 208 ) ( 320 768 208 ) ( 320 768 0 ) TECH08_1 192 0 0 1.000000 1.000000
+( 304 688 208 ) ( 320 688 208 ) ( 320 688 0 ) TECH08_1 192 0 0 1.000000 1.000000
+( 304 688 208 ) ( 304 768 208 ) ( 320 768 208 ) TECH08_1 192 0 0 1.000000 1.000000
+( 320 768 0 ) ( 304 768 0 ) ( 304 688 0 ) TECH08_1 192 0 0 1.000000 1.000000
+}
+{
+( 304 784 208 ) ( 304 768 208 ) ( 304 768 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 344 784 208 ) ( 304 784 208 ) ( 304 784 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 736 752 208 ) ( 736 768 208 ) ( 736 768 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 768 208 ) ( 344 768 208 ) ( 344 768 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 344 784 0 ) ( 304 784 0 ) ( 304 768 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 384 768 64 ) ( 384 792 64 ) ( 440 792 64 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 304 784 208 ) ( 304 768 208 ) ( 304 768 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 344 784 208 ) ( 304 784 208 ) ( 304 784 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 768 208 ) ( 344 768 208 ) ( 344 768 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 768 208 ) ( 304 784 208 ) ( 344 784 208 ) TECH08_1 0 0 0 1.000000 1.000000
+( 440 792 64 ) ( 384 792 64 ) ( 384 768 64 ) TECH08_1 0 0 0 1.000000 1.000000
+( 384 768 80 ) ( 400 792 64 ) ( 384 768 64 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 344 784 208 ) ( 304 784 208 ) ( 304 784 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 736 752 208 ) ( 736 768 208 ) ( 736 768 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 768 208 ) ( 344 768 208 ) ( 344 768 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 304 768 208 ) ( 304 784 208 ) ( 344 784 208 ) TECH08_1 0 0 0 1.000000 1.000000
+( 440 792 64 ) ( 384 792 64 ) ( 384 768 64 ) TECH08_1 0 0 0 1.000000 1.000000
+( 424 792 80 ) ( 440 768 64 ) ( 424 792 64 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 608 400 208 ) ( 608 384 208 ) ( 608 384 0 ) TECH10_3 0 0 0 1.000000 1.000000
+( 624 416 208 ) ( 608 416 208 ) ( 608 416 0 ) TECH10_3 0 0 0 1.000000 1.000000
+( 640 384 208 ) ( 640 400 208 ) ( 640 400 0 ) TECH10_3 0 0 0 1.000000 1.000000
+( 608 384 208 ) ( 624 384 208 ) ( 624 384 0 ) TECH10_3 0 0 0 1.000000 1.000000
+( 608 384 208 ) ( 608 400 208 ) ( 624 400 208 ) TECH10_3 0 0 0 1.000000 1.000000
+( 624 400 0 ) ( 608 400 0 ) ( 608 384 0 ) TECH10_3 0 0 0 1.000000 1.000000
+}
+{
+( 608 672 208 ) ( 608 416 208 ) ( 608 416 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 640 672 208 ) ( 608 672 208 ) ( 608 672 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 640 416 208 ) ( 640 672 208 ) ( 640 672 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 608 416 208 ) ( 608 672 208 ) ( 640 672 208 ) TECH08_1 224 0 0 1.000000 1.000000
+( 640 672 0 ) ( 608 672 0 ) ( 608 416 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 608 560 0 ) ( 608 560 208 ) ( 616 560 208 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 640 416 208 ) ( 640 672 208 ) ( 640 672 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 608 416 208 ) ( 640 416 208 ) ( 640 416 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 608 416 208 ) ( 608 672 208 ) ( 640 672 208 ) TECH08_1 224 0 0 1.000000 1.000000
+( 640 672 0 ) ( 608 672 0 ) ( 608 416 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 616 560 208 ) ( 608 560 208 ) ( 608 560 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 616 560 0 ) ( 616 560 208 ) ( 616 528 208 ) TLIGHT07 16 32 0 1.000000 1.000000
+}
+{
+( 608 672 208 ) ( 608 416 208 ) ( 608 416 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 608 416 208 ) ( 640 416 208 ) ( 640 416 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 608 416 208 ) ( 608 672 208 ) ( 640 672 208 ) TECH08_1 224 0 0 1.000000 1.000000
+( 640 672 0 ) ( 608 672 0 ) ( 608 416 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 616 528 208 ) ( 616 560 208 ) ( 616 560 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 616 528 0 ) ( 616 528 208 ) ( 608 528 208 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 608 672 208 ) ( 608 416 208 ) ( 608 416 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 608 416 208 ) ( 608 672 208 ) ( 640 672 208 ) TECH08_1 224 0 0 1.000000 1.000000
+( 616 560 208 ) ( 608 560 208 ) ( 608 560 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 616 528 208 ) ( 616 560 208 ) ( 616 560 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 608 528 208 ) ( 616 528 208 ) ( 616 528 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 616 560 160 ) ( 608 560 160 ) ( 608 528 160 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 608 672 208 ) ( 608 416 208 ) ( 608 416 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 640 672 0 ) ( 608 672 0 ) ( 608 416 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 616 560 208 ) ( 608 560 208 ) ( 608 560 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 616 528 208 ) ( 616 560 208 ) ( 616 560 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 608 528 208 ) ( 616 528 208 ) ( 616 528 0 ) TECH08_1 224 0 0 1.000000 1.000000
+( 608 528 32 ) ( 608 560 32 ) ( 616 560 32 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 608 704 208 ) ( 608 672 208 ) ( 608 672 0 ) TECH10_3 0 0 0 -1.000000 1.000000
+( 640 704 208 ) ( 608 704 208 ) ( 608 704 0 ) TECH10_3 0 0 0 -1.000000 1.000000
+( 640 672 208 ) ( 640 704 208 ) ( 640 704 0 ) TECH10_3 0 0 0 -1.000000 1.000000
+( 608 672 208 ) ( 640 672 208 ) ( 640 672 0 ) TECH10_3 0 0 0 -1.000000 1.000000
+( 608 672 208 ) ( 608 704 208 ) ( 640 704 208 ) TECH10_3 0 0 0 -1.000000 1.000000
+( 640 704 0 ) ( 608 704 0 ) ( 608 672 0 ) TECH10_3 0 0 0 -1.000000 1.000000
+}
+{
+( 512 768 64 ) ( 512 704 64 ) ( 512 704 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 704 768 64 ) ( 512 768 64 ) ( 512 768 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 736 704 64 ) ( 736 768 64 ) ( 736 768 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 512 704 64 ) ( 704 704 64 ) ( 704 704 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 512 704 80 ) ( 512 768 80 ) ( 704 768 80 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 704 768 64 ) ( 512 768 64 ) ( 512 704 64 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 320 768 224 ) ( 320 384 224 ) ( 320 384 16 ) TECH01_6 0 0 0 1.000000 1.000000
+( 608 792 224 ) ( 320 792 224 ) ( 320 792 16 ) TECH01_6 0 0 0 1.000000 1.000000
+( 608 384 224 ) ( 608 768 224 ) ( 608 768 16 ) TECH01_6 0 0 0 1.000000 1.000000
+( 320 384 224 ) ( 608 384 224 ) ( 608 384 16 ) TECH01_6 0 0 0 1.000000 1.000000
+( 320 384 224 ) ( 320 768 224 ) ( 608 768 224 ) TECH01_6 0 0 0 1.000000 1.000000
+( 608 768 208 ) ( 320 768 208 ) ( 320 384 208 ) TECH01_6 0 0 0 1.000000 1.000000
+}
+{
+( 320 496 208 ) ( 320 464 208 ) ( 320 464 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 608 496 208 ) ( 592 496 208 ) ( 592 496 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 608 464 208 ) ( 608 496 208 ) ( 608 496 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 592 464 208 ) ( 608 464 208 ) ( 608 464 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 592 464 208 ) ( 592 496 208 ) ( 608 496 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 608 496 192 ) ( 592 496 192 ) ( 592 464 192 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 272 640 208 ) ( 272 608 208 ) ( 272 608 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 608 624 208 ) ( 592 624 208 ) ( 592 624 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 608 592 208 ) ( 608 624 208 ) ( 608 624 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 592 592 208 ) ( 608 592 208 ) ( 608 592 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 592 592 208 ) ( 592 624 208 ) ( 608 624 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 608 624 192 ) ( 592 624 192 ) ( 592 592 192 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 608 768 208 ) ( 608 704 208 ) ( 608 704 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 640 768 208 ) ( 608 768 208 ) ( 608 768 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 640 704 208 ) ( 640 768 208 ) ( 640 768 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 608 704 208 ) ( 640 704 208 ) ( 640 704 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 608 704 208 ) ( 608 768 208 ) ( 640 768 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 640 768 160 ) ( 608 768 160 ) ( 608 704 160 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 464 640 208 ) ( 464 624 208 ) ( 464 624 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 496 768 208 ) ( 464 768 208 ) ( 464 768 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 496 624 208 ) ( 496 640 208 ) ( 496 640 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 464 624 208 ) ( 496 624 208 ) ( 496 624 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 464 624 208 ) ( 464 640 208 ) ( 496 640 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 496 640 192 ) ( 464 640 192 ) ( 464 624 192 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 192 512 144 ) ( 192 496 144 ) ( 192 496 128 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 512 144 ) ( 192 512 144 ) ( 192 512 128 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 496 144 ) ( 208 512 144 ) ( 208 512 128 ) TECH04_3 0 0 0 1.000000 1.000000
+( 192 448 144 ) ( 208 448 144 ) ( 208 448 128 ) TECH04_3 0 0 0 1.000000 1.000000
+( 192 496 144 ) ( 192 512 144 ) ( 208 512 144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 512 0 ) ( 192 512 0 ) ( 192 496 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 192 704 144 ) ( 192 688 144 ) ( 192 688 128 ) TECH07_2 176 0 0 1.000000 1.000000
+( 208 704 144 ) ( 192 704 144 ) ( 192 704 128 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 688 144 ) ( 208 704 144 ) ( 208 704 128 ) TECH04_3 0 0 0 1.000000 1.000000
+( 192 640 144 ) ( 208 640 144 ) ( 208 640 128 ) TECH04_3 0 0 0 1.000000 1.000000
+( 192 688 144 ) ( 192 704 144 ) ( 208 704 144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 704 0 ) ( 192 704 0 ) ( 192 688 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 192 728 144 ) ( 192 712 144 ) ( 192 712 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( 256 720 144 ) ( 208 720 144 ) ( 208 720 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 256 704 144 ) ( 256 720 144 ) ( 256 720 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 704 144 ) ( 256 704 144 ) ( 256 704 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 704 144 ) ( 208 720 144 ) ( 256 720 144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 256 720 0 ) ( 208 720 0 ) ( 208 704 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 192 456 144 ) ( 192 440 144 ) ( 192 440 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 256 448 144 ) ( 208 448 144 ) ( 208 448 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 272 432 144 ) ( 272 448 144 ) ( 272 448 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 432 144 ) ( 256 432 144 ) ( 256 432 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 432 144 ) ( 208 448 144 ) ( 256 448 144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 256 448 0 ) ( 208 448 0 ) ( 208 432 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 256 704 144 ) ( 256 640 144 ) ( 256 640 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 304 704 144 ) ( 272 704 144 ) ( 272 704 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 304 640 144 ) ( 304 704 144 ) ( 304 704 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 272 656 144 ) ( 304 656 144 ) ( 304 656 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 272 640 144 ) ( 272 704 144 ) ( 304 704 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( 304 704 128 ) ( 272 704 128 ) ( 272 640 128 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 192 640 144 ) ( 192 512 144 ) ( 192 512 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 208 640 144 ) ( 192 640 144 ) ( 192 640 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 208 512 144 ) ( 208 640 144 ) ( 208 640 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 192 512 144 ) ( 208 512 144 ) ( 208 512 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 192 512 144 ) ( 192 640 144 ) ( 208 640 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( 208 640 128 ) ( 192 640 128 ) ( 192 512 128 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 208 696 32 ) ( 208 440 32 ) ( 208 440 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 304 704 32 ) ( 256 704 32 ) ( 256 704 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 320 448 32 ) ( 320 704 32 ) ( 320 704 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 256 448 32 ) ( 304 448 32 ) ( 304 448 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 256 448 0 ) ( 256 704 0 ) ( 304 704 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 304 704 -16 ) ( 256 704 -16 ) ( 256 448 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 736 784 208 ) ( 736 752 208 ) ( 736 752 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 752 784 208 ) ( 736 784 208 ) ( 736 784 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 752 752 208 ) ( 752 784 208 ) ( 752 784 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 736 752 208 ) ( 736 784 208 ) ( 752 784 208 ) TECH08_1 0 0 0 1.000000 1.000000
+( 752 784 64 ) ( 736 784 64 ) ( 736 752 64 ) TECH08_1 0 0 0 1.000000 1.000000
+( 736 544 64 ) ( 736 544 208 ) ( 752 544 208 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 736 784 208 ) ( 736 752 208 ) ( 736 752 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 752 752 208 ) ( 752 784 208 ) ( 752 784 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 744 448 208 ) ( 760 448 208 ) ( 760 448 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 736 752 208 ) ( 736 784 208 ) ( 752 784 208 ) TECH08_1 0 0 0 1.000000 1.000000
+( 752 784 64 ) ( 736 784 64 ) ( 736 752 64 ) TECH08_1 0 0 0 1.000000 1.000000
+( 752 480 64 ) ( 752 480 208 ) ( 736 480 208 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 736 784 208 ) ( 736 752 208 ) ( 736 752 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 752 752 208 ) ( 752 784 208 ) ( 752 784 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 736 752 208 ) ( 736 784 208 ) ( 752 784 208 ) TECH08_1 0 0 0 1.000000 1.000000
+( 752 544 208 ) ( 736 544 208 ) ( 736 544 64 ) TECH08_1 0 0 0 1.000000 1.000000
+( 736 480 208 ) ( 752 480 208 ) ( 752 480 64 ) TECH08_1 0 0 0 1.000000 1.000000
+( 752 544 192 ) ( 736 544 192 ) ( 736 480 192 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 736 784 208 ) ( 736 752 208 ) ( 736 752 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 752 752 208 ) ( 752 784 208 ) ( 752 784 0 ) TECH08_1 0 0 0 1.000000 1.000000
+( 752 784 64 ) ( 736 784 64 ) ( 736 752 64 ) TECH08_1 0 0 0 1.000000 1.000000
+( 752 544 208 ) ( 736 544 208 ) ( 736 544 64 ) TECH08_1 0 0 0 1.000000 1.000000
+( 736 480 208 ) ( 752 480 208 ) ( 752 480 64 ) TECH08_1 0 0 0 1.000000 1.000000
+( 736 480 80 ) ( 736 544 80 ) ( 752 544 80 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 640 704 80 ) ( 640 448 80 ) ( 640 448 64 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 736 704 80 ) ( 640 704 80 ) ( 640 704 64 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 736 448 80 ) ( 736 704 80 ) ( 736 704 64 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 640 448 80 ) ( 736 448 80 ) ( 736 448 64 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 640 448 80 ) ( 640 704 80 ) ( 736 704 80 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 736 704 64 ) ( 640 704 64 ) ( 640 448 64 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 640 448 208 ) ( 640 432 208 ) ( 640 432 64 ) TECH08_1 224 0 0 1.000000 1.000000
+( 752 448 208 ) ( 640 448 208 ) ( 640 448 64 ) TECH08_1 224 0 0 1.000000 1.000000
+( 752 432 208 ) ( 752 448 208 ) ( 752 448 64 ) TECH08_1 224 0 0 1.000000 1.000000
+( 640 432 208 ) ( 752 432 208 ) ( 752 432 64 ) TECH08_1 224 0 0 1.000000 1.000000
+( 640 432 208 ) ( 640 448 208 ) ( 752 448 208 ) TECH08_1 224 0 0 1.000000 1.000000
+( 752 448 64 ) ( 640 448 64 ) ( 640 432 64 ) TECH08_1 224 0 0 1.000000 1.000000
+}
+{
+( 640 464 208 ) ( 640 448 208 ) ( 640 448 0 ) TECH01_6 0 0 0 1.000000 1.000000
+( 736 768 208 ) ( 712 768 208 ) ( 712 768 0 ) TECH01_6 0 0 0 1.000000 1.000000
+( 736 752 208 ) ( 736 768 208 ) ( 736 768 0 ) TECH01_6 0 0 0 1.000000 1.000000
+( 640 448 208 ) ( 664 448 208 ) ( 664 448 0 ) TECH01_6 0 0 0 1.000000 1.000000
+( 640 448 208 ) ( 640 464 208 ) ( 664 464 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( 664 464 192 ) ( 640 464 192 ) ( 640 448 192 ) TECH01_6 0 0 0 1.000000 1.000000
+}
+{
+( 64 480 144 ) ( 64 464 144 ) ( 64 464 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( 240 496 144 ) ( 224 496 144 ) ( 224 496 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( 192 480 144 ) ( 192 496 144 ) ( 192 496 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( 224 480 144 ) ( 240 480 144 ) ( 240 480 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( 224 480 144 ) ( 224 496 144 ) ( 240 496 144 ) TECH07_2 176 0 0 1.000000 1.000000
+( 240 496 0 ) ( 224 496 0 ) ( 224 480 0 ) TECH07_2 176 0 0 1.000000 1.000000
+}
+{
+( 64 656 144 ) ( 64 640 144 ) ( 64 640 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( 240 672 144 ) ( 224 672 144 ) ( 224 672 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( 192 664 144 ) ( 192 680 144 ) ( 192 680 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( 224 656 144 ) ( 240 656 144 ) ( 240 656 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( 224 656 144 ) ( 224 672 144 ) ( 240 672 144 ) TECH07_2 176 0 0 1.000000 1.000000
+( 240 672 0 ) ( 224 672 0 ) ( 224 656 0 ) TECH07_2 176 0 0 1.000000 1.000000
+}
+{
+( 64 584 0 ) ( 64 496 0 ) ( 64 496 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 240 656 0 ) ( 208 656 0 ) ( 208 656 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 240 568 0 ) ( 240 656 0 ) ( 240 656 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 64 496 0 ) ( 96 496 0 ) ( 96 496 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 208 568 0 ) ( 208 656 0 ) ( 240 656 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 240 656 -16 ) ( 208 656 -16 ) ( 208 568 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( -64 520 144 ) ( -64 504 144 ) ( -64 504 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 64 512 144 ) ( -64 512 144 ) ( -64 512 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 64 496 144 ) ( 64 512 144 ) ( 64 512 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( -64 496 144 ) ( 64 496 144 ) ( 64 496 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( -64 496 144 ) ( -64 512 144 ) ( 64 512 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( 64 512 -256 ) ( -64 512 -256 ) ( -64 496 -256 ) TECH07_2 0 0 0 1.000000 1.000000
+}
+{
+( -64 656 144 ) ( -64 640 144 ) ( -64 640 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( 64 656 144 ) ( -64 656 144 ) ( -64 656 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( -64 640 144 ) ( 64 640 144 ) ( 64 640 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( -64 640 144 ) ( -64 656 144 ) ( 64 656 144 ) TECH07_2 176 0 0 1.000000 1.000000
+( 64 656 -144 ) ( -64 656 -144 ) ( -64 640 -144 ) TECH04_3 0 0 0 1.000000 1.000000
+( -48 640 -240 ) ( -48 640 -224 ) ( -48 656 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 64 656 144 ) ( -64 656 144 ) ( -64 656 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( 64 640 144 ) ( 64 656 144 ) ( 64 656 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( -64 640 144 ) ( 64 640 144 ) ( 64 640 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( -64 640 144 ) ( -64 656 144 ) ( 64 656 144 ) TECH07_2 176 0 0 1.000000 1.000000
+( 64 656 -256 ) ( -64 656 -256 ) ( -64 640 -256 ) TECH07_2 176 0 0 1.000000 1.000000
+( 48 656 -240 ) ( 48 656 -224 ) ( 48 640 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 64 656 144 ) ( -64 656 144 ) ( -64 656 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( -64 640 144 ) ( 64 640 144 ) ( 64 640 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( -64 640 144 ) ( -64 656 144 ) ( 64 656 144 ) TECH07_2 176 0 0 1.000000 1.000000
+( -48 656 -224 ) ( -48 640 -224 ) ( -48 640 -240 ) TECH07_2 176 0 0 1.000000 1.000000
+( 48 640 -224 ) ( 48 656 -224 ) ( 48 656 -240 ) TECH07_2 176 0 0 1.000000 1.000000
+( 32 656 -144 ) ( -32 656 -144 ) ( -32 640 -144 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -80 656 144 ) ( -80 496 144 ) ( -80 496 -256 ) TECH07_2 0 0 0 1.000000 1.000000
+( -64 656 144 ) ( -80 656 144 ) ( -80 656 -256 ) TECH07_2 0 0 0 1.000000 1.000000
+( -80 496 144 ) ( -64 496 144 ) ( -64 496 -256 ) TECH07_2 0 0 0 1.000000 1.000000
+( -80 496 144 ) ( -80 656 144 ) ( -64 656 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( -64 656 -144 ) ( -80 656 -144 ) ( -80 496 -144 ) TECH04_3 0 0 0 1.000000 1.000000
+( -72 560 32 ) ( -72 560 48 ) ( -72 592 48 ) TECH07_2 0 0 0 1.000000 1.000000
+}
+{
+( -64 656 144 ) ( -80 656 144 ) ( -80 656 -256 ) TECH07_2 0 0 0 1.000000 1.000000
+( -64 496 144 ) ( -64 656 144 ) ( -64 656 -256 ) TECH07_2 0 0 0 1.000000 1.000000
+( -80 496 144 ) ( -80 656 144 ) ( -64 656 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( -64 656 -144 ) ( -80 656 -144 ) ( -80 496 -144 ) TECH04_3 0 0 0 1.000000 1.000000
+( -72 592 48 ) ( -72 560 48 ) ( -72 560 32 ) TECH07_2 0 0 0 1.000000 1.000000
+( -72 592 32 ) ( -72 592 48 ) ( -64 592 48 ) TECH07_2 0 0 0 1.000000 1.000000
+}
+{
+( -64 496 144 ) ( -64 656 144 ) ( -64 656 -256 ) TECH07_2 0 0 0 1.000000 1.000000
+( -80 496 144 ) ( -64 496 144 ) ( -64 496 -256 ) TECH07_2 0 0 0 1.000000 1.000000
+( -80 496 144 ) ( -80 656 144 ) ( -64 656 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( -64 656 -144 ) ( -80 656 -144 ) ( -80 496 -144 ) TECH04_3 0 0 0 1.000000 1.000000
+( -72 592 48 ) ( -72 560 48 ) ( -72 560 32 ) TECH07_2 0 0 0 1.000000 1.000000
+( -64 560 32 ) ( -64 560 48 ) ( -72 560 48 ) TECH07_2 0 0 0 1.000000 1.000000
+}
+{
+( -64 496 144 ) ( -64 656 144 ) ( -64 656 -256 ) TECH07_2 0 0 0 1.000000 1.000000
+( -80 496 144 ) ( -80 656 144 ) ( -64 656 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( -72 592 48 ) ( -72 560 48 ) ( -72 560 32 ) TECH07_2 0 0 0 1.000000 1.000000
+( -64 592 48 ) ( -72 592 48 ) ( -72 592 32 ) TECH07_2 0 0 0 1.000000 1.000000
+( -72 560 48 ) ( -64 560 48 ) ( -64 560 32 ) TECH07_2 0 0 0 1.000000 1.000000
+( -64 592 64 ) ( -72 592 64 ) ( -72 560 64 ) TECH07_2 0 0 0 1.000000 1.000000
+}
+{
+( -64 496 144 ) ( -64 656 144 ) ( -64 656 -256 ) TECH07_2 0 0 0 1.000000 1.000000
+( -72 592 48 ) ( -72 560 48 ) ( -72 560 32 ) TECH07_2 0 0 0 1.000000 1.000000
+( -64 592 48 ) ( -72 592 48 ) ( -72 592 32 ) TECH07_2 0 0 0 1.000000 1.000000
+( -72 560 48 ) ( -64 560 48 ) ( -64 560 32 ) TECH07_2 0 0 0 1.000000 1.000000
+( -72 560 32 ) ( -72 592 32 ) ( -64 592 32 ) TECH07_2 0 0 0 1.000000 1.000000
+( -64 592 -144 ) ( -72 592 -144 ) ( -72 560 -144 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -64 656 160 ) ( -64 528 160 ) ( -64 528 -240 ) TECH01_6 0 0 0 1.000000 1.000000
+( 16 656 160 ) ( -64 656 160 ) ( -64 656 -240 ) TECH01_6 0 0 0 1.000000 1.000000
+( 0 496 160 ) ( 80 496 160 ) ( 80 496 -240 ) TECH01_6 0 0 0 1.000000 1.000000
+( -64 528 160 ) ( -64 656 160 ) ( 16 656 160 ) TECH01_6 0 0 0 1.000000 1.000000
+( 16 656 144 ) ( -64 656 144 ) ( -64 528 144 ) TECH01_6 0 0 0 1.000000 1.000000
+( -32 544 144 ) ( -32 544 160 ) ( -32 608 160 ) TECH01_6 0 0 0 1.000000 1.000000
+}
+{
+( 16 656 160 ) ( -64 656 160 ) ( -64 656 -240 ) TECH01_6 0 0 0 1.000000 1.000000
+( 240 488 160 ) ( 240 616 160 ) ( 240 616 -240 ) TECH01_6 0 0 0 1.000000 1.000000
+( -64 528 160 ) ( -64 656 160 ) ( 16 656 160 ) TECH01_6 0 0 0 1.000000 1.000000
+( 16 656 144 ) ( -64 656 144 ) ( -64 528 144 ) TECH01_6 0 0 0 1.000000 1.000000
+( -32 608 160 ) ( -32 544 160 ) ( -32 544 144 ) TECH01_6 0 0 0 1.000000 1.000000
+( -32 608 144 ) ( -32 608 160 ) ( 32 608 160 ) TECH01_6 0 0 0 1.000000 1.000000
+}
+{
+( 240 488 160 ) ( 240 616 160 ) ( 240 616 -240 ) TECH01_6 0 0 0 1.000000 1.000000
+( 0 496 160 ) ( 80 496 160 ) ( 80 496 -240 ) TECH01_6 0 0 0 1.000000 1.000000
+( -64 528 160 ) ( -64 656 160 ) ( 16 656 160 ) TECH01_6 0 0 0 1.000000 1.000000
+( 16 656 144 ) ( -64 656 144 ) ( -64 528 144 ) TECH01_6 0 0 0 1.000000 1.000000
+( 32 608 160 ) ( -32 608 160 ) ( -32 608 144 ) TECH01_6 0 0 0 1.000000 1.000000
+( 32 608 144 ) ( 32 608 160 ) ( 32 544 160 ) TECH01_6 0 0 0 1.000000 1.000000
+}
+{
+( 0 496 160 ) ( 80 496 160 ) ( 80 496 -240 ) TECH01_6 0 0 0 1.000000 1.000000
+( -64 528 160 ) ( -64 656 160 ) ( 16 656 160 ) TECH01_6 0 0 0 1.000000 1.000000
+( 16 656 144 ) ( -64 656 144 ) ( -64 528 144 ) TECH01_6 0 0 0 1.000000 1.000000
+( -32 608 160 ) ( -32 544 160 ) ( -32 544 144 ) TECH01_6 0 0 0 1.000000 1.000000
+( 32 544 160 ) ( 32 608 160 ) ( 32 608 144 ) TECH01_6 0 0 0 1.000000 1.000000
+( 32 544 144 ) ( 32 544 160 ) ( -32 544 160 ) TECH01_6 0 0 0 1.000000 1.000000
+}
+{
+( 64 656 144 ) ( 64 496 144 ) ( 64 496 -256 ) TECH07_2 0 0 0 1.000000 1.000000
+( 80 656 144 ) ( 64 656 144 ) ( 64 656 -256 ) TECH07_2 0 0 0 1.000000 1.000000
+( 80 496 144 ) ( 80 656 144 ) ( 80 656 -256 ) TECH07_2 0 0 0 1.000000 1.000000
+( 64 496 144 ) ( 80 496 144 ) ( 80 496 -256 ) TECH07_2 0 0 0 1.000000 1.000000
+( 64 496 -16 ) ( 64 656 -16 ) ( 80 656 -16 ) TECH07_2 0 0 0 1.000000 1.000000
+( 80 656 -256 ) ( 64 656 -256 ) ( 64 496 -256 ) TECH07_2 0 0 0 1.000000 1.000000
+}
+{
+( 568 0 64 ) ( 568 -48 64 ) ( 544 -48 64 ) TLIGHT11 0 0 0 1.000000 1.000000
+( 544 0 0 ) ( 544 -48 0 ) ( 568 -48 0 ) TLIGHT11 0 0 0 1.000000 1.000000
+( 568 -16 0 ) ( 560 0 64 ) ( 568 0 0 ) TLIGHT11 0 0 0 1.000000 1.000000
+( 552 -16 64 ) ( 544 0 0 ) ( 552 0 64 ) TLIGHT11 0 0 0 1.000000 1.000000
+( 656 -24 0 ) ( 640 -32 64 ) ( 640 -24 0 ) TLIGHT11 0 0 0 1.000000 1.000000
+( 656 -40 64 ) ( 640 -48 0 ) ( 640 -40 64 ) TLIGHT11 0 0 0 1.000000 1.000000
+}
+{
+( 416 0 64 ) ( 416 -48 64 ) ( 392 -48 64 ) TLIGHT11 0 0 0 1.000000 1.000000
+( 392 0 0 ) ( 392 -48 0 ) ( 416 -48 0 ) TLIGHT11 0 0 0 1.000000 1.000000
+( 416 -16 0 ) ( 408 0 64 ) ( 416 0 0 ) TLIGHT11 0 0 0 1.000000 1.000000
+( 400 -16 64 ) ( 392 0 0 ) ( 400 0 64 ) TLIGHT11 0 0 0 1.000000 1.000000
+( 504 -24 0 ) ( 488 -32 64 ) ( 488 -24 0 ) TLIGHT11 0 0 0 1.000000 1.000000
+( 504 -40 64 ) ( 488 -48 0 ) ( 488 -40 64 ) TLIGHT11 0 0 0 1.000000 1.000000
+}
+{
+( -80 640 -240 ) ( -80 528 -240 ) ( -80 528 -256 ) TECH04_1 0 0 0 1.000000 1.000000
+( 24 640 -240 ) ( -64 640 -240 ) ( -64 640 -256 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 64 536 -240 ) ( 64 648 -240 ) ( 64 648 -256 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -56 512 -240 ) ( 32 512 -240 ) ( 32 512 -256 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -64 528 -240 ) ( -64 640 -240 ) ( 24 640 -240 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 24 640 -256 ) ( -64 640 -256 ) ( -64 528 -256 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( -80 656 -240 ) ( -80 640 -240 ) ( -80 640 -256 ) TECH04_1 0 0 0 1.000000 1.000000
+( 48 656 -240 ) ( -48 656 -240 ) ( -48 656 -256 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 48 640 -240 ) ( 48 656 -240 ) ( 48 656 -256 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -48 640 -240 ) ( 48 640 -240 ) ( 48 640 -256 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -48 640 -240 ) ( -48 656 -240 ) ( 48 656 -240 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 48 656 -256 ) ( -48 656 -256 ) ( -48 640 -256 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( -192 832 -224 ) ( -192 704 -224 ) ( -192 704 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 120 1088 -224 ) ( -136 1088 -224 ) ( -136 1088 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 440 696 -224 ) ( 440 824 -224 ) ( 440 824 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( -128 720 -224 ) ( 128 720 -224 ) ( 128 720 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( -128 704 -224 ) ( -128 832 -224 ) ( 128 832 -224 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 128 832 -240 ) ( -128 832 -240 ) ( -128 704 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+}
+{
+( 64 680 0 ) ( 64 680 -240 ) ( 128 680 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 128 656 -224 ) ( 128 680 -224 ) ( 128 680 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 64 656 -224 ) ( 128 656 -224 ) ( 128 656 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 64 656 0 ) ( 64 680 0 ) ( 128 680 0 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 128 680 -240 ) ( 64 680 -240 ) ( 64 656 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 64 680 -240 ) ( 64 680 0 ) ( 56 656 0 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 128 720 -240 ) ( 128 720 0 ) ( 128 656 0 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 240 752 0 ) ( 128 752 0 ) ( 128 752 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 240 656 0 ) ( 240 720 0 ) ( 240 720 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 128 656 0 ) ( 240 656 0 ) ( 240 656 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 128 656 0 ) ( 128 720 0 ) ( 240 720 0 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 240 720 -240 ) ( 128 720 -240 ) ( 128 656 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 128 720 0 ) ( 128 720 -240 ) ( 192 752 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( -192 832 160 ) ( -192 656 160 ) ( -192 656 144 ) SKY4 0 0 0 1.000000 1.000000
+( 72 784 160 ) ( -136 784 160 ) ( -136 784 144 ) SKY4 0 0 0 1.000000 1.000000
+( 240 752 160 ) ( 240 928 160 ) ( 240 928 144 ) SKY4 0 0 0 1.000000 1.000000
+( -144 672 160 ) ( 64 672 160 ) ( 64 672 144 ) SKY4 0 0 0 1.000000 1.000000
+( -144 656 160 ) ( -144 832 160 ) ( 64 832 160 ) SKY4 0 0 0 1.000000 1.000000
+( 64 832 144 ) ( -144 832 144 ) ( -144 656 144 ) SKY4 0 0 0 1.000000 1.000000
+}
+{
+( -192 672 160 ) ( -192 656 160 ) ( -192 656 144 ) SKY4 0 0 0 1.000000 1.000000
+( 64 672 160 ) ( -144 672 160 ) ( -144 672 144 ) SKY4 0 0 0 1.000000 1.000000
+( 64 656 160 ) ( 64 672 160 ) ( 64 672 144 ) SKY4 0 0 0 1.000000 1.000000
+( -144 656 160 ) ( 64 656 160 ) ( 64 656 144 ) SKY4 0 0 0 1.000000 1.000000
+( -144 656 160 ) ( -144 672 160 ) ( 64 672 160 ) SKY4 0 0 0 1.000000 1.000000
+( 64 672 144 ) ( -144 672 144 ) ( -144 656 144 ) SKY4 0 0 0 1.000000 1.000000
+}
+{
+( 48 656 -144 ) ( 48 656 -160 ) ( 48 368 -160 ) TECH07_2 176 0 0 1.000000 1.000000
+( 32 656 -144 ) ( 48 656 -144 ) ( 48 368 -144 ) TECH07_2 176 0 0 1.000000 1.000000
+( 48 656 -160 ) ( 48 656 -144 ) ( 32 656 -144 ) TECH07_2 176 0 0 1.000000 1.000000
+( 32 640 -144 ) ( 48 640 -144 ) ( 48 640 -160 ) TECH07_2 176 0 0 1.000000 1.000000
+( 32 368 -144 ) ( 48 368 -160 ) ( 32 384 -144 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -32 608 160 ) ( -32 544 160 ) ( -32 544 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( 32 608 160 ) ( -32 608 160 ) ( -32 608 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( 32 544 160 ) ( 32 608 160 ) ( 32 608 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( -32 544 160 ) ( 32 544 160 ) ( 32 544 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( -32 544 160 ) ( -32 608 160 ) ( 32 608 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 32 608 144 ) ( -32 608 144 ) ( -32 544 144 ) TLIGHT02 16 16 0 1.000000 1.000000
+}
+{
+( 384 704 48 ) ( 384 688 48 ) ( 384 688 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 400 704 48 ) ( 384 704 48 ) ( 384 704 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 384 688 48 ) ( 384 704 48 ) ( 400 704 48 ) TECH04_2 0 0 0 1.000000 1.000000
+( 400 704 0 ) ( 384 704 0 ) ( 384 688 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 400 704 0 ) ( 384 688 0 ) ( 400 704 16 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 424 816 128 ) ( 424 768 128 ) ( 400 768 128 ) TLIGHT08 0 0 0 1.000000 1.000000
+( 400 816 64 ) ( 400 768 64 ) ( 424 768 64 ) TLIGHT11 0 0 0 1.000000 1.000000
+( 424 800 64 ) ( 416 816 128 ) ( 424 816 64 ) TLIGHT11 0 0 0 1.000000 1.000000
+( 408 800 128 ) ( 400 816 64 ) ( 408 816 128 ) TLIGHT11 0 0 0 1.000000 1.000000
+( 512 792 64 ) ( 496 784 128 ) ( 496 792 64 ) TLIGHT11 0 0 0 1.000000 1.000000
+( 512 776 128 ) ( 496 768 64 ) ( 496 776 128 ) TLIGHT11 0 0 0 1.000000 1.000000
+}
+{
+( 304 808 0 ) ( 232 808 0 ) ( 232 808 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 304 720 0 ) ( 304 800 0 ) ( 304 800 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 232 720 0 ) ( 304 720 0 ) ( 304 720 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 232 720 0 ) ( 232 800 0 ) ( 304 800 0 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 304 800 -240 ) ( 232 800 -240 ) ( 232 720 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 192 728 -240 ) ( 232 808 -240 ) ( 192 728 -224 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 440 832 0 ) ( 296 832 0 ) ( 296 832 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 784 0 ) ( 440 832 0 ) ( 440 832 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 296 784 208 ) ( 296 832 208 ) ( 440 832 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 832 -240 ) ( 296 832 -240 ) ( 296 784 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 280 784 -240 ) ( 328 832 -240 ) ( 280 784 -224 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 384 792 64 ) ( 384 792 208 ) ( 440 792 208 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 440 784 0 ) ( 440 832 0 ) ( 440 832 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 296 784 0 ) ( 440 784 0 ) ( 440 784 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 832 -240 ) ( 296 832 -240 ) ( 296 784 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 280 784 -240 ) ( 328 832 -240 ) ( 280 784 -224 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 792 208 ) ( 384 792 208 ) ( 384 792 64 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 384 768 64 ) ( 384 792 64 ) ( 440 792 64 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 296 784 0 ) ( 440 784 0 ) ( 440 784 -240 ) TECH04_3 0 0 0 1.000000 1.000000
+( 296 784 208 ) ( 296 832 208 ) ( 440 832 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 280 784 -240 ) ( 328 832 -240 ) ( 280 784 -224 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 792 208 ) ( 384 792 208 ) ( 384 792 64 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 792 64 ) ( 384 792 64 ) ( 384 768 64 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 384 768 80 ) ( 400 792 64 ) ( 384 768 64 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 440 784 0 ) ( 440 832 0 ) ( 440 832 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 296 784 0 ) ( 440 784 0 ) ( 440 784 -240 ) TECH04_3 0 0 0 1.000000 1.000000
+( 296 784 208 ) ( 296 832 208 ) ( 440 832 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 792 208 ) ( 384 792 208 ) ( 384 792 64 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 792 64 ) ( 384 792 64 ) ( 384 768 64 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 424 792 80 ) ( 440 768 64 ) ( 424 792 64 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 240 784 160 ) ( 240 720 160 ) ( 240 720 144 ) SKY4 0 0 0 1.000000 1.000000
+( 304 784 160 ) ( 240 784 160 ) ( 240 784 144 ) SKY4 0 0 0 1.000000 1.000000
+( 304 720 160 ) ( 304 784 160 ) ( 304 784 144 ) SKY4 0 0 0 1.000000 1.000000
+( 240 720 160 ) ( 304 720 160 ) ( 304 720 144 ) SKY4 0 0 0 1.000000 1.000000
+( 240 720 160 ) ( 240 784 160 ) ( 304 784 160 ) SKY4 0 0 0 1.000000 1.000000
+( 304 784 144 ) ( 240 784 144 ) ( 240 720 144 ) SKY4 0 0 0 1.000000 1.000000
+}
+{
+( -192 1088 160 ) ( -192 936 160 ) ( -192 936 144 ) SKY4 0 0 0 1.000000 1.000000
+( 144 1648 160 ) ( -144 1648 160 ) ( -144 1648 144 ) SKY4 0 0 0 1.000000 1.000000
+( 440 776 160 ) ( 440 928 160 ) ( 440 928 144 ) SKY4 0 0 0 1.000000 1.000000
+( 64 784 160 ) ( 64 936 160 ) ( 352 936 160 ) SKY4 0 0 0 1.000000 1.000000
+( 352 936 144 ) ( 64 936 144 ) ( 64 784 144 ) SKY4 0 0 0 1.000000 1.000000
+( 384 792 64 ) ( 384 792 208 ) ( 440 792 208 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -192 1088 160 ) ( -192 936 160 ) ( -192 936 144 ) SKY4 0 0 0 1.000000 1.000000
+( 64 784 160 ) ( 352 784 160 ) ( 352 784 144 ) SKY4 0 0 0 1.000000 1.000000
+( 64 784 160 ) ( 64 936 160 ) ( 352 936 160 ) SKY4 0 0 0 1.000000 1.000000
+( 352 936 144 ) ( 64 936 144 ) ( 64 784 144 ) SKY4 0 0 0 1.000000 1.000000
+( 440 792 208 ) ( 384 792 208 ) ( 384 792 64 ) SKY4 0 0 0 1.000000 1.000000
+( 328 760 80 ) ( 344 784 64 ) ( 328 760 64 ) SKY4 0 0 0 1.000000 1.000000
+}
+{
+( 280 784 144 ) ( 280 768 144 ) ( 280 768 -304 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 304 784 144 ) ( 280 784 144 ) ( 280 784 -304 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 304 728 -64 ) ( 304 728 144 ) ( 304 784 144 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 280 768 144 ) ( 280 784 144 ) ( 304 784 144 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 304 784 -64 ) ( 280 784 -64 ) ( 280 768 -64 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 304 728 144 ) ( 304 728 -64 ) ( 280 760 -64 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 400 960 208 ) ( 400 832 208 ) ( 400 832 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 432 960 208 ) ( 400 960 208 ) ( 400 960 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 832 208 ) ( 440 960 208 ) ( 440 960 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 400 832 208 ) ( 432 832 208 ) ( 432 832 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 400 832 208 ) ( 400 960 208 ) ( 432 960 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 432 960 -240 ) ( 400 960 -240 ) ( 400 832 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 424 832 -240 ) ( 400 920 -240 ) ( 424 832 -224 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 384 864 208 ) ( 384 816 208 ) ( 384 816 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 864 208 ) ( 384 864 208 ) ( 384 864 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 816 208 ) ( 440 864 208 ) ( 440 864 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 384 816 208 ) ( 440 816 208 ) ( 440 816 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 384 816 208 ) ( 384 864 208 ) ( 440 864 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 864 -240 ) ( 384 864 -240 ) ( 384 816 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 384 832 -240 ) ( 432 872 -240 ) ( 384 832 -224 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 360 1088 208 ) ( 360 960 208 ) ( 360 960 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1088 208 ) ( 360 1088 208 ) ( 360 1088 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 960 208 ) ( 440 1088 208 ) ( 440 1088 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 360 960 208 ) ( 440 960 208 ) ( 440 960 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 360 960 208 ) ( 360 1088 208 ) ( 440 1088 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1088 -240 ) ( 360 1088 -240 ) ( 360 960 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 400 960 -240 ) ( 360 1024 -240 ) ( 400 960 -224 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( -192 832 208 ) ( -192 744 208 ) ( -192 744 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -144 832 208 ) ( -192 832 208 ) ( -192 832 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -144 744 208 ) ( -144 832 208 ) ( -144 832 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 744 208 ) ( -144 744 208 ) ( -144 744 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 744 208 ) ( -192 832 208 ) ( -144 832 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -144 832 -240 ) ( -192 832 -240 ) ( -192 744 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -160 832 -240 ) ( -144 808 -240 ) ( -160 832 -224 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( -192 928 208 ) ( -192 832 208 ) ( -192 832 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -160 896 208 ) ( -192 896 208 ) ( -192 896 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -160 832 208 ) ( -160 928 208 ) ( -160 928 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 832 208 ) ( -160 832 208 ) ( -160 832 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 832 208 ) ( -192 928 208 ) ( -160 928 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -160 928 -240 ) ( -192 928 -240 ) ( -192 832 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( -192 976 208 ) ( -192 896 208 ) ( -192 896 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -120 976 208 ) ( -192 976 208 ) ( -192 976 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -120 896 208 ) ( -120 976 208 ) ( -120 976 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 896 208 ) ( -120 896 208 ) ( -120 896 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 896 208 ) ( -192 976 208 ) ( -120 976 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -120 976 -240 ) ( -192 976 -240 ) ( -192 896 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -120 944 -240 ) ( -160 896 -240 ) ( -120 944 -224 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( -192 1024 208 ) ( -192 976 208 ) ( -192 976 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -96 1088 208 ) ( -192 1088 208 ) ( -192 1088 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -96 976 208 ) ( -96 1024 208 ) ( -96 1024 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 976 208 ) ( -96 976 208 ) ( -96 976 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 976 208 ) ( -192 1024 208 ) ( -96 1024 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -96 1024 -336 ) ( -192 1024 -336 ) ( -192 976 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -96 1040 -240 ) ( -120 976 -240 ) ( -96 1040 -224 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 192 736 144 ) ( 192 720 144 ) ( 192 720 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( 304 736 144 ) ( 224 736 144 ) ( 224 736 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( 304 720 144 ) ( 304 736 144 ) ( 304 736 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( 224 720 144 ) ( 304 720 144 ) ( 304 720 0 ) TECH07_2 176 0 0 1.000000 1.000000
+( 224 720 144 ) ( 224 736 144 ) ( 304 736 144 ) TECH07_2 176 0 0 1.000000 1.000000
+( 304 736 0 ) ( 224 736 0 ) ( 224 720 0 ) TECH07_2 176 0 0 1.000000 1.000000
+}
+{
+( 64 1104 -224 ) ( -96 1104 -224 ) ( -96 1104 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( -96 1088 -224 ) ( 64 1088 -224 ) ( 64 1088 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( -96 1088 -224 ) ( -96 1104 -224 ) ( 64 1104 -224 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 64 1104 -240 ) ( -96 1104 -240 ) ( -96 1088 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( -96 1088 -240 ) ( -40 1104 -240 ) ( -96 1088 -224 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 88 1104 -240 ) ( 192 1088 -240 ) ( 88 1104 -224 ) GROUND1_6 0 0 0 1.000000 1.000000
+}
+{
+( 360 1104 -224 ) ( 168 1104 -224 ) ( 168 1104 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 360 1088 -224 ) ( 360 1104 -224 ) ( 360 1104 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 168 1088 -224 ) ( 360 1088 -224 ) ( 360 1088 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 168 1088 -224 ) ( 168 1104 -224 ) ( 360 1104 -224 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 360 1104 -240 ) ( 168 1104 -240 ) ( 168 1088 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 168 1088 -240 ) ( 296 1104 -240 ) ( 168 1088 -224 ) GROUND1_6 0 0 0 1.000000 1.000000
+}
+{
+( -96 1088 -240 ) ( -96 1072 -240 ) ( -96 1072 -256 ) GROUND1_2 0 0 0 1.000000 1.000000
+( -72 1088 -240 ) ( -96 1088 -240 ) ( -96 1088 -256 ) GROUND1_2 0 0 0 1.000000 1.000000
+( 360 1072 -240 ) ( 360 1088 -240 ) ( 360 1088 -256 ) GROUND1_2 0 0 0 1.000000 1.000000
+( -96 1072 -240 ) ( -72 1072 -240 ) ( -72 1072 -256 ) GROUND1_2 0 0 0 1.000000 1.000000
+( -96 1072 -240 ) ( -96 1088 -240 ) ( -72 1088 -240 ) GROUND1_2 0 0 0 1.000000 1.000000
+( -72 1088 -352 ) ( -96 1088 -352 ) ( -96 1072 -352 ) GROUND1_2 0 0 0 1.000000 1.000000
+}
+{
+( -256 1200 -240 ) ( -256 1160 -240 ) ( -256 1160 -352 ) GROUND1_2 0 0 0 1.000000 1.000000
+( -56 1328 -240 ) ( -96 1328 -240 ) ( -96 1328 -352 ) GROUND1_2 0 0 0 1.000000 1.000000
+( 688 1056 -240 ) ( 688 1096 -240 ) ( 688 1096 -352 ) GROUND1_2 0 0 0 1.000000 1.000000
+( 320 1088 -240 ) ( 360 1088 -240 ) ( 360 1088 -352 ) GROUND1_2 0 0 0 1.000000 1.000000
+( 320 1088 -336 ) ( 320 1128 -336 ) ( 360 1128 -336 ) GROUND1_2 0 0 0 1.000000 1.000000
+( 360 1128 -416 ) ( 320 1128 -416 ) ( 320 1088 -416 ) GROUND1_2 0 0 0 1.000000 1.000000
+}
+{
+( -112 1352 -240 ) ( -112 1336 -240 ) ( -112 1336 -352 ) GROUND1_2 0 0 0 1.000000 1.000000
+( 368 1344 -240 ) ( -96 1344 -240 ) ( -96 1344 -352 ) GROUND1_2 0 0 0 1.000000 1.000000
+( 384 1320 -240 ) ( 384 1336 -240 ) ( 384 1336 -352 ) GROUND1_2 0 0 0 1.000000 1.000000
+( -96 1328 -240 ) ( 368 1328 -240 ) ( 368 1328 -352 ) GROUND1_2 0 0 0 1.000000 1.000000
+( -96 1328 -240 ) ( -96 1344 -240 ) ( 368 1344 -240 ) GROUND1_2 0 0 0 1.000000 1.000000
+( 368 1344 -352 ) ( -96 1344 -352 ) ( -96 1328 -352 ) GROUND1_2 0 0 0 1.000000 1.000000
+}
+{
+( -192 1280 208 ) ( -192 1088 208 ) ( -192 1088 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -96 1280 208 ) ( -192 1280 208 ) ( -192 1280 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -96 1088 208 ) ( -96 1280 208 ) ( -96 1280 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 1088 208 ) ( -96 1088 208 ) ( -96 1088 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 1088 208 ) ( -192 1280 208 ) ( -96 1280 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -96 1280 -336 ) ( -192 1280 -336 ) ( -192 1088 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 360 1280 208 ) ( 360 1088 208 ) ( 360 1088 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1088 208 ) ( 440 1280 208 ) ( 440 1280 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 360 1088 208 ) ( 456 1088 208 ) ( 456 1088 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 360 1088 208 ) ( 360 1280 208 ) ( 456 1280 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 456 1280 -336 ) ( 360 1280 -336 ) ( 360 1088 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1152 208 ) ( 360 1152 208 ) ( 360 1152 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 360 1280 208 ) ( 360 1088 208 ) ( 360 1088 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 456 1280 208 ) ( 360 1280 208 ) ( 360 1280 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1088 208 ) ( 440 1280 208 ) ( 440 1280 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 360 1088 208 ) ( 360 1280 208 ) ( 456 1280 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 360 1152 -336 ) ( 360 1152 208 ) ( 440 1152 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1152 -248 ) ( 440 1280 -248 ) ( 360 1280 -248 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 360 1280 208 ) ( 360 1088 208 ) ( 360 1088 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 456 1280 208 ) ( 360 1280 208 ) ( 360 1280 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1088 208 ) ( 440 1280 208 ) ( 440 1280 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 360 1280 -248 ) ( 440 1280 -248 ) ( 440 1152 -248 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 352 1280 -264 ) ( 352 1240 -248 ) ( 368 1280 -264 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 360 1280 208 ) ( 360 1088 208 ) ( 360 1088 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1088 208 ) ( 440 1280 208 ) ( 440 1280 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 360 1152 -336 ) ( 360 1152 208 ) ( 440 1152 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 360 1280 -248 ) ( 440 1280 -248 ) ( 440 1152 -248 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 352 1192 -248 ) ( 352 1152 -264 ) ( 368 1192 -248 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 360 1280 208 ) ( 360 1088 208 ) ( 360 1088 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1088 208 ) ( 440 1280 208 ) ( 440 1280 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 360 1152 -336 ) ( 360 1152 208 ) ( 440 1152 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 368 1192 -248 ) ( 352 1152 -264 ) ( 352 1192 -248 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 352 1168 -256 ) ( 352 1152 -296 ) ( 368 1168 -256 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 360 1280 208 ) ( 360 1088 208 ) ( 360 1088 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 456 1280 208 ) ( 360 1280 208 ) ( 360 1280 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1088 208 ) ( 440 1280 208 ) ( 440 1280 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 368 1280 -264 ) ( 352 1240 -248 ) ( 352 1280 -264 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 352 1280 -296 ) ( 352 1264 -256 ) ( 368 1280 -296 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( -112 1392 -224 ) ( -112 1336 -224 ) ( -112 1336 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 64 1856 -224 ) ( -112 1856 -224 ) ( -112 1856 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 384 1320 -224 ) ( 384 1376 -224 ) ( 384 1376 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( -88 1328 -224 ) ( 88 1328 -224 ) ( 88 1328 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( -96 1336 -224 ) ( -96 1392 -224 ) ( 80 1392 -224 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 80 1392 -240 ) ( -96 1392 -240 ) ( -96 1336 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+}
+{
+( -192 1344 208 ) ( -192 1280 208 ) ( -192 1280 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -96 1344 208 ) ( -192 1344 208 ) ( -192 1344 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 1280 208 ) ( -96 1280 208 ) ( -96 1280 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 1280 208 ) ( -192 1344 208 ) ( -96 1344 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -96 1344 -336 ) ( -192 1344 -336 ) ( -192 1280 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -112 1344 -336 ) ( -96 1280 -336 ) ( -112 1344 -320 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 360 1344 -224 ) ( 360 1280 -224 ) ( 360 1280 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1344 -224 ) ( 360 1344 -224 ) ( 360 1344 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1280 -224 ) ( 440 1344 -224 ) ( 440 1344 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 360 1280 -224 ) ( 440 1280 -224 ) ( 440 1280 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 360 1280 208 ) ( 360 1344 208 ) ( 440 1344 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1344 -336 ) ( 360 1344 -336 ) ( 360 1280 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 360 1304 -240 ) ( 384 1344 -240 ) ( 360 1304 -224 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( -56 1328 -344 ) ( -40 1328 -344 ) ( -40 1328 -320 ) GROUND1_2 0 0 0 1.000000 1.000000
+( -56 1304 -344 ) ( -40 1304 -344 ) ( -40 1328 -344 ) GROUND1_2 0 0 0 1.000000 1.000000
+( 384 1288 -320 ) ( 384 1312 -320 ) ( 384 1312 -344 ) GROUND1_2 0 0 0 1.000000 1.000000
+( -112 1328 -344 ) ( -112 1328 -320 ) ( -112 1304 -320 ) GROUND1_2 0 0 0 1.000000 1.000000
+( -40 1328 -320 ) ( -56 1304 -344 ) ( -56 1328 -320 ) GROUND1_2 0 0 0 1.000000 1.000000
+}
+{
+( -40 1088 -320 ) ( -40 1088 -344 ) ( -56 1088 -344 ) GROUND1_2 0 0 0 1.000000 1.000000
+( -40 1088 -344 ) ( -40 1112 -344 ) ( -56 1112 -344 ) GROUND1_2 0 0 0 1.000000 1.000000
+( 360 1096 -344 ) ( 360 1096 -320 ) ( 360 1120 -320 ) GROUND1_2 0 0 0 1.000000 1.000000
+( -96 1120 -320 ) ( -96 1096 -320 ) ( -96 1096 -344 ) GROUND1_2 0 0 0 1.000000 1.000000
+( -56 1088 -320 ) ( -56 1112 -344 ) ( -40 1088 -320 ) GROUND1_2 0 0 0 1.000000 1.000000
+}
+{
+( -192 1288 -336 ) ( -192 1208 -336 ) ( -192 1208 -352 ) *WATER0 0 0 0 1.000000 1.000000
+( 8 1328 -336 ) ( -104 1328 -336 ) ( -104 1328 -352 ) *WATER0 0 0 0 1.000000 1.000000
+( 520 1080 -336 ) ( 520 1160 -336 ) ( 520 1160 -352 ) *WATER0 0 0 0 1.000000 1.000000
+( 248 1088 -336 ) ( 360 1088 -336 ) ( 360 1088 -352 ) *WATER0 0 0 0 1.000000 1.000000
+( -96 1200 -296 ) ( -96 1280 -296 ) ( 16 1280 -296 ) *WATER0 0 0 0 1.000000 1.000000
+( 16 1280 -352 ) ( -96 1280 -352 ) ( -96 1200 -352 ) *WATER0 0 0 0 1.000000 1.000000
+}
+{
+( 64 1328 -208 ) ( 64 1088 -208 ) ( 64 1088 -224 ) ECOP1_6 0 0 0 1.000000 1.000000
+( 192 1328 -208 ) ( 64 1328 -208 ) ( 64 1328 -224 ) ECOP1_6 0 0 0 1.000000 1.000000
+( 192 1088 -208 ) ( 192 1328 -208 ) ( 192 1328 -224 ) ECOP1_6 0 0 0 1.000000 1.000000
+( 64 1088 -208 ) ( 192 1088 -208 ) ( 192 1088 -224 ) ECOP1_6 0 0 0 1.000000 1.000000
+( 64 1088 -208 ) ( 64 1328 -208 ) ( 192 1328 -208 ) ECOP1_6 0 0 0 1.000000 1.000000
+( 192 1328 -224 ) ( 64 1328 -224 ) ( 64 1088 -224 ) ECOP1_6 0 0 0 1.000000 1.000000
+}
+{
+( 64 1088 -224 ) ( 80 1088 -224 ) ( 80 1088 -208 ) ECOP1_6 0 0 0 1.000000 1.000000
+( 64 1040 -224 ) ( 192 1040 -224 ) ( 192 1072 -224 ) ECOP1_6 0 0 0 1.000000 1.000000
+( 192 1064 -208 ) ( 192 1080 -208 ) ( 192 1080 -224 ) ECOP1_6 0 0 0 1.000000 1.000000
+( 64 1088 -224 ) ( 64 1088 -208 ) ( 64 1072 -208 ) ECOP1_6 0 0 0 1.000000 1.000000
+( 136 1088 -208 ) ( 120 1040 -224 ) ( 120 1088 -208 ) ECOP1_6 0 0 0 1.000000 1.000000
+}
+{
+( -192 1472 208 ) ( -192 1344 208 ) ( -192 1344 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -128 1456 208 ) ( -200 1456 208 ) ( -200 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -112 1344 208 ) ( -112 1472 208 ) ( -112 1472 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -184 1344 208 ) ( -112 1344 208 ) ( -112 1344 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -184 1344 208 ) ( -184 1472 208 ) ( -112 1472 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -112 1472 -336 ) ( -184 1472 -336 ) ( -184 1344 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 384 1472 208 ) ( 384 1344 208 ) ( 384 1344 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 456 1440 208 ) ( 384 1440 208 ) ( 384 1440 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1344 208 ) ( 440 1472 208 ) ( 440 1472 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 384 1344 208 ) ( 456 1344 208 ) ( 456 1344 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 384 1344 208 ) ( 384 1472 208 ) ( 456 1472 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 456 1472 -336 ) ( 384 1472 -336 ) ( 384 1344 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 24 656 -256 ) ( 40 656 -256 ) ( 40 720 -256 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 24 720 -256 ) ( 40 720 -256 ) ( 40 720 -224 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 24 656 -224 ) ( 40 656 -224 ) ( 40 656 -256 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 208 712 -224 ) ( 208 712 -256 ) ( 208 648 -256 ) GROUND1_6 0 0 0 1.000000 1.000000
+( -192 672 -256 ) ( -192 736 -256 ) ( -192 736 -224 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 40 720 -224 ) ( 24 656 -240 ) ( 24 720 -224 ) GROUND1_6 0 0 0 1.000000 1.000000
+}
+{
+( 32 1168 160 ) ( 32 1152 160 ) ( 32 1152 -240 ) TECH07_2 0 0 0 1.000000 1.000000
+( 224 1168 160 ) ( 0 1168 160 ) ( 0 1168 -240 ) TECH07_2 0 0 0 1.000000 1.000000
+( 224 1152 160 ) ( 224 1168 160 ) ( 224 1168 -240 ) TECH07_2 0 0 0 1.000000 1.000000
+( 0 1152 160 ) ( 224 1152 160 ) ( 224 1152 -240 ) TECH07_2 0 0 0 1.000000 1.000000
+( 0 1152 144 ) ( 0 1168 144 ) ( 224 1168 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( 224 1168 0 ) ( 0 1168 0 ) ( 0 1152 0 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 0 1216 144 ) ( 0 1168 144 ) ( 0 1168 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 8 1664 144 ) ( -8 1664 144 ) ( -8 1664 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 16 1168 144 ) ( 16 1216 144 ) ( 16 1216 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 0 1184 144 ) ( 16 1184 144 ) ( 16 1184 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 0 1168 144 ) ( 0 1216 144 ) ( 16 1216 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( 16 1216 0 ) ( 0 1216 0 ) ( 0 1168 0 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 240 1216 144 ) ( 240 1168 144 ) ( 240 1168 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 232 1664 144 ) ( 216 1664 144 ) ( 216 1664 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 256 1168 144 ) ( 256 1216 144 ) ( 256 1216 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 232 1184 144 ) ( 248 1184 144 ) ( 248 1184 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 240 1168 144 ) ( 240 1216 144 ) ( 256 1216 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( 256 1216 0 ) ( 240 1216 0 ) ( 240 1168 0 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 16 1208 144 ) ( 16 1168 144 ) ( 16 1168 0 ) TWALL5_3 0 0 0 1.000000 1.000000
+( 232 1664 144 ) ( 200 1664 144 ) ( 200 1664 0 ) TWALL5_3 0 0 0 1.000000 1.000000
+( 240 1312 144 ) ( 240 1352 144 ) ( 240 1352 0 ) TWALL5_3 0 0 0 1.000000 1.000000
+( 16 1168 144 ) ( 48 1168 144 ) ( 48 1168 0 ) TWALL5_3 0 0 0 1.000000 1.000000
+( 16 1168 16 ) ( 16 1208 16 ) ( 48 1208 16 ) TWALL5_3 0 0 0 1.000000 1.000000
+( 48 1208 0 ) ( 16 1208 0 ) ( 16 1168 0 ) TWALL5_3 0 0 0 1.000000 1.000000
+( 240 1184 24 ) ( 224 1168 24 ) ( 240 1184 40 ) TWALL5_3 0 0 0 1.000000 1.000000
+( 32 1168 24 ) ( 16 1184 24 ) ( 32 1168 40 ) TWALL5_3 0 0 0 1.000000 1.000000
+}
+{
+( -192 1648 144 ) ( -192 1632 144 ) ( -192 1632 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 0 1664 144 ) ( -16 1664 144 ) ( -16 1664 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 0 1648 144 ) ( 0 1664 144 ) ( 0 1664 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( -16 1648 144 ) ( 0 1648 144 ) ( 0 1648 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( -16 1648 144 ) ( -16 1664 144 ) ( 0 1664 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( 0 1664 0 ) ( -16 1664 0 ) ( -16 1648 0 ) TECH04_2 0 0 0 1.000000 1.000000
+}
+{
+( 256 1648 144 ) ( 256 1632 144 ) ( 256 1632 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 448 1664 144 ) ( 432 1664 144 ) ( 432 1664 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 448 1648 144 ) ( 448 1664 144 ) ( 448 1664 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 432 1648 144 ) ( 448 1648 144 ) ( 448 1648 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 432 1648 144 ) ( 432 1664 144 ) ( 448 1664 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( 448 1664 0 ) ( 432 1664 0 ) ( 432 1648 0 ) TECH04_2 0 0 0 1.000000 1.000000
+}
+{
+( 384 1496 208 ) ( 384 1440 208 ) ( 384 1440 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1496 208 ) ( 384 1496 208 ) ( 384 1496 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1440 208 ) ( 440 1496 208 ) ( 440 1496 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 384 1440 208 ) ( 440 1440 208 ) ( 440 1440 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 384 1440 208 ) ( 384 1496 208 ) ( 440 1496 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1496 -336 ) ( 384 1496 -336 ) ( 384 1440 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 384 1464 -336 ) ( 424 1496 -336 ) ( 384 1464 -320 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( -192 1504 208 ) ( -192 1456 208 ) ( -192 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -112 1504 208 ) ( -192 1504 208 ) ( -192 1504 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 1456 208 ) ( -112 1456 208 ) ( -112 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 1456 208 ) ( -192 1504 208 ) ( -112 1504 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -112 1504 -336 ) ( -192 1504 -336 ) ( -192 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -168 1504 -336 ) ( -112 1456 -336 ) ( -168 1504 -320 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( -192 1856 16 ) ( -192 1672 16 ) ( -192 1672 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 1856 16 ) ( -200 1856 16 ) ( -200 1856 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -200 1664 16 ) ( 448 1664 16 ) ( 448 1664 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -200 1672 16 ) ( -200 1856 16 ) ( 448 1856 16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 1856 0 ) ( -200 1856 0 ) ( -200 1672 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -48 1776 0 ) ( -48 1776 16 ) ( -48 1824 16 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 448 1856 16 ) ( -200 1856 16 ) ( -200 1856 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -200 1672 16 ) ( -200 1856 16 ) ( 448 1856 16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 1856 0 ) ( -200 1856 0 ) ( -200 1672 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -48 1824 16 ) ( -48 1776 16 ) ( -48 1776 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -48 1824 0 ) ( -48 1824 16 ) ( 8 1824 16 ) TECH04_1 0 0 0 1.000000 1.000000
+( -16 1840 0 ) ( -16 1840 16 ) ( -16 1904 16 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 448 1856 16 ) ( -200 1856 16 ) ( -200 1856 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 1672 16 ) ( 448 1856 16 ) ( 448 1856 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -200 1672 16 ) ( -200 1856 16 ) ( 448 1856 16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 1856 0 ) ( -200 1856 0 ) ( -200 1672 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -48 1824 0 ) ( -48 1824 16 ) ( 8 1824 16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 272 1904 0 ) ( 272 1904 16 ) ( 272 1840 16 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -200 1672 16 ) ( -200 1856 16 ) ( 448 1856 16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 1856 0 ) ( -200 1856 0 ) ( -200 1672 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -48 1824 0 ) ( -48 1824 16 ) ( 8 1824 16 ) TECH04_1 0 0 0 1.000000 1.000000
+( -16 1904 16 ) ( -16 1840 16 ) ( -16 1840 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( 272 1840 16 ) ( 272 1904 16 ) ( 272 1904 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( 272 1840 0 ) ( 272 1840 16 ) ( -16 1840 16 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 448 1672 16 ) ( 448 1856 16 ) ( 448 1856 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -200 1664 16 ) ( 448 1664 16 ) ( 448 1664 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -200 1672 16 ) ( -200 1856 16 ) ( 448 1856 16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 1856 0 ) ( -200 1856 0 ) ( -200 1672 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( 8 1824 16 ) ( -48 1824 16 ) ( -48 1824 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 1824 0 ) ( 0 1824 16 ) ( 0 1776 16 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -200 1664 16 ) ( 448 1664 16 ) ( 448 1664 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -200 1672 16 ) ( -200 1856 16 ) ( 448 1856 16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 1856 0 ) ( -200 1856 0 ) ( -200 1672 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -48 1824 16 ) ( -48 1776 16 ) ( -48 1776 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 1776 16 ) ( 0 1824 16 ) ( 0 1824 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( 8 1776 0 ) ( 8 1776 16 ) ( -48 1776 16 ) TECH07_2 0 0 0 1.000000 1.000000
+}
+{
+( -160 1792 0 ) ( -160 1728 0 ) ( -160 1728 -16 ) TECH04_3 0 0 0 1.000000 1.000000
+( -64 1792 0 ) ( -128 1792 0 ) ( -128 1792 -16 ) TECH04_3 0 0 0 1.000000 1.000000
+( -32 1728 0 ) ( -32 1792 0 ) ( -32 1792 -16 ) TECH04_3 0 0 0 1.000000 1.000000
+( -136 1664 0 ) ( -72 1664 0 ) ( -72 1664 -16 ) TECH04_3 0 0 0 1.000000 1.000000
+( -128 1728 0 ) ( -128 1792 0 ) ( -64 1792 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( -64 1792 -224 ) ( -128 1792 -224 ) ( -128 1728 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( -120 1800 0 ) ( -104 1816 0 ) ( -120 1800 16 ) TECH04_3 0 0 0 1.000000 1.000000
+( -80 1808 0 ) ( -64 1792 0 ) ( -80 1808 16 ) TECH04_3 0 0 0 1.000000 1.000000
+( -48 1680 0 ) ( -64 1664 0 ) ( -48 1680 16 ) TECH04_3 0 0 0 1.000000 1.000000
+( -160 1696 0 ) ( -176 1712 0 ) ( -160 1696 16 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 384 1856 -224 ) ( 384 1520 -224 ) ( 384 1520 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 576 1856 -224 ) ( 384 1856 -224 ) ( 384 1856 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 768 1504 -224 ) ( 768 1840 -224 ) ( 768 1840 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 376 1440 -224 ) ( 568 1440 -224 ) ( 568 1440 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 384 1520 -224 ) ( 384 1856 -224 ) ( 576 1856 -224 ) GROUND1_6 0 0 0 1.000000 1.000000
+( 576 1856 -240 ) ( 384 1856 -240 ) ( 384 1520 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+}
+{
+( -512 1856 -224 ) ( -512 1520 -224 ) ( -512 1520 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( -112 1856 -224 ) ( -304 1856 -224 ) ( -304 1856 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( -112 1520 -224 ) ( -112 1856 -224 ) ( -112 1856 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( -312 1456 -224 ) ( -120 1456 -224 ) ( -120 1456 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+( -304 1520 -224 ) ( -304 1856 -224 ) ( -112 1856 -224 ) GROUND1_6 0 0 0 1.000000 1.000000
+( -112 1856 -240 ) ( -304 1856 -240 ) ( -304 1520 -240 ) GROUND1_6 0 0 0 1.000000 1.000000
+}
+{
+( 288 1792 0 ) ( 288 1728 0 ) ( 288 1728 -16 ) TECH04_3 0 0 0 1.000000 1.000000
+( 384 1792 0 ) ( 320 1792 0 ) ( 320 1792 -16 ) TECH04_3 0 0 0 1.000000 1.000000
+( 416 1728 0 ) ( 416 1792 0 ) ( 416 1792 -16 ) TECH04_3 0 0 0 1.000000 1.000000
+( 312 1664 0 ) ( 376 1664 0 ) ( 376 1664 -16 ) TECH04_3 0 0 0 1.000000 1.000000
+( 320 1728 0 ) ( 320 1792 0 ) ( 384 1792 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 384 1792 -224 ) ( 320 1792 -224 ) ( 320 1728 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 328 1800 0 ) ( 344 1816 0 ) ( 328 1800 16 ) TECH04_3 0 0 0 1.000000 1.000000
+( 368 1808 0 ) ( 384 1792 0 ) ( 368 1808 16 ) TECH04_3 0 0 0 1.000000 1.000000
+( 400 1680 0 ) ( 384 1664 0 ) ( 400 1680 16 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 1696 0 ) ( 272 1712 0 ) ( 288 1696 16 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -48 1760 0 ) ( -48 1744 0 ) ( -48 1744 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( -8 1776 0 ) ( -32 1776 0 ) ( -32 1776 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( -24 1712 0 ) ( 0 1712 0 ) ( 0 1712 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( -32 1744 0 ) ( -32 1760 0 ) ( -8 1760 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( -8 1760 -224 ) ( -32 1760 -224 ) ( -32 1744 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 56 1728 -224 ) ( 56 1728 0 ) ( 56 1760 0 ) TLIGHT07 0 48 0 1.000000 1.000000
+}
+{
+( -8 1776 0 ) ( -32 1776 0 ) ( -32 1776 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( -32 1744 0 ) ( -32 1760 0 ) ( -8 1760 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( -8 1760 -224 ) ( -32 1760 -224 ) ( -32 1744 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 64 1744 -176 ) ( 64 1744 -144 ) ( 64 1760 -144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 56 1760 0 ) ( 56 1728 0 ) ( 56 1728 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 56 1760 -224 ) ( 56 1760 0 ) ( 64 1760 0 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( -24 1712 0 ) ( 0 1712 0 ) ( 0 1712 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( -32 1744 0 ) ( -32 1760 0 ) ( -8 1760 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( -8 1760 -224 ) ( -32 1760 -224 ) ( -32 1744 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 64 1744 -176 ) ( 64 1744 -144 ) ( 64 1760 -144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 56 1760 0 ) ( 56 1728 0 ) ( 56 1728 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 64 1728 -224 ) ( 64 1728 0 ) ( 56 1728 0 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( -32 1744 0 ) ( -32 1760 0 ) ( -8 1760 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 64 1744 -176 ) ( 64 1744 -144 ) ( 64 1760 -144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 56 1760 0 ) ( 56 1728 0 ) ( 56 1728 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 64 1760 0 ) ( 56 1760 0 ) ( 56 1760 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 56 1728 0 ) ( 64 1728 0 ) ( 64 1728 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 64 1760 -80 ) ( 56 1760 -80 ) ( 56 1728 -80 ) TECH07_2 0 0 0 1.000000 1.000000
+}
+{
+( -8 1760 -224 ) ( -32 1760 -224 ) ( -32 1744 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 64 1744 -176 ) ( 64 1744 -144 ) ( 64 1760 -144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 56 1760 0 ) ( 56 1728 0 ) ( 56 1728 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 64 1760 0 ) ( 56 1760 0 ) ( 56 1760 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 56 1728 0 ) ( 64 1728 0 ) ( 64 1728 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 56 1728 -208 ) ( 56 1760 -208 ) ( 64 1760 -208 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( -8 1776 0 ) ( -32 1776 0 ) ( -32 1776 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 288 1752 0 ) ( 288 1768 0 ) ( 288 1768 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( -32 1744 0 ) ( -32 1760 0 ) ( -8 1760 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( -8 1760 -224 ) ( -32 1760 -224 ) ( -32 1744 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 192 1760 -176 ) ( 192 1760 -144 ) ( 192 1744 -144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 192 1760 -224 ) ( 192 1760 0 ) ( 200 1760 0 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 288 1712 0 ) ( 288 1728 0 ) ( 288 1728 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( -32 1712 0 ) ( -8 1712 0 ) ( -8 1712 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( -32 1744 0 ) ( -32 1760 0 ) ( -8 1760 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( -8 1760 -224 ) ( -32 1760 -224 ) ( -32 1744 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 200 1760 0 ) ( 192 1760 0 ) ( 192 1760 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 200 1760 -224 ) ( 200 1760 0 ) ( 200 1728 0 ) TLIGHT07 0 48 0 1.000000 1.000000
+}
+{
+( -32 1712 0 ) ( -8 1712 0 ) ( -8 1712 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( -32 1744 0 ) ( -32 1760 0 ) ( -8 1760 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( -8 1760 -224 ) ( -32 1760 -224 ) ( -32 1744 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 192 1760 -176 ) ( 192 1760 -144 ) ( 192 1744 -144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 200 1728 0 ) ( 200 1760 0 ) ( 200 1760 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 200 1728 -224 ) ( 200 1728 0 ) ( 192 1728 0 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( -32 1744 0 ) ( -32 1760 0 ) ( -8 1760 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 192 1760 -176 ) ( 192 1760 -144 ) ( 192 1744 -144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 200 1760 0 ) ( 192 1760 0 ) ( 192 1760 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 200 1728 0 ) ( 200 1760 0 ) ( 200 1760 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 192 1728 0 ) ( 200 1728 0 ) ( 200 1728 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 200 1760 -80 ) ( 192 1760 -80 ) ( 192 1728 -80 ) TECH07_2 0 0 0 1.000000 1.000000
+}
+{
+( -8 1760 -224 ) ( -32 1760 -224 ) ( -32 1744 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 192 1760 -176 ) ( 192 1760 -144 ) ( 192 1744 -144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 200 1760 0 ) ( 192 1760 0 ) ( 192 1760 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 200 1728 0 ) ( 200 1760 0 ) ( 200 1760 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 192 1728 0 ) ( 200 1728 0 ) ( 200 1728 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 192 1728 -208 ) ( 192 1760 -208 ) ( 200 1760 -208 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( -8 1776 0 ) ( -32 1776 0 ) ( -32 1776 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( -32 1712 0 ) ( -8 1712 0 ) ( -8 1712 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( -32 1744 0 ) ( -32 1760 0 ) ( -8 1760 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 64 1760 -144 ) ( 64 1744 -144 ) ( 64 1744 -176 ) TECH07_2 0 0 0 1.000000 1.000000
+( 192 1744 -144 ) ( 192 1760 -144 ) ( 192 1760 -176 ) TECH07_2 0 0 0 1.000000 1.000000
+( 192 1760 -80 ) ( 64 1760 -80 ) ( 64 1744 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 64 1792 -208 ) ( 64 1744 -208 ) ( 64 1744 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 200 1856 -208 ) ( 72 1856 -208 ) ( 72 1856 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 192 1712 -208 ) ( 192 1760 -208 ) ( 192 1760 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 64 1712 -208 ) ( 192 1712 -208 ) ( 192 1712 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 64 1712 -208 ) ( 64 1760 -208 ) ( 192 1760 -208 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 192 1760 -224 ) ( 64 1760 -224 ) ( 64 1712 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -16 1840 0 ) ( -16 1824 0 ) ( -16 1824 -224 ) TWALL1_1 48 240 0 1.000000 1.000000
+( 64 1840 0 ) ( -32 1840 0 ) ( -32 1840 -224 ) TWALL1_1 48 240 0 1.000000 1.000000
+( 48 1816 0 ) ( 48 1832 0 ) ( 48 1832 -224 ) TWALL1_1 48 240 0 1.000000 1.000000
+( -32 1824 0 ) ( 64 1824 0 ) ( 64 1824 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( -32 1824 -80 ) ( -32 1840 -80 ) ( 64 1840 -80 ) TWALL1_1 48 240 0 1.000000 1.000000
+( 64 1840 -224 ) ( -32 1840 -224 ) ( -32 1824 -224 ) TWALL1_1 48 240 0 1.000000 1.000000
+}
+{
+( 208 1840 0 ) ( 208 1824 0 ) ( 208 1824 -224 ) TWALL1_1 16 240 0 1.000000 1.000000
+( 288 1840 0 ) ( 192 1840 0 ) ( 192 1840 -224 ) TWALL1_1 16 240 0 1.000000 1.000000
+( 288 1824 0 ) ( 288 1840 0 ) ( 288 1840 -224 ) TWALL1_1 16 240 0 1.000000 1.000000
+( 200 1824 0 ) ( 296 1824 0 ) ( 296 1824 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 192 1824 -80 ) ( 192 1840 -80 ) ( 288 1840 -80 ) TWALL1_1 16 240 0 1.000000 1.000000
+( 288 1840 -224 ) ( 192 1840 -224 ) ( 192 1824 -224 ) TWALL1_1 16 240 0 1.000000 1.000000
+}
+{
+( 272 1824 -80 ) ( 272 1776 -80 ) ( 272 1776 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 1824 -80 ) ( 272 1824 -80 ) ( 272 1824 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 1776 -80 ) ( 288 1824 -80 ) ( 288 1824 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 272 1776 -80 ) ( 288 1776 -80 ) ( 288 1776 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 272 1776 -80 ) ( 272 1824 -80 ) ( 288 1824 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 1824 -224 ) ( 272 1824 -224 ) ( 272 1776 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -32 1824 -80 ) ( -32 1776 -80 ) ( -32 1776 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( -16 1824 -80 ) ( -32 1824 -80 ) ( -32 1824 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( -16 1776 -80 ) ( -16 1824 -80 ) ( -16 1824 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( -32 1776 -80 ) ( -16 1776 -80 ) ( -16 1776 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( -32 1776 -80 ) ( -32 1824 -80 ) ( -16 1824 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+( -16 1824 -224 ) ( -32 1824 -224 ) ( -32 1776 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -64 1824 -64 ) ( -64 1776 -64 ) ( -64 1776 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( 0 1840 -64 ) ( -16 1840 -64 ) ( -16 1840 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( 304 1752 -64 ) ( 304 1800 -64 ) ( 304 1800 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( -16 1776 -64 ) ( 0 1776 -64 ) ( 0 1776 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( -16 1776 -64 ) ( -16 1824 -64 ) ( 0 1824 -64 ) TECH04_3 0 0 0 1.000000 1.000000
+( 0 1824 -80 ) ( -16 1824 -80 ) ( -16 1776 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -160 1984 -208 ) ( -160 1840 -208 ) ( -160 1840 -224 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 296 2112 -208 ) ( -24 2112 -208 ) ( -24 2112 -224 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 288 1840 -208 ) ( 288 1984 -208 ) ( 288 1984 -224 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -32 1840 -208 ) ( 288 1840 -208 ) ( 288 1840 -224 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -32 1840 -208 ) ( -32 1984 -208 ) ( 288 1984 -208 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 288 1984 -224 ) ( -32 1984 -224 ) ( -32 1840 -224 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 224 1168 144 ) ( 224 1168 0 ) ( 240 1184 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 256 1184 144 ) ( 240 1184 144 ) ( 240 1184 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 224 1152 0 ) ( 224 1152 144 ) ( 256 1184 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( 224 1152 144 ) ( 224 1152 0 ) ( 224 1168 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 240 1168 144 ) ( 224 1168 144 ) ( 240 1184 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( 224 1168 0 ) ( 240 1168 0 ) ( 256 1184 0 ) TECH04_2 0 0 0 1.000000 1.000000
+}
+{
+( 32 1152 144 ) ( 32 1152 0 ) ( 0 1184 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 16 1184 144 ) ( 0 1184 144 ) ( 0 1184 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 32 1168 0 ) ( 32 1168 144 ) ( 16 1184 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( 32 1152 0 ) ( 32 1152 144 ) ( 32 1168 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( 32 1168 144 ) ( 16 1168 144 ) ( 0 1184 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( 16 1168 0 ) ( 32 1168 0 ) ( 16 1184 0 ) TECH04_2 0 0 0 1.000000 1.000000
+}
+{
+( 256 1280 96 ) ( 256 1240 96 ) ( 256 1240 24 ) TECH04_1 0 0 0 1.000000 1.000000
+( 360 1280 96 ) ( 256 1280 96 ) ( 256 1280 24 ) TECH04_1 0 0 0 1.000000 1.000000
+( 360 1240 96 ) ( 360 1280 96 ) ( 360 1280 24 ) TECH04_1 0 0 0 1.000000 1.000000
+( 256 1216 96 ) ( 360 1216 96 ) ( 360 1216 24 ) TECH04_1 0 0 0 1.000000 1.000000
+( 256 1240 96 ) ( 256 1280 96 ) ( 360 1280 96 ) TECH04_1 0 0 0 1.000000 1.000000
+( 360 1280 24 ) ( 256 1280 24 ) ( 256 1240 24 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -96 1280 96 ) ( -96 1216 96 ) ( -96 1216 24 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 1280 96 ) ( -96 1280 96 ) ( -96 1280 24 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 1216 96 ) ( 0 1280 96 ) ( 0 1280 24 ) TECH04_1 0 0 0 1.000000 1.000000
+( -96 1216 96 ) ( 0 1216 96 ) ( 0 1216 24 ) TECH04_1 0 0 0 1.000000 1.000000
+( -96 1216 96 ) ( -96 1280 96 ) ( 0 1280 96 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 1280 24 ) ( -96 1280 24 ) ( -96 1216 24 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 416 1760 0 ) ( 416 1712 0 ) ( 416 1712 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 488 1760 0 ) ( 416 1760 0 ) ( 416 1760 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 576 1712 0 ) ( 576 1760 0 ) ( 576 1760 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 416 1712 0 ) ( 488 1712 0 ) ( 488 1712 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( 416 1712 0 ) ( 416 1760 0 ) ( 488 1760 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 488 1760 -224 ) ( 416 1760 -224 ) ( 416 1712 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+}
+{
+( -320 1760 0 ) ( -320 1712 0 ) ( -320 1712 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( -248 1760 0 ) ( -320 1760 0 ) ( -320 1760 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( -160 1712 0 ) ( -160 1760 0 ) ( -160 1760 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( -320 1712 0 ) ( -248 1712 0 ) ( -248 1712 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+( -320 1712 0 ) ( -320 1760 0 ) ( -248 1760 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( -248 1760 -224 ) ( -320 1760 -224 ) ( -320 1712 -224 ) TECH07_2 0 0 0 1.000000 1.000000
+}
+{
+( -320 1728 144 ) ( -320 1712 144 ) ( -320 1712 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( -192 1664 0 ) ( -192 1664 144 ) ( -320 1728 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( -192 1648 144 ) ( -192 1664 144 ) ( -192 1664 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( -192 1648 144 ) ( -192 1648 0 ) ( -320 1712 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( -192 1664 144 ) ( -192 1648 144 ) ( -320 1712 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( -192 1648 0 ) ( -192 1664 0 ) ( -320 1728 0 ) TECH04_2 0 0 0 1.000000 1.000000
+}
+{
+( 576 1712 0 ) ( 576 1712 144 ) ( 576 1728 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( 576 1728 144 ) ( 448 1664 144 ) ( 448 1664 0 ) TECH07_2 0 0 0 1.000000 1.000000
+( 448 1664 0 ) ( 448 1664 144 ) ( 448 1648 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( 576 1712 0 ) ( 448 1648 0 ) ( 448 1648 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( 576 1712 144 ) ( 448 1648 144 ) ( 448 1664 144 ) TECH07_2 0 0 0 1.000000 1.000000
+( 576 1728 0 ) ( 448 1664 0 ) ( 448 1648 0 ) TECH04_2 0 0 0 1.000000 1.000000
+}
+{
+( 448 1712 16 ) ( 448 1664 16 ) ( 448 1664 0 ) TECH04_2 0 0 0 1.000000 1.000000
+( 544 1712 16 ) ( 448 1712 16 ) ( 448 1712 0 ) TECH04_2 0 0 0 1.000000 1.000000
+( 448 1664 16 ) ( 448 1712 16 ) ( 544 1712 16 ) TECH04_2 0 0 0 1.000000 1.000000
+( 544 1712 0 ) ( 448 1712 0 ) ( 448 1664 0 ) TECH04_2 0 0 0 1.000000 1.000000
+( 544 1712 0 ) ( 448 1664 0 ) ( 544 1712 16 ) TECH04_2 0 0 0 1.000000 1.000000
+}
+{
+( -192 1664 0 ) ( -192 1664 16 ) ( -192 1712 16 ) TECH04_2 0 0 0 1.000000 1.000000
+( -192 1712 0 ) ( -192 1712 16 ) ( -288 1712 16 ) TECH04_2 0 0 0 1.000000 1.000000
+( -288 1712 16 ) ( -192 1712 16 ) ( -192 1664 16 ) TECH04_2 0 0 0 1.000000 1.000000
+( -192 1664 0 ) ( -192 1712 0 ) ( -288 1712 0 ) TECH04_2 0 0 0 1.000000 1.000000
+( -288 1712 16 ) ( -192 1664 0 ) ( -288 1712 0 ) TECH04_2 0 0 0 1.000000 1.000000
+}
+{
+( -304 1504 208 ) ( -304 1456 208 ) ( -304 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 1504 208 ) ( -304 1504 208 ) ( -304 1504 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 1456 208 ) ( -192 1504 208 ) ( -192 1504 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -304 1456 208 ) ( -192 1456 208 ) ( -192 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -304 1456 208 ) ( -304 1504 208 ) ( -192 1504 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -192 1504 -336 ) ( -304 1504 -336 ) ( -304 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( -384 1560 208 ) ( -384 1456 208 ) ( -384 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -304 1560 208 ) ( -384 1560 208 ) ( -384 1560 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -304 1456 208 ) ( -304 1560 208 ) ( -304 1560 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -384 1456 208 ) ( -304 1456 208 ) ( -304 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -384 1456 208 ) ( -384 1560 208 ) ( -304 1560 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -304 1560 -336 ) ( -384 1560 -336 ) ( -384 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -352 1560 -336 ) ( -304 1504 -336 ) ( -352 1560 -320 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( -448 1632 208 ) ( -448 1456 208 ) ( -448 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -384 1632 208 ) ( -448 1632 208 ) ( -448 1632 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -384 1456 208 ) ( -384 1632 208 ) ( -384 1632 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -448 1456 208 ) ( -384 1456 208 ) ( -384 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -448 1456 208 ) ( -448 1632 208 ) ( -384 1632 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -384 1632 -336 ) ( -448 1632 -336 ) ( -448 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -416 1632 -336 ) ( -384 1560 -336 ) ( -416 1632 -320 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( -512 1792 208 ) ( -512 1600 208 ) ( -512 1600 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -448 1792 208 ) ( -512 1792 208 ) ( -512 1792 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -448 1600 208 ) ( -448 1792 208 ) ( -448 1792 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -512 1600 208 ) ( -448 1600 208 ) ( -448 1600 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -512 1600 208 ) ( -512 1792 208 ) ( -448 1792 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -448 1792 -336 ) ( -512 1792 -336 ) ( -512 1600 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -480 1792 -336 ) ( -448 1632 -336 ) ( -480 1792 -320 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( -512 1712 160 ) ( -512 1504 160 ) ( -512 1504 144 ) SKY4 0 0 0 1.000000 1.000000
+( -200 1760 160 ) ( -520 1760 160 ) ( -520 1760 144 ) SKY4 0 0 0 1.000000 1.000000
+( -192 1504 160 ) ( -192 1712 160 ) ( -192 1712 144 ) SKY4 0 0 0 1.000000 1.000000
+( -512 1504 160 ) ( -192 1504 160 ) ( -192 1504 144 ) SKY4 0 0 0 1.000000 1.000000
+( -512 1504 160 ) ( -512 1712 160 ) ( -192 1712 160 ) SKY4 0 0 0 1.000000 1.000000
+( -192 1712 144 ) ( -512 1712 144 ) ( -512 1504 144 ) SKY4 0 0 0 1.000000 1.000000
+}
+{
+( 440 1496 208 ) ( 440 1440 208 ) ( 440 1440 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 512 1496 208 ) ( 440 1496 208 ) ( 440 1496 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 512 1440 208 ) ( 512 1496 208 ) ( 512 1496 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1456 208 ) ( 512 1456 208 ) ( 512 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 440 1440 208 ) ( 440 1496 208 ) ( 512 1496 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 512 1496 -336 ) ( 440 1496 -336 ) ( 440 1440 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 512 1496 208 ) ( 512 1456 208 ) ( 512 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 576 1456 208 ) ( 576 1496 208 ) ( 576 1496 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 512 1456 208 ) ( 576 1456 208 ) ( 576 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 512 1456 208 ) ( 512 1496 208 ) ( 576 1496 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 576 1496 -336 ) ( 512 1496 -336 ) ( 512 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 512 1496 -336 ) ( 576 1504 -336 ) ( 512 1496 -320 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 440 1712 160 ) ( 440 1496 160 ) ( 440 1496 144 ) SKY4 0 0 0 1.000000 1.000000
+( 576 1744 160 ) ( 440 1744 160 ) ( 440 1744 144 ) SKY4 0 0 0 1.000000 1.000000
+( 768 1480 160 ) ( 768 1696 160 ) ( 768 1696 144 ) SKY4 0 0 0 1.000000 1.000000
+( 440 1496 160 ) ( 576 1496 160 ) ( 576 1496 144 ) SKY4 0 0 0 1.000000 1.000000
+( 440 1496 160 ) ( 440 1712 160 ) ( 576 1712 160 ) SKY4 0 0 0 1.000000 1.000000
+( 576 1712 144 ) ( 440 1712 144 ) ( 440 1496 144 ) SKY4 0 0 0 1.000000 1.000000
+}
+{
+( 576 1536 208 ) ( 576 1456 208 ) ( 576 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 640 1456 208 ) ( 640 1536 208 ) ( 640 1536 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 576 1456 208 ) ( 640 1456 208 ) ( 640 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 576 1456 208 ) ( 576 1536 208 ) ( 640 1536 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 640 1536 -336 ) ( 576 1536 -336 ) ( 576 1456 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 576 1504 -336 ) ( 640 1536 -336 ) ( 576 1504 -320 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 640 1600 208 ) ( 640 1504 208 ) ( 640 1504 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 704 1504 208 ) ( 704 1600 208 ) ( 704 1600 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 640 1504 208 ) ( 704 1504 208 ) ( 704 1504 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 640 1504 208 ) ( 640 1600 208 ) ( 704 1600 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 704 1600 -336 ) ( 640 1600 -336 ) ( 640 1504 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 640 1568 -336 ) ( 704 1600 -336 ) ( 640 1568 -320 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 704 1664 208 ) ( 704 1568 208 ) ( 704 1568 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 768 1664 208 ) ( 704 1664 208 ) ( 704 1664 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 744 1568 208 ) ( 744 1664 208 ) ( 744 1664 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 704 1568 208 ) ( 768 1568 208 ) ( 768 1568 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 704 1568 208 ) ( 704 1664 208 ) ( 768 1664 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 768 1664 -240 ) ( 704 1664 -240 ) ( 704 1568 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 704 1632 -336 ) ( 736 1664 -336 ) ( 704 1632 -320 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 720 1752 208 ) ( 720 1656 208 ) ( 720 1656 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 752 1752 208 ) ( 720 1752 208 ) ( 720 1752 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 736 1656 208 ) ( 736 1752 208 ) ( 736 1752 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 720 1648 208 ) ( 752 1648 208 ) ( 752 1648 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 720 1656 208 ) ( 720 1752 208 ) ( 752 1752 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 752 1752 -240 ) ( 720 1752 -240 ) ( 720 1656 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( 288 2112 -192 ) ( 288 1920 -192 ) ( 288 1920 -208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 512 2176 -192 ) ( 288 2176 -192 ) ( 288 2176 -208 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 576 1920 -192 ) ( 576 2112 -192 ) ( 576 2112 -208 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 288 1856 -192 ) ( 512 1856 -192 ) ( 512 1856 -208 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 288 1920 -192 ) ( 288 2112 -192 ) ( 512 2112 -192 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 512 2112 -208 ) ( 288 2112 -208 ) ( 288 1920 -208 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 384 2056 -176 ) ( 384 1992 -176 ) ( 384 1992 -192 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 448 2048 -176 ) ( 392 2048 -176 ) ( 392 2048 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 392 1984 -176 ) ( 448 1984 -176 ) ( 448 1984 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 392 1984 0 ) ( 392 2048 0 ) ( 448 2048 0 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 448 2048 -192 ) ( 392 2048 -192 ) ( 392 1984 -192 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 400 2040 -192 ) ( 400 2040 0 ) ( 400 2048 0 ) TWALL2_2 0 192 0 1.000000 1.000000
+}
+{
+( 448 2048 -176 ) ( 392 2048 -176 ) ( 392 2048 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 392 1984 -176 ) ( 448 1984 -176 ) ( 448 1984 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 392 1984 0 ) ( 392 2048 0 ) ( 448 2048 0 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 448 2048 -192 ) ( 392 2048 -192 ) ( 392 1984 -192 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 432 2048 -192 ) ( 432 2048 0 ) ( 432 2040 0 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 440 2000 -192 ) ( 440 2000 0 ) ( 440 2032 0 ) TWALL2_5 0 0 0 1.000000 1.000000
+}
+{
+( 448 2048 -176 ) ( 392 2048 -176 ) ( 392 2048 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 448 1984 -176 ) ( 448 2048 -176 ) ( 448 2048 -192 ) TWALL2_2 0 64 0 1.000000 1.000000
+( 392 1984 0 ) ( 392 2048 0 ) ( 448 2048 0 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 448 2048 -192 ) ( 392 2048 -192 ) ( 392 1984 -192 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 440 2032 0 ) ( 440 2000 0 ) ( 440 2000 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 440 2032 -192 ) ( 440 2032 0 ) ( 448 2032 0 ) TWALL2_5 0 0 0 1.000000 1.000000
+}
+{
+( 448 1984 -176 ) ( 448 2048 -176 ) ( 448 2048 -192 ) TWALL2_2 0 64 0 1.000000 1.000000
+( 392 1984 -176 ) ( 448 1984 -176 ) ( 448 1984 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 392 1984 0 ) ( 392 2048 0 ) ( 448 2048 0 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 448 2048 -192 ) ( 392 2048 -192 ) ( 392 1984 -192 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 440 2032 0 ) ( 440 2000 0 ) ( 440 2000 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 448 2000 -192 ) ( 448 2000 0 ) ( 440 2000 0 ) TWALL2_2 0 64 0 1.000000 1.000000
+}
+{
+( 448 1984 -176 ) ( 448 2048 -176 ) ( 448 2048 -192 ) TWALL2_2 0 64 0 1.000000 1.000000
+( 392 1984 0 ) ( 392 2048 0 ) ( 448 2048 0 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 440 2032 0 ) ( 440 2000 0 ) ( 440 2000 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 448 2032 0 ) ( 440 2032 0 ) ( 440 2032 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 440 2000 0 ) ( 448 2000 0 ) ( 448 2000 -192 ) TWALL2_2 0 64 0 1.000000 1.000000
+( 448 2032 -64 ) ( 440 2032 -64 ) ( 440 2000 -64 ) TWALL2_2 0 64 0 1.000000 1.000000
+}
+{
+( 448 1984 -176 ) ( 448 2048 -176 ) ( 448 2048 -192 ) TWALL2_2 0 64 0 1.000000 1.000000
+( 448 2048 -192 ) ( 392 2048 -192 ) ( 392 1984 -192 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 440 2032 0 ) ( 440 2000 0 ) ( 440 2000 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 448 2032 0 ) ( 440 2032 0 ) ( 440 2032 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 440 2000 0 ) ( 448 2000 0 ) ( 448 2000 -192 ) TWALL2_2 0 64 0 1.000000 1.000000
+( 440 2000 -96 ) ( 440 2032 -96 ) ( 448 2032 -96 ) TWALL2_2 0 64 0 1.000000 1.000000
+}
+{
+( 392 1984 0 ) ( 392 2048 0 ) ( 448 2048 0 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 448 2048 -192 ) ( 392 2048 -192 ) ( 392 1984 -192 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 400 2048 0 ) ( 400 2040 0 ) ( 400 2040 -192 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 432 2040 0 ) ( 432 2048 0 ) ( 432 2048 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 432 2040 -192 ) ( 432 2040 0 ) ( 400 2040 0 ) TLIGHT07 16 208 0 1.000000 1.000000
+( 400 1992 -208 ) ( 400 1992 0 ) ( 432 1992 0 ) TLIGHT07 16 208 0 1.000000 1.000000
+}
+{
+( 392 1984 -176 ) ( 448 1984 -176 ) ( 448 1984 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 392 1984 0 ) ( 392 2048 0 ) ( 448 2048 0 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 400 2048 0 ) ( 400 2040 0 ) ( 400 2040 -192 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 432 2040 0 ) ( 432 2048 0 ) ( 432 2048 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 432 1992 0 ) ( 400 1992 0 ) ( 400 1992 -208 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 432 1992 -48 ) ( 400 1992 -48 ) ( 400 1984 -48 ) TWALL2_5 0 0 0 1.000000 1.000000
+}
+{
+( 392 1984 -176 ) ( 448 1984 -176 ) ( 448 1984 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 448 2048 -192 ) ( 392 2048 -192 ) ( 392 1984 -192 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 400 2048 0 ) ( 400 2040 0 ) ( 400 2040 -192 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 432 2040 0 ) ( 432 2048 0 ) ( 432 2048 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 432 1992 0 ) ( 400 1992 0 ) ( 400 1992 -208 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 400 1984 -176 ) ( 400 1992 -176 ) ( 432 1992 -176 ) TWALL2_5 0 0 0 1.000000 1.000000
+}
+{
+( 448 2048 -176 ) ( 392 2048 -176 ) ( 392 2048 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 392 1984 0 ) ( 392 2048 0 ) ( 448 2048 0 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 400 2048 0 ) ( 400 2040 0 ) ( 400 2040 -192 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 432 2040 0 ) ( 432 2048 0 ) ( 432 2048 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 400 2040 0 ) ( 432 2040 0 ) ( 432 2040 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 432 2048 -48 ) ( 400 2048 -48 ) ( 400 2040 -48 ) TWALL2_5 0 0 0 1.000000 1.000000
+}
+{
+( 448 2048 -176 ) ( 392 2048 -176 ) ( 392 2048 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 448 2048 -192 ) ( 392 2048 -192 ) ( 392 1984 -192 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 400 2048 0 ) ( 400 2040 0 ) ( 400 2040 -192 ) TWALL2_2 0 192 0 1.000000 1.000000
+( 432 2040 0 ) ( 432 2048 0 ) ( 432 2048 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 400 2040 0 ) ( 432 2040 0 ) ( 432 2040 -192 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 400 2040 -176 ) ( 400 2048 -176 ) ( 432 2048 -176 ) TWALL2_5 0 0 0 1.000000 1.000000
+}
+{
+( 288 1856 -192 ) ( 288 1840 -192 ) ( 288 1840 -208 ) TWALL1_1 0 0 0 1.000000 1.000000
+( 336 1856 -192 ) ( 288 1856 -192 ) ( 288 1856 -208 ) TWALL1_1 0 0 0 1.000000 1.000000
+( 576 1832 -192 ) ( 576 1848 -192 ) ( 576 1848 -208 ) TWALL1_1 0 0 0 1.000000 1.000000
+( 288 1840 -192 ) ( 336 1840 -192 ) ( 336 1840 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 1840 0 ) ( 288 1856 0 ) ( 336 1856 0 ) TWALL1_1 0 0 0 1.000000 1.000000
+( 336 1856 -208 ) ( 288 1856 -208 ) ( 288 1840 -208 ) TWALL1_1 0 0 0 1.000000 1.000000
+}
+{
+( 272 2176 0 ) ( 272 2112 0 ) ( 272 2112 -208 ) TWALL1_1 32 0 0 1.000000 1.000000
+( 288 2176 0 ) ( 272 2176 0 ) ( 272 2176 -208 ) TWALL1_1 32 0 0 1.000000 1.000000
+( 288 2112 0 ) ( 288 2176 0 ) ( 288 2176 -208 ) TWALL1_1 32 0 0 1.000000 1.000000
+( 272 2112 0 ) ( 288 2112 0 ) ( 288 2112 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( 272 2112 0 ) ( 272 2176 0 ) ( 288 2176 0 ) TWALL1_1 32 0 0 1.000000 1.000000
+( 288 2176 -208 ) ( 272 2176 -208 ) ( 272 2112 -208 ) TWALL1_1 32 0 0 1.000000 1.000000
+}
+{
+( 272 2192 0 ) ( 272 2176 0 ) ( 272 2176 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 320 2192 0 ) ( 272 2192 0 ) ( 272 2192 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 272 2176 0 ) ( 320 2176 0 ) ( 320 2176 -208 ) TWALL1_1 0 0 0 1.000000 1.000000
+( 272 2176 0 ) ( 272 2192 0 ) ( 320 2192 0 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 320 2192 -208 ) ( 272 2192 -208 ) ( 272 2176 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 320 2176 -128 ) ( 320 2176 -64 ) ( 320 2224 -64 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 320 2192 0 ) ( 272 2192 0 ) ( 272 2192 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 576 2176 0 ) ( 576 2192 0 ) ( 576 2192 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 272 2176 0 ) ( 320 2176 0 ) ( 320 2176 -208 ) TWALL1_1 0 0 0 1.000000 1.000000
+( 272 2176 0 ) ( 272 2192 0 ) ( 320 2192 0 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 320 2224 -64 ) ( 320 2176 -64 ) ( 320 2176 -128 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 640 2224 -64 ) ( 320 2224 -64 ) ( 320 2176 -64 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 320 2192 0 ) ( 272 2192 0 ) ( 272 2192 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 576 2176 0 ) ( 576 2192 0 ) ( 576 2192 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 272 2176 0 ) ( 320 2176 0 ) ( 320 2176 -208 ) TWALL1_1 0 0 0 1.000000 1.000000
+( 320 2192 -208 ) ( 272 2192 -208 ) ( 272 2176 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 320 2224 -64 ) ( 320 2176 -64 ) ( 320 2176 -128 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 320 2176 -128 ) ( 320 2224 -128 ) ( 640 2224 -128 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 576 2192 0 ) ( 576 1840 0 ) ( 576 1840 -208 ) TWALL1_1 0 0 0 1.000000 1.000000
+( 592 1840 0 ) ( 592 2192 0 ) ( 592 2192 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 576 1840 0 ) ( 592 1840 0 ) ( 592 1840 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 576 1840 0 ) ( 576 2192 0 ) ( 592 2192 0 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 592 2192 -208 ) ( 576 2192 -208 ) ( 576 1840 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 904 1920 -128 ) ( 904 1920 -64 ) ( 584 1920 -64 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 576 2192 0 ) ( 576 1840 0 ) ( 576 1840 -208 ) TWALL1_1 0 0 0 1.000000 1.000000
+( 592 1840 0 ) ( 592 2192 0 ) ( 592 2192 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 576 1840 0 ) ( 576 2192 0 ) ( 592 2192 0 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 640 2176 -128 ) ( 640 2176 -64 ) ( 320 2176 -64 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 584 1888 -64 ) ( 904 1888 -64 ) ( 904 1888 -128 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 880 2184 -64 ) ( 560 2184 -64 ) ( 560 2136 -64 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 576 2192 0 ) ( 576 1840 0 ) ( 576 1840 -208 ) TWALL1_1 0 0 0 1.000000 1.000000
+( 592 1840 0 ) ( 592 2192 0 ) ( 592 2192 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 592 2192 -208 ) ( 576 2192 -208 ) ( 576 1840 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 640 2176 -128 ) ( 640 2176 -64 ) ( 320 2176 -64 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 584 1888 -64 ) ( 904 1888 -64 ) ( 904 1888 -128 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 560 2136 -128 ) ( 560 2184 -128 ) ( 880 2184 -128 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 576 2192 0 ) ( 576 1840 0 ) ( 576 1840 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 592 2192 0 ) ( 576 2192 0 ) ( 576 2192 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 592 1840 0 ) ( 592 2192 0 ) ( 592 2192 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 576 1840 0 ) ( 576 2192 0 ) ( 592 2192 0 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 320 2176 -64 ) ( 640 2176 -64 ) ( 640 2176 -128 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 640 2224 -64 ) ( 320 2224 -64 ) ( 320 2176 -64 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 576 2192 0 ) ( 576 1840 0 ) ( 576 1840 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 592 2192 0 ) ( 576 2192 0 ) ( 576 2192 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 592 1840 0 ) ( 592 2192 0 ) ( 592 2192 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 592 2192 -208 ) ( 576 2192 -208 ) ( 576 1840 -208 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 320 2176 -64 ) ( 640 2176 -64 ) ( 640 2176 -128 ) TWALL1_2 0 0 0 1.000000 1.000000
+( 320 2176 -128 ) ( 320 2224 -128 ) ( 640 2224 -128 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 320 2200 -48 ) ( 320 2192 -48 ) ( 320 2192 -112 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 424 2240 -48 ) ( 320 2240 -48 ) ( 320 2240 -112 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 640 2192 -48 ) ( 640 2200 -48 ) ( 640 2200 -112 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 320 2192 -48 ) ( 424 2192 -48 ) ( 424 2192 -112 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 320 2192 -48 ) ( 320 2200 -48 ) ( 424 2200 -48 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 424 2200 -64 ) ( 320 2200 -64 ) ( 320 2192 -64 ) TWALL2_6 0 0 0 1.000000 1.000000
+}
+{
+( 592 2192 -48 ) ( 592 1888 -48 ) ( 592 1888 -64 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 640 2192 -48 ) ( 592 2192 -48 ) ( 592 2192 -64 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 640 1888 -48 ) ( 640 2192 -48 ) ( 640 2192 -64 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 592 1888 -48 ) ( 640 1888 -48 ) ( 640 1888 -64 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 592 1888 -48 ) ( 592 2192 -48 ) ( 640 2192 -48 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 640 2192 -64 ) ( 592 2192 -64 ) ( 592 1888 -64 ) TWALL2_6 0 0 0 1.000000 1.000000
+}
+{
+( 320 2200 -128 ) ( 320 2192 -128 ) ( 320 2192 -192 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 424 2240 -128 ) ( 320 2240 -128 ) ( 320 2240 -192 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 640 2192 -128 ) ( 640 2200 -128 ) ( 640 2200 -192 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 320 2192 -128 ) ( 424 2192 -128 ) ( 424 2192 -192 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 320 2192 -128 ) ( 320 2200 -128 ) ( 424 2200 -128 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 424 2200 -144 ) ( 320 2200 -144 ) ( 320 2192 -144 ) TWALL2_6 0 0 0 1.000000 1.000000
+}
+{
+( 592 2192 -128 ) ( 592 1888 -128 ) ( 592 1888 -144 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 640 2192 -128 ) ( 592 2192 -128 ) ( 592 2192 -144 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 640 1888 -128 ) ( 640 2192 -128 ) ( 640 2192 -144 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 592 1888 -128 ) ( 640 1888 -128 ) ( 640 1888 -144 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 592 1888 -128 ) ( 592 2192 -128 ) ( 640 2192 -128 ) TWALL2_6 0 0 0 1.000000 1.000000
+( 640 2192 -144 ) ( 592 2192 -144 ) ( 592 1888 -144 ) TWALL2_6 0 0 0 1.000000 1.000000
+}
+{
+( 320 2256 -128 ) ( 320 2240 -128 ) ( 320 2240 -144 ) COMP1_5 0 0 0 1.000000 1.000000
+( 640 2256 -128 ) ( 320 2256 -128 ) ( 320 2256 -144 ) COMP1_5 0 0 0 1.000000 1.000000
+( 384 2232 -128 ) ( 384 2248 -128 ) ( 384 2248 -144 ) COMP1_5 0 0 0 1.000000 1.000000
+( 320 2240 -128 ) ( 640 2240 -128 ) ( 640 2240 -144 ) COMP1_5 0 0 0 1.000000 1.000000
+( 320 2240 -48 ) ( 320 2256 -48 ) ( 640 2256 -48 ) COMP1_5 0 0 0 1.000000 1.000000
+( 640 2256 -144 ) ( 320 2256 -144 ) ( 320 2240 -144 ) COMP1_5 0 0 0 1.000000 1.000000
+}
+{
+( 384 2256 -128 ) ( 384 2240 -128 ) ( 384 2240 -144 ) TECH01_7 0 0 0 1.000000 1.000000
+( 704 2256 -128 ) ( 384 2256 -128 ) ( 384 2256 -144 ) TECH01_7 0 0 0 1.000000 1.000000
+( 448 2232 -128 ) ( 448 2248 -128 ) ( 448 2248 -144 ) TECH01_7 0 0 0 1.000000 1.000000
+( 384 2240 -128 ) ( 704 2240 -128 ) ( 704 2240 -144 ) TECH01_7 0 0 0 1.000000 1.000000
+( 384 2240 -48 ) ( 384 2256 -48 ) ( 704 2256 -48 ) TECH01_7 0 0 0 1.000000 1.000000
+( 704 2256 -144 ) ( 384 2256 -144 ) ( 384 2240 -144 ) TECH01_7 0 0 0 1.000000 1.000000
+}
+{
+( 448 2256 -128 ) ( 448 2240 -128 ) ( 448 2240 -144 ) TWALL2_2 0 0 0 1.000000 1.000000
+( 768 2256 -128 ) ( 448 2256 -128 ) ( 448 2256 -144 ) TECH08_1 208 0 0 1.000000 1.000000
+( 512 2232 -128 ) ( 512 2248 -128 ) ( 512 2248 -144 ) TWALL2_2 0 0 0 1.000000 1.000000
+( 448 2240 -128 ) ( 768 2240 -128 ) ( 768 2240 -144 ) TWALL2_2 0 0 0 1.000000 1.000000
+( 448 2240 -48 ) ( 448 2256 -48 ) ( 768 2256 -48 ) TWALL2_2 0 0 0 1.000000 1.000000
+( 768 2256 -144 ) ( 448 2256 -144 ) ( 448 2240 -144 ) TWALL2_2 0 0 0 1.000000 1.000000
+}
+{
+( 576 2256 -128 ) ( 576 2240 -128 ) ( 576 2240 -144 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 896 2256 -128 ) ( 576 2256 -128 ) ( 576 2256 -144 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 656 2232 -128 ) ( 656 2248 -128 ) ( 656 2248 -144 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 576 2240 -128 ) ( 896 2240 -128 ) ( 896 2240 -144 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 576 2240 -48 ) ( 576 2256 -48 ) ( 896 2256 -48 ) TWALL2_5 0 0 0 1.000000 1.000000
+( 896 2256 -144 ) ( 576 2256 -144 ) ( 576 2240 -144 ) TWALL2_5 0 0 0 1.000000 1.000000
+}
+{
+( 640 2240 -48 ) ( 640 2176 -48 ) ( 640 2176 -144 ) TWALL2_5 0 32 0 1.000000 1.000000
+( 656 2240 -48 ) ( 640 2240 -48 ) ( 640 2240 -144 ) TWALL2_5 0 32 0 1.000000 1.000000
+( 656 2176 -48 ) ( 656 2240 -48 ) ( 656 2240 -144 ) TWALL5_1 0 0 0 1.000000 1.000000
+( 640 2176 -48 ) ( 656 2176 -48 ) ( 656 2176 -144 ) TWALL2_5 0 32 0 1.000000 1.000000
+( 640 2176 -48 ) ( 640 2240 -48 ) ( 656 2240 -48 ) TWALL2_5 0 32 0 1.000000 1.000000
+( 656 2240 -144 ) ( 640 2240 -144 ) ( 640 2176 -144 ) TWALL2_5 0 32 0 1.000000 1.000000
+}
+{
+( 640 2176 -48 ) ( 640 2112 -48 ) ( 640 2112 -144 ) TWALL2_1 0 0 0 1.000000 1.000000
+( 656 2176 -48 ) ( 640 2176 -48 ) ( 640 2176 -144 ) TWALL5_1 0 0 0 1.000000 1.000000
+( 656 2112 -48 ) ( 656 2176 -48 ) ( 656 2176 -144 ) TWALL5_1 0 0 0 1.000000 1.000000
+( 640 2112 -48 ) ( 656 2112 -48 ) ( 656 2112 -144 ) TWALL5_1 0 0 0 1.000000 1.000000
+( 640 2112 -48 ) ( 640 2176 -48 ) ( 656 2176 -48 ) TWALL5_1 0 0 0 1.000000 1.000000
+( 656 2176 -144 ) ( 640 2176 -144 ) ( 640 2112 -144 ) TWALL5_1 0 0 0 1.000000 1.000000
+}
+{
+( 640 2112 -48 ) ( 640 2048 -48 ) ( 640 2048 -144 ) TWALL2_1 0 64 0 1.000000 1.000000
+( 656 2112 -48 ) ( 640 2112 -48 ) ( 640 2112 -144 ) TWALL2_1 0 64 0 1.000000 1.000000
+( 656 2048 -48 ) ( 656 2112 -48 ) ( 656 2112 -144 ) TWALL5_1 0 0 0 1.000000 1.000000
+( 640 2048 -48 ) ( 656 2048 -48 ) ( 656 2048 -144 ) TWALL2_1 0 64 0 1.000000 1.000000
+( 640 2048 -48 ) ( 640 2112 -48 ) ( 656 2112 -48 ) TWALL2_1 0 64 0 1.000000 1.000000
+( 656 2112 -144 ) ( 640 2112 -144 ) ( 640 2048 -144 ) TWALL2_1 0 64 0 1.000000 1.000000
+}
+{
+( 304 2256 -48 ) ( 304 2192 -48 ) ( 304 2192 -144 ) TLIGHT02 0 48 90 -1.000000 1.000000
+( 320 2256 -48 ) ( 304 2256 -48 ) ( 304 2256 -144 ) TLIGHT02 0 48 90 -1.000000 1.000000
+( 320 2192 -48 ) ( 320 2256 -48 ) ( 320 2256 -144 ) TLIGHT10 0 48 90 -1.000000 1.000000
+( 304 2192 -48 ) ( 320 2192 -48 ) ( 320 2192 -144 ) TLIGHT02 0 48 90 -1.000000 1.000000
+( 304 2192 -48 ) ( 304 2256 -48 ) ( 320 2256 -48 ) TLIGHT02 0 48 90 -1.000000 1.000000
+( 320 2256 -144 ) ( 304 2256 -144 ) ( 304 2192 -144 ) TLIGHT02 0 48 90 -1.000000 1.000000
+}
+{
+( 640 2048 -48 ) ( 640 1984 -48 ) ( 640 1984 -144 ) COMP1_6 0 0 0 1.000000 1.000000
+( 656 2048 -48 ) ( 640 2048 -48 ) ( 640 2048 -144 ) COMP1_6 0 0 0 1.000000 1.000000
+( 656 1984 -48 ) ( 656 2048 -48 ) ( 656 2048 -144 ) TWALL5_1 0 0 0 1.000000 1.000000
+( 640 1984 -48 ) ( 656 1984 -48 ) ( 656 1984 -144 ) COMP1_6 0 0 0 1.000000 1.000000
+( 640 1984 -48 ) ( 640 2048 -48 ) ( 656 2048 -48 ) COMP1_6 0 0 0 1.000000 1.000000
+( 656 2048 -144 ) ( 640 2048 -144 ) ( 640 1984 -144 ) COMP1_6 0 0 0 1.000000 1.000000
+}
+{
+( 640 1984 -48 ) ( 640 1920 -48 ) ( 640 1920 -144 ) COMP1_1 0 0 0 1.000000 1.000000
+( 656 1984 -48 ) ( 640 1984 -48 ) ( 640 1984 -144 ) COMP1_1 0 0 0 1.000000 1.000000
+( 656 1920 -48 ) ( 656 1984 -48 ) ( 656 1984 -144 ) TWALL5_1 0 0 0 1.000000 1.000000
+( 640 1920 -48 ) ( 656 1920 -48 ) ( 656 1920 -144 ) COMP1_1 0 0 0 1.000000 1.000000
+( 640 1920 -48 ) ( 640 1984 -48 ) ( 656 1984 -48 ) COMP1_1 0 0 0 1.000000 1.000000
+( 656 1984 -144 ) ( 640 1984 -144 ) ( 640 1920 -144 ) COMP1_1 0 0 0 1.000000 1.000000
+}
+{
+( 592 1920 -48 ) ( 592 1904 -48 ) ( 592 1904 -144 ) TLIGHT02 0 48 90 -1.000000 1.000000
+( 656 1920 -48 ) ( 592 1920 -48 ) ( 592 1920 -144 ) TLIGHT02 0 48 90 -1.000000 1.000000
+( 656 1904 -48 ) ( 656 1920 -48 ) ( 656 1920 -144 ) TWALL5_1 0 0 0 1.000000 1.000000
+( 592 1904 -48 ) ( 656 1904 -48 ) ( 656 1904 -144 ) TLIGHT02 0 48 90 -1.000000 1.000000
+( 592 1904 -48 ) ( 592 1920 -48 ) ( 656 1920 -48 ) TLIGHT02 0 48 90 -1.000000 1.000000
+( 656 1920 -144 ) ( 592 1920 -144 ) ( 592 1904 -144 ) TLIGHT02 0 48 90 -1.000000 1.000000
+}
+{
+( 192 2136 0 ) ( 192 2120 0 ) ( 192 2120 -208 ) TECH08_1 48 176 0 1.000000 1.000000
+( 272 2128 0 ) ( 248 2128 0 ) ( 248 2128 -208 ) TECH08_1 48 176 0 1.000000 1.000000
+( 272 2112 0 ) ( 272 2128 0 ) ( 272 2128 -208 ) TECH08_1 48 176 0 1.000000 1.000000
+( 248 2112 0 ) ( 272 2112 0 ) ( 272 2112 -208 ) TECH08_1 48 176 0 1.000000 1.000000
+( 248 2112 0 ) ( 248 2128 0 ) ( 272 2128 0 ) TECH08_1 48 176 0 1.000000 1.000000
+( 272 2128 -208 ) ( 248 2128 -208 ) ( 248 2112 -208 ) TECH08_1 48 176 0 1.000000 1.000000
+}
+{
+( 64 2128 0 ) ( 64 2112 0 ) ( 64 2112 -208 ) TECH11_2 192 176 0 1.000000 1.000000
+( 192 2128 0 ) ( 168 2128 0 ) ( 168 2128 -208 ) TECH11_2 192 176 0 1.000000 1.000000
+( 192 2112 0 ) ( 192 2128 0 ) ( 192 2128 -208 ) TECH11_2 192 176 0 1.000000 1.000000
+( 168 2112 0 ) ( 192 2112 0 ) ( 192 2112 -208 ) TECH11_2 192 176 0 1.000000 1.000000
+( 168 2112 0 ) ( 168 2128 0 ) ( 192 2128 0 ) TECH11_2 192 176 0 1.000000 1.000000
+( 192 2128 -208 ) ( 168 2128 -208 ) ( 168 2112 -208 ) TECH11_2 192 176 0 1.000000 1.000000
+}
+{
+( -112 2136 0 ) ( -112 2120 0 ) ( -112 2120 -208 ) TECH08_1 48 176 0 1.000000 1.000000
+( 64 2128 0 ) ( 0 2128 0 ) ( 0 2128 -208 ) TECH08_1 48 176 0 1.000000 1.000000
+( 64 2112 0 ) ( 64 2128 0 ) ( 64 2128 -208 ) TECH08_1 48 176 0 1.000000 1.000000
+( 0 2112 0 ) ( 64 2112 0 ) ( 64 2112 -208 ) TECH08_1 48 176 0 1.000000 1.000000
+( 0 2112 0 ) ( 0 2128 0 ) ( 64 2128 0 ) TECH08_1 48 176 0 1.000000 1.000000
+( 64 2128 -208 ) ( 0 2128 -208 ) ( 0 2112 -208 ) TECH08_1 48 176 0 1.000000 1.000000
+}
+{
+( -128 2128 0 ) ( -128 2112 0 ) ( -128 2112 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( -112 2128 0 ) ( -128 2128 0 ) ( -128 2128 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( -112 2112 0 ) ( -112 2128 0 ) ( -112 2128 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( -128 2112 0 ) ( -112 2112 0 ) ( -112 2112 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( -128 2112 0 ) ( -128 2128 0 ) ( -112 2128 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( -112 2128 -208 ) ( -128 2128 -208 ) ( -128 2112 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 272 2112 0 ) ( 272 1856 0 ) ( 272 1856 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 2112 0 ) ( 272 2112 0 ) ( 272 2112 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 1856 0 ) ( 288 2112 0 ) ( 288 2112 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( 272 1856 0 ) ( 288 1856 0 ) ( 288 1856 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( 272 1856 16 ) ( 272 2112 16 ) ( 288 2112 16 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 2112 -32 ) ( 272 2112 -32 ) ( 272 1856 -32 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 272 2112 -64 ) ( 304 2112 -64 ) ( 304 2112 -32 ) TECH04_3 0 0 0 1.000000 1.000000
+( 272 2112 -32 ) ( 304 2112 -32 ) ( 304 2080 -32 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 2088 -32 ) ( 288 2120 -32 ) ( 288 2120 -64 ) TECH04_3 0 0 0 1.000000 1.000000
+( 272 2112 -64 ) ( 272 2112 -32 ) ( 272 2080 -32 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 2080 -32 ) ( 272 2112 -64 ) ( 272 2080 -32 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 304 1856 -32 ) ( 304 1856 -64 ) ( 272 1856 -64 ) TECH04_3 0 0 0 1.000000 1.000000
+( 304 1888 -32 ) ( 304 1856 -32 ) ( 272 1856 -32 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 1848 -64 ) ( 288 1848 -32 ) ( 288 1880 -32 ) TECH04_3 0 0 0 1.000000 1.000000
+( 272 1888 -32 ) ( 272 1856 -32 ) ( 272 1856 -64 ) TECH04_3 0 0 0 1.000000 1.000000
+( 272 1888 -32 ) ( 272 1856 -64 ) ( 288 1888 -32 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 272 1856 -32 ) ( 272 1840 -32 ) ( 272 1840 -64 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 1856 -32 ) ( 272 1856 -32 ) ( 272 1856 -64 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 1840 -32 ) ( 288 1856 -32 ) ( 288 1856 -64 ) TECH04_3 0 0 0 1.000000 1.000000
+( 272 1840 -32 ) ( 288 1840 -32 ) ( 288 1840 -64 ) TECH04_3 0 0 0 1.000000 1.000000
+( 272 1840 16 ) ( 272 1856 16 ) ( 288 1856 16 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 1856 -208 ) ( 272 1856 -208 ) ( 272 1840 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 288 2176 16 ) ( 288 2136 16 ) ( 288 2136 -16 ) TECH01_6 0 0 0 1.000000 1.000000
+( 336 2176 16 ) ( 288 2176 16 ) ( 288 2176 -16 ) TECH01_6 0 0 0 1.000000 1.000000
+( 576 1856 16 ) ( 576 1896 16 ) ( 576 1896 -16 ) TECH01_6 0 0 0 1.000000 1.000000
+( 528 1856 16 ) ( 576 1856 16 ) ( 576 1856 -16 ) TECH01_6 0 0 0 1.000000 1.000000
+( 288 2136 16 ) ( 288 2176 16 ) ( 336 2176 16 ) TECH01_6 0 0 0 1.000000 1.000000
+( 336 2176 0 ) ( 288 2176 0 ) ( 288 2136 0 ) TECH01_6 0 0 0 1.000000 1.000000
+}
+{
+( 400 2176 0 ) ( 400 2048 0 ) ( 400 2048 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 432 2176 0 ) ( 400 2176 0 ) ( 400 2176 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 432 2048 0 ) ( 432 2176 0 ) ( 432 2176 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 400 2048 0 ) ( 432 2048 0 ) ( 432 2048 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 400 2048 0 ) ( 400 2176 0 ) ( 432 2176 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( 432 2176 -16 ) ( 400 2176 -16 ) ( 400 2048 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 400 1984 0 ) ( 400 1856 0 ) ( 400 1856 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 432 1984 0 ) ( 400 1984 0 ) ( 400 1984 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 432 1856 0 ) ( 432 1984 0 ) ( 432 1984 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 400 1856 0 ) ( 432 1856 0 ) ( 432 1856 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 400 1856 0 ) ( 400 1984 0 ) ( 432 1984 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( 432 1984 -16 ) ( 400 1984 -16 ) ( 400 1856 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 576 2032 0 ) ( 448 2032 0 ) ( 448 2032 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 576 2000 0 ) ( 576 2032 0 ) ( 576 2032 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 2000 0 ) ( 576 2000 0 ) ( 576 2000 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 2032 0 ) ( 448 2000 0 ) ( 448 2000 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 2032 0 ) ( 576 2032 0 ) ( 576 2000 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( 576 2000 -16 ) ( 576 2032 -16 ) ( 448 2032 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 416 2032 0 ) ( 288 2032 0 ) ( 288 2032 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 384 2000 0 ) ( 384 2032 0 ) ( 384 2032 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 288 2000 0 ) ( 416 2000 0 ) ( 416 2000 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 288 2032 0 ) ( 288 2000 0 ) ( 288 2000 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 288 2032 0 ) ( 416 2032 0 ) ( 416 2000 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( 416 2000 -16 ) ( 416 2032 -16 ) ( 288 2032 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 368 2064 0 ) ( 368 1968 0 ) ( 368 1968 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 464 2064 0 ) ( 368 2064 0 ) ( 368 2064 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 464 1968 0 ) ( 464 2064 0 ) ( 464 2064 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 368 1968 0 ) ( 464 1968 0 ) ( 464 1968 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 368 1968 0 ) ( 368 2064 0 ) ( 464 2064 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( 464 2064 -16 ) ( 368 2064 -16 ) ( 368 1968 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 288 1840 -64 ) ( 288 1776 -64 ) ( 288 1776 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+( 304 1840 -64 ) ( 288 1840 -64 ) ( 288 1840 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+( 304 1776 -64 ) ( 304 1840 -64 ) ( 304 1840 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 1776 -64 ) ( 304 1776 -64 ) ( 304 1776 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 1776 0 ) ( 288 1840 0 ) ( 304 1840 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 304 1840 -80 ) ( 288 1840 -80 ) ( 288 1776 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 192 1840 -80 ) ( 192 1824 -80 ) ( 192 1824 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 1840 -80 ) ( 192 1840 -80 ) ( 192 1840 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 1824 -80 ) ( 208 1840 -80 ) ( 208 1840 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 192 1824 -80 ) ( 208 1824 -80 ) ( 208 1824 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 192 1824 -80 ) ( 192 1840 -80 ) ( 208 1840 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 1840 -224 ) ( 192 1840 -224 ) ( 192 1824 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 48 1840 -80 ) ( 48 1824 -80 ) ( 48 1824 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 64 1840 -80 ) ( 48 1840 -80 ) ( 48 1840 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 64 1824 -80 ) ( 64 1840 -80 ) ( 64 1840 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 48 1824 -80 ) ( 64 1824 -80 ) ( 64 1824 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( 48 1824 -80 ) ( 48 1840 -80 ) ( 64 1840 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+( 64 1840 -224 ) ( 48 1840 -224 ) ( 48 1824 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -160 1840 -80 ) ( -160 1824 -80 ) ( -160 1824 -224 ) TECH08_1 224 176 0 1.000000 1.000000
+( -32 1840 -80 ) ( -72 1840 -80 ) ( -72 1840 -224 ) TECH08_1 224 176 0 1.000000 1.000000
+( -32 1824 -80 ) ( -32 1840 -80 ) ( -32 1840 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( -72 1824 -80 ) ( -32 1824 -80 ) ( -32 1824 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( -72 1824 0 ) ( -72 1840 0 ) ( -32 1840 0 ) TECH08_1 224 176 0 1.000000 1.000000
+( -32 1840 -224 ) ( -72 1840 -224 ) ( -72 1824 -224 ) TECH08_1 224 176 0 1.000000 1.000000
+}
+{
+( -288 1952 0 ) ( -288 1936 0 ) ( -288 1936 -224 ) TECH08_1 224 176 0 1.000000 1.000000
+( -288 1952 0 ) ( -288 1952 -224 ) ( -160 1840 -224 ) TECH08_1 224 176 0 1.000000 1.000000
+( -160 1824 0 ) ( -160 1840 0 ) ( -160 1840 -224 ) TECH08_1 224 176 0 1.000000 1.000000
+( -288 1936 -224 ) ( -288 1936 0 ) ( -160 1824 0 ) TECH08_1 224 176 0 1.000000 1.000000
+( -288 1936 0 ) ( -288 1952 0 ) ( -160 1840 0 ) TECH08_1 224 176 0 1.000000 1.000000
+( -288 1952 -224 ) ( -288 1936 -224 ) ( -160 1824 -224 ) TECH08_1 224 176 0 1.000000 1.000000
+}
+{
+( -416 1960 0 ) ( -416 1944 0 ) ( -416 1944 -224 ) TECH08_1 224 176 0 1.000000 1.000000
+( -288 1952 0 ) ( -320 1952 0 ) ( -320 1952 -224 ) TECH08_1 224 176 0 1.000000 1.000000
+( -288 1936 0 ) ( -288 1952 0 ) ( -288 1952 -224 ) TECH08_1 224 176 0 1.000000 1.000000
+( -320 1936 0 ) ( -288 1936 0 ) ( -288 1936 -224 ) TECH08_1 224 176 0 1.000000 1.000000
+( -320 1936 128 ) ( -320 1952 128 ) ( -288 1952 128 ) TECH08_1 224 176 0 1.000000 1.000000
+( -288 1952 -224 ) ( -320 1952 -224 ) ( -320 1936 -224 ) TECH08_1 224 176 0 1.000000 1.000000
+}
+{
+( -288 2112 -208 ) ( -288 1840 -208 ) ( -288 1840 -224 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -160 2112 -208 ) ( -288 2112 -208 ) ( -288 2112 -224 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -160 1840 -208 ) ( -160 2112 -208 ) ( -160 2112 -224 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -288 1840 -208 ) ( -288 2112 -208 ) ( -160 2112 -208 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -160 2112 -224 ) ( -288 2112 -224 ) ( -288 1840 -224 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -160 1840 -224 ) ( -288 1952 -224 ) ( -160 1840 -208 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( -224 2080 -192 ) ( -224 2016 -192 ) ( -224 2016 -208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2112 -192 ) ( -192 2112 -192 ) ( -192 2112 -208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -80 2040 -192 ) ( -80 2104 -192 ) ( -80 2104 -208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -224 2016 -192 ) ( -160 2016 -192 ) ( -160 2016 -208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -192 2048 -192 ) ( -192 2112 -192 ) ( -128 2112 -192 ) SFLOOR4_5 16 224 0 1.000000 1.000000
+( -128 2112 -208 ) ( -192 2112 -208 ) ( -192 2048 -208 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -320 1984 -192 ) ( -320 1920 -192 ) ( -320 1920 -208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -232 2112 -192 ) ( -296 2112 -192 ) ( -296 2112 -208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -224 1952 -192 ) ( -224 2016 -192 ) ( -224 2016 -208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -320 1920 -192 ) ( -256 1920 -192 ) ( -256 1920 -208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -288 1952 -192 ) ( -288 2016 -192 ) ( -224 2016 -192 ) SFLOOR4_5 16 224 0 1.000000 1.000000
+( -224 2016 -208 ) ( -288 2016 -208 ) ( -288 1952 -208 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -272 2136 -176 ) ( -272 2072 -176 ) ( -272 2072 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2168 -176 ) ( -192 2168 -176 ) ( -192 2168 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2104 -176 ) ( -128 2168 -176 ) ( -128 2168 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( -224 2064 -176 ) ( -160 2064 -176 ) ( -160 2064 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( -192 2104 -176 ) ( -192 2168 -176 ) ( -128 2168 -176 ) SFLOOR4_5 16 208 0 1.000000 1.000000
+( -128 2168 -192 ) ( -192 2168 -192 ) ( -192 2104 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -304 2168 -176 ) ( -368 2168 -176 ) ( -368 2168 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( -272 2024 -176 ) ( -272 2088 -176 ) ( -272 2088 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( -344 1952 -176 ) ( -280 1952 -176 ) ( -280 1952 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( -368 2120 -176 ) ( -368 2056 -176 ) ( -368 2056 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( -336 2088 -176 ) ( -272 2088 -176 ) ( -272 2024 -176 ) SFLOOR4_5 16 208 0 1.000000 1.000000
+( -272 2024 -192 ) ( -272 2088 -192 ) ( -336 2088 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -512 2200 -160 ) ( -512 2160 -160 ) ( -512 2160 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -160 2560 -160 ) ( -232 2560 -160 ) ( -232 2560 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2128 -160 ) ( -128 2168 -160 ) ( -128 2168 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -200 2128 -160 ) ( -128 2128 -160 ) ( -128 2128 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -200 2128 -160 ) ( -200 2168 -160 ) ( -128 2168 -160 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -128 2168 -176 ) ( -200 2168 -176 ) ( -200 2128 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -512 2128 -160 ) ( -512 1952 -160 ) ( -512 1952 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -320 2128 -160 ) ( -512 2128 -160 ) ( -512 2128 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -320 1952 -160 ) ( -320 2128 -160 ) ( -320 2128 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -512 1952 -160 ) ( -320 1952 -160 ) ( -320 1952 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -512 1952 -160 ) ( -512 2128 -160 ) ( -320 2128 -160 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -320 2128 -176 ) ( -512 2128 -176 ) ( -512 1952 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -512 2048 0 ) ( -512 2032 0 ) ( -512 2032 -224 ) TECH08_1 224 176 0 1.000000 1.000000
+( -544 2064 0 ) ( -544 2064 -224 ) ( -416 1952 -224 ) TECH08_1 224 176 0 1.000000 1.000000
+( -416 1936 0 ) ( -416 1952 0 ) ( -416 1952 -224 ) TECH08_1 224 176 0 1.000000 1.000000
+( -544 2048 -224 ) ( -544 2048 0 ) ( -416 1936 0 ) TECH08_1 224 176 0 1.000000 1.000000
+( -544 2048 128 ) ( -544 2064 128 ) ( -416 1952 128 ) TECH08_1 224 176 0 1.000000 1.000000
+( -544 2064 -224 ) ( -544 2048 -224 ) ( -416 1936 -224 ) TECH08_1 224 176 0 1.000000 1.000000
+}
+{
+( -512 2056 0 ) ( -512 2016 0 ) ( -512 2016 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -512 2304 0 ) ( -528 2304 0 ) ( -528 2304 -224 ) TECH08_1 192 176 0 1.000000 1.000000
+( -512 2016 176 ) ( -512 2056 176 ) ( -496 2056 176 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2056 -224 ) ( -512 2056 -224 ) ( -512 2016 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -504 2048 -240 ) ( -504 2048 32 ) ( -504 2080 32 ) TLIGHT07 0 240 0 1.000000 1.000000
+( -512 2240 -80 ) ( -512 2240 48 ) ( -496 2240 48 ) TECH08_1 176 176 0 1.000000 1.000000
+}
+{
+( -512 2056 0 ) ( -512 2016 0 ) ( -512 2016 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -512 2016 0 ) ( -496 2016 0 ) ( -496 2016 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -512 2016 176 ) ( -512 2056 176 ) ( -496 2056 176 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2056 -224 ) ( -512 2056 -224 ) ( -512 2016 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -504 2048 -240 ) ( -504 2048 32 ) ( -504 2080 32 ) TLIGHT07 0 240 0 1.000000 1.000000
+( -504 2144 -80 ) ( -504 2144 48 ) ( -520 2144 48 ) TECH08_1 176 176 0 1.000000 1.000000
+}
+{
+( -512 2056 0 ) ( -512 2016 0 ) ( -512 2016 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -512 2016 176 ) ( -512 2056 176 ) ( -496 2056 176 ) TECH08_1 176 176 0 1.000000 1.000000
+( -504 2048 -240 ) ( -504 2048 32 ) ( -504 2080 32 ) TLIGHT07 0 240 0 1.000000 1.000000
+( -496 2240 48 ) ( -512 2240 48 ) ( -512 2240 -80 ) TECH08_1 176 176 0 1.000000 1.000000
+( -520 2144 48 ) ( -504 2144 48 ) ( -504 2144 -80 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2240 48 ) ( -512 2240 48 ) ( -512 2136 48 ) TECH08_1 176 176 0 1.000000 1.000000
+}
+{
+( -512 2056 0 ) ( -512 2016 0 ) ( -512 2016 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2056 -224 ) ( -512 2056 -224 ) ( -512 2016 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -504 2048 -240 ) ( -504 2048 32 ) ( -504 2080 32 ) TLIGHT07 0 240 0 1.000000 1.000000
+( -496 2240 48 ) ( -512 2240 48 ) ( -512 2240 -80 ) TECH08_1 176 176 0 1.000000 1.000000
+( -520 2144 48 ) ( -504 2144 48 ) ( -504 2144 -80 ) TECH08_1 176 176 0 1.000000 1.000000
+( -512 2136 -80 ) ( -512 2240 -80 ) ( -496 2240 -80 ) TECH08_1 176 176 0 1.000000 1.000000
+}
+{
+( -512 2304 0 ) ( -528 2304 0 ) ( -528 2304 -224 ) TECH08_1 192 176 0 1.000000 1.000000
+( -496 2016 0 ) ( -496 2056 0 ) ( -496 2056 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -512 2016 176 ) ( -512 2056 176 ) ( -496 2056 176 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2056 -224 ) ( -512 2056 -224 ) ( -512 2016 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -504 2080 32 ) ( -504 2048 32 ) ( -504 2048 -240 ) TECH08_1 176 176 0 1.000000 1.000000
+( -512 2240 -80 ) ( -512 2240 48 ) ( -496 2240 48 ) TECH08_1 192 176 0 1.000000 1.000000
+}
+{
+( -496 2016 0 ) ( -496 2056 0 ) ( -496 2056 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -512 2016 176 ) ( -512 2056 176 ) ( -496 2056 176 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2056 -224 ) ( -512 2056 -224 ) ( -512 2016 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -504 2080 32 ) ( -504 2048 32 ) ( -504 2048 -240 ) TECH08_1 176 176 0 1.000000 1.000000
+( -504 2080 -240 ) ( -504 2080 32 ) ( -496 2080 32 ) TECH08_1 176 176 0 1.000000 1.000000
+( -504 2144 -80 ) ( -504 2144 48 ) ( -520 2144 48 ) TECH08_1 176 176 0 1.000000 1.000000
+}
+{
+( -496 2016 0 ) ( -496 2056 0 ) ( -496 2056 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -512 2016 176 ) ( -512 2056 176 ) ( -496 2056 176 ) TECH08_1 176 176 0 1.000000 1.000000
+( -504 2080 32 ) ( -504 2048 32 ) ( -504 2048 -240 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2240 48 ) ( -512 2240 48 ) ( -512 2240 -80 ) TECH08_1 192 176 0 1.000000 1.000000
+( -520 2144 48 ) ( -504 2144 48 ) ( -504 2144 -80 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2240 48 ) ( -512 2240 48 ) ( -512 2136 48 ) TECH08_1 176 176 0 1.000000 1.000000
+}
+{
+( -496 2016 0 ) ( -496 2056 0 ) ( -496 2056 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2056 -224 ) ( -512 2056 -224 ) ( -512 2016 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -504 2080 32 ) ( -504 2048 32 ) ( -504 2048 -240 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2240 48 ) ( -512 2240 48 ) ( -512 2240 -80 ) TECH08_1 192 176 0 1.000000 1.000000
+( -520 2144 48 ) ( -504 2144 48 ) ( -504 2144 -80 ) TECH08_1 176 176 0 1.000000 1.000000
+( -512 2136 -80 ) ( -512 2240 -80 ) ( -496 2240 -80 ) TECH08_1 176 176 0 1.000000 1.000000
+}
+{
+( -496 2016 0 ) ( -496 2056 0 ) ( -496 2056 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -512 2016 0 ) ( -496 2016 0 ) ( -496 2016 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -512 2016 128 ) ( -512 2056 128 ) ( -496 2056 128 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2056 -224 ) ( -512 2056 -224 ) ( -512 2016 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -504 2080 32 ) ( -504 2048 32 ) ( -504 2048 -240 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2048 -240 ) ( -496 2048 32 ) ( -504 2048 32 ) TECH08_1 176 176 0 1.000000 1.000000
+}
+{
+( -496 2016 0 ) ( -496 2056 0 ) ( -496 2056 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -512 2016 128 ) ( -512 2056 128 ) ( -496 2056 128 ) TECH08_1 176 176 0 1.000000 1.000000
+( -504 2080 32 ) ( -504 2048 32 ) ( -504 2048 -240 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2080 32 ) ( -504 2080 32 ) ( -504 2080 -240 ) TECH08_1 176 176 0 1.000000 1.000000
+( -504 2048 32 ) ( -496 2048 32 ) ( -496 2048 -240 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2080 -16 ) ( -504 2080 -16 ) ( -504 2048 -16 ) TECH08_1 176 176 0 1.000000 1.000000
+}
+{
+( -496 2016 0 ) ( -496 2056 0 ) ( -496 2056 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2056 -224 ) ( -512 2056 -224 ) ( -512 2016 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -504 2080 32 ) ( -504 2048 32 ) ( -504 2048 -240 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2080 32 ) ( -504 2080 32 ) ( -504 2080 -240 ) TECH08_1 176 176 0 1.000000 1.000000
+( -504 2048 32 ) ( -496 2048 32 ) ( -496 2048 -240 ) TECH08_1 176 176 0 1.000000 1.000000
+( -504 2048 -144 ) ( -504 2080 -144 ) ( -496 2080 -144 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( -128 2184 0 ) ( -128 2128 0 ) ( -128 2128 -224 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2304 0 ) ( -128 2304 0 ) ( -128 2304 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( -112 2128 0 ) ( -112 2184 0 ) ( -112 2184 -224 ) TECH08_1 32 144 0 1.000000 1.000000
+( -128 2128 0 ) ( -112 2128 0 ) ( -112 2128 -224 ) TECH08_1 32 176 0 1.000000 1.000000
+( -128 2128 176 ) ( -128 2184 176 ) ( -112 2184 176 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2184 -176 ) ( -128 2184 -176 ) ( -128 2128 -176 ) TECH08_1 32 176 0 1.000000 1.000000
+}
+{
+( -320 2144 0 ) ( -320 2128 0 ) ( -320 2128 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( -128 2128 0 ) ( -144 2128 0 ) ( -144 2128 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( -128 2112 0 ) ( -128 2128 0 ) ( -128 2128 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( -144 2112 0 ) ( -128 2112 0 ) ( -128 2112 -208 ) TECH04_3 0 0 0 1.000000 1.000000
+( -144 2112 0 ) ( -144 2128 0 ) ( -128 2128 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( -128 2128 -16 ) ( -144 2128 -16 ) ( -144 2112 -16 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -336 2128 0 ) ( -336 1952 0 ) ( -336 1952 -16 ) TECH04_3 0 0 0 1.000000 1.000000
+( -320 2128 0 ) ( -336 2128 0 ) ( -336 2128 -16 ) TECH04_3 0 0 0 1.000000 1.000000
+( -320 1952 0 ) ( -320 2128 0 ) ( -320 2128 -16 ) TECH04_3 0 0 0 1.000000 1.000000
+( -336 1952 0 ) ( -320 1952 0 ) ( -320 1952 -16 ) TECH04_3 0 0 0 1.000000 1.000000
+( -336 1952 0 ) ( -336 2128 0 ) ( -320 2128 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( -320 2128 -16 ) ( -336 2128 -16 ) ( -336 1952 -16 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -320 2112 0 ) ( -320 2080 0 ) ( -320 2080 -16 ) TECH04_3 0 0 0 1.000000 1.000000
+( -288 2112 0 ) ( -320 2112 0 ) ( -320 2112 -16 ) TECH04_3 0 0 0 1.000000 1.000000
+( -320 2080 0 ) ( -320 2112 0 ) ( -288 2112 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( -288 2112 -16 ) ( -320 2112 -16 ) ( -320 2080 -16 ) TECH04_2 0 0 0 1.000000 1.000000
+( -288 2112 -16 ) ( -320 2080 -16 ) ( -288 2112 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -320 2120 16 ) ( -320 1848 16 ) ( -320 1848 0 ) TECH01_6 0 0 0 1.000000 1.000000
+( 272 2112 16 ) ( -208 2112 16 ) ( -208 2112 0 ) TECH01_6 0 0 0 1.000000 1.000000
+( -208 1840 16 ) ( 272 1840 16 ) ( 272 1840 0 ) TECH01_6 0 0 0 1.000000 1.000000
+( -208 1840 16 ) ( -208 2112 16 ) ( 272 2112 16 ) TECH01_6 0 0 0 1.000000 1.000000
+( 272 2112 0 ) ( -208 2112 0 ) ( -208 1840 0 ) TECH01_6 0 0 0 1.000000 1.000000
+( -16 1840 0 ) ( -16 1840 16 ) ( -16 1904 16 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 272 2112 16 ) ( -208 2112 16 ) ( -208 2112 0 ) TECH01_6 0 0 0 1.000000 1.000000
+( 272 1840 16 ) ( 272 2112 16 ) ( 272 2112 0 ) TECH01_6 0 0 0 1.000000 1.000000
+( -208 1840 16 ) ( -208 2112 16 ) ( 272 2112 16 ) TECH01_6 0 0 0 1.000000 1.000000
+( 272 2112 0 ) ( -208 2112 0 ) ( -208 1840 0 ) TECH01_6 0 0 0 1.000000 1.000000
+( -16 1904 16 ) ( -16 1840 16 ) ( -16 1840 0 ) TECH01_6 0 0 0 1.000000 1.000000
+( -16 1904 0 ) ( -16 1904 16 ) ( 272 1904 16 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 64 2112 0 ) ( 64 2072 0 ) ( 64 2072 -16 ) TECH01_9 0 0 90 -1.000000 1.000000
+( 80 2112 0 ) ( 64 2112 0 ) ( 64 2112 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+( 96 2072 0 ) ( 96 2112 0 ) ( 96 2112 -16 ) TECH01_9 0 0 90 -1.000000 1.000000
+( 96 1920 0 ) ( 112 1920 0 ) ( 112 1920 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+( 64 2072 0 ) ( 64 2112 0 ) ( 80 2112 0 ) TECH01_9 0 0 0 1.000000 1.000000
+( 80 2112 -16 ) ( 64 2112 -16 ) ( 64 2072 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+}
+{
+( 192 2112 0 ) ( 192 2072 0 ) ( 192 2072 -16 ) TECH01_9 0 0 90 -1.000000 1.000000
+( 208 2112 0 ) ( 192 2112 0 ) ( 192 2112 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+( 224 2072 0 ) ( 224 2112 0 ) ( 224 2112 -16 ) TECH01_9 0 0 90 -1.000000 1.000000
+( 216 1920 0 ) ( 232 1920 0 ) ( 232 1920 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+( 192 2072 0 ) ( 192 2112 0 ) ( 208 2112 0 ) TECH01_9 0 0 0 1.000000 1.000000
+( 208 2112 -16 ) ( 192 2112 -16 ) ( 192 2072 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+}
+{
+( -64 2112 0 ) ( -64 2072 0 ) ( -64 2072 -16 ) TECH01_9 0 0 90 -1.000000 1.000000
+( -48 2112 0 ) ( -64 2112 0 ) ( -64 2112 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+( -32 2072 0 ) ( -32 2112 0 ) ( -32 2112 -16 ) TECH01_9 0 0 90 -1.000000 1.000000
+( -40 1840 0 ) ( -24 1840 0 ) ( -24 1840 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+( -64 2072 0 ) ( -64 2112 0 ) ( -48 2112 0 ) TECH01_9 0 0 0 1.000000 1.000000
+( -48 2112 -16 ) ( -64 2112 -16 ) ( -64 2072 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+}
+{
+( -192 2112 0 ) ( -192 2072 0 ) ( -192 2072 -16 ) TECH01_9 0 0 90 -1.000000 1.000000
+( -176 2112 0 ) ( -192 2112 0 ) ( -192 2112 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+( -160 2072 0 ) ( -160 2112 0 ) ( -160 2112 -16 ) TECH01_9 0 0 90 -1.000000 1.000000
+( -168 1840 0 ) ( -152 1840 0 ) ( -152 1840 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+( -192 2072 0 ) ( -192 2112 0 ) ( -176 2112 0 ) TECH01_9 0 0 0 1.000000 1.000000
+( -176 2112 -16 ) ( -192 2112 -16 ) ( -192 2072 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+}
+{
+( -64 2048 0 ) ( -104 2048 0 ) ( -104 2048 -16 ) TECH01_9 0 0 90 -1.000000 1.000000
+( -64 2032 0 ) ( -64 2048 0 ) ( -64 2048 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+( -104 2016 0 ) ( -64 2016 0 ) ( -64 2016 -16 ) TECH01_9 0 0 90 -1.000000 1.000000
+( -160 2016 0 ) ( -160 2000 0 ) ( -160 2000 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+( -104 2048 0 ) ( -64 2048 0 ) ( -64 2032 0 ) TECH01_9 0 0 0 1.000000 1.000000
+( -64 2032 -16 ) ( -64 2048 -16 ) ( -104 2048 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+}
+{
+( 192 2048 0 ) ( 152 2048 0 ) ( 152 2048 -16 ) TECH01_9 0 0 90 -1.000000 1.000000
+( 192 2032 0 ) ( 192 2048 0 ) ( 192 2048 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+( 152 2016 0 ) ( 192 2016 0 ) ( 192 2016 -16 ) TECH01_9 0 0 90 -1.000000 1.000000
+( 96 2016 0 ) ( 96 2000 0 ) ( 96 2000 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+( 152 2048 0 ) ( 192 2048 0 ) ( 192 2032 0 ) TECH01_9 0 0 0 1.000000 1.000000
+( 192 2032 -16 ) ( 192 2048 -16 ) ( 152 2048 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+}
+{
+( 64 1952 0 ) ( 24 1952 0 ) ( 24 1952 -16 ) TECH01_9 0 0 90 -1.000000 1.000000
+( 192 1936 0 ) ( 192 1952 0 ) ( 192 1952 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+( 24 1920 0 ) ( 64 1920 0 ) ( 64 1920 -16 ) TECH01_9 0 0 90 -1.000000 1.000000
+( -32 1920 0 ) ( -32 1904 0 ) ( -32 1904 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+( 24 1952 0 ) ( 64 1952 0 ) ( 64 1936 0 ) TECH01_9 0 0 0 1.000000 1.000000
+( 64 1936 -16 ) ( 64 1952 -16 ) ( 24 1952 -16 ) TECH01_9 0 0 0 1.000000 1.000000
+}
+{
+( -32 1912 0 ) ( -32 1896 0 ) ( -32 1896 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 272 1920 0 ) ( 216 1920 0 ) ( 216 1920 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 272 1904 0 ) ( 272 1920 0 ) ( 272 1920 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 216 1904 0 ) ( 272 1904 0 ) ( 272 1904 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 216 1904 0 ) ( 216 1920 0 ) ( 272 1920 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( 272 1920 -16 ) ( 216 1920 -16 ) ( 216 1904 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -592 2424 16 ) ( -592 2328 16 ) ( -592 2328 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -128 2400 16 ) ( -312 2400 16 ) ( -312 2400 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -64 2296 16 ) ( -64 2392 16 ) ( -64 2392 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -312 2304 16 ) ( -128 2304 16 ) ( -128 2304 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -312 2304 32 ) ( -312 2400 32 ) ( -128 2400 32 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -128 2400 0 ) ( -312 2400 0 ) ( -312 2304 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( -512 2400 48 ) ( -512 2304 48 ) ( -512 2304 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2624 48 ) ( -512 2624 48 ) ( -512 2624 -224 ) TECH08_1 128 176 0 1.000000 1.000000
+( -496 2304 48 ) ( -496 2400 48 ) ( -496 2400 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -512 2304 48 ) ( -496 2304 48 ) ( -496 2304 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+( -512 2304 0 ) ( -512 2400 0 ) ( -496 2400 0 ) TECH08_1 176 176 0 1.000000 1.000000
+( -496 2400 -224 ) ( -512 2400 -224 ) ( -512 2304 -224 ) TECH08_1 176 176 0 1.000000 1.000000
+}
+{
+( -336 2128 128 ) ( -336 2104 128 ) ( -336 2104 -224 ) TECH08_1 208 176 0 1.000000 1.000000
+( -320 2128 128 ) ( -336 2128 128 ) ( -336 2128 -224 ) TECH08_1 240 176 0 1.000000 1.000000
+( -320 2104 128 ) ( -320 2128 128 ) ( -320 2128 -224 ) TECH08_1 208 176 0 1.000000 1.000000
+( -328 1952 128 ) ( -312 1952 128 ) ( -312 1952 -224 ) TECH08_1 208 176 0 1.000000 1.000000
+( -336 2104 128 ) ( -336 2128 128 ) ( -320 2128 128 ) TECH08_1 208 176 0 1.000000 1.000000
+( -320 2128 0 ) ( -336 2128 0 ) ( -336 2104 0 ) TECH08_1 208 176 0 1.000000 1.000000
+}
+{
+( -320 2128 128 ) ( -320 2112 128 ) ( -320 2112 0 ) TECH08_1 240 176 0 1.000000 1.000000
+( -128 2128 128 ) ( -320 2128 128 ) ( -320 2128 0 ) TECH08_1 240 176 0 1.000000 1.000000
+( -128 2112 128 ) ( -128 2128 128 ) ( -128 2128 0 ) TECH08_1 240 176 0 1.000000 1.000000
+( -320 2112 128 ) ( -128 2112 128 ) ( -128 2112 0 ) TECH08_1 240 176 0 1.000000 1.000000
+( -320 2112 128 ) ( -320 2128 128 ) ( -128 2128 128 ) TECH08_1 240 176 0 1.000000 1.000000
+( -128 2128 0 ) ( -320 2128 0 ) ( -320 2112 0 ) TECH08_1 240 176 0 1.000000 1.000000
+}
+{
+( -128 2400 48 ) ( -128 2304 48 ) ( -128 2304 -224 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2400 48 ) ( -128 2400 48 ) ( -128 2400 -224 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2304 48 ) ( -112 2400 48 ) ( -112 2400 -224 ) TECH08_1 32 176 0 1.000000 1.000000
+( -128 2304 48 ) ( -112 2304 48 ) ( -112 2304 -224 ) TECH08_1 32 176 0 1.000000 1.000000
+( -128 2304 0 ) ( -128 2400 0 ) ( -112 2400 0 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2400 -224 ) ( -128 2400 -224 ) ( -128 2304 -224 ) TECH08_1 32 176 0 1.000000 1.000000
+}
+{
+( -448 2368 -48 ) ( -448 2368 -16 ) ( -448 2336 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( -448 2336 -48 ) ( -448 2336 -16 ) ( -416 2336 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( -416 2336 -48 ) ( -416 2336 -16 ) ( -416 2368 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( -416 2368 -48 ) ( -416 2368 -16 ) ( -448 2368 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( -448 2368 -160 ) ( -448 2336 -160 ) ( -416 2336 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -448 2448 -32 ) ( -416 2432 0 ) ( -448 2432 -32 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -352 2368 0 ) ( -352 2336 0 ) ( -416 2336 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -416 2336 -64 ) ( -416 2368 -64 ) ( -416 2368 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -416 2368 -64 ) ( -352 2368 0 ) ( -416 2368 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -352 2336 0 ) ( -416 2336 -64 ) ( -416 2336 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -416 2208 -64 ) ( -384 2208 -32 ) ( -416 2224 -64 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -176 2336 -16 ) ( -176 2368 -16 ) ( -176 2368 -48 ) TECH04_1 0 0 0 1.000000 1.000000
+( -208 2336 -16 ) ( -176 2336 -16 ) ( -176 2336 -48 ) TECH04_1 0 0 0 1.000000 1.000000
+( -208 2368 -16 ) ( -208 2336 -16 ) ( -208 2336 -48 ) TECH04_1 0 0 0 1.000000 1.000000
+( -176 2368 -16 ) ( -208 2368 -16 ) ( -208 2368 -48 ) TECH04_1 0 0 0 1.000000 1.000000
+( -208 2336 -160 ) ( -176 2336 -160 ) ( -176 2368 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -176 2432 -32 ) ( -208 2432 0 ) ( -176 2448 -32 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -208 2336 0 ) ( -272 2336 0 ) ( -272 2368 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -208 2368 0 ) ( -208 2368 -64 ) ( -208 2336 -64 ) TECH04_1 0 0 0 1.000000 1.000000
+( -208 2368 0 ) ( -272 2368 0 ) ( -208 2368 -64 ) TECH04_1 0 0 0 1.000000 1.000000
+( -208 2336 0 ) ( -208 2336 -64 ) ( -272 2336 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -208 2224 -64 ) ( -240 2208 -32 ) ( -208 2208 -64 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -384 2368 0 ) ( -384 2336 0 ) ( -384 2336 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -256 2368 0 ) ( -368 2368 0 ) ( -368 2368 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -240 2336 0 ) ( -240 2368 0 ) ( -240 2368 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -368 2336 0 ) ( -256 2336 0 ) ( -256 2336 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -368 2336 0 ) ( -368 2368 0 ) ( -256 2368 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -256 2368 -32 ) ( -368 2368 -32 ) ( -368 2336 -32 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -496 2368 -64 ) ( -496 2336 -64 ) ( -496 2336 -224 ) TECH04_1 0 0 0 1.000000 1.000000
+( -368 2368 -64 ) ( -480 2368 -64 ) ( -480 2368 -224 ) TECH04_1 0 0 0 1.000000 1.000000
+( -448 2344 -64 ) ( -448 2376 -64 ) ( -448 2376 -224 ) TECH04_1 0 0 0 1.000000 1.000000
+( -480 2336 -64 ) ( -368 2336 -64 ) ( -368 2336 -224 ) TECH04_1 0 0 0 1.000000 1.000000
+( -480 2336 -64 ) ( -480 2368 -64 ) ( -368 2368 -64 ) TECH04_1 0 0 0 1.000000 1.000000
+( -368 2368 -96 ) ( -480 2368 -96 ) ( -480 2336 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -176 2368 -64 ) ( -176 2336 -64 ) ( -176 2336 -224 ) TECH04_1 0 0 0 1.000000 1.000000
+( -48 2368 -64 ) ( -160 2368 -64 ) ( -160 2368 -224 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2344 -64 ) ( -128 2376 -64 ) ( -128 2376 -224 ) TECH04_1 0 0 0 1.000000 1.000000
+( -160 2336 -64 ) ( -48 2336 -64 ) ( -48 2336 -224 ) TECH04_1 0 0 0 1.000000 1.000000
+( -160 2336 -64 ) ( -160 2368 -64 ) ( -48 2368 -64 ) TECH04_1 0 0 0 1.000000 1.000000
+( -48 2368 -96 ) ( -160 2368 -96 ) ( -160 2336 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -128 2496 128 ) ( -128 2400 128 ) ( -128 2400 -176 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2624 128 ) ( -128 2624 128 ) ( -128 2624 -176 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2400 128 ) ( -112 2496 128 ) ( -112 2496 -176 ) TECH08_1 32 144 0 1.000000 1.000000
+( -128 2400 176 ) ( -128 2496 176 ) ( -112 2496 176 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2496 -176 ) ( -128 2496 -176 ) ( -128 2400 -176 ) TECH08_1 32 176 0 1.000000 1.000000
+( -128 2512 -80 ) ( -128 2512 48 ) ( -112 2512 48 ) TECH08_1 32 176 0 1.000000 1.000000
+}
+{
+( -128 2496 128 ) ( -128 2400 128 ) ( -128 2400 -176 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2400 128 ) ( -112 2496 128 ) ( -112 2496 -176 ) TECH08_1 32 144 0 1.000000 1.000000
+( -128 2400 128 ) ( -112 2400 128 ) ( -112 2400 -176 ) TECH04_3 0 0 0 1.000000 1.000000
+( -128 2400 176 ) ( -128 2496 176 ) ( -112 2496 176 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2496 -176 ) ( -128 2496 -176 ) ( -128 2400 -176 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2416 -80 ) ( -112 2416 48 ) ( -128 2416 48 ) TECH08_1 32 176 0 1.000000 1.000000
+}
+{
+( -128 2496 128 ) ( -128 2400 128 ) ( -128 2400 -176 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2400 128 ) ( -112 2496 128 ) ( -112 2496 -176 ) TECH08_1 32 144 0 1.000000 1.000000
+( -128 2400 176 ) ( -128 2496 176 ) ( -112 2496 176 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2512 48 ) ( -128 2512 48 ) ( -128 2512 -80 ) TECH08_1 32 176 0 1.000000 1.000000
+( -128 2416 48 ) ( -112 2416 48 ) ( -112 2416 -80 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2480 48 ) ( -128 2480 48 ) ( -128 2400 48 ) TECH08_1 32 176 0 1.000000 1.000000
+}
+{
+( -128 2496 128 ) ( -128 2400 128 ) ( -128 2400 -176 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2400 128 ) ( -112 2496 128 ) ( -112 2496 -176 ) TECH08_1 32 144 0 1.000000 1.000000
+( -112 2496 -176 ) ( -128 2496 -176 ) ( -128 2400 -176 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2512 48 ) ( -128 2512 48 ) ( -128 2512 -80 ) TECH08_1 32 176 0 1.000000 1.000000
+( -128 2416 48 ) ( -112 2416 48 ) ( -112 2416 -80 ) TECH08_1 32 176 0 1.000000 1.000000
+( -128 2400 -80 ) ( -128 2480 -80 ) ( -112 2480 -80 ) TECH08_1 32 176 0 1.000000 1.000000
+}
+{
+( -592 2304 128 ) ( -592 2288 128 ) ( -592 2288 -224 ) TECH08_1 192 176 0 1.000000 1.000000
+( -512 2304 128 ) ( -576 2304 128 ) ( -576 2304 -224 ) TECH08_1 192 176 0 1.000000 1.000000
+( -512 2288 128 ) ( -512 2304 128 ) ( -512 2304 -224 ) TECH08_1 192 176 0 1.000000 1.000000
+( -576 2288 128 ) ( -512 2288 128 ) ( -512 2288 -224 ) TECH08_1 192 176 0 1.000000 1.000000
+( -576 2288 176 ) ( -576 2304 176 ) ( -512 2304 176 ) TECH08_1 192 176 0 1.000000 1.000000
+( -512 2304 -176 ) ( -576 2304 -176 ) ( -576 2288 -176 ) TECH08_1 192 176 0 1.000000 1.000000
+}
+{
+( -496 1968 176 ) ( -496 1952 176 ) ( -496 1952 -176 ) TECH01_6 0 0 0 1.000000 1.000000
+( -128 2288 176 ) ( -152 2288 176 ) ( -152 2288 -176 ) TECH01_6 0 0 0 1.000000 1.000000
+( -128 2288 176 ) ( -128 2304 176 ) ( -128 2304 -176 ) TECH01_6 0 0 0 1.000000 1.000000
+( -496 1952 176 ) ( -472 1952 176 ) ( -472 1952 -176 ) TECH01_6 0 0 0 1.000000 1.000000
+( -152 2288 160 ) ( -152 2304 160 ) ( -128 2304 160 ) TECH01_6 0 0 0 1.000000 1.000000
+( -128 2304 128 ) ( -152 2304 128 ) ( -152 2288 128 ) TECH01_6 0 0 0 1.000000 1.000000
+}
+{
+( -496 2304 160 ) ( -496 2288 160 ) ( -496 2288 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2304 160 ) ( -496 2304 160 ) ( -496 2304 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2288 160 ) ( -128 2304 160 ) ( -128 2304 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( -496 2288 160 ) ( -128 2288 160 ) ( -128 2288 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( -496 2288 160 ) ( -496 2304 160 ) ( -128 2304 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2304 112 ) ( -496 2304 112 ) ( -496 2288 112 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -336 2288 160 ) ( -336 2264 160 ) ( -336 2264 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -304 2288 160 ) ( -336 2288 160 ) ( -336 2288 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -304 2264 160 ) ( -304 2288 160 ) ( -304 2288 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -336 2128 160 ) ( -304 2128 160 ) ( -304 2128 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -336 2264 128 ) ( -336 2288 128 ) ( -304 2288 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( -304 2288 112 ) ( -336 2288 112 ) ( -336 2264 112 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -336 2128 160 ) ( -360 2128 160 ) ( -360 2128 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -336 2096 160 ) ( -336 2128 160 ) ( -336 2128 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -360 2096 160 ) ( -336 2096 160 ) ( -336 2096 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -496 2128 160 ) ( -496 2096 160 ) ( -496 2096 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -360 2128 128 ) ( -336 2128 128 ) ( -336 2096 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( -336 2096 112 ) ( -336 2128 112 ) ( -360 2128 112 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -128 2224 160 ) ( -152 2224 160 ) ( -152 2224 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2192 160 ) ( -128 2224 160 ) ( -128 2224 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -152 2192 160 ) ( -128 2192 160 ) ( -128 2192 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -304 2224 160 ) ( -304 2192 160 ) ( -304 2192 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -152 2224 128 ) ( -128 2224 128 ) ( -128 2192 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2192 112 ) ( -128 2224 112 ) ( -152 2224 112 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -400 1920 160 ) ( -400 1944 160 ) ( -400 1944 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -432 1952 160 ) ( -400 1952 160 ) ( -400 1952 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -432 1944 160 ) ( -432 1920 160 ) ( -432 1920 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -400 2096 160 ) ( -432 2096 160 ) ( -432 2096 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -400 1944 128 ) ( -400 1920 128 ) ( -432 1920 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( -432 1920 112 ) ( -400 1920 112 ) ( -400 1944 112 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -336 2200 128 ) ( -336 2200 112 ) ( -400 2136 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -432 2128 160 ) ( -400 2128 160 ) ( -400 2128 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -336 2232 112 ) ( -336 2232 128 ) ( -432 2136 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( -336 2224 128 ) ( -336 2224 112 ) ( -336 2192 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -368 2192 128 ) ( -336 2192 128 ) ( -400 2128 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( -336 2192 112 ) ( -368 2192 112 ) ( -432 2128 112 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -32 1856 0 ) ( -32 1840 0 ) ( -32 1840 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 112 1904 0 ) ( 56 1904 0 ) ( 56 1904 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( -16 1848 0 ) ( -16 1864 0 ) ( -16 1864 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 56 1840 0 ) ( 112 1840 0 ) ( 112 1840 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+( 56 1840 0 ) ( 56 1856 0 ) ( 112 1856 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( 112 1856 -16 ) ( 56 1856 -16 ) ( 56 1840 -16 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -576 2376 -96 ) ( -576 2400 -96 ) ( -416 2400 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -576 2400 -160 ) ( -576 2376 -160 ) ( -416 2376 -160 ) TLIGHT11 0 32 0 1.000000 1.000000
+( -416 2400 -160 ) ( -416 2392 -96 ) ( -432 2400 -160 ) TLIGHT11 0 32 0 1.000000 1.000000
+( -416 2384 -96 ) ( -416 2376 -160 ) ( -432 2384 -96 ) TLIGHT11 0 32 0 1.000000 1.000000
+( -440 2320 -160 ) ( -432 2304 -96 ) ( -440 2304 -160 ) TLIGHT11 0 32 0 1.000000 1.000000
+( -424 2320 -96 ) ( -416 2304 -160 ) ( -424 2304 -96 ) TLIGHT11 0 32 0 1.000000 1.000000
+}
+{
+( -344 2376 -96 ) ( -344 2400 -96 ) ( -184 2400 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -344 2400 -160 ) ( -344 2376 -160 ) ( -184 2376 -160 ) TLIGHT11 0 32 0 1.000000 1.000000
+( -184 2400 -160 ) ( -184 2392 -96 ) ( -200 2400 -160 ) TLIGHT11 0 32 0 1.000000 1.000000
+( -184 2384 -96 ) ( -184 2376 -160 ) ( -200 2384 -96 ) TLIGHT11 0 32 0 1.000000 1.000000
+( -208 2320 -160 ) ( -200 2304 -96 ) ( -208 2304 -160 ) TLIGHT11 0 32 0 1.000000 1.000000
+( -192 2320 -96 ) ( -184 2304 -160 ) ( -192 2304 -96 ) TLIGHT11 0 32 0 1.000000 1.000000
+}
+{
+( -128 2400 176 ) ( -128 2384 176 ) ( -128 2384 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -112 2400 176 ) ( -128 2400 176 ) ( -128 2400 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -112 2384 176 ) ( -112 2400 176 ) ( -112 2400 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2304 176 ) ( -112 2304 176 ) ( -112 2304 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2384 176 ) ( -128 2400 176 ) ( -112 2400 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -112 2400 144 ) ( -128 2400 144 ) ( -128 2384 144 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -128 2400 176 ) ( -128 2384 176 ) ( -128 2384 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( -112 2400 176 ) ( -128 2400 176 ) ( -128 2400 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( -112 2384 176 ) ( -112 2400 176 ) ( -112 2400 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2384 176 ) ( -112 2384 176 ) ( -112 2384 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2384 144 ) ( -128 2400 144 ) ( -112 2400 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( -112 2400 32 ) ( -128 2400 32 ) ( -128 2384 32 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -128 2320 176 ) ( -128 2304 176 ) ( -128 2304 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( -112 2320 176 ) ( -128 2320 176 ) ( -128 2320 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( -112 2304 176 ) ( -112 2320 176 ) ( -112 2320 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2304 176 ) ( -112 2304 176 ) ( -112 2304 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2304 144 ) ( -128 2320 144 ) ( -112 2320 144 ) TECH04_1 0 0 0 1.000000 1.000000
+( -112 2320 32 ) ( -128 2320 32 ) ( -128 2304 32 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -592 2496 32 ) ( -592 2400 32 ) ( -592 2400 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -512 2624 32 ) ( -592 2624 32 ) ( -592 2624 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -496 2400 32 ) ( -496 2496 32 ) ( -496 2496 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -576 2400 32 ) ( -496 2400 32 ) ( -496 2400 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -576 2400 32 ) ( -576 2496 32 ) ( -496 2496 32 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -496 2496 0 ) ( -576 2496 0 ) ( -576 2400 0 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -608 2408 176 ) ( -608 2288 176 ) ( -608 2288 -176 ) TECH08_1 144 176 0 1.000000 1.000000
+( -600 2624 176 ) ( -616 2624 176 ) ( -616 2624 -176 ) TECH08_1 144 176 0 1.000000 1.000000
+( -592 2288 176 ) ( -592 2408 176 ) ( -592 2408 -176 ) TECH08_1 144 176 0 1.000000 1.000000
+( -608 2288 176 ) ( -592 2288 176 ) ( -592 2288 -176 ) TECH08_1 144 176 0 1.000000 1.000000
+( -608 2288 176 ) ( -608 2408 176 ) ( -592 2408 176 ) TECH08_1 144 176 0 1.000000 1.000000
+( -592 2408 0 ) ( -608 2408 0 ) ( -608 2288 0 ) TECH08_1 144 176 0 1.000000 1.000000
+}
+{
+( -496 2560 -144 ) ( -496 2496 -144 ) ( -496 2496 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -384 2560 -144 ) ( -496 2560 -144 ) ( -496 2560 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -384 2496 -144 ) ( -384 2560 -144 ) ( -384 2560 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -496 2496 -144 ) ( -384 2496 -144 ) ( -384 2496 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -496 2496 -144 ) ( -496 2560 -144 ) ( -384 2560 -144 ) SFLOOR4_5 0 0 0 1.000000 1.000000
+( -384 2560 -160 ) ( -496 2560 -160 ) ( -496 2496 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -256 2560 -144 ) ( -256 2496 -144 ) ( -256 2496 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2560 -144 ) ( -240 2560 -144 ) ( -240 2560 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2496 -144 ) ( -128 2560 -144 ) ( -128 2560 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -240 2496 -144 ) ( -128 2496 -144 ) ( -128 2496 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -240 2496 -144 ) ( -240 2560 -144 ) ( -128 2560 -144 ) SFLOOR4_5 0 0 0 1.000000 1.000000
+( -128 2560 -160 ) ( -240 2560 -160 ) ( -240 2496 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -608 2640 -144 ) ( -608 2576 -144 ) ( -608 2576 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2816 -144 ) ( -240 2816 -144 ) ( -240 2816 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2560 -144 ) ( -128 2624 -144 ) ( -128 2624 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -240 2560 -144 ) ( -128 2560 -144 ) ( -128 2560 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -240 2560 -128 ) ( -240 2624 -128 ) ( -128 2624 -128 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -128 2624 -160 ) ( -240 2624 -160 ) ( -240 2560 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -592 2624 0 ) ( -592 2608 0 ) ( -592 2608 -224 ) TECH08_1 128 176 0 1.000000 1.000000
+( -512 2624 0 ) ( -592 2624 0 ) ( -592 2624 -224 ) TECH08_1 128 176 0 1.000000 1.000000
+( -512 2608 0 ) ( -512 2624 0 ) ( -512 2624 -224 ) TECH08_1 128 176 0 1.000000 1.000000
+( -592 2608 0 ) ( -512 2608 0 ) ( -512 2608 -224 ) TECH08_1 128 176 0 1.000000 1.000000
+( -592 2608 0 ) ( -592 2624 0 ) ( -512 2624 0 ) TECH08_1 128 176 0 1.000000 1.000000
+( -512 2624 -224 ) ( -592 2624 -224 ) ( -592 2608 -224 ) TECH08_1 128 176 0 1.000000 1.000000
+}
+{
+( -608 2752 176 ) ( -608 2624 176 ) ( -608 2624 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -592 2816 176 ) ( -608 2816 176 ) ( -608 2816 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -608 2624 176 ) ( -592 2624 176 ) ( -592 2624 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -608 2624 176 ) ( -608 2752 176 ) ( -592 2752 176 ) TECH08_1 144 176 0 1.000000 1.000000
+( -592 2752 -224 ) ( -608 2752 -224 ) ( -608 2624 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -600 2720 -96 ) ( -600 2720 -64 ) ( -600 2752 -64 ) TECH08_1 144 176 0 1.000000 1.000000
+}
+{
+( -592 2816 176 ) ( -608 2816 176 ) ( -608 2816 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -592 2624 176 ) ( -592 2752 176 ) ( -592 2752 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -608 2624 176 ) ( -608 2752 176 ) ( -592 2752 176 ) TECH08_1 144 176 0 1.000000 1.000000
+( -592 2752 -224 ) ( -608 2752 -224 ) ( -608 2624 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -600 2752 -64 ) ( -600 2720 -64 ) ( -600 2720 -96 ) TECH08_1 144 176 0 1.000000 1.000000
+( -600 2752 -96 ) ( -600 2752 -64 ) ( -592 2752 -64 ) TECH08_1 144 176 0 1.000000 1.000000
+}
+{
+( -592 2624 176 ) ( -592 2752 176 ) ( -592 2752 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -608 2624 176 ) ( -592 2624 176 ) ( -592 2624 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -608 2624 176 ) ( -608 2752 176 ) ( -592 2752 176 ) TECH08_1 144 176 0 1.000000 1.000000
+( -592 2752 -224 ) ( -608 2752 -224 ) ( -608 2624 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -600 2752 -64 ) ( -600 2720 -64 ) ( -600 2720 -96 ) TECH08_1 144 176 0 1.000000 1.000000
+( -592 2640 -96 ) ( -592 2640 -64 ) ( -600 2640 -64 ) TECH08_1 144 176 0 1.000000 1.000000
+}
+{
+( -592 2624 176 ) ( -592 2752 176 ) ( -592 2752 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -608 2624 176 ) ( -608 2752 176 ) ( -592 2752 176 ) TECH08_1 144 176 0 1.000000 1.000000
+( -592 2752 -224 ) ( -608 2752 -224 ) ( -608 2624 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -600 2752 -64 ) ( -600 2720 -64 ) ( -600 2720 -96 ) TECH08_1 144 176 0 1.000000 1.000000
+( -600 2720 -96 ) ( -600 2720 -64 ) ( -608 2720 -64 ) TECH08_1 144 176 0 1.000000 1.000000
+( -592 2672 -96 ) ( -592 2672 -64 ) ( -584 2672 -64 ) TECH08_1 144 176 0 1.000000 1.000000
+}
+{
+( -592 2624 176 ) ( -592 2752 176 ) ( -592 2752 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -608 2624 176 ) ( -608 2752 176 ) ( -592 2752 176 ) TECH08_1 144 176 0 1.000000 1.000000
+( -600 2752 -64 ) ( -600 2720 -64 ) ( -600 2720 -96 ) TECH08_1 144 176 0 1.000000 1.000000
+( -600 2640 -64 ) ( -592 2640 -64 ) ( -592 2640 -96 ) TECH08_1 144 176 0 1.000000 1.000000
+( -584 2672 -64 ) ( -592 2672 -64 ) ( -592 2672 -96 ) TECH08_1 144 176 0 1.000000 1.000000
+( -600 2640 -64 ) ( -592 2640 -64 ) ( -592 2672 -64 ) TECH08_1 144 176 0 1.000000 1.000000
+}
+{
+( -592 2624 176 ) ( -592 2752 176 ) ( -592 2752 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -592 2752 -224 ) ( -608 2752 -224 ) ( -608 2624 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -600 2752 -64 ) ( -600 2720 -64 ) ( -600 2720 -96 ) TECH08_1 144 176 0 1.000000 1.000000
+( -600 2640 -64 ) ( -592 2640 -64 ) ( -592 2640 -96 ) TECH08_1 144 176 0 1.000000 1.000000
+( -584 2672 -64 ) ( -592 2672 -64 ) ( -592 2672 -96 ) TECH08_1 144 176 0 1.000000 1.000000
+( -592 2672 -96 ) ( -592 2640 -96 ) ( -600 2640 -96 ) TECH08_1 144 176 0 1.000000 1.000000
+}
+{
+( -592 2624 176 ) ( -592 2752 176 ) ( -592 2752 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -608 2624 176 ) ( -608 2752 176 ) ( -592 2752 176 ) TECH08_1 144 176 0 1.000000 1.000000
+( -600 2752 -64 ) ( -600 2720 -64 ) ( -600 2720 -96 ) TECH08_1 144 176 0 1.000000 1.000000
+( -592 2752 -64 ) ( -600 2752 -64 ) ( -600 2752 -96 ) TECH08_1 144 176 0 1.000000 1.000000
+( -608 2720 -64 ) ( -600 2720 -64 ) ( -600 2720 -96 ) TECH08_1 144 176 0 1.000000 1.000000
+( -592 2752 -64 ) ( -600 2752 -64 ) ( -600 2720 -64 ) TECH08_1 144 176 0 1.000000 1.000000
+}
+{
+( -592 2624 176 ) ( -592 2752 176 ) ( -592 2752 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -592 2752 -224 ) ( -608 2752 -224 ) ( -608 2624 -224 ) TECH08_1 144 176 0 1.000000 1.000000
+( -600 2752 -64 ) ( -600 2720 -64 ) ( -600 2720 -96 ) TECH08_1 144 176 0 1.000000 1.000000
+( -592 2752 -64 ) ( -600 2752 -64 ) ( -600 2752 -96 ) TECH08_1 144 176 0 1.000000 1.000000
+( -608 2720 -64 ) ( -600 2720 -64 ) ( -600 2720 -96 ) TECH08_1 144 176 0 1.000000 1.000000
+( -600 2720 -64 ) ( -600 2752 -64 ) ( -592 2752 -64 ) TECH08_1 144 176 0 1.000000 1.000000
+}
+{
+( -224 2688 -128 ) ( -224 2688 -112 ) ( -224 2752 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -256 2816 -128 ) ( -256 2816 -112 ) ( -320 2816 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -368 2776 -128 ) ( -368 2776 -112 ) ( -368 2712 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -288 2688 -128 ) ( -288 2688 -112 ) ( -224 2688 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -320 2784 -112 ) ( -256 2784 -112 ) ( -256 2720 -112 ) SFLOOR4_5 16 224 0 1.000000 1.000000
+( -256 2720 -128 ) ( -256 2784 -128 ) ( -320 2784 -128 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -128 2592 -128 ) ( -128 2592 -112 ) ( -128 2656 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -152 2784 -128 ) ( -152 2784 -112 ) ( -216 2784 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -224 2688 -128 ) ( -224 2688 -112 ) ( -224 2624 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -192 2592 -128 ) ( -192 2592 -112 ) ( -128 2592 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -224 2688 -112 ) ( -160 2688 -112 ) ( -160 2624 -112 ) SFLOOR4_5 16 224 0 1.000000 1.000000
+( -160 2624 -128 ) ( -160 2688 -128 ) ( -224 2688 -128 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -176 2744 -112 ) ( -176 2744 -96 ) ( -176 2808 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -256 2840 -112 ) ( -256 2840 -96 ) ( -320 2840 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -320 2840 -112 ) ( -320 2840 -96 ) ( -320 2776 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -288 2736 -112 ) ( -288 2736 -96 ) ( -224 2736 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -320 2840 -96 ) ( -256 2840 -96 ) ( -256 2776 -96 ) SFLOOR4_5 16 208 0 1.000000 1.000000
+( -256 2776 -112 ) ( -256 2840 -112 ) ( -320 2840 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -80 2840 -112 ) ( -80 2840 -96 ) ( -144 2840 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -176 2760 -112 ) ( -176 2760 -96 ) ( -176 2696 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -168 2624 -112 ) ( -168 2624 -96 ) ( -104 2624 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -80 2728 -112 ) ( -80 2728 -96 ) ( -80 2792 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -176 2696 -96 ) ( -176 2760 -96 ) ( -112 2760 -96 ) SFLOOR4_5 16 208 0 1.000000 1.000000
+( -112 2760 -112 ) ( -176 2760 -112 ) ( -176 2696 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -608 2832 176 ) ( -608 2824 176 ) ( -608 2824 -224 ) TECH08_1 208 176 0 1.000000 1.000000
+( -368 2832 176 ) ( -608 2832 176 ) ( -608 2832 -224 ) TECH08_1 208 176 0 1.000000 1.000000
+( -608 2816 176 ) ( -368 2816 176 ) ( -368 2816 -224 ) TECH08_1 208 176 0 1.000000 1.000000
+( -608 2824 176 ) ( -608 2832 176 ) ( -368 2832 176 ) TECH08_1 208 176 0 1.000000 1.000000
+( -368 2832 -160 ) ( -608 2832 -160 ) ( -608 2824 -160 ) TECH08_1 208 176 0 1.000000 1.000000
+( -464 2816 -160 ) ( -464 2816 176 ) ( -464 2832 176 ) TECH08_1 208 176 0 1.000000 1.000000
+}
+{
+( -368 2832 176 ) ( -608 2832 176 ) ( -608 2832 -224 ) TECH08_1 208 176 0 1.000000 1.000000
+( -320 2824 176 ) ( -320 2832 176 ) ( -320 2832 -224 ) TECH08_1 208 176 0 1.000000 1.000000
+( -608 2816 176 ) ( -368 2816 176 ) ( -368 2816 -224 ) TECH08_1 208 176 0 1.000000 1.000000
+( -608 2824 176 ) ( -608 2832 176 ) ( -368 2832 176 ) TECH08_1 208 176 0 1.000000 1.000000
+( -368 2832 -160 ) ( -608 2832 -160 ) ( -608 2824 -160 ) TECH08_1 208 176 0 1.000000 1.000000
+( -336 2840 -160 ) ( -336 2840 176 ) ( -336 2824 176 ) TECH08_1 208 176 0 1.000000 1.000000
+}
+{
+( -368 2832 176 ) ( -608 2832 176 ) ( -608 2832 -224 ) TECH08_1 208 176 0 1.000000 1.000000
+( -608 2816 176 ) ( -368 2816 176 ) ( -368 2816 -224 ) TECH08_1 208 176 0 1.000000 1.000000
+( -608 2824 176 ) ( -608 2832 176 ) ( -368 2832 176 ) TECH08_1 208 176 0 1.000000 1.000000
+( -464 2832 176 ) ( -464 2816 176 ) ( -464 2816 -160 ) TECH08_1 208 176 0 1.000000 1.000000
+( -336 2824 176 ) ( -336 2840 176 ) ( -336 2840 -160 ) TECH08_1 208 176 0 1.000000 1.000000
+( -352 2832 48 ) ( -464 2832 48 ) ( -464 2816 48 ) TECH08_1 208 176 0 1.000000 1.000000
+}
+{
+( -368 2832 176 ) ( -608 2832 176 ) ( -608 2832 -224 ) TECH08_1 208 176 0 1.000000 1.000000
+( -608 2816 176 ) ( -368 2816 176 ) ( -368 2816 -224 ) TECH08_1 208 176 0 1.000000 1.000000
+( -368 2832 -160 ) ( -608 2832 -160 ) ( -608 2824 -160 ) TECH08_1 208 176 0 1.000000 1.000000
+( -464 2832 176 ) ( -464 2816 176 ) ( -464 2816 -160 ) TECH08_1 208 176 0 1.000000 1.000000
+( -336 2824 176 ) ( -336 2840 176 ) ( -336 2840 -160 ) TECH08_1 208 176 0 1.000000 1.000000
+( -464 2816 -80 ) ( -464 2832 -80 ) ( -352 2832 -80 ) TECH08_1 208 176 0 1.000000 1.000000
+}
+{
+( -320 2832 176 ) ( -320 2816 176 ) ( -320 2816 -160 ) TECH08_1 208 176 0 1.000000 1.000000
+( -304 2832 176 ) ( -320 2832 176 ) ( -320 2832 -160 ) TECH08_1 208 176 0 1.000000 1.000000
+( -128 2824 176 ) ( -128 2840 176 ) ( -128 2840 -160 ) TECH08_1 208 176 0 1.000000 1.000000
+( -320 2816 176 ) ( -304 2816 176 ) ( -304 2816 -160 ) TECH08_1 208 176 0 1.000000 1.000000
+( -320 2816 176 ) ( -320 2832 176 ) ( -304 2832 176 ) TECH08_1 208 176 0 1.000000 1.000000
+( -304 2832 128 ) ( -320 2832 128 ) ( -320 2816 128 ) TECH08_1 208 176 0 1.000000 1.000000
+}
+{
+( -112 2832 176 ) ( -128 2832 176 ) ( -128 2832 -160 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2816 176 ) ( -112 2832 176 ) ( -112 2832 -160 ) TECH08_1 32 176 0 1.000000 1.000000
+( -120 2624 176 ) ( -104 2624 176 ) ( -104 2624 -160 ) TECH08_1 32 176 0 1.000000 1.000000
+( -128 2832 176 ) ( -128 2816 176 ) ( -128 2816 -160 ) TECH08_1 32 176 0 1.000000 1.000000
+( -128 2832 176 ) ( -112 2832 176 ) ( -112 2816 176 ) TECH08_1 32 176 0 1.000000 1.000000
+( -112 2816 128 ) ( -112 2832 128 ) ( -128 2832 128 ) TECH08_1 32 176 0 1.000000 1.000000
+}
+{
+( -120 2848 160 ) ( -136 2848 160 ) ( -136 2848 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -96 2824 160 ) ( -96 2840 160 ) ( -96 2840 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -120 2624 160 ) ( -104 2624 160 ) ( -104 2624 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2832 160 ) ( -128 2816 160 ) ( -128 2816 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2832 128 ) ( -112 2832 128 ) ( -112 2816 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( -112 2816 96 ) ( -112 2832 96 ) ( -128 2832 96 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -128 2816 160 ) ( -128 2832 160 ) ( -128 2832 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -144 2816 160 ) ( -128 2816 160 ) ( -128 2816 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -320 2824 160 ) ( -320 2808 160 ) ( -320 2808 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -120 2848 160 ) ( -136 2848 160 ) ( -136 2848 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -112 2832 128 ) ( -112 2816 128 ) ( -128 2816 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2816 96 ) ( -112 2816 96 ) ( -112 2832 96 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -128 2816 128 ) ( -160 2816 128 ) ( -160 2816 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2784 128 ) ( -128 2816 128 ) ( -128 2816 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -160 2784 176 ) ( -160 2816 176 ) ( -128 2816 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2816 96 ) ( -160 2816 96 ) ( -160 2784 96 ) TECH04_2 0 0 0 1.000000 1.000000
+( -128 2784 112 ) ( -160 2816 112 ) ( -128 2784 128 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -128 2640 128 ) ( -128 2624 128 ) ( -128 2624 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -112 2656 128 ) ( -128 2656 128 ) ( -128 2656 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -96 2624 128 ) ( -96 2640 128 ) ( -96 2640 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2624 128 ) ( -112 2624 128 ) ( -112 2624 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2624 128 ) ( -128 2640 128 ) ( -112 2640 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( -112 2640 -96 ) ( -128 2640 -96 ) ( -128 2624 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -320 2832 128 ) ( -320 2816 128 ) ( -320 2816 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -304 2848 128 ) ( -320 2848 128 ) ( -320 2848 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -288 2816 128 ) ( -288 2832 128 ) ( -288 2832 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -320 2816 128 ) ( -304 2816 128 ) ( -304 2816 112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -320 2816 128 ) ( -320 2832 128 ) ( -304 2832 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( -304 2832 -96 ) ( -320 2832 -96 ) ( -320 2816 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -128 2656 96 ) ( -128 2688 96 ) ( 96 2688 96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2656 64 ) ( -128 2656 96 ) ( 96 2656 96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2688 64 ) ( -128 2688 96 ) ( -128 2656 96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -96 2656 96 ) ( -96 2688 96 ) ( -96 2688 64 ) TECH04_1 0 0 0 1.000000 1.000000
+( 96 2648 64 ) ( 96 2680 96 ) ( 80 2648 64 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -288 2848 96 ) ( -256 2848 96 ) ( -256 2624 96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -288 2848 64 ) ( -288 2848 96 ) ( -288 2624 96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -256 2848 64 ) ( -256 2848 96 ) ( -288 2848 96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -288 2816 96 ) ( -256 2816 96 ) ( -256 2816 64 ) TECH04_1 0 0 0 1.000000 1.000000
+( -296 2624 64 ) ( -264 2624 96 ) ( -296 2640 64 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -592 2792 160 ) ( -592 2816 160 ) ( -592 2816 224 ) TWALL2_5 0 0 0 1.000000 1.000000
+( -592 2792 224 ) ( -592 2816 224 ) ( -528 2816 224 ) TWALL2_5 0 0 0 1.000000 1.000000
+( -528 2792 224 ) ( -528 2816 224 ) ( -528 2816 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -528 2792 160 ) ( -528 2816 160 ) ( -592 2816 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -528 2816 224 ) ( -592 2816 224 ) ( -592 2816 160 ) TWALL2_5 0 0 0 1.000000 1.000000
+( -608 2304 160 ) ( -608 2304 224 ) ( -544 2304 224 ) TWALL2_5 0 0 0 1.000000 1.000000
+( -528 2808 208 ) ( -576 2792 160 ) ( -528 2792 208 ) TWALL2_5 0 0 0 1.000000 1.000000
+}
+{
+( -128 2304 224 ) ( -128 2304 160 ) ( -152 2304 160 ) TWALL2_5 0 0 0 1.000000 1.000000
+( -128 2368 224 ) ( -128 2304 224 ) ( -152 2304 224 ) TWALL2_5 0 0 0 1.000000 1.000000
+( -128 2368 160 ) ( -128 2368 224 ) ( -152 2368 224 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2304 160 ) ( -128 2368 160 ) ( -152 2368 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -128 2304 160 ) ( -128 2304 224 ) ( -128 2368 224 ) TWALL2_5 0 0 0 1.000000 1.000000
+( -592 2360 224 ) ( -592 2296 224 ) ( -592 2296 160 ) TWALL2_5 0 0 0 1.000000 1.000000
+( -152 2368 208 ) ( -152 2320 160 ) ( -136 2368 208 ) TWALL2_5 0 0 0 1.000000 1.000000
+}
+{
+( -128 2328 160 ) ( -128 2304 160 ) ( -128 2304 224 ) TWALL2_5 0 0 0 1.000000 1.000000
+( -128 2328 224 ) ( -128 2304 224 ) ( -192 2304 224 ) TWALL2_5 0 0 0 1.000000 1.000000
+( -192 2328 224 ) ( -192 2304 224 ) ( -192 2304 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -192 2328 160 ) ( -192 2304 160 ) ( -128 2304 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -192 2304 224 ) ( -128 2304 224 ) ( -128 2304 160 ) TWALL2_5 0 0 0 1.000000 1.000000
+( -120 2816 160 ) ( -120 2816 224 ) ( -184 2816 224 ) TWALL2_5 0 0 0 1.000000 1.000000
+( -192 2312 208 ) ( -144 2328 160 ) ( -192 2328 208 ) TWALL2_5 0 0 0 1.000000 1.000000
+}
+{
+( -592 2816 224 ) ( -592 2816 160 ) ( -568 2816 160 ) TWALL2_5 0 0 0 1.000000 1.000000
+( -592 2752 224 ) ( -592 2816 224 ) ( -568 2816 224 ) TWALL2_5 0 0 0 1.000000 1.000000
+( -592 2752 160 ) ( -592 2752 224 ) ( -568 2752 224 ) TECH04_1 0 0 0 1.000000 1.000000
+( -592 2816 160 ) ( -592 2752 160 ) ( -568 2752 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -592 2816 160 ) ( -592 2816 224 ) ( -592 2752 224 ) TWALL2_5 0 0 0 1.000000 1.000000
+( -128 2760 224 ) ( -128 2824 224 ) ( -128 2824 160 ) TWALL2_5 0 0 0 1.000000 1.000000
+( -568 2752 208 ) ( -568 2800 160 ) ( -584 2752 208 ) TWALL2_5 0 0 0 1.000000 1.000000
+}
+{
+( -528 2752 240 ) ( -528 2704 240 ) ( -528 2704 176 ) TECH01_1 0 0 0 1.000000 1.000000
+( -488 2752 240 ) ( -528 2752 240 ) ( -528 2752 176 ) TECH01_1 0 0 0 1.000000 1.000000
+( -192 2400 240 ) ( -192 2448 240 ) ( -192 2448 176 ) TECH01_1 0 0 0 1.000000 1.000000
+( -232 2368 240 ) ( -192 2368 240 ) ( -192 2368 176 ) TECH01_1 0 0 0 1.000000 1.000000
+( -528 2704 240 ) ( -528 2752 240 ) ( -488 2752 240 ) TECH01_1 0 0 0 1.000000 1.000000
+( -488 2752 224 ) ( -528 2752 224 ) ( -528 2704 224 ) TECH01_1 0 0 0 1.000000 1.000000
+}
+{
+( -448 2688 224 ) ( -448 2624 224 ) ( -448 2624 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -256 2688 224 ) ( -448 2688 224 ) ( -448 2688 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -256 2624 224 ) ( -256 2688 224 ) ( -256 2688 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -448 2624 224 ) ( -256 2624 224 ) ( -256 2624 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -448 2624 224 ) ( -448 2688 224 ) ( -256 2688 224 ) TECH04_1 0 0 0 1.000000 1.000000
+( -256 2688 208 ) ( -448 2688 208 ) ( -448 2624 208 ) TLIGHT02 0 0 90 -1.000000 1.000000
+}
+{
+( -448 2496 224 ) ( -448 2432 224 ) ( -448 2432 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -256 2496 224 ) ( -448 2496 224 ) ( -448 2496 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -256 2432 224 ) ( -256 2496 224 ) ( -256 2496 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -448 2432 224 ) ( -256 2432 224 ) ( -256 2432 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -448 2432 224 ) ( -448 2496 224 ) ( -256 2496 224 ) TECH04_1 0 0 0 1.000000 1.000000
+( -256 2496 208 ) ( -448 2496 208 ) ( -448 2432 208 ) TLIGHT02 0 0 90 -1.000000 1.000000
+}
+{
+( -368 2624 224 ) ( -368 2496 224 ) ( -368 2496 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -336 2624 224 ) ( -368 2624 224 ) ( -368 2624 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -336 2496 224 ) ( -336 2624 224 ) ( -336 2624 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -368 2496 224 ) ( -336 2496 224 ) ( -336 2496 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -368 2496 224 ) ( -368 2624 224 ) ( -336 2624 224 ) TECH04_1 0 0 0 1.000000 1.000000
+( -336 2624 208 ) ( -368 2624 208 ) ( -368 2496 208 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -528 2672 224 ) ( -528 2640 224 ) ( -528 2640 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -448 2672 224 ) ( -592 2672 224 ) ( -592 2672 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -448 2640 224 ) ( -448 2672 224 ) ( -448 2672 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -592 2640 224 ) ( -448 2640 224 ) ( -448 2640 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -592 2640 224 ) ( -592 2672 224 ) ( -448 2672 224 ) TECH04_1 0 0 0 1.000000 1.000000
+( -448 2672 208 ) ( -592 2672 208 ) ( -592 2640 208 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -256 2480 224 ) ( -256 2448 224 ) ( -256 2448 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -192 2480 224 ) ( -336 2480 224 ) ( -336 2480 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -192 2448 224 ) ( -192 2480 224 ) ( -192 2480 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -336 2448 224 ) ( -192 2448 224 ) ( -192 2448 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -336 2448 224 ) ( -336 2480 224 ) ( -192 2480 224 ) TECH04_1 0 0 0 1.000000 1.000000
+( -192 2480 208 ) ( -336 2480 208 ) ( -336 2448 208 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -496 2432 32 ) ( -496 2400 32 ) ( -496 2400 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -496 2400 32 ) ( -464 2400 32 ) ( -464 2400 0 ) TECH04_1 0 0 0 1.000000 1.000000
+( -496 2400 32 ) ( -496 2432 32 ) ( -464 2432 32 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -464 2432 0 ) ( -496 2432 0 ) ( -496 2400 0 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -496 2432 0 ) ( -464 2400 0 ) ( -496 2432 16 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -728 2792 -64 ) ( -728 2816 -64 ) ( -568 2816 -64 ) TLIGHT08 0 0 0 1.000000 1.000000
+( -728 2816 -128 ) ( -728 2792 -128 ) ( -568 2792 -128 ) TLIGHT11 0 0 0 1.000000 1.000000
+( -568 2816 -128 ) ( -568 2808 -64 ) ( -584 2816 -128 ) TLIGHT11 0 0 0 1.000000 1.000000
+( -568 2800 -64 ) ( -568 2792 -128 ) ( -584 2800 -64 ) TLIGHT11 0 0 0 1.000000 1.000000
+( -592 2736 -128 ) ( -584 2720 -64 ) ( -592 2720 -128 ) TLIGHT11 0 0 0 1.000000 1.000000
+( -576 2736 -64 ) ( -568 2720 -128 ) ( -576 2720 -64 ) TLIGHT11 0 0 0 1.000000 1.000000
+}
+{
+( -32 1840 -80 ) ( -32 1824 -80 ) ( -32 1824 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( -16 1840 -80 ) ( -32 1840 -80 ) ( -32 1840 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( -16 1824 -80 ) ( -16 1840 -80 ) ( -16 1840 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( -32 1824 -80 ) ( -16 1824 -80 ) ( -16 1824 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+( -32 1824 -80 ) ( -32 1840 -80 ) ( -16 1840 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+( -16 1840 -224 ) ( -32 1840 -224 ) ( -32 1824 -224 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 552 -192 160 ) ( 552 -192 128 ) ( 552 -224 128 ) TECH04_3 224 0 0 1.000000 1.000000
+( 520 -192 160 ) ( 544 -192 160 ) ( 544 -224 160 ) TECH04_3 224 0 0 1.000000 1.000000
+( 544 -192 128 ) ( 544 -192 160 ) ( 520 -192 160 ) TECH04_3 224 0 0 1.000000 1.000000
+( 520 -224 160 ) ( 544 -224 160 ) ( 544 -224 128 ) TECH04_3 224 0 0 1.000000 1.000000
+( 520 -224 160 ) ( 552 -224 128 ) ( 520 -208 160 ) TECH04_3 0 16 90 -1.000000 1.000000
+}
+{
+( 552 -64 160 ) ( 552 -64 128 ) ( 552 -96 128 ) TECH04_3 224 0 0 1.000000 1.000000
+( 520 -64 160 ) ( 544 -64 160 ) ( 544 -96 160 ) TECH04_3 224 0 0 1.000000 1.000000
+( 544 -64 128 ) ( 544 -64 160 ) ( 520 -64 160 ) TECH04_3 224 0 0 1.000000 1.000000
+( 520 -96 160 ) ( 544 -96 160 ) ( 544 -96 128 ) TECH04_3 224 0 0 1.000000 1.000000
+( 520 -96 160 ) ( 552 -96 128 ) ( 520 -80 160 ) TECH04_3 0 16 90 -1.000000 1.000000
+}
+{
+( 552 -320 160 ) ( 552 -320 128 ) ( 552 -352 128 ) TECH04_3 224 0 0 1.000000 1.000000
+( 520 -320 160 ) ( 544 -320 160 ) ( 544 -352 160 ) TECH04_3 224 0 0 1.000000 1.000000
+( 544 -320 128 ) ( 544 -320 160 ) ( 520 -320 160 ) TECH04_3 224 0 0 1.000000 1.000000
+( 520 -352 160 ) ( 544 -352 160 ) ( 544 -352 128 ) TECH04_3 224 0 0 1.000000 1.000000
+( 520 -352 160 ) ( 552 -352 128 ) ( 520 -336 160 ) TECH04_3 0 16 90 -1.000000 1.000000
+}
+{
+( 408 -352 128 ) ( 408 -320 128 ) ( 408 -320 160 ) TECH04_3 224 0 0 1.000000 1.000000
+( 416 -352 160 ) ( 416 -320 160 ) ( 440 -320 160 ) TECH04_3 224 0 0 1.000000 1.000000
+( 440 -320 160 ) ( 416 -320 160 ) ( 416 -320 128 ) TECH04_3 224 0 0 1.000000 1.000000
+( 416 -352 128 ) ( 416 -352 160 ) ( 440 -352 160 ) TECH04_3 224 0 0 1.000000 1.000000
+( 440 -336 160 ) ( 408 -352 128 ) ( 440 -352 160 ) TECH04_3 0 16 90 -1.000000 1.000000
+}
+{
+( 408 -224 128 ) ( 408 -192 128 ) ( 408 -192 160 ) TECH04_3 224 0 0 1.000000 1.000000
+( 416 -224 160 ) ( 416 -192 160 ) ( 440 -192 160 ) TECH04_3 224 0 0 1.000000 1.000000
+( 440 -192 160 ) ( 416 -192 160 ) ( 416 -192 128 ) TECH04_3 224 0 0 1.000000 1.000000
+( 416 -224 128 ) ( 416 -224 160 ) ( 440 -224 160 ) TECH04_3 224 0 0 1.000000 1.000000
+( 440 -208 160 ) ( 408 -224 128 ) ( 440 -224 160 ) TECH04_3 0 16 90 -1.000000 1.000000
+}
+{
+( 408 -96 128 ) ( 408 -64 128 ) ( 408 -64 160 ) TECH04_3 224 0 0 1.000000 1.000000
+( 416 -96 160 ) ( 416 -64 160 ) ( 440 -64 160 ) TECH04_3 224 0 0 1.000000 1.000000
+( 440 -64 160 ) ( 416 -64 160 ) ( 416 -64 128 ) TECH04_3 224 0 0 1.000000 1.000000
+( 416 -96 128 ) ( 416 -96 160 ) ( 440 -96 160 ) TECH04_3 224 0 0 1.000000 1.000000
+( 440 -80 160 ) ( 408 -96 128 ) ( 440 -96 160 ) TECH04_3 0 16 90 -1.000000 1.000000
+}
+{
+( 416 -32 96 ) ( 416 0 96 ) ( 416 0 128 ) TECH08_1 0 0 0 1.000000 1.000000
+( 424 -32 128 ) ( 424 0 128 ) ( 448 0 128 ) TECH08_1 0 0 0 1.000000 1.000000
+( 448 0 128 ) ( 424 0 128 ) ( 424 0 96 ) TECH08_1 0 0 0 1.000000 1.000000
+( 424 -16 96 ) ( 424 -16 128 ) ( 448 -16 128 ) TECH08_1 0 0 0 1.000000 1.000000
+( 448 -16 128 ) ( 416 -32 96 ) ( 448 -32 128 ) TECH08_1 0 0 0 1.000000 1.000000
+}
+{
+( 544 0 128 ) ( 544 0 96 ) ( 544 -32 96 ) TECH08_1 0 0 0 1.000000 1.000000
+( 512 0 128 ) ( 536 0 128 ) ( 536 -32 128 ) TECH08_1 0 0 0 1.000000 1.000000
+( 536 0 96 ) ( 536 0 128 ) ( 512 0 128 ) TECH08_1 0 0 0 1.000000 1.000000
+( 512 -16 128 ) ( 536 -16 128 ) ( 536 -16 96 ) TECH08_1 0 0 0 1.000000 1.000000
+( 512 -32 128 ) ( 544 -32 96 ) ( 512 -16 128 ) TECH08_1 0 0 0 1.000000 1.000000
+}
+{
+( 608 384 160 ) ( 608 384 128 ) ( 608 352 128 ) TECH04_3 32 0 90 -1.000000 1.000000
+( 576 384 160 ) ( 600 384 160 ) ( 600 352 160 ) TECH04_3 32 0 90 -1.000000 1.000000
+( 600 384 128 ) ( 600 384 160 ) ( 576 384 160 ) TECH04_3 32 0 90 -1.000000 1.000000
+( 584 336 160 ) ( 608 336 160 ) ( 608 336 128 ) TECH04_3 32 0 90 -1.000000 1.000000
+( 576 352 160 ) ( 608 352 128 ) ( 576 368 160 ) TECH04_3 32 0 90 -1.000000 1.000000
+}
+{
+( 320 352 128 ) ( 320 384 128 ) ( 320 384 160 ) TECH04_3 32 0 90 -1.000000 1.000000
+( 328 352 160 ) ( 328 384 160 ) ( 352 384 160 ) TECH04_3 32 0 90 -1.000000 1.000000
+( 352 384 160 ) ( 328 384 160 ) ( 328 384 128 ) TECH04_3 32 0 90 -1.000000 1.000000
+( 320 336 128 ) ( 320 336 160 ) ( 344 336 160 ) TECH04_3 32 0 90 -1.000000 1.000000
+( 352 368 160 ) ( 320 352 128 ) ( 352 352 160 ) TECH04_3 32 0 90 -1.000000 1.000000
+}
+{
+( 512 304 208 ) ( 512 272 208 ) ( 512 272 192 ) TECH04_3 0 0 90 -1.000000 1.000000
+( 560 304 208 ) ( 512 304 208 ) ( 512 304 192 ) TECH04_3 0 0 90 -1.000000 1.000000
+( 608 264 208 ) ( 608 296 208 ) ( 608 296 192 ) TECH04_3 0 0 90 -1.000000 1.000000
+( 512 272 208 ) ( 560 272 208 ) ( 560 272 192 ) TECH04_3 0 0 90 -1.000000 1.000000
+( 512 272 208 ) ( 512 304 208 ) ( 560 304 208 ) TECH04_3 0 0 90 -1.000000 1.000000
+( 560 304 192 ) ( 512 304 192 ) ( 512 272 192 ) TECH04_3 0 0 90 -1.000000 1.000000
+}
+{
+( 352 112 208 ) ( 352 80 208 ) ( 352 80 192 ) TECH04_3 0 0 90 -1.000000 1.000000
+( 400 112 208 ) ( 352 112 208 ) ( 352 112 192 ) TECH04_3 0 0 90 -1.000000 1.000000
+( 448 72 208 ) ( 448 104 208 ) ( 448 104 192 ) TECH04_3 0 0 90 -1.000000 1.000000
+( 352 80 208 ) ( 400 80 208 ) ( 400 80 192 ) TECH04_3 0 0 90 -1.000000 1.000000
+( 352 80 208 ) ( 352 112 208 ) ( 400 112 208 ) TECH04_3 0 0 90 -1.000000 1.000000
+( 400 112 192 ) ( 352 112 192 ) ( 352 80 192 ) TECH04_3 0 0 90 -1.000000 1.000000
+}
+{
+( 496 256 208 ) ( 464 256 208 ) ( 464 256 192 ) TECH04_3 0 0 90 -1.000000 1.000000
+( 496 176 208 ) ( 496 224 208 ) ( 496 224 192 ) TECH04_3 0 0 90 -1.000000 1.000000
+( 456 128 208 ) ( 488 128 208 ) ( 488 128 192 ) TECH04_3 0 0 90 -1.000000 1.000000
+( 464 224 208 ) ( 464 176 208 ) ( 464 176 192 ) TECH04_3 0 0 90 -1.000000 1.000000
+( 464 224 208 ) ( 496 224 208 ) ( 496 176 208 ) TECH04_3 0 0 90 -1.000000 1.000000
+( 496 176 192 ) ( 496 224 192 ) ( 464 224 192 ) TECH04_3 0 0 90 -1.000000 1.000000
+}
+{
+( 608 496 200 ) ( 608 496 176 ) ( 608 480 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 584 496 200 ) ( 608 496 200 ) ( 608 480 200 ) TECH04_1 0 0 0 1.000000 1.000000
+( 608 496 176 ) ( 608 496 200 ) ( 584 496 200 ) TECH04_1 0 0 0 1.000000 1.000000
+( 584 464 200 ) ( 608 464 200 ) ( 608 464 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 584 480 200 ) ( 608 480 176 ) ( 584 496 200 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 608 624 200 ) ( 608 624 176 ) ( 608 608 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 584 624 200 ) ( 608 624 200 ) ( 608 608 200 ) TECH04_1 0 0 0 1.000000 1.000000
+( 608 624 176 ) ( 608 624 200 ) ( 584 624 200 ) TECH04_1 0 0 0 1.000000 1.000000
+( 584 592 200 ) ( 608 592 200 ) ( 608 592 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 584 608 200 ) ( 608 608 176 ) ( 584 624 200 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 272 608 176 ) ( 272 624 176 ) ( 272 624 200 ) TECH04_1 0 0 0 1.000000 1.000000
+( 272 608 200 ) ( 272 624 200 ) ( 296 624 200 ) TECH04_1 0 0 0 1.000000 1.000000
+( 296 624 200 ) ( 272 624 200 ) ( 272 624 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 272 592 176 ) ( 272 592 200 ) ( 296 592 200 ) TECH04_1 0 0 0 1.000000 1.000000
+( 296 624 200 ) ( 272 608 176 ) ( 296 608 200 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 320 480 176 ) ( 320 496 176 ) ( 320 496 200 ) TECH04_1 0 0 0 1.000000 1.000000
+( 320 480 200 ) ( 320 496 200 ) ( 344 496 200 ) TECH04_1 0 0 0 1.000000 1.000000
+( 344 496 200 ) ( 320 496 200 ) ( 320 496 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 320 464 176 ) ( 320 464 200 ) ( 344 464 200 ) TECH04_1 0 0 0 1.000000 1.000000
+( 344 496 200 ) ( 320 480 176 ) ( 344 480 200 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 480 768 176 ) ( 496 768 176 ) ( 496 768 200 ) TECH04_1 0 0 0 1.000000 1.000000
+( 480 768 200 ) ( 496 768 200 ) ( 496 744 200 ) TECH04_1 0 0 0 1.000000 1.000000
+( 496 744 200 ) ( 496 768 200 ) ( 496 768 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 464 768 176 ) ( 464 768 200 ) ( 464 744 200 ) TECH04_1 0 0 0 1.000000 1.000000
+( 496 744 200 ) ( 480 768 176 ) ( 480 744 200 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 496 648 208 ) ( 496 624 208 ) ( 496 624 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 496 624 208 ) ( 520 624 208 ) ( 520 624 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 496 624 208 ) ( 496 648 208 ) ( 520 648 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 520 648 192 ) ( 496 648 192 ) ( 496 624 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 496 648 192 ) ( 520 624 192 ) ( 496 648 208 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 464 624 192 ) ( 464 624 208 ) ( 464 648 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 440 624 192 ) ( 440 624 208 ) ( 464 624 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 440 648 208 ) ( 464 648 208 ) ( 464 624 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 464 624 192 ) ( 464 648 192 ) ( 440 648 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 464 648 208 ) ( 440 624 192 ) ( 464 648 192 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -80 2736 -80 ) ( -80 2680 -80 ) ( -80 2680 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -40 3008 -80 ) ( -72 3008 -80 ) ( -72 3008 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2680 -80 ) ( 0 2736 -80 ) ( 0 2736 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -88 2624 -80 ) ( -56 2624 -80 ) ( -56 2624 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -80 2680 -80 ) ( -80 2736 -80 ) ( -48 2736 -80 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -48 2736 -96 ) ( -80 2736 -96 ) ( -80 2680 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -304 3008 -80 ) ( -304 2840 -80 ) ( -304 2840 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -80 3008 -80 ) ( -264 3008 -80 ) ( -264 3008 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -80 2840 -80 ) ( -80 3008 -80 ) ( -80 3008 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -264 2840 -80 ) ( -80 2840 -80 ) ( -80 2840 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( -264 2840 -80 ) ( -264 3008 -80 ) ( -80 3008 -80 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -80 3008 -96 ) ( -264 3008 -96 ) ( -264 2840 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -320 2864 160 ) ( -320 2848 160 ) ( -320 2848 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+( -304 3008 160 ) ( -320 3008 160 ) ( -320 3008 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -304 2848 160 ) ( -304 2864 160 ) ( -304 2864 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -320 2848 160 ) ( -320 2864 160 ) ( -304 2864 160 ) TECH08_1 0 176 0 1.000000 1.000000
+( -304 2864 -96 ) ( -320 2864 -96 ) ( -320 2848 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -320 2944 -96 ) ( -320 2944 160 ) ( -304 2944 160 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -320 2864 160 ) ( -320 2848 160 ) ( -320 2848 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -304 2848 160 ) ( -304 2864 160 ) ( -304 2864 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -320 2848 160 ) ( -304 2848 160 ) ( -304 2848 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -320 2848 160 ) ( -320 2864 160 ) ( -304 2864 160 ) TECH08_1 0 176 0 1.000000 1.000000
+( -304 2864 -96 ) ( -320 2864 -96 ) ( -320 2848 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -304 2880 -96 ) ( -304 2880 160 ) ( -320 2880 160 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -320 2864 160 ) ( -320 2848 160 ) ( -320 2848 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -304 2848 160 ) ( -304 2864 160 ) ( -304 2864 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -320 2848 160 ) ( -320 2864 160 ) ( -304 2864 160 ) TECH08_1 0 176 0 1.000000 1.000000
+( -304 2944 160 ) ( -320 2944 160 ) ( -320 2944 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -320 2880 160 ) ( -304 2880 160 ) ( -304 2880 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -304 2944 0 ) ( -320 2944 0 ) ( -320 2880 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -320 2864 160 ) ( -320 2848 160 ) ( -320 2848 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -304 2848 160 ) ( -304 2864 160 ) ( -304 2864 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -304 2864 -96 ) ( -320 2864 -96 ) ( -320 2848 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -304 2944 160 ) ( -320 2944 160 ) ( -320 2944 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -320 2880 160 ) ( -304 2880 160 ) ( -304 2880 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -320 2880 -80 ) ( -320 2944 -80 ) ( -304 2944 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -128 2992 160 ) ( -128 2976 160 ) ( -128 2976 -96 ) TECH09_3 0 176 0 1.000000 1.000000
+( -280 3024 160 ) ( -320 3024 160 ) ( -320 3024 -96 ) TECH09_3 0 176 0 1.000000 1.000000
+( -16 2992 160 ) ( -16 3008 160 ) ( -16 3008 -96 ) TECH09_3 0 176 0 1.000000 1.000000
+( -320 3008 160 ) ( -280 3008 160 ) ( -280 3008 -96 ) TECH09_3 0 176 0 1.000000 1.000000
+( -320 3008 160 ) ( -320 3024 160 ) ( -280 3024 160 ) TECH09_3 0 176 0 1.000000 1.000000
+( -280 3024 -96 ) ( -320 3024 -96 ) ( -320 3008 -96 ) TECH09_3 0 176 0 1.000000 1.000000
+}
+{
+( -32 3008 -96 ) ( -32 2992 -96 ) ( -32 2992 -112 ) TECH10_1 144 48 0 1.000000 1.000000
+( -16 3008 -96 ) ( -32 3008 -96 ) ( -32 3008 -112 ) TECH10_1 144 48 0 1.000000 1.000000
+( -16 2992 -96 ) ( -16 3008 -96 ) ( -16 3008 -112 ) TECH10_1 144 48 0 1.000000 1.000000
+( -16 2640 -96 ) ( 0 2640 -96 ) ( 0 2640 -112 ) TECH10_1 144 48 0 1.000000 1.000000
+( -32 2992 -96 ) ( -32 3008 -96 ) ( -16 3008 -96 ) TECH10_1 144 48 0 1.000000 1.000000
+( -16 3008 -192 ) ( -32 3008 -192 ) ( -32 2992 -192 ) TECH10_1 144 48 0 1.000000 1.000000
+}
+{
+( -16 3008 -96 ) ( -16 2912 -96 ) ( -16 2912 -192 ) GROUND1_2 0 0 0 1.000000 1.000000
+( 32 3008 -96 ) ( -16 3008 -96 ) ( -16 3008 -192 ) GROUND1_2 0 0 0 1.000000 1.000000
+( 320 2896 -96 ) ( 320 2992 -96 ) ( 320 2992 -192 ) GROUND1_2 0 0 0 1.000000 1.000000
+( -8 2640 -96 ) ( 40 2640 -96 ) ( 40 2640 -192 ) GROUND1_2 0 0 0 1.000000 1.000000
+( -16 2912 -176 ) ( -16 3008 -176 ) ( 32 3008 -176 ) GROUND1_2 0 0 0 1.000000 1.000000
+( 32 3008 -192 ) ( -16 3008 -192 ) ( -16 2912 -192 ) GROUND1_2 0 0 0 1.000000 1.000000
+}
+{
+( 192 3008 160 ) ( 128 3008 160 ) ( 128 3008 -192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 128 2992 160 ) ( 128 3008 160 ) ( 192 3008 160 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 192 3008 -192 ) ( 128 3008 -192 ) ( 128 2992 -192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 144 2992 -192 ) ( 128 3008 -192 ) ( 144 2992 -176 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 144 3024 192 ) ( 144 3024 -160 ) ( 144 3000 -160 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 192 3008 160 ) ( 128 3008 160 ) ( 128 3008 -192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 128 2992 160 ) ( 128 3008 160 ) ( 192 3008 160 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 192 3008 -192 ) ( 128 3008 -192 ) ( 128 2992 -192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 192 3008 -192 ) ( 176 2992 -192 ) ( 192 3008 -176 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 176 3000 192 ) ( 176 3000 -160 ) ( 176 3024 -160 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 192 3008 160 ) ( 128 3008 160 ) ( 128 3008 -192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 128 2992 160 ) ( 192 2992 160 ) ( 192 2992 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 192 3008 -192 ) ( 128 3008 -192 ) ( 128 2992 -192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 144 3000 -160 ) ( 144 3024 -160 ) ( 144 3024 192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 176 3024 -160 ) ( 176 3000 -160 ) ( 176 3000 192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 176 3000 -16 ) ( 144 3000 -16 ) ( 144 3024 -16 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 192 3008 160 ) ( 128 3008 160 ) ( 128 3008 -192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 128 2992 160 ) ( 192 2992 160 ) ( 192 2992 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 128 2992 160 ) ( 128 3008 160 ) ( 192 3008 160 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 144 3000 -160 ) ( 144 3024 -160 ) ( 144 3024 192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 176 3024 -160 ) ( 176 3000 -160 ) ( 176 3000 192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 144 3024 16 ) ( 144 3000 16 ) ( 176 3000 16 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 192 3008 160 ) ( 128 3008 160 ) ( 128 3008 -192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 128 2992 160 ) ( 192 2992 160 ) ( 192 2992 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 144 3000 -160 ) ( 144 3024 -160 ) ( 144 3024 192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 144 3024 -16 ) ( 144 3000 -16 ) ( 176 3000 -16 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 144 2832 -8 ) ( 152 2816 -16 ) ( 144 2816 -8 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 192 3008 160 ) ( 128 3008 160 ) ( 128 3008 -192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 128 2992 160 ) ( 192 2992 160 ) ( 192 2992 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 176 3024 -160 ) ( 176 3000 -160 ) ( 176 3000 192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 144 3024 -16 ) ( 144 3000 -16 ) ( 176 3000 -16 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 168 2832 -16 ) ( 176 2816 -8 ) ( 168 2816 -16 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 192 3008 160 ) ( 128 3008 160 ) ( 128 3008 -192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 128 2992 160 ) ( 192 2992 160 ) ( 192 2992 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 176 3024 -160 ) ( 176 3000 -160 ) ( 176 3000 192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 176 3000 16 ) ( 144 3000 16 ) ( 144 3024 16 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 176 2832 8 ) ( 168 2816 16 ) ( 176 2816 8 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 192 3008 160 ) ( 128 3008 160 ) ( 128 3008 -192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 128 2992 160 ) ( 192 2992 160 ) ( 192 2992 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 144 3000 -160 ) ( 144 3024 -160 ) ( 144 3024 192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 176 3000 16 ) ( 144 3000 16 ) ( 144 3024 16 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 152 2832 16 ) ( 144 2816 8 ) ( 152 2816 16 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 112 3032 160 ) ( 112 3016 160 ) ( 112 3016 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 208 3024 160 ) ( 112 3024 160 ) ( 112 3024 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 112 3008 160 ) ( 208 3008 160 ) ( 208 3008 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 112 3008 160 ) ( 112 3024 160 ) ( 208 3024 160 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 208 3024 -192 ) ( 112 3024 -192 ) ( 112 3008 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 144 3024 192 ) ( 144 3024 -160 ) ( 144 3000 -160 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 208 3024 160 ) ( 112 3024 160 ) ( 112 3024 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 208 3008 160 ) ( 208 3024 160 ) ( 208 3024 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 112 3008 160 ) ( 208 3008 160 ) ( 208 3008 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 112 3008 160 ) ( 112 3024 160 ) ( 208 3024 160 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 208 3024 -192 ) ( 112 3024 -192 ) ( 112 3008 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 176 3000 192 ) ( 176 3000 -160 ) ( 176 3024 -160 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 208 3024 160 ) ( 112 3024 160 ) ( 112 3024 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 112 3008 160 ) ( 208 3008 160 ) ( 208 3008 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 208 3024 -192 ) ( 112 3024 -192 ) ( 112 3008 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 144 3000 -160 ) ( 144 3024 -160 ) ( 144 3024 192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 176 3024 -160 ) ( 176 3000 -160 ) ( 176 3000 192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 176 3000 -16 ) ( 144 3000 -16 ) ( 144 3024 -16 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 208 3024 160 ) ( 112 3024 160 ) ( 112 3024 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 112 3008 160 ) ( 208 3008 160 ) ( 208 3008 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 112 3008 160 ) ( 112 3024 160 ) ( 208 3024 160 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 144 3000 -160 ) ( 144 3024 -160 ) ( 144 3024 192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 176 3024 -160 ) ( 176 3000 -160 ) ( 176 3000 192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 144 3024 16 ) ( 144 3000 16 ) ( 176 3000 16 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 208 3024 160 ) ( 112 3024 160 ) ( 112 3024 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 112 3008 160 ) ( 208 3008 160 ) ( 208 3008 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 144 3000 -160 ) ( 144 3024 -160 ) ( 144 3024 192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 144 3024 -16 ) ( 144 3000 -16 ) ( 176 3000 -16 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 144 2832 -8 ) ( 152 2816 -16 ) ( 144 2816 -8 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 208 3024 160 ) ( 112 3024 160 ) ( 112 3024 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 112 3008 160 ) ( 208 3008 160 ) ( 208 3008 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 176 3024 -160 ) ( 176 3000 -160 ) ( 176 3000 192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 144 3024 -16 ) ( 144 3000 -16 ) ( 176 3000 -16 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 168 2832 -16 ) ( 176 2816 -8 ) ( 168 2816 -16 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 208 3024 160 ) ( 112 3024 160 ) ( 112 3024 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 112 3008 160 ) ( 208 3008 160 ) ( 208 3008 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 176 3024 -160 ) ( 176 3000 -160 ) ( 176 3000 192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 176 3000 16 ) ( 144 3000 16 ) ( 144 3024 16 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 176 2832 8 ) ( 168 2816 16 ) ( 176 2816 8 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( 208 3024 160 ) ( 112 3024 160 ) ( 112 3024 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 112 3008 160 ) ( 208 3008 160 ) ( 208 3008 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 144 3000 -160 ) ( 144 3024 -160 ) ( 144 3024 192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 176 3000 16 ) ( 144 3000 16 ) ( 144 3024 16 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 152 2832 16 ) ( 144 2816 8 ) ( 152 2816 16 ) TLIGHT08 0 0 0 1.000000 1.000000
+}
+{
+( -16 3032 160 ) ( -16 3016 160 ) ( -16 3016 -192 ) TECH10_1 144 48 0 1.000000 1.000000
+( 112 3024 160 ) ( 96 3024 160 ) ( 96 3024 -192 ) TECH10_1 144 48 0 1.000000 1.000000
+( 112 3008 160 ) ( 112 3024 160 ) ( 112 3024 -192 ) TECH10_1 144 48 0 1.000000 1.000000
+( 96 3008 160 ) ( 112 3008 160 ) ( 112 3008 -192 ) TECH10_1 144 48 0 1.000000 1.000000
+( 96 3008 160 ) ( 96 3024 160 ) ( 112 3024 160 ) TECH10_1 144 48 0 1.000000 1.000000
+( 112 3024 -192 ) ( 96 3024 -192 ) ( 96 3008 -192 ) TECH10_1 144 48 0 1.000000 1.000000
+}
+{
+( 208 3032 160 ) ( 208 3016 160 ) ( 208 3016 -192 ) TECH10_1 176 48 0 1.000000 1.000000
+( 336 3024 160 ) ( 320 3024 160 ) ( 320 3024 -192 ) TECH10_1 176 48 0 1.000000 1.000000
+( 336 3008 160 ) ( 336 3024 160 ) ( 336 3024 -192 ) TECH10_1 176 48 0 1.000000 1.000000
+( 320 3008 160 ) ( 336 3008 160 ) ( 336 3008 -192 ) TECH10_1 176 48 0 1.000000 1.000000
+( 320 3008 160 ) ( 320 3024 160 ) ( 336 3024 160 ) TECH10_1 176 48 0 1.000000 1.000000
+( 336 3024 -192 ) ( 320 3024 -192 ) ( 320 3008 -192 ) TECH10_1 176 48 0 1.000000 1.000000
+}
+{
+( -256 3024 160 ) ( -256 3008 160 ) ( -256 3008 -96 ) TECH11_2 0 176 0 1.000000 1.000000
+( -128 3024 160 ) ( -256 3024 160 ) ( -256 3024 -96 ) TECH11_2 0 176 0 1.000000 1.000000
+( -128 3008 160 ) ( -128 3024 160 ) ( -128 3024 -96 ) TECH11_2 0 176 0 1.000000 1.000000
+( -256 3008 160 ) ( -128 3008 160 ) ( -128 3008 -96 ) TECH11_2 0 176 0 1.000000 1.000000
+( -256 3008 160 ) ( -256 3024 160 ) ( -128 3024 160 ) TECH11_2 0 176 0 1.000000 1.000000
+( -128 3024 -96 ) ( -256 3024 -96 ) ( -256 3008 -96 ) TECH11_2 0 176 0 1.000000 1.000000
+}
+{
+( -320 3024 160 ) ( -320 3008 160 ) ( -320 3008 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -256 3024 160 ) ( -320 3024 160 ) ( -320 3024 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -256 3008 160 ) ( -256 3024 160 ) ( -256 3024 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -320 3008 160 ) ( -256 3008 160 ) ( -256 3008 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+( -320 3008 160 ) ( -320 3024 160 ) ( -256 3024 160 ) TECH08_1 0 176 0 1.000000 1.000000
+( -256 3024 -96 ) ( -320 3024 -96 ) ( -320 3008 -96 ) TECH08_1 0 176 0 1.000000 1.000000
+}
+{
+( 128 2640 -192 ) ( 128 2640 160 ) ( 192 2640 160 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 192 2656 -192 ) ( 192 2656 160 ) ( 128 2656 160 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 192 2640 160 ) ( 128 2640 160 ) ( 128 2656 160 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 192 2640 -176 ) ( 176 2656 -192 ) ( 192 2640 -192 ) TWALL3_1 112 48 0 1.000000 1.000000
+( 144 2656 -176 ) ( 128 2640 -192 ) ( 144 2656 -192 ) TWALL3_1 112 48 0 1.000000 1.000000
+( 224 2656 -80 ) ( 0 2656 -80 ) ( 0 2608 -80 ) TECH04_2 0 0 0 1.000000 1.000000
+}
+{
+( 128 2640 -192 ) ( 128 2640 160 ) ( 192 2640 160 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 192 2656 -192 ) ( 192 2656 160 ) ( 128 2656 160 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 128 2656 -192 ) ( 128 2640 -192 ) ( 192 2640 -192 ) TWALL3_1 48 48 0 1.000000 1.000000
+( 192 2640 -176 ) ( 176 2656 -192 ) ( 192 2640 -192 ) TWALL3_1 112 48 0 1.000000 1.000000
+( 144 2656 -176 ) ( 128 2640 -192 ) ( 144 2656 -192 ) TWALL3_1 112 48 0 1.000000 1.000000
+( 0 2608 -96 ) ( 0 2656 -96 ) ( 224 2656 -96 ) TECH04_2 0 0 0 1.000000 1.000000
+}
+{
+( 112 2632 -192 ) ( 112 2632 160 ) ( 112 2616 160 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 112 2624 -192 ) ( 112 2624 160 ) ( 208 2624 160 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 208 2624 -192 ) ( 208 2624 160 ) ( 208 2640 160 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 208 2640 -192 ) ( 208 2640 160 ) ( 112 2640 160 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 208 2624 160 ) ( 112 2624 160 ) ( 112 2640 160 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 224 2656 -80 ) ( 0 2656 -80 ) ( 0 2608 -80 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 112 2632 -192 ) ( 112 2632 160 ) ( 112 2616 160 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 112 2624 -192 ) ( 112 2624 160 ) ( 208 2624 160 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 208 2624 -192 ) ( 208 2624 160 ) ( 208 2640 160 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 208 2640 -192 ) ( 208 2640 160 ) ( 112 2640 160 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 112 2640 -192 ) ( 112 2624 -192 ) ( 208 2624 -192 ) TWALL3_1 64 48 0 1.000000 1.000000
+( 0 2608 -96 ) ( 0 2656 -96 ) ( 224 2656 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -16 2632 -192 ) ( -16 2632 160 ) ( -16 2616 160 ) TECH10_1 144 48 0 1.000000 1.000000
+( 96 2624 -192 ) ( 96 2624 160 ) ( 112 2624 160 ) TECH10_1 144 48 0 1.000000 1.000000
+( 112 2640 -192 ) ( 112 2640 160 ) ( 96 2640 160 ) TECH10_1 144 48 0 1.000000 1.000000
+( 112 2624 160 ) ( 96 2624 160 ) ( 96 2640 160 ) TECH10_1 144 48 0 1.000000 1.000000
+( 96 2640 -192 ) ( 96 2624 -192 ) ( 112 2624 -192 ) TECH10_1 144 48 0 1.000000 1.000000
+( 0 2608 -96 ) ( 0 2608 -80 ) ( 0 2656 -80 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 96 2624 -192 ) ( 96 2624 160 ) ( 112 2624 160 ) TECH10_1 144 48 0 1.000000 1.000000
+( 112 2624 -192 ) ( 112 2624 160 ) ( 112 2640 160 ) TECH10_1 144 48 0 1.000000 1.000000
+( 112 2640 -192 ) ( 112 2640 160 ) ( 96 2640 160 ) TECH10_1 144 48 0 1.000000 1.000000
+( 112 2624 160 ) ( 96 2624 160 ) ( 96 2640 160 ) TECH10_1 144 48 0 1.000000 1.000000
+( 0 2656 -80 ) ( 0 2608 -80 ) ( 0 2608 -96 ) TECH10_1 144 48 0 1.000000 1.000000
+( 224 2656 -80 ) ( 0 2656 -80 ) ( 0 2608 -80 ) TECH10_1 144 48 0 1.000000 1.000000
+}
+{
+( 96 2624 -192 ) ( 96 2624 160 ) ( 112 2624 160 ) TECH10_1 144 48 0 1.000000 1.000000
+( 112 2624 -192 ) ( 112 2624 160 ) ( 112 2640 160 ) TECH10_1 144 48 0 1.000000 1.000000
+( 112 2640 -192 ) ( 112 2640 160 ) ( 96 2640 160 ) TECH10_1 144 48 0 1.000000 1.000000
+( 96 2640 -192 ) ( 96 2624 -192 ) ( 112 2624 -192 ) TECH10_1 144 48 0 1.000000 1.000000
+( 0 2656 -80 ) ( 0 2608 -80 ) ( 0 2608 -96 ) TECH10_1 144 48 0 1.000000 1.000000
+( 0 2608 -96 ) ( 0 2656 -96 ) ( 224 2656 -96 ) TECH10_1 144 48 0 1.000000 1.000000
+}
+{
+( 320 2624 -192 ) ( 320 2624 160 ) ( 336 2624 160 ) TECH10_1 176 48 0 1.000000 1.000000
+( 336 2624 -192 ) ( 336 2624 160 ) ( 336 2640 160 ) TECH10_1 176 48 0 1.000000 1.000000
+( 336 2640 -192 ) ( 336 2640 160 ) ( 320 2640 160 ) TECH10_1 176 48 0 1.000000 1.000000
+( 336 2624 160 ) ( 320 2624 160 ) ( 320 2640 160 ) TECH10_1 176 48 0 1.000000 1.000000
+( 320 2640 -192 ) ( 320 2624 -192 ) ( 336 2624 -192 ) TECH10_1 176 48 0 1.000000 1.000000
+( 320 2672 -96 ) ( 320 2672 -80 ) ( 320 2624 -80 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 208 2632 -192 ) ( 208 2632 160 ) ( 208 2616 160 ) TECH10_1 176 48 0 1.000000 1.000000
+( 320 2624 -192 ) ( 320 2624 160 ) ( 336 2624 160 ) TECH10_1 176 48 0 1.000000 1.000000
+( 336 2640 -192 ) ( 336 2640 160 ) ( 320 2640 160 ) TECH10_1 176 48 0 1.000000 1.000000
+( 336 2624 160 ) ( 320 2624 160 ) ( 320 2640 160 ) TECH10_1 176 48 0 1.000000 1.000000
+( 320 2624 -80 ) ( 320 2672 -80 ) ( 320 2672 -96 ) TECH10_1 176 48 0 1.000000 1.000000
+( 224 2656 -80 ) ( 0 2656 -80 ) ( 0 2608 -80 ) TECH10_1 176 48 0 1.000000 1.000000
+}
+{
+( 208 2632 -192 ) ( 208 2632 160 ) ( 208 2616 160 ) TECH10_1 176 48 0 1.000000 1.000000
+( 320 2624 -192 ) ( 320 2624 160 ) ( 336 2624 160 ) TECH10_1 176 48 0 1.000000 1.000000
+( 336 2640 -192 ) ( 336 2640 160 ) ( 320 2640 160 ) TECH10_1 176 48 0 1.000000 1.000000
+( 320 2640 -192 ) ( 320 2624 -192 ) ( 336 2624 -192 ) TECH10_1 176 48 0 1.000000 1.000000
+( 320 2624 -80 ) ( 320 2672 -80 ) ( 320 2672 -96 ) TECH10_1 176 48 0 1.000000 1.000000
+( 0 2608 -96 ) ( 0 2656 -96 ) ( 224 2656 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -96 2640 160 ) ( -96 2624 160 ) ( -96 2624 -96 ) TECH08_1 48 176 0 1.000000 1.000000
+( -16 2640 160 ) ( -96 2640 160 ) ( -96 2640 -96 ) TECH08_1 48 176 0 1.000000 1.000000
+( -16 2624 160 ) ( -16 2640 160 ) ( -16 2640 -96 ) TECH08_1 48 176 0 1.000000 1.000000
+( -96 2624 160 ) ( -16 2624 160 ) ( -16 2624 -96 ) TECH08_1 48 176 0 1.000000 1.000000
+( -96 2624 160 ) ( -96 2640 160 ) ( -16 2640 160 ) TECH08_1 48 176 0 1.000000 1.000000
+( -16 2640 -96 ) ( -96 2640 -96 ) ( -96 2624 -96 ) TECH08_1 48 176 0 1.000000 1.000000
+}
+{
+( -112 2656 160 ) ( -112 2624 160 ) ( -112 2624 128 ) TWALL2_6 0 0 0 1.000000 1.000000
+( -96 2848 160 ) ( -112 2848 160 ) ( -112 2848 128 ) TWALL2_6 0 0 0 1.000000 1.000000
+( -96 2624 160 ) ( -96 2656 160 ) ( -96 2656 128 ) TWALL2_6 0 0 0 1.000000 1.000000
+( -112 2624 160 ) ( -96 2624 160 ) ( -96 2624 128 ) TWALL2_6 0 0 0 1.000000 1.000000
+( -112 2624 160 ) ( -112 2656 160 ) ( -96 2656 160 ) TWALL2_6 0 0 0 1.000000 1.000000
+( -96 2656 128 ) ( -112 2656 128 ) ( -112 2624 128 ) TWALL2_6 0 0 0 1.000000 1.000000
+}
+{
+( -304 2848 160 ) ( -304 2832 160 ) ( -304 2832 128 ) TWALL2_6 0 0 0 1.000000 1.000000
+( -112 2848 160 ) ( -304 2848 160 ) ( -304 2848 128 ) TWALL2_6 0 0 0 1.000000 1.000000
+( -112 2832 160 ) ( -112 2848 160 ) ( -112 2848 128 ) TWALL2_6 0 0 0 1.000000 1.000000
+( -304 2832 160 ) ( -112 2832 160 ) ( -112 2832 128 ) TWALL2_6 0 0 0 1.000000 1.000000
+( -304 2832 160 ) ( -304 2848 160 ) ( -112 2848 160 ) TWALL2_6 0 0 0 1.000000 1.000000
+( -112 2848 128 ) ( -304 2848 128 ) ( -304 2832 128 ) TWALL2_6 0 0 0 1.000000 1.000000
+}
+{
+( 320 3008 -96 ) ( 320 2992 -96 ) ( 320 2992 -112 ) TECH10_1 144 48 0 1.000000 1.000000
+( 336 3008 -96 ) ( 320 3008 -96 ) ( 320 3008 -112 ) TECH10_1 144 48 0 1.000000 1.000000
+( 336 2992 -96 ) ( 336 3008 -96 ) ( 336 3008 -112 ) TECH10_1 144 48 0 1.000000 1.000000
+( 336 2640 -96 ) ( 352 2640 -96 ) ( 352 2640 -112 ) TECH10_1 144 48 0 1.000000 1.000000
+( 320 2992 -96 ) ( 320 3008 -96 ) ( 336 3008 -96 ) TECH10_1 144 48 0 1.000000 1.000000
+( 336 3008 -192 ) ( 320 3008 -192 ) ( 320 2992 -192 ) TECH10_1 144 48 0 1.000000 1.000000
+}
+{
+( 320 3008 -80 ) ( 320 2640 -80 ) ( 320 2640 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( 576 3008 -80 ) ( 448 3008 -80 ) ( 448 3008 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( 576 2640 -80 ) ( 576 3008 -80 ) ( 576 3008 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 2640 -80 ) ( 576 2640 -80 ) ( 576 2640 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( 448 2640 -80 ) ( 448 3008 -80 ) ( 576 3008 -80 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 576 3008 -96 ) ( 448 3008 -96 ) ( 448 2640 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 320 3008 160 ) ( 320 2984 160 ) ( 320 2984 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 336 3008 160 ) ( 320 3008 160 ) ( 320 3008 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 352 2984 160 ) ( 352 3008 160 ) ( 352 3008 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 312 2640 160 ) ( 328 2640 160 ) ( 328 2640 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 320 2984 160 ) ( 320 3008 160 ) ( 336 3008 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 336 3008 128 ) ( 320 3008 128 ) ( 320 2984 128 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -32 3008 160 ) ( -32 2984 160 ) ( -32 2984 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( -16 3008 160 ) ( -32 3008 160 ) ( -32 3008 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2984 160 ) ( 0 3008 160 ) ( 0 3008 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( -40 2640 160 ) ( -24 2640 160 ) ( -24 2640 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( -32 2984 160 ) ( -32 3008 160 ) ( -16 3008 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -16 3008 128 ) ( -32 3008 128 ) ( -32 2984 128 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 320 3008 160 ) ( 296 3008 160 ) ( 296 3008 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 320 2992 160 ) ( 320 3008 160 ) ( 320 3008 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 296 2976 160 ) ( 320 2976 160 ) ( 320 2976 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 3016 160 ) ( 0 3000 160 ) ( 0 3000 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 296 3008 160 ) ( 320 3008 160 ) ( 320 2992 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 320 2992 128 ) ( 320 3008 128 ) ( 296 3008 128 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 320 2672 160 ) ( 296 2672 160 ) ( 296 2672 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 320 2656 160 ) ( 320 2672 160 ) ( 320 2672 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 296 2640 160 ) ( 320 2640 160 ) ( 320 2640 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2680 160 ) ( 0 2664 160 ) ( 0 2664 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 296 2672 160 ) ( 320 2672 160 ) ( 320 2656 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 320 2656 128 ) ( 320 2672 128 ) ( 296 2672 128 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 296 2640 128 ) ( 296 2640 160 ) ( 56 3008 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 280 2640 160 ) ( 296 2640 160 ) ( 296 2640 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 264 2640 160 ) ( 264 2640 128 ) ( 24 3008 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 64 3008 160 ) ( 48 3008 160 ) ( 48 3008 -192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 296 2640 160 ) ( 264 2640 160 ) ( 24 3008 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 264 2640 128 ) ( 296 2640 128 ) ( 56 3008 128 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 264 3008 160 ) ( 24 2640 160 ) ( 24 2640 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 24 2640 -192 ) ( 24 2640 160 ) ( 40 2640 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 296 3008 128 ) ( 56 2640 128 ) ( 56 2640 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 272 3008 -192 ) ( 272 3008 160 ) ( 256 3008 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 296 3008 160 ) ( 56 2640 160 ) ( 24 2640 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 264 3008 128 ) ( 24 2640 128 ) ( 56 2640 128 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 120 2880 160 ) ( 120 2768 160 ) ( 120 2768 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 192 2880 160 ) ( 128 2880 160 ) ( 128 2880 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 192 2768 160 ) ( 192 2880 160 ) ( 192 2880 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 128 2768 160 ) ( 192 2768 160 ) ( 192 2768 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 128 2768 160 ) ( 128 2880 160 ) ( 192 2880 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 192 2880 128 ) ( 128 2880 128 ) ( 128 2768 128 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -16 2696 192 ) ( -16 2672 192 ) ( -16 2672 160 ) SKY4 0 0 0 1.000000 1.000000
+( 304 2976 192 ) ( 280 2976 192 ) ( 280 2976 160 ) SKY4 0 0 0 1.000000 1.000000
+( 0 2960 192 ) ( 0 2984 192 ) ( 0 2984 160 ) SKY4 0 0 0 1.000000 1.000000
+( -16 2672 192 ) ( 8 2672 192 ) ( 8 2672 160 ) SKY4 0 0 0 1.000000 1.000000
+( 280 2952 256 ) ( 280 2976 256 ) ( 304 2976 256 ) SKY4 0 0 0 1.000000 1.000000
+( 304 2976 160 ) ( 280 2976 160 ) ( 280 2952 160 ) SKY4 0 0 0 1.000000 1.000000
+}
+{
+( 320 2696 192 ) ( 320 2672 192 ) ( 320 2672 160 ) SKY4 0 0 0 1.000000 1.000000
+( 640 2976 192 ) ( 616 2976 192 ) ( 616 2976 160 ) SKY4 0 0 0 1.000000 1.000000
+( 336 2960 192 ) ( 336 2984 192 ) ( 336 2984 160 ) SKY4 0 0 0 1.000000 1.000000
+( 320 2672 192 ) ( 344 2672 192 ) ( 344 2672 160 ) SKY4 0 0 0 1.000000 1.000000
+( 616 2952 256 ) ( 616 2976 256 ) ( 640 2976 256 ) SKY4 0 0 0 1.000000 1.000000
+( 640 2976 160 ) ( 616 2976 160 ) ( 616 2952 160 ) SKY4 0 0 0 1.000000 1.000000
+}
+{
+( 56 2992 192 ) ( 32 2992 192 ) ( 32 2992 160 ) SKY4 0 0 0 1.000000 1.000000
+( 336 2672 192 ) ( 336 2696 192 ) ( 336 2696 160 ) SKY4 0 0 0 1.000000 1.000000
+( 320 2976 192 ) ( 344 2976 192 ) ( 344 2976 160 ) SKY4 0 0 0 1.000000 1.000000
+( -16 2984 192 ) ( -16 2960 192 ) ( -16 2960 160 ) SKY4 0 0 0 1.000000 1.000000
+( 312 2696 256 ) ( 336 2696 256 ) ( 336 2672 256 ) SKY4 0 0 0 1.000000 1.000000
+( 336 2672 160 ) ( 336 2696 160 ) ( 312 2696 160 ) SKY4 0 0 0 1.000000 1.000000
+}
+{
+( 56 2672 192 ) ( 32 2672 192 ) ( 32 2672 160 ) SKY4 0 0 0 1.000000 1.000000
+( 336 2352 192 ) ( 336 2376 192 ) ( 336 2376 160 ) SKY4 0 0 0 1.000000 1.000000
+( 320 2656 192 ) ( 344 2656 192 ) ( 344 2656 160 ) SKY4 0 0 0 1.000000 1.000000
+( -16 2664 192 ) ( -16 2640 192 ) ( -16 2640 160 ) SKY4 0 0 0 1.000000 1.000000
+( 312 2376 256 ) ( 336 2376 256 ) ( 336 2352 256 ) SKY4 0 0 0 1.000000 1.000000
+( 336 2352 160 ) ( 336 2376 160 ) ( 312 2376 160 ) SKY4 0 0 0 1.000000 1.000000
+}
+{
+( -16 2704 256 ) ( -16 2656 256 ) ( -16 2656 160 ) SKY4 0 0 0 1.000000 1.000000
+( 336 2992 256 ) ( 304 2992 256 ) ( 304 2992 160 ) SKY4 0 0 0 1.000000 1.000000
+( 336 2944 256 ) ( 336 2992 256 ) ( 336 2992 160 ) SKY4 0 0 0 1.000000 1.000000
+( -16 2656 256 ) ( 16 2656 256 ) ( 16 2656 160 ) SKY4 0 0 0 1.000000 1.000000
+( -16 2656 256 ) ( -16 2704 256 ) ( 16 2704 256 ) SKY4 0 0 0 1.000000 1.000000
+( 16 2704 240 ) ( -16 2704 240 ) ( -16 2656 240 ) SKY4 0 0 0 1.000000 1.000000
+}
+{
+( -440 2984 -16 ) ( -440 3008 -16 ) ( -280 3008 -16 ) TLIGHT11 0 48 0 1.000000 1.000000
+( -440 3008 -80 ) ( -440 2984 -80 ) ( -280 2984 -80 ) TLIGHT11 0 48 0 1.000000 1.000000
+( -280 3008 -80 ) ( -280 3000 -16 ) ( -296 3008 -80 ) TLIGHT11 0 48 0 1.000000 1.000000
+( -280 2992 -16 ) ( -280 2984 -80 ) ( -296 2992 -16 ) TLIGHT11 0 48 0 1.000000 1.000000
+( -304 2928 -80 ) ( -296 2912 -16 ) ( -304 2912 -80 ) TLIGHT11 0 48 0 1.000000 1.000000
+( -288 2928 -16 ) ( -280 2912 -80 ) ( -288 2912 -16 ) TLIGHT11 0 48 0 1.000000 1.000000
+}
+{
+( -304 2872 176 ) ( -304 2848 176 ) ( -304 2848 144 ) TECH01_6 0 0 0 1.000000 1.000000
+( -216 3008 176 ) ( -240 3008 176 ) ( -240 3008 144 ) TECH01_6 0 0 0 1.000000 1.000000
+( -32 3000 176 ) ( -32 3024 176 ) ( -32 3024 144 ) TECH01_6 0 0 0 1.000000 1.000000
+( -304 2848 176 ) ( -280 2848 176 ) ( -280 2848 144 ) TECH01_6 0 0 0 1.000000 1.000000
+( -304 2848 176 ) ( -304 2872 176 ) ( -280 2872 176 ) TECH01_6 0 0 0 1.000000 1.000000
+( -280 2872 160 ) ( -304 2872 160 ) ( -304 2848 160 ) TECH01_6 0 0 0 1.000000 1.000000
+}
+{
+( -96 2848 176 ) ( -96 2640 176 ) ( -96 2640 160 ) TECH01_6 0 0 0 1.000000 1.000000
+( -32 2848 176 ) ( -96 2848 176 ) ( -96 2848 160 ) TECH01_6 0 0 0 1.000000 1.000000
+( -32 2640 176 ) ( -32 2848 176 ) ( -32 2848 160 ) TECH01_6 0 0 0 1.000000 1.000000
+( -96 2640 176 ) ( -32 2640 176 ) ( -32 2640 160 ) TECH01_6 0 0 0 1.000000 1.000000
+( -96 2640 176 ) ( -96 2848 176 ) ( -32 2848 176 ) TECH01_6 0 0 0 1.000000 1.000000
+( -32 2848 160 ) ( -96 2848 160 ) ( -96 2640 160 ) TECH01_6 0 0 0 1.000000 1.000000
+}
+{
+( -16 3008 -160 ) ( -16 2960 -160 ) ( -16 2960 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 16 3008 -160 ) ( 0 3008 -160 ) ( 0 3008 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 16 2960 -160 ) ( 16 3008 -160 ) ( 16 3008 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2944 -160 ) ( 16 2944 -160 ) ( 16 2944 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2960 -96 ) ( 0 3008 -96 ) ( 16 3008 -96 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 16 3008 -176 ) ( 0 3008 -176 ) ( 0 2960 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 16 3008 -160 ) ( 16 2960 -160 ) ( 16 2960 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 48 3008 -160 ) ( 32 3008 -160 ) ( 32 3008 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 48 2960 -160 ) ( 48 3008 -160 ) ( 48 3008 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 32 2944 -160 ) ( 48 2944 -160 ) ( 48 2944 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 32 2960 -112 ) ( 32 3008 -112 ) ( 48 3008 -112 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 48 3008 -176 ) ( 32 3008 -176 ) ( 32 2960 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 80 2960 -176 ) ( 80 2960 -160 ) ( 80 3008 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 64 3008 -176 ) ( 64 3008 -160 ) ( 48 3008 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 48 3008 -176 ) ( 48 3008 -160 ) ( 48 2960 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 48 2944 -176 ) ( 48 2944 -160 ) ( 64 2944 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 48 3008 -128 ) ( 64 3008 -128 ) ( 64 2960 -128 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 64 2960 -176 ) ( 64 3008 -176 ) ( 48 3008 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 112 2960 -176 ) ( 112 2960 -160 ) ( 112 3008 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 96 3008 -176 ) ( 96 3008 -160 ) ( 80 3008 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 80 3008 -176 ) ( 80 3008 -160 ) ( 80 2960 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 80 2944 -176 ) ( 80 2944 -160 ) ( 96 2944 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 80 3008 -144 ) ( 96 3008 -144 ) ( 96 2960 -144 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 96 2960 -176 ) ( 96 3008 -176 ) ( 80 3008 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 144 2960 -176 ) ( 144 2960 -160 ) ( 144 3008 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 128 3008 -176 ) ( 128 3008 -160 ) ( 112 3008 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 48 3008 -176 ) ( 48 3008 -160 ) ( 48 2960 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 104 2912 -176 ) ( 104 2912 -160 ) ( 120 2912 -160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 112 3008 -160 ) ( 128 3008 -160 ) ( 128 2960 -160 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 128 2960 -176 ) ( 128 3008 -176 ) ( 112 3008 -176 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -16 3008 -160 ) ( -16 2960 -160 ) ( -16 2960 -176 ) *SLIME0 0 0 0 1.000000 1.000000
+( 16 3008 -160 ) ( -16 3008 -160 ) ( -16 3008 -176 ) *SLIME0 0 0 0 1.000000 1.000000
+( 336 2640 -160 ) ( 336 2688 -160 ) ( 336 2688 -176 ) *SLIME0 0 0 0 1.000000 1.000000
+( 304 2640 -160 ) ( 336 2640 -160 ) ( 336 2640 -176 ) *SLIME0 0 0 0 1.000000 1.000000
+( -16 2960 -136 ) ( -16 3008 -136 ) ( 16 3008 -136 ) *SLIME0 0 0 0 1.000000 1.000000
+( 16 3008 -176 ) ( -16 3008 -176 ) ( -16 2960 -176 ) *SLIME0 0 0 0 1.000000 1.000000
+}
+{
+( 464 3024 160 ) ( 464 3008 160 ) ( 464 3008 -192 ) TECH11_2 208 48 0 1.000000 1.000000
+( 512 3024 160 ) ( 464 3024 160 ) ( 464 3024 -192 ) TECH11_2 208 48 0 1.000000 1.000000
+( 544 3008 160 ) ( 544 3024 160 ) ( 544 3024 -192 ) TECH11_2 208 48 0 1.000000 1.000000
+( 464 3008 160 ) ( 464 3024 160 ) ( 512 3024 160 ) TECH11_2 208 48 0 1.000000 1.000000
+( 512 3024 -96 ) ( 464 3024 -96 ) ( 464 3008 -96 ) TECH11_2 208 48 0 1.000000 1.000000
+( 512 2960 -192 ) ( 464 3008 -192 ) ( 512 2960 -176 ) TECH11_2 208 48 0 1.000000 1.000000
+}
+{
+( 464 2640 -192 ) ( 464 2640 160 ) ( 464 2624 160 ) TECH09_3 176 48 0 1.000000 1.000000
+( 464 2624 -192 ) ( 464 2624 160 ) ( 512 2624 160 ) TECH09_3 176 48 0 1.000000 1.000000
+( 544 2624 -192 ) ( 544 2624 160 ) ( 544 2640 160 ) TECH09_3 176 48 0 1.000000 1.000000
+( 512 2624 160 ) ( 464 2624 160 ) ( 464 2640 160 ) TECH09_3 176 48 0 1.000000 1.000000
+( 464 2640 -96 ) ( 464 2624 -96 ) ( 512 2624 -96 ) TECH09_3 176 48 0 1.000000 1.000000
+( 512 2688 -176 ) ( 464 2640 -192 ) ( 512 2688 -192 ) TECH09_3 176 48 0 1.000000 1.000000
+}
+{
+( 544 2944 160 ) ( 544 2896 160 ) ( 544 2896 -96 ) TECH11_2 208 48 0 1.000000 1.000000
+( 560 2944 160 ) ( 544 2944 160 ) ( 544 2944 -96 ) TECH11_2 208 48 0 1.000000 1.000000
+( 560 2896 160 ) ( 560 2944 160 ) ( 560 2944 -96 ) TECH11_2 208 48 0 1.000000 1.000000
+( 544 2880 160 ) ( 560 2880 160 ) ( 560 2880 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 544 2896 160 ) ( 544 2944 160 ) ( 560 2944 160 ) TECH11_2 208 48 0 1.000000 1.000000
+( 560 2944 -96 ) ( 544 2944 -96 ) ( 544 2896 -96 ) TECH11_2 208 48 0 1.000000 1.000000
+}
+{
+( 544 2752 160 ) ( 544 2704 160 ) ( 544 2704 -96 ) TECH09_3 176 48 0 1.000000 1.000000
+( 560 2752 160 ) ( 544 2752 160 ) ( 544 2752 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 560 2704 160 ) ( 560 2752 160 ) ( 560 2752 -96 ) TECH09_3 176 48 0 1.000000 1.000000
+( 544 2688 160 ) ( 560 2688 160 ) ( 560 2688 -96 ) TECH09_3 176 48 0 1.000000 1.000000
+( 544 2704 160 ) ( 544 2752 160 ) ( 560 2752 160 ) TECH09_3 176 48 0 1.000000 1.000000
+( 560 2752 -96 ) ( 544 2752 -96 ) ( 544 2704 -96 ) TECH09_3 176 48 0 1.000000 1.000000
+}
+{
+( 352 3008 160 ) ( 352 2640 160 ) ( 352 2640 128 ) TECH01_6 0 0 0 1.000000 1.000000
+( 544 3008 160 ) ( 480 3008 160 ) ( 480 3008 128 ) TECH01_6 0 0 0 1.000000 1.000000
+( 544 2640 160 ) ( 544 3008 160 ) ( 544 3008 128 ) TECH01_6 0 0 0 1.000000 1.000000
+( 480 2640 160 ) ( 544 2640 160 ) ( 544 2640 128 ) TECH01_6 0 0 0 1.000000 1.000000
+( 480 2640 160 ) ( 480 3008 160 ) ( 544 3008 160 ) TECH01_6 0 0 0 1.000000 1.000000
+( 544 3008 144 ) ( 480 3008 144 ) ( 480 2640 144 ) TECH01_6 0 0 0 1.000000 1.000000
+}
+{
+( 512 2816 160 ) ( 512 2816 96 ) ( 544 2880 96 ) TECH04_1 0 0 0 1.000000 1.000000
+( 560 2880 160 ) ( 544 2880 160 ) ( 544 2880 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 560 2752 160 ) ( 560 2880 160 ) ( 560 2880 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 512 2816 96 ) ( 512 2816 160 ) ( 560 2816 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 544 2752 160 ) ( 544 2880 160 ) ( 560 2880 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 560 2880 96 ) ( 544 2880 96 ) ( 544 2752 96 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 544 2752 96 ) ( 512 2816 96 ) ( 512 2816 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 544 2752 128 ) ( 544 2752 160 ) ( 560 2752 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 560 2752 128 ) ( 560 2752 160 ) ( 560 2880 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 560 2816 160 ) ( 512 2816 160 ) ( 512 2816 96 ) TECH04_1 0 0 0 1.000000 1.000000
+( 560 2752 160 ) ( 544 2752 160 ) ( 544 2880 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 544 2880 96 ) ( 544 2752 96 ) ( 560 2752 96 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 544 2880 -80 ) ( 544 2752 -80 ) ( 544 2752 -96 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 608 2896 -80 ) ( 544 2896 -80 ) ( 544 2896 -96 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 896 2752 -80 ) ( 896 2880 -80 ) ( 896 2880 -96 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 544 2736 -80 ) ( 608 2736 -80 ) ( 608 2736 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( 544 2752 -80 ) ( 544 2880 -80 ) ( 608 2880 -80 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 608 2880 -96 ) ( 544 2880 -96 ) ( 544 2752 -96 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 560 2896 160 ) ( 560 2880 160 ) ( 560 2880 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 608 2912 160 ) ( 560 2912 160 ) ( 560 2912 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 608 2880 160 ) ( 608 2896 160 ) ( 608 2896 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 560 2880 160 ) ( 608 2880 160 ) ( 608 2880 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 560 2880 160 ) ( 560 2896 160 ) ( 608 2896 160 ) TECH04_3 0 0 0 1.000000 1.000000
+( 608 2896 -96 ) ( 560 2896 -96 ) ( 560 2880 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 560 2752 160 ) ( 560 2736 160 ) ( 560 2736 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 608 2752 160 ) ( 560 2752 160 ) ( 560 2752 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 608 2736 160 ) ( 608 2752 160 ) ( 608 2752 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 560 2720 160 ) ( 608 2720 160 ) ( 608 2720 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 560 2736 160 ) ( 560 2752 160 ) ( 608 2752 160 ) TECH04_3 0 0 0 1.000000 1.000000
+( 608 2752 -96 ) ( 560 2752 -96 ) ( 560 2736 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 560 2880 160 ) ( 560 2752 160 ) ( 560 2752 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 608 2880 160 ) ( 560 2880 160 ) ( 560 2880 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 608 2752 160 ) ( 608 2880 160 ) ( 608 2880 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 560 2752 160 ) ( 608 2752 160 ) ( 608 2752 -96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 560 2752 160 ) ( 560 2880 160 ) ( 608 2880 160 ) TECH04_3 0 0 0 1.000000 1.000000
+( 608 2880 96 ) ( 560 2880 96 ) ( 560 2752 96 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 544 2880 72 ) ( 608 2880 72 ) ( 608 2880 96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 544 2880 96 ) ( 608 2880 96 ) ( 608 2856 96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 608 2856 96 ) ( 608 2880 96 ) ( 608 2880 72 ) TECH04_3 0 0 0 1.000000 1.000000
+( 544 2880 72 ) ( 544 2880 96 ) ( 544 2856 96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 560 2856 96 ) ( 544 2880 72 ) ( 544 2856 96 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 608 2752 96 ) ( 608 2752 72 ) ( 544 2752 72 ) TECH04_3 0 0 0 1.000000 1.000000
+( 608 2776 96 ) ( 608 2752 96 ) ( 544 2752 96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 608 2752 72 ) ( 608 2752 96 ) ( 608 2776 96 ) TECH04_3 0 0 0 1.000000 1.000000
+( 544 2776 96 ) ( 544 2752 96 ) ( 544 2752 72 ) TECH04_3 0 0 0 1.000000 1.000000
+( 544 2776 96 ) ( 544 2752 72 ) ( 560 2776 96 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 608 2912 160 ) ( 608 2896 160 ) ( 608 2896 -96 ) TECH08_1 0 0 0 1.000000 1.000000
+( 640 2912 160 ) ( 608 2912 160 ) ( 608 2912 -96 ) TECH08_1 0 0 0 1.000000 1.000000
+( 896 2904 160 ) ( 896 2920 160 ) ( 896 2920 -96 ) TECH08_1 0 0 0 1.000000 1.000000
+( 608 2896 160 ) ( 640 2896 160 ) ( 640 2896 -96 ) TECH08_1 0 0 0 1.000000 1.000000
+( 608 2896 160 ) ( 608 2912 160 ) ( 640 2912 160 ) TECH08_1 0 0 0 1.000000 1.000000
+( 640 2912 -96 ) ( 608 2912 -96 ) ( 608 2896 -96 ) TECH08_1 0 0 0 1.000000 1.000000
+}
+{
+( 608 2736 160 ) ( 608 2720 160 ) ( 608 2720 -96 ) TECH08_1 0 0 0 1.000000 1.000000
+( 768 2736 160 ) ( 608 2736 160 ) ( 608 2736 -96 ) TECH08_1 0 0 0 1.000000 1.000000
+( 768 2720 160 ) ( 768 2736 160 ) ( 768 2736 -96 ) TECH08_1 208 0 0 1.000000 1.000000
+( 608 2720 160 ) ( 768 2720 160 ) ( 768 2720 -96 ) TECH08_1 0 0 0 1.000000 1.000000
+( 608 2720 160 ) ( 608 2736 160 ) ( 768 2736 160 ) TECH08_1 0 0 0 1.000000 1.000000
+( 768 2736 -96 ) ( 608 2736 -96 ) ( 608 2720 -96 ) TECH08_1 0 0 0 1.000000 1.000000
+}
+{
+( 608 2752 160 ) ( 608 2736 160 ) ( 608 2736 -96 ) CLIP 0 0 0 1.000000 1.000000
+( 608 2736 160 ) ( 624 2736 160 ) ( 624 2736 -96 ) CLIP 0 0 0 1.000000 1.000000
+( 608 2736 160 ) ( 608 2752 160 ) ( 624 2752 160 ) CLIP 0 0 0 1.000000 1.000000
+( 624 2752 -96 ) ( 608 2752 -96 ) ( 608 2736 -96 ) CLIP 0 0 0 1.000000 1.000000
+( 608 2752 -96 ) ( 624 2736 -96 ) ( 608 2752 -80 ) CLIP 0 0 0 1.000000 1.000000
+}
+{
+( 608 2896 -96 ) ( 608 2896 160 ) ( 608 2880 160 ) CLIP 0 0 0 1.000000 1.000000
+( 624 2896 -96 ) ( 624 2896 160 ) ( 608 2896 160 ) CLIP 0 0 0 1.000000 1.000000
+( 624 2880 160 ) ( 608 2880 160 ) ( 608 2896 160 ) CLIP 0 0 0 1.000000 1.000000
+( 608 2896 -96 ) ( 608 2880 -96 ) ( 624 2880 -96 ) CLIP 0 0 0 1.000000 1.000000
+( 608 2880 -80 ) ( 624 2896 -96 ) ( 608 2880 -96 ) CLIP 0 0 0 1.000000 1.000000
+}
+{
+( 816 2896 96 ) ( 816 2896 120 ) ( 560 2896 120 ) TECH01_7 0 0 90 -1.000000 1.000000
+( 816 2896 120 ) ( 816 2872 120 ) ( 560 2872 120 ) TECH01_7 0 0 90 -1.000000 1.000000
+( 896 2888 120 ) ( 896 2888 96 ) ( 896 2864 96 ) TECH01_7 0 0 90 -1.000000 1.000000
+( 608 2872 96 ) ( 608 2896 96 ) ( 608 2896 120 ) TECH01_7 0 0 90 -1.000000 1.000000
+( 560 2896 96 ) ( 560 2872 120 ) ( 576 2896 96 ) TECH01_7 0 0 90 -1.000000 1.000000
+}
+{
+( 560 2736 120 ) ( 816 2736 120 ) ( 816 2736 96 ) TECH01_7 0 0 0 1.000000 1.000000
+( 560 2760 120 ) ( 816 2760 120 ) ( 816 2736 120 ) TECH01_7 0 0 0 1.000000 1.000000
+( 608 2736 120 ) ( 608 2736 96 ) ( 608 2760 96 ) TECH01_7 0 0 0 1.000000 1.000000
+( 576 2736 96 ) ( 560 2760 120 ) ( 560 2736 96 ) TECH01_7 0 0 0 1.000000 1.000000
+( 792 2760 96 ) ( 768 2736 96 ) ( 792 2760 112 ) TECH01_7 0 0 0 1.000000 1.000000
+}
+{
+( 608 2896 136 ) ( 608 2864 136 ) ( 608 2864 112 ) TECH04_3 0 0 0 1.000000 1.000000
+( 624 2896 136 ) ( 608 2896 136 ) ( 608 2896 112 ) TECH04_3 0 0 0 1.000000 1.000000
+( 896 2736 136 ) ( 896 2768 136 ) ( 896 2768 112 ) TECH04_3 0 0 0 1.000000 1.000000
+( 800 2736 136 ) ( 816 2736 136 ) ( 816 2736 112 ) TECH04_3 0 0 0 1.000000 1.000000
+( 608 2864 136 ) ( 608 2896 136 ) ( 624 2896 136 ) TECH04_3 0 0 0 1.000000 1.000000
+( 624 2896 120 ) ( 608 2896 120 ) ( 608 2864 120 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 336 3024 160 ) ( 336 3008 160 ) ( 336 3008 -192 ) TECH08_1 240 176 0 1.000000 1.000000
+( 400 3024 160 ) ( 336 3024 160 ) ( 336 3024 -192 ) TECH08_1 240 176 0 1.000000 1.000000
+( 416 3008 160 ) ( 416 3024 160 ) ( 416 3024 -192 ) TECH08_1 240 176 0 1.000000 1.000000
+( 336 3008 160 ) ( 400 3008 160 ) ( 400 3008 -192 ) TECH08_1 240 176 0 1.000000 1.000000
+( 336 3008 160 ) ( 336 3024 160 ) ( 400 3024 160 ) TECH08_1 240 176 0 1.000000 1.000000
+( 400 3024 -96 ) ( 336 3024 -96 ) ( 336 3008 -96 ) TECH08_1 240 176 0 1.000000 1.000000
+}
+{
+( 336 2640 160 ) ( 336 2624 160 ) ( 336 2624 -192 ) TECH08_1 240 176 0 1.000000 1.000000
+( 400 2640 160 ) ( 336 2640 160 ) ( 336 2640 -192 ) TECH08_1 240 176 0 1.000000 1.000000
+( 416 2624 160 ) ( 416 2640 160 ) ( 416 2640 -192 ) TECH08_1 240 176 0 1.000000 1.000000
+( 336 2624 160 ) ( 400 2624 160 ) ( 400 2624 -192 ) TECH08_1 240 176 0 1.000000 1.000000
+( 336 2624 160 ) ( 336 2640 160 ) ( 400 2640 160 ) TECH08_1 240 176 0 1.000000 1.000000
+( 400 2640 -96 ) ( 336 2640 -96 ) ( 336 2624 -96 ) TECH08_1 240 176 0 1.000000 1.000000
+}
+{
+( 416 2648 160 ) ( 416 2632 160 ) ( 416 2632 -96 ) TECH10_3 0 176 0 -1.000000 1.000000
+( 464 2640 160 ) ( 448 2640 160 ) ( 448 2640 -96 ) TECH10_3 0 176 0 -1.000000 1.000000
+( 464 2624 160 ) ( 464 2640 160 ) ( 464 2640 -96 ) TECH10_3 0 176 0 -1.000000 1.000000
+( 448 2624 160 ) ( 464 2624 160 ) ( 464 2624 -96 ) TECH10_3 0 176 0 -1.000000 1.000000
+( 448 2624 160 ) ( 448 2640 160 ) ( 464 2640 160 ) TECH10_3 0 176 0 -1.000000 1.000000
+( 464 2640 -96 ) ( 448 2640 -96 ) ( 448 2624 -96 ) TECH10_3 0 176 0 -1.000000 1.000000
+}
+{
+( 416 3032 160 ) ( 416 3016 160 ) ( 416 3016 -96 ) TECH10_3 0 176 0 -1.000000 1.000000
+( 464 3024 160 ) ( 448 3024 160 ) ( 448 3024 -96 ) TECH10_3 0 176 0 -1.000000 1.000000
+( 464 3008 160 ) ( 464 3024 160 ) ( 464 3024 -96 ) TECH10_3 0 176 0 -1.000000 1.000000
+( 448 3008 160 ) ( 464 3008 160 ) ( 464 3008 -96 ) TECH10_3 0 176 0 -1.000000 1.000000
+( 448 3008 160 ) ( 448 3024 160 ) ( 464 3024 160 ) TECH10_3 0 176 0 -1.000000 1.000000
+( 464 3024 -96 ) ( 448 3024 -96 ) ( 448 3008 -96 ) TECH10_3 0 176 0 -1.000000 1.000000
+}
+{
+( 352 3008 160 ) ( 352 2976 160 ) ( 352 2976 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 352 3008 160 ) ( 352 3008 128 ) ( 544 2880 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 544 2848 160 ) ( 544 2880 160 ) ( 544 2880 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 352 2976 128 ) ( 352 2976 160 ) ( 544 2848 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 352 2976 160 ) ( 352 3008 160 ) ( 544 2880 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 352 3008 128 ) ( 352 2976 128 ) ( 544 2848 128 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 352 2672 128 ) ( 352 2672 160 ) ( 352 2640 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 544 2768 128 ) ( 352 2640 128 ) ( 352 2640 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 544 2768 128 ) ( 544 2768 160 ) ( 544 2800 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 544 2800 160 ) ( 352 2672 160 ) ( 352 2672 128 ) TECH04_1 0 0 0 1.000000 1.000000
+( 544 2768 160 ) ( 352 2640 160 ) ( 352 2672 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 544 2800 128 ) ( 352 2672 128 ) ( 352 2640 128 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 0 2624 -96 ) ( 0 2576 -96 ) ( 0 2576 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+( 224 2624 -96 ) ( 0 2624 -96 ) ( 0 2624 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+( 320 2592 -96 ) ( 320 2640 -96 ) ( 320 2640 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2576 -96 ) ( 224 2576 -96 ) ( 224 2576 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2576 -96 ) ( 0 2624 -96 ) ( 224 2624 -96 ) TECH04_1 0 0 0 1.000000 1.000000
+( 224 2624 -112 ) ( 0 2624 -112 ) ( 0 2576 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 0 2624 -64 ) ( 0 2576 -64 ) ( 0 2576 -80 ) TECH04_1 0 0 0 1.000000 1.000000
+( 224 2624 -64 ) ( 0 2624 -64 ) ( 0 2624 -80 ) TECH04_1 0 0 0 1.000000 1.000000
+( 320 2592 -64 ) ( 320 2640 -64 ) ( 320 2640 -80 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2576 -64 ) ( 224 2576 -64 ) ( 224 2576 -80 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2576 -64 ) ( 0 2624 -64 ) ( 224 2624 -64 ) TECH04_1 0 0 0 1.000000 1.000000
+( 224 2624 -80 ) ( 0 2624 -80 ) ( 0 2576 -80 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 320 2624 -64 ) ( 320 2576 -64 ) ( 320 2576 -80 ) TECH04_1 0 0 0 1.000000 1.000000
+( 336 2624 -64 ) ( 320 2624 -64 ) ( 320 2624 -80 ) TECH04_1 0 0 0 1.000000 1.000000
+( 336 2576 -64 ) ( 336 2624 -64 ) ( 336 2624 -80 ) TECH04_1 0 0 0 1.000000 1.000000
+( 320 2576 -64 ) ( 336 2576 -64 ) ( 336 2576 -80 ) TECH04_1 0 0 0 1.000000 1.000000
+( 320 2576 -64 ) ( 320 2624 -64 ) ( 336 2624 -64 ) TECH04_1 0 0 0 1.000000 1.000000
+( 336 2624 -112 ) ( 320 2624 -112 ) ( 320 2576 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -16 2624 -64 ) ( -16 2576 -64 ) ( -16 2576 -80 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2624 -64 ) ( -16 2624 -64 ) ( -16 2624 -80 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2576 -64 ) ( 0 2624 -64 ) ( 0 2624 -80 ) TECH04_1 0 0 0 1.000000 1.000000
+( -16 2576 -64 ) ( 0 2576 -64 ) ( 0 2576 -80 ) TECH04_1 0 0 0 1.000000 1.000000
+( -16 2576 -64 ) ( -16 2624 -64 ) ( 0 2624 -64 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2624 -112 ) ( -16 2624 -112 ) ( -16 2576 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -16 2576 -64 ) ( -16 2560 -64 ) ( -16 2560 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+( 336 2576 -64 ) ( -16 2576 -64 ) ( -16 2576 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+( 336 2560 -64 ) ( 336 2576 -64 ) ( 336 2576 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -16 2560 -64 ) ( 336 2560 -64 ) ( 336 2560 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+( -16 2560 -64 ) ( -16 2576 -64 ) ( 336 2576 -64 ) TECH04_1 0 0 0 1.000000 1.000000
+( 336 2576 -112 ) ( -16 2576 -112 ) ( -16 2560 -112 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -80 2656 -64 ) ( -80 2640 -64 ) ( -80 2640 -80 ) TECH10_1 208 0 0 1.000000 1.000000
+( -32 2656 -64 ) ( -64 2656 -64 ) ( -64 2656 -80 ) TECH10_1 208 0 0 1.000000 1.000000
+( -16 2640 -64 ) ( -16 2656 -64 ) ( -16 2656 -80 ) TECH10_1 208 0 0 1.000000 1.000000
+( -64 2640 -64 ) ( -32 2640 -64 ) ( -32 2640 -80 ) TECH10_1 208 0 0 1.000000 1.000000
+( -64 2640 0 ) ( -64 2656 0 ) ( -32 2656 0 ) TECH10_1 208 0 0 1.000000 1.000000
+( -32 2656 -80 ) ( -64 2656 -80 ) ( -64 2640 -80 ) TECH10_1 208 0 0 1.000000 1.000000
+}
+{
+( 608 1744 208 ) ( 608 1728 208 ) ( 608 1728 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 608 1744 208 ) ( 608 1744 -240 ) ( 736 1728 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 736 1712 208 ) ( 736 1728 208 ) ( 736 1728 -336 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 608 1728 -240 ) ( 608 1728 208 ) ( 736 1712 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 608 1728 208 ) ( 608 1744 208 ) ( 736 1728 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( 608 1744 -240 ) ( 608 1728 -240 ) ( 736 1712 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( -472 1728 208 ) ( -472 1712 208 ) ( -472 1712 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -384 1760 -240 ) ( -384 1760 208 ) ( -472 1728 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -384 1744 208 ) ( -384 1760 208 ) ( -384 1760 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -384 1744 208 ) ( -384 1744 -240 ) ( -472 1712 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -384 1760 208 ) ( -384 1744 208 ) ( -472 1712 208 ) UWALL1_2 0 0 0 1.000000 1.000000
+( -384 1744 -240 ) ( -384 1760 -240 ) ( -472 1728 -240 ) UWALL1_2 0 0 0 1.000000 1.000000
+}
+{
+( -64 1840 -64 ) ( -64 1776 -64 ) ( -64 1776 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+( -48 1840 -64 ) ( -64 1840 -64 ) ( -64 1840 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+( -48 1776 -64 ) ( -48 1840 -64 ) ( -48 1840 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+( -64 1776 -64 ) ( -48 1776 -64 ) ( -48 1776 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+( -64 1776 0 ) ( -64 1840 0 ) ( -48 1840 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( -48 1840 -80 ) ( -64 1840 -80 ) ( -64 1776 -80 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -112 2432 16 ) ( -112 2280 16 ) ( -112 2280 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 8 2496 16 ) ( -112 2496 16 ) ( -112 2496 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 192 2264 16 ) ( 192 2416 16 ) ( 192 2416 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -120 2208 16 ) ( 0 2208 16 ) ( 0 2208 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( -112 2280 16 ) ( -112 2432 16 ) ( 8 2432 16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 8 2432 -16 ) ( -112 2432 -16 ) ( -112 2280 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( -112 2464 176 ) ( -112 2496 176 ) ( -112 2496 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -112 2464 208 ) ( -112 2496 208 ) ( -80 2496 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -80 2496 208 ) ( -112 2496 208 ) ( -112 2496 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -120 2208 176 ) ( -120 2208 208 ) ( -88 2208 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -80 2480 208 ) ( -112 2464 176 ) ( -80 2464 208 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 144 2496 176 ) ( 176 2496 176 ) ( 176 2496 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 144 2496 208 ) ( 176 2496 208 ) ( 176 2464 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 192 2456 208 ) ( 192 2488 208 ) ( 192 2488 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( -112 2504 176 ) ( -112 2504 208 ) ( -112 2472 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 160 2464 208 ) ( 144 2496 176 ) ( 144 2464 208 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 176 2208 208 ) ( 176 2208 176 ) ( 144 2208 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 176 2240 208 ) ( 176 2208 208 ) ( 144 2208 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 192 2216 176 ) ( 192 2216 208 ) ( 192 2248 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( -112 2232 208 ) ( -112 2200 208 ) ( -112 2200 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 144 2240 208 ) ( 144 2208 176 ) ( 160 2240 208 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 192 2240 176 ) ( 192 2208 176 ) ( 192 2208 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 192 2240 208 ) ( 192 2208 208 ) ( 160 2208 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 152 2208 208 ) ( 184 2208 208 ) ( 184 2208 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 200 2496 176 ) ( 200 2496 208 ) ( 168 2496 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 160 2224 208 ) ( 192 2240 176 ) ( 160 2240 208 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -80 2288 240 ) ( -80 2240 240 ) ( -80 2240 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( 160 2464 240 ) ( 120 2464 240 ) ( 120 2464 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( -80 2240 240 ) ( -40 2240 240 ) ( -40 2240 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( 120 2416 224 ) ( 120 2464 224 ) ( 160 2464 224 ) TECH01_6 0 0 0 1.000000 1.000000
+( 160 2464 208 ) ( 120 2464 208 ) ( 120 2416 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( 0 2336 208 ) ( 0 2336 224 ) ( 0 2400 224 ) TECH01_6 0 0 0 1.000000 1.000000
+}
+{
+( 160 2464 240 ) ( 120 2464 240 ) ( 120 2464 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( 160 2416 240 ) ( 160 2464 240 ) ( 160 2464 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( 120 2416 224 ) ( 120 2464 224 ) ( 160 2464 224 ) TECH01_6 0 0 0 1.000000 1.000000
+( 160 2464 208 ) ( 120 2464 208 ) ( 120 2416 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( 0 2400 224 ) ( 0 2336 224 ) ( 0 2336 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( 0 2400 208 ) ( 0 2400 224 ) ( 64 2400 224 ) TECH01_6 0 0 0 1.000000 1.000000
+}
+{
+( 160 2416 240 ) ( 160 2464 240 ) ( 160 2464 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( -80 2240 240 ) ( -40 2240 240 ) ( -40 2240 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( 120 2416 224 ) ( 120 2464 224 ) ( 160 2464 224 ) TECH01_6 0 0 0 1.000000 1.000000
+( 160 2464 208 ) ( 120 2464 208 ) ( 120 2416 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( 64 2400 224 ) ( 0 2400 224 ) ( 0 2400 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( 64 2400 208 ) ( 64 2400 224 ) ( 64 2336 224 ) TECH01_6 0 0 0 1.000000 1.000000
+}
+{
+( -80 2240 240 ) ( -40 2240 240 ) ( -40 2240 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( 120 2416 224 ) ( 120 2464 224 ) ( 160 2464 224 ) TECH01_6 0 0 0 1.000000 1.000000
+( 160 2464 208 ) ( 120 2464 208 ) ( 120 2416 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( 0 2400 224 ) ( 0 2336 224 ) ( 0 2336 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( 64 2336 224 ) ( 64 2400 224 ) ( 64 2400 208 ) TECH01_6 0 0 0 1.000000 1.000000
+( 64 2304 208 ) ( 64 2304 224 ) ( 0 2304 224 ) TECH01_6 0 0 0 1.000000 1.000000
+}
+{
+( -112 2208 176 ) ( -112 2192 176 ) ( -112 2192 -176 ) TECH08_1 32 144 0 1.000000 1.000000
+( -88 2208 176 ) ( -112 2208 176 ) ( -112 2208 -176 ) TECH08_1 32 144 0 1.000000 1.000000
+( 192 2184 176 ) ( 192 2200 176 ) ( 192 2200 -176 ) TECH08_1 32 144 0 1.000000 1.000000
+( -112 2192 176 ) ( -88 2192 176 ) ( -88 2192 -176 ) TECH08_1 32 144 0 1.000000 1.000000
+( -112 2192 200 ) ( -112 2208 200 ) ( -88 2208 200 ) TECH08_1 32 144 0 1.000000 1.000000
+( -88 2208 0 ) ( -112 2208 0 ) ( -112 2192 0 ) TECH08_1 32 144 0 1.000000 1.000000
+}
+{
+( 192 2496 200 ) ( 192 2192 200 ) ( 192 2192 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 208 2496 200 ) ( 192 2496 200 ) ( 192 2496 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 208 2192 200 ) ( 208 2496 200 ) ( 208 2496 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 192 2192 200 ) ( 192 2496 200 ) ( 208 2496 200 ) TECH08_1 192 144 0 1.000000 1.000000
+( 208 2496 0 ) ( 192 2496 0 ) ( 192 2192 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 184 2432 0 ) ( 184 2432 200 ) ( 200 2432 200 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 192 2496 200 ) ( 192 2192 200 ) ( 192 2192 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 208 2192 200 ) ( 208 2496 200 ) ( 208 2496 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 192 2192 200 ) ( 208 2192 200 ) ( 208 2192 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 192 2192 200 ) ( 192 2496 200 ) ( 208 2496 200 ) TECH08_1 192 144 0 1.000000 1.000000
+( 208 2496 0 ) ( 192 2496 0 ) ( 192 2192 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 208 2304 0 ) ( 208 2304 200 ) ( 192 2304 200 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 192 2496 200 ) ( 192 2192 200 ) ( 192 2192 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 208 2192 200 ) ( 208 2496 200 ) ( 208 2496 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 192 2192 200 ) ( 192 2496 200 ) ( 208 2496 200 ) TECH08_1 192 144 0 1.000000 1.000000
+( 200 2432 200 ) ( 184 2432 200 ) ( 184 2432 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 192 2304 200 ) ( 208 2304 200 ) ( 208 2304 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 208 2384 144 ) ( 192 2384 144 ) ( 192 2312 144 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( -112 2520 200 ) ( -112 2504 200 ) ( -112 2504 0 ) TECH08_1 208 144 0 1.000000 1.000000
+( 208 2512 200 ) ( 176 2512 200 ) ( 176 2512 0 ) TECH08_1 208 144 0 1.000000 1.000000
+( 208 2496 200 ) ( 208 2512 200 ) ( 208 2512 0 ) TECH08_1 208 144 0 1.000000 1.000000
+( 176 2496 200 ) ( 208 2496 200 ) ( 208 2496 0 ) TECH08_1 208 144 0 1.000000 1.000000
+( 176 2496 200 ) ( 176 2512 200 ) ( 208 2512 200 ) TECH08_1 208 144 0 1.000000 1.000000
+( 208 2512 0 ) ( 176 2512 0 ) ( 176 2496 0 ) TECH08_1 208 144 0 1.000000 1.000000
+}
+{
+( 0 2400 224 ) ( 0 2336 224 ) ( 0 2336 208 ) TLIGHT10 0 0 0 1.000000 1.000000
+( 64 2400 224 ) ( 0 2400 224 ) ( 0 2400 208 ) TLIGHT10 0 0 0 1.000000 1.000000
+( 64 2336 224 ) ( 64 2400 224 ) ( 64 2400 208 ) TLIGHT10 0 0 0 1.000000 1.000000
+( 0 2304 224 ) ( 64 2304 224 ) ( 64 2304 208 ) TLIGHT10 0 0 0 1.000000 1.000000
+( 0 2336 224 ) ( 0 2400 224 ) ( 64 2400 224 ) TLIGHT10 0 0 0 1.000000 1.000000
+( 64 2400 208 ) ( 0 2400 208 ) ( 0 2336 208 ) TLIGHT10 0 0 0 1.000000 1.000000
+}
+{
+( -16 2416 208 ) ( -16 2400 208 ) ( -16 2400 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2416 208 ) ( -16 2416 208 ) ( -16 2416 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2400 208 ) ( 0 2416 208 ) ( 0 2416 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( -16 2400 208 ) ( 0 2400 208 ) ( 0 2400 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( -16 2400 208 ) ( -16 2416 208 ) ( 0 2416 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2416 160 ) ( -16 2416 160 ) ( -16 2400 160 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 64 2416 208 ) ( 64 2400 208 ) ( 64 2400 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 80 2416 208 ) ( 64 2416 208 ) ( 64 2416 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 80 2400 208 ) ( 80 2416 208 ) ( 80 2416 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 64 2400 208 ) ( 80 2400 208 ) ( 80 2400 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 64 2400 208 ) ( 64 2416 208 ) ( 80 2416 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 80 2416 160 ) ( 64 2416 160 ) ( 64 2400 160 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 64 2304 208 ) ( 64 2288 208 ) ( 64 2288 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 80 2304 208 ) ( 64 2304 208 ) ( 64 2304 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 80 2288 208 ) ( 80 2304 208 ) ( 80 2304 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 64 2288 208 ) ( 80 2288 208 ) ( 80 2288 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 64 2288 208 ) ( 64 2304 208 ) ( 80 2304 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 80 2304 160 ) ( 64 2304 160 ) ( 64 2288 160 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( -16 2304 208 ) ( -16 2288 208 ) ( -16 2288 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2304 208 ) ( -16 2304 208 ) ( -16 2304 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2288 208 ) ( 0 2304 208 ) ( 0 2304 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( -16 2288 208 ) ( 0 2288 208 ) ( 0 2288 192 ) TECH04_1 0 0 0 1.000000 1.000000
+( -16 2288 208 ) ( -16 2304 208 ) ( 0 2304 208 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2304 160 ) ( -16 2304 160 ) ( -16 2288 160 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 0 2304 208 ) ( 0 2288 208 ) ( 0 2288 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 64 2304 208 ) ( 0 2304 208 ) ( 0 2304 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 64 2288 208 ) ( 64 2304 208 ) ( 64 2304 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2288 208 ) ( 64 2288 208 ) ( 64 2288 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2288 176 ) ( 0 2304 176 ) ( 64 2304 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 64 2304 160 ) ( 0 2304 160 ) ( 0 2288 160 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 0 2416 208 ) ( 0 2400 208 ) ( 0 2400 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 64 2416 208 ) ( 0 2416 208 ) ( 0 2416 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 64 2400 208 ) ( 64 2416 208 ) ( 64 2416 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2400 208 ) ( 64 2400 208 ) ( 64 2400 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2400 176 ) ( 0 2416 176 ) ( 64 2416 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 64 2416 160 ) ( 0 2416 160 ) ( 0 2400 160 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 0 2400 208 ) ( -16 2400 208 ) ( -16 2400 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2336 208 ) ( 0 2400 208 ) ( 0 2400 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -24 2304 208 ) ( -8 2304 208 ) ( -8 2304 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -16 2400 208 ) ( -16 2336 208 ) ( -16 2336 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( -16 2400 176 ) ( 0 2400 176 ) ( 0 2336 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 0 2336 160 ) ( 0 2400 160 ) ( -16 2400 160 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 80 2400 208 ) ( 64 2400 208 ) ( 64 2400 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 80 2336 208 ) ( 80 2400 208 ) ( 80 2400 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 56 2304 208 ) ( 72 2304 208 ) ( 72 2304 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 64 2400 208 ) ( 64 2336 208 ) ( 64 2336 160 ) TECH04_1 0 0 0 1.000000 1.000000
+( 64 2400 176 ) ( 80 2400 176 ) ( 80 2336 176 ) TECH04_1 0 0 0 1.000000 1.000000
+( 80 2336 160 ) ( 80 2400 160 ) ( 64 2400 160 ) TECH04_1 0 0 0 1.000000 1.000000
+}
+{
+( 64 2344 208 ) ( 64 2360 208 ) ( 64 2360 160 ) TECH04_2 0 0 0 1.000000 1.000000
+( 32 2344 208 ) ( 96 2344 208 ) ( 96 2344 160 ) TECH04_2 0 0 0 1.000000 1.000000
+( 0 2368 208 ) ( 0 2352 208 ) ( 0 2352 160 ) TECH04_2 0 0 0 1.000000 1.000000
+( 96 2360 208 ) ( 32 2360 208 ) ( 32 2360 160 ) TECH04_2 0 0 0 1.000000 1.000000
+( 96 2360 176 ) ( 96 2344 176 ) ( 32 2344 176 ) TECH04_2 0 0 0 1.000000 1.000000
+( 32 2344 160 ) ( 96 2344 160 ) ( 96 2360 160 ) TECH04_2 0 0 0 1.000000 1.000000
+}
+{
+( 16 2304 208 ) ( 32 2304 208 ) ( 32 2304 160 ) TECH04_2 0 0 0 1.000000 1.000000
+( 24 2368 208 ) ( 24 2304 208 ) ( 24 2304 160 ) TECH04_2 0 0 0 1.000000 1.000000
+( 48 2400 208 ) ( 32 2400 208 ) ( 32 2400 160 ) TECH04_2 0 0 0 1.000000 1.000000
+( 40 2304 208 ) ( 40 2368 208 ) ( 40 2368 160 ) TECH04_2 0 0 0 1.000000 1.000000
+( 40 2304 176 ) ( 24 2304 176 ) ( 24 2368 176 ) TECH04_2 0 0 0 1.000000 1.000000
+( 24 2368 160 ) ( 24 2304 160 ) ( 40 2304 160 ) TECH04_2 0 0 0 1.000000 1.000000
+}
+{
+( 192 2432 16 ) ( 192 2304 16 ) ( 192 2304 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 288 2432 16 ) ( 192 2432 16 ) ( 192 2432 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 288 2304 16 ) ( 288 2432 16 ) ( 288 2432 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 192 2304 16 ) ( 288 2304 16 ) ( 288 2304 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 192 2304 16 ) ( 192 2432 16 ) ( 288 2432 16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+( 288 2432 -16 ) ( 192 2432 -16 ) ( 192 2304 -16 ) SFLOOR4_2 0 0 0 1.000000 1.000000
+}
+{
+( 224 2304 200 ) ( 224 2288 200 ) ( 224 2288 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 288 2304 200 ) ( 224 2304 200 ) ( 224 2304 0 ) TECH08_1 32 144 0 1.000000 1.000000
+( 288 2288 200 ) ( 288 2304 200 ) ( 288 2304 0 ) TECH08_1 32 144 0 1.000000 1.000000
+( 224 2288 200 ) ( 288 2288 200 ) ( 288 2288 0 ) TECH08_1 32 144 0 1.000000 1.000000
+( 224 2288 144 ) ( 224 2304 144 ) ( 288 2304 144 ) TECH08_1 32 144 0 1.000000 1.000000
+( 288 2304 0 ) ( 224 2304 0 ) ( 224 2288 0 ) TECH08_1 32 144 0 1.000000 1.000000
+}
+{
+( 272 2432 200 ) ( 272 2288 200 ) ( 272 2288 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 304 2432 200 ) ( 288 2432 200 ) ( 288 2432 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 304 2288 200 ) ( 304 2432 200 ) ( 304 2432 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 288 2288 144 ) ( 288 2432 144 ) ( 304 2432 144 ) TECH08_1 192 144 0 1.000000 1.000000
+( 304 2432 0 ) ( 288 2432 0 ) ( 288 2288 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 288 2416 0 ) ( 288 2416 144 ) ( 320 2416 144 ) TLIGHT02 0 0 0 1.000000 1.000000
+}
+{
+( 272 2432 200 ) ( 272 2288 200 ) ( 272 2288 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 304 2288 200 ) ( 304 2432 200 ) ( 304 2432 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 288 2288 200 ) ( 304 2288 200 ) ( 304 2288 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 288 2288 144 ) ( 288 2432 144 ) ( 304 2432 144 ) TECH08_1 192 144 0 1.000000 1.000000
+( 304 2432 0 ) ( 288 2432 0 ) ( 288 2288 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 320 2320 0 ) ( 320 2320 144 ) ( 288 2320 144 ) TLIGHT02 0 0 0 1.000000 1.000000
+}
+{
+( 288 2432 200 ) ( 288 2288 200 ) ( 288 2288 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 304 2288 200 ) ( 304 2432 200 ) ( 304 2432 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 288 2288 144 ) ( 288 2432 144 ) ( 304 2432 144 ) TECH08_1 192 144 0 1.000000 1.000000
+( 320 2416 144 ) ( 288 2416 144 ) ( 288 2416 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 288 2320 144 ) ( 320 2320 144 ) ( 320 2320 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 320 2416 128 ) ( 288 2416 128 ) ( 288 2320 128 ) TWALL2_6 0 0 90 -1.000000 1.000000
+}
+{
+( 272 2432 200 ) ( 272 2288 200 ) ( 272 2288 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 304 2288 200 ) ( 304 2432 200 ) ( 304 2432 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 304 2432 0 ) ( 288 2432 0 ) ( 288 2288 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 320 2416 144 ) ( 288 2416 144 ) ( 288 2416 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 288 2320 144 ) ( 320 2320 144 ) ( 320 2320 0 ) TECH08_1 192 144 0 1.000000 1.000000
+( 288 2320 64 ) ( 288 2416 64 ) ( 320 2416 64 ) TWALL2_6 0 0 90 -1.000000 1.000000
+}
+{
+( 208 2448 144 ) ( 208 2432 144 ) ( 208 2432 0 ) TECH08_1 32 144 0 1.000000 1.000000
+( 304 2448 144 ) ( 208 2448 144 ) ( 208 2448 0 ) TECH08_1 32 144 0 1.000000 1.000000
+( 304 2432 144 ) ( 304 2448 144 ) ( 304 2448 0 ) TECH08_1 32 144 0 1.000000 1.000000
+( 208 2432 144 ) ( 304 2432 144 ) ( 304 2432 0 ) TECH08_1 32 144 0 1.000000 1.000000
+( 208 2432 144 ) ( 208 2448 144 ) ( 304 2448 144 ) TECH08_1 32 144 0 1.000000 1.000000
+( 304 2448 0 ) ( 208 2448 0 ) ( 208 2432 0 ) TECH08_1 32 144 0 1.000000 1.000000
+}
+{
+( 224 2288 144 ) ( 224 2240 144 ) ( 224 2240 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 240 2288 144 ) ( 224 2288 144 ) ( 224 2288 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 240 2240 144 ) ( 240 2288 144 ) ( 240 2288 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 224 2240 144 ) ( 240 2240 144 ) ( 240 2240 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 224 2240 144 ) ( 224 2288 144 ) ( 240 2288 144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 240 2288 0 ) ( 224 2288 0 ) ( 224 2240 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 208 2240 144 ) ( 208 2224 144 ) ( 208 2224 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 240 2240 144 ) ( 208 2240 144 ) ( 208 2240 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 240 2224 144 ) ( 240 2240 144 ) ( 240 2240 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 2224 144 ) ( 240 2224 144 ) ( 240 2224 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 2224 144 ) ( 208 2240 144 ) ( 240 2240 144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 240 2240 0 ) ( 208 2240 0 ) ( 208 2224 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 208 2304 144 ) ( 208 2240 144 ) ( 208 2240 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 224 2304 144 ) ( 208 2304 144 ) ( 208 2304 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 224 2240 144 ) ( 224 2304 144 ) ( 224 2304 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 2240 144 ) ( 224 2240 144 ) ( 224 2240 0 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 2240 16 ) ( 208 2304 16 ) ( 224 2304 16 ) TECH04_3 0 0 0 1.000000 1.000000
+( 224 2304 0 ) ( 208 2304 0 ) ( 208 2240 0 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 208 2304 288 ) ( 208 2240 288 ) ( 208 2240 144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 224 2304 288 ) ( 208 2304 288 ) ( 208 2304 144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 224 2240 288 ) ( 224 2304 288 ) ( 224 2304 144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 2240 288 ) ( 224 2240 288 ) ( 224 2240 144 ) TECH04_3 0 0 0 1.000000 1.000000
+( 208 2240 160 ) ( 208 2304 160 ) ( 224 2304 160 ) TECH04_3 0 0 0 1.000000 1.000000
+( 224 2304 144 ) ( 208 2304 144 ) ( 208 2240 144 ) TECH04_3 0 0 0 1.000000 1.000000
+}
+{
+( 208 2432 160 ) ( 208 2304 160 ) ( 208 2304 144 ) TECH01_6 0 0 0 1.000000 1.000000
+( 288 2432 160 ) ( 208 2432 160 ) ( 208 2432 144 ) TECH01_6 0 0 0 1.000000 1.000000
+( 288 2304 160 ) ( 288 2432 160 ) ( 288 2432 144 ) TECH01_6 0 0 0 1.000000 1.000000
+( 208 2304 160 ) ( 288 2304 160 ) ( 288 2304 144 ) TECH01_6 0 0 0 1.000000 1.000000
+( 208 2304 160 ) ( 208 2432 160 ) ( 288 2432 160 ) TECH01_6 0 0 0 1.000000 1.000000
+( 288 2432 144 ) ( 208 2432 144 ) ( 208 2304 144 ) TECH01_6 0 0 0 1.000000 1.000000
+}
+{
+( 304 2432 128 ) ( 304 2416 128 ) ( 304 2416 64 ) TECH08_1 192 144 0 1.000000 1.000000
+( 320 2432 128 ) ( 304 2432 128 ) ( 304 2432 64 ) TECH08_1 192 144 0 1.000000 1.000000
+( 320 2416 128 ) ( 320 2432 128 ) ( 320 2432 64 ) TECH08_1 192 144 0 1.000000 1.000000
+( 304 2416 128 ) ( 320 2416 128 ) ( 320 2416 64 ) TLIGHT02 0 0 0 1.000000 1.000000
+( 304 2416 128 ) ( 304 2432 128 ) ( 320 2432 128 ) TECH08_1 192 144 0 1.000000 1.000000<