Se necesita la ayuda de un programador (Solucionado)

Hola, se que este no es el sitio, estoy traduciendo el megaman x6, ya hice el megaman 8 y x5 y ya esta publicada mi traduccion del final fantasy tactics PSP.
Bien mi problema es en el x6 necesito recalcular los punteros manualmente ya que los recalculadores que ahora mismo hay no permiten la resta y suma de valores determinados ya sea 1, A0, 8 o -68.
Ahora lo que yo queria es una aplicacion sencilla (no lo se si seria sencilla pero es lo que necesito) el esquema de una suma o resta en hexadecimal seria mas o menos asi.

valor1 +/- valor2= resultado1 limpiar una vez sumado o restado para otra operacion y dar los resultados de esta forma
resultado1-resultado2-resultado3-resultado4... etc y asi continuamente en un archivo de texto para copiar y pegar.

No se si estoy pidiendo una burrada pero hacer las operaciones una a una es harto complicada, ya lo hice en el x5 pues mas o menos eran pocas pero en el x6 casi hay punteros en cada parrafo de texto y son demasiados para corregir los errores que da cuando te distraes un poco.
Gracias y espero que puedan ayudarme, ya que un recalculador de punteros creo que seria mucho mas dificil de programar.
hola blade, he visto tu trabajo por aqui en los foros, te comento, yo no soy coder pero una fuente muy buena para encontrar herramientas de hackeo es http://www.romhacking.net , la pega es para los que no saben ingles; he buscado y he encontrado una seccion de punteros AQUI

si no estas empapado con el idioma puedes usar algo como babelfish o te puedo ayudar a traducir algo en concreto sobre para que sirve tal cual cosa. Espero te sea de ayuda el material.

Saludos. [sonrisa]
La verdad es que no me he enterado de qué operaciones hay que hacer, si me lo explicas para "tontos" te puedo echar una mano que no creo que sea nada complicado hacerlo en C.

PD: a cualquiera que le digas que tengo una ingeniería y voy a por la segunda... [+risas]
frogcoin escribió:hola blade, he visto tu trabajo por aqui en los foros, te comento, yo no soy coder pero una fuente muy buena para encontrar herramientas de hackeo es http://www.romhacking.net , la pega es para los que no saben ingles; he buscado y he encontrado una seccion de punteros AQUI

si no estas empapado con el idioma puedes usar algo como babelfish o te puedo ayudar a traducir algo en concreto sobre para que sirve tal cual cosa. Espero te sea de ayuda el material.

Saludos. [sonrisa]


Pues un recalculador de punteros normal no sirve ya que generalmente esta hecha para juegos especificos que pueden ser aprovechados para otros juegos, pero estos de capcom no se que les da por complicarlo todo ya que usan espacio innecesario. y en los punteros el doble y esos recalculadores no hacen lo que deberian dando valores incorrectos. :-|

La verdad es que no me he enterado de qué operaciones hay que hacer, si me lo explicas para "tontos" te puedo echar una mano que no creo que sea nada complicado hacerlo en C.

PD: a cualquiera que le digas que tengo una ingeniería y voy a por la segunda... [+risas]


Pues gracias por tu interes pero basicamente es una calculadora.
Mira estos son los valores a calcular y siempre es de esa forma.
7470-E070-3C71-7C71... ETC

7408-E008-3C09-7C09... ETC esto es ya con la resta hecha que es -68 que puede ser suma en otro bloque de texto.

Ahora lo que necesitaria es

[Casilla 1er. valor] [casilla resta o suma] [casilla del valor a restar o sumar]
Ejm
.......[7470].......................[-]....................................[68]





[resultado1] [resultado2][resultado3]
[ 7408 ]............[ E008 ]...........[3C09] Que al final despues de meter los 500 o mas valores pueda copiarlos para hacer unas modificaciones simples y mas llevaderas.

Pues mas o menos esa era mi idea no se si me explico bien e ignora los puntos que no tenia forma de ilustrarlo bien. XD
Y si se puede la casilla del signo y la cantidad a sumar o restar solo se necesite modificar la primera vez.
Se que es un marron, pero en el x5 como solo eran unos 100 punteros por bloque de texto y eran tan solo 3 bloques pues no era muy complicado.
Pero en el x6 son como 500 o algo mas y muchas veces me salto un valor sin querer entre meter los datos en la calculadora y escribirlo, que me marea mucho y ya cuando tienes unos 50 punteros calculados y te falta un puntero o te sobra ya no se donde falle.

Asi que o es esta calculadora o me pongo a hacerlo manualmente y me suicido. [+risas]
CODIGO FUENTE (El uso esta despues del codigo)
---------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FICHERO_OPERACIONES "C:\\Users\\ALVARO\\Desktop\\hexa c\\Debug\\operaciones.txt","r"
#define FICHERO_RESULTADOS "C:\\Users\\ALVARO\\Desktop\\hexa c\\Debug\\resultados.txt","w"
#define TAM_LINEA 400
#define MAX_VALORES 80

typedef struct op{
   int valores[MAX_VALORES];
   char operandos[MAX_VALORES-1];
   int tam;
}operacion;

operacion* parse(char* linea);
char* substr(char* cadena, int comienzo, int longitud);
char xtod(char c);
int HextoDec(char *hex);
int xstrtoi(char *hex);
long calcular(operacion* o);

void main(void){
   FILE *f_r,*f_w;
   char linea[TAM_LINEA];
   operacion *o;

   f_r=fopen(FICHERO_OPERACIONES);
   f_w=fopen(FICHERO_RESULTADOS);
   if(f_r!=NULL){
      while(!feof(f_r)){
         fgets(linea,TAM_LINEA,f_r);
         o=parse(linea);
         fprintf(f_w,"%li\n",calcular(o));
         free(o);
      }
      fclose(f_r);
      fclose(f_w);
   }
}

operacion* parse(char* linea){
   operacion *retorno;
   unsigned int i,j;
   int pos;
   
   retorno=(operacion*)malloc(sizeof(operacion));

   i=0;
   j=0;
   pos=0;

   while( i < strlen(linea) ){
      if(linea[i]=='+' || linea[i]=='-'){
         retorno->valores[pos]=xstrtoi(substr(linea,j,i-j));
         retorno->operandos[pos]=linea[i];
         pos++;
         j=i+1;
      }
      if(linea[i]=='\n'){
         retorno->valores[pos]=xstrtoi(substr(linea,j,i-j));
         pos++;
         j=i+1;
      }
      i++;      
   }
   retorno->tam=pos;
   
   return retorno;
}

long calcular(operacion* o){
   int i;
   long resultado;

   resultado=o->valores[0];
   for(i=1; i<o->tam;i++){
      if(o->operandos[i-1]=='+'){
         resultado += o->valores[i];
      }
      if(o->operandos[i-1]=='-'){
         resultado -= o->valores[i];
      }
   }
   return resultado;
}   

char* substr(char* cadena, int comienzo, int longitud){
   char *nuevo;
   if (longitud == 0){
      longitud = strlen(cadena)-comienzo-1;
   }
   
   nuevo = (char*)malloc(sizeof(char) * longitud+1);
   
   strncpy(nuevo, cadena + comienzo, longitud);
   nuevo[longitud]='\0';
   
   return nuevo;
}

char xtod(char c) {
   if (c>='0' && c<='9') return c-'0';
   if (c>='A' && c<='F') return c-'A'+10;
   if (c>='a' && c<='f') return c-'a'+10;
   return c=0;
}

int HextoDec(char *hex)
{
    if (*hex==0) return 0;
    return  HextoDec(hex-1)*16 +  xtod(*hex) ;
}

int xstrtoi(char *hex)
{
    return HextoDec(hex+strlen(hex)-1);
}




GUIA DE USO
-------------
De los defines, deberias modificar los que tienen las rutas a los ficheros con operaciones y resultados

El fichero operaciones.txt puede contener sumas y restas en cualquier orden y con muchos operandos de longitud arbitraria. Solo hay una IMPORTANTE restriccion: el primer operando de cada operacion no puede ser negativo. De todas maneras, como no pueden existir valores negativos para un puntero, no tendria sentido que esa restriccion fuese un obstaculo.

El fichero resultados.txt contendrá el resultado EN DECIMAL de cada linea, que puedes pasarlo a hexa con la calculadora de win mismamente.

Fichero operaciones.txt de ejemplo:
A0A-1BB1B+2C2C
444A-1B+2C2C
A0A-1B1B+2C2C-5555
A0A-1B1B

Fichero resultados.txt resultante:
-99557
28763
-14906
2570



Espero que te sirva.
Un saludo

P.D: Se que hay una serie de leaks bastante simpatica. Me da vagancia arreglarlo, lo dejo para los estudiantes de primero de FP/carrera :P.
athlor escribió:te estoy haciendo el programa (en c).

el formato de entrada seria:
0A0A-1B1B+2C2C
444A-991B+2C2C
0A0A-1B1B+2C2C-5555
0A0A-1B1B
y la salida seria otro fichero con los resultados linea a linea.

necesito que me digas lo siguiente:
-longitud maxima en cifras de los valores hexa (por ahora trabaja con 4, pero es cambiar el define y se adapta)
-numero maximo de operandos por linea (para optimizar mas que nada, por ahora estoy haciendolo con 80 operandos en mente)

EDIT: si son necesarios los corchetes, dime.

te pongo la foto de lo que debo hacer

La idea es como tu lo planteas poner los datos en un txt los valores que siempre seran en 4 digitos, y el programa lo que debe hacer es restar una cantidad que en este caso es -68 a todos y cada uno de ellos.
Soy muy malo explicando las cosas. [mamaaaaa]

¿Y es completamente imposible que de resultados en Hex?

PD: Como lo compilas estoy usando el dev.C++ y dice que hay un error. [+risas]
he editado el post anterior con un programa que lee las entradas de un fichero.
miratelo.

si son muchas operaciones, puedes hacer copia pegas en un fichero, poner las operaciones y realizar todas las sumas de golpe teniendolas a mano para copiapegas o lo que necesites, que si no ir de una en una es un sufrir.
Eso que pides croe que puedes ahcerlo de forma sencilla con el excel

Edit:
Te leí ayer por la noche y no te lo pude hacer, ahora ya está.
Te lo subo.

Te lo he puesto en columnas, pero facilmente lo puedes transponer a filas y asi poder copiar pegar de un txt separado por saltos de línea.

Yo creo que es lo más sencillo para lo que pides. Si tienes alguna duda (no creo) me lo dices

Adjuntos

rings_akira escribió:Eso que pides croe que puedes ahcerlo de forma sencilla con el excel

Edit:
Te leí ayer por la noche y no te lo pude hacer, ahora ya está.
Te lo subo.

Te lo he puesto en columnas, pero facilmente lo puedes transponer a filas y asi poder copiar pegar de un txt separado por saltos de línea.

Yo creo que es lo más sencillo para lo que pides. Si tienes alguna duda (no creo) me lo dices


Gracias veo que hace lo que necesito pero no termino de entenderlo muy bien, ¿pero a cada casilla debo darle la funcion? pues como que no me ahorra mucho trabajo o no lo entiendo.
te lo he peusto en casillas horizontales
si necesitas 15mil milloens de casillas, marca alguna de las que ya tienen la formula y en el excel te saldra un + de color negro

Arrastras ese + y duplicarás la fórmula a las casillas que quieras.

si no esta noche vuelvo y te ayudo ap onerlo en vertical o como necesites.

no tendrías que volver a poner nada, solo sería copiar pegar
rings_akira escribió:te lo he peusto en casillas horizontales
si necesitas 15mil milloens de casillas, marca alguna de las que ya tienen la formula y en el excel te saldra un + de color negro

Arrastras ese + y duplicarás la fórmula a las casillas que quieras.

si no esta noche vuelvo y te ayudo ap onerlo en vertical o como necesites.

no tendrías que volver a poner nada, solo sería copiar pegar


Pues si, si funciona. disculpa es que casi nunca use el excel.
Pues ya no tengo pretextos para terminar esta traduccion. XD
Perdon por las molestias.
De nada hombre, ya ves tu, yo he dedicado en esto 5 minutos a la comunidad.
Tu curro de la traducción te llevará mucho más tiempo, tiene muchisimo más mérito.

Como ves el factor se puede cambiar, y que en lugar de 86 reste otro numero, así que te puede servir para futuras traducciones.

No estaré atento al hilo así que si necesitas cualquier cosa, mándame un MP :)
11 respuestas