Metropoli BBS
VIEWER: objects.inc MODE: TEXT (CP437)
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;
; Filename     : objects.inc
; Included from: Main.asm
; Description  : Some sample objects for 3dVect.zip
;
; Written by: John McCarthy
;             1316 Redwood Lane
;             Pickering, Ontario.
;             Canada, Earth, Milky Way (for those out-of-towners)
;             L1X 1C5
;
; Internet/Usenet:  BRIAN.MCCARTHY@CANREM.COM
;         Fidonet:  Brian McCarthy 1:229/15
;   RIME/Relaynet: ->CRS
;
; Home phone, (905) 831-1944, don't call at 2 am eh!
;
; John Mccarthy would really love to work for a company programming Robots
; or doing some high intensive CPU work.  Hint. Hint.
;
; Send me your protected mode source code!
; Send me your Objects!
; But most of all, Send me a postcard!!!!
;
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

setupbase:
         mov _objbase[0*4],offset headercube4
         mov _objbase[1*4],offset headercube2
         mov _objbase[2*4],offset headerring
         mov _objbase[3*4],offset headerdiamond
         mov _objbase[4*4],offset headerrubine
         mov _objbase[5*4],offset column
         mov _objbase[6*4],offset archmiddle
        ;mov _objbase[7*4],offset archend
        ;mov _objbase[8*4],offset bigoildrum
        ;mov _objbase[9*4],offset ship1
         mov _objbase[5*4],offset headercube3
         mov _objbase[6*4],offset headerarm

         ;mov _objbase[0*4],offset platform1
         ;mov _objbase[1*4],offset platform2
         ;mov _objbase[2*4],offset platform3
         ;mov _objbase[0*4],offset ship1

         ;mov _objbase[0*4],offset futurecrewrip1
         ;mov _objbase[0*4],offset formula
         ;mov _objbase[0*4],offset inca
         ;mov _objbase[0*4],offset htracer
         ;mov _objbase[1*4],offset hacad1

         mov esi,0                          ; from object #
         mov edi,6                          ; to object #
         call _set_up_all_lambert           ; find and set up shading tables

         ret

;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Shape data can be almost as large as you need it 'till it crashes. Try a cube
; 20000_x20000_x20000.    Calculations  use  32  bit  registers  and  can  handle
; up to 16 bit locations.  Keeping the object size small will  allow  a  larger
; visible space.  But larger objects will allow you to get  closer  with   more
; accuracy in the mathematics of rotations.  Remember, if you make a really big
; object, set minz to the largest object on the screen so the large object wont
; mess up when you get really close to it.  I have generally found that  larger
; objects "look" better as they have great mathematical resolution.
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;
; Format for objects:
;
; headerthing:
;  dd max,min    ; max = maximum distance object can be seen, min = closest
;                ; distance object is allowed to be seen (can be negative)
;                ; eg dd 5000000,200.  If negative, object must be made up
;                ; of only sub-objects!!!
;  dd res1       ; distance for resolution1, eg 6000
;  dd offset thing1 - offset $ - 4  ; pointer to resolution1
;  dd -1         ; last resolution flag
;  dd offset thing2 - offset $ - 4  ; pointer to resolution2
;
; thing1:
;  dw xx         ; number of points
;  dw yy         ; number of surfaces
;  dw 25 dup (0) ; 25 future use words/options
;
;  dw xx,yy,zz   ; x,y,z of point 0
;  dw xx,yy,zz   ; x,y,z of point 1
;  dw xx,yy,zz   ; x,y,z of point 2
;  ...
;
;  dw command
;  dw texture for side 1
;  dw texture for side 2
;  dw colour for side 1
;  dw colour for side 2
;  dw connection data eg (1,2,3,4,1)
;  dw [?,?,?] [optional surface normal if command 128 used]
;  dw more connection data...
;
; to re-cap: dw command,texture1,texture2,colour1,colour2,connection,[0,0,0]
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;
; List of texture bits to date: (options grouped by function:)
;
; Note: "visible" = "points appear counter-clockwise"
;
; Texture definitions:
;
;   0       - normal surface, no features, constant colour.
;   wavey   - steel texture for surface 0 = none,  colour  offset  determines
;             screen offset for texture.  eg 16+7 will use colour block 16-31
;             but make the sine wave texture 14 (7*2) lines down. this is  so
;             all sine wave textures do not appear on the same line.  Windows
;             and engines look good with this feature.  This  option  can  be
;             combined with shading  if  you  want  to  mis-align  sine  wave
;             patterns.
;   shade   - _lambert shading bit, must have normal calculated or  at  least
;             have    free    space     for    _pre_cal_lambert    to    use:
;             eg x,x,x,x,x,1,2,3,1,?,?,?<- these 3 words are surface normal!
;   inverse - inversion bit for shading option.  0=normal shading, 1=inverse
;             inversion automatically occures when other side is displayed.
;   glow    - =shade+inverse
;   last    - colour has same colour as previous surface (used when
;             you want gourad shading, but want to avoid  duplicate
;             calculations - don't set gourad bit if this  is  what
;             you use it for.) when this is used, the colour number
;             determines the new colour block to use.  the  shading
;             of this colour will be the same as the surface before
;             it, but the colour block can be different.
;   mesh    - see the line below? that sort if dot on/dot off thing? thats a
;             mesh texture.  can be combined with shading.
;   glenz   - glenz vector (you know, the stained glass type of  thingy)
;             The colour of surface refers to a cross referanced palette
;             from which the glenz polygon will derive it's new colours.
;             Put the cross referancing palette  offset  into  _xreftable
;             and make the colour index the palette in the table.  Glenz
;             vectors can be used with the shading  option  to  get  the
;             same type of effect as in  Second  Unreal.   Shaded  Glenz
;             Vectors are made by simply having multiple cross referance
;             palettes and setting the surface to  "shade".   This  will
;             select the appropriate table based on surface normal. This
;             option can be combined with shading.
;   stone   - this texture is like the stone texture I saw  in Alone In The
;             Dark.   The   stone   texture   offset    is    loaded   from
;             [_stonetbl+colour*4].  Use the Qbasic  program   stone.bas  to
;             generate more stone textures with different colours or ranges
;             This option can be combined with shading.
;
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;
; Commands:
;
;   point   - defines a single point; must be repeated! eg dw 64,col,3,3
;   line    - if used, defines a line (must be set to define a true line)
;   himap   - if set, defines a _bitmap,eg: point #, _bitmap #, x scale,y scale
;   lomap   - uses 1/4 scaled _bitmap (every 4'th pixel is sampled), fast
;
;   iterate - generate iteration if side visible (iteration = sub-object)
;   matrix  - modify matrix when generating iteration.  matrix object
;             offset is 3rd word (6'th byte) in future use words.
;
;   both    - side is always visible no matter angle, skips counter-clowise test
;           - "both sides have same texture"
;   double  - side is always visible but other side has other colour
;             "double sided surface"
;             note: if this is used, option "both" must not be used!!
;   onscr   - test if side is on screen - don't use if all points are
;             outside clipping parameters.
;   check   - dont plot this side, just use as test points for visibility.
;             this is mostly used with iterations.
;   gosub   - push current offset and go to another location (offset location - offset $)
;   return  - just like a qbasic return
;   goto    - like qbasic - go to another offset (offset location - offset $)
;   push_matrix        - push rotation matrix
;   pop_matrix         - pop rotation matrix
;   push_location      - push 3d centriodal location
;   pop_location       - pop 3d centroidal location
;   sub_object         - sub_object = matrix+check+iteration+both,?,?,?,?,0,0
;   static_sub_object  - non-rotatable sub_object = check+iteration+both,?,?,?,?,0,0
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;
; There are two kinds of _bitmaps and points.  Those which  are  inside  objects
; and those which are seperate objects themselves. If _userotate object  command
; is set to 32 or 64, then the entire object is considered to be either a point
; or _bitmap.  But if _userotate is not set this way, then  a  normal  object  is
; drawn and _bitmaps then come from within the object definitions (below).  this
; way, _bitmaps and points can be either part of a larger object,  or  they  are
; computed fast on their own. (eg explosions and bullets as  seperate  objects)
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;
; Note: when writing surface descriptions, try to make the  first value unique
; from any other first value.  This way, the sort routine  will  give  a  more
; accurate sorting of sides. eg 1,3,6,1  2,4,1,2  rather than 1,3,6,1  1,2,4,1
; If this doesnt give you what you want, then try making the first two  points
; the farthest points from the objects centroid.
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;
; To recap:
;
;        0 = constant colour, only visible from counter-clockwise side
;    wavey = sine texture
;    shade = shading - requires 3 blank words for surface normal eg dw 0,0,0
;  inverse = invert the shading direction, 0=normal, 1=sun is other way.
;     last = use intensity from previous surface (not colour, only intensity)
;     mesh = see through mesh - solid colour
;    glenz = cross referancing vector - load from screen, xrefs it, put back
;    stone = stone texture.  use stone.bas to make more textures.
;
;    point = point
;     line = line
;    himap = _bitmap (scalable, non-rotatable)
;    lomap = _bitmap (scalable, non-rotatable)
;  iterate = generate iteration if side visible
;     both = always visible
;   double = always visible but other side has high byte colour,"double sided"
;    onscr = plot side only if all the following points are on the screen
;    check = dont plot side but use the following points as a test for visiblity
;
; What you can't mix on a single surface: "double" with "both"!!
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;
; You do not have to define a point for the center of the  object.  the  point
; 0 defines the center of the object.  This is different from earlier versions
; This point will ALWAYS be calculated and will always be the zero'th point.
;
; Iterations may or may not have an extra centroid point calculated  for  you.
; Whether or not a new point is added to  the  points  list  is  dependant  on
; whether or not a new centroid must be calculated.  Hmmm, how  can  I explain
; this...Ok, centroids are calculated with new matricies or centroid  offsets,
; they are also calculated if the centroid flag is set (4'th word).  So,  what
; does this mean to the lowly reader (you).  Some examples of iterations where
; new points are added to points list.
;
; Eg:
;  an iteration where new centroid IS NOT calculated and IS NOT inserted
;
;   dw iteration,0,0,colour,0 ,1,2,3,4,1
;       dw 1,1
;       dw 25 dup (0)
;          x y z
;       dw 5,5,5                 ; point 20 (for example)
;       dw 0,0,0,colour, 20,5,20 ; notice how this surface uses newly created point
;
;  an iteration where new centroid IS calculated and IS inserted
;
;   dw iteration+matrix,0,0,colour,0 ,1,2,3,4,1
;       dw 1,1
;       dw 25 dup (0)
;          x y z
;       dw 5,5,5                 ; point is now 21 (because matrix calculated new centroid)
;       dw 0,0,0,colour, 21,5,21 ; same surface as above.
;
; The "sub_object" command also forces a centroid to be calculated, and will
; also insert a new point into the points list.  Be aware of it's presance!
;
; Note: The centroid is always calculated as the zero'th point. The above rules
; only apply to whether or not a new centroid will appear  as  an  EXTRA  point
; in an ITERATION.
;
; Questions to ask yourself in trying to figure out the above text:
;   Have I made an iteration that has any centroidal offset?
;   Have I used the matrix command?
;   Hahe I used the sub_object command?
;   Have I set bit 0 of the 4'th word in the 25 dup's to 1?
;   Am I sexually frustrated?
; If you answer yes to any of these questions, then a new centroidal point will
; be calculated and inserted into the points list even if you dont ask for it!
;
; If you want to negate the effects of centroid  point  insertion,  simply  set
; the 7'th word (14'th byte) in those 25 dup's to 1. See below for more info.
;
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;
; Here is a simple rundown of what those 25 extra words do:
;
;  dw x,y ; x=number of points,y=number of surfaces (but you knew that right?)
;
;  dw ? ; reserved for memory offset if an iteration is skipped   (leave blank)
;  dw ? ; reserved for point offset if an iteration is skipped    (leave blank)
;  dw ? ; reserved,is there a new center of gravity to calculate? (leave blank)
;       ; you could force this value to 1 (centroid in equ.inc) if you  wanted
;       ; to have a new centroid calculated with the iteration.
;  dw x,y,z ; new center-of-gravity point.  lets say you want a  subsurface  to
;           ; be offset by a certin spacial location, you can set these 3 words
;           ; to be "added" to any points you  are  adding  to  the  sub-object
;           ; listen bub, just mess around with it and you'll get  the  idea...
;  dw #     ; new load object offset for matrix compounding - this is only used
;           ; if the sub-object has a new matrix. (for rotation). commands like
;           ; matrix and sub_object access this word to determine where  in the
;           ; object lists (xs,ys,zs,_xadds,_zadds...) to get the  location and
;           ; rotation information about  the  sub-object.  check out the block
;           ; with the two smaller rotating  blocks  and  then look in main.asm
;           ; to figure out how to use this.  usual  values are 1 or 2, maybe 3
;           ; up to the number of extra sub_objects you've got.
;  dw #     ; connection data addition value.  this value  gets  added  to  the
;           ; connection data. eg: lets say you've got an object that starts at
;           ; point 3 and goes to 12, but you want to make it into a sub_object
;           ; (part of something larger) and you  want to change the connection
;           ; data to have a range of 25 to  36.  just put the value 22 in here
;           ; and all connection  data  within the object (and all sub_objects,
;           ; even in  sub_objects  within  sub_objects)  will  have this value
;           ; added to it.  this is usefull for, lets say,  making  a formation
;           ; of airplanes one big object instead  of  drawing  each individual
;           ; airplane. (if by some freak accident you wanted to do that)
;  dd #     ; maximum distance object can be seen (maxz)
;  dd #     ; minimum distance object can be seen (minz) - this can be negative
;           ; if you want.  but if it is  negative,  the  entire   object  must
;           ; be made up of sub-objects.  If these are left at zero, they  will
;           ; be forced to good values (_pre_cal_lambert does this).
;  dd #     ; screen tolerancing.  this is used to determine how  far  off  the
;           ; screen an object will remain visable.  past this, the object will
;           ; not be drawn.  try 1, then try 500. you'll  get  the  idea.  (get
;           ; close to the object.) if this is left  blank,  a  value  will  be
;           ; placed in for you.
;  dw 11 dup 0 ; future use bytes
;
; To re-cap, the 25 word header looks like this:
;
;offset         │length&type    │description
;───────────────┼───────────────┼──────────────────────────────────────────────
; 0             │1 word (resrvd)│offset to next iteration (skip entire iteration)
; 2             │1 word (resrvd)│number of points in entire iteration
; 4             │1 word (resrvd)│centroid flag (bit 0)
;
; 6             │3 words x,y,z  │new centroid for points (and all following iterations!)
; 12            │1 word         │"new object angle" matrix load location (from _vxs[],_vys[]... (single,eg: 1,2,3...)
; 14            │1 word         │connection data addition value (can be negative!)
; 16            │1 dword        │maximum distance object can be seen (maxz)
; 20            │1 dword        │minimum distance object can be seen (minz)
; 24            │1 dword        │screen tolerancing
;               │               │
; 28            │11 words       │future use
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

         align 4

headercube1 dd -1
         dd offset cube1a - offset $ - 4

cube1a   dw 8                               ; how many points
         dw 6                               ; how many surfaces
         dw 25 dup (0)                      ; future use
         ;    x   y   z
         dw -270, 270, 270                  ;1
         dw -270,-270, 270                  ;2
         dw 270,-270, 270                   ;3
         dw 270, 270, 270                   ;4
         dw -270, 270,-270                  ;5
         dw -270,-270,-270                  ;6
         dw 270,-270,-270                   ;7
         dw 270, 270,-270                   ;8

         dw 0,0,0,16*8+12 ,0 ,1,2,3,4,1     ; surface connection data, and colours
         dw 0,wavey,0,16*7+6 ,0 ,8,7,6,5,8  ; end point=start point means done side
         dw 0,wavey,0,16*3+9 ,0 ,4,3,7,8,4
         dw 0,shade,0,16*5+0 ,0 ,5,6,2,1,5 ,0,0,0 ;<-- _lambert shading
         dw 0,shade,0,16*2+0 ,0 ,5,1,4,8,5 ,0,0,0 ;<-- normal gets shoved
         dw 0,shade,0,16*11+0 ,0 ,2,6,7,3,2 ,0,0,0 ;<-- here, leave blank

headercube2 dd -1
         dd offset cube2a - offset $ - 4

cube2a   dw 8                               ; how many points
         dw 9                               ; how many surfaces
         dw 25 dup (0)
         ;    x   y   z
         dw -270, 270, 270                  ;1
         dw -270,-270, 270                  ;2
         dw 270,-270, 270                   ;3
         dw 270, 270, 270                   ;4
         dw -270, 270,-270                  ;5
         dw -270,-270,-270                  ;6
         dw 270,-270,-270                   ;7
         dw 270, 270,-270                   ;8

         dw double,shade,wavey,16*4+0,16*6,1,2,3,4,1,0,0,0 ; command,txt1,txt2,col1,col2, surface connection data
         dw 0,0,0,16*2+4 ,0,6,2,6           ; end point=start point means done side
         dw 0,0,0,16*2+15,0,7,3,7           ; <-- these are lines
         dw 0,0,0,16*2+12,0,8,4,8
         dw 0,0,0,16*3+8 ,0,5,1,5
         dw 0,0,0,16*4+10,0,6,7,6
         dw 0,0,0,16*3+14,0,7,8,7
         dw 0,0,0,16*7+13,0,8,5,8
         dw 0,0,0,16*5+12,0,5,6,5

headercube3 dd 4000
         dd offset cube3a - offset $ - 4
         dd -1
         dd offset cube3b - offset $ - 4

cube3a   dw 44                              ; how many points
         dw 45                              ; how many surfaces
         dw 25 dup (0)                      ; future use
         ;    x   y   z
         dw -70, 70, 70                     ;1
         dw -70, 70, 35                     ;2
         dw -70, 70, 0                      ;3
         dw -70, 70,-35                     ;4

         dw -70,-70, 70                     ;5
         dw -70,-70, 35                     ;6
         dw -70,-70, 0                      ;7
         dw -70,-70,-35                     ;8

         dw 70,-70, 70                      ;9
         dw 70,-70, 35                      ;10
         dw 70,-70, 0                       ;11
         dw 70,-70,-35                      ;12

         dw 70, 70, 70                      ;13
         dw 70, 70, 35                      ;14
         dw 70, 70, 0                       ;15
         dw 70, 70,-35                      ;16

         dw -70, 70,-70                     ;17
         dw -70, 35,-70                     ;18
         dw -70, 0,-70                      ;19
         dw -70,-35,-70                     ;20
         dw -70,-70,-70                     ;21

         dw 70, 70,-70                      ;22
         dw 70, 35,-70                      ;23
         dw 70, 0,-70                       ;24
         dw 70,-35,-70                      ;25
         dw 70,-70,-70                      ;26

         dw -70, 35, 70                     ;27
         dw -70, 0, 70                      ;28
         dw -70,-35, 70                     ;29

         dw 70, 35, 70                      ;30
         dw 70, 0, 70                       ;31
         dw 70,-35, 70                      ;32

         dw -35,-70, 70                     ;33
         dw 0,-70, 70                       ;34
         dw 35,-70, 70                      ;35

         dw -35,-70,-70                     ;36
         dw 0,-70,-70                       ;37
         dw 35,-70,-70                      ;38

         dw -35, 70,-70                     ;39
         dw 0, 70,-70                       ;40
         dw 35, 70,-70                      ;41

         dw -35, 70, 70                     ;42
         dw 0, 70, 70                       ;43
         dw 35, 70, 70                      ;44

         dw himap,01,0,15,15
         dw himap,02,0,15,15
         dw himap,03,0,15,15
         dw himap,04,0,15,15
         dw himap,05,0,15,15
         dw himap,06,0,15,15
         dw himap,07,0,15,15
         dw himap,08,0,15,15
         dw himap,09,0,15,15
         dw himap,10,0,15,15
         dw himap,11,0,15,15
         dw himap,12,0,15,15
         dw himap,13,0,15,15
         dw himap,14,0,15,15
         dw himap,15,0,15,15
         dw himap,16,0,15,15
         dw himap,17,0,15,15
         dw himap,18,0,15,15
         dw himap,19,0,15,15
         dw himap,20,0,15,15
         dw himap,21,0,15,15
         dw himap,22,0,15,15
         dw himap,23,0,15,15
         dw himap,24,0,15,15
         dw himap,25,0,15,15
         dw himap,26,0,15,15
         dw himap,27,0,15,15
         dw himap,28,0,15,15
         dw himap,29,0,15,15
         dw himap,30,0,15,15
         dw himap,31,0,15,15
         dw himap,32,0,15,15
         dw himap,33,0,15,15
         dw himap,34,0,15,15
         dw himap,35,0,15,15
         dw himap,36,0,15,15
         dw himap,37,0,15,15
         dw himap,38,0,15,15
         dw himap,39,0,15,15
         dw himap,40,0,15,15
         dw himap,41,0,15,15
         dw himap,42,0,15,15
         dw himap,43,0,15,15
         dw himap,44,0,15,15

         dw himap,0,0,30,30                 ; center, change to lomap and see!

cube3b   dw 44                              ; this is same as above but since _bitmaps can't be seen
         dw 44                              ; from far, i use the same cube with points instead.
         dw 25 dup (0)                      ; future use
         ;    x   y   z
         dw -70, 70, 70                     ;1  ; this is an example of how to use the
         dw -70, 70, 35                     ;2  ; different resolutions based on distance
         dw -70, 70, 0                      ;3  ; you could get rid of half of these points
         dw -70, 70,-35                     ;4  ; and still have it "look" the same because

         dw -70,-70, 70                     ;5  ; of the great distance at which this will
         dw -70,-70, 35                     ;6  ; be seen
         dw -70,-70, 0                      ;7
         dw -70,-70,-35                     ;8

         dw 70,-70, 70                      ;9
         dw 70,-70, 35                      ;10
         dw 70,-70, 0                       ;11
         dw 70,-70,-35                      ;12

         dw 70, 70, 70                      ;13
         dw 70, 70, 35                      ;14
         dw 70, 70, 0                       ;15
         dw 70, 70,-35                      ;16

         dw -70, 70,-70                     ;17
         dw -70, 35,-70                     ;18
         dw -70, 0,-70                      ;19
         dw -70,-35,-70                     ;20
         dw -70,-70,-70                     ;21

         dw 70, 70,-70                      ;22
         dw 70, 35,-70                      ;23
         dw 70, 0,-70                       ;24
         dw 70,-35,-70                      ;25
         dw 70,-70,-70                      ;26

         dw -70, 35, 70                     ;27
         dw -70, 0, 70                      ;28
         dw -70,-35, 70                     ;29

         dw 70, 35, 70                      ;30
         dw 70, 0, 70                       ;31
         dw 70,-35, 70                      ;32

         dw -35,-70, 70                     ;33
         dw 0,-70, 70                       ;34
         dw 35,-70, 70                      ;35

         dw -35,-70,-70                     ;36
         dw 0,-70,-70                       ;37
         dw 35,-70,-70                      ;38

         dw -35, 70,-70                     ;39
         dw 0, 70,-70                       ;40
         dw 35, 70,-70                      ;41

         dw -35, 70, 70                     ;42
         dw 0, 70, 70                       ;43
         dw 35, 70, 70                      ;44

         dw 0,0,0,28,0, 01,01
         dw 0,0,0,28,0, 02,02
         dw 0,0,0,28,0, 03,03
         dw 0,0,0,28,0, 04,04
         dw 0,0,0,28,0, 05,05
         dw 0,0,0,28,0, 06,06
         dw 0,0,0,28,0, 07,07
         dw 0,0,0,28,0, 08,08
         dw 0,0,0,28,0, 09,09
         dw 0,0,0,28,0, 10,10
         dw 0,0,0,28,0, 11,11
         dw 0,0,0,28,0, 12,12
         dw 0,0,0,28,0, 13,13
         dw 0,0,0,28,0, 14,14
         dw 0,0,0,28,0, 15,15
         dw 0,0,0,28,0, 16,16
         dw 0,0,0,28,0, 17,17
         dw 0,0,0,28,0, 18,18
         dw 0,0,0,28,0, 19,19
         dw 0,0,0,28,0, 20,20
         dw 0,0,0,28,0, 21,21
         dw 0,0,0,28,0, 22,22
         dw 0,0,0,28,0, 23,23
         dw 0,0,0,28,0, 24,24
         dw 0,0,0,28,0, 25,25
         dw 0,0,0,28,0, 26,26
         dw 0,0,0,28,0, 27,27
         dw 0,0,0,28,0, 28,28
         dw 0,0,0,28,0, 29,29
         dw 0,0,0,28,0, 30,30
         dw 0,0,0,28,0, 31,31
         dw 0,0,0,28,0, 32,32
         dw 0,0,0,28,0, 33,33
         dw 0,0,0,28,0, 34,34
         dw 0,0,0,28,0, 35,35
         dw 0,0,0,28,0, 36,36
         dw 0,0,0,28,0, 37,37
         dw 0,0,0,28,0, 38,38
         dw 0,0,0,28,0, 39,39
         dw 0,0,0,28,0, 40,40
         dw 0,0,0,28,0, 41,41
         dw 0,0,0,28,0, 42,42
         dw 0,0,0,28,0, 43,43
         dw 0,0,0,28,0, 44,44

         dw himap,0,0,30,30                 ; 0 = center of object

headerring dd -1
         dd offset ringa - offset $ - 4

ringa    dw 32
         dw 32
         dw 25 dup (0)                      ; future use
         ;    x   y   z
         dw -40*4, 80*4, 30*4               ; 1
         dw -80*4, 40*4, 30*4               ; 2
         dw -80*4,-40*4, 30*4               ; 3
         dw -40*4,-80*4, 30*4               ; 4
         dw 40*4,-80*4, 30*4                ; 5
         dw 80*4,-40*4, 30*4                ; 6
         dw 80*4, 40*4, 30*4                ; 7
         dw 40*4, 80*4, 30*4                ; 8
         dw -40*4, 20*4, 45*4               ; 9
         dw -40*4,-20*4, 45*4               ;10
         dw -20*4,-40*4, 45*4               ;11
         dw 20*4,-40*4, 45*4                ;12
         dw 40*4,-20*4, 45*4                ;13
         dw 40*4, 20*4, 45*4                ;14
         dw 20*4, 40*4, 45*4                ;15
         dw -20*4, 40*4, 45*4               ;16
         dw -40*4, 80*4,-30*4               ;17
         dw -80*4, 40*4,-30*4               ;18
         dw -80*4,-40*4,-30*4               ;19
         dw -40*4,-80*4,-30*4               ;20
         dw 40*4,-80*4,-30*4                ;21
         dw 80*4,-40*4,-30*4                ;22
         dw 80*4, 40*4,-30*4                ;23
         dw 40*4, 80*4,-30*4                ;24
         dw -40*4, 20*4,-45*4               ;25
         dw -40*4,-20*4,-45*4               ;26
         dw -20*4,-40*4,-45*4               ;27
         dw 20*4,-40*4,-45*4                ;28
         dw 40*4,-20*4,-45*4                ;29
         dw 40*4, 20*4,-45*4                ;30
         dw 20*4, 40*4,-45*4                ;31
         dw -20*4, 40*4,-45*4               ;32

         dw 0,shade,0,16*4+0,0 ,2,9,16,1,2 ,0,0,0 ; these  zeros   get   filled
         dw 0,shade,0,16*4+0,0 ,3,10,9,2,3 ,0,0,0 ; with the calculated surface
         dw 0,shade,0,16*4+0,0 ,4,11,10,3,4 ,0,0,0 ; normal.  we could calculate
         dw 0,shade,0,16*4+0,0 ,5,12,11,4,5 ,0,0,0 ; them ourselves but god, too
         dw 0,shade,0,16*4+0,0 ,6,13,12,5,6 ,0,0,0 ; much work.
         dw 0,shade,0,16*4+0,0 ,7,14,13,6,7 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,8,15,14,7,8 ,0,0,0 ; remember, if you remove  the
         dw 0,shade,0,16*4+0,0 ,1,16,15,8,1 ,0,0,0 ; shading parameter  then  you
         dw 0,shade,0,16*4+0,0 ,1,17,18,2,1 ,0,0,0 ; must remove these 0's
         dw 0,shade,0,16*4+0,0 ,2,18,19,3,2 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,3,19,20,4,3 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,4,20,21,5,4 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,5,21,22,6,5 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,6,22,23,7,6 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,7,23,24,8,7 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,8,24,17,1,8 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,10,26,25,9,10 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,11,27,26,10,11 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,12,28,27,11,12 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,13,29,28,12,13 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,14,30,29,13,14 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,15,31,30,14,15 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,15,16,32,31,15 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,32,16,9,25,32 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,18,25,26,19,18 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,19,26,27,20,19 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,20,27,28,21,20 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,21,28,29,22,21 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,22,29,30,23,22 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,23,30,31,24,23 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,24,31,32,17,24 ,0,0,0
         dw 0,shade,0,16*4+0,0 ,17,32,25,18,17 ,0,0,0

headerdiamond dd -1
         dd offset diamonda - offset $ - 4

diamonda dw 13
         dw 17
         dw 25 dup (0)                      ; future use

         dw -100*4, 50*4, 0
         dw -100*4, -50*4, 0
         dw -50*4,-100*4, 0
         dw 50*4,-100*4, 0
         dw 100*4, -50*4, 0
         dw 100*4, 50*4, 0
         dw 50*4, 100*4, 0
         dw -50*4, 100*4, 0
         dw -50*4, 50*4, 40*4
         dw -50*4, -50*4, 40*4
         dw 50*4, -50*4, 40*4
         dw 50*4, 50*4, 40*4
         dw 0*4, 0*4,-120*4

         dw both,shade+glenz,0,32,0 ,1,2,10,9,1,0,0,0
         dw both,shade+glenz,0,32,0 ,10,3,4,11,10,0,0,0
         dw both,shade+glenz,0,32,0 ,12,11,5,6,12,0,0,0
         dw both,shade+glenz,0,32,0 ,8,9,12,7,8,0,0,0
         dw both,shade+glenz,0,32,0 ,2,3,10,2,0,0,0
         dw both,shade+glenz,0,32,0 ,11,4,5,11,0,0,0
         dw both,shade+glenz,0,32,0 ,7,12,6,7,0,0,0
         dw both,shade+glenz,0,32,0 ,1,9,8,1,0,0,0
         dw both,shade+glenz,0,32,0 ,9,10,11,12,9,0,0,0
         dw both,shade+glenz,0,32,0 ,8,13,1,8,0,0,0
         dw both,shade+glenz,0,32,0 ,1,13,2,1,0,0,0
         dw both,shade+glenz,0,32,0 ,2,13,3,2,0,0,0
         dw both,shade+glenz,0,32,0 ,3,13,4,3,0,0,0
         dw both,shade+glenz,0,32,0 ,4,13,5,4,0,0,0
         dw both,shade+glenz,0,32,0 ,5,13,6,5,0,0,0
         dw both,shade+glenz,0,32,0 ,6,13,7,6,0,0,0
         dw both,shade+glenz,0,32,0 ,7,13,8,7,0,0,0

headerrubine dd -1
         dd offset rubinea - offset $ - 4

rubinea  dw 16
         dw 20                              ; 18 sides + 1 gosub + 1 return
         dw 25 dup (0)                      ; future use

         dw -100*4, 50*4, 0*4               ; 1
         dw -100*4, -50*4, 0*4              ; 2
         dw -50*4,-100*4, 0*4               ; 3
         dw 50*4,-100*4, 0*4                ; 4
         dw 100*4, -50*4, 0*4               ; 5
         dw 100*4, 50*4, 0*4                ; 6
         dw 50*4, 100*4, 0*4                ; 7
         dw -50*4, 100*4, 0*4               ; 8
         dw -50*4, 50*4, 40*4               ; 9
         dw -50*4, -50*4, 40*4              ;10
         dw 50*4, -50*4, 40*4               ;11
         dw 50*4, 50*4, 40*4                ;12
         dw -50*4, 50*4, -40*4              ;13
         dw -50*4, -50*4, -40*4             ;14
         dw 50*4, -50*4, -40*4              ;15
         dw 50*4, 50*4, -40*4               ;16

         dw 0,shade,0,32+0,0 ,1,2,10,9,1 ,0,0,0 ; these surfaces are tested 1st
         dw 0,shade,0,32+0,0 ,10,3,4,11,10 ,0,0,0
         dw 0,shade,0,32+0,0 ,12,11,5,6,12 ,0,0,0
         dw 0,shade,0,32+0,0 ,8,9,12,7,8 ,0,0,0
         dw 0,shade,0,32+0,0 ,2,3,10,2 ,0,0,0

         dw gosub,offset example_of_a_subroutine - offset $

         dw 0,shade,0,32+0,0 ,11,4,5,11 ,0,0,0 ; these surfaces are tested last
         dw 0,shade,0,32+0,0 ,7,12,6,7 ,0,0,0
         dw 0,shade,0,32+0,0 ,1,9,8,1 ,0,0,0
         dw 0,shade,0,32+0,0 ,9,10,11,12,9 ,0,0,0
         dw 0,shade,0,32+0,0 ,6,5,15,16,6 ,0,0,0
         dw 0,shade,0,32+0,0 ,15,4,3,14,15 ,0,0,0 ; object exits here...

example_of_a_subroutine:
         dw 0,shade,0,32+0,0 ,16,15,14,13,16 ,0,0,0 ; these surfaces are tested 2nd
         dw 0,shade,0,32+0,0 ,13,14,2,1,13 ,0,0,0
         dw 0,shade,0,32+0,0 ,7,16,13,8,7 ,0,0,0
         dw 0,shade,0,32+0,0 ,5,4,15,5 ,0,0,0
         dw 0,shade,0,32+0,0 ,14,3,2,14 ,0,0,0
         dw 0,shade,0,32+0,0 ,8,13,1,8 ,0,0,0
         dw 0,shade,0,32+0,0 ,6,16,7,6 ,0,0,0
         dw return

; This  object  is  an  example   of   how   to  use  the  iteration  command.
; Notice how  there  are  only   6 main  surfaces  and  then  5  sub  surfaces.
; If the main surface is not visible,then the sub surfaces are totally skipped.
; _pre_cal_lambert calculates the code offsets in case side is not visible,  but
; I have provided a few to give you an example of what _pre_cal_lambert will do.

; This demonstrates only one level of iteration, you can have as  many
; levels as you want.  Notice how sub iterations are written just like
; main objects.

; Concave surfaces work well when put inside iterations (saves cpu time), but
; convex surfaces don't work well. eg, insides  of  volcanos  are  great  for
; cutting cpu time, but exterior things like rooftop buildings must  be  done
; seperatly (Hint - Inlay the rooftop building below the edge of the roof and
; you can now have the building and all the stuff on the roof in a iteration)

; Iterations save MEGA cpu time!!!

         align 4

headercube4 dd -1                           ; -1=end flag (last resolution)
         dd offset cube4a - offset $ - 4

cube4a   dw 8                               ; how many points
         dw 6                               ; how many surfaces
         dw 25 dup (0)                      ; future use
         ;    x   y   z
         dw -70*4, 70*4, 70*4               ;1 ; the main cube (defines exterior for checking)
         dw -70*4,-70*4, 70*4               ;2
         dw 70*4,-70*4, 70*4                ;3
         dw 70*4, 70*4, 70*4                ;4
         dw -70*4, 70*4,-70*4               ;5
         dw -70*4,-70*4,-70*4               ;6
         dw 70*4,-70*4,-70*4                ;7
         dw 70*4, 70*4,-70*4                ;8

         dw check+iterate,0,0,0,0,1,2,3,1   ; test main surface, dont plot, just check dot product

         dw 4                               ; 4 extra points if visible    (for this iteration, doesn't
         dw 5                               ; 5 extra surfaces if visible   include iterations of iterations)

         dw 0                               ; reserved for offset of new startup location if failure - directs code to next valid surface
         dw 0                               ; reserved for TOTAL number of points to skip if failure - ends up as 4, number of points within iteration

         dw 23 dup (0)                      ; for future use

         ;    x   y   z
         dw -45*4, 45*4, 70*4               ; 9
         dw -45*4,-45*4, 70*4               ;10
         dw 45*4,-45*4, 70*4                ;11
         dw 45*4, 45*4, 70*4                ;12

         ; these sides are always visible (both) because the above  check
         ; confirmed the dot product.  setting "both" option saves time for
         ; checking each surface because the main surface was  visible.
         ; this saves 2 imuls per surface. eg: check the  main  surface
         ; for visibility and all sub surfaces must also be visible.

         dw both,glow ,0, 16*4+0,0,9,10,11,12,9, 0,0,0 ; glow is inverse gouraud shading, what the heck, lets get creative...
         dw both,shade,0, 16*3+0,0,1,2,10,9,1 ,0,0,0
         dw both,last ,0, 16*3+0,0,2,3,11,10,2 ; last = use previous colour (uses gourad)
         dw both,last ,0, 16*3+0,0,3,4,12,11,3 ; previous surface must always
         dw both,last ,0, 16*3+0,0,4,1,9,12,4 ; be visible if this is used

         dw check+iterate,0,0,0,0 ,8,7,6,8  ; testing visibility only requires a triangle, not whole surface

         dw 4                               ; same as above but different points used...
         dw 5

         dw 25 dup (0)

         ;    x   y   z
         dw -45*4, 45*4,-70*4               ;13
         dw -45*4,-45*4,-70*4               ;14
         dw 45*4,-45*4,-70*4                ;15
         dw 45*4, 45*4,-70*4                ;16

         dw both,glow ,0,16*2+0,0,13,16,15,14,13, 0,0,0
         dw both,shade,0,16*7+0,0,5,13,14,6,5 , 0,0,0
         dw both,last ,0,16*7+0,0,6,14,15,7,6
         dw both,last ,0,16*7+0,0,7,15,16,8,7
         dw both,last ,0,16*7+0,0,8,16,13,5,8

         dw check+iterate,0,0,0,0 ,4,3,7,4

         dw 4                               ; concave side, notice how I use the commands below because
         dw 5                               ; we know this side is concave.

         dw 25 dup (0)

         ;    x   y   z
         dw 30*4, 45*4, 45*4                ;17 - make x=70 and plane will be flat
         dw 30*4,-45*4, 45*4                ;18
         dw 30*4,-45*4,-45*4                ;19
         dw 30*4, 45*4,-45*4                ;20

         dw both,shade,0,16*6+0,0 ,17,18,19,20,17, 0,0,0
         dw 0, shade,0,16*9+0,0 ,4,3,18,17,4, 0,0,0 ; <-commands here, i have removed
         dw 0, shade,0,16*9+0,0 ,3,7,19,18,3, 0,0,0 ; "both", 'cause these sides are not
         dw 0, shade,0,16*9+0,0 ,8,20,19,7,8, 0,0,0 ; on the same plane as the original
         dw 0, shade,0,16*9+0,0 ,8,4,17,20,8, 0,0,0 ; iteration check

         dw check+iterate,0,0,0,0 ,5,6,2,5

         dw 4                               ; another concave side
         dw 5

         dw 25 dup (0)

         ;    x   y   z
         dw -30*4, 45*4, 45*4               ;21 ; points are accumulated from original.
         dw -30*4,-45*4, 45*4               ;22 ; eg: <-this point will always be point #22
         dw -30*4,-45*4,-45*4               ;23 ; regardless of whether the above iterations
         dw -30*4, 45*4,-45*4               ;24 ; were processed.

         dw both,shade,0, 16* 2+0,0,21,24,23,22,21, 0,0,0
         dw 0 ,shade,0, 16* 8+0,0,1,21,22,2,1, 0,0,0
         dw 0 ,shade,0, 16* 8+0,0,5,24,21,1,5, 0,0,0
         dw 0 ,shade,0, 16* 8+0,0,6,23,24,5,6, 0,0,0
         dw 0 ,shade,0, 16* 8+0,0,6,2,22,23,6, 0,0,0

         dw check+iterate,0,0,0,0 ,5,1,4,5

         dw 4
         dw 5

         dw 25 dup (0)

         ;    x   y   z
         dw -45*4, 70*4,-45*4               ;25
         dw -45*4, 70*4, 45*4               ;26
         dw 45*4, 70*4, 45*4                ;27
         dw 45*4, 70*4,-45*4                ;28

         dw both,glow ,0, 16*2+0,0,25,26,27,28,25, 0,0,0
         dw both,shade ,0, 16*3+0,0,5,1,26,25,5, 0,0,0
         dw both,last ,0, 16*3+0,0,1,4,27,26,1
         dw both,last ,0, 16*3+0,0,4,8,28,27,4
         dw both,last ,0, 16*3+0,0,8,5,25,28,8

         dw check+iterate,0,0,0,0 ,2,6,7,2

         dw 4
         dw 5

         dw 25 dup (0)

         ;    x   y   z
         dw -45*4,-70*4,-45*4               ;29
         dw -45*4,-70*4, 45*4               ;30
         dw 45*4,-70*4, 45*4                ;31
         dw 45*4,-70*4,-45*4                ;32

         dw both,glow ,0,16*5 +0,0,29,32,31,30,29, 0,0,0
         dw both,shade,0,16*2 +0,0,6,29,30,2,6, 0,0,0
         dw both,last ,0,16*2 +0,0,2,30,31,3,2
         dw both,last ,0,16*2 +0,0,3,31,32,7,3
         dw both,last ,0,16*2 +0,0,7,32,29,6,7

         align 4

headerarm dd -1
         dd offset cheaparma - offset $ - 4

cheaparma dw 8                              ; how many points
         dw 12                              ; how many surfaces
         dw 25 dup (0)                      ; future use
         ;    x   y   z
         dw -70*4, 25*4, 110*4              ;1
         dw -70*4,-25*4, 110*4              ;2
         dw 70*4,-25*4, 110*4               ;3
         dw 70*4, 25*4, 110*4               ;4
         dw -70*4, 25*4,-110*4              ;5
         dw -70*4,-25*4,-110*4              ;6
         dw 70*4,-25*4,-110*4               ;7
         dw 70*4, 25*4,-110*4               ;8

         dw normal,shade+mesh,0,16*6 ,0 ,1,2,3,4,1 ,0,0,0
         dw normal,shade+mesh,0,16*6 ,0 ,8,7,6,5,8 ,0,0,0
         dw normal,shade+mesh,0,16*6 ,0 ,4,3,7,8,4 ,0,0,0
         dw normal,shade+mesh,0,16*6 ,0 ,5,6,2,1,5 ,0,0,0
         dw normal,shade+mesh,0,16*6 ,0 ,5,1,4,8,5 ,0,0,0
         dw normal,shade+mesh,0,16*6 ,0 ,2,6,7,3,2 ,0,0,0
         dw push_location
         dw push_matrix
         dw sub_object                      ; this is the same as dw matrix+check+iterate+both,0,0,0,0,0,0

         dw 8                               ; how many points
         dw 6                               ; how many surfaces

         dw 0,0                             ; reserved, offset of total skip, number of points to skip
         dw 0                               ; flag, +1=is there a point offset below0
         dw 100,520,0                       ; point offset
         dw 1                               ; new matrix load location
         dw 9                               ; point addition for connection data (all points are now point+8, eg 1+8,2+8...)
         dd 5000000                         ; maximum distance object is seen
         dd 200                             ; minimum distance object is seen
         dd 300                             ; tolerancing for x/y max/min

         dw 11 dup (0)                      ; future use
         ;    x   y   z
         dw -35*4, 30*4, 30*4               ;10
         dw -35*4,-30*4, 30*4               ;11
         dw 20*4,-30*4, 30*4                ;12
         dw 20*4, 30*4, 30*4                ;13
         dw -35*4, 20*4,-20*4               ;14
         dw -35*4,-20*4,-20*4               ;15
         dw 40*4,-20*4,-20*4                ;16
         dw 40*4, 20*4,-20*4                ;17

         dw normal,shade,0,16*4 ,0 ,1,2,3,4,1 ,0,0,0
         dw normal,shade,0,16*4 ,0 ,8,7,6,5,8 ,0,0,0
         dw normal,shade,0,16*4 ,0 ,4,3,7,8,4 ,0,0,0
         dw normal,shade,0,16*4 ,0 ,5,6,2,1,5 ,0,0,0
         dw normal,shade,0,16*4 ,0 ,5,1,4,8,5 ,0,0,0
         dw normal,shade,0,16*4 ,0 ,2,6,7,3,2 ,0,0,0

         dw pop_matrix
         dw pop_location
         dw sub_object                      ; this is the same as dw matrix+check+iterate+both,0,0,0,0,0,0

         dw 8                               ; how many points
         dw 6                               ; how many surfaces

         dw 0,0                             ; reserved
         dw 0                               ; reserved
         dw -100,-530,0                     ; point offset
         dw 2                               ; new matrix load location
         dw 18                              ; connection addition (base)

         dw 17 dup (0)                      ; future use
         ;    x   y   z
         dw -40*4, 40*4, 30*4               ;19
         dw -40*4,-40*4, 30*4               ;20
         dw 20*4,-40*4, 30*4                ;21
         dw 20*4, 40*4, 30*4                ;21
         dw -30*4, 20*4,-50*4               ;22
         dw -30*4,-20*4,-50*4               ;23
         dw 40*4,-20*4,-50*4                ;24
         dw 40*4, 20*4,-50*4                ;25

         dw normal,shade,0,16*8 ,0 ,1,2,3,4,1 ,0,0,0
         dw normal,shade,0,16*8 ,0 ,8,7,6,5,8 ,0,0,0
         dw normal,shade,0,16*8 ,0 ,4,3,7,8,4 ,0,0,0
         dw normal,shade,0,16*8 ,0 ,5,6,2,1,5 ,0,0,0
         dw normal,shade,0,16*8 ,0 ,5,1,4,8,5 ,0,0,0
         dw normal,shade,0,16*8 ,0 ,2,6,7,3,2 ,0,0,0

; This is the same object as the boxes above but without  the  main  box.
; notice how it starts with 0 points!  the entire object simply points to
; other sub-objects.

headerarm2 dd -1
         dd offset cheaparma2 - offset $ - 4

cheaparma2 dw 0                             ; how many points
         dw 6                               ; how many surfaces
         dw 25 dup (0)                      ; future use

         dw push_location
         dw push_matrix
         dw sub_object                      ; this is the same as dw matrix+check+iterate,0,0,0,0,0,0

         dw 8                               ; how many points
         dw 6                               ; how many surfaces

         dw 0,0                             ; reserved, offset of total skip, number of points to skip
         dw 0                               ; flag, +1=is there a point offset below0
         dw 20,130,0                        ; point offset
         dw 1                               ; new matrix load location
         dw 1

         dw 17 dup (0)                      ; future use
         ;    x   y   z
         dw -35, 30, 30                     ;2
         dw -35,-30, 30                     ;3
         dw 20,-30, 30                      ;4
         dw 20, 30, 30                      ;5
         dw -35, 20,-20                     ;6
         dw -35,-20,-20                     ;7
         dw 40,-20,-20                      ;8
         dw 40, 20,-20                      ;9

         dw normal,shade,0,16*4 ,0 ,1+0,2+0,3+0,4+0,1+0 ,0,0,0
         dw normal,shade,0,16*4 ,0 ,8+0,7+0,6+0,5+0,8+0 ,0,0,0
         dw normal,shade,0,16*4 ,0 ,4+0,3+0,7+0,8+0,4+0 ,0,0,0
         dw normal,shade,0,16*4 ,0 ,5+0,6+0,2+0,1+0,5+0 ,0,0,0
         dw normal,shade,0,16*4 ,0 ,5+0,1+0,4+0,8+0,5+0 ,0,0,0
         dw normal,shade,0,16*4 ,0 ,2+0,6+0,7+0,3+0,2+0 ,0,0,0

         dw pop_matrix
         dw pop_location
         dw sub_object                      ; this is the same as dw matrix+check+iterate,0,0,0,0,0,0

         dw 8                               ; how many points
         dw 6                               ; how many surfaces

         dw 0,0                             ; reserved
         dw 0
         dw 20,-120,0                       ; point offset
         dw 2                               ; new matrix load location
         dw 2

         dw 17 dup (0)                      ; future use
         ;    x   y   z
         dw -40, 40, 30                     ;11
         dw -40,-40, 30                     ;12
         dw 20,-40, 30                      ;13
         dw 20, 40, 30                      ;14
         dw -30, 20,-50                     ;15
         dw -30,-20,-50                     ;16
         dw 40,-20,-50                      ;17
         dw 40, 20,-50                      ;18

         dw normal,shade,0,16*8 ,0 ,1+8*1,2+8*1,3+8*1,4+8*1,1+8*1 ,0,0,0
         dw normal,shade,0,16*8 ,0 ,8+8*1,7+8*1,6+8*1,5+8*1,8+8*1 ,0,0,0
         dw normal,shade,0,16*8 ,0 ,4+8*1,3+8*1,7+8*1,8+8*1,4+8*1 ,0,0,0
         dw normal,shade,0,16*8 ,0 ,5+8*1,6+8*1,2+8*1,1+8*1,5+8*1 ,0,0,0
         dw normal,shade,0,16*8 ,0 ,5+8*1,1+8*1,4+8*1,8+8*1,5+8*1 ,0,0,0
         dw normal,shade,0,16*8 ,0 ,2+8*1,6+8*1,7+8*1,3+8*1,2+8*1 ,0,0,0

archmiddle dd -1
         dd offset arch1 - offset $ - 4

arch1    dw 20
         dw 10
         dw 0,0,0,0,0,0,0,0
         dw 17 dup (0)

         dw 402, 240,-100                   ; 1
         dw 402, 240, 100                   ; 2
         dw 402,-240,-100                   ; 3
         dw 402,-240, 100                   ; 4
         dw -402,-240,-100                  ; 5
         dw -402,-240, 100                  ; 6
         dw -402, 240,-100                  ; 7
         dw -402, 240, 100                  ; 8

         dw -330, 100,-100                  ; 9
         dw -330, 100, 100                  ; 10
         dw -250, 50,-100                   ; 11
         dw -250, 50, 100                   ; 12
         dw -100, 0,-100                    ; 13
         dw -100, 0, 100                    ; 14
         dw 50, 50,-100                     ; 15
         dw 50, 50, 100                     ; 16
         dw 130, 100,-100                   ; 17
         dw 130, 100, 100                   ; 18
         dw 200, 240,-100                   ; 19
         dw 200, 240, 100                   ; 20

         dw iterate+onscr+check,0,0,0,0,1,3,5,7,1

         dw 0
         dw 6
         dw 25 dup (0)

         dw both,0,0,16*6+7,0 ,1,3,17,19,1
         dw both,0,0,16*6+7,0 ,17,3,15,17
         dw both,0,0,16*6+7,0 ,15,3,5,13,15
         dw both,0,0,16*6+7,0 ,13,5,11,13
         dw both,0,0,16*6+7,0 ,11,5,9,11
         dw both,0,0,16*6+7,0 ,9,5,7,9

         dw iterate+onscr+check,0,0,0,0,2,8,6,4,2

         dw 0
         dw 6
         dw 0,0,0,0,0,0,0,1
         dw 17 dup (0)

         dw both,0,0,16*6+14,0 ,1,3,17,19,1
         dw both,0,0,16*6+14,0 ,17,3,15,17
         dw both,0,0,16*6+14,0 ,15,3,5,13,15
         dw both,0,0,16*6+14,0 ,13,5,11,13
         dw both,0,0,16*6+14,0 ,11,5,9,11
         dw both,0,0,16*6+14,0 ,9,5,7,9

         dw 0,0,0,16*6+15,0, 3,4,6,5,3
         dw 0,0,0,16*6+4,0, 1,19,20,2,1

         dw 0,0,0,16*6+13,0, 7,8,10,9,7
         dw 0,0,0,16*6+12,0, 9,10,12,11,9
         dw 0,0,0,16*6+11,0, 11,12,14,13,11
         dw 0,0,0,16*6+ 9,0, 13,14,16,15,13
         dw 0,0,0,16*6+ 7,0, 15,16,18,17,15
         dw 0,0,0,16*6+ 6,0, 17,18,20,19,17

archmiddl6 dd -1
         dd offset arch6 - offset $ - 4

arch6    dw 20
         dw 10
         dw 0,0,0,0,0,0,0,0
         dw 17 dup (0)

         dw -100, 240,-402                  ; 1
         dw 100, 240,-402                   ; 2
         dw -100,-240,-402                  ; 3
         dw 100,-240,-402                   ; 4
         dw -100,-240, 402                  ; 5
         dw 100,-240, 402                   ; 6
         dw -100, 240, 402                  ; 7
         dw 100, 240, 402                   ; 8

         dw -100, 100, 330                  ; 9
         dw 100, 100, 330                   ; 10
         dw -100, 50, 250                   ; 11
         dw 100, 50, 250                    ; 12
         dw -100, 0, 100                    ; 13
         dw 100, 0, 100                     ; 14
         dw -100, 50, -50                   ; 15
         dw 100, 50, -50                    ; 16
         dw -100, 100,-130                  ; 17
         dw 100, 100,-130                   ; 18
         dw -100, 240,-200                  ; 19
         dw 100, 240,-200                   ; 20

         dw iterate+onscr+check,0,0,0,0,1,3,5,7,1

         dw 0
         dw 6
         dw 25 dup (0)

         dw both,0,0,16*6+7,0 ,1,3,17,19,1
         dw both,0,0,16*6+7,0 ,17,3,15,17
         dw both,0,0,16*6+7,0 ,15,3,5,13,15
         dw both,0,0,16*6+7,0 ,13,5,11,13
         dw both,0,0,16*6+7,0 ,11,5,9,11
         dw both,0,0,16*6+7,0 ,9,5,7,9

         dw iterate+onscr+check,0,0,0,0,2,8,6,4,2

         dw 0
         dw 6
         dw 0,0,0,0,0,0,0,1
         dw 17 dup (0)

         dw both,0,0,16*6+14,0 ,1,3,17,19,1
         dw both,0,0,16*6+14,0 ,17,3,15,17
         dw both,0,0,16*6+14,0 ,15,3,5,13,15
         dw both,0,0,16*6+14,0 ,13,5,11,13
         dw both,0,0,16*6+14,0 ,11,5,9,11
         dw both,0,0,16*6+14,0 ,9,5,7,9

         dw 0,0,0,16*6+15,0, 3,4,6,5,3
         dw 0,0,0,16*6+4,0, 1,19,20,2,1

         dw 0,0,0,16*6+13,0, 7,8,10,9,7
         dw 0,0,0,16*6+12,0, 9,10,12,11,9
         dw 0,0,0,16*6+11,0, 11,12,14,13,11
         dw 0,0,0,16*6+ 9,0, 13,14,16,15,13
         dw 0,0,0,16*6+ 7,0, 15,16,18,17,15
         dw 0,0,0,16*6+ 6,0, 17,18,20,19,17

archmiddl3 dd -1
         dd offset arch3 - offset $ - 4

arch3    dw 20
         dw 10
         dw 0,0,0,0,0,0,0,0
         dw 17 dup (0)

         dw -402, 240, 100                  ; 1
         dw -402, 240,-100                  ; 2
         dw -402,-240, 100                  ; 3
         dw -402,-240,-100                  ; 4
         dw 402,-240, 100                   ; 5
         dw 402,-240,-100                   ; 6
         dw 402, 240, 100                   ; 7
         dw 402, 240,-100                   ; 8

         dw 330, 100, 100                   ; 9
         dw 330, 100,-100                   ; 10
         dw 250, 50, 100                    ; 11
         dw 250, 50,-100                    ; 12
         dw 100, 0, 100                     ; 13
         dw 100, 0,-100                     ; 14
         dw -50, 50, 100                    ; 15
         dw -50, 50,-100                    ; 16
         dw -130, 100, 100                  ; 17
         dw -130, 100,-100                  ; 18
         dw -200, 240, 100                  ; 19
         dw -200, 240,-100                  ; 20

         dw iterate+onscr+check,0,0,0,0,1,3,5,7,1

         dw 0
         dw 6
         dw 25 dup (0)

         dw both,0,0,16*6+14,0 ,1,3,17,19,1
         dw both,0,0,16*6+14,0 ,17,3,15,17
         dw both,0,0,16*6+14,0 ,15,3,5,13,15
         dw both,0,0,16*6+14,0 ,13,5,11,13
         dw both,0,0,16*6+14,0 ,11,5,9,11
         dw both,0,0,16*6+14,0 ,9,5,7,9

         dw iterate+onscr+check,0,0,0,0,2,8,6,4,2

         dw 0
         dw 6
         dw 0,0,0,0,0,0,0,1
         dw 17 dup (0)

         dw both,0,0,16*6+7,0 ,1,3,17,19,1
         dw both,0,0,16*6+7,0 ,17,3,15,17
         dw both,0,0,16*6+7,0 ,15,3,5,13,15
         dw both,0,0,16*6+7,0 ,13,5,11,13
         dw both,0,0,16*6+7,0 ,11,5,9,11
         dw both,0,0,16*6+7,0 ,9,5,7,9

         dw 0,0,0,16*6+15,0, 3,4,6,5,3
         dw 0,0,0,16*6+4,0, 1,19,20,2,1

         dw 0,0,0,16*6+ 5,0, 7,8,10,9,7
         dw 0,0,0,16*6+ 6,0, 9,10,12,11,9
         dw 0,0,0,16*6+ 8,0, 11,12,14,13,11
         dw 0,0,0,16*6+10,0, 13,14,16,15,13
         dw 0,0,0,16*6+11,0, 15,16,18,17,15
         dw 0,0,0,16*6+13,0, 17,18,20,19,17

archmiddl4 dd -1
         dd offset arch4 - offset $ - 4

arch4    dw 20
         dw 10
         dw 0,0,0,0,0,0,0,0
         dw 17 dup (0)

         dw 100, 240, 402                   ; 1
         dw -100, 240, 402                  ; 2
         dw 100,-240, 402                   ; 3
         dw -100,-240, 402                  ; 4
         dw 100,-240,-402                   ; 5
         dw -100,-240,-402                  ; 6
         dw 100, 240,-402                   ; 7
         dw -100, 240,-402                  ; 8

         dw 100, 100,-330                   ; 9
         dw -100, 100,-330                  ; 10
         dw 100, 50,-250                    ; 11
         dw -100, 50,-250                   ; 12
         dw 100, 0,-100                     ; 13
         dw -100, 0,-100                    ; 14
         dw 100, 50, 50                     ; 15
         dw -100, 50, 50                    ; 16
         dw 100, 100, 130                   ; 17
         dw -100, 100, 130                  ; 18
         dw 100, 240, 200                   ; 19
         dw -100, 240, 200                  ; 20

         dw iterate+onscr+check,0,0,0,0,1,3,5,7,1

         dw 0
         dw 6
         dw 25 dup (0)

         dw both,0,0,16*6+7,0 ,1,3,17,19,1
         dw both,0,0,16*6+7,0 ,17,3,15,17
         dw both,0,0,16*6+7,0 ,15,3,5,13,15
         dw both,0,0,16*6+7,0 ,13,5,11,13
         dw both,0,0,16*6+7,0 ,11,5,9,11
         dw both,0,0,16*6+7,0 ,9,5,7,9

         dw iterate+onscr+check,0,0,0,0,2,8,6,4,2

         dw 0
         dw 6
         dw 0,0,0,0,0,0,0,1
         dw 17 dup (0)

         dw both,0,0,16*6+14,0 ,1,3,17,19,1
         dw both,0,0,16*6+14,0 ,17,3,15,17
         dw both,0,0,16*6+14,0 ,15,3,5,13,15
         dw both,0,0,16*6+14,0 ,13,5,11,13
         dw both,0,0,16*6+14,0 ,11,5,9,11
         dw both,0,0,16*6+14,0 ,9,5,7,9

         dw 0,0,0,16*6+15,0, 3,4,6,5,3
         dw 0,0,0,16*6+4,0, 1,19,20,2,1

         dw 0,0,0,16*6+13,0, 7,8,10,9,7
         dw 0,0,0,16*6+12,0, 9,10,12,11,9
         dw 0,0,0,16*6+11,0, 11,12,14,13,11
         dw 0,0,0,16*6+ 9,0, 13,14,16,15,13
         dw 0,0,0,16*6+ 7,0, 15,16,18,17,15
         dw 0,0,0,16*6+ 6,0, 17,18,20,19,17

archend  dd -1
         dd offset arch2 - offset $ - 4

arch2    dw 21
         dw 11
         dw 0,0,0,0,0,0,0,0
         dw 17 dup (0)

         dw 402, 240,-100                   ; 1
         dw 402, 240, 100                   ; 2
         dw 402,-240,-100                   ; 3
         dw 402,-240, 100                   ; 4
         dw -402,-240,-100                  ; 5
         dw -402,-240, 100                  ; 6
         dw -402, 240,-100                  ; 7
         dw -402, 240, 100                  ; 8

         dw -330, 100,-100                  ; 9
         dw -330, 100, 100                  ; 10
         dw -250, 50,-100                   ; 11
         dw -250, 50, 100                   ; 12
         dw -100, 0,-100                    ; 13
         dw -100, 0, 100                    ; 14
         dw 50, 50,-100                     ; 15
         dw 50, 50, 100                     ; 16
         dw 130, 100,-100                   ; 17
         dw 130, 100, 100                   ; 18
         dw 200, 240,-100                   ; 19
         dw 200, 240, 100                   ; 20

         dw 200,-240, 100                   ; 21

         dw iterate+onscr+check,0,0,0,0,1,3,5,7,1

         dw 0
         dw 6
         dw 25 dup (0)

         dw both,0,0,16*6+7,0 ,1,3,17,19,1
         dw both,0,0,16*6+7,0 ,17,3,15,17
         dw both,0,0,16*6+7,0 ,15,3,5,13,15
         dw both,0,0,16*6+7,0 ,13,5,11,13
         dw both,0,0,16*6+7,0 ,11,5,9,11
         dw both,0,0,16*6+7,0 ,9,5,7,9

         dw iterate+onscr+check,0,0,0,0,2,8,6,4,2

         dw 0
         dw 6
         dw 0,0,0,0,0,0,0,1
         dw 17 dup (0)

         dw both,0,0,16*6+14,0 ,20,17,19,20
         dw both,0,0,16*6+14,0 ,17,20,15,17
         dw both,0,0,16*6+14,0 ,15,20,5,13,15
         dw both,0,0,16*6+14,0 ,13,5,11,13
         dw both,0,0,16*6+14,0 ,11,5,9,11
         dw both,0,0,16*6+14,0 ,9,5,7,9

         dw 0,0,0,16*6+15,0, 3,4,6,5,3
         dw 0,0,0,16*6+4,0, 1,19,20,2,1
         dw 0,0,0,16*6+7,0, 1,2,4,3,1

         dw 0,0,0,16*6+13,0, 7,8,10,9,7
         dw 0,0,0,16*6+12,0, 9,10,12,11,9
         dw 0,0,0,16*6+11,0, 11,12,14,13,11
         dw 0,0,0,16*6+ 9,0, 13,14,16,15,13
         dw 0,0,0,16*6+ 7,0, 15,16,18,17,15
         dw 0,0,0,16*6+ 6,0, 17,18,20,19,17

column   dd -1
         dd offset colmn1 - offset $ - 4

colmn1   dw 16
         dw 8
         dw 0,0,0,0,0,0,0,0
         dw 17 dup (0)

         dw 32,-450,-80                     ; 1
         dw 80,-450,-32                     ; 2
         dw 80,-450, 32                     ; 3
         dw 32,-450, 80                     ; 4
         dw -32,-450, 80                    ; 5
         dw -80,-450, 32                    ; 6
         dw -80,-450,-32                    ; 7
         dw -32,-450,-80                    ; 8
         dw 32, 450,-80                     ; 9
         dw 80, 450,-32                     ;10
         dw 80, 450, 32                     ;11
         dw 32, 450, 80                     ;12
         dw -32, 450, 80                    ;13
         dw -80, 450, 32                    ;14
         dw -80, 450,-32                    ;15
         dw -32, 450,-80                    ;16

         dw 0,0,0,16*3+ 6,0, 1,8,16,9,1
         dw 0,0,0,16*3+ 8,0, 2,1,9,10,2
         dw 0,0,0,16*3+10,0, 3,2,10,11,3
         dw 0,0,0,16*3+12,0, 4,3,11,12,4
         dw 0,0,0,16*3+14,0, 5,4,12,13,5
         dw 0,0,0,16*3+11,0, 6,5,13,14,6
         dw 0,0,0,16*3+ 9,0, 7,6,14,15,7
         dw 0,0,0,16*3+ 7,0, 8,7,15,16,8

fourdrums dd -1
         dd offset oil4 - offset $ - 4

oil4     dw 0
         dw 4
         dw 25 dup (0)

         dw static_sub_object

         dw 16
         dw 9
         dw 0,0,0
         dw 2000,0,-2000
         dw 0,0
         dw 17 dup (0)

         dw 290,-350,-700                   ; 1
         dw 700,-350,-290                   ; 2
         dw 700,-350, 290                   ; 3
         dw 290,-350, 700                   ; 4
         dw -290,-350, 700                  ; 5
         dw -700,-350, 290                  ; 6
         dw -700,-350,-290                  ; 7
         dw -290,-350,-700                  ; 8
         dw 290, 350,-700                   ; 9
         dw 700, 350,-290                   ;10
         dw 700, 350, 290                   ;11
         dw 290, 350, 700                   ;12
         dw -290, 350, 700                  ;13
         dw -700, 350, 290                  ;14
         dw -700, 350,-290                  ;15
         dw -290, 350,-700                  ;16

         dw 0,0,0,16*2+ 6,0, 1,8,16,9,1
         dw 0,0,0,16*2+ 8,0, 2,1,9,10,2
         dw 0,0,0,16*2+10,0, 3,2,10,11,3
         dw 0,0,0,16*2+12,0, 4,3,11,12,4
         dw 0,0,0,16*2+14,0, 5,4,12,13,5
         dw 0,0,0,16*2+11,0, 6,5,13,14,6
         dw 0,0,0,16*2+ 9,0, 7,6,14,15,7
         dw 0,0,0,16*2+ 7,0, 8,7,15,16,8
         dw 0,0,0,16*2+15,0, 1,2,3,4,5,6,7,8,1

         dw static_sub_object

         dw 16
         dw 9
         dw 0,0,0
         dw 0,0,4000
         dw 0,16
         dw 17 dup (0)

         dw 290,-350,-700                   ; 1
         dw 700,-350,-290                   ; 2
         dw 700,-350, 290                   ; 3
         dw 290,-350, 700                   ; 4
         dw -290,-350, 700                  ; 5
         dw -700,-350, 290                  ; 6
         dw -700,-350,-290                  ; 7
         dw -290,-350,-700                  ; 8
         dw 290, 350,-700                   ; 9
         dw 700, 350,-290                   ;10
         dw 700, 350, 290                   ;11
         dw 290, 350, 700                   ;12
         dw -290, 350, 700                  ;13
         dw -700, 350, 290                  ;14
         dw -700, 350,-290                  ;15
         dw -290, 350,-700                  ;16

         dw 0,0,0,16*2+ 6,0, 1,8,16,9,1
         dw 0,0,0,16*2+ 8,0, 2,1,9,10,2
         dw 0,0,0,16*2+10,0, 3,2,10,11,3
         dw 0,0,0,16*2+12,0, 4,3,11,12,4
         dw 0,0,0,16*2+14,0, 5,4,12,13,5
         dw 0,0,0,16*2+11,0, 6,5,13,14,6
         dw 0,0,0,16*2+ 9,0, 7,6,14,15,7
         dw 0,0,0,16*2+ 7,0, 8,7,15,16,8
         dw 0,0,0,16*2+15,0, 1,2,3,4,5,6,7,8,1

         dw static_sub_object

         dw 16
         dw 9
         dw 0,0,0
         dw -4000,0,0
         dw 0,32
         dw 17 dup (0)

         dw 290,-350,-700                   ; 1
         dw 700,-350,-290                   ; 2
         dw 700,-350, 290                   ; 3
         dw 290,-350, 700                   ; 4
         dw -290,-350, 700                  ; 5
         dw -700,-350, 290                  ; 6
         dw -700,-350,-290                  ; 7
         dw -290,-350,-700                  ; 8
         dw 290, 350,-700                   ; 9
         dw 700, 350,-290                   ;10
         dw 700, 350, 290                   ;11
         dw 290, 350, 700                   ;12
         dw -290, 350, 700                  ;13
         dw -700, 350, 290                  ;14
         dw -700, 350,-290                  ;15
         dw -290, 350,-700                  ;16

         dw 0,0,0,16*2+ 6,0, 1,8,16,9,1
         dw 0,0,0,16*2+ 8,0, 2,1,9,10,2
         dw 0,0,0,16*2+10,0, 3,2,10,11,3
         dw 0,0,0,16*2+12,0, 4,3,11,12,4
         dw 0,0,0,16*2+14,0, 5,4,12,13,5
         dw 0,0,0,16*2+11,0, 6,5,13,14,6
         dw 0,0,0,16*2+ 9,0, 7,6,14,15,7
         dw 0,0,0,16*2+ 7,0, 8,7,15,16,8
         dw 0,0,0,16*2+15,0, 1,2,3,4,5,6,7,8,1

         dw static_sub_object

         dw 16
         dw 9
         dw 0,0,0
         dw 0,0,-4000
         dw 0,48
         dw 17 dup (0)

         dw 290,-350,-700                   ; 1
         dw 700,-350,-290                   ; 2
         dw 700,-350, 290                   ; 3
         dw 290,-350, 700                   ; 4
         dw -290,-350, 700                  ; 5
         dw -700,-350, 290                  ; 6
         dw -700,-350,-290                  ; 7
         dw -290,-350,-700                  ; 8
         dw 290, 350,-700                   ; 9
         dw 700, 350,-290                   ;10
         dw 700, 350, 290                   ;11
         dw 290, 350, 700                   ;12
         dw -290, 350, 700                  ;13
         dw -700, 350, 290                  ;14
         dw -700, 350,-290                  ;15
         dw -290, 350,-700                  ;16

         dw 0,0,0,16*2+ 6,0, 1,8,16,9,1
         dw 0,0,0,16*2+ 8,0, 2,1,9,10,2
         dw 0,0,0,16*2+10,0, 3,2,10,11,3
         dw 0,0,0,16*2+12,0, 4,3,11,12,4
         dw 0,0,0,16*2+14,0, 5,4,12,13,5
         dw 0,0,0,16*2+11,0, 6,5,13,14,6
         dw 0,0,0,16*2+ 9,0, 7,6,14,15,7
         dw 0,0,0,16*2+ 7,0, 8,7,15,16,8
         dw 0,0,0,16*2+15,0, 1,2,3,4,5,6,7,8,1

bigoildrum dd -1
         dd offset oil1 - offset $ - 4

oil1     dw 16
         dw 9
         dw 0,0,0,0,0,0,0,0
         dw 17 dup (0)

         dw 290,-350,-700                   ; 1
         dw 700,-350,-290                   ; 2
         dw 700,-350, 290                   ; 3
         dw 290,-350, 700                   ; 4
         dw -290,-350, 700                  ; 5
         dw -700,-350, 290                  ; 6
         dw -700,-350,-290                  ; 7
         dw -290,-350,-700                  ; 8
         dw 290, 350,-700                   ; 9
         dw 700, 350,-290                   ;10
         dw 700, 350, 290                   ;11
         dw 290, 350, 700                   ;12
         dw -290, 350, 700                  ;13
         dw -700, 350, 290                  ;14
         dw -700, 350,-290                  ;15
         dw -290, 350,-700                  ;16

         dw 0,0,0,16*2+ 6,0, 1,8,16,9,1
         dw 0,0,0,16*2+ 8,0, 2,1,9,10,2
         dw 0,0,0,16*2+10,0, 3,2,10,11,3
         dw 0,0,0,16*2+12,0, 4,3,11,12,4
         dw 0,0,0,16*2+14,0, 5,4,12,13,5
         dw 0,0,0,16*2+11,0, 6,5,13,14,6
         dw 0,0,0,16*2+ 9,0, 7,6,14,15,7
         dw 0,0,0,16*2+ 7,0, 8,7,15,16,8
         dw 0,0,0,16*2+15,0, 1,2,3,4,5,6,7,8,1

         align 4

futurecrewrip1:
         dd -1
         dd offset fcrip1 - offset $ - 4

fcrip1:  dw 17
         dw 12
         dw 25 dup (0)

         dw -200, 130,-200
         dw 200, 130,-200
         dw 200, 130, 200
         dw -200, 130, 200
         dw -110, 0,-110
         dw -55, 5,-110
         dw 55, 5,-110
         dw 110, 0,-110
         dw 110, 5, -55
         dw 110, 5, 55
         dw 110, 0, 110
         dw 55, 5, 110
         dw -55, 5, 110
         dw -110, 0, 110
         dw -110, 5, 55
         dw -110, 5, -55
         dw 0,-280, 0

         dw double,0,0,16*3+11,16*1+ 3, 1,2,8,5,1
         dw double,0,0,16*3+14,16*1+ 5, 2,3,11,8,2
         dw double,0,0,16*3+ 8,16*1+ 7, 3,4,14,11,3
         dw double,0,0,16*3+ 4,16*1+ 9, 4,1,5,14,4
         dw double,0,0,16*3+15,16*1+0, 17,5,6,17
         dw double,0,0,16*3+15,16*1+0, 17,7,8,17
         dw double,0,0,16*3+12,16*1+2, 17,8,9,17
         dw double,0,0,16*3+12,16*1+2, 17,10,11,17
         dw double,0,0,16*3+ 9,16*1+4, 17,11,12,17
         dw double,0,0,16*3+ 9,16*1+4, 17,13,14,17
         dw double,0,0,16*3+ 6,16*1+6, 17,14,15,17
         dw double,0,0,16*3+ 6,16*1+6, 17,16,5,17


zzline dd -1
       dd offset zz1 - offset $ - 4

zz1:   dw 1
       dw 1

       dw 25 dup (0)

       dw 0,0,2000

       dw 0,0,0,14,0,0,1,0

[ RETURN TO DIRECTORY ]