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