Rispondi 
[Gb] Testo/Evento Menù per comprare Pokémon
80C
['eɪtɪ sɪ:]
******
Offline

Messaggi: 1,813
Registrato: 12-06-2014
Reputazione: 27
Mi Piace Ricevuti: 1093
PokéMoney: 3,739.01₱
Messaggio: #1
Testo/Evento Menù per comprare Pokémon
Il seguente è una routine ASM script testo, ossia una routine ASM utilizzata da un Testo, per Pokemon R/B/Y per generare un menù attraverso il quale poter comprare dei Pokémon, sviluppata da me per Pokémon Grape.
E' implicato l'impiego della Disassembly.

N.B: Avendo sviluppato l'hack con l'Hex Editing, e molti anni fa, questo script è stato compilato unicamente per verificare la correttezza dei byte ed è possibile, pertanto, che tale script non sia formattato in modo del tutto idoneo per la Disassembly, anche perché nel frattempo vi sono stati dei cambiamenti nel formato dello stesso Compilatore (Assemblatore), specie per la funzione "Coord" che nelle disassembly odierne è strutturata secondo una modalità (MACRO) diversa.
Un altro caso di mala formattazione riguarda i commenti posti a fianco delle funzioni tramite ";" -- scelta oggi sconsigliabile visto che oggi è fortemente consigliabile porre i commenti posti dopo "," sotto le linee di ASM anziché di fianco ad esse.
Spetterà a voi uniformarlo come meglio potete/dovete.

L'idea di base è quella di partire dallo script dei Premi offerti nel casinò e riproporlo utilizzando pokédollari anziché gettoni.

Questo è solo un esempio per mostrare come creare un evento tale a livello teorico, ovviamente con qualche nozione di ASM si può facilmente modificare i Pokémon venduti, o anche aumentare la quantità di pokémon offerti o addirittura porre condizioni affinché vengano venduti oppure no -- ad esempio, aggiungendo dei check i quali, in base ad una flag, possono dare l'ok o il rifiuto all'operazione, con tanto di testo personalizzato. Quando si tratta di ASM, gli unici limiti sono l'Architettura 8Bit e la Memoria, e ovviamente la fantasia e la disponibilità di tempo Wink

Questa ASM può essere assegnata ad un testo di una mappa, a suo turno utilizzabile da un NPC; oppure tale testo può essere indicizzato tra i pointer dei testi di una mappa ed utilizzato tramite la funzione DisplayTextID (0:2920).

Codice:
BuyStarterText: ;dc7c0 (c047)
    db $08 ; asm
    ld hl,Text_SellPokemon
    call PrintText ;3c49
    call YesNoChoice ;35ec
    ld a, [$cc26]
    and a
    jr nz, .comeagain
.displaychoicemenu
    ld hl,$D730
    set 6,[hl] ; print letters with no delay
; the following are the menu settings
    xor a
    ld [$CC26],a     ;the id of the currently selected menu item
    ld [$CC2A],a    ;id of previously selected menu item
    ld a,$03
    ld [$CC29],a    ;bit mask of keys that the menu will respond to
    ld a,$03
    ld [$CC28],a    ;id of the bottom menu item
    ld a,$04
    ld [$CC24],a    ;wTopMenuItemY
    ld a,$01
    ld [$CC25],a    ;wTopMenuItemx
    ld hl,Text_WhichPrize
    call PrintText ;3c49
    call Func_PrintPrizePrice
    FuncCoord 0,2
    ld hl,Coord
    ld b,$08
    ld c,$10
    call TextBoxBorder ;1922
; serve a rendere la comparsa del testo istantanea
    ld a, [wLetterPrintingDelayFlags]    ; d358
    push af
    xor a
    ld [wLetterPrintingDelayFlags], a    ; d358
    call UpdateSprites ;2429
    call Func_GetPrizeMenuId
; serve a resettare la comparsa del testo istantanea
    pop af
    ld [wLetterPrintingDelayFlags], a    ; d358
;    
    call HandleMenuInput ; menu choice handler
    bit 1,a ; keypress = B (Cancel)
    jr nz,.NoChoice
    ld a,[$CC26]
    cp a,$03 ; "NO,THANKS" choice
    jr z,.NoChoice
    call Func_HandlePrizeChoice
.NoChoice
    ld hl,$D730
    res 6,[hl] ; falls through
.comeagain
    ld hl, Text_ComeAgain
    call printtext ;3c49    
    jp TextScriptEnd

; le ID dei pokémon si possono modificare con gli Indici corrispondenti all'Ordine Interno dei Pokémon (Rhydon, Kangaskhan, Nidoran, etc.)
Func_GetPrizeMenuId: ;
; load the three pokemon at $D13D-$D13F
; load the three prices at $D141-$D146
; display the three prizes' names
.putpokemon    
    ld a,$99 ;bulbasaur
    ld [$d13d],a
    ld a,$b0 ;charmander
    ld [$d13e],a
    ld a,$b1 ;squirtle
    ld [$d13f],a
.putprices
    ld hl,pokemonprices
    ld de,$d141
    ld bc,$0006
    calll CopyData    
.putMonName         
    ld a,[W_PRIZE1]
    ld [$D11E],a
    call GetMonName
    FuncCoord 2,4
    ld hl,Coord
    call PlaceString
    ld a,[W_PRIZE2]
    ld [$D11E],a
    call GetMonName
    FuncCoord 2,6
    ld hl,Coord
    call PlaceString
    ld a,[W_PRIZE3]
    ld [$D11E],a
    call GetMonName
    FuncCoord 2,8
    ld hl,Coord
    call PlaceString
.putNoThanksText     
    FuncCoord 2,10
    ld hl,Coord
    ld de,NoThanksText    
    call PlaceString
; put prices on the right side of the textbox
    ld de,$D141
    FuncCoord 13,5
    ld hl,Coord
; reg. c:
; [low nybble] number of bytes
; [bit 765 = %100] space-padding (not zero-padding)
    ld c,(1 << 7 | 2)
; Function $15CD displays BCD value (same routine
; used by text-command $02)
    call PrintBCDNumber ; Print_BCD
    ld de,$D143
    FuncCoord 13,7
    ld hl,Coord
    ld c,(%1 << 7 | 2)
    call PrintBCDNumber
    ld de,$D145
    FuncCoord 13,9
    ld hl,Coord
    ld c,(1 << 7 | 2)
    jp PrintBCDNumber

PokemonPrices:
    db 5100,
    db 5300,
    db 5200,
    db $50;

NoThanksText:
    db "NO THANKS@"


LoadMoneyToSubtract:
    ld a,[$D139] ; backup of selected menu_entry
    add a
    ld d,$00
    ld e,a
    ld hl,$D141 ; first pokemon's price
    add hl,de ; get selected pokemon's price
    xor a
    ld [$FF9F],a
    ld a,[hli]
    ld [$FFA1],a
    ld a,[hl]
    ld [$FFA0],a
    ret

Func_HandlePrizeChoice:
    ld a,[$CC26] ; selected menu_entry
    ld [$D139],a
    ld d,$00
    ld e,a
    ld hl,W_PRIZE1
    add hl,de
    ld a,[hl]
    ld [$D11E],a
.GetMonName ;
    call GetMonName
.GivePrize ;
    ld hl,SoYouWantPrizeTextPtr
    call PrintText ;3c49
    call YesNoChoice ; yes/no textbox
    ld a,[$CC26] ; yes/no answer (Y=0, N=1)
    and a
    jr nz,.PrintOhFineThen
    call LoadMoneyToSubtract
    call HasEnoughMoney ;35a6    
    jr c,.NotEnoughMoney    
.GiveMon ;
    ld a,[$D11E]
    ld [$CF91],a
    push af
    call GetPrizeMonLevel     
    ld c,a
    pop af
    ld b,a
    call GivePokemon
    push af
    ld a,[$CCD3] ; XXX is there room?
    and a
    call z,WaitForTextScrollButtonPress
    pop af
    jr nc,.ender    
.SubtractMoney ;
    call LoadMoneyToSubtract    
    ld de,$D349 ;wPlayerMoney +2
    ld hl,$FFA1
    ld c,$02 ; how many bytes, lenght of money in bytes
    ld a,$0C
    call Predef ; subtract coins (BCD daa operations)
    call Func_PrintPrizePrice    
    jr .ender    
.NotEnoughMoney
    ld hl,SorryNeedMoreCoinsTextPtr    
    call PrintText ;3c49
    jr .ender
.PrintOhFineThen
    ld hl,OhFineThenTextPtr
    call PrintText ;3c49 , falls through
.ender ; 3c49
    jp textscriptend
    ret

GetPrizeMonLevel:
    ld a,[$CF91]
    ld b,a
    ld hl,PrizeMonLevelDictionary    
.loop ;
    ld a,[hli]
    cp b
    jr z,.matchFound
    inc hl
    jr .loop
.matchFound ;
    ld a,[hl]
    ld [$D127],a
    ret

PrizeMonLevelDictionary:
    db BULBASAUR,10
    db CHARMANDER,10
    db SQUIRTLE,10
    db $FF

Func_PrintPrizePrice:
    ld a,$13
    ld [$d125],a
    call DisplayTextBoxID ; draw money text box
    ret

Text_SellPokemon:
    TX_FAR _Text_SellPokemon ;
    db "@"                        

Text_WhichPrize: ;
    TX_FAR _WhichPrizeText ; 22:62CD                
    db "@"    

ComeagainTextPtr:
    TX_FAR _OhFineThenText; 22:634C            
    db $0D ; wait keypress (A/B) without blink
    db "@"

SoYouWantPrizeTextPtr:
    TX_FAR _SoYouWantPrizeText ; 22:62F6
    db "@"    

SorryNeedMoreCoinsTextPtr:
    TX_FAR _SorryNeedMoreCoins ; 22:630B    
    db $0D ; wait keypress (A/B) without blink    
    db "@"                        

OhFineThenTextPtr:
    TX_FAR _OhFineThenText; 22:634C
    db $0D ; wait keypress (A/B) without blink    
    db "@"

Spero che possa essere di qualche aiuto in futuro ad eventuali futuri appassionati di ASM GB... Cool

POKEMON GRAPE (FINAL) DISPONIBILE! CLICCA IL BANNER!
[Immagine: tumblr_npqfq38PKG1tp2yqno3_400.png]
(Questo messaggio è stato modificato l'ultima volta il: 25-03-2020 11:44 PM da 80C.)
25-03-2020 11:44 PM
Sito Web Cerca Cita
 Mi piace ricevuti da: E²VaN , Flygon , Half shadow
Rispondi 




Utente(i) che stanno guardando questa discussione: 1 Ospite(i)
Powered by MyBB, © 2002-2020 MyBB Group. Copyright © | 2020 Pokémon Hacking