Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1ccc9d2c34 | |||
| 9653672372 | |||
| c8a0dc7168 | |||
| 0de6a7e051 | |||
| eb0ab56794 | |||
| 4d96c15066 | |||
| fb5c408bbd | |||
| eea83aa10e | |||
| d03c5f2c1e | |||
| 1f2d82bd0b | |||
| 151312b994 |
15
README.md
@@ -1,5 +1,14 @@
|
||||
# Hellborn Descended RPG
|
||||
# Hellborn Descended for Foundry VTT
|
||||
|
||||
## Description
|
||||
Enjoy Hellborn and all it's infernal glory on Foundry with this fully operational and detailed system for the greatest VTT in the world!
|
||||
|
||||
Hellborn Descended RPG for Foundry VTT is system.
|
||||
This system & product are used with permission granted as part of the partnership agreement between Foundry Gaming LLC and Studio Hex. It uses the following trademarks and/or copyrights:
|
||||
|
||||
© 2025 Studio Hex. Content copyright Alkis "Fern" Nteli-Stavrianeas, Eduard Gabriel Schuler. All rights reserved.
|
||||
Hellborn, Hellborn Descended is a trademark of Studio Hex.
|
||||
|
||||
No part of this publication may be reproduced, distributed, or transmitted in any form or by any means without the prior written permission of the copyright holder, except in the case of brief quotations used in reviews or educational purposes.
|
||||
|
||||
For inquiries on developing content for this ruleset please contact Studiohexgame@gmail, or either one of the copyright holders on Discord. Feel free to join our Discord server for further inquiries: https://discord.gg/qaWRhdEgBE
|
||||
|
||||
Foundry system by Uberwald ( https://www.uberwald.me )
|
||||
BIN
assets/tarots/0_The_Fool.webp
Normal file
|
After Width: | Height: | Size: 648 KiB |
BIN
assets/tarots/11_Justice.webp
Normal file
|
After Width: | Height: | Size: 357 KiB |
BIN
assets/tarots/13_Death.webp
Normal file
|
After Width: | Height: | Size: 417 KiB |
BIN
assets/tarots/15_The_Devil.webp
Normal file
|
After Width: | Height: | Size: 348 KiB |
BIN
assets/tarots/1_The_Magician.webp
Normal file
|
After Width: | Height: | Size: 406 KiB |
BIN
assets/tarots/21_The_World.webp
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
assets/tarots/2_The_High_Priestess.webp
Normal file
|
After Width: | Height: | Size: 545 KiB |
BIN
assets/tarots/6_The_Lovers.webp
Normal file
|
After Width: | Height: | Size: 404 KiB |
BIN
assets/tarots/8_Strength.webp
Normal file
|
After Width: | Height: | Size: 338 KiB |
BIN
assets/tarots/9_The_Hermit.webp
Normal file
|
After Width: | Height: | Size: 299 KiB |
BIN
assets/ui/banner_compendium.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
@@ -212,6 +212,10 @@ i.fvtt-hellborn {
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
}
|
||||
.fvtt-hellborn .character-main .character-pc .character-right .character-definition .character-definition-pronouns input {
|
||||
min-width: 21.2rem;
|
||||
max-width: 21.2rem;
|
||||
}
|
||||
.fvtt-hellborn .character-main .character-pc .character-right .character-definition .form-group {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -558,6 +562,10 @@ i.fvtt-hellborn {
|
||||
min-width: 4.5rem;
|
||||
max-width: 4.5rem;
|
||||
}
|
||||
.fvtt-hellborn .tab.character-equipment .main-div .weapons .weapon .ammoQuantity {
|
||||
min-width: 4.2rem;
|
||||
max-width: 4.2rem;
|
||||
}
|
||||
.fvtt-hellborn .tab.character-equipment .main-div .weapons .weapon .type {
|
||||
min-width: 3rem;
|
||||
max-width: 3rem;
|
||||
@@ -703,6 +711,29 @@ i.fvtt-hellborn {
|
||||
height: 24px;
|
||||
margin: 4px 0 0 0;
|
||||
}
|
||||
.fvtt-hellborn .tab.character-biography .main-div .aliases {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
margin-bottom: 4px;
|
||||
margin-left: 4px;
|
||||
}
|
||||
.fvtt-hellborn .tab.character-biography .main-div .aliases .form-group {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
margin-left: 4px;
|
||||
}
|
||||
.fvtt-hellborn .tab.character-biography .main-div .aliases .form-group label {
|
||||
min-width: 6rem;
|
||||
max-width: 6rem;
|
||||
}
|
||||
.fvtt-hellborn .tab.character-biography .main-div .aliases input {
|
||||
text-align: left;
|
||||
min-width: 41rem;
|
||||
max-width: 41rem;
|
||||
}
|
||||
.fvtt-hellborn .tab.character-biography .main-div .biodata {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
@@ -1938,6 +1969,9 @@ i.fvtt-hellborn {
|
||||
.fvtt-hellborn .tarot-content fieldset {
|
||||
margin-top: 8px;
|
||||
}
|
||||
.fvtt-hellborn .tarot-content fieldset legend {
|
||||
margin-top: 1rem;
|
||||
}
|
||||
.fvtt-hellborn .tarot-content fieldset .form-group {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -1955,6 +1989,17 @@ i.fvtt-hellborn {
|
||||
min-width: 12rem;
|
||||
max-width: 12rem;
|
||||
}
|
||||
.fvtt-hellborn .tarot-content fieldset .flexrow,
|
||||
.fvtt-hellborn .tarot-content fieldset .scrollable-content {
|
||||
align-items: flex-start;
|
||||
}
|
||||
.fvtt-hellborn .tarot-content fieldset .tarot-pic {
|
||||
margin-left: 1rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-start;
|
||||
align-items: center;
|
||||
}
|
||||
.fvtt-hellborn .tarot-content .header {
|
||||
display: flex;
|
||||
}
|
||||
@@ -2414,11 +2459,43 @@ i.fvtt-hellborn {
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.item-to-chat ul .tarot-spacing {
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
.item-to-chat ul li {
|
||||
margin: 0 10px;
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
}
|
||||
.item-to-chat ul li p {
|
||||
margin: 0;
|
||||
}
|
||||
.item-to-chat .tarot-item-img {
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
.flavor-text-damage {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
color: var(--color-dark-2);
|
||||
margin-top: 0px;
|
||||
align-items: center;
|
||||
}
|
||||
.flavor-text-damage .chat-damage-type {
|
||||
font-weight: bold;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
.flavor-text-damage h2 {
|
||||
text-align: center;
|
||||
margin-top: 4px;
|
||||
margin-left: 4px;
|
||||
margin-bottom: 0px;
|
||||
font-family: var(--font-title);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
color: var(--title-color);
|
||||
}
|
||||
.dice-roll {
|
||||
flex-direction: column;
|
||||
}
|
||||
@@ -2441,6 +2518,14 @@ i.fvtt-hellborn {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
.dice-roll .intro-chat h2 {
|
||||
margin-top: 10px;
|
||||
margin-left: 10px;
|
||||
margin-bottom: 4px;
|
||||
font-family: var(--font-title);
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
color: var(--title-color);
|
||||
}
|
||||
.dice-roll .intro-chat .intro-img {
|
||||
padding: 4px;
|
||||
max-width: 80px;
|
||||
@@ -2464,6 +2549,12 @@ i.fvtt-hellborn {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
}
|
||||
.dice-roll .intro-chat .intro-right ul .chat-roll-label {
|
||||
margin-right: 2rem;
|
||||
}
|
||||
.dice-roll .intro-chat .intro-right ul .chat-results-spacing {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
.dice-roll .intro-chat .intro-right ul .nudge-roll {
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
margin-left: 4rem;
|
||||
|
||||
@@ -30,6 +30,11 @@ Hooks.once("init", function () {
|
||||
documents,
|
||||
}
|
||||
|
||||
CONFIG.Combat.initiative = {
|
||||
formula: '3d6 + @stats.mind.value',
|
||||
decimals: 0
|
||||
};
|
||||
|
||||
CONFIG.Actor.documentClass = documents.HellbornActor
|
||||
CONFIG.Actor.dataModels = {
|
||||
character: models.HellbornCharacter,
|
||||
|
||||
13
lang/en.json
@@ -64,6 +64,9 @@
|
||||
"age": {
|
||||
"label": "Age"
|
||||
},
|
||||
"aliases": {
|
||||
"label": "Aliases"
|
||||
},
|
||||
"birthplace": {
|
||||
"label": "Birthplace"
|
||||
},
|
||||
@@ -76,6 +79,9 @@
|
||||
"hair": {
|
||||
"label": "Hair"
|
||||
},
|
||||
"dod": {
|
||||
"label": "Date of Death"
|
||||
},
|
||||
"height": {
|
||||
"label": "Height"
|
||||
},
|
||||
@@ -477,10 +483,10 @@
|
||||
"label": "Duration"
|
||||
},
|
||||
"maintain": {
|
||||
"label": "Maintain"
|
||||
"label": "Passive"
|
||||
},
|
||||
"choiceMaintainDuration": {
|
||||
"label": "Choice Maintain/Duration"
|
||||
"label": "Passive/Duration"
|
||||
},
|
||||
"description": {
|
||||
"label": "Description"
|
||||
@@ -649,6 +655,9 @@
|
||||
"ammo": {
|
||||
"label": "Ammo"
|
||||
},
|
||||
"ammoQuantity": {
|
||||
"label": "Ammo Quantity"
|
||||
},
|
||||
"cost": {
|
||||
"label": "Cost"
|
||||
},
|
||||
|
||||
@@ -19,6 +19,7 @@ export default class HellbornCharacterSheet extends HellbornActorSheet {
|
||||
createMalefica: HellbornCharacterSheet.#onCreateMalefica,
|
||||
createRitual: HellbornCharacterSheet.#onCreateRitual,
|
||||
createPerk: HellbornCharacterSheet.#onCreatePerk,
|
||||
modifyAmmo: HellbornCharacterSheet.#onModifyAmmo,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -169,6 +170,18 @@ export default class HellbornCharacterSheet extends HellbornActorSheet {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newPerk"), type: "perk" }])
|
||||
}
|
||||
|
||||
static async #onModifyAmmo(event, target) {
|
||||
const quantity = parseInt($(event.target).data("quantity"))
|
||||
const itemId = $(event.target).data("item-id")
|
||||
const item = this.document.items.get(itemId)
|
||||
if (!item) {
|
||||
console.warn(`HellbornCharacterSheet: Item with ID ${itemId} not found`)
|
||||
return
|
||||
}
|
||||
const currentAmmo = item.system.ammoQuantity || 0
|
||||
const newAmmo = Math.max(0, currentAmmo + quantity) // Ensure ammo doesn't go below 0
|
||||
await item.update({ "system.ammoQuantity": newAmmo })
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the roll action triggered by user interaction.
|
||||
|
||||
@@ -53,24 +53,24 @@ export const CHOICE_ADVANTAGES_DISADVANTAGES ={
|
||||
export const PERK_ROLES = {
|
||||
"abbetor": { id: "abbetor", label: "Abbetor" },
|
||||
"blade": { id: "blade", label: "Blade" },
|
||||
"other": { id: "other", label: "Other" },
|
||||
"gunslinger": { id: "gunslinger", label: "Gunslinger" },
|
||||
"malefic": { id: "malefic", label: "Malefic" },
|
||||
"mastermind": { id: "mastermind", label: "Mastermind" },
|
||||
"sentinel": { id: "sentinel", label: "Sentinel" },
|
||||
"slayer": { id: "slayer", label: "Slayer" },
|
||||
"wretch": { id: "wretch", label: "Wretch" },
|
||||
"other": { id: "other", label: "Other" },
|
||||
}
|
||||
|
||||
export const MALEFICA_DOMAINS = {
|
||||
"adfectus": { id: "adfectus", label: "Adfectus" },
|
||||
"other": { id: "other", label: "Other" },
|
||||
"divinus": { id: "divinus", label: "Divinus" },
|
||||
"ignis": { id: "ignis", label: "Ignis" },
|
||||
"iunctio": { id: "iunctio", label: "Iunctio" },
|
||||
"speculo": { id: "speculo", label: "Speculo" },
|
||||
"vinculum": { id: "vinculum", label: "Vinculum" },
|
||||
"vita": { id: "vita", label: "Vita" },
|
||||
"other": { id: "other", label: "Other" },
|
||||
}
|
||||
|
||||
export const PERK_LEVELS = {
|
||||
|
||||
@@ -91,15 +91,16 @@ export default class HellbornRoll extends Roll {
|
||||
case "damage":
|
||||
{
|
||||
let formula = options.rollItem.system.damage
|
||||
if (options.rollItem.system.damageStat !== "none") {
|
||||
let statKey = options.rollItem.system.damageStat.toLowerCase()
|
||||
if (options.rollItem?.system?.damageStat && options.rollItem.system.damageStat !== "none" && options.rollItem.system.damageStat !== "") {
|
||||
let statKey = options.rollItem.system?.damageStat.toLowerCase()
|
||||
let statValue = actor.system.stats[statKey].value
|
||||
formula = `${formula} + ${statValue}`
|
||||
}
|
||||
let damageRoll = new Roll(formula)
|
||||
await damageRoll.evaluate()
|
||||
await damageRoll.toMessage({
|
||||
flavor: `${options.rollItem.name} - Damage Roll - ${options.rollItem.system.damageType}`,
|
||||
flavor: `<div class="flavor-text-damage"><h2>${options.rollItem.name}</h2>
|
||||
<BR><span class="chat-damage-type"><span>${options.rollItem.system.damageType}</span></span></div>`,
|
||||
});
|
||||
return
|
||||
}
|
||||
@@ -199,7 +200,17 @@ export default class HellbornRoll extends Roll {
|
||||
|
||||
options.nbAdvantages = Number(options.nbAdvantages)
|
||||
options.nbDisadvantages = Number(options.nbDisadvantages)
|
||||
let diceFormula = `3D6 + ${options.nbAdvantages}D6kh - ${options.nbDisadvantages}D6kh + ${options.rollItem.value}`
|
||||
let dice = 3;
|
||||
let keep = ""
|
||||
if ((options.nbAdvantages !== options.nbDisadvantages) && options.nbAdvantages > 0 || options.nbDisadvantages > 0) {
|
||||
dice = 3 + Math.abs(options.nbAdvantages - options.nbDisadvantages)
|
||||
if (options.nbAdvantages > options.nbDisadvantages) {
|
||||
keep = "kh3"
|
||||
} else if (options.nbAdvantages < options.nbDisadvantages) {
|
||||
keep = "kl3"
|
||||
}
|
||||
}
|
||||
let diceFormula = `${dice}D6${keep} + ${options.rollItem.value}`
|
||||
const roll = new this(diceFormula, options.data, rollData)
|
||||
await roll.evaluate()
|
||||
console.log("Roll", rollData, roll)
|
||||
@@ -235,16 +246,14 @@ export default class HellbornRoll extends Roll {
|
||||
commonResult = Object.entries(commonResult).reduce((a, b) => (a[1] > b[1]) ? a : b)[0]
|
||||
let nbEqual = workResults.filter(r => Number(r.result) === Number(commonResult)).length
|
||||
|
||||
if (commonResult >= 4 && nbEqual >= 2) {
|
||||
nbEqual += (options.nbAdvantages > 0 && roll.terms[2].total === commonResult) ? 1 : 0
|
||||
this.options.satanicSuccess = nbEqual >= 3
|
||||
if (resultType === "success" && commonResult >= 4 && nbEqual >= 3) {
|
||||
this.options.satanicSuccess = true
|
||||
if (this.options.satanicSuccess) {
|
||||
resultType = "success"
|
||||
}
|
||||
}
|
||||
if (commonResult <= 3 && nbEqual >= 2) {
|
||||
nbEqual += (options.nbDisadvantages > 0 && roll.terms[4].total === commonResult) ? 1 : 0
|
||||
this.options.fiendishFailure = nbEqual >= 3
|
||||
if (resultType === "failure" && commonResult <= 3 && nbEqual >= 3) {
|
||||
this.options.fiendishFailure = true
|
||||
if (this.options.fiendishFailure) {
|
||||
resultType = "failure"
|
||||
}
|
||||
@@ -253,8 +262,6 @@ export default class HellbornRoll extends Roll {
|
||||
this.options.isSuccess = resultType === "success"
|
||||
this.options.isFailure = resultType === "failure"
|
||||
this.options.results = roll.terms[0].results
|
||||
this.options.advantageResult = roll.terms[2].total
|
||||
this.options.disadvantageResult = roll.terms[4].total
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -112,16 +112,16 @@ export default class HellbornActor extends foundry.abstract.TypeDataModel {
|
||||
})
|
||||
|
||||
schema.biodata = new fields.SchemaField({
|
||||
age: new fields.NumberField({ ...requiredInteger, initial: 15, min: 6 }),
|
||||
age: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||
gender: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||
height: new fields.NumberField({ ...requiredInteger, initial: 170, min: 50 }),
|
||||
height: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||
eyes: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||
birthplace: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||
hair: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||
home: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||
weight: new fields.NumberField({ ...requiredInteger, initial: 70, min: 1 }),
|
||||
apparentAge: new fields.NumberField({ ...requiredInteger, initial: 20, min: 1 }),
|
||||
chronologicalAge: new fields.NumberField({ ...requiredInteger, initial: 20, min: 1 }),
|
||||
weight: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||
apparentAge: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||
chronologicalAge: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||
dod: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||
soul: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||
aliases: new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
|
||||
@@ -12,7 +12,7 @@ export default class HellbornMalefica extends foundry.abstract.TypeDataModel {
|
||||
schema.level = new fields.StringField({ required: true, nullable: false, choices: SYSTEM.MALEFICA_LEVELS, initial: "1" })
|
||||
schema.time = new fields.StringField({ required: true, initial : "" })
|
||||
|
||||
schema.choiceMaintainDuration = new fields.StringField({ required: true, initial : "maintain", choices: {"maintain": "Maintain", "duration": "Duration"} })
|
||||
schema.choiceMaintainDuration = new fields.StringField({ required: true, initial : "maintain", choices: {"maintain": "Passive", "duration": "Duration"} })
|
||||
schema.duration = new fields.StringField({ required: true, initial : "" })
|
||||
schema.maintain = new fields.StringField({ required: true, initial : "" })
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ export default class HellbornTarot extends foundry.abstract.TypeDataModel {
|
||||
schema.bonus = new fields.StringField({ required: true, nullable: false, initial: "" });
|
||||
schema.penalty = new fields.StringField({ required: true, nullable: false, initial: "" });
|
||||
|
||||
schema.orientation = new fields.StringField({ required: true, initial: "Upright", choices: {"Upright": {label: "Upright"}, "Downright": {label: "Downright"}} });
|
||||
schema.orientation = new fields.StringField({ required: true, initial: "Upright", choices: {"Upright": {label: "Upright"}, "Downright": {label: "Reversed"}} });
|
||||
schema.description = new fields.HTMLField({ required: true, textSearch: true })
|
||||
schema.positiveEffect = new fields.HTMLField({ required: true, textSearch: true })
|
||||
schema.negativeEffect = new fields.HTMLField({ required: true, textSearch: true })
|
||||
|
||||
@@ -18,6 +18,7 @@ export default class HellbornWeapon extends foundry.abstract.TypeDataModel {
|
||||
schema.damageType = new fields.StringField({ required: false, initial : "Physical" })
|
||||
|
||||
schema.ammo = new fields.StringField({ required: false, initial: "" })
|
||||
schema.ammoQuantity = new fields.NumberField({ required: true, initial: 0, min: 0 })
|
||||
schema.range = new fields.StringField({ required: false, initial: "" })
|
||||
schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0 })
|
||||
|
||||
|
||||
BIN
packs-system/hellborn-quickstart/000014.ldb
Normal file
0
packs-system/hellborn-quickstart/000021.log
Normal file
1
packs-system/hellborn-quickstart/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000019
|
||||
0
packs-system/hellborn-quickstart/LOCK
Normal file
8
packs-system/hellborn-quickstart/LOG
Normal file
@@ -0,0 +1,8 @@
|
||||
2025/07/01-14:30:17.386227 7f0793fff6c0 Recovering log #17
|
||||
2025/07/01-14:30:17.395654 7f0793fff6c0 Delete type=3 #15
|
||||
2025/07/01-14:30:17.395704 7f0793fff6c0 Delete type=0 #17
|
||||
2025/07/01-14:30:49.376073 7f07923ff6c0 Level-0 table #22: started
|
||||
2025/07/01-14:30:49.376135 7f07923ff6c0 Level-0 table #22: 0 bytes OK
|
||||
2025/07/01-14:30:49.383661 7f07923ff6c0 Delete type=0 #20
|
||||
2025/07/01-14:30:49.406833 7f07923ff6c0 Manual compaction at level-0 from '!folders!0d8PWsAGxiRfOlkP' @ 72057594037927935 : 1 .. '!items!zCOHBP3SYlGAY6zI' @ 0 : 0; will stop at (end)
|
||||
2025/07/01-14:30:49.417059 7f07923ff6c0 Manual compaction at level-1 from '!folders!0d8PWsAGxiRfOlkP' @ 72057594037927935 : 1 .. '!items!zCOHBP3SYlGAY6zI' @ 0 : 0; will stop at (end)
|
||||
8
packs-system/hellborn-quickstart/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
||||
2025/06/30-22:25:13.089120 7f07937fe6c0 Recovering log #12
|
||||
2025/06/30-22:25:13.141380 7f07937fe6c0 Delete type=3 #10
|
||||
2025/06/30-22:25:13.141434 7f07937fe6c0 Delete type=0 #12
|
||||
2025/06/30-22:34:15.665682 7f07923ff6c0 Level-0 table #18: started
|
||||
2025/06/30-22:34:15.665712 7f07923ff6c0 Level-0 table #18: 0 bytes OK
|
||||
2025/06/30-22:34:15.671514 7f07923ff6c0 Delete type=0 #16
|
||||
2025/06/30-22:34:15.696997 7f07923ff6c0 Manual compaction at level-0 from '!folders!0d8PWsAGxiRfOlkP' @ 72057594037927935 : 1 .. '!items!zCOHBP3SYlGAY6zI' @ 0 : 0; will stop at (end)
|
||||
2025/06/30-22:34:15.707753 7f07923ff6c0 Manual compaction at level-1 from '!folders!0d8PWsAGxiRfOlkP' @ 72057594037927935 : 1 .. '!items!zCOHBP3SYlGAY6zI' @ 0 : 0; will stop at (end)
|
||||
BIN
packs-system/hellborn-quickstart/MANIFEST-000019
Normal file
@@ -65,12 +65,18 @@
|
||||
gap: 5px;
|
||||
|
||||
.character-definition {
|
||||
.character-definition-pronouns {
|
||||
input {
|
||||
min-width: 21.2rem;
|
||||
max-width: 21.2rem;
|
||||
}
|
||||
}
|
||||
.form-group {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
.splitted {
|
||||
.splitted {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
gap: 4px;
|
||||
@@ -183,15 +189,15 @@
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
margin-left: 4px;
|
||||
.characteristics-label{
|
||||
.characteristics-label {
|
||||
color: grey;
|
||||
font-size:small;
|
||||
font-size: small;
|
||||
}
|
||||
label {
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
}
|
||||
.spaced-left{
|
||||
.spaced-left {
|
||||
margin-left: 0.8rem;
|
||||
}
|
||||
input {
|
||||
@@ -432,6 +438,10 @@
|
||||
min-width: 4.5rem;
|
||||
max-width: 4.5rem;
|
||||
}
|
||||
.ammoQuantity {
|
||||
min-width: 4.2rem;
|
||||
max-width: 4.2rem;
|
||||
}
|
||||
.type {
|
||||
min-width: 3rem;
|
||||
max-width: 3rem;
|
||||
@@ -585,6 +595,29 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
.aliases {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
margin-bottom: 4px;
|
||||
margin-left: 4px;
|
||||
.form-group {
|
||||
label {
|
||||
min-width: 6rem;
|
||||
max-width: 6rem;
|
||||
}
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
margin-left: 4px;
|
||||
}
|
||||
input {
|
||||
text-align: left;
|
||||
min-width: 41rem;
|
||||
max-width: 41rem;
|
||||
}
|
||||
}
|
||||
.biodata {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
.item-to-chat {
|
||||
h2 {
|
||||
margin-top: 10px;
|
||||
margin-left:10px;
|
||||
margin-left: 10px;
|
||||
margin-bottom: 4px;
|
||||
font-family: var(--font-title);
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
@@ -69,12 +69,45 @@
|
||||
margin: 0;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
.tarot-spacing {
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
li {
|
||||
margin: 0 10px;
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
p {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
.tarot-item-img {
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
.flavor-text-damage {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
color: var(--color-dark-2);
|
||||
margin-top: 0px;
|
||||
align-items: center;
|
||||
.chat-damage-type {
|
||||
font-weight: bold;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
h2 {
|
||||
text-align: center;
|
||||
margin-top: 4px;
|
||||
margin-left: 4px;
|
||||
margin-bottom: 0px;
|
||||
font-family: var(--font-title);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
color: var(--title-color);
|
||||
}
|
||||
}
|
||||
|
||||
&.dice-roll {
|
||||
@@ -98,10 +131,19 @@
|
||||
border-radius: 20px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
h2 {
|
||||
margin-top: 10px;
|
||||
margin-left: 10px;
|
||||
margin-bottom: 4px;
|
||||
font-family: var(--font-title);
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
color: var(--title-color);
|
||||
}
|
||||
|
||||
.intro-img {
|
||||
padding: 4px;
|
||||
max-width: 80px;
|
||||
min-width : 80px;
|
||||
min-width: 80px;
|
||||
align-self: top;
|
||||
text-align: center;
|
||||
}
|
||||
@@ -119,6 +161,12 @@
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
}
|
||||
.chat-roll-label {
|
||||
margin-right: 2rem;
|
||||
}
|
||||
.chat-results-spacing {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
.nudge-roll {
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
margin-left: 4rem;
|
||||
@@ -158,6 +206,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.result {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
|
||||
fieldset {
|
||||
margin-top: 8px;
|
||||
legend {
|
||||
margin-top: 1rem;
|
||||
}
|
||||
.form-group {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -21,8 +24,18 @@
|
||||
min-width: 12rem;
|
||||
max-width: 12rem;
|
||||
}
|
||||
.flexrow,
|
||||
.scrollable-content {
|
||||
align-items: flex-start;
|
||||
}
|
||||
.tarot-pic {
|
||||
margin-left: 1rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-start; // aligne le contenu en haut
|
||||
align-items: center; // ce }
|
||||
}
|
||||
}
|
||||
|
||||
.header {
|
||||
display: flex;
|
||||
img {
|
||||
|
||||
10
system.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"id": "fvtt-hellborn",
|
||||
"title": "Hellborn -Descended RPG",
|
||||
"title": "Hellborn - Descended RPG",
|
||||
"description": "Hellborn - Descended RPG",
|
||||
"manifest": "https://www.uberwald.me/gitea/public/fvtt-hellborn/raw/branch/main/system.json",
|
||||
"download": "#{DOWNLOAD}#",
|
||||
@@ -49,6 +49,14 @@
|
||||
}
|
||||
},
|
||||
"packs": [
|
||||
{
|
||||
"name": "hellborn-quickstart",
|
||||
"banner": "systems/fvtt-hellborn/assets/ui/banner_compendium.png",
|
||||
"label": "Hellborn - Quickstart",
|
||||
"system": "fvtt-hellborn",
|
||||
"path": "packs-system/hellborn-quickstart",
|
||||
"type": "Item"
|
||||
}
|
||||
],
|
||||
"grid": {
|
||||
"distance": 10,
|
||||
|
||||
@@ -17,34 +17,42 @@
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="biodata">
|
||||
<fieldset >
|
||||
<legend>{{localize "HELLBORN.Label.biodata"}}</legend>
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.gender value=system.biodata.gender rootId=partId disabled=isPlayMode}}
|
||||
<div class="aliases">
|
||||
{{formField systemFields.biodata.fields.aliases value=system.biodata.aliases rootId=partId disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.age value=system.biodata.age rootId=partId disabled=isPlayMode}}
|
||||
<div class="biodata">
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.gender value=system.biodata.gender rootId=partId disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.age value=system.biodata.age rootId=partId disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.height value=system.biodata.height rootId=partId disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.weight value=system.biodata.weight rootId=partId disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.eyes value=system.biodata.eyes rootId=partId disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.hair value=system.biodata.hair rootId=partId disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.home value=system.biodata.home rootId=partId disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.birthplace value=system.biodata.birthplace rootId=partId
|
||||
disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.dod value=system.biodata.dod rootId=partId
|
||||
disabled=isPlayMode}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.height value=system.biodata.height rootId=partId disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.weight value=system.biodata.weight rootId=partId disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.eyes value=system.biodata.eyes rootId=partId disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.hair value=system.biodata.hair rootId=partId disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.home value=system.biodata.home rootId=partId disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="experience">
|
||||
{{formField systemFields.biodata.fields.birthplace value=system.biodata.birthplace rootId=partId
|
||||
disabled=isPlayMode}}
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
|
||||
@@ -10,15 +10,27 @@
|
||||
{{#each weapons as |item|}}
|
||||
<div class="weapon item" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
|
||||
|
||||
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
|
||||
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}} - {{upperFirst item.system.weaponType}}" />
|
||||
<i class="fa-regular fa-dice"></i>
|
||||
<div class="name rollable" data-roll-type="weapon" data-tooltip="{{{item.system.description}}}">
|
||||
{{item.name}}
|
||||
</div>
|
||||
<span class="type" data-tooltip="Type">{{upperFirst item.system.weaponType}}</span>
|
||||
<!-- <span class="type" data-tooltip="Type">{{upperFirst item.system.weaponType}}</span> -->
|
||||
<span class="properties" data-tooltip="Properties">{{upperFirst item.system.properties}}</span>
|
||||
<span class="range" data-tooltip="Range">{{upperFirst item.system.range}}</span>
|
||||
|
||||
{{#if (eq item.system.weaponType "melee")}}
|
||||
<span class="ammoQuantity" > </span>
|
||||
<span class="ammo" ></span>
|
||||
|
||||
{{else}}
|
||||
<span class="ammoQuantity" data-tooltip="ammoQuantity">
|
||||
<i class="fa-solid fa-octagon-plus" data-action="modifyAmmo" data-quantity="1" data-item-id="{{item.id}}"></i>
|
||||
{{item.system.ammoQuantity}}
|
||||
<i class="fa-solid fa-octagon-minus" data-action="modifyAmmo" data-quantity="-1" data-item-id="{{item.id}}"></i>
|
||||
</span>
|
||||
<span class="ammo" data-tooltip="Ammo">{{upperFirst item.system.ammo}}</span>
|
||||
{{/if}}
|
||||
|
||||
<a class="damage rollable" data-tooltip="Damage" data-item-id="{{item.id}}" data-action="roll"
|
||||
data-roll-type="damage" data-roll-value="{{item.system.damageFormula}}">
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
</div>
|
||||
|
||||
<fieldset class="character-definition">
|
||||
<div class="flexcol character-definition-pronouns">
|
||||
{{formField systemFields.pronouns value=system.pronouns rootId=partId disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="splitted">
|
||||
<div>
|
||||
<div class="flexcol">
|
||||
{{formField systemFields.pronouns value=system.pronouns rootId=partId disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="flexcol">
|
||||
{{formField systemFields.species value=system.species rootId=partId disabled=isPlayMode}}
|
||||
</div>
|
||||
@@ -56,7 +56,7 @@
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
<div class="form-group">
|
||||
<label><a data-action="toChat" data-item-uuid="{{upright.uuid}}">Reversed</a></label>
|
||||
<label><a data-action="toChat" data-item-uuid="{{downright.uuid}}">Reversed</a></label>
|
||||
<input class="trait" type="text" value="{{downright.name}}" disabled >
|
||||
<div class="controls">
|
||||
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{downright.id}}"
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
|
||||
<!--<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />-->
|
||||
<div class="name" data-action="toChat" data-item-uuid="{{item.uuid}}" data-roll-type="malefica" data-tooltip="{{{item.system.description}}}">
|
||||
<div class="name" data-action="toChat" data-item-uuid="{{item.uuid}}" data-roll-type="malefica" data-tooltip="{{{item.system.description}}}<br>Time:{{item.system.time}}<br>Duration:{{item.system.duration}}<br>Range:{{item.system.range}}<br>Target:{{item.system.target}}">
|
||||
<a>{{item.name}}</a>
|
||||
</div>
|
||||
<span class="domain" data-tooltip="Domain">{{upperFirst item.system.domain}}</span>
|
||||
|
||||
@@ -5,43 +5,44 @@
|
||||
{{actorName}}
|
||||
</div>
|
||||
<div class="intro-right">
|
||||
|
||||
{{#if (eq rollType "stat")}}
|
||||
<h2>{{localize "HELLBORN.Label.statRoll"}}</h2>
|
||||
{{/if}}
|
||||
{{#if weapon}}
|
||||
<h2>{{weapon.name}}</strong></h2>
|
||||
{{/if}}
|
||||
|
||||
<ul>
|
||||
|
||||
{{#if (eq rollType "stat")}}
|
||||
<li><strong>{{localize "HELLBORN.Label.statRoll"}}</strong></li>
|
||||
{{/if}}
|
||||
|
||||
|
||||
{{#if weapon}}
|
||||
<li><strong>Weapon : {{weapon.name}}</strong></li>
|
||||
<li><strong>Properties :</strong> {{weapon.system.properties}}</li>
|
||||
<li>
|
||||
<span>
|
||||
<span class="chat-roll-label"><strong>{{localize rollItem.label}} : {{rollItem.value}}</strong></span>
|
||||
<span>{{localize "HELLBORN.Label.difficulty"}} : {{difficulty}}</span>
|
||||
</span>
|
||||
</li>
|
||||
|
||||
{{#if (gt nbAdvantages 0)}}
|
||||
<li>With Advantage !</li>
|
||||
{{/if}}
|
||||
{{#if (gt nbDisadvantages 0)}}
|
||||
<li>With Disadvantages ! </li>
|
||||
{{/if}}
|
||||
|
||||
<li><strong>{{localize rollItem.label}} : {{rollItem.value}}</strong></li>
|
||||
|
||||
<li>{{localize "HELLBORN.Label.difficulty"}} : {{difficulty}}</li>
|
||||
|
||||
<li>Results :
|
||||
<li class="chat-results-spacing">Results :
|
||||
{{#each results as |result|}}
|
||||
{{result.result}}
|
||||
{{/each}}
|
||||
</li>
|
||||
|
||||
{{#if (gt nbAdvantages 0)}}
|
||||
<li>Advantages : {{nbAdvantages}}, result {{advantageResult}}</li>
|
||||
{{/if}}
|
||||
{{#if (gt nbDisadvantages 0)}}
|
||||
<li>Disadvantages : {{nbDisadvantages}}, result {{disadvantageResult}}</li>
|
||||
{{/if}}
|
||||
|
||||
|
||||
{{#if isSuccess}}
|
||||
{{#if satanicSuccess}}
|
||||
<li class="result-satanic-success">
|
||||
<li class="chat-results-spacing result-satanic-success">
|
||||
{{localize "HELLBORN.Label.satanicSuccess"}}
|
||||
</li>
|
||||
{{else}}
|
||||
<li class="result-success">
|
||||
<li class="chat-results-spacing result-success">
|
||||
{{localize "HELLBORN.Label.success"}}
|
||||
</li>
|
||||
{{/if}}
|
||||
@@ -50,18 +51,18 @@
|
||||
|
||||
{{#if isFailure}}
|
||||
{{#if fiendishFailure}}
|
||||
<li class="result-fiendish-failure">
|
||||
<li class="chat-results-spacing result-fiendish-failure">
|
||||
{{localize "HELLBORN.Label.fiendishFailure"}}
|
||||
</li>
|
||||
{{else}}
|
||||
<li class="result-failure">
|
||||
<li class="chat-results-spacing result-failure">
|
||||
{{localize "HELLBORN.Label.failure"}}
|
||||
</li>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
{{#if (eq resultType "unknown")}}
|
||||
<li class="result-unknown">
|
||||
<li class="chat-results-spacing result-unknown">
|
||||
{{localize "HELLBORN.Label.unknown"}}
|
||||
</li>
|
||||
{{/if}}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<div class="intro-chat">
|
||||
<h2>{{name}}</h2>
|
||||
<ul>
|
||||
<li><strong>{{system.flavorText}}</strong></li>
|
||||
<li><strong><i>{{system.flavorText}}</i></strong></li>
|
||||
<li><strong>Role : </strong>{{upperFirst system.role}}</li>
|
||||
<li><strong>Level : </strong>{{getRomanLevel system.level}}</li>
|
||||
<li>{{{system.description}}}</li>
|
||||
|
||||
@@ -2,7 +2,12 @@
|
||||
<div class="intro-chat">
|
||||
<h2>{{name}}</h2>
|
||||
<ul>
|
||||
<li><strong>Orientation : </strong>{{system.orientation}}</li>
|
||||
{{#if (eq system.orientation "Upright")}}
|
||||
<li><strong>Orientation : </strong>Upright</li>
|
||||
{{else}}
|
||||
<li><strong>Orientation : </strong>Reversed</li>
|
||||
{{/if}}
|
||||
|
||||
<li><strong>Quote : </strong>{{system.quote}}</li>
|
||||
|
||||
{{#if (eq system.orientation "Upright")}}
|
||||
@@ -11,15 +16,15 @@
|
||||
<li><strong>Reversed XP Trigger : </strong>{{system.penalty}}</li>
|
||||
{{/if}}
|
||||
|
||||
<li><strong>Description : </strong>{{{system.description}}}</li>
|
||||
<li class="tarot-spacing"><strong>Description : </strong>{{{system.description}}}</li>
|
||||
|
||||
{{#if (eq system.orientation "Upright")}}
|
||||
<li><strong>Positive Effect : </strong>{{{system.positiveEffect}}}</li>
|
||||
<li class="tarot-spacing"><strong>Positive Effect : </strong>{{{system.positiveEffect}}}</li>
|
||||
{{else}}
|
||||
<li><strong>Negative Effect : </strong>{{{system.negativeEffect}}}</li>
|
||||
<li class="tarot-spacing"><strong>Negative Effect : </strong>{{{system.negativeEffect}}}</li>
|
||||
{{/if}}
|
||||
|
||||
</ul>
|
||||
<img class="tarot-item-img" src="{{system.image}}" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -27,7 +27,7 @@
|
||||
{{formInput systemFields.negativeEffect enriched=enrichedNegativeEffect value=system.negativeEffect name="system.negativeEffect"
|
||||
toggled=true}}
|
||||
</div>
|
||||
<div>
|
||||
<div class="tarot-pic">
|
||||
<img src="{{system.image}}" class="item-img" data-edit="image" data-action="editImage" data-tooltip="{{localize "HELLBORN.Label.imageTooltip"}}"/>
|
||||
{{formField systemFields.image value=system.image localize=true }}
|
||||
</div>
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
{{#if (eq system.weaponType "ranged")}}
|
||||
{{formField systemFields.subType value=system.subType localize=true}}
|
||||
{{formField systemFields.range value=system.range localize=true}}
|
||||
{{formField systemFields.ammoQuantity value=system.ammoQuantity localize=true}}
|
||||
{{formField systemFields.ammo value=system.ammo localize=true}}
|
||||
{{/if}}
|
||||
|
||||
|
||||