[SNES] Dottie dreads nought - Ajuda em ponteiros e gráficos

Iniciado por TheBossBR, Setembro 21, 2021, 16:39:50 PM

tópico anterior - próximo tópico

0 Membros e 1 Visitante estão vendo este tópico.

TheBossBR

Boa tarde Kuroi beleza.

Só tenho agradecer você por passar o conhecimento. agora vou estudar e voltar aqui com algum resultado.
confesso que talvez demore um pouco por motivos pessoal. Mais vou voltar sim!!

agora é estudar tudo que você me passou!

Muito obrigado.  :angel:

kuroi

Citação de: TheBossBR online Setembro 27, 2021, 13:53:38 PM
Boa tarde Kuroi beleza.

Só tenho agradecer você por passar o conhecimento. agora vou estudar e voltar aqui com algum resultado.
confesso que talvez demore um pouco por motivos pessoal. Mais vou voltar sim!!

agora é estudar tudo que você me passou!

Muito obrigado.  :angel:

Opa! Sem problemas! Qualquer coisa, dá um grito aí...

E só pra "Concluir", eu terminei de escrever o Algoritmo do Inserter também, viu! Vou mandar aqui:

Algoritmo do Inserter:

1- Declaração da tabela de 256 posições (0xFF);
2- Concatenar os endereços de scripts originais e traduzidos com os seus nomes;
3- Exibir os caminhos das duas pastas;
4- Abrir arquivo de texto traduzido para leitura;
5- Abrir arquivo binário da ROM já com a fonte editada;
6- Deslocar o "cursor" de leitura do arquivo para o endereço do Offset inicial que começará a inserção;
7- Iniciar laço de repetição que percorrerá todo o arquivo de texto pegando linha por linha;
8- Verificar se foi encontrado o separador de fim de diálogo no arquivo de texto traduzido;
8.1- Se o separador for encontrado, ignorá-lo;
9- Iniciar um novo laço de repetição que percorrerá toda a linha armazenada na string do primeiro laço permitindo a validação de caractere por caractere da linha;
10- Verificar se o caractere atual lido da linha é um "abre chaves"
10.1- Se o caractere "abre chaves" for encontrado, verificar se o terceiro caractere a partir dele é um "fecha chaves";
10.1.1- Se o terceiro caractere for um "fecha chaves", capturar o conteúdo que houver entre as chaves e gravar em uma variável em Hexadecimal;
10.1.2- Gravar o Byte capturado no arquivo binário de saída (a ROM com fonte editada);
10.1.3- Verificar se o Byte que foi gravado no binário de saída possui o valor 0x00;
10.1.3.1- Se o Byte for igual a 0x00, capturar o próximo Offset do binário de saída e gravá-lo em uma variável que indique a nova posição inicial do texto (ponteiro_mod);
10.1.4- Somar mais 3 ao iterador de caracteres da linha;
10.2- Verificar se o caractere encontrado na linha for igual a "abre chaves" e o nono caractere a partider dele é igual a "fecha chaves" (isso indica que a string trata-se do endereço de um ponteiro, ex: {00092307});
10.2.1- Se a string capturada for um endereço de ponteiro original, capturar todos o seu conteúdo e inserir em uma variável chamada "ponteiro_orig";
10.2.2- Chamar a função auxiliar de cálculo de ponteiros;
10.2.3- somar mais 9 ao iterador de caracteres da linha;
10.3- Verificar se o caractere capturado na linha não possuir "abre aspas";
10.3.1- Se não houver "abre aspas", trata-se de um caractere comum de texto. Capturá-lo em uma variável auxiliar;
10.3.2- Zerar a variável contadora de caracteres;
10.3.3- Realizar um laço de repetição que verifica se o valor da tabela, na posição do contador, coincide com o caractere capturado na linha anterior. Se o valor atender aos requisitos, somar mais um ao contador;
10.3.3.1- Inserir o caractere no arquivo binário de saída;
11- Guardar a posição do último Offset depois da inserção de todos;
12- Fechar o arquivo de texto traduzido;
13- Fechar o arquivo binário de saída;
14- Exibir o texto explicando que a Inserção funcionou;


Código interpretado em linguagem C comentado com os passos do algoritmo da função Inserter:

void Inserter(){
FILE *arq, *out;
unsigned char s[100];
int cont = 0;
unsigned int c;
unsigned int Offset_ini = 0x64BBE;
unsigned int Offset_fim;
unsigned int ponteiro_mod;
unsigned int ponteiro_orig;
int i;
unsigned char caminho_orig[50] = "scripts_originais\\";
unsigned char caminho_trad[50] = "scripts_traduzidos\\";
unsigned char nome_trad[10] = "Dump.txt";
char nome[60] = "Dottie dreads nought_insert.sfc";
//Declaração da tabela de 256 posições (0xFF)
unsigned char tabela[256] = "@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@"
" !óé&@@'@@@@,-.ç"
"0123456789:;@@@?"
"@ABCDEFGHIJKLMNO"
"PQRSTUVWXYZÍúÓ@@"
"@abcdefghijklmno"
"pqrstuvwxyz~@@@@"
"@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@á"
"@@@@ã@@@@@@@@@@@"
"@@@@@@ê@@@@@í@@@";
   
    //Concatenar os endereços de scripts originais e traduzidos com os seus nomes
    strcat(caminho_orig, "Dump_orig.txt"); 
    strcat(caminho_trad, nome_trad);
   
    //Exibir os caminhos das duas pastas
    printf("Caminho original: %s\n\n", caminho_orig);
    printf("Caminho traduzido: %s\n\n", caminho_trad);

//Abrir arquivo de texto traduzido para leitura
    if ((arq = fopen (caminho_trad,"r")) == NULL){
        printf ("Erro na abertura do arquivo modificado!\n\n");
        exit (0);       
    }

//Abrir arquivo binário da ROM já com a fonte editada
if ((out = fopen (nome,"r+b")) == NULL){
        printf ("Erro na criação do arquivo!\n");
        exit (0);       
    }

//Deslocar o "cursor" de leitura do arquivo para o endereço do Offset inicial que começará a inserção
    fseek (out, SEEK_SET + Offset_ini, SEEK_SET);

printf("\nInserindo...");

//Iniciar laço de repetição que percorrerá todo o arquivo de texto pegando linha por linha
while (fgets(s, 100, arq) != NULL){
//Verificar se foi encontrado o separador de fim de diálogo no arquivo de texto traduzido
if(!strcmp(s, "------------------\n") || !strcmp(s, "------------------")){
//Se o separador for encontrado, ignorá-lo
continue;
}

//Iniciar um novo laço de repetição que percorrerá toda a linha armazenada na string do primeiro laço permitindo a validação de caractere por caractere da linha
for(i=0;i<(int)strlen(s)-1;i++){
//Verificar se o caractere atual lido da linha é um "abre chaves"
if(s[i] == '{'){
// Se o caractere "abre chaves" for encontrado, verificar se o terceiro caractere a partir dele é um "fecha chaves"
if(s[i+3] == '}'){
//Se o terceiro caractere for um "fecha chaves", capturar o conteúdo que houver entre as chaves e gravar em uma variável em Hexadecimal
sscanf(&s[i+1], "%xx", &c);
//Gravar o Byte capturado no arquivo binário de saída (a ROM com fonte editada)
fwrite(&c, sizeof(unsigned char), 1, out);

//Verificar se o Byte que foi gravado no binário de saída possui o valor 0x00
if(c == 0x00){
//Se o Byte for igual a 0x00, capturar o próximo Offset do binário de saída e gravá-lo em uma variável que indique a nova posição inicial do texto (ponteiro_mod)
ponteiro_mod = ftell(out);
}
//Somar mais 3 ao iterador de caracteres da linha
i= i+3;
}
//Verificar se o caractere encontrado na linha for igual a "abre chaves" e o nono caractere a partider dele é igual a "fecha chaves" (isso indica que a string trata-se do endereço de um ponteiro, ex: {00092307})
if(s[i] == '{' && s[i+9] == '}'){
//Se a string capturada for um endereço de ponteiro original, capturar todos o seu conteúdo e inserir em uma variável chamada "ponteiro_orig"
sscanf(&s[i+1], "%x", &ponteiro_orig);
//Chamar a função auxiliar de cálculo de ponteiros
calcula_ponteiro(nome, ponteiro_orig, ponteiro_mod);
//somar mais 9 ao iterador de caracteres da linha
i=i+9;
}
}
else{
//Verificar se o caractere capturado na linha não possuir "abre aspas"
c = s[i];
// Se não houver "abre aspas", trata-se de um caractere comum de texto. Capturá-lo em uma variável auxiliar
cont = 0;
//Realizar um laço de repetição que verifica se o valor da tabela, na posição do contador, coincide com o caractere capturado na linha anterior. Se o valor atender aos requisitos, somar mais um ao contador
            while (tabela[cont] != c) cont++;
            //Inserir o caractere no arquivo binário de saída
            fputc (cont, out);
}
}
}

// Guardar a posição do último Offset depois da inserção de todos
Offset_fim = ftell (out);
Offset_fim = Offset_fim - 1;

printf("\nOffset final: %.8x", Offset_fim);

////Fechar o arquivo de texto traduzido
fclose(arq);
//Fechar o arquivo binário de saída
fclose(out);

//Exibir o texto explicando que a Inserção funcionou
printf("\nA inserção foi realizada com êxito!\nPressione qualquer tecla para encerrar.\n");
getch();
}



君の夢が叶うのは誰かの影じゃないぜ。
風の強い日を選んで走ってきた。