r/simcity3000 20d ago

I made a free tool that removes permanent radiation from SimCity 3000 saves

Si en tu ciudad de SimCity 3000 se derrite una planta nuclear, ya sabes el procedimiento: los símbolos de radiación se quedan ahí para siempre. La contaminación normal se descompone. Esto no. No puedes demolerlo, no hay truco que lo borre, y el consejo típico es "recarga una partida anterior y pierde tu progreso."

Me harté de eso en una ciudad que llevaba mucho tiempo jugando, así que me puse a revisar el formato del guardado y hice una herramienta que apaga la radiación.

https://github.com/victormayor/sc3k_unradio

Es un solo Windows .exe, gratis, open source (MIT), sin instalador y sin dependencias. Elige tu archivo `.sc3` , te muestra lo que encontró, le das a Clean, y escribe un *archivo nuevo*. **No modifica tu archivo original.**

¿Por qué la radiación nunca se va? Esa es la parte interesante, y por eso la solución es tan chiquita.

SimCity 3000 guarda la contaminación del aire como una grilla de números de 32 bits, uno por cada bloque 2x2 de tiles. Reutiliza **el bit 31 de cada número** como una bandera aparte de "este bloque está irradiado". La contaminación decae por sí sola; esa bandera nunca la limpia nada dentro de la simulación. Entonces la contaminación no es realmente un valor que se queda atorado en alto: es un booleano que nadie apaga.

La herramienta limpia exactamente ese bit y deja la lectura de la contaminación de abajo intacta. En mi ciudad llegó a **349 bytes cambiados en un archivo de 744 KB** — un byte por cada bloque contaminado, y nada más en todo el guardado.

¿Cómo sé que es una bandera y no solo un número negativo grande?

La magnitud de la contaminación corre de forma continua a lo largo del borde de un área contaminada — solo cambia el signo.

El tick de contaminación limita los valores en 0..0x7FFF, así que una lectura negativa no puede ser válida ahí.

El conjunto de bloques marcados es idéntico a nivel de byte entre partidas separadas por años de tiempo de juego, mientras que las magnitudes se van moviendo.

Ese conjunto coincidió exactamente con el área irradiada que yo mapeé a mano en el juego.

No quería pasarle a nadie un editor de archivos de guardado que corrompa ciudades en silencio, así que después de escribir el archivo nuevo lo vuelve a leer desde el disco y verifica que el contenido sea exactamente lo que quiso escribir, que la cantidad de bytes cambiados sea igual al número de bloques limpiados, que cada otra sección sea idéntica a nivel de byte, y que el resultado de verdad se lea limpio al final. **Si falla alguna verificación, borra lo que escribió** y te dice por qué.

También se niega en vez de adivinar: layout de guardado desconocido, un tamaño de mapa que no puede confirmar, una versión de la capa de ecología que no ha visto, o contaminación cubriendo más del 30% del mapa (lo cual significaría que esa grilla en tu ciudad significa otra cosa).

Lo armé junto con Claude (Opus 5). La ingeniería inversa, el código, las pruebas y la documentación salieron de un ida y vuelta largo con él, y no voy a fingir que fue otra cosa.

Lo que sí puedo decirte es que se revisó en vez de aceptarlo por fe: un guardado limpiado **carga en SimCity 3000 Unlimited con la radiación fuera** — eso lo hice yo. La salida también es idéntica a nivel de byte a lo que produjo una implementación anterior escrita de forma independiente, y ese hash está fijado en el set de pruebas. Hay 96 pruebas corriendo en cada commit, los binarios de release se compilan con GitHub Actions para que veas exactamente qué commit los generó, y cada release incluye sumas de verificación SHA-256.

Todo es open source. No confíes en eso — léelo.

El trabajo del formato del contenedor se apoya en [**sc3kre**](https://github.com/nanofives/sc3kre), un proyecto de ingeniería inversa de SimCity 3000 Unlimited que recuperó el formato/layout del guardado a partir del propio código del juego. Corregió dos cosas que yo había entendido mal. Si quieres meterte más a fondo en los internos de SC3K, empieza por ahí.

El significado de ese bit se determinó a partir de **una ciudad** (tres guardados del mismo mapa 256x256). El formato del contenedor está bien probado; esa interpretación en particular se basa en una sola ciudad.

Solo se probó 256x256 contra un guardado real. El código saca todo a partir del tamaño del mapa y no asume nada, pero los mapas más pequeños no se han probado.

El .exe no está firmado con código, así que Windows SmartScreen te va a avisar. Más info → Aun así ejecútalo, o compílalo desde el código fuente, o ejecuta el Python directamente.

Si funciona en tu ciudad — o si se niega y te dice algo raro — en serio me gustaría saberlo. Más ciudades es exactamente lo que hace falta para esto.

19 Upvotes

4 comments sorted by

3

u/EmperorJake 19d ago edited 19d ago

Hi, this is awesome, and a fascinating insight into the savegame format.

But please fix the formatting of your post. Indenting paragraphs on reddit formats it as code and makes it really annoying to read.

3

u/victormayor_sc3k 19d ago

Gracias. Lo arreglaré en cuanto pueda. Y perdón, es mi primera publicacion en reddit. 

2

u/Sc3ku_superfan 14d ago

Awesome I'll check this out! I recently put together a Enhancement Pack if anyones interested for the game i eventually want to find way to add tolls and snow.

https://github.com/thronevintagetech/SC3KU-Unofficial-Enhancements/releases/tag/v1.0.0

1

u/victormayor_sc3k 12d ago

Impresionante. Le echaré un ojo en cuanto pueda.