update system

pull/14/head
macniel 2025-09-27 02:37:20 +02:00
parent 1a83d92bf8
commit 02a5478cd1
14 changed files with 384 additions and 104 deletions

View File

@ -1,7 +1,9 @@
import { PlayerCharacterDataModel } from "./module/character/character.mjs"; import { PlayerCharacterDataModel } from "./module/character/character.mjs";
import { DsaActor } from "./module/Actors/dsa-actor.mjs"; import { DsaActor } from "./module/Actors/dsa-actor.mjs";
import { Skill } from "./module/Items/Skill.mjs" import { Skill } from "./module/Items/skill.mjs"
import { SkillSheet } from "./module/Items/SkillSheet.mjs"; import { SkillSheet } from "./module/Items/skillSheet.mjs";
import { Spell } from "./module/Items/spell.mjs";
import { SpellSheet } from "./module/Items/spellSheet.mjs";
Hooks.once("init", () => { Hooks.once("init", () => {
@ -14,14 +16,21 @@ Hooks.once("init", () => {
}; };
CONFIG.Item.dataModels = { CONFIG.Item.dataModels = {
skills: Skill skills: Skill,
spells: Spell
} }
console.log("DSA 4.1 is ready for development!") console.log("DSA 4.1 is ready for development!")
// Register sheet application classes // Register sheet application classes
Items.registerSheet('dsa41.skill', SkillSheet, { Items.registerSheet('dsa41.skill', SkillSheet, {
types: ["Skill"],
makeDefault: true, makeDefault: true,
label: 'DSA41.SheetLabels.Item', label: 'DSA41.SkillLabels.Item',
});
Items.registerSheet('dsa41.spell', SpellSheet, {
types: ["Spell"],
makeDefault: true,
label: 'DSA41.SpellLabels.Item',
}); });
}) })

View File

@ -1,23 +0,0 @@
const { BooleanField, NumberField, SchemaField, SetField, StringField, HTMLField } = foundry.data.fields;
export class Skill extends foundry.abstract.TypeDataModel {
static defineSchema() {
return {
name: new StringField({ required: true }),
category: new StringField({ required: true }),
attributeReference1: new StringField(), // References one of the eight attributes by name
attributeReference2: new StringField(), // References one of the eight attributes by name
attributeReference3: new StringField(), // References one of the eight attributes by name
requisite: new StringField(), // Required skills at a given level
text: new HTMLField(),
handicapValue: new NumberField(), // BE-X
complexity: new NumberField(), // In case of languages
derivedAttribute1: new NumberField(),
derivedAttribute2: new NumberField(),
derivedAttribute3: new NumberField(),
derivedSkillValue: new NumberField(), // TaW
}
}
}

View File

@ -0,0 +1,36 @@
const { BooleanField, ArrayField, NumberField, SchemaField, StringField, HTMLField } = foundry.data.fields;
export class Skill extends Item {
static defineSchema() {
return {
name: new StringField({ required: true }),
gruppe: new StringField({ required: true }),
probe: new ArrayField(new StringField(), { exact: 3 }), // References one of the eight attributes by name
voraussetzung: new SchemaField({
talent: new StringField({ model: Skill }),
wert: new NumberField(),
}), // Required skills at a given level
talent: new HTMLField(),
behinderung: new NumberField(), // BE-X
komplexität: new NumberField(), // In case of languages
}
}
/**
* Augment the basic Item data model with additional dynamic data.
*/
prepareData() { }
/**
* Prepare a data object which is passed to any Roll formulas which are created related to this Item
* @private
*/
getRollData() { }
/**
* Handle clickable rolls.
* @param {Event} event The originating click event
* @private
*/
async roll() { }
}

View File

@ -17,7 +17,7 @@ export class SkillSheet extends ItemSheet {
/** @override */ /** @override */
get template() { get template() {
return `systems/DSA_4-1/templates/item/item-${this.item.type}-sheet.hbs`; return `systems/DSA_4-1/templates/item/item-Skill-sheet.hbs`;
} }
/** @override */ /** @override */
@ -35,13 +35,13 @@ export class SkillSheet extends ItemSheet {
context.system = skillData.system; context.system = skillData.system;
context.flags = skillData.flags; context.flags = skillData.flags;
context.categoryOptions = { context.categoryOptions = {
combat: "Kampf", kampf: "Kampf",
physical: "Körperlich", körperlich: "Körperlich",
social: "Gesellschaft", gesellschaft: "Gesellschaft",
survival: "Natur", natur: "Natur",
knowledge: "Wissen", wissen: "Wissen",
languages: "Sprache und Schriften", sprachen: "Sprache und Schriften",
crafting: "Handwerk" handwerk: "Handwerk"
} }
return context; return context;

View File

@ -0,0 +1,45 @@
const { BooleanField, NumberField, SchemaField, ArrayField, StringField, HTMLField } = foundry.data.fields;
export class Spell extends Item {
static defineSchema() {
return {
seite: new NumberField(),
name: new StringField({ required: true }),
probe: new ArrayField({ required: true, exact: 3 }),
probeMod: new StringField(),
technik: new StringField(),
zauberdauer: new StringField(),
wirkung: new StringField(),
kosten: new StringField(),
reichweite: new StringField({ required: true }),
wirkungsdauer: new StringField({ required: true }),
modifikationen: new StringField({ required: true }),
reversalis: new StringField(),
antimagie: new StringField(),
merkmal: new StringField(),
komplexität: new StringField(),
repräsentation: new StringField(),
info: new StringField()
}
}
/**
* Augment the basic Item data model with additional dynamic data.
*/
prepareData() { }
/**
* Prepare a data object which is passed to any Roll formulas which are created related to this Item
* @private
*/
getRollData() { }
/**
* Handle clickable rolls.
* @param {Event} event The originating click event
* @private
*/
async roll() { }
}

View File

@ -0,0 +1,49 @@
export class SpellSheet extends ItemSheet {
/**@override */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ['dsa41', 'sheet', 'item', 'spell'],
width: 520,
height: 480,
tabs: [
{
navSelector: '.sheet-tabs',
contentSelector: '.sheet-body',
initial: 'meta',
},
],
});
}
/** @override */
get template() {
return `systems/DSA_4-1/templates/item/item-Spell-sheet.hbs`;
}
/** @override */
getData() {
// Retrieve the data structure from the base sheet. You can inspect or log
// the context variable to see the structure, but some key properties for
// sheets are the actor object, the data object, whether or not it's
// editable, the items array, and the effects array.
const context = super.getData();
// Use a safe clone of the actor data for further operations.
const skillData = context.data;
// Add the actor's data to context.data for easier access, as well as flags.
context.system = skillData.system;
context.flags = skillData.flags;
return context;
}
activateListeners(html) {
super.activateListeners(html);
// Everything below here is only needed if the sheet is editable
if (!this.isEditable) return;
}
}

View File

@ -1,8 +1,11 @@
import { Skill } from "../Items/skill.mjs";
import { Spell } from "../Items/spell.mjs";
const { const {
SchemaField, NumberField, StringField, ArrayField, BooleanField, SchemaField, NumberField, StringField, ArrayField, BooleanField, EmbeddedCollectionField,
} = foundry.data.fields; } = foundry.data.fields;
export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel { export class PlayerCharacterDataModel extends Actor {
static defineSchema() { static defineSchema() {
return { return {
@ -40,20 +43,8 @@ export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel {
so: new NumberField({ required: true, integer: true }), so: new NumberField({ required: true, integer: true }),
gilde: new StringField(), gilde: new StringField(),
}), }),
talente: new ArrayField(new SchemaField({ talente: new EmbeddedCollectionField( { model: Skill }),
name: new StringField(), zauber: new EmbeddedCollectionField( { model: Spell }),
taw: new NumberField({required: true, integer: true }),
kategorie: new StringField(),
probe: new StringField(),
})),
zauber: new ArrayField(new SchemaField({
name: new StringField(),
rep: new StringField(),
merkmale: new ArrayField(new StringField()),
hauszauber: new BooleanField(),
zfw: new NumberField({ required: true, integer: true }),
quelle: new StringField(),
})),
liturgien: new ArrayField(new SchemaField({ liturgien: new ArrayField(new SchemaField({
name: new StringField(), name: new StringField(),
})), })),

View File

@ -7,46 +7,117 @@
"minimum": 12, "minimum": 12,
"verified": 13 "verified": 13
}, },
"authors": [{ "authors": [
{
"name": "GrandpaPoppy" "name": "GrandpaPoppy"
},{ },
{
"name": "ParanoidSpectre" "name": "ParanoidSpectre"
},{ },
{
"name": "macniel" "name": "macniel"
}], }
"esmodules": ["main.mjs"], ],
"styles": ["style/styles.css"], "esmodules": [
"packs": [{ "main.mjs"
"name": "talente", ],
"styles": [
"style/styles.css"
],
"packs": [
{
"name": "Skill",
"label": "Basistalente", "label": "Basistalente",
"type": "Item" "system": "DSA_4-1",
},{ "type": "Item",
"name": "zauber", "path": "packs/talente",
"private": false
},
{
"name": "Spells",
"label": "Basiszauber", "label": "Basiszauber",
"type": "Item" "system": "DSA_4-1",
},{ "type": "Item",
"path": "packs/zauber",
"private": false
},
{
"name": "liturgien", "name": "liturgien",
"label": "Basisliturgien", "label": "Basisliturgien",
"system": "DSA_4-1",
"type": "Item" "type": "Item"
},{ },
{
"name": "sonderfertigkeiten", "name": "sonderfertigkeiten",
"label": "Basissonderfertigkeiten", "label": "Basissonderfertigkeiten",
"system": "DSA_4-1",
"type": "Item" "type": "Item"
}], }
"languages": [{ ],
"packFolders": [
{
"name": "Basiszauber",
"color": "#801020",
"sorting": "m",
"packs": [
"Spells"
]
}
],
"languages": [
{
"lang": "de", "lang": "de",
"name": "Deutsch", "name": "Deutsch",
"path": "lang/de.json" "path": "lang/de.json"
}], }
],
"documentTypes": { "documentTypes": {
"Actor": { "Actor": {
"character": {} "character": {}
}, },
"Item": { "Item": {
"skill": { "Skill": {
"stringFields": ["name", "category", "attributeReference1", "attributeReference2", "attributeReference3", "requisite"], "stringFields": [
"numberFields": ["handicapValue", "complexity"], "name",
"htmlFields": ["text"] "gruppe",
"probe",
"voraussetzung"
],
"numberFields": [
"handicapValue",
"complexity"
],
"htmlFields": [
"text"
],
"foreignDocumentField": [
"voraussetzung"
]
},
"Spell": {
"stringFields": [
"name",
"probenMod",
"technik",
"zauberdauer",
"wirkung",
"kosten",
"reichweite",
"wirkungsdauer",
"modifikationen",
"reversalis",
"antimagie",
"merkmal",
"komplexität",
"repräsentation",
"info"
],
"numberFields": [
"seite"
],
"arrayFields": [
"probe"
]
} }
} }
}, },

View File

@ -18,35 +18,35 @@
<div class="tab meta" data-group="primary" data-tab="meta"> <div class="tab meta" data-group="primary" data-tab="meta">
<div> <div>
<label>Kategorie <label>Kategorie
<select type="text" name="system.category.value"> <select type="text" name="system.gruppe.value">
{{selectOptions categoryOptions selected=value}} {{selectOptions categoryOptions selected=value}}
</select> </select>
</label> </label>
</div> </div>
<div> <div>
<label>Erstes Attribut <label>Erstes Attribut
<input type="text" name="system.attributeReference1.value" <input type="text" name="system.probe.0"
value="{{system.attributeReference1.value}}" /> value="{{system.probe.[0]}}" />
</label> </label>
</div> </div>
<div><label>Zweites Attribut <div><label>Zweites Attribut
<input type="text" name="system.attributeReference2.value" <input type="text" name="system.probe.1"
value="{{system.attributeReference2.value}}" /> value="{{system.probe.[1]}}" />
</label></div> </label></div>
<div> <div>
<label>Drittes Attribut <label>Drittes Attribut
<input type="text" name="system.attributeReference3.value" <input type="text" name="system.probe.2"
value="{{system.attributeReference3.value}}" /> value="{{system.probe.[2]}}" />
</label> </label>
</div> </div>
<div> <div>
<label>Behinderung <label>Behinderung
<input type="text" name="system.hanidcapValue.value" value="{{system.handicapValue.value}}" /> <input type="text" name="system.behinderung" value="{{system.behinderung}}" />
</label> </label>
</div> </div>
<div> <div>
<label>Sprachenkomplexizität <label>Sprachenkomplexizität
<input type="text" name="system.complexity.value" value="{{system.complexity.value}}" /> <input type="text" name="system.komplexität" value="{{system.komplexität}}" />
</label> </label>
</div> </div>
@ -54,12 +54,12 @@
<div class="tab description" data-group="primary" data-tab="description"> <div class="tab description" data-group="primary" data-tab="description">
<div> <div>
<label>Beschreibungstext <label>Beschreibungstext
{{editor system.text target="system.text" button=true owner=owner editable=editable}} {{editor system.text target="system.talent" button=true owner=owner editable=editable}}
</label> </label>
</div> </div>
<div> <div>
<label>Voraussetzung <label>Voraussetzung
<input type="text" name="system.requisite.value" value="{{system.requisite.value}}" /> <input type="text" name="system.vorraussetzung" value="{{system.voraussetzung}}" />
</label> </label>
</div> </div>
</div> </div>

View File

@ -0,0 +1,102 @@
<form class="{{cssClass}} {{actor.type}} flexcol" autocomplete="off">
{{!-- Sheet Header --}}
<header class="sheet-header" style="flex: 0">
{{!-- Header stuff goes here --}}
<img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" height="100" width="100" />
</header>
{{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" style="flex: 0" data-group="primary">
<a class="item" data-tab="meta">Kopfdaten</a>
<a class="item" data-tab="variants">Varianten</a>
<a class="item" data-tab="commonality">Verbreitung</a>
</nav>
{{!-- Sheet Body --}}
<section class="sheet-body" style="flex: 1">
<div class="tab meta" data-group="primary" data-tab="meta">
<div>
<label>Name
<input type="text" name="system.name.value"
value="{{system.attributeReference1.value}}" />
</label>
</div>
<div>
<label>Probe
<input type="text" name="system.probe.0"
value="{{system.probe.[0]}}" />
<input type="text" name="system.probe.1"
value="{{system.probe.[1]}}" />
<input type="text" name="system.probe[2].value"
value="{{system.probe.[2]}}" />
</label>
</div>
<div><label>Proben Modifikation
<input type="text" name="system.probenMod"
value="{{system.probenMod}}" />
</label></div>
<div>
<label>Zauberdauer
<input type="text" name="system.zauberdauer"
value="{{system.zauberdauer}}" />
</label>
</div>
<div>
<label>Kosten
<input type="text" name="system.kosten" value="{{system.kosten}}" />
</label>
</div>
<div>
<label>Wirkung
<input type="text" name="system.wirkung" value="{{system.wirkung}}" />
</label>
</div> <div>
<label>Wirkungsdauer
<input type="text" name="system.wirkungsdauer" value="{{system.wirkungsdauer}}" />
</label>
</div>
</div>
<div class="tab variants" data-group="primary" data-tab="variants">
<div>
<label>Modifikationen
<input type="text" name="system.modifikationen" value="{{system.modifikationen}}" />
</label>
</div>
<div>
<label>Varianten
hier später Varianten
</label>
</div>
<div>
<label>Reversalis
<input type="text" name="system.reversalis" value="{{system.reversalis}}" />
</label>
</div>
<div>
<label>Antimagie
<input type="text" name="system.antimagie" value="{{system.antimagie}}" />
</label>
</div>
</div>
<div class="tab commonality" data-group="primary" data-tab="commonality">
<div>
<label>Komplexität
<input type="text" name="system.komplexität" value="{{system.komplexität}}" />
</label>
</div><div>
<label>Repräsentation
<input type="text" name="system.repräsentation" value="{{system.repräsentation}}" />
</label>
</div>
<div>
<label>Verbreitung
<input type="text" name="system.info" value="{{system.info}}" />
</label>
</div>
</div>
</section>
</form>