Autor Tema: SCI Script  (Leído 812 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado SkaZZ

  • Webmasters
  • Joshua
  • ****
  • Mensajes: 1687
  • Registrado: 21 Nov, 2004
  • es España
  • Sexo: Masculino
  • ZzZzzZz... Dark Souls... ZzZzzZz...
    • Ver Perfil
SCI Script
« en: Enero 04, 2018, 16:55:59 pm »
Hace mucho que no ponga nada, pero creo que esta información es interesante para todos aquellos que quieran modificar los textos de los scripts en SCI (motor de Sierra Online). Estoy haciendo un software que intentará hacerlo automáticamente, pero tardaré.

ESPECIFICACIONES:
----------------------
Cuando se lee un número de bytes, siempre se leen al revés; es decir si ves "82 00" en el editor hexadecimal, esto se lee como "00 82". Esto es por el sistema endian de los PCs.
0x45, 0x0A... = Representación en hexadecimal de un byte.
ushort = son 2 bytes sin signo (siempre es un número positivo).
byte[] = array de bytes.
offset = posición dentro de un archivo.
0x00 = null (no tiene representación en carácter ASCII).

SCRIPT FORMATO:
----------------------

TIPO                 NOMBRE             DESCRIPCIÓN
-----------------------------------------------------------------------------------
ushort               CABECERA           Indica que es un archivo script (siempre 0x0082)
byte[]               BLOQUE             Un tipo de bloque (hay 10 tipos de bloques, ver
                                        BLOQUE FORMATO)
ushort               FIN                Todos los scripts terminan con 0x0000.


BLOQUE FORMATO:
-------------------------
Se leen los bloques hasta que se encuentre FIN (0x0000).

TIPO               NOMBRE               DESCRIPCIÓN
-----------------------------------------------------------------------------------
ushort             TIPO                 Tipo de bloque
ushort             TAMAÑO               Tamaño del bloque en bytes incluyendo
                                        los 4 bytes del inicio (2 bytes de TIPO y
                                        2 bytes de TAMAÑO).
byte[]             DATOS                El bloque en sí.


Cada BLOQUE es diferente, los nueve tipos son:
0x0001 = objeto
0x0002 = código
0x0003 = lista de sinónimos de palabras
0x0004 = especificaciones para palabras
0x0005 = cadenas de texto
0x0006 = clases
0x0007 = exportaciones
0x0008 = tabla de recolocación
0x0009 = texto de precarga
0x000a = variables locales

Los BLOQUES que interesan para traducir textos son el 5, el 2 y, a veces, el 9.

BLOQUE 5:
----------------------
Simplemente son cadenas seguidas una detrás de otra que terminan con el carácter null (Ejemplo: SkaZz mola0x00mucho mucho0x00mogollon0x00). Si se modifica el tamaño del bloque, hay que cambiar también TAMAÑO en el bloque.

BLOQUE 2:
----------------------
Es código y algo complicado. SCI usa opcodes en este caso. ¿Qué son opcodes? Bueno, son bytes que representan una función. Por ejemplo, uno que nos interesa es el opcde 0x72 (lofsa) que carga textos de nuestro BLOQUE de "cadenas de texto". Bueno, este BLOQUE no tiene que aumentar ni disminuir, tan sólo modificar los punteros a nuestros textos. Al lado del opcode 0x72, hay un ushort que determina un offset pero este es relativo. Esto me dio muchos quebraderos de cabeza, pero al fin entendí su (francamente estúpida) forma. El offset real es el offset indicado más la posición siguiente a este offset leído. Toma ya. Me explico con un ejemplo:

script.997 de SQ3

El BLOQUE "código" en la posición del archivo 0x07 tiene los bytes "72 34 04". Cogemos el primer byte que es un opcode, el "72" que es lofsa, y luego los dos siguientes bytes "04 34" que sería la posición al primer offset de nuestro texto: " 0x01 " (un 0x01 entre dos espacios, porque en sus fuentes representa un carácter). Sin embargo, cuando vamos a esa posición, resulta que ese texto está en "04 3E". De acuerdo, pues ahora miramos la posición siguiente a "04 34" que es la 0x0A. ¿Qué pasa si sumamos 04 34 + 0A, pues que es igual a 04 3E. ¡¡¡Aleluya!!!
Miremos el siguiente opcode "72" que está en la posición 0x0B y que es "72" y offset "04 34". ¡¡¡Es igual que el anterior!!! Pues usamos la misma fórmula:

1. Cogemos el offset (04 34)
2. La posición siguiente a este offset (0x0E)
3. Sumamos ambos: 0434+0E = 04 42
4. Buscamos esa posición en el archivo y voilá ("About game`^a :Help`#1 :VaporCalc`^c ")
5. Nos tocamos por la alegría (opcional)

COSAS A TENER EN CUENTA:
-------------------------------------
- Puede haber varios bloques de código (aunque no es muy habitual).
- No hay que olvidar modificar el TAMAÑO del BLOQUE 5.
- Hacer una pasada al BLOQUE 2 para modifcar los offsets.

De momento tengo hecho un programilla que carga el script, divide los bloques y permite modificar los textos... pero aún queda hacer una pasada al código porque habrá que reescribirlo byte a byte.

Un saludo, espero que esto os ayude. :D
« Última modificación: Enero 04, 2018, 17:04:54 pm por SkaZZ »



      //////       Hora de abandonware llegó, coge a tus
     (o   O)       amigos y vámonos. Con Kendo el friki y
       (_)         SkaZz el chiflado, lo pasaremos guay.
--oooO-----Oooo--  ¡Hora de abandonware!

Desconectado Daventry

  • Ábaco
  • Mensajes: 5
  • Registrado: 01 Ago, 2018
  • ru Russian Federation
    • Ver Perfil
    • Email
Re:SCI Script
« Respuesta #1 en: Agosto 01, 2018, 12:39:29 pm »
SkaZZ, hi
SCI1.1

*.hep
Variables, constants, definitions of objects, classes, functions are stored here.

Block 1-header, size 6 bytes
Offset Size Value Description
00 ..... 2 .... 0x91 ... Resource identifier
02 ..... 2 .... ........ Link to block 5 (address = this value + 2)
04 ..... 2 .... ........ Number of local variables (block 2)

Block 2-local variables, total block size = number of variables * 2
Offset Size Description
06 ..... 2..... All variables are of size " word"

Block 3-objects and classes
Offset
inside
object Size Description
00 .... 2 .... The object ID, always equal to 0x1234
02 .... 2 .... The number of object properties, in fact, is the size of the object in " words"
The meaning of the next 6 words is not quite (or quite :)) clear to me
04 .... 2 .... Link to "dictionary property" in hunk resource (?)
06 .... 2 .... Link to "dictionary method" in hunk resource (?)
08 .... 2 .... A pointer to the source script of the object class (probably the script number where the class of the object is described)
0A .... 2 .... A pointer to the source script of the object (looks like if 0xFFFF, there are no ancestors")
0C .... 2 .... A pointer to a "superclass" object (it looks like this is the type of the object)
Next, variable-length data is obviously dependent on the type of object
0E .... 2 .... Bit data (?) (it seems that there is always 0x0000, head on cutting off not ladies :)), if present, the address of the next word moves
10 .... 2 .... Link to the text name of the object
..
.. .... 2 .... For some types of objects, a numeric parameter is defined-the number parameter IS analyzed when displaying messages
..
This block always ends with the zero word 0x0000.

Block 4 - text naming objects and text constants
The names of the objects in the text form, each name ends with a zero byte. Reference to this name is inside each object.

Block 5 - FixTable
Offset
inside
object Size Description
00 .... 2 .... The number of references (in fact, objects). Next "words" according to this number.
02 .... 2 .... Link to the link (inside the object) to the "object name". It is not very easy to formulate, but it is probably clear.