UNA HISTORIA ÉPICA
BeerJS Córdoba VI
Año del Gallo, Día 89
Joel Alejandro Villarreal Bertoldi
con ilustraciones de digitalizaciones de The British Library
HABLEMOS DE
JUEGOS DE MESA
HABLEMOS DE
JUEGOS DIGITALES
¿QUÉ TIENEN TODOS
ESTOS JUEGOS EN COMÚN?
¡DADOS!
LOS DADOS NOS DEJAN
TOMAR DECISIONES
Roberta, ¿qué
quiere tomar?
¿Café o té?
*arroja D20*
LOS DADOS NOS DEJAN
CONSTRUIR HISTORIAS
¿Dragones o
campesinos?
LOS DADOS NOS DEJAN
DISEÑAR PERSONAJES
¿Saco puesto
o al hombro?
¿Y JAVASCRIPT?
¿QUÉ TIENE QUE VER EN ESTO?
Así nace Xethya.
(se dice «sézia» en español)
xethya-dice
ARROJADOR DE DADOS
import { Dice } from 'xethya-dice';
// Rolls a 20-sided dice.
// Returns a number between 1 and 20.
const rollD20 = new Dice(20).roll();
Resuelve casos de uso triviales
(como elegir un número en un rango)
xethya-dice
ARROJADOR DE DADOS
import { Dice } from 'xethya-dice';
import MyPRNG from './my-prng';
// Rolls a 20-sided dice with a custom
// pseudorandom number generator.
const r = new Dice(20, MyPRNG).roll();
Permite utilizar generadores de
números aleatorios personalizados.
(soporte nativo para MersenneTwister y BlumBlumShub)
xethya-random-mtw
xethya-random-bbs
xethya-dice
ARROJADOR DE DADOS
import { CoinFlip } from 'xethya-dice';
// Flip the coin.
const coin = new CoinFlip().roll();
if (coin === 1) { /* ... */ }
else { /* ... */ }
Decisiones de azar booleanas en 1 línea
(el clásico "tirá una moneda")
xethya-dice
ARROJADOR DE DADOS
import { ChanceThrow,
DiceThrowType } from 'xethya-dice';
// Decide.
const choice = new ChanceThrow.roll();
if (choice.throwType === DiceThrowType.Success) {
// Means that the dice threw a number between 21 and 90.
} else if (choice.throwType === DiceThrowType.Failure) {
// Dice was 20 or less.
}
Decisiones de azar por probabilidades
("hay un 75% de probabilidades de que pase X")
¿QUÉ NECESITAMOS PARA
DISEÑAR PERSONAJES?
Atributos:
Descriptores numéricos de distintos
aspectos de un personaje.
CONSTITUCIÓN - FUERZA
INTELIGENCIA - SABIDURÍA
AGILIDAD
Estadísticas:
Cálculos resultantes de combinar atributos de un personaje.
PESO CARGABLE FUERZA x 5
PUNTOS DE SALUD CONSTITUCIÓN x 100
PUNTOS DE MAGIA INTELIGENCIA + SABIDURÍA
Habilidades:
Acciones cuyo éxito y calidad es determinada por atributos, estadísticas e incluso otras habilidades.
RESISTENCIAS CONSTITUCION
CORRER CONSTITUCION + AGILIDAD + RESISTENCIA
Raza/Clase:
Agrupación lógica de fortalezas y debilidades sobre atributos, habilidades y estadísticas.
ELFO AGILIDAD + 10, CONSTITUCIÓN - 5
ENANO FUERZA + 15, AGILIDAD - 20
xethya-entity
GESTOR DE PERSONAJES Y HABILIDADES
import { LivingEntity } from 'xethya-entity';
// Define a character.
class Ship extends LivingEntity {
constructor() { super('ship', 'My Ship'); }
registerAttributes() {
this.addAttribute('impulse', 10);
this.addAttribute('lateralThrusters', 10);
}
}
Creación de un personaje básico
(cualquier "cosa" puede ser un personaje)
xethya-entity
GESTOR DE PERSONAJES Y HABILIDADES
// Make the ship move.
class Ship extends LivingEntity {
// ...
move(delta) {
const impulse = this.getAttributeById('impulse');
const easingY = impulse.getComputedValue() / 100;
const currentY = this.getPositionOrWhatever(); // ;)
document.querySelector('#ship').style.top
= `${this.currentY + easingY}px`;
}
// ...
}
Aplicación de atributos a una acción
(el movimiento se ve afectado por los atributos)
¡DEMO!
https://github.com/xethya
Framework
Juego Demo
https://github.com/joelalejandro/lagos-sector
Inspiración D&D
https://www.5thsrd.org/
¡GRACIAS!
¡GRACIAS!