diff --git a/assets/fonts/baskerville-bold.ttf b/assets/fonts/baskerville-bold.ttf
new file mode 100644
index 0000000..f444f26
Binary files /dev/null and b/assets/fonts/baskerville-bold.ttf differ
diff --git a/assets/fonts/times-new-roman-regular.ttf b/assets/fonts/times-new-roman-regular.ttf
new file mode 100644
index 0000000..51261a0
Binary files /dev/null and b/assets/fonts/times-new-roman-regular.ttf differ
diff --git a/assets/icons/icon_armor.webp b/assets/icons/icon_armor.webp
new file mode 100644
index 0000000..0e9e7fb
Binary files /dev/null and b/assets/icons/icon_armor.webp differ
diff --git a/assets/icons/icon_equipment.webp b/assets/icons/icon_equipment.webp
new file mode 100644
index 0000000..b8a4249
Binary files /dev/null and b/assets/icons/icon_equipment.webp differ
diff --git a/assets/icons/icon_gift.webp b/assets/icons/icon_gift.webp
new file mode 100644
index 0000000..70927d4
Binary files /dev/null and b/assets/icons/icon_gift.webp differ
diff --git a/assets/icons/icon_miracle.webp b/assets/icons/icon_miracle.webp
new file mode 100644
index 0000000..fd0697d
Binary files /dev/null and b/assets/icons/icon_miracle.webp differ
diff --git a/assets/icons/icon_save.webp b/assets/icons/icon_save.webp
new file mode 100644
index 0000000..f45d70f
Binary files /dev/null and b/assets/icons/icon_save.webp differ
diff --git a/assets/icons/icon_saving.webp b/assets/icons/icon_saving.webp
new file mode 100644
index 0000000..68df14e
Binary files /dev/null and b/assets/icons/icon_saving.webp differ
diff --git a/assets/icons/icon_shield.webp b/assets/icons/icon_shield.webp
new file mode 100644
index 0000000..df0bfe9
Binary files /dev/null and b/assets/icons/icon_shield.webp differ
diff --git a/assets/icons/icon_skill.webp b/assets/icons/icon_skill.webp
new file mode 100644
index 0000000..2211197
Binary files /dev/null and b/assets/icons/icon_skill.webp differ
diff --git a/assets/icons/icon_spell.webp b/assets/icons/icon_spell.webp
new file mode 100644
index 0000000..e9538c7
Binary files /dev/null and b/assets/icons/icon_spell.webp differ
diff --git a/assets/icons/icon_vulnerability.webp b/assets/icons/icon_vulnerability.webp
new file mode 100644
index 0000000..a103e09
Binary files /dev/null and b/assets/icons/icon_vulnerability.webp differ
diff --git a/assets/icons/icon_weapon.webp b/assets/icons/icon_weapon.webp
new file mode 100644
index 0000000..d929a97
Binary files /dev/null and b/assets/icons/icon_weapon.webp differ
diff --git a/assets/ui/lethal_fantasy_background.webp b/assets/ui/lethal_fantasy_background.webp
new file mode 100644
index 0000000..c0388da
Binary files /dev/null and b/assets/ui/lethal_fantasy_background.webp differ
diff --git a/assets/ui/lf_logo_02.webp b/assets/ui/lf_logo_02.webp
new file mode 100644
index 0000000..624065d
Binary files /dev/null and b/assets/ui/lf_logo_02.webp differ
diff --git a/assets/ui/lf_logo_small_02.webp b/assets/ui/lf_logo_small_02.webp
new file mode 100644
index 0000000..134402b
Binary files /dev/null and b/assets/ui/lf_logo_small_02.webp differ
diff --git a/css/fvtt-lethal-fantasy.css b/css/fvtt-lethal-fantasy.css
index 7893e3b..4eebc41 100644
--- a/css/fvtt-lethal-fantasy.css
+++ b/css/fvtt-lethal-fantasy.css
@@ -1,8 +1,9 @@
:root {
+ --font-primary: "TimesNewRoman", serif;
--font-size-standard: 1rem;
- --background-image-base: url("../assets/parchment.jpg");
- --font-secondary: "Amiri", serif;
- --logo-standard: url("../assets/lethal-fantasy-logo.webp");
+ --background-image-base: url("../assets/ui/lethal_fantasy_background.webp");
+ --font-secondary: "BaskervilleBold", serif;
+ --logo-standard: url("../assets/ui/lf_logo_small_02.webp");
}
#logo {
content: var(--logo-standard);
@@ -130,32 +131,28 @@ i.lethalfantasy {
.lethalfantasy .character-main {
display: flex;
}
-.lethalfantasy .character-main .character-personnage {
+.lethalfantasy .character-main .character-pc {
display: flex;
gap: 10px;
flex: 1;
}
-.lethalfantasy .character-main .character-personnage .character-gauche {
+.lethalfantasy .character-main .character-pc .character-left {
min-width: 180px;
display: flex;
flex-direction: column;
}
-.lethalfantasy .character-main .character-personnage .character-gauche .character-gauche-image {
+.lethalfantasy .character-main .character-pc .character-left .character-left-image {
display: flex;
justify-content: center;
align-items: center;
padding-bottom: 20px;
}
-.lethalfantasy .character-main .character-personnage .character-gauche .character-gauche-image .character-img {
+.lethalfantasy .character-main .character-pc .character-left .character-left-image .character-img {
height: 140px;
width: auto;
border: none;
}
-.lethalfantasy .character-main .character-personnage .character-gauche .character-dv .form-fields,
-.lethalfantasy .character-main .character-personnage .character-gauche .character-dmax .form-fields {
- flex: none;
-}
-.lethalfantasy .character-main .character-personnage .character-gauche .character-dmax-edit input {
+.lethalfantasy .character-main .character-pc .character-left .character-hp-edit input {
display: flex;
width: 60px;
font-size: calc(var(--font-size-standard) * 1.4);
@@ -164,55 +161,37 @@ i.lethalfantasy {
padding: 0 5px 0 5px;
text-align: center;
}
-.lethalfantasy .character-main .character-personnage .character-droite {
+.lethalfantasy .character-main .character-pc .character-right {
display: flex;
flex-direction: column;
gap: 5px;
}
-.lethalfantasy .character-main .character-personnage .character-droite .character-name {
+.lethalfantasy .character-main .character-pc .character-right .character-name {
display: flex;
}
-.lethalfantasy .character-main .character-personnage .character-droite .character-name input {
+.lethalfantasy .character-main .character-pc .character-right .character-name input {
width: 400px;
}
-.lethalfantasy .character-main .character-personnage .character-droite .character-infos {
+.lethalfantasy .character-main .character-pc .character-right .character-infos {
display: flex;
flex-direction: column;
gap: 10px;
}
-.lethalfantasy .character-main .character-personnage .character-droite .character-infos label {
+.lethalfantasy .character-main .character-pc .character-right .character-infos label {
min-width: 120px;
}
-.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-voie-majeure,
-.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-voie-mineure {
- display: flex;
-}
-.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-voie-majeure input,
-.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-voie-mineure input {
- width: 280px;
-}
-.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-voie-majeure .controls,
-.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-voie-mineure .controls {
- padding-left: 5px;
-}
-.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-commanditaire {
- display: flex;
-}
-.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-commanditaire input {
- width: 280px;
-}
-.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-pv {
+.lethalfantasy .character-main .character-pc .character-right .character-infos .character-hp {
display: flex;
gap: 2px;
align-items: center;
}
-.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-pv .character-pv-value .form-fields input {
+.lethalfantasy .character-main .character-pc .character-right .character-infos .character-hp .character-hp-value .form-fields input {
flex: none;
width: 50px;
margin-left: 10px;
font-size: calc(var(--font-size-standard) * 1.4);
}
-.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-pv .character-pv-max {
+.lethalfantasy .character-main .character-pc .character-right .character-infos .character-hp .character-hp-max {
clear: both;
display: flex;
flex-direction: row;
@@ -220,53 +199,53 @@ i.lethalfantasy {
margin: 3px 0;
align-items: center;
}
-.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-pv .character-pv-max input {
+.lethalfantasy .character-main .character-pc .character-right .character-infos .character-hp .character-hp-max input {
width: 50px;
text-align: center;
font-size: calc(var(--font-size-standard) * 1.4);
}
-.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-pv .pv-separator {
+.lethalfantasy .character-main .character-pc .character-right .character-infos .character-hp .hp-separator {
font-size: calc(var(--font-size-standard) * 1.2);
display: flex;
align-items: center;
justify-content: center;
}
-.lethalfantasy .character-main .character-personnage-play {
+.lethalfantasy .character-main .character-pc-play {
min-width: 500px;
}
-.lethalfantasy .character-main .character-personnage-edit {
+.lethalfantasy .character-main .character-pc-edit {
min-width: 650px;
}
-.lethalfantasy .character-main .character-caracteristiques {
+.lethalfantasy .character-main .character-characteristics {
display: flex;
flex-direction: column;
gap: 5px;
flex: 1;
}
-.lethalfantasy .character-main .character-caracteristiques .character-caracteristique {
+.lethalfantasy .character-main .character-characteristics .character-characteristic {
display: flex;
align-items: center;
}
-.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .rollable:hover,
-.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .rollable:focus {
+.lethalfantasy .character-main .character-characteristics .character-characteristic .rollable:hover,
+.lethalfantasy .character-main .character-characteristics .character-characteristic .rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
-.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .form-group {
+.lethalfantasy .character-main .character-characteristics .character-characteristic .form-group {
flex: 1;
padding-left: 5px;
}
-.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .form-group .form-fields {
+.lethalfantasy .character-main .character-characteristics .character-characteristic .form-group .form-fields {
flex: none;
width: 70px;
}
-.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .experience {
+.lethalfantasy .character-main .character-characteristics .character-characteristic .experience {
display: flex;
align-items: center;
gap: 10px;
margin-left: 10px;
}
-.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .experience input {
+.lethalfantasy .character-main .character-characteristics .character-characteristic .experience input {
display: flex;
width: 70px;
font-size: calc(var(--font-size-standard) * 1.4);
@@ -274,54 +253,54 @@ i.lethalfantasy {
justify-content: center;
padding: 0 5px 0 5px;
}
-.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .experience input[type="number"] {
+.lethalfantasy .character-main .character-characteristics .character-characteristic .experience input[type="number"] {
text-align: center;
}
-.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .experience input[type="checkbox"] {
+.lethalfantasy .character-main .character-characteristics .character-characteristic .experience input[type="checkbox"] {
width: 20px;
}
-.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .experience input[type="checkbox"]:checked {
+.lethalfantasy .character-main .character-characteristics .character-characteristic .experience input[type="checkbox"]:checked {
background-color: rgba(0, 0, 0, 0.1);
}
-.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .experience input[type="checkbox"]:checked::after {
+.lethalfantasy .character-main .character-characteristics .character-characteristic .experience input[type="checkbox"]:checked::after {
color: rgba(0, 0, 0, 0.1);
}
-.lethalfantasy .character-main .character-caracteristiques-play {
+.lethalfantasy .character-main .character-characteristics-play {
min-width: 225px;
}
-.lethalfantasy .character-main .character-caracteristiques-edit {
+.lethalfantasy .character-main .character-characteristic-edit {
min-width: 400px;
}
-.lethalfantasy .character-main .character-ressources {
+.lethalfantasy .character-main .character-resources {
display: flex;
flex-direction: column;
gap: 5px;
flex: 1;
}
-.lethalfantasy .character-main .character-ressources .character-ressource {
+.lethalfantasy .character-main .character-resources .character-resource {
display: flex;
align-items: center;
}
-.lethalfantasy .character-main .character-ressources .character-ressource .rollable:hover,
-.lethalfantasy .character-main .character-ressources .character-ressource .rollable:focus {
+.lethalfantasy .character-main .character-resources .character-resource .rollable:hover,
+.lethalfantasy .character-main .character-resources .character-resource .rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
-.lethalfantasy .character-main .character-ressources .character-ressource .form-group {
+.lethalfantasy .character-main .character-resources .character-resource .form-group {
flex: 1;
padding-left: 5px;
}
-.lethalfantasy .character-main .character-ressources .character-ressource .form-group .form-fields {
+.lethalfantasy .character-main .character-resources .character-resource .form-group .form-fields {
flex: none;
width: 70px;
}
-.lethalfantasy .character-main .character-ressources .character-ressource .character-ressource-edit {
+.lethalfantasy .character-main .character-resources .character-resource .character-resource-edit {
display: flex;
align-items: center;
gap: 10px;
margin-left: 10px;
}
-.lethalfantasy .character-main .character-ressources .character-ressource .character-ressource-edit input {
+.lethalfantasy .character-main .character-resources .character-resource .character-resource-edit input {
display: flex;
width: 70px;
font-size: calc(var(--font-size-standard) * 1.4);
@@ -329,19 +308,19 @@ i.lethalfantasy {
justify-content: center;
padding: 0 5px 0 5px;
}
-.lethalfantasy .character-main .character-ressources .character-ressource .character-ressource-edit input[type="number"] {
+.lethalfantasy .character-main .character-resources .character-resource .character-resource-edit input[type="number"] {
text-align: center;
}
-.lethalfantasy .character-main .character-ressources .character-ressource .character-ressource-edit select {
+.lethalfantasy .character-main .character-resources .character-resource .character-resource-edit select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.5);
text-align: center;
width: 75px;
}
-.lethalfantasy .character-main .character-ressources-play {
+.lethalfantasy .character-main .character-resources-play {
min-width: 235px;
}
-.lethalfantasy .character-main .character-ressources-edit {
+.lethalfantasy .character-main .character-resources-edit {
min-width: 400px;
}
.lethalfantasy .character-biography prose-mirror.inactive {
@@ -350,74 +329,118 @@ i.lethalfantasy {
.lethalfantasy .character-biography prose-mirror.active {
min-height: 150px;
}
-.lethalfantasy .tab.character-items {
+.lethalfantasy .tab.character-skills {
display: grid;
grid-template-columns: 1fr;
}
-.lethalfantasy .tab.character-items legend a {
+.lethalfantasy .tab.character-skills legend a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
}
-.lethalfantasy .tab.character-items .talents {
+.lethalfantasy .tab.character-skills .skills {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 10px;
}
-.lethalfantasy .tab.character-items .talents .talent {
+.lethalfantasy .tab.character-skills .skills .skill {
display: flex;
align-items: center;
gap: 10px;
}
-.lethalfantasy .tab.character-items .talents .talent .item-img {
+.lethalfantasy .tab.character-skills .skills .skill .item-img {
width: 50px;
height: 50px;
}
-.lethalfantasy .tab.character-items .weapons {
+.lethalfantasy .tab.character-skills .gifts {
+ display: grid;
+ grid-template-columns: repeat(5, 1fr);
+ gap: 10px;
+}
+.lethalfantasy .tab.character-skills .gifts .gift {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+}
+.lethalfantasy .tab.character-skills .gifts .gift .item-img {
+ width: 50px;
+ height: 50px;
+}
+.lethalfantasy .tab.character-skills .vulnerabilities {
+ display: grid;
+ grid-template-columns: repeat(5, 1fr);
+ gap: 10px;
+}
+.lethalfantasy .tab.character-skills .vulnerabilities .vulnerability {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+}
+.lethalfantasy .tab.character-skills .vulnerabilities .vulnerability .item-img {
+ width: 50px;
+ height: 50px;
+}
+.lethalfantasy .tab.character-weapons {
+ display: grid;
+ grid-template-columns: 1fr;
+}
+.lethalfantasy .tab.character-weapons legend a {
+ font-size: calc(var(--font-size-standard) * 1.4);
+ padding-left: 5px;
+}
+.lethalfantasy .tab.character-weapons .weapons {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10px;
}
-.lethalfantasy .tab.character-items .weapons .weapon {
+.lethalfantasy .tab.character-weapons .weapons .weapon {
display: flex;
align-items: center;
gap: 10px;
}
-.lethalfantasy .tab.character-items .weapons .weapon .item-img {
+.lethalfantasy .tab.character-weapons .weapons .weapon .item-img {
width: 50px;
height: 50px;
margin: 5px 0 0 0;
}
-.lethalfantasy .tab.character-items .armors {
+.lethalfantasy .tab.character-weapons .armors {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
-.lethalfantasy .tab.character-items .armors .armor {
+.lethalfantasy .tab.character-weapons .armors .armor {
display: flex;
align-items: center;
gap: 10px;
}
-.lethalfantasy .tab.character-items .armors .armor .item-img {
+.lethalfantasy .tab.character-weapons .armors .armor .item-img {
width: 50px;
height: 50px;
margin: 5px 0 0 0;
}
-.lethalfantasy .tab.character-items .spells {
+.lethalfantasy .tab.character-spells {
+ display: grid;
+ grid-template-columns: 1fr;
+}
+.lethalfantasy .tab.character-spells legend a {
+ font-size: calc(var(--font-size-standard) * 1.4);
+ padding-left: 5px;
+}
+.lethalfantasy .tab.character-spells .spells {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
-.lethalfantasy .tab.character-items .spells .spell {
+.lethalfantasy .tab.character-spells .spells .spell {
display: flex;
gap: 10px;
}
-.lethalfantasy .tab.character-items .appris {
+.lethalfantasy .tab.character-spells .appris {
font-weight: bold;
}
-.lethalfantasy .tab.character-items prose-mirror.inactive {
+.lethalfantasy .tab.character-spells prose-mirror.inactive {
min-height: 40px;
}
-.lethalfantasy .tab.character-items prose-mirror.active {
+.lethalfantasy .tab.character-spells prose-mirror.active {
min-height: 150px;
}
.lethalfantasy .opponent-content {
diff --git a/lang/en.json b/lang/en.json
index 6e489a5..c061d72 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -13,11 +13,54 @@
"vulnerability": "Vulnerability",
"save": "Save",
"equipment": "Equipment" ,
- "shield": "Shield"
+ "shield": "Shield",
+ "miracle": "Miracle"
}
},
"LETHALFANTASY": {
+ "Miracle": {
+ "FIELDS": {
+ "description": {
+ "label": "Description"
+ },
+ "components": {
+ "verbal": {
+ "label": "Verbal"
+ },
+ "somatic": {
+ "label": "Somatic"
+ },
+ "material": {
+ "label": "Material"
+ },
+ "catalyst": {
+ "label": "Catalyst"
+ },
+ "religious": {
+ "label": "Religious"
+ }
+ },
+ "level": {
+ "label": "Level"
+ },
+ "prayerTime": {
+ "label": "Prayer time"
+ },
+ "miracleRange": {
+ "label": "Range"
+ },
+ "duration": {
+ "label": "Duration"
+ },
+ "areaAffected": {
+ "label": "Area affected"
+ },
+ "savingThrow": {
+ "label": "Saving throw"
+ }
+ }
+ },
"Character": {
"FIELDS": {
"str": {
@@ -59,6 +102,20 @@
"category": {
"label": "Category"
},
+ "weaponClass": {
+ "label": "Class"
+ },
+ "weaponBonus": {
+ "attack": {
+ "label": "Attack Bonus"
+ },
+ "damage": {
+ "label": "Damage Bonus"
+ },
+ "defense": {
+ "label": "Defense Bonus"
+ }
+ },
"bonus" :{
"label": "Bonus"
},
@@ -101,6 +158,20 @@
"melee": "Melee",
"ranged": "Ranged"
},
+ "WeaponClass": {
+ "longblade": "Long blade",
+ "shortblade": "Short blade",
+ "mediumblade": "Medium blade",
+ "axe": "Axe",
+ "hammer": "Hammer",
+ "polearm": "Polearm",
+ "thrown": "Thrown",
+ "bow": "Bow",
+ "flail": "Flail",
+ "sling": "Sling",
+ "unarmed": "Unarmed",
+ "mace": "Mace"
+ },
"FIELDS": {
"weaponType": {
"label": "Type"
@@ -147,7 +218,7 @@
"defense": {
"label": "Defense"
},
- "range": {
+ "weaponRange": {
"pointBlank": {
"label": "Point blank"
},
@@ -299,7 +370,7 @@
"castingTime": {
"label": "Casting time"
},
- "range": {
+ "spellRange": {
"label": "Range"
},
"duration": {
@@ -344,54 +415,45 @@
"Platinums": "Platinum"
},
"Label": {
+ "characteristics": "Characteristics",
+ "characteristic": "Characteristic",
"description": "Description",
+ "notes": "Notes",
"total": "Total",
- "langues": "Langues",
- "profil": "Profil",
- "details": "Détails",
- "talents": "Talents",
- "progressionPossible": "Progression possible",
- "equipement": "Equipement",
- "spells" : "Sortilèges",
- "level": "Niveau",
- "degats": "Dégâts",
- "ressource": "Ressource",
- "sauvegarde": "Sauvegarde",
- "newArmor": "Nouvelle armure",
- "newWeapon": "Nouvelle arme",
- "armor": "Armure",
+ "details": "Details",
+ "skills": "Skills",
+ "equipment": "Equipment",
+ "weapons": "Weapons",
+ "spells" : "Spells",
+ "level": "Level",
+ "damage": "Damage",
+ "resource": "Resource",
+ "resources": "Resources",
+ "save": "Save",
+ "newArmor": "New armor",
+ "newWeapon": "New weapon",
+ "armor": "Armor",
"malus": "Malus",
- "jet": "Jet de ",
- "progress": "Progression",
- "hasProgressed": "A progressé dans la caractéristique",
- "noProgress": "N'a pas progressé dans la caractéristique",
- "experience": "Expérience",
- "experienceDetail": "Expérience {detail}",
- "maximum": "Maximum"
+ "jet": "Roll",
+ "experience": "Experience",
+ "maximum": "Maximum",
+ "pc": "PC",
+ "biography": "Biography",
+ "gifts": "Gifts",
+ "vulnerabilities": "Vulnerabilities",
+ "str": "STR",
+ "wis": "WIS",
+ "int": "INT",
+ "con": "CON",
+ "dex": "DEX",
+ "luc": "LUC",
+ "app": "APP",
+ "cha": "CHA"
},
- "Edit": "Editer",
- "Delete": "Supprimer",
- "ToggleSheet": "Changer de mode",
+ "Edit": "Edit",
+ "Delete": "Delete",
+ "ToggleSheet": "Toggle mode",
"Warning": {
- "dejaDeuxVoies": "Vous avez déjà choisi deux voies",
- "dejaVoieMajeure": "Vous avez déjà choisi cette voie comme voie majeure",
- "voieMajeureAjoutee": "Voie majeure ajoutée",
- "voieMineureAjoutee": "Voie mineure ajoutée",
- "voieMajeureSupprimee": "Voie majeure supprimée",
- "voieMineureSupprimee": "Voie mineure supprimée",
- "plusDeRessource": "Vous n'avez plus de ressource {ressource}"
- },
- "Dialog": {
- "ajoutVoieMajeure": "Ajouter une voie majeure va automatiquement remplacer les caractéristiques, les ressources, les langues et les biens. Continuer ?",
- "ajoutVoieMajeureTitre": "Ajout d'une voie majeure",
- "ajoutVoieMineureTitre": "Ajout d'une voie mineure",
- "suppressionTalents": "Supprimer cette voie va supprimer les talents associés. Continuer ?",
- "talentDansVoie": "Ce talent est présent dans la voie {path}. Voulez-vous vraiment le supprimer ?",
- "titleSave": "Jet de sauvegarde",
- "titleResource": "Jet de ressource",
- "titleDamage": "Jet de dégâts",
- "titleAttack": "Jet d'attaque",
- "titleStandard": "Jet standard"
},
"Roll": {
"save": "Jet de sauvegarde
{save}",
@@ -415,11 +477,9 @@
"displayArmor": "{targetName} a une armure de {targetArmor}.
Dégâts réels : {realDamage}"
},
"Tooltip": {
- "learnedTalents": "Les talents appris sont en gras",
- "saveIntroTextTooltip": "Caractéristique : {value}
Aide : {aide}
Gêne : {gene}
Modificateur : {modificateur}",
- "addAttack": "Ajouter une attaque",
- "addEquipment": "Ajouter une arme, Shift + Click pour ajouter une armure",
- "addSpell": "Ajouter un sortilège"
+ "skill": "Skills list",
+ "addEquipment": "New equipment",
+ "addSpell": "New spells"
},
"Setting": {
"displayOpponentMalus": "Afficher le malus d'adversité",
diff --git a/lethal-fantasy.mjs b/lethal-fantasy.mjs
index 24f1b71..37f201e 100644
--- a/lethal-fantasy.mjs
+++ b/lethal-fantasy.mjs
@@ -48,7 +48,8 @@ Hooks.once("init", function () {
spell: models.LethalFantasySpell,
save: models.LethalFantasySave,
vulnerability: models.LethalFantasyVulnerability,
- equipment: models.LethalFantasyEquipment
+ equipment: models.LethalFantasyEquipment,
+ miracle: models.LethalFantasyMiracle
}
// Register sheet application classes
@@ -66,6 +67,7 @@ Hooks.once("init", function () {
Items.registerSheet("lethalFantasy", applications.LethalFantasyArmorSheet, { types: ["armor"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasyShieldSheet, { types: ["shield"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasyEquipmentSheet, { types: ["equipment"], makeDefault: true })
+ Items.registerSheet("lethalFantasy", applications.LethalFantasyMiracleSheet, { types: ["miracle"], makeDefault: true })
// Other Document Configuration
CONFIG.ChatMessage.documentClass = documents.LethalFantasyChatMessage
@@ -193,8 +195,12 @@ Hooks.on("hotbarDrop", (bar, data, slot) => {
* Register world usage statistics
* @param {string} registerKey
*/
-function registerWorldCount(registerKey) {
+async function registerWorldCount(registerKey) {
if (game.user.isGM) {
- ClassCounter.registerUsageCount(game.system.id, {})
+ try {
+ ClassCounter.registerUsageCount(game.system.id, {})
+ } catch {
+ console.log("No usage log ")
+ }
}
-}
+}
\ No newline at end of file
diff --git a/module/applications/_module.mjs b/module/applications/_module.mjs
index f04e2b4..2a93a30 100644
--- a/module/applications/_module.mjs
+++ b/module/applications/_module.mjs
@@ -9,4 +9,6 @@ export { default as LethalFantasyArmorSheet } from "./sheets/armor-sheet.mjs"
export { default as LethalFantasySpellSheet } from "./sheets/spell-sheet.mjs"
export { default as LethalFantasyEquipmentSheet } from "./sheets/equipment-sheet.mjs"
export { default as LethalFantasyShieldSheet } from "./sheets/shield-sheet.mjs"
+export { default as LethalFantasyMiracleSheet } from "./sheets/miracle-sheet.mjs"
export { default as LethalFantasyManager } from "./manager.mjs"
+
diff --git a/module/applications/sheets/character-sheet.mjs b/module/applications/sheets/character-sheet.mjs
index 000fac3..4ad4676 100644
--- a/module/applications/sheets/character-sheet.mjs
+++ b/module/applications/sheets/character-sheet.mjs
@@ -23,10 +23,16 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
template: "systems/fvtt-lethal-fantasy/templates/character-main.hbs",
},
tabs: {
- template: "systems/fvtt-lethal-fantasy/templates/generic/tab-navigation.hbs",
+ template: "templates/generic/tab-navigation.hbs",
},
- items: {
- template: "systems/fvtt-lethal-fantasy/templates/character-items.hbs",
+ skills: {
+ template: "systems/fvtt-lethal-fantasy/templates/character-skills.hbs",
+ },
+ weapons: {
+ template: "systems/fvtt-lethal-fantasy/templates/character-weapons.hbs",
+ },
+ spells: {
+ template: "systems/fvtt-lethal-fantasy/templates/character-spells.hbs",
},
biography: {
template: "systems/fvtt-lethal-fantasy/templates/character-biography.hbs",
@@ -35,7 +41,7 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
/** @override */
tabGroups = {
- sheet: "items",
+ sheet: "skills",
}
/**
@@ -44,8 +50,10 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
*/
#getTabs() {
const tabs = {
- items: { id: "items", group: "sheet", icon: "fa-solid fa-shapes", label: "LETHALFANTASY.Character.Label.details" },
- biography: { id: "biography", group: "sheet", icon: "fa-solid fa-book", label: "LETHALFANTASY.Character.Label.biography" },
+ skills: { id: "skills", group: "sheet", icon: "fa-solid fa-shapes", label: "LETHALFANTASY.Label.skills" },
+ weapons: { id: "weapons", group: "sheet", icon: "fa-solid fa-swords", label: "LETHALFANTASY.Label.weapons" },
+ spells: { id: "spells", group: "sheet", icon: "fa-sharp-duotone fa-solid fa-wand-magic-sparkles", label: "LETHALFANTASY.Label.spells" },
+ biography: { id: "biography", group: "sheet", icon: "fa-solid fa-book", label: "LETHALFANTASY.Label.biography" },
}
for (const v of Object.values(tabs)) {
v.active = this.tabGroups[v.group] === v.id
@@ -78,15 +86,24 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
const doc = this.document
switch (partId) {
case "main":
- context.enrichedBiens = await TextEditor.enrichHTML(doc.system.biens, { async: true })
break
- case "items":
- context.tab = context.tabs.items
- context.weapons = doc.itemTypes.weapon
- context.armors = doc.itemTypes.armor
+ case "skills":
+ context.tab = context.tabs.skills
+ context.skills = doc.itemTypes.skill
+ context.gifts = doc.itemTypes.gifts
+ context.vulnerabilities = doc.itemTypes.vulnerability
+ break
+ case "spells":
+ context.tab = context.tabs.spells
context.spells = doc.itemTypes.spell
context.hasSpells = context.spells.length > 0
break
+ case "weapons":
+ context.tab = context.tabs.weapons
+ context.weapons = doc.itemTypes.weapon
+ context.armors = doc.itemTypes.armor
+ context.equipments = doc.itemTypes.equipment
+ break
case "biography":
context.tab = context.tabs.biography
context.enrichedDescription = await TextEditor.enrichHTML(doc.system.description, { async: true })
@@ -111,11 +128,7 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
switch (data.type) {
case "Item":
const item = await fromUuid(data.uuid)
- if (!["path", "weapon", "armor", "spell"].includes(item.type)) return
- if (item.type === "path") return this.#onDropPathItem(item)
- if (item.type === "weapon") return super._onDropItem(item)
- if (item.type === "armor") return this._onDropItem(item)
- if (item.type === "spell") return this._onDropItem(item)
+ return this._onDropItem(item)
}
}
diff --git a/module/applications/sheets/miracle-sheet.mjs b/module/applications/sheets/miracle-sheet.mjs
new file mode 100644
index 0000000..d3816ce
--- /dev/null
+++ b/module/applications/sheets/miracle-sheet.mjs
@@ -0,0 +1,21 @@
+import LethalFantasyItemSheet from "./base-item-sheet.mjs"
+
+export default class LethalFantasyMiracleSheet extends LethalFantasyItemSheet {
+ /** @override */
+ static DEFAULT_OPTIONS = {
+ classes: ["miracle"],
+ position: {
+ width: 450,
+ },
+ window: {
+ contentClasses: ["miracle-content"],
+ },
+ }
+
+ /** @override */
+ static PARTS = {
+ main: {
+ template: "systems/fvtt-lethal-fantasy/templates/miracle.hbs",
+ },
+ }
+}
diff --git a/module/config/character.mjs b/module/config/character.mjs
index 7830dc3..dfb3b4b 100644
--- a/module/config/character.mjs
+++ b/module/config/character.mjs
@@ -1,7 +1,7 @@
export const CHARACTERISTICS = Object.freeze({
str: {
id: "str",
- label: "LETHALFANTASY.Character.str.label"
+ label: "LETHALFANTASY.Label.str"
},
int: {
id: "int",
@@ -23,6 +23,10 @@ export const CHARACTERISTICS = Object.freeze({
id: "cha",
label: "LETHALFANTASY.Character.cha.label"
},
+ luc: {
+ id: "luc",
+ label: "LETHALFANTASY.Character.luc.label"
+ },
app: {
id: "app",
label: "LETHALFANTASY.Character.app.label"
diff --git a/module/config/characteristic-tables.mjs b/module/config/characteristic-tables.mjs
new file mode 100644
index 0000000..ffd77e7
--- /dev/null
+++ b/module/config/characteristic-tables.mjs
@@ -0,0 +1,1293 @@
+
+
+export const MAJOR = ["str", "int", "wis", "dex", "con", "cha"]
+
+export const TABLES = {
+ "str": [
+ {
+ "value": 1,
+ "damage_modifier": -7,
+ "attack_modifier": -4,
+ "challenge": -9,
+ "aether_points": -20,
+ "hp": -3,
+ "encumbered": 1,
+ "lift": 3,
+ "push_drag": 6
+ },
+ {
+ "value": 2,
+ "damage_modifier": -6,
+ "attack_modifier": -4,
+ "challenge": -8,
+ "aether_points": -20,
+ "hp": -2,
+ "encumbered": 1,
+ "lift": 4,
+ "push_drag": 8
+ },
+ {
+ "value": 3,
+ "damage_modifier": -5,
+ "attack_modifier": -3,
+ "challenge": -7,
+ "aether_points": -20,
+ "hp": -1,
+ "encumbered": 1,
+ "lift": 5,
+ "push_drag": 10
+ },
+ {
+ "value": 4,
+ "damage_modifier": -4,
+ "attack_modifier": -3,
+ "challenge": -6,
+ "aether_points": -20,
+ "hp": -1,
+ "encumbered": 2,
+ "lift": 6,
+ "push_drag": 12
+ },
+ {
+ "value": 5,
+ "damage_modifier": -3,
+ "attack_modifier": -2,
+ "challenge": -5,
+ "aether_points": -20,
+ "hp": 0,
+ "encumbered": 2,
+ "lift": 7,
+ "push_drag": 14
+ },
+ {
+ "value": 6,
+ "damage_modifier": -2,
+ "attack_modifier": -1,
+ "challenge": -4,
+ "aether_points": -10,
+ "hp": 0,
+ "encumbered": 3,
+ "lift": 8,
+ "push_drag": 16
+ },
+ {
+ "value": 7,
+ "damage_modifier": -2,
+ "attack_modifier": 0,
+ "challenge": -3,
+ "aether_points": -10,
+ "hp": 0,
+ "encumbered": 3,
+ "lift": 9,
+ "push_drag": 18
+ },
+ {
+ "value": 8,
+ "damage_modifier": -1,
+ "attack_modifier": 0,
+ "challenge": -2,
+ "aether_points": 0,
+ "hp": 0,
+ "encumbered": 4,
+ "lift": 11,
+ "push_drag": 22
+ },
+ {
+ "value": 9,
+ "damage_modifier": -1,
+ "attack_modifier": 0,
+ "challenge": -1,
+ "aether_points": 0,
+ "hp": 0,
+ "encumbered": 5,
+ "lift": 12,
+ "push_drag": 24
+ },
+ {
+ "value": 10,
+ "damage_modifier": 0,
+ "attack_modifier": 0,
+ "challenge": 0,
+ "aether_points": 0,
+ "hp": 0,
+ "encumbered": 6,
+ "lift": 13,
+ "push_drag": 26
+ },
+ {
+ "value": 11,
+ "damage_modifier": 0,
+ "attack_modifier": 0,
+ "challenge": 0,
+ "aether_points": 0,
+ "hp": 0,
+ "encumbered": 7,
+ "lift": 15,
+ "push_drag": 30
+ },
+ {
+ "value": 12,
+ "damage_modifier": 1,
+ "attack_modifier": 0,
+ "challenge": 1,
+ "aether_points": 0,
+ "hp": 0,
+ "encumbered": 8,
+ "lift": 17,
+ "push_drag": 34
+ },
+ {
+ "value": 13,
+ "damage_modifier": 1,
+ "attack_modifier": 0,
+ "challenge": 2,
+ "aether_points": 0,
+ "hp": 0,
+ "encumbered": 9,
+ "lift": 20,
+ "push_drag": 40
+ },
+ {
+ "value": 14,
+ "damage_modifier": 2,
+ "attack_modifier": 1,
+ "challenge": 3,
+ "aether_points": 0,
+ "hp": 1,
+ "encumbered": 10,
+ "lift": 22,
+ "push_drag": 44
+ },
+ {
+ "value": 15,
+ "damage_modifier": 3,
+ "attack_modifier": 1,
+ "challenge": 4,
+ "aether_points": 0,
+ "hp": 2,
+ "encumbered": 11,
+ "lift": 24,
+ "push_drag": 48
+ },
+ {
+ "value": 16,
+ "damage_modifier": 4,
+ "attack_modifier": 2,
+ "challenge": 5,
+ "aether_points": 0,
+ "hp": 3,
+ "encumbered": 12,
+ "lift": 26,
+ "push_drag": 52
+ },
+ {
+ "value": 17,
+ "damage_modifier": 5,
+ "attack_modifier": 2,
+ "challenge": 6,
+ "aether_points": 10,
+ "hp": 4,
+ "encumbered": 13,
+ "lift": 28,
+ "push_drag": 56
+ },
+ {
+ "value": 18,
+ "damage_modifier": 6,
+ "attack_modifier": 3,
+ "challenge": 7,
+ "aether_points": 20,
+ "hp": 5,
+ "encumbered": 14,
+ "lift": 30,
+ "push_drag": 60
+ },
+ {
+ "value": 19,
+ "damage_modifier": 7,
+ "attack_modifier": 3,
+ "challenge": 8,
+ "aether_points": 20,
+ "hp": 6,
+ "encumbered": 15,
+ "lift": 31,
+ "push_drag": 62
+ },
+ {
+ "value": 20,
+ "damage_modifier": 8,
+ "attack_modifier": 4,
+ "challenge": 9,
+ "aether_points": 30,
+ "hp": 7,
+ "encumbered": 15,
+ "lift": 32,
+ "push_drag": 64
+ },
+ {
+ "value": 21,
+ "damage_modifier": 9,
+ "attack_modifier": 4,
+ "challenge": 10,
+ "aether_points": 30,
+ "hp": 8,
+ "encumbered": 16,
+ "lift": 33,
+ "push_drag": 66
+ },
+ {
+ "value": 22,
+ "damage_modifier": 10,
+ "attack_modifier": 5,
+ "challenge": 11,
+ "aether_points": 40,
+ "hp": 9,
+ "encumbered": 16,
+ "lift": 34,
+ "push_drag": 68
+ },
+ {
+ "value": 23,
+ "damage_modifier": 12,
+ "attack_modifier": 5,
+ "challenge": 12,
+ "aether_points": 40,
+ "hp": 10,
+ "encumbered": 17,
+ "lift": 35,
+ "push_drag": 70
+ },
+ {
+ "value": 24,
+ "damage_modifier": 14,
+ "attack_modifier": 5,
+ "challenge": 13,
+ "aether_points": 50,
+ "hp": 11,
+ "encumbered": 18,
+ "lift": 36,
+ "push_drag": 72
+ },
+ {
+ "value": 25,
+ "damage_modifier": 16,
+ "attack_modifier": 6,
+ "challenge": 14,
+ "aether_points": 60,
+ "hp": 12,
+ "encumbered": 19,
+ "lift": 38,
+ "push_drag": 76
+ }
+],
+"wis": [
+ {
+ "value": 1,
+ "attack": -5,
+ "defense": -3,
+ "development_points": 0,
+ "aether": -50,
+ "spell_cognition": 0,
+ "arkane_casting_mod": -4
+ },
+ {
+ "value": 2,
+ "attack": -4,
+ "defense": -3,
+ "development_points": 0,
+ "aether": -50,
+ "spell_cognition": 0,
+ "arkane_casting_mod": -4
+ },
+ {
+ "value": 3,
+ "attack": -3,
+ "defense": -3,
+ "development_points": 0,
+ "aether": -50,
+ "spell_cognition": 0.01,
+ "arkane_casting_mod": -3
+ },
+ {
+ "value": 4,
+ "attack": -2,
+ "defense": -2,
+ "development_points": 0,
+ "aether": -45,
+ "spell_cognition": 0.05,
+ "arkane_casting_mod": -3
+ },
+ {
+ "value": 5,
+ "attack": -2,
+ "defense": -2,
+ "development_points": 0,
+ "aether": -45,
+ "spell_cognition": 0.1,
+ "arkane_casting_mod": -2
+ },
+ {
+ "value": 6,
+ "attack": -2,
+ "defense": -2,
+ "development_points": 0,
+ "aether": -40,
+ "spell_cognition": 0.15,
+ "arkane_casting_mod": -2
+ },
+ {
+ "value": 7,
+ "attack": -1,
+ "defense": -1,
+ "development_points": 0,
+ "aether": -40,
+ "spell_cognition": 0.2,
+ "arkane_casting_mod": -1
+ },
+ {
+ "value": 8,
+ "attack": -1,
+ "defense": 0,
+ "development_points": 0,
+ "aether": -30,
+ "spell_cognition": 0.25,
+ "arkane_casting_mod": -1
+ },
+ {
+ "value": 9,
+ "attack": -1,
+ "defense": 0,
+ "development_points": 0,
+ "aether": -30,
+ "spell_cognition": 0.3,
+ "arkane_casting_mod": 0
+ },
+ {
+ "value": 10,
+ "attack": 0,
+ "defense": 0,
+ "development_points": 0,
+ "aether": -20,
+ "spell_cognition": 0.35,
+ "arkane_casting_mod": 0
+ },
+ {
+ "value": 11,
+ "attack": 0,
+ "defense": 0,
+ "development_points": 1,
+ "aether": -10,
+ "spell_cognition": 0.45,
+ "arkane_casting_mod": 0
+ },
+ {
+ "value": 12,
+ "attack": 1,
+ "defense": 0,
+ "development_points": 2,
+ "aether": 0,
+ "spell_cognition": 0.5,
+ "arkane_casting_mod": 1
+ },
+ {
+ "value": 13,
+ "attack": 1,
+ "defense": 0,
+ "development_points": 3,
+ "aether": 0,
+ "spell_cognition": 0.6,
+ "arkane_casting_mod": 1
+ },
+ {
+ "value": 14,
+ "attack": 1,
+ "defense": 1,
+ "development_points": 4,
+ "aether": 10,
+ "spell_cognition": 0.65,
+ "arkane_casting_mod": 2
+ },
+ {
+ "value": 15,
+ "attack": 2,
+ "defense": 1,
+ "development_points": 5,
+ "aether": 20,
+ "spell_cognition": 0.75,
+ "arkane_casting_mod": 2
+ },
+ {
+ "value": 16,
+ "attack": 2,
+ "defense": 1,
+ "development_points": 7,
+ "aether": 30,
+ "spell_cognition": 0.8,
+ "arkane_casting_mod": 3
+ },
+ {
+ "value": 17,
+ "attack": 2,
+ "defense": 1,
+ "development_points": 9,
+ "aether": 40,
+ "spell_cognition": 0.85,
+ "arkane_casting_mod": 3
+ },
+ {
+ "value": 18,
+ "attack": 3,
+ "defense": 2,
+ "development_points": 11,
+ "aether": 50,
+ "spell_cognition": 0.9,
+ "arkane_casting_mod": 4
+ },
+ {
+ "value": 19,
+ "attack": 3,
+ "defense": 2,
+ "development_points": 13,
+ "aether": 60,
+ "spell_cognition": 0.92,
+ "arkane_casting_mod": 5
+ },
+ {
+ "value": 20,
+ "attack": 3,
+ "defense": 2,
+ "development_points": 15,
+ "aether": 70,
+ "spell_cognition": 0.94,
+ "arkane_casting_mod": 6
+ },
+ {
+ "value": 21,
+ "attack": 4,
+ "defense": 2,
+ "development_points": 18,
+ "aether": 80,
+ "spell_cognition": 0.95,
+ "arkane_casting_mod": 7
+ },
+ {
+ "value": 22,
+ "attack": 4,
+ "defense": 3,
+ "development_points": 21,
+ "aether": 90,
+ "spell_cognition": 0.96,
+ "arkane_casting_mod": 7
+ },
+ {
+ "value": 23,
+ "attack": 4,
+ "defense": 3,
+ "development_points": 24,
+ "aether": 100,
+ "spell_cognition": 0.97,
+ "arkane_casting_mod": 8
+ },
+ {
+ "value": 24,
+ "attack": 5,
+ "defense": 3,
+ "development_points": 27,
+ "aether": 110,
+ "spell_cognition": 0.98,
+ "arkane_casting_mod": 8
+ },
+ {
+ "value": 25,
+ "attack": 5,
+ "defense": 4,
+ "development_points": 30,
+ "aether": 125,
+ "spell_cognition": 0.99,
+ "arkane_casting_mod": 9
+ }
+],
+"con": [
+ {
+ "value": 1,
+
+ "hp ": 1,
+ "aether_points": -50,
+ "pain_save": 1,
+ "toughness_save": -5,
+ "stabilization_dice": "D6",
+ "base_pain_tolerance": 20
+ },
+ {
+ "value": 2,
+
+ "hp ": 2,
+ "aether_points": -40,
+ "pain_save": 2,
+ "toughness_saave": -4,
+ "stabilization_dice": "D6",
+ "base_pain_tolerance": 21
+ },
+ {
+ "value": 3,
+
+ "hp ": 3,
+ "aether_points": -35,
+ "pain_save": 2,
+ "toughness_save": -3,
+ "stabilization_dice": "D6",
+ "base_pain_tolerance": 22
+ },
+ {
+ "value": 4,
+
+ "hp ": 4,
+ "aether_points": -30,
+ "pain_save": 2,
+ "toughness_save": -3,
+ "stabilization_dice": "D6",
+ "base_pain_tolerance": 23
+ },
+ {
+ "value": 5,
+
+ "hp ": 5,
+ "aether_points": -25,
+ "pain_save": 3,
+ "toughness_save": -2,
+ "stabilization_dice": "D6",
+ "base_pain_tolerance": 24
+ },
+ {
+ "value": 6,
+
+ "hp ": 6,
+ "aether_points": -20,
+ "pain_save": 3,
+ "toughness_save": -2,
+ "stabilization_dice": "D6",
+ "base_pain_tolerance": 26
+ },
+ {
+ "value": 7,
+
+ "hp ": 7,
+ "aether_points": -15,
+ "pain_save": 3,
+ "toughness_save": -1,
+ "stabilization_dice": "D6",
+ "base_pain_tolerance": 28
+ },
+ {
+ "value": 8,
+
+ "hp ": 8,
+ "aether_points": -10,
+ "pain_save": 4,
+ "toughness_save": -1,
+ "stabilization_dice": "D8",
+ "base_pain_tolerance": 29
+ },
+ {
+ "value": 9,
+
+ "hp ": 9,
+ "aether_points": -5,
+ "pain_save": 4,
+ "toughness_save": 0,
+ "stabilization_dice": "D8",
+ "base_pain_tolerance": 30
+ },
+ {
+ "value": 10,
+
+ "hp ": 10,
+ "aether_points": 0,
+ "pain_save": 5,
+ "toughness_save": 0,
+ "stabilization_dice": "D8",
+ "base_pain_tolerance": 30
+ },
+ {
+ "value": 11,
+
+ "hp ": 11,
+ "aether_points": 0,
+ "pain_save": 5,
+ "toughness_save": 0,
+ "stabilization_dice": "D8",
+ "base_pain_tolerance": 31
+ },
+ {
+ "value": 12,
+
+ "hp ": 12,
+ "aether_points": 5,
+ "pain_save": 6,
+ "toughness_save": 0,
+ "stabilization_dice": "D10",
+ "base_pain_tolerance": 31
+ },
+ {
+ "value": 13,
+
+ "hp ": 13,
+ "aether_points": 10,
+ "pain_save": 7,
+ "toughness_save": 1,
+ "stabilization_dice": "D10",
+ "base_pain_tolerance": 31
+ },
+ {
+ "value": 14,
+
+ "hp ": 14,
+ "aether_points": 20,
+ "pain_save": 7,
+ "toughness_save": 2,
+ "stabilization_dice": "D10",
+ "base_pain_tolerance": 32
+ },
+ {
+ "value": 15,
+
+ "hp ": 15,
+ "aether_points": 30,
+ "pain_save": 8,
+ "toughness_save": 3,
+ "stabilization_dice": "D12",
+ "base_pain_tolerance": 32
+ },
+ {
+ "value": 16,
+
+ "hp ": 16,
+ "aether_points": 40,
+ "pain_save": 8,
+ "toughness_save": 4,
+ "stabilization_dice": "D12",
+ "base_pain_tolerance": 33
+ },
+ {
+ "value": 17,
+
+ "hp ": 17,
+ "aether_points": 50,
+ "pain_save": 9,
+ "toughness_save": 5,
+ "stabilization_dice": "D12",
+ "base_pain_tolerance": 34
+ },
+ {
+ "value": 18,
+
+ "hp ": 18,
+ "aether_points": 60,
+ "pain_save": 9,
+ "toughness_save": 6,
+ "stabilization_dice": "D12",
+ "base_pain_tolerance": 35
+ },
+ {
+ "value": 19,
+
+ "hp ": 19,
+ "aether_points": 70,
+ "pain_save": 10,
+ "toughness_save": 7,
+ "stabilization_dice": "D12",
+ "base_pain_tolerance": 36
+ },
+ {
+ "value": 20,
+
+ "hp ": 20,
+ "aether_points": 80,
+ "pain_save": 10,
+ "toughness_save": 8,
+ "stabilization_dice": "D12",
+ "base_pain_tolerance": 36
+ },
+ {
+ "value": 21,
+
+ "hp ": 21,
+ "aether_points": 90,
+ "pain_save": 11,
+ "toughness_save": 9,
+ "stabilization_dice": "D20",
+ "base_pain_tolerance": 37
+ },
+ {
+ "value": 22,
+
+ "hp ": 22,
+ "aether_points": 100,
+ "pain_save": 11,
+ "toughness_save": 10,
+ "stabilization_dice": "D20",
+ "base_pain_tolerance": 37
+ },
+ {
+ "value": 23,
+
+ "hp ": 23,
+ "aether_points": 110,
+ "pain_save": 12,
+ "toughness_save": 11,
+ "stabilization_dice": "D20",
+ "base_pain_tolerance": 38
+ },
+ {
+ "value": 24,
+
+ "hp ": 24,
+ "aether_points": 120,
+ "pain_save": 12,
+ "toughness_save": 12,
+ "stabilization_dice": "D20",
+ "base_pain_tolerance": 38
+ },
+ {
+ "value": 25,
+ "hp ": 25,
+ "aether_points": 130,
+ "pain_save": 13,
+ "toughness_save": 13,
+ "stabilization_dice": "D20",
+ "base_pain_tolerance": 40
+ }
+],
+"cha":[
+ {
+ "value": 1,
+ "grit": -5,
+ "turning_casting": -4,
+ "development_points ": 0,
+ "divine_miracle_bonus": 0
+ },
+ {
+ "value": 2,
+ "grit": -4,
+ "turning_casting": -4,
+ "development_points ": 0,
+ "divine_miracle_bonus": 0
+ },
+ {
+ "value": 3,
+ "grit": -4,
+ "turning_casting": -3,
+ "development_points ": 0,
+ "divine_miracle_bonus": 0
+ },
+ {
+ "value": 4,
+ "grit": -3,
+ "turning_casting": 3,
+ "development_points ": 0,
+ "divine_miracle_bonus": 0
+ },
+ {
+ "value": 5,
+ "grit": -3,
+ "turning_casting": -2,
+ "development_points ": 0,
+ "divine_miracle_bonus": 0
+ },
+ {
+ "value": 6,
+ "grit": -2,
+ "turning_casting": -2,
+ "development_points ": 0,
+ "divine_miracle_bonus": 0
+ },
+ {
+ "value": 7,
+ "grit": -2,
+ "turning_casting": -1,
+ "development_points ": 0,
+ "divine_miracle_bonus": 0
+ },
+ {
+ "value": 8,
+ "grit": -1,
+ "turning_casting": -1,
+ "development_points ": 0,
+ "divine_miracle_bonus": 0
+ },
+ {
+ "value": 9,
+ "grit": -1,
+ "turning_casting": 0,
+ "development_points ": 0,
+ "divine_miracle_bonus": 0
+ },
+ {
+ "value": 10,
+ "grit": 0,
+ "turning_casting": 0,
+ "development_points ": 0,
+ "divine_miracle_bonus": 0
+ },
+ {
+ "value": 11,
+ "grit": 0,
+ "turning_casting": 0,
+ "development_points ": 0,
+ "divine_miracle_bonus": 0
+ },
+ {
+ "value": 12,
+ "grit": 0,
+ "turning_casting": 1,
+ "development_points ": 1,
+ "divine_miracle_bonus": 1
+ },
+ {
+ "value": 13,
+ "grit": 1,
+ "turning_casting": 1,
+ "development_points ": 2,
+ "divine_miracle_bonus": 1
+ },
+ {
+ "value": 14,
+ "grit": 2,
+ "turning_casting": 2,
+ "development_points ": 4,
+ "divine_miracle_bonus": 2
+ },
+ {
+ "value": 15,
+ "grit": 4,
+ "turning_casting": 2,
+ "development_points ": 6,
+ "divine_miracle_bonus": 2
+ },
+ {
+ "value": 16,
+ "grit": 6,
+ "turning_casting": 3,
+ "development_points ": 7,
+ "divine_miracle_bonus": 3
+ },
+ {
+ "value": 17,
+ "grit": 8,
+ "turning_casting": 3,
+ "development_points ": 8,
+ "divine_miracle_bonus": 3
+ },
+ {
+ "value": 18,
+ "grit": 10,
+ "turning_casting": 4,
+ "development_points ": 9,
+ "divine_miracle_bonus": 4
+ },
+ {
+ "value": 19,
+ "grit": 11,
+ "turning_casting": 5,
+ "development_points ": 10,
+ "divine_miracle_bonus": 5
+ },
+ {
+ "value": 20,
+ "grit": 12,
+ "turning_casting": 6,
+ "development_points ": 11,
+ "divine_miracle_bonus": 5
+ },
+ {
+ "value": 21,
+ "grit": 13,
+ "turning_casting": 7,
+ "development_points ": 12,
+ "divine_miracle_bonus": 5
+ },
+ {
+ "value": 22,
+ "grit": 14,
+ "turning_casting": 7,
+ "development_points ": 13,
+ "divine_miracle_bonus": 6
+ },
+ {
+ "value": 23,
+ "grit": 15,
+ "turning_casting": 8,
+ "development_points ": 14,
+ "divine_miracle_bonus": 6
+ },
+ {
+ "value": 24,
+ "grit": 16,
+ "turning_casting": 8,
+ "development_points ": 15,
+ "divine_miracle_bonus": 6
+ },
+ {
+ "value": 25,
+ "grit": 18,
+ "turning_casting": 9,
+ "development_points ": 16,
+ "divine_miracle_bonus": 7
+ }
+],
+"luc": [
+ {
+ "value": 1,
+ "per_level ": 0
+ },
+ {
+ "value": 2,
+ "per_level ": 0
+ },
+ {
+ "value": 3,
+ "per_level ": 1
+ },
+ {
+ "value": 4,
+ "per_level ": 2
+ },
+ {
+ "value": 5,
+ "per_level ": 3
+ },
+ {
+ "value": 6,
+ "per_level ": 4
+ },
+ {
+ "value": 7,
+ "per_level ": 5
+ },
+ {
+ "value": 8,
+ "per_level ": 6
+ },
+ {
+ "value": 9,
+ "per_level ": 7
+ },
+ {
+ "value": 10,
+ "per_level ": 8
+ },
+ {
+ "value": 11,
+ "per_level ": 9
+ },
+ {
+ "value": 12,
+ "per_level ": 10
+ },
+ {
+ "value": 13,
+ "per_level ": 11
+ },
+ {
+ "value": 14,
+ "per_level ": 12
+ },
+ {
+ "value": 15,
+ "per_level ": 13
+ },
+ {
+ "value": 16,
+ "per_level ": 14
+ },
+ {
+ "value": 17,
+ "per_level ": 15
+ },
+ {
+ "value": 18,
+ "per_level ": 16
+ },
+ {
+ "value": 19,
+ "per_level ": 18
+ },
+ {
+ "value": 20,
+ "per_level ": 20
+ },
+ {
+ "value": 21,
+ "per_level ": 22
+ },
+ {
+ "value": 22,
+ "per_level ": 24
+ },
+ {
+ "value": 23,
+ "per_level ": 26
+ },
+ {
+ "value": 24,
+ "per_level ": 28
+ },
+ {
+ "value": 25,
+ "per_level ": 30
+ }
+],
+"wis": [
+ {
+ "value": 1,
+ "defense": -5,
+ "init_cap": "-",
+ "development_points ": 0,
+ "attack ": -5,
+ "willpower_save": -5,
+ "divine_miracle_bonus ": 0,
+ "": ""
+ },
+ {
+ "value": 2,
+ "defense": -4,
+ "init_cap": "-",
+ "development_points ": 0,
+ "attack ": -4,
+ "willpower_save": -4,
+ "divine_miracle_bonus ": 0,
+ "": ""
+ },
+ {
+ "value": 3,
+ "defense": -3,
+ "init_cap": "-",
+ "development_points ": 0,
+ "attack ": -3,
+ "willpower_save": -3,
+ "divine_miracle_bonus ": 0,
+ "": ""
+ },
+ {
+ "value": 4,
+ "defense": -3,
+ "init_cap": "-",
+ "development_points ": 0,
+ "attack ": -2,
+ "willpower_save": -3,
+ "divine_miracle_bonus ": 0,
+ "": ""
+ },
+ {
+ "value": 5,
+ "defense": -2,
+ "init_cap": "-",
+ "development_points ": 0,
+ "attack ": 1,
+ "willpower_save": -2,
+ "divine_miracle_bonus ": 0,
+ "": ""
+ },
+ {
+ "value": 6,
+ "defense": -2,
+ "init_cap": "-",
+ "development_points ": 0,
+ "attack ": 0,
+ "willpower_save": -2,
+ "divine_miracle_bonus ": 0,
+ "": ""
+ },
+ {
+ "value": 7,
+ "defense": -1,
+ "init_cap": "-",
+ "development_points ": 0,
+ "attack ": 0,
+ "willpower_save": -1,
+ "divine_miracle_bonus ": 0,
+ "": ""
+ },
+ {
+ "value": 8,
+ "defense": -1,
+ "init_cap": "-",
+ "development_points ": 0,
+ "attack ": 0,
+ "willpower_save": -1,
+ "divine_miracle_bonus ": 0,
+ "": ""
+ },
+ {
+ "value": 9,
+ "defense": -1,
+ "init_cap": "-",
+ "development_points ": 0,
+ "attack ": 0,
+ "willpower_save": 0,
+ "divine_miracle_bonus ": 0,
+ "": ""
+ },
+ {
+ "value": 10,
+ "defense": 0,
+ "init_cap": 18,
+ "development_points ": 0,
+ "attack ": 0,
+ "willpower_save": 0,
+ "divine_miracle_bonus ": 0,
+ "": ""
+ },
+ {
+ "value": 11,
+ "defense": 0,
+ "init_cap": 16,
+ "development_points ": 1,
+ "attack ": 0,
+ "willpower_save": 0,
+ "divine_miracle_bonus ": 0,
+ "": ""
+ },
+ {
+ "value": 12,
+ "defense": 1,
+ "init_cap": 14,
+ "development_points ": 2,
+ "attack ": 0,
+ "willpower_save": 0,
+ "divine_miracle_bonus ": 1,
+ "": ""
+ },
+ {
+ "value": 13,
+ "defense": 1,
+ "init_cap": 12,
+ "development_points ": 3,
+ "attack ": 0,
+ "willpower_save": 1,
+ "divine_miracle_bonus ": 1,
+ "": ""
+ },
+ {
+ "value": 14,
+ "defense": 1,
+ "init_cap": 10,
+ "development_points ": 4,
+ "attack ": 1,
+ "willpower_save": 2,
+ "divine_miracle_bonus ": 2,
+ "": ""
+ },
+ {
+ "value": 15,
+ "defense": 2,
+ "init_cap": 8,
+ "development_points ": 5,
+ "attack ": 1,
+ "willpower_save": 3,
+ "divine_miracle_bonus ": 2,
+ "": ""
+ },
+ {
+ "value": 16,
+ "defense": 2,
+ "init_cap": 7,
+ "development_points ": 7,
+ "attack ": 1,
+ "willpower_save": 4,
+ "divine_miracle_bonus ": 2,
+ "": ""
+ },
+ {
+ "value": 17,
+ "defense": 2,
+ "init_cap": 6,
+ "development_points ": 9,
+ "attack ": 1,
+ "willpower_save": 5,
+ "divine_miracle_bonus ": 3,
+ "": ""
+ },
+ {
+ "value": 18,
+ "defense": 3,
+ "init_cap": 5,
+ "development_points ": 11,
+ "attack ": 2,
+ "willpower_save": 6,
+ "divine_miracle_bonus ": 4,
+ "": ""
+ },
+ {
+ "value": 19,
+ "defense": 3,
+ "init_cap": 4,
+ "development_points ": 13,
+ "attack ": 2,
+ "willpower_save": 7,
+ "divine_miracle_bonus ": 5,
+ "": ""
+ },
+ {
+ "value": 20,
+ "defense": 3,
+ "init_cap": 4,
+ "development_points ": 15,
+ "attack ": 2,
+ "willpower_save": 8,
+ "divine_miracle_bonus ": 6,
+ "": ""
+ },
+ {
+ "value": 21,
+ "defense": 4,
+ "init_cap": 3,
+ "development_points ": 18,
+ "attack ": 2,
+ "willpower_save": 9,
+ "divine_miracle_bonus ": 7,
+ "": ""
+ },
+ {
+ "value": 22,
+ "defense": 4,
+ "init_cap": 3,
+ "development_points ": 21,
+ "attack ": 2,
+ "willpower_save": 10,
+ "divine_miracle_bonus ": 8,
+ "": ""
+ },
+ {
+ "value": 23,
+ "defense": 4,
+ "init_cap": 2,
+ "development_points ": 24,
+ "attack ": 3,
+ "willpower_save": 11,
+ "divine_miracle_bonus ": 9,
+ "": ""
+ },
+ {
+ "value": 24,
+ "defense": 4,
+ "init_cap": 2,
+ "development_points ": 27,
+ "attack ": 3,
+ "willpower_save": 12,
+ "divine_miracle_bonus ": 10,
+ "": ""
+ },
+ {
+ "value": 25,
+ "defense": 5,
+ "init_cap": 1,
+ "development_points ": 30,
+ "attack ": 4,
+ "willpower_save": 13,
+ "divine_miracle_bonus ": 12,
+ "": ""
+ }
+]
+
+}
\ No newline at end of file
diff --git a/module/config/system.mjs b/module/config/system.mjs
index 3f75f4f..573dac8 100644
--- a/module/config/system.mjs
+++ b/module/config/system.mjs
@@ -4,20 +4,11 @@ import * as ARMOR from "./armor.mjs"
import * as SPELL from "./spell.mjs"
import * as SKILL from "./skill.mjs"
import * as EQUIPMENT from "./equipment.mjs"
+import * as CHARACTERISTICS from "./characteristic-tables.mjs"
export const SYSTEM_ID = "fvtt-lethal-fantasy"
export const DEV_MODE = false
-export const DICE_VALUE = Object.freeze({
- D4: "d4",
- D6: "d6",
- D8: "d8",
- D10: "d10",
- D12: "d12",
-})
-
-export const DICE_VALUES = ["0", "d4", "d6", "d8", "d10", "d12"]
-
export const ROLL_TYPE = Object.freeze({
SAVE: "save",
RESOURCE: "resource",
@@ -77,15 +68,15 @@ export const ASCII = `
export const SYSTEM = {
id: SYSTEM_ID,
CHARACTERISTICS: CHARACTER.CHARACTERISTICS,
- RESOURCES: CHARACTER.RESOURCES,
+ CHARACTERISTICS_TABLES: CHARACTERISTICS.TABLES,
+ CHARACTERISTICS_MAJOR: CHARACTERISTICS.MAJOR,
SAVES: CHARACTER.SAVES,
SKILL_CATEGORY: SKILL.CATEGORY,
- WEAPON_CATEGORY: WEAPON.CATEGORY,
- WEAPON_DAMAGE: WEAPON.DAMAGE,
ARMOR_TYPE: ARMOR.TYPE,
EQUIPMENT_CATEGORY: EQUIPMENT.CATEGORY,
SPELL_RANGE: SPELL.RANGE,
WEAPON_TYPE: WEAPON.WEAPON_TYPE,
+ WEAPON_CLASS: WEAPON.WEAPON_CLASS,
MONEY,
ASCII,
ROLL_TYPE,
diff --git a/module/config/weapon.mjs b/module/config/weapon.mjs
index 4265c88..553588a 100644
--- a/module/config/weapon.mjs
+++ b/module/config/weapon.mjs
@@ -1,35 +1,20 @@
-export const CATEGORY = Object.freeze({
- mains: {
- id: "mains",
- label: "LETHALFANTASY.Weapon.Category.main",
- },
- improvisee: {
- id: "improvisee",
- label: "LETHALFANTASY.Weapon.Category.improvisee",
- },
- courte: {
- id: "courte",
- label: "LETHALFANTASY.Weapon.Category.courte",
- },
- longue: {
- id: "longue",
- label: "LETHALFANTASY.Weapon.Category.longue",
- },
- lourde: {
- id: "lourde",
- label: "LETHALFANTASY.Weapon.Category.lourde",
- },
-})
export const WEAPON_TYPE = {
"melee": "LETHALFANTASY.Weapon.WeaponType.melee",
"ranged": "LETHALFANTASY.Weapon.WeaponType.ranged"
}
-export const DAMAGE = Object.freeze({
- UN: "1",
- D4: "d4",
- D6: "d6",
- D8: "d8",
- D10: "d10",
-})
+export const WEAPON_CLASS = {
+ "longblade": "LETHALFANTASY.Weapon.WeaponClass.longblade",
+ "shortblade": "LETHALFANTASY.Weapon.WeaponClass.shortblade",
+ "mediumblade": "LETHALFANTASY.Weapon.WeaponClass.mediumblade",
+ "axe": "LETHALFANTASY.Weapon.WeaponClass.axe",
+ "hammer": "LETHALFANTASY.Weapon.WeaponClass.hammer",
+ "mace": "LETHALFANTASY.Weapon.WeaponClass.mace",
+ "flail": "LETHALFANTASY.Weapon.WeaponClass.flail",
+ "bow": "LETHALFANTASY.Weapon.WeaponClass.bow",
+ "sling": "LETHALFANTASY.Weapon.WeaponClass.sling",
+ "thrown": "LETHALFANTASY.Weapon.WeaponClass.thrown",
+ "polearm": "LETHALFANTASY.Weapon.WeaponClass.polearm",
+ "unarmed" : "LETHALFANTASY.Weapon.WeaponClass.unarmed"
+}
\ No newline at end of file
diff --git a/module/documents/item.mjs b/module/documents/item.mjs
index d74f76e..3b4a582 100644
--- a/module/documents/item.mjs
+++ b/module/documents/item.mjs
@@ -1 +1,19 @@
-export default class LethalFantasyItem extends Item {}
+export const defaultItemImg = {
+ weapon: "systems/fvtt-lethal-fantasy/assets/icons/icon_weapon.webp",
+ armor: "systems/fvtt-lethal-fantasy/assets/icons/icon_armor.webp",
+ equipment: "systems/fvtt-lethal-fantasy/assets/icons/icon_equipment.webp",
+ skill: "systems/fvtt-lethal-fantasy/assets/icons/icon_skill.webp",
+ gift: "systems/fvtt-lethal-fantasy/assets/icons/icon_gift.webp",
+ invulnerability: "systems/fvtt-lethal-fantasy/assets/icons/icon_invulnerability.webp",
+ shield: "systems/fvtt-lethal-fantasy/assets/icons/icon_shield.webp",
+ spell: "systems/fvtt-lethal-fantasy/assets/icons/icon_spell.webp"
+}
+
+export default class LethalFantasyItem extends Item {
+ constructor(data, context) {
+ if (!data.img) {
+ data.img = defaultItemImg[data.type];
+ }
+ super(data, context);
+ }
+}
diff --git a/module/models/_module.mjs b/module/models/_module.mjs
index f6af99a..fe0f8c3 100644
--- a/module/models/_module.mjs
+++ b/module/models/_module.mjs
@@ -9,3 +9,4 @@ export { default as LethalFantasyGift } from "./gift.mjs"
export { default as LethalFantasyVulnerability } from "./vulnerability.mjs"
export { default as LethalFantasySave } from "./save.mjs"
export { default as LethalFantasyEquipment } from "./equipment.mjs"
+export { default as LethalFantasyMiracle } from "./miracle.mjs"
diff --git a/module/models/character.mjs b/module/models/character.mjs
index a48c577..dfc9b71 100644
--- a/module/models/character.mjs
+++ b/module/models/character.mjs
@@ -52,6 +52,7 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod
bonus: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
})
schema.grit = new fields.SchemaField({
+ starting: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
earned: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
current: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
})
@@ -87,6 +88,17 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod
/** @override */
static LOCALIZATION_PREFIXES = ["LETHALFANTASY.Character"]
+ prepareDerivedData() {
+ super.prepareDerivedData();
+ let grit = 0
+ for (let c in this.characteristics) {
+ if (SYSTEM.CHARACTERISTICS_MAJOR[c.id]) {
+ grit += this.characteristics[c].value
+ }
+ }
+ this.grit.starting = Math.round(grit / 6)
+ }
+
/**
* Rolls a dice for a character.
* @param {("save"|"resource|damage")} rollType The type of the roll.
diff --git a/module/models/equipment.mjs b/module/models/equipment.mjs
index 90aff59..c68dd3c 100644
--- a/module/models/equipment.mjs
+++ b/module/models/equipment.mjs
@@ -1,5 +1,5 @@
import { SYSTEM } from "../config/system.mjs"
-import { CATEGORY } from "../config/weapon.mjs"
+
export default class LethalFantasyEquipment extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
diff --git a/module/models/miracle.mjs b/module/models/miracle.mjs
new file mode 100644
index 0000000..48628f4
--- /dev/null
+++ b/module/models/miracle.mjs
@@ -0,0 +1,38 @@
+import { SYSTEM } from "../config/system.mjs"
+export default class LethalFantasyMiracle extends foundry.abstract.TypeDataModel {
+ static defineSchema() {
+ const fields = foundry.data.fields
+ const requiredInteger = { required: true, nullable: false, integer: true }
+ const schema = {}
+
+ schema.description = new fields.HTMLField({
+ required: false,
+ blank: true,
+ initial: "",
+ textSearch: true,
+ })
+ schema.level = new fields.NumberField({
+ ...requiredInteger,
+ initial: 1,
+ min: 1,
+ max: 20,
+ })
+ schema.components = new fields.SchemaField({
+ verbal: new fields.BooleanField(),
+ somatic: new fields.BooleanField(),
+ material: new fields.BooleanField(),
+ catalyst: new fields.BooleanField(),
+ religious: new fields.BooleanField()
+ })
+ schema.prayerTime = new fields.StringField({ required: true, initial: "" })
+ schema.miracleRange = new fields.StringField({ required: true, initial: "" })
+ schema.areaAffected = new fields.StringField({ required: true, initial: "" })
+ schema.duration = new fields.StringField({ required: true, initial: "" })
+ schema.savingThrow = new fields.StringField({ required: true, initial: "" })
+
+ return schema
+ }
+
+ /** @override */
+ static LOCALIZATION_PREFIXES = ["LETHALFANTASY.Miracle"]
+}
diff --git a/module/models/skill.mjs b/module/models/skill.mjs
index 8bb2c3c..fdab141 100644
--- a/module/models/skill.mjs
+++ b/module/models/skill.mjs
@@ -12,6 +12,13 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
schema.bonus = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.cost = new fields.NumberField({ ...requiredInteger,required: true, initial: 0, min: 0 })
+ schema.weaponClass = new fields.StringField({ required: true, initial: "shortblade", choices: SYSTEM.WEAPON_CLASS })
+ schema.weaponBonus = new fields.SchemaField({
+ attack: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
+ defense: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
+ damage: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
+ })
+
return schema
}
@@ -21,10 +28,30 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
get skillCategory() {
return game.i18n.localize(CATEGORY[this.category].label)
}
+
+ validate(options) {
+ let isError = super.validate(options)
+ console.log(this)
+ let bonus = this._source.weaponBonus.attack + this._source.weaponBonus.defense + this._source.weaponBonus.damage
+ console.log(bonus, this._source.skillTotal)
+ if ( bonus > Math.floor(this._source.skillTotal / 10) ) {
+ ui.notifications.error(game.i18n.localize("LETHALFANTASY.Skill.error.weaponBonus"))
+ isError = true
+ }
+ return isError
+ }
prepareDerivedData() {
super.prepareDerivedData();
this.skillTotal = this.computeBase();
+ if( this.category === "weapon" ) {
+ this.totalBonus = this.weaponBonus.attack + this.weaponBonus.defense + this.weaponBonus.damage;
+ if ( Number(this.skillTotal) ) {
+ this.availableBonus = Math.max( Math.floor(this.skillTotal / 10) - 1, 0 )
+ } else {
+ this.availableBonus = "N/A"
+ }
+ }
}
computeBase() {
@@ -47,7 +74,7 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
maxStat = statValue;
}
}
- return maxStat;
+ return maxStat + this.bonus
} else {
// Split with + calculate the total
baseSplit = base.split("+");
@@ -59,9 +86,9 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
const statValue = actor.system.characteristics[stat.toLowerCase()]?.value || 0;
total += statValue;
}
- return total
+ return total + this.bonus
}
}
- return `${this.base } + ${ String(this.bonus)}`;
+ return `${this.base} + ${String(this.bonus)}`;
}
}
diff --git a/module/models/spell.mjs b/module/models/spell.mjs
index b7fd5aa..3cdde8e 100644
--- a/module/models/spell.mjs
+++ b/module/models/spell.mjs
@@ -25,7 +25,7 @@ export default class LethalFantasySpell extends foundry.abstract.TypeDataModel {
material: new fields.BooleanField(),
})
schema.castingTime = new fields.StringField({ required: true, initial: "" })
- schema.range = new fields.StringField({ required: true, initial: "" })
+ schema.spellRange = new fields.StringField({ required: true, initial: "" })
schema.areaAffected = new fields.StringField({ required: true, initial: "" })
schema.duration = new fields.StringField({ required: true, initial: "" })
schema.savingThrow = new fields.StringField({ required: true, initial: "" })
diff --git a/module/models/weapon.mjs b/module/models/weapon.mjs
index ed4d8db..20753fa 100644
--- a/module/models/weapon.mjs
+++ b/module/models/weapon.mjs
@@ -1,5 +1,5 @@
import { SYSTEM } from "../config/system.mjs"
-import { CATEGORY } from "../config/weapon.mjs"
+
export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
@@ -8,6 +8,8 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
schema.description = new fields.HTMLField({ required: true, textSearch: true })
schema.weaponType = new fields.StringField({ required: true, initial: "melee", choices: SYSTEM.WEAPON_TYPE })
+ schema.weaponClass = new fields.StringField({ required: true, initial: "shortblade", choices: SYSTEM.WEAPON_CLASS })
+
schema.damageType = new fields.SchemaField({
typeP: new fields.BooleanField(),
typeB: new fields.BooleanField(),
@@ -29,7 +31,7 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
})
schema.defense = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
- schema.range = new fields.SchemaField({
+ schema.weaponRange = new fields.SchemaField({
pointBlank: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
short: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
medium: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
@@ -49,6 +51,6 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
static LOCALIZATION_PREFIXES = ["LETHALFANTASY.Weapon"]
get weaponCategory() {
- return game.i18n.localize(CATEGORY[this.category].label)
+ return game.i18n.localize(CATEGORY[this.weaponType].label)
}
}
diff --git a/module/utils.mjs b/module/utils.mjs
index 22dab28..1f38535 100644
--- a/module/utils.mjs
+++ b/module/utils.mjs
@@ -1,23 +1,13 @@
-import { DICE_VALUES } from "./config/system.mjs"
export default class LethalFantasyUtils {
// Return the maximum damage limited by the maximum damage of the character
static maxDamage(damage, damageMax) {
- const damageIndex = DICE_VALUES.indexOf(damage)
- const damageMaxIndex = DICE_VALUES.indexOf(damageMax)
-
- // If damage exceeds damageMax, return damageMax
- if (damageIndex > damageMaxIndex) {
- return damageMax
- }
-
// Otherwise, return damage (as it is less than or equal to damageMax)
- return damage
+ return 0
}
// Used when a ressource is lost to find the next lower dice
static findLowerDice(dice) {
- let index = DICE_VALUES.indexOf(dice)
- return DICE_VALUES[index - 1]
+ return 0
}
}
diff --git a/styles/character.less b/styles/character.less
index 99e4864..c16d357 100644
--- a/styles/character.less
+++ b/styles/character.less
@@ -7,17 +7,17 @@
.character-main {
display: flex;
- .character-personnage {
+ .character-pc {
display: flex;
gap: 10px;
flex: 1;
- .character-gauche {
+ .character-left {
min-width: 180px;
display: flex;
flex-direction: column;
- .character-gauche-image {
+ .character-left-image {
display: flex;
justify-content: center;
align-items: center;
@@ -29,13 +29,7 @@
}
}
- .character-dv,
- .character-dmax {
- .form-fields {
- flex: none;
- }
- }
- .character-dmax-edit {
+ .character-hp-edit {
input {
display: flex;
width: 60px;
@@ -48,7 +42,7 @@
}
}
- .character-droite {
+ .character-right {
display: flex;
flex-direction: column;
gap: 5px;
@@ -68,30 +62,11 @@
label {
min-width: 120px;
}
-
- .character-voie-majeure,
- .character-voie-mineure {
- display: flex;
- input {
- width: 280px;
- }
- .controls {
- padding-left: 5px;
- }
- }
-
- .character-commanditaire {
- display: flex;
- input {
- width: 280px;
- }
- }
-
- .character-pv {
+ .character-hp {
display: flex;
gap: 2px;
align-items: center;
- .character-pv-value {
+ .character-hp-value {
.form-fields input {
flex: none;
width: 50px;
@@ -99,7 +74,7 @@
font-size: calc(var(--font-size-standard) * 1.4);
}
}
- .character-pv-max {
+ .character-hp-max {
clear: both;
display: flex;
flex-direction: row;
@@ -112,7 +87,7 @@
font-size: calc(var(--font-size-standard) * 1.4);
}
}
- .pv-separator {
+ .hp-separator {
font-size: calc(var(--font-size-standard) * 1.2);
display: flex;
align-items: center;
@@ -123,21 +98,21 @@
}
}
- .character-personnage-play {
+ .character-pc-play {
min-width: 500px;
}
- .character-personnage-edit {
+ .character-pc-edit {
min-width: 650px;
}
- .character-caracteristiques {
+ .character-characteristics {
display: flex;
flex-direction: column;
gap: 5px;
flex: 1;
- .character-caracteristique {
+ .character-characteristic {
display: flex;
align-items: center;
.rollable:hover,
@@ -182,21 +157,21 @@
}
}
- .character-caracteristiques-play {
+ .character-characteristics-play {
min-width: 225px;
}
- .character-caracteristiques-edit {
+ .character-characteristic-edit {
min-width: 400px;
}
- .character-ressources {
+ .character-resources {
display: flex;
flex-direction: column;
gap: 5px;
flex: 1;
- .character-ressource {
+ .character-resource {
display: flex;
align-items: center;
.rollable:hover,
@@ -213,7 +188,7 @@
width: 70px;
}
}
- .character-ressource-edit {
+ .character-resource-edit {
display: flex;
align-items: center;
gap: 10px;
@@ -239,11 +214,11 @@
}
}
- .character-ressources-play {
+ .character-resources-play {
min-width: 235px;
}
- .character-ressources-edit {
+ .character-resources-edit {
min-width: 400px;
}
}
@@ -257,7 +232,7 @@
}
}
-.tab.character-items {
+.tab.character-skills {
display: grid;
grid-template-columns: 1fr;
legend {
@@ -266,11 +241,11 @@
padding-left: 5px;
}
}
- .talents {
+ .skills {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 10px;
- .talent {
+ .skill {
display: flex;
align-items: center;
gap: 10px;
@@ -280,6 +255,45 @@
}
}
}
+ .gifts {
+ display: grid;
+ grid-template-columns: repeat(5, 1fr);
+ gap: 10px;
+ .gift {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ .item-img {
+ width: 50px;
+ height: 50px;
+ }
+ }
+ }
+ .vulnerabilities {
+ display: grid;
+ grid-template-columns: repeat(5, 1fr);
+ gap: 10px;
+ .vulnerability {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ .item-img {
+ width: 50px;
+ height: 50px;
+ }
+ }
+ }
+}
+.tab.character-weapons {
+ display: grid;
+ grid-template-columns: 1fr;
+ legend {
+ a {
+ font-size: calc(var(--font-size-standard) * 1.4);
+ padding-left: 5px;
+ }
+ }
+
.weapons {
display: grid;
grid-template-columns: repeat(4, 1fr);
@@ -310,6 +324,18 @@
}
}
}
+}
+
+.tab.character-spells {
+ display: grid;
+ grid-template-columns: 1fr;
+ legend {
+ a {
+ font-size: calc(var(--font-size-standard) * 1.4);
+ padding-left: 5px;
+ }
+ }
+
.spells {
display: grid;
grid-template-columns: repeat(3, 1fr);
diff --git a/styles/fonts.less b/styles/fonts.less
index f107ab0..9508159 100644
--- a/styles/fonts.less
+++ b/styles/fonts.less
@@ -1,24 +1,10 @@
@font-face {
- font-family: "Cat Franken";
- src: url("../fonts/catfranken-deutsch.ttf") format("truetype");
+ font-family: "TimesNewRoman";
+ src: url("../assets/fonts/times-new-roman-regular.ttf") format("truetype");
}
@font-face {
- font-family: "Caslon";
- src: url("../fonts/caslonpro-regular.otf") format("truetype");
+ font-family: "BaskervilleBold";
+ src: url("../fonts/baskerville-bold.ttf") format("truetype");
}
-@font-face {
- font-family: "Caslon Bold";
- src: url("../fonts/caslonpro-bold.otf") format("truetype");
-}
-
-@font-face {
- font-family: "Caslon Bold Italic";
- src: url("../fonts/caslonpro-bolditalic.otf") format("truetype");
-}
-
-@font-face {
- font-family: "Caslon Italic";
- src: url("../fonts/caslonpro-italic.otf") format("truetype");
-}
diff --git a/styles/fvtt-lethal-fantasy.less b/styles/fvtt-lethal-fantasy.less
index 5f3a54d..ce3890d 100644
--- a/styles/fvtt-lethal-fantasy.less
+++ b/styles/fvtt-lethal-fantasy.less
@@ -14,6 +14,7 @@
@import "chat.less";
@import "equipment.less";
@import "shield.less";
+ @import "miracle.less";
}
@import "roll.less";
diff --git a/styles/global.less b/styles/global.less
index 6fc97d2..fd48912 100644
--- a/styles/global.less
+++ b/styles/global.less
@@ -1,8 +1,9 @@
:root {
+ --font-primary: "TimesNewRoman", serif;
--font-size-standard: 1.0rem;
- --background-image-base: url("../assets/parchment.jpg");
- --font-secondary: "Amiri", serif;
- --logo-standard: url("../assets/lethal-fantasy-logo.webp");
+ --background-image-base: url("../assets/ui/lethal_fantasy_background.webp");
+ --font-secondary: "BaskervilleBold", serif;
+ --logo-standard: url("../assets/ui/lf_logo_small_02.webp");
}
#logo {
diff --git a/styles/miracle.less b/styles/miracle.less
new file mode 100644
index 0000000..e8376fd
--- /dev/null
+++ b/styles/miracle.less
@@ -0,0 +1,17 @@
+.miracle-content {
+ .sheet-common();
+ .item-sheet-common();
+
+ .header {
+ display: flex;
+ img {
+ width: 50px;
+ height: 50px;
+ }
+ }
+
+ label {
+ flex: 10%;
+ }
+
+}
diff --git a/system.json b/system.json
index bd8b516..9d1a10b 100644
--- a/system.json
+++ b/system.json
@@ -51,5 +51,20 @@
"socket": true,
"background": "systems/fvtt-lethal-fantasy/assets/background.webp",
"packs": [
- ]
+ ],
+ "flags": {
+ "hotReload": {
+ "extensions": [
+ "css",
+ "hbs",
+ "json"
+ ],
+ "paths": [
+ "css/",
+ "lang/",
+ "assets/",
+ "templates/"
+ ]
+ }
+ }
}
diff --git a/templates/character-biography.hbs b/templates/character-biography.hbs
index 42fc382..e8e9b44 100644
--- a/templates/character-biography.hbs
+++ b/templates/character-biography.hbs
@@ -1,14 +1,10 @@