WIP: Generators

master
U~man 2020-07-18 17:39:30 +02:00
parent e23adf87f9
commit 0ea0e25fba
9 changed files with 236 additions and 6 deletions

View File

@ -15,6 +15,7 @@
"OSE.dialog.partysheet": "Party Overview",
"OSE.dialog.selectActors": "Select PCs",
"OSE.dialog.dealXP": "Deal XP",
"OSE.dialog.generateSaves": "Generate Saves",
"OSE.Formula": "Formula",
"OSE.SitMod": "Situational Modifier",

View File

@ -15,6 +15,7 @@
"OSE.dialog.partysheet": "Fiche de Groupe",
"OSE.dialog.selectActors": "Choisir PJs",
"OSE.dialog.dealXP": "Donner XP",
"OSE.dialog.generateSaves": "Générer les Sauvegardes",
"OSE.Formula": "Formule",
"OSE.SitMod": "Mod. de situation",

View File

@ -1,6 +1,7 @@
import { OseActor } from "./entity.js";
import { OseActorSheet } from "./actor-sheet.js";
import { OseCharacterModifiers } from "../dialog/character-modifiers.js";
import { OseCharacterCreator } from "../dialog/character-creation.js";
/**
* Extend the basic ActorSheet with some very simple modifications
@ -33,6 +34,22 @@ export class OseActorSheetCharacter extends OseActorSheet {
});
}
/**
* Character creation helpers
* @param {...any} args
*/
async _render(...args) {
super._render(...args).then(() => {
if (this.actor.isNew()) {
event.preventDefault();
new OseCharacterCreator(this.actor, {
top: this.position.top + 40,
left: this.position.left + (this.position.width - 400) / 2,
}).render(true);
}
});
}
/**
* Prepare data for rendering the Actor sheet
* The prepared data object contains both the actor data as well as additional sheet options

View File

@ -51,6 +51,56 @@ export class OseActor extends Actor {
});
}
isNew() {
const data = this.data.data;
if (this.data.type == 'character') {
let ct = 0;
Object.values(data.scores).forEach((el) => {
ct += el.value;
})
return ct == 0 ? true : false;
} else if (this.data.type == 'monster') {
let ct = 0;
Object.values(data.saves).forEach(el => {
ct += el.value;
});
return ct == 0 ? true : false;
}
}
generator() {
}
generateSave(hd) {
let saves = {};
for (let i = 0; i <= hd; i++) {
let tmp = CONFIG.OSE.monster_saves[i];
if (tmp) {
saves = tmp;
}
}
this.update({
"data.saves": {
death: {
value: saves.d
},
wand: {
value: saves.w
},
paralysis: {
value: saves.p
},
breath: {
value: saves.b
},
spell: {
value: saves.s
}
}
});
}
/* -------------------------------------------- */
/* Rolls */
/* -------------------------------------------- */

View File

@ -32,6 +32,38 @@ export class OseActorSheetMonster extends OseActorSheet {
});
}
/**
* Monster creation helpers
* @param {...any} args
*/
async _render(...args) {
super._render(...args).then(() => {
if (this.actor.isNew()) {
const template = `
<form>
<div class="form-group">
<label>Hit dice count</label>
<input name="total" placeholder="Hit Dice" type="text"/>
</div>
</form>`;
new Dialog({
title: game.i18n.localize("OSE.dialog.generateSaves"),
content: template,
buttons: {
set: {
icon: '<i class="fas fa-dice"></i>',
label: game.i18n.localize("OSE.dialog.generateSaves"),
callback: (html) => {
let hd = html.find('input[name="total"]').val();
this.actor.generateSave(hd);
},
},
},
}).render(true);
}
});
}
/**
* Prepare data for rendering the Actor sheet
* The prepared data object contains both the actor data as well as additional sheet options

View File

@ -87,5 +87,70 @@ export const OSE = {
splash: "/systems/ose/assets/splash.png",
reload: "/systems/ose/assets/reload.png",
charge: "/systems/ose/assets/charge.png",
},
monster_saves: {
0: {
d: 14,
w: 15,
p: 16,
b: 17,
s: 18
},
1: {
d: 12,
w: 13,
p: 14,
b: 15,
s: 16
},
4: {
d: 10,
w: 11,
p: 12,
b: 13,
s: 14
},
7: {
d: 8,
w: 9,
p: 10,
b: 10,
s: 12
},
10: {
d: 6,
w: 7,
p: 8,
b: 8,
s: 10
},
13: {
d: 4,
w: 5,
p: 6,
b: 5,
s: 8
},
16: {
d: 2,
w: 3,
p: 4,
b: 3,
s: 6
},
19: {
d: 2,
w: 2,
p: 2,
b: 2,
s: 4
},
22: {
d: 2,
w: 2,
p: 2,
b: 2,
s: 2
},
}
};

View File

@ -0,0 +1,57 @@
// eslint-disable-next-line no-unused-vars
import { OseActor } from '../actor/entity.js';
export class OseCharacterCreator extends FormApplication {
static get defaultOptions() {
const options = super.defaultOptions;
options.id = 'character-creator';
options.template =
'systems/ose/templates/actors/dialogs/character-creation.html';
options.width = 380;
return options;
}
/* -------------------------------------------- */
/**
* Add the Entity name into the window title
* @type {String}
*/
get title() {
return `${this.object.name}: ${game.i18n.localize('OSE.dialog.tweaks')}`;
}
/* -------------------------------------------- */
/**
* Construct and return the data object used to render the HTML template for this form application.
* @return {Object}
*/
getData() {
let data = this.object.data;
data.user = game.user;
data.config = CONFIG.OSE;
return data;
}
/* -------------------------------------------- */
/** @override */
activateListeners(html) {
super.activateListeners(html);
}
/**
* This method is called upon form submission after form data is validated
* @param event {Event} The initial triggering submission event
* @param formData {Object} The object of validated form data with which to update the object
* @private
*/
async _updateObject(event, formData) {
event.preventDefault();
// Update the actor
this.object.update(formData);
// Re-draw the updated sheet
this.object.sheet.render(true);
}
}

View File

@ -31,19 +31,19 @@
},
"saves": {
"death": {
"value": 10
"value": 0
},
"wand": {
"value": 10
"value": 0
},
"paralysis": {
"value": 10
"value": 0
},
"breath": {
"value": 10
"value": 0
},
"spell": {
"value": 10
"value": 0
}
},
"movement": {

View File

@ -0,0 +1,7 @@
<form autocomplete="off" onsubmit="event.preventDefault();">
<ol class="attribute-list">
{{#each config.scores as |score id| }}
<li data-score="{{id}}">{{score}}</li>
{{/each}}
</ol>
</form>