kulmapaikka-ircbot/plugins/character2.js

131 lines
3.6 KiB
JavaScript
Raw Normal View History

2018-04-29 17:37:07 +03:00
var Promise = require('promise');
var requestPromise = require('./helpers/requestPromise.js');
var BasePlugin = require('./base.js');
var logger = require('winston');
var Chance = require('chance');
var chance = new Chance();
class Character {
constructor() {
this.gender = null;
this.name = null;
this.class = null;
this.alignment = null;
this.stats = [];
this.statSum = -1;
}
create() {
this.gender = chance.gender();
this.name = chance.first({gender: this.gender});
// Throw stats
for(var i = 0; i < 6; i++) {
var throws = [chance.d6(), chance.d6(), chance.d6(), chance.d6()].sort();
throws.splice(0, 1);
var stat = throws.reduce(function(a, b) { return a + b; }, 0);
this.stats.push(stat);
}
this.statSum = this.stats.reduce(function(a, b) { return a + b; }, 0);
// Select race
var races = {
'Human': '',
'Dwarf': 'Fighter',
'Elf': 'Wizard',
'Gnome': 'Bard',
'Half-Elf': '',
'Half-Orc': 'Barbarian',
'Halfling': 'Rogue',
};
this.race = Object.keys(races)[chance.natural({min: 0, max: Object.keys(races).length-1})];
// Select alignment
var alignmentY = ['Good', 'Neutral', 'Evil'].splice(chance.natural({min: 0, max: 2}), 1);
var alignmentX = ['Lawful', 'Neutral', 'Chaotic'].splice(chance.natural({min: 0, max: 2}), 1);
this.alignment = (alignmentY[0] === 'Neutral' && alignmentX[0] === 'Neutral') ? 'True Neutral' : alignmentX[0] + ' ' + alignmentY[0];
// Select class
var classes = {
'Barbarian' : '',
'Bard': '',
'Cleric': '',
'Druid': '',
'Fighter': '',
'Monk': '',
'Paladin': '',
'Ranger': '',
'Rogue': '',
'Sorcerer': '',
}
this.class = Object.keys(classes)[chance.natural({min: 0, max: Object.keys(classes).length-1})];
// Select age
var roll = function(times, func) {
var sum = 0;
for(var i = 0; i < times; i++) {
sum += chance[func]();
}
return sum;
}
var ages = {
'Human': { start: 15, classes: [roll(1, 'd4'), roll(1, 'd6'), roll(2, 'd6')] },
'Dwarf': { start: 40, classes: [roll(3, 'd6'), roll(5, 'd6'), roll(6, 'd6')] },
'Elf': { start: 110, classes: [roll(4, 'd6'), roll(6, 'd6'), roll(10, 'd6')] },
'Gnome': { start: 40, classes: [roll(4, 'd6'), roll(6, 'd6'), roll(9, 'd6')] },
'Half-Elf': { start: 20, classes: [roll(1, 'd6'), roll(2, 'd6'), roll(3, 'd6')] },
'Half-Orc': { start: 14, classes: [roll(1, 'd4'), roll(1, 'd6'), roll(2, 'd6')] },
'Halfling': { start: 20, classes: [roll(2, 'd4'), roll(3, 'd6'), roll(4, 'd6')] },
};
var ageClasses = {
'Barbarian': 0, 'Rogue': 0, 'Sorcerer': 0,
'Bard': 1, 'Fighter': 1, 'Paladin': 1, 'Ranger': 1,
'Cleric': 2, 'Druid': 2, 'Monk': 2, 'Wizard': 2,
};
this.age = ages[this.race].start + ages[this.race].classes[ageClasses[this.class]];
}
toString() {
var str = this.age + " years old " + this.alignment + " " + this.gender + " " + this.race + " " + this.class + " named " + this.name;
str += " with stats ";
this.stats.forEach(function(val) {
str += val + " ";
});
str += " ("+this.statSum+")";
return str;
}
}
class Character2 extends BasePlugin {
constructor(config) {
super(config);
this.name = 'Character2';
}
test(input) {
var res = null;
if (res = input.match(/^\.luohahmo2$/i)) {
return true;
}
return false;
}
result(input) {
// Different cases
let newChar = new Character();
newChar.create();
let result = newChar.toString();
return result;
}
}
module.exports = Character2;