
OrderZones:

 move.l ListOfGraphRooms,a0
; a0=list of rooms to draw.


 move.l #ToDrawTab,a1
 move.l a1,a3

 moveq #99,d0
 moveq #0,d1
.clrtab:
 move.l d1,(a1)+
 dbra d0,.clrtab

 move.l a0,a1
 move.l #OrderTab,a5

settodraw:
 move.l (a1),d0
 blt.s nomoreset
 
 move.l d0,a2
 move.w (a2),d0
 st (a3,d0.w)
 adda.w #10,a1
 bra.s settodraw
 
nomoreset:

; We now have a table with $ff rep.
; a room to be drawn at some stage.

 move.w ([a0]),d0
 move.w d0,OrderTab+2+8
 move.w #-1,OrderTab+4+8
 move.w #0,OrderTab+8
 move.w #1,OrderTab+6+8
 move.w #1,OrderTab+4
 move.w #-1,OrderTab
 move.w #-1,OrderTab+2
 move.w #2,d5 ; off end of list.
 
 move.w #7,d7	; which ones to look
 		; at.

OrderLoop:

 clr.b d6	; flag for new zones
 		; added.

 move.l #OrderTab,a5
 		
RunThroughList:

 tst.w 6(a5)
 bra.s anewone

 move.w 4(a5),d0
 blt doneallthispass
 move.l #OrderTab,a5	
 lea (a5,d0.w*8),a5
 bra RunThroughList

anewone:

 move.w #0,6(a5)
 move.l #FloorLines,a1

 move.w 2(a5),d0
 move.l #ZoneAdds,a0
 move.l (a0,d0.w*4),a0

 adda.w #14,a0
findexits:
 move.w (a0)+,d0
 bge.s findexits
 addq #2,a0

 bsr InsertList

 move.w 4(a5),d0
 blt doneallthispass
 move.l #OrderTab,a5	
 lea (a5,d0.w*8),a5
 bra RunThroughList

doneallthispass:


 tst.b d6
 bne OrderLoop

 move.l #OrderTab,a5
 move.w 4(a5),d0
 lea (a5,d0.w*8),a5

 move.l #FinalOrder,a0
 
showorder:
 move.w 2(a5),(a0)+
 move.w 4(a5),d0
 blt.s doneorder
 move.l #OrderTab,a5
 lea (a5,d0.w*8),a5
 bra showorder

doneorder:

 move.l a0,endoflist

 move.w #-1,(a0)+

 rts
 
endoflist: dc.l 0

InsertList

 move.w (a0)+,d0	; floor line
 blt allinlist

 move.l #ToDrawTab,a3

 asl.w #4,d0
 move.l 8(a1,d0.w),a2
 move.w (a2),d1
 tst.b (a3,d1.w)
 beq notindrawlist

; Here is a room in the draw list.
; Find out if it is further away
; or closer than the current zone.

 move.w xoff,d2
 move.w zoff,d3
 sub.w (a1,d0.w),d2
 sub.w 2(a1,d0.w),d3
 muls 6(a1,d0.w),d2
 muls 4(a1,d0.w),d3
 sub.l d3,d2
 bge PutFurtherAway
 
************************************** 

 bra PutDone

**************************************

PutFurtherAway:

 move.l a5,a4

.lookfurther:
 move.w 4(a4),d0
 blt.s .notfurther
 move.l #OrderTab,a4
 lea (a4,d0.w*8),a4
 cmp.w 2(a4),d1
 bne .lookfurther

; Already in list so do nothing.
 
 bra .wasfurther
 
.notfurther:

; Might be closer so check

 move.l a5,a3

.lookcloser:
 move.w (a3),d0
 blt .notcloser
 move.l #OrderTab,a3
 lea (a3,d0.w*8),a3
 cmp.w 2(a3),d1
 bne .lookcloser

; Oh dear! it is closer!
; Have to get rid of it!

 move.l #OrderTab,a6
 move.w 4(a3),d0
 tst.w 6(a6,d0.w*8)
 beq.s .nomoreafter
.moreafter:
 move.w 4(a6,d0.w*8),d0
 tst.w 6(a6,d0.w*8)
 bne.s .moreafter

.nomoreafter:
 move.w (a6,d0.w*8),d0
 move.l #OrderTab,a6
 lea (a6,d0.w*8),a6 ; end of list

 move.w (a3),d0
 move.w 4(a6),d2
 move.l #OrderTab,a2
 lea (a2,d2.w*8),a4
 lea (a2,d0.w*8),a2
 
 move.w 4(a2),d3
 move.w (a4),d4
 
 move.w d2,4(a2)
 move.w d0,(a4)
 
 st d6
 
 move.w 4(a5),d0
 blt.s .append
 
 move.l #OrderTab,a4
 lea (a4,d0.w*8),a4
 move.w d0,4(a6)
 move.w (a4),(a3)
 move.w d4,(a4)
 move.w d3,4(a5)
 
 move.l a6,a5

 bra .wasfurther
 
.append

 move.w d0,4(a6)
 move.w (a5),d0
 move.w d3,4(a5)
 move.l #OrderTab,a4
 move.w 4(a4,d0.w*8),(a3)
 
 move.l a6,a5

 bra .wasfurther

.notcloser:
; Now insert it after current one.
 move.l #OrderTab,a3
 lea (a3,d5.w*8),a3
 move.w d1,2(a3)
 st 6(a3)

 move.w 4(a5),d0
 blt.s .atfarend
 move.l #OrderTab,a4
 move.w d5,(a4,d0.w*8)
.atfarend:

 move.w (a5),d0
 move.l #OrderTab,a4
 lea (a4,d0.w*8),a4
 move.w 4(a4),(a3)

 move.w 4(a5),4(a3)
 move.w d5,4(a5)
 move.l a3,a5
 
 addq #1,d5

 st d6
 
.wasfurther:

*************************************

PutDone:

notindrawlist:

 bra InsertList

allinlist:

 rts

ToDrawTab:
 ds.l 100
OrderTab: ds.l 100
 dc.w -1
FinalOrder: ds.l 100
doneone: dc.w 0