Questo Forum utilizza i Cookies
Questo Forum fa uso di Cookies per memorizzare le informazioni di login se sei registrato o sulla tua ultima visita se non siete registrati. I Cookies sono piccoli documenti di testo memorizzati sul vostro computer; i Cookies impostati dal Forum possono essere utilizzati solo su questo sito e non costituiscono rischio per la sicurezza. I Cookies su questo forum servono anche a monitorare gli argomenti specifici che hai letto. Si prega di confermare se accettare o rifiutare i Cookies impostati.

Un cookie verrà memorizzato nel browser indipendentemente dalla scelta, per evitare che il Forum faccia nuovamente questa domanda. Sarete in grado di modificare le impostazioni dei cookies in qualsiasi momento tramite il link a piè di pagina

Rispondi 
[Gb] R\B Headers Advance - Script Mappa
Bra
['e…™t…™ s…™:]
******
Offline

Messaggi: 1,942
Registrato: 12-06-2014
Reputazione: 32
Mi Piace Ricevuti: 1472
PH Points: 2,900.76
Messaggio: #1
R\B Headers Advance - Script Mappa
GUIDA UNIVERSALE ALLO SCRIPTING GEN1

Ciao! Sono 80C, e oggi presento un Tutorial sul Mapping/Scripting Avanzato e gestione degli eventi nelle Mappe per i giochi di Prima Generazione che funge da complemento al gi√† ottimo R\B Headers. Quel documento √® pi√Ļ che altro dedicato all' Object Data di un Header, il che √® utilissimo; √® necessario per√≤ un ampliamento andando ad approfondire le altre parti che caratterizzano una Mappa: I Testi e gli Script. La scorsa volta abbiamo visto come vengono gestiti i testi in una mappa. Qui vedremo la gestione degli Script in una Mappa.

Pokéball GLI HEADERS - STRUTTURA

I Headers di una mappa sono il cardine di una mappa: è la sezione che, per ciascuna mappa, contiene tutti i dati fondamentali associati a quella mappa.
Ecco come è costituito uno Header di una mappa. Ciascuna coppia di lettere indica dei bytes. Vediamone l'utilizzo:

AA\BBbb\CCCC\DDDD\EEEE\(Connection Data)\FFFF
  • AA = (Byte) Tileset;
  • BBbb = (Word) Dimensioni della Mappa in Blocchi, BB = Y, bb = X;
  • CCCC = (Word) Pointer Blocchi della Mappa;
  • DDDD = (Word) Pointer Testi della Mappa;
  • EEEE = (Word) Pointer Script della Mappa;
  • (Connection Data) = 0x0B bytes per connessione (Max.4 connessioni per mappa), dati sulla connessione della mappa ad altre mappe;
  • FFFF = (Word) Pointer Object Data della Mappa;

I pointer a tutti i Header delle mappe sono questi:
Questa era cosa già nota dai tempi di R\B Headers, grazie a quel tutorial è possibile gestire Blocchi, Connessioni e soprattutto Object Data.
Qui però vedremo la gestione e l'utilizzo degli Script interni in una mappa (e non solo).

PokéballSCRIPT DATA MAPPE

Il pointer agli script di una mappa, contenuto nello Header riferito a quella mappa, ci porta allo script principale interno che viene innescato all'infinito all'interno di quella mappa.
Ci sono diversi possibili scenari, che andremo ad analizzare di seguito.
Va posta la premessa che la maggior differenza nella gestione degli script avviene nella presenza o meno di allenatori (o di Pokémon leggendari) in una mappa.
  1. La Mappa non contiene alcuno script degno di nota;
  2. La mappa non contiene allenatori, contiene solo sotto-script;
  3. La mappa contiene allenatori, niente sotto-script aggiuntivi;
  4. La Mappa contiene sia allenatori che sotto-script aggiuntivi;
  5. La Mappa contiene una serie di script complessi che vanno attivati in sequenza l'uno dietro l'altro;

1 - La Mappa non contiene alcuno script degno di nota

Prendiamo l'esempio di una mappa molto semplice che non contiene script di mappa: il Market di Fuchsiapoli.
Codice:
FuchsiaMartScript: ; 1dd88 (7:5d88)
    jp EnableAutoTextBoxDrawing
L'unica funzione ad essere chiamata è EnableAutoTextBoxDrawing, questo avviene per tutte le mappe ove non sono richiesti script. Questa funzione serve a caricare gli elementi grafici che costituiscono la TextBox e a fare sì che quando il testo venga mostrato esso sia incorniciato dalla TextBox.

2 - La mappa non contiene allenatori, contiene solo sotto-script

Prendiamo l'esempio dell'Isola Cannella.
Qui notiamo che CallFunctionInTable da la possibilit√† di poter eseguire uno tra due sotto-script all'interno della mappa a seconda della valuta contenuta all'indirizzo di memoria [W_CINNABARISLANDCURSCRIPT]. Questo √® un CurScript, ossia una flag che specifica quale sotto-script speciale utilizzare all'interno di quella mappa. Questo √® indispensabile per poter avviare gli script (interni) pi√Ļ svariati separatamente in base a delle circostanze legate al completamento del gioco (in questi giochi non sfruttati al massimo potenziale possibile a mio parere). A seconda della valuta contenuta all'interno del Curscript verr√† avviato il sotto-script corrispondente.
Es: Se la valuta contenuta nel è 0x00 verrà eseguito il sotto-script 00, se è 0x01 il sotto-script 0x01 e così via.

Notiamo inoltre che questi due sotto-script selezionabili (eseguibili uno alla volta, e solo quello indicato è eseguibile) sono raccolti in una lista di pointer indicata dai registri hl all'indirizzo CinnabarIslandScriptPointers.

Lo scopo di CallFunctionInTable è quello di, forniti i sub-script alla lista di pointer dei sotto-script ai registri hl, poter avviare uno e solo uno dei seguenti sotto-script a seconda della valuta contenuta nel Curscript della mappa in questione -- ogni mappa che utilizza curscript ne ha uno.

Codice:
CinnabarIslandScript: ; 1ca19 (7:4a19)
    call EnableAutoTextBoxDrawing
    ld hl, $d126
    set 5, [hl] ; bit flag temporaneo
    ld hl, $d796
    res 0, [hl] ; serve a gestire le porte nella Villa Pok√©mon
    ld hl, $d7a3
    res 1, [hl] ; serve a gestire le porte nella Villa Pok√©mon
    ld hl, CinnabarIslandScriptPointers ; pointer ai sub-script
    ld a, [W_CINNABARISLANDCURSCRIPT] ; il curscript della mappa dell'Isola cannella
    jp CallFunctionInTable ; esegui la funzione per selezionare ed avviare il sub-script corretto

CinnabarIslandScriptPointers: ; 1ca34 (7:4a34)
    dw CinnabarIslandScript0
    dw CinnabarIslandScript1
Vediamo i due sub-script selezionabili:
Codice:
CinnabarIslandScript0: ; 1ca38 (7:4a38)
    ld b, $2b ; chiave segreta
    call IsItemInBag ; √® nello zaino?
    ret nz ; se s√¨ interrompi questo script
    ld a, [$d361] ; coordinata Y mappa
    cp $4 ; il giocatore si trova l√¨?
    ret nz ; se non √® cos√¨ ret
    ld a, [$d362] ; coordinata X mappa
    cp $12 ; il giocatore si trova l√¨?
    ret nz ; se non √® cos√¨ ret
; il giocatore è nelle coordinate indicate. continua con lo script
    ld a, $8 ; (verso nord)
    ld [$d528], a ; direzione in cui √® rivolto il giocatore, sovrascrivi
    ld a, $8 ; testo della mappa numero 8
    ld [$ff00+$8c], a ; mettilo in memoria cosicch√© la prossima funzione possa adoperarlo
    call DisplayTextID ; mostra un testo interno contenuto al pointer dei testi di quella mappa.
    xor a ; = ld a,00
    ld [H_CURRENTPRESSEDBUTTONS], a ; resetta la pressione dei pulsanti -- per evitare forzature o skip
    ld a, $1 ; numero di passi
    ld [$cd38], a ; mettili in memoria
    ld a, $80 ; passo verso sud/in basso
    ld [$ccd3], a ; mettilo in memoria
    call StartSimulatingJoypadStates ; simula il movimento del giocatore un passo verso il basso
    xor a ; = ld a,00
    ld [$c109], a ; resetta questa valuta in memoria (credo si riferisca alla direzione in cui √® affacciato l'NPC del giocatore, valuta utilizzata unicamente per i dati delle sprites NPC nella mappa e non per modificare la direzione del giocatore di per s√©)
    ld [wJoypadForbiddenButtonsMask], a ; sblocca il joypad (viene bloccato da StartSimulatingJoypadStates)
    ld a, $1 ; sub-script 1
    ld [W_CINNABARISLANDCURSCRIPT], a ; setta il curscript su 1 cosicch√© si possa avviare il subscript1 anzich√© il subscript 0
    ret ; fine

; serve ad introdurre un ritardo di un certo numero di frame e a resettare lo sub-script su 0. In questo caso serve per dare tempo al giocatore di potersi spostare senza che lo script venga accidentalmente richiamato in quei pochi frame in cui il giocatore si trova in quelle coordinate -- in pratica, questo script è un fix per evitare un loop infinito di quello script. :facepalm:
CinnabarIslandScript1: ; 1ca73 (7:4a73)
    ld a, [$cd38]
    and a
    ret nz
    call Delay3
    ld a, $0
    ld [W_CINNABARISLANDCURSCRIPT], a
    ret

3- La mappa contiene allenatori, niente sotto-script aggiuntivi;

Prendiamo un caso semplice: Il Percorso 4. Un solo allenatore, niente script.
Per gestire l'utilizzo degli allenatori si utilizza anche qui un CurScript. Tutte le mappe che hanno allenatori o Pokémon leggendari evento ne necessitano uno.
Codice:
Route4Script: ; 55658 (15:5658)
    call EnableAutoTextBoxDrawing
    ld hl, Route4TrainerHeaders
    ld de, Route4ScriptPointers
    ld a, [W_ROUTE4CURSCRIPT]
    call ExecuteCurMapScriptInTable
    ld [W_ROUTE4CURSCRIPT], a
    ret

Route4ScriptPointers: ; 5566b (15:566b)
    dw CheckFightingMapTrainers
    dw DisplayEnemyTrainerTextAndStartBattle
    dw EndTrainerBattle
Notiamo anzitutto, rispetto al caso di prima, una notevole differenza: il registro de indica una serie di pointers, Route4ScriptPointers; il registro hl invece indica Route4TrainerHeaders, ossia i pointer che contengono i dei dati che gestiscono l'allenatore al momento del contatto visivo.
Vediamoli subito:
Codice:
Route4TrainerHeaders: ; 5567d (15:567d)
Route4TrainerHeader0: ; 5567d (15:567d)
    db $2 ; flag's bit
    db ($3 << 4) ; trainer's view range
    dw $d7c5 ; flag's byte
    dw Route4BattleText1 ; 0x5699 TextBeforeBattle
    dw Route4AfterBattleText1 ; 0x56a3 TextAfterBattle
    dw Route4EndBattleText1 ; 0x569e TextEndBattle
    dw Route4EndBattleText1 ; 0x569e TextEndBattle

    db $ff
Così è come è strutturato uno Header interno per un allenatore: si indica il bit e la flag di utilizzo o meno dell'allenatore (ossia se è già stato sfidato, se sì non interagire), i testi che utilizza a seconda dell'ingaggio o post-sconfitta ed il range visivo.
Codice:
oute4Text2: ; 5568f (15:568f)
    db $08 ; asm
    ld hl, Route4TrainerHeader0
    call TalkToTrainer
    jp TextScriptEnd

Route4BattleText1: ; 55699 (15:5699)
    TX_FAR _Route4BattleText1
    db "@"

Route4EndBattleText1: ; 5569e (15:569e)
    TX_FAR _Route4EndBattleText1
    db "@"

Route4AfterBattleText1: ; 556a3 (15:56a3)
    TX_FAR _Route4AfterBattleText1
    db "@"
Questi invece sono i testi-script utilizzati dall'allenatore. Come abbiamo visto nel precedente tutorial qui il testo viene introdotto da un Comando Interno ASM (0x08). La funzione TalkToTrainer serve a gestire l'ingaggio con l'allenatore in caso ci si parli anziché esserci entrato in contatto visivo: quest'ultimo viene invece gestito proprio dai sotto-script selezionati tramite curscript.

4- La Mappa contiene sia allenatori che sotto-script aggiuntivi;

Un caso piuttosto comune e complesso, riguarda la maggior parte delle mappe con allenatori. In questo caso i casi 2 e 3 avvengono simultaneamente, con la notevole eccezione che i sub-script che non riguardano gli allenatori vengono qui chiamati manualmente all'interno dello Script principale della mappa (per intenderci quello indicato dal Pointer Script nello Header della Mappa). Prendiamo come esempio il primo piano della Villa Pokemon:
Codice:
Mansion1Script: ; 442af (11:42af)
    call Mansion1Subscript1
    call EnableAutoTextBoxDrawing
    ld hl, Mansion1TrainerHeaders
    ld de, Mansion1ScriptPointers
    ld a, [W_MANSION1CURSCRIPT]
    call ExecuteCurMapScriptInTable
    ld [W_MANSION1CURSCRIPT], a
    ret

; gestisce le porte che si aprono o chiudono tramite i "pulsanti segreti", che di per sé non sono eventi testo ma semmai eventi nascosti ([url=http://www.pokemonhacking.it/showthread.php?tid=5017]vedasi Scavenger Hunt[/url] per ulteriori informazioni).
Mansion1Subscript1: ; 442c5 (11:42c5)
    ld hl, $d126
    bit 5, [hl]
    res 5, [hl]
    ret z
    ld a, [$d796]
    bit 0, a
    jr nz, .asm_442ec ; 0x442d2 $18
    ld bc, $060c
    call Func_4430b
    ld bc, $0308
    call Func_44304
    ld bc, $080a
    call Func_44304
    ld bc, $0d0d
    jp Func_44304
.asm_442ec
    ld bc, $060c
    call Func_44304
    ld bc, $0308
    call Func_4430b
    ld bc, $080a
    call Func_4430b
    ld bc, $0d0d
    jp Func_4430b

Func_44304: ; 44304 (11:4304)
    ld a, $2d
    ld [$d09f], a
    jr asm_44310

Func_4430b: ; 4430b (11:430b)
    ld a, $e
    ld [$d09f], a
asm_44310: ; 44310 (11:4310)
    ld a, $17
    call Predef ; indirect jump to ReplaceTileBlock (ee9e (3:6e9e))
    ret

Func_44316: ; 44316 (11:4316)
    ld a, [$c109]
    cp $4
    ret nz
    xor a
    ld [H_CURRENTPRESSEDBUTTONS], a
    ld a, $4
    ld [H_SPRITEHEIGHT], a
    jp DisplayTextID

Mansion1ScriptPointers: ; 44326 (11:4326)
    dw CheckFightingMapTrainers
    dw DisplayEnemyTrainerTextAndStartBattle
    dw EndTrainerBattle

; questi sono i pointer dei testi-script della mappa in questione.
Mansion1TextPointers: ; 4432c (11:432c)
    dw Mansion1Text1
    dw Predef5CText
    dw Predef5CText
    dw Mansion1Text4

Mansion1TrainerHeaders: ; 44334 (11:4334)
Mansion1TrainerHeader0: ; 44334 (11:4334)
    db $1 ; flag's bit
    db ($3 << 4) ; trainer's view range
    dw $d798 ; flag's byte
    dw Mansion1BattleText2 ; 0x434b TextBeforeBattle
    dw Mansion1AfterBattleText2 ; 0x4355 TextAfterBattle
    dw Mansion1EndBattleText2 ; 0x4350 TextEndBattle
    dw Mansion1EndBattleText2 ; 0x4350 TextEndBattle

    db $ff

Mansion1Text1: ; 44341 (11:4341)
    db $08 ; asm
    ld hl, Mansion1TrainerHeader0
    call TalkToTrainer
    jp TextScriptEnd

Mansion1BattleText2: ; 4434b (11:434b)
    TX_FAR _Mansion1BattleText2
    db "@"

Mansion1EndBattleText2: ; 44350 (11:4350)
    TX_FAR _Mansion1EndBattleText2
    db "@"

Mansion1AfterBattleText2: ; 44355 (11:4355)
    TX_FAR _Mansion1AfterBattleText2
    db "@"
Come già detto eventuali sotto-script non possono presentarsi in questo caso assieme ai pointer dei sotto-script. Si potrebbe, come ho fatto nella mia hack nel caso della Fish Factory, ma è estremamente difficoltoso gestire il tutto, ed in ogni caso durante tali script il giocatore non dovrebbe avere la facoltà di potersi muovere potenzialmente interagendo con gli allenatori.
Un'osservazione sullo Scripting in Gen1 rispetto a quello di Gen2 (Clicca per visualizzare)

5-La Mappa contiene una serie di script complessi che vanno attivati in sequenza l'uno dietro l'altro.

Questo caso riguarda quelle mappe tipo Biancavilla o Smeraldopoli dove avvengono catene di script complessi che richiedono l'attivazione in "fasi". Questo avviene in particolar modo in caso di script automatizzati che innescano movimenti di NPC e simili. In questo caso l'unico limite, oltre all'assenza di allenatori, è il tempo, lo spazio sulla ROM e la fantasia Idea
Dato che ci tengo a spaventarvi vi mostro l'esempio di Biancavilla, forse lo script "a fasi" pi√Ļ complesso del gioco:
Codice:
PalletTownScript: ; 18e5b (6:4e5b)
    ld a,[$D74B]
    bit 4,a
    jr z,.next ; se questa flag √® stata settata salta questo passaggio che setta questo bit di questa flag seguente
    ld hl,$D747
    set 6,[hl]
.next
    call EnableAutoTextBoxDrawing
    ld hl,PalletTownScriptPointers
    ld a,[W_PALLETTOWNCURSCRIPT]
    jp CallFunctionInTable

PalletTownScriptPointers: ; 18e73 (6:4e73)
    dw PalletTownScript0
    dw PalletTownScript1
    dw PalletTownScript2
    dw PalletTownScript3
    dw PalletTownScript4
    dw PalletTownScript5
    dw PalletTownScript6

PalletTownScript0: ; 18e81 (6:4e81)
    ld a,[$D747]
    bit 0,a
    ret nz
    ld a,[W_YCOORD]
    cp 1 ; is player near north exit?
    ret nz
    xor a
    ld [H_CURRENTPRESSEDBUTTONS],a
    ld a,4
    ld [$D528],a
    ld a,$FF
    call PlaySound ; stop music
    ld a, BANK(Music_MeetProfOak)
    ld c,a ; song bank
    ld a, (Music_MeetProfOak - $4000) / 3 ; ‚Äúoak appears‚ÄĚ music
    call PlayMusic ; plays music
    ld a,$FC
    ld [wJoypadForbiddenButtonsMask],a
    ld hl,$D74B
    set 7,[hl]

    ; trigger the next script
    ld a,1
    ld [W_PALLETTOWNCURSCRIPT],a
    ret

PalletTownScript1: ; 18eb2 (6:4eb2)
    xor a
    ld [$CF0D],a
    ld a,1
    ld [$FF8C],a
    call DisplayTextID
    ld a,$FF
    ld [wJoypadForbiddenButtonsMask],a
    ld a,0
    ld [$CC4D],a
    ld a,$15
    call Predef

    ; trigger the next script
    ld a,2
    ld [W_PALLETTOWNCURSCRIPT],a
    ret

PalletTownScript2: ; 18ed2 (6:4ed2)
    ld a,1
    ld [$FF8C],a
    ld a,4
    ld [$FF8D],a
    call SetSpriteFacingDirectionAndDelay
    call Delay3
    ld a,1
    ld [W_YCOORD],a
    ld a,1
    ld [$FF9B],a
    ld a,1
    swap a
    ld [$FF95],a
    ld a,$22
    call Predef
    ld hl,$FF95
    dec [hl]
    ld a,$20
    call Predef ; load Oak‚Äôs movement into $CC97
    ld de,$CC97
    ld a,1 ; oak
    ld [$FF8C],a
    call MoveSprite
    ld a,$FF
    ld [wJoypadForbiddenButtonsMask],a

    ; trigger the next script
    ld a,3
    ld [W_PALLETTOWNCURSCRIPT],a
    ret

PalletTownScript3: ; 18f12 (6:4f12)
    ld a,[$D730]
    bit 0,a
    ret nz
    xor a
    ld [$C109],a
    ld a,1
    ld [$CF0D],a
    ld a,$FC
    ld [wJoypadForbiddenButtonsMask],a
    ld a,1
    ld [$FF8C],a
    call DisplayTextID
    ld a,$FF
    ld [wJoypadForbiddenButtonsMask],a
    ld a,1
    ld [$CF13],a
    xor a
    ld [$CF10],a
    ld a,1
    ld [$CC57],a
    ld a,[H_LOADEDROMBANK]
    ld [$CC58],a

    ; trigger the next script
    ld a,4
    ld [W_PALLETTOWNCURSCRIPT],a
    ret

PalletTownScript4: ; 18f4b (6:4f4b)
    ld a,[$CC57]
    and a
    ret nz

    ; trigger the next script
    ld a,5
    ld [W_PALLETTOWNCURSCRIPT],a
    ret

PalletTownScript5: ; 18f56 (6:4f56)
    ld a,[$D74A]
    bit 2,a
    jr nz,.next
    and 3
    cp 3
    jr nz,.next
    ld hl,$D74A
    set 2,[hl]
    ld a,$27
    ld [$CC4D],a
    ld a,$11
    call Predef
    ld a,$28
    ld [$CC4D],a
    ld a,$15
    jp Predef
.next
    ld a,[$D74B]
    bit 4,a
    ret z
    ld hl,$D74B
    set 6,[hl]
PalletTownScript6: ; 18f87 (6:4f87)
    ret

PalletTownTextPointers: ; 18f88 (6:4f88)
    dw PalletTownText1
    dw PalletTownText2
    dw PalletTownText3
    dw PalletTownText4
    dw PalletTownText5
    dw PalletTownText6
    dw PalletTownText7

PalletTownText1: ; 18f96 (6:4f96)
    db 8
    ld a,[$CF0D]
    and a
    jr nz,.next
    ld a,1
    ld [$CC3C],a
    ld hl,OakAppearsText
    jr .done
.next
    ld hl,OakWalksUpText
.done
    call PrintText
    jp TextScriptEnd

OakAppearsText: ; 18fb0 (6:4fb0)
    TX_FAR _OakAppearsText
    db 8
    ld c,10
    call DelayFrames
    xor a
    ld [$CD4F],a
    ld [$CD50],a
    ld a,$4C
    call Predef ; display ! over head
    ld a,4
    ld [$D528],a
    jp TextScriptEnd

OakWalksUpText: ; 18fce (6:4fce)
    TX_FAR _OakWalksUpText
    db "@"
Questo caso funziona esattamente come il caso 2, con la notevole eccezione che il CurScript viene sovrascritto pi√Ļ e pi√Ļ volte.
Un interessantissimo exploit che viene usato ben poco nel gioco (a mia memoria unicamente nel caso della MN Anna e in poche altre circostanze, ad esempio alla Lega Pokémon) è quello di settare un curscript manualmente in uno distinto script ASM in una mappa differente; o addirittura tramite testo-script in una mappa completamente differente. O addirittura tramite ASM invocata dall'utilizzo di un oggetto con funzione speciale
in modo tale da avviare particolari CurScript solo in base a cert progressi di gioco, o solo dopo aver completato certi eventi piuttosto che altri. In parole povere, tramite ASM un Curscript gestito da Flag può essere modificato ad libitum laddove venga impiegato l'ASM (cioè ovunque Wink ).


In questo tutorial abbiamo visto come il Gioco gestisce gli script di una mappa e tutti i seguenti sotto-script; starà poi al programmatore imparare l'ASM tramite i tutorial che ho scritto e a mettere il tutto in pratica.
Buona programmazione, e soprattutto, buon Scripting Gen.1! dance

Credits:
  • @80C: L'intero tutorial.
  • Pok√©Red Disassembly Project: Estratti per gli esempi forniti.

[Immagine: 5boqHh7.png]
1¬įPosto Best Beta 2015 - PokemonHacking.it (Clicca per visualizzare)
(Questo messaggio è stato modificato l'ultima volta il: 24-11-2020 01:13 AM da Bra.)
09-05-2020 09:05 PM
Sito Web Cerca Cita
 Mi piace ricevuti da: Flygon , IsMirrionis , Toni88 , Boh , Bonnox
Toni88
Hacker / Ricercatore
*
Online

Messaggi: 10
Registrato: 17-08-2015
Reputazione: 0
Mi Piace Ricevuti: 13
PH Points: 73.00
Messaggio: #2
RE: R\B Headers Advance - Script Mappa
Sono in ritardo di ben due anni ma dopo essere rientrato su questo sito per la prima volta in una vita non posso trattenermi dal ringraziarti per l'immensa mole di guide che hai scritto per l'hacking GB, tutti i tuoi vecchi post sono stati la mia base ed ispirazione assieme a skeetendo in quel lontano 2015 in cui mi innamorai di questo sconosciuto ma vasto mondo di hacking, e vederne così tante di nuove mi rincuora.
Ricordo benissimo le testate che diedi al muro cercando di districarmi tra gli script delle mappe pi√Ļ complesse, perch√® allora non c'era nessuna guida come questa quindi non potevo fare altro che setacciare il disassembly e scrivere tanto codice e documentazione per mano mia, e per qualche motivo non riuscii mai a far funzionare la routine per muovere gli sprite degli overworld. Mi stai davvero tentando a ricominciare.

Scusa mi sono fatto prendere la mano dai ricordi, grazie mille per il tuo lavoro!
02-05-2022 11:38 AM
Cerca Cita
 Mi piace ricevuti da: Boh , IvanFGK , Bonnox , Bra
Bra
['e…™t…™ s…™:]
******
Offline

Messaggi: 1,942
Registrato: 12-06-2014
Reputazione: 32
Mi Piace Ricevuti: 1472
PH Points: 2,900.76
Messaggio: #3
RE: R\B Headers Advance - Script Mappa
(02-05-2022 11:38 AM)Toni88 Ha scritto:  
Ricordo benissimo le testate che diedi al muro cercando di districarmi tra gli script delle mappe pi√Ļ complesse, perch√® allora non c'era nessuna guida come questa quindi non potevo fare altro che setacciare il disassembly e scrivere tanto codice e documentazione per mano mia, e per qualche motivo non riuscii mai a far funzionare la routine per muovere gli sprite degli overworld. Mi stai davvero tentando a ricominciare.

Scusa mi sono fatto prendere la mano dai ricordi, grazie mille per il tuo lavoro!

Ringrazio di cuore per i complimenti Blush , quando avrò tempo (se riesco a trovare qualcosa tra le mie migliaia di appunti), prioverò a scrivere un tutorial per innestare i movimenti automatici di NPC e personaggi.
Non è un'operazione semplice poiché le routines in questione sono state scritte unicamente per pochi eventi che avvengono massimo una volta in tutto il gioco -- penso al giocatore che segue Oak o il tizio fuori dal museo, Gary che viene mosso, o il giocatore che cammina verso Lance. Sono davvero poche le istanze in cui queste routines vengono utilizzate in maniera originale, ed è un peccato.
Un'idea sarebbe, come ho fatto in Grape, ri-scrivere parte di quelle routine e collocarle nel bank in uso in cui le mappe si adoperano di tali eventi, riadattando le routine in modo che possano gestire diversi tipi di eventi di movimento NPC e del player (ho fatto cos√¨ in Grape: risparmia spazio ed √® pi√Ļ efficiente).

[Immagine: 5boqHh7.png]
1¬įPosto Best Beta 2015 - PokemonHacking.it (Clicca per visualizzare)
03-05-2022 10:10 AM
Sito Web Cerca Cita
 Mi piace ricevuti da: Toni88
Rispondi 




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