[snes] Brain Lord

Aperto da Romhacking.it, Febbraio 14, 2006, 23:47:00

Discussione precedente - Discussione successiva

Chester

Incredibile quante forze si siano concentrate spontaneamente su questo gioco. Se si riuscisse a lavorare così in gruppo per ogni progetto...
Close the world, txEn eht nepO

Clomax

allora, ho dovuto scrivere AL VOLO una procedura per spostare tutto il blocco di testo di un byte in modo da ripuntarlo col repointer e sperare che tutto funzioni degnamente.


"""
brainlord_dumper
last version: 2008-09-18 (0.1)
changes:
author: roberto fontanarosa (robertofontanarosa@hotmail.com)
"""

import mmap
import os
import pdb

TEXT_BLOCK_START = 0x170000
TEXT_BLOCK_END = 0x17fac9
TEXT_BLOCK_LIMIT = 0x17ffff

def extract(f, start, end):
"""  """
dump = ""
for i in range(start, end):
 f.seek(i)
 dump += f.read(1)
return dump

def replace(f, dump, start, end):
"""  """
i = 0
f.seek(start)
for byte in dump:
 f.write(byte)
 start += 1
return f.tell() == end

file = open("Brain Lord (U) [!].smc", "rb+")
size = os.path.getsize("Brain Lord (U) [!].smc")
f = mmap.mmap(file.fileno(), size)
file.close()

file2 = open("Brain Lord (U) [!] - 2.smc", "ab+")
size = os.path.getsize("Brain Lord (U) [!] - 2.smc")
f2 = mmap.mmap(file2.fileno(), size)
file2.close()

dump = extract(f, TEXT_BLOCK_START, TEXT_BLOCK_END)
print replace(f2, dump, TEXT_BLOCK_START+1, TEXT_BLOCK_END+1)

f2.close()
f.close()


ho ripuntato il testo, la rom non si blocca ma... FA COSE STRANE!!! contatterò coloro che stanno partecipando al progetto per raccontagli le ultime news e... no, niente assembler!  :biribiribu:

Clomax

oddio morpher, nn avevo letto... mi sto masturbando!

...IN UFFICIO!

Morpher

Aspetta un po'e vedrai che altro ti rifiliamo io e chester B)  

Clomax

già lo so. mi rifilate il repointer in assembler...
e io qui a sbattere il muso. è da stamattina che SMADONNO. ora il ripuntatore RIPUNTA. c'è ancora qualche difetto ma ci siamo quasi.
se mai vi cimenterete nel repointer assembler avvisatemi così mi evito un pò di mal di testa e passo ALL'ALTRO PROGETTO (meno ostico).

Sephiroth 1311

Citazioneoddio morpher, nn avevo letto... mi sto masturbando!

...IN UFFICIO!
Questa te la dovresti mettere come sottonick su MSN. :P

:clomax mode:  
Sephiroth 1311
****************
membro di SadNES cITy
I gruppo italiano di traduzione ROM
http://www.sadnescity.it
*****************************
Fidati di chi ama leggere, fidati di chi porta sempre con sé un libro di poesie. Guarda con sospetto chi ti dice che non ha tempo, che la letteratura è una bella  cosa, che quando si è giovani  si può leggere, ma poi? Mente, non gliene importa nulla. Mente sapendo di mentire.
Roberto Cotroneo

Clomax


2008-09-19 (0.34)
  improved the repointer algorithm
  now the function get_pointers accept the text after double f7 bytes as an address to repointer
  found another pointer text block and
  added some statistics and screen error messages


ok, funziona! vi ricordate i doppi f7? andavano contati. ora molti problemi sono sistemati... c'è il venditore di fatine che spara cazzate e testi a casaccio ma credo che per i venditori ci sia da fare qualche piccola valutazione in più.

cmq il lavoro prosegue e ora che non mi ritrovo mille repliche degli stessi omini che mi raccontano la fine del gioco oppure che non parlano per nulla nel primo villaggio... beh, mi sento più rilassato. :P

dagli di costanti (rom senza header!):


TEXT_BLOCK_START = 0x170000
TEXT_BLOCK_END = 0x17fac9
TEXT_BLOCK_LIMIT = 0x17ffff

TEXT_POINTER1_BLOCK_START = 0xf9e
TEXT_POINTER1_BLOCK_END = 0xfef

TEXT_POINTER2_BLOCK_START = 0x50010
TEXT_POINTER2_BLOCK_END = 0x55567

TEXT_POINTER3_BLOCK_START = 0x18ea1
TEXT_POINTER3_BLOCK_END = 0x18f9b

Chester

Un repointer in assembly? E' un'idea XD
Close the world, txEn eht nepO

Phoenix

CitazioneUn repointer in assembly? E' un'idea XD
Sinceramente non vedo quale sia il vantaggio :P
Phoenix
****************
membro di SadNES cITy
I gruppo italiano di traduzione ROM
http://www.sadnescity.it
*****************************

Clomax

bravo, dagliene di santa ragione, fenicio!

Clomax

ok, sembra che dall'indirizzo 0x170000 all'indirizzo 0x171b40 ci siano solo dialoghi di negozi del venditore di fatine, di albergatori ecc...
insomma il ripuntatore fa il suo dovere ma non gestisce questi casi. praticamente il testo parte bene ma non appena fai una seleziona si incasina. evidentemente hanno una logica da capire. gli dedicherò la prossima mezz'ora. stay tuned.

Morpher

Citazioneok, funziona! vi ricordate i doppi f7?

E menomale che ti avevo detto che potevano essere i tag di fine lettura del testo jap. :P

Citazioneinsomma il ripuntatore fa il suo dovere ma non gestisce questi casi. praticamente il testo parte bene ma non appena fai una seleziona si incasina. evidentemente hanno una logica da capire.

Per ora ti lasciamo lavorare.... Nel caso in cui non dovessi riuscirci faccelo sapere.

EDIT: Comunque non credere che tutti i byte che trovi tra le frasi dei negozianti siano puntatori... quella roba li genera anche degli eventi che dipendono dalle scelte del giocatore.

Chester

CitazioneSinceramente non vedo quale sia il vantaggio :P
Infatti non c'è alcun vantaggio, ma è una cosa tra me e Clomax XD
Close the world, txEn eht nepO

Morpher

La solita mania di clomax di voler capire tutto :P (scherzo clò, continua così). Comunque ti do un aiutino semplice. Le finestre generate dai negozianti sono particolari per la possibilità di generare eventi ma queste particolarità le trovi anche tra le frasi dei personaggi. Per questo motivo devi tener conto di 3 byte:

$C2/CA10 C9 F3       CMP #$F3
$C2/CA12 D0 04       BNE $04    [$CA18]
$C2/CA18 C9 FA       CMP #$FA
$C2/CA1A D0 04       BNE $04    [$CA20]
$C2/CA20 C9 F6       CMP #$F6
$C2/CA22 D0 04       BNE $04    [$CA28]


F3, FA ed F6 sono i "tag" a cui devi prestare attenzione. Il gioco fa semplicemente così:

Citazione
1: Carica il byte;
2: Confronta il byte letto con F3, FA ed F6;
    3: Se coincide con uno di questi salta alle relative routine;
    4: Se non coincide continua a leggere normalmente i byte.

Ora, questi byte si trovano sempre dopo il byte F9 (che quindi non indica solamente la nuova linea) e il tuo repointer dovrebbe continuare a leggere finchè non incontra il byte F7 (tag fine). Tuttavia, nel leggere deve controllare che non sia presente il byte 00 che indica semplicemente che segue un puntatore. Se non sono stato chiaro fatti beccare su MSN che te lo spiego con qualche esempio....


Clomax

si, questo lo avevo capito perchè ogni negozio o agente (venditore di fatine) che sia, dopo aver pronunciato la classica frase di benvenuto rimanda ad un f6xx:

f60d=[shop1]
f61f=[arcs shop]
f620=[shop2]
f615=[weapon1]
f629=[agent1]

quello che manca, ora, è... dove bisogna andare a ripuntare? in pratica se vai da un negoziante, ci parli e questo ti apre il menù di vendita ad ogni scelta di un articolo dovrebbe apparire sotto la sua descrizione. questo testo si trova all'interno del banco di testo ma da chi è puntato? gestisce tutto la routine?

cmq nei dialoghi normali, e questa è una cosa che ho già provato, il ripuntatore funziona. l'ho provato sia nelle locande sia su alcuni dialoghi che necessitano di un yes/no per andare avanti.

quindi direi che è proprio la gestione degli shop ad essere diversa...