30 Commits

Author SHA1 Message Date
1ccc9d2c34 Minor enhancements
All checks were successful
Release Creation / build (release) Successful in 1m27s
2025-09-04 21:14:14 +02:00
9653672372 Minor enhancements 2025-09-04 20:57:54 +02:00
c8a0dc7168 Update readme.md 2025-07-01 14:28:22 +02:00
0de6a7e051 Update readme.md 2025-07-01 14:11:35 +02:00
eb0ab56794 Fix various issues
All checks were successful
Release Creation / build (release) Successful in 49s
2025-06-30 22:34:57 +02:00
4d96c15066 Add compendium data
All checks were successful
Release Creation / build (release) Successful in 1m2s
2025-06-30 21:11:23 +02:00
fb5c408bbd Enhance CSS
All checks were successful
Release Creation / build (release) Successful in 54s
2025-06-17 00:40:51 +02:00
eea83aa10e Various fixes
All checks were successful
Release Creation / build (release) Successful in 51s
2025-06-15 16:32:47 +02:00
d03c5f2c1e Various fixes
All checks were successful
Release Creation / build (release) Successful in 1m40s
2025-06-15 09:37:08 +02:00
1f2d82bd0b Last fixes from tests 2025-06-14 23:45:05 +02:00
151312b994 Fix success/failure computation
All checks were successful
Release Creation / build (release) Successful in 1m0s
2025-05-30 18:27:37 +02:00
10e668bc71 Fix success/failure computation
All checks were successful
Release Creation / build (release) Successful in 58s
2025-05-30 09:54:58 +02:00
0ee42aef99 Various changes
All checks were successful
Release Creation / build (release) Successful in 58s
2025-05-29 22:41:15 +02:00
ee3a5764f0 Add maintain/duration for maleficas
All checks were successful
Release Creation / build (release) Successful in 59s
2025-05-26 21:01:07 +02:00
28ec390020 Various fixes
All checks were successful
Release Creation / build (release) Successful in 59s
2025-05-26 18:26:55 +02:00
86ee9a44ec Add Enemy sheet
All checks were successful
Release Creation / build (release) Successful in 54s
2025-05-25 22:38:24 +02:00
abfc4e8443 Add Enemy sheet
All checks were successful
Release Creation / build (release) Successful in 58s
2025-05-25 22:04:42 +02:00
707a318bb7 Add Enemy sheet
All checks were successful
Release Creation / build (release) Successful in 56s
2025-05-25 21:56:02 +02:00
368e087e0d Add Enemy sheet
All checks were successful
Release Creation / build (release) Successful in 59s
2025-05-25 21:52:56 +02:00
f2e6415f33 Add Enemy sheet 2025-05-25 21:52:09 +02:00
4aa22195a3 Add Enemy sheet
All checks were successful
Release Creation / build (release) Successful in 56s
2025-05-25 20:44:49 +02:00
7e517bfb12 Add Enemy sheet 2025-05-25 20:43:10 +02:00
57706629e1 Add Enemy sheet
All checks were successful
Release Creation / build (release) Successful in 59s
2025-05-25 18:39:57 +02:00
29cb687bbb Add Enemy sheet
All checks were successful
Release Creation / build (release) Successful in 59s
2025-05-25 17:45:30 +02:00
973daae15a Add Enemy sheet 2025-05-25 17:41:32 +02:00
ff180ddd2e PC sheet review + dialog rolls update
All checks were successful
Release Creation / build (release) Successful in 1m3s
2025-05-25 14:35:18 +02:00
585b9a1ab5 Add rolls and new fixes
All checks were successful
Release Creation / build (release) Successful in 1m2s
2025-05-25 00:01:39 +02:00
4bed84358b Enhance actor sheet
All checks were successful
Release Creation / build (release) Successful in 51s
2025-05-24 00:13:41 +02:00
666fb4c00a First release of actor sheet
All checks were successful
Release Creation / build (release) Successful in 1m11s
2025-05-23 22:39:42 +02:00
ef9c011186 Actor sheet, step 1 2025-05-23 00:26:00 +02:00
95 changed files with 4223 additions and 3574 deletions

View File

@@ -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/icons/deal.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

BIN
assets/icons/tarot.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 648 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 KiB

BIN
assets/tarots/13_Death.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 417 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -30,11 +30,15 @@ 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,
vehicle: models.HellbornVehicle,
creature: models.HellbornCreature
enemy: models.HellbornEnemy,
}
CONFIG.Item.documentClass = documents.HellbornItem
@@ -45,14 +49,15 @@ Hooks.once("init", function () {
malefica: models.HellbornMalefica,
equipment: models.HellbornEquipment,
armor: models.HellbornArmor,
deal: models.HellbornDeal,
tarot: models.HellbornTarot,
"species-trait": models.HellbornSpeciesTrait
}
// Register sheet application classes
foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet)
foundry.documents.collections.Actors.registerSheet("fvtt-hellborn", applications.HellbornCharacterSheet , { types: ["character"], makeDefault: true })
foundry.documents.collections.Actors.registerSheet("fvtt-hellborn", applications.HellbornVehicleSheet, { types: ["vehicle"], makeDefault: true })
foundry.documents.collections.Actors.registerSheet("fvtt-hellborn", applications.HellbornCreatureSheet, { types: ["creature"], makeDefault: true })
foundry.documents.collections.Actors.registerSheet("fvtt-hellborn", applications.HellbornEnemySheet, { types: ["enemy"], makeDefault: true })
foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet)
foundry.documents.collections.Items.registerSheet("fvtt-hellborn", applications.HellbornWeaponSheet, { types: ["weapon"], makeDefault: true })
@@ -62,6 +67,8 @@ Hooks.once("init", function () {
foundry.documents.collections.Items.registerSheet("fvtt-hellborn", applications.HellbornMaleficaSheet, { types: ["malefica"], makeDefault: true })
foundry.documents.collections.Items.registerSheet("fvtt-hellborn", applications.HellbornSpeciesTraitSheet, { types: ["species-trait"], makeDefault: true })
foundry.documents.collections.Items.registerSheet("fvtt-hellborn", applications.HellbornArmorSheet, { types: ["armor"], makeDefault: true })
foundry.documents.collections.Items.registerSheet("fvtt-hellborn", applications.HellbornTarotSheet, { types: ["tarot"], makeDefault: true })
foundry.documents.collections.Items.registerSheet("fvtt-hellborn", applications.HellbornDealSheet, { types: ["deal"], makeDefault: true })
// Other Document Configuration
CONFIG.ChatMessage.documentClass = documents.HellbornChatMessage

View File

@@ -1,114 +1,167 @@
{
"HELLBORN": {
"Armor": {
"FIELDS": {
"bonus": {
"label": "Bonus"
},
"cost": {
"label": "Cost"
},
"description": {
"label": "Description"
},
"reduction": {
"label": "Reduction"
},
"resilience": {
"label": "Resilience"
}
}
},
"Enemy": {
"FIELDS": {
"description": {
"label": "Description"
},
"notes": {
"label": "Notes"
},
"flavorText": {
"label": "Flavor Text"
},
"enemyType" : {
"label": "Enemy Type"
}
}
},
"Character": {
"FIELDS": {
"mortality": {
"label": "Mortality",
"current": {
"label": "Mortality"
}
},
"limboes": {
"label": "Limboes"
},
"ammo": {
"label": "Ammo"
},
"age": {
"label": "Age"
},
"archetype": {
"label": "Archetype"
},
"armor": {
"value": {
"label": "Protection"
}
},
"heroPoints": {
"label": "Hero Points"
},
"credits": {
"label": "Credits"
},
"enc": {
"label": "Enc",
"value": {
"label": "Enc Curr."
},
"max": {
"label": "Enc Max"
}
},
"biodata": {
"age": {
"label": "Age"
},
"aliases": {
"label": "Aliases"
},
"birthplace": {
"label": "Birthplace"
},
"eyes": {
"label": "Eyes"
},
"gender": {
"label": "Gender"
},
"hair": {
"label": "Hair"
},
"dod": {
"label": "Date of Death"
},
"height": {
"label": "Height"
},
"home": {
"label": "Home"
},
"label": "Biodata",
"weight": {
"label": "Weight"
}
},
"birthplace": {
"label": "Birthplace"
},
"concept": {
"label": "Concept"
},
"species": {
"label": "Species"
"credits": {
"label": "Credits"
},
"archetype": {
"label": "Archetype"
"experience": {
"current": {
"label": "Current"
},
"eyes": {
"label": "Eyes"
"training": {
"label": "Training"
},
"gender": {
"label": "Gender"
},
"hair": {
"label": "Hair"
},
"height": {
"label": "Height"
},
"home": {
"label": "Home"
},
"biodata": {
"label": "Biodata",
"gender": {
"label": "Gender"
},
"height": {
"label": "Height"
},
"weight": {
"label": "Weight"
},
"age": {
"label": "Age"
},
"hair": {
"label": "Hair"
},
"eyes": {
"label": "Eyes"
},
"home": {
"label": "Home"
},
"birthplace": {
"label": "Birthplace"
"label": "Experience",
"total": {
"label": "Total"
}
},
"eyes": {
"label": "Eyes"
},
"gender": {
"label": "Gender"
},
"hair": {
"label": "Hair"
},
"health": {
"label": "Stamina",
"staminaMax": {
"label": "Max"
},
"staminaValue": {
"label": "Cur."
},
"wounds": {
"label": "Wounds"
}
},
"height": {
"label": "Height"
},
"home": {
"label": "Home"
},
"pronouns": {
"label": "Pronouns"
},
"rank": {
"label": "Rank",
"elite": {
"label": "Elite"
},
"experienced": {
"label": "Experienced"
},
"expert": {
"label": "Expert"
},
"veteran": {
"label": "Veteran"
},
"elite": {
"label": "Elite"
},
"label": "Rank",
"legend": {
"label": "Legend"
},
"veteran": {
"label": "Veteran"
}
},
"health": {
"staminaValue": {
"label": "Cur."
},
"staminaMax": {
"label": "Max"
},
"wounds": {
"label": "Wounds"
},
"label": "Stamina"
},
"skills:": {
"combat": {
"label": "Combat"
@@ -131,60 +184,17 @@
"vehicles": {
"label": "Vehicles"
}
},
"species": {
"label": "Species"
},
"trait": {
"label": "Trait"
}
}
},
"Creature": {
"Niche": {
"Prey": "Prey",
"Opportunist": "Opportunist",
"Herbivore": "Herbivore",
"Predator": "Predator"
},
"Size": {
"Tiny": "Tiny",
"Small": "Small",
"Medium": "Medium",
"Large": "Large",
"Huge": "Huge",
"Giant": "Giant",
"Titanic": "Titanic",
"Gargantuan": "Gargantuan"
},
"Terrain": {
"Cave": "Cave",
"Coast": "Coast",
"Desert": "Desert",
"Forest": "Forest",
"Jungle": "Jungle",
"Mountain": "Mountain",
"Plains": "Plains",
"Swamp": "Swamp",
"Urban": "Urban",
"Ocean": "Ocean",
"Coastal": "Coast",
"Mixed": "Mixed",
"River": "River",
"Ruins": "Ruins",
"Savannah": "Savannah",
"Shallows" : "Shallows"
},
"FIELDS": {
"damage": {
"label": "Damage"
},
"size": {
"label": "Size"
},
"numberAppearing": {
"label": "Number Appearing"
},
"terrain": {
"label": "Terrain"
},
"niche": {
"label": "Niche"
},
"biodata": {
"adaptedToHelplessness": {
"label": "Adapted to helplessness"
@@ -241,9 +251,18 @@
"label": "Strength"
}
},
"damage": {
"label": "Damage"
},
"damageBonus": {
"label": "Dmg.Bonus"
},
"niche": {
"label": "Niche"
},
"numberAppearing": {
"label": "Number Appearing"
},
"resources": {
"hand": {
"label": "Hand"
@@ -257,16 +276,56 @@
"stowed": {
"label": "Stowed"
}
}
},
"size": {
"label": "Size"
},
"terrain": {
"label": "Terrain"
}
},
"SpeciesTrait": {
"Niche": {
"Herbivore": "Herbivore",
"Opportunist": "Opportunist",
"Predator": "Predator",
"Prey": "Prey"
},
"Size": {
"Gargantuan": "Gargantuan",
"Giant": "Giant",
"Huge": "Huge",
"Large": "Large",
"Medium": "Medium",
"Small": "Small",
"Tiny": "Tiny",
"Titanic": "Titanic"
},
"Terrain": {
"Cave": "Cave",
"Coast": "Coast",
"Coastal": "Coast",
"Desert": "Desert",
"Forest": "Forest",
"Jungle": "Jungle",
"Mixed": "Mixed",
"Mountain": "Mountain",
"Ocean": "Ocean",
"Plains": "Plains",
"River": "River",
"Ruins": "Ruins",
"Savannah": "Savannah",
"Shallows": "Shallows",
"Swamp": "Swamp",
"Urban": "Urban"
}
},
"Deal": {
"FIELDS": {
"description": {
"label": "Description"
},
"isAdvantage": {
"label": "Provide advantage"
"promisor": {
"label": "Promisor"
}
}
},
@@ -281,11 +340,200 @@
"description": {
"label": "Description"
},
"enc": {
"label": "Enc"
"quantity": {
"label": "Quantity"
}
}
},
"techAge": {
"label": "Tech Age"
"Label": {
"addArmor": "Add Armor",
"addPerk": "Add Perk",
"addRitual": "Add Ritual",
"addSpeciesTrait": "Add Trait",
"addTarot": "Add Tarot",
"addMalefica": "Add Malefica",
"addTrait": "Add Trait",
"newMalefica": "New Malefica",
"newPerk": "New Perk",
"newRitual": "New Ritual",
"newSpeciesTrait": "New Trait",
"newTarot": "New Tarot",
"titleStat": "Stat Roll Dialog",
"difficulty": "Difficulty",
"unknown": "Unknown",
"statRoll": "Stat Roll",
"stat": "Stat",
"formula": "Formula",
"characteristics": "Characteristics",
"deals": "Deals",
"tarot": "Tarot",
"backstory": "Backstory",
"scars": "Scars",
"likes": "Likes",
"dislikes": "Dislikes",
"fears": "Fears",
"vices": "Vices",
"goals": "Goals",
"ambitions": "Ambitions",
"values": "Values",
"bonds": "Bonds",
"abilities": "Abilities",
"Agility": "Agility",
"ailments": "Ailments",
"appearance": "Appearance",
"armor": "Armor",
"Armor": "Armor",
"armors": "Armors",
"biodata": "Biodata",
"biography": "Biography",
"capacity": "Capacity",
"cargo": "Cargo",
"character": "Character",
"combat": "Combat",
"Counters": "Counters",
"creature": "Creature",
"fiendishFailure": "Fiendish Failure",
"satanicSuccess": "Satanic Success",
"bonus": "Upright XP Trigger",
"penalty": "Reversed XP Trigger",
"quote": "Quote",
"current": "Curr.",
"damage": "Damage",
"damages": "Damages",
"damageShort": "Dmg",
"description": "Description",
"Details": "Details",
"Difficult": "Difficult (-1D)",
"Easy": "Easy (+1D)",
"equipment": "Equipment",
"equipments": "Equipment",
"experience": "Experience",
"failure": "Failure",
"finalScore": "Final Score",
"flesh": "Flesh",
"Formidable": "Formidable (-2D)",
"heart": "Heart",
"HP": "HP",
"implants": "Implants",
"Impossible": "Impossible (-4D)",
"knowledge": "Knowledge",
"languages": "Languages",
"maleficas": "Maleficas",
"malus": "Malus",
"max": "Max",
"maximum": "Maximum",
"mind": "Mind",
"Moderate": "Moderate (+0D)",
"modifications": "Modifications",
"modifier": "Modifier",
"multiplier": "Multiplier",
"negativeEffect": "Negative Effect",
"newAbility": "New Ability",
"newArmor": "New Armor",
"newCreatureAbility": "New Creature Ability",
"newCreatureTrait": "New Creature Trait",
"newEquipment": "New Equipment",
"newImplant": "New Implant",
"newLanguage": "New Language",
"newPsionic": "New Psionic",
"newSkill": "New Skill",
"newTalent": "New Talent",
"newTrait": "New Trait",
"newWeapon": "New Weapon",
"notes": "Notes",
"perks": "Perks",
"physical": "Physical",
"positiveEffect": "Positive Effect",
"psionics": "Psionics",
"Rank": "Rank",
"rituals": "Rituals",
"rollView": "Roll View",
"skill": "Skill",
"skillRoll": "Skill Roll",
"skills": "Skills",
"skin": "Skin",
"social": "Social",
"soul": "Soul",
"species": "Species",
"speciesTraits": "Species Traits",
"Stamina": "Stamina",
"starship": "Starship",
"stats": "Stats",
"status": "Status",
"stealth": "Stealth",
"success": "Success",
"talents": "Talents",
"targetScore": "Target Score",
"technology": "Technology",
"titleSkill": "Skill Roll",
"titleWeapon": "Weapon Roll",
"total": "Total",
"totalScore": "Total Score",
"traits": "Traits",
"trauma": "Trauma",
"Unarmed": "Unarmed",
"vehicle": "Vehicle",
"Vehicle": "Vehicle",
"vehicles": "Vehicles",
"weapons": "Weapons"
},
"Malefica": {
"FIELDS": {
"duration": {
"label": "Duration"
},
"maintain": {
"label": "Passive"
},
"choiceMaintainDuration": {
"label": "Passive/Duration"
},
"description": {
"label": "Description"
},
"hasDamage": {
"label": "Has Damage"
},
"damage": {
"label": "Damage"
},
"damageType": {
"label": "Damage Type"
},
"domain": {
"label": "Domain"
},
"level": {
"label": "Level"
},
"range": {
"label": "Range"
},
"target": {
"label": "Target"
},
"time": {
"label": "Time"
}
}
},
"Notifications": {
"tarotDeleted": "Previous Tarot card deleted : ",
"speciesTraitDeleted": "Previous Species Trait deleted : "
},
"Perk": {
"FIELDS": {
"description": {
"label": "Description"
},
"flavorText": {
"label": "Flavor Text"
},
"level": {
"label": "Level"
},
"role": {
"label": "Role"
}
}
},
@@ -300,8 +548,8 @@
"difficulty": {
"label": "Difficulty"
},
"threshold": {
"label": "Threshold"
"ingredients": {
"label": "Ingredients"
},
"limit": {
"label": "Limit"
@@ -309,131 +557,8 @@
"nbAttempts": {
"label": "Nb Attempts"
},
"ingredients": {
"label": "Ingredients"
}
}
},
"Label": {
"damages": "Damages",
"modifications": "Modifications",
"abilities": "Abilities",
"Details": "Details",
"traits": "Traits",
"capacity" : "Capacity",
"Agility" : "Agility",
"Armor": "Armor",
"cargo": "Cargo",
"vehicle": "Vehicle",
"starship": "Starship",
"Easy": "Easy (+1D)",
"Moderate": "Moderate (+0D)",
"Difficult": "Difficult (-1D)",
"Formidable": "Formidable (-2D)",
"Impossible": "Impossible (-4D)",
"combat": "Combat",
"physical": "Physical",
"social": "Social",
"stealth": "Stealth",
"technology": "Technology",
"vehicles": "Vehicles",
"knowledge": "Knowledge",
"Stamina": "Stamina",
"equipments": "Equipment",
"Rank": "Rank",
"HP": "HP",
"Unarmed": "Unarmed",
"Vehicle": "Vehicle",
"armor": "Armor",
"armors": "Armors",
"biodata": "Biodata",
"biography": "Biography",
"character": "Character",
"creature": "Creature",
"criticalFailure": "Critical Failure",
"criticalSuccess": "Critical Success",
"current": "Curr.",
"damage": "Damage",
"damageShort": "Dmg",
"description": "Description",
"equipment": "Equipment",
"experience": "Experience",
"failure": "Failure",
"finalScore": "Final Score",
"languages": "Languages",
"malus": "Malus",
"max": "Max",
"maximum": "Maximum",
"modifier": "Modifier",
"multiplier": "Multiplier",
"newArmor": "New Armor",
"newWeapon": "New Weapon",
"newTalent": "New Talent",
"newTrait": "New Trait",
"newAbility": "New Ability",
"newSkill": "New Skill",
"newImplant": "New Implant",
"newEquipment": "New Equipment",
"newLanguage": "New Language",
"newPsionic": "New Psionic",
"newCreatureAbility": "New Creature Ability",
"newCreatureTrait": "New Creature Trait",
"notes": "Notes",
"psionics": "Psionics",
"rollView": "Roll View",
"skill": "Skill",
"skillRoll": "Skill Roll",
"skills": "Skills",
"status": "Status",
"success": "Success",
"talents": "Talents",
"implants": "Implants",
"targetScore": "Target Score",
"titleSkill": "Skill Roll",
"titleWeapon": "Weapon Roll",
"total": "Total",
"totalScore": "Total Score",
"weapons": "Weapons"
},
"Notifications": {},
"Armor": {
"FIELDS": {
"bonus": {
"label": "Bonus"
},
"cost": {
"label": "Cost"
},
"description": {
"label": "Description"
},
"resilience": {
"label": "Resilience"
},
"reduction": {
"label": "Reduction"
}
}
},
"Malefica": {
"FIELDS": {
"description": {
"label": "Description"
},
"time": {
"label": "Time"
},
"range":{
"label": "Range"
},
"target": {
"label": "Target"
},
"level":{
"label": "Level"
},
"domain": {
"label": "Domain"
"threshold": {
"label": "Threshold"
}
}
},
@@ -442,46 +567,53 @@
"roll": "Roll",
"skill": "Skill"
},
"Perk": {
"SpeciesTrait": {
"FIELDS": {
"level": {
"label": "Level"
"description": {
"label": "Description"
},
"role": {
"label": "Role"
"isAdvantage": {
"label": "Provide advantage"
}
}
},
"flavorText": {
"label": "Flavor Text"
"Tarot": {
"FIELDS": {
"bonus": {
"label": "Upright XP Trigger"
},
"penalty": {
"label": "Reversed XP Trigger"
},
"description": {
"label": "Description"
},
"orientation": {
"label": "Orientation"
}
}
},
"ToggleSheet": "Toggle Sheet",
"Tooltip": {
"addTalent" : "Add Talent",
"addSkill" : "Add Skill",
"addWeapon" : "Add Weapon",
"addArmor" : "Add Armor",
"addEquipment" : "Add Equipment",
"addImplant" : "Add Implant",
"addLanguage" : "Add Language",
"addPsionic" : "Add Psionic",
"addCreatureAbility" : "Add Creature Ability",
"addCreatureTrait" : "Add Creature Trait",
"addArmor": "Add Armor",
"addCreatureAbility": "Add Creature Ability",
"addCreatureTrait": "Add Creature Trait",
"addEquipment": "Add Equipment",
"addImplant": "Add Implant",
"addLanguage": "Add Language",
"addPsionic": "Add Psionic",
"addSkill": "Add Skill",
"addTalent": "Add Talent",
"addWeapon": "Add Weapon",
"damages": "Enter current damages suffered"
},
"Vehicle": {
"FIELDS": {
"tonnage": {
"label": "Tonnage"
},
"agility": {
"label": "Agility"
},
"force": {
"label": "Force"
"armor": {
"label": "Armor"
},
"cargo": {
"label": "Cargo"
@@ -489,60 +621,75 @@
"cost": {
"label": "Cost"
},
"range": {
"label": "Range"
},
"speed": {
"label": "Speed"
},
"armor": {
"label": "Armor"
},
"crew": {
"label": "Crew"
},
"description": {
"label": "Description"
},
"force": {
"label": "Force"
},
"notes": {
"label": "Notes"
},
"range": {
"label": "Range"
},
"speed": {
"label": "Speed"
},
"tonnage": {
"label": "Tonnage"
}
}
},
"Weapon": {
"FIELDS": {
"stat": {
"label": "Stat"
},
"damageStat": {
"label": "Damage Stat"
},
"ammo": {
"label": "Ammo"
},
"ammoQuantity": {
"label": "Ammo Quantity"
},
"cost": {
"label": "Cost"
},
"damage": {
"label": "Damage"
},
"damageType": {
"label": "Damage Type"
},
"description": {
"label": "Description"
},
"subType": {
"label": "Sub-Type"
},
"range": {
"label": "Range"
},
"properties": {
"label": "Properties"
},
"ammo": {
"label": "Ammo"
"range": {
"label": "Range"
},
"subType": {
"label": "Sub-Type"
},
"weaponType": {
"label": "Type"
}
},
"Range": {
"Handgun": "Handgun",
"Assault": "Assault",
"Handgun": "Handgun",
"HeavyWeapon": "Heavy Weapon",
"LongRange": "Long Range",
"Melee": "Melee",
"Rifle": "Rifle",
"HeavyWeapon": "Heavy Weapon",
"ThrownWeapon": "Thrown Weapon"
},
"Types": {
@@ -558,21 +705,18 @@
"TYPES": {
"Actor": {
"character": "Character",
"creature": "Creature",
"vehicle": "Vehicle"
"enemy": "Enemy"
},
"Item": {
"species-trait": "Species Trait",
"armor": "Armor",
"deal": "Deal",
"equipment": "Equipment",
"ritual": "Ritual",
"malefica": "Malefica",
"perk": "Perk",
"weapon": "Weapon",
"armor": "Armor"
"ritual": "Ritual",
"species-trait": "Trait",
"tarot": "Tarot",
"weapon": "Weapon"
}
}
}

View File

@@ -1,11 +1,12 @@
export { default as HellbornWeaponSheet } from "./sheets/weapon-sheet.mjs"
export { default as HellbornVehicleSheet } from "./sheets/vehicle-sheet.mjs"
export { default as HellbornCharacterSheet } from "./sheets/character-sheet.mjs"
export { default as HellbornEquipmentSheet } from "./sheets/equipment-sheet.mjs"
export { default as HellbornCreatureSheet } from "./sheets/creature-sheet.mjs"
export { default as HellbornEnemySheet } from "./sheets/enemy-sheet.mjs"
export { default as HellbornRitualSheet } from "./sheets/ritual-sheet.mjs"
export { default as HellbornItemSheet } from "./sheets/base-item-sheet.mjs"
export { default as HellbornSpeciesTraitSheet } from "./sheets/species-trait-sheet.mjs"
export { default as HellbornPerkSheet } from "./sheets/perk-sheet.mjs"
export { default as HellbornMaleficaSheet } from "./sheets/malefica-sheet.mjs"
export { default as HellbornArmorSheet } from "./sheets/armor-sheet.mjs"
export { default as HellbornTarotSheet } from "./sheets/tarot-sheet.mjs"
export { default as HellbornDealSheet } from "./sheets/deal-sheet.mjs"

View File

@@ -32,7 +32,10 @@ export default class HellbornActorSheet extends HandlebarsApplicationMixin(found
editImage: HellbornActorSheet.#onEditImage,
toggleSheet: HellbornActorSheet.#onToggleSheet,
edit: HellbornActorSheet.#onItemEdit,
delete: HellbornActorSheet.#onItemDelete
delete: HellbornActorSheet.#onItemDelete,
updateCheckboxArray: HellbornActorSheet.#onUpdateCheckboxArray,
toChat: HellbornActorSheet.#toChat,
},
}
@@ -66,8 +69,7 @@ export default class HellbornActorSheet extends HandlebarsApplicationMixin(found
actor: this.document,
system: this.document.system,
source: this.document.toObject(),
isEncumbered: this.document.system.isEncumbered(),
enrichedDescription: await TextEditor.enrichHTML(this.document.system.description, { async: true }),
enrichedBackstory: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.backstory, { async: true }),
isEditMode: this.isEditMode,
isPlayMode: this.isPlayMode,
isEditable: this.isEditable,
@@ -99,7 +101,7 @@ export default class HellbornActorSheet extends HandlebarsApplicationMixin(found
dragover: this._onDragOver.bind(this),
drop: this._onDrop.bind(this),
}
return new DragDrop(d)
return new foundry.applications.ux.DragDrop.implementation(d)
})
}
@@ -137,7 +139,7 @@ export default class HellbornActorSheet extends HandlebarsApplicationMixin(found
* @param {DragEvent} event The originating DragEvent
* @protected
*/
_onDragOver(event) {}
_onDragOver(event) { }
async _onDropItem(item) {
console.log("Dropped item", item)
@@ -185,6 +187,46 @@ export default class HellbornActorSheet extends HandlebarsApplicationMixin(found
return fp.browse()
}
static #onUpdateCheckboxArray(event, target) {
console.log("Update checkbox array", event, target)
let arrayName = target.dataset.name
let arrayIdx = Number(target.dataset.index)
let dataPath = `system.mortality.${arrayName}`
let tab = foundry.utils.duplicate(this.document.system.mortality[arrayName])
tab[arrayIdx] = target.checked
this.actor.update({ [dataPath]: tab })
}
static async #toChat(event, target) {
const itemUuid = target.getAttribute("data-item-uuid")
const item = fromUuidSync(itemUuid)
if (!item) return
let content = ""
if (item.type === "perk") {
content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-hellborn/templates/chat-perk.hbs", item.toObject())
}
if (item.type === "malefica") {
content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-hellborn/templates/chat-malefica.hbs", item.toObject())
}
if (item.type === "ritual") {
content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-hellborn/templates/chat-ritual.hbs", item.toObject())
}
if (item.type === "species-trait") {
content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-hellborn/templates/chat-trait.hbs", item.toObject())
}
if (item.type === "tarot") {
content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-hellborn/templates/chat-tarot.hbs", item.toObject())
}
const chatData = {
user: game.user.id,
speaker: ChatMessage.getSpeaker({ actor: this.actor }),
content: content,
type: CONST.CHAT_MESSAGE_TYPES.OTHER,
}
ChatMessage.create(chatData, { renderSheet: false })
}
/**
* Edit an existing item within the Actor
* Start with the uuid, if it's not found, fallback to the id (as Embedded item in the actor)

View File

@@ -15,11 +15,11 @@ export default class HellbornCharacterSheet extends HellbornActorSheet {
createEquipment: HellbornCharacterSheet.#onCreateEquipment,
createArmor: HellbornCharacterSheet.#onCreateArmor,
createWeapon: HellbornCharacterSheet.#onCreateWeapon,
createTalent: HellbornCharacterSheet.#onCreateTalent,
createImplant: HellbornCharacterSheet.#onCreateImplant,
createPsionic: HellbornCharacterSheet.#onCreatePsionic,
createLanguage: HellbornCharacterSheet.#onCreateLanguage
createDeal: HellbornCharacterSheet.#onCreateDeal,
createMalefica: HellbornCharacterSheet.#onCreateMalefica,
createRitual: HellbornCharacterSheet.#onCreateRitual,
createPerk: HellbornCharacterSheet.#onCreatePerk,
modifyAmmo: HellbornCharacterSheet.#onModifyAmmo,
},
}
@@ -31,8 +31,11 @@ export default class HellbornCharacterSheet extends HellbornActorSheet {
tabs: {
template: "templates/generic/tab-navigation.hbs",
},
talents: {
template: "systems/fvtt-hellborn/templates/character-talents.hbs",
status: {
template: "systems/fvtt-hellborn/templates/character-status.hbs",
},
maleficas: {
template: "systems/fvtt-hellborn/templates/character-maleficas.hbs",
},
equipment: {
template: "systems/fvtt-hellborn/templates/character-equipment.hbs",
@@ -44,7 +47,7 @@ export default class HellbornCharacterSheet extends HellbornActorSheet {
/** @override */
tabGroups = {
sheet: "talents",
sheet: "status",
}
/**
@@ -53,7 +56,8 @@ export default class HellbornCharacterSheet extends HellbornActorSheet {
*/
#getTabs() {
const tabs = {
talents: { id: "talents", group: "sheet", icon: "fa-solid fa-compass", label: "HELLBORN.Label.talents" },
status: { id: "status", group: "sheet", icon: "fa-solid fa-compass", label: "HELLBORN.Label.status" },
maleficas: { id: "maleficas", group: "sheet", icon: "fa-solid fa-compass", label: "HELLBORN.Label.maleficas" },
equipment: { id: "equipment", group: "sheet", icon: "fa-solid fa-shapes", label: "HELLBORN.Label.equipment" },
biography: { id: "biography", group: "sheet", icon: "fa-solid fa-book", label: "HELLBORN.Label.biography" },
}
@@ -69,8 +73,10 @@ export default class HellbornCharacterSheet extends HellbornActorSheet {
const context = await super._prepareContext()
context.tabs = this.#getTabs()
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
context.enrichedNotes = await TextEditor.enrichHTML(this.document.system.notes, { async: true })
const doc = this.document
context.trait = doc.itemTypes['species-trait']?.[0]
context.upright = doc.itemTypes.tarot.find(t => t.system.orientation === "Upright")
context.downright = doc.itemTypes.tarot.find(t => t.system.orientation === "Downright")
return context
}
@@ -78,19 +84,33 @@ export default class HellbornCharacterSheet extends HellbornActorSheet {
/** @override */
async _preparePartContext(partId, context) {
const doc = this.document
context.systemFields = this.document.system.schema.fields
switch (partId) {
case "main":
break
case "talents":
context.tab = context.tabs.talents
context.talents = doc.itemTypes.talent
context.talents.sort((a, b) => a.name.localeCompare(b.name))
context.implants = doc.itemTypes.implant
context.implants.sort((a, b) => a.name.localeCompare(b.name))
context.psionics = doc.itemTypes.psionic
context.psionics.sort((a, b) => a.name.localeCompare(b.name))
context.languages = doc.itemTypes.language
context.languages.sort((a, b) => a.name.localeCompare(b.name))
case "status":
context.tab = context.tabs.status
context.perks = doc.itemTypes.perk
// Sort the perks by system.role and then by the system.level
context.perks.sort((a, b) => {
if (a.system.role === b.system.role) {
return a.system.level.localeCompare(b.system.level)
}
return a.system.role.localeCompare(b.system.role)
})
break;
case "maleficas":
context.tab = context.tabs.maleficas
context.maleficas = doc.itemTypes.malefica
// Sort the maleficas by system.domain and then by the system.level
context.maleficas.sort((a, b) => {
if (a.system.domain === b.system.domain) {
return a.system.level.localeCompare(b.system.level)
}
return a.system.domain.localeCompare(b.system.domain)
})
context.rituals = doc.itemTypes.ritual
context.rituals.sort((a, b) => a.name.localeCompare(b.name))
break
case "equipment":
context.tab = context.tabs.equipment
@@ -103,8 +123,19 @@ export default class HellbornCharacterSheet extends HellbornActorSheet {
break
case "biography":
context.tab = context.tabs.biography
context.enrichedDescription = await TextEditor.enrichHTML(doc.system.description, { async: true })
context.enrichedNotes = await TextEditor.enrichHTML(doc.system.notes, { async: true })
context.deals = doc.itemTypes.deal
context.enrichedBackstory = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.backstory, { async: true })
context.enrichedAppearance = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.appearance, { async: true })
context.enrichedScars = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.scars, { async: true })
context.enrichedLikes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.likes, { async: true })
context.enrichedDislikes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.dislikes, { async: true })
context.enrichedFears = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.fears, { async: true })
context.enrichedVices = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.vices, { async: true })
context.enrichedGoals = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.goals, { async: true })
context.enrichedAmbitions = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.ambitions, { async: true })
context.enrichedValues = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.values, { async: true })
context.enrichedBonds = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.bonds, { async: true })
context.enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.notes, { async: true })
break
}
return context
@@ -115,6 +146,18 @@ export default class HellbornCharacterSheet extends HellbornActorSheet {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newEquipment"), type: "equipment" }])
}
static #onCreateDeal(event, target) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newDeal"), type: "deal" }])
}
static #onCreateMalefica(event, target) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newMalefica"), type: "malefica" }])
}
static #onCreateRitual(event, target) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newRitual"), type: "ritual" }])
}
static #onCreateWeapon(event, target) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newWeapon"), type: "weapon" }])
}
@@ -123,23 +166,23 @@ export default class HellbornCharacterSheet extends HellbornActorSheet {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newArmor"), type: "armor" }])
}
static #onCreateTalent(event, target) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newTalent"), type: "talent" }])
static #onCreatePerk(event, target) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newPerk"), type: "perk" }])
}
static #onCreateImplant(event, target) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newImplant"), type: "implant" }])
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
}
static #onCreatePsionic(event, target) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newPsionic"), type: "psionic" }])
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 })
}
static #onCreateLanguage(event, target) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newLanguage"), type: "language" }])
}
/**
* Handles the roll action triggered by user interaction.
*
@@ -158,10 +201,11 @@ export default class HellbornCharacterSheet extends HellbornActorSheet {
const rollType = $(event.currentTarget).data("roll-type")
let item
let li
let statKey
switch (rollType) {
case "skill":
let skillId = $(event.currentTarget).data("skill-id");
item = this.actor.system.skills[skillId];
case "stat":
statKey = $(event.currentTarget).data("stat-id");
item = this.actor.system.stats[statKey];
break
case "weapon":
case "damage":
@@ -176,14 +220,32 @@ export default class HellbornCharacterSheet extends HellbornActorSheet {
async _onDrop(event) {
if (!this.isEditable || !this.isEditMode) return
const data = TextEditor.getDragEventData(event)
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event)
// Handle different data types
switch (data.type) {
case "Item":
if (data.type === "Item") {
const item = await fromUuid(data.uuid)
if (item.type === "tarot") {
// Delete the existing tarot item
const existingTarot = this.document.items.find(i => i.type === "tarot" && i.system.orientation === item.system.orientation)
if (existingTarot) {
await existingTarot.delete()
// Display info message
ui.notifications.info(game.i18n.localize("HELLBORN.Notifications.tarotDeleted") + existingTarot.name)
}
}
if (item.type === "species-trait") {
// Check if the item is already in the actor
const existingTrait = this.document.items.find(i => i.type === "species-trait" && i.name === item.name)
if (existingTrait) {
await existingTrait.delete()
// Display info message
ui.notifications.info(game.i18n.localize("HELLBORN.Notifications.speciesTraitDeleted")+ existingTrait.name)
}
}
return super._onDropItem(item)
}
}
}

View File

@@ -0,0 +1,28 @@
import HellbornItemSheet from "./base-item-sheet.mjs"
export default class HellbornDealSheet extends HellbornItemSheet {
/** @override */
static DEFAULT_OPTIONS = {
classes: ["deal"],
position: {
width: 600,
},
window: {
contentClasses: ["deal-content"],
},
}
/** @override */
static PARTS = {
main: {
template: "systems/fvtt-hellborn/templates/deal.hbs",
},
}
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
return context
}
}

View File

@@ -1,35 +1,38 @@
import HellbornActorSheet from "./base-actor-sheet.mjs"
export default class HellbornCreatureSheet extends HellbornActorSheet {
export default class HellbornEnemySheet extends HellbornActorSheet {
/** @override */
static DEFAULT_OPTIONS = {
classes: ["creature"],
classes: ["enemy"],
position: {
width: 860,
height: 620,
},
window: {
contentClasses: ["creature-content"],
contentClasses: ["enemy-content"],
},
actions: {
createTrait: HellbornCreatureSheet.#onCreateTrait,
createAbility: HellbornCreatureSheet.#onCreateAbility
},
createTrait: HellbornEnemySheet.#onCreateTrait,
createEquipment: HellbornEnemySheet.#onCreateEquipment,
createWeapon: HellbornEnemySheet.#onCreateWeapon,
createMalefica: HellbornEnemySheet.#onCreateMalefica,
}
}
/** @override */
static PARTS = {
main: {
template: "systems/fvtt-hellborn/templates/creature-main.hbs",
template: "systems/fvtt-hellborn/templates/enemy-main.hbs",
},
tabs: {
template: "templates/generic/tab-navigation.hbs",
},
traits: {
template: "systems/fvtt-hellborn/templates/creature-sheet-trait.hbs",
template: "systems/fvtt-hellborn/templates/enemy-trait.hbs",
},
biography: {
template: "systems/fvtt-hellborn/templates/creature-biography.hbs",
template: "systems/fvtt-hellborn/templates/enemy-biography.hbs",
},
}
@@ -38,6 +41,7 @@ export default class HellbornCreatureSheet extends HellbornActorSheet {
sheet: "traits",
}
/**
* Prepare an array of form header tabs.
* @returns {Record<string, Partial<ApplicationTab>>}
@@ -59,9 +63,6 @@ export default class HellbornCreatureSheet extends HellbornActorSheet {
const context = await super._prepareContext()
context.tabs = this.#getTabs()
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
context.enrichedNotes = await TextEditor.enrichHTML(this.document.system.notes, { async: true })
return context
}
@@ -73,15 +74,19 @@ export default class HellbornCreatureSheet extends HellbornActorSheet {
break
case "traits":
context.tab = context.tabs.traits
context.abilities = doc.itemTypes["creature-ability"]
context.abilities.sort((a, b) => a.name.localeCompare(b.name))
context.traits = doc.itemTypes["creature-trait"]
context.traits = doc.itemTypes["species-trait"]
context.traits.sort((a, b) => a.name.localeCompare(b.name))
context.weapons = doc.itemTypes.weapon
context.weapons.sort((a, b) => a.name.localeCompare(b.name))
context.maleficas = doc.itemTypes.malefica
context.maleficas.sort((a, b) => a.name.localeCompare(b.name))
context.equipments = doc.itemTypes.equipment
context.equipments.sort((a, b) => a.name.localeCompare(b.name))
break
case "biography":
context.tab = context.tabs.biography
context.enrichedDescription = await TextEditor.enrichHTML(doc.system.description, { async: true })
context.enrichedNotes = await TextEditor.enrichHTML(doc.system.notes, { async: true })
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(doc.system.description, { async: true })
context.enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(doc.system.notes, { async: true })
break
}
return context
@@ -93,13 +98,22 @@ export default class HellbornCreatureSheet extends HellbornActorSheet {
* @param {HTMLElement} target The current target of the event listener.
*/
static #onCreateTrait(event, target) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newTrait"), type: "creature-trait" }])
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newTrait"), type: "species-trait" }])
}
static #onCreateAbility(event, target) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newAbility"), type: "creature-ability" }])
static #onCreateEquipment(event, target) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newEquipment"), type: "equipment" }])
}
static #onCreateMalefica(event, target) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newMalefica"), type: "malefica" }])
}
static #onCreateWeapon(event, target) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newWeapon"), type: "weapon" }])
}
/**
* Handles the roll action triggered by user interaction.
*
@@ -117,27 +131,21 @@ export default class HellbornCreatureSheet extends HellbornActorSheet {
async _onRoll(event, target) {
const rollType = $(event.currentTarget).data("roll-type")
let item
let formula
let roll
switch (rollType) {
case "skill":
let skillId = $(event.currentTarget).data("skill-id");
item = this.actor.system.skills[skillId];
case "stat":
{
let statId = $(event.currentTarget).data("stat-id");
item = this.actor.system.stats[statId];
await this.document.system.roll(rollType, item)
}
break
case "creature-damage":
formula = this.actor.system.damage
// Rolll the damage
roll = new Roll(formula)
await roll.evaluate()
roll.toMessage( { flavor: `${this.actor.name} : Damage roll` })
break
case "creature-number":
formula = this.actor.system.numberAppearing
// Rolll the damage
roll = new Roll(formula)
await roll.evaluate()
roll.toMessage({flavor: `${this.actor.name} : Number Appearing roll`})
case "weapon":
case "damage":
{
let li = $(event.currentTarget).parents(".item");
item = this.actor.items.get(li.data("item-id"));
await this.document.system.roll(rollType, item)
}
break
default:
throw new Error(`Unknown roll type ${rollType}`)

View File

@@ -22,7 +22,7 @@ export default class HellbornEquipmentSheet extends HellbornItemSheet {
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
return context
}
}

View File

@@ -22,7 +22,7 @@ export default class HellbornMaleficaSheet extends HellbornItemSheet {
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
return context
}
}

View File

@@ -22,7 +22,7 @@ export default class HellbornPerkSheet extends HellbornItemSheet {
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
return context
}
}

View File

@@ -22,6 +22,8 @@ export default class HellbornRitualSheet extends HellbornItemSheet {
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
return context
}
}

View File

@@ -22,7 +22,7 @@ export default class HellbornSpeciesTraitSheet extends HellbornItemSheet {
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
return context
}
}

View File

@@ -0,0 +1,31 @@
import HellbornItemSheet from "./base-item-sheet.mjs"
export default class HellbornTarotSheet extends HellbornItemSheet {
/** @override */
static DEFAULT_OPTIONS = {
classes: ["tarot"],
position: {
width: 800,
height: 800
},
window: {
contentClasses: ["tarot-content"],
},
}
/** @override */
static PARTS = {
main: {
template: "systems/fvtt-hellborn/templates/tarot.hbs",
},
}
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
context.enrichedPositiveEffect = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.positiveEffect, { async: true })
context.enrichedNegativeEffect = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.negativeEffect, { async: true })
return context
}
}

View File

@@ -1,134 +0,0 @@
import HellbornActorSheet from "./base-actor-sheet.mjs"
export default class HellbornVehicleSheet extends HellbornActorSheet {
/** @override */
static DEFAULT_OPTIONS = {
classes: ["vehicle"],
position: {
width: 680,
height: 540,
},
window: {
contentClasses: ["vehicle-content"],
},
actions: {
createEquipment: HellbornVehicleSheet.#onCreateEquipment,
createWeapon: HellbornVehicleSheet.#onCreateWeapon,
},
}
/** @override */
static PARTS = {
main: {
template: "systems/fvtt-hellborn/templates/vehicle-main.hbs",
},
tabs: {
template: "templates/generic/tab-navigation.hbs",
},
equipment: {
template: "systems/fvtt-hellborn/templates/vehicle-equipment.hbs",
},
description: {
template: "systems/fvtt-hellborn/templates/vehicle-description.hbs",
},
}
/** @override */
tabGroups = {
sheet: "equipment",
}
/**
* Prepare an array of form header tabs.
* @returns {Record<string, Partial<ApplicationTab>>}
*/
#getTabs() {
const tabs = {
equipment: { id: "equipment", group: "sheet", icon: "fa-solid fa-shapes", label: "HELLBORN.Label.equipment" },
description: { id: "description", group: "sheet", icon: "fa-solid fa-book", label: "HELLBORN.Label.description" },
}
for (const v of Object.values(tabs)) {
v.active = this.tabGroups[v.group] === v.id
v.cssClass = v.active ? "active" : ""
}
return tabs
}
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.tabs = this.#getTabs()
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
context.enrichedNotes = await TextEditor.enrichHTML(this.document.system.notes, { async: true })
return context
}
_generateTooltip(type, target) {
}
/** @override */
async _preparePartContext(partId, context) {
const doc = this.document
switch (partId) {
case "main":
break
case "equipment":
context.tab = context.tabs.equipment
context.weapons = doc.itemTypes.weapon
context.weapons.sort((a, b) => a.name.localeCompare(b.name))
context.equipments = doc.itemTypes.equipment
context.equipments.sort((a, b) => a.name.localeCompare(b.name))
break
case "description":
context.tab = context.tabs.description
context.enrichedDescription = await TextEditor.enrichHTML(doc.system.description, { async: true })
context.enrichedNotes = await TextEditor.enrichHTML(doc.system.notes, { async: true })
break
}
return context
}
/**
* Creates a new attack item directly from the sheet and embeds it into the document.
* @param {Event} event The initiating click event.
* @param {HTMLElement} target The current target of the event listener.
*/
static #onCreateEquipment(event, target) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newEquipment"), type: "equipment" }])
}
static #onCreateWeapon(event, target) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newWeapon"), type: "weapon" }])
}
async _onRoll(event, target) {
const rollType = $(event.currentTarget).data("roll-type")
let item
let li
switch (rollType) {
case "damage":
li = $(event.currentTarget).parents(".item");
item = this.actor.items.get(li.data("item-id"));
break
default:
throw new Error(`Unknown roll type ${rollType}`)
}
await this.document.system.roll(rollType, item)
}
async _onDrop(event) {
if (!this.isEditable || !this.isEditMode) return
const data = TextEditor.getDragEventData(event)
// Handle different data types
switch (data.type) {
case "Item":
const item = await fromUuid(data.uuid)
return super._onDropItem(item)
}
}
}

View File

@@ -18,4 +18,10 @@ export default class HellbornWeaponSheet extends HellbornItemSheet {
template: "systems/fvtt-hellborn/templates/weapon.hbs",
},
}
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
return context
}
}

View File

@@ -7,6 +7,49 @@ export const ASCII = `
`
export const AILMENTS = {
"bleeding": { id: "bleeding", label: "Bleeding" },
"blinded": { id: "blinded", label: "Blinded" },
"burning": { id: "burning", label: "Burning" },
"dazed": { id: "dazed", label: "Dazed" },
"deafened": { id: "deafened", label: "Deafened" },
"exposes": { id: "exposed", label: "Exposed" },
"mortally": { id: "mortal", label: "Mortal" },
"muted": { id: "muted", label: "Muted" },
"prone": { id: "prone", label: "Prone" },
"immobilized": { id: "immobilized", label: "Immobile" },
"shaken": { id: "shaken", label: "Shaken" },
"stunned": { id: "stunned", label: "Stunned" },
"winded": { id: "winded", label: "Winded" }
}
export const STATS = {
"flesh": { id: "flesh", label: "Flesh" },
"skin": { id: "skin", label: "Skin" },
"heart": { id: "heart", label: "Heart" },
"mind": { id: "mind", label: "Mind" },
"soul": { id: "soul", label: "Soul" }
}
export const DIFFICULTY_CHOICES = {
"unknown": { id: "unknown", label: "Unknown", value: "0" },
"trivial": { id: "trivial", label: "Trivial", value: "7" },
"easy": { id: "easy", label: "Easy", value: "9" },
"normal": { id: "normal", label: "Normal", value: "11" },
"hard": { id: "hard", label: "Hard", value: "15" },
"very-hard": { id: "very-hard", label: "Very Hard", value: "18" },
"impossible": { id: "impossible", label: "Impossible", value: "20" }
}
export const CHOICE_ADVANTAGES_DISADVANTAGES ={
"0": { id: "0", label: "None", value: "0" },
"1": { id: "1", label: "One", value: "1" },
"2": { id: "2", label: "Two", value: "2" },
"3": { id: "3", label: "Three", value: "3" },
"4": { id: "4", label: "Four", value: "4" },
"5": { id: "5", label: "Five", value: "5" },
}
export const PERK_ROLES = {
"abbetor": { id: "abbetor", label: "Abbetor" },
"blade": { id: "blade", label: "Blade" },
@@ -16,6 +59,7 @@ export const PERK_ROLES = {
"sentinel": { id: "sentinel", label: "Sentinel" },
"slayer": { id: "slayer", label: "Slayer" },
"wretch": { id: "wretch", label: "Wretch" },
"other": { id: "other", label: "Other" },
}
export const MALEFICA_DOMAINS = {
@@ -26,6 +70,7 @@ export const MALEFICA_DOMAINS = {
"speculo": { id: "speculo", label: "Speculo" },
"vinculum": { id: "vinculum", label: "Vinculum" },
"vita": { id: "vita", label: "Vita" },
"other": { id: "other", label: "Other" },
}
export const PERK_LEVELS = {
@@ -47,86 +92,19 @@ export const WEAPON_TYPES = {
"ranged": { id: "ranged", label: "Ranged" },
}
export const RANGED_SUBTYPES = {
"pistols": { id: "pistols", label: "Pistols" },
"rifles": { id: "rifles", label: "Rifles" },
"shotguns": { id: "shotguns", label: "Shotguns" },
"submachineguns": { id: "submachineguns ", label: "Sub machine guns" },
"grenades": { id: "grenades", label: "Grenades" },
"heavy": { id: "heavy", label: "Heavy Weapons" },
export const AMMO_TYPES = {
"blessed": { id: "blessed", label: "Blessed" },
"hollow-points": { id: "hollow-points", label: "Hollow" },
"incendiary": { id: "incendiary", label: "Incendiary" },
"poisoned": { id: "poisoned", label: "Poisoned" },
"rubber": { id: "rubber", label: "Rubber" },
"tesla": { id: "tesla", label: "Tesla" },
}
export const ATTACK_MODIFIERS = {
"two-attacks": -1,
"aiming": 1,
"dim": -1,
"darkness": -2,
"prone": -1,
"cover": -2,
"recoil-first": -1,
"recoil-third": -2,
"aware": -1
}
export const TRIAGE_RESULTS = {
"none": { id: "none", dice:0, label: "HELLBORN.TriageResults.None" },
"death": { id: "death", dice:3, label: "HELLBORN.TriageResults.Death" },
"critical": { id: "critical", dice:4, label: "HELLBORN.TriageResults.Critical" },
"severe": { id: "severe", dice:7, label: "HELLBORN.TriageResults.Severe" },
"moderate": { id: "moderate", dice:10, label: "HELLBORN.TriageResults.Moderate" },
"fleshwound": { id: "fleshwound", dice:12, label: "HELLBORN.TriageResults.FleshWound" }
}
export const CREATURE_TERRAIN_TYPES = {
"cave": { id: "cave", label: "HELLBORN.Creature.Terrain.Cave", niche:0, size: 0 },
"coast": { id: "coast", label: "HELLBORN.Creature.Terrain.Coast", niche:1, size: 0 },
"desert": { id: "desert", label: "HELLBORN.Creature.Terrain.Desert", niche:-1, size: -1 },
"forest": { id: "forest", label: "HELLBORN.Creature.Terrain.Forest", niche:1, size: 1 },
"jungle": { id: "jungle", label: "HELLBORN.Creature.Terrain.Jungle", niche:1, size: 1 },
"mixed": { id: "mixed", label: "HELLBORN.Creature.Terrain.Mixed", niche:0, size: 0 },
"mountain": { id: "mountain", label: "HELLBORN.Creature.Terrain.Mountain", niche:-1, size: -1 },
"ocean": { id: "ocean", label: "HELLBORN.Creature.Terrain.Ocean", niche:-1, size: 1 },
"river": { id: "river", label: "HELLBORN.Creature.Terrain.River", niche:1, size: 0 },
"ruins": { id: "ruins", label: "HELLBORN.Creature.Terrain.Ruins", niche:0, size: 1 },
"savannah": { id: "savannah", label: "HELLBORN.Creature.Terrain.Savannah", niche:0, size: 1 },
"shallows": { id: "shallows", label: "HELLBORN.Creature.Terrain.Shallows", niche:1, size: 0 },
"swamp": { id: "swamp", label: "HELLBORN.Creature.Terrain.Swamp", niche:1, size: 1 }
}
export const CREATURE_NICHES = {
"prey": { id: "prey", label: "HELLBORN.Creature.Niche.Prey" },
"opportunist": { id: "opportunist", label: "HELLBORN.Creature.Niche.Opportunist" },
"herbivore": { id: "herbivore", label: "HELLBORN.Creature.Niche.Herbivore" },
"predator": { id: "predator", label: "HELLBORN.Creature.Niche.Predator" }
}
export const CREATURE_SIZES = {
"tiny": { id: "tiny", label: "HELLBORN.Creature.Size.Tiny" },
"small": { id: "small", label: "HELLBORN.Creature.Size.Small" },
"medium": { id: "medium", label: "HELLBORN.Creature.Size.Medium" },
"large": { id: "large", label: "HELLBORN.Creature.Size.Large" },
"giant": { id: "giant", label: "HELLBORN.Creature.Size.Giant" },
"titanic": { id: "titanic", label: "HELLBORN.Creature.Size.Titanic" }
}
export const MODIFIER_CHOICES = {
"easy": { id: "easy", label: "HELLBORN.Label.Easy", value :"1" },
"moderate": { id: "moderate", label: "HELLBORN.Label.Moderate", value: "0" },
"difficult": { id: "difficult", label: "HELLBORN.Label.Difficult", value: "-1" },
"formidable": { id: "formidable", label: "HELLBORN.Label.Formidable", value: "-2" },
"impossible": { id: "impossible", label: "HELLBORN.Label.Impossible", value: "-4" }
}
export const STARSHIP_HULL = {
"pod": { id: "pod", label: "HELLBORN.Starship.Hull.Pod" },
"micro": { id: "micro", label: "HELLBORN.Starship.Hull.Micro" },
"small": { id: "small", label: "HELLBORN.Starship.Hull.Small" },
"scout": { id: "scout", label: "HELLBORN.Starship.Hull.Scout" },
"picket": { id: "picket", label: "HELLBORN.Starship.Hull.Picket" },
"destroyer": { id: "destroyer", label: "HELLBORN.Starship.Hull.Destroyer" },
"cruiser": { id: "cruiser", label: "HELLBORN.Starship.Hull.Cruiser" },
"battleship": { id: "battleship", label: "HELLBORN.Starship.Hull.Battleship" },
"carrier": { id: "carrier", label: "HELLBORN.Starship.Hull.Carrier" }
export const ENEMY_TYPES = {
"mook": { id: "mook", label: "Mook" },
"elite": { id: "elite", label: "Elite" },
"legendary": { id: "legendary", label: "Legendary" }
}
/**
@@ -135,18 +113,16 @@ export const STARSHIP_HULL = {
*/
export const SYSTEM = {
id: SYSTEM_ID,
AILMENTS,
ENEMY_TYPES,
STATS,
PERK_ROLES,
PERK_LEVELS,
MALEFICA_LEVELS,
MALEFICA_DOMAINS,
MODIFIER_CHOICES,
ATTACK_MODIFIERS,
WEAPON_TYPES,
RANGED_SUBTYPES,
TRIAGE_RESULTS,
CREATURE_TERRAIN_TYPES,
CREATURE_SIZES,
CREATURE_NICHES,
STARSHIP_HULL,
AMMO_TYPES,
DIFFICULTY_CHOICES,
CHOICE_ADVANTAGES_DISADVANTAGES,
ASCII
}

View File

@@ -6,6 +6,8 @@ export const defaultItemImg = {
perk: "systems/fvtt-hellborn/assets/icons/perk.webp",
"species-trait": "systems/fvtt-hellborn/assets/icons/species-trait.webp",
armor: "systems/fvtt-hellborn/assets/icons/armor.webp",
deal: "systems/fvtt-hellborn/assets/icons/deal.webp",
tarot: "systems/fvtt-hellborn/assets/icons/tarot.webp",
}
export default class HellbornItem extends Item {

View File

@@ -62,11 +62,7 @@ export default class HellbornRoll extends Roll {
static updateFullFormula(options) {
let fullFormula
if ( options.numericModifier >= 0) {
fullFormula = `${options.formula} + ${options.rollItem.value} + ${options.numericModifier}D`
} else {
fullFormula = `${options.formula} + ${options.rollItem.value} - ${Math.abs(options.numericModifier)}D`
}
fullFormula = `3D6 + ${options.nbAdvantages}D6kh - ${options.nbDisadvantages}D6kh + ${options.rollItem.value}`
$('#roll-dialog-full-formula').text(fullFormula)
options.fullFormula = fullFormula
}
@@ -86,81 +82,68 @@ export default class HellbornRoll extends Roll {
* @returns {Promise<Object|null>} The roll result or null if the dialog was cancelled.
*/
static async prompt(options = {}) {
let formula = "2d6"
let formula = `3D6 + 0D6KH - 0D6KH + ${options?.rollItem?.value}`
let actor = game.actors.get(options.actorId)
switch (options.rollType) {
case "skill":
case "stat":
break
case "damage":
{
let formula = options.rollItem.system.damage
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`
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
}
case "weapon":
let actor = game.actors.get(options.actorId)
{
options.weapon = foundry.utils.duplicate(options.rollItem)
options.rollItem = actor.system.skills.combat
let statKey = options.weapon.system.stat.toLowerCase()
options.rollItem = actor.system.stats[statKey]
}
break
default:
break
}
const rollModes = Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)]))
const rollModes = foundry.utils.duplicate(CONFIG.Dice.rollModes)
const fieldRollMode = new foundry.data.fields.StringField({
choices: rollModes,
blank: false,
default: "public",
})
const choiceModifier = SYSTEM.MODIFIER_CHOICES
let choiceRangeModifier = {}
let rangeModifier = 0
if ( options.weapon) {
// Build the range modifiers
let range = SYSTEM.WEAPON_RANGE[options.weapon.system.rangeType]
for (let [key, value] of Object.entries(range.range)) {
choiceRangeModifier[key] = { label: `${key} (${value}D)`, value: value }
if (!rangeModifier && value) {
rangeModifier = value
}
}
}
let modifier = "0"
options.numericModifier = rangeModifier
let fullFormula = `${formula} + ${options.rollItem.value}`
if (options.isEncumbered) {
options.numericModifier += -1
fullFormula += ` - ${options.numericModifier}D`
} else {
options.numericModifier += 0
fullFormula += ` + ${options.numericModifier}D`
}
options.fullFormula = fullFormula
options.formula = formula
options.nbAdvantages = "0"
options.nbDisadvantages = "0"
let dialogContext = {
actorId: options.actorId,
actorName: options.actorName,
rollType: options.rollType,
rollItem: foundry.utils.duplicate(options.rollItem), // Object only, no class
fullFormula,
weapon: options?.weapon,
isEncumbered: options.isEncumbered,
talents: options.talents,
formula: formula,
fullFormula: formula,
rollModes,
fieldRollMode,
choiceModifier,
choiceRangeModifier,
rangeModifier,
formula,
choiceAdvantages: SYSTEM.CHOICE_ADVANTAGES_DISADVANTAGES,
choiceDisadvantages: SYSTEM.CHOICE_ADVANTAGES_DISADVANTAGES,
hasTarget: options.hasTarget,
modifier,
difficulty: "0",
nbAdvantages: "0",
nbDisadvantages: "0",
}
const content = await renderTemplate("systems/fvtt-hellborn/templates/roll-dialog.hbs", dialogContext)
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-hellborn/templates/roll-dialog.hbs", dialogContext)
const title = HellbornRoll.createTitle(options.rollType, options.rollTarget)
const label = game.i18n.localize("HELLBORN.Roll.roll")
@@ -184,19 +167,19 @@ export default class HellbornRoll extends Roll {
},
rejectClose: false, // Click on Close button will not launch an error
render: (event, dialog) => {
$(".roll-skill-modifier").change(event => {
options.numericModifier += Number(event.target.value)
$(".roll-stat-advantages").change(event => {
options.nbAdvantages = Number(event.target.value)
HellbornRoll.updateFullFormula(options)
})
$(".roll-skill-range-modifier").change(event => {
options.numericModifier += Number(event.target.value)
$(".roll-stat-disadvantages").change(event => {
options.nbDisadvantages = Number(event.target.value)
HellbornRoll.updateFullFormula(options)
})
$(".select-combat-option").change(event => {
console.log(event)
let field = $(event.target).data("field")
let modifier = SYSTEM.ATTACK_MODIFIERS[field]
if ( event.target.checked) {
if (event.target.checked) {
options.numericModifier += modifier
} else {
options.numericModifier -= modifier
@@ -211,42 +194,74 @@ export default class HellbornRoll extends Roll {
let rollData = foundry.utils.mergeObject(foundry.utils.duplicate(options), rollContext)
rollData.rollMode = rollContext.visibility
// Update target score
rollData.targetScore = 8
if (Hooks.call("fvtt-hellborn.preRoll", options, rollData) === false) return
let diceFormula = `${2+Math.abs(options.numericModifier)}D6`
if ( options.numericModifier > 0 ) {
diceFormula += `kh2 + ${options.rollItem.value}`
} else {
diceFormula += `kl2 + ${options.rollItem.value}`
options.nbAdvantages = Number(options.nbAdvantages)
options.nbDisadvantages = Number(options.nbDisadvantages)
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)
options.difficulty = (rollData.difficulty === "unknown") ? 0 : (Number(rollData.difficulty) || 0)
roll.displayRollResult(roll, options, rollData)
roll.displayRollResult(roll, options, rollData, roll)
if (Hooks.call("fvtt-hellborn.Roll", options, rollData, roll) === false) return
return roll
}
displayRollResult(formula, options, rollData) {
// Compute the result quality
displayRollResult(formula, options, rollData, roll) {
let resultType = "failure"
if (this.total >= 8) {
if (options.difficulty === 0) {
resultType = "unknown"
} else if (this.total >= options.difficulty) {
resultType = "success"
// Detect if decimal == unit in the dire total result
}
// Compute the result quality
this.options.satanicSuccess = false
this.options.fiendishFailure = false
this.options.rollData = foundry.utils.duplicate(rollData)
// Check if all results are equal
let workResults = foundry.utils.duplicate(roll.terms[0].results)
// Get the most common result of the roll
let commonResult = workResults.reduce((acc, r) => {
acc[r.result] = (acc[r.result] || 0) + 1
return acc
}, {})
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 (resultType === "success" && commonResult >= 4 && nbEqual >= 3) {
this.options.satanicSuccess = true
if (this.options.satanicSuccess) {
resultType = "success"
}
}
if (resultType === "failure" && commonResult <= 3 && nbEqual >= 3) {
this.options.fiendishFailure = true
if (this.options.fiendishFailure) {
resultType = "failure"
}
}
this.options.resultType = resultType
this.options.isSuccess = resultType === "success"
this.options.isFailure = resultType === "failure"
this.options.isEncumbered = rollData.isEncumbered
this.options.rollData = foundry.utils.duplicate(rollData)
this.options.results = roll.terms[0].results
}
/**
@@ -258,8 +273,8 @@ export default class HellbornRoll extends Roll {
*/
static createTitle(type, target) {
switch (type) {
case "skill":
return `${game.i18n.localize("HELLBORN.Label.titleSkill")}`
case "stat":
return `${game.i18n.localize("HELLBORN.Label.titleStat")}`
case "weapon":
return `${game.i18n.localize("HELLBORN.Label.titleWeapon")}`
default:
@@ -270,7 +285,7 @@ export default class HellbornRoll extends Roll {
/** @override */
async render(chatOptions = {}) {
let chatData = await this._getChatCardData(chatOptions.isPrivate)
return await renderTemplate(this.constructor.CHAT_TEMPLATE, chatData)
return await foundry.applications.handlebars.renderTemplate(this.constructor.CHAT_TEMPLATE, chatData)
}
/**
@@ -317,7 +332,6 @@ export default class HellbornRoll extends Roll {
cardData.realDamage = this.realDamage
cardData.isPrivate = isPrivate
cardData.weapon = this.weapon
cardData.isEncumbered = this.isEncumbered
cardData.cssClass = cardData.css.join(" ")
cardData.tooltip = isPrivate ? "" : await this.getTooltip()

View File

@@ -1,5 +1,4 @@
export { default as HellbornCreature } from "./creature.mjs"
export { default as HellbornVehicle } from "./vehicle.mjs"
export { default as HellbornEnemy } from "./enemy.mjs"
export { default as HellbornCharacter } from "./character.mjs"
export { default as HellbornEquipment } from "./equipment.mjs"
export { default as HellbornRitual } from "./ritual.mjs"
@@ -8,3 +7,5 @@ export { default as HellbornMalefica } from "./malefica.mjs"
export { default as HellbornSpeciesTrait } from "./species-trait.mjs"
export { default as HellbornWeapon } from "./weapon.mjs"
export { default as HellbornArmor } from "./armor.mjs"
export { default as HellbornTarot } from "./tarot.mjs"
export { default as HellbornDeal } from "./deal.mjs"

View File

@@ -7,51 +7,124 @@ export default class HellbornActor extends foundry.abstract.TypeDataModel {
const requiredInteger = { required: true, nullable: false, integer: true }
const schema = {}
schema.description = new fields.HTMLField({ required: true, textSearch: true })
// Ailments
const ailmentField = (label) => {
const schema = {
enabled: new fields.BooleanField({ required: true, initial: false }),
label: new fields.StringField({ required: true, initial: label })
}
return new fields.SchemaField(schema, { label })
}
schema.ailments = new fields.SchemaField(
Object.values(SYSTEM.AILMENTS).reduce((obj, ailment) => {
obj[ailment.id] = ailmentField(ailment.label)
return obj
}, {}),
)
// Stats
const statField = (label) => {
const schema = {
label: new fields.StringField({ required: true, initial: label }),
value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
}
return new fields.SchemaField(schema, { label })
}
schema.stats = new fields.SchemaField(
Object.values(SYSTEM.STATS).reduce((obj, stat) => {
obj[stat.id] = statField(stat.label)
return obj
}, {}),
)
schema.backstory = new fields.HTMLField({ required: true, textSearch: true })
schema.appearance = new fields.HTMLField({ required: true, textSearch: true })
schema.scars = new fields.HTMLField({ required: true, textSearch: true })
schema.likes = new fields.HTMLField({ required: true, textSearch: true })
schema.dislikes = new fields.HTMLField({ required: true, textSearch: true })
schema.fears = new fields.HTMLField({ required: true, textSearch: true })
schema.vices = new fields.HTMLField({ required: true, textSearch: true })
schema.goals = new fields.HTMLField({ required: true, textSearch: true })
schema.ambitions = new fields.HTMLField({ required: true, textSearch: true })
schema.values = new fields.HTMLField({ required: true, textSearch: true })
schema.bonds = new fields.HTMLField({ required: true, textSearch: true })
schema.notes = new fields.HTMLField({ required: true, textSearch: true })
schema.name = new fields.StringField({ required: true, nullable: false, initial: "" })
schema.pronouns = new fields.StringField({ required: true, nullable: false, initial: "" })
schema.species = new fields.StringField({ required: true, nullable: false, initial: "" })
schema.trait = new fields.StringField({ required: true, nullable: false, initial: "" })
schema.upright = new fields.StringField({ required: true, nullable: false, initial: "" })
schema.reversed = new fields.StringField({ required: true, nullable: false, initial: "" })
schema.heroPoints = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
schema.limboes = new fields.StringField({ required: true, nullable: false, initial: "" })
schema.ammo = new fields.StringField({ required: true, nullable: false, initial: "" })
schema.health = new fields.SchemaField({
staminaValue: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
staminaMax: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
wounds: new fields.NumberField({ ...requiredInteger, initial:0, min: 0 }),
triageResults: new fields.StringField({ required: true, nullable: false, initial: "none", choices: SYSTEM.TRIAGE_RESULTS })
const ammoField = (label) => {
const schema = {
label: new fields.StringField({ required: true, initial: label }),
value: new fields.StringField({ required: true, initial: "" }),
}
return new fields.SchemaField(schema, { label })
}
schema.ammoArray = new fields.SchemaField(
Object.values(SYSTEM.AMMO_TYPES).reduce((obj, ammo) => {
obj[ammo.id] = ammoField(ammo.label)
return obj
}, {}),
)
schema.mortality = new fields.SchemaField({
/* Enabled: Array of 5 boolean field */
enabled: new fields.ArrayField(new fields.BooleanField(),
{ required: true, initial: [false, false, false, false, false], min:5, max:5 }),
current: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
max: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
})
schema.enc = new fields.SchemaField({
value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
max: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
schema.trauma = new fields.SchemaField({
current: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
max: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
})
schema.armor = new fields.SchemaField({
value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
schema.darkness = new fields.SchemaField({
current: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
max: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
value: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
})
schema.credits = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
schema.rank = new fields.SchemaField({
experienced: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0, max: 5 }),
expert: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0, max: 5 }),
veteran: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0, max: 5 }),
elite: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0, max: 5 }),
legend: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0, max: 5 })
schema.defense = new fields.SchemaField({
base: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
bonus: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
total: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
resistance: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
})
schema.movement = new fields.SchemaField({
base: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
reduce: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
})
schema.experience = new fields.SchemaField({
training: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
current: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
total: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
})
schema.biodata = new fields.SchemaField({
age: new fields.NumberField({ ...requiredInteger, initial: 15, min: 6 }),
height: new fields.NumberField({ ...requiredInteger, initial: 170, min: 50 }),
weight: new fields.NumberField({ ...requiredInteger, initial: 70, min: 1 }),
age: new fields.StringField({ required: true, nullable: false, initial: "" }),
gender: new fields.StringField({ required: true, nullable: false, initial: "" }),
home: new fields.StringField({ required: true, nullable: false, initial: "" }),
birthplace: new fields.StringField({ required: true, nullable: false, initial: "" }),
height: new fields.StringField({ required: true, nullable: false, initial: "" }),
eyes: new fields.StringField({ required: true, nullable: false, initial: "" }),
hair: 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.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: "" })
})
return schema
@@ -65,10 +138,6 @@ export default class HellbornActor extends foundry.abstract.TypeDataModel {
}
isEncumbered() {
return this.enc.value > this.enc.max
}
/** */
/**
* Rolls a dice for a character.
@@ -86,7 +155,6 @@ export default class HellbornActor extends foundry.abstract.TypeDataModel {
actorId: this.parent.id,
actorName: this.parent.name,
actorImage: this.parent.img,
talents: this.parent.items.filter(i => i.type === "talent" && i.system.isAdvantage),
hasTarget,
target: opponentTarget
})

View File

@@ -1,56 +0,0 @@
import { SYSTEM } from "../config/system.mjs"
import HellbornRoll from "../documents/roll.mjs"
export default class HellbornCreature extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
const requiredInteger = { required: true, nullable: false, integer: true }
const schema = {}
schema.terrain = new fields.StringField({ required: true, nullable: false, initial: "cave", choices: SYSTEM.CREATURE_TERRAIN_TYPES })
schema.niche = new fields.StringField({ required: true, nullable: false, initial: "prey", choices: SYSTEM.CREATURE_NICHES })
schema.size = new fields.StringField({ required: true, nullable: false, initial: "small", choices: SYSTEM.CREATURE_SIZES })
schema.numberAppearing = new fields.StringField({ required: true, initial: "1d6" })
schema.health = new fields.SchemaField({
staminaValue: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
staminaMax: new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 }),
})
schema.damage = new fields.StringField({ required: true, initial: "1d6" })
schema.description = new fields.HTMLField({ required: true, textSearch: true })
schema.notes = new fields.HTMLField({ required: true, textSearch: true })
return schema
}
/** @override */
static LOCALIZATION_PREFIXES = ["HELLBORN.Creature"]
isEncumbered() {
return false
}
async roll(rollType, rollItem) {
let opponentTarget
const hasTarget = opponentTarget !== undefined
let roll = await HellbornRoll.prompt({
rollType,
rollItem,
actorId: this.parent.id,
actorName: this.parent.name,
actorImage: this.parent.img,
traits: this.parent.items.filter(i => i.type === "creature-trait" && i.system.isAdvantage),
abilities: this.parent.items.filter(i => i.type === "creature-ability" && i.system.isAdvantage),
isEncumbered: this.isEncumbered(),
hasTarget,
target: opponentTarget
})
if (!roll) return null
await roll.toMessage({}, { rollMode: roll.options.rollMode })
}
}

16
module/models/deal.mjs Normal file
View File

@@ -0,0 +1,16 @@
import { SYSTEM } from "../config/system.mjs";
export default class HellbornDeal extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields;
const schema = {};
schema.promisor = new fields.StringField({ required: true, initial: "" });
schema.description = new fields.HTMLField({ required: true, textSearch: true })
return schema;
}
/** @override */
static LOCALIZATION_PREFIXES = ["HELLBORN.Deal"];
}

103
module/models/enemy.mjs Normal file
View File

@@ -0,0 +1,103 @@
import { SYSTEM } from "../config/system.mjs"
import HellbornRoll from "../documents/roll.mjs"
export default class HellbornEnemy extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
const requiredInteger = { required: true, nullable: false, integer: true }
const schema = {}
schema.enemyType = new fields.StringField({
required: true,
initial: "mook",
choices: SYSTEM.ENEMY_TYPES
})
const statField = (label) => {
const schema = {
label: new fields.StringField({ required: true, initial: label }),
value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
}
return new fields.SchemaField(schema, { label })
}
schema.stats = new fields.SchemaField(
Object.values(SYSTEM.STATS).reduce((obj, stat) => {
obj[stat.id] = statField(stat.label)
return obj
}, {}),
)
schema.flavorText = new fields.StringField({ required: true, initial: "", textSearch: true })
schema.trauma = new fields.SchemaField({
current: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
max: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
})
schema.darkness = new fields.SchemaField({
current: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
max: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
value: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
})
// Ailments
const ailmentField = (label) => {
const schema = {
enabled: new fields.BooleanField({ required: true, initial: false }),
label: new fields.StringField({ required: true, initial: label })
}
return new fields.SchemaField(schema, { label })
}
schema.ailments = new fields.SchemaField(
Object.values(SYSTEM.AILMENTS).reduce((obj, ailment) => {
obj[ailment.id] = ailmentField(ailment.label)
return obj
}, {}),
)
schema.defense = new fields.SchemaField({
base: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
bonus: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
total: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
resistance: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
maleficDR: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
resilience: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
})
schema.movement = new fields.SchemaField({
base: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
reduce: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
})
schema.description = new fields.HTMLField({ required: true, textSearch: true })
schema.notes = new fields.HTMLField({ required: true, textSearch: true })
return schema
}
/** @override */
static LOCALIZATION_PREFIXES = ["HELLBORN.Enemy"]
async roll(rollType, rollItem) {
let opponentTarget
const hasTarget = opponentTarget !== undefined
let roll = await HellbornRoll.prompt({
rollType,
rollItem,
actorId: this.parent.id,
actorName: this.parent.name,
actorImage: this.parent.img,
traits: this.parent.items.filter(i => i.type === "trait"),
hasTarget,
target: opponentTarget
})
if (!roll) return null
await roll.toMessage({}, { rollMode: roll.options.rollMode })
}
}

View File

@@ -8,6 +8,7 @@ export default class HellbornEquipment extends foundry.abstract.TypeDataModel {
schema.description = new fields.HTMLField({ required: true, textSearch: true })
schema.quantity = new fields.NumberField({ required: true, initial: 1, min: 0, integer: true })
schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0 })
return schema

View File

@@ -11,6 +11,14 @@ export default class HellbornMalefica extends foundry.abstract.TypeDataModel {
schema.domain = new fields.StringField({ required: true, nullable: false, choices: SYSTEM.MALEFICA_DOMAINS, initial: "adfectus" })
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": "Passive", "duration": "Duration"} })
schema.duration = new fields.StringField({ required: true, initial : "" })
schema.maintain = new fields.StringField({ required: true, initial : "" })
schema.hasDamage = new fields.BooleanField({ required: true, initial: false })
schema.damage = new fields.StringField({ required: false, initial : "" })
schema.damageType = new fields.StringField({ required: false, initial : "" })
schema.range = new fields.StringField({ required: true, initial : "" })
schema.target = new fields.StringField({ required: true, initial : "" })

27
module/models/tarot.mjs Normal file
View File

@@ -0,0 +1,27 @@
import { SYSTEM } from "../config/system.mjs";
export default class HellbornTarot extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields;
const schema = {};
schema.quote = new fields.StringField({ required: true, nullable: false, initial: "" });
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: "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 })
schema.image = new fields.FilePathField({
required: false,
categories: ["IMAGE"],
default: "icons/svg/treasure.svg",
})
return schema;
}
/** @override */
static LOCALIZATION_PREFIXES = ["HELLBORN.Tarot"];
}

View File

@@ -1,55 +0,0 @@
import { SYSTEM } from "../config/system.mjs"
import HellbornRoll from "../documents/roll.mjs"
export default class HellbornVehicle extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
const requiredInteger = { required: true, nullable: false, integer: true }
const schema = {}
schema.agility = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
schema.armor = new fields.StringField({ required: true, initial: "" })
schema.cargo = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
schema.crew = new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 })
schema.force = new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 })
schema.range = new fields.StringField({ required: true, initial: "1d6" })
schema.speed = new fields.StringField({ required: true, initial: "1d6" })
schema.techAge = new fields.StringField({ required: true, initial: "1d6" })
schema.tonnage = new fields.NumberField({ required: true, initial: 1, min: 0 })
schema.damages = new fields.StringField({ required: true, initial: "" })
schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0 })
schema.description = new fields.HTMLField({ required: true, textSearch: true })
schema.notes = new fields.HTMLField({ required: true, textSearch: true })
return schema
}
/** @override */
static LOCALIZATION_PREFIXES = ["HELLBORN.Vehicle"]
isEncumbered() {
return false
}
async roll(rollType, rollItem) {
let opponentTarget
const hasTarget = opponentTarget !== undefined
let roll = await HellbornRoll.prompt({
rollType,
rollItem,
actorId: this.parent.id,
actorName: this.parent.name,
actorImage: this.parent.img,
isEncumbered: this.isEncumbered(),
hasTarget,
target: opponentTarget
})
if (!roll) return null
await roll.toMessage({}, { rollMode: roll.options.rollMode })
}
}

View File

@@ -7,13 +7,18 @@ export default class HellbornWeapon extends foundry.abstract.TypeDataModel {
const requiredInteger = { required: true, nullable: false, integer: true }
schema.description = new fields.HTMLField({ required: true, textSearch: true })
schema.stat = new fields.StringField({ required: true, initial: "skin", choices: {"skin": "Skin", "flesh": "Flesh" }})
schema.weaponType = new fields.StringField({ required: true, initial: "melee", choices: SYSTEM.WEAPON_TYPES })
schema.subType = new fields.StringField({ required: false, initial: "pistols", choices: SYSTEM.RANGED_SUBTYPES })
schema.properties = new fields.StringField({required: true, initial: ""})
schema.damage = new fields.StringField({required: true, initial: "1d6"})
schema.damageStat = new fields.StringField({ required: true, initial: "none", choices: {"none": "None", "skin": "Skin", "flesh": "Flesh", "heart": "Heart", "mind": "Mind", "soul": "Soul" }})
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 })
@@ -23,4 +28,14 @@ export default class HellbornWeapon extends foundry.abstract.TypeDataModel {
/** @override */
static LOCALIZATION_PREFIXES = ["HELLBORN.Weapon"]
prepareDerivedData() {
super.prepareDerivedData();
let actor = this.parent?.actor;
if (actor) {
this.damageFormula = this.damage + (this.damageStat !== "none" ? `+${actor.system.stats[this.damageStat].value}` : "");
} else {
this.damageFormula = this.damage;
}
}
}

View File

@@ -168,7 +168,22 @@ export default class HellbornUtils {
Handlebars.registerHelper('isCreature', function (key) {
return key === "creature" || key === "daemon";
})
Handlebars.registerHelper('getRomanLevel', function (level) {
if (level=== "highpowers") return "High";
if (level === "mastery") return "Mastery";
level = parseInt(level);
if (level === 0) return "0";
if (level === 1) return "I";
if (level === 2) return "II";
if (level === 3) return "III";
if (level === 4) return "IV";
if (level === 5) return "V";
if (level === 6) return "VI";
if (level === 7) return "VII";
if (level === 8) return "VIII";
if (level === 9) return "IX";
return level;
})
// Handle v12 removal of this helper
Handlebars.registerHelper('select', function (selected, options) {
const escapedValue = RegExp.escape(Handlebars.escapeExpression(selected));
@@ -178,21 +193,4 @@ export default class HellbornUtils {
});
}
static setupCSSRootVariables() {
const era = game.settings.get("fvtt-cthulhu-eternal", "settings-era")
let eraCSS = SYSTEM.ERA_CSS[era];
if (!eraCSS) eraCSS = SYSTEM.ERA_CSS["jazz"];
document.documentElement.style.setProperty('--font-size-standard', eraCSS.baseFontSize);
document.documentElement.style.setProperty('--font-size-title', eraCSS.titleFontSize);
document.documentElement.style.setProperty('--font-size-result', eraCSS.titleFontSize);
document.documentElement.style.setProperty('--font-primary', eraCSS.primaryFont);
document.documentElement.style.setProperty('--font-secondary', eraCSS.secondaryFont);
document.documentElement.style.setProperty('--font-title', eraCSS.titleFont);
document.documentElement.style.setProperty('--img-icon-color-filter', eraCSS.imgFilter);
document.documentElement.style.setProperty('--background-image-base', `linear-gradient(rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.8)), url("../assets/ui/${era}_background_main.webp")`);
}
}

Binary file not shown.

View File

@@ -0,0 +1 @@
MANIFEST-000019

View File

View 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)

View 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)

Binary file not shown.

View File

@@ -13,7 +13,6 @@
fieldset {
margin-top: 8px;
background-color: var(--color-light-1);
.form-group {
display: flex;
align-items: center;

View File

@@ -9,7 +9,7 @@
}
.character-main {
background-color: var(--color-light-1);
/*background-color: var(--color-light-1);*/
display: flex;
.character-pc {
@@ -57,17 +57,6 @@
flex: none;
}
}
/*.character-dmax-edit {
input {
display: flex;
width: 60px;
font-size: calc(var(--font-size-standard) * 1.4);
align-items: center;
justify-content: center;
padding: 0 5px 0 5px;
text-align: center;
}
}*/
}
.character-right {
@@ -75,18 +64,39 @@
flex-direction: column;
gap: 5px;
.character-spec {
label {
max-width: 6rem;
}
.hero-armor {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.character-definition {
.character-definition-pronouns {
input {
max-width: 3rem;
min-width: 21.2rem;
max-width: 21.2rem;
}
}
.form-group {
display: flex;
align-items: center;
margin-bottom: 4px;
}
.splitted {
display: flex;
flex-direction: row;
gap: 4px;
}
label {
max-width: 5rem;
min-width: 5rem;
}
input {
text-align: left;
min-width: 9rem;
max-width: 9rem;
margin-bottom: auto;
}
.trait {
min-width: 7rem;
max-width: 7rem;
margin-right: 1rem;
margin-bottom: auto;
}
}
.character-name {
display: flex;
@@ -110,17 +120,17 @@
min-width: 500px;
}
.character-skills {
background-color: var(--color-light-1);
.character-stats {
/*background-color: var(--color-light-1);*/
display: flex;
flex-direction: column;
gap: 5px;
flex: 1;
.character-skill {
.character-stat {
display: flex;
align-items: center;
.icon-skill {
.icon-stat {
width: 24px;
height: 24px;
margin-right: 4px;
@@ -131,99 +141,27 @@
cursor: pointer;
}
.rollable {
min-width: 4.5rem;
max-width: 4.5rem;
}
.char-text {
margin-left: 0.5rem;
}
.d100 {
flex: 0;
max-width: 0.6rem;
}
.form-group {
flex: 0;
padding-left: 5px;
.form-fields {
font-size: 1.1rem;
flex: none;
width: 40px;
}
}
}
}
.character-skill-play {
min-width: 225px;
}
.character-skill-edit {
min-width: 225px;
}
}
.character-biography {
background-color: var(--color-light-1);
prose-mirror.inactive {
min-height: 40px;
}
prose-mirror.active {
min-height: 150px;
}
.field-label {
margin-left: 8px;
}
.rank {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 8px;
label {
min-width: 6rem;
min-width: 3.5rem;
max-width: 3.5rem;
}
input {
max-width: 4rem;
min-width: 2.5rem;
max-width: 2.5rem;
}
}
}
.biodata {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 8px;
label {
min-width: 12rem;
}
.character-stats-play {
min-width: 120px;
}
.resources {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 8px;
label {
min-width: 8rem;
}
}
.features,
.biodata {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 8px;
label {
min-width: 3rem;
}
.feature {
display: flex;
align-items: center;
gap: 4px;
min-width: 18rem;
max-width: 18rem;
}
.character-stats-edit {
min-width: 120px;
}
}
.tab.character-skills {
background-color: var(--color-light-1);
.tab.character-status .main-div {
/*background-color: var(--color-light-1);*/
display: grid;
grid-template-columns: 1fr;
legend {
@@ -232,17 +170,74 @@
padding-left: 5px;
}
}
.skills {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 4px;
.skill {
.mortality {
display: flex;
align-items: center;
gap: 4px;
margin-left: 4px;
min-width: 12.3rem;
max-width: 12.3rem;
min-width: 12rem;
max-width: 12rem;
label {
min-width: 5rem;
max-width: 5rem;
}
}
.counters {
display: flex;
direction: column;
align-items: center;
gap: 4px;
margin-left: 4px;
.characteristics-label {
color: grey;
font-size: small;
}
label {
min-width: 4rem;
max-width: 4rem;
}
.spaced-left {
margin-left: 0.8rem;
}
input {
min-width: 2.5rem;
max-width: 2.5rem;
}
}
.ailments {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 4px;
.ailment {
display: flex;
align-items: center;
gap: 4px;
margin-left: 4px;
min-width: 8rem;
max-width: 8rem;
label {
min-width: 5rem;
max-width: 5rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.perks {
display: grid;
grid-template-columns: repeat(1, 1fr);
gap: 4px;
.perk {
display: flex;
align-items: center;
gap: 4px;
margin-left: 4px;
min-width: 20rem;
max-width: 20rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
@@ -253,9 +248,17 @@
min-width: 1.8rem;
max-width: 1.8rem;
}
.score {
min-width: 1.2rem;
max-width: 1.2rem;
.flavor {
min-width: 24rem;
max-width: 24rem;
}
.role {
min-width: 5rem;
max-width: 5rem;
}
.level {
min-width: 4rem;
max-width: 4rem;
}
.name {
min-width: 10rem;
@@ -270,8 +273,8 @@
}
}
.tab.character-status {
background-color: var(--color-light-1);
.tab.character-maleficas .main-div {
/*background-color: var(--color-light-1);*/
display: grid;
grid-template-columns: 1fr;
legend {
@@ -281,28 +284,32 @@
}
}
.bonds {
.maleficas {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.bond {
.malefica {
display: flex;
align-items: center;
gap: 4px;
min-width: 18rem;
max-width: 18rem;
min-width: 20rem;
max-width: 20rem;
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.name {
min-width: 12rem;
max-width: 12rem;
min-width: 10rem;
max-width: 10rem;
}
.type {
min-width: 6rem;
max-width: 6rem;
.damage {
min-width: 3.2rem;
max-width: 3.2rem;
}
.domain {
min-width: 4rem;
max-width: 4rem;
}
.level {
min-width: 2rem;
@@ -316,11 +323,11 @@
}
}
.motivations {
.rituals {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-columns: repeat(1, 1fr);
gap: 4px;
.motivation {
.ritual {
display: flex;
align-items: center;
gap: 4px;
@@ -331,67 +338,25 @@
min-width: 1.8rem;
max-width: 1.8rem;
}
.ingredients {
min-width: 24rem;
max-width: 24rem;
}
.name {
min-width: 12rem;
max-width: 12rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
.difficulty {
min-width: 2rem;
max-width: 2rem;
}
.threshold {
min-width: 2rem;
max-width: 2rem;
}
}
.mentaldisorders {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.mentaldisorder {
display: flex;
align-items: center;
gap: 4px;
min-width: 18rem;
max-width: 18rem;
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.name {
min-width: 14rem;
max-width: 14rem;
}
.cured {
min-width: 5rem;
max-width: 5rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.injuries {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.injury {
display: flex;
align-items: center;
gap: 4px;
min-width: 16rem;
max-width: 16rem;
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.name {
min-width: 14rem;
max-width: 14rem;
.limit {
min-width: 2rem;
max-width: 2rem;
}
.item-img {
width: 24px;
@@ -402,8 +367,8 @@
}
}
.tab.character-talents {
background-color: var(--color-light-1);
.tab.character-equipment .main-div {
/*background-color: var(--color-light-1);*/
display: grid;
grid-template-columns: 1fr;
legend {
@@ -413,179 +378,37 @@
}
}
.talents {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.talent {
.limboes {
display: flex;
flex-direction: row;
.limboes-line {
display: flex;
flex-direction: row;
}
.form-group {
display: flex;
flex-direction: row;
align-items: center;
gap: 4px;
min-width: 13rem;
max-width: 13rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.damage {
margin-left: 4px;
min-width: 6rem;
max-width: 6rem;
}
.name {
min-width: 10rem;
max-width: 10rem;
.ammo-quantity {
text-align: left;
max-width: 3rem;
min-width: 3rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.languages {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.language {
display: flex;
align-items: center;
gap: 4px;
min-width: 13rem;
max-width: 13rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.damage {
min-width: 6rem;
max-width: 6rem;
}
.name {
min-width: 10rem;
max-width: 10rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.psionics {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.psionic {
display: flex;
align-items: center;
gap: 4px;
min-width: 13rem;
max-width: 13rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.damage {
min-width: 6rem;
max-width: 6rem;
}
.name {
min-width: 10rem;
max-width: 10rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
}
.tab.character-equipment {
background-color: var(--color-light-1);
display: grid;
grid-template-columns: 1fr;
legend {
a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
}
}
.encumbrance {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 4px;
input {
max-width: 4rem;
}
.encumbered {
color: red;
font-weight: bold;
text-align: left;
min-width: 8rem;
max-width: 8rem;
}
}
.implants {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.implant {
display: flex;
align-items: center;
gap: 4px;
min-width: 13rem;
max-width: 13rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.damage {
min-width: 6rem;
max-width: 6rem;
}
.name {
min-width: 10rem;
max-width: 10rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.weapons {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-columns: repeat(1, 1fr);
gap: 4px;
.weapon {
display: flex;
@@ -603,9 +426,29 @@
min-width: 1.8rem;
max-width: 1.8rem;
}
.properties {
min-width: 16.3rem;
max-width: 16.3rem;
}
.range {
min-width: 4.5rem;
max-width: 4.5rem;
}
.ammo {
min-width: 4.5rem;
max-width: 4.5rem;
}
.ammoQuantity {
min-width: 4.2rem;
max-width: 4.2rem;
}
.type {
min-width: 3rem;
max-width: 3rem;
}
.damage {
min-width: 6rem;
max-width: 6rem;
min-width: 4rem;
max-width: 4rem;
}
.name {
min-width: 10rem;
@@ -634,13 +477,21 @@
min-width: 1.8rem;
max-width: 1.8rem;
}
.protection {
min-width: 6rem;
max-width: 6rem;
.bonus {
min-width: 2rem;
max-width: 2rem;
}
.resilience {
min-width: 2rem;
max-width: 2rem;
}
.reduction {
min-width: 2rem;
max-width: 2rem;
}
.name {
min-width: 10rem;
max-width: 10rem;
min-width: 13.5rem;
max-width: 13.5rem;
}
.item-img {
width: 24px;
@@ -674,6 +525,10 @@
min-width: 10rem;
max-width: 10rem;
}
.quantity {
min-width: 2rem;
max-width: 2rem;
}
.item-img {
width: 24px;
height: 24px;
@@ -689,3 +544,115 @@
min-height: 150px;
}
}
.tab.character-biography .main-div {
/*background-color: var(--color-light-1);*/
display: grid;
grid-template-columns: 1fr;
legend {
a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
}
}
.splitted-text {
display: flex;
flex-direction: row;
gap: 4px;
fieldset {
width: 100%;
}
}
.deals {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 4px;
.deal {
display: flex;
align-items: center;
gap: 4px;
margin-left: 4px;
min-width: 12rem;
max-width: 12rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.name {
min-width: 10rem;
max-width: 10rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.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);
gap: 4px;
.experience {
display: flex;
flex-direction: row;
align-items: center;
gap: 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;
min-width: 14rem;
max-width: 14rem;
}
input {
text-align: left;
min-width: 8rem;
max-width: 8rem;
}
}
prose-mirror.inactive {
min-height: 40px;
}
prose-mirror.active {
min-height: 150px;
}
}

View File

@@ -1,700 +0,0 @@
.creature-content {
.sheet-common();
.creature-sheet-common();
overflow: scroll;
}
.sheet-tabs {
background-color: var(--color-light-1);
}
.creature-main {
background-color: var(--color-light-1);
display: flex;
.creature-pc {
display: flex;
gap: 4px;
flex: 1;
.creature-left {
min-width: 180px;
display: flex;
flex-direction: column;
.creature-left-image {
display: flex;
justify-content: center;
align-items: center;
padding-bottom: 8px;
.creature-img {
height: 140px;
width: auto;
border: none;
}
}
.creature-hp {
gap: 2px;
align-items: center;
input {
flex: none;
width: 2.5rem;
margin-left: 2px;
margin-right: 4px;
}
.hp-separator {
font-size: calc(var(--font-size-standard) * 1.2);
display: flex;
align-items: center;
justify-content: center;
}
}
.creature-dv,
.creature-dmax {
.form-fields {
flex: none;
}
}
.creature-dmax-edit {
input {
display: flex;
width: 60px;
font-size: calc(var(--font-size-standard) * 1.4);
align-items: center;
justify-content: center;
padding: 0 5px 0 5px;
text-align: center;
}
}
}
.creature-right {
display: flex;
flex-direction: column;
gap: 5px;
.creature-spec {
label {
max-width: 8rem;
}
select {
max-width: 10rem;
}
input {
max-width: 6rem;
}
.dice-2d6 {
max-width: 1.5rem;
}
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.rollable {
}
}
.creature-name {
display: flex;
input {
font-family: var(--font-title);
font-size: var(--font-size-title);
width: 400px;
}
}
label {
min-width: 120px;
}
}
}
.creature-pc-play {
min-width: 500px;
}
.creature-pc-edit {
min-width: 500px;
}
.creature-skills {
background-color: var(--color-light-1);
display: flex;
flex-direction: column;
gap: 5px;
flex: 1;
.creature-skill {
display: flex;
align-items: center;
.icon-skill {
width: 24px;
height: 24px;
margin-right: 4px;
}
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.rollable {
min-width: 4.5rem;
max-width: 4.5rem;
}
.char-text {
margin-left: 0.5rem;
}
.d100 {
flex: 0;
max-width: 0.6rem;
}
.form-group {
flex: 0;
padding-left: 5px;
.form-fields {
font-size: 1.1rem;
flex: none;
width: 40px;
}
}
}
}
.creature-skill-play {
min-width: 225px;
}
.creature-skill-edit {
min-width: 225px;
}
}
.creature-biography {
background-color: var(--color-light-1);
prose-mirror.inactive {
min-height: 40px;
}
prose-mirror.active {
min-height: 150px;
}
.field-label {
margin-left: 8px;
}
.rank {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 8px;
label {
min-width: 6rem;
}
input {
max-width: 4rem;
}
}
.biodata {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 8px;
label {
min-width: 12rem;
}
}
.resources {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 8px;
label {
min-width: 8rem;
}
}
.features,
.biodata {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 8px;
label {
min-width: 3rem;
}
.feature {
display: flex;
align-items: center;
gap: 4px;
min-width: 18rem;
max-width: 18rem;
}
}
}
.tab.creature-skills {
background-color: var(--color-light-1);
display: grid;
grid-template-columns: 1fr;
legend {
a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
}
}
.skills {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 4px;
.skill {
display: flex;
align-items: center;
gap: 4px;
margin-left: 4px;
min-width: 12.3rem;
max-width: 12.3rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.score {
min-width: 1.2rem;
max-width: 1.2rem;
}
.name {
min-width: 10rem;
max-width: 10rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
}
.tab.creature-status {
background-color: var(--color-light-1);
display: grid;
grid-template-columns: 1fr;
legend {
a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
}
}
.bonds {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.bond {
display: flex;
align-items: center;
gap: 4px;
min-width: 18rem;
max-width: 18rem;
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.name {
min-width: 12rem;
max-width: 12rem;
}
.type {
min-width: 6rem;
max-width: 6rem;
}
.level {
min-width: 2rem;
max-width: 2rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.motivations {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.motivation {
display: flex;
align-items: center;
gap: 4px;
min-width: 14rem;
max-width: 14rem;
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.name {
min-width: 12rem;
max-width: 12rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.mentaldisorders {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.mentaldisorder {
display: flex;
align-items: center;
gap: 4px;
min-width: 18rem;
max-width: 18rem;
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.name {
min-width: 14rem;
max-width: 14rem;
}
.cured {
min-width: 5rem;
max-width: 5rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.injuries {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.injury {
display: flex;
align-items: center;
gap: 4px;
min-width: 16rem;
max-width: 16rem;
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.name {
min-width: 14rem;
max-width: 14rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
}
.tab.creature-traits {
background-color: var(--color-light-1);
display: grid;
grid-template-columns: 1fr;
legend {
a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
}
}
.traits {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.trait {
display: flex;
align-items: center;
gap: 4px;
min-width: 13rem;
max-width: 13rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.damage {
min-width: 6rem;
max-width: 6rem;
}
.name {
min-width: 10rem;
max-width: 10rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.abilities {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.ability {
display: flex;
align-items: center;
gap: 4px;
min-width: 13rem;
max-width: 13rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.damage {
min-width: 6rem;
max-width: 6rem;
}
.name {
min-width: 10rem;
max-width: 10rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.psionics {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.psionic {
display: flex;
align-items: center;
gap: 4px;
min-width: 13rem;
max-width: 13rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.damage {
min-width: 6rem;
max-width: 6rem;
}
.name {
min-width: 10rem;
max-width: 10rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
}
.tab.creature-equipment {
background-color: var(--color-light-1);
display: grid;
grid-template-columns: 1fr;
legend {
a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
}
}
.encumbrance {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 4px;
input {
max-width: 4rem;
}
.encumbered {
color: red;
font-weight: bold;
}
}
.implants {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.implant {
display: flex;
align-items: center;
gap: 4px;
min-width: 13rem;
max-width: 13rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.damage {
min-width: 6rem;
max-width: 6rem;
}
.name {
min-width: 10rem;
max-width: 10rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.weapons {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.weapon {
display: flex;
align-items: center;
gap: 4px;
min-width: 13rem;
max-width: 13rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.damage {
min-width: 6rem;
max-width: 6rem;
}
.name {
min-width: 10rem;
max-width: 10rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.armors {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
.armor {
display: flex;
align-items: center;
gap: 4px;
min-width: 13rem;
max-width: 13rem;
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.protection {
min-width: 6rem;
max-width: 6rem;
}
.name {
min-width: 10rem;
max-width: 10rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.equipments {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 4px;
.equipment {
display: flex;
align-items: center;
gap: 4px;
min-width: 13rem;
max-width: 13rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.name {
min-width: 10rem;
max-width: 10rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
prose-mirror.inactive {
min-height: 40px;
}
prose-mirror.active {
min-height: 150px;
}
}

37
styles/deal.less Normal file
View File

@@ -0,0 +1,37 @@
.deal-content {
.sheet-common();
.item-sheet-common();
fieldset {
margin-top: 8px;
.form-group {
display: flex;
align-items: center;
}
.form-group.long-input input {
min-width: 24rem;
max-width: 24rem;
text-align: left;
}
.form-group input {
min-width: 12rem;
max-width: 12rem;
}
.form-group select {
min-width: 12rem;
max-width: 12rem;
}
}
.header {
display: flex;
img {
width: 50px;
height: 50px;
}
}
label {
flex: 10%;
}
}

489
styles/enemy.less Normal file
View File

@@ -0,0 +1,489 @@
.enemy-content {
.sheet-common();
.enemy-sheet-common();
overflow: scroll;
}
.sheet-tabs {
background-color: var(--color-light-1);
}
.enemy-main {
/*background-color: var(--color-light-1);*/
display: flex;
.enemy-pc {
display: flex;
gap: 4px;
flex: 1;
.enemy-left {
min-width: 180px;
display: flex;
flex-direction: column;
.enemy-left-image {
display: flex;
justify-content: center;
align-items: center;
padding-bottom: 8px;
.enemy-img {
height: 140px;
width: auto;
border: none;
}
}
.enemy-hp {
gap: 2px;
align-items: center;
input {
flex: none;
width: 2.5rem;
margin-left: 2px;
margin-right: 4px;
}
.hp-separator {
font-size: calc(var(--font-size-standard) * 1.2);
display: flex;
align-items: center;
justify-content: center;
}
}
.enemy-dv,
.enemy-dmax {
.form-fields {
flex: none;
}
}
}
.enemy-right {
display: flex;
flex-direction: column;
gap: 5px;
.enemy-definition {
.form-group {
display: flex;
align-items: center;
margin-bottom: 4px;
}
.splitted {
display: flex;
flex-direction: row;
gap: 4px;
}
label {
max-width: 5rem;
min-width: 5rem;
}
input {
text-align: left;
min-width: 18rem;
max-width: 18rem;
margin-bottom: auto;
}
.trait {
min-width: 7rem;
max-width: 7rem;
margin-right: 1rem;
margin-bottom: auto;
}
}
.enemy-name {
display: flex;
input {
font-family: var(--font-title);
font-size: var(--font-size-title);
width: 400px;
}
}
label {
min-width: 120px;
}
}
}
.enemy-pc-play {
min-width: 500px;
}
.enemy-pc-edit {
min-width: 500px;
}
.enemy-stats {
/*background-color: var(--color-light-1);*/
display: flex;
flex-direction: column;
gap: 5px;
flex: 1;
.enemy-stat {
display: flex;
align-items: center;
.icon-stat {
width: 24px;
height: 24px;
margin-right: 4px;
}
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.rollable {
min-width: 3.5rem;
max-width: 3.5rem;
}
input {
min-width: 2.5rem;
max-width: 2.5rem;
}
}
}
.enemy-stats-play {
min-width: 120px;
}
.enemy-stats-edit {
min-width: 120px;
}
}
.tab.enemy-traits .main-div {
/*background-color: var(--color-light-1);*/
display: grid;
grid-template-columns: 1fr;
legend {
a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
}
}
.enemy-column {
display: flex;
flex-direction: row;
gap: 4px;
fieldset {
width: 100%;
}
}
.mortality {
display: flex;
align-items: center;
gap: 4px;
margin-left: 4px;
min-width: 12rem;
max-width: 12rem;
label {
min-width: 5rem;
max-width: 5rem;
}
}
.counters {
display: flex;
direction: column;
align-items: center;
gap: 4px;
margin-left: 4px;
.characteristics-label {
color: grey;
font-size: small;
label {
min-width: 3.5rem;
max-width: 3.5rem;
}
span {
min-width: 3rem;
max-width: 3rem;
}
}
label {
min-width: 4rem;
max-width: 4rem;
}
.spaced-left {
margin-left: 0.8rem;
}
input {
min-width: 2.5rem;
max-width: 2.5rem;
}
}
.traits {
display: grid;
grid-template-columns: repeat(1, 1fr);
gap: 4px;
.trait {
display: flex;
align-items: center;
gap: 4px;
margin-left: 4px;
min-width: 12rem;
max-width: 12rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.name {
min-width: 18rem;
max-width: 18rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.equipments {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 4px;
.equipment {
display: flex;
align-items: center;
gap: 4px;
min-width: 13rem;
max-width: 13rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.name {
min-width: 12rem;
max-width: 12rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.ailments {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 4px;
.ailment {
display: flex;
align-items: center;
gap: 4px;
margin-left: 4px;
min-width: 8rem;
max-width: 8rem;
label {
min-width: 5rem;
max-width: 5rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.maleficas {
display: grid;
grid-template-columns: repeat(1, 1fr);
gap: 4px;
.malefica {
display: flex;
align-items: center;
gap: 4px;
margin-left: 4px;
min-width: 12rem;
max-width: 12rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.domain {
min-width: 4rem;
max-width: 4rem;
}
.damage {
min-width: 3.2rem;
max-width: 3.2rem;
}
.level {
min-width: 2rem;
max-width: 2rem;
}
.name {
min-width: 10rem;
max-width: 10em;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.weapons {
display: grid;
grid-template-columns: repeat(1, 1fr);
gap: 4px;
.weapon {
display: flex;
align-items: center;
gap: 4px;
min-width: 13rem;
max-width: 13rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.properties {
min-width: 18rem;
max-width: 18rem;
}
.range {
min-width: 4rem;
max-width: 4rem;
}
.ammo {
min-width: 3rem;
max-width: 3rem;
}
.type {
min-width: 3rem;
max-width: 3rem;
}
.damage {
min-width: 4rem;
max-width: 4rem;
}
.name {
min-width: 10rem;
max-width: 10rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
}
.tab.enemy-biography .main-div {
/*background-color: var(--color-light-1);*/
display: grid;
grid-template-columns: 1fr;
legend {
a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
}
}
.splitted-text {
display: flex;
flex-direction: row;
gap: 4px;
fieldset {
width: 100%;
}
}
.deals {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 4px;
.deal {
display: flex;
align-items: center;
gap: 4px;
margin-left: 4px;
min-width: 12rem;
max-width: 12rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.controls {
font-size: 0.7rem;
min-width: 1.8rem;
max-width: 1.8rem;
}
.name {
min-width: 10rem;
max-width: 10rem;
}
.item-img {
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
}
.biodata {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 4px;
.experience {
display: flex;
flex-direction: row;
align-items: center;
gap: 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;
min-width: 14rem;
max-width: 14rem;
}
input {
text-align: left;
min-width: 8rem;
max-width: 8rem;
}
}
prose-mirror.inactive {
min-height: 40px;
}
prose-mirror.active {
min-height: 150px;
}
}

View File

@@ -4,7 +4,6 @@
fieldset {
margin-top: 8px;
background-color: var(--color-light-1);
.form-group {
display: flex;
align-items: center;
@@ -22,7 +21,6 @@
}
.header {
background-color: var(--color-light-1);
display: flex;
img {
width: 50px;

View File

@@ -5,10 +5,12 @@
@import "mixins.less";
@import "character.less";
@import "vehicle.less";
@import "creature.less";
@import "enemy.less";
@import "weapon.less";
@import "equipment.less";
@import "armor.less";
@import "deal.less";
@import "tarot.less";
@import "ritual.less";
@import "perk.less";
@import "malefica.less";

View File

@@ -1,14 +1,13 @@
:root {
--font-size-standard: 0.9rem;
--font-size-result: 1.4rem;
--background-image-base: linear-gradient(rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.8)),
url("../assets/ui/ftl_nomad_background_01.webp");
--background-image-base: url("../assets/ui/sheet_background_01.webp");
--font-primary: "MinionProRegular";
--font-secondary: "MinionProRegular";
--font-title: "SupernaturalKnight";
--logo-standard: url("../assets/ui/pentagram_logo.webp");
--title-color: #f0443c;
--background-box: ##e0dcdc;
--background-box: #e0dcdc;
--color-success: rgb(15, 122, 15);
--color-failure: darkred;
--color-warning: darkorange;
@@ -16,15 +15,9 @@
--color-critical-failure: rgb(141, 32, 231);
}
.d100 {
width: 18px;
height: 18px;
color: black;
border-width: 0px;
}
.item .thumbnail,
.item-img {
body {
--color-light-1: rgba(182, 178, 178, 0.6);
--color-warm-1:#f0443c;
}
#logo {
@@ -34,15 +27,25 @@
margin-left: 15px;
}
.scrollable-content {
max-height: 600px; // Définissez la hauteur maximale selon vos besoins
overflow-y: auto; // Active le défilement vertical quand nécessaire
padding-right: 10px; // Espace pour la barre de défilement
}
nav.tabs [data-tab] {
color: var(--title-color);
}
#pause > img {
content: var(--logo-standard);
height: 192px;
height: 256px;
width: 256px;
top: -45px;
left: calc(50% - 96px);
}
i.fvtt-ftl-nomad {
i.fvtt-hellborn {
width: 36px;
height: 36px;
background-image: var(--logo-standard);
@@ -55,7 +58,7 @@ i.fvtt-ftl-nomad {
transition: 0.3s;
}
.application.dialog.fvtt-ftl-nomad {
.application.dialog.fvtt-hellborn {
font-family: var(--font-primary);
font-size: calc(var(--font-size-standard) * 1.0);
background-image: var(--background-image-base);

View File

@@ -4,12 +4,14 @@
fieldset {
margin-top: 8px;
background-color: var(--color-light-1);
.form-group {
display: flex;
align-items: center;
}
.form-group label {
.form-fields input[type="checkbox"] {
min-width: 2rem;
max-width: 2rem;
text-align: center;
}
.form-group input {
min-width: 12rem;
@@ -26,7 +28,6 @@
}
.header {
background-color: var(--color-light-1);
display: flex;
img {
width: 50px;

View File

@@ -69,7 +69,7 @@
}
}
.creature-sheet-common {
.enemy-sheet-common {
label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.0);

View File

@@ -4,7 +4,6 @@
fieldset {
margin-top: 8px;
background-color: var(--color-light-1);
.form-group {
display: flex;
align-items: center;
@@ -27,7 +26,6 @@
}
.header {
background-color: var(--color-light-1);
display: flex;
img {
width: 50px;

View File

@@ -4,13 +4,10 @@
fieldset {
margin-top: 8px;
background-color: var(--color-light-1);
.form-group {
display: flex;
align-items: center;
}
.form-group label {
}
.form-group.long-input input {
min-width: 24rem;
max-width: 24rem;
@@ -27,7 +24,6 @@
}
.header {
background-color: var(--color-light-1);
display: flex;
img {
width: 50px;

View File

@@ -1,4 +1,4 @@
.application.dialog.fvtt-cthulhu-eternal {
.application.dialog.fvtt-hellborn {
color: var(--color-dark-1);
background-color: var(--color-light-1);
@@ -10,13 +10,14 @@
input,
select {
text-align: left;
background-color: rgba(0, 0, 0, 0.1);
border-color: var(--color-dark-6);
color: var(--color-dark-2);
}
}
.fvtt-cthulhu-eternal-roll-dialog {
.fvtt-hellborn-roll-dialog {
fieldset {
padding: 10px;
background-color: var(--color-light-1);
@@ -53,6 +54,62 @@
color: var(--color-dark-1);
}
.item-to-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);
}
ul {
list-style-type: none;
padding: 0;
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 {
flex-direction: column;
@@ -70,14 +127,25 @@
border: 0px;
}
.intro-chat {
color:var(--color-dark-1);
color: var(--color-dark-1);
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: 5px;
width: 80px;
align-self: center;
padding: 4px;
max-width: 80px;
min-width: 80px;
align-self: top;
text-align: center;
}
.intro-right {
display: flex;
@@ -91,19 +159,30 @@
li {
margin: 0 10px;
font-family: var(--font-primary);
font-size: calc(var(--font-size-standard) * 1.0);
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.0);
font-size: calc(var(--font-size-standard) * 1);
margin-left: 4rem;
display: none;
}
.result-unknown {
color: var(--color-dark-2);
font-family: var(--font-title);
font-size: var(--font-size-result);
}
.result-success {
color: var(--color-success);
font-family: var(--font-title);
font-size: var(--font-size-result);
}
.result-critical-success {
.result-satanic-success {
color: var(--color-critical-success);
font-family: var(--font-title);
font-size: var(--font-size-result);
@@ -113,7 +192,7 @@
font-family: var(--font-title);
font-size: var(--font-size-result);
}
.result-critical-failure {
.result-fiendish-failure {
color: var(--color-critical-failure);
font-family: var(--font-title);
font-size: var(--font-size-result);
@@ -127,6 +206,7 @@
}
}
}
.result {
display: flex;
flex-direction: column;

View File

@@ -4,11 +4,26 @@
fieldset {
margin-top: 8px;
background-color: var(--color-light-1);
.form-group {
display: flex;
align-items: center;
}
.form-group.long-input input {
min-width: 24rem;
max-width: 24rem;
text-align: left;
}
.form-group input {
min-width: 12rem;
max-width: 12rem;
}
.form-group select {
min-width: 12rem;
max-width: 12rem;
}
}
.header {
background-color: var(--color-light-1);
display: flex;
img {
width: 50px;

50
styles/tarot.less Normal file
View File

@@ -0,0 +1,50 @@
.tarot-content {
.sheet-common();
.item-sheet-common();
fieldset {
margin-top: 8px;
legend {
margin-top: 1rem;
}
.form-group {
display: flex;
align-items: center;
}
.form-group.long-input input {
min-width: 24rem;
max-width: 24rem;
text-align: left;
}
.form-group input {
min-width: 12rem;
max-width: 12rem;
}
.form-group select {
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 {
width: 50px;
height: 50px;
}
}
label {
flex: 10%;
}
}

View File

@@ -3,7 +3,6 @@
.item-sheet-common();
.header {
background-color: var(--color-light-1);
display: flex;
img {
width: 50px;
@@ -13,7 +12,6 @@
fieldset {
margin-top: 8px;
background-color: var(--color-light-1);
.form-group {
display: flex;
align-items: center;

View File

@@ -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}#",
@@ -33,9 +33,8 @@
],
"documentTypes": {
"Actor": {
"character": { "htmlFields": ["description", "notes"] },
"monster": { "htmlFields": ["description", "notes"] },
"vehicle": { "htmlFields": ["description", "notes"] }
"character": { "htmlFields": ["backstory", "notes", "appearance", "scars", "likes", "dislikes", "fears", "vices", "goals", "ammbitions", "values", "bonds"] },
"enemy": { "htmlFields": ["description", "notes"] }
},
"Item": {
"perk": { "htmlFields": ["description"] },
@@ -44,10 +43,20 @@
"equipment": { "htmlFields": ["description"] },
"malefica": { "htmlFields": ["description"] },
"species-trait": { "htmlFields": ["description"] },
"ritual": { "htmlFields": ["description"] }
"ritual": { "htmlFields": ["description"] },
"tarot": { "htmlFields": ["description", "positiveEffect", "negativeEFfect"] },
"deal": { "htmlFields": ["description"] }
}
},
"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,

View File

@@ -1,34 +1,154 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<fieldset class="rank">
<legend>Rank</legend>
{{formField systemFields.rank.fields.experienced value=system.rank.experienced type="number" rootId=partId disabled=isPlayMode}}
{{formField systemFields.rank.fields.expert value=system.rank.expert type="number" rootId=partId disabled=isPlayMode}}
{{formField systemFields.rank.fields.veteran value=system.rank.veteran type="number" rootId=partId disabled=isPlayMode}}
{{formField systemFields.rank.fields.elite value=system.rank.elite type="number" rootId=partId disabled=isPlayMode}}
{{formField systemFields.rank.fields.legend value=system.rank.legend type="number" rootId=partId disabled=isPlayMode}}
</fieldset>
<div class="main-div">
<fieldset class="biodata">
<legend>{{localize "HELLBORN.Label.experience"}}</legend>
<div class="experience">
{{formField systemFields.experience.fields.current value=system.experience.current type="number" rootId=partId
disabled=isPlayMode}}
</div>
<div class="experience">
{{formField systemFields.experience.fields.total value=system.experience.total type="number" rootId=partId
disabled=isPlayMode}}
</div>
<div class="experience">
{{formField systemFields.experience.fields.training value=system.experience.training type="number" rootId=partId
disabled=isPlayMode}}
</div>
</fieldset>
<fieldset >
<legend>{{localize "HELLBORN.Label.biodata"}}</legend>
{{formField systemFields.biodata.fields.gender value=system.biodata.gender rootId=partId disabled=isPlayMode classes="short"}}
{{formField systemFields.biodata.fields.age value=system.biodata.age rootId=partId disabled=isPlayMode classes="short"}}
{{formField systemFields.biodata.fields.height value=system.biodata.height rootId=partId disabled=isPlayMode classes="short"}}
{{formField systemFields.biodata.fields.weight value=system.biodata.weight rootId=partId disabled=isPlayMode classes="short"}}
{{formField systemFields.biodata.fields.eyes value=system.biodata.eyes rootId=partId disabled=isPlayMode classes="short"}}
{{formField systemFields.biodata.fields.hair value=system.biodata.hair rootId=partId disabled=isPlayMode classes="short"}}
<div class="aliases">
{{formField systemFields.biodata.fields.aliases value=system.biodata.aliases rootId=partId disabled=isPlayMode}}
</div>
<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}}
{{formField systemFields.biodata.fields.birthplace value=system.biodata.birthplace 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>
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.description"}}</legend>
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
<legend>{{localize "HELLBORN.Label.deals"}}{{#if isEditMode}}
<a class="action" data-tooltip="{{localize "HELLBORN.Tooltip.addDeals"}}" data-tooltip-direction="UP"><i
class="fas fa-plus" data-action="createDeal"></i></a>{{/if}}
</legend>
<div class="deals">
{{#each deals as |item|}}
<div class="deal" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}">
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
<div class="name" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.notes"}}</legend>
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}}
<legend>{{localize "HELLBORN.Label.backstory"}}</legend>
{{formInput systemFields.backstory enriched=enrichedBackstory value=system.backstory name="system.backstory" toggled=true}}
</fieldset>
<div class="splitted-text">
<fieldset>
<legend>{{localize "HELLBORN.Label.appearance"}}</legend>
{{formInput systemFields.appearance enriched=enrichedAppearance value=system.appearance name="system.appearance"
toggled=true}}
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.scars"}}</legend>
{{formInput systemFields.scars enriched=scars value=system.scars name="system.scars"
toggled=true}}
</fieldset>
</div>
<div class="splitted-text">
<fieldset>
<legend>{{localize "HELLBORN.Label.likes"}}</legend>
{{formInput systemFields.likes enriched=enrichedLikes value=system.likes name="system.likes"
toggled=true}}
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.dislikes"}}</legend>
{{formInput systemFields.dislikes enriched=enrichedDislikes value=system.dislikes name="system.dislikes"
toggled=true}}
</fieldset>
</div>
<div class="splitted-text">
<fieldset>
<legend>{{localize "HELLBORN.Label.fears"}}</legend>
{{formInput systemFields.fears enriched=enrichedFears value=system.fears name="system.fears"
toggled=true}}
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.vices"}}</legend>
{{formInput systemFields.vices enriched=enrichedVices value=system.vices name="system.vices"
toggled=true}}
</fieldset>
</div>
<div class="splitted-text">
<fieldset>
<legend>{{localize "HELLBORN.Label.goals"}}</legend>
{{formInput systemFields.goals enriched=enrichedGoals value=system.goals name="system.goals"
toggled=true}}
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.ambitions"}}</legend>
{{formInput systemFields.ambitions enriched=enrichedAmbitions value=system.ambitions name="system.ambitions"
toggled=true}}
</fieldset>
</div>
<div class="splitted-text">
<fieldset>
<legend>{{localize "HELLBORN.Label.values"}}</legend>
{{formInput systemFields.values enriched=enrichedValues value=system.values name="system.values"
toggled=true}}
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.bonds"}}</legend>
{{formInput systemFields.bonds enriched=enrichedBonds value=system.bonds name="system.bonds"
toggled=true}}
</fieldset>
</div>
</div>
</section>

View File

@@ -1,14 +1,5 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<fieldset class="encumbrance">
{{#if isEncumbered}}
{{formField systemFields.enc.fields.value value=system.enc.value rootId=partId disabled=true classes="encumbered"}}
{{else }}
{{formField systemFields.enc.fields.value value=system.enc.value rootId=partId disabled=true}}
{{/if}}
{{formField systemFields.enc.fields.max value=system.enc.max rootId=partId disabled=isPlayMode}}
{{formField systemFields.credits value=system.credits rootId=partId }}
</fieldset>
<div class="main-div">
<fieldset>
<legend>{{localize "HELLBORN.Label.weapons"}}{{#if isEditMode}}
@@ -19,17 +10,33 @@
{{#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="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}}">
<i class="fa-regular fa-dice"></i>
<a class="damage rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage"
data-roll-value="{{item.system.damage}}">
{{localize "HELLBORN.Label.damageShort"}} :
{{item.system.damage}}</a>
{{item.system.damageFormula}}</a>
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
@@ -53,41 +60,10 @@
<div class="name" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
<span class="protection">{{localize "HELLBORN.Label.armor"}} : {{item.system.protection}}</span>
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
<span class="bonus" data-tooltip="Bonus">{{item.system.bonus}}</span>
<span class="resilience" data-tooltip="Resilience">{{item.system.resilience}}</span>
<span class="reduction" data-tooltip="Reduction">{{item.system.reduction}}</span>
<fieldset>
<legend>{{localize "HELLBORN.Label.implants"}}{{#if isEditMode}}
<a class="action" data-tooltip="{{localize "HELLBORN.Tooltip.addTalent"}}" data-tooltip-direction="UP"><i
class="fas fa-plus" data-action="createImplant"></i></a>{{/if}}
</legend>
<div class="implants">
{{#each implants as |item|}}
{{!log 'weapon' this}}
<div class="implant 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 src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
<div class="name" data-roll-type="weapon" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
<a class="damage rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage"
data-roll-value="{{item.system.damage}}">
{{#if item.system.isAdvantage}}
<i data-tooltip="Provides advantage" class="fas fa-circle-chevron-up"></i>
{{else}}
{{/if}}
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
@@ -112,6 +88,8 @@
<div class="name" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
<span class="quantity" data-tooltip="Quantity">{{item.system.quantity}}</span>
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
@@ -123,4 +101,27 @@
</div>
</fieldset>
<fieldset class="limboes">
<legend>Limboes and Ammo</legend>
<div class="limboes-line">
<div class="ammo-item">
<input type="text" class="limboes-name" value="{{system.limboes}}" name="system.limboes"/>
<span class="limboes-quantity">Limboes</span>
</div>
<div class="ammo-item">
<input type="text" class="ammo" value="{{system.ammo}}" name="system.ammo"/>
<span class="limboes-quantity">Ammo</span>
</div>
{{#each system.ammoArray as |ammo key|}}
<div class="ammo-item">
<input type="text" class="ammo-quantity" value="{{ammo.value}}" min="0" name="system.ammoArray.{{key}}.value" />
<span class="ammo-name">{{upperFirst ammo.label}}</span>
</div>
{{/each}}
</div>
</fieldset>
</div>
</section>

View File

@@ -8,16 +8,6 @@
<img class="character-img" src="{{actor.img}}" data-edit="img" data-action="editImage"
data-tooltip="{{actor.name}}" />
</div>
<fieldset class="character-hp">
<legend>{{localize "HELLBORN.Label.Stamina"}}</legend>
<div class="flexrow">
{{formField systemFields.health.fields.staminaValue value=system.health.staminaValue}}
{{formField systemFields.health.fields.staminaMax value=system.health.staminaMax rootId=partId disabled=true}}
</div>
<div class="flexrow">
{{formField systemFields.health.fields.wounds value=system.health.wounds }}
</div>
</fieldset>
</div>
<div class="character-right">
@@ -28,13 +18,55 @@
</a>
</div>
<fieldset class="character-spec">
{{formField systemFields.concept value=system.concept rootId=partId disabled=isPlayMode}}
<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.species value=system.species rootId=partId disabled=isPlayMode}}
{{formField systemFields.archetype value=system.archetype rootId=partId disabled=isPlayMode}}
<div class="hero-armor">
{{formField systemFields.heroPoints value=system.heroPoints rootId=partId }}
{{formField systemFields.armor.fields.value value=system.armor.value rootId=partId disabled=isPlayMode}}
</div>
<div class="flexrow">
<div class="form-group">
<label>Trait</label>
<input class="trait" type="text" value="{{trait.name}}" disabled >
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{trait.id}}"
data-item-uuid="{{trait.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{trait.id}}"
data-item-uuid="{{trait.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
</div>
</div>
<div>
<div class="flexrow">
<div class="form-group">
<label><a data-action="toChat" data-item-uuid="{{upright.uuid}}">Upright</a></label>
<input class="trait" type="text" value="{{upright.name}}" disabled >
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{upright.id}}"
data-item-uuid="{{upright.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{upright.id}}"
data-item-uuid="{{upright.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
</div>
<div class="flexrow">
<div class="form-group">
<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}}"
data-item-uuid="{{downright.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{downright.id}}"
data-item-uuid="{{downright.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
</div>
</div>
</div>
</fieldset>
@@ -42,58 +74,33 @@
</div>
</fieldset>
<fieldset class="character-skills character-skills-{{ifThen isPlayMode 'play' 'edit'}}">
<legend>{{localize "HELLBORN.Label.skills"}}</legend>
<div class="character-skill">
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_combat.svg" class="icon-skill" />
<label class="rollable" data-roll-type="skill" data-skill-id="combat">{{localize
"HELLBORN.Label.combat"}}</label>
{{formInput systemFields.skills.fields.combat.fields.value value=system.skills.combat.value rootId=partId disabled=isPlayMode type="number" }}
<fieldset class="character-stats character-stats-{{ifThen isPlayMode 'play' 'edit'}}">
<legend>{{localize "HELLBORN.Label.stats"}}</legend>
<div class="character-stat">
<label class="rollable" data-roll-type="stat" data-stat-id="flesh"><i class="fa-regular fa-dice"></i>{{localize
"HELLBORN.Label.flesh"}}</label>
{{formInput systemFields.stats.fields.flesh.fields.value value=system.stats.flesh.value rootId=partId disabled=isPlayMode type="number" }}
</div>
<div class="character-skill">
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_knowledge.svg" class="icon-skill" />
<label class="rollable" data-roll-type="skill" data-skill-id="knowledge">{{localize
"HELLBORN.Label.knowledge"}}</label>
{{formInput systemFields.skills.fields.knowledge.fields.value value=system.skills.knowledge.value
rootId=partId disabled=isPlayMode type="number"}}
<div class="character-stat">
<label class="rollable" data-roll-type="stat" data-stat-id="skin"><i class="fa-regular fa-dice"></i>{{localize
"HELLBORN.Label.skin"}}</label>
{{formInput systemFields.stats.fields.skin.fields.value value=system.stats.skin.value rootId=partId disabled=isPlayMode type="number" }}
</div>
<div class="character-skill">
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_social.svg" class="icon-skill" />
<label class="rollable" data-roll-type="skill" data-skill-id="social">{{localize
"HELLBORN.Label.social"}}</label>
{{formInput systemFields.skills.fields.social.fields.value value=system.skills.social.value
rootId=partId disabled=isPlayMode type="number"}}
<div class="character-stat">
<label class="rollable" data-roll-type="stat" data-stat-id="heart"><i class="fa-regular fa-dice"></i>{{localize
"HELLBORN.Label.heart"}}</label>
{{formInput systemFields.stats.fields.heart.fields.value value=system.stats.heart.value rootId=partId disabled=isPlayMode type="number" }}
</div>
<div class="character-skill">
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_physical.svg" class="icon-skill" />
<label class="rollable" data-roll-type="skill" data-skill-id="physical">{{localize
"HELLBORN.Label.physical"}}</label>
{{formInput systemFields.skills.fields.physical.fields.value value=system.skills.physical.value
rootId=partId disabled=isPlayMode type="number"}}
<div class="character-stat">
<label class="rollable" data-roll-type="stat" data-stat-id="mind"><i class="fa-regular fa-dice"></i>{{localize
"HELLBORN.Label.mind"}}</label>
{{formInput systemFields.stats.fields.mind.fields.value value=system.stats.mind.value rootId=partId disabled=isPlayMode type="number" }}
</div>
<div class="character-skill">
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_stealth.svg" class="icon-skill" />
<label class="rollable" data-roll-type="skill" data-skill-id="stealth">{{localize
"HELLBORN.Label.stealth"}}</label>
{{formInput systemFields.skills.fields.stealth.fields.value value=system.skills.stealth.value
rootId=partId disabled=isPlayMode type="number"}}
</div>
<div class="character-skill">
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_vehicles.svg" class="icon-skill" />
<label class="rollable" data-roll-type="skill" data-skill-id="vehicles">{{localize
"HELLBORN.Label.vehicles"}}</label>
{{formInput systemFields.skills.fields.vehicles.fields.value value=system.skills.vehicles.value
rootId=partId disabled=isPlayMode type="number"}}
</div>
<div class="character-skill">
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_technology.svg" class="icon-skill" />
<label class="rollable" data-roll-type="skill" data-skill-id="technology">{{localize
"HELLBORN.Label.technology"}}</label>
{{formInput systemFields.skills.fields.technology.fields.value value=system.skills.technology.value
rootId=partId disabled=isPlayMode type="number"}}
<div class="character-stat">
<label class="rollable" data-roll-type="stat" data-stat-id="soul"><i class="fa-regular fa-dice"></i>{{localize
"HELLBORN.Label.soul"}}</label>
{{formInput systemFields.stats.fields.soul.fields.value value=system.stats.soul.value rootId=partId disabled=isPlayMode type="number" }}
</div>
</fieldset>
</section>

View File

@@ -0,0 +1,70 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<div class="main-div">
<fieldset>
<legend>{{localize "HELLBORN.Label.maleficas"}}{{#if isEditMode}}
<a class="action" data-tooltip="{{localize "HELLBORN.Tooltip.addMalefica"}}" data-tooltip-direction="UP"><i
class="fas fa-plus" data-action="createMalefica"></i></a>{{/if}}
</legend>
<div class="maleficas">
{{#each maleficas as |item|}}
{{!log 'weapon' this}}
<div class="malefica 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 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}}}<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>
<span class="level" data-tooltip="Level">{{getRomanLevel item.system.level}}</span>
{{#if item.system.hasDamage}}
<a class="damage rollable" data-tooltip="Damage" data-item-id="{{item.id}}" data-action="roll"
data-roll-type="damage" data-roll-value="{{item.system.damage}}">
<i class="fa-regular fa-dice"></i>
{{item.system.damage}}</a>
{{else}}
<span class="damage" data-tooltip="Damage">-</span>
{{/if}}
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.rituals"}}{{#if isEditMode}}
<a class="action" data-tooltip="{{localize "HELLBORN.Tooltip.addRitual"}}" data-tooltip-direction="UP"><i
class="fas fa-plus" data-action="createRitual"></i></a>{{/if}}
</legend>
<div class="rituals">
{{#each rituals as |item|}}
<div class="ritual 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 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="weapon" data-tooltip="{{{item.system.description}}}">
<a>{{item.name}}</a>
</div>
<span class="ingredients" data-tooltip="Ingredients">{{upperFirst item.system.ingredients}}</span>
<span class="difficulty" data-tooltip="Difficulty">{{upperFirst item.system.difficulty}}</span>
<span class="threshold" data-tooltip="Threshold">{{upperFirst item.system.threshold}}</span>
<span class="limit" data-tooltip="Limit">{{upperFirst item.system.limit}}</span>
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
</div>
</section>

View File

@@ -0,0 +1,84 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<div class="main-div">
<fieldset>
<legend>{{localize "HELLBORN.Label.characteristics"}}</legend>
<div class="counters">
<div class="flexcol">
<div>
<label>Trauma </label>{{formInput systemFields.trauma.fields.current value=system.trauma.current}} /
{{formInput systemFields.trauma.fields.max value=system.trauma.max}}
<label class="spaced-left"> Darkness </label>{{formInput systemFields.darkness.fields.current value=system.darkness.current}} /
{{formInput systemFields.darkness.fields.max value=system.darkness.max}}
{{formInput systemFields.darkness.fields.value value=system.darkness.value}}
<label class="spaced-left"> Defense </label>{{formInput systemFields.defense.fields.base value=system.defense.base}}
{{formInput systemFields.defense.fields.bonus value=system.defense.bonus }}
{{formInput systemFields.defense.fields.total value=system.defense.total}}
{{formInput systemFields.defense.fields.resistance value=system.defense.resistance}}
<label class="spaced-left"> Movement </label>{{formInput systemFields.movement.fields.base value=system.movement.base}}
{{formInput systemFields.movement.fields.reduce value=system.defense.reduce }}
</div>
<div class="flexrow characteristics-label">
<label>&nbsp;</label><span>Curr.</span><span>Max</span>
<label>&nbsp;</label><span>Curr.</span><span>Max</span><span>Mal.DR</span>
<label>&nbsp;</label><span>Base</span><span>Armor</span><span>Total</span><span>Resi.</span>
<label>&nbsp;</label><span>Base</span><span>Redu.</span>
</div>
</div>
</div>
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.perks"}}{{#if isEditMode}}
<a class="action" data-tooltip="{{localize "HELLBORN.Tooltip.addPerk"}}" data-tooltip-direction="UP"><i
class="fas fa-plus" data-action="createPerk"></i></a>{{/if}}
</legend>
<div class="perks">
{{#each perks as |item|}}
<div class="perk 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 src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />-->
<div class="name" data-roll-type="perk" data-action="toChat" data-item-uuid="{{item.uuid}}" data-tooltip="{{{item.system.description}}}">
<a>{{item.name}}</a>
</div>
<span class="flavor" data-tooltip="Flavor text">{{upperFirst item.system.flavorText}}</span>
<span class="role" data-tooltip="Role">{{upperFirst item.system.role}}</span>
<span class="level" data-tooltip="Level">{{getRomanLevel item.system.level}}</span>
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.ailments"}}</legend>
<div class="mortality">
<label>Mortality :</label>
{{#each system.mortality.enabled as |mortality idx|}}
<input class="mortality-checkbox" type="checkbox" data-action="updateCheckboxArray" data-index="{{@index}}"
data-name="enabled" {{#if mortality}} checked {{/if}}>
{{/each}}
</div>
<div class="ailments">
{{#each system.ailments as |item id|}}
<div class="ailment " data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="false">
<label>{{item.label}}</label> <input type="checkbox" class="checkbox" name="system.ailments.{{id}}.enabled"
{{#if item.enabled}} checked {{/if}}>
</div>
{{/each}}
</div>
</fieldset>
</div>
</section>

View File

@@ -1,106 +0,0 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<fieldset>
<legend>{{localize "HELLBORN.Label.talents"}}{{#if isEditMode}}
<a class="action" data-tooltip="{{localize "HELLBORN.Tooltip.addTalent"}}" data-tooltip-direction="UP"><i
class="fas fa-plus" data-action="createTalent"></i></a>{{/if}}
</legend>
<div class="talents">
{{#each talents as |item|}}
{{!log 'weapon' this}}
<div class="talent 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 src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
<div class="name" data-roll-type="weapon" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
<a class="damage rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage"
data-roll-value="{{item.system.damage}}">
{{#if item.system.isAdvantage}}
<i data-tooltip="Provides advantage" class="fas fa-circle-chevron-up"></i>
{{else}}
{{/if}}
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.psionics"}}{{#if isEditMode}}
<a class="action" data-tooltip="{{localize "HELLBORN.Tooltip.addImplant"}}" data-tooltip-direction="UP"><i
class="fas fa-plus" data-action="createPsionic"></i></a>{{/if}}
</legend>
<div class="psionics">
{{#each psionics as |item|}}
{{!log 'weapon' this}}
<div class="psionic 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 src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
<div class="name" data-roll-type="weapon" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
<a class="damage rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage"
data-roll-value="{{item.system.damage}}">
{{#if item.system.isAdvantage}}
<i data-tooltip="Provides advantage" class="fas fa-circle-chevron-up"></i>
{{else}}
{{/if}}
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.languages"}}{{#if isEditMode}}
<a class="action" data-tooltip="{{localize "HELLBORN.Tooltip.addLanguage"}}" data-tooltip-direction="UP"><i
class="fas fa-plus" data-action="createLanguage"></i></a>{{/if}}
</legend>
<div class="languages">
{{#each languages as |item|}}
{{!log 'weapon' this}}
<div class="language 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 src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
<div class="name" data-roll-type="weapon" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
<a class="damage rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage"
data-roll-value="{{item.system.damage}}">
{{#if item.system.isAdvantage}}
<i data-tooltip="Provides advantage" class="fas fa-circle-chevron-up"></i>
{{else}}
{{/if}}
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
</section>

View File

@@ -0,0 +1,20 @@
<div class="item-to-chat">
<div class="intro-chat">
<h2>{{name}}</h2>
<ul>
<li><strong>Domain : </strong>{{upperFirst system.domain}}</li>
<li><strong>Level : </strong>{{getRomanLevel system.level}}</li>
<li><strong>Time : </strong>{{system.time}}</li>
{{#if (eq system.choiceMaintainDuration "duration")}}
<li><strong>Duration : </strong>{{system.duration}}</li>
{{else}}
<li><strong>Maintain : </strong>{{system.maintain}}</li>
{{/if}}
<li><strong>Range : </strong>{{system.range}}</li>
<li><strong>Target : </strong>{{system.target}}</li>
<li>{{{system.description}}}</li>
</ul>
</div>
</div>

View File

@@ -1,40 +1,72 @@
{{!log 'chat-message' this}}
<div class="{{cssClass}}">
<div class="intro-chat">
<div class="intro-img">
<img src="{{actingCharImg}}" data-tooltip="{{actingCharName}}" />
{{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 "skill")}}
<li><strong>{{localize "HELLBORN.Label.skillRoll"}}</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}}
{{#if weapon}}
<li><strong>Weapon : {{weapon.name}}</strong></li>
{{/if}}
<li><strong>{{localize rollItem.label}} : {{fullFormula}}</strong></li>
{{#if isEncumbered}}
<li class="red-warning">Encumbered : -1D</li>
{{/if}}
<li>{{localize "HELLBORN.Label.modifier"}} : {{numericModifier}}D</li>
<li class="chat-results-spacing">Results :
{{#each results as |result|}}
{{result.result}}
{{/each}}
</li>
{{#if isSuccess}}
<li class="result-success">
{{#if satanicSuccess}}
<li class="chat-results-spacing result-satanic-success">
{{localize "HELLBORN.Label.satanicSuccess"}}
</li>
{{else}}
<li class="chat-results-spacing result-success">
{{localize "HELLBORN.Label.success"}}
</li>
{{/if}}
{{/if}}
{{#if isFailure}}
<li class="result-failure">
{{#if fiendishFailure}}
<li class="chat-results-spacing result-fiendish-failure">
{{localize "HELLBORN.Label.fiendishFailure"}}
</li>
{{else}}
<li class="chat-results-spacing result-failure">
{{localize "HELLBORN.Label.failure"}}
</li>
{{/if}}
{{/if}}
{{#if (eq resultType "unknown")}}
<li class="chat-results-spacing result-unknown">
{{localize "HELLBORN.Label.unknown"}}
</li>
{{/if}}
</ul>
</div>
</div>

12
templates/chat-perk.hbs Normal file
View File

@@ -0,0 +1,12 @@
<div class="item-to-chat">
<div class="intro-chat">
<h2>{{name}}</h2>
<ul>
<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>
</ul>
</div>
</div>

14
templates/chat-ritual.hbs Normal file
View File

@@ -0,0 +1,14 @@
<div class="item-to-chat">
<div class="intro-chat">
<h2>{{name}}</h2>
<ul>
<li><strong>Difficulty : </strong>{{system.difficulty}}</li>
<li><strong>Threshold : </strong>{{system.threshold}}</li>
<li><strong>Limit : </strong>{{system.limit}}</li>
<li><strong>Ingredients : </strong>{{system.ingredients}}</li>
<li><strong>N. Attempts : </strong>{{system.nbAttempts}}</li>
<li>{{{system.description}}}</li>
</ul>
</div>
</div>

30
templates/chat-tarot.hbs Normal file
View File

@@ -0,0 +1,30 @@
<div class="item-to-chat">
<div class="intro-chat">
<h2>{{name}}</h2>
<ul>
{{#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")}}
<li><strong>Upright XP Trigger : </strong>{{system.bonus}}</li>
{{else}}
<li><strong>Reversed XP Trigger : </strong>{{system.penalty}}</li>
{{/if}}
<li class="tarot-spacing"><strong>Description : </strong>{{{system.description}}}</li>
{{#if (eq system.orientation "Upright")}}
<li class="tarot-spacing"><strong>Positive Effect : </strong>{{{system.positiveEffect}}}</li>
{{else}}
<li class="tarot-spacing"><strong>Negative Effect : </strong>{{{system.negativeEffect}}}</li>
{{/if}}
</ul>
<img class="tarot-item-img" src="{{system.image}}" />
</div>
</div>

9
templates/chat-trait.hbs Normal file
View File

@@ -0,0 +1,9 @@
<div class="item-to-chat">
<div class="intro-chat">
<h2>{{name}}</h2>
<ul>
<li>{{{system.description}}}</li>
</ul>
</div>
</div>

View File

@@ -1,103 +0,0 @@
<section class="creature-main creature-main-{{ifThen isPlayMode 'play' 'edit'}}">
{{!log "creature-main" this}}
<fieldset>
<legend>{{localize "HELLBORN.Label.creature"}}</legend>
<div class="creature-pc creature-pc-{{ifThen isPlayMode 'play' 'edit'}}">
<div class="creature-left">
<div class="creature-left-image">
<img class="creature-img" src="{{actor.img}}" data-edit="img" data-action="editImage"
data-tooltip="{{actor.name}}" />
</div>
<fieldset class="creature-hp">
<legend>{{localize "HELLBORN.Label.Stamina"}}</legend>
<div class="flexrow">
Curr. {{formField systemFields.health.fields.staminaValue value=system.health.staminaValue}}
Max {{formField systemFields.health.fields.staminaMax value=system.health.staminaMax rootId=partId}}
</div>
</fieldset>
</div>
<div class="creature-right">
<div class="creature-name">
{{formInput fields.name value=source.name rootId=partId disabled=isPlayMode}}
<a class="control" data-action="toggleSheet" data-tooltip="HELLBORN.ToggleSheet" data-tooltip-direction="UP">
<i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i>
</a>
</div>
<fieldset class="creature-spec">
<legend>{{localize "HELLBORN.Label.Details"}}</legend>
{{formField systemFields.terrain value=system.terrain rootId=partId disabled=isPlayMode localize=true}}
{{formField systemFields.niche value=system.niche rootId=partId disabled=isPlayMode localize=true}}
{{formField systemFields.size value=system.size rootId=partId disabled=isPlayMode localize=true}}
<div class="flexrow rollable" data-roll-type="creature-number">
<i class="fa-regular fa-dice dice-2d6"></i>
{{formField systemFields.numberAppearing value=system.numberAppearing rootId=partId disabled=isPlayMode
localize=true}}
</div>
<div class="flexrow rollable" data-roll-type="creature-damage">
<i class="fa-regular fa-dice dice-2d6"></i>
{{formField systemFields.damage value=system.damage rootId=partId disabled=isPlayMode localize=true}}
</div>
</fieldset>
</div>
</div>
</fieldset>
<fieldset class="creature-skills creature-skills-{{ifThen isPlayMode 'play' 'edit'}}">
<legend>{{localize "HELLBORN.Label.skills"}}</legend>
<div class="creature-skill">
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_combat.svg" class="icon-skill" />
<label class="rollable" data-roll-type="skill" data-skill-id="combat">{{localize
"HELLBORN.Label.combat"}}</label>
{{formInput systemFields.skills.fields.combat.fields.value value=system.skills.combat.value rootId=partId
disabled=isPlayMode type="number" }}
</div>
<div class="creature-skill">
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_knowledge.svg" class="icon-skill" />
<label class="rollable" data-roll-type="skill" data-skill-id="knowledge">{{localize
"HELLBORN.Label.knowledge"}}</label>
{{formInput systemFields.skills.fields.knowledge.fields.value value=system.skills.knowledge.value
rootId=partId disabled=isPlayMode type="number"}}
</div>
<div class="creature-skill">
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_social.svg" class="icon-skill" />
<label class="rollable" data-roll-type="skill" data-skill-id="social">{{localize
"HELLBORN.Label.social"}}</label>
{{formInput systemFields.skills.fields.social.fields.value value=system.skills.social.value
rootId=partId disabled=isPlayMode type="number"}}
</div>
<div class="creature-skill">
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_physical.svg" class="icon-skill" />
<label class="rollable" data-roll-type="skill" data-skill-id="physical">{{localize
"HELLBORN.Label.physical"}}</label>
{{formInput systemFields.skills.fields.physical.fields.value value=system.skills.physical.value
rootId=partId disabled=isPlayMode type="number"}}
</div>
<div class="creature-skill">
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_stealth.svg" class="icon-skill" />
<label class="rollable" data-roll-type="skill" data-skill-id="stealth">{{localize
"HELLBORN.Label.stealth"}}</label>
{{formInput systemFields.skills.fields.stealth.fields.value value=system.skills.stealth.value
rootId=partId disabled=isPlayMode type="number"}}
</div>
<div class="creature-skill">
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_vehicles.svg" class="icon-skill" />
<label class="rollable" data-roll-type="skill" data-skill-id="vehicles">{{localize
"HELLBORN.Label.vehicles"}}</label>
{{formInput systemFields.skills.fields.vehicles.fields.value value=system.skills.vehicles.value
rootId=partId disabled=isPlayMode type="number"}}
</div>
<div class="creature-skill">
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_technology.svg" class="icon-skill" />
<label class="rollable" data-roll-type="skill" data-skill-id="technology">{{localize
"HELLBORN.Label.technology"}}</label>
{{formInput systemFields.skills.fields.technology.fields.value value=system.skills.technology.value
rootId=partId disabled=isPlayMode type="number"}}
</div>
</fieldset>
</section>

View File

@@ -1,50 +0,0 @@
<section class="tab creature-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<fieldset>
<legend>{{localize "HELLBORN.Label.traits"}}{{#if isEditMode}}
<a class="action" data-tooltip="{{localize "HELLBORN.Tooltip.addTrait"}}" data-tooltip-direction="UP"><i
class="fas fa-plus" data-action="createTrait"></i></a>{{/if}}
</legend>
<div class="traits">
{{#each traits as |item|}}
<div class="trait 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}}" />
<div class="name" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.abilities"}}{{#if isEditMode}}
<a class="action" data-tooltip="{{localize "HELLBORN.Tooltip.addAbility"}}" data-tooltip-direction="UP"><i
class="fas fa-plus" data-action="createAbility"></i></a>{{/if}}
</legend>
<div class="abilities">
{{#each abilities as |item|}}
{{!log 'armor' this}}
<div class="ability" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}">
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
<div class="name" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
</section>

View File

@@ -5,7 +5,7 @@
</div>
<fieldset>
{{formField systemFields.isAdvantage value=system.isAdvantage}}
{{formField systemFields.promisor value=system.promisor localize=true }}
</fieldset>
<fieldset>

58
templates/enemy-main.hbs Normal file
View File

@@ -0,0 +1,58 @@
<section class="enemy-main enemy-main-{{ifThen isPlayMode 'play' 'edit'}}">
<fieldset>
<legend>{{localize "HELLBORN.Label.character"}}</legend>
<div class="enemy-pc enemy-pc-{{ifThen isPlayMode 'play' 'edit'}}">
<div class="enemy-left">
<div class="enemy-left-image">
<img class="enemy-img" src="{{actor.img}}" data-edit="img" data-action="editImage"
data-tooltip="{{actor.name}}" />
</div>
</div>
<div class="enemy-right">
<div class="enemy-name">
{{formInput fields.name value=source.name rootId=partId disabled=isPlayMode}}
<a class="control" data-action="toggleSheet" data-tooltip="HELLBORN.ToggleSheet" data-tooltip-direction="UP">
<i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i>
</a>
</div>
<fieldset class="enemy-definition">
{{formField systemFields.enemyType value=system.enemyType rootId=partId disabled=isPlayMode}}
{{formField systemFields.flavorText value=system.flavorText rootId=partId disabled=isPlayMode}}
</fieldset>
</div>
</div>
</fieldset>
<fieldset class="enemy-stats enemy-stats-{{ifThen isPlayMode 'play' 'edit'}}">
<legend>{{localize "HELLBORN.Label.stats"}}</legend>
<div class="enemy-stat">
<label class="rollable" data-roll-type="stat" data-stat-id="flesh"><i class="fa-regular fa-dice"></i>{{localize
"HELLBORN.Label.flesh"}}</label>
{{formInput systemFields.stats.fields.flesh.fields.value value=system.stats.flesh.value rootId=partId disabled=isPlayMode type="number" }}
</div>
<div class="enemy-stat">
<label class="rollable" data-roll-type="stat" data-stat-id="skin"><i class="fa-regular fa-dice"></i>{{localize
"HELLBORN.Label.skin"}}</label>
{{formInput systemFields.stats.fields.skin.fields.value value=system.stats.skin.value rootId=partId disabled=isPlayMode type="number" }}
</div>
<div class="enemy-stat">
<label class="rollable" data-roll-type="stat" data-stat-id="heart"><i class="fa-regular fa-dice"></i>{{localize
"HELLBORN.Label.heart"}}</label>
{{formInput systemFields.stats.fields.heart.fields.value value=system.stats.heart.value rootId=partId disabled=isPlayMode type="number" }}
</div>
<div class="enemy-stat">
<label class="rollable" data-roll-type="stat" data-stat-id="mind"><i class="fa-regular fa-dice"></i>{{localize
"HELLBORN.Label.mind"}}</label>
{{formInput systemFields.stats.fields.mind.fields.value value=system.stats.mind.value rootId=partId disabled=isPlayMode type="number" }}
</div>
<div class="enemy-stat">
<label class="rollable" data-roll-type="stat" data-stat-id="soul"><i class="fa-regular fa-dice"></i>{{localize
"HELLBORN.Label.soul"}}</label>
{{formInput systemFields.stats.fields.soul.fields.value value=system.stats.soul.value rootId=partId disabled=isPlayMode type="number" }}
</div>
</fieldset>
</section>

175
templates/enemy-trait.hbs Normal file
View File

@@ -0,0 +1,175 @@
<section class="tab enemy-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<div class="main-div">
<fieldset>
<legend>{{localize "HELLBORN.Label.characteristics"}}</legend>
<div class="counters">
<div class="flexcol">
<div>
<label>Trauma : </label>{{formInput systemFields.trauma.fields.current value=system.trauma.current}} /
{{formInput systemFields.trauma.fields.max value=system.trauma.max}}
<label class="spaced-left"> Darkness </label>
{{formInput systemFields.darkness.fields.current value=system.darkness.current}} /
{{formInput systemFields.darkness.fields.max value=system.darkness.max}}
{{formInput systemFields.darkness.fields.value value=system.darkness.value}}
<label class="spaced-left"> Defense </label>
{{formInput systemFields.defense.fields.base value=system.defense.base}}
{{formInput systemFields.defense.fields.resilience value=system.defense.resilience}}
<label class="spaced-left"> Movement </label>{{formInput systemFields.movement.fields.base value=system.movement.base}}
</div>
<div class="flexrow characteristics-label">
<label></label><span>Curr.</span><span>Max</span>
<label></label><span>&nbsp;&nbsp;&nbsp;Curr.</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Max</span><span>&nbsp;&nbsp;Mal.DR</span>
<label></label><span>&nbsp;&nbsp;&nbsp;Total</span><span>&nbsp;&nbsp;&nbsp;Resi.</span>
<label></label>
<label></label>
<label></label>
<label></label>
</div>
</div>
</div>
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.ailments"}}</legend>
<div class="ailments">
{{#each system.ailments as |item id|}}
<div class="ailment " data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="false">
<label>{{item.label}}</label> <input type="checkbox" class="checkbox" name="system.ailments.{{id}}.enabled"
{{#if item.enabled}} checked {{/if}}>
</div>
{{/each}}
</div>
</fieldset>
<div class="enemy-column">
<fieldset>
<legend>{{localize "HELLBORN.Label.traits"}}{{#if isEditMode}}
<a class="action" data-tooltip="{{localize "HELLBORN.Tooltip.addTrait"}}" data-tooltip-direction="UP"><i
class="fas fa-plus" data-action="createTrait"></i></a>{{/if}}
</legend>
<div class="traits">
{{#each traits as |item|}}
<div class="trait 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 src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />-->
<div class="name" data-roll-type="trait" data-action="toChat" data-item-uuid="{{item.uuid}}" data-tooltip="{{{item.system.description}}}">
<a>{{item.name}}</a>
</div>
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.maleficas"}}{{#if isEditMode}}
<a class="action" data-tooltip="{{localize "HELLBORN.Tooltip.addMalefica"}}" data-tooltip-direction="UP"><i
class="fas fa-plus" data-action="createMalefica"></i></a>{{/if}}
</legend>
<div class="maleficas">
{{#each maleficas as |item|}}
<div class="malefica 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 src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />-->
<div class="name" data-roll-type="malefica" data-action="toChat" data-item-uuid="{{item.uuid}}" data-tooltip="{{{item.system.description}}}">
<a>{{item.name}}</a>
</div>
<span class="domain" data-tooltip="Domain">{{upperFirst item.system.domain}}</span>
<span class="level" data-tooltip="Level">{{getRomanLevel item.system.level}}</span>
{{#if item.system.hasDamage}}
<a class="damage rollable" data-tooltip="Damage" data-item-id="{{item.id}}" data-action="roll"
data-roll-type="damage" data-roll-value="{{item.system.damage}}">
<i class="fa-regular fa-dice"></i>
{{item.system.damage}}</a>
{{else}}
<span class="damage" data-tooltip="Damage">-</span>
{{/if}}
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
</div>
<fieldset>
<legend>{{localize "HELLBORN.Label.weapons"}}{{#if isEditMode}}
<a class="action" data-tooltip="{{localize "HELLBORN.Tooltip.addWeapon"}}" data-tooltip-direction="UP"><i
class="fas fa-plus" data-action="createWeapon"></i></a>{{/if}}
</legend>
<div class="weapons">
{{#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}}" />
<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="properties" data-tooltip="Properties">{{upperFirst item.system.properties}}</span>
<span class="range" data-tooltip="Range">{{upperFirst item.system.range}}</span>
<span class="ammo" data-tooltip="Ammo">{{upperFirst item.system.ammo}}</span>
<a class="damage rollable" data-tooltip="Damage" data-item-id="{{item.id}}" data-action="roll"
data-roll-type="damage" data-roll-value="{{item.system.damage}}">
<i class="fa-regular fa-dice"></i>
{{item.system.damage}}</a>
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.equipments"}}{{#if isEditMode}}
<a class="action" data-tooltip="{{localize "HELLBORN.Tooltip.addEquipment"}}" data-tooltip-direction="UP"><i
class="fas fa-plus" data-action="createEquipment"></i></a>{{/if}}
</legend>
<div class="equipments">
{{#each equipments as |item|}}
{{!log 'armor' this}}
<div class="equipment" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}">
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
<div class="name" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
</div>
</section>

View File

@@ -5,6 +5,7 @@
</div>
<fieldset>
{{formField systemFields.quantity value=system.quantity}}
{{formField systemFields.cost value=system.cost}}
</fieldset>

View File

@@ -8,8 +8,21 @@
{{formField systemFields.domain value=system.domain localize=true}}
{{formField systemFields.level value=system.level localize=true}}
{{formField systemFields.time value=system.time localize=true }}
{{formField systemFields.choiceMaintainDuration value=system.choiceMaintainDuration localize=true }}
{{#if (eq system.choiceMaintainDuration "duration")}}
{{formField systemFields.duration value=system.duration localize=true}}
{{else}}
{{formField systemFields.maintain value=system.maintain localize=true}}
{{/if}}
{{formField systemFields.range value=system.range localize=true}}
{{formField systemFields.target value=system.target localize=true}}
{{formField systemFields.hasDamage value=system.hasDamage localize=true}}
{{#if system.hasDamage}}
{{formField systemFields.damage value=system.damage}}
{{formField systemFields.damageType value=system.damageType}}
{{/if}}
</fieldset>
<fieldset>

View File

@@ -2,46 +2,33 @@
<fieldSet>
{{#if (eq rollType "skill")}}
<legend>{{localize "HELLBORN.Label.skill"}}</legend>
{{#if (eq rollType "stat")}}
<legend>{{localize "HELLBORN.Label.stat"}}</legend>
{{/if}}
<div class="dialog-skill">{{localize rollItem.label}} : 2d6+{{rollItem.value}}</div>
<div class="dialog-stat">{{localize rollItem.label}} : 3d6+{{rollItem.value}}</div>
{{#if weapon}}
<div class="dialog-skill">Weapon : {{weapon.name}}</div>
{{/if}}
{{#if isEncumbered}}
<div class="dialog-skill red-warning">Encumbered : -1D</div>
<div class="dialog-stat">Weapon : {{weapon.name}}</div>
{{/if}}
</fieldSet>
<fieldSet class="dialog-modifier">
<legend>{{localize "HELLBORN.Label.modifier"}}</legend>
<legend>Advantages & Disadvantages</legend>
<select name="modifier" class="roll-skill-modifier">
{{selectOptions choiceModifier selected=modifier localize=true}}
<select name="nbadvantages" class="roll-stat-advantages">
{{selectOptions choiceAdvantages selected=nbAdvantages localize=true}}
</select>
<select name="nbdisadvantages" class="roll-stat-disadvantages">
{{selectOptions choiceDisadvantages selected=nbDisadvantages localize=true}}
</select>
{{#if weapon}}
<select name="range-modifier" class="roll-skill-range-modifier">
{{selectOptions choiceRangeModifier selected=rangeModifier}}
</select>
<ul>
<li>Two Attacks : <input type="checkbox" name="isAiming" data-field="two-attacks" class="select-combat-option"></li>
<li>Aiming : <input type="checkbox" data-field="aiming" class="select-combat-option"></li>
<li>Dim Lightning : <input type="checkbox" data-field="dim" class="select-combat-option"></li>
<li>Darkness : <input type="checkbox" data-field="darkness" class="select-combat-option"></li>
<li>Target Prone/Obscured : <input type="checkbox" data-field="prone" class="select-combat-option"></li>
<li>Target Cover : <input type="checkbox" data-field="cover" class="select-combat-option"></li>
<li>1/2 Auto Fire Recoil : <input type="checkbox" data-field="recoil-first" class="select-combat-option"></li>
<li>2+ Auto Fire Recoil : <input type="checkbox" data-field="recoil-third" class="select-combat-option"></li>
<li>Target Aware : <input type="checkbox" data-field="aware" class="select-combat-option"></li>
</ul>
{{/if}}
</fieldSet>
<fieldSet class="dialog-formula">
<legend>Difficulty</legend>
<input name="difficulty" class="roll-difficulty" type="number" value="{{difficulty}}">
</fieldSet>
<fieldSet class="dialog-formula">
@@ -52,7 +39,7 @@
<fieldSet>
<legend>{{localize "HELLBORN.Label.rollView"}}</legend>
<select name="visibility">
{{selectOptions rollModes selected=visibility}}
{{selectOptions rollModes selected=visibility localize=true}}
</select>
</fieldSet>

37
templates/tarot.hbs Normal file
View File

@@ -0,0 +1,37 @@
<section>
<div class="header">
<img class="item-img" src="{{item.img}}" data-edit="img" data-action="editImage" data-tooltip="{{item.name}}" />
{{formInput fields.name value=source.name}}
</div>
<fieldset>
{{formField systemFields.orientation value=system.orientation localize=true }}
</fieldset>
<fieldset>
<div class="flexrow scrollable-content">
<div class="flexcol">
<legend>{{localize "HELLBORN.Label.quote"}}</legend>
{{formInput systemFields.quote value=system.quote toggled=true}}
<legend>{{localize "HELLBORN.Label.bonus"}}</legend>
{{formInput systemFields.bonus value=system.bonus toggled=true}}
<legend>{{localize "HELLBORN.Label.penalty"}}</legend>
{{formInput systemFields.penalty value=system.penalty toggled=true}}
<legend>{{localize "HELLBORN.Label.description"}}</legend>
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description"
toggled=true}}
<legend>{{localize "HELLBORN.Label.positiveEffect"}}</legend>
{{formInput systemFields.positiveEffect enriched=enrichedPositiveEffect value=system.positiveEffect name="system.positiveEffect"
toggled=true}}
<legend>{{localize "HELLBORN.Label.negativeEffect"}}</legend>
{{formInput systemFields.negativeEffect enriched=enrichedNegativeEffect value=system.negativeEffect name="system.negativeEffect"
toggled=true}}
</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>
</div>
</fieldset>
</section>

View File

@@ -1,19 +0,0 @@
<section class="tab vehicle-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<fieldset>
<legend>{{localize "HELLBORN.Label.damages"}}</legend>
<textarea class="form-control" rows="5" name="system.damages"
data-tooltip="{{localize "HELLBORN.Tooltip.damages"}}">{{system.damages}}</textarea>
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.description"}}</legend>
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.notes"}}</legend>
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}}
</fieldset>
</section>

View File

@@ -1,54 +0,0 @@
<section class="tab vehicle-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<fieldset>
<legend>{{localize "HELLBORN.Label.weapons"}}{{#if isEditMode}}
<a class="action" data-tooltip="{{localize "HELLBORN.Tooltip.addWeapon"}}" data-tooltip-direction="UP"><i
class="fas fa-plus" data-action="createWeapon"></i></a>{{/if}}
</legend>
<div class="weapons">
{{#each weapons as |item|}}
{{!log 'weapon' this}}
<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}}" />
<div class="name rollable" data-roll-type="weapon" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
<a class="damage rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage"
data-roll-value="{{item.system.damage}}">{{localize "HELLBORN.Label.damageShort"}} :
{{item.system.damage}}</a>
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
<fieldset>
<legend>{{localize "HELLBORN.Label.equipment"}}{{#if isEditMode}}
<a class="action" data-tooltip="{{localize "HELLBORN.Tooltip.addEquipment"}}" data-tooltip-direction="UP"><i
class="fas fa-plus" data-action="createEquipment"></i></a>{{/if}}
</legend>
<div class="equipments">
{{#each equipments as |item|}}
{{!log 'armor' this}}
<div class="equipment" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}">
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
<div class="name" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
<div class="controls">
<a data-tooltip="{{localize 'HELLBORN.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'HELLBORN.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
</section>

View File

@@ -1,54 +0,0 @@
<section class="vehicle-main vehicle-main-{{ifThen isPlayMode 'play' 'edit'}}">
<fieldset>
<legend>{{localize "HELLBORN.Label.vehicle"}}</legend>
<div class="vehicle-pc vehicle-pc-{{ifThen isPlayMode 'play' 'edit'}}">
<div class="vehicle-left">
<div class="vehicle-left-image">
<img class="vehicle-img" src="{{actor.img}}" data-edit="img" data-action="editImage"
data-tooltip="{{actor.name}}" />
</div>
<fieldset>
<legend>{{localize "HELLBORN.Label.Agility"}}</legend>
<div class="flexrow">
{{formField systemFields.agility value=system.agility localize=true}}
</div>
</fieldset>
</div>
<div class="vehicle-right">
<div class="vehicle-name">
{{formInput fields.name value=source.name rootId=partId disabled=isPlayMode}}
<a class="control" data-action="toggleSheet" data-tooltip="HELLBORN.ToggleSheet"
data-tooltip-direction="UP">
<i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i>
</a>
</div>
<fieldset class="capacity ">
<legend>{{localize "HELLBORN.Label.capacity"}}</legend>
<div class="flexrow">
{{formField systemFields.armor value=system.armor localize=true}}
{{formField systemFields.force value=system.force localize=true}}
</div>
<div class="flexrow">
{{formField systemFields.range value=system.range localize=true}}
{{formField systemFields.speed value=system.speed localize=true}}
</div>
</fieldset>
<fieldset class="cargo">
<legend>{{localize "HELLBORN.Label.cargo"}}</legend>
<div class="flexrow">
{{formField systemFields.crew value=system.crew localize=true}}
{{formField systemFields.cargo value=system.cargo localize=true}}
{{formField systemFields.tonnage value=system.tonnage localize=true}}
</div>
</fieldset>
</div>
</div>
</fieldset>
</section>

View File

@@ -5,15 +5,20 @@
</div>
<fieldset>
{{formField systemFields.stat value=system.stat localize=true}}
{{formField systemFields.weaponType value=system.weaponType localize=true}}
{{#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}}
{{formField systemFields.properties value=system.properties classes="long-input"}}
{{formField systemFields.damage value=system.damage}}
{{formField systemFields.damageStat value=system.damageStat localize=true}}
{{formField systemFields.damageType value=system.damageType}}
{{formField systemFields.cost value=system.cost}}
</fieldset>