[PC] Portando docmaker de Dark_Alex a PERL

Buenas noches,
Espero que me podais ayudar los que sepais de C para explicarme lo siguiente, la cosa es que estoy portando a PERL el docmaker, pues me pareció que el funcionamiento de este es sencillo, y queria aprender a programar, he conseguido generar los primeros 87 bytes del fichero DOCUMENT.DAT, con su respectivo game_code, y el numero de paginas segun los png's que hay en la carpeta deseada, peró llegué a este punto y me quedé pillado:

memset(entries, 0, sizeof(DocumentEntry) * n);

fwrite(entries, 1, sizeof(DocumentEntry) * n, out);


Ya he buscado en tutoriales de C, pero sigo sin entender, necesito saber como hace el relleno de 0, de donde saca la dimension del relleno? DocumentEntry lo genera con esta función:

typedef struct __attribute__((packed))

{

   unsigned int offset_low;

   unsigned int offset_high;

   unsigned int unknown;

   unsigned int size_low;

   unsigned int size_high;

   unsigned int dummy[0x6C/4];

} DocumentEntry;


y entries lo declara con esta otra:
DocumentEntry *entries;


Si os hace falta os cuelgo el source, o si teneis el 3.03 OE-A en principio ya lo teneis.

Gracias por adelantado
crackiron escribió:Buenas noches,
Espero que me podais ayudar los que sepais de C para explicarme lo siguiente, la cosa es que estoy portando a PERL el docmaker, pues me pareció que el funcionamiento de este es sencillo, y queria aprender a programar, he conseguido generar los primeros 87 bytes del fichero DOCUMENT.DAT, con su respectivo game_code, y el numero de paginas segun los png's que hay en la carpeta deseada, peró llegué a este punto y me quedé pillado:

memset(entries, 0, sizeof(DocumentEntry) * n);

fwrite(entries, 1, sizeof(DocumentEntry) * n, out);


Ya he buscado en tutoriales de C, pero sigo sin entender, necesito saber como hace el relleno de 0, de donde saca la dimension del relleno? DocumentEntry lo genera con esta función:

typedef struct __attribute__((packed))

{

   unsigned int offset_low;

   unsigned int offset_high;

   unsigned int unknown;

   unsigned int size_low;

   unsigned int size_high;

   unsigned int dummy[0x6C/4];

} DocumentEntry;


y entries lo declara con esta otra:
DocumentEntry *entries;


Si os hace falta os cuelgo el source, o si teneis el 3.03 OE-A en principio ya lo teneis.

Gracias por adelantado


Hola, sizeof es "tamaño de" y en este caso, el elemento es un tipo definido como struct (estructura)

Eso quiere decir, que para averiguar el tamaño, tendras que sumar los tamaños parciales de cada elemento, que son todos del tipo 'unsigned' (32 bits/4 bytes)

Asi que el tamaño seria 4+4+4+4+4+ 4*(0x6C/4)

El ultimo elemento, es lo que se conoce como un 'array' y lo puedes ver como una cadena de elementos unsigned de una determinada longitud (0x6C/4) elementos.

Como ya te habras coscado, la longitud del array es de 0x6C bytes y, lo que sumado a los demas y traducido a decimal nos da: 128 bytes.

memset lo que hace es fijar a un valor determinado de byte (en este caso 0) un numero de bytes desde una direccion de memoria.

En este caso, el numero de bytes a 'rellenar' serian 128*n, donde n seria el numero de elementos de tipo DocumentEntry (=128 bytes de longitud)


No se si lo tienes claro, pero para ayudarte en las conversiones, utiliza esta convencion:

char, signed char, unsigned char = 1 byte

short, unsigned short = 2 bytes

int, unsigned, unsigned int, long,unsigned long = 4 bytes

arrays:

int pepe[50] = (elemtos x tipo) =50x 4

structs: suma de la longitud de todos sus elementos, aunque puede verse afectada por la alineacion de los elementos individuales en memoria (si lleva packet, teoricamente, se corresponde con la definicin que hago)
sólo le he hechado un vistazo a lo que has puesto, hermes, pero según lo que dices lo que está haciendo aquí es algo como para cada document entrie sería algo como cáda página de manual , no? y hace la reserva esa.

por otro lado que utilidad tiene pasar esto a perl? o lo haces solo por divertirte, crackiron?
saulotmalo escribió:sólo le he hechado un vistazo a lo que has puesto, hermes, pero según lo que dices lo que está haciendo aquí es algo como para cada document entrie sería algo como cáda página de manual , no? y hace la reserva esa.

por otro lado que utilidad tiene pasar esto a perl? o lo haces solo por divertirte, crackiron?


Segun el extracto de codigo fuente que ha puesto, hay un puntero, que seguramente se asigne con un malloc para guardar una lista de elementos Documententry.

Para lo que se utilice ese codigo exactamente, tengo que confesar que no tengo ni puñetera idea XD: yo solo interpreto lo que significa eso en C para que lo pueda pasar a Perl (lenguaje que no he utilizado en mi vida y espero, no tener que utilizarlo nunca [+risas] )
creo que el programita este es para los juegos de psx para que puedan tener su manual o guia incluida... no se si acaso el colega del perl podría asegurarlo.
saulotmalo escribió:creo que el programita este es para los juegos de psx para que puedan tener su manual o guia incluida... no se si acaso el colega del perl podría asegurarlo.


Mola entonces el tema ;)

Por cierto, me acabo de fijar en tu firma XD ¿Hermes Fan? Me vas a hacer sacar los colores [ayay]
offtopic, lo de la firma es que yo admiro a la gente que de verdad es importante para la scene ( que no hecho el trabajo de otros por tierra ) solo digo que tu estas haciendo un trabajo fabuloso, tanto en nds como ps2 o psp y que igual no tienes tanto reconocimiento como otros que se dedican a romper protecciones. jejej que rayada :)
saulotmalo escribió:offtopic, lo de la firma es que yo admiro a la gente que de verdad es importante para la scene ( que no hecho el trabajo de otros por tierra ) solo digo que tu estas haciendo un trabajo fabuloso, tanto en nds como ps2 o psp y que igual no tienes tanto reconocimiento como otros que se dedican a romper protecciones. jejej que rayada :)


Bueno, yo creo que cada uno tiene o puede tener su lugar en esto que llamamos scene y todas las aportaciones son importantes.

Hace unos dias, recibí un MP de una persona en relacion a otra cosa y de paso me felicitaba por mi juego de sopa de letras y decia que su familia esta enganchada a el ¿Existe mejor reconocimiento que ese? Sobre todo cuando esas felicitaciones vienen en "frio", despues de bastante tiempo de la publicacion de ese trabajo

Asi que el señor Hermes no se puede quejar en ese sentido y de todas formas, la cuestion es divertirse, hacer algo que te guste y que lo disfrutemos todos ;)
yo lo sé, pero me jode que a gente como tu no te denominasen por ejemplo para premio scener del año ( aunque en psp no hayas hecho tanto como nds ) y si nominen a gente que vamos tiene dudosas aportaciones. Y no lo digo por dark_alex que precisamente tengo que reconocer que uso cosas suyas aunque el xabal no conteste nunca porque siempre está ocupao ejej. en fin Mejor dejamos de hablar del tema que estamos llenando el hilo de otros temas jeje.

te apuntas a hacer un jueguecito que tengo en mente hermes, o alguien interesado, sería un juego facilito y con poca cosa pero es mas divertido hacerlo en grupo, o no?
Solo para divertirme, como el poco homebrew que he hecho para la PSP, si no lo hiciera por diversion, no lo haria creeme...

Lo bueno que tiene el perl es que podría hacerse herramientas on-line y otras pijadas (puro entretenimiento xD)

Ahora mismo no estoy en casa por lo que no puedo ponerme a probar codigo, de todas formas os volveré a contestar encuanto pruebe algunas cosillas, por lo que parece hace un relleno, pero me parece que de servir sirve de bien poco (pero se necesita :()

Un saludo y gracias a los dos

PD: El programilla sirve para hacer los manuales de PSX (el del emulador), a partir de PNG's. Acertaste Saulot n_n jeje

PD2: Aprovechando admiraciones, te admiro por el currele del 3D en la PSP :P

4ª vez que edito el post xD, si es facilito y de facil comprensión, yo me apunto, ademas me ayudaria a entender el codigo en C n_n, aunque si se va a necesitar muchos conocimientos...
saulotmalo escribió:yo lo sé, pero me jode que a gente como tu no te denominasen por ejemplo para premio scener del año ( aunque en psp no hayas hecho tanto como nds ) y si nominen a gente que vamos tiene dudosas aportaciones. Y no lo digo por dark_alex que precisamente tengo que reconocer que uso cosas suyas aunque el xabal no conteste nunca porque siempre está ocupao ejej. en fin Mejor dejamos de hablar del tema que estamos llenando el hilo de otros temas jeje.

te apuntas a hacer un jueguecito que tengo en mente hermes, o alguien interesado, sería un juego facilito y con poca cosa pero es mas divertido hacerlo en grupo, o no?


Lo de los premios y cosas asi, no me interesan XD. Incluso hace un tiempo, el webmaster de gp32spain quiso incluirme en las donaciones que se hacen a los sceners, pero a titulo personal y yo se lo agradezco de todo corazon, pero prefiero que esas donaciones vayan a personas que tengan pocos recursos economicos (yo ya con el detalle, me conformo y le quedo muy agradecido, o con las muestras de cariño que recibo por parte de los usuarios de esa web, cada vez que los visito)

Por cierto, yo en PSP no he programado una linea, lo mas cerca que he estado has sido cuando publique aquel codigo fuente para apañar los saves de PSX desde el PC XD

Sobre tu ofrecimiento para hacer un juego, la verdad es que ahora estoy en horas bajas en cuanto a programar: no me apetece, asi de simple y eso que tengo un proyecto bastante interesante de un juego de carrera de coches en 3D en la NDS, del cual ya he colgado alguna demo, pero en este momento, estoy de "bajon" y no me apetece programar XD.
En realidad lo del juego iba a ser cosa pequeña, yo ahora solo me centro en cosas pequeñas e intento buscar modularidad para ver si las puedo usar en cosas más complejas :). La verdad que comprendo lo de pocas ganas de programar a mi me pasa igual con el proyecto de final de carrera ( y eso que es divertido - un juego usando cámara- ) pero ufff las pocas ganas. Ah si, lo del juego, se me va xD que iba a hacer un juego tipo nose, has visto alta tensión? eso sería facilito y me recordó a tu sopa de letras jeje por eso te lo dije.

Por cierto sobre lo de las donaciones yo me apunto a las que sean que soy estudiante sin solvencia económica ( creo que serán 0 xD pero se tenía que intentar ).
saulotmalo escribió:En realidad lo del juego iba a ser cosa pequeña, yo ahora solo me centro en cosas pequeñas e intento buscar modularidad para ver si las puedo usar en cosas más complejas :). La verdad que comprendo lo de pocas ganas de programar a mi me pasa igual con el proyecto de final de carrera ( y eso que es divertido - un juego usando cámara- ) pero ufff las pocas ganas. Ah si, lo del juego, se me va xD que iba a hacer un juego tipo nose, has visto alta tensión? eso sería facilito y me recordó a tu sopa de letras jeje por eso te lo dije.

Por cierto sobre lo de las donaciones yo me apunto a las que sean que soy estudiante sin solvencia económica ( creo que serán 0 xD pero se tenía que intentar ).


Uno de mis juegos no-releseados (e incompletos) de PS2 que hice, es un Arkanoid que se controla con el movimiento de la mano y la Eyetoy.

Lo malo, es que el driver es un trabajo de mi amigo Bigboss (antiguo socio del Mediaplayer) y como anda siempre de viaje, todavia no lo ha acabado (y de eso hace ya dos años o mas XD)

La captura de movimiento, la hacia utilizando una rutina de mi propia cosecha, bastante simple pero efectiva.

Lo de Alta Tension, me suena a un concurso de la tele, pero ahora mismo no asocio ni de que se trata XD

Yo tengo en mente hacer un juego en NDS en plan puzzle de letras, que es una idea qe lleva dando vueltas por la cabeza desde hace tiempo (igual que me pasó con la Sopa de Letras)

Quiza acabe uniendo varios juegos en uno o yo que se: estoy tan "perro" en estas cuestiones ahora, que ni si quiera he tenido el detalle de publicar los fuentes de la sopa de letras XD. En otro momento quiza.
Alta tensión es un programa de tele que hacen una cuestion general, ejeplo: "montañas de españa" y te dan 12 opciones 8 correctas y bueno tu vas eligiendo y podrías pasar el turno y tal. Yo esque tengo la idea de hacer royo "los juegos de la tele" o algo así y creas la ruleta de la fortuna este y alguno más estaría way pero así de uno en uno.

Por cierto es clavado a mi proyecto de fin de carrera emmm el código es libre? xD

yo la captura de movimiento ... la hace un colega mio porque el proyecto es entre 2 personas y se la ha currado mucho pero ha usado una librería propietaria de intel para realizar lo que era la captura de la imagen... una pena.
break <
Ejem, ejem... xD perdonad que os moleste pero sois la puta ostia (ojala os molestaran siempre para esto eh?, efectivamente calcule un manual que tenia, miré el espacio dummy que hay en el documento del manual y dividiendo por 128 eran las 23 paginas que tenia, por lo tanto... fantástico!!! os lo agradezco mogollon, no solo por decirme que eran 128 bytes, sinó tambien por decirme el porqué... me faltan palabras para describir lo que siento ahora mismo (siempre que un proyecto de programacion de un lenguaje que no se me sale bien... me entusiasmo xD.

Un saludo y mil gracias!!

EOT

Lo que ahora no se por que en todo ese relleno de (en un principio ceros) hay demás basurilla, supongo que no importará por aquello de que es dummy¿? :P, voy a probar
Me alegro que ya esté resuelto, sobre lo que comentas del dummy creo que el tema está en que o es así por alguna razón de formateado, o bien el programa de las páginas lo gasta...

mi teoria es que eso reserva el espacio necesario para todas las páginas y luego ya le pondrá los valores correspondientes, pero eso lo deberías ver tu en el código. A cualquier duda sabes que aquí te intentaremos ayudar.
Gracias por vuestra ayuda, desde luego cada vez que me meto mas me gusta mas jejeje, pero ahora hay algo que me molesta, estoy en las cuatro ultimas lineas de código y se me presenta:

   fseek(out, 0x88, SEEK_SET);
fwrite(entries, 1, sizeof(DocumentEntry) * n, out);


Aquí entiendo que en el byte 0x88 del fichero de salida, lo fija como escritura (como si fuera el offset fijado para seguir trabajando), y ahí escribe un valor, el cual debería ser:

sizeof(DocumentEntry) = 128 bytes

multiplicado por
n (numero de paginas del doc) = en mi caso dos

por lo tanto escribiria en el byte 0x88 128*2=256 en hexa, o lo que es lo mismo: 0x0100, pero mi razonamiento no puede ser correcto, por que el manual que estoy utilizando de referencia tiene 23 paginas, y en el byte 88 estan insertado los valores 0x10 0x0C

T_T

Si pudierais guiarme de nuevo... :P
Voy a ver si pillo algo de sueño y a sobarla, jeje, mañana nos vemos
Deberías mirarte qué hace fwrite ;)

De todas formas, yo diría que la forma "correcta" de esa sentencia sería:

fwrite(entries, n, sizeof(DocumentEntry), out);


Saludos
Como tu dices está bien NeoRave, pero como el lo hace tambien, lo que pasa es que el envía los datos de 1 en uno y to los enviarías en paquetes de tamaño n ( cosa que no tendría sentido, en todo caso se deberían enviar paquetes de tamaño DocumentEntry).

Sobre lo que dices que pregunta crackiron Primero posiciona el cabezal de escritura en el fichero, y luego copia el vector entries en el fichero solamente eso. el vector entries tiene los datos de los DocumentEntrie.
Cierto, lo escribí sin pensar. Para mi la forma lógica (no sé si hay una peor o mejor) es:

fwrite(entries, sizeof(DocumentEntry), n, out);
NeoRave escribió:Cierto, lo escribí sin pensar. Para mi la forma lógica (no sé si hay una peor o mejor) es:



El problema de enviarlo de la forma en que tu lo haces (esa que señalas ahi) es que fwrite no devuelve entonces el numero de bytes escritos, si no el numero de elementos escritos (o sea n, si todo fue bien o un numero menor, si fue mal).

Para el colega que tiene dudas, fseek fija la posicion de escritura en el fichero, al indicarle SEEK_SET lo hace desde el inicio del fichero y fwrite escribiria en este caso, todas las paginas a partir de esa posicion de fichero (desde el byte 0x88 en el fichero en adelante)
lo del fseek ya se lo que hace, gracias a la magnifica biblioteca de conclase xDD, lo que no entiendo de donde saca los valores escritos en el byte 0x88.

¿son el numero de bytes escritos?

Creo que es lo unico que me falta para que quede como acabada la aplicación..., después de esto no os daré mas el coñazo con esto jejeje, supongo que me pondría con el popstation (haciendo otra rutina dentro del script para crear la iso y seleccionar el nombre del juego automaticamente etc etc...)

PD: Mientras pueda seguiré soñando :P
crackiron escribió:lo del fseek ya se lo que hace, gracias a la magnifica biblioteca de conclase xDD, lo que no entiendo de donde saca los valores escritos en el byte 0x88.

¿son el numero de bytes escritos?

Creo que es lo unico que me falta para que quede como acabada la aplicación..., después de esto no os daré mas el coñazo con esto jejeje, supongo que me pondría con el popstation (haciendo otra rutina dentro del script para crear la iso y seleccionar el nombre del juego automaticamente etc etc...)

PD: Mientras pueda seguiré soñando :P


Del puntero 'entries'

entries es una variable de puntero, que para explicartelo de forma sencilla, es una variable a la que le puedes especificar la direccion en memoria (lo normal es que le asignes una direccion del monticulo de memoria, mediante malloc() )


La particularidad que tienen las variables de puntero, es que aparte de poder asignarles una direccion de memoria a voluntad, la puedes decrementar o incrementar para acceder a un dato anterior o posterior del mismo tamaño que el tipo que estas utilizando y asignarle datos en esa nueva posicion

Por ejemplo, nuestra variable de puntero "entries", se define asi:

DocumentEntry *entries;

Es decir, que es del tipo DocumentEntry, que es una estructura de datos.

Si ahi estas almacenando paginas, la primera pagina estaria en la direccion de entries, la segunda en la direccion de entries+1 y si hubiera una tercera, estaria en entries+2

Date cuenta que ese +1 no es sumar un byte, si no el TAMAÑO de 128 bytes que ocupa la estructura.

Por cierto, tambien podrias ver una formula del tipo entries[0], entries[1] o entries[2]. Esto tendria un significado parecido, solo que en este caso, en vez de indicar direccion, deberias entender algo asi como "acceder al dato en la direccion"

De esta forma, puedes entender que fwrite, al recibir la variable de puntero entries, lo que recibe es la direccion de memoria donde se encuentran los datos y por eso al escribir un numero de bytes "sizeof(DocumentEntry)*n" escribiras todas las paginas
22 respuestas