diff options
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | constants.asm | 2 | ||||
-rw-r--r-- | extras/generate_sys.py | 8 | ||||
-rw-r--r-- | main.asm | 637 |
4 files changed, 624 insertions, 26 deletions
@@ -25,6 +25,9 @@ baserom.sav pokered.sgm pokered.sav +baserom.sys +pokered.sys + # for vim configuration # url: http://www.vim.org/scripts/script.php?script_id=441 .lvimrc diff --git a/constants.asm b/constants.asm index 9c5c8be7..c6f42b51 100644 --- a/constants.asm +++ b/constants.asm @@ -148,6 +148,7 @@ W_MENUWRAPPINGENABLED EQU $CC4A W_PLAYERSUBSITUTEHP EQU $CCD7 W_ENEMYSUBSITUTEHP EQU $CCD8 +W_MOVEMENUTYPE EQU $CCDB ; 0=regular, 1=mimic, 2=above message box (relearn, heal pp..) W_PLAYERSELECTEDMOVE EQU $CCDC W_ENEMYSELECTEDMOVE EQU $CCDD @@ -251,6 +252,7 @@ W_BATTLETYPE EQU $D05A ; in normal battle, this is 0 ; in safari battle, this is 2 W_LONEATTACKNO EQU $D05C ; which entry in LoneAttacks to use +W_GYMLEADERNO EQU $D05C ; it's actually the same thing as ^ W_TRAINERNO EQU $D05D ; which instance of [youngster, lass, etc] is this? W_MOVEMISSED EQU $D05F diff --git a/extras/generate_sys.py b/extras/generate_sys.py new file mode 100644 index 00000000..72957038 --- /dev/null +++ b/extras/generate_sys.py @@ -0,0 +1,8 @@ +import json + +import analyze_incbins +analyze_incbins.scan_for_predefined_labels() + +with open('../pokered.sym', 'w') as sym: + for label in json.load(open('labels.json')): + sym.write('{0:x}:{1} {2}\n'.format(label['bank_id'], label['local_pointer'][1:], label['label'])) @@ -17449,7 +17449,7 @@ ItemUsePPRestore: ; 631E cp a,ELIXER jp nc,.useElixir ; if Elixir or Max Elixir ld a,$02 - ld [$ccdb],a + ld [W_MOVEMENUTYPE],a ld hl,RaisePPWhichTechniqueText ld a,[$cd3d] cp a,ETHER ; is it a PP Up? @@ -17459,8 +17459,8 @@ ItemUsePPRestore: ; 631E call PrintText xor a ld [$cc2e],a - ld hl,$5219 - ld b,$0f + ld hl,MoveSelectionMenu + ld b,BANK(MoveSelectionMenu) call Bankswitch ; move selection menu ld a,0 ld [$cc2e],a @@ -18347,7 +18347,38 @@ _UnnamedText_ef7d: ; 0xef7d db $50 ; 0xef7d + 5 bytes -INCBIN "baserom.gbc",$ef82,$f6a5 - $ef82 +INCBIN "baserom.gbc",$ef82,$f473 - $ef82 + +LoadMovePPs: ; 0xf473 + call Load16BitRegisters + ld b, $4 +.pploop + ld a, [hli] + and a + jr z, .empty ; 0xf47a $1b + dec a + push hl + push de + push bc + ld hl, Moves + ld bc, $0006 + call AddNTimes + ld de, $cd6d + ld a, BANK(Moves) + call FarCopyData + pop bc + pop de + pop hl + ld a, [$cd72] ; sixth move byte = pp +.empty + inc de + ld [de], a + dec b + jr nz, .pploop ; there are still moves to read + ret +; 0xf49d + +INCBIN "baserom.gbc",$f49d,$f6a5 - $f49d HealParty: ld hl, W_PARTYMON1 @@ -40528,15 +40559,52 @@ UnnamedText_3c63e: ; 0x3c63e db $50 ; 0x3c63e + 5 bytes -INCBIN "baserom.gbc",$3c643,$3c6e4 - $3c643 +INCBIN "baserom.gbc",$3c643,$3c696 - $3c643 + +TrainerBattleVictory: ; 3c696 F:4696 + call $4643 + ld b, $fc + ld a, [W_GYMLEADERNO] + and a + jr nz, .notgymleader ; 0x3c69f $2 + ld b, $f6 ; gym leader win music +.notgymleader ; 3c6a3 + ld a, [W_TRAINERCLASS] + cp SONY3 ; final battle against rival + jr nz, .notrival ; 0x3c6a8 $7 + ld b, $fc ; final rival battle win music + ld hl, $d733 + set 1, [hl] +.notrival + ld a, [W_ISLINKBATTLE] + cp $4 + ld a, b + call nz, $46ee + ld hl, TrainerDefeatedText + call PrintText + ld a, [W_ISLINKBATTLE] + cp $4 + ret z + call $6d12 + ld c, $28 + call DelayFrames + call $3381 + ld hl, MoneyForWinningText + call PrintText + ld de, W_PLAYERMONEY1 + ld hl, $d07b + ld c, $3 + ld a, $b + jp Predef +; 0x3c6e4 -UnnamedText_3c6e4: ; 0x3c6e4 - TX_FAR _UnnamedText_3c6e4 +MoneyForWinningText: ; 0x3c6e4 + TX_FAR MoneyForWinningText_ db $50 ; 0x3c6e4 + 5 bytes -UnnamedText_3c6e9: ; 0x3c6e9 - TX_FAR _UnnamedText_3c6e9 +TrainerDefeatedText: ; 0x3c6e9 + TX_FAR TrainerDefeatedText_ db $50 ; 0x3c6e9 + 5 bytes @@ -40775,12 +40843,274 @@ UnnamedText_3cba1: ; 0x3cba1 db $50 ; 0x3cba1 + 5 bytes -INCBIN "baserom.gbc",$3cba6,$3d0c5 - $3cba6 +INCBIN "baserom.gbc",$3cba6,$3ceb3 - $3cba6 + +InitBattleMenu: ; 0x3ceb3 F:4EB3 + call $3725 ; restore saved screen + ld a, [W_BATTLETYPE] + and a + jr nz, .nonstandardbattle ; 0x3ceba $9 + call $4d5a ; redraw names and HP bars? + call $6e94 + call $3719 ; save screen +.nonstandardbattle + ld a, [W_BATTLETYPE] + cp $2 ; safari + ld a, $b ; safari menu id + jr nz, .menuselected ; 0x3cecc $2 + ld a, $1b ; regular menu id +.menuselected + ld [$d125], a + call DisplayTextBoxID + ld a, [$d05a] + dec a + jp nz, RegularBattleMenu ; regular battle + ; the following happens for the old man tutorial + ld hl, W_PLAYERNAME + ld de, W_GRASSRATE + ld bc, $000b + call CopyData ; temporary save the player name in unused space, + ; which is supposed to get overwritten when entering a map + ; with wild pokémon. due to an oversight, the data may not + ; get overwritten (cinnabar) and the infamous missingno. + ; glitch can show up. + ld hl, OldManName + ld de, W_PLAYERNAME + ld bc, $000b + call CopyData + ; the following probably sets the keystrokes + ld hl, $c4c1 + ld [hl], $ed + ld c, $50 + call DelayFrames + ld [hl], $7f + ld hl, $c4e9 + ld [hl], $ed + ld c, $32 + call DelayFrames + ld [hl], $ec + ld a, $2 + jp $4fe8 + +OldManName: ; 0x3cf12 + db "OLD MAN@" -UnnamedText_3d0c5: ; 0x3d0c5 - TX_FAR _UnnamedText_3d0c5 +RegularBattleMenu: ; 0x3cf1a + ld a, [$cc2d] + ld [W_CURMENUITEMID], a + ld [W_OLDMENUITEMID], a + sub $2 + jr c, .leftcolumn ; 0x3cf25 $8 + ld [W_CURMENUITEMID], a + ld [W_OLDMENUITEMID], a + jr .rightcolumn ; 0x3cf2d $3f +.leftcolumn + ld a, [W_BATTLETYPE] + cp $2 + ld a, $7f + jr z, .safaribattle ; 0x3cf36 $a + ld [$c4c7], a + ld [$c4ef], a + ld b, $9 + jr .notsafari ; 0x3cf40 $14 +.safaribattle ; 3cf42 + ld [$c4c5], a + ld [$c4ed], a + FuncCoord 7,14 + ld hl, Coord + ld de, W_NUMSAFARIBALLS + ld bc, $0102 + call PrintNumber + ld b, $1 +.notsafari ; 3cf56 + ld hl, W_TOPMENUITEMY + ld a, $e + ld [hli], a + ld a, b + ld [hli], a + inc hl + inc hl + ld a, $1 + ld [hli], a + ld [hl], $11 + call HandleMenuInput + bit 4, a + jr nz, .rightcolumn ; 0x3cf6a $2 + jr .selection ; 0x3cf6c $46 +.rightcolumn ;3cf6e + ld a, [W_BATTLETYPE] + cp $2 + ld a, $7f + jr z, .safarirightcolumn ; 0x3cf75 $a + ld [$c4c1], a + ld [$c4e9], a + ld b, $f + jr .notsafarirightcolumn ; 0x3cf7f $14 +.safarirightcolumn ; 3cf81 + ld [$c4b9], a + ld [$c4e1], a + FuncCoord 7,14 + ld hl, Coord + ld de, W_NUMSAFARIBALLS + ld bc, $0102 + call PrintNumber ; redraw + ld b, $d +.notsafarirightcolumn + ld hl, W_TOPMENUITEMY + ld a, $e + ld [hli], a + ld a, b + ld [hli], a + inc hl + inc hl + ld a, $1 + ld [hli], a + ld a, $21 + ld [hli], a + call HandleMenuInput + bit 5, a + jr nz, .leftcolumn ; 0x3cfaa $83 + ld a, [W_CURMENUITEMID] + add $2 ; if we're in the right column, the actual id is +2 + ld [W_CURMENUITEMID], a +.selection ; 3cfb4 + call PlaceUnfilledArrowMenuCursor + ld a, [W_BATTLETYPE] + cp $2 + ld a, [W_CURMENUITEMID] + ld [$cc2d], a + jr z, .asm_3cfd0 ; 0x3cfc2 $c + cp $1 + jr nz, .asm_3cfcb ; 0x3cfc6 $3 + inc a + jr .asm_3cfd0 ; 0x3cfc9 $5 +.asm_3cfcb + cp $2 ; what + jr nz, .asm_3cfd0 ; 0x3cfcd $1 + dec a +.asm_3cfd0 + and a + jr nz, .asm_3cfe8 ; 0x3cfd1 $15 + ; first option was selected... + ld a, [W_BATTLETYPE] + cp $2 + jr z, .safari1 + xor a + ld [$d120], a + jp $3725 ; restore saved screen and return??? +.safari1 ; safari first option?? + ld a, $8 + ld [$cf91], a + jr .asm_3d05f ; 0x3cfe6 $77 +.asm_3cfe8 + cp $2 + jp nz, $50ca + ld a, [W_ISLINKBATTLE] + cp $4 + jr nz, .asm_3cffd ; 0x3cff2 $9 + ld hl, ItemsCantBeUsedHere + call PrintText + jp $4eb3 +.asm_3cffd ; bag? + call $36f4 ; copy bg? + ld a, [W_BATTLETYPE] + cp $2 + jr nz, .asm_3d00e ; 0x3d005 $7 + ld a, $15 + ld [$cf91], a + jr .asm_3d05f ; 0x3d00c $51 +.asm_3d00e + call $3725 + ld a, [W_BATTLETYPE] + and a + jr nz, .asm_3d01a ; 0x3d015 $3 + call $4d5a +.asm_3d01a + ld a, [W_BATTLETYPE] + dec a + jr nz, .asm_3d031 ; 0x3d01e $11 + ld hl, .list + ld a, l + ld [$cf8b], a + ld a, h + ld [$cf8c], a + jr .asm_3d03c ; 0x3d02b $f +.list + db $01, $04, $32, $ff +.asm_3d031 + ld hl, W_NUMBAGITEMS + ld a, l + ld [$cf8b], a + ld a, h + ld [$cf8c], a +.asm_3d03c + xor a + ld [$cf93], a + ld a, $3 + ld [$cf94], a + ld a, [$cc2c] + ld [W_CURMENUITEMID], a + call DisplayListMenuID + ld a, [$cc26] + ld [$cc2c], a + ld a, $0 + ld [$cc37], a + ld [$cc35], a + jp c, $4eb3 +.asm_3d05f + ld a, [$cf91] + ld [$d11e], a + call GetItemName + call $3826 ; copy name + xor a + ld [$d152], a + call UseItem + call $6e5b + call CleanLCD_OAM + xor a + ld [W_CURMENUITEMID], a + ld a, [W_BATTLETYPE] + cp $2 ; safari + jr z, .asm_3d09c ; 0x3d081 $19 + ld a, [$cd6a] + and a + jp z, $500e + ld a, [W_PLAYERBATTSTATUS1] + bit 5, a + jr z, .asm_3d09c ; 0x3d08f $b + ld hl, $d06a + dec [hl] + jr nz, .asm_3d09c ; 0x3d095 $5 + ld hl, W_PLAYERBATTSTATUS1 + res 5, [hl] +.asm_3d09c + ld a, [$d11c] + and a + jr nz, .asm_3d0b7 ; 0x3d0a0 $15 + ld a, [W_BATTLETYPE] + cp $2 + jr z, .asm_3d0b2 ; 0x3d0a7 $9 + call $3725 + call $4d5a ; redraw name and hp bar? + call Delay3 +.asm_3d0b2 + call GBPalNormal + and a + ret +.asm_3d0b7 + call GBPalNormal + xor a + ld [$d11c], a + ld a, $2 + ld [$cf0b], a + scf + ret +; 0x3d0c5 + +ItemsCantBeUsedHere: ; 0x3d0c5 + TX_FAR ItemsCantBeUsedHere_ ; 0x89831 db $50 -; 0x3d0c5 + 5 bytes +; 0x3d0c5 + 5 bytes = 0x3d0ca INCBIN "baserom.gbc",$3d0ca,$3d1f5 - $3d0ca @@ -40789,19 +41119,240 @@ UnnamedText_3d1f5: ; 0x3d1f5 db $50 ; 0x3d1f5 + 5 bytes -INCBIN "baserom.gbc",$3d1fa,$3d3ae - $3d1fa +INCBIN "baserom.gbc",$3d1fa,$3D219 - $3d1fa + +MoveSelectionMenu: ; 3D219 F:5219 + ld a, [W_MOVEMENUTYPE] ; menu type + dec a + jr z, .mimicmenu ; 0x3d21d $56 + dec a + jr z, .relearnmenu ; 0x3d220 $6f + jr .regularmenu ; 0x3d222 $25 +.loadmoves ; 3d222 , called + ld de, $d0dc + ld bc, $0004 + call CopyData + ld hl, $5b87 + ld b, $e + call Bankswitch + ret +.writemoves ; 5236 , called + ld de, $d0e1 + ld a, [$ff00+$f6] + set 2, a + ld [$ff00+$f6], a + call PlaceString + ld a, [$ff00+$f6] + res 2, a + ld [$ff00+$f6], a + ret +.regularmenu ; 3D249 + call $53f5 + ret z + ld hl, $d01c ; W_PLAYERMON? + call .loadmoves + FuncCoord 4, 12 ; $c494 + ld hl, Coord + ld b, $4 + ld c, $e + di + call TextBoxBorder + FuncCoord 4, 12 ; $c494 + ld hl, Coord + ld [hl], $7a + FuncCoord 10, 12 ; $c49a + ld hl, Coord + ld [hl], $7e + ei + FuncCoord 6, 13 ; $c4aa + ld hl, Coord + call .writemoves + ld b, $5 + ld a, $c + jr .menuset ; 0x3d273 $3f +.mimicmenu + ld hl, $cfed + call .loadmoves + FuncCoord 0, 7 ; $c42c + ld hl, Coord + ld b, $4 + ld c, $e + call TextBoxBorder + ld hl, $c442 + call .writemoves + ld b, $1 + ld a, $7 + jr .menuset ; 0x3d28f $23 +.relearnmenu + ld a, [W_WHICHPOKEMON] + ld hl, $d173 + ld bc, $002c + call AddNTimes + call .loadmoves + FuncCoord 4, 7 ; $c430 + ld hl, Coord + ld b, $4 + ld c, $e + call TextBoxBorder + FuncCoord 6, 8 ; $c446 + ld hl, Coord + call .writemoves + ld b, $5 + ld a, $7 +.menuset + ld hl, W_TOPMENUITEMY + ld [hli], a + ld a, b + ld [hli], a ; W_TOPMENUITEMX + ld a, [W_MOVEMENUTYPE] + cp $1 + jr z, .selectedmoveknown ; 0x3d2bf $8 + ld a, $1 + jr nc, .selectedmoveknown ; 0x3d2c3 $4 + ld a, [W_PLAYERMOVELISTINDEX] + inc a +.selectedmoveknown + ld [hli], a ; W_CURMENUITEMID + inc hl ; W_TILEBEHINDCURSOR untouched + ld a, [$cd6c] + inc a + inc a + ld [hli], a ; W_MAXMENUITEMID + ld a, [W_MOVEMENUTYPE] + dec a + ld b, $c1 ; can't use B + jr z, .matchedkeyspicked ; 0x3d2d7 $17 + dec a + ld b, $c3 + jr z, .matchedkeyspicked ; 0x3d2dc $12 + ld a, [W_ISLINKBATTLE] + cp $4 + jr z, .matchedkeyspicked ; 0x3d2e3 $b + ld a, [$d733] + bit 0, a + ld b, $c7 + jr z, .matchedkeyspicked ; 0x3d2ec $2 + ld b, $ff +.matchedkeyspicked + ld a, b + ld [hli], a ; W_MENUWATCHEDKEYS + ld a, [W_MOVEMENUTYPE] + cp $1 + jr z, .movelistindex1 ; 0x3d2f7 $4 + ld a, [W_PLAYERMOVELISTINDEX] + inc a +.movelistindex1 + ld [hl], a ; W_OLDMENUITEMID + ld a, [W_MOVEMENUTYPE] + and a + jr z, .battleselect ; 0x3d302 $e + dec a + jr nz, .select ; 0x3d305 $27 + FuncCoord 1, 14 ; $c4b9 + ld hl, Coord + ld de, WhichTechniqueString + call PlaceString + jr .select ; 0x3d310 $1c +.battleselect + ld a, [$d733] + bit 0, a + jr nz, .select ; 0x3d317 $15 + call $54b6 + ld a, [$cc35] + and a + jr z, .select ; 0x3d320 $c + ld hl, $c4a9 + dec a + ld bc, $0014 + call AddNTimes + ld [hl], $ec +.select ; 3d32e + ld hl, $fff6 + set 1, [hl] + call HandleMenuInput + ld hl, $fff6 + res 1, [hl] + bit 6, a + jp nz, $53c9 ; up + bit 7, a + jp nz, $53dd ; down + bit 2, a + jp nz, $5435 ; select + bit 1, a ; B, but it was reset above? + push af + xor a + ld [$cc35], a + ld a, [W_CURMENUITEMID] + dec a + ld [W_CURMENUITEMID], a + ld b, a + ld a, [W_MOVEMENUTYPE] + dec a ; if not mimic + jr nz, .nob ; 0x3d35d $2 + pop af + ret +.nob; 3d361 + dec a + ld a, b + ld [W_PLAYERMOVELISTINDEX], a + jr nz, .moveselected ; 0x3d366 $2 + pop af + ret +.moveselected ; 3d36a + pop af + ret nz + ld hl, W_PLAYERMONPP + ld a, [W_CURMENUITEMID] + ld c, a + ld b, $0 + add hl, bc + ld a, [hl] + and $3f + jr z, .nopp ; 0x3d379 $27 + ld a, [W_PLAYERDISABLEDMOVE] + swap a + and $f + dec a + cp c + jr z, .disabled ; 0x3d384 $17 + ld a, [W_PLAYERBATTSTATUS3] + bit 3, a ; transformed + jr nz, .dummy ; game freak derp +.dummy ; 3d38d + ld a, [W_CURMENUITEMID] + ld hl, $d01c + ld c, a + ld b, $0 + add hl, bc + ld a, [hl] + ld [W_PLAYERSELECTEDMOVE], a + xor a + ret +.disabled ; + ld hl, MoveDisabledText + jr .print ; 0x3d3a0 $3 +.nopp ; + ld hl, MoveNoPPText +.print ; 3d3a5 + call PrintText + call $3725 + jp MoveSelectionMenu -UnnamedText_3d3ae: ; 0x3d3ae - TX_FAR _UnnamedText_3d3ae +MoveNoPPText: ; 0x3d3ae + TX_FAR MoveNoPPText_ db $50 ; 0x3d3ae + 5 bytes -UnnamedText_3d3b3: ; 0x3d3b3 - TX_FAR _UnnamedText_3d3b3 +MoveDisabledText: ; 0x3d3b3 + TX_FAR MoveDisabledText_ db $50 ; 0x3d3b3 + 5 bytes -INCBIN "baserom.gbc",$3d3b8,$3d430 - $3d3b8 +WhichTechniqueString: ; 3d3b8 + db "WHICH TECHNIQUE?@" +; 3d3c9 + +INCBIN "baserom.gbc",$3d3c9,$3d430 - $3d3c9 UnnamedText_3d430: ; 0x3d430 TX_FAR _UnnamedText_3d430 @@ -42576,7 +43127,40 @@ UnnamedText_3e887: ; 0x3e887 db $50 ; 0x3e887 + 5 bytes -INCBIN "baserom.gbc",$3e88c,$67b +INCBIN "baserom.gbc",$3e88c,$3eabe-$3e88c + +GetCurrentMove: ; $3eabe (f:6abe) + ld a, [H_WHOSETURN] + and a + jp z, .player + ld de, W_ENEMYMOVENUM + ld a, [W_ENEMYSELECTEDMOVE] + jr .selected ; 0x3eaca $10 +.player + ld de, W_PLAYERMOVENUM + ld a, [$d733] + bit 0, a + ld a, [$ccd9] + jr nz, .selected ; 0x3ead7 $3 + ld a, [W_PLAYERSELECTEDMOVE] +.selected + ld [$d0b5], a + dec a + ld hl, Moves + ld bc, $0006 + call AddNTimes + ld a, BANK(Moves) + call FarCopyData + ld a, $2c + ld [$d0b7], a + ld a, $2 + ld [$d0b6], a ; list type 2 = move name + call GetName + ld de, $cd6d + jp $3826 ; copy name +; 0x3eb01 + +INCBIN "baserom.gbc",$3eb01,$3ef07-$3eb01 PlayMoveAnimation: ; 6F07 ld [$D07C],a @@ -53132,7 +53716,8 @@ Predef54Predef: dbw $03,$4D99 dbw $01,$4DE1 dbw $09,$7D98 - dbw $03,$7473 +LoadMovePPsPredef: + dbw BANK(LoadMovePPs),LoadMovePPs ; 5E DrawHPBarPredef: dbw $04,$68EF ; 5F draw HP bar dbw $04,$68F6 @@ -80646,7 +81231,7 @@ _UnnamedText_3c63e: ; 0x896c7 db "fainted!", $58 ; 0x896c7 + 22 bytes = 0x896dd -_UnnamedText_3c6e4: ; 0x896dd +MoneyForWinningText_: ; 0x896dd db $0, $52, " got ¥@" ;XXX $2 db $2, $79, $d0, $c3 @@ -80654,7 +81239,7 @@ _UnnamedText_3c6e4: ; 0x896dd db "for winning!", $58 ; 0x896f9 -_UnnamedText_3c6e9: ; 0x896f9 +TrainerDefeatedText_: ; 0x896f9 db $0, $52, " defeated", $4f db "@" TX_RAM $d04a ; 0x89706 @@ -80727,7 +81312,7 @@ _UnnamedText_3cba1: ; 0x8981f db $0, "Got away safely!", $58 ; 0x8981f + 18 bytes -_UnnamedText_3d0c5: ; 0x89831 +ItemsCantBeUsedHere_: ; 0x89831 db $0, "Items can't be", $4f db "used here.", $58 ; 0x89831 + 26 bytes @@ -80738,12 +81323,12 @@ _UnnamedText_3d1f5: ; 0x8984b db "already out!", $58 ; 0x8984b + 21 bytes -_UnnamedText_3d3ae: ; 0x89860 +MoveNoPPText_: ; 0x89860 db $0, "No PP left for", $4f db "this move!", $58 ; 0x89860 + 27 bytes -_UnnamedText_3d3b3: ; 0x8987b +MoveDisabledText_: ; 0x8987b db $0, "The move is", $4f db "disabled!", $58 ; 0x8987b + 23 bytes |