Rispondi 
[Gb] Mining Pick! ASM per Oggetti
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
Big Grin Mining Pick! ASM per Oggetti

Per ulteriori informazioni: Item Hacking Tutorial

Dato che sono generoso Ho deciso di condividere a tutti lo script ASM che creai nella mia hack per l'utilizzo del Piccone, il Mining Pick, funzionalità popolare presso molti altri giochi RPG oltre che nei stessi giochi canonici di Pokémon (Perla e Diamante, nei sotterranei della regione) e in diverse altre hack, per lo più GBC. Oggi verrà invece riproposta in formato GB per il Disassembly (in versione "semplificata" rispetto alla mia hack, dove tale ASM è più complessa ed include più tileset e altre linee ASM extra).

Questa funzione ASM va aggiunta al file engine\items\items.asm della vostra Repository di Pokered/Pokeblue/PokeYellow e va in seguito assegnata in ItemUsePtrTable: ; d5e1 (3:55e1) all'oggetto che deve utilizzare tale funzione.

Questa ASM, quando utilizzata da un oggetto, fa sì che sia possibile estrarre altri oggetti selezionabili a random entro una determinata lista quando il giocatore si trova in certi tileset e di fronte a certi tile, entrambi determinati in base ad un elenco. L'oggetto estratto viene temporaneamente salvato su un indirizzo WRAM (ovviamente da modificare) che può essere riutilizzato qui, o per altri scopi (può servire a tenere in memoria l'ultimo oggetto estratto).
Ovviamente se la borsa è piena l'oggetto non può essere raccolto.

Inoltre, nel codice è previsto un tasso di fallimento dell'estrazione dell'oggetto (giusto per non rendere le cose così facili).

NB: La maggior parte delle glosse qui riportate è in inglese (maccheronico ma comprensibile).

Codice:
ItemUseMiningPick: ;
; non utilizzabile in battaglia
    ld a,[W_ISINBATTLE]        
    and a                ; cp a,00
    jr nz,.NoMining            ; mining pick can't be used in battle
.NotOnBikeAndSurf
    ld a,[$d700]            ; Player's state
    and a                ; cp a,00
    jr z,.TilesetCheck                    ; can be used only on foot
; falls through
.NoMining
    jp ItemUseNotTime
.TilesetCheck
    ld a,[CURMAPTILESET]        ; 0xd367
    cp $11 ; caves
    jr nz,.NoMining    ; if the player is not in that tileset don't use the item
.MineCaves    
    ld a,[W_TILEINFRONTOFPLAYER]    ; 0xcfc6
    ld hl, MineTilesCaves        ;
    ld de, $1
    call IsInArray
    jr nc,.NoMining        ; if it's not that tile then it is not usable
; falls through
; -----------
; Before we proceed here's the failure index,
; how Failure Index works:
; a Random 8-bit value is generated,
; if the value it's <= 160 then success, otherwise fails to extract
; this means there's a 20% chance of failure to extract anything.
.FailureIndex    
    call GenRandom             ; 3e5c
    ld b,a                ; store random value in b
    ld a,$9F            ; 160 \ 255 ---&gt; 80% of success
    cp b                ; cp value in a with value in b
    jr c,.FailedToExtract        ; pass only if random number < 159
; success, falls through
; now here's the part where a random item is obtained
; how it works:
; a random number is generated in a, then it's compared with an array
; if it's in the array, gives the item to the player
; if the bag is full, doesn't give item and gives the appropriate message
.MiningLoop
    call GenRandom
    ld [W_MINING],a            ; 0xdf2c - store Mining Item ID
    ld hl, MiningPrizes        ;
    ld de, $1
    call IsInArray
    jr nc,.MiningLoop        ; loop if it is not in the array
.MiningItemObtained
    ld a,[W_MINING]            ; 0xdf2c
    ld b,a                ; pseudo-random number loaded in b
    ld c,$01            ; item quantity ---&gt; 1
    call GiveItem            ; 3e2e (0:3e2e)
    jr nc, .BagFull            
    call ItemUseReloadOverworldData    ; 0xe9c5 (3:69c5)
; la riga precedente serve a chiudere il menù e mostrare l'ambiente
    ld hl, ReceivedMiningItemText    ; 0x4740
    call PrintText            ; 0x3c49
    jr .RemoveMiningPickFromInventory
.FailedtoExtract
    ld hl,FailedToExtractText    
    call PrintText            ; 0x3c49
.RemoveMiningPickFromInventory    
    xor a
    inc a                ; ld a,$01
    ld [$cd6a],a ; item used
.RemoveUsedItem
    ld hl,wNumBagItems ; d31d
    ld a,1 ; one item
    ld [$cf96],a ; store quantity
    jp RemoveItemFromInventory
.BagFull    
    ld hl, NoMoreRoomForItemText        ;
    jp ItemUseFailed         ; e5b9 (3:65b9)

----

MineTilesCaves:
05 10 12 1c 20 21 25 28 2a 30 35 36 38 39 3e 3f 41 ff

MiningPrizes:
$0A ; $1A ; $1C ; $1F ; $20 ; $21 ; $22 ; $01
$29 ; $2A ; $2F ; $31 ; $54 ; $57 ; $5B ; $5C
$5D ; $5E ; $5F ; $60 ; $61 ; $62 ; $66 ; $79
$FF ; terminator

------

ReceivedMiningItemText:
      TX_FAR _ReceivedMiningItemText

FailedToExtractText:
      TX_FAR _FailedToExtractText

NoMoreRoomForItemText:
      TX_FAR _NoMoreRoomForItemText

POKEMON GRAPE (FINAL) DISPONIBILE! CLICCA IL BANNER!
[Immagine: tumblr_npqfq38PKG1tp2yqno3_400.png]
(Questo messaggio è stato modificato l'ultima volta il: 26-03-2020 12:12 AM da 80C.)
26-03-2020 12:09 AM
Sito Web Cerca Cita
 Mi piace ricevuti da: Flygon , Half shadow
Half shadow
Genio
****
Offline

Messaggi: 416
Registrato: 06-10-2014
Reputazione: 3
Mi Piace Ricevuti: 208
PokéMoney: 719.00₱
Messaggio: #2
RE: Mining Pick! ASM per Oggetti
Se non sbaglio questo sistema è anche in Prisma, grazie per averlo condiviso!
26-03-2020 12:44 AM
Cerca Cita
80C
['eɪtɪ sɪ:]
******
Offline

Messaggi: 1,813
Registrato: 12-06-2014
Reputazione: 27
Mi Piace Ricevuti: 1093
PokéMoney: 3,739.01₱
Messaggio: #3
RE: Mining Pick! ASM per Oggetti
(26-03-2020 12:44 AM)Half shadow Ha scritto:  Se non sbaglio questo sistema è anche in Prisma, grazie per averlo condiviso!

Sì, questa funzionalità se non erro avrebbe dovuto esserci anche nella versione finale di Pokemon Dark Energy, tuttavia in entrambi i casi essendo GBC non avevo la più pallida idea di come funzionasse lì, motivo per cui creai questa routine ASM da zero senza riferimenti veri e propri se non l'idea della meccanica di base in sé (sarà stato nel 2015, c'è qualche post da qualche parte che lo conferma).

POKEMON GRAPE (FINAL) DISPONIBILE! CLICCA IL BANNER!
[Immagine: tumblr_npqfq38PKG1tp2yqno3_400.png]
(Questo messaggio è stato modificato l'ultima volta il: 26-03-2020 12:53 AM da 80C.)
26-03-2020 12:50 AM
Sito Web Cerca Cita
 Mi piace ricevuti da: Half shadow
Rispondi 




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