adds missing combat skills and implements a rudimentary action manager which should accumulate all available actions coming from talents, special abilities and what not.
Pull Request Check / testing (pull_request) Successful in 18s Details

pull/50/head
macniel 2025-10-05 13:37:57 +02:00
parent a5c702059c
commit b3b247d1a7
34 changed files with 636 additions and 13 deletions

View File

@ -23,6 +23,7 @@ async function preloadHandlebarsTemplates() {
'systems/DSA_4-1/templates/ui/partial-talent-editable.hbs',
'systems/DSA_4-1/templates/ui/partial-die.hbs',
'systems/DSA_4-1/templates/ui/partial-advantage-button.hbs',
'systems/DSA_4-1/templates/ui/partial-action-button.hbs',
'systems/DSA_4-1/templates/ui/partial-equipment-button.hbs',
'systems/DSA_4-1/templates/ui/partial-equipment-group-button.hbs',
'systems/DSA_4-1/templates/ui/partial-array-editor.hbs'

View File

@ -66,14 +66,22 @@ export class Character extends Actor {
if (this.type !== 'character' && this.type !== 'creature') return;
// Copy the ability scores to the top level, so that rolls can use
// formulas like `@str.mod + 4`.
if (data.attribute) {
for (let [k, v] of Object.entries(data.attribute)) {
data[k] = foundry.utils.deepClone(v);
}
}
console.log(data);
// move sonderfertigkeiten into data, if it isn't in data the actor doesn't have that sonderfertigkeit
data.sf = {}
if(data.sonderfertigkeiten) {
data.sonderfertigkeiten.forEach(sf => {
data.sf[sf.name] = sf.auswahl;
})
delete data.sonderfertigkeiten;
}
return data;
}
}

View File

@ -0,0 +1,220 @@
export class ActionManager {
static FREE = "free-action";
static REGULAR = "regular-action";
static CONTINUING = "continuing-action";
static MOVEMENT = "movement-action"
static DEFENSE = "defense-action"
static ATTACK = "attack-action"
static INTERACTION = "interaction";
static TALENT = "talent-action"
static SPELL = "spell";
static DEFAULT = "default"
static SF = "special-ability"
constructor(actor) {
this.actor = actor
}
#freeActions = [
{
name: "Ausweichen",
cost: ActionManager.FREE,
type: ActionManager.DEFENSE,
source: ActionManager.DEFAULT,
eval: () => true
},
{
name: "Rufen",
cost: ActionManager.FREE,
type: ActionManager.INTERACTION,
source: ActionManager.DEFAULT,
eval: () => true
},
{
name: "Sich zu Boden fallen lassen",
cost: ActionManager.FREE,
type: ActionManager.MOVEMENT,
source: ActionManager.DEFAULT,
eval: () => true
},
{
name: "Waffe oder Gegenstand fallen lassen",
cost: ActionManager.FREE,
type: ActionManager.INTERACTION,
source: ActionManager.DEFAULT,
eval: () => true
},
{
name: "getragenes Artefakt aktivieren",
cost: ActionManager.FREE,
type: ActionManager.INTERACTION,
source: ActionManager.DEFAULT,
eval: () => true
},
{
name: "Schnellziehen",
cost: ActionManager.FREE,
type: ActionManager.INTERACTION,
source: ActionManager.SF,
eval: () => this.#hatSonderfertigkeit("Schnellziehen")
}
]
#regularActions = [
{
name: "Angriffsaktion",
type: ActionManager.ATTACK,
cost: ActionManager.REGULAR,
source: ActionManager.DEFAULT,
eval: () => true
},
{
name: "Schnellschuss",
type: ActionManager.INTERACTION,
cost: ActionManager.CONTINUING,
source: ActionManager.DEFAULT,
eval: () => true
},
{
name: "Schnellschuss (Scharfschütze)",
type: ActionManager.INTERACTION,
cost: ActionManager.CONTINUING,
source: ActionManager.SF,
eval: () => this.#hatSonderfertigkeit("Scharfschütze")
},
{
name: "Abwehraktion",
type: ActionManager.DEFENSE,
cost: ActionManager.REGULAR,
source: ActionManager.DEFAULT,
eval: () => true
},
{
name: "Bewegen",
type: ActionManager.MOVEMENT,
cost: ActionManager.REGULAR,
source: ActionManager.DEFAULT,
eval: () => true
},
{
name: "Position",
type: ActionManager.MOVEMENT,
cost: ActionManager.REGULAR,
source: ActionManager.DEFAULT,
eval: () => true
},
{
name: "Finte",
type: ActionManager.ATTACK,
cost: ActionManager.REGULAR,
source: ActionManager.SF,
eval: () => this.#hatSonderfertigkeit("Finte")
},
{
name: "Wuchtschlag",
type: ActionManager.ATTACK,
cost: ActionManager.REGULAR,
source: ActionManager.SF,
eval: () => this.#hatSonderfertigkeit("Wuchtschlag")
},
{
name: "Betäubungsschlag",
type: ActionManager.ATTACK,
cost: ActionManager.REGULAR,
source: ActionManager.SF,
eval: () => this.#hatSonderfertigkeit("Betäubungsschlag")
}
]
#continuingActions = [
{
name: "Orientieren",
type: ActionManager.TALENT,
cost: ActionManager.CONTINUING,
source: ActionManager.DEFAULT,
eval: () => true
},
{
name: "Waffe ziehen",
type: ActionManager.INTERACTION,
cost: ActionManager.CONTINUING,
source: ActionManager.DEFAULT,
eval: () => true
},
{
name: "Sprinten",
type: ActionManager.MOVEMENT,
cost: ActionManager.CONTINUING,
source: ActionManager.DEFAULT,
eval: () => true
},
{
name: "Gegenstand benutzen",
type: ActionManager.INTERACTION,
cost: ActionManager.CONTINUING,
source: ActionManager.DEFAULT,
eval: () => true
},
{
name: "Schnellladen (Bogen)",
type: ActionManager.INTERACTION,
cost: ActionManager.CONTINUING,
source: ActionManager.SF,
eval: () => this.#hatSonderfertigkeit("Schnellladen (Bogen)")
},
{
name: "Schnellladen (Armbrust)",
type: ActionManager.INTERACTION,
cost: ActionManager.CONTINUING,
source: ActionManager.SF,
eval: () => this.#hatSonderfertigkeit("Schnellladen (Armbrust)")
},
{
name: "Nachladen",
type: ActionManager.INTERACTION,
cost: ActionManager.CONTINUING,
source: ActionManager.DEFAULT,
eval: () => true
},
{
name: "Talenteinsatz",
type: ActionManager.TALENT,
cost: ActionManager.CONTINUING,
source: ActionManager.DEFAULT,
eval: () => true
},
{
name: "Zaubern",
type: ActionManager.SPELL,
cost: ActionManager.CONTINUING,
source: ActionManager.SF,
eval: () => this.#hatSonderfertigkeitBeginnendMit("Repräsentation:")
},
{
name: "Liturgie wirken",
type: ActionManager.SPELL,
cost: ActionManager.CONTINUING,
source: ActionManager.SF,
eval: () => this.#hatSonderfertigkeitBeginnendMit("Liturgiekenntnis")
}
]
#hatSonderfertigkeitBeginnendMit(name) {
return this.actor.system.sonderfertigkeiten.find( p => p.name.startsWith(name) ) != null
}
#hatSonderfertigkeit(name) {
return this.actor.system.sonderfertigkeiten.find( p => p.name === name ) != null
}
evaluate() {
let actionArray = [...this.#freeActions, ...this.#regularActions, ...this.#continuingActions]
return actionArray.filter( action => action.eval() );
}
}

View File

@ -1,5 +1,6 @@
import {Character} from "../documents/character.mjs";
import {PlayerCharacterDataModel} from "../data/character.mjs";
import { ActionManager } from "./actions/action-manager.mjs";
export class CharacterSheet extends ActorSheet {
/**@override */
@ -40,6 +41,7 @@ export class CharacterSheet extends ActorSheet {
this.#addAttributesToContext(context)
this.#addEquipmentsToContext(context)
await this.#addCombatStatistics(context)
this.#addActionsToContext(context)
return context;
}
@ -181,6 +183,11 @@ export class CharacterSheet extends ActorSheet {
}
#addActionsToContext(context) {
const am = new ActionManager(this.object)
context.actions = am.evaluate()
}
async #addCombatStatistics(context) {
const actorData = context.data;

View File

@ -0,0 +1,11 @@
{
"_id": "1rZ9ZOobBzOWfqVT",
"_key": "!items!1rZ9ZOobBzOWfqVT",
"type": "Skill",
"name": "Anderthalbhänder",
"system": {
"gruppe": "Kampf",
"talent": "Die meisten anderthalbhändig geführten Schwerter und Säbel können zwar je nach Körperkraft des Helden auch mit den Talenten Schwerter, Säbel oder Zweihandschwerter/-säbel geführt werden, ihre wahren Fähigkeiten erkennt man jedoch nur, wenn man die für sie typischen Manöver in einer Kampftechnik erlernt hat: der schnelle Wechsel von einhän-diger zu zweihändiger Führung und zurück, daher auch der Name anderthalbhändig. Trotz ihres nicht unbeträchtlichen Gewichts können gut geführte Anderthalbhänder ein fast so variantenreiches Klingenspiel ermöglichen wie Fechtwaffen, weswegen dieses Talent auch gerne als die Königsdisziplin unter den Klingenwaffen angesehen wird."
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "Gaz7algdJ98nYFdW",
"_key": "!items!Gaz7algdJ98nYFdW",
"type": "Skill",
"name": "Armbrust",
"system": {
"gruppe": "Kampf",
"talent": "Zwar beziehen auch diese Waffen ihre Energie aus gespannten Bögen, verdrillten Sehnen oder mechanischen Federn, aber damit enden die Ähnlichkeiten mit Bögen auch schon. Alle armbrustähnlichen Waffen besitzen einen Schaft, einen Abzug und einen Spannmechanismus und sind prinzipiell durch Ausrichten aufs Ziel nund Auslösen des Abzugs abzuschießen."
}
}

View File

@ -5,6 +5,6 @@
"name": "Bogen",
"system": {
"gruppe": "Kampf",
"talent": ""
"talent": "Bögen sind die Waffe der Wahl für die Bewohner von Steppen, Wüsten und Auen, weswegen sowohl die Elfen wie auch die Orks, die Weidener wie auch die Novadis für ihre Künste mit dem Bogen bekannt sind. Die Größe dieser Schusswaffen reicht vom kompakten Kurzbogen der Novadis bis zum Weidener Langbogen. Der korrekte Umgang mit Pfeil und Bogen erfordert einiges an Übung."
}
}

View File

@ -5,6 +5,6 @@
"name": "Dolche",
"system": {
"gruppe": "Kampf",
"talent": ""
"talent": "Hierzu gehören alle zum Stich (und so gut wie nicht zur Parade) geeigneten Klingenwaffen mit einer maximalen Gesamtlänge von einem halben Schritt also vom als Waffe eingesetzten Essmesser bis hin zum Langdolch, dessen größte Exemplare fast schon als Kurzschwert gelten können. Fast alle Dolche haben eine gerade, beidseitig angeschliffene Klinge."
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "YeCewrwiq59JNcXl",
"_key": "!items!YeCewrwiq59JNcXl",
"type": "Skill",
"name": "Fechtwaffen",
"system": {
"gruppe": "Kampf",
"talent": "Dies sind schmale, fast ausschließlich zum Stich geeignete Klingenwaffen von knapp unter einem Schritt Klingenlänge mit meist reich verzierten Griffkörben, Parierbügeln oder kompliziert verdrehten Parierstangen. Sie sind elegant, schnell und gelten den einen als überaus modern, den anderen als lächerliche Geckenwaffen."
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "AyuUSXqf2vaOaU3Y",
"_key": "!items!AyuUSXqf2vaOaU3Y",
"type": "Skill",
"name": "Hiebwaffen",
"system": {
"gruppe": "Kampf",
"talent": "In diese Kategorie fallen all jene einhändig geführten Waffen, deren Schadenswirkung primär auf Wucht basiert und mit denen man punktförmig Schaden anrichtet, also zum einen Äxte, die aus einer schweren, breiten Klinge an einem Stiel bestehen und deren Schadenswirkung sowohl auf Wucht als auch auf der Schneidwirkung der Klinge (egal ob mit einem oder als Doppelblatt) beruht, zum anderen all jene Streitkolben, Keulen und Kriegshämmer, die möglichst viel Wucht auf einem Fleck konzentrieren sollen, um Rüstungen zu verbeulen (oder gar mit Stacheln und Schneidblättern zu durchdringen) und Knochen zu brechen. Die Maximallänge dieser Waffen ist etwa ein Schritt, das Maximalgewicht etwa drei Stein; alles darüber sind Zweihandwaffen."
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "wdEpxGfiElaeZjYp",
"_key": "!items!wdEpxGfiElaeZjYp",
"type": "Skill",
"name": "Infanteriewaffen",
"system": {
"gruppe": "Kampf",
"talent": "Bei diesen Waffen ist eine kurze Klinge an einem langen Stiel befestigt, wobei die Klinge meist sowohl zum Hieb als auch zum Stich geeignet ist; bisweilen finden sich auch Haken an der Waffe, um Gegner umzureißen oder vom Pferd zu ziehen."
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "uHBlf6uD6X7TSsHq",
"_key": "!items!uHBlf6uD6X7TSsHq",
"type": "Skill",
"name": "Kettenwaffen",
"system": {
"gruppe": "Kampf",
"talent": "Bei diesen Waffen ist eine Kugel oder ein anderes schweres Gewicht, meist noch mit Dornen oder Stacheln gespickt, am Ende einer Kette befestigt, deren Länge knapp unter der des Stiels ist, an dem sie befestigt ist. Es ist hinreichend schwierig, mit solchen Waffen zu parieren aber es ist auch schwer, den Angriff einer solchen Waffe abzuwehren, da man mit ihr auch um Schilde herumschlagen und einen solchen Hieb insgesamt schwer abwehren kann. Ebenfalls mit diesem Talent geführt werden alle Geißeln (als Disziplinierungsinstrumente) und kurzen Peitschen mit mehreren beschwerten Enden (wie die Neunschwänzige Katze)."
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "Jd5V9Hr74weHdgFY",
"_key": "!items!Jd5V9Hr74weHdgFY",
"type": "Skill",
"name": "Lanzenreiten",
"system": {
"gruppe": "Kampf",
"talent": "Dieses Talent stellt den Sturmangriff eines Berittenen mit eingelegter Lanze dar. Es ist ein reines Angriffstalent, das ähnlich wie Fernkampf-Fertigkeiten gehandhabt wird. Mit einer eingelegten Lanze ist es nicht möglich zu parieren."
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "tc4y62VM5L2eUpEo",
"_key": "!items!tc4y62VM5L2eUpEo",
"type": "Skill",
"name": "Raufen",
"system": {
"gruppe": "Kampf",
"talent": "Dies ist die Fertigkeit, durch Einsatz von Händen, Füßen und Zähnen Schaden anzurichten (womit Schwinger und Geraden, Krallenhiebe, Kopfstöße und Bisse, hochgezogene Knie und eingedrehte Sprungtrittealle unter dieses Talent fallen) oder diesem durch Blockieren, Auspendeln, Seitschritte etc. zu entgehen. Angriffe mit der bloßen Hand oder dem Fuß richten üblicherweise 1W6 TP(A) an: Diese Punkte werden von der Ausdauer abgezogen, die Hälfte zusätzlich noch von den Lebenspunkten."
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "xOgxMG12yiBKeThB",
"_key": "!items!xOgxMG12yiBKeThB",
"type": "Skill",
"name": "Ringen",
"system": {
"gruppe": "Kampf",
"talent": "Hierunter fallen alle Techniken, mit dennen man einen Gegner ergreifen, festhalten, umklammern, niederringen oder zu Boden schleudern kann sowie die Verteidigungsmöglichkeiten dagegen, die vom einfachen Auspendeln bis zum aktiven Entwinden reichen (womit man sich z.B. auch aus der Umschlingung eines Kraken oder einer Schlange befreien kann). Ringen-Angriffe richten als Wurf 1W6 TP(A) an oder bringen den Gegner in eine ungünstige Position und erleichtern damit folgende Angriffe oder halten ihn fest; mehr hierzu siehe Seite 151. Für TP(A) gilt allgemein: Diese Punkte werden von der Ausdauer abgezogen, die Hälfte zusätzlich noch von den LeP."
}
}

View File

@ -5,6 +5,6 @@
"name": "Schwerter",
"system": {
"gruppe": "Kampf",
"talent": ""
"talent": "Hierbei handelt es sich um Klingenwaffen mit einer Gesamtlänge von einem halben bis eineinviertel Schritt, wovon die beidseitig geschliffene Klinge mindestens drei Viertel der Länge ausmacht. Schwerter sind zum Hauen und Stechen gedacht, ihre Parierstange erlaubt auch anspruchsvollere Verteidigungsmanöver."
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "rI8REyd1RykEwrWG",
"_key": "!items!rI8REyd1RykEwrWG",
"type": "Skill",
"name": "Speere",
"system": {
"gruppe": "Kampf",
"talent": "Dies sind zum einen Waffen von max. 2 Schritt Länge, die üblicherweise einhändig und mit Schild geführt werden, zum anderen alle überlangen Speere, die ausschließlich zum zweihändigen Stoß geeignet sind und zu denen man nicht gleichzeitig Schilde führen kann. Kennzeichen eines Speers ist, dass er im Gegensatz zu Infanteriewaffen ausschließlich zum Stoß benutzt wird, während die Parade meist mit dem stumpfen Ende erfolgt (wenn man überhaupt mit dem Speer pariert, was bei den überlangen Waffen ohnehin kaum der Fall sein wird). Einhändige Speere können geworfen werden (zweihändige ebenso, aber meist mit einem wenig beeindruckenden Resultat)."
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "FuqulqVN3mVDpZcP",
"_key": "!items!FuqulqVN3mVDpZcP",
"type": "Skill",
"name": "Stäbe",
"system": {
"gruppe": "Kampf",
"talent": "Ein einfacher Holzstab von etwa acht Spann Länge kann eine durchaus effektive Waffe sein, wenn sie von einem Meister ihres Fachs geführt wird und meist sind Kampfstäbe keine einfachen Holzwaffen, sondern speziell gehärtet, mit Metallbändern umwunden oder gar mit Klingen an beiden Enden versehen. Stäbe sind zweihändig geführte Waffen; die gleichzeitige Benutzung eines Schildes ist nicht möglich."
}
}

View File

@ -1,10 +1,10 @@
{
"_id": "Msv0bWdwlNlF2etU",
"_key": "!items!Msv0bWdwlNlF2etU",
"_id": "P84aRNsfuMDTqiCT",
"_key": "!items!P84aRNsfuMDTqiCT",
"type": "Skill",
"name": "Säbel",
"system": {
"gruppe": "Kampf",
"talent": ""
"talent": "Im Gegensatz zu Schwertern werden diese Waffen vornehmlich zum Hieb, selten einmal zum Stich eingesetzt, und ebenfalls im Unterschied zu Schwertern haben sie meist nur eine Schneide (und eventuell eine ausgearbeitete Spitze). Diese Waffenkategorie reicht von kurzen Haumessern über elegante Reitersäbel bis hin zu schweren, fast schon axtähnlichen Waffen."
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "RlZCxOXeawtewWi9",
"_key": "!items!RlZCxOXeawtewWi9",
"type": "Skill",
"name": "Wurfbeile",
"system": {
"gruppe": "Kampf",
"talent": "Diese vor allem bei Piraten wie den Thorwalern gebräuchliche Fernkampfwaffe ist schwierig zu handhaben, da sie während des Fluges um die Querachse rotiert. Die meisten Wurfäxte sind scharf an allen Kanten und bestehen gänzlich aus Metall. Ebenfalls mit diesem Talent eingesetzt werden alle sich ebenfalls überschlagenden Wurfkolben und Wurfhölzer."
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "Iwgq2pQyTm7j9dso",
"_key": "!items!Iwgq2pQyTm7j9dso",
"type": "Skill",
"name": "Wurfmesser",
"system": {
"gruppe": "Kampf",
"talent": "Messer und Dolche sind die am weitesten verbreiteten Wurfwaffen, aber nicht jedes Messer, jeder Dolch ist zum Werfen geeignet. Wurftauglich sind nur speziell ausgewogene Waffen, die meistens über einen besonders leichten Griff verfügen. Auch Wurfscheiben und -ringe fallen in diese Kategorie, ebenso wie Wurfpfeile und -dorne."
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "JDyuelQrB5Baha1V",
"_key": "!items!JDyuelQrB5Baha1V",
"type": "Skill",
"name": "Wurfspeere",
"system": {
"gruppe": "Kampf",
"talent": "Der Wurfspeer ist eine bei allen Völkern gebräuchliche Jagdwaffe und wurde einst auch in größerem Umfang in den aventurischen Armeen eingesetzt. Es gibt Wurfspeere in verschiedenen Größen und auch solche, die mit kurzen Schleuderhölzern beschleunigt werden."
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "EWlqFBI5ThyexcTs",
"_key": "!items!EWlqFBI5ThyexcTs",
"type": "Skill",
"name": "Zweihand-Hiebwaffen",
"system": {
"gruppe": "Kampf",
"talent": "Bei diesen Waffen kommt es darauf an, die schwere (und bisweilen scharfe) Schlagfläche mit großer Wucht punktgenau ins Ziel zu bringen, da der Stiel der Waffe kaum Schaden anrichtet; für Stiche und Stöße sind diese Waffen nicht geeignet, ebenso sind ihre Paradefähigkeiten stark eingeschränkt."
}
}

View File

@ -0,0 +1,10 @@
{
"_id": "WfSR1wXjmWJcdMLo",
"_key": "!items!WfSR1wXjmWJcdMLo",
"type": "Skill",
"name": "Zweihandschwerter/-säbel",
"system": {
"gruppe": "Kampf",
"talent": "Unter dieses Talent fallen alle besonders langen Klingenwaffen, die in erster Linie zum Hieb gedacht sind, mit denen sich allerdings auch auf kürzere Distanz zustoßen lässt und mit denen auch Paraden noch angemessen möglich sind (auch wenn sämtliche Aktionen etwas langsamer vonstatten gehen als mit den universell einsetzbaren Anderthalbhändern, die ebenfalls in diese Kategorie fallen, da sie ähnlich eingesetzt werden)."
}
}

View File

@ -11,12 +11,16 @@ $talent-knowledge-color: #d319ba;
$talent-language-color: #573bbc;
$talent-crafting-color: #ae6813;
$harm-fill-color: #ff0000ff;
$harm-border-color: #3c0000ff;
$tab-border-color: #333;
$tab-color: #000;
$tab-inactive-background-color: unset;
$tab-background-color: #fff8;
$dice-box-shadow: rgba(0, 0, 0, 0.25);
$pill-box-shadow: rgba(0, 0, 0, 0.3);
$attribute-die-border-color: #000;
$attribute-die-color: #F00;
@ -28,3 +32,9 @@ $rollable-die-border-color: #000;
$dice-box-border-color: #333;
$default-action: #c41;
$default-action-color: #FFF;
$special-action: #42c;
$special-action-color: #FFF;

View File

@ -0,0 +1,171 @@
@use "_colours" as colour;
@use 'sass:color';
@use "_numbers";
.dsa41.sheet.actor.creature {
.window-content {
form {
display: grid;
grid-template-columns: 1fr;
grid-template-rows: 74px 30px 1fr;
.sheet-header {
height: 64px;
display: grid;
grid-template-columns: 64px max-content;
grid-template-rows: 1fr;
gap: 0 8px;
img {
width: 64px;
height: 64px;
}
input {
line-height: 64px;
height: 64px;
font-size: 2rem;
}
}
.sheet-body {
.tab {
margin: 8px;
height: 100%;
div.input {
height: 32px;
display: grid;
grid-template-columns: 120px 1fr;
&.compound {
grid-template-columns: 120px 140px 1fr;
span {
width: 120px;
}
input {
width: 100px;
}
}
label {
height: 32px;
width: 100%;
span {
width: 120px;
text-align: left;
line-height: 32px;
vertical-align: middle;
display: inline-block;
}
input {
text-align: right;
line-height: 32px;
vertical-align: middle;
padding-left: 120px;
display: inline-block;
}
}
}
table.attacks-table {
td {
padding: 2px 4px;
}
}
.rollable.tablecell {
position: relative;
.attacks-die {
width: 24px;
height: 24px;
position: absolute;
left: 4px;
top: 4px;
bottom: 2px;
z-index: 1;
svg {
stroke-width: 0.5;
.border {
fill: colour.$harm-fill-color;
stroke: colour.$harm-border-color;
}
.center {
fill: colour.$harm-fill-color;
stroke: colour.$harm-border-color;
}
.topleft {
fill: color.adjust(colour.$harm-fill-color, $lightness: numbers.$lighter_factor);
stroke: colour.$harm-border-color;
}
.bottomleft {
fill: color.adjust(colour.$harm-fill-color, $lightness: numbers.$lightest_factor);
stroke: colour.$harm-border-color;
}
.topright {
fill: color.adjust(colour.$harm-fill-color, $lightness: numbers.$darken_factor);
stroke: colour.$harm-border-color;
}
.bottomright, .bottom {
fill: color.adjust(colour.$harm-fill-color, $lightness: numbers.$darkest_factor);
stroke: colour.$harm-border-color;
}
}
}
input {
position: absolute;
left: 16px;
top: 4px;
bottom: 2px;
right: 4px;
width: unset;
text-indent: 12px;
}
}
.button-inline {
border: unset;
background: unset;
}
.editor {
height: 100%;
}
}
}
}
}
}

View File

@ -1,3 +1,5 @@
@use "./_colours";
@use "./_numbers";
.app.window-app.dsa41.sheet.item.equipment {
.sheet-body {
@ -20,7 +22,7 @@
grid-auto-columns: 1fr 1fr;
grid-template-columns: 80px auto;
grid-template-rows: 24px 48px auto 48px;
gap: 0px 0px;
gap: 0 0;
grid-template-areas:
"category category"
"quantity name"
@ -114,7 +116,7 @@
line-height: 24px;
vertical-align: middle;
padding: 0 8px;
box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
box-shadow: numbers.$pill-box-inset numbers.$pill-box-inset numbers.$pill-box-blur-radius colours.$pill-box-shadow;
}
}

View File

@ -14,3 +14,6 @@ $die-border-width: 1px;
$dice-box-inset: 4px;
$dice-box-blur-radius: 4px;
$dice-box-border-width: 1px;
$pill-box-inset: 2px;
$pill-box-blur-radius: 4px;

View File

@ -0,0 +1,26 @@
@use "./_colours";
@use "./_numbers";
@use "sass:color";
.player-action {
display: inline-block;
width: 120px;
height: 80px;
float: left;
margin: 0 8px 8px 0;
border: 1px solid #333;
background-color: color.scale(colours.$default-action, $alpha: 20%);
color: colours.$default-action-color;
border-radius: 4px;
box-shadow: numbers.$pill-box-inset numbers.$pill-box-inset numbers.$pill-box-blur-radius colours.$pill-box-shadow;
&.special-ability {
background-color: color.scale(colours.$special-action, $alpha: 20%);
color: colours.$special-action-color;
}
}

View File

@ -205,4 +205,3 @@ $rollable_colours: (
@include coloring("Wissen");
@include coloring("Sprachen");
@include coloring("Handwerk");

View File

@ -10,6 +10,7 @@
display: flow;
border-top: unset;
border-bottom: unset;
margin-bottom: 9px;
a.item[data-tab] {

View File

@ -7,3 +7,5 @@
@use "_tabs";
@use "_equipment-sheet";
@use "_paperdoll";
@use "_creature-sheet";
@use "_player-action";

View File

@ -105,6 +105,12 @@
<input type="number" name="system.aup.max" value="{{actor.system.aup.max}}"/>
</div>
<div class="actions">
{{#each this.actions}}
{{> "systems/DSA_4-1/templates/ui/partial-action-button.hbs" this}}
{{/each}}
</div>
</div>
<div class="tab skills" data-group="primary" data-tab="skills">
<div>

View File

@ -0,0 +1,6 @@
<div class="player-action {{this.source}} {{this.type}}">
<span class="name">{{this.name}}</span>
<span class="time">{{this.cost}}</span>
</div>