Sección Heroes4

Iniciado por Abenhor, Mayo 20, 2009, 07:35:43 PM

Balder

Bien, aquí te dejo lo que ya tengo del proyecto. Te incluyo un léeme que explica todo dentro del .zip.

http://www.fileden.com/getfile.php?file_path=http://www.fileden.com/files/2006/12/25/553903/Proyecto%20I.M.%20Meen.zip


Respecto a tu especificación de los h4l, he de felicitarte por el trabajo. Es precisa y completa. Este finde mismo trataré de echarle un vistazo, aunque no te garantizo nada (examen el lunes). Si sobre la marcha me surje alguna duda, te consultaré.

Hay que admitir que el formato es complejo, pero con semejante especificación la programación será, a lo sumo, aburrida xD


Hasta la próxima! :thumbsup:
[:Balder:]

Krator

Veo gente muy capacitada!!!

Cuanto me alegro de que estéis tan enfatizados en la ingenieria inversa de los juegos...a ver si me dais un cursillo de ensamblador malditos! que me dais mucha envidia!!!
Mi carrera se quedó en la gestión, ojala algun dia retome mi afan destructor de juegos que dejé en el Sr. Spectrum.

Por cierto lepas, que gracioso el botoncito...

Bueno viejo amigo  :ph34r: , ya que estamos de vuelta, podemos seguir hablando sobre los contenidos en la torre cuando quieras. Un saludete.
Doble cruzado, cuadruple placer.

Balder

Jejejeje, pues si te interesa la ingeniería inversa de juegos y la vieja "scene" yo participo en http://www.xentax.com/ que llevan 20 añazos descifrando formatos. Lo de usar el desensamblador es poco común para estas tareas. Generalmente, es suficiente con un buen editor hexadecimal. Y si realmente te interesa, te puedo enseñar lo que se, incluso pasarte material didáctico de los expertos.

Acabo de descubrir el botón yo tb jejeje anda que no llama la atención ni na!

Pos na, lo dicho, a ver si vuelve Abenhor con buenas noticias... :thumbup:
[:Balder:]

Krator

Te tomo la palabra Balder, y este verano a partir del 1 de julio, ve preparando este "master", que tengo interes en aprender sobre ello!

Gracias!!!
Doble cruzado, cuadruple placer.

Abenhor

[quote user="Balder" post="41281"]Bien, aquí te dejo lo que ya tengo del proyecto. [/quote]

No lo he mirado a fondo todo, pero con el primer fichero boy0.cmp y la imagen que me entregas boy0.tga he logrado descifrarlo, con alguna lagunilla, a pesar de que la captura que me has puesto no se corresponde con el tamaño "real" de la imagen. ¿Me has puesto trampas?  :wink:
Ya me imagino que se trata de una deformación por la resolución usada por el windows, o el dosbox, o algo así...
Te pongo lo que he sacado en claro y me acuesto ya, que es tardísimo (o muy temprano, según se mire).

[code linenumbers=false]
/************************************
* Formato cmp usado en I.M. Meen    *
* Imagen pequeña, de color indexado *
************************************/

04 bytes - nnnnnnnn - longitud (tamaño del fichero cmp - 4)
02 bytes - nnnn     - ancho (ancho en pixels de la imagen)
02 bytes - nnnn     - alto (alto en pixels de la imagen)
02 bytes - 0000     - desconocido1
02 bytes - nnnn     - desconocido2 (¿alto - 1?)
02 bytes - 0000     - desconocido3
02 bytes - nnnn     - desconocido4 (¿ancho - 1?)
01 byte  - nn       - nColores (número de colores usados)
nColores bytes      - array: colores{byte nColores} (índices de color usados, probablemente de una paleta externa)
alto*2 bytes        - array: direccionLineas{word alto} (desplazamiento -4, desde el inicio del fichero, a los datos de los píxeles)
alto*ancho bytes    - array: pixeles{byte ancho*alto} (tabla de píxeles de cada línea)

****************
Ejemplo Boy0.cmp
****************
0000 - 04 bytes - 520e0000 - 3666 (3670 bytes de tamaño de fichero)
0004 - 02 bytes - 3800     - 56 píxeles de ancho
0006 - 02 bytes - 3e00     - 62 píxeles de alto
0008 - 02 bytes - 0000     - desconocido
000a - 02 bytes - 3d00     - 61 ¿alto - 1?
000c - 02 bytes - 0000     - desconocido
000e - 02 bytes - 3700     - 55 ¿ancho - 1?
0010 - 01 byte  - 39       - 57 colores
0011 - 57 bytes - paleta de colores ¿índices de una paleta externa de 256 colores?
                 67 08 C7 DB D9 D8 5D 5C 5B 59 60 5F 58 B0 DA C8 AF AC DC AA A7 AE A6 A5 A8 A3 A1 A4 C9 AB A9 B2 AD B1 D6 4B 47 E6 4A D3 49 4C D7 CB CC 65 64 62 68 61 5E 66 43 45 63 42 48
004a - 124bytes - alto * 2 bytes (en este caso 62*2 = 124)
                 {direccionLineas:
                   array[1..alto] of word; (tabla de offsets de las líneas, sin contar los 4 primeros bytes del tamaño de fichero)
                 }
                 C200 FA00 3201 6A01 ... 720D AA0D E20D 1A0E
00c6 - 56 bytes - linea1:
                 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00fe - 56 bytes - linea2:
                 00 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00
0136 - 56 bytes - linea3:
                 00 01 01 01 01 01 01 01 01 01 01 01 01 02 01 01 01 01 02 01 01 01 01 01 01 01 01 01 01 01 01 01 02 01 01 01 01 01 01 01 01 01 02 02 01 01 01 01 01 01 01 01 02 02 01 00
016e - 56 bytes - linea4:
                 00 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00
[... más líneas ...]
0d76 - 56 bytes - linea59:
                 00 33 2E 36 36 2F 2F 0A 2F 2F 36 2D 00 2F 31 0A 0B 31 2D 28 35 35 35 34 34 37 37 37 34 34 35 35 35 35 35 28 2D 0A 0A 2F 2F 30 30 2D 36 2F 31 2F 2F 2F 36 36 2E 2D 33 00
0dae - 56 bytes - linea60:
                 00 36 36 36 2F 0A 31 2F 0A 2F 2F 36 2E 00 00 2F 31 0A 31 2D 28 28 38 35 35 35 35 35 35 35 35 35 28 28 28 2D 0A 0A 2F 2F 30 2D 2E 36 2F 2F 2F 31 2F 31 2F 36 36 36 2E 00
0de6 - 56 bytes - linea61:
                 00 36 36 31 31 2F 0A 31 31 0A 2F 36 36 2E 2E 00 00 2F 0A 31 2D 2D 28 38 38 38 38 28 28 28 28 28 28 2D 2D 0A 2F 2F 2D 30 2D 2E 36 2F 2F 31 31 0A 2F 0A 31 2F 36 36 36 00
0e1e - 56 bytes - linea62:
                 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
// fin de fichero
[/code]

La paleta está claro que no está incluída en este fichero, así que supongo que se usará una paleta "normalizada", o una común a todos los gráficos.
Quedan 4 datos desconocidos, aunque seguramente se trate de los márgenes, o de alguna historia semejante...
Si hace falta, miro otro par de ficheros, a ver en qué se diferencian en esos datos.

Balder

Muchas gracias por la manita!

Acababa de descubrir los datos restantes del encabezado, pero habia considerado numerodecolores un short, en vez de un byte, y seguía sin entender que la paleta era un indice de colores y no una paleta "real".

Con esto será más que suficiente para arreglar la herramienta.

Todavía no he captado eso del array "direccionLineas", pero me pondre en breves con el hex a repasar el tema.

Como he dicho, mil gracias, más las otras mil que te da mi colega que es el que necesita conocer el formato para un proyecto suyo.

Por cierto, no se si te has fijado en que las BOY1... BOY2... BOYXXX son distintas que las BOY0.CMP.  Yo caí en la cuenta hace poco. Al parecer, sus píxels no están "tal cual" y ocupan mucho menos espacio aun teniendo el mismo ancho y alto. He visto codigos como 80 en hex repetirse mucho en dichas imágenes. Sospecho que se trate de algún código!!

Pues nada, en cuanto tenga el H4 a mano parar mirar la otra estructura ya te cuento por aquí. Sería interesante hacer algo para el H4 y esas herramientas podrían ser el principio.

Hasta la la proximma :cheers:

P.D: Lo siento por lo de la incongruencia entre los tamaños de la screenshot y la imagen cifrada. Mi colega me paso las screenshots así del dosbox y probablemente ocurrió lo que mencionas. Tampoco recordé avisarte, espero que no te diera quebraderos de cabeza.

Voy acostarme yo también, que como bien dices sea tarde o temprano yo no he dormio xD
[:Balder:]

Abenhor

Muy breve, te adelanto un poco más. A la tarde miraré otro poco.

[code linenumbers=false]
/************************************
* Formato cmp usado en I.M. Meen    *
* Fichero *1.cmp                    *
* Imagen pequeña, de color indexado *
************************************/

04 bytes - nnnnnnnn - longitud (tamaño del fichero cmp -4)
02 bytes - nnnn     - ancho del bloque (ancho en pixels de la imagen)
02 bytes - nnnn     - alto del bloque (alto en pixels de la imagen)
02 bytes - nnnn     - ¿margen superior?
02 bytes - nnnn     - alto de la imagen
02 bytes - nnnn     - ¿margen izquierdo?
02 bytes - nnnn     - ancho de la imagen
01 bytes - nn       - nColores (máximo 128)
nColores bytes      - colores usados
variable            - líneas codificadas


****************
Ejemplo Boy0.cmp
****************

0000 - 5A000000 - 90 (tamaño del fichero -4)
0004 - 3800     - 56 (ancho del bloque)
0006 - 3E00     - 62 (alto del bloque)
0008 - 1C00     - 28 (primera línea a pintar, comenzando a contar en cero)
000a - 1F00     - 31 (última línea a pintar, comenzando a contar en cero)
000c - 0E00     - 14 (primer pixel a pintar en cada línea, comenzando a contar en cero)
000e - 2700     - 39 (último pixel a pintar en cada línea, comenzando a contar en cero)
0010 - 10       - 16 (número de colores usados)
0011 - 004C47E64AD64BD7D849D3D5AAD9ACA8 (los colores usados)
0021 - 2500     - direccionLinea28 -4 (inicio en 0029)
0023 - 2600     - direccionLinea29 -4 (inicio en 002a)
0025 - 3500     - direccionLinea30 -4 (inicio en 0039)
0027 - 4500     - direccionLinea31 -4 (inicio en 0049)
0029 -          - linea1 { 80 }
002a -          - linea2 { 91 01 02 03 81 04 05 89 02 03 81 06 05 07 80 }
0039 -          - linea3 { 90 08 09 03 82 01 0A 88 09 03 82 01 0A 0B 07 80 }
0049 -          - linea4 { 8F 0C 81 07 09 01 81 07 05 07 87 08 04 01 81 0D 07 0E 0C 0F 80 }
[/code]

Luego miro a ver qué veo en la codificación de líneas, aunque una captura para comparar sería bien recibida...  :cool:

Abenhor

Imagino que te vendrá bien si te paso la imagen boy0 "arreglada" a su tamaño real.


Abenhor

Ya está decodificado:  :clap:

[code linenumbers=false]
*****************************************
Decodificación de líneas
líneas de 26 péxeles de ancho (39 -14 +1)
si dato < 80h pintar pixel
si dato = 80h fin de línea
si dato > 80h saltar (dato -80h) píxeles
*****************************************

linea1 {
        80           // Fin de línea
      }
linea2 {
        91              // Saltar 17 píxeles (se resta 80h), desde el comienzo del bloque, no de la línea.
        01 02 03        // pintar 3 píxeles
        81              // Saltar 1 pixel (se resta 80h)
        04 05           // pintar 2 píxeles
        89              // Saltar 9 píxeles (se resta 80h)
        02 03           // pintar 2 píxeles
        81              // Saltar 1 pixel (se resta 80h)
        06 05 07        // pintar 3 píxeles
        80              // Fin de línea
      }
linea3 {
        90              // Saltar 16 píxeles (se resta 80h), desde el comienzo del bloque, no de la línea.
        08 09 03        // pintar 3 píxeles
        82              // Saltar 2 píxeles (se resta 80h)
        01 0A           // pintar 2 píxeles
        88              // Saltar 8 píxeles (se resta 80h)
        09 03           // pintar 2 píxeles
        82              // Saltar 2 píxeles (se resta 80h)
        01 0A 0B 07     //
        80              // Fin de línea
      }
linea4 {
        8F              // Saltar 15 píxeles (se resta 80h), desde el comienzo del bloque, no de la línea.
        0C              // pintar 1 pixel
        81              // Saltar 1 pixel (se resta 80h)
        07 09 01        // pintar 3 píxeles
        81              // Saltar 1 pixel (se resta 80h)
        07 05 07        // pintar 3 píxeles
        87              // Saltar 7 píxeles (se resta 80h)
        08 04 01        // pintar 3 píxeles
        81              // Saltar 1 pixel (se resta 80h)
        0D 07 0E 0C 0F  // pintar 4 píxeles
        80           // Fin de línea
      }
[/code]

Balder

Wow... excelente currele en tiempo record!

Yo ya estoy actualizando la herramienta. Actualmente ya se da manejado con los CMP0, y ahora, gracias a ti, también podrá con los CMPX.

Como no dimos encontrado la paleta por ninguna parte, tendré que recomponerla yo mirando por las screenshots. De momento lleva una docena de colores correctos y ya empieza la imagen a mostrarse ma o meno xD

Ah gracias por el gif "correcto" jjejeje Que los otros eran muy confusos.

Voy seguir manos a la obra.. cuanto antes empiece antes acabo.

Espero no haberte dado mucho la vara con el tema xD Al menos este tipo de cosas siempre resultan instructivas. Conocer formatos es bueno a la hora de crear los propios.

ta pronto! :thumbup:
[:Balder:]

Storm-Giant

Esta muy currada la pagina, y eso que soy de la ''vieja escuela''(Heroes II&III FTW!!!).
Sigue así :thumbsup:
Orgulloso fundador del Club de Antifans de Lepastur - ¡Hazte miembro y ríete tú del Tirano Infernal!

http://www.starcraft-esp.com/

rasdel

Que puedo decir...

Interesante!!! Me parece muy bueno ^^

Salu2
--Efectos secundarios pueden incluir: sequedad de boca, náusea, vomitos, retención de agua, dolorosa picasón rectal, alucinación, demencia, psicosis, coma, muerte y mal aliento. La magia no es para cualquiera, consulte a su doctor antes de uso--