<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>mod archivos - Detrás del último no va nadie</title>
	<atom:link href="https://blog.krusher.net/tag/mod/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Porque alguien tenía que pensar en los peces</description>
	<lastBuildDate>Sat, 10 Jun 2017 22:49:13 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://blog.krusher.net/wp-content/uploads/2016/02/cropped-detras-del-ultimo-no-va-nadie-icon-32x32.jpg</url>
	<title>mod archivos - Detrás del último no va nadie</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Desmontando SimCity 2000</title>
		<link>https://blog.krusher.net/2017/06/desmontando-simcity-2000/</link>
					<comments>https://blog.krusher.net/2017/06/desmontando-simcity-2000/#comments</comments>
		
		<dc:creator><![CDATA[Krusher]]></dc:creator>
		<pubDate>Fri, 09 Jun 2017 16:23:57 +0000</pubDate>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Videojuegos]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[mod]]></category>
		<category><![CDATA[sc2000.dat]]></category>
		<category><![CDATA[simcity 2000]]></category>
		<guid isPermaLink="false">http://blog.krusher.net/?p=1525</guid>

					<description><![CDATA[<p>SimCity 2000 (Maxis, 1993) es uno de mis juegos superfavoritos de toda la vida. Llevo jugándolo como 20 años y es parcialmente responsable de mis horrorosas notas en el instituto. Modificar juegos siempre me ha gustado, pero hasta ahora no me había puesto en serio a decodificar los datos de este simulador de ciudades. ¡Y he hallado &#8230; <a href="https://blog.krusher.net/2017/06/desmontando-simcity-2000/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Desmontando SimCity 2000"</span></a></p>
<p>La entrada <a href="https://blog.krusher.net/2017/06/desmontando-simcity-2000/">Desmontando SimCity 2000</a> se publicó primero en <a href="https://blog.krusher.net">Detrás del último no va nadie</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>SimCity 2000</strong> (<strong>Maxis</strong>, 1993) es uno de mis juegos superfavoritos de toda la vida. Llevo jugándolo como 20 años y es parcialmente responsable de mis horrorosas notas en el instituto. Modificar juegos siempre me ha gustado, pero hasta ahora no me había puesto en serio a decodificar los datos de este simulador de ciudades. ¡Y he hallado varias cosas interesantes!</p>
<p>Existieron versiones en un mogollón de plataformas, desde el <strong>Macintosh</strong> (la original) hasta <strong>GameBoy Advance</strong>, pero mi favorita es la de <strong>MS-DOS</strong> y es sobre la que trata este artículo. Hay dos ficheros interesantes: el ejecutable (SC2000.EXE) y el fichero de datos (SC2000.DAT). Lamentablemente, la versión de <strong>Windows</strong> no salió en español, y la versión <strong>Network Edition</strong> que permitía juego en red funciona fatal (y también está sólo en inglés).<span id="more-1525"></span></p>
<h2>SC2000.EXE</h2>
<p>El ejecutable del juego no parece contener muchos recursos, pero sí que tiene algunos textos de la interfaz. En el editor hexadecimal se pueden ver algunas etiquetas de ancho fijo.</p>
<p><a href="https://blog.krusher.net/wp-content/uploads/2017/06/Sc2000-cadenasexe.png" data-rel="lightbox-gallery-d2gX6EBw" data-rl_title="" data-rl_caption="" title=""><img fetchpriority="high" decoding="async" class="aligncenter size-large wp-image-1526" src="https://blog.krusher.net/wp-content/uploads/2017/06/Sc2000-cadenasexe-1024x435.png" alt="" width="840" height="357" srcset="https://blog.krusher.net/wp-content/uploads/2017/06/Sc2000-cadenasexe-1024x435.png 1024w, https://blog.krusher.net/wp-content/uploads/2017/06/Sc2000-cadenasexe-300x127.png 300w, https://blog.krusher.net/wp-content/uploads/2017/06/Sc2000-cadenasexe-768x326.png 768w, https://blog.krusher.net/wp-content/uploads/2017/06/Sc2000-cadenasexe.png 1090w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></a></p>
<p>También hay algunos de ancho variable que corresponden a más etiquetas de la interfaz. También parece haber algunos ficheros empotrados, en los que por ejemplo se describen los escenarios del juego.</p>
<p><a href="https://blog.krusher.net/wp-content/uploads/2017/06/Sc2000-cadenasexe2.png" data-rel="lightbox-gallery-d2gX6EBw" data-rl_title="" data-rl_caption="" title=""><img decoding="async" class="aligncenter size-large wp-image-1527" src="https://blog.krusher.net/wp-content/uploads/2017/06/Sc2000-cadenasexe2-1024x435.png" alt="" width="840" height="357" srcset="https://blog.krusher.net/wp-content/uploads/2017/06/Sc2000-cadenasexe2-1024x435.png 1024w, https://blog.krusher.net/wp-content/uploads/2017/06/Sc2000-cadenasexe2-300x127.png 300w, https://blog.krusher.net/wp-content/uploads/2017/06/Sc2000-cadenasexe2-768x326.png 768w, https://blog.krusher.net/wp-content/uploads/2017/06/Sc2000-cadenasexe2.png 1090w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></a>Por ahora desemsamblar un ejecutable de hace cerca de 25 años no está entre mis especialidades, por lo que no he averiguado gran cosa. Los punteros no son evidentes en el ejecutable, por lo que dejado ahí. Pero la chicha está en el fichero de datos.</p>
<h2>SC2000.dat</h2>
<p>Este es el principal fichero de datos del juego. No tiene cabecera, pero un vistacillo en el editor hexadecimal arroja bastantes pistas sobre su estructura.</p>
<p><a href="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000.dat_.png" data-rel="lightbox-gallery-d2gX6EBw" data-rl_title="" data-rl_caption="" title=""><img decoding="async" class="aligncenter size-large wp-image-1528" src="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000.dat_-1024x435.png" alt="" width="840" height="357" srcset="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000.dat_-1024x435.png 1024w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000.dat_-300x127.png 300w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000.dat_-768x326.png 768w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000.dat_.png 1090w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></a></p>
<p>Resulta que desde el byte 0, lo primero que nos encontramos son bloques de 16 bytes que describen los ficheros contenidos en el paquete. El primer campo es evidente: son 12 bytes con el nombre del archivo (8 + 3 caracteres de los ficheros de MS-DOS más el punto). Si sobran caracteres, el resto de bytes son 00h.</p>
<p>Los cuatro restantes no tanto, pero resulta que el juego es original de <strong>Macintosh</strong>, que en aquella época usaba procesadores <strong>Motorola</strong>. Estos procesadores, a diferencia de los <strong>Intel</strong>, son <em>Little-Endian</em> (siendo <em>Big-Endian</em> los de <strong>Intel</strong>). Esto significa que los números de más de un byte se guardan ordenados del byte menos significativo al más significativo, en lugar del ordenamiento «natural». Se trata, pues, de un entero de 32 bits sin signo en formato <em>Little-Endian</em> en el que se codifica el <em>offset</em> (desplazamiento) del fichero cuyo nombre está justo antes.</p>
<p>La idea feliz sobre el <em>offset</em> se la debo a <a href="http://www.brettlajzer.com/36" target="_blank" rel="noopener noreferrer">Brett Lajzer</a>, un ingeniero de software de Albany que empezó antes que yo a investigar este fichero. Le escribí para intercambiar información y me advirtió sobre este punto, que no llegó a describir en su artículo.</p>
<p>El desempaquetamiento y empaquetamiento, sabido esto, resulta relativamente sencillo. He escrito un pequeño programa en Java que realiza esta operación:</p>
<pre class="brush: java; title: ; notranslate">
package sce2000;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.io.FileUtils;

public class Sce2000 {
	
	public static final String SC2000DAT = &quot;G:\\dos\\sce2000\\sc2000.dat&quot;;
	public static final int NUMFILES = 399;
	
	public static class Filestrut implements Serializable {
		private static final long serialVersionUID = 1L;
		public String filename;
		public int offset;
		public int targetOffset;
	}

	public static void main(String&#x5B;] args) throws IOException, ClassNotFoundException {
		
		if (args.length == 0) {
			info();
		} else if (&quot;x&quot;.equals(args&#x5B;0])) {
			extract();
		} else if (&quot;c&quot;.equals(args&#x5B;0])) {
			create();
		} else {
			info();
		}

	}
	
	public static void info() {
		System.out.println(&quot;Usage: x to eXtract or c to Create (after eXtract) + sc2000.dat file&quot;);
	}

	public static void create() throws IOException, ClassNotFoundException {
		
		File sc2000dat = new File(SC2000DAT);
		File metafile = new File(SC2000DAT + &quot;!/meta&quot;);
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(metafile));
		List&lt;Filestrut&gt; files = (List&lt;Filestrut&gt;) ois.readObject();
		
		List&lt;Byte&gt; targetFile = new ArrayList&lt;Byte&gt;();

		for (Filestrut file : files) {
			byte&#x5B;] fileNameBytes = file.filename.getBytes(StandardCharsets.US_ASCII);
			for (Byte myByte : fileNameBytes) {
				targetFile.add(myByte);
			}
			for (int i = 0; i &lt; 16 - fileNameBytes.length; i++) {
				targetFile.add((byte) 0);
			}
			//sourceFile.length();
		}
		
		int i = 0;
		for (Filestrut file : files) {
			byte&#x5B;] binary = Files.readAllBytes(Paths.get(SC2000DAT + &quot;!/&quot; + file.filename));
			int fileOffset = targetFile.size();
			for (Byte myByte : binary) {
				targetFile.add(myByte);
			}
			int filePointer = 12 + (16 * i);
			
			byte&#x5B;] offsetBytes = fromInt(fileOffset);
			targetFile.set(filePointer, offsetBytes&#x5B;0]);
			targetFile.set(filePointer + 1, offsetBytes&#x5B;1]);
			targetFile.set(filePointer + 2, offsetBytes&#x5B;2]);
			targetFile.set(filePointer + 3, offsetBytes&#x5B;3]);
			
			i++;
		}
		
		byte&#x5B;] binaryFile = new byte&#x5B;targetFile.size()];
		for (i = 0; i &lt; targetFile.size(); i++) {
			binaryFile&#x5B;i] = targetFile.get(i);
		}
		
		FileUtils.writeByteArrayToFile(sc2000dat, binaryFile);

		
		System.out.println();
		
	}
		

	public static void extract() throws IOException {
		
		Path sc2000dat = Paths.get(SC2000DAT);
		byte&#x5B;] data = Files.readAllBytes(sc2000dat);
		
		int vector = 0;
		List&lt;Filestrut&gt; files = new ArrayList&lt;Filestrut&gt;();
		for (int i = 0; i &lt; NUMFILES; i++) {
			
			Filestrut currfile = new Filestrut();
			
			currfile.filename =  convertFilename(Arrays.copyOfRange(data, vector, vector + 12));
			vector += 12;
			
			currfile.offset = fromByteArray(Arrays.copyOfRange(data, vector, vector + 4));
			vector += 4;
			
			System.out.println(&quot;Found file &quot; + currfile.filename + &quot; at &quot; + currfile.offset);
			
			files.add(currfile);
			
		}
		
		File dir = new File(SC2000DAT + &quot;!&quot;);
		if (dir.exists()) {
			FileUtils.deleteDirectory(dir);
		}
		
		dir.mkdir();
		
		Iterator&lt;Filestrut&gt; fileIt = files.iterator();
		
		Filestrut file = fileIt.next();
		Filestrut fileNext = null;
		
		boolean stop = false;
		while (!stop) {
			
			File extracted = new File(SC2000DAT + &quot;!/&quot; + file.filename);
			
			int init = file.offset;
			int end = -1;
			if (fileIt.hasNext()) {
				fileNext = fileIt.next();
				end = fileNext.offset;
			} else {
				end = data.length;
				stop = true;
			}

			System.out.println(&quot;Writing: &quot; + extracted.getAbsolutePath());
			FileUtils.writeByteArrayToFile(extracted, Arrays.copyOfRange(data, init, end));
			
			file = fileNext;
			
		}
		
		File metafile = new File(SC2000DAT + &quot;!/meta&quot;);
		
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(metafile));
		oos.writeObject(files);
		oos.close();
		
		System.out.println(&quot;OK!&quot;);
	}
	
	public static byte&#x5B;] fromInt(int number) {
		byte&#x5B;] bytes = ByteBuffer.allocate(4).putInt(number).array();
		swapEndianess(bytes);
		return bytes;
	}
	
	public static void swapEndianess(byte &#x5B;] bytes) {
		byte temp1 = bytes&#x5B;0];
		byte temp2 = bytes&#x5B;1];
		bytes&#x5B;0] = bytes&#x5B;3];
		bytes&#x5B;1] = bytes&#x5B;2];
		bytes&#x5B;2] = temp2;
		bytes&#x5B;3] = temp1;
	}
	
	public static int fromByteArray(byte&#x5B;] bytes) {
		// Change endianness
		swapEndianess(bytes);
		return ByteBuffer.wrap(bytes).getInt();
	}
	
	public static String convertFilename(byte&#x5B;] data) {
	    StringBuilder sb = new StringBuilder(data.length);
	    for (int i = 0; i &lt; data.length; ++ i) {
	        if (data&#x5B;i] &lt; 0) { 
	        	throw new IllegalArgumentException();
	        }
	        if (data&#x5B;i] == 0) {
	        	break;
	        }
	        sb.append((char) data&#x5B;i]);
	    }
	    return sb.toString();
	}


}
</pre>
<p>Este programa está hecho rápidamente y no está precisamente optimizado. He podido permitirme cargar o gestionar los ficheros enteros en memoria ya que el tamaño del DAT completo es de pocos megas. Además, tiene <em>hardcodeado</em> (incrustado en el código) el número de ficheros y la ruta al DAT. Mejorarlo lo dejo de deberes para el lector.</p>
<p>¿Por qué en Java? No es un lenguaje muy indicado para manejar binarios, y desde luego el no disponer de tipos sin signo no ayuda. Sencillamente lo hice en Java y no en C porque es el lenguaje con el que me gano la vida y con el que tengo más soltura, y llevo casi 8 años sin programar nada en C.</p>
<p>Usando el código anterior (o cualquier otro que el intrépido lector codifique) podemos ver los siguientes tipos de fichero:</p>
<ul>
<li>RAW, con imágenes sin cabecera.</li>
<li>PAL, con la paleta de colores que se usa en el juego.</li>
<li>Ficheros de texto, algunos TXT* sin extensión y otros con extensión RAW.</li>
<li>XMI, con la música.</li>
<li>VOC, con los efectos de sonido.</li>
<li>FNT, con las fuentes del juego.</li>
<li>Etc, etc&#8230;</li>
</ul>
<p>Hablemos un poco de cada uno.</p>
<h2>Ficheros VOC</h2>
<p>Los efectos sonoros del juego se almacenan en ficheros VOC. Bueno, ésta es fácil, ya que se trata de un formato no común pero ampliamente soportado por muchos editores de audio. Es un formato de <strong>Creative Labs</strong> que almacena principalmente audio codificado en PCM y ADPCM, aunque de forma puntual ha servido para otras codificaciones.</p>
<p><a href="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-vocs.jpg" data-rel="lightbox-gallery-d2gX6EBw" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-1531" src="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-vocs-1024x560.jpg" alt="" width="840" height="459" srcset="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-vocs-1024x560.jpg 1024w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-vocs-300x164.jpg 300w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-vocs-768x420.jpg 768w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-vocs-1200x656.jpg 1200w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-vocs.jpg 1920w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></a></p>
<p>Se puede abrir y guardar con <strong>Adobe Audition</strong> perfectamente. La frecuencia de muestreo varía de un fichero a otro, pero la reconoce sin problemas.</p>
<h2>Ficheros de texto</h2>
<p>Existen tres tipos de ficheros de texto. Los más sencillos son los ficheros in extensión TXT*, siendo * un número. Se pueden abrir con el <strong>Notepad++</strong> y editar sin problemas.</p>
<p><a href="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-txt.jpg" data-rel="lightbox-gallery-d2gX6EBw" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1532" src="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-txt.jpg" alt="" width="787" height="496" srcset="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-txt.jpg 787w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-txt-300x189.jpg 300w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-txt-768x484.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /></a></p>
<p>Bueno, no del todo. La codificación no es <strong>ASCII</strong>, ni <a href="https://es.wikipedia.org/wiki/Windows-1252" target="_blank" rel="noopener noreferrer">ANSI</a>, ni tampoco <strong>UNICODE</strong> porque aún no era común. ¿Cuál entonces? Pues, dado que el juego se programó para <strong>Macintosh</strong>, la codificación es <a href="https://en.wikipedia.org/wiki/Mac_OS_Roman" target="_blank" rel="noopener noreferrer">Macintosh Roman</a>. Esto es un problema porque <strong>Notepad++</strong> no da soporte a esta codificación. <a href="https://notepad-plus-plus.org/community/topic/11052/mac-encoding" target="_blank" rel="noopener noreferrer">Está pedido</a>, pero no parece prioritario, por lo que si quieres editar cómodamente hay que convertirlo antes.</p>
<p>Otros ficheros de texto son los STR*.RAW y *.RAW, siendo * un número. Su formato no es tan bonito.</p>
<p><a href="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-str.jpg" data-rel="lightbox-gallery-d2gX6EBw" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-1533" src="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-str-1024x435.jpg" alt="" width="840" height="357" srcset="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-str-1024x435.jpg 1024w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-str-300x127.jpg 300w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-str-768x326.jpg 768w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-str.jpg 1090w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></a></p>
<p>Al parecer el primer byte es siempre 00h, y el segundo parece almacenar el número de cadenas que hay en el texto. Las cadenas no son como las de C: en lugar de ser cadenas terminadas en 00h son cadenas precedidas de su longitud, codificada en 1 byte. Lo ideal para editar estos ficheros sería construir una utilidad al efecto, pero parece más que viable.</p>
<p>El tercer tipo de ficheros corresponde únicamente al fichero PPDT1003.RAW, que contiene una de las características más divertidas de <strong>SimCity 2000</strong>: los periódicos.</p>
<p><a href="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-periodicos.png" data-rel="lightbox-gallery-d2gX6EBw" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-1534" src="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-periodicos-1024x435.png" alt="" width="840" height="357" srcset="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-periodicos-1024x435.png 1024w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-periodicos-300x127.png 300w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-periodicos-768x326.png 768w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-periodicos.png 1090w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></a></p>
<p>Lamentablemente este formato es una pesadilla. Comienza con un diccionario de términos separados por 00h, y luego tiene una ristra de textos para generar los artículos. Esta codificación personalizada es de ancho variable (por ejemplo, 5C96h representa la letra ñ) y usa los términos definidos anteriormente, y naturalmente contiene marcadores de posición para los términos del artículo. Éstos se generaban proceduralmente, y un artículo que denunciaba la desaparición de un animal tenía como protagonista un gato o un rinoceronte, de la señora Dwight o del señor Martínez.</p>
<p>Antiguamente existían editores, como <a href="https://www.romhacking.net/utilities/217/" target="_blank" rel="noopener noreferrer">Thingy</a>, que daban soporte a ficheros TBL. En ellos se podía especificar un diccionario de términos (o toda una codificación) y editarlos «cómodamente». De todas formas sólo nos servirá si mantenemos el ancho de las cadenas, así que habría que descifrar el número que las precede (y su codificación) para poder editarlas como es debido. Parece bastante complicado, por lo que lo he dejado para mejor ocasión.</p>
<p><strong>Editado</strong>: Al parecer, los punteros para los textos de los periódicos están en el fichero PPDT1004.RAW. Consisten en conjuntos de 4 bytes en <em>Big-Endian</em>. Menudo lío.</p>
<h2>Ficheros de imagen</h2>
<p>Con la excepción de algunos ficheros usados para texto (descritos en el apartado anterior), los RAW son las imágenes usadas en la interfaz del juego. Los edificios y otros elementos están en unos ficheros DAT que quedan fuera del ámbito de este documento ya que se pueden editar mucho más fácilmente con el <strong>SimCity Urban Renewal Kit</strong> (SCURK), una herramienta que se incluía con versiones posteriores para editar ciudades «a manubrio» y modificar el aspecto de los edificios.</p>
<p>En lo que nos ocupa: estos ficheros RAW son mapas de bits con 8 bits por pixel (256 colores) con una cabecera de 4 bytes. No parece haber información sobre la resolución o los colores, pero para esto último existe un fichero, MINE.PAL, que especifica la paleta que usa el juego. No es un fichero de Microsoft Palette, como sugiere su extensión, sino una paleta en bruto tipo ACT. Casualmente, es el formato que usa preferentemente <strong>Adobe Photoshop</strong>.</p>
<p><a href="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-efecto2000.png" data-rel="lightbox-gallery-d2gX6EBw" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-1539" src="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-efecto2000-1024x462.png" alt="" width="840" height="379" srcset="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-efecto2000-1024x462.png 1024w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-efecto2000-300x135.png 300w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-efecto2000-768x347.png 768w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-efecto2000.png 1170w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></a></p>
<p>En cuanto a la resolución, no parece haber forma fácil de averiguarla simplemente mirando el archivo. Lo más sencillo es factorizar el número (menos 4 bytes) en dos múltiplos, cosa en la que el propio <strong>Photoshop</strong> nos puede asistir al abrir el archivo, al menos en versiones modernas. Por el nombre del fichero podemos más o menos discernir para qué sirve si no tenemos una idea, y si hemos jugado al juego (¡deberías!) podemos conocer más o menos su relación altura/anchura. Algunas son fáciles: la pantalla de título (TITLE.RAW) es una imagen de 640&#215;480 pixeles. Todas las imágenes usan la misma paleta, dado que el juego maneja 256 colores en todo momento.</p>
<p><a href="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-rwa.png" data-rel="lightbox-gallery-d2gX6EBw" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1538" src="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-rwa.png" alt="" width="369" height="477" srcset="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-rwa.png 369w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-rwa-232x300.png 232w" sizes="auto, (max-width: 369px) 85vw, 369px" /></a></p>
<p>Para editar los ficheros con color indexado en 8 bits siempre uso la misma técnica: las convierto a color de 24 bits + 8 de canal alfa y las edito cómodamente. Después, antes de salvarlas, las cambio a color indexado cargando la paleta del juego nuevamente. Sorprendentemente, salvando en formato <em>Adobe RAW</em> el juego las lee bien, dado que <strong>Photoshop</strong> permite conservar los 4 bytes de la cabecera. ¡Qué alivio!</p>
<p><a href="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-guardarraw.png" data-rel="lightbox-gallery-d2gX6EBw" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1540" src="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-guardarraw.png" alt="" width="946" height="653" srcset="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-guardarraw.png 946w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-guardarraw-300x207.png 300w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-guardarraw-768x530.png 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></a></p>
<p><strong>Nota</strong>: ni que decir tiene que este formato RAW no tiene nada que ver con los formatos de datos en bruto de las cámaras digitales.</p>
<h2>Ficheros XMI</h2>
<p>En los ficheros <a href="http://www.vgmpf.com/Wiki/index.php/XMI" target="_blank" rel="noopener noreferrer">XMI</a> se almacena cada una de las músicas del juego. El formato XMI soporta varias canciones por fichero, pero no parece ser el caso. La estructura es diferente a los MIDI, pero hacen prácticamenente lo mismo: almacenar notas y eventos musicales. Se pueden reproducir en <strong>Windows</strong> cómodamente con <a href="http://www.foobar2000.org/components/view/foo_midi" target="_blank" rel="noopener noreferrer">Foobar2000</a>, y es posible <a href="http://www.vgmpf.com/Wiki/index.php/XMI#Converters" target="_blank" rel="noopener noreferrer">convertir ficheros MIDI a XMI</a> (y viceversa). <a href="https://github.com/stascorp/MIDIPLEX" target="_blank" rel="noopener noreferrer">MIDIPLEX</a> parece hacerlo desde <strong>Windows</strong>, pero no se ofrecen binarios compilados y lo hice con herramientas más antiguas para <strong>MS-DOS</strong>, usando <strong>DOSBox</strong>. De todas formas, el propio <strong>SimCity 2000</strong> necesitará <strong>DOSBox </strong>para funcionar en sistemas modernos.</p>
<p><a href="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-xmi.png" data-rel="lightbox-gallery-d2gX6EBw" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1542" src="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-xmi.png" alt="" width="642" height="427" srcset="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-xmi.png 642w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-xmi-300x200.png 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /></a></p>
<h2>Ficheros FNT</h2>
<p>Presumiblemente las tipografías del juego, al juzgar por los nombres, los números que los acompañan y la extensión. No parece que sea mismo formato de fuentes en mapa de bits FNT para <strong>Windows</strong>, por lo que no he podido abrirlo con ningún editor.</p>
<h2>Otros</h2>
<p>Otros ficheros presentes en el paquete son fuentes General Midi para chipsets OPL, diversos índices y cabeceras para los conjuntos de gráficos de edificios&#8230; nada demasiado interesante para modificar el juego. Todo lo demás parece estar incrustado en el propio ejecutable, algo que está fuera de mi alcance.</p>
<h2>En Windows</h2>
<p>Como apunte, la versión de <strong>Windows</strong> es mucho más fácil de modificar. Los recursos de imagen y sonido están presentes en formato WAV y BMP, que son mucho menos oscuros que los descritos anteriormente. El resto de recursos se encuentra incrustado en el ejecutable del juego, pero con un editor de recursos se pueden extraer y modificar sin problemas, y en formatos más accesibles que los de <strong>MS-DOS</strong>. (Yo uso <a href="http://www.angusj.com/resourcehacker/" target="_blank" rel="noopener">Resource Hacker</a>, que es gratis y funciona bastante bien)</p>
<p><a href="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-reshack.png" data-rel="lightbox-gallery-d2gX6EBw" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1541" src="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-reshack.png" alt="" width="846" height="631" srcset="https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-reshack.png 846w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-reshack-300x224.png 300w, https://blog.krusher.net/wp-content/uploads/2017/06/sc2000-reshack-768x573.png 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></a></p>
<p>Los periódicos, sin embargo, parecen conservar el calamitoso formato de la versión de <strong>MS-DOS</strong>. Una pena porque hubiera sido interesante traducir esta versión al español.</p>
<p>Pues hasta aquí. Espero que haya sido muy educativo todo, aunque tras tanto tiempo no parece que el juego suscite mucho interés para ser modificado de ninguna forma. Siempre he querido tocar el juego y hacer mi propia versión, <em>SimCity efecto 2000</em>, un poco más gamberra, pero otra vez será.</p>
<p>La entrada <a href="https://blog.krusher.net/2017/06/desmontando-simcity-2000/">Desmontando SimCity 2000</a> se publicó primero en <a href="https://blog.krusher.net">Detrás del último no va nadie</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.krusher.net/2017/06/desmontando-simcity-2000/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
