MKMAP
 
        LD HL,sprpie
 
        LD (DrawPieaddr),HL
 
 
 
      if !ATM;!USELMNBUF
 
        call GenLMNList
 
        call CopyLMNGfx ;копируем графику выбранных элементов в LMNGFX (не более LMNGFXSZ)
 
      endif
 
 
 
       call DrawPie ;1
 
 
 
        call MKMAPPP ;generate map contour ;CY=error
 
        ;call CheckGroundExist ;проверяем, есть ли земля на ниж. линии (CY=error)
 
        ;jr c,MKMAP ;error
 
 
 
       call DrawPie ;2
 
 
 
        call EorFillInMap
 
 
 
        ;ld b,0
 
        ;ld e,0
 
        ;ld c,10
 
        ;call XorPixInMap
 
 
 
       call DrawPie ;3
 
 
 
        call FindPlacesForGrass ;записывает в grassbuf
 
 
 
       call DrawPie ;4
 
 
 
        call MakeMaskFromMap
 
 
 
       call DrawPie ;5
 
 
 
        call TexturizeGroundInMap ;использует texture
 
 
 
       call DrawPie ;6
 
 
 
        call AddGrassInMap ;использует grassbuf
 
 
 
       call DrawPie ;7
 
 
 
   if !ATM ;TODO!!!
 
;add elements:
 
      if ATM;USELMNBUF
 
        call GenLMNList
 
      endif
 
        LD C,3 ;initial X
 
      if !ATM;!USELMNBUF
 
        ld hl,LMNGFX
 
      else
 
        ld hl,LMNlist ;впритык к концу параграфа
 
      endif
 
LMN0    LD A,10
 
        CALL RNDA
 
        ADD A,C
 
        CP MASKWID-5 ;ширина элемента не более 10 знакомест
 
        JR NC,LMNQ ;X too big - no more elements
 
        LD C,A ;X
 
      if ATM;USELMNBUF
 
        ld b,(hl) ;N
 
      endif
 
;LMN00
 
;        push bc
 
      if ATM;USELMNBUF
 
       push hl
 
      endif
 
        CALL PRLMN
 
      if ATM;USELMNBUF
 
       pop hl
 
      endif
 
;        pop bc ;нельзя, PRLMN должен двигать C на ширину элемента
 
;        JR nc,LMN0
 
;;don't fit - next x ;а может, просто пропустить?
 
;        INC C ;don't fit, next x
 
;        LD A,C
 
;        CP MASKWID-5 ;ширина элемента не более 10 знакомест
 
;        JR C,LMN00;PRLMN00
 
      if !ATM;!USELMNBUF
 
        ld a,(hl)
 
        or a ;end of gfx?
 
      else
 
        inc l
 
      endif
 
        JR nz,LMN0
 
LMNQ
 
    endif
 
 
 
;clear table of y's (per column) usable for worms
 
        XOR A
 
        LD DE,TPLACES
 
        LD (DE),A
 
        INC E
 
        JR NZ,$-2
 
        LD LX,a;0
 
        call FindUsableYsInMask ;create table of usable y's and count them in LX
 
 
 
;place worms in TXY (x,y)
 
        LD A,LX ;usable columns count
 
       dec a
 
        LD BC,+(Nobjects-1)*256+0xff ;B=QUANTITY OF WORMS + quantity of mines -1 (for off by 1 disivion)
 
        INC C
 
        SUB B
 
        JR NC,$-2
 
        LD A,C ;(usablecolumns-1)/(quantityofworms-1) = xstep (first worm placed in first usable column)
 
        CP 7
 
         jp c,nowhere ;xstep too small
 
;C=WIDTH OF WORM PLACE = typically 7..11
 
        LD HL,TXY
 
        ld e,0 ;x ;e=0 (column 0 not used)
 
       ld b,1
 
       jr SETXgo ;first worm in leftmost position
 
SETX 
 
        LD B,C ;xstep
 
        ;SRL B ;first x = xstep/2
 
SETXgo
 
       PUSH BC
 
SETX0   INC E
 
         ;ld a,e
 
         ;cp MASKWID*4 -4
 
         ;jr z,$ ;проверка на вшивость FIXME
 
        LD A,(DE)
 
        OR A
 
        JR Z,SETX0 ;unusable column
 
        DJNZ SETX0 ;find usable column that far
 
        LD (HL),E ;x in TXY
 
        INC L
 
        LD A,(DE) ;y for this column
 
        add a,SKYMASKHGT-4 ;мы проверяли y по маске, но маска под ногами червя, высота червя=8, в маске =4
 
        RLCA 
 
        LD (HL),A ;y in TXY
 
        
 
       POP BC
 
       ; LD A,C ;xstep
 
       ; SUB B
 
       ; LD B,A ;xstep-1 ;xstep - (xstep/2)
 
SETX1  ; INC E
 
       ; LD A,(DE)
 
       ; OR A
 
       ; JR Z,SETX1
 
       ; DJNZ SETX1 ;skip so many usable columns
 
 
 
        INC L
 
        JR NZ,SETX
 
 
 
       call DrawPie ;8
 
 
 
        jp SETWMS ;make worm structures from TXY (x,y coords)
 
 
 
MKMAPPP
 
;generate map contour
 
;out: CY=error
 
        call ClearMap
 
        call PrepareXorPixInMap
 
 
 
        LD HL,DIRECTN
 
        LD DE,DTNTAB
 
        LD bc,32
 
        LDIR 
 
 
 
        LD b,0 ;SCREEN (X) NO. -1=NOPRINT
 
        LD C,b
 
        CALL RND
 
        AND 127
 
        add a,28;48
 
        LD e,A ;y
 
        LD HL,DTNTAB+8   ;14
 
MKMAP0  LD A,2;4
 
        CALL RNDA ;direction change
 
        CP 1;2
 
        SBC A,0;1
 
        ADD A,L ;+old direction
 
        LD D,L ;old direction
 
        LD L,A ;new direction
 
        CALL TESTL
 
        LD A,D ;old direction
 
        SUB 5
 
        LD D,A
 
        LD A,L
 
        SUB 5
 
        XOR D
 
        AND 8
 
        CALL NZ,XorPixInMap ;e=y ;bc=x
 
        PUSH HL
 
        SLA L
 
        LD A,(HL)
 
        DEC A
 
        POP HL
 
        LD A,5
 
        JP P,$+5
 
        LD A,3
 
        CALL RNDA
 
        INC A
 
        LD D,A ;steps in this direction
 
MKMAP1  PUSH HL
 
        SLA L
 
        LD A,(HL)
 
        OR A
 
        CALL NZ,XorPixInMap ;e=y ;bc=x
 
        LD A,(HL)
 
        CP 128
 
        JR C,MKMAPFW
 
        ADD A,C
 
        LD C,A
 
        JR C,MKMAPBW
 
        DEC b
 
        JR MKMAPBW
 
MKMAPFW CP 2
 
        JR C,MKMAPN2
 
        ;INC C
 
        ;JR NZ,$+3
 
        ;INC b
 
        inc bc
 
        CALL XorPixInMap ;e=y ;bc=x
 
        LD A,1
 
MKMAPN2 ADD A,C
 
        LD C,A
 
        JR NC,$+3
 
        INC b
 
MKMAPBW INC L
 
        LD A,(HL)
 
        ADD A,e
 
        POP HL
 
        CP 208 +TERRAINHGT-MAPHGT
 
        JR C,MKMAPNY
 
        LD A,17
 
        SUB L
 
        LD L,A
 
        PUSH HL
 
       SLA L
 
       INC L
 
        LD A,(HL)
 
        ADD A,e
 
        POP HL
 
MKMAPNY LD e,A
 
        DEC D
 
        JR NZ,MKMAP1
 
        LD A,b
 
        CP 3;4 ;after LAST SCREEN
 
        JR NZ,MKMAP0
 
        ret
 
 
 
TESTL
 
        LD A,L
 
        CP 2
 
        JR NC,TESTLNC
 
        SUB -3
 
        LD L,A
 
        RET 
 
TESTLNC
 
        CP 16
 
        RET C
 
        SUB 3
 
        LD L,A
 
        RET 
 
 
 
GenLMNList
 
       ld hl,LMNused
 
       ld de,LMNused+1
 
       ld bc,NLMN-1
 
       ld (hl),0xff
 
       ldir
 
;сначала генерируем список элементов, которые у нас будут использоваться (не более NLMNONMAP)
 
        ld de,LMNlist ;впритык к концу параграфа
 
genLMNlist0
 
retryLMN
 
        LD A,NLMN
 
        CALL RNDA
 
       ld l,a
 
       ld h,LMNused/256
 
       cp (hl)
 
       jr z,retryLMN
 
       ld (hl),a
 
        ld (de),a
 
        inc e
 
        jr nz,genLMNlist0
 
        ret
 
 
 
DIRECTN
 
        DW #100,#1FF,#FF,#FF
 
        DW -1,#FF00,#FF01,#FF02
 
        DW 2,2,#102,#101,#100,#1FF,#FF,#FF
 
 
 
FindUsableYsInMask
 
;create table of usable y's and count them in LX
 
;LX=0
 
       call SetPgMask
 
        ld hl,MASK+MASKSZ-1 ;don't use last byte column
 
        LD C,64
 
        LD E,MASKWID*4-1 -4 ;don't use last byte column
 
SETF    RLC C
 
        RLC C
 
        JR NC,$+3
 
         DEC HL
 
     if 0;ATM ;TODO fix!!!
 
     ld b,MASKHGT-1 ;y
 
     INC LX ;usable columns count
 
     else
 
        PUSH DE
 
        PUSH HL
 
;снизу вверх смотрим столбец маски (бит 0,2,4 или 6 в C)
 
        LD DE,-MASKWID
 
        LD B,MASKHGT-1 ;y
 
SETF0   ADD HL,DE
 
        LD A,C
 
        AND (HL)
 
        JR NZ,SETF1 ;pixel in column
 
        DJNZ SETF0
 
        JR SETFQ ;unusable column
 
SETF1   ADD HL,DE
 
        DEC B
 
        AND (HL)
 
        JR NZ,SETF1 ;снизу вверх ищем, когда пиксели кончатся (червь будет на уступе)
 
        INC LX ;usable columns count
 
SETFQ   POP HL
 
        POP DE
 
     endif
 
        LD A,B
 
        LD (DE),A ;y place for this column
 
        DEC E
 
        JR NZ,SETF ;column 0 not used
 
        ret