26.7.18

Tutorial de juegos 'rpg' para Inform 7 - Acero (5) - Acciones

Hasta ahora tenemos una forma 'crear' personajes, obtener sus características, niveles de grupo de habilidad y porcentaje de habilidades, así como hemos creado lo necesario para poder hacer las tiradas; pero nos falta relacionar lo que 'ocurre' en la narración con las tiradas y sus resultados.

Desde luego podríamos usar las funciones que hemos creado hasta ahora para incluir verificaciones en cada una de las tiradas necesarias en todos 'Instead of' de la obra, de una manera similar a cómo informábamos del lanzamiento de flechas por parte de nuestro lagarto. Pero entonces tendríamos un código bastante feo y nada propio de Inform 7. ¿Cómo podemos hacerlo más natural?

Lo primero sería relacionar las acciones con la tirada que les corresponde, podríamos pensar en tablas para hacer esto, pero las 'acciones' en las tablas de Inform 7 están limitadas a definiciones de acciones concretas y nosotros necesitaríamos una relación con acciones genéricas, tal abiertas como sea necesarias. De forma que vamos a organizarlo mediante unas reglas nuevas 'validate roll', y así de paso aprendemos cómo usar libros de reglas nuevas. Nuestro objetivo será lograr algo como esto:

The last roll result is a skill roll result that varies.

Before doing anything:
  now last roll result is the skill roll result produced by the validate roll rules.
 
Before a character (called the actor) doing anything:
  now last roll result is the skill roll result produced by the validate roll rules.

Podemos usar una variable global porque Inform 7 sólo va a verificar una acción cada vez y 'doing anything' va a cubrir todas las acciones. Se puede ver que Inform 7 tiene acciones para el jugador y para los PNJs, así que tenemos que cubrir las dos. Las reglas de 'validate roll' se declaran de esta forma:

Validate roll rules is a rulebook producing a skill roll result.

Es decir, son reglas que actuarán sobre una acción y generan un resultado de tirada. Los valores por defecto serían:

Validate roll doing anything:
 rule succeeds with result success.
 
Validate roll a character (called actor) doing anything:
 rule succeeds with result success.

Es decir, si no definimos una verificación concreta a hacer cualquier acción tiene un éxito como resultado. Una verificación básica podría ser:

Validate roll jumping:
 rule succeeds with result the normal roll jump for the player. 
 
Validate roll a character (called actor) jumping:
 rule succeeds with result the normal roll jump for the actor. 

Y ya aquí nos encontramos con una dificultad, si corremos el juego e intentamos '>> salta'  os dará un error. Se debe a que el jugador ahora mismo no es un character y por lo tanto no tiene porcentajes en sus tiradas.

No es posible simplemente decir que el jugador es un personaje de tal o cual tipo porque el jugador y nace como un person y no se puede redefinir sobre la marcha. Para dar cualidades especiales al jugador en Inform 7 hay que crear un objeto de personaje nuevo y cambiar tras el inicio del juego el objeto del jugador por el que hemos creado para él, por ejemplo con:

The selected player is wolferm human in the explanada.

When play begins:
 let old player be the player;
 now the player is the selected player;
 remove old player from play.

Fijaos que lo he llamado 'jugador seleccionado', porque en realidad en el juego habrá que crear alguna clase de introducción que nos permita seleccionar o crear dicho personaje. Con esto ya funcionará el verbo salta para el jugador, claro que si queréis que se use la tirada del salto tendréis que crear reglas específicas sobre lo que pasa con el jugador cuando da un saltito. Eso os lo voy a dejar como ejercicio. Hagamos ahora que el lagarto dispare de 'verdad'. Lo primero es que en S3 cada arma tiene una dificultad de disparo diferente, así que tendremos que adelantar un poco del futuro capítulo de armas para poder definir la categoría de arco que el lagarto va a usar:

Chapter - Weapons

A weapon is a kind of thing.
A projectile weapon is a kind of weapon.
A bow is a kind of projectile weapon.
A long bow is a kind of bow.
A short bow is a kind of bow.
A composite bow is a kind of bow.

Y ahora ya le podemos dar al lagarto un arma haciendo esto:

El arco blanco is a long bow.
Sherack is carrying arco blanco.

Y ya podemos hacer una versión simplificada de las reglas de 'disparar', para el caso de 'arco largo' de esta forma:

 
Validate roll shooting a long bow:
 rule succeeds with result the difficult roll use bow for the player. 
 
Validate roll a character (called actor) shooting a long bow:
 rule succeeds with result the difficult roll use bow for the actor. 

Dado que disparar con el arco largo  en S3 es una acción dificil. Si añadimos un poco de maquillaje para verificar el resultado de la acción con:

Chapter - Definition for simplified the when for Insteads

To decide if success:
 if the last roll result is success:
  decide yes;
 decide no.
 
To decide if success completely:
 if  the last roll result is special success:
  decide yes;
 decide no.
 
To decide if failed:
 if  the last roll result is failure:
  decide yes;
 decide no.
 
To decide if failed completely:
 if  the last roll result is disaster:
  decide yes;
 decide no.

Ahora ya podemos escribir:

To say Sherack disparando:
 say "Sherack dispara contra la diana".

Instead of Sherack shooting when failed completely:
 say "[Sherack disparando], pero tan sólo consigue golpearse con la cuerda del arco en la mejilla.".
 
Instead of Sherack shooting when failed:
 say "[Sherack disparando], pero la flecha pasa por encima del muñeco.".
 
Instead of Sherack shooting when success:
 say "[Sherack disparando] y acierta en el muñeco de entrenamiento.".
 
Instead of Sherack shooting when success completely:
 say "[Sherack disparando] y acierta justo en entre los ojos del muñeco de entrenamiento.".

Véase como se pueden escribir frases de 'To say' para no repetir texto. Y ahora ya sólo tenemos que decirle al lagarto que dispare cada turno:

Every turn:
 try Sherack shooting arco blanco.

Pues ya tenemos una forma de añadir las tiradas necesarias para cada acción que ya podemos usar en nuestra historia. En la próxima entrega hablaremos de armas y, tal vez, armaduras.

El estado de 'acero' es este y el de la librería este.