diff options
Diffstat (limited to 'engine/events/treemons.asm')
-rw-r--r-- | engine/events/treemons.asm | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/engine/events/treemons.asm b/engine/events/treemons.asm new file mode 100644 index 00000000..94782643 --- /dev/null +++ b/engine/events/treemons.asm @@ -0,0 +1,273 @@ +TreeMonEncounter: + xor a + ld [wTempWildMonSpecies], a + ld [wCurPartyLevel], a + + ld hl, TreeMonMaps + call GetTreeMonSet + jr nc, .no_battle + + call GetTreeMons + jr nc, .no_battle + + call GetTreeMon + jr nc, .no_battle + + ld a, BATTLETYPE_TREE + ld [wBattleType], a + ld a, 1 + ld [wScriptVar], a + ret + +.no_battle + xor a + ld [wScriptVar], a + ret + +RockMonEncounter: + xor a + ld [wTempWildMonSpecies], a + ld [wCurPartyLevel], a + + ld hl, RockMonMaps + call GetTreeMonSet + jr nc, .no_battle + + call GetTreeMons + jr nc, .no_battle + + ; 40% chance of an encounter + ld a, 10 + call RandomRange + cp 4 + jr nc, .no_battle + + call SelectTreeMon + jr nc, .no_battle + + ret + +.no_battle + xor a + ret + +db $05 ; ???? + +GetTreeMonSet: +; Return carry and treemon set in a +; if the current map is in table hl. + ld a, [wMapNumber] + ld e, a + ld a, [wMapGroup] + ld d, a +.loop + ld a, [hli] + cp -1 + jr z, .not_in_table + + cp d + jr nz, .skip2 + + ld a, [hli] + cp e + jr nz, .skip1 + + jr .in_table + +.skip2 + inc hl +.skip1 + inc hl + jr .loop + +.not_in_table + xor a + ret + +.in_table + ld a, [hl] + scf + ret + +INCLUDE "data/wild/treemon_maps.asm" + +GetTreeMons: +; Return the address of TreeMon table a in hl. +; Return nc if table a doesn't exist. + + cp NUM_TREEMON_SETS + jr nc, .quit + + and a + jr z, .quit + + ld e, a + ld d, 0 + ld hl, TreeMons + add hl, de + add hl, de + + ld a, [hli] + ld h, [hl] + ld l, a + + scf + ret + +.quit + xor a + ret + +INCLUDE "data/wild/treemons.asm" + +GetTreeMon: + push hl + call GetTreeScore + pop hl + and a ; TREEMON_SCORE_BAD + jr z, .bad + cp TREEMON_SCORE_GOOD + jr z, .good + cp TREEMON_SCORE_RARE + jr z, .rare + ret + +.bad + ; 10% chance of an encounter + ld a, 10 + call RandomRange + and a + jr nz, NoTreeMon + jr SelectTreeMon + +.good + ; 50% chance of an encounter + ld a, 10 + call RandomRange + cp 5 + jr nc, NoTreeMon + jr SelectTreeMon + +.rare + ; 80% chance of an encounter + ld a, 10 + call RandomRange + cp 8 + jr nc, NoTreeMon + jr .skip +.skip + ld a, [hli] + cp -1 + jr nz, .skip + call SelectTreeMon + ret + +SelectTreeMon: +; Read a TreeMons table and pick one monster at random. + + ld a, 100 + call RandomRange +.loop + sub [hl] + jr c, .ok + inc hl + inc hl + inc hl + jr .loop + +.ok + ld a, [hli] + cp -1 + jr z, NoTreeMon + + ld a, [hli] + ld [wTempWildMonSpecies], a + ld a, [hl] + ld [wCurPartyLevel], a + scf + ret + +NoTreeMon: + xor a + ld [wTempWildMonSpecies], a + ld [wCurPartyLevel], a + ret + +GetTreeScore: + call .CoordScore + ld [wBuffer1], a + call .OTIDScore + ld [wBuffer2], a + ld c, a + ld a, [wBuffer1] + sub c + jr z, .rare + jr nc, .ok + add 10 +.ok + cp 5 + jr c, .good + +.bad + xor a ; TREEMON_SCORE_BAD + ret + +.good + ld a, TREEMON_SCORE_GOOD + ret + +.rare + ld a, TREEMON_SCORE_RARE + ret + +.CoordScore: + call GetFacingTileCoord + ld hl, 0 + ld c, e + ld b, 0 + ld a, d + + and a + jr z, .next +.loop + add hl, bc + dec a + jr nz, .loop +.next + + add hl, bc + ld c, d + add hl, bc + + ld a, h + ldh [hDividend], a + ld a, l + ldh [hDividend + 1], a + ld a, 5 + ldh [hDivisor], a + ld b, 2 + call Divide + + ldh a, [hQuotient + 2] + ldh [hDividend], a + ldh a, [hQuotient + 3] + ldh [hDividend + 1], a + ld a, 10 + ldh [hDivisor], a + ld b, 2 + call Divide + + ldh a, [hRemainder] + ret + +.OTIDScore: + ld a, [wPlayerID] + ldh [hDividend], a + ld a, [wPlayerID + 1] + ldh [hDividend + 1], a + ld a, 10 + ldh [hDivisor], a + ld b, 2 + call Divide + ldh a, [hRemainder] + ret |