Login

Subversion Repositories NedoOS

Rev

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

;0 - пусто
;1..127 - объект
;128..254 - пуля
;[255 - препятствие]
fillcollisionmap
        ;ld hl,collisionmap
        ;ld de,collisionmap+1
        ;ld bc,collisionmapsize-1
        ;ld (hl),0
        ;ldir
        ld (fillcollisionmapsp),sp
        ld sp,collisionmap+collisionmapsize
        ld de,0
        ld b,collisionmaphgt
fillcollisionmap_clear0
        dup collisionmaplinesize/2
        push de
        edup
        djnz fillcollisionmap_clear0
fillcollisionmapsp=$+1
        ld sp,0
;помечаем пули
        ld ix,bulletlist
        ld c,128
fillcollisionmap_bullet0
        ld a,(ix+(obj_x+1))
        cp TERMINATOR
        jr z,fillcollisionmap_bulletq
        call calccollisionmapaddr
        ld (hl),c
        ld de,objsize
        add ix,de
        inc c
        jp fillcollisionmap_bullet0
fillcollisionmap_bulletq
;помечаем объекты
        ld ix,objlist
        ld c,1
fillcollisionmap_obj0
        ld a,(ix+(obj_x+1))
        cp TERMINATOR
        ret z
        call calccollisionmapaddr
        ld de,collisionmaplinesize-2
        ld (hl),c
        inc hl
        ld (hl),c
        inc hl
        ld (hl),c
        add hl,de
        ld (hl),c
        inc hl
        ld (hl),c
        inc hl
        ld (hl),c
        add hl,de
        ld (hl),c
        inc hl
        ld (hl),c
        inc hl
        ld (hl),c
        ld de,objsize
        add ix,de
        inc c
        jp fillcollisionmap_obj0
       
calccollisionmapaddr
;bc,e не портим
        GETXDE_YHL
        if coordsfactor !=4
        display "coordsfactor!=4"
        endif
        ld a,l
        rr h
        rra
        rr h
        rra
        rra
        rra
        rra
        and 0x1f
        ld l,a
        ld h,0
        add hl,hl
        add hl,hl
        add hl,hl
        add hl,hl
        add hl,hl ;fillcollisionmaplinesize=32
        if coordsfactor !=4
        display "coordsfactor!=4"
        endif
        ld a,e
        rr d
        rra
        rr d
        rra
        rra
        rra
        rra
        and 0x1f
        add a,l
        ld l,a
        ld a,collisionmap/256
        add a,h
        ld h,a
        ret

calctilemapaddr_de_hl
;de=x
;hl=y
;bc,e не портим
        if coordsfactor !=4
        display "coordsfactor!=4"
        endif
        ld a,l
        rr h
        rra
        rr h
        rra
        rra
        rra
        rra
        and 0x1f
        ld l,a
        if coordsfactor !=4
        display "coordsfactor!=4"
        endif
        ld a,e
        rr d
        rra
        rr d
        rra
        rra
        rra
        rra
        and 0x1f
calctilemapaddr_a_l
        ld h,0
        add hl,hl
        add hl,hl
        add hl,hl
        add hl,hl
        add hl,hl ;fillcollisionmaplinesize=32
        add a,l
        ld l,a
        ld a,tilemap/256
        add a,h
        ld h,a
        ret

checkbulletcollision
;hl=collisionmapaddr
;out: nc=коллизия
        ld a,(hl)
        or a ;пусто
        ;scf
        ;jr z,$;ret z ;CY=1
        jp m,checkbulletcollision_bullet
;1..127 = объект
        ld c,a
        ld b,0
        ld de,objsize
        call mulbcde
       
        if 1==1
        ld bc,objlist-objsize+obj_energy
        add hl,bc
       
        else ;проверка попадания в яблочко
        ;надо проверить x > xbullet > x+tanksize
        ld bc,objlist-objsize+obj_x
        add hl,bc
        ld a,(ix+obj_x) ;xbullet
        sub (hl) ;x
        ld c,a
        inc hl
        ld a,(ix+(obj_x+1)) ;xbullet(HSB)
        sbc a,(hl) ;x(HSB)
        ld b,a ;bc = xbullet-x
        scf
        ret nz ;bc >= 256 (точно мимо)
        ld a,c
        or a
        scf
        ret z
        cp tankdamagesize*coordsfactor
        ccf
        ret c ;bc >= tanksize
        inc hl
        ld a,(ix+obj_y) ;ybullet
        sub (hl) ;y
        ld c,a
        inc hl
        ld a,(ix+(obj_y+1)) ;ybullet(HSB)
        sbc a,(hl) ;y(HSB)
        ld b,a ;bc = ybullet-y
        scf
        ret nz ;bc >= 256 (точно мимо)
        ld a,c
        or a
        scf
        ret z
        cp tankdamagesize*coordsfactor
        ccf
        ret c ;bc >= tanksize
        ld bc,obj_energy-(obj_y+1)
        add hl,bc
        endif ;проверка попадания в яблочко
       
        ld a,(hl)
        sub (ix+obj_energy) ;энергия пули
        ld (hl),a
        ret nc ;у объекта ещё осталась энергия
        push ix
        ex de,hl
        ld ix,-obj_energy
        add ix,de
        SETANIM ANIM_DIE
        pop ix
        or a
        ret ;nc
checkbulletcollision_bullet
;128..255 = пуля (в collisionmap всегда видна более поздняя пуля, т.е. её можно смело удалять)
        sub 128
        ;push af ;номер найденной пули
        ;push ix
        ;pop hl
        ;ld bc,-bulletlist&0xffff
        ;add hl,bc
        ;ld de,objsize
        ;call divhlde ;hl=номер нашей пули
        ;pop af ;номер найденной пули
        ;cp l ;номер нашей пули
        ;scf
        ;ret z ;CY=1 ;пуля увидела сама себя
        ld c,a
        ld b,0
        ld de,objsize
        call mulbcde
        ex de,hl
        push ix
        ld ix,bulletlist
        add ix,de
        ld hl,curbulletlistend
        call delobj ;копируем из ix+objsize в ix
        pop ix
        or a
        ret ;nc
       
checkwalls
;bc=размер
;out: nc=стена
_=4 ;половина клеточки
        ld h,(ix+(obj_y+1))
        ld a,(ix+obj_y) ;y
        srl h
        rra
        srl h
        rra
        cp _&0xff
        ccf
        ret nc ;верхняя стена
;вычесть (bottomwally/coordsfactor-4)-размер, смотрим <=
        add a,c ;размер
_=(bottomwally/coordsfactor-4)+1
        cp _&0xff
        ret nc ;нижняя стена
_=4 ;половина клеточки
        ld d,(ix+(obj_x+1))
        ld a,(ix+obj_x) ;x
        srl d
        rra
        srl d
        rra
        cp _&0xff
        ccf
        ret nc ;левая стена
;вычесть (rightwallx/coordsfactor-4)-размер, смотрим <=
        add a,c ;размер
_=(rightwallx/coordsfactor-4)+1
        cp _&0xff
        ret ;nc=правая стена
       
checkobstacles_tank
;nc=препятствие
        GETXDE_YHL
        ld bc,-4*coordsfactor
        ex de,hl
        add hl,bc
        ex de,hl
        add hl,bc
        ld a,l
        and 8*coordsfactor-1
        ld b,3 ;число проверяемых строк
        jr z,$+3
        inc b ;число проверяемых строк (стоим неровно по y)
        call calctilemapaddr_de_hl ;bc,e не портим
        ld a,e
        and 8*coordsfactor-1
        jr nz,checkobstacles_tank_lines4 ;стоим неровно по x
        ld de,tilemaplinesize-2
checkobstacles_tank_lines30
        ld a,(hl)
        cp maxemptytile+1
        ret nc
        inc hl
        ld a,(hl)
        cp maxemptytile+1
        ret nc
        inc hl
        ld a,(hl)
        cp maxemptytile+1
        ret nc
        add hl,de
        djnz checkobstacles_tank_lines30
        scf
        ret ;CY=1 (нет препятствия)
checkobstacles_tank_lines4
        ld de,tilemaplinesize-3
checkobstacles_tank_lines40
        ld a,(hl)
        cp maxemptytile+1
        ret nc
        inc hl
        ld a,(hl)
        cp maxemptytile+1
        ret nc
        inc hl
        ld a,(hl)
        cp maxemptytile+1
        ret nc
        inc hl
        ld a,(hl)
        cp maxemptytile+1
        ret nc
        add hl,de
        djnz checkobstacles_tank_lines40
        scf
        ret ;CY=1 (нет препятствия)