14.7.18

Tutorial de juegos 'rpg' para Inform 7 - Acero (4) - Tiradas

En la anterior entrega vimos como en S3 se calculan los porcentajes de cada una de las habilidades y cómo esto se podría trasladar a la extensión que estamos haciendo; pero aún nos quedan dos pasos más que dar. Lo primero es conocer cómo se hace la tirada de éxito en sí. Es decir, en una partida de tablero como tal si un jugador intenta digamos que acertar algo con una flecha, ¿qué tira y cómo sabe si ha tenido éxito o no? Lo segundo que nos falta es ver cómo aplicar estas tiradas a las 'acciones' de una obra interactiva de parser.

Veamos lo primero. Las tiradas de acción en S3 se hacen lanzando un d%, es decir, dos dados de diez caras en los que se ha escogido cuál es el dado de las unidades y cuál es el de las decenas. La regla básica es muy simple, si la tirada es igual o menor que el porcentaje es un éxito y si es superior es un fracaso. 

En S3 en realidad se distinguen entre dos categorías de éxito y dos de fracaso. Cuando el dado de unidades es un 1 y el número total es inferior al porcentaje entonces no sólo es un éxito sino un éxito especial. En el caso de fallos, los fallos pares acabados en cero serán desastres. Los especiales y los desastres permiten dar más color a las partidas y jugar con cosas improbables. Lo primero sería declarar las categorías de resultados posibles, esto lo podemos hacer creando un nuevo tipo de valor de esta forma:

Chapter - Rolling a skill

A skill roll result is a kind of value. 
The skill roll results are disaster, failure, success, special success.

Ahora necesitamos la función que haga la tirada y nos diga qué ha resultado. Usaremos de nuevo la librería de dados y algunos cuantos cálculos matemáticos con partes enteras y la función 'módulo' de esta forma:

To decide which skill roll result is the roll ( skill - a skill ) for ( char - a character ):
 let base roll be the roll of d%;
 let success percent be the percent in skill for char;
 let units be the remainder after dividing base roll by 10;
 let tens be base roll divided by 10;
 if base roll is greater than the success percent:
  [FAILURE]
  if units is 0 and the remainder after dividing tens by 2 is 0:
   decide on disaster;
  otherwise:
   decide on failure;
 otherwise:
  [SUCCESS]
  if units is 1:
   decide on special success;
  otherwise:
   decide on success.

¿Cómo se usaría esta función? Pues hagamos que nuestro lagarto arquero dispare todos los turnos de juego, como si estuviese practicando con el arco:

Every turn:
 say "Sherack dispara contra la diana: [roll bow for Sherack].".

Si corremos ahora la obra veremos que salen esta clase de mensajes:

>i
No llevas nada.

Sherack dispara contra la diana: special success.

>i
No llevas nada.

Sherack dispara contra la diana: success.

>i
No llevas nada.

Sherack dispara contra la diana: failure.

>i
No llevas nada.

Sherack dispara contra la diana: disaster.

Mola, aunque evidentemente habría que darle un formato mucho más bonito, ¿no? Algo como:

Every turn:
 say "Sherack dispara contra la diana";
 let result be roll bow for Sherack;
 if result is special success:
  say " acertando justo en entre los ojos del muñeco de entrenamiento.";
 otherwise if result is success:
  say " acertando en el muñeco de entrenamiento.";
 otherwise if result is failure:
  say ", pero la flecha pasa por encima del muñeco.";
 otherwise:
  say ", pero tan sólo consigue golpearse con la cuerda del arco en la mejilla.".

Mucho mejor ahora, pero hacer esto por todas partes de la historia no parece muy buena idea, ¿no? Parte del problema es el que os expliqué en la primera entrada del tutorial, ¿realmente quieres todo esto en tu obra? Pero en realidad podemos buscar algunos mecanismos generales que nos permitan simplificar un poco toda esta codificación. Eso lo veremos en la siguiente entrega.

En realidad las tiradas en S3 no son siempre el porcentaje de la habilidad, a veces es necesario considerar tiradas sencillas, difíciles, etc... esto se logra de esta forma:

Chapter - Difficulty levels

A difficulty level is a kind of value. 
The difficulty levels are extremely easy, very easy, quite easy, easy, 
simple, normal, complex, difficult, quite difficult, very difficult, extremely difficult, impossible.

To decide which number is the modification percent of (difficulty - a difficulty level):
 if difficulty is extremely easy:
  decide on 75;
 if difficulty is very easy:
  decide on 60;
 if difficulty is quite easy:
  decide on 45;
 if difficulty is easy:
  decide on 30;
 if difficulty is simple:
  decide on 15;
 if difficulty is normal:
  decide on 0;
 if difficulty is complex:
  decide on -15;
 if difficulty is difficult:
  decide on -30;
 if difficulty is quite difficult:
  decide on -45;
 if difficulty is very difficult:
  decide on -60;
 if difficulty is extremely difficult:
  decide on -75;
 if difficulty is impossible:
  decide on -90.

To decide which skill roll result is the roll (skill - a skill) for (char - a character):
 decide on normal roll skill for char.

To decide which skill roll result is the (difficulty - a difficulty level) roll (skill - a skill) for (char - a character):
 let base roll be the roll of d%;
 let success percent be the percent in skill for char;
 increase success percent by the modification percent of difficulty;
 let units be the remainder after dividing base roll by 10;
 let tens be base roll divided by 10;
 if base roll is greater than the success percent:
  [FAILURE]
  if units is 0 and the remainder after dividing tens by 2 is 0:
   decide on disaster;
  otherwise:
   decide on failure;
 otherwise:
  [SUCCESS]
  if units is 1:
   decide on special success;
  otherwise:
   decide on success.

Basta por hoy. La obra actualmente está en este estado y la librería en este.