Compare commits
10 Commits
Author | SHA1 | Date | |
---|---|---|---|
47c2aea941 | |||
cdefecdeba | |||
61b8da8ccf | |||
dbc64121fa | |||
7118452bdf | |||
b968f99f61 | |||
feeb08331b | |||
da61e9991b | |||
5ba88a1ae5 | |||
9e4d76298c |
@@ -35,7 +35,7 @@ jobs:
|
||||
apt update -y
|
||||
apt install -y zip
|
||||
|
||||
- run: zip -r ./fvtt-cthulhu-eternal.zip system.json README.md LICENSE assets/ css/ fonts/ lang/ module/ packs-system/ templates/ cthulhu-eternal.mjs
|
||||
- run: zip -r ./fvtt-cthulhu-eternal.zip system.json README.md LICENSE assets/ css/ fonts/ lang/ module/ packs-system/ compendiums/ templates/ cthulhu-eternal.mjs
|
||||
|
||||
- name: setup go
|
||||
uses: https://github.com/actions/setup-go@v4
|
||||
|
@@ -20,7 +20,7 @@
|
||||
"entries": {
|
||||
"Pilot (Type)": {
|
||||
"name": "Pilotage (Type)",
|
||||
"description": "<pPiloter, naviguer et diriger des véhicules nautiques ou aériens. Utilisez cette compétence pour assurer la sécurité d'un navire en cas de danger, par exemple lors d'une tempête ou d'une poursuite dangereuse. Chaque type de véhicule requiert une compétence distincte : Avion, Drone, Hélicoptère, Dirigeable, Petite embarcation, Navire, etc.</p>"
|
||||
"description": "<p>Piloter, naviguer et diriger des véhicules nautiques ou aériens. Utilisez cette compétence pour assurer la sécurité d'un navire en cas de danger, par exemple lors d'une tempête ou d'une poursuite dangereuse. Chaque type de véhicule requiert une compétence distincte : Avion, Drone, Hélicoptère, Dirigeable, Petite embarcation, Navire, etc.</p>"
|
||||
},
|
||||
"Anthropology": {
|
||||
"name": "Anthropologie",
|
||||
|
@@ -170,10 +170,104 @@ i.fvtt-cthulhu-eternal {
|
||||
background-position: 0%;
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
.chat-san-request ul,
|
||||
.chat-lethal-damage ul {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.chat-san-request ul .result-lethal,
|
||||
.chat-lethal-damage ul .result-lethal {
|
||||
color: var(--color-critical-failure);
|
||||
font-family: var(--font-title);
|
||||
}
|
||||
.chat-san-request ul .san-type-buttons,
|
||||
.chat-lethal-damage ul .san-type-buttons {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin: 10px 0;
|
||||
}
|
||||
.chat-san-request ul .san-type-buttons button,
|
||||
.chat-lethal-damage ul .san-type-buttons button {
|
||||
margin: 0 2px;
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 0.9);
|
||||
border: none;
|
||||
padding: 2px 2px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s;
|
||||
min-width: 6rem;
|
||||
max-width: 6rem;
|
||||
}
|
||||
.chat-san-request ul .san-loose-buttons,
|
||||
.chat-lethal-damage ul .san-loose-buttons {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin: 10px 0;
|
||||
}
|
||||
.chat-san-request ul .san-loose-buttons button,
|
||||
.chat-lethal-damage ul .san-loose-buttons button {
|
||||
margin: 0 2px;
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
border: none;
|
||||
padding: 2px 2px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s;
|
||||
min-width: 3rem;
|
||||
max-width: 3rem;
|
||||
}
|
||||
.chat-san-request ul .result-non-lethal,
|
||||
.chat-lethal-damage ul .result-non-lethal {
|
||||
color: var(--color-failure);
|
||||
font-family: var(--font-title);
|
||||
}
|
||||
.chat-san-request ul li,
|
||||
.chat-lethal-damage ul li {
|
||||
margin: 0 10px;
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.02);
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-sheet-common label {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-sheet-common .hp-unconscious {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
color: #b4710c;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-sheet-common .hp-dead {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
color: #b40000;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-sheet-common .protagonist-luck {
|
||||
display: flex;
|
||||
min-width: 8rem;
|
||||
max-width: 8rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-sheet-common .protagonist-luck .rollable:hover,
|
||||
.fvtt-cthulhu-eternal .protagonist-sheet-common .protagonist-luck .rollable:focus {
|
||||
text-shadow: 0 0 8px var(--color-shadow-primary);
|
||||
cursor: pointer;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-sheet-common .damage-bonus {
|
||||
display: flex;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-sheet-common .damage-bonus label {
|
||||
max-width: 5rem;
|
||||
min-width: 5rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-sheet-common .damage-bonus input {
|
||||
max-width: 2rem;
|
||||
min-width: 2rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .vehicle-sheet-common label {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
@@ -200,9 +294,8 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.05);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
background: var(--color-light-1);
|
||||
--input-height: 1.4rem;
|
||||
overflow: scroll;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-content .sheet-tabs a {
|
||||
@@ -250,7 +343,7 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-content legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
@@ -258,6 +351,38 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-content .hp-unconscious {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
color: #b4710c;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-content .hp-dead {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
color: #b40000;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-content .protagonist-luck {
|
||||
display: flex;
|
||||
min-width: 8rem;
|
||||
max-width: 8rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-content .protagonist-luck .rollable:hover,
|
||||
.fvtt-cthulhu-eternal .protagonist-content .protagonist-luck .rollable:focus {
|
||||
text-shadow: 0 0 8px var(--color-shadow-primary);
|
||||
cursor: pointer;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-content .damage-bonus {
|
||||
display: flex;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-content .damage-bonus label {
|
||||
max-width: 5rem;
|
||||
min-width: 5rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-content .damage-bonus input {
|
||||
max-width: 2rem;
|
||||
min-width: 2rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .sheet-tabs {
|
||||
background-color: var(--color-light-1);
|
||||
}
|
||||
@@ -292,12 +417,9 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-left .protagonist-hp input {
|
||||
flex: none;
|
||||
width: 2rem;
|
||||
width: 4rem;
|
||||
margin-left: 4px;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-left .protagonist-hp .damage-bonus {
|
||||
font-size: calc(var(--font-size-standard) * 0.8);
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-left .protagonist-hp .hp-separator {
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
display: flex;
|
||||
@@ -372,6 +494,14 @@ i.fvtt-cthulhu-eternal {
|
||||
min-width: 6rem;
|
||||
flex-grow: 1;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san .san-helplessness,
|
||||
.fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san .san-violence {
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san .label-san-type {
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san .label-bp {
|
||||
flex-grow: 1;
|
||||
max-width: 3rem;
|
||||
@@ -693,7 +823,7 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .tab.protagonist-equipment .main-div .weapons {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
grid-template-columns: repeat(1, 1fr);
|
||||
gap: 4px;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .tab.protagonist-equipment .main-div .weapons .weapon {
|
||||
@@ -713,10 +843,24 @@ i.fvtt-cthulhu-eternal {
|
||||
min-width: 1.8rem;
|
||||
max-width: 1.8rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .tab.protagonist-equipment .main-div .weapons .weapon .damage {
|
||||
.fvtt-cthulhu-eternal .tab.protagonist-equipment .main-div .weapons .weapon .range {
|
||||
min-width: 6rem;
|
||||
max-width: 6rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .tab.protagonist-equipment .main-div .weapons .weapon .ammo {
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .tab.protagonist-equipment .main-div .weapons .weapon .lethality {
|
||||
display: flex;
|
||||
min-width: 3.2rem;
|
||||
max-width: 3.2rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .tab.protagonist-equipment .main-div .weapons .weapon .damage {
|
||||
display: flex;
|
||||
min-width: 12rem;
|
||||
max-width: 12rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .tab.protagonist-equipment .main-div .weapons .weapon .name {
|
||||
min-width: 10rem;
|
||||
max-width: 10rem;
|
||||
@@ -864,9 +1008,8 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.05);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
background: var(--color-light-1);
|
||||
--input-height: 1.4rem;
|
||||
overflow: scroll;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .vehicle-content .sheet-tabs a {
|
||||
@@ -914,7 +1057,7 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .vehicle-content legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
@@ -1121,9 +1264,8 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.05);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
background: var(--color-light-1);
|
||||
--input-height: 1.4rem;
|
||||
overflow: scroll;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .creature-content .sheet-tabs a {
|
||||
@@ -1171,7 +1313,7 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .creature-content legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
@@ -1182,6 +1324,25 @@ i.fvtt-cthulhu-eternal {
|
||||
.fvtt-cthulhu-eternal .sheet-tabs {
|
||||
background-color: var(--color-light-1);
|
||||
}
|
||||
.fvtt-cthulhu-eternal .creature-hp {
|
||||
gap: 2px;
|
||||
align-items: center;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .creature-hp .form-fields input {
|
||||
flex: none;
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
margin-left: 4px;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .creature-hp .damage-bonus {
|
||||
font-size: calc(var(--font-size-standard) * 0.8);
|
||||
}
|
||||
.fvtt-cthulhu-eternal .creature-hp .hp-separator {
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .creature-main {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
@@ -1207,24 +1368,6 @@ i.fvtt-cthulhu-eternal {
|
||||
width: auto;
|
||||
border: none;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .creature-main .creature-pc .creature-left .creature-hp {
|
||||
gap: 2px;
|
||||
align-items: center;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .creature-main .creature-pc .creature-left .creature-hp input {
|
||||
flex: none;
|
||||
width: 2rem;
|
||||
margin-left: 4px;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .creature-main .creature-pc .creature-left .creature-hp .damage-bonus {
|
||||
font-size: calc(var(--font-size-standard) * 0.8);
|
||||
}
|
||||
.fvtt-cthulhu-eternal .creature-main .creature-pc .creature-left .creature-hp .hp-separator {
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .creature-main .creature-pc .creature-left .creature-dv .form-fields,
|
||||
.fvtt-cthulhu-eternal .creature-main .creature-pc .creature-left .creature-dmax .form-fields {
|
||||
flex: none;
|
||||
@@ -1779,9 +1922,8 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.05);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
background: var(--color-light-1);
|
||||
--input-height: 1.4rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .skill-content .sheet-tabs a {
|
||||
color: rgba(32, 31, 31, 0.8);
|
||||
@@ -1828,7 +1970,7 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .skill-content legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
@@ -1873,9 +2015,8 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.05);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
background: var(--color-light-1);
|
||||
--input-height: 1.4rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .injury-content .sheet-tabs a {
|
||||
color: rgba(32, 31, 31, 0.8);
|
||||
@@ -1922,7 +2063,7 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .injury-content legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
@@ -1967,9 +2108,8 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.05);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
background: var(--color-light-1);
|
||||
--input-height: 1.4rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .weapon-content .sheet-tabs a {
|
||||
color: rgba(32, 31, 31, 0.8);
|
||||
@@ -2016,7 +2156,7 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .weapon-content legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
@@ -2046,6 +2186,24 @@ i.fvtt-cthulhu-eternal {
|
||||
margin-top: 8px;
|
||||
background-color: var(--color-light-1);
|
||||
}
|
||||
.fvtt-cthulhu-eternal .weapon-content fieldset input {
|
||||
max-width: 5rem;
|
||||
min-width: 5rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .weapon-content fieldset select {
|
||||
max-width: 14rem;
|
||||
min-width: 14rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .weapon-content fieldset input[type="checkbox"] {
|
||||
max-width: 1.5rem;
|
||||
min-width: 1.5rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .weapon-content fieldset .flexrow > *:not(:first-child) {
|
||||
margin-left: 1rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .weapon-content fieldset .damage-distance {
|
||||
margin-left: 2rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .weapon-content label {
|
||||
flex: 10%;
|
||||
}
|
||||
@@ -2053,9 +2211,8 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.05);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
background: var(--color-light-1);
|
||||
--input-height: 1.4rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .armor-content .sheet-tabs a {
|
||||
color: rgba(32, 31, 31, 0.8);
|
||||
@@ -2102,7 +2259,7 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .armor-content legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
@@ -2139,9 +2296,8 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.05);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
background: var(--color-light-1);
|
||||
--input-height: 1.4rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .motivation-content .sheet-tabs a {
|
||||
color: rgba(32, 31, 31, 0.8);
|
||||
@@ -2188,7 +2344,7 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .motivation-content legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
@@ -2225,9 +2381,8 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.05);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
background: var(--color-light-1);
|
||||
--input-height: 1.4rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .mentaldisorder-content .sheet-tabs a {
|
||||
color: rgba(32, 31, 31, 0.8);
|
||||
@@ -2274,7 +2429,7 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .mentaldisorder-content legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
@@ -2311,9 +2466,8 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.05);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
background: var(--color-light-1);
|
||||
--input-height: 1.4rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .bond-content .sheet-tabs a {
|
||||
color: rgba(32, 31, 31, 0.8);
|
||||
@@ -2360,7 +2514,7 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .bond-content legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
@@ -2413,9 +2567,8 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.05);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
background: var(--color-light-1);
|
||||
--input-height: 1.4rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .gear-content .sheet-tabs a {
|
||||
color: rgba(32, 31, 31, 0.8);
|
||||
@@ -2462,7 +2615,7 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .gear-content legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
@@ -2499,9 +2652,8 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.05);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
background: var(--color-light-1);
|
||||
--input-height: 1.4rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .arcane-content .sheet-tabs a {
|
||||
color: rgba(32, 31, 31, 0.8);
|
||||
@@ -2548,7 +2700,7 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .arcane-content legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
@@ -2585,9 +2737,8 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.05);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
background: var(--color-light-1);
|
||||
--input-height: 1.4rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .archetype-content .sheet-tabs a {
|
||||
color: rgba(32, 31, 31, 0.8);
|
||||
@@ -2634,7 +2785,7 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .archetype-content legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
@@ -2671,9 +2822,8 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.05);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
background: var(--color-light-1);
|
||||
--input-height: 1.4rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .ritual-content .sheet-tabs a {
|
||||
color: rgba(32, 31, 31, 0.8);
|
||||
@@ -2720,7 +2870,7 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .ritual-content legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
@@ -2765,9 +2915,8 @@ i.fvtt-cthulhu-eternal {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.05);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
background: var(--color-light-1);
|
||||
--input-height: 1.4rem;
|
||||
}
|
||||
.fvtt-cthulhu-eternal .tome-content .sheet-tabs a {
|
||||
color: rgba(32, 31, 31, 0.8);
|
||||
@@ -2814,7 +2963,7 @@ i.fvtt-cthulhu-eternal {
|
||||
}
|
||||
.fvtt-cthulhu-eternal .tome-content legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
@@ -2940,6 +3089,11 @@ i.fvtt-cthulhu-eternal {
|
||||
margin-left: 2rem;
|
||||
display: none;
|
||||
}
|
||||
.dice-roll .intro-chat .intro-right ul .healing-roll {
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
margin-left: 2rem;
|
||||
display: none;
|
||||
}
|
||||
.dice-roll .intro-chat .intro-right ul .roll-damage {
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
margin-left: 2rem;
|
||||
|
@@ -94,9 +94,13 @@ Hooks.once("init", function () {
|
||||
CthulhuEternalUtils.registerHandlebarsHelpers()
|
||||
CthulhuEternalUtils.setupCSSRootVariables()
|
||||
|
||||
|
||||
console.info("CTHULHU ETERNAL | System Initialized")
|
||||
})
|
||||
|
||||
Hooks.once('babele.init', (babele) => {
|
||||
babele.setSystemTranslationsDir("compendiums");
|
||||
});
|
||||
|
||||
/**
|
||||
* Perform one-time configuration of system configuration objects.
|
||||
@@ -114,22 +118,18 @@ function preLocalizeConfig() {
|
||||
Hooks.once("ready", function () {
|
||||
console.info("CTHULHU ETERNAL | Ready")
|
||||
|
||||
if (typeof Babele !== 'undefined') {
|
||||
console.info("CTHULHU ETERNAL | Babele detected, setting up translations")
|
||||
Babele.get().setSystemTranslationsDir("compendiums");
|
||||
}
|
||||
|
||||
if (game.user.isGM) {
|
||||
ClassCounter.registerUsageCount("fvtt-cthulhu-eternal", {})
|
||||
}
|
||||
preLocalizeConfig()
|
||||
|
||||
if (game.user.isGM && game.i18n.lang === 'fr' && !game.modules.find(m => m.id == "babele")) {
|
||||
if (game.user.isGM && game.i18n.lang === 'fr' && typeof Babele === 'undefined') {
|
||||
ChatMessage.create({
|
||||
user: game.user.id,
|
||||
whisper: [game.user.id],
|
||||
content: `<div ><span class="">
|
||||
<strong>ATTENTION ! Français détecte, mais le module Babele n'est pas installé !<br>Installez Babele pour bénéficier de la traduction des compendiums`
|
||||
<strong>ATTENTION ! Français détecté, mais le module Babele n'est pas installé !<br>Installez Babele pour bénéficier de la traduction des compendiums`
|
||||
})
|
||||
}
|
||||
|
||||
@@ -144,20 +144,28 @@ Hooks.on("renderChatMessageHTML", (message, html, data) => {
|
||||
$(html).find(".damage-roll").each((i, btn) => {
|
||||
btn.style.display = "inline"
|
||||
})
|
||||
$(html).find(".healing-roll").each((i, btn) => {
|
||||
btn.style.display = "inline"
|
||||
})
|
||||
$(html).find(".nudge-roll").click((event) => {
|
||||
CthulhuEternalUtils.nudgeRoll(message)
|
||||
})
|
||||
$(html).find(".damage-roll").click((event) => {
|
||||
CthulhuEternalUtils.damageRoll(message)
|
||||
let formula = $(event.currentTarget).data("roll-value")
|
||||
CthulhuEternalUtils.damageRoll(message, formula)
|
||||
})
|
||||
$(html).find(".healing-roll").click((event) => {
|
||||
CthulhuEternalUtils.healingRoll(message)
|
||||
})
|
||||
$(html).find(".san-loose").click((event) => {
|
||||
CthulhuEternalUtils.applySANLoss(message, event)
|
||||
})
|
||||
$(html).find(".san-type").click((event) => {
|
||||
CthulhuEternalUtils.applySANType(message, event)
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
// Dice-so-nice Ready
|
||||
Hooks.once("diceSoNiceReady", (dice3d) => {
|
||||
//configureDiceSoNice(dice3d)
|
||||
})
|
||||
|
||||
/**
|
||||
* Create a macro when dropping an entity on the hotbar
|
||||
* Item - open roll dialog
|
||||
|
126
lang/en.json
126
lang/en.json
@@ -57,6 +57,12 @@
|
||||
"label": "Storage"
|
||||
}
|
||||
},
|
||||
"hp": {
|
||||
"label": "HP",
|
||||
"stunned": {
|
||||
"label": "Stun."
|
||||
}
|
||||
},
|
||||
"biodata": {
|
||||
"feature": {
|
||||
"label": "Feature"
|
||||
@@ -206,7 +212,14 @@
|
||||
"UnarmedCombat": "Unarmed Combat",
|
||||
"RangedWeapons": "Ranged Weapons",
|
||||
"FirearmsBeams": "Firearms / Beam Weapons",
|
||||
"MilitaryTrainingExplosive": "Military Training (Explosives)",
|
||||
"FIELDS": {
|
||||
"isHealing": {
|
||||
"label": "Healing skill"
|
||||
},
|
||||
"healingFormula": {
|
||||
"label": "Healing PV roll"
|
||||
},
|
||||
"isAdversary": {
|
||||
"label": "Adversary"
|
||||
},
|
||||
@@ -256,7 +269,8 @@
|
||||
"rangedprimitive": "Ranged Primitive",
|
||||
"rangedthrown": "Ranged Thrown",
|
||||
"rangedfirearm": "Ranged Firearm",
|
||||
"unarmed": "Unarmed"
|
||||
"unarmed": "Unarmed",
|
||||
"rangedexplosive": "Explosive"
|
||||
},
|
||||
"WeaponSubtype": {
|
||||
"basicfirearm": "Basic Firearm",
|
||||
@@ -271,13 +285,56 @@
|
||||
"shortspray": "Short Spray",
|
||||
"longspray": "Long Spray"
|
||||
},
|
||||
"Target": {
|
||||
"Normal": "Normal",
|
||||
"Stationary": "Stationary",
|
||||
"MovingRange": "Moving or on the ground",
|
||||
"MovingFast": "Moving Fast (ie running)",
|
||||
"MovingVeryFast": "Moving Very Fast",
|
||||
"HalfCovered": "Half Covered",
|
||||
"Covered": "Full Covered"
|
||||
},
|
||||
"Range": {
|
||||
"PointBlank": "Point Blank",
|
||||
"Normal": "Normal",
|
||||
"Range2x": "Up to Range x2",
|
||||
"Range5x": "Up to Range x5"
|
||||
},
|
||||
"Visibility": {
|
||||
"Clear": "Clear",
|
||||
"Obscured": "Obscured",
|
||||
"Darkness": "Darkness"
|
||||
},
|
||||
"Attacker": {
|
||||
"Normal": "Normal",
|
||||
"Irritated": "Irritated/Annoyed",
|
||||
"Corrosive": "Deeply Annoyed"
|
||||
},
|
||||
"FIELDS": {
|
||||
"hasDamageDistance": {
|
||||
"label": "Is damage distance based?"
|
||||
},
|
||||
"hasSight": {
|
||||
"label": "Has sight"
|
||||
},
|
||||
"isStunning": {
|
||||
"label": "Is Stunning"
|
||||
},
|
||||
"hasDirectSkill": {
|
||||
"label": "Has direct skill"
|
||||
},
|
||||
"directSkillValue": {
|
||||
"label": "Direct skill value"
|
||||
},
|
||||
"ammo": {
|
||||
"label": "Ammo",
|
||||
"value": {
|
||||
"label": "Ammo value"
|
||||
},
|
||||
"max": {
|
||||
"label": "Max ammo"
|
||||
}
|
||||
},
|
||||
"state": {
|
||||
"label": "State"
|
||||
},
|
||||
@@ -495,9 +552,33 @@
|
||||
}
|
||||
},
|
||||
"Label": {
|
||||
"sanLoss5": "You suffered a SAN loss of 5+ ({value}) : you suffer a temporary insanity (Flee, Submit, Struggle or understanding the Unnatural).",
|
||||
"sanViolenceReset": "The violence SAN loss count has been reset.",
|
||||
"sanHelplessnessReset": "The helplessness SAN loss count has been reset.",
|
||||
"sanLoss": "You suffer a SAN loss",
|
||||
"selectSANType": "Select the type of SAN loss with the buttons below.",
|
||||
"Violence" : "Violence",
|
||||
"Helplessness": "Helplessness",
|
||||
"Unnatural": "Unnatural",
|
||||
"sanLossViolence": "You suffered a SAN loss due to violence : violence progress path has evolved.",
|
||||
"sanLossHelplessness": "You suffered a SAN loss due to helplessness : helplessness progress path has evolved.",
|
||||
"SANLossUnnatural": "You suffered a SAN loss due to unnatural : you may gain an Unnatural skill, check with the GM.",
|
||||
"SANLossNone": "You suffered a SAN loss, but no special consequences apply.",
|
||||
"adaptedToViolence": "You are now : Adapted to Violence.",
|
||||
"adaptedToViolenceShort": "Adapted to Violence",
|
||||
"adaptedToHelplessness": "You are now : Adapted to Helplessness.",
|
||||
"adaptedToHelplessnessShort": "Adapted to Helplessness",
|
||||
"SANTestSuccess": "You just rolled a SAN test with success, but you may still loose SAN points. Select the value of SAN loss with the buttons below.",
|
||||
"SANTestFailure": "You just rolled a SAN test with failure, you loose SAN points. Select the value of SAN loss with the buttons below.",
|
||||
"breakingPointReached": "Your SAN has reached your Breaking Point : you suffer a disorder (to be discussed with the GM). Reset the BP to its new value.",
|
||||
"rollNudge": "Roll Nudge",
|
||||
"rollDamage": "Roll Damage",
|
||||
"rollHealing": "Roll Healing",
|
||||
"result": "Result",
|
||||
"damageMessage": "Damage to apply",
|
||||
"lethalityRoll": "Lethality Roll",
|
||||
"lethalityWounded": "The target is lethally wounded",
|
||||
"lethalityNotWounded": "The target is not lethally wounded",
|
||||
"lethalityWounded": "The target is lethally wounded (HP = 0)",
|
||||
"lethalityNotWounded": "The target is not lethally wounded, apply damage",
|
||||
"damageRoll": "Damage Roll",
|
||||
"vehicle":"Vehicle",
|
||||
"Weapon": "Weapon",
|
||||
@@ -571,6 +652,11 @@
|
||||
"biography": "Biography",
|
||||
"notes": "Notes",
|
||||
"weapons": "Weapons",
|
||||
"melee": "Melee",
|
||||
"Lethality": "Lethality",
|
||||
"baseRange": "Base Range",
|
||||
"Ammo": "Ammo",
|
||||
"armorPiercing": "Armor Piercing",
|
||||
"HP": "HP",
|
||||
"SAN": "SAN",
|
||||
"current": "Current",
|
||||
@@ -622,7 +708,29 @@
|
||||
"noActorFound": "No actor found",
|
||||
"skillFailed": "Skill roll failed : the skill has been ticked for progression",
|
||||
"rollProgress": "Roll Progress",
|
||||
"skillProgress": "Skill Progress"
|
||||
"skillProgress": "Skill Progress",
|
||||
"unconscious": "Unconscious",
|
||||
"dying": "Dying",
|
||||
"stunnedWarning": "The Protagonist is stunned. He cannot act until he recovers by successfully rolling a CONx5 check.",
|
||||
"deadWarning": "The Protagonist is dead. He cannot act until he is revived by a successful First Aid roll.",
|
||||
"unconsciousWarning": "The Protagonist is unconscious. He cannot act until he has at least 3 HP.",
|
||||
"Luck": "Luck",
|
||||
"titleLuck": "Luck Roll",
|
||||
"healingRoll": "Healing Roll succes, the target gains",
|
||||
"healingRollFailure": "Healing roll failed ! The target looses",
|
||||
"killRadius": "Kill Radius",
|
||||
"killRadiusInfo": "All targets within the kill radius suffer the damage",
|
||||
"ammoUsed": "Ammo used",
|
||||
"lethalityLethal": "Lethal !!",
|
||||
"lethalityNotLethal": "Non-Lethal",
|
||||
"WPSpent": "WP Spent",
|
||||
"targetMove": "Target Move",
|
||||
"attackerState": "Attacker State",
|
||||
"targetSize": "Target Size",
|
||||
"visibility": "Visibility",
|
||||
"rangedRange": "Range",
|
||||
"aimingLastRound": "Aiming Last Round (+20)",
|
||||
"aimingWithSight": "Aiming with Sight (+20)"
|
||||
},
|
||||
"ChatMessage": {
|
||||
"exhausted": "Your protagonist is exhausted. He loses [[/r 1d6]] Willpower Points."
|
||||
@@ -643,7 +751,8 @@
|
||||
"Tooltip": {
|
||||
"sanBP": ">5 SAN lost in one roll, temporary insanity. If SAN less reaches BP = a Disorder unconscious Breaking and AND reset BP.",
|
||||
"setBP": "Set the current Breaking Point based on the current SAN value",
|
||||
"addBond": "Add a new Bond"
|
||||
"addBond": "Add a new Bond",
|
||||
"rollDamage": "Roll Damage"
|
||||
},
|
||||
"Chat": {
|
||||
},
|
||||
@@ -651,7 +760,12 @@
|
||||
"NoWeaponSkill": "No weapon skill found for this weapon. Check Weapon definition or available skills/era",
|
||||
"NoWeaponType": "No weapon type found for this weapon subtype. Check Weapon definition or available skills/era",
|
||||
"skillAlreadyExists": "Skill already exists",
|
||||
"WrongEra": "The era of the item does not match the ear of the system"
|
||||
"WrongEra": "The era of the item does not match the ear of the system",
|
||||
"NoSelectiveFireChoices": "Not enough ammo fo Selective Fire choices for this weapon.",
|
||||
"NoAmmo": "No more ammo for this weapon. ",
|
||||
"noRollDataFound": "No roll data found",
|
||||
"noActorFound": "No actor found for this item.",
|
||||
"noSanLossFound": "No SAN loss value found."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
142
lang/fr.json
142
lang/fr.json
@@ -43,6 +43,12 @@
|
||||
"damageBonus": {
|
||||
"label": "Bonus D."
|
||||
},
|
||||
"hp": {
|
||||
"label": "HP",
|
||||
"stunned": {
|
||||
"label": "Etourdi"
|
||||
}
|
||||
},
|
||||
"resources": {
|
||||
"permanentRating": {
|
||||
"label": "Degré Permanent"
|
||||
@@ -120,6 +126,18 @@
|
||||
"damageBonus": {
|
||||
"label": "Bonus D."
|
||||
},
|
||||
"hp": {
|
||||
"label": "HP",
|
||||
"value": {
|
||||
"label": "Actuel"
|
||||
},
|
||||
"max": {
|
||||
"label": "Max"
|
||||
},
|
||||
"stunned": {
|
||||
"label": "Etourdi"
|
||||
}
|
||||
},
|
||||
"resources": {
|
||||
"permanentRating": {
|
||||
"label": "Valeur permanente"
|
||||
@@ -206,7 +224,14 @@
|
||||
"UnarmedCombat": "Combat à mains nues",
|
||||
"RangedWeapons": "Armes de tir",
|
||||
"FirearmsBeams": "Armes à feu / à rayons",
|
||||
"MilitaryTrainingExplosive": "Entraînement militaire (Explosifs)",
|
||||
"FIELDS": {
|
||||
"isHealing": {
|
||||
"label": "Compétence de soin"
|
||||
},
|
||||
"healingFormula": {
|
||||
"label": "PV soignés"
|
||||
},
|
||||
"isAdversary": {
|
||||
"label": "Adversaire"
|
||||
},
|
||||
@@ -256,7 +281,8 @@
|
||||
"rangedprimitive": "A distance - Primitive",
|
||||
"rangedthrown": "A distance - Lancer",
|
||||
"rangedfirearm": "A distance - Arme à feu",
|
||||
"unarmed": "Non armé"
|
||||
"unarmed": "Non armé",
|
||||
"rangedexplosive": "Explosif"
|
||||
},
|
||||
"WeaponSubtype": {
|
||||
"basicfirearm": "Arme à feu de base",
|
||||
@@ -271,7 +297,50 @@
|
||||
"shortspray": "Barrage court",
|
||||
"longspray": "Barrage long"
|
||||
},
|
||||
"Target": {
|
||||
"Normal": "Normal",
|
||||
"Stationary": "Immobile (+20)",
|
||||
"MovingRange": "En mouvement ou au sol (-20)",
|
||||
"MovingFast": "En mouvement rapide (ie course) (-20)",
|
||||
"MovingVeryFast": "En mouvement très rapide (ie véhicule) (-40)",
|
||||
"HalfCovered": "A moitié couvert (-20)",
|
||||
"Covered": "A Couvert (-40)"
|
||||
},
|
||||
"Range": {
|
||||
"PointBlank": "Bout portant (+20)",
|
||||
"Normal": "Normal",
|
||||
"Range2x": "de portée à portée x2 (-20)",
|
||||
"Range5x": "de portéex2 à portée x5 (-40)"
|
||||
},
|
||||
"Visibility": {
|
||||
"Clear": "Normale",
|
||||
"Obscured": "Obscurci (-20)",
|
||||
"Darkness": "Obscurité (-40)"
|
||||
},
|
||||
"Attacker": {
|
||||
"Normal": "Normal",
|
||||
"Irritated": "Irrité/Gêné (-20)",
|
||||
"Corrosive": "Fortement gêné (-40)"
|
||||
},
|
||||
"FIELDS": {
|
||||
"hasDamageDistance": {
|
||||
"label": "Dégâts basés sur la distance ?"
|
||||
},
|
||||
"hasSight": {
|
||||
"label": "Lunette de visée"
|
||||
},
|
||||
"isStunning": {
|
||||
"label": "Etourdissante"
|
||||
},
|
||||
"ammo": {
|
||||
"label": "Munitions",
|
||||
"value": {
|
||||
"label": "Munitions (actuelles)"
|
||||
},
|
||||
"max": {
|
||||
"label": "Munitions (max)"
|
||||
}
|
||||
},
|
||||
"hasDirectSkill": {
|
||||
"label": "Compétence intégrée"
|
||||
},
|
||||
@@ -495,9 +564,35 @@
|
||||
}
|
||||
},
|
||||
"Label": {
|
||||
"sanLoss5": "Perte de SAN de 5+ ({value}) : vous souffrez d'une folie temporaire (Fuite, Soumission, Lutte ou compréhension de l'Inconcevable).",
|
||||
"sanViolenceReset": "Le décompte des pertes de SAN de violence a été réinitialisé.",
|
||||
"sanHelplessnessReset": "Le décompte des pertes de SAN d'impuissance a été réinitialisé.",
|
||||
"sanLoss": "Vous venez de perdre des points de SAN",
|
||||
"noSanLoss": "Aucune perte de SAN",
|
||||
"sanLossInfo": "Sélectionnez la perte de SAN à l'aide des boutons ci-dessous.",
|
||||
"selectSANType": "Sélectionnez maintenant le type SAN perdue à l'aide des boutons ci-dessous.",
|
||||
"sanLossViolence": "Vous avez subi une perte de SAN due à la violence : le chemin de progression de la violence a évolué.",
|
||||
"sanLossHelplessness": "Vous avez subi une perte de SAN due à l'impuissance : le chemin de progression de l'impuissance a évolué.",
|
||||
"SANLossUnnatural": "Vous avez subi une perte de SAN due à l'inconcevable : vous pouvez peut-être faire progresser la compétence Inconcevable, vérifiez avec le MJ.",
|
||||
"SANLossNone": "Vous avez subi une perte de SAN, mais aucune conséquence spéciale n'est appliquée.",
|
||||
"adaptedToViolence": "Vous êtes maintenant : Habitué à la violence",
|
||||
"adaptedToViolenceShort": "Habitué à la violence",
|
||||
"adaptedToHelplessness": "Vous êtes maintenant : Habitué à l'impuissance",
|
||||
"adaptedToHelplessnessShort": "Habitué à l'impuissance",
|
||||
"SANTestSuccess": "Vous venez de réussir votre jet de SAN, mais vous pouvez toujours perdre des points de SAN. Sélectionnez la valeur à l'aide des boutons ci-dessous.",
|
||||
"SANTestFailure": "Vous venez d'échouer votre test de SAN, vous perdez des points de SAN. Sélectionnez la valeur à l'aide des boutons ci-dessous.",
|
||||
"breakingPointReached": "Vous avez atteint votre Point de Rupture (PR) : vous souffrez d'un trouble mental. Vous devez re-initialiser votre PR à l'aide du bouton disponible dans la section SAN de la fiche de PJ.",
|
||||
"Violence" : "Violence",
|
||||
"Helplessness": "Impuissance",
|
||||
"Unnatural": "Inconcevable",
|
||||
"rollNudge": "Modifier le jet",
|
||||
"rollDamage": "Jet de dégâts",
|
||||
"rollHealing": "Jet de soin",
|
||||
"result": "Resultat",
|
||||
"damageMessage": "Dégâts à appliquer",
|
||||
"lethalityRoll": "Jet de Létalité",
|
||||
"lethalityWounded": "La cible est mortellement blessée",
|
||||
"lethalityNotWounded": "La cible n'est PAS mortellement blessée",
|
||||
"lethalityWounded": "La cible est mortellement blessée (PV = 0)",
|
||||
"lethalityNotWounded": "La cible n'est PAS mortellement blessée, encaissement des dégâts",
|
||||
"damageRoll": "Jet de dégâts",
|
||||
"vehicle":"Véhicule",
|
||||
"Weapon": "Arme",
|
||||
@@ -559,7 +654,7 @@
|
||||
"conLong": "Constitution",
|
||||
"chaLong": "Charisme",
|
||||
"total": "Total",
|
||||
"skills": "Compétence",
|
||||
"skills": "Compétences",
|
||||
"gear": "Matériel",
|
||||
"damage": "Dégâts",
|
||||
"resource": "Ressource",
|
||||
@@ -571,6 +666,11 @@
|
||||
"biography": "Biographie",
|
||||
"notes": "Notes",
|
||||
"weapons": "Armes",
|
||||
"melee": "Mêlée",
|
||||
"Lethality": "Létalité",
|
||||
"baseRange": "Portée de base",
|
||||
"Ammo": "Munitions",
|
||||
"armorPiercing": "Pénétration d'armure",
|
||||
"HP": "PV",
|
||||
"SAN": "SAN",
|
||||
"current": "Actuel",
|
||||
@@ -622,7 +722,29 @@
|
||||
"noActorFound": "Aucun protagoniste trouvé",
|
||||
"skillFailed": "Jet de compétence échoué : la compétence a été marquée comme pouvant progresser.",
|
||||
"rollProgress": "Jet de progression",
|
||||
"skillProgress": "Progression de compétence"
|
||||
"skillProgress": "Progression de compétence",
|
||||
"unconscious": "Inconscient",
|
||||
"dying": "Mourant",
|
||||
"stunnedWarning": "Votre protagoniste est étourdi. Il ne peut pas agir tant qu'il n'a pas réussi un test de CON x 5.",
|
||||
"deadWarning": "Votre protagoniste est mourrant. Il mourra s'il n'est pas soigné dans les {con} minutes",
|
||||
"unconsciousWarning": "Votre protagoniste est inconscient. Il ne peut pas agir tant qu'il n'a pas atteint 3 PV.",
|
||||
"Luck": "Chance",
|
||||
"titleLuck": "Jet de Chance",
|
||||
"healingRoll": "Jet de soin, PV soignés",
|
||||
"healingRollFailure": "Jet de soin échoué critique, PV perdus",
|
||||
"killRadius": "Rayon de mortlalité",
|
||||
"killRadiusInfo": "Si la cible est dans le rayon de mortalité, elle subit les dommages.",
|
||||
"ammoUsed": "Munitions utilisées",
|
||||
"lethalityLethal": "Létal !!",
|
||||
"lethalityNotLethal": "Non létal",
|
||||
"WPSpent": "PVO dépensés",
|
||||
"targetMove": "Mouvement de la cible",
|
||||
"attackerState": "Etat de l'attaquant",
|
||||
"targetSize": "Taille de la cible",
|
||||
"visibility": "Visibilité",
|
||||
"rangedRange": "Portée",
|
||||
"aimingLastRound": "Visée lors du dernier round (+20)",
|
||||
"aimingWithSight": "Visée avec lunette (+20)"
|
||||
},
|
||||
"ChatMessage": {
|
||||
"exhausted": "Votre protagoniste est épuisé. Il perd [[/r 1d6]] Points de Volonté."
|
||||
@@ -643,7 +765,8 @@
|
||||
"Tooltip": {
|
||||
"sanBP": "Perte de 5+ SAN en 1 jet : folie temporaire. SI la SAN atteint le PR : trouble mental, perte de conscience et reset du PR.",
|
||||
"setBP": "Positionner le Point de Rupture à la valeur courant de la SAN",
|
||||
"addBond": "Ajouter une Attache"
|
||||
"addBond": "Ajouter une Attache",
|
||||
"rollDamage": "Lancer les dégâts"
|
||||
},
|
||||
"Chat": {
|
||||
},
|
||||
@@ -651,7 +774,12 @@
|
||||
"NoWeaponSkill": "Aucune compétence associée n'a été trouvé pour cette arme. Vérifier la définition de l'arme ainsi que l'époque configurée.",
|
||||
"NoWeaponType": "Aucun type d'arme trouvé pour ce sous-type. Vérifier la définition de l'arme ainsi que l'époque configurée.",
|
||||
"skillAlreadyExists": "La compétence existe déja",
|
||||
"WrongEra": "L'époque de l'item ne correspond pas à celle du jeu en cours."
|
||||
"WrongEra": "L'époque de l'item ne correspond pas à celle du jeu en cours.",
|
||||
"NoSelectiveFireChoices": "Aucune option de tir sélectif n'est disponible pour cette arme : pas assez de munitions.",
|
||||
"NoAmmo": "Aucune munition disponible pour cette arme.",
|
||||
"noRollDataFound": "Aucune donnée de jet trouvée.",
|
||||
"noActorFound": "Aucun protagoniste trouvé.",
|
||||
"noSanLossFound": "Aucune valeur de perte de SAN trouvée."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
19
macro_roll.js
Normal file
19
macro_roll.js
Normal file
@@ -0,0 +1,19 @@
|
||||
let nb = 10000
|
||||
let sum = 0
|
||||
let results = []
|
||||
for (let i = 0; i < nb; i++) {
|
||||
let r = new Roll("1d100")
|
||||
await r.evaluate()
|
||||
sum += r.total
|
||||
results.push(r.total)
|
||||
}
|
||||
|
||||
let mean = sum / nb
|
||||
let variance = results.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) / nb
|
||||
let stddev = Math.sqrt(variance)
|
||||
|
||||
console.log("Average : ", mean)
|
||||
console.log("Standard deviation : ", stddev)
|
||||
console.log("Coefficient of variation : ", stddev / mean )
|
||||
console.log("Min : ", Math.min(...results))
|
||||
console.log("Max : ", Math.max(...results))
|
@@ -61,8 +61,8 @@ export default class CthulhuEternalCreatureSheet extends CthulhuEternalActorShee
|
||||
const context = await super._prepareContext()
|
||||
context.tabs = this.#getTabs()
|
||||
|
||||
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
|
||||
context.enrichedNotes = await TextEditor.enrichHTML(this.document.system.notes, { async: true })
|
||||
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
|
||||
context.enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.notes, { async: true })
|
||||
|
||||
context.tooltipsCharacteristic = {
|
||||
str: game.i18n.localize("CTHULHUETERNAL.Characteristic.Str"),
|
||||
|
@@ -78,6 +78,7 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS
|
||||
|
||||
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
|
||||
context.enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.notes, { async: true })
|
||||
context.isGM = game.user.isGM
|
||||
|
||||
context.tooltipsCharacteristic = {
|
||||
str: game.i18n.localize("CTHULHUETERNAL.Characteristic.Str"),
|
||||
@@ -199,7 +200,7 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS
|
||||
* corresponding value from the document's system and performs the roll.
|
||||
*/
|
||||
async _onRoll(event, target) {
|
||||
const rollType = $(event.currentTarget).data("roll-type")
|
||||
let rollType = $(event.currentTarget).data("roll-type")
|
||||
let item
|
||||
let li
|
||||
// Debug : console.log(">>>>", event, target, rollType)
|
||||
@@ -224,6 +225,7 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS
|
||||
case "damage":
|
||||
li = $(event.currentTarget).parents(".item");
|
||||
item = this.actor.items.get(li.data("item-id"));
|
||||
item.damageFormula = $(event.currentTarget).data("roll-value") || item.system.damage
|
||||
item.damageBonus = this.actor.system.damageBonus
|
||||
break
|
||||
case "san":
|
||||
@@ -231,6 +233,12 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS
|
||||
item.name = game.i18n.localize("CTHULHUETERNAL.Label.SAN")
|
||||
item.targetScore = item.value
|
||||
break;
|
||||
case "luck":
|
||||
item = foundry.utils.duplicate(this.actor.system.characteristics.int)
|
||||
item.name = game.i18n.localize("CTHULHUETERNAL.Label.Luck")
|
||||
item.value = 10
|
||||
item.targetScore = 50
|
||||
break;
|
||||
default:
|
||||
throw new Error(`Unknown roll type ${rollType}`)
|
||||
}
|
||||
|
@@ -18,4 +18,13 @@ export default class CthulhuEternalWeaponSheet extends CthulhuEternalItemSheet {
|
||||
template: "systems/fvtt-cthulhu-eternal/templates/weapon.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
async _prepareContext() {
|
||||
let context = await super._prepareContext()
|
||||
context.isFireArm = this.item.system.isFireArm()
|
||||
context.isRanged = this.item.system.isRanged()
|
||||
|
||||
return context
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -46,7 +46,7 @@ export const ERA_CSS = {
|
||||
modern: { primaryFont: "Georama", secondaryFont: "Georama", titleFont: "Georama", baseFontSize: "1.0rem", titleFontSize: "1.2rem",imgFilter: "brightness(0) saturate(100%) invert(92%) sepia(11%) saturate(1214%) hue-rotate(51deg) brightness(93%) contrast(86%)" },
|
||||
future: { primaryFont: "Georama", secondaryFont: "Georama", titleFont: "Seabreed", baseFontSize: "1.0rem", titleFontSize: "2.0rem",imgFilter: "invert(90%) sepia(6%) saturate(1818%) hue-rotate(152deg) brightness(91%) contrast(91%)" },
|
||||
victorian: { primaryFont: "Volkhov", secondaryFont: "Volkhov", titleFont: "Excelsior", baseFontSize: "1.0rem", titleFontSize: "1.2rem",imgFilter: "brightness(0) saturate(100%) invert(100%) sepia(59%) saturate(1894%) hue-rotate(337deg) brightness(88%) contrast(98%)" },
|
||||
coldwar: { primaryFont: "Georama", secondaryFont: "Georama", titleFont: "TopSecret", baseFontSize: "1.0rem", titleFontSize: "1.2rem",imgFilter: "brightness(0) saturate(100%) invert(81%) sepia(14%) saturate(2508%) hue-rotate(202deg) brightness(99%) contrast(105%)"},
|
||||
coldwar: { primaryFont: "Georama", secondaryFont: "Georama", titleFont: "TopSecret", baseFontSize: "0.9rem", titleFontSize: "1.2rem",imgFilter: "brightness(0) saturate(100%) invert(81%) sepia(14%) saturate(2508%) hue-rotate(202deg) brightness(99%) contrast(105%)"},
|
||||
revolution: { primaryFont: "IMFell", secondaryFont: "IMFell", titleFont: "Dominican", baseFontSize: "1.0rem",titleFontSize: "1.3rem",imgFilter: "brightness(0) saturate(100%) invert(81%) sepia(25%) saturate(386%) hue-rotate(7deg) brightness(101%) contrast(84%)" },
|
||||
medieval: { primaryFont: "Skranji", secondaryFont: "UncialAntiqua", titleFont: "Luminari", baseFontSize: "0.9rem",titleFontSize: "1.2rem",imgFilter: "brightness(0) saturate(100%) invert(93%) sepia(46%) saturate(354%) hue-rotate(321deg) brightness(93%) contrast(87%)"},
|
||||
ww2: { primaryFont: "SairaStencilOne", secondaryFont: "SairaStencilOne", titleFont: "Armalite", baseFontSize: "0.9rem",titleFontSize: "1.2rem",imgFilter: "filter: invert(44%) sepia(8%) saturate(2657%) hue-rotate(40deg) brightness(96%) contrast(75%)"},
|
||||
@@ -154,7 +154,8 @@ export const WEAPON_SKILL_MAPPING = {
|
||||
"rangedprimitive": "CTHULHUETERNAL.Skill.Firearms",
|
||||
"rangedthrown": "CTHULHUETERNAL.Skill.Athletics",
|
||||
"rangedfirearm": "CTHULHUETERNAL.Skill.Firearms",
|
||||
"unarmed": "CTHULHUETERNAL.Skill.UnarmedCombat"
|
||||
"unarmed": "CTHULHUETERNAL.Skill.UnarmedCombat",
|
||||
"rangedexplosive": "CTHULHUETERNAL.Skill.MilitaryTrainingExplosive"
|
||||
},
|
||||
victorian: {
|
||||
"melee": "CTHULHUETERNAL.Skill.Melee",
|
||||
@@ -245,6 +246,45 @@ export const WEAPON_SELECTIVE_FIRE_CHOICES = {
|
||||
"longspray": { id: "longspray", label: "CTHULHUETERNAL.Weapon.SelectiveFire.longspray", ammoUsed: 20, lethality: 10, killRadius: 3},
|
||||
}
|
||||
|
||||
// Melee stuff
|
||||
export const WEAPON_MELEE_TARGET_MOVE = {
|
||||
"normal": { id: "normal", label: "CTHULHUETERNAL.Weapon.Target.Normal", modifier: 0 },
|
||||
"stationary": { id: "stationary", label: "CTHULHUETERNAL.Weapon.Target.Stationary", modifier: 20 },
|
||||
"movingfast": { id: "movingfast", label: "CTHULHUETERNAL.Weapon.Target.MovingFast", modifier: -20 },
|
||||
"movingveryfast": { id: "movingveryfast", label: "CTHULHUETERNAL.Weapon.Target.MovingVeryFast", modifier: -40 },
|
||||
}
|
||||
// Ranged stuff
|
||||
export const WEAPON_RANGED_RANGE = {
|
||||
"pointblank": { id: "pointblank", label: "CTHULHUETERNAL.Weapon.Range.PointBlank", modifier: +20 },
|
||||
"normal": { id: "normal", label: "CTHULHUETERNAL.Weapon.Range.Normal", modifier: 0 },
|
||||
"range2x": { id: "range2x", label: "CTHULHUETERNAL.Weapon.Range.Range2x", modifier: -20 },
|
||||
"range5x": { id: "range5x", label: "CTHULHUETERNAL.Weapon.Range.Range5x", modifier: -40 }
|
||||
}
|
||||
export const WEAPON_RANGED_TARGET_MOVE = {
|
||||
"normal": { id: "normal", label: "CTHULHUETERNAL.Weapon.Target.Normal", modifier: 0 },
|
||||
"stationary": { id: "stationary", label: "CTHULHUETERNAL.Weapon.Target.Stationary", modifier: 20 },
|
||||
"movingfast": { id: "movingfast", label: "CTHULHUETERNAL.Weapon.Target.MovingRange", modifier: -20 },
|
||||
"movingveryfast": { id: "movingveryfast", label: "CTHULHUETERNAL.Weapon.Target.MovingVeryFast", modifier: -40 },
|
||||
}
|
||||
|
||||
// Common stuff
|
||||
export const WEAPON_ATTACKER_STATE = {
|
||||
"normal": { id: "normal", label: "CTHULHUETERNAL.Weapon.Target.Normal", modifier: 0 },
|
||||
"irritated": { id: "irritated", label: "CTHULHUETERNAL.Weapon.Attacker.Irritated", modifier: -20 },
|
||||
"corrosive": { id: "corrosive", label: "CTHULHUETERNAL.Weapon.Attacker.Corrosive", modifier: -40 },
|
||||
}
|
||||
export const WEAPON_TARGET_SIZE = {
|
||||
"normal": { id: "normal", label: "CTHULHUETERNAL.Weapon.Target.Normal", modifier: 0 },
|
||||
"halfcovered": { id: "halfcovered", label: "CTHULHUETERNAL.Weapon.Target.HalfCovered", modifier: -20 },
|
||||
"covered": { id: "covered", label: "CTHULHUETERNAL.Weapon.Target.Covered", modifier: -40 },
|
||||
}
|
||||
export const WEAPON_VISIBILITY = {
|
||||
"clear": { id: "clear", label: "CTHULHUETERNAL.Weapon.Visibility.Clear", modifier: 0 },
|
||||
"obscured": { id: "obscured", label: "CTHULHUETERNAL.Weapon.Visibility.Obscured", modifier: -20 },
|
||||
"darkness": { id: "darkness", label: "CTHULHUETERNAL.Weapon.Visibility.Darkness", modifier: -40 },
|
||||
}
|
||||
|
||||
|
||||
export const RITUAL_TYPES = {
|
||||
"simple": "CTHULHUETERNAL.Ritual.Simple",
|
||||
"difficult": "CTHULHUETERNAL.Ritual.Difficult",
|
||||
@@ -277,5 +317,11 @@ export const SYSTEM = {
|
||||
MULTIPLIER_CHOICES,
|
||||
ASCII,
|
||||
DAMAGE_BONUS,
|
||||
RITUAL_TYPES
|
||||
RITUAL_TYPES,
|
||||
WEAPON_MELEE_TARGET_MOVE,
|
||||
WEAPON_RANGED_RANGE,
|
||||
WEAPON_RANGED_TARGET_MOVE,
|
||||
WEAPON_ATTACKER_STATE,
|
||||
WEAPON_TARGET_SIZE,
|
||||
WEAPON_VISIBILITY
|
||||
}
|
||||
|
@@ -3,7 +3,8 @@ export const WEAPON_TYPE = {
|
||||
"rangedprimitive": "CTHULHUETERNAL.Weapon.WeaponType.rangedprimitive",
|
||||
"rangedthrown": "CTHULHUETERNAL.Weapon.WeaponType.rangedthrown",
|
||||
"rangedfirearm": "CTHULHUETERNAL.Weapon.WeaponType.rangedfirearm",
|
||||
"unarmed": "CTHULHUETERNAL.Weapon.WeaponType.unarmed"
|
||||
"unarmed": "CTHULHUETERNAL.Weapon.WeaponType.unarmed",
|
||||
"rangedexplosive": "CTHULHUETERNAL.Weapon.WeaponType.rangedexplosive",
|
||||
}
|
||||
|
||||
export const WEAPON_SUBTYPE = {
|
||||
|
@@ -31,7 +31,6 @@ export default class CthulhuEternalActor extends Actor {
|
||||
}
|
||||
|
||||
_onUpdate(changed, options, userId) {
|
||||
// DEBUG : console.log("CthulhuEternalActor.update", changed, options, userId)
|
||||
if (changed?.system?.wp?.exhausted) {
|
||||
ChatMessage.create({
|
||||
user: userId,
|
||||
|
@@ -105,6 +105,121 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
$(".resource-score").text(`${rating} (${options.percentScore}%)`)
|
||||
}
|
||||
|
||||
static buildSelectiveFireChoices(actor, weapon) {
|
||||
if (!weapon?.system?.hasSelectiveFire) {
|
||||
return {}
|
||||
}
|
||||
// Loop thru the selective fire choices and build the choices object when enough ammo in the weapon
|
||||
let choices = {}
|
||||
for (let choiceKey in SYSTEM.WEAPON_SELECTIVE_FIRE_CHOICES) {
|
||||
let choice = SYSTEM.WEAPON_SELECTIVE_FIRE_CHOICES[choiceKey]
|
||||
if (choice.ammoUsed > 0 && choice.ammoUsed <= weapon.system.ammo.value) {
|
||||
choices[choiceKey] = choice
|
||||
}
|
||||
}
|
||||
// If no choices available, warn the user
|
||||
if (Object.keys(choices).length === 0) {
|
||||
ui.notifications.warn(game.i18n.localize("CTHULHUETERNAL.Notifications.NoSelectiveFireChoices"))
|
||||
return {}
|
||||
}
|
||||
return choices
|
||||
}
|
||||
|
||||
static async processWeaponDamage(actor, options) {
|
||||
let isLethal = false
|
||||
let weapon = options.rollItem
|
||||
let ammoUsed = weapon.system.weaponType.includes("ranged") ? 1 : 0 // Default ammo used for melee weapons is 0
|
||||
options.isNudge = false
|
||||
|
||||
// Selective fire management
|
||||
if (weapon.system.hasSelectiveFire && weapon.selectiveFireChoice) {
|
||||
let choice = SYSTEM.WEAPON_SELECTIVE_FIRE_CHOICES[weapon.selectiveFireChoice]
|
||||
if (choice.ammoUsed > weapon.system.ammo.value) {
|
||||
ui.notifications.warn(game.i18n.localize("CTHULHUETERNAL.Notifications.NoAmmo"))
|
||||
return
|
||||
}
|
||||
weapon.system.selectiveFireChoiceLabel = choice.label // Store the choice in the weapon
|
||||
weapon.system.lethality = choice.lethality // Override lethality
|
||||
weapon.system.killRadius = choice.killRadius // Override kill radius
|
||||
ammoUsed = choice.ammoUsed // Override ammo used
|
||||
}
|
||||
|
||||
ammoUsed = Number(ammoUsed)
|
||||
|
||||
if (weapon.system.lethality > 0) {
|
||||
let lethalityRoll = new Roll("1d100")
|
||||
await lethalityRoll.evaluate()
|
||||
let lethalScore = (options?.previousResultType === "successCritical") ? weapon.system.lethality * 2 : weapon.system.lethality
|
||||
isLethal = (lethalityRoll.total <= lethalScore)
|
||||
if (ammoUsed > 0) {
|
||||
await actor.updateEmbeddedDocuments("Item", [{
|
||||
_id: weapon._id,
|
||||
"system.ammo.value": Math.max(0, weapon.system.ammo.value - ammoUsed)
|
||||
}])
|
||||
}
|
||||
let wounds = Math.floor(lethalityRoll.total / 10) + (lethalityRoll.total % 10)
|
||||
let msgData = {
|
||||
weapon,
|
||||
wounds,
|
||||
lethalScore,
|
||||
isLethal,
|
||||
ammoUsed,
|
||||
rollResult: lethalityRoll.total,
|
||||
}
|
||||
let flavor = await foundry.applications.handlebars.renderTemplate("systems/fvtt-cthulhu-eternal/templates/chat-lethal-damage.hbs", msgData)
|
||||
ChatMessage.create({
|
||||
user: game.user.id,
|
||||
content: flavor,
|
||||
speaker: ChatMessage.getSpeaker({ actor: actor }),
|
||||
}, { rollMode: options.rollMode, create: true })
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// If the weapon is not lethal, we can proceed with the regular damage roll
|
||||
let formula = weapon?.damageFormula || weapon.system.damage || "0"
|
||||
if (weapon.system.applyDamageBonus) {
|
||||
formula += ` + ${actor.system?.damageBonus}`
|
||||
}
|
||||
if (options?.previousResultType === "successCritical") {
|
||||
formula = `( ${formula} ) * 2`
|
||||
}
|
||||
if (ammoUsed > 0) {
|
||||
await actor.updateEmbeddedDocuments("Item", [{
|
||||
_id: weapon._id,
|
||||
"system.ammo.value": Math.max(0, weapon.system.ammo.value - ammoUsed)
|
||||
}])
|
||||
}
|
||||
console.log("Weapon damage formula", formula, weapon, ammoUsed)
|
||||
let damageRoll = new Roll(formula)
|
||||
await damageRoll.evaluate()
|
||||
let msgData = {
|
||||
weapon,
|
||||
formula,
|
||||
ammoUsed,
|
||||
rollResult: damageRoll.total,
|
||||
}
|
||||
let flavor = await foundry.applications.handlebars.renderTemplate("systems/fvtt-cthulhu-eternal/templates/chat-regular-damage.hbs", msgData)
|
||||
ChatMessage.create({
|
||||
user: game.user.id,
|
||||
content: flavor,
|
||||
speaker: ChatMessage.getSpeaker({ actor: actor }),
|
||||
}, { rollMode: options.rollMode, create: true })
|
||||
}
|
||||
|
||||
|
||||
static computeWeaponModifiers(rollData) {
|
||||
let modifier = SYSTEM.WEAPON_MELEE_TARGET_MOVE[rollData.meleeTargetMoveChoice]?.modifier || 0
|
||||
modifier += SYSTEM.WEAPON_RANGED_RANGE[rollData.rangedRangeChoice]?.modifier || 0
|
||||
modifier += SYSTEM.WEAPON_RANGED_TARGET_MOVE[rollData.rangedTargetMoveChoice]?.modifier || 0
|
||||
modifier += SYSTEM.WEAPON_VISIBILITY[rollData.visibilityChoice]?.modifier || 0
|
||||
modifier += SYSTEM.WEAPON_ATTACKER_STATE[rollData.attackerStateChoice]?.modifier || 0
|
||||
modifier += SYSTEM.WEAPON_TARGET_SIZE[rollData.targetSizeChoice]?.modifier || 0
|
||||
modifier += (rollData.aimingLastRound) ? 20 : 0
|
||||
modifier += (rollData.aimingWithSight) ? 20 : 0
|
||||
return modifier
|
||||
}
|
||||
|
||||
/**
|
||||
* Prompt the user with a dialog to configure and execute a roll.
|
||||
*
|
||||
@@ -124,12 +239,18 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
let hasModifier = true
|
||||
let hasMultiplier = false
|
||||
options.isNudge = true
|
||||
let actor = game.actors.get(options.actorId)
|
||||
|
||||
switch (options.rollType) {
|
||||
case "skill":
|
||||
console.log(options.rollItem)
|
||||
options.initialScore = options.rollItem.system.computeScore()
|
||||
break
|
||||
case "luck":
|
||||
hasModifier = false
|
||||
options.initialScore = 50
|
||||
options.isNudge = false
|
||||
break
|
||||
case "san":
|
||||
case "char":
|
||||
options.initialScore = options.rollItem.targetScore
|
||||
@@ -146,40 +267,8 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
options.rollItem.enableStorage = true
|
||||
options.isNudge = false
|
||||
break
|
||||
case "damage": {
|
||||
let isLethal = false
|
||||
options.isNudge = false
|
||||
if (options.rollItem.system.lethality > 0) {
|
||||
let lethalityRoll = new Roll("1d100")
|
||||
await lethalityRoll.evaluate()
|
||||
let lethalScore = (options?.previousResultType === "successCritical") ? options.rollItem.system.lethality * 2 : options.rollItem.system.lethality
|
||||
isLethal = (lethalityRoll.total <= lethalScore)
|
||||
let flavor = `${options.rollItem.name} - <strong> ${game.i18n.localize("CTHULHUETERNAL.Label.lethalityRoll")} </strong> : ${lethalityRoll.total} <= ${lethalScore} => ${isLethal}`
|
||||
if (isLethal) {
|
||||
flavor += `<br> ${game.i18n.localize("CTHULHUETERNAL.Label.lethalityWounded")} => HP = 0`
|
||||
} else {
|
||||
let wounds = Math.floor(lethalityRoll.total / 10) + (lethalityRoll.total % 10)
|
||||
flavor += `<br> ${game.i18n.localize("CTHULHUETERNAL.Label.lethalityNotWounded")} => HP loss = ${wounds}`
|
||||
}
|
||||
await lethalityRoll.toMessage({
|
||||
flavor: flavor
|
||||
});
|
||||
return
|
||||
}
|
||||
let formula = options.rollItem.system.damage
|
||||
if (options.rollItem.system.weaponType === "melee" || options.rollItem.system.weaponType === "unarmed") {
|
||||
formula += ` + ${options.rollItem.damageBonus}`
|
||||
}
|
||||
if (options?.previousResultType === "successCritical") {
|
||||
formula = `( ${formula} ) * 2`
|
||||
}
|
||||
let damageRoll = new Roll(formula)
|
||||
await damageRoll.evaluate()
|
||||
await damageRoll.toMessage({
|
||||
flavor: `${options.rollItem.name} - ${game.i18n.localize("CTHULHUETERNAL.Label.damageRoll")}`
|
||||
});
|
||||
}
|
||||
return
|
||||
case "damage":
|
||||
return this.processWeaponDamage(actor, options)
|
||||
case "weapon": {
|
||||
let era = game.settings.get("fvtt-cthulhu-eternal", "settings-era")
|
||||
if (era !== options.rollItem.system.settings) {
|
||||
@@ -192,6 +281,11 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
console.log("WP Not found", era, options.rollItem.system.weaponType)
|
||||
return
|
||||
}
|
||||
// Check if the weapon has enouth ammo in case of a firearm
|
||||
if (options.rollItem.system.isFireArm() && options.rollItem.system.ammo.value <= 0) {
|
||||
ui.notifications.warn(game.i18n.localize("CTHULHUETERNAL.Notifications.NoAmmo"))
|
||||
return
|
||||
}
|
||||
options.weapon = options.rollItem
|
||||
if (options.rollItem.system.hasDirectSkill) {
|
||||
let skillName = options.rollItem.name
|
||||
@@ -199,7 +293,6 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
options.initialScore = options.weapon.system.directSkillValue
|
||||
} else {
|
||||
let skillName = game.i18n.localize(SYSTEM.WEAPON_SKILL_MAPPING[era][options.rollItem.system.weaponType])
|
||||
let actor = game.actors.get(options.actorId)
|
||||
options.rollItem = actor.items.find(i => i.type === "skill" && i.name.toLowerCase() === skillName.toLowerCase())
|
||||
if (!options.rollItem) {
|
||||
ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Notifications.NoWeaponSkill"))
|
||||
@@ -215,7 +308,6 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
break
|
||||
}
|
||||
|
||||
console.log("Roll options", CONFIG.Dice.rollModes);
|
||||
const rollModes = foundry.utils.duplicate(CONFIG.Dice.rollModes); //Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)]))
|
||||
const fieldRollMode = new foundry.data.fields.StringField({
|
||||
choices: rollModes,
|
||||
@@ -225,7 +317,7 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
|
||||
const choiceModifier = SYSTEM.MODIFIER_CHOICES
|
||||
const choiceMultiplier = SYSTEM.MULTIPLIER_CHOICES
|
||||
const choiceSelectiveFire = SYSTEM.WEAPON_SELECTIVE_FIRE_CHOICES
|
||||
const choiceSelectiveFire = this.buildSelectiveFireChoices(actor, options?.weapon)
|
||||
|
||||
let modifier = "+0"
|
||||
let multiplier = "5"
|
||||
@@ -234,6 +326,7 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
rollType: options.rollType,
|
||||
rollItem: foundry.utils.duplicate(options.rollItem), // Object only, no class
|
||||
weapon: options?.weapon,
|
||||
isRangedWeapon: options?.weapon?.system?.isRanged(),
|
||||
initialScore: options.initialScore,
|
||||
targetScore: options.initialScore,
|
||||
isLowWP: options.isLowWP,
|
||||
@@ -247,12 +340,26 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
choiceModifier,
|
||||
choiceMultiplier,
|
||||
choiceSelectiveFire,
|
||||
choiceMeleeTargetMove: SYSTEM.WEAPON_MELEE_TARGET_MOVE,
|
||||
choiceRangedRange: SYSTEM.WEAPON_RANGED_RANGE,
|
||||
choiceRangedTargetMove: SYSTEM.WEAPON_RANGED_TARGET_MOVE,
|
||||
choiceVisibility: SYSTEM.WEAPON_VISIBILITY,
|
||||
choiceAttackerState: SYSTEM.WEAPON_ATTACKER_STATE,
|
||||
choiceTargetSize: SYSTEM.WEAPON_TARGET_SIZE,
|
||||
selectiveFireChoice: "shortburst",
|
||||
meleeTargetMoveChoice: "normal",
|
||||
rangedRangeChoice: "normal",
|
||||
rangedTargetMoveChoice: "normal",
|
||||
visibilityChoice: "clear",
|
||||
attackerStateChoice: "normal",
|
||||
targetSizeChoice: "normal",
|
||||
aimingLastRound: false,
|
||||
aimingWithSight: false,
|
||||
modifier,
|
||||
formula,
|
||||
hasTarget: options.hasTarget,
|
||||
hasModifier,
|
||||
hasMultiplier,
|
||||
modifier,
|
||||
selectiveFireChoice: "shortburst",
|
||||
multiplier
|
||||
}
|
||||
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-cthulhu-eternal/templates/roll-dialog.hbs", dialogContext)
|
||||
@@ -309,7 +416,9 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
if (options.rollType === "resource") {
|
||||
rollData.targetScore = options.initialScore * Number(rollContext.multiplier)
|
||||
} else {
|
||||
rollData.targetScore = Math.min(Math.max(options.initialScore + Number(rollData.modifier), 0), 100)
|
||||
let totalModifier = this.computeWeaponModifiers(rollData) + Number(rollData.modifier)
|
||||
rollData.totalModifier = Math.min(totalModifier, 40)
|
||||
rollData.targetScore = Math.min(Math.max(options.initialScore + Number(rollData.totalModifier), 0), 100)
|
||||
if (rollData.isLowWP || rollData.isExhausted) {
|
||||
rollData.targetScore -= 20
|
||||
}
|
||||
@@ -318,6 +427,10 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
}
|
||||
rollData.targetScore = Math.min(Math.max(rollData.targetScore, 0), 100)
|
||||
}
|
||||
if (rollData.targetScore === undefined || rollData.targetScore === null) {
|
||||
rollData.targetScore = options.initialScore
|
||||
rollData.modifier = "0"
|
||||
}
|
||||
|
||||
if (Hooks.call("fvtt-cthulhu-eternal.preRoll", options, rollData) === false) return
|
||||
|
||||
@@ -375,6 +488,7 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
this.options.isCritical = resultType === "successCritical" || resultType === "failureCritical"
|
||||
}
|
||||
rollData.resultType = resultType
|
||||
|
||||
this.options.isLowWP = rollData.isLowWP
|
||||
this.options.isZeroWP = rollData.isZeroWP
|
||||
this.options.isExhausted = rollData.isExhausted
|
||||
@@ -390,6 +504,8 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
*/
|
||||
static createTitle(type, target) {
|
||||
switch (type) {
|
||||
case "luck":
|
||||
return `${game.i18n.localize("CTHULHUETERNAL.Label.titleLuck")}`
|
||||
case "skill":
|
||||
return `${game.i18n.localize("CTHULHUETERNAL.Label.titleSkill")}`
|
||||
case "weapon":
|
||||
@@ -486,7 +602,7 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
{ rollMode: rollMode },
|
||||
)
|
||||
|
||||
console.log("Roll to message", this.options, this.options.rollData, this.options.rollItem)
|
||||
// Manage the skill evolution if the roll is a failure
|
||||
let rollData = this.options.rollData || this.options
|
||||
let rollItem = this.options.rollItem
|
||||
if (rollData.resultType.includes("failure") && rollItem.type === "skill") {
|
||||
@@ -512,6 +628,22 @@ export default class CthulhuEternalRoll extends Roll {
|
||||
}
|
||||
}
|
||||
|
||||
// If the roll is a SAN roll, we propose to select the SAN loss
|
||||
if (rollData.rollType === "san") {
|
||||
let msgData = {
|
||||
rollItem: rollItem,
|
||||
rollData: rollData
|
||||
}
|
||||
// Get array of gamemaster ID
|
||||
let msg = await foundry.applications.handlebars.renderTemplate("systems/fvtt-cthulhu-eternal/templates/chat-san-request.hbs", msgData)
|
||||
let chatMsg = await ChatMessage.create({
|
||||
user: game.user.id,
|
||||
content: msg,
|
||||
speaker: ChatMessage.getSpeaker({ actor: rollData.actor }),
|
||||
whisper: game.users.filter(u => u.isGM).map(u => u.id),
|
||||
})
|
||||
await chatMsg.setFlag("fvtt-cthulhu-eternal", "rollData", rollData)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -14,7 +14,8 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData
|
||||
const characteristicField = (label) => {
|
||||
const schema = {
|
||||
value: new fields.NumberField({ ...requiredInteger, initial: 3, min: 0 }),
|
||||
feature: new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
feature: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
||||
max: new fields.NumberField({ ...requiredInteger, initial: 3, min: 0 })
|
||||
}
|
||||
return new fields.SchemaField(schema, { label })
|
||||
}
|
||||
@@ -35,7 +36,9 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData
|
||||
schema.hp = new fields.SchemaField({
|
||||
value: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
|
||||
max: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
|
||||
stunned: new fields.BooleanField({ required: true, initial: false })
|
||||
stunned: new fields.BooleanField({ required: true, initial: false }),
|
||||
unconscious: new fields.BooleanField({ required: true, initial: false }),
|
||||
dead: new fields.BooleanField({ required: true, initial: false })
|
||||
})
|
||||
|
||||
schema.san = new fields.SchemaField({
|
||||
@@ -45,6 +48,7 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData
|
||||
violence: new fields.ArrayField(new fields.BooleanField(), { required: true, initial: [false, false, false], min: 3, max: 3 }),
|
||||
helplessness: new fields.ArrayField(new fields.BooleanField(), { required: true, initial: [false, false, false], min: 3, max: 3 }),
|
||||
breakingPoint: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
|
||||
breakingPointReached: new fields.BooleanField({ required: true, initial: false }),
|
||||
insanity: new fields.StringField({ required: true, nullable: false, initial: "none", choices: SYSTEM.INSANITY }),
|
||||
})
|
||||
|
||||
@@ -86,6 +90,10 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData
|
||||
prepareDerivedData() {
|
||||
super.prepareDerivedData();
|
||||
|
||||
if (!game.user.isGM ) {
|
||||
return
|
||||
}
|
||||
|
||||
let updates = {}
|
||||
if (this.wp.max !== this.characteristics.pow.value) {
|
||||
updates[`system.wp.max`] = this.characteristics.pow.value
|
||||
@@ -119,8 +127,6 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData
|
||||
dmgBonus = -2
|
||||
} else if (this.characteristics.str.value <= 8) {
|
||||
dmgBonus = -1
|
||||
} else if (this.characteristics.str.value <= 12) {
|
||||
dmgBonus = 0
|
||||
} else if (this.characteristics.str.value <= 16) {
|
||||
dmgBonus = 1
|
||||
} else if (this.characteristics.str.value <= 20) {
|
||||
@@ -130,6 +136,34 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData
|
||||
updates[`system.damageBonus`] = dmgBonus
|
||||
}
|
||||
|
||||
// BP (Breaking Point) management
|
||||
if (!this.san.breakingPointReached && this.san.value <= this.san.breakingPoint) {
|
||||
updates[`system.san.breakingPointReached`] = true
|
||||
this.san.breakingPointReached = true // Force local update to true
|
||||
ChatMessage.create({
|
||||
content: `<p>${game.i18n.format("CTHULHUETERNAL.Label.breakingPointReached", { bp: this.san.breakingPoint, san: this.san.value })}</p>`,
|
||||
speaker: ChatMessage.getSpeaker({ actor: this.parent }),
|
||||
// Get the user id of the actor owner
|
||||
whisper: [game.users.find(u => u.character?.name === this.parent?.name).id ]
|
||||
})
|
||||
}
|
||||
|
||||
// Unconsciousness management
|
||||
if (!this.hp.unconscious && this.hp.value <= 2) {
|
||||
updates[`system.hp.unconscious`] = true
|
||||
}
|
||||
if (this.hp.unconscious && this.hp.value > 2) {
|
||||
updates[`system.hp.unconscious`] = false
|
||||
}
|
||||
|
||||
// Dead management
|
||||
if (!this.hp.dead && this.hp.value <= 0) {
|
||||
updates[`system.hp.dead`] = true
|
||||
}
|
||||
if (this.hp.dead && this.hp.value > 0) {
|
||||
updates[`system.hp.dead`] = false
|
||||
}
|
||||
|
||||
// Sanity check
|
||||
if (this.san.value > this.san.max) {
|
||||
updates[`system.san.value`] = this.san.max
|
||||
@@ -165,6 +199,117 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData
|
||||
}
|
||||
}
|
||||
|
||||
async applySANConsequences(rollData) {
|
||||
let msgData = {
|
||||
sanType: rollData.sanType,
|
||||
sanLoss: rollData.sanLoss,
|
||||
actorId: this.parent.id,
|
||||
actorName: this.parent.name,
|
||||
adaptedToHelplessness: this.biodata.adaptedToHelplessness,
|
||||
adaptedToViolence: this.biodata.adaptedToViolence,
|
||||
... rollData
|
||||
}
|
||||
let updates = {}
|
||||
let template = ""
|
||||
// Manage temporary insanity
|
||||
if (rollData.sanLoss >= 5) {
|
||||
rollData.resetMsg = false
|
||||
if (rollData.sanType === "violence" && !this.biodata.adaptedToViolence) {
|
||||
updates[`system.san.violence`] = [false, false, false]
|
||||
rollData.resetMsg = "CTHULHUETERNAL.Label.sanViolenceReset"
|
||||
}
|
||||
if (rollData.sanType === "helplessness" && !this.biodata.adaptedToHelplessness) {
|
||||
updates[`system.san.helplessness`] = [false, false, false]
|
||||
rollData.resetMsg = "CTHULHUETERNAL.Label.sanHelplessnessReset"
|
||||
}
|
||||
template = "systems/fvtt-cthulhu-eternal/templates/chat-san-temp-insanity.hbs"
|
||||
|
||||
} else if (rollData.sanLoss === 0) { // Manage if sanLoss is 0
|
||||
rollData.resetMsg = false
|
||||
if (rollData.sanType === "violence" && !this.biodata.adaptedToViolence) {
|
||||
updates[`system.san.violence`] = [false, false, false]
|
||||
rollData.resetMsg = "CTHULHUETERNAL.Label.sanViolenceReset"
|
||||
}
|
||||
if (rollData.sanType === "helplessness" && !this.biodata.adaptedToHelplessness) {
|
||||
updates[`system.san.helplessness`] = [false, false, false]
|
||||
rollData.resetMsg = "CTHULHUETERNAL.Label.sanHelplessnessReset"
|
||||
}
|
||||
template = "systems/fvtt-cthulhu-eternal/templates/chat-san-loss-0.hbs"
|
||||
|
||||
} else if (rollData.sanType === "violence" ) {
|
||||
// Set the first false element of the violence array to true
|
||||
let violence = this.san.violence.slice()
|
||||
let index = violence.findIndex(v => !v)
|
||||
if (index !== -1) {
|
||||
violence[index] = true
|
||||
updates[`system.san.violence`] = violence
|
||||
}
|
||||
template = "systems/fvtt-cthulhu-eternal/templates/chat-san-loss-1-4.hbs"
|
||||
// Check if all violence elements are true, if so, set adaptedToViolence to true
|
||||
if (violence.every(v => v)) {
|
||||
updates[`system.biodata.adaptedToViolence`] = true
|
||||
updates[`system.san.violence`] = [false, false, false]
|
||||
msgData.adaptedToViolence = true
|
||||
}
|
||||
} else if (rollData.sanType === "helplessness" ) {
|
||||
// If sanType is "helplessness" and adapted to helplessness, set the first false element of the helplessness array to true
|
||||
let helplessness = this.san.helplessness.slice()
|
||||
let index = helplessness.findIndex(h => !h)
|
||||
if (index !== -1) {
|
||||
helplessness[index] = true
|
||||
updates[`system.san.helplessness`] = helplessness
|
||||
}
|
||||
template = "systems/fvtt-cthulhu-eternal/templates/chat-san-loss-1-4.hbs"
|
||||
// Check if all helplessness elements are true, if so, set adaptedToHelplessness to true
|
||||
if (helplessness.every(h => h)) {
|
||||
updates[`system.biodata.adaptedToHelplessness`] = true
|
||||
updates[`system.san.helplessness`] = [false, false, false]
|
||||
msgData.adaptedToHelplessness = true
|
||||
}
|
||||
} else if (rollData.sanType === "unnatural" ) {
|
||||
template = "systems/fvtt-cthulhu-eternal/templates/chat-san-loss-unnatural.hbs"
|
||||
} else {
|
||||
template = "systems/fvtt-cthulhu-eternal/templates/chat-san-loss-none.hbs"
|
||||
}
|
||||
|
||||
console.log("CthulhuEternalProtagonist.applySANConsequences", rollData, updates, template)
|
||||
let content = await foundry.applications.handlebars.renderTemplate(template, msgData)
|
||||
let msg = await ChatMessage.create({
|
||||
content: content,
|
||||
speaker: ChatMessage.getSpeaker({ actor: this.parent }),
|
||||
whisper: game.users.filter(u => u.isGM).map(u => u.id),
|
||||
})
|
||||
await msg.setFlag("fvtt-cthulhu-eternal", "rollData", msgData)
|
||||
|
||||
if (Object.keys(updates).length > 0) {
|
||||
this.parent.update(updates)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
async modifySAN(rollData) {
|
||||
let updates = {}
|
||||
let san = Math.max(Math.min(this.san.value + rollData.sanLoss, this.san.max), 0)
|
||||
if (this.san.value !== san) {
|
||||
updates[`system.san.value`] = san
|
||||
rollData.sanValue = san
|
||||
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-cthulhu-eternal/templates/chat-san-type-request.hbs", rollData)
|
||||
let msg = await ChatMessage.create({
|
||||
content: content,
|
||||
speaker: ChatMessage.getSpeaker({ actor: this.parent }),
|
||||
whisper: game.users.filter(u => u.isGM).map(u => u.id)
|
||||
})
|
||||
await msg.setFlag("fvtt-cthulhu-eternal", "rollData", rollData)
|
||||
}
|
||||
if (Object.keys(updates).length > 0) {
|
||||
this.parent.update(updates)
|
||||
}
|
||||
}
|
||||
|
||||
isStunned() {
|
||||
return this.hp.stunned
|
||||
}
|
||||
|
||||
isLowWP() {
|
||||
return this.wp.value <= 2
|
||||
}
|
||||
@@ -193,6 +338,7 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData
|
||||
let bp = Math.max(this.san.value - this.characteristics.pow.value, 0)
|
||||
if (this.san.breakingPoint !== bp) {
|
||||
updates[`system.san.breakingPoint`] = bp
|
||||
updates[`system.san.breakingPointReached`] = false // Reset breaking point reached
|
||||
}
|
||||
if (Object.keys(updates).length > 0) {
|
||||
this.parent.update(updates)
|
||||
@@ -207,6 +353,32 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData
|
||||
* @returns {Promise<null>} - A promise that resolves to null if the roll is cancelled.
|
||||
*/
|
||||
async roll(rollType, rollItem) {
|
||||
|
||||
if (this.hp.dead ) {
|
||||
// Warn with chat message
|
||||
ChatMessage.create({
|
||||
content: `<p>${game.i18n.format("CTHULHUETERNAL.Label.deadWarning", {con: this.characteristics.con.value} )}</p>`,
|
||||
speaker: ChatMessage.getSpeaker({ actor: this.parent })
|
||||
})
|
||||
return null
|
||||
}
|
||||
if (this.hp.unconscious ) {
|
||||
// Warn with chat message
|
||||
ChatMessage.create({
|
||||
content: `<p>${game.i18n.localize("CTHULHUETERNAL.Label.unconsciousWarning")}</p>`,
|
||||
speaker: ChatMessage.getSpeaker({ actor: this.parent })
|
||||
})
|
||||
return null
|
||||
}
|
||||
if (this.hp.stunned && rollType === "skill") {
|
||||
// Warn with chat message
|
||||
ChatMessage.create({
|
||||
content: `<p>${game.i18n.localize("CTHULHUETERNAL.Label.stunnedWarning")}</p>`,
|
||||
speaker: ChatMessage.getSpeaker({ actor: this.parent })
|
||||
})
|
||||
return null
|
||||
}
|
||||
|
||||
let opponentTarget
|
||||
const hasTarget = opponentTarget !== undefined
|
||||
|
||||
|
@@ -15,6 +15,8 @@ export default class CthulhuEternalSkill extends foundry.abstract.TypeDataModel
|
||||
schema.diceEvolved = new fields.BooleanField({ required: true, initial: true })
|
||||
schema.rollFailed = new fields.BooleanField({ required: true, initial: false })
|
||||
schema.isAdversary = new fields.BooleanField({ required: true, initial: false })
|
||||
schema.isHealing = new fields.BooleanField({ required: true, initial: false })
|
||||
schema.healingFormula = new fields.StringField({ required: true, initial: "1d4" })
|
||||
|
||||
return schema
|
||||
}
|
||||
@@ -36,11 +38,11 @@ export default class CthulhuEternalSkill extends foundry.abstract.TypeDataModel
|
||||
return `${this.base} + ${ String(this.bonus)}`;
|
||||
}
|
||||
|
||||
// Split the base value per stat :
|
||||
// Split the base value per stat :
|
||||
let base = this.base.toLowerCase();
|
||||
let char = actor.system.characteristics[base];
|
||||
if (!char) {
|
||||
ui.notifications.error(`The characteristic ${base} is wrong for actor ${actor.name}`);
|
||||
ui.notifications.error(`The characteristic ${base} is wrong for actor ${actor.name}`);
|
||||
return `${this.base } + ${ String(this.bonus)}`;
|
||||
}
|
||||
let charValue = char.value;
|
||||
|
@@ -13,18 +13,33 @@ export default class CthulhuEternalWeapon extends foundry.abstract.TypeDataModel
|
||||
|
||||
schema.weaponType = new fields.StringField({ required: true, initial: "melee", choices: SYSTEM.WEAPON_TYPE })
|
||||
schema.hasDirectSkill = new fields.BooleanField({ required: true, initial: false })
|
||||
schema.directSkillValue = new fields.NumberField({ required: true, initial: 0, min: 0, max:99 })
|
||||
schema.directSkillValue = new fields.NumberField({ required: true, initial: 0, min: 0, max: 99 })
|
||||
|
||||
schema.hasDamageDistance = new fields.BooleanField({ required: true, initial: false })
|
||||
schema.damageDistance = new fields.SchemaField(Array.fromRange(6, 1).reduce((damageDistance, i) => {
|
||||
damageDistance[`dist${i}`] = new fields.SchemaField({
|
||||
damage: new fields.StringField({ required: true, initial: "1d6" }),
|
||||
distance: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
})
|
||||
return damageDistance
|
||||
}, {}));
|
||||
|
||||
schema.hasSelectiveFire = new fields.BooleanField({ required: true, initial: false })
|
||||
schema.damage = new fields.StringField({required: true, initial: "1d6"})
|
||||
schema.hasSight = new fields.BooleanField({ required: true, initial: false })
|
||||
schema.isStunning = new fields.BooleanField({ required: true, initial: false })
|
||||
schema.damage = new fields.StringField({ required: true, initial: "1d6" })
|
||||
schema.applyDamageBonus = new fields.BooleanField({ required: true, initial: false })
|
||||
schema.baseRange = new fields.StringField({required: true, initial: ""})
|
||||
schema.baseRange = new fields.StringField({ required: true, initial: "" })
|
||||
schema.rangeUnit = new fields.StringField({ required: true, initial: "yard", choices: SYSTEM.WEAPON_RANGE_UNIT })
|
||||
schema.lethality = new fields.NumberField({ required: true, initial: 0, min: 0 })
|
||||
schema.killRadius = new fields.NumberField({ required: true, initial: 0, min: 0 })
|
||||
schema.armorPiercing = new fields.NumberField({ required: true, initial: 0, min: 0 })
|
||||
schema.weaponSubtype = new fields.StringField({ required: true, initial: "basicfirearm", choices: SYSTEM.WEAPON_SUBTYPE })
|
||||
schema.state = new fields.StringField({ required: true, initial: "pristine", choices: SYSTEM.EQUIPMENT_STATES })
|
||||
schema.ammo = new fields.SchemaField({
|
||||
value: new fields.NumberField({ ...requiredInteger, initial: 6, min: 0 }),
|
||||
max: new fields.NumberField({ ...requiredInteger, initial: 6, min: 0 })
|
||||
})
|
||||
|
||||
schema.resourceLevel = new fields.NumberField({ required: true, initial: 0, min: 0 })
|
||||
|
||||
@@ -37,4 +52,13 @@ export default class CthulhuEternalWeapon extends foundry.abstract.TypeDataModel
|
||||
get weaponCategory() {
|
||||
return game.i18n.localize(CATEGORY[this.category].label)
|
||||
}
|
||||
|
||||
isRanged() {
|
||||
console.log("isRanged", this.weaponType, this)
|
||||
return this.weaponType.match("ranged")
|
||||
}
|
||||
|
||||
isFireArm() {
|
||||
return this.weaponType === "rangedfirearm"
|
||||
}
|
||||
}
|
||||
|
@@ -180,14 +180,85 @@ export default class CthulhuEternalUtils {
|
||||
});
|
||||
}
|
||||
|
||||
static async damageRoll(rollMessage) {
|
||||
static async applySANType(rollMessage, event) {
|
||||
let rollData = rollMessage.getFlag("fvtt-cthulhu-eternal", "rollData")
|
||||
if (!rollData) {
|
||||
ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Notifications.noRollDataFound"))
|
||||
return
|
||||
}
|
||||
let actor = game.actors.get(rollData.actorId)
|
||||
if (!actor) {
|
||||
ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Notifications.noActorFound"))
|
||||
return
|
||||
}
|
||||
let sanType = event.currentTarget.dataset.sanType;
|
||||
if (!sanType) {
|
||||
ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Notifications.noSanTypeFound"))
|
||||
return
|
||||
}
|
||||
rollData.sanType = sanType
|
||||
await actor.system.applySANConsequences(rollData)
|
||||
// Delete the roll message
|
||||
await rollMessage.delete()
|
||||
}
|
||||
|
||||
static async applySANLoss(rollMessage, event) {
|
||||
let rollData = rollMessage.getFlag("fvtt-cthulhu-eternal", "rollData")
|
||||
if (!rollData) {
|
||||
ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Notifications.noRollDataFound"))
|
||||
return
|
||||
}
|
||||
let actor = game.actors.get(rollData.actorId)
|
||||
if (!actor) {
|
||||
ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Notifications.noActorFound"))
|
||||
return
|
||||
}
|
||||
// Get the san loss from the event : data-san-value
|
||||
let sanLoss = event.currentTarget.dataset.sanValue
|
||||
let r = new Roll(sanLoss.toString())
|
||||
await r.evaluate()
|
||||
rollData.sanLoss = -r.total
|
||||
|
||||
await actor.system.modifySAN(rollData)
|
||||
// Delete the roll message
|
||||
await rollMessage.delete()
|
||||
}
|
||||
|
||||
static async healingRoll(rollMessage) {
|
||||
let rollData = rollMessage.rolls[0]?.options?.rollData
|
||||
let healingFormula = rollData.rollItem.system.healingFormula
|
||||
let healingMsg = "CTHULHUETERNAL.Label.healingRoll"
|
||||
if (rollData.resultType === "successCritical") {
|
||||
healingFormula += " * 2"
|
||||
}
|
||||
if (rollData.resultType === "failureCritical") {
|
||||
healingMsg = "CTHULHUETERNAL.Label.healingRollFailure"
|
||||
}
|
||||
// Now display the result in chat message
|
||||
let roll = new Roll(healingFormula)
|
||||
await roll.evaluate()
|
||||
roll.toMessage({
|
||||
speaker: ChatMessage.getSpeaker({ actor: rollData.actorId }),
|
||||
flavor: `${game.i18n.localize(healingMsg)} : ${roll.total}`,
|
||||
rolls: [roll],
|
||||
options: {
|
||||
rollData: rollData,
|
||||
resultType: rollData.resultType
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
static async damageRoll(rollMessage, formula = null) {
|
||||
let rollData = rollMessage.rolls[0]?.options?.rollData
|
||||
let actor = game.actors.get(rollData.actorId)
|
||||
if (!actor) {
|
||||
ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Label.noActorFound"))
|
||||
return
|
||||
}
|
||||
console.log("Damage roll data", rollData)
|
||||
rollData.weapon.resultType = rollData.resultType // Keep the result type from the roll message
|
||||
rollData.weapon.selectiveFireChoice = rollData.selectiveFireChoice // Keep the selected fire choice from the roll message
|
||||
rollData.weapon.damageFormula = formula || rollData.weapon.system.damage
|
||||
actor.system.roll("damage", rollData.weapon)
|
||||
}
|
||||
|
||||
|
@@ -1 +1 @@
|
||||
MANIFEST-000081
|
||||
MANIFEST-000217
|
||||
|
@@ -1,7 +1,7 @@
|
||||
2025/06/12-21:40:36.466688 7f13a0ff96c0 Recovering log #79
|
||||
2025/06/12-21:40:36.523036 7f13a0ff96c0 Delete type=3 #77
|
||||
2025/06/12-21:40:36.523080 7f13a0ff96c0 Delete type=0 #79
|
||||
2025/06/12-22:19:34.910570 7f139fbff6c0 Level-0 table #84: started
|
||||
2025/06/12-22:19:34.910598 7f139fbff6c0 Level-0 table #84: 0 bytes OK
|
||||
2025/06/12-22:19:34.968716 7f139fbff6c0 Delete type=0 #82
|
||||
2025/06/12-22:19:35.027464 7f139fbff6c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end)
|
||||
2025/07/14-21:08:15.948300 7f3fa67fc6c0 Recovering log #215
|
||||
2025/07/14-21:08:15.959041 7f3fa67fc6c0 Delete type=3 #213
|
||||
2025/07/14-21:08:15.959103 7f3fa67fc6c0 Delete type=0 #215
|
||||
2025/07/14-21:36:01.776546 7f3fa57fa6c0 Level-0 table #220: started
|
||||
2025/07/14-21:36:01.776599 7f3fa57fa6c0 Level-0 table #220: 0 bytes OK
|
||||
2025/07/14-21:36:01.836135 7f3fa57fa6c0 Delete type=0 #218
|
||||
2025/07/14-21:36:02.071353 7f3fa57fa6c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end)
|
||||
|
@@ -1,7 +1,7 @@
|
||||
2025/06/12-20:37:22.833913 7f13a0ff96c0 Recovering log #75
|
||||
2025/06/12-20:37:22.843981 7f13a0ff96c0 Delete type=3 #73
|
||||
2025/06/12-20:37:22.844063 7f13a0ff96c0 Delete type=0 #75
|
||||
2025/06/12-20:52:48.559109 7f139fbff6c0 Level-0 table #80: started
|
||||
2025/06/12-20:52:48.559156 7f139fbff6c0 Level-0 table #80: 0 bytes OK
|
||||
2025/06/12-20:52:48.723881 7f139fbff6c0 Delete type=0 #78
|
||||
2025/06/12-20:52:48.724064 7f139fbff6c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end)
|
||||
2025/07/14-10:18:19.443254 7f3fa77fe6c0 Recovering log #211
|
||||
2025/07/14-10:18:19.474975 7f3fa77fe6c0 Delete type=3 #209
|
||||
2025/07/14-10:18:19.475128 7f3fa77fe6c0 Delete type=0 #211
|
||||
2025/07/14-20:48:52.882063 7f3fa57fa6c0 Level-0 table #216: started
|
||||
2025/07/14-20:48:52.882164 7f3fa57fa6c0 Level-0 table #216: 0 bytes OK
|
||||
2025/07/14-20:48:52.889652 7f3fa57fa6c0 Delete type=0 #214
|
||||
2025/07/14-20:48:52.915102 7f3fa57fa6c0 Manual compaction at level-0 from '!items!4oyPRBWPBWAChrJP' @ 72057594037927935 : 1 .. '!items!zVFfp3o0G0Zg3Ia4' @ 0 : 0; will stop at (end)
|
||||
|
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000249
|
||||
MANIFEST-000386
|
||||
|
@@ -1,7 +1,7 @@
|
||||
2025/06/12-21:40:36.410156 7f13a17fa6c0 Recovering log #247
|
||||
2025/06/12-21:40:36.461712 7f13a17fa6c0 Delete type=3 #245
|
||||
2025/06/12-21:40:36.461765 7f13a17fa6c0 Delete type=0 #247
|
||||
2025/06/12-22:19:34.795093 7f139fbff6c0 Level-0 table #252: started
|
||||
2025/06/12-22:19:34.795129 7f139fbff6c0 Level-0 table #252: 0 bytes OK
|
||||
2025/06/12-22:19:34.852214 7f139fbff6c0 Delete type=0 #250
|
||||
2025/06/12-22:19:35.027439 7f139fbff6c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end)
|
||||
2025/07/14-21:08:15.916959 7f3fa5ffb6c0 Recovering log #384
|
||||
2025/07/14-21:08:15.927715 7f3fa5ffb6c0 Delete type=3 #382
|
||||
2025/07/14-21:08:15.927846 7f3fa5ffb6c0 Delete type=0 #384
|
||||
2025/07/14-21:36:01.925671 7f3fa57fa6c0 Level-0 table #389: started
|
||||
2025/07/14-21:36:01.925708 7f3fa57fa6c0 Level-0 table #389: 0 bytes OK
|
||||
2025/07/14-21:36:01.980506 7f3fa57fa6c0 Delete type=0 #387
|
||||
2025/07/14-21:36:02.071389 7f3fa57fa6c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end)
|
||||
|
@@ -1,7 +1,7 @@
|
||||
2025/06/12-20:37:22.815373 7f13a1ffb6c0 Recovering log #242
|
||||
2025/06/12-20:37:22.826434 7f13a1ffb6c0 Delete type=3 #240
|
||||
2025/06/12-20:37:22.826479 7f13a1ffb6c0 Delete type=0 #242
|
||||
2025/06/12-20:52:48.502299 7f139fbff6c0 Level-0 table #248: started
|
||||
2025/06/12-20:52:48.502341 7f139fbff6c0 Level-0 table #248: 0 bytes OK
|
||||
2025/06/12-20:52:48.558859 7f139fbff6c0 Delete type=0 #246
|
||||
2025/06/12-20:52:48.724054 7f139fbff6c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end)
|
||||
2025/07/14-10:18:19.359761 7f3fa67fc6c0 Recovering log #380
|
||||
2025/07/14-10:18:19.394536 7f3fa67fc6c0 Delete type=3 #378
|
||||
2025/07/14-10:18:19.394680 7f3fa67fc6c0 Delete type=0 #380
|
||||
2025/07/14-20:48:52.889840 7f3fa57fa6c0 Level-0 table #385: started
|
||||
2025/07/14-20:48:52.889882 7f3fa57fa6c0 Level-0 table #385: 0 bytes OK
|
||||
2025/07/14-20:48:52.896159 7f3fa57fa6c0 Delete type=0 #383
|
||||
2025/07/14-20:48:52.915114 7f3fa57fa6c0 Manual compaction at level-0 from '!folders!5PrT9QmN1cFPzDFP' @ 72057594037927935 : 1 .. '!items!zvoUByzWSWZ87fxA' @ 0 : 0; will stop at (end)
|
||||
|
Binary file not shown.
BIN
packs-system/skills/MANIFEST-000386
Normal file
BIN
packs-system/skills/MANIFEST-000386
Normal file
Binary file not shown.
0
packs-system/weapons/000033.log
Normal file
0
packs-system/weapons/000033.log
Normal file
BIN
packs-system/weapons/000035.ldb
Normal file
BIN
packs-system/weapons/000035.ldb
Normal file
Binary file not shown.
1
packs-system/weapons/CURRENT
Normal file
1
packs-system/weapons/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000031
|
0
packs-system/weapons/LOCK
Normal file
0
packs-system/weapons/LOCK
Normal file
15
packs-system/weapons/LOG
Normal file
15
packs-system/weapons/LOG
Normal file
@@ -0,0 +1,15 @@
|
||||
2025/07/14-21:08:15.933872 7f3fa6ffd6c0 Recovering log #29
|
||||
2025/07/14-21:08:15.943722 7f3fa6ffd6c0 Delete type=3 #27
|
||||
2025/07/14-21:08:15.943845 7f3fa6ffd6c0 Delete type=0 #29
|
||||
2025/07/14-21:36:01.980637 7f3fa57fa6c0 Level-0 table #34: started
|
||||
2025/07/14-21:36:02.012185 7f3fa57fa6c0 Level-0 table #34: 24252 bytes OK
|
||||
2025/07/14-21:36:02.071125 7f3fa57fa6c0 Delete type=0 #32
|
||||
2025/07/14-21:36:02.071403 7f3fa57fa6c0 Manual compaction at level-0 from '!folders!0DI3T2jve3nsmsfZ' @ 72057594037927935 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at (end)
|
||||
2025/07/14-21:36:02.071441 7f3fa57fa6c0 Manual compaction at level-1 from '!folders!0DI3T2jve3nsmsfZ' @ 72057594037927935 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at '!items!qb4c1wfPZFcGiEuV' @ 472 : 1
|
||||
2025/07/14-21:36:02.071451 7f3fa57fa6c0 Compacting 1@1 + 1@2 files
|
||||
2025/07/14-21:36:02.101879 7f3fa57fa6c0 Generated table #35@1: 362 keys, 93592 bytes
|
||||
2025/07/14-21:36:02.101908 7f3fa57fa6c0 Compacted 1@1 + 1@2 files => 93592 bytes
|
||||
2025/07/14-21:36:02.154064 7f3fa57fa6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
||||
2025/07/14-21:36:02.154296 7f3fa57fa6c0 Delete type=2 #14
|
||||
2025/07/14-21:36:02.154743 7f3fa57fa6c0 Delete type=2 #34
|
||||
2025/07/14-21:36:02.372014 7f3fa57fa6c0 Manual compaction at level-1 from '!items!qb4c1wfPZFcGiEuV' @ 472 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at (end)
|
8
packs-system/weapons/LOG.old
Normal file
8
packs-system/weapons/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
||||
2025/07/14-10:18:19.404246 7f3fa5ffb6c0 Recovering log #25
|
||||
2025/07/14-10:18:19.435628 7f3fa5ffb6c0 Delete type=3 #23
|
||||
2025/07/14-10:18:19.435765 7f3fa5ffb6c0 Delete type=0 #25
|
||||
2025/07/14-20:48:52.908846 7f3fa57fa6c0 Level-0 table #30: started
|
||||
2025/07/14-20:48:52.908888 7f3fa57fa6c0 Level-0 table #30: 0 bytes OK
|
||||
2025/07/14-20:48:52.915004 7f3fa57fa6c0 Delete type=0 #28
|
||||
2025/07/14-20:48:52.915133 7f3fa57fa6c0 Manual compaction at level-0 from '!folders!0DI3T2jve3nsmsfZ' @ 72057594037927935 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at (end)
|
||||
2025/07/14-20:48:52.928670 7f3fa57fa6c0 Manual compaction at level-1 from '!folders!0DI3T2jve3nsmsfZ' @ 72057594037927935 : 1 .. '!items!zyxA9DhO36t5OBDv' @ 0 : 0; will stop at (end)
|
BIN
packs-system/weapons/MANIFEST-000031
Normal file
BIN
packs-system/weapons/MANIFEST-000031
Normal file
Binary file not shown.
@@ -5,4 +5,4 @@
|
||||
justify-content: center;
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
}
|
||||
}
|
||||
|
@@ -8,6 +8,28 @@
|
||||
background-color: var(--color-light-1);
|
||||
}
|
||||
|
||||
.creature-hp {
|
||||
gap: 2px;
|
||||
align-items: center;
|
||||
.form-fields {
|
||||
input {
|
||||
flex: none;
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
margin-left: 4px;
|
||||
}
|
||||
}
|
||||
.damage-bonus {
|
||||
font-size: calc(var(--font-size-standard) * 0.8);
|
||||
}
|
||||
.hp-separator {
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
.creature-main {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
@@ -34,25 +56,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
.creature-hp {
|
||||
gap: 2px;
|
||||
align-items: center;
|
||||
input {
|
||||
flex: none;
|
||||
width: 2rem;
|
||||
margin-left: 4px;
|
||||
}
|
||||
.damage-bonus {
|
||||
font-size: calc(var(--font-size-standard) * 0.8);
|
||||
}
|
||||
.hp-separator {
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
.creature-dv,
|
||||
.creature-dmax {
|
||||
.form-fields {
|
||||
|
@@ -85,3 +85,61 @@ i.fvtt-cthulhu-eternal {
|
||||
background-position: 0%;
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
|
||||
.chat-san-request,
|
||||
.chat-lethal-damage {
|
||||
ul {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
.result-lethal {
|
||||
color: var(--color-critical-failure);
|
||||
font-family: var(--font-title);
|
||||
}
|
||||
.san-type-buttons {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin: 10px 0;
|
||||
button {
|
||||
margin: 0 2px;
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 0.9);
|
||||
border: none;
|
||||
padding: 2px 2px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s;
|
||||
min-width: 6.0rem;
|
||||
max-width: 6.0rem;
|
||||
}
|
||||
}
|
||||
.san-loose-buttons {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin: 10px 0;
|
||||
button {
|
||||
margin: 0 2px;
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
border: none;
|
||||
padding: 2px 2px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s;
|
||||
min-width: 3.0rem;
|
||||
max-width: 3.0rem;
|
||||
}
|
||||
}
|
||||
.result-non-lethal {
|
||||
color: var(--color-failure);
|
||||
font-family: var(--font-title);
|
||||
}
|
||||
li {
|
||||
margin: 0 10px;
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.02);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -2,13 +2,12 @@
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.05);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
background: var(--color-light-1);
|
||||
--input-height: 1.4rem;
|
||||
|
||||
.sheet-tabs {
|
||||
a {
|
||||
color: rgba(32, 31, 31, 0.8);
|
||||
color: rgba(32, 31, 31, 0.8);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,7 +61,7 @@
|
||||
|
||||
legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-size: calc(var(--font-size-standard) * 1.1);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
@@ -73,6 +72,38 @@
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
}
|
||||
.hp-unconscious {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
color: #b4710c;
|
||||
}
|
||||
.hp-dead {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
color: #b40000;
|
||||
}
|
||||
.protagonist-luck {
|
||||
display: flex;
|
||||
min-width: 8rem;
|
||||
max-width: 8rem;
|
||||
.rollable:hover,
|
||||
.rollable:focus {
|
||||
text-shadow: 0 0 8px var(--color-shadow-primary);
|
||||
cursor: pointer;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
}
|
||||
.damage-bonus {
|
||||
display: flex;
|
||||
label {
|
||||
max-width: 5rem;
|
||||
min-width: 5rem;
|
||||
}
|
||||
input {
|
||||
max-width: 2rem;
|
||||
min-width: 2rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.vehicle-sheet-common {
|
||||
@@ -90,7 +121,6 @@
|
||||
}
|
||||
|
||||
.item-sheet-common {
|
||||
|
||||
.form-fields {
|
||||
padding-top: 4px;
|
||||
}
|
||||
|
@@ -39,12 +39,9 @@
|
||||
align-items: center;
|
||||
input {
|
||||
flex: none;
|
||||
width: 2rem;
|
||||
width: 4rem;
|
||||
margin-left: 4px;
|
||||
}
|
||||
.damage-bonus {
|
||||
font-size: calc(var(--font-size-standard) * 0.8);
|
||||
}
|
||||
.hp-separator {
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
display: flex;
|
||||
@@ -126,6 +123,14 @@
|
||||
min-width: 6rem;
|
||||
flex-grow: 1;
|
||||
}
|
||||
.san-helplessness,
|
||||
.san-violence {
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
}
|
||||
.label-san-type {
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
.label-bp {
|
||||
flex-grow: 1;
|
||||
max-width: 3rem;
|
||||
@@ -473,7 +478,7 @@
|
||||
}
|
||||
.weapons {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
grid-template-columns: repeat(1, 1fr);
|
||||
gap: 4px;
|
||||
.weapon {
|
||||
display: flex;
|
||||
@@ -491,10 +496,24 @@
|
||||
min-width: 1.8rem;
|
||||
max-width: 1.8rem;
|
||||
}
|
||||
.damage {
|
||||
.range {
|
||||
min-width: 6rem;
|
||||
max-width: 6rem;
|
||||
}
|
||||
.ammo {
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
}
|
||||
.lethality {
|
||||
display: flex;
|
||||
min-width: 3.2rem;
|
||||
max-width: 3.2rem;
|
||||
}
|
||||
.damage {
|
||||
display: flex;
|
||||
min-width: 12rem;
|
||||
max-width: 12rem;
|
||||
}
|
||||
.name {
|
||||
min-width: 10rem;
|
||||
max-width: 10rem;
|
||||
|
@@ -98,6 +98,11 @@
|
||||
margin-left: 2rem;
|
||||
display: none;
|
||||
}
|
||||
.healing-roll {
|
||||
font-size: calc(var(--font-size-standard) * 1.0);
|
||||
margin-left: 2rem;
|
||||
display: none;
|
||||
}
|
||||
.roll-damage {
|
||||
font-size: calc(var(--font-size-standard) * 1.0);
|
||||
margin-left: 2rem;
|
||||
|
@@ -14,6 +14,24 @@
|
||||
fieldset {
|
||||
margin-top: 8px;
|
||||
background-color: var(--color-light-1);
|
||||
input {
|
||||
max-width: 5rem;
|
||||
min-width: 5rem;
|
||||
}
|
||||
select {
|
||||
max-width: 14rem;
|
||||
min-width: 14rem;
|
||||
}
|
||||
input[type="checkbox"] {
|
||||
max-width: 1.5rem;
|
||||
min-width: 1.5rem;
|
||||
}
|
||||
.flexrow > *:not(:first-child) {
|
||||
margin-left: 1rem;
|
||||
}
|
||||
.damage-distance {
|
||||
margin-left: 2rem;
|
||||
}
|
||||
}
|
||||
|
||||
label {
|
||||
|
12
system.json
12
system.json
@@ -152,6 +152,18 @@
|
||||
},
|
||||
"flags": {}
|
||||
},
|
||||
{
|
||||
"name": "weapons",
|
||||
"label": "Weapons",
|
||||
"system": "fvtt-cthulhu-eternal",
|
||||
"path": "packs-system/weapons",
|
||||
"type": "Item",
|
||||
"ownership": {
|
||||
"PLAYER": "OBSERVER",
|
||||
"ASSISTANT": "OWNER"
|
||||
},
|
||||
"flags": {}
|
||||
},
|
||||
{
|
||||
"name": "rituals",
|
||||
"label": "Rituals",
|
||||
|
35
templates/chat-lethal-damage.hbs
Normal file
35
templates/chat-lethal-damage.hbs
Normal file
@@ -0,0 +1,35 @@
|
||||
<div class="{{cssClass}}">
|
||||
<div class="chat-lethal-damage">
|
||||
<ul>
|
||||
<li><strong>{{weapon.name}} : {{localize "CTHULHUETERNAL.Label.lethalityRoll"}}</strong></li>
|
||||
<li>{{localize "CTHULHUETERNAL.Label.result"}} :{{rollResult}} ({{lethalScore}})</li>
|
||||
|
||||
|
||||
{{#if weapon.system.selectiveFireChoice}}
|
||||
<li>{{weapon.system.selectiveFireChoiceLabel}}</li>
|
||||
{{/if}}
|
||||
{{#if (gt weapon.system.killRadius 0)}}
|
||||
<li>{{localize "CTHULHUETERNAL.Label.killRadius"}} : {{weapon.system.killRadius}} {{weapon.system.rangeUnit}}</li>
|
||||
<li>{{localize "CTHULHUETERNAL.Label.killRadiusInfo"}}</li>
|
||||
{{/if}}
|
||||
|
||||
{{#if (gt weapon.system.armorPiercing 0)}}
|
||||
<li>{{localize "CTHULHUETERNAL.Label.armorPiercing"}} : {{weapon.system.armorPiercing}}</li>
|
||||
{{/if}}
|
||||
|
||||
{{#if ammoUsed}}
|
||||
<li>{{localize "CTHULHUETERNAL.Label.ammoUsed"}}: {{ammoUsed}} / {{weapon.system.ammo.value}}</li>
|
||||
{{/if}}
|
||||
|
||||
{{#if isLethal}}
|
||||
<li class="result-lethal">{{localize "CTHULHUETERNAL.Label.lethalityLethal"}}</li>
|
||||
<li class="result-lethal">{{localize "CTHULHUETERNAL.Label.lethalityWounded"}}</li>
|
||||
{{else}}
|
||||
<li class="result-non-lethal">{{localize "CTHULHUETERNAL.Label.lethalityNotLethal"}}</li>
|
||||
<li class="result-non-lethal">{{localize "CTHULHUETERNAL.Label.lethalityNotWounded"}}: <strong>{{wounds}}</strong></li>
|
||||
{{/if}}
|
||||
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
@@ -15,7 +15,7 @@
|
||||
{{/if}}
|
||||
|
||||
{{#if isNudgedRoll}}
|
||||
<li><strong>{{localize "CTHULHUETERNAL.Label.nudgedRoll"}} : {{wpCost}} WP spent</strong></li>
|
||||
<li><strong>{{localize "CTHULHUETERNAL.Label.nudgedRoll"}} : {{wpCost}} {{localize "CTHULHUETERNAL.Label.WPSpent"}}</strong></li>
|
||||
{{/if}}
|
||||
|
||||
{{#if weapon}}
|
||||
@@ -43,41 +43,72 @@
|
||||
{{#if (eq rollType "resource")}}
|
||||
<li>{{localize "CTHULHUETERNAL.Label.multiplier"}} : {{multiplier}}</li>
|
||||
{{else}}
|
||||
<li>{{localize "CTHULHUETERNAL.Label.modifier"}} : {{modifier}}%</li>
|
||||
<li>{{localize "CTHULHUETERNAL.Label.modifier"}} : {{totalModifier}}%</li>
|
||||
{{/if}}
|
||||
|
||||
<li>{{localize "CTHULHUETERNAL.Label.targetScore"}} : {{targetScore}}%</li>
|
||||
{{#if isSuccess}}
|
||||
{{#if isCritical}}
|
||||
<li class="result-critical-success">{{localize "CTHULHUETERNAL.Label.criticalSuccess"}}
|
||||
{{#if (eq rollType "weapon")}}
|
||||
<a class="damage-roll"><i class="fa-solid fa-sword"></i></a>
|
||||
{{/if}}
|
||||
</li>
|
||||
{{else}}
|
||||
<li class="result-success">
|
||||
{{localize "CTHULHUETERNAL.Label.success"}}
|
||||
{{#if isNudge}}
|
||||
<a class="nudge-roll"><i class="fa-solid fa-circle-sort-down"></i></a>
|
||||
{{/if}}
|
||||
{{#if (eq rollType "weapon")}}
|
||||
<a class="damage-roll"><i class="fa-solid fa-sword"></i></a>
|
||||
<a class="nudge-roll" data-tooltip="{{localize "CTHULHUETERNAL.Label.rollNudge"}}"><i class="fa-solid fa-circle-sort-down"></i></a>
|
||||
{{/if}}
|
||||
|
||||
</li>
|
||||
{{/if}}
|
||||
{{#if (eq rollType "weapon")}}
|
||||
<li>
|
||||
{{#if (eq weapon.system.weaponType "rangedfirearm")}}
|
||||
{{#if weapon.system.hasDamageDistance}}
|
||||
{{#each weapon.system.damageDistance as |damageDistance|}}
|
||||
{{#if (gt damageDistance.distance 0)}}
|
||||
<a class="damage-roll" data-item-id="{{weapon.id}}" data-action="roll" data-roll-type="damage"
|
||||
data-roll-value="{{damageDistance.damage}}" >
|
||||
<i class="fa-solid fa-gun"></i>
|
||||
<span class="damage-distance">{{damageDistance.distance}}:{{damageDistance.damage}} </span>
|
||||
</a>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
{{else}}
|
||||
<a class="damage-roll" data-roll-value="{{weapon.system.damage}}" data-tooltip="{{localize "CTHULHUETERNAL.Label.rollDamage"}}"><i class="fa-solid fa-gun"></i></a>
|
||||
{{/if}}
|
||||
{{else}}
|
||||
<a class="damage-roll" data-roll-value="{{weapon.system.damage}}" data-tooltip="{{localize "CTHULHUETERNAL.Label.rollDamage"}}"><i class="fa-solid fa-sword"></i></a>
|
||||
{{/if}}
|
||||
</li>
|
||||
{{/if}}
|
||||
{{#if (eq rollType "skill") }}
|
||||
{{#if rollItem.system.isHealing}}
|
||||
<li>
|
||||
<a class="healing-roll" data-tooltip="{{localize "CTHULHUETERNAL.Label.rollHealing"}}"><i class="fa-solid fa-heart"></i></a>
|
||||
</li>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
</li>
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{#if isFailure}}
|
||||
{{#if isCritical}}
|
||||
<li class="result-critical-failure">{{localize "CTHULHUETERNAL.Label.criticalFailure"}}</li>
|
||||
{{else}}
|
||||
<li class="result-failure">
|
||||
{{localize "CTHULHUETERNAL.Label.failure"}}
|
||||
{{#if isNudge}}
|
||||
<a class="nudge-roll"><i class="fa-solid fa-circle-sort-down"></i></a>
|
||||
{{#if isCritical}}
|
||||
<li class="result-critical-failure">{{localize "CTHULHUETERNAL.Label.criticalFailure"}}
|
||||
</li>
|
||||
{{else}}
|
||||
<li class="result-failure">
|
||||
{{localize "CTHULHUETERNAL.Label.failure"}}
|
||||
</li>
|
||||
{{/if}}
|
||||
</li>
|
||||
{{/if}}
|
||||
|
||||
{{#if isNudge}}
|
||||
<li>
|
||||
<a class="nudge-roll" data-tooltip="{{localize "CTHULHUETERNAL.Label.rollNudge"}}"><i class="fa-solid fa-circle-sort-down"></i></a>
|
||||
</li>
|
||||
{{/if}}
|
||||
|
||||
|
||||
{{/if}}
|
||||
</ul>
|
||||
</div>
|
||||
|
24
templates/chat-regular-damage.hbs
Normal file
24
templates/chat-regular-damage.hbs
Normal file
@@ -0,0 +1,24 @@
|
||||
<div class="{{cssClass}}">
|
||||
<div class="chat-lethal-damage">
|
||||
<ul>
|
||||
<li><strong>{{weapon.name}} : {{localize "CTHULHUETERNAL.Label.damageRoll"}}</strong></li>
|
||||
<li>{{localize "CTHULHUETERNAL.Label.result"}} :{{rollResult}} ({{formula}})</li>
|
||||
|
||||
{{#if (gt weapon.system.killRadius 0)}}
|
||||
<li>{{localize "CTHULHUETERNAL.Label.killRadius"}} : {{weapon.system.killRadius}} {{weapon.system.rangeUnit}}</li>
|
||||
<li>{{localize "CTHULHUETERNAL.Label.killRadiusInfo"}}</li>
|
||||
{{/if}}
|
||||
|
||||
{{#if (gt weapon.system.armorPiercing 0)}}
|
||||
<li>{{localize "CTHULHUETERNAL.Label.armorPiercing"}} : {{weapon.system.armorPiercing}}</li>
|
||||
{{/if}}
|
||||
|
||||
{{#if ammoUsed}}
|
||||
<li>{{localize "CTHULHUETERNAL.Label.ammoUsed"}}: {{ammoUsed}} / {{weapon.system.ammo.value}}</li>
|
||||
{{/if}}
|
||||
<li class="result-non-lethal">{{localize "CTHULHUETERNAL.Label.damageMessage"}}: <strong>{{rollResult}}</strong></li>
|
||||
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
11
templates/chat-san-loss-0.hbs
Normal file
11
templates/chat-san-loss-0.hbs
Normal file
@@ -0,0 +1,11 @@
|
||||
<div class="{{cssClass}}">
|
||||
<div class="chat-san-request">
|
||||
<ul>
|
||||
<li><strong>{{localize "CTHULHUETERNAL.Label.noSanLoss"}}</strong></li>
|
||||
{{#if resetMsg}}
|
||||
<li><strong>{{localize resetMsg}}</strong></li>
|
||||
{{/if}}
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
24
templates/chat-san-loss-1-4.hbs
Normal file
24
templates/chat-san-loss-1-4.hbs
Normal file
@@ -0,0 +1,24 @@
|
||||
<div class="{{cssClass}}">
|
||||
<div class="chat-san-request">
|
||||
<ul>
|
||||
<li><strong>{{localize "CTHULHUETERNAL.Label.sanLoss"}}</strong></li>
|
||||
{{#if (eq sanType "violence")}}
|
||||
{{#if adaptedToViolence}}
|
||||
<li class="orange-warning">{{localize "CTHULHUETERNAL.Label.adaptedToViolence"}}</li>
|
||||
{{else}}
|
||||
<li>{{localize "CTHULHUETERNAL.Label.sanLossViolence"}}</li>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
{{#if (eq sanType "helplessness")}}
|
||||
{{#if adaptedToHelplessness}}
|
||||
<li class="orange-warning">{{localize "CTHULHUETERNAL.Label.adaptedToHelplessness"}}</li>
|
||||
{{else}}
|
||||
<li>{{localize "CTHULHUETERNAL.Label.sanLossHelplessness"}}</li>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
8
templates/chat-san-loss-none.hbs
Normal file
8
templates/chat-san-loss-none.hbs
Normal file
@@ -0,0 +1,8 @@
|
||||
<div class="{{cssClass}}">
|
||||
<div class="chat-san-request">
|
||||
<ul>
|
||||
<li><strong>{{localize "CTHULHUETERNAL.Label.SANLossNone"}}</strong></li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
8
templates/chat-san-loss-unnatural.hbs
Normal file
8
templates/chat-san-loss-unnatural.hbs
Normal file
@@ -0,0 +1,8 @@
|
||||
<div class="{{cssClass}}">
|
||||
<div class="chat-san-request">
|
||||
<ul>
|
||||
<li><strong>{{localize "CTHULHUETERNAL.Label.SANLossUnnatural"}}</strong></li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
29
templates/chat-san-request.hbs
Normal file
29
templates/chat-san-request.hbs
Normal file
@@ -0,0 +1,29 @@
|
||||
<div class="{{cssClass}}">
|
||||
<div class="chat-san-request">
|
||||
<ul>
|
||||
{{#if rollData.isSuccess}}
|
||||
<li><strong>{{localize "CTHULHUETERNAL.Label.SANTestSuccess"}}</strong></li>
|
||||
{{else}}
|
||||
<li><strong>{{localize "CTHULHUETERNAL.Label.SANTestFailure"}}</strong></li>
|
||||
{{/if}}
|
||||
|
||||
<li class="san-loose-buttons">
|
||||
<button class="san-loose" data-san-value="0">0</button>
|
||||
<button class="san-loose" data-san-value="1">1</button>
|
||||
<button class="san-loose" data-san-value="2">2</button>
|
||||
<button class="san-loose" data-san-value="3">3</button>
|
||||
<button class="san-loose" data-san-value="4">4</button>
|
||||
</li>
|
||||
|
||||
<li class="san-loose-buttons">
|
||||
<button class="san-loose" data-san-value="1d4">1d4</button>
|
||||
<button class="san-loose" data-san-value="1d6">1d6</button>
|
||||
<button class="san-loose" data-san-value="1d8">1d8</button>
|
||||
<button class="san-loose" data-san-value="1d10">1d10</button>
|
||||
<button class="san-loose" data-san-value="1d12">1d12</button>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
12
templates/chat-san-temp-insanity.hbs
Normal file
12
templates/chat-san-temp-insanity.hbs
Normal file
@@ -0,0 +1,12 @@
|
||||
<div class="{{cssClass}}">
|
||||
<div class="chat-san-request">
|
||||
<ul>
|
||||
<li><strong>{{localize "CTHULHUETERNAL.Label.sanLoss5"}}</strong></li>
|
||||
{{#if resetMsg}}
|
||||
<li class="orange-warning">{{localize resetMsg}}</li>
|
||||
{{/if}}
|
||||
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
19
templates/chat-san-type-request.hbs
Normal file
19
templates/chat-san-type-request.hbs
Normal file
@@ -0,0 +1,19 @@
|
||||
<div class="{{cssClass}}">
|
||||
<div class="chat-san-request">
|
||||
<ul>
|
||||
<li><strong>{{localize "CTHULHUETERNAL.Label.sanLoss"}} : {{sanLoss}}</strong></li>
|
||||
<li><strong>{{localize "CTHULHUETERNAL.Label.selectSANType"}}</strong></li>
|
||||
|
||||
<li class="san-type-buttons">
|
||||
<button class="san-type" data-san-value="{{sanLoss}}" data-san-type="violence">{{localize "CTHULHUETERNAL.Label.Violence"}}</button>
|
||||
<button class="san-type" data-san-value="{{sanLoss}}" data-san-type="helplessness">{{localize "CTHULHUETERNAL.Label.Helplessness"}}</button>
|
||||
</li>
|
||||
<li class="san-type-buttons">
|
||||
<button class="san-type" data-san-value="{{sanLoss}}" data-san-type="unnatural">{{localize "CTHULHUETERNAL.Label.Unnatural"}}</button>
|
||||
<button class="san-type" data-san-value="{{sanLoss}}" data-san-type="none">{{localize "CTHULHUETERNAL.Label.None"}}</button>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
@@ -11,7 +11,7 @@
|
||||
data-name="checks" {{#if check}} checked {{/if}} {{#if (gte @index @root.system.resources.nbValidChecks)}} disabled {{/if}}>
|
||||
{{/each}}
|
||||
</div>
|
||||
<button class="resource-roll rollable" data-roll-type="resource"><img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />Resource roll</button>
|
||||
<button class="resource-roll rollable" data-roll-type="resource"><img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />{{localize "CTHULHUETERNAL.Label.titleResource"}}</button>
|
||||
{{formField systemFields.resources.fields.hand value=system.resources.hand name="system.resources.hand" localize=true disabled=true}}
|
||||
{{formField systemFields.resources.fields.stowed value=system.resources.stowed name="system.resources.stowed" localize=true disabled=true}}
|
||||
{{formField systemFields.resources.fields.storage value=system.resources.storage name="system.resources.storage" localize=true disabled=true}}
|
||||
@@ -21,8 +21,13 @@
|
||||
<fieldset>
|
||||
<legend>{{localize "CTHULHUETERNAL.Label.biodata"}}</legend>
|
||||
<div class="adapted">
|
||||
{{#if isGM}}
|
||||
{{formField systemFields.biodata.fields.adaptedToViolence value=system.biodata.adaptedToViolence name="system.biodata.adaptedToViolence" localize=true}}
|
||||
{{formField systemFields.biodata.fields.adaptedToHelplessness value=system.biodata.adaptedToHelplessness name="system.biodata.adaptedToHelplessness" localize=true}}
|
||||
{{else}}
|
||||
{{formField systemFields.biodata.fields.adaptedToViolence value=system.biodata.adaptedToViolence name="system.biodata.adaptedToViolence" localize=true disabled=true}}
|
||||
{{formField systemFields.biodata.fields.adaptedToHelplessness value=system.biodata.adaptedToHelplessness name="system.biodata.adaptedToHelplessness" localize=true disabled=true}}
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="biodata">
|
||||
{{formField systemFields.biodata.fields.harshness value=system.biodata.harshness name="system.biodata.harshness" localize=true}}
|
||||
|
@@ -16,11 +16,64 @@
|
||||
{{item.name}}
|
||||
</div>
|
||||
|
||||
<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
|
||||
<a class="damage rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage"
|
||||
data-roll-value="{{item.system.damage}}">
|
||||
{{localize "CTHULHUETERNAL.Label.damageShort"}} :
|
||||
{{item.system.damage}}</a>
|
||||
<div class="damage" data-tooltip="{{localize 'CTHULHUETERNAL.Tooltip.rollDamage'}}">
|
||||
{{#if (eq system.lethality 0)}}
|
||||
<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
|
||||
|
||||
{{#if item.system.hasDamageDistance}}
|
||||
{{#each item.system.damageDistance as |damageDistance|}}
|
||||
{{#if (gt damageDistance.distance 0)}}
|
||||
<a class="rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage"
|
||||
data-roll-value="{{damageDistance.damage}}" >
|
||||
<span class="damage-distance">{{damageDistance.distance}}:{{damageDistance.damage}} </span>
|
||||
</a>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
{{else}}
|
||||
<a class="rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage"
|
||||
data-roll-value="{{item.system.damage}}" >
|
||||
{{item.system.damage}}
|
||||
</a>
|
||||
{{/if}}
|
||||
{{else}}
|
||||
N/A
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{#if (gt system.baseRange 0)}}
|
||||
<span class="range" data-tooltip="CTHULHUETERNAL.Label.baseRange">{{item.system.baseRange}} {{item.system.rangeUnit}}</span>
|
||||
{{else}}
|
||||
<span class="range">{{localize "CTHULHUETERNAL.Label.melee"}}</span>
|
||||
{{/if}}
|
||||
|
||||
{{#if (gt system.lethality 0)}}
|
||||
<a class="lethality rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage"
|
||||
data-tooltip="CTHULHUETERNAL.Label.Lethality" >
|
||||
<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
|
||||
{{item.system.lethality}}%
|
||||
</a>
|
||||
{{else}}
|
||||
<span class="lethality" data-tooltip="CTHULHUETERNAL.Label.Lethality">-</span>
|
||||
{{/if}}
|
||||
|
||||
{{#if (gt system.killRadius 0)}}
|
||||
<span class="lethality" data-tooltip="CTHULHUETERNAL.Label.killRadius" >{{item.system.killRadius}}</span>
|
||||
{{else}}
|
||||
<span class="lethality" data-tooltip="CTHULHUETERNAL.Label.killRadius">-</span>
|
||||
{{/if}}
|
||||
|
||||
{{#if (gt system.armorPiercing 0)}}
|
||||
<span class="lethality" data-tooltip="CTHULHUETERNAL.Label.armorPiercing" >{{item.system.armorPiercing}}</span>
|
||||
{{else}}
|
||||
<span class="lethality" data-tooltip="CTHULHUETERNAL.Label.armorPiercing">-</span>
|
||||
{{/if}}
|
||||
|
||||
{{#if (eq system.weaponType "rangedfirearm")}}
|
||||
<span class="ammo" data-tooltip="CTHULHUETERNAL.Label.Ammo" >{{item.system.ammo.value}}/{{item.system.ammo.max}}</span>
|
||||
{{else}}
|
||||
<span class="ammo" data-tooltip="CTHULHUETERNAL.Label.Ammo">N/A</span>
|
||||
{{/if}}
|
||||
|
||||
<div class="controls">
|
||||
<a data-tooltip="{{localize 'CTHULHUETERNAL.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
|
||||
|
@@ -10,14 +10,20 @@
|
||||
data-tooltip="{{actor.name}}" />
|
||||
</div>
|
||||
<fieldset class="protagonist-hp">
|
||||
<legend>{{localize "CTHULHUETERNAL.Label.HP"}}</legend>
|
||||
{{#if system.hp.dead}}
|
||||
<legend class="hp-dead">{{localize "CTHULHUETERNAL.Label.HP"}} {{localize "CTHULHUETERNAL.Label.dying"}}</legend>
|
||||
{{else}}
|
||||
{{#if system.hp.unconscious}}
|
||||
<legend class="hp-unconscious">{{localize "CTHULHUETERNAL.Label.HP"}} {{localize "CTHULHUETERNAL.Label.unconscious"}}</legend>
|
||||
{{else}}
|
||||
<legend>{{localize "CTHULHUETERNAL.Label.HP"}}</legend>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.hp.fields.value value=system.hp.value}}
|
||||
<span class="hp-separator">/</span>
|
||||
{{formField systemFields.hp.fields.max value=system.hp.max rootId=partId disabled=true}}
|
||||
</div>
|
||||
<div class="flexrow ">
|
||||
{{formField systemFields.damageBonus value=system.damageBonus classes="damage-bonus"}}
|
||||
{{formField systemFields.hp.fields.stunned value=system.hp.stunned classes="stunned"}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
@@ -70,17 +76,29 @@
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
|
||||
<span class="label-field">{{localize "CTHULHUETERNAL.Label.violence"}}</span>
|
||||
{{#each system.san.violence as |violence idx|}}
|
||||
<input class="san-checkbox" type="checkbox" data-action="updateCheckboxArray" data-index="{{@index}}"
|
||||
data-name="violence" {{#if violence}} checked {{/if}}>
|
||||
{{/each}}
|
||||
<div class="san-violence">
|
||||
{{#if system.biodata.adaptedToViolence}}
|
||||
<span class="">{{localize "CTHULHUETERNAL.Label.adaptedToViolenceShort"}}</span>
|
||||
{{else}}
|
||||
<span class="label-field label-san-type">{{localize "CTHULHUETERNAL.Label.violence"}}</span>
|
||||
{{#each system.san.violence as |violence idx|}}
|
||||
<input class="san-checkbox" type="checkbox" data-action="updateCheckboxArray" data-index="{{@index}}"
|
||||
data-name="violence" {{#if violence}} checked {{/if}}>
|
||||
{{/each}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
<span class="label-field">{{localize "CTHULHUETERNAL.Label.helplessness"}}</span>
|
||||
{{#each system.san.helplessness as |helplessness idx|}}
|
||||
<input class="san-checkbox" type="checkbox" data-action="updateCheckboxArray" data-index="{{@index}}"
|
||||
data-name="helplessness" {{#if helplessness}} checked {{/if}}>
|
||||
{{/each}}
|
||||
<div class="san-helplessness">
|
||||
{{#if system.biodata.adaptedToHelplessness}}
|
||||
<span class="">{{localize "CTHULHUETERNAL.Label.adaptedToHelplessnessShort"}}</span>
|
||||
{{else}}
|
||||
<span class="label-field label-san-type">{{localize "CTHULHUETERNAL.Label.helplessness"}}</span>
|
||||
{{#each system.san.helplessness as |helplessness idx|}}
|
||||
<input class="san-checkbox" type="checkbox" data-action="updateCheckboxArray" data-index="{{@index}}"
|
||||
data-name="helplessness" {{#if helplessness}} checked {{/if}}>
|
||||
{{/each}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -158,6 +176,17 @@
|
||||
rootId=partId disabled=isPlayMode }}
|
||||
<label class="char-text">{{mul system.characteristics.cha.value 5}}</label>
|
||||
</div>
|
||||
|
||||
<div class="protagonist-luck">
|
||||
<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
|
||||
<label class="rollable" data-roll-type="luck" data-char-id="luck"
|
||||
data-tooltip="{{system.Label.Luck}}">{{localize
|
||||
"CTHULHUETERNAL.Label.Luck"}} (50)</label>
|
||||
</div>
|
||||
<div class="damage-bonus">
|
||||
{{formField systemFields.damageBonus value=system.damageBonus tooltip="Etourdi" }}
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
|
||||
</section>
|
@@ -12,28 +12,87 @@
|
||||
<div class="dialog-skill">{{rollItem.name}} : <span class="resource-score">{{initialScore}} ({{mul initialScore 5}}%)</span></div>
|
||||
<div class="dialog-skill">{{localize "CTHULHUETERNAL.Label.Hand"}} : {{rollItem.hand}} <input type="checkbox" data-action="selectHand" {{checked rollItem.enableHand}}></div>
|
||||
<div class="dialog-skill">{{localize "CTHULHUETERNAL.Label.Stowed"}} : {{rollItem.stowed}} <input type="checkbox" data-action="selectStowed" {{checked rollItem.enableStowed}}></div>
|
||||
<div class="dialog-skill">{{localize "CTHULHUETERNAL.Label.Storage"}} : {{rollItem.storage}} <input type="checkbox" data-action="selectStorage" {{checked rollItem.enableStorage}}></div>
|
||||
<div class="dialog-skill">
|
||||
{{localize "CTHULHUETERNAL.Label.Storage"}} : {{rollItem.storage}}
|
||||
<input type="checkbox" data-action="selectStorage" {{checked rollItem.enableStorage}}>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="dialog-skill">{{rollItem.name}} : {{initialScore}}%</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if weapon}}
|
||||
<div class="dialog-skill">{{localize "CTHULHUETERNAL.Label.Weapon"}} : {{weapon.name}}</div>
|
||||
|
||||
{{#if (eq weapon.system.weaponType "melee")}}
|
||||
<div class="dialog-skill">
|
||||
{{localize "CTHULHUETERNAL.Label.targetMove"}}
|
||||
<select name="meleeTargetMoveChoice" class="roll-skill-modifier">
|
||||
{{selectOptions choiceMeleeTargetMove localize=true selected=meleeTargetMoveChoice valueAttr="id" labelAttr="label"}}
|
||||
</select>
|
||||
</div>
|
||||
{{/if}}
|
||||
{{#if isRangedWeapon}}
|
||||
<div class="dialog-skill">
|
||||
{{localize "CTHULHUETERNAL.Label.rangedRange"}}
|
||||
<select name="rangedRangeChoice" class="roll-skill-modifier">
|
||||
{{selectOptions choiceRangedRange localize=true selected=rangedRangeChoice valueAttr="id" labelAttr="label"}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="dialog-skill">
|
||||
{{localize "CTHULHUETERNAL.Label.targetMove"}}
|
||||
<select name="rangedTargetMoveChoice" class="roll-skill-modifier">
|
||||
{{selectOptions choiceRangedTargetMove localize=true selected=rangedTargetMoveChoice valueAttr="id" labelAttr="label"}}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="dialog-skill">
|
||||
{{localize "CTHULHUETERNAL.Label.aimingLastRound"}}
|
||||
<input type="checkbox" name="aimingLastRound">
|
||||
</div>
|
||||
{{#if weapon.system.hasSight}}
|
||||
<div class="dialog-skill">
|
||||
{{localize "CTHULHUETERNAL.Label.aimingWithSight"}}
|
||||
<input type="checkbox" name="aimingWithSight">
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{/if}}
|
||||
|
||||
<div class="dialog-skill">
|
||||
{{localize "CTHULHUETERNAL.Label.visibility"}}
|
||||
<select name="visibilityChoice" class="roll-skill-modifier">
|
||||
{{selectOptions choiceVisibility localize=true selected=visibilityChoice valueAttr="id" labelAttr="label"}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="dialog-skill">
|
||||
{{localize "CTHULHUETERNAL.Label.attackerState"}}
|
||||
<select name="attackerStateChoice" class="roll-skill-modifier">
|
||||
{{selectOptions choiceAttackerState localize=true selected=attackerStateChoice valueAttr="id" labelAttr="label"}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="dialog-skill">
|
||||
{{localize "CTHULHUETERNAL.Label.targetSize"}}
|
||||
<select name="targetSizeChoice" class="roll-skill-modifier">
|
||||
{{selectOptions choiceTargetSize localize=true selected=targetSizeChoice valueAttr="id" labelAttr="label"}}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
{{#if weapon.system.hasSelectiveFire}}
|
||||
<div class="dialog-skill">Selective Fire :
|
||||
<select name="selectiveFireChoice" class="roll-skill-modifier">
|
||||
{{selectOptions choiceSelectiveFire localize=true selected=selectiveFireChoice nameAttr="id" labelAttr="label"}}
|
||||
{{selectOptions choiceSelectiveFire localize=true selected=selectiveFireChoice valueAttr="id" labelAttr="label"}}
|
||||
</select>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{#if isZeroWP}}
|
||||
<div class="dialog-skill red-warning">{{localize "CTHULHUETERNAL.Label.ZeroWP"}}</div>
|
||||
{{else}}
|
||||
{{#if isLowWP}}
|
||||
<div class="dialog-skill orange-warning">{{localize "CTHULHUETERNAL.Label.LowWP"}} : -20%</div>
|
||||
{{/if}}
|
||||
{{#if isLowWP}}
|
||||
<div class="dialog-skill orange-warning">{{localize "CTHULHUETERNAL.Label.LowWP"}} : -20%</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
{{#if isExhausted}}
|
||||
|
@@ -14,6 +14,10 @@
|
||||
{{system.skillTotal}}
|
||||
</div>
|
||||
{{#if isGM}}
|
||||
{{formField systemFields.isHealing value=system.isHealing}}
|
||||
{{#if system.isHealing}}
|
||||
{{formField systemFields.healingFormula value=system.healingFormula}}
|
||||
{{/if}}
|
||||
{{formField systemFields.isAdversary value=system.isAdversary }}
|
||||
{{formField systemFields.diceEvolved value=system.diceEvolved}}
|
||||
|
||||
@@ -21,6 +25,10 @@
|
||||
{{formField systemFields.rollFailed value=system.rollFailed}}
|
||||
{{/if}}
|
||||
{{else}}
|
||||
{{formField systemFields.isHealing value=system.isHealing disabled=true}}
|
||||
{{#if system.isHealing}}
|
||||
{{formField systemFields.healingFormula value=system.healingFormula disabled=true}}
|
||||
{{/if}}
|
||||
{{formField systemFields.isAdversary value=system.isAdversary disabled=true}}
|
||||
{{formField systemFields.diceEvolved value=system.diceEvolved disabled=true}}
|
||||
|
||||
|
@@ -8,28 +8,64 @@
|
||||
{{formField systemFields.settings value=system.settings localize=true}}
|
||||
{{formField systemFields.weaponType value=system.weaponType localize=true}}
|
||||
{{#if (eq system.weaponType "rangedfirearm")}}
|
||||
{{formField systemFields.weaponSubtype value=system.weaponSubtype localize=true}}
|
||||
{{formField systemFields.weaponSubtype value=system.weaponSubtype localize=true}}
|
||||
{{/if}}
|
||||
|
||||
{{formField systemFields.state value=system.state localize=true}}
|
||||
{{formField systemFields.isStunning value=system.isStunning localize=true}}
|
||||
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.hasDirectSkill value=system.hasDirectSkill }}
|
||||
{{#if system.hasDirectSkill}}
|
||||
{{formField systemFields.directSkillValue value=system.directSkillValue }}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{formField systemFields.hasSelectiveFire value=system.hasSelectiveFire}}
|
||||
{{formField systemFields.applyDamageBonus value=system.applyDamageBonus}}
|
||||
{{formField systemFields.damage value=system.damage}}
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.hasDamageDistance value=system.hasDamageDistance localize=true}}
|
||||
</div>
|
||||
|
||||
{{formField systemFields.baseRange value=system.baseRange}}
|
||||
{{formField systemFields.rangeUnit value=system.rangeUnit localize=true}}
|
||||
{{formField systemFields.lethality value=system.lethality}}
|
||||
{{formField systemFields.killRadius value=system.killRadius}}
|
||||
{{#if system.hasDamageDistance}}
|
||||
{{#each system.damageDistance as |damageDistance idx|}}
|
||||
<div class="flexrow">
|
||||
<label class="damage-distance">Distance</label><input type="number" name="system.damageDistance.{{idx}}.distance" value="{{damageDistance.distance}}" min="0" />
|
||||
<label>Damage</label><input type="text" name="system.damageDistance.{{idx}}.damage" value="{{damageDistance.damage}}" />
|
||||
</div>
|
||||
{{/each}}
|
||||
{{else}}
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.damage value=system.damage}}
|
||||
{{formField systemFields.applyDamageBonus value=system.applyDamageBonus}}
|
||||
</div>
|
||||
{{#if isRanged}}
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.baseRange value=system.baseRange}}
|
||||
{{formField systemFields.rangeUnit value=system.rangeUnit localize=true}}
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
{{#if isFireArm}}
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.hasSelectiveFire value=system.hasSelectiveFire}}
|
||||
{{formField systemFields.hasSight value=system.hasSight}}
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.ammo.fields.value value=system.ammo.value}}
|
||||
{{formField systemFields.ammo.fields.max value=system.ammo.max}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.lethality value=system.lethality}}
|
||||
{{formField systemFields.killRadius value=system.killRadius}}
|
||||
</div>
|
||||
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.armorPiercing value=system.armorPiercing}}
|
||||
|
||||
{{formField systemFields.resourceLevel value=system.resourceLevel}}
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
|
Reference in New Issue
Block a user