;-----------------------------------------------------------;
;                                                           ;
; Invaded                                                   ;
; Version 1.0                                               ;
; Item Pickups Routines                                     ;
;                                                           ;
;-----------------------------------------------------------;

;------------------------------------------------
; clearPickupArray - Clear pickupArray
;
; Input:    None
; Output:   None
;------------------------------------------------
clearPickupArray:
        ld      hl,pickupArray
        ld      de,pickupArray+1
        ld      bc,MAX_PICKUPS*3-1
        ld      (hl),0
        ldir
        ret

;------------------------------------------------
; newPickup - Create a new pickup item
;
; Input:    C = Pickup type, 1 = Life/Score, 2 = Power, 3 = Two-Way, 4 = Vertical
;           D = X Coord
;           E = Y Coord
; Output:   None
;------------------------------------------------
newPickup:
        ld      hl,pickupArray
        ld      b,MAX_PICKUPS
findPickupEntry:
        ld      a,(hl)
        or      a
        jr      z,pickupEntryFound
        inc     hl
        inc     hl
        inc     hl
        djnz    findPickupEntry
        ret
pickupEntryFound:
        dec     c
        jr      z,newPickupRandom
        inc     c
        inc     c
        ld      a,c
        jr      doNewPickup
newPickupRandom:
        ld      b,50
        call    ionRandom
        cp      49
        ld      a,2
        jr      c,doNewPickup
        ld      a,(lives)
        cp      4
        ld      a,1
        jr      c,doNewPickup
        inc     a
        jr      doNewPickup

        ld      b,128
        call    ionRandom                       ; 0 <= A <= 127
        cp      126
        jr      nc,newPickupExtraLife
        cp      120
        jr      nc,newPickupBonusScore
        cp      80
        jr      nc,newPickupPowerGun
        cp      40
        jr      nc,newPickupTwoWayGun
newPickupVerticalGun:
        ld      a,5
        jr      doNewPickup
newPickupExtraLife:
        ld      a,(lives)
        cp      4
        ld      a,1
        jr      c,doNewPickup
        ld      a,2
        jr      doNewPickup
newPickupBonusScore:
        ld      a,2
        jr      doNewPickup
newPickupPowerGun:
        ld      a,3
        jr      doNewPickup
newPickupTwoWayGun:
        ld      a,4
doNewPickup:
        ld      (hl),a
        inc     hl
        ld      a,d
        cp      96-8
        jr      c,newPickupXOK
        ld      a,96-8
newPickupXOK:
        ld      (hl),a
        inc     hl
        ld      a,e
        cp      56-8
        jr      c,newPickupYOK
        cp      56
        ld      a,56-8
        jr      c,newPickupYOK
        xor     a
newPickupYOK:
        ld      (hl),a
        ret

;------------------------------------------------
; drawPickups - Draw pickups
;
; Input:    None
; Output:   None
;------------------------------------------------
drawPickups:
        ld      hl,pickupArray
        ld      b,MAX_PICKUPS
drawPickupsLoop:
        push    bc
        push    hl
        ld      a,(hl)
        or      a
        jr      z,endDrawPickupsLoop
        ex      de,hl
        ld      l,a
        ld      h,0
        dec     l
        add     hl,hl
        add     hl,hl
        add     hl,hl
        ld      bc,sprPickups
        add     hl,bc
        push    hl
        pop     ix
        ex      de,hl
        inc     hl
        ld      a,(hl)
        inc     hl
        ld      l,(hl)
#ifdef MIRAGE
        call    putSprite8
#else
        ld      b,8
        call    ionPutSprite
#endif
endDrawPickupsLoop:
        pop     hl
        pop     bc
        inc     hl
        inc     hl
        inc     hl
        djnz    drawPickupsLoop
        ret

;------------------------------------------------
; movePickups - Move pickups slowly to the left of screen
;
; Input:    None
; Output:   None
;------------------------------------------------
movePickups:
        ld      a,(frame)
        and     $01
        ret     nz
        ld      hl,pickupArray
        ld      b,MAX_PICKUPS
movePickupsLoop:
        ld      a,(hl)
        or      a
        jr      z,endMovePickupsLoop
        inc     hl
        dec     (hl)
        ld      a,(hl)
        dec     hl
        or      a
        jr      nz,endMovePickupsLoop
        ld      (hl),0
endMovePickupsLoop:
        inc     hl
        inc     hl
        inc     hl
        djnz    movePickupsLoop
        ret

;------------------------------------------------
; checkGetPickups - Check to see if player is picking up any item pickups
;
; Input:    None
; Output:   None
;------------------------------------------------
checkGetPickups:
        ld      a,(dead)
        or      a
        ret     nz
        call    storePlayerInCollideObject1
        ld      hl,pickupArray
        ld      b,MAX_PICKUPS
checkGetPickupsLoop:
        push    bc
        push    hl
        ld      a,(hl)
        or      a
        jr      z,endCheckGetPickupsLoop
        ex      de,hl                           ; DE => Start of pickup entry
        ld      hl,collideObject2
        inc     de
        ld      a,(de)
        ld      (hl),a
        inc     hl
        inc     de
        ld      (hl),8
        inc     hl
        ld      a,(de)
        ld      (hl),a
        inc     hl
        ld      (hl),8
        call    checkCollision
        jr      nc,endCheckGetPickupsLoop
        pop     hl
        push    hl
        ld      a,(hl)
        ld      (hl),0
        dec     a                               ; Was it an extra life?
        jr      nz,cgp2
        ld      hl,lives
        inc     (hl)
        call    showLives
        jr      cgpAddScore
cgp2:
        dec     a                               ; Was it a bonus score?
        jr      nz,cgp3
        ld      de,100
        call    updateScore
        jr      cgpAddScore
cgp3:
        dec     a                               ; Was it a power gun?
        jr      nz,cgp4
        call    tryIniOrb
        jr      c,cgpAddScore
        ld      a,1
        ld      (specialWeapon),a
        jr      cgpAddScore
cgp4:
        dec     a                               ; Was it a two-way gun?
        jr      nz,cgp5
        call    tryIniOrb
        jr      c,cgpAddScore
        ld      a,2
        ld      (specialWeapon),a
        jr      cgpAddScore
cgp5:
        call    tryIniOrb
        jr      c,cgpAddScore
        ld      a,3
        ld      (specialWeapon),a
cgpAddScore:
        ld      de,10
        call    updateScore
endCheckGetPickupsLoop:
        pop     hl
        pop     bc
        inc     hl
        inc     hl
        inc     hl
        djnz    checkGetPickupsLoop
        ret

.end
