Pengo. Sus últimos secretos

Para hablar de esos juegos de las recreativas que tanto nos gustaban
Avatar de Usuario
explorer
Commodore 128
Commodore 128
Mensajes: 114
Registrado: 11 May 2014, 17:10
Sistema Favorito: Atari ST
primer_sistema: Atari 800XL/600XL
consola_favorita: Atari 2600
Primera consola: Atari 2600
Ubicación: Valladolid, España
Gracias recibidas: 7 veces

Pengo. Sus últimos secretos

Mensajepor explorer » 25 Nov 2014, 22:46

Imagen

Este hilo es para contar los secretos que he descubierto al desensamblar el código del Pengo (Sega, 1982).
Por fin, este verano, me lo he tomado en serio, y ya lo he terminado. Falta por hacer dos o tres relecturas/modificaciones más de todo el código, pero lo importante ya está a la vista.

En el futuro, lo pondré todo junto en la web correspondiente. Lo que ya sabíamos (descrito en la hoja de manual de servicio y en el panel frontal de la máquina) está descrito en muchos sitios de Internet. Lo que sigue son detalles descubiertos exclusivamente mirando el código del juego.

Juego
  • Una fase no puede durar más de dos minutos de forma continua (es decir, sin que se produzca la muerte del jugador). A partir de ese momento, todos los Snobees pasan al modo "huida", incluso si aparecen recién salido de los huevos.
  • La duración de una fase (segundos que luego son convertidos en pts. al final del juego) es, desde que el Pengo empieza a moverse, hasta que termina de moverse y desaparecen los bloques. O dicho de otra forma: exactamente lo mismo que la duración de la melodía de juego. Esto quiere decir que no es necesario llevar el Pengo al centro de juego en el momento final, con el ánimo de acabar un segundo antes
  • El "tropiezo" del Pengo cuando termina la fase, es totalmente aleatorio (50 % de probabilidad)

Snobees
  • Los Snobees rompedores (los que tiene brazos) tienen predilección por seguir rompiendo en la misma dirección en que rompieron el bloque anterior, así que esa es la razón por la cual son capaces de destruir muros enteros. Y también es su debilidad ;)
  • Los Snobees tienen querencia en ir hacia el Pengo en función del número de fase y de "su" tiempo de vida: cuanto más tiempo lleva un Snobee en juego, más querencia tiene en ir hacia el Pengo.
  • El algoritmo de querencia es muy simple: calcular la diferencia en filas y columnas con el Pengo y elegir reducir la mayor de ellas. Esto implica que en las fases más altas, el Snobee hace un efecto de escalera para ir casi diagonalmente hacia el Pengo.
  • El movimiento general de los Snobees es el siguiente: eligen una dirección al azar (o por querencia, hacia el Pengo), y la mantienen durante un determinado tiempo. Cuando termina ese tiempo y llegan a una posición de pantalla que es múltiplo de bloque de hielo, deciden una nueva ruta. Si mientras se mueven a lo largo de ese tiempo, chocan contra un diamante o huevo escondido, toman la dirección contraria. Mientras tanto, su comportamiento normal es el de recorrer los pasillos. En concreto:
    • Si están completamente rodeados de bloques, se promocionan inmediatamente a rompedores
    • Si solo hay un camino, puede tratarse de un Snobee atrapado en un callejón. Tomará en cuenta las posiciones que recorre. Si al cabo de dos movimientos se repiten las posiciones, se promociona a rompedor (eso quiere decir que si metemos a un Snobee en un espacio de tres o más bloques libres, tardará en salir de allí)
    • Si hay dos caminos (pasillo), su tendencia es a seguir el pasillo
    • Si hay tres caminos posibles elije uno al azar, pero descartando la dirección por donde ha venido (evitar que el Snobee tenga un movimiento excesivamente errático)
    • Si hay cuatro caminos posibles (está en campo abierto), en el 50 % de los casos irá en dirección hacia el Pengo.
  • El tiempo de ese "recorrido" del Snobee depende del número de fase. Eso quiere decir que en las primeras fases los Snobees tienden más a ir por grandes rectas o seguir los pasillos del laberinto, mientras que en las fases más altas se están más tiempo pensando a dónde ir y por eso son más directos hacia el Pengo.
  • Los Snobees que están exactamente en la misma columna o fila que el bloque deslizante, tienen 3 comportamientos distintos. a) Si aún no han terminado su recorrido programado, seguirán tal cual. b) Pueden quedarse completamente quietos (misterio, ver más abajo). c) Aumentar la velocidad, huir en dirección contraria y escapar en el primer cruce que encuentren. Pasado el susto, vuelven a su estado anterior.
  • El gran misterio de la huida del último Snobee. Este es el algoritmo que determina ese momento:
    • Hay una rutina de interrupción que se ejecuta cada 1/61 de segundo. Entre otras cosas, lleva el contador de tiempo de juego (segundos/minutos/horas ¿horas?) y un contador aparte.
    • Cuando, en el juego, se da la circunstancia de que quedan 2 Snobees, en cada fase de animación del Snobee, se pone a cero ese contador. Esto se hace para lo que viene a continuación
    • Si sólo queda un Snobee, el contador no se reinicia.
    • A continuación se comprueba si el byte superior del contador es mayor o igual a 3, es decir, cuando 3*256/61 = 12.6 segundos, transforma el Snobee en uno que huye.
    Y aquí queda aclarado el misterio:
    • Si vamos eliminando Snobees uno a uno, cuando queden dos, el contador se inicializa. En cuanto eliminemos a uno de ellos, pasarán 12 segundos, y el último que quede, huirá.
    • En cambio, si cuando quedan 4 o menos Snobees, eliminamos a todos menos uno, éste huirá inmediatamente, debido a que el contador no ha sido inicializado (no hemos pasado por el momento de que quedaran exactamente 2 Snobees) y llevamos más de 12 segundos de la fase (que es lo más normal).
    Esto lo podemos aprovechar a nuestro favor, ya que sabemos entonces el momento exacto (más o menos) de cuándo huirá o también en los casos en los que quedan 3 o 4 Snobees, decidir si eliminar a todos ellos menos el último (poder controlarlo con los muros laterales mientras intentamos unir los diamantes).
  • La elección de la esquina donde va a escapar se elige de forma aleatoria.

Detalles técnicos
  • La generación de los laberintos, aunque parezca increíble, es aleatorio. Se utiliza un algoritmo básico de generación de laberintos, usando una máscara de bits (cada bit es un bloque de hielo), para su generación. Pero, lo más sorprendente, es que usa automodificación de código para crear los pasillos. Naturalmente, estamos hablando de un juego grabado en ROM, así que lo que hace el programa es reservar unos bytes en la RAM para crear allí el código que va a usar. Primero pondrá el código para preguntar si puede crear un pasillo, y luego lo sustituye por código que crea realmente el pasillo. Como las rutinas que controlan la creación de pasillos son las mismas que las que dicen si es posible crearlos, pues usa este truco para no tener que duplicar un montón de líneas de código.
  • El generador de números aleatorios sólo se ejecuta dentro de la fase de juego. Esto permite, por ejemplo, que en el modo attract del juego, se pueda reproducir una fase de juego (laberinto y movimientos de los Snobees). Este azar controlado permite mover a los Snobess (decisión de ir a por el Pengo, por qué lado, a qué lado rebotar en caso de llegar a un muro, a qué esquina escapar, etc.) O también, permite que algunas fases se puedan resolver siguiendo un patrón de acción. Esa es la explicación de por qué da la sensación de que el número de escenarios es limitado, o por qué los huevos y diamantes están siempre en las mismas posiciones.
  • La velocidad de reproducción de la melodía, durante el juego, depende del número de Snobees. Al principio del juego se pone a una determinada velocidad por defecto. Cada vez que se mata un Snobee y hay que generar un nuevo huevo, se comprueba si el número restante de Snobees es menor que [(el número de fase-1)/4+4] (resulta un valor entre 4 y 7). Si es así, se acelera. También, cuando un Snobee entra en modo huida, al final de la partida, se acelera aún más.
  • Cuando disparamos un bloque de hielo, hasta que no se detiene no podemos empujar otro. Esto es una limitación del hardware que solo tiene 6 sprites: 4 para los Snobees, 1 para el Pengo y otro más para el bloque de hielo deslizante. Esto es una desventaja tremenda para el Pengo, sobre todo si dispara bloques en vertical. Puede tardar mucho en poder golpear un muro o romper un bloque o disparar otro bloque.
  • Un bloque de hielo, mientras se rompe, tiene 8 fases de animación:
    Imagen
    Bueno, pues es en el quinto cuadro de animación cuando se considera que el bloque "ya no está". El Pengo no puede atravesarlo hasta que desaparezca del todo, pero sí podemos empujar un bloque a través de él para pillar a los Snobees que estén al otro lado (o rompiendo ese mismo bloque). Es "fácil" distinguir visualmente ese cuadro: es el que ya no tiene "hielo" en la parte superior (primera fila)

Curiosidades
  • El número máximo de bloques de hielo que se pueden romper a la vez, es de 6. Se puede ver, en las fases más altas, que en ocasiones queremos romper un bloque, y no podemos. Eso sucede bajo la siguiente circunstancia (muy rara, pero posible): los cuatro Snobees están rompiendo bloques, y el Pengo rompe en rápida sucesión dos bloques e intenta hacerlo una tercera vez. En ese momento, se observa que no se puede romper.
  • El juego tiene errores de programación. Pocos, pero hay alguno. El más desagradable sucede cuando desajustamos la cuenta de Snobees, que suele suceder cuando rompemos el bloque de hielo que contiene un huevo que está justamente eclosionando. Eso puede provocar que se desajusten los 3 (¡tres!) contadores de Snobees en juego, y que la fase no termine nunca (salen Snobees de forma indefinida. Mejor dicho: saldrán 255 Snobees más, pero no hay suficientes bloques para matarlos a todos). Otro error de programación es que a los Snobees se les prohíbe entrar en la misma columna o fila en donde está deslizándose el bloque que hemos empujado. Pues bien: el algoritmo no está completo, por lo que los Snobees sí entran, y podemos pillarles.
  • La posición de inicio del Pengo, no es fija. Si da la casualidad que en la posición donde debe aparecer, hay un bloque que contiene un huevo o un diamante, el programa prueba a ver si puede colocar el Pengo en los bloques superior, inferior, derecho o izquierdo. Y si no puede, entonces mira las cuatros esquinas de ese conjunto de 3x3 bloques. Y si no puede... pues no está contemplado en el programa :D
  • El conseguir los bonos al juntar los diamantes tiene un efecto colateral: los huevos que aún queden escondidos parpadearán durante el resto de la fase, lo cual es una gran ventaja.
  • Casi nadie lo sabe, pero... es posible ver a más de un Snobee huyendo :) Solo hay que esperar 2 minutos a que suceda la desbandada.
    Imagen
  • Al final de la fase, cuando se acaba de matar al último Snobee o éste ha huido por una esquina, el mayor número de bloques de hielo que se pueden romper antes de que termine la fase, es de 4 (muy difícil, pero posible).
  • Los diamantes son irrompibles, pero hay situaciones donde se pueden romper. Una de ellas es lanzar el diamante sobre un Snobee que está rompiendo un bloque. Si el diamante ocupa la posición del bloque de hielo que se estaba rompiendo, desaparecerá. Pero sus coordenadas siguen almacenadas. Eso quiere decir que aún será posible unir los otros dos bloques al lado de esa posición, y obtener los bonos.
  • La fase más difícil es la 13, no la 16 (esto depende del nivel de dificultad y de la versión de juego). Se debe a que en la 14, 15 y 16, los Snobees están más quietos pensando a dónde ir. Casi siempre irán hacia el Pengo, pero el nivel de fase les hace "pensar" en cada posición de bloque, por lo que serán más propensos a tomar curvas o dejar de perseguir el Pengo (Nota personal: para mi, la fase más difícil es la 17, es decir, la 1 de la siguiente vuelta, ya que la diferencia de agresividad de los Snobees te hace bajar la guardia :D).
  • El logotipo "Pengo" en grande, está compuesto en caracteres, en un esquema comprimido muy parecido a una codificación RLE. Todo por la limitación de 256 caracteres posibles. Cuando aparece la escena del banco de hielo, se usa un banco secundario de otros 256 caracteres.
  • Por todo el código hay controles antipiratería. Se comprueba si ciertas posiciones de memoria contienen un determinado valor, y si no es así, reinicia el juego. Esto no es un gran impedimento para modificar puntualmente el juego y crear una nueva versión del mismo.
  • Hay "código basura" :) Trozos de código que nunca se llaman. Son los restos del código que se usó para grabar la partida de demostración.

Misterios sin resolver
  • En algunas ocasiones, cuando un Snobee está en la misma columna o fila que el bloque deslizante, se queda paralizado. Ese comportamiento no está detallado en el código, así que... se trata de una "feature" :) de la que aún tengo que descubrir si se trata de algo previsto por el programa o algún error.

Huevo de Pascua
  • El "huevo de Pascua" lo descubrí hace años cuando empecé a desensamblar. Esto es lo que sale:
    Imagen
    La forma de sacarlo es así: en el modo attract (fuera del juego, cuando se está reproduciendo la demo del juego), poner los dos joysticks hacia arriba, pulsar los dos botones de acción, y uno de los botones de inicio de juego. Se mostrarán los créditos del juego. Después de unos segundos, el juego se reiniciará. La espera se puede abreviar pulsando el botón de inicio del primer jugador.

Recomendaciones para jugar
  • Este juego es de los más frustrantes que conozco. Si os gusta, pues bien, pero tomároslo con calma.
  • A partir de 500 000 puntos podéis estar en el escalafón de la fama de máximas puntuaciones. El récord está en 1 200 000, aprox. Mi récord personal es de 980 420:
    Imagen
  • El marcador de la puntuación sólo llega a los 655 350 puntos y luego vuelve a cero, por lo que en las competiciones es necesaria la presencia de un árbitro.
  • Es mejor no estar "muy encima" de la pantalla. Es preferible tener la imagen de juego un poco alejada para que la tengamos presente en todo nuestro campo visual (reducir el movimiento de ojos al mínimo).
  • Después de jugar muchas partidas, una de las primeras cosas que se olvida es tener conciencia de en qué fase estamos, y se trata de algo muy importante. Hay que recordar que el nivel de dificultad aumenta notablemente en las fases 5 (alias "tropezón"), 9 (alias "fatídica") y 13 (alias "muerte segura").
  • Hay una forma de romper y empujar los bloques de hielo muy rápida: pulsando el botón de acción mientras el Pengo llega a la posición de bloque (no esperar a estar junto al bloque que queremos deslizar).
  • La mejor forma de escapar de un grupo de Snoobees es haciendo zigzag, en diagonal. Requiere de una enorme habilidad para moverse en múltiplos de bloque, pero se puede hacer. El objetivo es salir de la misma columna o fila que ocupan los Snobees, ya que tienen más probabilidad de seguirnos si es así.

Futuro
Estoy en conversaciones con otros autores que han publicado códigos de otros juegos, como por ejemplo el MSPacman, para ver si podemos coordinar esta labor, por ejemplo en una web. De momento, el código se publica en GitHub. El mío todavía no está ni presentable, pero al menos genera una copia literal del pengo2u.

Queda por realizar la investigación de las diferencias -que las hay- entre las otras tres variantes del juego (pengo, pengo2, pengo3 y pengo4).

Ejemplos de diferencias:
  • En el Pengo normal, pasa un minuto hasta que un Snobee se convierte en rompedor. Y cada minuto que pase se volverá más peligroso. En el pengo2, en cambio, aparecen Snobees rompedores inmediatamente.
  • En el Pengo normal, tienes 7/8 de posibilidades de que el Snobee te persiga si está justo a tu lado (horizontal o verticalmente). Si no, se comportará de forma normal. En pengo2, son más agresivos, se dirigen más hacia el Pengo.


Cuando lo tenga algo más decente, publicaré el código.
Si queréis hacer alguna pregunta sobre el juego, con gusto la intentaré responder.
Última edición por explorer el 11 Jun 2017, 00:09, editado 17 veces en total.

Avatar de Usuario
JoJo
Amiga 1200
Amiga 1200
Mensajes: 1041
Registrado: 03 Feb 2008, 22:45
Sistema Favorito: PC
primer_sistema: PC
consola_favorita: Nintendo SNES
Primera consola: (Otro)
Gracias dadas: 9 veces
Gracias recibidas: 29 veces

Re: Pengo. Sus últimos secretos

Mensajepor JoJo » 25 Nov 2014, 23:57

Muy muy interesante, siempre me ha encantado este juego y me ha encantado leer tantas curiosidades.

Ya te avisaras cuando publiques el codigo, siempre es interesante echarle un ojo :)
PCP, el microcomputador de proposito general de 32 bits.
http://www.vieju.net

Avatar de Usuario
Mode2
Amiga 2500
Amiga 2500
Mensajes: 2611
Registrado: 08 Oct 2009, 23:53
Sistema Favorito: Amstrad CPC
primer_sistema: Amstrad CPC
consola_favorita: Atari 2600
Primera consola: TV Games/Pong Clone
Ubicación: The Grid
Gracias dadas: 1 vez
Gracias recibidas: 2 veces
Contactar:

Re: Pengo. Sus últimos secretos

Mensajepor Mode2 » 26 Nov 2014, 10:46

Digo lo mismo que Jojo, ¡gran trabajo! =D>
BUSCO: Saturn, Micromanía 1 y 25, Amstrad user 25 y 32, Amstrad Semanal, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, Everdrive SNES, manual +3, manual CPC664.

Avatar de Usuario
6128
Amiga 2500
Amiga 2500
Mensajes: 2739
Registrado: 27 Ene 2010, 18:06
Sistema Favorito: Amstrad CPC
primer_sistema: Amstrad CPC
consola_favorita: Sega Genesis/Megadrive
Primera consola: Sega Genesis/Megadrive
Ubicación: León
Gracias dadas: 25 veces
Gracias recibidas: 14 veces

Re: Pengo. Sus últimos secretos

Mensajepor 6128 » 26 Nov 2014, 11:22

Muy interesante el patrón que siguen los Snobees. Y muy útil.

A este juego jugué poco o nada en recreativa, pero le di bastante caña al Troglo de Amstrad CPC que es una conversión no oficial del Pengo (existen varias más para CPC). Es un juego que con paciencia consigues avanzar algo pero como la mecánica es tan repetitiva puedes desmotivarte rápidamente. Vamos, igual que el Pac-Man. típico juego que merece la pena jugar unos 5 minutos o así y te lo pasas genial.

Avatar de Usuario
josepzin
Amiga 2500
Amiga 2500
Mensajes: 2741
Registrado: 12 Ene 2009, 14:36
Sistema Favorito: C64
primer_sistema: ZX81
Ubicación: Carthagonova
Gracias dadas: 1 vez
Gracias recibidas: 7 veces
Contactar:

Re: Pengo. Sus últimos secretos

Mensajepor josepzin » 26 Nov 2014, 11:50

Fan-tas-ti-co!!!

Me encantó leer todos y cada uno de esos puntos!

Pengo fue uno de los poquísimos juegos que metí monedas en su momento :-)

Cómo es eso de hacer una web? Quizás pueda ayudar.

Avatar de Usuario
commodoro
Amiga 1200
Amiga 1200
Mensajes: 1278
Registrado: 17 Abr 2010, 17:32

Re: Pengo. Sus últimos secretos

Mensajepor commodoro » 26 Nov 2014, 12:30

¿Sabeis si alguien ha desensamblado el Moon cresta?

¿Y aunque ya se que no el destroyer de cidelsa?

Avatar de Usuario
josepzin
Amiga 2500
Amiga 2500
Mensajes: 2741
Registrado: 12 Ene 2009, 14:36
Sistema Favorito: C64
primer_sistema: ZX81
Ubicación: Carthagonova
Gracias dadas: 1 vez
Gracias recibidas: 7 veces
Contactar:

Re: Pengo. Sus últimos secretos

Mensajepor josepzin » 26 Nov 2014, 13:05

La próxima vez que juegue al Pengo me pasaré antes a leer estas pautas de comportamiento, seguro que ayudan bastante a predecir los movimientos de los enemigos.

Avatar de Usuario
jotego
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 629
Registrado: 16 Ene 2013, 23:25
Sistema Favorito: Atari ST
primer_sistema: Amstrad CPC
consola_favorita: Sony PlayStation 2
Primera consola: Atari Lynx
Ubicación: Valencia (España)
Gracias dadas: 19 veces
Gracias recibidas: 25 veces

Re: Pengo. Sus últimos secretos

Mensajepor jotego » 28 Nov 2014, 11:34

¡Fantástico trabajo! Muy interesante. Estoy deseando ver el código publicado con sus comentarios correspondientes. Por cierto, ¿cómo está el tema de los derechos de autor en este caso?

Yo estoy haciendo lo mismo con el código del Ghosts'n Goblins. Es un proyecto intermitente pero cada vez que veo que lo voy a dejar una temporada documento bien el progreso para poder seguir. La próxima vez que lo cojo sigo por donde me quedé. Acumulando poco a poco, algún día llegaré al final :-)

¿Sabéis de alguna web que publique código desensamblado y comentado de algún arcade?

Avatar de Usuario
web8bits
Atari 1040 STf
Atari 1040 STf
Mensajes: 695
Registrado: 14 May 2004, 22:07
Gracias dadas: 4 veces

Re: Pengo. Sus últimos secretos

Mensajepor web8bits » 28 Nov 2014, 13:38

Buenísimo trabajo, gracias por compartirlo.

Avatar de Usuario
explorer
Commodore 128
Commodore 128
Mensajes: 114
Registrado: 11 May 2014, 17:10
Sistema Favorito: Atari ST
primer_sistema: Atari 800XL/600XL
consola_favorita: Atari 2600
Primera consola: Atari 2600
Ubicación: Valladolid, España
Gracias recibidas: 7 veces

Re: Pengo. Sus últimos secretos

Mensajepor explorer » 28 Nov 2014, 18:21

jotego escribió:¡Fantástico trabajo! Muy interesante. Estoy deseando ver el código publicado con sus comentarios correspondientes. Por cierto, ¿cómo está el tema de los derechos de autor en este caso?
Pues... mal. Aunque estamos hablando de un juego hecho hace 32 años, Sega sacó una versión de Pengo para 8 jugadores hace cuatro años, así que digamos que sigue disfrutando de la marca.

Lo que hay que hacer es ponerse en contacto con Sega y pedir permiso para publicar el código, pero lo más seguro es que digan que no. De todas maneras, preguntaré a gente más experta. Ha sido un trabajo tremendo. Lo que se llama ahora arqueología informática, pero otros lo pueden considerar ingeniería inversa, y eso está perseguido penalmente en algunos países.

El proceso de creación también ha sido especial, ya que me he asegurado en cada paso que el código ensamblador generaba una copia exacta del programa grabado en ROM, y eso quizás merecería un mensaje nuevo, no sé si en este hilo, en este foro, o mejor en el de programación. Puede servir para animar a otros en esta labor. O de conocer maneras más cómodas.

jotego escribió:Yo estoy haciendo lo mismo con el código del Ghosts'n Goblins. Es un proyecto intermitente pero cada vez que veo que lo voy a dejar una temporada documento bien el progreso para poder seguir. La próxima vez que lo cojo sigo por donde me quedé. Acumulando poco a poco, algún día llegaré al final :-)
El caso es que trabajar solo está siendo algo del pasado. Lo más moderno sería trabajar en equipo, usando bien herramientas de trabajo colaborativo, o más cómodo, algo tan sencillo como git, en web como Github. Si el código se puede partir en bloques, pues más fácil repartir el trabajo.

jotego escribió:¿Sabéis de alguna web que publique código desensamblado y comentado de algún arcade?
Oficialmente, no conozco ninguna, por lo comentado antes, pero... con quien he contactado es con Scott Lawrence, alias BleuLlama, que lleva años con estos temas, con documentación de las placas Pacman/Pengo y enlaces a herramientas para ayudar en el desarrollo de programas para las mismas. Hace unos años que tiene cuenta en Github, y allí es donde tiene publicados los códigos de algunos juegos, como el MSPacman (Miss Pacman) y el E.T. para la 2600. Me ha ofrecido ese espacio para publicar mi código, y casi seguro que lo haga así. Pero también le he comentado que debería haber una página dedicada a este tema. He estado buscando y no he encontrado nada.

Edito: Acabo de encontrar esta curiosa página de Wikipedia: List of commercial video games with available source code. Ahí se ven programas que sí tienen publicado su código, acompañado de su correspondiente licencia.


Volver a “Videojuegos arcade”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado