5.7.18

Tutorial de juegos 'rpg' para Inform 7 - Acero (3) - Habilidades

En S3 como en BRP las acciones se deciden si son un ´éxito o un fracaso según una tirada de d%. Primero se calcula el porcentaje de éxito, y luego se lanza un d% cuyo resultado debe ser igual o menor que ese porcentaje. Las tiradas en sí y cómo se relacionan con las acciones que Inform 7 entiende lo veremos en el siguiente capítulo pero veamos en este cómo se calcula en S3 el porcentaje de éxito.

He de avisar que este capítulo del tutorial será con diferencia el más enrevesado, de forma que si hay algo que no entendéis muy bien o que os parece demasiado complicado no os preocupéis demasiado. Podría haber simplificado mucho este tema pero he preferido dejarlo tal cuál es en S3 en realidad para que veáis un sistema complejo, la codificación que necesita y opciones de cómo podéis hacerla.

En S3 hay tres capas (es otra de las razones del nombre) de abstracción que determinan finalmente la probabilidad de éxito de una acción concreta. Primero está el conocimiento general más o menos teórico sobre un campo de experiencia del personaje (tales como 'ciencia' o 'sigilo' o 'artesanía), estos conocimientos están clasificados en lo que se llama 'grupo de habilidades' y tienen un valor que va desde 0 (desconocimiento completo) a 10 (máximo conocimiento teórico). Se llama a estos valores 'niveles' y es lo más parecido que tiene S3 a los niveles de d20. Modelemos primero los niveles de los grupos de habilidad:

Chapter - Group of skills

A group of skills is a kind of object. 

Algunos de estos niveles tienen valores 'naturales' en el caso de que sean lo bastante intuitivo como para que cualquier personaje con suficiente agilidad, fuerza o inteligencia pudiese intentar hacer acciones de ese grupo sin necesidad de un entrenamiento. Esto se resuelve en S3 mediante unos niveles base relacionados con las características. Las tablas de estos valores base se han ido ajustando con los años y, aunque se corresponden con niveles de distribución gaussianos, en realidad son fruto sobre todo de la prueba y error. Añado todo el código necesario para calcular los niveles básicos de un tirón (mediante tablas y funciones):

Some group of skills are defined by Table of Groups of Skills.

Table of Groups of Skills
a group of skills strength base agility base  intelligence base will base size base constitution base
shoot  2 1 0 0 0 0
hand to hand combat 1 0 0 0 0 0
art 0 0 1 1 0 0
craft 0 0 0 0 0 0
athletic 1 1 0 0 0 0
science 0 0 0 0 0 0
language 0 0 0 0 0 0
geo-hist 0 0 0 0 0 0
medicine 0 0 0 0 0 0
perception 0 0 0 1 0 1
stealth 0 1 1 0 1 0
magic 0 0 0 0 0 0

[
FUE  CON  TAM  INT  VOL  AGI
0 – 5 -2 0 – 1 -2 0 – 5 -2 0 – 3 -2 0 – 2 -2 0 – 2 -2
6 – 9 -1 2 – 4 -1 6 – 9 -1 4 – 5 -1 3 – 4 -1 3 – 4 -1
10 – 13 0 5 – 6 0 10 – 13 0 6 – 8 0 5 – 8 0 5 – 8 0
14 – 17 1 7 – 8 1 14 – 17 1 9 – 11 1 9 – 13 1 9 – 13 1
18 – 21 2 9 – 10 2 18 – 21 2 12 – 15 2 14 – 17 2 14 – 17 2
22 – 24 3 11  - 12 3 22 – 24 3 16 – 19 3 18 – 21 3 18 – 21 3
25+ 4 13+ 4 25+ 4 20+ 4 22+ 4 22+ 4
]

To decide which number is strength base plus of (car - a number):
 if car is less than 6:
  decide on -2;
 if car is less than 10:
  decide on -1;
 if car is less than 14:
  decide on 0;
 if car is less than 18:
  decide on 1;
 if car is less than 22:
  decide on 2;
 if car is less than 25:
  decide on 3;
 decide on 4.
 
To decide which number is size base plus of (car - a number):
 decide on strength base plus of car.
 
To decide which number is constitution base plus of (car - a number):
 if car is less than 2:
  decide on -2;
 if car is less than 5:
  decide on -1;
 if car is less than 7:
  decide on 0;
 if car is less than 9:
  decide on 1;
 if car is less than 11:
  decide on 2;
 if car is less than 13:
  decide on 3;
 decide on 4.

To decide which number is intelligence base plus of (car - a number):
 if car is less than 4:
  decide on -2;
 if car is less than 6:
  decide on -1;
 if car is less than 9:
  decide on 0;
 if car is less than 12:
  decide on 1;
 if car is less than 16:
  decide on 2;
 if car is less than 20:
  decide on 3;
 decide on 4.
 
To decide which number is will base plus of (car - a number):
 if car is less than 3:
  decide on -2;
 if car is less than 5:
  decide on -1;
 if car is less than 9:
  decide on 0;
 if car is less than 14:
  decide on 1;
 if car is less than 18:
  decide on 2;
 if car is less than 22:
  decide on 3;
 decide on 4.
 
To decide which number is agility base plus of (car - a number):
 decide on will base plus of car.
 
To decide which number is base level of (group - a group of skills) for (char - a character):
 let level be 0;
 if strength base of group is greater than 0:
  let byStrength be strength base plus of strength of char;
  if strength base of group is greater than 1:
   increase level by byStrength divided by strength base of group;
  otherwise:
   increase level by byStrength;
 if agility base of group is greater than 0:
  let byAgility be agility base plus of agility of char;
  if agility base of group is greater than 1:
   increase level by byAgility divided by agility base of group;
  otherwise:
   increase level by byAgility;
 if intelligence base of group is greater than 0:
  let byIntelligence be intelligence base plus of intelligence of char;
  if intelligence base of group is greater than 1:
   increase level by byIntelligence divided by intelligence base of group;
  otherwise:
   increase level by byIntelligence;
 if will base of group is greater than 0:
  let byWill be will base plus of will of char;
  if will base of group is greater than 1:
   increase level by byWill divided by will base of group;
  otherwise:
   increase level by byWill; 
 if size base of group is greater than 0:
  let bySize be size base plus of will of char;
  if size base of group is greater than 1:
   decrease level by bySize divided by size base of group;
  otherwise:
   decrease level by bySize; 
 if constitution base of group is greater than 0:
  let byConstitution be will base plus of constitution of char;
  if constitution base of group is greater than 1:
   increase level by byConstitution divided by constitution base of group;
  otherwise:
   increase level by byConstitution;  
 decide on level.

Como he dicho no hay más que experiencia de los años en ese código, no una razón fácilmente explicable. Aunque...

:)

...seguro que se os ocurre cómo simplificar el código que acabo de incluir haciéndolo algo más general y de menor complejidad. Os animo a revisar la sección de listas del manual de Inform 7 y pensar en cómo se podrían usar para mejorar y generalizar el código anterior.

Ya tenemos una forma de 'calcular' los niveles de grupo de habilidad básicos, pero cada personaje tendrá además una experiencia dada en digamos  combate cuerpo a cuerpo o en puntería, ¿no? ¿Cómo incorporamos esta información al personaje en cuestión? La respuesta más obvia sería añadir a character los campos numéricos necesarios que representen todos los niveles que tiene el personaje, pero serían 12 números más y cuando luego añadamos las habilidades serían otros 60 números más... uff... empieza a sonar excesivo. Pensemos un poco mejor. Lo primero es que vamos a usar estos números muy pocas veces a lo largo de la lógica del juego, sólo cuando haya algo de acción usaremos uno de esos números y sólo uno, así que nos podríamos permitir calcularlos 'sobre la marcha', además esto tiene la ventaja de que si provocamos un cambio temporal de las características (por un hechizo por ejemplo) el valor del número se verá afectado sin más. Lo otro a considerar es que probablemente tus PNJs no serán por lo general 'personas completas', tendrán algo de arquetipo y seguramente sólo te interesarán los valores 'relevantes' de cada personaje (la habilidad de arco de un arquero, por ejemplo y no su habilidad para cocinas), así que podríamos pensar en algo que se rellene sólo cuando sea necesario, cuando los valores se desvíen de la base. Esto se puede hacer con tablas en Inform 7 de esta forma (añadiendo el hecho de que la suma total de niveles sólo puede llegar a 10):

Table of Group Skill Level by Character
character group extra
a character a group of skills a number
with 500 blank rows.

To decide which number is the extra level of (group - a group of skills) for (char - a character):
 repeat through the Table of Group Skill Level by Character:
  if character entry is char and group entry is group:
   decide on extra entry;
 decide on 0. 

To decide which number is the level of (group - a group of skills) for (char - a character):
 let total be base level of group for char;
 increase total by the extra level of group for char;
 if total is less than 10:
  decide on total;
 otherwise:
  decide on 10.

Esta aproximación en Inform 7 tiene alguna limitaciones, puedes ver que he dejado 500 líneas en blanco, eso es todo lo que va a poder soportar la librería. 500 valores de incrementos de niveles de los grupos de habilidad frente a su base. Si pones en tu obra muchíiiisimos PNJs mejor cambia ese número, así que no pongas 10000 orcos distinguibles cada uno con su nombre y sus habilidades.

:)

Nos faltaría una forma de incrementar esos niveles a lo largo del juego, algo como esto:

To increase (group - a group of skills) level of (char - a character) by (amount - a number):
 let found be false;
 repeat through the Table of Group Skill Level by Character:
  if character entry is char and group entry is group:
   let initial be extra entry;
   increase initial by amount;
   now extra entry is initial;
   now found is true;
 if found is false:
  choose a blank row in Table of Group Skill Level by Character; 
  now character entry is char; 
  now group entry is group; 
  now extra entry is amount.
   
To increase (group - a group of skills) level of (char - a character):
 increase group level of char by 1.

Y también una forma de darle valores de niveles a los PNJs al principio del juego, que podríamos hacerlo con esto:

Chapter - Initial levels for characters

When play begins:
 repeat through the Table of Initial Extra Levels for Characters:
  increase group entry level of character entry by extra entry.

Table of Initial Extra Levels for Characters
character group extra
-- -- --

Ahora ya podríamos proporcionar a Sherack de algo más de carácter haciendo que sea alguien con conocimiento en armas de distancia medio aceptable de esta forma:

Table of Initial Extra Levels for Characters (continued)
character group extra
Sherack shoot 4

Vale, las habilidades son de un grupo de habilidades en S3, y cada una tiene un multiplicador que proporciona el porcentaje base al que se añade la experiencia de cada personaje. Por ejemplo, un personaje con puntería 5 tiene una base de 25% en arco, que puede haber subido hasta 50% si tiene 25% extra que ha ganado como experiencia. Implementar esto es en realidad casi lo mismo que hemos hecho con los niveles:

Chapter - Skill

A skill is a kind of object. Some skills are defined by Table of Defined Skills.

Table of Defined Skills
a skill group multiplier
bow shoot 5

Chapter - Skill sheet for all characters

Table of Skill Percents by Character
character skill base extra
a character a skill a number
with 500 blank rows

To decide which number is the extra percent in (skill - a skill) for (char - a character):
 repeat through the Table of Skill Percents by Character:
  if character entry is char and skill base entry is skill:
   decide on extra entry;
 decide on 0. 

To decide which number is the percent in (skill - a skill) for (char - a character):
 let total be the extra percent in skill for char;
 let base level be the level of group of skill for char;
 increase total by base level multiplied by multiplier of skill;
 decide on total.
 
To increase (skill - a skill) percent of (char - a character) by (amount - a number):
 let found be false;
 repeat through the Table of Skill Percents by Character:
  if character entry is char and skill  base entry is skill:
   let initial be extra entry;
   increase initial by amount;
   now extra entry is initial;
   now found is true;
 if found is false:
  choose a blank row in Table of Skill Percents by Character;
  now character entry is char;
  now skill base entry is skill;
  now extra entry is amount.
   
To increase (skill - a skill) percent of (char - a character):
 increase skill percent of char by the roll of 1d4.

Chapter - Initial percents for characters

When play begins:
 repeat through the Table of Initial Extra Percents for Characters:
  increase skill entry percent of character entry by extra entry.

Table of Initial Extra Percents for Characters
character skill extra
-- -- --

En este caso sólo he incluido la habilidad de 'arco' en la tabla de habilidades para simplificar un poco el texto. Ahora ya podemos hacer a Sherack un arquero de verdad con:

Table of Initial Extra Percents for Characters (continued)
character skill extra
Sherack bow 60

Y ya tendríamos todo un sistema de habilidades en funcionamiento... al menos para calcular los porcentajes, en los próximos capítulos veremos cómo usar estos porcentajes de verdad en la resolución de acciones.

Podéis ver el estado actual de la librería aquí y del juego aquí.