29.6.18

Tutorial de juegos 'rpg' para Inform 7 - Acero (1) - Dados

Empecemos por lo más evidente. Si quieres un sistema 'rolero' vamos necesitar tiradas, dados, alguna clase de aleatoriedad. Inform 7 tiene un montón de mecanismos de aleatoriedad disponibles como podéis ver en este capítulo del manual y en otras secciones como las referentes a listas o tablas, así que en realidad no necesitaríamos desarrollar nada, pero la verdad es que la mayor parte de los sistemas expresan sus tiradas en forma de combinaciones de dados más o menos complejas y si incluimos una notación común para expresar 'tiradas' nos resultará mucho más sencillo luego incluir tablas con toda clase de conceptos que constituyan el sistema sobre el que se soporte la historia. Por otra parte es un buen momento para aprender cómo se hace y se incluye una extensión, así que hagamos una extensión de dados y sus tiradas.

La mayor parte de los sistemas usa dados poliédricos numerados, aunque algunos usan cosas más extrañas (es un clásico mencionar que el juego de rol del Príncipe Valiente usa sólo monedas para las tiradas), y expresan la tirada en la forma de xdy+z ó xdy-z, que significa tira 'x' dados de 'y' caras y suma (o resta) 'z' al total. Otra tirada muy habitual es la de 1d100 o d%, que es una tirada entre 00 y 99 ó 01 y 100, según sea el sistema; que habitualmente se consigue tirando dos dados de diez caras y leyendo de forma consecutiva (una junto a la otra) el valor de cada dado. 

Podemos crear una nueva extensión desde el propio IDE (File >> New Extension), lo que genera una estructura completamente vacía como esta:


Rolling Dices by Johan Paz begins here.

Rolling Dices ends here.

Lo mínimo que deberíamos incluir en cualquier extensión es la documentación de la misma de esta forma:

Rolling Dices by Johan Paz begins here.

"This extension allows express set of dices as a value and rolling them"

Rolling Dices ends here.

---- DOCUMENTATION ---- 

This extension allows express set of dices as a value and rolling them.

En la parte de la documentación explicaremos la extensión y pondremos al menos un ejemplo de uso. Estos ejemplos son muy útiles porque se pueden cargar como proyecto nuevo y así probar directamente la extensión tal y como la haya creado su autor. Si construis una extensión no dudéis en contarlo por aquí o aquí y, si es realmente útil, os explicaremos como publicarla, adaptarla, etc...

Inform 7 tiene una forma de incluir notaciones de unidades con más de una parte, y es bastante general, así que podríamos usarla para incluir el formato de dados, de esta forma:

A roll is a kind of value. 99d99+99 specifies a roll with parts dices, sides and pluses (optional, preamble optional).

Ahora podríamos incluir el 'lanzado' de dados de esta forma:

To decide which number is the throw of (dices - a roll):
 let numPart be the dices part of dices;
 let sidePart be the sides part of dices;
 let randomPart be 0;
 repeat with index running from 1 to numPart:
  increase randomPart by a random number from 1 to sidePart;
 increase randomPart by the pluses part of dices;
 decide on randomPart.

Si añadimos una excepción para el d% ya tendríamos casi todo lo relativo a tiradas que vamos a necesitar:

To decide which number is the roll of d%:
      decide on a random number from 1 to 100.

Añadiendo un ejemplo de prueba como este:

"Dices" by Johan Paz

Include Rolling Dices by Johan Paz.

Rolling site is a room.

A dice (m) is a kind of thing. A dice has a roll called dice roll.

A four sided dice is a dice in rolling site. The dice roll of four sided dice is 1d4.
A six sided dice is a dice  in rolling site. The dice roll of six sided dice is 1d6.
A eight sided dice is a dice  in rolling site. The dice roll of eight sided dice is 1d8.

Dice rolling is an action applying to nothing.

Understand "roll dices" as dice rolling.

Carry out dice rolling:
 let total be 0;
 repeat with dice running through dices carried by player:
  let result be roll of dice roll of dice;
  say "You roll the [dice]... obtaining [result].";
  increase total by result;
 say "The total is [total].".
 
Test me with "take four sided dice / roll dices / take six sided dice / roll dices / drop all / take all / roll dices".

ya tendríamos nuestra primera extensión lista para ser usada. La podéis ver completa aquí.