diff options
Diffstat (limited to 'engine/events/money.asm')
-rw-r--r-- | engine/events/money.asm | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/engine/events/money.asm b/engine/events/money.asm new file mode 100644 index 000000000..585c85618 --- /dev/null +++ b/engine/events/money.asm @@ -0,0 +1,221 @@ +GiveMoney:: ; 15fd7 + ld a, 3 + call AddMoney + ld bc, MaxMoney + ld a, 3 + call CompareMoney + jr z, .not_maxed_out + jr c, .not_maxed_out + ld hl, MaxMoney + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + scf + ret + +.not_maxed_out + and a + ret +; 15ff7 + +MaxMoney: ; 15ff7 + dt MAX_MONEY +; 15ffa + + +TakeMoney:: ; 15ffa + ld a, 3 + call SubtractMoney + jr nc, .okay + ; leave with 0 money + xor a + ld [de], a + inc de + ld [de], a + inc de + ld [de], a + scf + ret + +.okay + and a + ret +; 1600b + +CompareMoney:: ; 1600b + ld a, 3 +CompareFunds: ; 1600d +; a: number of bytes +; bc: start addr of amount (big-endian) +; de: start addr of account (big-endian) + push hl + push de + push bc + ld h, b + ld l, c + ld c, 0 + ld b, a +.loop1 + dec a + jr z, .done + inc de + inc hl + jr .loop1 + +.done + and a +.loop2 + ld a, [de] + sbc [hl] + jr z, .okay + inc c + +.okay + dec de + dec hl + dec b + jr nz, .loop2 + jr c, .set_carry + ld a, c + and a + jr .skip_carry + +.set_carry + ld a, 1 + and a + scf +.skip_carry + pop bc + pop de + pop hl + ret +; 16035 + +SubtractMoney: ; 16035 + ld a, 3 +SubtractFunds: ; 16037 +; a: number of bytes +; bc: start addr of amount (big-endian) +; de: start addr of account (big-endian) + push hl + push de + push bc + ld h, b + ld l, c + ld b, a + ld c, 0 +.loop + dec a + jr z, .done + inc de + inc hl + jr .loop + +.done + and a +.loop2 + ld a, [de] + sbc [hl] + ld [de], a + dec de + dec hl + dec b + jr nz, .loop2 + pop bc + pop de + pop hl + ret +; 16053 + +AddMoney: ; 16053 + ld a, 3 +AddFunds: ; 16055 +; a: number of bytes +; bc: start addr of amount (big-endian) +; de: start addr of account (big-endian) + push hl + push de + push bc + + ld h, b + ld l, c + ld b, a +.loop1 + dec a + jr z, .done + inc de + inc hl + jr .loop1 + +.done + and a +.loop2 + ld a, [de] + adc [hl] + ld [de], a + dec de + dec hl + dec b + jr nz, .loop2 + + pop bc + pop de + pop hl + ret +; 1606f + +GiveCoins:: ; 1606f + ld a, 2 + ld de, wCoins + call AddFunds + ld a, 2 + ld bc, .maxcoins + call CompareFunds + jr c, .not_maxed + ld hl, .maxcoins + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + scf + ret + +.not_maxed + and a + ret +; 1608d + +.maxcoins ; 1608d + bigdw MAX_COINS +; 1608f + + +TakeCoins:: ; 1608f + ld a, 2 + ld de, wCoins + call SubtractFunds + jr nc, .okay + ; leave with 0 coins + xor a + ld [de], a + inc de + ld [de], a + scf + ret + +.okay + and a + ret +; 160a1 + +CheckCoins:: ; 160a1 + ld a, 2 + ld de, wCoins + jp CompareFunds +; 160a9 |