Roll the dice [Como se hizo]


Quizá el de los dados sea uno de los juegos más sencillos de la historia. Aun con sus muchas variantes, consiste básicamente en lanzar un dado y sacar un número mayor que el de tu contrincante. Es por eso que decidí que en mi periplo por el aprendizaje de Twine, implementaría un sencillo juego de dados en el que el jugador tendría que enfrentarse a distintos oponentes, en su lucha por representar a la raza humana en un posterior Torneo Intergaláctico en el que la Tierra se jugaba su existencia. Una historia simplona como la de cualquier otro Tomb Raider.

Antes de pensar siquiera en cómo iba a hacerlo, y repasando mi libro sobre Twine (Twine. Una aproximación al desarrollo de literatura interactiva) me llamó la atención la plantilla "La historia interactiva de la Tierra", que divide la pantalla en dos recuadros, en uno de los cuales, se pueden ir cambiando las imágenes a mostrar. Esto me venía de perlas a la hora de mostrar la cara de los distintos contrincantes, por lo que al elegirla, me tuve que ceñir al Formato de historia Sugarcane. Sí que podría haberla adaptado a Sugarcube, por ejemplo, pero no quería perder tiempo en otra cosa que no fuera desarrollar el minijuego (me da vergüenza llamar a esto "juego").

Decidí usar Twine 1.4 en lugar de su versión avanzada, porque iba a utilizar muchas imágenes, y me era más sencillo importarlas al programa que subirlas a una web y luego enlazarlas.

Dio la casualidad de que al poco de ponerme manos a la obra, descubrí la existencia de la web https://thispersondoesnotexist.com/ en la que una inteligencia artificial crea imágenes de rostros humanos de personas que no han pisado jamás la Tierra. O eso se supone. Imágenes perfectas para librarme de denuncias por usar la cara de cualquier fulano sin permiso.  Por aquello de evitar el valle inquietante, usé el programa PixaTool para modificarlas y convertirlas a la paleta verdiblanca de GameBoy, lo cual le confería un aspecto más "jugable". Hice lo mismo para el resto de imágenes que usaría.

Una de ellas la usaría en la pantalla de inicio. Decidí crear una para poner el logo del juego y en la caja de texto, un simple enlace que instara al jugador a hacer click para empezar. Para ello, definí el pasaje Start de la siguiente forma, siendo representados el nombre de un pasaje por ::

:: Start
Label Textura
<center>[[Pulsa para comenzar|INICIO]]</center>

Siendo "Textura" un pasaje CSS con el siguiente contenido:

.passage .header {
  background-image: [img[texture838]];  //Texture838 es el nombre de la imagen que importé
  width:70%;
  height:320px;
  min-height: 320px;
}

De tal forma, se creaba un nuevo pasaje "inicio" en el que comenzar la aventura. Tras escribir una historia más o menos funcional para salir del paso, surgieron varios desafíos:

. La idea original consistía en tener un plantel de 9 personajes contra los que jugar, de los que solo veríamos 3 en cada partida, para hacerlas algo más aleatorias y rejugables.

. Tenía que hallar la forma de simular las tiradas sin tener que estar escribiendo código para cada rival y tirada. Sugarcube me hubiera venido bien pero, como dije, por el tema de la plantilla CSS no era una opción.

Para lo primero haríamos uso de la función "either", de tal forma que a la variable $con  (de contrincante) le asignaríamos cualquier valor de entre la lista que definamos; en este caso, los nombres de los pasajes correspondientes a cada jugador.

<<set $con to either("jugManolo", "jugAde", "jugsuckie", "jugSonrisas", "jugPablito", "jugTuercas", "jugPurito", "jugsvetlana", "jugramiro")>>

. Ir a [[Prueba|$con]]

Así, cuando pulsemos en el texto "Prueba", nos llevará a un pasaje aleatorio de entre la lista lista de "either".

Desde el pasaje de cada enemigo se llamará al pasaje responsable de las tiradas de dados, que se reutilizará con todos los demás. El pasaje encargado de las tiradas quedaría de la siguiente forma:

<<set $tirada = random(1,6)>>  //se simula la tirada eligiendo un número aleatorio entre 1 y 6
Has sacado un <<print $tirada>> //Se muestra en pantalla el resultado

<<set $tiradamalo = random(1,6)>>  //lo mismo para el oponente
Tu contrincante ha sacado un <<print $tiradamalo>>

//aquí se comprueba quién ha sacado una mayor puntuación y se actualizan las variables de los asaltos pues el que gane 2 de 3 ganará la partida.
<<if $tirada > $tiradamalo>>
¡Has ganado el asalto!
<<set $puntos+=1>>
<<if $puntos == 2>>
<<set $contrincante +=1>>
¡Has ganado, maldito suertudo! Ahora vuelve a la [[arena]]
<<else>>
[[Es hora de tirar de nuevo|tiradatu]]
<<endif>>
<<endif>>

<<if $tirada < $tiradamalo>>
¡Has perdido el asalto!
<<set $puntosmalo+=1>> //se actualizan los puntos del rival
<<if $puntosmalo == 2>> //se comprueba si hemos perdido el juego
¡Has perdido, desgraciado! No mereces seguir viviendo pero qué demonios, tampoco vamos a manchar esto de sangre. Firma [[aquí|gameover]] para terminar.
<<else>>
[[Es hora de tirar de nuevo|tiradatu]] //si aun no se ha conseguido los puntos necesarios para ganar, se sigue tirando.
<<endif>>
<<endif>>

<<if $tirada == $tiradamalo>>
¡Habéis empatado!
[[Tendréis que tirar de nuevo|tiradatu]]
<<endif>>

El resto es sencillo y no se trata más que de escribir la pantalla de Game Over y de victoria en el juego. Un apunte más, para cambiar las imágenes de cada rival, importaremos sus fotos, crearemos una hoja de estilo para cada una de la siguiente forma:

::susan
tag stylesheet suckiesusan

.passage .header {
  background-image: [img[suckiesusan]];
}

y en el pasaje en que queramos que aparezca dicha imagen, en el campo "tag" tendremos que poner el nombre de la hoja de estilo, en este caso "suckiesusan", que aparece junto a stylesheet, en el campo "tag".

Habría muchas mejoras por hacer, comenzando por la posibilidad de eliminar de la lista los rivales contra los que nos hemos enfrentado, pero en este nivel de aprendizaje, prefería centrarme en terminar el juego y seguir con otra cosa.