Initial import
This commit is contained in:
BIN
assets/fonts/Blue Dragon.ttf
Normal file
BIN
assets/fonts/Blue Dragon.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/SHERWOOD.TTF
Normal file
BIN
assets/fonts/SHERWOOD.TTF
Normal file
Binary file not shown.
BIN
assets/fonts/Sherwood.otf
Normal file
BIN
assets/fonts/Sherwood.otf
Normal file
Binary file not shown.
BIN
assets/fonts/Sherwood.woff
Normal file
BIN
assets/fonts/Sherwood.woff
Normal file
Binary file not shown.
BIN
assets/images/alternate_art.webp
Normal file
BIN
assets/images/alternate_art.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.3 MiB |
BIN
assets/images/cover_art.webp
Normal file
BIN
assets/images/cover_art.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 MiB |
BIN
assets/images/oathhammer_map.webp
Normal file
BIN
assets/images/oathhammer_map.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 MiB |
BIN
assets/logos/official_logo_01.webp
Normal file
BIN
assets/logos/official_logo_01.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 168 KiB |
BIN
assets/logos/third_party_logo_01.webp
Normal file
BIN
assets/logos/third_party_logo_01.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 73 KiB |
BIN
assets/ui/oath_hammer_paper.webp
Normal file
BIN
assets/ui/oath_hammer_paper.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.6 MiB |
430
css/fvtt-oath-hammer.css
Normal file
430
css/fvtt-oath-hammer.css
Normal file
@@ -0,0 +1,430 @@
|
||||
@font-face {
|
||||
font-family: "Sherwood";
|
||||
src: url("../assets/fonts/Sherwood.otf") format("opentype"),
|
||||
url("../assets/fonts/SHERWOOD.TTF") format("truetype"),
|
||||
url("../assets/fonts/Sherwood.woff") format("woff");
|
||||
}
|
||||
@font-face {
|
||||
font-family: "BlueDragon";
|
||||
src: url("../assets/fonts/Blue Dragon.ttf") format("truetype");
|
||||
}
|
||||
|
||||
:root {
|
||||
--oh-font-primary: "Sherwood", "Palatino Linotype", serif;
|
||||
--oh-font-secondary: "BlueDragon", "Palatino Linotype", serif;
|
||||
--oh-font-body: "Calibri", "Segoe UI", sans-serif;
|
||||
--oh-font-size: 0.82rem;
|
||||
--oh-color-blue: #1a4a7a;
|
||||
--oh-color-olive: #5a5a2a;
|
||||
--oh-color-gold: #c8a84b;
|
||||
--oh-color-dark: #2a1a0a;
|
||||
--oh-color-paper: #f5ead0;
|
||||
--oh-background-image: url("../assets/ui/oath_hammer_paper.webp");
|
||||
--oh-logo: url("../assets/logos/official_logo_01.webp");
|
||||
}
|
||||
|
||||
/* ======================== */
|
||||
/* GLOBAL DIALOG STYLING */
|
||||
/* ======================== */
|
||||
.application.dialog.oathhammer {
|
||||
font-family: var(--oh-font-primary);
|
||||
font-size: var(--oh-font-size);
|
||||
background-image: var(--oh-background-image);
|
||||
}
|
||||
|
||||
/* ======================== */
|
||||
/* ACTOR SHEET CONTENT */
|
||||
/* ======================== */
|
||||
.oathhammer .character-content,
|
||||
.oathhammer .npc-content {
|
||||
font-family: var(--oh-font-primary);
|
||||
font-size: var(--oh-font-size);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--oh-background-image);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.oathhammer .character-content nav.tabs [data-tab],
|
||||
.oathhammer .npc-content nav.tabs [data-tab] {
|
||||
color: var(--oh-color-olive);
|
||||
}
|
||||
|
||||
.oathhammer .character-content nav.tabs [data-tab].active,
|
||||
.oathhammer .npc-content nav.tabs [data-tab].active {
|
||||
color: var(--oh-color-blue);
|
||||
}
|
||||
|
||||
.oathhammer .character-content input:disabled,
|
||||
.oathhammer .character-content select:disabled,
|
||||
.oathhammer .npc-content input:disabled,
|
||||
.oathhammer .npc-content select:disabled {
|
||||
background-color: rgba(0, 0, 0, 0.08);
|
||||
border-color: transparent;
|
||||
color: var(--color-dark-3);
|
||||
}
|
||||
|
||||
.oathhammer .character-content input,
|
||||
.oathhammer .character-content select,
|
||||
.oathhammer .npc-content input,
|
||||
.oathhammer .npc-content select {
|
||||
height: 1.5rem;
|
||||
background-color: rgba(255, 255, 255, 0.3);
|
||||
border-color: var(--oh-color-blue);
|
||||
color: var(--oh-color-dark);
|
||||
}
|
||||
|
||||
.oathhammer .character-content input[name="name"],
|
||||
.oathhammer .npc-content input[name="name"] {
|
||||
height: 2.5rem;
|
||||
font-family: var(--oh-font-secondary);
|
||||
font-size: 1.2rem;
|
||||
font-weight: bold;
|
||||
border: none;
|
||||
border-bottom: 2px solid var(--oh-color-blue);
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.oathhammer .character-content fieldset,
|
||||
.oathhammer .npc-content fieldset {
|
||||
margin-bottom: 4px;
|
||||
border-radius: 4px;
|
||||
border-color: var(--oh-color-olive);
|
||||
}
|
||||
|
||||
.oathhammer .character-content legend,
|
||||
.oathhammer .npc-content legend {
|
||||
font-family: var(--oh-font-secondary);
|
||||
font-size: calc(var(--oh-font-size) * 1.2);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
color: var(--oh-color-blue);
|
||||
}
|
||||
|
||||
.oathhammer .character-content label,
|
||||
.oathhammer .npc-content label {
|
||||
font-family: var(--oh-font-secondary);
|
||||
font-size: var(--oh-font-size);
|
||||
color: var(--oh-color-dark);
|
||||
}
|
||||
|
||||
/* ======================== */
|
||||
/* CHARACTER MAIN SECTION */
|
||||
/* ======================== */
|
||||
.oathhammer .character-main {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.oathhammer .character-main .character-pc {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.oathhammer .character-main .character-left {
|
||||
min-width: 180px;
|
||||
max-width: 180px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.oathhammer .character-main .character-portrait {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.oathhammer .actor-img {
|
||||
height: 150px;
|
||||
width: auto;
|
||||
border: 2px solid var(--oh-color-blue);
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.oathhammer .character-main .character-resource {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.oathhammer .character-main .resource-label {
|
||||
min-width: 3.5rem;
|
||||
font-family: var(--oh-font-secondary);
|
||||
font-size: calc(var(--oh-font-size) * 0.9);
|
||||
}
|
||||
|
||||
.oathhammer .character-main .character-resource input {
|
||||
min-width: 2.5rem;
|
||||
max-width: 2.5rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.oathhammer .character-main .character-right {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.oathhammer .character-main .character-name {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.oathhammer .character-main .character-name input {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
/* ======================== */
|
||||
/* ATTRIBUTES GRID */
|
||||
/* ======================== */
|
||||
.oathhammer .attributes-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(6, 1fr);
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.oathhammer .attribute-box {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 2px;
|
||||
}
|
||||
|
||||
.oathhammer .attribute-box label {
|
||||
font-family: var(--oh-font-secondary);
|
||||
font-size: calc(var(--oh-font-size) * 0.85);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.oathhammer .attribute-box input {
|
||||
width: 2.5rem;
|
||||
text-align: center;
|
||||
font-size: calc(var(--oh-font-size) * 1.1);
|
||||
}
|
||||
|
||||
/* ======================== */
|
||||
/* CURRENCY BAR */
|
||||
/* ======================== */
|
||||
.oathhammer .currency-bar {
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.oathhammer .currency-bar .currency-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 2px;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.oathhammer .currency-bar .currency-item input {
|
||||
width: 4rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* ======================== */
|
||||
/* ITEM LISTS */
|
||||
/* ======================== */
|
||||
.oathhammer .item-list {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.oathhammer .item-entry {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
padding: 3px 4px;
|
||||
border-bottom: 1px solid rgba(90, 90, 42, 0.2);
|
||||
}
|
||||
|
||||
.oathhammer .item-entry:hover {
|
||||
background-color: rgba(26, 74, 122, 0.08);
|
||||
}
|
||||
|
||||
.oathhammer .item-entry .item-img {
|
||||
height: 24px;
|
||||
width: 24px;
|
||||
border: 1px solid var(--oh-color-olive);
|
||||
border-radius: 2px;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.oathhammer .item-entry .item-name {
|
||||
flex: 1;
|
||||
font-family: var(--oh-font-body);
|
||||
font-size: var(--oh-font-size);
|
||||
}
|
||||
|
||||
.oathhammer .item-entry .item-detail {
|
||||
font-size: calc(var(--oh-font-size) * 0.9);
|
||||
color: var(--oh-color-olive);
|
||||
min-width: 4rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.oathhammer .item-entry .item-type {
|
||||
font-size: calc(var(--oh-font-size) * 0.85);
|
||||
color: var(--oh-color-blue);
|
||||
min-width: 6rem;
|
||||
}
|
||||
|
||||
.oathhammer .item-entry a {
|
||||
opacity: 0.6;
|
||||
transition: opacity 0.2s;
|
||||
}
|
||||
|
||||
.oathhammer .item-entry a:hover {
|
||||
opacity: 1;
|
||||
color: var(--oh-color-blue);
|
||||
}
|
||||
|
||||
.oathhammer .no-items {
|
||||
color: var(--color-dark-5);
|
||||
font-style: italic;
|
||||
font-size: calc(var(--oh-font-size) * 0.9);
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.oathhammer .create-btn {
|
||||
margin-left: 6px;
|
||||
color: var(--oh-color-blue);
|
||||
opacity: 0.7;
|
||||
transition: opacity 0.2s;
|
||||
}
|
||||
|
||||
.oathhammer .create-btn:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* ======================== */
|
||||
/* BIODATA */
|
||||
/* ======================== */
|
||||
.oathhammer .biodata-col {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 2px;
|
||||
}
|
||||
|
||||
/* ======================== */
|
||||
/* ITEM SHEET COMMON */
|
||||
/* ======================== */
|
||||
.oathhammer .item-sheet-common {
|
||||
overflow: auto;
|
||||
font-family: var(--oh-font-primary);
|
||||
font-size: var(--oh-font-size);
|
||||
background-image: var(--oh-background-image);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
|
||||
.oathhammer .item-sheet-common .header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
margin-bottom: 8px;
|
||||
padding-bottom: 4px;
|
||||
border-bottom: 2px solid var(--oh-color-blue);
|
||||
}
|
||||
|
||||
.oathhammer .item-sheet-common .item-img {
|
||||
height: 52px;
|
||||
width: 52px;
|
||||
border: 2px solid var(--oh-color-olive);
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.oathhammer .item-sheet-common .form-group {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.oathhammer .item-sheet-common .form-group label {
|
||||
font-family: var(--oh-font-secondary);
|
||||
font-size: var(--oh-font-size);
|
||||
min-width: 9rem;
|
||||
max-width: 9rem;
|
||||
}
|
||||
|
||||
.oathhammer .item-sheet-common .form-group select,
|
||||
.oathhammer .item-sheet-common .form-group input {
|
||||
text-align: left;
|
||||
min-width: 10rem;
|
||||
max-width: 12rem;
|
||||
}
|
||||
|
||||
.oathhammer .item-sheet-common .align-top {
|
||||
align-self: flex-start;
|
||||
padding: 0.2rem;
|
||||
min-width: 260px;
|
||||
}
|
||||
|
||||
.oathhammer .item-sheet-common .shift-right {
|
||||
margin-left: 2rem;
|
||||
}
|
||||
|
||||
.oathhammer .item-sheet-common fieldset {
|
||||
margin-top: 6px;
|
||||
border-color: var(--oh-color-olive);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.oathhammer .item-sheet-common legend {
|
||||
font-family: var(--oh-font-secondary);
|
||||
font-size: calc(var(--oh-font-size) * 1.1);
|
||||
font-weight: bold;
|
||||
color: var(--oh-color-blue);
|
||||
}
|
||||
|
||||
/* ======================== */
|
||||
/* NPC SHEET */
|
||||
/* ======================== */
|
||||
.oathhammer .npc-main .npc-left {
|
||||
min-width: 160px;
|
||||
max-width: 160px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.oathhammer .npc-main .npc-right {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
/* ======================== */
|
||||
/* DEFENSE DISPLAY */
|
||||
/* ======================== */
|
||||
.oathhammer .defense-display {
|
||||
min-width: 3rem;
|
||||
max-width: 3rem;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* ======================== */
|
||||
/* TABS */
|
||||
/* ======================== */
|
||||
.oathhammer .tab {
|
||||
padding: 4px;
|
||||
}
|
||||
548
lang/en.json
Normal file
548
lang/en.json
Normal file
@@ -0,0 +1,548 @@
|
||||
{
|
||||
"OATHHAMMER": {
|
||||
"Sheet": {
|
||||
"Character": "Oath Hammer Character Sheet",
|
||||
"NPC": "Oath Hammer NPC Sheet",
|
||||
"Weapon": "Oath Hammer Weapon Sheet",
|
||||
"Armor": "Oath Hammer Armor Sheet",
|
||||
"Shield": "Oath Hammer Shield Sheet",
|
||||
"Ammunition": "Oath Hammer Ammunition Sheet",
|
||||
"Equipment": "Oath Hammer Equipment Sheet",
|
||||
"Spell": "Oath Hammer Spell Sheet",
|
||||
"Miracle": "Oath Hammer Miracle Sheet",
|
||||
"MagicItem": "Oath Hammer Magic Item Sheet",
|
||||
"Ability": "Oath Hammer Ability Sheet",
|
||||
"Oath": "Oath Hammer Oath Sheet",
|
||||
"Condition": "Oath Hammer Condition Sheet"
|
||||
},
|
||||
"Tab": {
|
||||
"Identity": "Identity",
|
||||
"Combat": "Combat",
|
||||
"Magic": "Magic",
|
||||
"Equipment": "Equipment",
|
||||
"Notes": "Notes"
|
||||
},
|
||||
"Attribute": {
|
||||
"Might": "Might",
|
||||
"Toughness": "Toughness",
|
||||
"Agility": "Agility",
|
||||
"Willpower": "Willpower",
|
||||
"Intelligence": "Intelligence",
|
||||
"Fate": "Fate"
|
||||
},
|
||||
"Lineage": {
|
||||
"Dwarf": "Dwarf",
|
||||
"Human": "Human",
|
||||
"Elf": "Elf",
|
||||
"HalfElf": "Half-Elf",
|
||||
"Halfling": "Halfling"
|
||||
},
|
||||
"Class": {
|
||||
"Fighter": "Fighter",
|
||||
"Ranger": "Ranger",
|
||||
"Wizard": "Wizard",
|
||||
"Cleric": "Cleric",
|
||||
"Rogue": "Rogue",
|
||||
"Paladin": "Paladin"
|
||||
},
|
||||
"Oath": {
|
||||
"Justice": "Oath of Justice",
|
||||
"Courage": "Oath of Courage",
|
||||
"Honor": "Oath of Honor",
|
||||
"Mercy": "Oath of Mercy",
|
||||
"Truth": "Oath of Truth",
|
||||
"Valor": "Oath of Valor",
|
||||
"Protection": "Oath of Protection",
|
||||
"Vengeance": "Oath of Vengeance",
|
||||
"Sacrifice": "Oath of Sacrifice",
|
||||
"Faith": "Oath of Faith",
|
||||
"Service": "Oath of Service",
|
||||
"Brotherhood": "Oath of Brotherhood"
|
||||
},
|
||||
"Tradition": {
|
||||
"Elemental": "Elemental",
|
||||
"Illusionist": "Illusionist",
|
||||
"Imperial": "Imperial",
|
||||
"Infernal": "Infernal",
|
||||
"Runic": "Runic",
|
||||
"Stygian": "Stygian"
|
||||
},
|
||||
"WeaponType": {
|
||||
"Melee": "Melee",
|
||||
"Ranged": "Ranged"
|
||||
},
|
||||
"DamageType": {
|
||||
"Slashing": "Slashing",
|
||||
"Piercing": "Piercing",
|
||||
"Bludgeoning": "Bludgeoning",
|
||||
"Fire": "Fire",
|
||||
"Cold": "Cold",
|
||||
"Lightning": "Lightning",
|
||||
"Acid": "Acid",
|
||||
"Poison": "Poison",
|
||||
"Necrotic": "Necrotic",
|
||||
"Radiant": "Radiant"
|
||||
},
|
||||
"ArmorType": {
|
||||
"Light": "Light",
|
||||
"Medium": "Medium",
|
||||
"Heavy": "Heavy"
|
||||
},
|
||||
"Hands": {
|
||||
"OneHanded": "One-Handed",
|
||||
"TwoHanded": "Two-Handed"
|
||||
},
|
||||
"Range": {
|
||||
"Short": "Short",
|
||||
"Medium": "Medium",
|
||||
"Long": "Long"
|
||||
},
|
||||
"Currency": {
|
||||
"GP": "Gold Pieces",
|
||||
"SP": "Silver Pieces",
|
||||
"CP": "Copper Pieces"
|
||||
},
|
||||
"AmmoType": {
|
||||
"Arrow": "Arrow",
|
||||
"Bolt": "Bolt",
|
||||
"Stone": "Stone",
|
||||
"Javelin": "Javelin",
|
||||
"ThrowingKnife": "Throwing Knife"
|
||||
},
|
||||
"EquipmentType": {
|
||||
"Potion": "Potion",
|
||||
"Container": "Container",
|
||||
"Tool": "Tool",
|
||||
"Consumable": "Consumable",
|
||||
"Misc": "Miscellaneous",
|
||||
"HealingSupply": "Healing Supply",
|
||||
"Food": "Food",
|
||||
"Mount": "Mount",
|
||||
"Vehicle": "Vehicle",
|
||||
"WarMachine": "War Machine"
|
||||
},
|
||||
"MagicItemType": {
|
||||
"Weapon": "Weapon",
|
||||
"Armor": "Armor",
|
||||
"Wondrous": "Wondrous Item",
|
||||
"Potion": "Potion",
|
||||
"Ring": "Ring",
|
||||
"Staff": "Staff",
|
||||
"Wand": "Wand",
|
||||
"Scroll": "Scroll",
|
||||
"Rod": "Rod"
|
||||
},
|
||||
"Rarity": {
|
||||
"Common": "Common",
|
||||
"Uncommon": "Uncommon",
|
||||
"Rare": "Rare",
|
||||
"VeryRare": "Very Rare",
|
||||
"Legendary": "Legendary"
|
||||
},
|
||||
"AbilityType": {
|
||||
"ClassAbility": "Class Ability",
|
||||
"LineageTrait": "Lineage Trait",
|
||||
"Feat": "Feat"
|
||||
},
|
||||
"Condition": {
|
||||
"Blinded": "Blinded",
|
||||
"Deafened": "Deafened",
|
||||
"Prone": "Prone",
|
||||
"Stunned": "Stunned",
|
||||
"Frightened": "Frightened",
|
||||
"Poisoned": "Poisoned",
|
||||
"Restrained": "Restrained",
|
||||
"Wounded": "Wounded",
|
||||
"Other": "Other"
|
||||
},
|
||||
"Label": {
|
||||
"Character": "Character",
|
||||
"NPC": "NPC",
|
||||
"Grit": "Grit",
|
||||
"Luck": "Luck",
|
||||
"Defense": "Defense",
|
||||
"DefenseValue": "Defense Value",
|
||||
"ArmorRating": "Armor Rating",
|
||||
"DefenseBonus": "Defense Bonus",
|
||||
"Movement": "Movement",
|
||||
"ArcaneStress": "Arcane Stress",
|
||||
"StressValue": "Stress",
|
||||
"Attributes": "Attributes",
|
||||
"Biodata": "Background",
|
||||
"Experience": "Experience",
|
||||
"Level": "Level",
|
||||
"XP": "Current XP",
|
||||
"TotalXP": "Total XP",
|
||||
"Abilities": "Abilities & Traits",
|
||||
"Oaths": "Oaths",
|
||||
"Weapons": "Weapons",
|
||||
"Armor": "Armor & Shields",
|
||||
"Ammunition": "Ammunition",
|
||||
"Spells": "Spells",
|
||||
"Miracles": "Miracles",
|
||||
"Equipment": "Equipment",
|
||||
"MagicItems": "Magic Items",
|
||||
"Conditions": "Conditions",
|
||||
"Description": "Description",
|
||||
"Notes": "Notes",
|
||||
"Stats": "Statistics",
|
||||
"CR": "Challenge Rating",
|
||||
"AttackBonus": "Attack Bonus",
|
||||
"DamageBonus": "Damage Bonus",
|
||||
"Currency": "Currency",
|
||||
"None": "None",
|
||||
"Effect": "Effect",
|
||||
"Components": "Components",
|
||||
"Charges": "Charges",
|
||||
"Benefit": "Benefit",
|
||||
"Violation": "Violation",
|
||||
"NoWeapons": "No weapons equipped.",
|
||||
"NoArmor": "No armor or shields.",
|
||||
"NoSpells": "No spells known.",
|
||||
"NoMiracles": "No miracles known.",
|
||||
"NoEquipment": "No equipment."
|
||||
},
|
||||
"NewItem": {
|
||||
"Weapon": "New Weapon",
|
||||
"Spell": "New Spell",
|
||||
"Miracle": "New Miracle",
|
||||
"Equipment": "New Equipment"
|
||||
},
|
||||
"ToggleSheet": "Toggle Edit/Play Mode",
|
||||
"Character": {
|
||||
"attributes": {
|
||||
"label": "Attributes"
|
||||
},
|
||||
"grit": {
|
||||
"label": "Grit"
|
||||
},
|
||||
"luck": {
|
||||
"label": "Luck"
|
||||
},
|
||||
"arcaneStress": {
|
||||
"label": "Arcane Stress"
|
||||
},
|
||||
"movement": {
|
||||
"label": "Movement"
|
||||
},
|
||||
"defense": {
|
||||
"label": "Defense"
|
||||
},
|
||||
"experience": {
|
||||
"label": "Experience"
|
||||
},
|
||||
"biodata": {
|
||||
"label": "Background",
|
||||
"lineage": {
|
||||
"label": "Lineage"
|
||||
},
|
||||
"class": {
|
||||
"label": "Class"
|
||||
},
|
||||
"age": {
|
||||
"label": "Age"
|
||||
},
|
||||
"gender": {
|
||||
"label": "Gender"
|
||||
},
|
||||
"height": {
|
||||
"label": "Height"
|
||||
},
|
||||
"weight": {
|
||||
"label": "Weight"
|
||||
},
|
||||
"eyes": {
|
||||
"label": "Eye Color"
|
||||
},
|
||||
"hair": {
|
||||
"label": "Hair Color"
|
||||
},
|
||||
"alignment": {
|
||||
"label": "Alignment"
|
||||
}
|
||||
},
|
||||
"currency": {
|
||||
"label": "Currency",
|
||||
"gold": {
|
||||
"label": "Gold"
|
||||
},
|
||||
"silver": {
|
||||
"label": "Silver"
|
||||
},
|
||||
"copper": {
|
||||
"label": "Copper"
|
||||
}
|
||||
}
|
||||
},
|
||||
"NPC": {
|
||||
"attributes": {
|
||||
"label": "Attributes"
|
||||
},
|
||||
"grit": {
|
||||
"label": "Grit"
|
||||
},
|
||||
"defense": {
|
||||
"label": "Defense"
|
||||
},
|
||||
"movement": {
|
||||
"label": "Movement"
|
||||
},
|
||||
"attackBonus": {
|
||||
"label": "Attack Bonus"
|
||||
},
|
||||
"damageBonus": {
|
||||
"label": "Damage Bonus"
|
||||
},
|
||||
"challengeRating": {
|
||||
"label": "Challenge Rating"
|
||||
}
|
||||
},
|
||||
"Weapon": {
|
||||
"weaponType": {
|
||||
"label": "Weapon Type"
|
||||
},
|
||||
"damageFormula": {
|
||||
"label": "Damage"
|
||||
},
|
||||
"damageType": {
|
||||
"label": "Damage Type"
|
||||
},
|
||||
"attributeBonus": {
|
||||
"label": "Attribute Bonus"
|
||||
},
|
||||
"range": {
|
||||
"label": "Range"
|
||||
},
|
||||
"hands": {
|
||||
"label": "Hands"
|
||||
},
|
||||
"properties": {
|
||||
"label": "Properties"
|
||||
},
|
||||
"equipped": {
|
||||
"label": "Equipped"
|
||||
},
|
||||
"encumbrance": {
|
||||
"label": "Enc."
|
||||
},
|
||||
"cost": {
|
||||
"label": "Cost"
|
||||
},
|
||||
"currency": {
|
||||
"label": "Currency"
|
||||
}
|
||||
},
|
||||
"Armor": {
|
||||
"armorType": {
|
||||
"label": "Armor Type"
|
||||
},
|
||||
"armorRating": {
|
||||
"label": "Armor Rating"
|
||||
},
|
||||
"movementPenalty": {
|
||||
"label": "Movement Penalty"
|
||||
},
|
||||
"equipped": {
|
||||
"label": "Equipped"
|
||||
},
|
||||
"encumbrance": {
|
||||
"label": "Enc."
|
||||
},
|
||||
"cost": {
|
||||
"label": "Cost"
|
||||
},
|
||||
"currency": {
|
||||
"label": "Currency"
|
||||
}
|
||||
},
|
||||
"Shield": {
|
||||
"shieldBonus": {
|
||||
"label": "Shield Bonus"
|
||||
},
|
||||
"equipped": {
|
||||
"label": "Equipped"
|
||||
},
|
||||
"encumbrance": {
|
||||
"label": "Enc."
|
||||
},
|
||||
"cost": {
|
||||
"label": "Cost"
|
||||
},
|
||||
"currency": {
|
||||
"label": "Currency"
|
||||
}
|
||||
},
|
||||
"Ammunition": {
|
||||
"ammoType": {
|
||||
"label": "Ammo Type"
|
||||
},
|
||||
"quantity": {
|
||||
"label": "Quantity"
|
||||
},
|
||||
"properties": {
|
||||
"label": "Properties"
|
||||
},
|
||||
"cost": {
|
||||
"label": "Cost"
|
||||
},
|
||||
"currency": {
|
||||
"label": "Currency"
|
||||
}
|
||||
},
|
||||
"Equipment": {
|
||||
"itemType": {
|
||||
"label": "Type"
|
||||
},
|
||||
"quantity": {
|
||||
"label": "Quantity"
|
||||
},
|
||||
"weight": {
|
||||
"label": "Weight"
|
||||
},
|
||||
"cost": {
|
||||
"label": "Cost"
|
||||
},
|
||||
"currency": {
|
||||
"label": "Currency"
|
||||
}
|
||||
},
|
||||
"Spell": {
|
||||
"tradition": {
|
||||
"label": "Tradition"
|
||||
},
|
||||
"level": {
|
||||
"label": "Level"
|
||||
},
|
||||
"castingTime": {
|
||||
"label": "Casting Time"
|
||||
},
|
||||
"range": {
|
||||
"label": "Range"
|
||||
},
|
||||
"duration": {
|
||||
"label": "Duration"
|
||||
},
|
||||
"arcaneStress": {
|
||||
"label": "Arcane Stress"
|
||||
},
|
||||
"components": {
|
||||
"label": "Components",
|
||||
"verbal": {
|
||||
"label": "Verbal"
|
||||
},
|
||||
"somatic": {
|
||||
"label": "Somatic"
|
||||
},
|
||||
"material": {
|
||||
"label": "Material"
|
||||
}
|
||||
},
|
||||
"materialComponent": {
|
||||
"label": "Material Component"
|
||||
},
|
||||
"savingThrow": {
|
||||
"label": "Saving Throw"
|
||||
},
|
||||
"enhancement": {
|
||||
"label": "Enhancement"
|
||||
}
|
||||
},
|
||||
"Miracle": {
|
||||
"piety": {
|
||||
"label": "Piety Cost"
|
||||
},
|
||||
"castingTime": {
|
||||
"label": "Casting Time"
|
||||
},
|
||||
"range": {
|
||||
"label": "Range"
|
||||
},
|
||||
"duration": {
|
||||
"label": "Duration"
|
||||
},
|
||||
"components": {
|
||||
"label": "Components",
|
||||
"verbal": {
|
||||
"label": "Verbal"
|
||||
},
|
||||
"somatic": {
|
||||
"label": "Somatic"
|
||||
},
|
||||
"material": {
|
||||
"label": "Material"
|
||||
}
|
||||
},
|
||||
"materialComponent": {
|
||||
"label": "Material Component"
|
||||
},
|
||||
"savingThrow": {
|
||||
"label": "Saving Throw"
|
||||
}
|
||||
},
|
||||
"MagicItem": {
|
||||
"itemType": {
|
||||
"label": "Item Type"
|
||||
},
|
||||
"rarity": {
|
||||
"label": "Rarity"
|
||||
},
|
||||
"attunement": {
|
||||
"label": "Requires Attunement"
|
||||
},
|
||||
"charges": {
|
||||
"label": "Charges",
|
||||
"value": {
|
||||
"label": "Current"
|
||||
},
|
||||
"max": {
|
||||
"label": "Maximum"
|
||||
}
|
||||
},
|
||||
"recharge": {
|
||||
"label": "Recharge"
|
||||
},
|
||||
"equipped": {
|
||||
"label": "Equipped"
|
||||
},
|
||||
"cost": {
|
||||
"label": "Cost"
|
||||
},
|
||||
"currency": {
|
||||
"label": "Currency"
|
||||
}
|
||||
},
|
||||
"Ability": {
|
||||
"abilityType": {
|
||||
"label": "Ability Type"
|
||||
},
|
||||
"source": {
|
||||
"label": "Source"
|
||||
},
|
||||
"prerequisite": {
|
||||
"label": "Prerequisite"
|
||||
},
|
||||
"passiveBonus": {
|
||||
"label": "Passive Bonus"
|
||||
}
|
||||
},
|
||||
"Oath": {
|
||||
"oathType": {
|
||||
"label": "Oath Type"
|
||||
},
|
||||
"violated": {
|
||||
"label": "Violated"
|
||||
}
|
||||
},
|
||||
"Condition": {
|
||||
"conditionType": {
|
||||
"label": "Condition Type"
|
||||
},
|
||||
"duration": {
|
||||
"label": "Duration"
|
||||
},
|
||||
"source": {
|
||||
"label": "Source"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
13
module/applications/_module.mjs
Normal file
13
module/applications/_module.mjs
Normal file
@@ -0,0 +1,13 @@
|
||||
export { default as OathHammerCharacterSheet } from "./sheets/character-sheet.mjs"
|
||||
export { default as OathHammerNPCSheet } from "./sheets/npc-sheet.mjs"
|
||||
export { default as OathHammerWeaponSheet } from "./sheets/weapon-sheet.mjs"
|
||||
export { default as OathHammerArmorSheet } from "./sheets/armor-sheet.mjs"
|
||||
export { default as OathHammerShieldSheet } from "./sheets/shield-sheet.mjs"
|
||||
export { default as OathHammerAmmunitionSheet } from "./sheets/ammunition-sheet.mjs"
|
||||
export { default as OathHammerEquipmentSheet } from "./sheets/equipment-sheet.mjs"
|
||||
export { default as OathHammerSpellSheet } from "./sheets/spell-sheet.mjs"
|
||||
export { default as OathHammerMiracleSheet } from "./sheets/miracle-sheet.mjs"
|
||||
export { default as OathHammerMagicItemSheet } from "./sheets/magic-item-sheet.mjs"
|
||||
export { default as OathHammerAbilitySheet } from "./sheets/ability-sheet.mjs"
|
||||
export { default as OathHammerOathSheet } from "./sheets/oath-sheet.mjs"
|
||||
export { default as OathHammerConditionSheet } from "./sheets/condition-sheet.mjs"
|
||||
27
module/applications/sheets/ability-sheet.mjs
Normal file
27
module/applications/sheets/ability-sheet.mjs
Normal file
@@ -0,0 +1,27 @@
|
||||
import OathHammerItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class OathHammerAbilitySheet extends OathHammerItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["ability"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["ability-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-oath-hammer/templates/item/ability-sheet.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
return context
|
||||
}
|
||||
}
|
||||
27
module/applications/sheets/ammunition-sheet.mjs
Normal file
27
module/applications/sheets/ammunition-sheet.mjs
Normal file
@@ -0,0 +1,27 @@
|
||||
import OathHammerItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class OathHammerAmmunitionSheet extends OathHammerItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["ammunition"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["ammunition-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-oath-hammer/templates/item/ammunition-sheet.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
return context
|
||||
}
|
||||
}
|
||||
27
module/applications/sheets/armor-sheet.mjs
Normal file
27
module/applications/sheets/armor-sheet.mjs
Normal file
@@ -0,0 +1,27 @@
|
||||
import OathHammerItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class OathHammerArmorSheet extends OathHammerItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["armor"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["armor-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-oath-hammer/templates/item/armor-sheet.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
return context
|
||||
}
|
||||
}
|
||||
138
module/applications/sheets/base-actor-sheet.mjs
Normal file
138
module/applications/sheets/base-actor-sheet.mjs
Normal file
@@ -0,0 +1,138 @@
|
||||
const { HandlebarsApplicationMixin } = foundry.applications.api
|
||||
|
||||
export default class OathHammerActorSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ActorSheetV2) {
|
||||
static SHEET_MODES = { EDIT: 0, PLAY: 1 }
|
||||
|
||||
constructor(options = {}) {
|
||||
super(options)
|
||||
this.#dragDrop = this.#createDragDropHandlers()
|
||||
}
|
||||
|
||||
#dragDrop
|
||||
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["oathhammer", "actor"],
|
||||
position: {
|
||||
width: 900,
|
||||
height: "auto",
|
||||
},
|
||||
form: {
|
||||
submitOnChange: true,
|
||||
},
|
||||
window: {
|
||||
resizable: true,
|
||||
},
|
||||
dragDrop: [{ dragSelector: '[data-drag="true"], .rollable', dropSelector: null }],
|
||||
actions: {
|
||||
editImage: OathHammerActorSheet.#onEditImage,
|
||||
toggleSheet: OathHammerActorSheet.#onToggleSheet,
|
||||
edit: OathHammerActorSheet.#onItemEdit,
|
||||
delete: OathHammerActorSheet.#onItemDelete,
|
||||
},
|
||||
}
|
||||
|
||||
_sheetMode = this.constructor.SHEET_MODES.PLAY
|
||||
|
||||
get isPlayMode() {
|
||||
return this._sheetMode === this.constructor.SHEET_MODES.PLAY
|
||||
}
|
||||
|
||||
get isEditMode() {
|
||||
return this._sheetMode === this.constructor.SHEET_MODES.EDIT
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = {
|
||||
fields: this.document.schema.fields,
|
||||
systemFields: this.document.system.schema.fields,
|
||||
actor: this.document,
|
||||
system: this.document.system,
|
||||
source: this.document.toObject(),
|
||||
isEditMode: this.isEditMode,
|
||||
isPlayMode: this.isPlayMode,
|
||||
isEditable: this.isEditable,
|
||||
}
|
||||
return context
|
||||
}
|
||||
|
||||
/** @override */
|
||||
_onRender(context, options) {
|
||||
this.#dragDrop.forEach((d) => d.bind(this.element))
|
||||
}
|
||||
|
||||
#createDragDropHandlers() {
|
||||
return this.options.dragDrop.map((d) => {
|
||||
d.permissions = {
|
||||
dragstart: this._canDragStart.bind(this),
|
||||
drop: this._canDragDrop.bind(this),
|
||||
}
|
||||
d.callbacks = {
|
||||
dragstart: this._onDragStart.bind(this),
|
||||
dragover: this._onDragOver.bind(this),
|
||||
drop: this._onDrop.bind(this),
|
||||
}
|
||||
return new foundry.applications.ux.DragDrop.implementation(d)
|
||||
})
|
||||
}
|
||||
|
||||
async _onDrop(event) {}
|
||||
|
||||
_canDragStart(selector) {
|
||||
return this.isEditable
|
||||
}
|
||||
|
||||
_canDragDrop(selector) {
|
||||
return this.isEditable && this.document.isOwner
|
||||
}
|
||||
|
||||
_onDragStart(event) {
|
||||
if ("link" in event.target.dataset) return
|
||||
}
|
||||
|
||||
_onDragOver(event) {}
|
||||
|
||||
async _onDropItem(item) {
|
||||
const itemData = item.toObject()
|
||||
await this.document.createEmbeddedDocuments("Item", [itemData], { renderSheet: false })
|
||||
}
|
||||
|
||||
static #onToggleSheet(event, target) {
|
||||
const modes = this.constructor.SHEET_MODES
|
||||
this._sheetMode = this.isEditMode ? modes.PLAY : modes.EDIT
|
||||
this.render()
|
||||
}
|
||||
|
||||
static async #onEditImage(event, target) {
|
||||
const attr = target.dataset.edit
|
||||
const current = foundry.utils.getProperty(this.document, attr)
|
||||
const { img } = this.document.constructor.getDefaultArtwork?.(this.document.toObject()) ?? {}
|
||||
const fp = new FilePicker({
|
||||
current,
|
||||
type: "image",
|
||||
redirectToRoot: img ? [img] : [],
|
||||
callback: (path) => {
|
||||
this.document.update({ [attr]: path })
|
||||
},
|
||||
top: this.position.top + 40,
|
||||
left: this.position.left + 10,
|
||||
})
|
||||
return fp.browse()
|
||||
}
|
||||
|
||||
static async #onItemEdit(event, target) {
|
||||
const id = target.getAttribute("data-item-id")
|
||||
const uuid = target.getAttribute("data-item-uuid")
|
||||
let item = await fromUuid(uuid)
|
||||
if (!item) item = this.document.items.get(id)
|
||||
if (!item) return
|
||||
item.sheet.render(true)
|
||||
}
|
||||
|
||||
static async #onItemDelete(event, target) {
|
||||
const itemUuid = target.getAttribute("data-item-uuid")
|
||||
const item = await fromUuid(itemUuid)
|
||||
await item.deleteDialog()
|
||||
}
|
||||
}
|
||||
119
module/applications/sheets/base-item-sheet.mjs
Normal file
119
module/applications/sheets/base-item-sheet.mjs
Normal file
@@ -0,0 +1,119 @@
|
||||
const { HandlebarsApplicationMixin } = foundry.applications.api
|
||||
|
||||
export default class OathHammerItemSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ItemSheetV2) {
|
||||
static SHEET_MODES = { EDIT: 0, PLAY: 1 }
|
||||
|
||||
constructor(options = {}) {
|
||||
super(options)
|
||||
this.#dragDrop = this.#createDragDropHandlers()
|
||||
}
|
||||
|
||||
#dragDrop
|
||||
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["oathhammer", "item"],
|
||||
position: {
|
||||
width: 600,
|
||||
height: "auto",
|
||||
},
|
||||
form: {
|
||||
submitOnChange: true,
|
||||
},
|
||||
window: {
|
||||
resizable: true,
|
||||
},
|
||||
dragDrop: [{ dragSelector: "[data-drag]", dropSelector: null }],
|
||||
actions: {
|
||||
toggleSheet: OathHammerItemSheet.#onToggleSheet,
|
||||
editImage: OathHammerItemSheet.#onEditImage,
|
||||
},
|
||||
}
|
||||
|
||||
_sheetMode = this.constructor.SHEET_MODES.PLAY
|
||||
|
||||
get isPlayMode() {
|
||||
return this._sheetMode === this.constructor.SHEET_MODES.PLAY
|
||||
}
|
||||
|
||||
get isEditMode() {
|
||||
return this._sheetMode === this.constructor.SHEET_MODES.EDIT
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
context.fields = this.document.schema.fields
|
||||
context.systemFields = this.document.system.schema.fields
|
||||
context.item = this.document
|
||||
context.system = this.document.system
|
||||
context.source = this.document.toObject()
|
||||
context.isEditMode = this.isEditMode
|
||||
context.isPlayMode = this.isPlayMode
|
||||
context.isEditable = this.isEditable
|
||||
if (this.document.system.description !== undefined) {
|
||||
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description ?? "", { async: true })
|
||||
}
|
||||
return context
|
||||
}
|
||||
|
||||
/** @override */
|
||||
_onRender(context, options) {
|
||||
super._onRender(context, options)
|
||||
this.#dragDrop.forEach((d) => d.bind(this.element))
|
||||
}
|
||||
|
||||
#createDragDropHandlers() {
|
||||
return this.options.dragDrop.map((d) => {
|
||||
d.permissions = {
|
||||
dragstart: this._canDragStart.bind(this),
|
||||
drop: this._canDragDrop.bind(this),
|
||||
}
|
||||
d.callbacks = {
|
||||
dragstart: this._onDragStart.bind(this),
|
||||
dragover: this._onDragOver.bind(this),
|
||||
drop: this._onDrop.bind(this),
|
||||
}
|
||||
return new foundry.applications.ux.DragDrop.implementation(d)
|
||||
})
|
||||
}
|
||||
|
||||
_canDragStart(selector) {
|
||||
return this.isEditable
|
||||
}
|
||||
|
||||
_canDragDrop(selector) {
|
||||
return this.isEditable && this.document.isOwner
|
||||
}
|
||||
|
||||
_onDragStart(event) {
|
||||
if ("link" in event.target.dataset) return
|
||||
}
|
||||
|
||||
_onDragOver(event) {}
|
||||
|
||||
async _onDrop(event) {}
|
||||
|
||||
static #onToggleSheet(event, target) {
|
||||
const modes = this.constructor.SHEET_MODES
|
||||
this._sheetMode = this.isEditMode ? modes.PLAY : modes.EDIT
|
||||
this.render()
|
||||
}
|
||||
|
||||
static async #onEditImage(event, target) {
|
||||
const attr = target.dataset.edit
|
||||
const current = foundry.utils.getProperty(this.document, attr)
|
||||
const { img } = this.document.constructor.getDefaultArtwork?.(this.document.toObject()) ?? {}
|
||||
const fp = new FilePicker({
|
||||
current,
|
||||
type: "image",
|
||||
redirectToRoot: img ? [img] : [],
|
||||
callback: (path) => {
|
||||
this.document.update({ [attr]: path })
|
||||
},
|
||||
top: this.position.top + 40,
|
||||
left: this.position.left + 10,
|
||||
})
|
||||
return fp.browse()
|
||||
}
|
||||
}
|
||||
136
module/applications/sheets/character-sheet.mjs
Normal file
136
module/applications/sheets/character-sheet.mjs
Normal file
@@ -0,0 +1,136 @@
|
||||
import OathHammerActorSheet from "./base-actor-sheet.mjs"
|
||||
|
||||
export default class OathHammerCharacterSheet extends OathHammerActorSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["character"],
|
||||
position: {
|
||||
width: 972,
|
||||
height: 780,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["character-content"],
|
||||
},
|
||||
actions: {
|
||||
createWeapon: OathHammerCharacterSheet.#onCreateWeapon,
|
||||
createSpell: OathHammerCharacterSheet.#onCreateSpell,
|
||||
createMiracle: OathHammerCharacterSheet.#onCreateMiracle,
|
||||
createEquipment: OathHammerCharacterSheet.#onCreateEquipment,
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-oath-hammer/templates/actor/character-sheet.hbs",
|
||||
},
|
||||
tabs: {
|
||||
template: "templates/generic/tab-navigation.hbs",
|
||||
},
|
||||
identity: {
|
||||
template: "systems/fvtt-oath-hammer/templates/actor/character-identity.hbs",
|
||||
},
|
||||
combat: {
|
||||
template: "systems/fvtt-oath-hammer/templates/actor/character-combat.hbs",
|
||||
},
|
||||
magic: {
|
||||
template: "systems/fvtt-oath-hammer/templates/actor/character-magic.hbs",
|
||||
},
|
||||
equipment: {
|
||||
template: "systems/fvtt-oath-hammer/templates/actor/character-equipment.hbs",
|
||||
},
|
||||
notes: {
|
||||
template: "systems/fvtt-oath-hammer/templates/actor/character-notes.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
tabGroups = {
|
||||
sheet: "identity",
|
||||
}
|
||||
|
||||
#getTabs() {
|
||||
const tabs = {
|
||||
identity: { id: "identity", group: "sheet", icon: "fa-solid fa-person", label: "OATHHAMMER.Tab.Identity" },
|
||||
combat: { id: "combat", group: "sheet", icon: "fa-solid fa-swords", label: "OATHHAMMER.Tab.Combat" },
|
||||
magic: { id: "magic", group: "sheet", icon: "fa-solid fa-wand-magic-sparkles", label: "OATHHAMMER.Tab.Magic" },
|
||||
equipment: { id: "equipment", group: "sheet", icon: "fa-solid fa-backpack", label: "OATHHAMMER.Tab.Equipment" },
|
||||
notes: { id: "notes", group: "sheet", icon: "fa-solid fa-book", label: "OATHHAMMER.Tab.Notes" },
|
||||
}
|
||||
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()
|
||||
return context
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _preparePartContext(partId, context) {
|
||||
const doc = this.document
|
||||
switch (partId) {
|
||||
case "main":
|
||||
break
|
||||
case "identity":
|
||||
context.tab = context.tabs.identity
|
||||
context.abilities = doc.itemTypes.ability
|
||||
context.oaths = doc.itemTypes.oath
|
||||
break
|
||||
case "combat":
|
||||
context.tab = context.tabs.combat
|
||||
context.weapons = doc.itemTypes.weapon
|
||||
context.armors = doc.itemTypes.armor
|
||||
context.shields = doc.itemTypes.shield
|
||||
context.ammunition = doc.itemTypes.ammunition
|
||||
break
|
||||
case "magic":
|
||||
context.tab = context.tabs.magic
|
||||
context.spells = doc.itemTypes.spell
|
||||
context.miracles = doc.itemTypes.miracle
|
||||
break
|
||||
case "equipment":
|
||||
context.tab = context.tabs.equipment
|
||||
context.equipment = doc.itemTypes.equipment
|
||||
context.magicItems = doc.itemTypes["magic-item"]
|
||||
context.conditions = doc.itemTypes.condition
|
||||
break
|
||||
case "notes":
|
||||
context.tab = context.tabs.notes
|
||||
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
|
||||
}
|
||||
|
||||
async _onDrop(event) {
|
||||
if (!this.isEditable || !this.isEditMode) return
|
||||
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event)
|
||||
if (data.type === "Item") {
|
||||
const item = await fromUuid(data.uuid)
|
||||
return this._onDropItem(item)
|
||||
}
|
||||
}
|
||||
|
||||
static #onCreateWeapon(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("OATHHAMMER.NewItem.Weapon"), type: "weapon" }])
|
||||
}
|
||||
|
||||
static #onCreateSpell(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("OATHHAMMER.NewItem.Spell"), type: "spell" }])
|
||||
}
|
||||
|
||||
static #onCreateMiracle(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("OATHHAMMER.NewItem.Miracle"), type: "miracle" }])
|
||||
}
|
||||
|
||||
static #onCreateEquipment(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("OATHHAMMER.NewItem.Equipment"), type: "equipment" }])
|
||||
}
|
||||
}
|
||||
27
module/applications/sheets/condition-sheet.mjs
Normal file
27
module/applications/sheets/condition-sheet.mjs
Normal file
@@ -0,0 +1,27 @@
|
||||
import OathHammerItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class OathHammerConditionSheet extends OathHammerItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["condition"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["condition-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-oath-hammer/templates/item/condition-sheet.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
return context
|
||||
}
|
||||
}
|
||||
27
module/applications/sheets/equipment-sheet.mjs
Normal file
27
module/applications/sheets/equipment-sheet.mjs
Normal file
@@ -0,0 +1,27 @@
|
||||
import OathHammerItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class OathHammerEquipmentSheet extends OathHammerItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["equipment"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["equipment-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-oath-hammer/templates/item/equipment-sheet.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
return context
|
||||
}
|
||||
}
|
||||
27
module/applications/sheets/magic-item-sheet.mjs
Normal file
27
module/applications/sheets/magic-item-sheet.mjs
Normal file
@@ -0,0 +1,27 @@
|
||||
import OathHammerItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class OathHammerMagicItemSheet extends OathHammerItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["magic-item"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["magic-item-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-oath-hammer/templates/item/magic-item-sheet.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
return context
|
||||
}
|
||||
}
|
||||
28
module/applications/sheets/miracle-sheet.mjs
Normal file
28
module/applications/sheets/miracle-sheet.mjs
Normal file
@@ -0,0 +1,28 @@
|
||||
import OathHammerItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class OathHammerMiracleSheet extends OathHammerItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["miracle"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["miracle-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-oath-hammer/templates/item/miracle-sheet.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
context.enrichedEffect = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.effect, { async: true })
|
||||
return context
|
||||
}
|
||||
}
|
||||
83
module/applications/sheets/npc-sheet.mjs
Normal file
83
module/applications/sheets/npc-sheet.mjs
Normal file
@@ -0,0 +1,83 @@
|
||||
import OathHammerActorSheet from "./base-actor-sheet.mjs"
|
||||
|
||||
export default class OathHammerNPCSheet extends OathHammerActorSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["npc"],
|
||||
position: {
|
||||
width: 720,
|
||||
height: "auto",
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["npc-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-oath-hammer/templates/actor/npc-sheet.hbs",
|
||||
},
|
||||
tabs: {
|
||||
template: "templates/generic/tab-navigation.hbs",
|
||||
},
|
||||
combat: {
|
||||
template: "systems/fvtt-oath-hammer/templates/actor/npc-combat.hbs",
|
||||
},
|
||||
notes: {
|
||||
template: "systems/fvtt-oath-hammer/templates/actor/npc-notes.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
tabGroups = {
|
||||
sheet: "combat",
|
||||
}
|
||||
|
||||
#getTabs() {
|
||||
const tabs = {
|
||||
combat: { id: "combat", group: "sheet", icon: "fa-solid fa-swords", label: "OATHHAMMER.Tab.Combat" },
|
||||
notes: { id: "notes", group: "sheet", icon: "fa-solid fa-book", label: "OATHHAMMER.Tab.Notes" },
|
||||
}
|
||||
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()
|
||||
return context
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _preparePartContext(partId, context) {
|
||||
const doc = this.document
|
||||
switch (partId) {
|
||||
case "main":
|
||||
break
|
||||
case "combat":
|
||||
context.tab = context.tabs.combat
|
||||
context.weapons = doc.itemTypes.weapon
|
||||
break
|
||||
case "notes":
|
||||
context.tab = context.tabs.notes
|
||||
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
|
||||
}
|
||||
|
||||
async _onDrop(event) {
|
||||
if (!this.isEditable || !this.isEditMode) return
|
||||
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event)
|
||||
if (data.type === "Item") {
|
||||
const item = await fromUuid(data.uuid)
|
||||
return this._onDropItem(item)
|
||||
}
|
||||
}
|
||||
}
|
||||
29
module/applications/sheets/oath-sheet.mjs
Normal file
29
module/applications/sheets/oath-sheet.mjs
Normal file
@@ -0,0 +1,29 @@
|
||||
import OathHammerItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class OathHammerOathSheet extends OathHammerItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["oath"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["oath-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-oath-hammer/templates/item/oath-sheet.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
context.enrichedBenefit = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.benefit, { async: true })
|
||||
context.enrichedViolation = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.violation, { async: true })
|
||||
return context
|
||||
}
|
||||
}
|
||||
27
module/applications/sheets/shield-sheet.mjs
Normal file
27
module/applications/sheets/shield-sheet.mjs
Normal file
@@ -0,0 +1,27 @@
|
||||
import OathHammerItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class OathHammerShieldSheet extends OathHammerItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["shield"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["shield-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-oath-hammer/templates/item/shield-sheet.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
return context
|
||||
}
|
||||
}
|
||||
28
module/applications/sheets/spell-sheet.mjs
Normal file
28
module/applications/sheets/spell-sheet.mjs
Normal file
@@ -0,0 +1,28 @@
|
||||
import OathHammerItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class OathHammerSpellSheet extends OathHammerItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["spell"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["spell-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-oath-hammer/templates/item/spell-sheet.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
context.enrichedEffect = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.effect, { async: true })
|
||||
return context
|
||||
}
|
||||
}
|
||||
27
module/applications/sheets/weapon-sheet.mjs
Normal file
27
module/applications/sheets/weapon-sheet.mjs
Normal file
@@ -0,0 +1,27 @@
|
||||
import OathHammerItemSheet from "./base-item-sheet.mjs"
|
||||
|
||||
export default class OathHammerWeaponSheet extends OathHammerItemSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["weapon"],
|
||||
position: {
|
||||
width: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["weapon-content"],
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-oath-hammer/templates/item/weapon-sheet.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
return context
|
||||
}
|
||||
}
|
||||
194
module/config/system.mjs
Normal file
194
module/config/system.mjs
Normal file
@@ -0,0 +1,194 @@
|
||||
export const SYSTEM_ID = "fvtt-oath-hammer"
|
||||
|
||||
export const ATTRIBUTES = {
|
||||
might: { id: "might", abbrev: "M", label: "OATHHAMMER.Attribute.Might" },
|
||||
toughness: { id: "toughness", abbrev: "T", label: "OATHHAMMER.Attribute.Toughness" },
|
||||
agility: { id: "agility", abbrev: "A", label: "OATHHAMMER.Attribute.Agility" },
|
||||
willpower: { id: "willpower", abbrev: "WP", label: "OATHHAMMER.Attribute.Willpower" },
|
||||
intelligence: { id: "intelligence", abbrev: "I", label: "OATHHAMMER.Attribute.Intelligence" },
|
||||
fate: { id: "fate", abbrev: "F", label: "OATHHAMMER.Attribute.Fate" }
|
||||
}
|
||||
|
||||
export const LINEAGE_CHOICES = {
|
||||
dwarf: { id: "dwarf", label: "OATHHAMMER.Lineage.Dwarf" },
|
||||
human: { id: "human", label: "OATHHAMMER.Lineage.Human" },
|
||||
elf: { id: "elf", label: "OATHHAMMER.Lineage.Elf" },
|
||||
halfelf: { id: "halfelf", label: "OATHHAMMER.Lineage.HalfElf" },
|
||||
halfling: { id: "halfling", label: "OATHHAMMER.Lineage.Halfling" }
|
||||
}
|
||||
|
||||
export const CLASS_CHOICES = {
|
||||
fighter: { id: "fighter", label: "OATHHAMMER.Class.Fighter" },
|
||||
ranger: { id: "ranger", label: "OATHHAMMER.Class.Ranger" },
|
||||
wizard: { id: "wizard", label: "OATHHAMMER.Class.Wizard" },
|
||||
cleric: { id: "cleric", label: "OATHHAMMER.Class.Cleric" },
|
||||
rogue: { id: "rogue", label: "OATHHAMMER.Class.Rogue" },
|
||||
paladin: { id: "paladin", label: "OATHHAMMER.Class.Paladin" }
|
||||
}
|
||||
|
||||
export const OATH_TYPES = {
|
||||
"oath-of-justice": { id: "oath-of-justice", label: "OATHHAMMER.Oath.Justice" },
|
||||
"oath-of-courage": { id: "oath-of-courage", label: "OATHHAMMER.Oath.Courage" },
|
||||
"oath-of-honor": { id: "oath-of-honor", label: "OATHHAMMER.Oath.Honor" },
|
||||
"oath-of-mercy": { id: "oath-of-mercy", label: "OATHHAMMER.Oath.Mercy" },
|
||||
"oath-of-truth": { id: "oath-of-truth", label: "OATHHAMMER.Oath.Truth" },
|
||||
"oath-of-valor": { id: "oath-of-valor", label: "OATHHAMMER.Oath.Valor" },
|
||||
"oath-of-protection": { id: "oath-of-protection", label: "OATHHAMMER.Oath.Protection" },
|
||||
"oath-of-vengeance": { id: "oath-of-vengeance", label: "OATHHAMMER.Oath.Vengeance" },
|
||||
"oath-of-sacrifice": { id: "oath-of-sacrifice", label: "OATHHAMMER.Oath.Sacrifice" },
|
||||
"oath-of-faith": { id: "oath-of-faith", label: "OATHHAMMER.Oath.Faith" },
|
||||
"oath-of-service": { id: "oath-of-service", label: "OATHHAMMER.Oath.Service" },
|
||||
"oath-of-brotherhood": { id: "oath-of-brotherhood", label: "OATHHAMMER.Oath.Brotherhood" }
|
||||
}
|
||||
|
||||
export const SORCEROUS_TRADITIONS = {
|
||||
elemental: { id: "elemental", label: "OATHHAMMER.Tradition.Elemental" },
|
||||
illusionist: { id: "illusionist", label: "OATHHAMMER.Tradition.Illusionist" },
|
||||
imperial: { id: "imperial", label: "OATHHAMMER.Tradition.Imperial" },
|
||||
infernal: { id: "infernal", label: "OATHHAMMER.Tradition.Infernal" },
|
||||
runic: { id: "runic", label: "OATHHAMMER.Tradition.Runic" },
|
||||
stygian: { id: "stygian", label: "OATHHAMMER.Tradition.Stygian" }
|
||||
}
|
||||
|
||||
export const WEAPON_TYPE_CHOICES = {
|
||||
melee: "OATHHAMMER.WeaponType.Melee",
|
||||
ranged: "OATHHAMMER.WeaponType.Ranged"
|
||||
}
|
||||
|
||||
export const DAMAGE_TYPE_CHOICES = {
|
||||
slashing: "OATHHAMMER.DamageType.Slashing",
|
||||
piercing: "OATHHAMMER.DamageType.Piercing",
|
||||
bludgeoning: "OATHHAMMER.DamageType.Bludgeoning",
|
||||
fire: "OATHHAMMER.DamageType.Fire",
|
||||
cold: "OATHHAMMER.DamageType.Cold",
|
||||
lightning: "OATHHAMMER.DamageType.Lightning",
|
||||
acid: "OATHHAMMER.DamageType.Acid",
|
||||
poison: "OATHHAMMER.DamageType.Poison",
|
||||
necrotic: "OATHHAMMER.DamageType.Necrotic",
|
||||
radiant: "OATHHAMMER.DamageType.Radiant"
|
||||
}
|
||||
|
||||
export const ATTRIBUTE_BONUS_CHOICES = {
|
||||
might: "OATHHAMMER.Attribute.Might",
|
||||
agility: "OATHHAMMER.Attribute.Agility",
|
||||
none: "OATHHAMMER.Label.None"
|
||||
}
|
||||
|
||||
export const RANGE_CHOICES = {
|
||||
short: "OATHHAMMER.Range.Short",
|
||||
medium: "OATHHAMMER.Range.Medium",
|
||||
long: "OATHHAMMER.Range.Long"
|
||||
}
|
||||
|
||||
export const HANDS_CHOICES = {
|
||||
"one-handed": "OATHHAMMER.Hands.OneHanded",
|
||||
"two-handed": "OATHHAMMER.Hands.TwoHanded"
|
||||
}
|
||||
|
||||
export const CURRENCY_CHOICES = {
|
||||
gp: "OATHHAMMER.Currency.GP",
|
||||
sp: "OATHHAMMER.Currency.SP",
|
||||
cp: "OATHHAMMER.Currency.CP"
|
||||
}
|
||||
|
||||
export const ARMOR_TYPE_CHOICES = {
|
||||
light: "OATHHAMMER.ArmorType.Light",
|
||||
medium: "OATHHAMMER.ArmorType.Medium",
|
||||
heavy: "OATHHAMMER.ArmorType.Heavy"
|
||||
}
|
||||
|
||||
export const AMMO_TYPE_CHOICES = {
|
||||
arrow: "OATHHAMMER.AmmoType.Arrow",
|
||||
bolt: "OATHHAMMER.AmmoType.Bolt",
|
||||
stone: "OATHHAMMER.AmmoType.Stone",
|
||||
javelin: "OATHHAMMER.AmmoType.Javelin",
|
||||
"throwing-knife": "OATHHAMMER.AmmoType.ThrowingKnife"
|
||||
}
|
||||
|
||||
export const EQUIPMENT_TYPE_CHOICES = {
|
||||
potion: "OATHHAMMER.EquipmentType.Potion",
|
||||
container: "OATHHAMMER.EquipmentType.Container",
|
||||
tool: "OATHHAMMER.EquipmentType.Tool",
|
||||
consumable: "OATHHAMMER.EquipmentType.Consumable",
|
||||
misc: "OATHHAMMER.EquipmentType.Misc",
|
||||
"healing-supply": "OATHHAMMER.EquipmentType.HealingSupply",
|
||||
food: "OATHHAMMER.EquipmentType.Food",
|
||||
mount: "OATHHAMMER.EquipmentType.Mount",
|
||||
vehicle: "OATHHAMMER.EquipmentType.Vehicle",
|
||||
"war-machine": "OATHHAMMER.EquipmentType.WarMachine"
|
||||
}
|
||||
|
||||
export const MAGIC_ITEM_TYPE_CHOICES = {
|
||||
weapon: "OATHHAMMER.MagicItemType.Weapon",
|
||||
armor: "OATHHAMMER.MagicItemType.Armor",
|
||||
wondrous: "OATHHAMMER.MagicItemType.Wondrous",
|
||||
potion: "OATHHAMMER.MagicItemType.Potion",
|
||||
ring: "OATHHAMMER.MagicItemType.Ring",
|
||||
staff: "OATHHAMMER.MagicItemType.Staff",
|
||||
wand: "OATHHAMMER.MagicItemType.Wand",
|
||||
scroll: "OATHHAMMER.MagicItemType.Scroll",
|
||||
rod: "OATHHAMMER.MagicItemType.Rod"
|
||||
}
|
||||
|
||||
export const RARITY_CHOICES = {
|
||||
common: "OATHHAMMER.Rarity.Common",
|
||||
uncommon: "OATHHAMMER.Rarity.Uncommon",
|
||||
rare: "OATHHAMMER.Rarity.Rare",
|
||||
"very-rare": "OATHHAMMER.Rarity.VeryRare",
|
||||
legendary: "OATHHAMMER.Rarity.Legendary"
|
||||
}
|
||||
|
||||
export const ABILITY_TYPE_CHOICES = {
|
||||
"class-ability": "OATHHAMMER.AbilityType.ClassAbility",
|
||||
"lineage-trait": "OATHHAMMER.AbilityType.LineageTrait",
|
||||
feat: "OATHHAMMER.AbilityType.Feat"
|
||||
}
|
||||
|
||||
export const CONDITION_TYPE_CHOICES = {
|
||||
blinded: "OATHHAMMER.Condition.Blinded",
|
||||
deafened: "OATHHAMMER.Condition.Deafened",
|
||||
prone: "OATHHAMMER.Condition.Prone",
|
||||
stunned: "OATHHAMMER.Condition.Stunned",
|
||||
frightened: "OATHHAMMER.Condition.Frightened",
|
||||
poisoned: "OATHHAMMER.Condition.Poisoned",
|
||||
restrained: "OATHHAMMER.Condition.Restrained",
|
||||
wounded: "OATHHAMMER.Condition.Wounded",
|
||||
other: "OATHHAMMER.Condition.Other"
|
||||
}
|
||||
|
||||
export const ATTRIBUTE_RANK_CHOICES = { 1: "1", 2: "2", 3: "3", 4: "4" }
|
||||
|
||||
export const ASCII = `
|
||||
·················································
|
||||
: ___ _ _ _ _ :
|
||||
: / _ \\ __ _| |_| |__ | | | | __ _ _ __ ___ :
|
||||
: | | | / _\` | __| '_ \\ | |_| |/ _\` | '_ \` _ \\:
|
||||
: | |_| | (_| | |_| | | | | _ | (_| | | | | | |
|
||||
: \\___/ \\__,_|\\__|_| |_| |_| |_|\\__,_|_| |_| |_|
|
||||
: :
|
||||
·················································
|
||||
`
|
||||
|
||||
export const SYSTEM = {
|
||||
id: SYSTEM_ID,
|
||||
ATTRIBUTES,
|
||||
LINEAGE_CHOICES,
|
||||
CLASS_CHOICES,
|
||||
OATH_TYPES,
|
||||
SORCEROUS_TRADITIONS,
|
||||
WEAPON_TYPE_CHOICES,
|
||||
DAMAGE_TYPE_CHOICES,
|
||||
ATTRIBUTE_BONUS_CHOICES,
|
||||
RANGE_CHOICES,
|
||||
HANDS_CHOICES,
|
||||
CURRENCY_CHOICES,
|
||||
ARMOR_TYPE_CHOICES,
|
||||
AMMO_TYPE_CHOICES,
|
||||
EQUIPMENT_TYPE_CHOICES,
|
||||
MAGIC_ITEM_TYPE_CHOICES,
|
||||
RARITY_CHOICES,
|
||||
ABILITY_TYPE_CHOICES,
|
||||
CONDITION_TYPE_CHOICES,
|
||||
ATTRIBUTE_RANK_CHOICES,
|
||||
ASCII
|
||||
}
|
||||
2
module/documents/_module.mjs
Normal file
2
module/documents/_module.mjs
Normal file
@@ -0,0 +1,2 @@
|
||||
export { default as OathHammerActor } from "./actor.mjs"
|
||||
export { default as OathHammerItem } from "./item.mjs"
|
||||
35
module/documents/actor.mjs
Normal file
35
module/documents/actor.mjs
Normal file
@@ -0,0 +1,35 @@
|
||||
export default class OathHammerActor extends Actor {
|
||||
async _preCreate(data, options, user) {
|
||||
await super._preCreate(data, options, user)
|
||||
const prototypeToken = {}
|
||||
if (this.type === "character") {
|
||||
Object.assign(prototypeToken, {
|
||||
sight: { enabled: true },
|
||||
actorLink: true,
|
||||
disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY,
|
||||
})
|
||||
this.updateSource({ prototypeToken })
|
||||
}
|
||||
if (this.type === "npc") {
|
||||
Object.assign(prototypeToken, {
|
||||
sight: { enabled: false },
|
||||
actorLink: false,
|
||||
disposition: CONST.TOKEN_DISPOSITIONS.HOSTILE,
|
||||
})
|
||||
this.updateSource({ prototypeToken })
|
||||
}
|
||||
}
|
||||
|
||||
getArmorRating() {
|
||||
let rating = 0
|
||||
for (const item of this.items) {
|
||||
if (item.type === "armor" && item.system.equipped) {
|
||||
rating += Number(item.system.armorRating) || 0
|
||||
}
|
||||
if (item.type === "shield" && item.system.equipped) {
|
||||
rating += Number(item.system.shieldBonus) || 0
|
||||
}
|
||||
}
|
||||
return rating
|
||||
}
|
||||
}
|
||||
22
module/documents/item.mjs
Normal file
22
module/documents/item.mjs
Normal file
@@ -0,0 +1,22 @@
|
||||
const defaultItemImg = {
|
||||
weapon: "systems/fvtt-oath-hammer/assets/icons/icon_weapon.webp",
|
||||
armor: "systems/fvtt-oath-hammer/assets/icons/icon_armor.webp",
|
||||
shield: "systems/fvtt-oath-hammer/assets/icons/icon_shield.webp",
|
||||
ammunition: "systems/fvtt-oath-hammer/assets/icons/icon_ammunition.webp",
|
||||
equipment: "systems/fvtt-oath-hammer/assets/icons/icon_equipment.webp",
|
||||
spell: "systems/fvtt-oath-hammer/assets/icons/icon_spell.webp",
|
||||
miracle: "systems/fvtt-oath-hammer/assets/icons/icon_miracle.webp",
|
||||
"magic-item": "systems/fvtt-oath-hammer/assets/icons/icon_magic_item.webp",
|
||||
ability: "systems/fvtt-oath-hammer/assets/icons/icon_ability.webp",
|
||||
oath: "systems/fvtt-oath-hammer/assets/icons/icon_oath.webp",
|
||||
condition: "systems/fvtt-oath-hammer/assets/icons/icon_condition.webp"
|
||||
}
|
||||
|
||||
export default class OathHammerItem extends Item {
|
||||
constructor(data, context) {
|
||||
if (!data.img && defaultItemImg[data.type]) {
|
||||
data.img = defaultItemImg[data.type]
|
||||
}
|
||||
super(data, context)
|
||||
}
|
||||
}
|
||||
13
module/models/_module.mjs
Normal file
13
module/models/_module.mjs
Normal file
@@ -0,0 +1,13 @@
|
||||
export { default as OathHammerCharacter } from "./character.mjs"
|
||||
export { default as OathHammerNPC } from "./npc.mjs"
|
||||
export { default as OathHammerWeapon } from "./weapon.mjs"
|
||||
export { default as OathHammerArmor } from "./armor.mjs"
|
||||
export { default as OathHammerShield } from "./shield.mjs"
|
||||
export { default as OathHammerAmmunition } from "./ammunition.mjs"
|
||||
export { default as OathHammerEquipment } from "./equipment.mjs"
|
||||
export { default as OathHammerSpell } from "./spell.mjs"
|
||||
export { default as OathHammerMiracle } from "./miracle.mjs"
|
||||
export { default as OathHammerMagicItem } from "./magic-item.mjs"
|
||||
export { default as OathHammerAbility } from "./ability.mjs"
|
||||
export { default as OathHammerOath } from "./oath.mjs"
|
||||
export { default as OathHammerCondition } from "./condition.mjs"
|
||||
18
module/models/ability.mjs
Normal file
18
module/models/ability.mjs
Normal file
@@ -0,0 +1,18 @@
|
||||
import { SYSTEM } from "../config/system.mjs"
|
||||
|
||||
export default class OathHammerAbility extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields
|
||||
const schema = {}
|
||||
|
||||
schema.description = new fields.HTMLField({ required: true, textSearch: true })
|
||||
schema.abilityType = new fields.StringField({ required: true, initial: "class-ability", choices: SYSTEM.ABILITY_TYPE_CHOICES })
|
||||
schema.source = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
schema.prerequisite = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
schema.passiveBonus = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
|
||||
return schema
|
||||
}
|
||||
|
||||
static LOCALIZATION_PREFIXES = ["OATHHAMMER.Ability"]
|
||||
}
|
||||
20
module/models/ammunition.mjs
Normal file
20
module/models/ammunition.mjs
Normal file
@@ -0,0 +1,20 @@
|
||||
import { SYSTEM } from "../config/system.mjs"
|
||||
|
||||
export default class OathHammerAmmunition 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: true, textSearch: true })
|
||||
schema.ammoType = new fields.StringField({ required: true, initial: "arrow", choices: SYSTEM.AMMO_TYPE_CHOICES })
|
||||
schema.quantity = new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 })
|
||||
schema.properties = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
schema.cost = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.currency = new fields.StringField({ required: true, initial: "gp", choices: SYSTEM.CURRENCY_CHOICES })
|
||||
|
||||
return schema
|
||||
}
|
||||
|
||||
static LOCALIZATION_PREFIXES = ["OATHHAMMER.Ammunition"]
|
||||
}
|
||||
22
module/models/armor.mjs
Normal file
22
module/models/armor.mjs
Normal file
@@ -0,0 +1,22 @@
|
||||
import { SYSTEM } from "../config/system.mjs"
|
||||
|
||||
export default class OathHammerArmor 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: true, textSearch: true })
|
||||
schema.armorType = new fields.StringField({ required: true, initial: "light", choices: SYSTEM.ARMOR_TYPE_CHOICES })
|
||||
schema.armorRating = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.movementPenalty = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.equipped = new fields.BooleanField({ required: true, initial: false })
|
||||
schema.encumbrance = new fields.NumberField({ required: true, initial: 1, min: 0 })
|
||||
schema.cost = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.currency = new fields.StringField({ required: true, initial: "gp", choices: SYSTEM.CURRENCY_CHOICES })
|
||||
|
||||
return schema
|
||||
}
|
||||
|
||||
static LOCALIZATION_PREFIXES = ["OATHHAMMER.Armor"]
|
||||
}
|
||||
83
module/models/character.mjs
Normal file
83
module/models/character.mjs
Normal file
@@ -0,0 +1,83 @@
|
||||
import { SYSTEM } from "../config/system.mjs"
|
||||
|
||||
export default class OathHammerCharacter 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: true, textSearch: true })
|
||||
schema.notes = new fields.HTMLField({ required: true, textSearch: true })
|
||||
|
||||
const attributeField = () => new fields.SchemaField({
|
||||
rank: new fields.NumberField({ ...requiredInteger, initial: 1, min: 1, max: 4 })
|
||||
})
|
||||
schema.attributes = new fields.SchemaField({
|
||||
might: attributeField(),
|
||||
toughness: attributeField(),
|
||||
agility: attributeField(),
|
||||
willpower: attributeField(),
|
||||
intelligence: attributeField(),
|
||||
fate: attributeField()
|
||||
})
|
||||
|
||||
schema.grit = new fields.SchemaField({
|
||||
value: new fields.NumberField({ ...requiredInteger, initial: 2, min: 0 }),
|
||||
max: new fields.NumberField({ ...requiredInteger, initial: 2, min: 0 })
|
||||
})
|
||||
|
||||
schema.luck = new fields.SchemaField({
|
||||
value: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 })
|
||||
})
|
||||
|
||||
schema.arcaneStress = new fields.SchemaField({
|
||||
value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
|
||||
threshold: new fields.NumberField({ ...requiredInteger, initial: 10, min: 0 })
|
||||
})
|
||||
|
||||
schema.movement = new fields.SchemaField({
|
||||
base: new fields.NumberField({ ...requiredInteger, initial: 30, min: 0 }),
|
||||
adjusted: new fields.NumberField({ ...requiredInteger, initial: 30, min: 0 })
|
||||
})
|
||||
|
||||
schema.defense = new fields.SchemaField({
|
||||
value: new fields.NumberField({ ...requiredInteger, initial: 10, min: 0 }),
|
||||
armorRating: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
|
||||
bonus: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
})
|
||||
|
||||
schema.experience = new fields.SchemaField({
|
||||
current: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
|
||||
total: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
|
||||
level: new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 })
|
||||
})
|
||||
|
||||
schema.biodata = new fields.SchemaField({
|
||||
lineage: new fields.StringField({ required: true, initial: "dwarf", choices: SYSTEM.LINEAGE_CHOICES }),
|
||||
class: new fields.StringField({ required: true, initial: "fighter", choices: SYSTEM.CLASS_CHOICES }),
|
||||
age: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||
gender: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||
height: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||
weight: 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: "" }),
|
||||
alignment: new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
})
|
||||
|
||||
schema.currency = new fields.SchemaField({
|
||||
gold: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
|
||||
silver: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
|
||||
copper: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
})
|
||||
|
||||
return schema
|
||||
}
|
||||
|
||||
static LOCALIZATION_PREFIXES = ["OATHHAMMER.Character"]
|
||||
|
||||
prepareDerivedData() {
|
||||
super.prepareDerivedData()
|
||||
this.grit.max = this.attributes.might.rank + this.attributes.toughness.rank
|
||||
this.defense.value = 10 + this.attributes.agility.rank + this.defense.armorRating + this.defense.bonus
|
||||
}
|
||||
}
|
||||
17
module/models/condition.mjs
Normal file
17
module/models/condition.mjs
Normal file
@@ -0,0 +1,17 @@
|
||||
import { SYSTEM } from "../config/system.mjs"
|
||||
|
||||
export default class OathHammerCondition extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields
|
||||
const schema = {}
|
||||
|
||||
schema.description = new fields.HTMLField({ required: true, textSearch: true })
|
||||
schema.conditionType = new fields.StringField({ required: true, initial: "stunned", choices: SYSTEM.CONDITION_TYPE_CHOICES })
|
||||
schema.duration = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
schema.source = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
|
||||
return schema
|
||||
}
|
||||
|
||||
static LOCALIZATION_PREFIXES = ["OATHHAMMER.Condition"]
|
||||
}
|
||||
20
module/models/equipment.mjs
Normal file
20
module/models/equipment.mjs
Normal file
@@ -0,0 +1,20 @@
|
||||
import { SYSTEM } from "../config/system.mjs"
|
||||
|
||||
export default class OathHammerEquipment 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: true, textSearch: true })
|
||||
schema.itemType = new fields.StringField({ required: true, initial: "misc", choices: SYSTEM.EQUIPMENT_TYPE_CHOICES })
|
||||
schema.quantity = new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 })
|
||||
schema.weight = new fields.NumberField({ required: true, initial: 0, min: 0 })
|
||||
schema.cost = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.currency = new fields.StringField({ required: true, initial: "gp", choices: SYSTEM.CURRENCY_CHOICES })
|
||||
|
||||
return schema
|
||||
}
|
||||
|
||||
static LOCALIZATION_PREFIXES = ["OATHHAMMER.Equipment"]
|
||||
}
|
||||
26
module/models/magic-item.mjs
Normal file
26
module/models/magic-item.mjs
Normal file
@@ -0,0 +1,26 @@
|
||||
import { SYSTEM } from "../config/system.mjs"
|
||||
|
||||
export default class OathHammerMagicItem 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: true, textSearch: true })
|
||||
schema.itemType = new fields.StringField({ required: true, initial: "wondrous", choices: SYSTEM.MAGIC_ITEM_TYPE_CHOICES })
|
||||
schema.rarity = new fields.StringField({ required: true, initial: "common", choices: SYSTEM.RARITY_CHOICES })
|
||||
schema.attunement = new fields.BooleanField({ required: true, initial: false })
|
||||
schema.charges = new fields.SchemaField({
|
||||
value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
|
||||
max: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
})
|
||||
schema.recharge = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
schema.equipped = new fields.BooleanField({ required: true, initial: false })
|
||||
schema.cost = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.currency = new fields.StringField({ required: true, initial: "gp", choices: SYSTEM.CURRENCY_CHOICES })
|
||||
|
||||
return schema
|
||||
}
|
||||
|
||||
static LOCALIZATION_PREFIXES = ["OATHHAMMER.MagicItem"]
|
||||
}
|
||||
26
module/models/miracle.mjs
Normal file
26
module/models/miracle.mjs
Normal file
@@ -0,0 +1,26 @@
|
||||
import { SYSTEM } from "../config/system.mjs"
|
||||
|
||||
export default class OathHammerMiracle extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields
|
||||
const requiredInteger = { required: true, nullable: false, integer: true }
|
||||
const schema = {}
|
||||
|
||||
schema.effect = new fields.HTMLField({ required: true, textSearch: true })
|
||||
schema.piety = new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 })
|
||||
schema.castingTime = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
schema.range = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
schema.duration = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
schema.components = new fields.SchemaField({
|
||||
verbal: new fields.BooleanField(),
|
||||
somatic: new fields.BooleanField(),
|
||||
material: new fields.BooleanField()
|
||||
})
|
||||
schema.materialComponent = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
schema.savingThrow = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
|
||||
return schema
|
||||
}
|
||||
|
||||
static LOCALIZATION_PREFIXES = ["OATHHAMMER.Miracle"]
|
||||
}
|
||||
50
module/models/npc.mjs
Normal file
50
module/models/npc.mjs
Normal file
@@ -0,0 +1,50 @@
|
||||
import { SYSTEM } from "../config/system.mjs"
|
||||
|
||||
export default class OathHammerNPC 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: true, textSearch: true })
|
||||
schema.notes = new fields.HTMLField({ required: true, textSearch: true })
|
||||
|
||||
const attributeField = () => new fields.SchemaField({
|
||||
rank: new fields.NumberField({ ...requiredInteger, initial: 1, min: 1, max: 4 })
|
||||
})
|
||||
schema.attributes = new fields.SchemaField({
|
||||
might: attributeField(),
|
||||
toughness: attributeField(),
|
||||
agility: attributeField(),
|
||||
willpower: attributeField(),
|
||||
intelligence: attributeField(),
|
||||
fate: attributeField()
|
||||
})
|
||||
|
||||
schema.grit = new fields.SchemaField({
|
||||
value: new fields.NumberField({ ...requiredInteger, initial: 2, min: 0 }),
|
||||
max: new fields.NumberField({ ...requiredInteger, initial: 2, min: 0 })
|
||||
})
|
||||
|
||||
schema.defense = new fields.SchemaField({
|
||||
value: new fields.NumberField({ ...requiredInteger, initial: 10, min: 0 })
|
||||
})
|
||||
|
||||
schema.movement = new fields.SchemaField({
|
||||
base: new fields.NumberField({ ...requiredInteger, initial: 30, min: 0 })
|
||||
})
|
||||
|
||||
schema.attackBonus = new fields.NumberField({ ...requiredInteger, initial: 0 })
|
||||
schema.damageBonus = new fields.NumberField({ ...requiredInteger, initial: 0 })
|
||||
schema.challengeRating = new fields.StringField({ required: true, nullable: false, initial: "1" })
|
||||
|
||||
return schema
|
||||
}
|
||||
|
||||
static LOCALIZATION_PREFIXES = ["OATHHAMMER.NPC"]
|
||||
|
||||
prepareDerivedData() {
|
||||
super.prepareDerivedData()
|
||||
this.grit.max = this.attributes.might.rank + this.attributes.toughness.rank
|
||||
}
|
||||
}
|
||||
17
module/models/oath.mjs
Normal file
17
module/models/oath.mjs
Normal file
@@ -0,0 +1,17 @@
|
||||
import { SYSTEM } from "../config/system.mjs"
|
||||
|
||||
export default class OathHammerOath extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields
|
||||
const schema = {}
|
||||
|
||||
schema.benefit = new fields.HTMLField({ required: true, textSearch: true })
|
||||
schema.violation = new fields.HTMLField({ required: true, textSearch: true })
|
||||
schema.oathType = new fields.StringField({ required: true, initial: "oath-of-justice", choices: SYSTEM.OATH_TYPES })
|
||||
schema.violated = new fields.BooleanField({ required: true, initial: false })
|
||||
|
||||
return schema
|
||||
}
|
||||
|
||||
static LOCALIZATION_PREFIXES = ["OATHHAMMER.Oath"]
|
||||
}
|
||||
20
module/models/shield.mjs
Normal file
20
module/models/shield.mjs
Normal file
@@ -0,0 +1,20 @@
|
||||
import { SYSTEM } from "../config/system.mjs"
|
||||
|
||||
export default class OathHammerShield 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: true, textSearch: true })
|
||||
schema.shieldBonus = new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 })
|
||||
schema.equipped = new fields.BooleanField({ required: true, initial: false })
|
||||
schema.encumbrance = new fields.NumberField({ required: true, initial: 1, min: 0 })
|
||||
schema.cost = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.currency = new fields.StringField({ required: true, initial: "gp", choices: SYSTEM.CURRENCY_CHOICES })
|
||||
|
||||
return schema
|
||||
}
|
||||
|
||||
static LOCALIZATION_PREFIXES = ["OATHHAMMER.Shield"]
|
||||
}
|
||||
29
module/models/spell.mjs
Normal file
29
module/models/spell.mjs
Normal file
@@ -0,0 +1,29 @@
|
||||
import { SYSTEM } from "../config/system.mjs"
|
||||
|
||||
export default class OathHammerSpell extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields
|
||||
const requiredInteger = { required: true, nullable: false, integer: true }
|
||||
const schema = {}
|
||||
|
||||
schema.effect = new fields.HTMLField({ required: true, textSearch: true })
|
||||
schema.tradition = new fields.StringField({ required: true, initial: "elemental", choices: SYSTEM.SORCEROUS_TRADITIONS })
|
||||
schema.level = new fields.NumberField({ ...requiredInteger, initial: 1, min: 1, max: 6 })
|
||||
schema.castingTime = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
schema.range = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
schema.duration = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
schema.arcaneStress = new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 })
|
||||
schema.components = new fields.SchemaField({
|
||||
verbal: new fields.BooleanField(),
|
||||
somatic: new fields.BooleanField(),
|
||||
material: new fields.BooleanField()
|
||||
})
|
||||
schema.materialComponent = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
schema.savingThrow = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
schema.enhancement = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
|
||||
return schema
|
||||
}
|
||||
|
||||
static LOCALIZATION_PREFIXES = ["OATHHAMMER.Spell"]
|
||||
}
|
||||
26
module/models/weapon.mjs
Normal file
26
module/models/weapon.mjs
Normal file
@@ -0,0 +1,26 @@
|
||||
import { SYSTEM } from "../config/system.mjs"
|
||||
|
||||
export default class OathHammerWeapon 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: true, textSearch: true })
|
||||
schema.weaponType = new fields.StringField({ required: true, initial: "melee", choices: SYSTEM.WEAPON_TYPE_CHOICES })
|
||||
schema.damageFormula = new fields.StringField({ required: true, nullable: false, initial: "1d6" })
|
||||
schema.damageType = new fields.StringField({ required: true, initial: "slashing", choices: SYSTEM.DAMAGE_TYPE_CHOICES })
|
||||
schema.attributeBonus = new fields.StringField({ required: true, initial: "might", choices: SYSTEM.ATTRIBUTE_BONUS_CHOICES })
|
||||
schema.range = new fields.StringField({ required: true, initial: "short", choices: SYSTEM.RANGE_CHOICES })
|
||||
schema.hands = new fields.StringField({ required: true, initial: "one-handed", choices: SYSTEM.HANDS_CHOICES })
|
||||
schema.properties = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
schema.equipped = new fields.BooleanField({ required: true, initial: false })
|
||||
schema.encumbrance = new fields.NumberField({ required: true, initial: 1, min: 0 })
|
||||
schema.cost = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.currency = new fields.StringField({ required: true, initial: "gp", choices: SYSTEM.CURRENCY_CHOICES })
|
||||
|
||||
return schema
|
||||
}
|
||||
|
||||
static LOCALIZATION_PREFIXES = ["OATHHAMMER.Weapon"]
|
||||
}
|
||||
19
module/utils.mjs
Normal file
19
module/utils.mjs
Normal file
@@ -0,0 +1,19 @@
|
||||
export default class OathHammerUtils {
|
||||
static registerHandlebarsHelpers() {
|
||||
Handlebars.registerHelper("ifThen", (condition, trueVal, falseVal) => condition ? trueVal : falseVal)
|
||||
Handlebars.registerHelper("capitalize", (str) => {
|
||||
if (typeof str !== "string") return str
|
||||
return str.charAt(0).toUpperCase() + str.slice(1)
|
||||
})
|
||||
Handlebars.registerHelper("concat", (...args) => {
|
||||
args.pop() // remove handlebars options object
|
||||
return args.join("")
|
||||
})
|
||||
}
|
||||
|
||||
static async loadCompendium(packId) {
|
||||
const pack = game.packs.get(packId)
|
||||
if (!pack) return []
|
||||
return await pack.getDocuments()
|
||||
}
|
||||
}
|
||||
71
oath-hammer.mjs
Normal file
71
oath-hammer.mjs
Normal file
@@ -0,0 +1,71 @@
|
||||
import { SYSTEM } from "./module/config/system.mjs"
|
||||
globalThis.SYSTEM = SYSTEM
|
||||
|
||||
import * as models from "./module/models/_module.mjs"
|
||||
import * as documents from "./module/documents/_module.mjs"
|
||||
import * as applications from "./module/applications/_module.mjs"
|
||||
import OathHammerUtils from "./module/utils.mjs"
|
||||
|
||||
Hooks.once("init", function () {
|
||||
console.info(SYSTEM.ASCII)
|
||||
console.info("Oath Hammer | Initializing System")
|
||||
|
||||
globalThis.oathHammer = game.system
|
||||
game.system.CONST = SYSTEM
|
||||
|
||||
game.system.api = { applications, models, documents }
|
||||
|
||||
CONFIG.Actor.documentClass = documents.OathHammerActor
|
||||
CONFIG.Actor.dataModels = {
|
||||
character: models.OathHammerCharacter,
|
||||
npc: models.OathHammerNPC
|
||||
}
|
||||
|
||||
CONFIG.Item.documentClass = documents.OathHammerItem
|
||||
CONFIG.Item.dataModels = {
|
||||
weapon: models.OathHammerWeapon,
|
||||
armor: models.OathHammerArmor,
|
||||
shield: models.OathHammerShield,
|
||||
ammunition: models.OathHammerAmmunition,
|
||||
equipment: models.OathHammerEquipment,
|
||||
spell: models.OathHammerSpell,
|
||||
miracle: models.OathHammerMiracle,
|
||||
"magic-item": models.OathHammerMagicItem,
|
||||
ability: models.OathHammerAbility,
|
||||
oath: models.OathHammerOath,
|
||||
condition: models.OathHammerCondition
|
||||
}
|
||||
|
||||
foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet)
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-oath-hammer", applications.OathHammerCharacterSheet, {
|
||||
types: ["character"],
|
||||
makeDefault: true,
|
||||
label: "OATHHAMMER.Sheet.Character"
|
||||
})
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-oath-hammer", applications.OathHammerNPCSheet, {
|
||||
types: ["npc"],
|
||||
makeDefault: true,
|
||||
label: "OATHHAMMER.Sheet.NPC"
|
||||
})
|
||||
|
||||
foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet)
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerWeaponSheet, { types: ["weapon"], makeDefault: true, label: "OATHHAMMER.Sheet.Weapon" })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerArmorSheet, { types: ["armor"], makeDefault: true, label: "OATHHAMMER.Sheet.Armor" })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerShieldSheet, { types: ["shield"], makeDefault: true, label: "OATHHAMMER.Sheet.Shield" })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerAmmunitionSheet, { types: ["ammunition"], makeDefault: true, label: "OATHHAMMER.Sheet.Ammunition" })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerEquipmentSheet, { types: ["equipment"], makeDefault: true, label: "OATHHAMMER.Sheet.Equipment" })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerSpellSheet, { types: ["spell"], makeDefault: true, label: "OATHHAMMER.Sheet.Spell" })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerMiracleSheet, { types: ["miracle"], makeDefault: true, label: "OATHHAMMER.Sheet.Miracle" })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerMagicItemSheet, { types: ["magic-item"], makeDefault: true, label: "OATHHAMMER.Sheet.MagicItem" })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerAbilitySheet, { types: ["ability"], makeDefault: true, label: "OATHHAMMER.Sheet.Ability" })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerOathSheet, { types: ["oath"], makeDefault: true, label: "OATHHAMMER.Sheet.Oath" })
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerConditionSheet, { types: ["condition"], makeDefault: true, label: "OATHHAMMER.Sheet.Condition" })
|
||||
|
||||
OathHammerUtils.registerHandlebarsHelpers()
|
||||
|
||||
console.info("Oath Hammer | System Initialized")
|
||||
})
|
||||
|
||||
Hooks.once("ready", function () {
|
||||
console.info("Oath Hammer | System Ready")
|
||||
})
|
||||
39
system.json
Normal file
39
system.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"id": "fvtt-oath-hammer",
|
||||
"title": "Oath Hammer RPG",
|
||||
"description": "Oath Hammer RPG System for FoundryVTT",
|
||||
"version": "13.0.0",
|
||||
"compatibility": { "minimum": "13", "verified": "13" },
|
||||
"esmodules": ["oath-hammer.mjs"],
|
||||
"styles": ["css/fvtt-oath-hammer.css"],
|
||||
"languages": [{ "lang": "en", "name": "English", "path": "lang/en.json" }],
|
||||
"documentTypes": {
|
||||
"Actor": {
|
||||
"character": { "htmlFields": ["description", "notes"] },
|
||||
"npc": { "htmlFields": ["description", "notes"] }
|
||||
},
|
||||
"Item": {
|
||||
"weapon": { "htmlFields": ["description"] },
|
||||
"armor": { "htmlFields": ["description"] },
|
||||
"shield": { "htmlFields": ["description"] },
|
||||
"ammunition": { "htmlFields": ["description"] },
|
||||
"equipment": { "htmlFields": ["description"] },
|
||||
"spell": { "htmlFields": ["effect"] },
|
||||
"miracle": { "htmlFields": ["effect"] },
|
||||
"magic-item": { "htmlFields": ["description"] },
|
||||
"ability": { "htmlFields": ["description"] },
|
||||
"oath": { "htmlFields": ["benefit", "violation"] },
|
||||
"condition": { "htmlFields": ["description"] }
|
||||
}
|
||||
},
|
||||
"grid": { "distance": 5, "units": "ft" },
|
||||
"primaryTokenAttribute": "grit",
|
||||
"socket": true,
|
||||
"background": "systems/fvtt-oath-hammer/assets/ui/oath_hammer_paper.webp",
|
||||
"flags": {
|
||||
"hotReload": {
|
||||
"extensions": ["css", "hbs", "json"],
|
||||
"paths": ["css/", "lang/", "assets/", "templates/"]
|
||||
}
|
||||
}
|
||||
}
|
||||
99
templates/actor/character-combat.hbs
Normal file
99
templates/actor/character-combat.hbs
Normal file
@@ -0,0 +1,99 @@
|
||||
<section data-tab="combat" class="tab">
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Defense"}}</legend>
|
||||
<div class="flexrow">
|
||||
<div class="form-group">
|
||||
<label>{{localize "OATHHAMMER.Label.DefenseValue"}}</label>
|
||||
<input type="text" value="{{system.defense.value}}" disabled />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>{{localize "OATHHAMMER.Label.ArmorRating"}}</label>
|
||||
{{formInput systemFields.defense.fields.armorRating value=system.defense.armorRating name="system.defense.armorRating" disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>{{localize "OATHHAMMER.Label.DefenseBonus"}}</label>
|
||||
{{formInput systemFields.defense.fields.bonus value=system.defense.bonus name="system.defense.bonus" disabled=isPlayMode}}
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Weapons"}}
|
||||
{{#unless isPlayMode}}<a data-action="createWeapon" class="create-btn"><i class="fa-solid fa-plus"></i></a>{{/unless}}
|
||||
</legend>
|
||||
{{#if weapons.length}}
|
||||
<ul class="item-list">
|
||||
{{#each weapons as |weapon|}}
|
||||
<li class="item-entry flexrow" data-item-id="{{weapon.id}}" data-item-uuid="{{weapon.uuid}}">
|
||||
<img src="{{weapon.img}}" class="item-img" />
|
||||
<span class="item-name">{{weapon.name}}</span>
|
||||
<span class="item-detail">{{weapon.system.damageFormula}}</span>
|
||||
<span class="item-detail">{{localize weapon.system.damageType}}</span>
|
||||
{{formField weapon.system.schema.fields.equipped value=weapon.system.equipped name="system.equipped"}}
|
||||
{{#unless ../isPlayMode}}
|
||||
<a data-action="edit" data-item-id="{{weapon.id}}" data-item-uuid="{{weapon.uuid}}"><i class="fa-solid fa-edit"></i></a>
|
||||
<a data-action="delete" data-item-id="{{weapon.id}}" data-item-uuid="{{weapon.uuid}}"><i class="fa-solid fa-trash"></i></a>
|
||||
{{/unless}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{else}}
|
||||
<p class="no-items">{{localize "OATHHAMMER.Label.NoWeapons"}}</p>
|
||||
{{/if}}
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Armor"}}
|
||||
</legend>
|
||||
{{#if armors.length}}
|
||||
<ul class="item-list">
|
||||
{{#each armors as |armor|}}
|
||||
<li class="item-entry flexrow" data-item-id="{{armor.id}}" data-item-uuid="{{armor.uuid}}">
|
||||
<img src="{{armor.img}}" class="item-img" />
|
||||
<span class="item-name">{{armor.name}}</span>
|
||||
<span class="item-detail">{{localize armor.system.armorType}}</span>
|
||||
<span class="item-detail">AR: {{armor.system.armorRating}}</span>
|
||||
{{#unless ../isPlayMode}}
|
||||
<a data-action="edit" data-item-id="{{armor.id}}" data-item-uuid="{{armor.uuid}}"><i class="fa-solid fa-edit"></i></a>
|
||||
<a data-action="delete" data-item-id="{{armor.id}}" data-item-uuid="{{armor.uuid}}"><i class="fa-solid fa-trash"></i></a>
|
||||
{{/unless}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{/if}}
|
||||
{{#if shields.length}}
|
||||
<ul class="item-list">
|
||||
{{#each shields as |shield|}}
|
||||
<li class="item-entry flexrow" data-item-id="{{shield.id}}" data-item-uuid="{{shield.uuid}}">
|
||||
<img src="{{shield.img}}" class="item-img" />
|
||||
<span class="item-name">{{shield.name}}</span>
|
||||
<span class="item-detail">+{{shield.system.shieldBonus}}</span>
|
||||
{{#unless ../isPlayMode}}
|
||||
<a data-action="edit" data-item-id="{{shield.id}}" data-item-uuid="{{shield.uuid}}"><i class="fa-solid fa-edit"></i></a>
|
||||
<a data-action="delete" data-item-id="{{shield.id}}" data-item-uuid="{{shield.uuid}}"><i class="fa-solid fa-trash"></i></a>
|
||||
{{/unless}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{/if}}
|
||||
{{#unless (or armors.length shields.length)}}
|
||||
<p class="no-items">{{localize "OATHHAMMER.Label.NoArmor"}}</p>
|
||||
{{/unless}}
|
||||
</fieldset>
|
||||
{{#if ammunition.length}}
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Ammunition"}}</legend>
|
||||
<ul class="item-list">
|
||||
{{#each ammunition as |ammo|}}
|
||||
<li class="item-entry flexrow" data-item-id="{{ammo.id}}" data-item-uuid="{{ammo.uuid}}">
|
||||
<img src="{{ammo.img}}" class="item-img" />
|
||||
<span class="item-name">{{ammo.name}}</span>
|
||||
<span class="item-detail">{{ammo.system.quantity}}</span>
|
||||
{{#unless ../isPlayMode}}
|
||||
<a data-action="edit" data-item-id="{{ammo.id}}" data-item-uuid="{{ammo.uuid}}"><i class="fa-solid fa-edit"></i></a>
|
||||
<a data-action="delete" data-item-id="{{ammo.id}}" data-item-uuid="{{ammo.uuid}}"><i class="fa-solid fa-trash"></i></a>
|
||||
{{/unless}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</fieldset>
|
||||
{{/if}}
|
||||
</section>
|
||||
61
templates/actor/character-equipment.hbs
Normal file
61
templates/actor/character-equipment.hbs
Normal file
@@ -0,0 +1,61 @@
|
||||
<section data-tab="equipment" class="tab">
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Equipment"}}
|
||||
{{#unless isPlayMode}}<a data-action="createEquipment" class="create-btn"><i class="fa-solid fa-plus"></i></a>{{/unless}}
|
||||
</legend>
|
||||
{{#if equipment.length}}
|
||||
<ul class="item-list">
|
||||
{{#each equipment as |equip|}}
|
||||
<li class="item-entry flexrow" data-item-id="{{equip.id}}" data-item-uuid="{{equip.uuid}}">
|
||||
<img src="{{equip.img}}" class="item-img" />
|
||||
<span class="item-name">{{equip.name}}</span>
|
||||
<span class="item-detail">{{localize equip.system.itemType}}</span>
|
||||
<span class="item-detail">×{{equip.system.quantity}}</span>
|
||||
{{#unless ../isPlayMode}}
|
||||
<a data-action="edit" data-item-id="{{equip.id}}" data-item-uuid="{{equip.uuid}}"><i class="fa-solid fa-edit"></i></a>
|
||||
<a data-action="delete" data-item-id="{{equip.id}}" data-item-uuid="{{equip.uuid}}"><i class="fa-solid fa-trash"></i></a>
|
||||
{{/unless}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{else}}
|
||||
<p class="no-items">{{localize "OATHHAMMER.Label.NoEquipment"}}</p>
|
||||
{{/if}}
|
||||
</fieldset>
|
||||
{{#if magicItems.length}}
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.MagicItems"}}</legend>
|
||||
<ul class="item-list">
|
||||
{{#each magicItems as |mi|}}
|
||||
<li class="item-entry flexrow" data-item-id="{{mi.id}}" data-item-uuid="{{mi.uuid}}">
|
||||
<img src="{{mi.img}}" class="item-img" />
|
||||
<span class="item-name">{{mi.name}}</span>
|
||||
<span class="item-detail">{{localize mi.system.rarity}}</span>
|
||||
{{#unless ../isPlayMode}}
|
||||
<a data-action="edit" data-item-id="{{mi.id}}" data-item-uuid="{{mi.uuid}}"><i class="fa-solid fa-edit"></i></a>
|
||||
<a data-action="delete" data-item-id="{{mi.id}}" data-item-uuid="{{mi.uuid}}"><i class="fa-solid fa-trash"></i></a>
|
||||
{{/unless}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</fieldset>
|
||||
{{/if}}
|
||||
{{#if conditions.length}}
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Conditions"}}</legend>
|
||||
<ul class="item-list">
|
||||
{{#each conditions as |cond|}}
|
||||
<li class="item-entry flexrow" data-item-id="{{cond.id}}" data-item-uuid="{{cond.uuid}}">
|
||||
<img src="{{cond.img}}" class="item-img" />
|
||||
<span class="item-name">{{cond.name}}</span>
|
||||
<span class="item-detail">{{localize cond.system.conditionType}}</span>
|
||||
{{#unless ../isPlayMode}}
|
||||
<a data-action="edit" data-item-id="{{cond.id}}" data-item-uuid="{{cond.uuid}}"><i class="fa-solid fa-edit"></i></a>
|
||||
<a data-action="delete" data-item-id="{{cond.id}}" data-item-uuid="{{cond.uuid}}"><i class="fa-solid fa-trash"></i></a>
|
||||
{{/unless}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</fieldset>
|
||||
{{/if}}
|
||||
</section>
|
||||
73
templates/actor/character-identity.hbs
Normal file
73
templates/actor/character-identity.hbs
Normal file
@@ -0,0 +1,73 @@
|
||||
<section data-tab="identity" class="tab">
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Biodata"}}</legend>
|
||||
<div class="flexrow">
|
||||
<div class="biodata-col">
|
||||
{{formField systemFields.biodata.fields.lineage value=system.biodata.lineage name="system.biodata.lineage" localize=true disabled=isPlayMode}}
|
||||
{{formField systemFields.biodata.fields.class value=system.biodata.class name="system.biodata.class" localize=true disabled=isPlayMode}}
|
||||
{{formField systemFields.biodata.fields.alignment value=system.biodata.alignment name="system.biodata.alignment" disabled=isPlayMode}}
|
||||
{{formField systemFields.biodata.fields.age value=system.biodata.age name="system.biodata.age" disabled=isPlayMode}}
|
||||
{{formField systemFields.biodata.fields.gender value=system.biodata.gender name="system.biodata.gender" disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="biodata-col">
|
||||
{{formField systemFields.biodata.fields.height value=system.biodata.height name="system.biodata.height" disabled=isPlayMode}}
|
||||
{{formField systemFields.biodata.fields.weight value=system.biodata.weight name="system.biodata.weight" disabled=isPlayMode}}
|
||||
{{formField systemFields.biodata.fields.eyes value=system.biodata.eyes name="system.biodata.eyes" disabled=isPlayMode}}
|
||||
{{formField systemFields.biodata.fields.hair value=system.biodata.hair name="system.biodata.hair" disabled=isPlayMode}}
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Experience"}}</legend>
|
||||
<div class="flexrow">
|
||||
<div class="form-group">
|
||||
<label>{{localize "OATHHAMMER.Label.Level"}}</label>
|
||||
{{formInput systemFields.experience.fields.level value=system.experience.level name="system.experience.level" disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>{{localize "OATHHAMMER.Label.XP"}}</label>
|
||||
{{formInput systemFields.experience.fields.current value=system.experience.current name="system.experience.current" disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>{{localize "OATHHAMMER.Label.TotalXP"}}</label>
|
||||
{{formInput systemFields.experience.fields.total value=system.experience.total name="system.experience.total" disabled=isPlayMode}}
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
{{#if abilities.length}}
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Abilities"}}</legend>
|
||||
<ul class="item-list">
|
||||
{{#each abilities as |ability|}}
|
||||
<li class="item-entry flexrow" data-item-id="{{ability.id}}" data-item-uuid="{{ability.uuid}}">
|
||||
<img src="{{ability.img}}" class="item-img" />
|
||||
<span class="item-name">{{ability.name}}</span>
|
||||
<span class="item-type">{{localize ability.system.abilityType}}</span>
|
||||
{{#unless ../isPlayMode}}
|
||||
<a data-action="edit" data-item-id="{{ability.id}}" data-item-uuid="{{ability.uuid}}"><i class="fa-solid fa-edit"></i></a>
|
||||
<a data-action="delete" data-item-id="{{ability.id}}" data-item-uuid="{{ability.uuid}}"><i class="fa-solid fa-trash"></i></a>
|
||||
{{/unless}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</fieldset>
|
||||
{{/if}}
|
||||
{{#if oaths.length}}
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Oaths"}}</legend>
|
||||
<ul class="item-list">
|
||||
{{#each oaths as |oath|}}
|
||||
<li class="item-entry flexrow" data-item-id="{{oath.id}}" data-item-uuid="{{oath.uuid}}">
|
||||
<img src="{{oath.img}}" class="item-img" />
|
||||
<span class="item-name">{{oath.name}}</span>
|
||||
<span class="item-type">{{localize oath.system.oathType}}</span>
|
||||
{{#unless ../isPlayMode}}
|
||||
<a data-action="edit" data-item-id="{{oath.id}}" data-item-uuid="{{oath.uuid}}"><i class="fa-solid fa-edit"></i></a>
|
||||
<a data-action="delete" data-item-id="{{oath.id}}" data-item-uuid="{{oath.uuid}}"><i class="fa-solid fa-trash"></i></a>
|
||||
{{/unless}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</fieldset>
|
||||
{{/if}}
|
||||
</section>
|
||||
57
templates/actor/character-magic.hbs
Normal file
57
templates/actor/character-magic.hbs
Normal file
@@ -0,0 +1,57 @@
|
||||
<section data-tab="magic" class="tab">
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.ArcaneStress"}}</legend>
|
||||
<div class="flexrow">
|
||||
<label>{{localize "OATHHAMMER.Label.StressValue"}}</label>
|
||||
{{formInput systemFields.arcaneStress.fields.value value=system.arcaneStress.value name="system.arcaneStress.value" disabled=isPlayMode}}
|
||||
<span>/</span>
|
||||
{{formInput systemFields.arcaneStress.fields.threshold value=system.arcaneStress.threshold name="system.arcaneStress.threshold" disabled=isPlayMode}}
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Spells"}}
|
||||
{{#unless isPlayMode}}<a data-action="createSpell" class="create-btn"><i class="fa-solid fa-plus"></i></a>{{/unless}}
|
||||
</legend>
|
||||
{{#if spells.length}}
|
||||
<ul class="item-list">
|
||||
{{#each spells as |spell|}}
|
||||
<li class="item-entry flexrow" data-item-id="{{spell.id}}" data-item-uuid="{{spell.uuid}}">
|
||||
<img src="{{spell.img}}" class="item-img" />
|
||||
<span class="item-name">{{spell.name}}</span>
|
||||
<span class="item-detail">Lv.{{spell.system.level}}</span>
|
||||
<span class="item-detail">{{localize spell.system.tradition}}</span>
|
||||
<span class="item-detail">AS: {{spell.system.arcaneStress}}</span>
|
||||
{{#unless ../isPlayMode}}
|
||||
<a data-action="edit" data-item-id="{{spell.id}}" data-item-uuid="{{spell.uuid}}"><i class="fa-solid fa-edit"></i></a>
|
||||
<a data-action="delete" data-item-id="{{spell.id}}" data-item-uuid="{{spell.uuid}}"><i class="fa-solid fa-trash"></i></a>
|
||||
{{/unless}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{else}}
|
||||
<p class="no-items">{{localize "OATHHAMMER.Label.NoSpells"}}</p>
|
||||
{{/if}}
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Miracles"}}
|
||||
{{#unless isPlayMode}}<a data-action="createMiracle" class="create-btn"><i class="fa-solid fa-plus"></i></a>{{/unless}}
|
||||
</legend>
|
||||
{{#if miracles.length}}
|
||||
<ul class="item-list">
|
||||
{{#each miracles as |miracle|}}
|
||||
<li class="item-entry flexrow" data-item-id="{{miracle.id}}" data-item-uuid="{{miracle.uuid}}">
|
||||
<img src="{{miracle.img}}" class="item-img" />
|
||||
<span class="item-name">{{miracle.name}}</span>
|
||||
<span class="item-detail">Piety: {{miracle.system.piety}}</span>
|
||||
{{#unless ../isPlayMode}}
|
||||
<a data-action="edit" data-item-id="{{miracle.id}}" data-item-uuid="{{miracle.uuid}}"><i class="fa-solid fa-edit"></i></a>
|
||||
<a data-action="delete" data-item-id="{{miracle.id}}" data-item-uuid="{{miracle.uuid}}"><i class="fa-solid fa-trash"></i></a>
|
||||
{{/unless}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{else}}
|
||||
<p class="no-items">{{localize "OATHHAMMER.Label.NoMiracles"}}</p>
|
||||
{{/if}}
|
||||
</fieldset>
|
||||
</section>
|
||||
10
templates/actor/character-notes.hbs
Normal file
10
templates/actor/character-notes.hbs
Normal file
@@ -0,0 +1,10 @@
|
||||
<section data-tab="notes" class="tab">
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Description"}}</legend>
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Notes"}}</legend>
|
||||
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}}
|
||||
</fieldset>
|
||||
</section>
|
||||
76
templates/actor/character-sheet.hbs
Normal file
76
templates/actor/character-sheet.hbs
Normal file
@@ -0,0 +1,76 @@
|
||||
<section class="character-main character-main-{{ifThen isPlayMode 'play' 'edit'}}">
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Character"}}</legend>
|
||||
<div class="character-pc character-pc-{{ifThen isPlayMode 'play' 'edit'}}">
|
||||
<div class="character-left">
|
||||
<div class="character-portrait">
|
||||
<img class="actor-img" src="{{actor.img}}" data-edit="img" data-action="editImage" data-tooltip="{{actor.name}}" />
|
||||
</div>
|
||||
<fieldset>
|
||||
<div class="flexrow character-resource">
|
||||
<span class="resource-label">{{localize "OATHHAMMER.Label.Grit"}}</span>
|
||||
{{formInput systemFields.grit.fields.value value=system.grit.value name="system.grit.value" disabled=isPlayMode}}
|
||||
<span>/</span>
|
||||
{{formInput systemFields.grit.fields.max value=system.grit.max name="system.grit.max" disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="flexrow character-resource">
|
||||
<span class="resource-label">{{localize "OATHHAMMER.Label.Luck"}}</span>
|
||||
{{formInput systemFields.luck.fields.value value=system.luck.value name="system.luck.value" disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="flexrow character-resource">
|
||||
<span class="resource-label">{{localize "OATHHAMMER.Label.Defense"}}</span>
|
||||
<input type="text" value="{{system.defense.value}}" disabled class="defense-display" />
|
||||
</div>
|
||||
<div class="flexrow character-resource">
|
||||
<span class="resource-label">{{localize "OATHHAMMER.Label.Movement"}}</span>
|
||||
{{formInput systemFields.movement.fields.base value=system.movement.base name="system.movement.base" disabled=isPlayMode}}
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<div class="character-right">
|
||||
<div class="character-name">
|
||||
{{formInput fields.name value=source.name rootId=partId disabled=isPlayMode}}
|
||||
<a class="control" data-action="toggleSheet" data-tooltip="OATHHAMMER.ToggleSheet" data-tooltip-direction="UP">
|
||||
<i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i>
|
||||
</a>
|
||||
</div>
|
||||
<fieldset class="character-attributes character-attributes-{{ifThen isPlayMode 'play' 'edit'}}">
|
||||
<legend>{{localize "OATHHAMMER.Label.Attributes"}}</legend>
|
||||
<div class="attributes-grid">
|
||||
{{#each system.attributes as |attr key|}}
|
||||
<div class="attribute-box">
|
||||
<label>{{localize (concat "OATHHAMMER.Attribute." (capitalize key))}}</label>
|
||||
{{formInput (lookup ../systemFields.attributes.fields key).fields.rank value=attr.rank name=(concat "system.attributes." key ".rank") disabled=../isPlayMode}}
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="character-arcane-stress">
|
||||
<legend>{{localize "OATHHAMMER.Label.ArcaneStress"}}</legend>
|
||||
<div class="flexrow">
|
||||
{{formInput systemFields.arcaneStress.fields.value value=system.arcaneStress.value name="system.arcaneStress.value" disabled=isPlayMode}}
|
||||
<span>/</span>
|
||||
{{formInput systemFields.arcaneStress.fields.threshold value=system.arcaneStress.threshold name="system.arcaneStress.threshold" disabled=isPlayMode}}
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="currency-bar">
|
||||
<legend>{{localize "OATHHAMMER.Label.Currency"}}</legend>
|
||||
<div class="flexrow">
|
||||
<div class="currency-item">
|
||||
<label>{{localize "OATHHAMMER.Currency.GP"}}</label>
|
||||
{{formInput systemFields.currency.fields.gold value=system.currency.gold name="system.currency.gold" disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="currency-item">
|
||||
<label>{{localize "OATHHAMMER.Currency.SP"}}</label>
|
||||
{{formInput systemFields.currency.fields.silver value=system.currency.silver name="system.currency.silver" disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="currency-item">
|
||||
<label>{{localize "OATHHAMMER.Currency.CP"}}</label>
|
||||
{{formInput systemFields.currency.fields.copper value=system.currency.copper name="system.currency.copper" disabled=isPlayMode}}
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</section>
|
||||
23
templates/actor/npc-combat.hbs
Normal file
23
templates/actor/npc-combat.hbs
Normal file
@@ -0,0 +1,23 @@
|
||||
<section data-tab="combat" class="tab">
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Weapons"}}</legend>
|
||||
{{#if weapons.length}}
|
||||
<ul class="item-list">
|
||||
{{#each weapons as |weapon|}}
|
||||
<li class="item-entry flexrow" data-item-id="{{weapon.id}}" data-item-uuid="{{weapon.uuid}}">
|
||||
<img src="{{weapon.img}}" class="item-img" />
|
||||
<span class="item-name">{{weapon.name}}</span>
|
||||
<span class="item-detail">{{weapon.system.damageFormula}}</span>
|
||||
<span class="item-detail">{{localize weapon.system.damageType}}</span>
|
||||
{{#unless ../isPlayMode}}
|
||||
<a data-action="edit" data-item-id="{{weapon.id}}" data-item-uuid="{{weapon.uuid}}"><i class="fa-solid fa-edit"></i></a>
|
||||
<a data-action="delete" data-item-id="{{weapon.id}}" data-item-uuid="{{weapon.uuid}}"><i class="fa-solid fa-trash"></i></a>
|
||||
{{/unless}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{else}}
|
||||
<p class="no-items">{{localize "OATHHAMMER.Label.NoWeapons"}}</p>
|
||||
{{/if}}
|
||||
</fieldset>
|
||||
</section>
|
||||
10
templates/actor/npc-notes.hbs
Normal file
10
templates/actor/npc-notes.hbs
Normal file
@@ -0,0 +1,10 @@
|
||||
<section data-tab="notes" class="tab">
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Description"}}</legend>
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Notes"}}</legend>
|
||||
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}}
|
||||
</fieldset>
|
||||
</section>
|
||||
62
templates/actor/npc-sheet.hbs
Normal file
62
templates/actor/npc-sheet.hbs
Normal file
@@ -0,0 +1,62 @@
|
||||
<section class="npc-main npc-main-{{ifThen isPlayMode 'play' 'edit'}}">
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.NPC"}}</legend>
|
||||
<div class="npc-pc flexrow">
|
||||
<div class="npc-left">
|
||||
<img class="actor-img" src="{{actor.img}}" data-edit="img" data-action="editImage" data-tooltip="{{actor.name}}" />
|
||||
<fieldset>
|
||||
<div class="flexrow character-resource">
|
||||
<span class="resource-label">{{localize "OATHHAMMER.Label.Grit"}}</span>
|
||||
{{formInput systemFields.grit.fields.value value=system.grit.value name="system.grit.value" disabled=isPlayMode}}
|
||||
<span>/</span>
|
||||
<input type="text" value="{{system.grit.max}}" disabled />
|
||||
</div>
|
||||
<div class="flexrow character-resource">
|
||||
<span class="resource-label">{{localize "OATHHAMMER.Label.Defense"}}</span>
|
||||
{{formInput systemFields.defense.fields.value value=system.defense.value name="system.defense.value" disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="flexrow character-resource">
|
||||
<span class="resource-label">{{localize "OATHHAMMER.Label.Movement"}}</span>
|
||||
{{formInput systemFields.movement.fields.base value=system.movement.base name="system.movement.base" disabled=isPlayMode}}
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<div class="npc-right">
|
||||
<div class="character-name">
|
||||
{{formInput fields.name value=source.name rootId=partId disabled=isPlayMode}}
|
||||
<a class="control" data-action="toggleSheet" data-tooltip="OATHHAMMER.ToggleSheet" data-tooltip-direction="UP">
|
||||
<i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i>
|
||||
</a>
|
||||
</div>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Stats"}}</legend>
|
||||
<div class="flexrow">
|
||||
<div class="form-group">
|
||||
<label>{{localize "OATHHAMMER.Label.CR"}}</label>
|
||||
{{formInput systemFields.challengeRating value=system.challengeRating name="system.challengeRating" disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>{{localize "OATHHAMMER.Label.AttackBonus"}}</label>
|
||||
{{formInput systemFields.attackBonus value=system.attackBonus name="system.attackBonus" disabled=isPlayMode}}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>{{localize "OATHHAMMER.Label.DamageBonus"}}</label>
|
||||
{{formInput systemFields.damageBonus value=system.damageBonus name="system.damageBonus" disabled=isPlayMode}}
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Attributes"}}</legend>
|
||||
<div class="attributes-grid">
|
||||
{{#each system.attributes as |attr key|}}
|
||||
<div class="attribute-box">
|
||||
<label>{{localize (concat "OATHHAMMER.Attribute." (capitalize key))}}</label>
|
||||
{{formInput (lookup ../systemFields.attributes.fields key).fields.rank value=attr.rank name=(concat "system.attributes." key ".rank") disabled=../isPlayMode}}
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</section>
|
||||
18
templates/item/ability-sheet.hbs
Normal file
18
templates/item/ability-sheet.hbs
Normal file
@@ -0,0 +1,18 @@
|
||||
<section class="item-sheet-common">
|
||||
<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>
|
||||
<div class="flexrow">
|
||||
<div class="align-top">
|
||||
{{formField systemFields.abilityType value=system.abilityType name="system.abilityType" localize=true}}
|
||||
{{formField systemFields.source value=system.source name="system.source"}}
|
||||
{{formField systemFields.prerequisite value=system.prerequisite name="system.prerequisite"}}
|
||||
{{formField systemFields.passiveBonus value=system.passiveBonus name="system.passiveBonus"}}
|
||||
</div>
|
||||
</div>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Description"}}</legend>
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||
</fieldset>
|
||||
</section>
|
||||
21
templates/item/ammunition-sheet.hbs
Normal file
21
templates/item/ammunition-sheet.hbs
Normal file
@@ -0,0 +1,21 @@
|
||||
<section class="item-sheet-common">
|
||||
<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>
|
||||
<div class="flexrow">
|
||||
<div class="align-top">
|
||||
{{formField systemFields.ammoType value=system.ammoType name="system.ammoType" localize=true}}
|
||||
{{formField systemFields.quantity value=system.quantity name="system.quantity"}}
|
||||
{{formField systemFields.properties value=system.properties name="system.properties"}}
|
||||
</div>
|
||||
<div class="align-top">
|
||||
{{formField systemFields.cost value=system.cost name="system.cost"}}
|
||||
{{formField systemFields.currency value=system.currency name="system.currency" localize=true}}
|
||||
</div>
|
||||
</div>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Description"}}</legend>
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||
</fieldset>
|
||||
</section>
|
||||
23
templates/item/armor-sheet.hbs
Normal file
23
templates/item/armor-sheet.hbs
Normal file
@@ -0,0 +1,23 @@
|
||||
<section class="item-sheet-common">
|
||||
<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>
|
||||
<div class="flexrow">
|
||||
<div class="align-top">
|
||||
{{formField systemFields.armorType value=system.armorType name="system.armorType" localize=true}}
|
||||
{{formField systemFields.armorRating value=system.armorRating name="system.armorRating"}}
|
||||
{{formField systemFields.movementPenalty value=system.movementPenalty name="system.movementPenalty"}}
|
||||
</div>
|
||||
<div class="align-top">
|
||||
{{formField systemFields.equipped value=system.equipped name="system.equipped"}}
|
||||
{{formField systemFields.encumbrance value=system.encumbrance name="system.encumbrance"}}
|
||||
{{formField systemFields.cost value=system.cost name="system.cost"}}
|
||||
{{formField systemFields.currency value=system.currency name="system.currency" localize=true}}
|
||||
</div>
|
||||
</div>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Description"}}</legend>
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||
</fieldset>
|
||||
</section>
|
||||
17
templates/item/condition-sheet.hbs
Normal file
17
templates/item/condition-sheet.hbs
Normal file
@@ -0,0 +1,17 @@
|
||||
<section class="item-sheet-common">
|
||||
<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>
|
||||
<div class="flexrow">
|
||||
<div class="align-top">
|
||||
{{formField systemFields.conditionType value=system.conditionType name="system.conditionType" localize=true}}
|
||||
{{formField systemFields.duration value=system.duration name="system.duration"}}
|
||||
{{formField systemFields.source value=system.source name="system.source"}}
|
||||
</div>
|
||||
</div>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Description"}}</legend>
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||
</fieldset>
|
||||
</section>
|
||||
21
templates/item/equipment-sheet.hbs
Normal file
21
templates/item/equipment-sheet.hbs
Normal file
@@ -0,0 +1,21 @@
|
||||
<section class="item-sheet-common">
|
||||
<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>
|
||||
<div class="flexrow">
|
||||
<div class="align-top">
|
||||
{{formField systemFields.itemType value=system.itemType name="system.itemType" localize=true}}
|
||||
{{formField systemFields.quantity value=system.quantity name="system.quantity"}}
|
||||
{{formField systemFields.weight value=system.weight name="system.weight"}}
|
||||
</div>
|
||||
<div class="align-top">
|
||||
{{formField systemFields.cost value=system.cost name="system.cost"}}
|
||||
{{formField systemFields.currency value=system.currency name="system.currency" localize=true}}
|
||||
</div>
|
||||
</div>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Description"}}</legend>
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||
</fieldset>
|
||||
</section>
|
||||
28
templates/item/magic-item-sheet.hbs
Normal file
28
templates/item/magic-item-sheet.hbs
Normal file
@@ -0,0 +1,28 @@
|
||||
<section class="item-sheet-common">
|
||||
<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>
|
||||
<div class="flexrow">
|
||||
<div class="align-top">
|
||||
{{formField systemFields.itemType value=system.itemType name="system.itemType" localize=true}}
|
||||
{{formField systemFields.rarity value=system.rarity name="system.rarity" localize=true}}
|
||||
{{formField systemFields.attunement value=system.attunement name="system.attunement"}}
|
||||
{{formField systemFields.recharge value=system.recharge name="system.recharge"}}
|
||||
</div>
|
||||
<div class="align-top">
|
||||
<label>{{localize "OATHHAMMER.Label.Charges"}}</label>
|
||||
<div class="shift-right">
|
||||
{{formField systemFields.charges.fields.value value=system.charges.value name="system.charges.value"}}
|
||||
{{formField systemFields.charges.fields.max value=system.charges.max name="system.charges.max"}}
|
||||
</div>
|
||||
{{formField systemFields.equipped value=system.equipped name="system.equipped"}}
|
||||
{{formField systemFields.cost value=system.cost name="system.cost"}}
|
||||
{{formField systemFields.currency value=system.currency name="system.currency" localize=true}}
|
||||
</div>
|
||||
</div>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Description"}}</legend>
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||
</fieldset>
|
||||
</section>
|
||||
28
templates/item/miracle-sheet.hbs
Normal file
28
templates/item/miracle-sheet.hbs
Normal file
@@ -0,0 +1,28 @@
|
||||
<section class="item-sheet-common">
|
||||
<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>
|
||||
<div class="flexrow">
|
||||
<div class="align-top">
|
||||
{{formField systemFields.piety value=system.piety name="system.piety"}}
|
||||
{{formField systemFields.castingTime value=system.castingTime name="system.castingTime"}}
|
||||
{{formField systemFields.range value=system.range name="system.range"}}
|
||||
{{formField systemFields.duration value=system.duration name="system.duration"}}
|
||||
</div>
|
||||
<div class="align-top">
|
||||
<label>{{localize "OATHHAMMER.Label.Components"}}</label>
|
||||
<div class="shift-right">
|
||||
{{formField systemFields.components.fields.verbal value=system.components.verbal name="system.components.verbal"}}
|
||||
{{formField systemFields.components.fields.somatic value=system.components.somatic name="system.components.somatic"}}
|
||||
{{formField systemFields.components.fields.material value=system.components.material name="system.components.material"}}
|
||||
</div>
|
||||
{{formField systemFields.materialComponent value=system.materialComponent name="system.materialComponent"}}
|
||||
{{formField systemFields.savingThrow value=system.savingThrow name="system.savingThrow"}}
|
||||
</div>
|
||||
</div>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Effect"}}</legend>
|
||||
{{formInput systemFields.effect enriched=enrichedEffect value=system.effect name="system.effect" toggled=true}}
|
||||
</fieldset>
|
||||
</section>
|
||||
20
templates/item/oath-sheet.hbs
Normal file
20
templates/item/oath-sheet.hbs
Normal file
@@ -0,0 +1,20 @@
|
||||
<section class="item-sheet-common">
|
||||
<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>
|
||||
<div class="flexrow">
|
||||
<div class="align-top">
|
||||
{{formField systemFields.oathType value=system.oathType name="system.oathType" localize=true}}
|
||||
{{formField systemFields.violated value=system.violated name="system.violated"}}
|
||||
</div>
|
||||
</div>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Benefit"}}</legend>
|
||||
{{formInput systemFields.benefit enriched=enrichedBenefit value=system.benefit name="system.benefit" toggled=true}}
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Violation"}}</legend>
|
||||
{{formInput systemFields.violation enriched=enrichedViolation value=system.violation name="system.violation" toggled=true}}
|
||||
</fieldset>
|
||||
</section>
|
||||
21
templates/item/shield-sheet.hbs
Normal file
21
templates/item/shield-sheet.hbs
Normal file
@@ -0,0 +1,21 @@
|
||||
<section class="item-sheet-common">
|
||||
<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>
|
||||
<div class="flexrow">
|
||||
<div class="align-top">
|
||||
{{formField systemFields.shieldBonus value=system.shieldBonus name="system.shieldBonus"}}
|
||||
{{formField systemFields.equipped value=system.equipped name="system.equipped"}}
|
||||
</div>
|
||||
<div class="align-top">
|
||||
{{formField systemFields.encumbrance value=system.encumbrance name="system.encumbrance"}}
|
||||
{{formField systemFields.cost value=system.cost name="system.cost"}}
|
||||
{{formField systemFields.currency value=system.currency name="system.currency" localize=true}}
|
||||
</div>
|
||||
</div>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Description"}}</legend>
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||
</fieldset>
|
||||
</section>
|
||||
31
templates/item/spell-sheet.hbs
Normal file
31
templates/item/spell-sheet.hbs
Normal file
@@ -0,0 +1,31 @@
|
||||
<section class="item-sheet-common">
|
||||
<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>
|
||||
<div class="flexrow">
|
||||
<div class="align-top">
|
||||
{{formField systemFields.tradition value=system.tradition name="system.tradition" localize=true}}
|
||||
{{formField systemFields.level value=system.level name="system.level"}}
|
||||
{{formField systemFields.arcaneStress value=system.arcaneStress name="system.arcaneStress"}}
|
||||
{{formField systemFields.castingTime value=system.castingTime name="system.castingTime"}}
|
||||
{{formField systemFields.range value=system.range name="system.range"}}
|
||||
{{formField systemFields.duration value=system.duration name="system.duration"}}
|
||||
</div>
|
||||
<div class="align-top">
|
||||
<label>{{localize "OATHHAMMER.Label.Components"}}</label>
|
||||
<div class="shift-right">
|
||||
{{formField systemFields.components.fields.verbal value=system.components.verbal name="system.components.verbal"}}
|
||||
{{formField systemFields.components.fields.somatic value=system.components.somatic name="system.components.somatic"}}
|
||||
{{formField systemFields.components.fields.material value=system.components.material name="system.components.material"}}
|
||||
</div>
|
||||
{{formField systemFields.materialComponent value=system.materialComponent name="system.materialComponent"}}
|
||||
{{formField systemFields.savingThrow value=system.savingThrow name="system.savingThrow"}}
|
||||
{{formField systemFields.enhancement value=system.enhancement name="system.enhancement"}}
|
||||
</div>
|
||||
</div>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Effect"}}</legend>
|
||||
{{formInput systemFields.effect enriched=enrichedEffect value=system.effect name="system.effect" toggled=true}}
|
||||
</fieldset>
|
||||
</section>
|
||||
27
templates/item/weapon-sheet.hbs
Normal file
27
templates/item/weapon-sheet.hbs
Normal file
@@ -0,0 +1,27 @@
|
||||
<section class="item-sheet-common">
|
||||
<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>
|
||||
<div class="flexrow">
|
||||
<div class="align-top">
|
||||
{{formField systemFields.weaponType value=system.weaponType name="system.weaponType" localize=true}}
|
||||
{{formField systemFields.damageFormula value=system.damageFormula name="system.damageFormula"}}
|
||||
{{formField systemFields.damageType value=system.damageType name="system.damageType" localize=true}}
|
||||
{{formField systemFields.attributeBonus value=system.attributeBonus name="system.attributeBonus" localize=true}}
|
||||
{{formField systemFields.hands value=system.hands name="system.hands" localize=true}}
|
||||
{{formField systemFields.range value=system.range name="system.range" localize=true}}
|
||||
</div>
|
||||
<div class="align-top">
|
||||
{{formField systemFields.properties value=system.properties name="system.properties"}}
|
||||
{{formField systemFields.equipped value=system.equipped name="system.equipped"}}
|
||||
{{formField systemFields.encumbrance value=system.encumbrance name="system.encumbrance"}}
|
||||
{{formField systemFields.cost value=system.cost name="system.cost"}}
|
||||
{{formField systemFields.currency value=system.currency name="system.currency" localize=true}}
|
||||
</div>
|
||||
</div>
|
||||
<fieldset>
|
||||
<legend>{{localize "OATHHAMMER.Label.Description"}}</legend>
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||
</fieldset>
|
||||
</section>
|
||||
Reference in New Issue
Block a user