Login

Subversion Repositories NedoOS

Rev

Rev 1501 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

;╨┐╤А╨╛╤Ж╨╡╨┤╤Г╤А╤Л ╨┤╨╗╤П ╨│╨╡╨╜╨╡╤А╨░╤Ж╨╕╨╕ ╨║╨░╤А╤В╤Л, ╨╜╨╕╨╢╨╜╨╡╨│╨╛ ╤Г╤А╨╛╨▓╨╜╤П (╨╖╨░╨▓╨╕╤Б╤П╤В ╨╛╤В ╤В╨╕╨┐╨░ ╤Н╨║╤А╨░╨╜╨░)

ClearMap
       ld a,PGMAP
       call OUTME
        LD HL,MAP
        LD DE,MAP+1
        LD BC,0xffff-MAP
        LD (HL),0
        LDIR
        ret

FindPlacesForGrass ;╨╖╨░╨┐╨╕╤Б╤Л╨▓╨░╨╡╤В ╨▓ grassbuf
       ld a,PGMAP
       call OUTME
;╨┐╨╛ ╤З╤С╤В╨╜╤Л╨╝ ╤Б╤В╨╛╨╗╨▒╤Ж╨░╨╝ ╤Б╨▓╨╡╤А╤Е╤Г ╨▓╨╜╨╕╨╖ ╨╕╤Й╨╡╨╝ ╨┐╨╡╤А╨╡╤Е╨╛╨┤╤Л 0->1
        ld ix,grassbuf
        ld hl,MAP
        ld de,MAPWID
        ld c,128 ;1 bit >>2 every time
        ld b,MAPWID
        xor a ;RLE counter
        ex af,af' ;'
findgrass_columns0
       push bc
       push hl
        ld b,MAPHGT-1
findgrass1
        ld a,(hl)
        cpl
        and c
        add hl,de
        and (hl)
        ex af,af' ;'
        inc a
         jr nz,findgrass_nooverflow
         ld (ix),a;0 ;0=╨┐╤А╨╛╤Б╤В╨╛ ╨┐╤А╨╛╨┐╤Г╤Б╨║ 255 ╨┐╨╕╨║╤Б
         inc ix
        ld a,hx
        cp (grassbuf+grassbufsz)/256
        jp z,nowhere ;buffer overflow
         ld a,1
findgrass_nooverflow
        ex af,af' ;'
        jr z,findgrass_empty
        ex af,af' ;'
        ld (ix),a
        inc ix
        ld a,hx
        cp (grassbuf+grassbufsz)/256
        jp z,nowhere ;buffer overflow
        xor a
        ex af,af' ;'
findgrass_empty
        djnz findgrass1
       pop hl
       pop bc
        rrc c
        rrc c
        jr nc,findgrass_columns0
        inc hl
        djnz findgrass_columns0
        ld (ix),b;0 ;╨╕╨╜╨░╤З╨╡ ╨▓ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╡╨╝ ╤Б╤В╨╛╨╗╨▒╤Ж╨╡ ╨╝╨╛╨╢╨╡╤В ╨┐╨╛╤П╨▓╨╕╤В╤М╤Б╤П ╨╗╨░╨╢╨░
        ret

MakeMaskFromMap
;FIXME ╨▓ ╤Б╨╗╤Г╤З╨░╨╡ ╨╜╨╡╨┐╨╛╨╗╨╜╨╛╨╣ ╨╝╨░╤Б╨║╨╕ (╨╜╤Г╨╢╨╜╨░ ╨╖╨░╤Й╨╕╤В╨░ ╨╛╤В ╨▓╨╗╨╡╤В╨░╨╜╨╕╤П ╨▓ ╤Б╤В╨╡╨╜╤Г ╨╜╨░ ╨║╤А╨░╤О ╨║╨░╤А╤В╤Л - ╨╜╨░╨┤╨╛ ╨┐╨╛╨╗╨╜╤Г╤О ╨╝╨░╤Б╨║╤Г ╨╕╨╗╨╕ ╨┐╤А╨╕ ╨╗╤О╨▒╨╛╨╣ ╨┐╨╛╤А╤З╨╡ ╨╗╨░╨╜╨┤╤И╨░╤Д╤В╨░ ╨║╤А╨░╨╣╨╜╨╕╨╣ ╨╗╨╡╨▓╤Л╨╣ ╨┐╨╕╨║╤Б ╨╝╨░╤Б╨║╨╕ ╤Д╨╛╤А╨╝╨╕╤А╨╛╨▓╨░╤В╤М ╨╕╨╖ 5 ╨╗╨╡╨▓╤Л╤Е ╨┐╨╕╨║╤Б, ╤Б╨┐╤А╨░╨▓╨░ ╨░╨╜╨░╨╗╨╛╨│╨╕╤З╨╜╨╛?)
;x ╨▓ ╨╝╨░╤Б╨║╨╡ ╤Б╤З╨╕╤В╨░╨╡╤В╤Б╤П ╨┤╨╗╤П ╤Ж╨╡╨╜╤В╤А╨░ ╤З╨╡╤А╨▓╤П, x=0 ╤Б╨╛╨╛╤В╨▓╨╡╤В╤Б╤В╨▓╤Г╨╡╤В x=4 ╨▓ ╨║╨░╤А╤В╨╡
;╤В╨╛ ╨╡╤Б╤В╤М ╨▒╨╡╤А╤С╨╝ ╨▒╨░╨╣╤В ╨╝╨░╤Б╨║╨╕ ╨╕╨╖ ╨║╨░╤А╤В╤Л ╤В╨░╨║: ----M-M- M-M-m-m- m-m-----
        LD HL,MAP;+1
        LD DE,MASK;MASKBUF
        LD B,MASKHGT;88
MKMAP41 PUSH BC
       ld a,PGMAP
       call OUTME
       push de
       ld de,MKMASKBUF
        LD B,MASKWID
MKMAP42 LD A,(HL)
         RLA
         RLA
         RLA
         RLA
        DUP 2
        RLA
        RLA
        RL C
        EDUP
        INC HL
        LD A,(HL)
        DUP 4
        RLA
        RLA
        RL C
        EDUP
        INC HL
        LD A,(HL)
        DUP 2
        RLA
        RLA
        RL C
        EDUP
        LD A,C
        LD (DE),A
        INC DE
        DJNZ MKMAP42      
       call SetPgMask
       pop de
       push hl
       ld hl,MKMASKBUF
       ld bc,MASKWID
       ldir
       pop hl        
        LD bc,(MAPWID-MASKWID)*2
        ADD HL,BC
        POP BC
        DJNZ MKMAP41
;extra bottom line of mask is always filled (for element placement)
        LD HL,MASKSZ+MASK;MASKBUF
        LD BC,MASKWID*256+255
        LD (HL),C
        INC HL
        DJNZ $-2
        ret

TexturizeGroundInMap
       ld a,PGMAP
       call OUTME
        LD HL,MAP
        LD DE,MAPWID
        ld bc,texture
        ld lx,MAPWID
MkMapTex0 PUSH BC
        PUSH HL
MkMapTex1 LD A,(BC)
        AND (HL)
        LD (HL),A
        LD A,C
        inc a
        xor c
        and 0x7f
        xor c
        LD C,A
        ADD HL,DE
        JR NC,MkMapTex1
        POP HL
        INC L
        POP BC
        ld a,c
        add a,128
        ld c,a
        jr nc,MkMapTex0ok
        inc b
        ld a,b
        cp texture/256+8
        jr c,MkMapTex0ok
        ld b,texture/256
MkMapTex0ok
        dec lx
        jr NZ,MkMapTex0
        ret

AddGrassInMap
       LD A,PGMAP;16
       CALL OUTME
        ld ix,grassbuf
        ld de,MAPWID
        ld hl,MAP
        ld c,0xc0 ;2 bits >>2 every time
        ld b,MAPWID
        xor a ;RLE counter
        ex af,af' ;'
addgrass_columns0
        ld a,c
        ld (addgrassmask),a
       push bc
       push hl
        ld b,MAPHGT-1
addgrass0
        add hl,de
        ex af,af' ;'
addgrass_noadd1
        inc a
        cp (ix)
        jr nz,addgrass_noadd
        inc ix
         or a
         jr z,addgrass_noadd1 ;0=╨┐╤А╨╛╤Б╤В╨╛ ╨┐╤А╨╛╨┐╤Г╤Б╨║ 255 ╨┐╨╕╨║╤Б
     push bc
     push hl
        LD bc,sprgrass
addgrass1
        ld a,(bc)
        or a
        jr z,addgrass1q
addgrassmask=$+1
        and 0
        or (hl)
        ld (hl),a
        add hl,de
        jr c,addgrass1q ;end of column
        inc bc
        jr addgrass1
addgrass1q
     pop hl
     pop bc
        xor a
addgrass_noadd
        ex af,af' ;'
        djnz addgrass0
       pop hl
       pop bc
        rrc c
        rrc c
        jr nc,addgrass_columns0
        inc hl
        djnz addgrass_columns0
        ret

sprgrass
        DB #29,-1,#DB,#7E,#D5,#AA,0
      ;DB #52,-1,#BF,-4,#AB,#55,0

PRLMNerror
        INC C ;don't fit, next x
       POP DE
        LD A,C
        CP MASKWID-5 ;╤И╨╕╤А╨╕╨╜╨░ ╤Н╨╗╨╡╨╝╨╡╨╜╤В╨░ ╨╜╨╡ ╨▒╨╛╨╗╨╡╨╡ 10 ╨╖╨╜╨░╨║╨╛╨╝╨╡╤Б╤В
        jp C,PRLMN00
;       pop de
       pop af
;        scf
        ret

PRLMN
;draw element in map and mask
;c=X (in chr)
;hl=gfx
        LD D,(HL) ;width
        INC HL
        LD E,(HL) ;hgt
        INC HL

       call SetPgMask
       
       PUSH HL ;gfx
PRLMN00
        LD HL,MASK+(MASKWID*(MAPHGT-TERRAINHGT));MASKBUF+(MASKWID*(MAPHGT-TERRAINHGT))
        XOR A
        LD B,A
        ADD HL,BC ;+x
        LD B,E ;hgt
       PUSH DE
        LD DE,MASKWID
;╨╡╤Б╤В╤М ╨╗╨╕ ╨┤╨╛╤Б╤В╨░╤В╨╛╤З╨╜╨░╤П ╨▓╤Л╤Б╨╛╤В╨░ ╨╜╨╡╨▒╨░ ╨┐╨╛╨┤ ╤Н╨╗╨╡╨╝╨╡╨╜╤В?
        OR (HL)
        ADD HL,DE
        DJNZ $-2
        jr NZ,PRLMNerror ;don't fit, next x
;╨╕╤Й╨╡╨╝ ╨│╤А╤Г╨╜╤В (╨╛╨╜ ╤В╨╛╤З╨╜╨╛ ╨╡╤Б╤В╤М, ╨╝╤Л ╨▓ ╨╝╨░╤Б╨║╨╡ ╤Б╨┤╨╡╨╗╨░╨╗╨╕ ╨╗╨╕╤И╨╜╤О╤О ╨╖╨░╨╗╨╕╤В╤Г╤О ╤Б╤В╤А╨╛╨║╤Г)
         INC B
         OR (HL)
         ADD HL,DE
        JR Z,$-3
       POP DE
        LD A,D ;wid
        DEC A
        srl a;RRA
        NEG
        ADD A,C
        LD C,A ;x
       ld a,b
       add a,MAPHGT-TERRAINHGT
       ld b,a ;y
;PGMASK ╤Г╨╢╨╡ ╨▓╨║╨╗╤О╤З╨╡╨╜╨╛
;b=y
;c=x
;d=width
;e=hgt
       POP HL ;gfx

     PUSH BC ;c=x
        XOR A
        OR B ;y
        PUSH HL ;gfx
        PUSH DE ;width,hgt
        LD HL,MASK;MASKBUF
        LD DE,MASKWID
        JR Z,$+5
        ADD HL,DE
        DJNZ $-1 ;hl=MASK+(y*MASKWID)
        ADD HL,BC ;hl=MASK+(y*MASKWID)+x
        POP BC ;width,hgt
        POP DE ;gfx
;hl=MASK+
;de=gfx
;b=width
;c=hgt
PRLMNmask1
        PUSH BC
        PUSH HL
         xor a
         ld c,a
PRLMNmask2
        LD A,(DE)
         rra
         rl c
         rra
         rr c
         push af
        OR (HL)
        LD (HL),A
        INC HL
        INC DE
         pop af
        DJNZ PRLMNmask2
         ld a,0
         rra
         rl c
         rra
         OR (HL)
         LD (HL),A        
        POP HL
        LD C,MASKWID
        ADD HL,BC
        POP BC
        DEC C
        JR NZ,PRLMNmask1      
        ex de,hl
      LD D,(HL) ;width
      INC HL
      LD E,(HL) ;hgt
      INC HL
    POP BC ;yx
    PUSH BC ;yx
        XOR A
        OR B ;y
        PUSH HL ;gfx
        PUSH DE ;width,hgt
        LD HL,MAP;+(MAPWID*(MAPHGT-TERRAINHGT));#C000
        LD DE,MAPWID*2
        JR Z,$+5
        ADD HL,DE
        DJNZ $-1
        ADD HL,BC
        ADD HL,BC ;hl=MAP+(y*MAPWID*2)+(x*2)
       LD A,PGMAP;16
       CALL OUTME
        POP BC ;width,hgt
        POP DE ;gfx
PRLMN2  PUSH BC
        PUSH HL
        LD A,(DE)
        INC HL
        OR (HL)
        LD (HL),A
        INC DE
        DJNZ $-5
        POP HL
        LD C,MAPWID
        ADD HL,BC
        POP BC
        DEC C
        JR NZ,PRLMN2
;de=end of gfx
        ex de,hl ;hl=end of gfx
        LD A,B ;width
     POP BC ;c=x
        ADD A,C
        LD C,A ;update x (╤З╤В╨╛╨▒╤Л ╨╜╨╡ ╨╗╨╡╨┐╨╕╤В╤М ╨╛╨▒╤К╨╡╨║╤В╤Л ╤Б╨╛╨▓╤Б╨╡╨╝ ╤А╤П╨┤╨╛╨╝)
       ;or a ;NC
        RET

CopyLMNGfx ;╨║╨╛╨┐╨╕╤А╤Г╨╡╨╝ ╨│╤А╨░╤Д╨╕╨║╤Г ╨▓╤Л╨▒╤А╨░╨╜╨╜╤Л╤Е ╤Н╨╗╨╡╨╝╨╡╨╜╤В╨╛╨▓ ╨▓ LMNGFX (╨╜╨╡ ╨▒╨╛╨╗╨╡╨╡ LMNGFXSZ)
;╨╜╤Г╨╢╨╜╨╛ ╤В╨╛╨╗╤М╨║╨╛ ╨┤╨╗╤П 48/128, ╨░ ╨╜╨░ ╨Р╨в╨Ь ╨▒╤Г╨┤╨╡╤В ╨▓╤Л╨▓╨╛╨┤╨╕╤В╤М╤Б╤П ╨╜╨╡╨┐╨╛╤Б╤А╨╡╨┤╤Б╤В╨▓╨╡╨╜╨╜╨╛ ╨╕╨╖ LMNS
;TODO ╤Б ╤А╨░╤Б╨┐╨░╨║╨╛╨▓╨║╨╛╨╣? ╨╕╨╗╨╕ ╨┤╨╛╨▒╨░╨▓╨╕╤В╤М ╤А╨░╤Б╨┐╨░╨║╨╛╨▓╨║╤Г ╨┐╤А╨╕ ╨╕╤Б╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╨╜╨╕╨╕?
       ld a,PGLMN
       call OUTME
     ld a,(LMNS)
LMNSfirstbyte=$+1
     cp 0x81
     ret nz;jr nz,MKMAP_copyLMNbug ;48K ╨┐╨╛╨▓╤В╨╛╤А ╨║╨░╤А╤В╤Л - ╨╕╤Б╨┐╨╛╨╗╤М╨╖╤Г╨╡╨╝ ╤Н╨╗╨╡╨╝╨╡╨╜╤В╤Л, ╨║╨╛╤В╨╛╤А╤Л╨╡ ╤Г╤Б╨┐╨╡╨╗╨╕ ╤Б╨┐╨░╤Б╤В╨╕ ╨▓ ╤Н╨║╤А╨░╨╜╨╡ (╨┐╤А╨╕ ╨┐╨╛╤Б╨╗╨╡╨╕╨│╤А╨╛╨▓╨╛╨╣ ╨│╨╡╨╜╨╡╤А╨░╤Ж╨╕╨╕ ╨▓ ╤Н╨║╤А╨░╨╜╨╡ ╨╗╨╡╨╢╨╕╤В 0)
        ld hl,LMNlist ;╨▓╨┐╤А╨╕╤В╤Л╨║ ╨║ ╨║╨╛╨╜╤Ж╤Г ╨┐╨░╤А╨░╨│╤А╨░╤Д╨░
        ld de,LMNGFX
copyLMN0
      ld (copyLMN_lastgood),de
        ld a,(hl)
       push hl
        scf
        rla ;a=N*2+1
        LD HL,LMNS
copyLMNfind0
        LD c,(HL)
        INC HL
        LD b,(HL) ;size in bytes
        INC HL
        DEC A
        JR Z,copyLMNfindq
        ADD HL,bc
        JR copyLMNfind0
copyLMNfindq
       push hl
       ld h,d
       ld l,e
       add hl,bc
       ld a,h
       cp (LMNGFX+LMNGFXSZ)/256
       pop hl
       jr nc,copyLMNfail
        ldir
        dec de ;skip 0
        LD c,(HL)
        INC HL
        LD b,(HL) ;size in bytes
        INC HL
       push hl
       ld h,d
       ld l,e
       add hl,bc
       ld a,h
       cp (LMNGFX+LMNGFXSZ)/256
       pop hl
       jr nc,copyLMNfail
        ldir        
        dec de ;skip 0
       pop hl
        inc l
        jr nz,copyLMN0
       jr copyLMNok
copyLMNfail
       pop hl
copyLMN_lastgood=$+1
        ld de,0
copyLMNok
        xor a
        ld (de),a ;end of gfx
;MKMAP_copyLMNbug ;╨┐╤А╨╕ ╨┐╨╛╤Б╨╗╨╡╨╕╨│╤А╨╛╨▓╨╛╨╣ ╨│╨╡╨╜╨╡╤А╨░╤Ж╨╕╨╕ ╨╜╨░ 48K {0x4000}=0
        ret

       if 0
CheckGroundExist ;╨┐╤А╨╛╨▓╨╡╤А╤П╨╡╨╝, ╨╡╤Б╤В╤М ╨╗╨╕ ╨╖╨╡╨╝╨╗╤П ╨╜╨░ ╨╜╨╕╨╢. ╨╗╨╕╨╜╨╕╨╕ (CY=error)
       ld a,PGMAP
       call OUTME ;╤В╨╡╤Е╨╜╨╕╤З╨╡╤Б╨║╨╕ ╨╜╨╡ ╨╜╤Г╨╢╨╜╨╛, ╤В.╨║. ╨▓╤Л╨╖╤Л╨▓╨░╨╡╤В╤Б╤П ╨┐╨╛╤Б╨╗╨╡ MKMAPPP
        LD HL,MAP+((MAPHGT-1)*MAPWID);#FFEF
        LD B,MAPWID
        XOR A
        OR (HL)    ;╨┐╤А╨╛╨▓╨╡╤А╤П╨╡╨╝, ╨╡╤Б╤В╤М ╨╗╨╕ ╨╖╨╡╨╝╨╗╤П ╨╜╨░ ╨╜╨╕╨╢. ╨╗╨╕╨╜╨╕╨╕
        inc HL     ;
        DJNZ $-2   ;
        ret nz
        scf
        ret ;error ;╨╜╨╡╤В ╨╖╨╡╨╝╨╗╨╕ ╨╜╨░ ╨╜╨╕╨╢. ╨╗╨╕╨╜╨╕╨╕
       endif

EorFillInMap
        LD A,PGMAP;16
        CALL OUTME

        LD HL,MAP;#C000
        LD DE,MAPWID
        LD C,E
MKMAPF  PUSH HL
        LD B,MAPHGT
        XOR A
MKMAPF0 XOR (HL)
        LD (HL),A
        ADD HL,DE
        DJNZ MKMAPF0
        POP HL
        INC L
        DEC C
        JR NZ,MKMAPF
        ret