Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 748c4480c9 | |||
| 21dca4446f | |||
| 6aa0b3a58d | |||
| 810271c2a2 | |||
| 27b09d4546 | |||
| c180365a61 | |||
| ace607d05c | |||
| 8a5d1cc1d8 | |||
| 99d9cb435f | |||
| f57b016b46 | |||
| 09907dbbf7 | |||
| e65f0a1670 | |||
| 941db9436f | |||
| 0874507025 | |||
| 2578ea4dc1 | |||
| d80e3e4658 | |||
| 188501423a | |||
| 668da28d2c | |||
| 8a5b402388 | |||
| ebb3bd9fb3 |
@@ -8,45 +8,45 @@ jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo "💡 The ${{ gitea.repository }} repository will cloned to the runner."
|
||||
- run: echo "💡 The ${{ gitea.repository }} repository will cloned to the runner."
|
||||
|
||||
#- uses: actions/checkout@v3
|
||||
- uses: RouxAntoine/checkout@v3.5.4
|
||||
#- uses: actions/checkout@v3
|
||||
- uses: RouxAntoine/checkout@v3.5.4
|
||||
|
||||
# get part of the tag after the `v`
|
||||
- name: Extract tag version number
|
||||
id: get_version
|
||||
uses: battila7/get-version-action@v2
|
||||
# get part of the tag after the `v`
|
||||
- name: Extract tag version number
|
||||
id: get_version
|
||||
uses: battila7/get-version-action@v2
|
||||
|
||||
# Substitute the Manifest and Download URLs in the module.json
|
||||
- name: Substitute Manifest and Download Links For Versioned Ones
|
||||
id: sub_manifest_link_version
|
||||
uses: microsoft/variable-substitution@v1
|
||||
with:
|
||||
files: 'system.json'
|
||||
env:
|
||||
version: ${{steps.get_version.outputs.version-without-v}}
|
||||
url: https://www.uberwald.me/gitea/${{gitea.repository}}
|
||||
manifest: https://www.uberwald.me/gitea/uberwald/${{gitea.repository}}/releases/download/latest/system.json
|
||||
download: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-ftl-nomad-${{github.event.release.tag_name}}.zip
|
||||
# Substitute the Manifest and Download URLs in the module.json
|
||||
- name: Substitute Manifest and Download Links For Versioned Ones
|
||||
id: sub_manifest_link_version
|
||||
uses: microsoft/variable-substitution@v1
|
||||
with:
|
||||
files: "system.json"
|
||||
env:
|
||||
version: ${{steps.get_version.outputs.version-without-v}}
|
||||
url: https://www.uberwald.me/gitea/${{gitea.repository}}
|
||||
manifest: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/latest/system.json
|
||||
download: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-ftl-nomad-${{github.event.release.tag_name}}.zip
|
||||
|
||||
# Create a zip file with all files required by the module to add to the release
|
||||
- run: |
|
||||
apt update -y
|
||||
apt install -y zip
|
||||
# Create a zip file with all files required by the module to add to the release
|
||||
- run: |
|
||||
apt update -y
|
||||
apt install -y zip
|
||||
|
||||
- run: zip -r ./fvtt-ftl-nomad-${{github.event.release.tag_name}}.zip system.json README.md LICENSE assets/ css/ lang/ module/ packs/ packs-system/ templates/ fvtt-ftl-nomad.mjs
|
||||
- run: zip -r ./fvtt-ftl-nomad-${{github.event.release.tag_name}}.zip system.json README.md LICENSE assets/ css/ lang/ module/ packs/ packs-system/ templates/ fvtt-ftl-nomad.mjs
|
||||
|
||||
- name: setup go
|
||||
uses: https://github.com/actions/setup-go@v4
|
||||
with:
|
||||
go-version: '>=1.20.1'
|
||||
- name: setup go
|
||||
uses: https://github.com/actions/setup-go@v4
|
||||
with:
|
||||
go-version: ">=1.20.1"
|
||||
|
||||
- name: Use Go Action
|
||||
id: use-go-action
|
||||
uses: https://gitea.com/actions/release-action@main
|
||||
with:
|
||||
files: |-
|
||||
./fvtt-ftl-nomad-${{github.event.release.tag_name}}.zip
|
||||
system.json
|
||||
api_key: '${{secrets.ALLOW_PUSH_RELEASE}}'
|
||||
- name: Use Go Action
|
||||
id: use-go-action
|
||||
uses: https://gitea.com/actions/release-action@main
|
||||
with:
|
||||
files: |-
|
||||
./fvtt-ftl-nomad-${{github.event.release.tag_name}}.zip
|
||||
system.json
|
||||
api_key: "${{secrets.ALLOW_PUSH_RELEASE}}"
|
||||
|
||||
15
README.md
15
README.md
@@ -1,3 +1,14 @@
|
||||
# fvtt-ftl-nomad
|
||||
Faster Than Light: Nomad (FTL: Nomad) for Foundry Virtual TableTop
|
||||
|
||||
Faster Than Light : Nomad system for FoundryVTT
|
||||
The official game system for playing Faster Than Light: Nomad on FoundryVTT. This framework covers all the fundemental aspects of Faster Than Light: Nomad and permits full FTL:N online gameplay.
|
||||
|
||||
This product's format, computer code, graphics, and presentation are copyrighted by Stellagama Publishing.
|
||||
|
||||
This system is used with permission granted as part of the partnership agreement between Foundry Gaming LLC and Stellagama Publishing. It uses the following copyright:
|
||||
|
||||
Faster Than Light: Nomad, © 2025 Stellagama Publishing. All rights reserved.
|
||||
|
||||
Stellagama Publishing's web page is available at https://stellagamapublishing.co/ and the company's owner, Omer Golan-Joel, may be contacted at golan2072@gmail.com.
|
||||
|
||||
Community
|
||||
You are invited to join Stellagama Publishing's Discord server: https://discord.gg/MHpMDBpcZ6
|
||||
|
||||
1
assets/icons/icon_robot.svg
Normal file
1
assets/icons/icon_robot.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><filter id="shadow-1" height="300%" width="300%" x="-100%" y="-100%"><feFlood flood-color="rgba(255, 255, 255, 1)" result="flood"></feFlood><feComposite in="flood" in2="SourceGraphic" operator="atop" result="composite"></feComposite><feGaussianBlur in="composite" stdDeviation="15" result="blur"></feGaussianBlur><feOffset dx="0" dy="0" result="offset"></feOffset><feComposite in="SourceGraphic" in2="offset" operator="over"></feComposite></filter></defs><g class="" style="" transform="translate(0,0)"><path d="M265.344 18.563v302.863h-18.69V18.59c-61.403 3.005-115.44 34.412-149.238 81.336l35.022 60.658a46.633 46.633 0 0 1 12.11-1.598c25.747 0 46.62 20.872 46.62 46.62 0 22.556-16.02 41.37-37.3 45.687v174.084c13.712 21.43 27.6 41.98 40.712 60.754V369.01h122.838v117.117c13.11-18.773 27-39.324 40.713-60.754V251.294c-21.282-4.317-37.302-23.13-37.302-45.688 0-25.747 20.873-46.62 46.62-46.62 4.19 0 8.25.562 12.113 1.6l35.13-60.847c-33.74-47-87.758-78.375-149.346-81.175zM426.03 117.47l-29.74 51.52c10.824 8.537 17.782 21.76 17.782 36.615 0 22.54-15.995 41.343-37.254 45.68V395.38c9.833-16.237 19.31-32.676 28.014-48.927 27.3-50.976 46.564-100.37 46.564-132.36 0-35.127-9.22-68.104-25.365-96.622zm-339.973.157c-16.196 28.486-25.46 61.408-25.46 96.465 0 31.992 19.267 81.385 46.567 132.36 8.704 16.253 18.182 32.694 28.016 48.933v-144.1c-21.26-4.336-37.254-23.14-37.254-45.68 0-14.856 6.957-28.08 17.783-36.617l-29.653-51.36zm127.213 270.07V488.98h85.46V387.696h-85.46z" fill="#7ed321" fill-opacity="1" filter="url(#shadow-1)" stroke="#ffffff" stroke-opacity="1" stroke-width="8"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
112
assets/json_data/vehicleweapons.json
Normal file
112
assets/json_data/vehicleweapons.json
Normal file
@@ -0,0 +1,112 @@
|
||||
[
|
||||
{
|
||||
"name": "Autocannon, Light",
|
||||
"tech_age": "Late Mechanical",
|
||||
"cost": 10000,
|
||||
"range": "heavy",
|
||||
"damage": "5d6",
|
||||
"mag": 100,
|
||||
"ammo_cost": 1000,
|
||||
"aspect": "Auto, AV 3d6+1.",
|
||||
"description": "This weapon can fire bursts of shells at high rates of fire. It is common to find this mounted on aircraft as a dogfighting weapon, as well as on light armored vehicles as a support weapon for infantry."
|
||||
},
|
||||
{
|
||||
"name": "Autocannon, Heavy",
|
||||
"tech_age": "Late Mechanical",
|
||||
"cost": 20000,
|
||||
"range": "heavy",
|
||||
"damage": "5d6",
|
||||
"mag": 50,
|
||||
"ammo_cost": 2000,
|
||||
"aspect": "Auto, AV 3d6+2.",
|
||||
"description": "A larger version of the light autocannon, often found on light armored vehicles, naval vessels, and ground attack aircraft."
|
||||
},
|
||||
{
|
||||
"name": "Cannon, Light",
|
||||
"tech_age": "Early Mechanical",
|
||||
"cost": 15000,
|
||||
"range": "heavy",
|
||||
"damage": "5d6",
|
||||
"mag": 40,
|
||||
"ammo_cost": 2000,
|
||||
"aspect": "AV 4d6+1.",
|
||||
"description": "A multipurpose support weapon usually mounted on a vehicle or gun carriage."
|
||||
},
|
||||
{
|
||||
"name": "Cannon, Heavy",
|
||||
"tech_age": "Early Mechanical",
|
||||
"cost": 30000,
|
||||
"range": "heavy",
|
||||
"damage": "6d6",
|
||||
"mag": 20,
|
||||
"ammo_cost": 3000,
|
||||
"aspect": "AV 5d6.",
|
||||
"description": "This cannon is a main battle tank’s primary weapon. It is often used as field artillery as well."
|
||||
},
|
||||
{
|
||||
"name": "Heavy Flamer",
|
||||
"tech_age": "Late Mechanical",
|
||||
"cost": 1000,
|
||||
"range": "Rifle",
|
||||
"damage": "3d6",
|
||||
"mag": 5,
|
||||
"ammo_cost": 25,
|
||||
"aspect": "AV 2d6, Fire. ",
|
||||
"description": "A brutal close-in anti-infantry weapon used to flush out fortifications and defend against infantry attack in built-up areas. Vehicles that carry flamethrowers are usually the first to be targeted by enemy infantry."
|
||||
},
|
||||
{
|
||||
"name": "Grenade Launcher",
|
||||
"tech_age": "Late Mechanical",
|
||||
"cost": 400,
|
||||
"range": "Rifle",
|
||||
"damage": "According to grenade",
|
||||
"mag": 50,
|
||||
"ammo_cost": 0,
|
||||
"aspect": "",
|
||||
"description": "A light support weapon mounted on many vehicles. This version has a 50 round belt magazine. Many vehicles mount smoke grenade launchers as defensive weapons."
|
||||
},
|
||||
{
|
||||
"name": "Guided Anti-Tank Missile",
|
||||
"tech_age": "Early Atomic",
|
||||
"cost": 4000,
|
||||
"range": "heavy",
|
||||
"damage": "5d6",
|
||||
"mag": 4,
|
||||
"ammo_cost": 200,
|
||||
"aspect": "Blast, AV 5d6. ",
|
||||
"description": "This vehicle mounted version of the portable anti-tank missile launcher has a magazine of four missiles. A system like this is often mounted on a light vehicle to give it significant anti-armor punch."
|
||||
},
|
||||
{
|
||||
"name": "Laser Cannon",
|
||||
"tech_age": "Early Space",
|
||||
"cost": 10000,
|
||||
"range": "heavy",
|
||||
"damage": "5d6",
|
||||
"mag": 100,
|
||||
"ammo_cost": 100,
|
||||
"aspect": "AV 4d6+2.",
|
||||
"description": "The Early Space Age’s replacement for all but the heaviest cannons, this vehicle weapon is highly efficient, and can be recharged from any power grid. This makes it the darling of logistics officers in any military where it is found."
|
||||
},
|
||||
{
|
||||
"name": "Laser, Support",
|
||||
"tech_age": "Early Space",
|
||||
"cost": 5000,
|
||||
"range": "heavy",
|
||||
"damage": "5d6",
|
||||
"mag": 100,
|
||||
"ammo_cost": 100,
|
||||
"aspect": "AV 3d6+1.",
|
||||
"description": "This vehicle mounted version of the portable support laser lacks auto fire capabilities but has a nearly inexhaustible ammunition supply."
|
||||
},
|
||||
{
|
||||
"name": "Rocket Launcher",
|
||||
"tech_age": "Early Atomic",
|
||||
"cost": 2000,
|
||||
"range": "heavy",
|
||||
"damage": "4d6",
|
||||
"mag": 1,
|
||||
"ammo_cost": 150,
|
||||
"aspect": "Greater Blast, AV 3d6.",
|
||||
"description": "A portable rocket launcher utilizing unguided munitions. Rocket payloads are considered high explosive and are not particularly effective against armored vehicles. Vehicle-mounted versions usually have 12 or 24 shots before requiring reloading."
|
||||
}
|
||||
]
|
||||
@@ -24,6 +24,7 @@
|
||||
body {
|
||||
--color-text-secondary: #160303;
|
||||
--color-text-emphatic: #09610e;
|
||||
--input-height: 1.6rem;
|
||||
}
|
||||
.d100 {
|
||||
width: 18px;
|
||||
@@ -74,6 +75,11 @@ i.fvtt-ftl-nomad {
|
||||
.application.dialog.fvtt-ftl-nomad .legend {
|
||||
font-family: var(--font-primary);
|
||||
}
|
||||
.sheet-tabs {
|
||||
background-color: var(--color-light-1);
|
||||
font-family: Ethnocentric;
|
||||
font-size: 0.7rem;
|
||||
}
|
||||
.chat-message,
|
||||
.chat-message.whisper {
|
||||
font-family: var(--font-primary);
|
||||
@@ -99,8 +105,8 @@ i.fvtt-ftl-nomad {
|
||||
.fvtt-ftl-nomad .vehicle-sheet-common .form-group label {
|
||||
font-weight: bold;
|
||||
margin-right: 8px;
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-sheet-common label {
|
||||
font-family: var(--font-secondary);
|
||||
@@ -118,6 +124,22 @@ i.fvtt-ftl-nomad {
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-sheet-common label {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-sheet-common .form-group {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-sheet-common .form-group label {
|
||||
font-weight: bold;
|
||||
margin-right: 8px;
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .creature-sheet-common label {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
@@ -327,24 +349,26 @@ i.fvtt-ftl-nomad {
|
||||
min-width: 5.2rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .character-main .character-pc .character-right .encumbrance {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .character-main .character-pc .character-right .encumbrance .form-group {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .character-main .character-pc .character-right .encumbrance label {
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
min-width: 3rem;
|
||||
max-width: 3rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .character-main .character-pc .character-right .encumbrance input {
|
||||
max-width: 3rem;
|
||||
min-width: 3rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .character-main .character-pc .character-right .encumbrance .character-credit input {
|
||||
max-width: 9rem;
|
||||
min-width: 9rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .character-main .character-pc .character-right .character-name {
|
||||
display: flex;
|
||||
}
|
||||
@@ -366,7 +390,7 @@ i.fvtt-ftl-nomad {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
justify-content: space-evenly;
|
||||
flex: 1;
|
||||
}
|
||||
.fvtt-ftl-nomad .character-main .character-skills .character-skill {
|
||||
@@ -413,10 +437,10 @@ i.fvtt-ftl-nomad {
|
||||
background-color: var(--color-light-1);
|
||||
}
|
||||
.fvtt-ftl-nomad .character-biography prose-mirror.inactive {
|
||||
min-height: 40px;
|
||||
min-height: 16rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .character-biography prose-mirror.active {
|
||||
min-height: 150px;
|
||||
min-height: 16rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .character-biography .field-label {
|
||||
margin-left: 8px;
|
||||
@@ -984,8 +1008,8 @@ i.fvtt-ftl-nomad {
|
||||
.fvtt-ftl-nomad .vehicle-content .form-group label {
|
||||
font-weight: bold;
|
||||
margin-right: 8px;
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .sheet-tabs {
|
||||
background-color: var(--color-light-1);
|
||||
@@ -1015,6 +1039,12 @@ i.fvtt-ftl-nomad {
|
||||
width: auto;
|
||||
border: none;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-left .spec label {
|
||||
max-width: 4rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-left .spec input {
|
||||
max-width: 4rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -1030,8 +1060,7 @@ i.fvtt-ftl-nomad {
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .cargo label,
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .capacity label {
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
max-width: 7rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .cargo input,
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .capacity input {
|
||||
@@ -1040,10 +1069,31 @@ i.fvtt-ftl-nomad {
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .cargo .cargo-content,
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .capacity .cargo-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .cargo .cargo-content .cargo-line,
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .capacity .cargo-content .cargo-line {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .cargo .npc-crew-field,
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .capacity .npc-crew-field {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .cargo .npc-crew-field .npc-crew-roll,
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .capacity .npc-crew-field .npc-crew-roll {
|
||||
cursor: pointer;
|
||||
color: var(--color-text-dark-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .cargo .npc-crew-field .npc-crew-roll:hover,
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .capacity .npc-crew-field .npc-crew-roll:hover {
|
||||
color: var(--color-text-hyperlink);
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .vehicle-infos {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -1104,6 +1154,15 @@ i.fvtt-ftl-nomad {
|
||||
.fvtt-ftl-nomad .vehicle-description .field-label {
|
||||
margin-left: 8px;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-description .section-editor {
|
||||
min-height: 10rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-description .section-editor .editor {
|
||||
min-height: 10rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-description .section-editor .editor-content {
|
||||
min-height: 10rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-description .biodata {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
@@ -1128,6 +1187,65 @@ i.fvtt-ftl-nomad {
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
padding-left: 5px;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-list {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 8px;
|
||||
padding: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 4px;
|
||||
border: 1px solid var(--color-border-dark);
|
||||
border-radius: 4px;
|
||||
background: var(--color-light-2);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .crew-img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 50%;
|
||||
border: 1px solid var(--color-border-dark);
|
||||
cursor: pointer;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .crew-img:hover {
|
||||
opacity: 0.8;
|
||||
box-shadow: 0 0 4px var(--color-shadow-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .crew-name {
|
||||
flex: 1;
|
||||
font-size: var(--font-size-small);
|
||||
cursor: pointer;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .crew-name:hover {
|
||||
color: var(--color-text-dark-highlight);
|
||||
text-shadow: 0 0 4px var(--color-shadow-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .controls {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
min-width: 3rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .controls a {
|
||||
color: var(--color-text-dark-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .controls a:hover {
|
||||
color: var(--color-text-dark-highlight);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .controls .pilot-button {
|
||||
color: var(--color-text-light-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .controls .pilot-button:hover {
|
||||
color: var(--color-text-light-highlight);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-empty {
|
||||
grid-column: 1 / -1;
|
||||
text-align: center;
|
||||
padding: 8px;
|
||||
font-style: italic;
|
||||
color: var(--color-text-dark-secondary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .weapons {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
@@ -1202,6 +1320,374 @@ i.fvtt-ftl-nomad {
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div prose-mirror.active {
|
||||
min-height: 150px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-content {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
color: var(--color-dark-1);
|
||||
background-color: var(--color-light-1);
|
||||
/*background-image: var(--background-image-base);*/
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
overflow: scroll;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-content input:disabled,
|
||||
.fvtt-ftl-nomad .robot-content select:disabled {
|
||||
background-color: rgba(0, 0, 0, 0.2);
|
||||
border-color: transparent;
|
||||
color: var(--color-dark-3);
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-content input,
|
||||
.fvtt-ftl-nomad .robot-content select {
|
||||
background-color: rgba(0, 0, 0, 0.1);
|
||||
border-color: var(--color-dark-6);
|
||||
color: var(--color-dark-2);
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-content input[name="name"] {
|
||||
height: 40px;
|
||||
margin-right: 10px;
|
||||
font-family: var(--font-title);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-weight: bold;
|
||||
border: none;
|
||||
margin-top: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-content fieldset {
|
||||
margin-bottom: 4px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-content .form-fields input,
|
||||
.fvtt-ftl-nomad .robot-content .form-fields select {
|
||||
text-align: center;
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-content .form-fields select {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-content legend {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-content label {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-content .form-group {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-content .form-group label {
|
||||
font-weight: bold;
|
||||
margin-right: 8px;
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .sheet-tabs {
|
||||
background-color: var(--color-light-1);
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
flex: 1;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-left {
|
||||
min-width: 180px;
|
||||
max-width: 180px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-left .robot-left-image {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-left .robot-left-image .robot-img {
|
||||
height: 140px;
|
||||
width: auto;
|
||||
border: none;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-left .robot-cost label {
|
||||
min-width: 3rem;
|
||||
max-width: 3rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-left .robot-cost input {
|
||||
min-width: 6rem;
|
||||
max-width: 6rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .robot-name {
|
||||
display: flex;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .robot-name input {
|
||||
font-family: var(--font-title);
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
width: 380px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .robot-brain {
|
||||
min-width: 25rem;
|
||||
max-width: 25rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .robot-brain textarea {
|
||||
min-width: 23rem;
|
||||
max-width: 23rem;
|
||||
background-color: rgba(0, 0, 0, 0.2);
|
||||
color: var(--color-dark-3);
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .main-stats {
|
||||
min-width: 25rem;
|
||||
max-width: 25rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .main-stats .encumbered {
|
||||
color: red;
|
||||
font-weight: bold;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .cargo label,
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .capacity label {
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .cargo input,
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .capacity input {
|
||||
max-width: 6rem;
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .cargo .cargo-content,
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .capacity .cargo-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .robot-infos {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .robot-infos label {
|
||||
min-width: 120px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .robot-infos .robot-hp {
|
||||
display: flex;
|
||||
gap: 2px;
|
||||
align-items: center;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .robot-infos .robot-hp .robot-hp-value .form-fields input {
|
||||
flex: none;
|
||||
width: 50px;
|
||||
margin-left: 4px;
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .robot-infos .robot-hp .robot-hp-max {
|
||||
clear: both;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
margin: 3px 0;
|
||||
align-items: center;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .robot-infos .robot-hp .robot-hp-max input {
|
||||
width: 50px;
|
||||
text-align: center;
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .robot-infos .robot-hp .hp-separator {
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-skills {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-evenly;
|
||||
flex: 1;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-skills .robot-skill {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-skills .robot-skill .icon-skill {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-skills .robot-skill .rollable:hover,
|
||||
.fvtt-ftl-nomad .robot-main .robot-skills .robot-skill .rollable:focus {
|
||||
text-shadow: 0 0 8px var(--color-shadow-primary);
|
||||
cursor: pointer;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-skills .robot-skill .rollable {
|
||||
min-width: 4.5rem;
|
||||
max-width: 4.5rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-skills .robot-skill .char-text {
|
||||
margin-left: 0.5rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-skills .robot-skill .d100 {
|
||||
flex: 0;
|
||||
max-width: 0.6rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-skills .robot-skill .form-group {
|
||||
flex: 0;
|
||||
padding-left: 5px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-skills .robot-skill .form-group .form-fields {
|
||||
font-size: 1.1rem;
|
||||
flex: none;
|
||||
width: 40px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-skill-play {
|
||||
min-width: 225px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-skill-edit {
|
||||
min-width: 225px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc-play {
|
||||
min-width: 500px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc-edit {
|
||||
min-width: 500px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-description {
|
||||
background-color: var(--color-light-1);
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-description .text-center {
|
||||
text-align: left;
|
||||
align-content: center;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-description prose-mirror.inactive {
|
||||
min-height: 40px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-description prose-mirror.active {
|
||||
min-height: 150px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-description .field-label {
|
||||
margin-left: 8px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-description .robot-brain input {
|
||||
min-width: 32rem;
|
||||
max-width: 32rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-description .section-editor {
|
||||
min-height: 10rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-description .section-editor .editor {
|
||||
min-height: 10rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-description .section-editor .editor-content {
|
||||
min-height: 10rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-description .biodata {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 8px;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-description .biodata label {
|
||||
min-width: 3rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-description .biodata .feature {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
min-width: 18rem;
|
||||
max-width: 18rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div {
|
||||
background-color: var(--color-light-1);
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div legend a {
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
padding-left: 5px;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div .weapons {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div .weapons .weapon {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
min-width: 13rem;
|
||||
max-width: 13srem;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div .weapons .weapon .rollable:hover,
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div .weapons .weapon .rollable:focus {
|
||||
text-shadow: 0 0 8px var(--color-shadow-primary);
|
||||
cursor: pointer;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div .weapons .weapon .controls {
|
||||
min-width: 2rem;
|
||||
max-width: 2rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div .weapons .weapon .damage {
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div .weapons .weapon .name {
|
||||
min-width: 8rem;
|
||||
max-width: 8rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div .weapons .weapon .item-img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
margin: 4px 0 0 0;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div .equipments {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div .equipments .equipment {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
min-width: 13rem;
|
||||
max-width: 13srem;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div .equipments .equipment .rollable:hover,
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div .equipments .equipment .rollable:focus {
|
||||
text-shadow: 0 0 8px var(--color-shadow-primary);
|
||||
cursor: pointer;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div .equipments .equipment .controls {
|
||||
min-width: 2rem;
|
||||
max-width: 2rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div .equipments .equipment .damage {
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div .equipments .equipment .name {
|
||||
min-width: 8rem;
|
||||
max-width: 8rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div .equipments .equipment .item-img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
margin: 4px 0 0 0;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div prose-mirror.inactive {
|
||||
min-height: 40px;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.robot-equipment .main-div prose-mirror.active {
|
||||
min-height: 150px;
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-content {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
@@ -1268,9 +1754,6 @@ i.fvtt-ftl-nomad {
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .sheet-tabs {
|
||||
background-color: var(--color-light-1);
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-main {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
@@ -1324,6 +1807,10 @@ i.fvtt-ftl-nomad {
|
||||
text-shadow: 0 0 8px var(--color-shadow-primary);
|
||||
cursor: pointer;
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-main .starship-pc .starship-right .capacity .hull-field select {
|
||||
min-width: 10rem;
|
||||
max-width: 10rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-main .starship-pc .starship-right .capacity label {
|
||||
margin-left: 0.2rem;
|
||||
max-width: 7rem;
|
||||
@@ -1335,6 +1822,11 @@ i.fvtt-ftl-nomad {
|
||||
align-self: center;
|
||||
gap: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-main .starship-pc .starship-right .capacity .flexrow-guns .starship-guns-label {
|
||||
min-width: 7.4rem;
|
||||
max-width: 7.4rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-main .starship-pc .starship-right .capacity input {
|
||||
max-width: 5rem;
|
||||
}
|
||||
@@ -1352,6 +1844,18 @@ i.fvtt-ftl-nomad {
|
||||
.fvtt-ftl-nomad .starship-main .starship-pc .starship-right .cargo select {
|
||||
max-width: 5rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-main .starship-pc .starship-right .cargo .npc-crew-field {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-main .starship-pc .starship-right .cargo .npc-crew-field .npc-crew-roll {
|
||||
cursor: pointer;
|
||||
color: var(--color-text-dark-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-main .starship-pc .starship-right .cargo .npc-crew-field .npc-crew-roll:hover {
|
||||
color: var(--color-text-hyperlink);
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-main .starship-pc .starship-right .starship-infos {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -1408,6 +1912,15 @@ i.fvtt-ftl-nomad {
|
||||
.fvtt-ftl-nomad .starship-description .field-label {
|
||||
margin-left: 8px;
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-description .section-editor {
|
||||
min-height: 10rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-description .section-editor .editor {
|
||||
min-height: 10rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-description .section-editor .editor-content {
|
||||
min-height: 10rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-description .biodata {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
@@ -1432,6 +1945,65 @@ i.fvtt-ftl-nomad {
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
padding-left: 5px;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-list {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 8px;
|
||||
padding: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 4px;
|
||||
border: 1px solid var(--color-border-dark);
|
||||
border-radius: 4px;
|
||||
background: var(--color-light-2);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .crew-img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 50%;
|
||||
border: 1px solid var(--color-border-dark);
|
||||
cursor: pointer;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .crew-img:hover {
|
||||
opacity: 0.8;
|
||||
box-shadow: 0 0 4px var(--color-shadow-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .crew-name {
|
||||
flex: 1;
|
||||
font-size: var(--font-size-small);
|
||||
cursor: pointer;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .crew-name:hover {
|
||||
color: var(--color-text-dark-highlight);
|
||||
text-shadow: 0 0 4px var(--color-shadow-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .controls {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
min-width: 3rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .controls a {
|
||||
color: var(--color-text-dark-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .controls a:hover {
|
||||
color: var(--color-text-dark-highlight);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .controls .pilot-button {
|
||||
color: var(--color-text-light-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .controls .pilot-button:hover {
|
||||
color: var(--color-text-light-highlight);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-empty {
|
||||
grid-column: 1 / -1;
|
||||
text-align: center;
|
||||
padding: 8px;
|
||||
font-style: italic;
|
||||
color: var(--color-text-dark-secondary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .weapons {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
@@ -1678,7 +2250,7 @@ i.fvtt-ftl-nomad {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
justify-content: space-evenly;
|
||||
flex: 1;
|
||||
}
|
||||
.fvtt-ftl-nomad .creature-main .creature-skills .creature-skill {
|
||||
@@ -1744,6 +2316,15 @@ i.fvtt-ftl-nomad {
|
||||
.fvtt-ftl-nomad .creature-biography .rank input {
|
||||
max-width: 4rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .creature-biography .section-editor {
|
||||
min-height: 10rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .creature-biography .section-editor .editor {
|
||||
min-height: 10rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .creature-biography .section-editor .editor-content {
|
||||
min-height: 10rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .creature-biography .biodata {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
|
||||
@@ -31,19 +31,27 @@ Hooks.once("init", function () {
|
||||
utils: FTLNomadUtils,
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
// Set an initiative formula for the system
|
||||
CONFIG.Combat.initiative = {
|
||||
formula: "2d6 + @skills.combat.value",
|
||||
decimals: 1
|
||||
};
|
||||
|
||||
CONFIG.Actor.documentClass = documents.FTLNomadActor
|
||||
CONFIG.Actor.dataModels = {
|
||||
character: models.FTLNomadCharacter,
|
||||
vehicle: models.FTLNomadVehicle,
|
||||
creature: models.FTLNomadCreature,
|
||||
starship: models.FTLNomadStarship
|
||||
starship: models.FTLNomadStarship,
|
||||
robot: models.FTLNomadRobot
|
||||
}
|
||||
|
||||
CONFIG.Item.documentClass = documents.FTLNomadItem
|
||||
CONFIG.Item.dataModels = {
|
||||
psionic: models.FTLNomadPsionic,
|
||||
weapon: models.FTLNomadWeapon,
|
||||
armor: models.FTLNomadArmor,
|
||||
armor: models.FTLNomadArmor,
|
||||
talent: models.FTLNomadTalent,
|
||||
language: models.FTLNomadLanguage,
|
||||
equipment: models.FTLNomadEquipment,
|
||||
@@ -54,10 +62,11 @@ Hooks.once("init", function () {
|
||||
|
||||
// Register sheet application classes
|
||||
foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet)
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-ftl-nomad", applications.FTLNomadCharacterSheet , { types: ["character"], makeDefault: true })
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-ftl-nomad", applications.FTLNomadCharacterSheet, { types: ["character"], makeDefault: true })
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-ftl-nomad", applications.FTLNomadVehicleSheet, { types: ["vehicle"], makeDefault: true })
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-ftl-nomad", applications.FTLNomadCreatureSheet, { types: ["creature"], makeDefault: true })
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-ftl-nomad", applications.FTLNomadStarshipSheet, { types: ["starship"], makeDefault: true })
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-ftl-nomad", applications.FTLNomadRobotSheet, { types: ["robot"], makeDefault: true })
|
||||
|
||||
foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet)
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-ftl-nomad", applications.FTLNomadPsionicSheet, { types: ["psionic"], makeDefault: true })
|
||||
|
||||
167
lang/en.json
167
lang/en.json
@@ -292,6 +292,90 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"Robot": {
|
||||
"Size": {
|
||||
"Tiny": "Tiny",
|
||||
"Small": "Small",
|
||||
"Medium": "Medium",
|
||||
"Large": "Large",
|
||||
"Huge": "Huge",
|
||||
"Giant": "Giant",
|
||||
"Titanic": "Titanic",
|
||||
"Gargantuan": "Gargantuan"
|
||||
},
|
||||
"FIELDS": {
|
||||
"enc": {
|
||||
"label": "Enc",
|
||||
"value": {
|
||||
"label": "Enc Curr."
|
||||
},
|
||||
"max": {
|
||||
"label": "Enc Max"
|
||||
}
|
||||
},
|
||||
"brain": {
|
||||
"label": "Brain"
|
||||
},
|
||||
"cost": {
|
||||
"label": "Cost"
|
||||
},
|
||||
"techAge": {
|
||||
"label": "Tech Age"
|
||||
},
|
||||
"damage": {
|
||||
"label": "Damage"
|
||||
},
|
||||
"robotSize": {
|
||||
"label": "Size"
|
||||
},
|
||||
"speed": {
|
||||
"label": "Speed"
|
||||
},
|
||||
"durability": {
|
||||
"label": "Durability"
|
||||
},
|
||||
"protection": {
|
||||
"label": "Protection"
|
||||
},
|
||||
"characteristics:": {
|
||||
"char": {
|
||||
"label": "Charisma"
|
||||
},
|
||||
"con": {
|
||||
"label": "Constitution"
|
||||
},
|
||||
"dex": {
|
||||
"label": "Dexterity"
|
||||
},
|
||||
"int": {
|
||||
"label": "Intelligence"
|
||||
},
|
||||
"pow": {
|
||||
"label": "Power"
|
||||
},
|
||||
"str": {
|
||||
"label": "Strength"
|
||||
}
|
||||
},
|
||||
"damageBonus": {
|
||||
"label": "Dmg.Bonus"
|
||||
},
|
||||
"resources": {
|
||||
"hand": {
|
||||
"label": "Hand"
|
||||
},
|
||||
"permanentRating": {
|
||||
"label": "Permanent Rating"
|
||||
},
|
||||
"storage": {
|
||||
"label": "Storage"
|
||||
},
|
||||
"stowed": {
|
||||
"label": "Stowed"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"CreatureAbility": {
|
||||
"FIELDS": {
|
||||
"description": {
|
||||
@@ -351,7 +435,11 @@
|
||||
}
|
||||
},
|
||||
"Label": {
|
||||
"damages": "Damages",
|
||||
"robot": "Robot",
|
||||
"techAge": "Tech Age",
|
||||
"mainStats": "Main Stats",
|
||||
"formula": "Formula",
|
||||
"damages": "Damage",
|
||||
"modifications": "Modifications",
|
||||
"abilities": "Abilities",
|
||||
"Details": "Details",
|
||||
@@ -359,14 +447,21 @@
|
||||
"capacity" : "Capacity",
|
||||
"Agility" : "Agility",
|
||||
"Armor": "Armor",
|
||||
"ArmorCritical": "Armor Critical",
|
||||
"cargo": "Cargo",
|
||||
"vehicle": "Vehicle",
|
||||
"starship": "Starship",
|
||||
"Easy4": "Easy (+4D)",
|
||||
"Easy3": "Easy (+3D)",
|
||||
"Easy2": "Easy (+2D)",
|
||||
"Easy": "Easy (+1D)",
|
||||
"Moderate": "Moderate (+0D)",
|
||||
"Difficult": "Difficult (-1D)",
|
||||
"Formidable": "Formidable (-2D)",
|
||||
"Formidable3": "Formidable (-3D)",
|
||||
"Impossible": "Impossible (-4D)",
|
||||
"Impossible5": "Impossible (-5D)",
|
||||
"Impossible6": "Impossible (-6D)",
|
||||
"combat": "Combat",
|
||||
"physical": "Physical",
|
||||
"social": "Social",
|
||||
@@ -381,6 +476,7 @@
|
||||
"Unarmed": "Unarmed",
|
||||
"Vehicle": "Vehicle",
|
||||
"armor": "Armor",
|
||||
"armorCritical": "Armor (Crit.)",
|
||||
"armors": "Armors",
|
||||
"biodata": "Biodata",
|
||||
"biography": "Biography",
|
||||
@@ -401,6 +497,7 @@
|
||||
"max": "Max",
|
||||
"maximum": "Maximum",
|
||||
"modifier": "Modifier",
|
||||
"numericModifier": "Additionnal Modifier",
|
||||
"multiplier": "Multiplier",
|
||||
"newArmor": "New Armor",
|
||||
"newWeapon": "New Weapon",
|
||||
@@ -429,7 +526,12 @@
|
||||
"titleWeapon": "Weapon Roll",
|
||||
"total": "Total",
|
||||
"totalScore": "Total Score",
|
||||
"weapons": "Weapons"
|
||||
"weapons": "Weapons",
|
||||
"crew": "Crew",
|
||||
"noCrew": "No crew members assigned",
|
||||
"vehicleBonus": "Vehicle/Starship Agility Bonus",
|
||||
"selectSkill": "Select Skill",
|
||||
"npcCrewSkill": "NPC Crew"
|
||||
},
|
||||
"Language": {
|
||||
"FIELDS": {
|
||||
@@ -505,6 +607,9 @@
|
||||
"Carrier": "Carrier"
|
||||
},
|
||||
"FIELDS": {
|
||||
"techAge": {
|
||||
"label": "Tech Age"
|
||||
},
|
||||
"monthlyCost": {
|
||||
"label": "Monthly Cost"
|
||||
},
|
||||
@@ -512,7 +617,13 @@
|
||||
"label": "Hull Type"
|
||||
},
|
||||
"armor": {
|
||||
"label": "Armor"
|
||||
"label": "Armor (Reg.)"
|
||||
},
|
||||
"armorCritical": {
|
||||
"label": "Armor (Crit.)"
|
||||
},
|
||||
"armorRegular": {
|
||||
"label": "Armor (Reg.)"
|
||||
},
|
||||
"guns" : {
|
||||
"label": "Guns"
|
||||
@@ -535,6 +646,12 @@
|
||||
"crew": {
|
||||
"label": "Crew"
|
||||
},
|
||||
"crewCapacity": {
|
||||
"label": "Crew Capacity"
|
||||
},
|
||||
"npcCrew": {
|
||||
"label": "NPC Skill"
|
||||
},
|
||||
"description": {
|
||||
"label": "Description"
|
||||
},
|
||||
@@ -583,7 +700,7 @@
|
||||
"addPsionic" : "Add Psionic",
|
||||
"addCreatureAbility" : "Add Creature Ability",
|
||||
"addCreatureTrait" : "Add Creature Trait",
|
||||
"damages": "Enter current damages suffered"
|
||||
"damages": "Enter current damage suffered"
|
||||
},
|
||||
"Vehicle": {
|
||||
"FIELDS": {
|
||||
@@ -609,20 +726,49 @@
|
||||
"label": "Speed"
|
||||
},
|
||||
"armor": {
|
||||
"label": "Armor"
|
||||
"label": "Armor (Reg.)"
|
||||
},
|
||||
"armorCritical": {
|
||||
"label": "Armor (Crit.)"
|
||||
},
|
||||
"armorRegular": {
|
||||
"label": "Armor (Reg.)"
|
||||
},
|
||||
"crew": {
|
||||
"label": "Crew"
|
||||
},
|
||||
"crewCapacity": {
|
||||
"label": "Crew Capacity"
|
||||
},
|
||||
"npcCrew": {
|
||||
"label": "NPC Skill"
|
||||
},
|
||||
"description": {
|
||||
"label": "Description"
|
||||
},
|
||||
"notes": {
|
||||
"label": "Notes"
|
||||
},
|
||||
"techAge": {
|
||||
"label": "Tech Age"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Warning": {},
|
||||
"Warning": {
|
||||
"alreadyInCrew": "This actor is already a crew member",
|
||||
"notACharacter": "Only characters can pilot vehicles",
|
||||
"noVehiclesSkill": "This character does not have the vehicles skill",
|
||||
"noSkills": "This character does not have any skills",
|
||||
"noNpcCrew": "NPC Crew level is below 0",
|
||||
"onlyCharactersAllowed": "Only characters can be added as crew members",
|
||||
"noLinkedPrototype": "This character must be linked to his token to be added as crew member"
|
||||
},
|
||||
"RemoveCrew": "Remove from crew",
|
||||
"RemoveCrewTitle": "Remove crew member?",
|
||||
"RemoveCrewContent": "Are you sure you want to remove {name} from the crew?",
|
||||
"PilotVehicle": "Pilot vehicle (with vehicle agility bonus)",
|
||||
"PilotStarship": "Pilot starship (with starship agility bonus)",
|
||||
"RollNpcCrew": "Roll for NPC Crew",
|
||||
"Weapon": {
|
||||
"FIELDS": {
|
||||
"cost": {
|
||||
@@ -648,6 +794,12 @@
|
||||
},
|
||||
"weaponType": {
|
||||
"label": "Type"
|
||||
},
|
||||
"ammoCost": {
|
||||
"label": "Ammo Cost"
|
||||
},
|
||||
"magazine": {
|
||||
"label": "Mag"
|
||||
}
|
||||
},
|
||||
"Range": {
|
||||
@@ -674,7 +826,8 @@
|
||||
"character": "Character",
|
||||
"creature": "Creature",
|
||||
"starship": "Starship",
|
||||
"vehicle": "Vehicle"
|
||||
"vehicle": "Vehicle",
|
||||
"robot": "Robot"
|
||||
},
|
||||
"Item": {
|
||||
"armor": "Armor",
|
||||
|
||||
@@ -11,4 +11,4 @@ export { default as FTLNomadImplantSheet } from "./sheets/implant-sheet.mjs"
|
||||
export { default as FTLNomadStarshipSheet } from "./sheets/starship-sheet.mjs"
|
||||
export { default as FTLNomadCreatureTraitSheet } from "./sheets/creature-trait-sheet.mjs"
|
||||
export { default as FTLNomadCreatureAbilitySheet } from "./sheets/creature-ability-sheet.mjs"
|
||||
|
||||
export { default as FTLNomadRobotSheet } from "./sheets/robot-sheet.mjs"
|
||||
|
||||
174
module/applications/sheets/robot-sheet.mjs
Normal file
174
module/applications/sheets/robot-sheet.mjs
Normal file
@@ -0,0 +1,174 @@
|
||||
import FTLNomadActorSheet from "./base-actor-sheet.mjs"
|
||||
|
||||
export default class FTLNomadRobotSheet extends FTLNomadActorSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["robot"],
|
||||
position: {
|
||||
width: 860,
|
||||
height: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["robot-content"],
|
||||
},
|
||||
actions: {
|
||||
createEquipment: FTLNomadRobotSheet.#onCreateEquipment,
|
||||
createArmor: FTLNomadRobotSheet.#onCreateArmor,
|
||||
createWeapon: FTLNomadRobotSheet.#onCreateWeapon,
|
||||
createTalent: FTLNomadRobotSheet.#onCreateTalent,
|
||||
createImplant: FTLNomadRobotSheet.#onCreateImplant,
|
||||
createPsionic: FTLNomadRobotSheet.#onCreatePsionic,
|
||||
createLanguage: FTLNomadRobotSheet.#onCreateLanguage
|
||||
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-ftl-nomad/templates/robot-main.hbs",
|
||||
},
|
||||
tabs: {
|
||||
template: "templates/generic/tab-navigation.hbs",
|
||||
},
|
||||
equipment: {
|
||||
template: "systems/fvtt-ftl-nomad/templates/robot-equipment.hbs",
|
||||
},
|
||||
description: {
|
||||
template: "systems/fvtt-ftl-nomad/templates/robot-description.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
tabGroups = {
|
||||
sheet: "equipment",
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare an array of form header tabs.
|
||||
* @returns {Record<string, Partial<ApplicationTab>>}
|
||||
*/
|
||||
#getTabs() {
|
||||
const tabs = {
|
||||
equipment: { id: "equipment", group: "sheet", icon: "fa-solid fa-shapes", label: "FTLNOMAD.Label.equipment" },
|
||||
description: {
|
||||
id: "description", group: "sheet", icon: "fa-solid fa-book", label: "FTLNOMAD.Label.description"
|
||||
}
|
||||
}
|
||||
for (const v of Object.values(tabs)) {
|
||||
v.active = this.tabGroups[v.group] === v.id
|
||||
v.cssClass = v.active ? "active" : ""
|
||||
}
|
||||
return tabs
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
context.tabs = this.#getTabs()
|
||||
|
||||
context.enrichedDescription = await 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 })
|
||||
|
||||
return context
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _preparePartContext(partId, context) {
|
||||
const doc = this.document
|
||||
switch (partId) {
|
||||
case "equipment":
|
||||
context.tab = context.tabs.equipment
|
||||
context.weapons = doc.itemTypes.weapon
|
||||
context.weapons.sort((a, b) => a.name.localeCompare(b.name))
|
||||
context.armors = doc.itemTypes.armor
|
||||
context.armors.sort((a, b) => a.name.localeCompare(b.name))
|
||||
context.equipments = doc.itemTypes.equipment
|
||||
context.equipments.sort((a, b) => a.name.localeCompare(b.name))
|
||||
break
|
||||
case "description":
|
||||
context.tab = context.tabs.description
|
||||
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(doc.system.description, { async: true })
|
||||
context.enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(doc.system.notes, { async: true })
|
||||
break
|
||||
}
|
||||
return context
|
||||
}
|
||||
|
||||
|
||||
static #onCreateEquipment(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("FTLNOMAD.Label.newEquipment"), type: "equipment" }])
|
||||
}
|
||||
|
||||
static #onCreateWeapon(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("FTLNOMAD.Label.newWeapon"), type: "weapon" }])
|
||||
}
|
||||
|
||||
static #onCreateArmor(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("FTLNOMAD.Label.newArmor"), type: "armor" }])
|
||||
}
|
||||
|
||||
static #onCreateTalent(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("FTLNOMAD.Label.newTalent"), type: "talent" }])
|
||||
}
|
||||
|
||||
static #onCreateImplant(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("FTLNOMAD.Label.newImplant"), type: "implant" }])
|
||||
}
|
||||
|
||||
static #onCreatePsionic(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("FTLNOMAD.Label.newPsionic"), type: "psionic" }])
|
||||
}
|
||||
|
||||
static #onCreateLanguage(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("FTLNOMAD.Label.newLanguage"), type: "language" }])
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Handles the roll action triggered by user interaction.
|
||||
*
|
||||
* @param {PointerEvent} event The event object representing the user interaction.
|
||||
* @param {HTMLElement} target The target element that triggered the roll.
|
||||
*
|
||||
* @returns {Promise<void>} A promise that resolves when the roll action is complete.
|
||||
*
|
||||
* @throws {Error} Throws an error if the roll type is not recognized.
|
||||
*
|
||||
* @description This method checks the current mode (edit or not) and determines the type of roll
|
||||
* (save, resource, or damage) based on the target element's data attributes. It retrieves the
|
||||
* corresponding value from the document's system and performs the roll.
|
||||
*/
|
||||
async _onRoll(event, target) {
|
||||
const rollType = $(event.currentTarget).data("roll-type")
|
||||
let item
|
||||
let li
|
||||
switch (rollType) {
|
||||
case "skill":
|
||||
let skillId = $(event.currentTarget).data("skill-id");
|
||||
item = this.actor.system.skills[skillId];
|
||||
break
|
||||
case "weapon":
|
||||
case "damage":
|
||||
li = $(event.currentTarget).parents(".item");
|
||||
item = this.actor.items.get(li.data("item-id"));
|
||||
break
|
||||
default:
|
||||
throw new Error(`Unknown roll type ${rollType}`)
|
||||
}
|
||||
await this.document.system.roll(rollType, item)
|
||||
}
|
||||
|
||||
async _onDrop(event) {
|
||||
if (!this.isEditable || !this.isEditMode) return
|
||||
const data = TextEditor.getDragEventData(event)
|
||||
|
||||
// Handle different data types
|
||||
switch (data.type) {
|
||||
case "Item":
|
||||
const item = await fromUuid(data.uuid)
|
||||
return super._onDropItem(item)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -12,9 +12,150 @@ export default class FTLNomadStarshipSheet extends FTLNomadActorSheet {
|
||||
contentClasses: ["starship-content"],
|
||||
},
|
||||
actions: {
|
||||
createEquipment: FTLNomadStarshipSheet.#onCreateEquipment,
|
||||
createWeapon: FTLNomadStarshipSheet.#onCreateWeapon,
|
||||
removeCrew: FTLNomadStarshipSheet.#onRemoveCrew,
|
||||
viewCrew: FTLNomadStarshipSheet.#onViewCrew,
|
||||
pilotCrew: FTLNomadStarshipSheet.#onPilotCrew,
|
||||
rollNpcCrew: FTLNomadStarshipSheet.#onRollNpcCrew,
|
||||
},
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a crew member from the starship
|
||||
* @param {Event} event The initiating click event
|
||||
* @param {HTMLElement} target The current target of the event listener
|
||||
*/
|
||||
static async #onRemoveCrew(event, target) {
|
||||
const crewUuid = target.dataset.crewUuid
|
||||
const actor = await fromUuid(crewUuid)
|
||||
|
||||
// Show confirmation dialog
|
||||
const confirmed = await foundry.applications.api.DialogV2.confirm({
|
||||
window: { title: game.i18n.localize("FTLNOMAD.RemoveCrewTitle") },
|
||||
content: game.i18n.format("FTLNOMAD.RemoveCrewContent", { name: actor?.name || "Unknown" }),
|
||||
rejectClose: false,
|
||||
modal: true
|
||||
})
|
||||
|
||||
if (!confirmed) return
|
||||
|
||||
const currentCrew = this.document.system.crewList || []
|
||||
const updatedCrew = currentCrew.filter(uuid => uuid !== crewUuid)
|
||||
await this.document.update({ "system.crewList": updatedCrew })
|
||||
}
|
||||
|
||||
/**
|
||||
* Open the actor sheet of a crew member
|
||||
* @param {Event} event The initiating click event
|
||||
* @param {HTMLElement} target The current target of the event listener
|
||||
*/
|
||||
static async #onViewCrew(event, target) {
|
||||
const actorUuid = target.closest('.crew-member').dataset.actorUuid
|
||||
const actor = await fromUuid(actorUuid)
|
||||
if (actor) {
|
||||
actor.sheet.render(true)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll a piloting check for a crew member with starship agility bonus
|
||||
* @param {Event} event The initiating click event
|
||||
* @param {HTMLElement} target The current target of the event listener
|
||||
*/
|
||||
static async #onPilotCrew(event, target) {
|
||||
const actorUuid = target.closest('.crew-member').dataset.actorUuid
|
||||
const actor = await fromUuid(actorUuid)
|
||||
|
||||
console.log("Pilot crew - Actor:", actor, "Type:", actor?.type)
|
||||
|
||||
if (!actor) {
|
||||
ui.notifications.warn("Actor not found")
|
||||
return
|
||||
}
|
||||
|
||||
if (actor.type !== "character") {
|
||||
ui.notifications.warn(`This actor is of type "${actor.type}", not "character"`)
|
||||
return
|
||||
}
|
||||
|
||||
// Get starship agility bonus
|
||||
const starshipAgility = this.document.system.agility || 0
|
||||
|
||||
// Get all skills from the actor
|
||||
const actorSkills = actor.system.skills
|
||||
if (!actorSkills) {
|
||||
ui.notifications.warn(game.i18n.localize("FTLNOMAD.Warning.noSkills"))
|
||||
return
|
||||
}
|
||||
|
||||
// Default to vehicles skill
|
||||
const defaultSkill = actorSkills.vehicles || Object.values(actorSkills)[0]
|
||||
|
||||
// Import the Roll class
|
||||
const FTLNomadRoll = (await import("../../documents/roll.mjs")).default
|
||||
|
||||
// Call the roll prompt with all skills available and starship agility as a vehicle bonus
|
||||
let roll = await FTLNomadRoll.prompt({
|
||||
rollType: "skill",
|
||||
rollItem: defaultSkill,
|
||||
availableSkills: actorSkills,
|
||||
selectedSkillId: "vehicles",
|
||||
actorId: actor.id,
|
||||
actorName: actor.name,
|
||||
actorImage: actor.img,
|
||||
talents: actor.items.filter(i => i.type === "talent" && i.system.isAdvantage),
|
||||
isEncumbered: actor.system.isEncumbered(),
|
||||
hasTarget: false,
|
||||
vehicleBonus: starshipAgility
|
||||
})
|
||||
if (!roll) return null
|
||||
|
||||
await roll.toMessage({}, { rollMode: roll.options.rollMode })
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll a check for NPC crew with starship agility bonus
|
||||
* @param {Event} event The initiating click event
|
||||
* @param {HTMLElement} target The current target of the event listener
|
||||
*/
|
||||
static async #onRollNpcCrew(event, target) {
|
||||
const npcCrewLevel = this.document.system.npcCrew || 0
|
||||
|
||||
if (npcCrewLevel < 0) {
|
||||
ui.notifications.warn(game.i18n.localize("FTLNOMAD.Warning.noNpcCrew"))
|
||||
return
|
||||
}
|
||||
|
||||
// Get starship agility bonus
|
||||
const starshipAgility = this.document.system.agility || 0
|
||||
|
||||
// Create a fake skill object for the NPC crew
|
||||
const npcSkill = {
|
||||
value: npcCrewLevel,
|
||||
label: "FTLNOMAD.Label.npcCrewSkill"
|
||||
}
|
||||
|
||||
// Import the Roll class
|
||||
const FTLNomadRoll = (await import("../../documents/roll.mjs")).default
|
||||
|
||||
// Call the roll prompt with NPC crew level as skill
|
||||
let roll = await FTLNomadRoll.prompt({
|
||||
rollType: "skill",
|
||||
rollItem: npcSkill,
|
||||
actorId: this.document.id,
|
||||
actorName: `${this.document.name} (NPC Crew)`,
|
||||
actorImage: this.document.img,
|
||||
talents: [],
|
||||
isEncumbered: false,
|
||||
hasTarget: false,
|
||||
vehicleBonus: starshipAgility
|
||||
})
|
||||
if (!roll) return null
|
||||
|
||||
await roll.toMessage({}, { rollMode: roll.options.rollMode })
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
@@ -23,14 +164,17 @@ export default class FTLNomadStarshipSheet extends FTLNomadActorSheet {
|
||||
tabs: {
|
||||
template: "templates/generic/tab-navigation.hbs",
|
||||
},
|
||||
equipment: {
|
||||
template: "systems/fvtt-ftl-nomad/templates/starship-equipment.hbs",
|
||||
},
|
||||
description: {
|
||||
template: "systems/fvtt-ftl-nomad/templates/starship-description.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
tabGroups = {
|
||||
sheet: "description",
|
||||
/** @override */
|
||||
tabGroups = {
|
||||
sheet: "equipment",
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -39,6 +183,7 @@ export default class FTLNomadStarshipSheet extends FTLNomadActorSheet {
|
||||
*/
|
||||
#getTabs() {
|
||||
const tabs = {
|
||||
equipment: { id: "equipment", group: "sheet", icon: "fa-solid fa-shapes", label: "FTLNOMAD.Label.equipment" },
|
||||
description: { id: "description", group: "sheet", icon: "fa-solid fa-book", label: "FTLNOMAD.Label.description" },
|
||||
}
|
||||
for (const v of Object.values(tabs)) {
|
||||
@@ -57,9 +202,35 @@ export default class FTLNomadStarshipSheet extends FTLNomadActorSheet {
|
||||
context.enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.notes, { async: true })
|
||||
context.enrichedModifications = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.modifications, { async: true })
|
||||
|
||||
// Prepare crew members data
|
||||
context.crewMembers = await this.#prepareCrewMembers()
|
||||
|
||||
return context
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare crew members data from stored UUIDs
|
||||
* @returns {Promise<Array>}
|
||||
*/
|
||||
async #prepareCrewMembers() {
|
||||
const crewUuids = this.document.system.crewList || []
|
||||
const crewMembers = []
|
||||
|
||||
for (const uuid of crewUuids) {
|
||||
const actor = await fromUuid(uuid)
|
||||
if (actor) {
|
||||
crewMembers.push({
|
||||
uuid: uuid,
|
||||
id: actor.id,
|
||||
name: actor.name,
|
||||
img: actor.img
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return crewMembers
|
||||
}
|
||||
|
||||
_generateTooltip(type, target) {
|
||||
}
|
||||
|
||||
@@ -69,6 +240,13 @@ export default class FTLNomadStarshipSheet extends FTLNomadActorSheet {
|
||||
switch (partId) {
|
||||
case "main":
|
||||
break
|
||||
case "equipment":
|
||||
context.tab = context.tabs.equipment
|
||||
context.weapons = doc.itemTypes.weapon
|
||||
context.weapons.sort((a, b) => a.name.localeCompare(b.name))
|
||||
context.equipments = doc.itemTypes.equipment
|
||||
context.equipments.sort((a, b) => a.name.localeCompare(b.name))
|
||||
break
|
||||
case "description":
|
||||
context.tab = context.tabs.description
|
||||
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(doc.system.description, { async: true })
|
||||
@@ -78,22 +256,31 @@ export default class FTLNomadStarshipSheet extends FTLNomadActorSheet {
|
||||
return context
|
||||
}
|
||||
|
||||
static #onCreateEquipment(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("FTLNOMAD.Label.newEquipment"), type: "equipment" }])
|
||||
}
|
||||
|
||||
static #onCreateWeapon(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("FTLNOMAD.Label.newWeapon"), type: "weapon" }])
|
||||
}
|
||||
|
||||
async _onRoll(event, target) {
|
||||
const rollType = $(event.currentTarget).data("roll-type")
|
||||
let rollType = $(event.currentTarget).data("roll-type")
|
||||
let item
|
||||
let formula
|
||||
let roll
|
||||
console.log("rollType", rollType)
|
||||
switch (rollType) {
|
||||
case "damage":
|
||||
let li = $(event.currentTarget).parents(".item");
|
||||
item = this.actor.items.get(li.data("item-id"));
|
||||
break
|
||||
case "starship-guns":
|
||||
formula = this.actor.system.guns
|
||||
// Rolll the damage
|
||||
roll = new Roll(formula)
|
||||
await roll.evaluate()
|
||||
roll.toMessage( { flavor: `Starship ${this.actor.name} : Guns Damage` })
|
||||
item = { name: "Starship Guns", type: "weapon", system: { damage: this.actor.system.guns, rangeType: "heavyweapon" } }
|
||||
rollType = "damage"
|
||||
break
|
||||
default:
|
||||
throw new Error(`Unknown roll type ${rollType}`)
|
||||
}
|
||||
await this.document.system.roll(rollType, item)
|
||||
}
|
||||
|
||||
|
||||
@@ -106,7 +293,41 @@ export default class FTLNomadStarshipSheet extends FTLNomadActorSheet {
|
||||
case "Item":
|
||||
const item = await fromUuid(data.uuid)
|
||||
return super._onDropItem(item)
|
||||
case "Actor":
|
||||
const actor = await fromUuid(data.uuid)
|
||||
return this.#onDropActor(actor)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle dropping an actor onto the starship sheet to add them to the crew
|
||||
* @param {Actor} actor The actor being dropped
|
||||
*/
|
||||
async #onDropActor(actor) {
|
||||
if (!actor) return
|
||||
|
||||
// Check if actor is of type "character"
|
||||
if (actor.type !== "character") {
|
||||
ui.notifications.info(game.i18n.localize("FTLNOMAD.Warning.onlyCharactersAllowed"))
|
||||
return
|
||||
}
|
||||
// Check if the actor has a linked prototype
|
||||
if (!actor.prototypeToken?.actorLink) {
|
||||
ui.notifications.info(game.i18n.localize("FTLNOMAD.Warning.noLinkedPrototype"))
|
||||
return
|
||||
}
|
||||
|
||||
const currentCrew = this.document.system.crewList || []
|
||||
|
||||
// Check if actor is already in crew
|
||||
if (currentCrew.includes(actor.uuid)) {
|
||||
ui.notifications.warn(game.i18n.localize("FTLNOMAD.Warning.alreadyInCrew"))
|
||||
return
|
||||
}
|
||||
|
||||
// Add actor UUID to crew array
|
||||
const updatedCrew = [...currentCrew, actor.uuid]
|
||||
await this.document.update({ "system.crewList": updatedCrew })
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -5,8 +5,8 @@ export default class FTLNomadVehicleSheet extends FTLNomadActorSheet {
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["vehicle"],
|
||||
position: {
|
||||
width: 680,
|
||||
height: 540,
|
||||
width: 720,
|
||||
height: 640,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["vehicle-content"],
|
||||
@@ -14,9 +14,148 @@ export default class FTLNomadVehicleSheet extends FTLNomadActorSheet {
|
||||
actions: {
|
||||
createEquipment: FTLNomadVehicleSheet.#onCreateEquipment,
|
||||
createWeapon: FTLNomadVehicleSheet.#onCreateWeapon,
|
||||
removeCrew: FTLNomadVehicleSheet.#onRemoveCrew,
|
||||
viewCrew: FTLNomadVehicleSheet.#onViewCrew,
|
||||
pilotCrew: FTLNomadVehicleSheet.#onPilotCrew,
|
||||
rollNpcCrew: FTLNomadVehicleSheet.#onRollNpcCrew,
|
||||
},
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a crew member from the vehicle
|
||||
* @param {Event} event The initiating click event
|
||||
* @param {HTMLElement} target The current target of the event listener
|
||||
*/
|
||||
static async #onRemoveCrew(event, target) {
|
||||
const crewUuid = target.dataset.crewUuid
|
||||
const actor = await fromUuid(crewUuid)
|
||||
|
||||
// Show confirmation dialog
|
||||
const confirmed = await foundry.applications.api.DialogV2.confirm({
|
||||
window: { title: game.i18n.localize("FTLNOMAD.RemoveCrewTitle") },
|
||||
content: game.i18n.format("FTLNOMAD.RemoveCrewContent", { name: actor?.name || "Unknown" }),
|
||||
rejectClose: false,
|
||||
modal: true
|
||||
})
|
||||
|
||||
if (!confirmed) return
|
||||
|
||||
const currentCrew = this.document.system.crewList || []
|
||||
const updatedCrew = currentCrew.filter(uuid => uuid !== crewUuid)
|
||||
await this.document.update({ "system.crewList": updatedCrew })
|
||||
}
|
||||
|
||||
/**
|
||||
* Open the actor sheet of a crew member
|
||||
* @param {Event} event The initiating click event
|
||||
* @param {HTMLElement} target The current target of the event listener
|
||||
*/
|
||||
static async #onViewCrew(event, target) {
|
||||
const actorUuid = target.closest('.crew-member').dataset.actorUuid
|
||||
const actor = await fromUuid(actorUuid)
|
||||
if (actor) {
|
||||
actor.sheet.render(true)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll a piloting check for a crew member with vehicle agility bonus
|
||||
* @param {Event} event The initiating click event
|
||||
* @param {HTMLElement} target The current target of the event listener
|
||||
*/
|
||||
static async #onPilotCrew(event, target) {
|
||||
const actorUuid = target.closest('.crew-member').dataset.actorUuid
|
||||
const actor = await fromUuid(actorUuid)
|
||||
|
||||
console.log("Pilot crew - Actor:", actor, "Type:", actor?.type)
|
||||
|
||||
if (!actor) {
|
||||
ui.notifications.warn("Actor not found")
|
||||
return
|
||||
}
|
||||
|
||||
if (actor.type !== "character") {
|
||||
ui.notifications.warn(`This actor is of type "${actor.type}", not "character"`)
|
||||
return
|
||||
}
|
||||
|
||||
// Get vehicle agility bonus
|
||||
const vehicleAgility = this.document.system.agility || 0
|
||||
|
||||
// Get all skills from the actor
|
||||
const actorSkills = actor.system.skills
|
||||
if (!actorSkills) {
|
||||
ui.notifications.warn(game.i18n.localize("FTLNOMAD.Warning.noSkills"))
|
||||
return
|
||||
}
|
||||
|
||||
// Default to vehicles skill
|
||||
const defaultSkill = actorSkills.vehicles || Object.values(actorSkills)[0]
|
||||
|
||||
// Import the Roll class
|
||||
const FTLNomadRoll = (await import("../../documents/roll.mjs")).default
|
||||
|
||||
// Call the roll prompt with all skills available and vehicle agility as a vehicle bonus
|
||||
let roll = await FTLNomadRoll.prompt({
|
||||
rollType: "skill",
|
||||
rollItem: defaultSkill,
|
||||
availableSkills: actorSkills,
|
||||
selectedSkillId: "vehicles",
|
||||
actorId: actor.id,
|
||||
actorName: actor.name,
|
||||
actorImage: actor.img,
|
||||
talents: actor.items.filter(i => i.type === "talent" && i.system.isAdvantage),
|
||||
isEncumbered: actor.system.isEncumbered(),
|
||||
hasTarget: false,
|
||||
vehicleBonus: vehicleAgility
|
||||
})
|
||||
if (!roll) return null
|
||||
|
||||
await roll.toMessage({}, { rollMode: roll.options.rollMode })
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll a check for NPC crew with vehicle agility bonus
|
||||
* @param {Event} event The initiating click event
|
||||
* @param {HTMLElement} target The current target of the event listener
|
||||
*/
|
||||
static async #onRollNpcCrew(event, target) {
|
||||
const npcCrewLevel = this.document.system.npcCrew || 0
|
||||
|
||||
if (npcCrewLevel < 0) {
|
||||
ui.notifications.warn(game.i18n.localize("FTLNOMAD.Warning.noNpcCrew"))
|
||||
return
|
||||
}
|
||||
|
||||
// Get vehicle agility bonus
|
||||
const vehicleAgility = this.document.system.agility || 0
|
||||
|
||||
// Create a fake skill object for the NPC crew
|
||||
const npcSkill = {
|
||||
value: npcCrewLevel,
|
||||
label: "FTLNOMAD.Label.npcCrewSkill"
|
||||
}
|
||||
|
||||
// Import the Roll class
|
||||
const FTLNomadRoll = (await import("../../documents/roll.mjs")).default
|
||||
|
||||
// Call the roll prompt with NPC crew level as skill
|
||||
let roll = await FTLNomadRoll.prompt({
|
||||
rollType: "skill",
|
||||
rollItem: npcSkill,
|
||||
actorId: this.document.id,
|
||||
actorName: `${this.document.name} (NPC Crew)`,
|
||||
actorImage: this.document.img,
|
||||
talents: [],
|
||||
isEncumbered: false,
|
||||
hasTarget: false,
|
||||
vehicleBonus: vehicleAgility
|
||||
})
|
||||
if (!roll) return null
|
||||
|
||||
await roll.toMessage({}, { rollMode: roll.options.rollMode })
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
@@ -33,8 +172,8 @@ export default class FTLNomadVehicleSheet extends FTLNomadActorSheet {
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
tabGroups = {
|
||||
/** @override */
|
||||
tabGroups = {
|
||||
sheet: "equipment",
|
||||
}
|
||||
|
||||
@@ -62,9 +201,35 @@ export default class FTLNomadVehicleSheet extends FTLNomadActorSheet {
|
||||
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 })
|
||||
|
||||
// Prepare crew members data
|
||||
context.crewMembers = await this.#prepareCrewMembers()
|
||||
|
||||
return context
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare crew members data from stored UUIDs
|
||||
* @returns {Promise<Array>}
|
||||
*/
|
||||
async #prepareCrewMembers() {
|
||||
const crewUuids = this.document.system.crewList || []
|
||||
const crewMembers = []
|
||||
|
||||
for (const uuid of crewUuids) {
|
||||
const actor = await fromUuid(uuid)
|
||||
if (actor) {
|
||||
crewMembers.push({
|
||||
uuid: uuid,
|
||||
id: actor.id,
|
||||
name: actor.name,
|
||||
img: actor.img
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return crewMembers
|
||||
}
|
||||
|
||||
_generateTooltip(type, target) {
|
||||
}
|
||||
|
||||
@@ -128,7 +293,36 @@ export default class FTLNomadVehicleSheet extends FTLNomadActorSheet {
|
||||
case "Item":
|
||||
const item = await fromUuid(data.uuid)
|
||||
return super._onDropItem(item)
|
||||
case "Actor":
|
||||
const actor = await fromUuid(data.uuid)
|
||||
return this.#onDropActor(actor)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle dropping an actor onto the vehicle sheet to add them to the crew
|
||||
* @param {Actor} actor The actor being dropped
|
||||
*/
|
||||
async #onDropActor(actor) {
|
||||
if (!actor) return
|
||||
|
||||
// Check if actor is of type "character"
|
||||
if (actor.type !== "character") {
|
||||
ui.notifications.info(game.i18n.localize("FTLNOMAD.Warning.onlyCharactersAllowed"))
|
||||
return
|
||||
}
|
||||
|
||||
const currentCrew = this.document.system.crewList || []
|
||||
|
||||
// Check if actor is already in crew
|
||||
if (currentCrew.includes(actor.uuid)) {
|
||||
ui.notifications.warn(game.i18n.localize("FTLNOMAD.Warning.alreadyInCrew"))
|
||||
return
|
||||
}
|
||||
|
||||
// Add actor UUID to crew array
|
||||
const updatedCrew = [...currentCrew, actor.uuid]
|
||||
await this.document.update({ "system.crewList": updatedCrew })
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,15 +2,15 @@ export const SYSTEM_ID = "fvtt-ftl-nomad"
|
||||
|
||||
export const ASCII = `
|
||||
|
||||
░▒▓████████▓▒░▒▓████████▓▒░▒▓█▓▒░ ░▒▓███████▓▒░ ░▒▓██████▓▒░░▒▓██████████████▓▒░ ░▒▓██████▓▒░░▒▓███████▓▒░
|
||||
░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓██▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
|
||||
░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓██▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
|
||||
░▒▓██████▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓████████▓▒░▒▓█▓▒░░▒▓█▓▒░
|
||||
░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓██▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
|
||||
░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓██▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
|
||||
░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓████████▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░
|
||||
|
||||
|
||||
░▒▓████████▓▒░▒▓████████▓▒░▒▓█▓▒░ ░▒▓███████▓▒░ ░▒▓██████▓▒░░▒▓██████████████▓▒░ ░▒▓██████▓▒░░▒▓███████▓▒░
|
||||
░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓██▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
|
||||
░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓██▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
|
||||
░▒▓██████▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓████████▓▒░▒▓█▓▒░░▒▓█▓▒░
|
||||
░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓██▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
|
||||
░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓██▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
|
||||
░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓████████▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░
|
||||
|
||||
|
||||
|
||||
`
|
||||
|
||||
@@ -41,6 +41,13 @@ export const TECH_AGES = {
|
||||
"cosmic": { id: "cosmic", label: "FTLNOMAD.TechAge.Cosmic", level: 13 }
|
||||
}
|
||||
|
||||
export const ROBOT_SIZES = {
|
||||
"tiny": { id: "tiny", label: "FTLNOMAD.Robot.Size.Tiny" },
|
||||
"small": { id: "small", label: "FTLNOMAD.Robot.Size.Small" },
|
||||
"medium": { id: "medium", label: "FTLNOMAD.Robot.Size.Medium" },
|
||||
"large": { id: "large", label: "FTLNOMAD.Robot.Size.Large" },
|
||||
"giant": { id: "giant", label: "FTLNOMAD.Robot.Size.Giant" }
|
||||
}
|
||||
|
||||
export const WEAPON_TYPES = {
|
||||
"melee": { id: "melee", label: "FTLNOMAD.Weapon.Types.Melee" },
|
||||
@@ -52,12 +59,12 @@ export const WEAPON_TYPES = {
|
||||
}
|
||||
|
||||
export const WEAPON_RANGE = {
|
||||
"handgun": { id: "handgun", label: "FTLNOMAD.Weapon.Range.Handgun", range: {close: 0, near:0, far:-2} },
|
||||
"assault": { id: "assault", label: "FTLNOMAD.Weapon.Range.Assault", range: {close: -2, near:0, far:-1, distant: -2} },
|
||||
"rifle": { id: "rifle", label: "FTLNOMAD.Weapon.Range.Rifle", range: {close: -3, near:0, far:0, distant: -1} },
|
||||
"melee": { id: "melee", label: "FTLNOMAD.Weapon.Range.Melee", range: {close: 0} },
|
||||
"heavyweapon": { id: "heavyweapon", label: "FTLNOMAD.Weapon.Range.HeavyWeapon", range: {near:-1, far:0, distant: 0} },
|
||||
"thrownweapon": { id: "thrownweapon", label: "FTLNOMAD.Weapon.Range.ThrownWeapon", range: {close: 0, near:-1} }
|
||||
"handgun": { id: "handgun", label: "FTLNOMAD.Weapon.Range.Handgun", range: { close: 0, near: 0, far: -2 } },
|
||||
"assault": { id: "assault", label: "FTLNOMAD.Weapon.Range.Assault", range: { close: -2, near: 0, far: -1, distant: -2 } },
|
||||
"rifle": { id: "rifle", label: "FTLNOMAD.Weapon.Range.Rifle", range: { close: -3, near: 0, far: 0, distant: -1 } },
|
||||
"melee": { id: "melee", label: "FTLNOMAD.Weapon.Range.Melee", range: { close: 0 } },
|
||||
"heavyweapon": { id: "heavyweapon", label: "FTLNOMAD.Weapon.Range.HeavyWeapon", range: { near: -1, far: 0, distant: 0 } },
|
||||
"thrownweapon": { id: "thrownweapon", label: "FTLNOMAD.Weapon.Range.ThrownWeapon", range: { close: 0, near: -1 } }
|
||||
}
|
||||
|
||||
export const ATTACK_MODIFIERS = {
|
||||
@@ -72,36 +79,46 @@ export const ATTACK_MODIFIERS = {
|
||||
"aware": -1
|
||||
}
|
||||
|
||||
export const DAMAGE_MODIFIER_CHOICES = [
|
||||
{ id: "-3", label: "-3", value: "-3" },
|
||||
{ id: "-2", label: "-2", value: "-2" },
|
||||
{ id: "-1", label: "-1", value: "-1" },
|
||||
{ id: "0", label: "0", value: "0" },
|
||||
{ id: "1", label: "+1", value: "1" },
|
||||
{ id: "2", label: "+2", value: "2" },
|
||||
{ id: "3", label: "+3", value: "3" }
|
||||
]
|
||||
|
||||
export const TRIAGE_RESULTS = {
|
||||
"none": { id: "none", dice:0, label: "FTLNOMAD.TriageResults.None" },
|
||||
"death": { id: "death", dice:3, label: "FTLNOMAD.TriageResults.Death" },
|
||||
"critical": { id: "critical", dice:4, label: "FTLNOMAD.TriageResults.Critical" },
|
||||
"severe": { id: "severe", dice:7, label: "FTLNOMAD.TriageResults.Severe" },
|
||||
"moderate": { id: "moderate", dice:10, label: "FTLNOMAD.TriageResults.Moderate" },
|
||||
"fleshwound": { id: "fleshwound", dice:12, label: "FTLNOMAD.TriageResults.FleshWound" }
|
||||
"none": { id: "none", dice: 0, label: "FTLNOMAD.TriageResults.None" },
|
||||
"death": { id: "death", dice: 3, label: "FTLNOMAD.TriageResults.Death" },
|
||||
"critical": { id: "critical", dice: 4, label: "FTLNOMAD.TriageResults.Critical" },
|
||||
"severe": { id: "severe", dice: 7, label: "FTLNOMAD.TriageResults.Severe" },
|
||||
"moderate": { id: "moderate", dice: 10, label: "FTLNOMAD.TriageResults.Moderate" },
|
||||
"fleshwound": { id: "fleshwound", dice: 12, label: "FTLNOMAD.TriageResults.FleshWound" }
|
||||
}
|
||||
|
||||
export const CREATURE_TERRAIN_TYPES = {
|
||||
"cave": { id: "cave", label: "FTLNOMAD.Creature.Terrain.Cave", niche:0, size: 0 },
|
||||
"coast": { id: "coast", label: "FTLNOMAD.Creature.Terrain.Coast", niche:1, size: 0 },
|
||||
"desert": { id: "desert", label: "FTLNOMAD.Creature.Terrain.Desert", niche:-1, size: -1 },
|
||||
"forest": { id: "forest", label: "FTLNOMAD.Creature.Terrain.Forest", niche:1, size: 1 },
|
||||
"jungle": { id: "jungle", label: "FTLNOMAD.Creature.Terrain.Jungle", niche:1, size: 1 },
|
||||
"mixed": { id: "mixed", label: "FTLNOMAD.Creature.Terrain.Mixed", niche:0, size: 0 },
|
||||
"mountain": { id: "mountain", label: "FTLNOMAD.Creature.Terrain.Mountain", niche:-1, size: -1 },
|
||||
"ocean": { id: "ocean", label: "FTLNOMAD.Creature.Terrain.Ocean", niche:-1, size: 1 },
|
||||
"river": { id: "river", label: "FTLNOMAD.Creature.Terrain.River", niche:1, size: 0 },
|
||||
"ruins": { id: "ruins", label: "FTLNOMAD.Creature.Terrain.Ruins", niche:0, size: 1 },
|
||||
"savannah": { id: "savannah", label: "FTLNOMAD.Creature.Terrain.Savannah", niche:0, size: 1 },
|
||||
"shallows": { id: "shallows", label: "FTLNOMAD.Creature.Terrain.Shallows", niche:1, size: 0 },
|
||||
"swamp": { id: "swamp", label: "FTLNOMAD.Creature.Terrain.Swamp", niche:1, size: 1 }
|
||||
"cave": { id: "cave", label: "FTLNOMAD.Creature.Terrain.Cave", niche: 0, size: 0 },
|
||||
"coast": { id: "coast", label: "FTLNOMAD.Creature.Terrain.Coast", niche: 1, size: 0 },
|
||||
"desert": { id: "desert", label: "FTLNOMAD.Creature.Terrain.Desert", niche: -1, size: -1 },
|
||||
"forest": { id: "forest", label: "FTLNOMAD.Creature.Terrain.Forest", niche: 1, size: 1 },
|
||||
"jungle": { id: "jungle", label: "FTLNOMAD.Creature.Terrain.Jungle", niche: 1, size: 1 },
|
||||
"mixed": { id: "mixed", label: "FTLNOMAD.Creature.Terrain.Mixed", niche: 0, size: 0 },
|
||||
"mountain": { id: "mountain", label: "FTLNOMAD.Creature.Terrain.Mountain", niche: -1, size: -1 },
|
||||
"ocean": { id: "ocean", label: "FTLNOMAD.Creature.Terrain.Ocean", niche: -1, size: 1 },
|
||||
"river": { id: "river", label: "FTLNOMAD.Creature.Terrain.River", niche: 1, size: 0 },
|
||||
"ruins": { id: "ruins", label: "FTLNOMAD.Creature.Terrain.Ruins", niche: 0, size: 1 },
|
||||
"savannah": { id: "savannah", label: "FTLNOMAD.Creature.Terrain.Savannah", niche: 0, size: 1 },
|
||||
"shallows": { id: "shallows", label: "FTLNOMAD.Creature.Terrain.Shallows", niche: 1, size: 0 },
|
||||
"swamp": { id: "swamp", label: "FTLNOMAD.Creature.Terrain.Swamp", niche: 1, size: 1 }
|
||||
}
|
||||
|
||||
export const CREATURE_NICHES = {
|
||||
"prey": { id: "prey", label: "FTLNOMAD.Creature.Niche.Prey" },
|
||||
"opportunist": { id: "opportunist", label: "FTLNOMAD.Creature.Niche.Opportunist" },
|
||||
"herbivore": { id: "herbivore", label: "FTLNOMAD.Creature.Niche.Herbivore" },
|
||||
"predator": { id: "predator", label: "FTLNOMAD.Creature.Niche.Predator" }
|
||||
"predator": { id: "predator", label: "FTLNOMAD.Creature.Niche.Predator" }
|
||||
}
|
||||
|
||||
export const CREATURE_SIZES = {
|
||||
@@ -114,11 +131,31 @@ export const CREATURE_SIZES = {
|
||||
}
|
||||
|
||||
export const MODIFIER_CHOICES = {
|
||||
"easy": { id: "easy", label: "FTLNOMAD.Label.Easy", value :"1" },
|
||||
"easy4": { id: "easy4", label: "FTLNOMAD.Label.Easy4", value: "4" },
|
||||
"easy3": { id: "easy3", label: "FTLNOMAD.Label.Easy3", value: "3" },
|
||||
"easy2": { id: "easy2", label: "FTLNOMAD.Label.Easy2", value: "2" },
|
||||
"easy": { id: "easy", label: "FTLNOMAD.Label.Easy", value: "1" },
|
||||
"moderate": { id: "moderate", label: "FTLNOMAD.Label.Moderate", value: "0" },
|
||||
"difficult": { id: "difficult", label: "FTLNOMAD.Label.Difficult", value: "-1" },
|
||||
"formidable": { id: "formidable", label: "FTLNOMAD.Label.Formidable", value: "-2" },
|
||||
"impossible": { id: "impossible", label: "FTLNOMAD.Label.Impossible", value: "-4" }
|
||||
"formidable3": { id: "formidable3", label: "FTLNOMAD.Label.Formidable3", value: "-3" },
|
||||
"impossible": { id: "impossible", label: "FTLNOMAD.Label.Impossible", value: "-4" },
|
||||
"impossible5": { id: "impossible5", label: "FTLNOMAD.Label.Impossible5", value: "-5" },
|
||||
"impossible6": { id: "impossible6", label: "FTLNOMAD.Label.Impossible6", value: "-6" }
|
||||
}
|
||||
|
||||
export const NUMERIC_MODIFIER_CHOICES = {
|
||||
"-5": { label: "-5", value: -5 },
|
||||
"-4": { label: "-4", value: -4 },
|
||||
"-3": { label: "-3", value: -3 },
|
||||
"-2": { label: "-2", value: -2 },
|
||||
"-1": { label: "-1", value: -1 },
|
||||
"0": { label: "0", value: 0 },
|
||||
"+1": { label: "+1", value: 1 },
|
||||
"+2": { label: "+2", value: 2 },
|
||||
"+3": { label: "+3", value: 3 },
|
||||
"+4": { label: "+4", value: 4 },
|
||||
"+5": { label: "+5", value: 5 }
|
||||
}
|
||||
|
||||
export const STARSHIP_HULL = {
|
||||
@@ -140,6 +177,7 @@ export const STARSHIP_HULL = {
|
||||
export const SYSTEM = {
|
||||
id: SYSTEM_ID,
|
||||
MODIFIER_CHOICES,
|
||||
NUMERIC_MODIFIER_CHOICES,
|
||||
ATTACK_MODIFIERS,
|
||||
TECH_AGES,
|
||||
WEAPON_TYPES,
|
||||
@@ -150,5 +188,7 @@ export const SYSTEM = {
|
||||
CREATURE_NICHES,
|
||||
STARSHIP_HULL,
|
||||
SKILLS,
|
||||
ROBOT_SIZES,
|
||||
DAMAGE_MODIFIER_CHOICES,
|
||||
ASCII
|
||||
}
|
||||
|
||||
@@ -62,7 +62,15 @@ export default class FTLNomadRoll extends Roll {
|
||||
|
||||
static updateFullFormula(options) {
|
||||
let fullFormula
|
||||
fullFormula = `${options.formula} + ${options.rollItem.value} + ${options.skillModifier}D + ${options.rangeModifier}D + ${options.numericModifier}D`
|
||||
if (options.rollType === "damage") {
|
||||
fullFormula = `${options.formula} + ${options.damageModifier}D6 `
|
||||
} else {
|
||||
let mod = options.rollItem?.value || 0
|
||||
fullFormula = `${options.formula} + ${options.skillModifier}D + ${mod} + ${options.rangeModifier}D + ${options.numericModifier}D + ${options.numericModifierSelect}`
|
||||
if (options.vehicleBonus && options.useVehicleBonus) {
|
||||
fullFormula += ` + ${options.vehicleBonus}`
|
||||
}
|
||||
}
|
||||
// Replace all the "+ -" with "-"
|
||||
fullFormula = fullFormula.replace(/\+\s*-/g, "- ")
|
||||
$('#roll-dialog-full-formula').text(fullFormula)
|
||||
@@ -85,20 +93,16 @@ export default class FTLNomadRoll extends Roll {
|
||||
*/
|
||||
static async prompt(options = {}) {
|
||||
let formula = "2d6"
|
||||
let actor = game.actors.get(options.actorId)
|
||||
|
||||
switch (options.rollType) {
|
||||
case "skill":
|
||||
break
|
||||
case "damage":
|
||||
let formula = options.rollItem.system.damage
|
||||
let damageRoll = new Roll(formula)
|
||||
await damageRoll.evaluate()
|
||||
await damageRoll.toMessage({
|
||||
flavor: `${options.rollItem.name} - Damage Roll`
|
||||
});
|
||||
return
|
||||
options.weapon = foundry.utils.duplicate(options.rollItem)
|
||||
formula = options.weapon.system.damage
|
||||
break
|
||||
case "weapon":
|
||||
let actor = game.actors.get(options.actorId)
|
||||
options.weapon = foundry.utils.duplicate(options.rollItem)
|
||||
options.rollItem = actor.system.skills.combat
|
||||
break
|
||||
@@ -106,6 +110,7 @@ export default class FTLNomadRoll extends Roll {
|
||||
break
|
||||
}
|
||||
|
||||
options.actor = actor
|
||||
const rollModes = foundry.utils.duplicate(CONFIG.Dice.rollModes)
|
||||
const fieldRollMode = new foundry.data.fields.StringField({
|
||||
choices: rollModes,
|
||||
@@ -114,30 +119,49 @@ export default class FTLNomadRoll extends Roll {
|
||||
})
|
||||
|
||||
const choiceModifier = SYSTEM.MODIFIER_CHOICES
|
||||
const choiceNumericModifier = SYSTEM.NUMERIC_MODIFIER_CHOICES
|
||||
let choiceRangeModifier = {}
|
||||
let rangeModifier = 0
|
||||
if ( options.weapon) {
|
||||
if (options.weapon) {
|
||||
// Build the range modifiers
|
||||
let range = SYSTEM.WEAPON_RANGE[options.weapon.system.rangeType]
|
||||
for (let [key, value] of Object.entries(range.range)) {
|
||||
choiceRangeModifier[key] = { label: `${key} (${value}D)`, value: value }
|
||||
if (!rangeModifier && value) {
|
||||
rangeModifier = value
|
||||
}
|
||||
}
|
||||
}
|
||||
const choiceDamageModifier = SYSTEM.DAMAGE_MODIFIER_CHOICES
|
||||
let damageModifier = "0"
|
||||
|
||||
let modifier = "0"
|
||||
let numericModifierSelect = 0
|
||||
options.skillModifier = 0
|
||||
options.numericModifier = 0
|
||||
options.numericModifierSelect = 0
|
||||
options.rangeModifier = rangeModifier
|
||||
options.damageModifier = damageModifier
|
||||
options.vehicleBonus = options.vehicleBonus || 0
|
||||
options.useVehicleBonus = true // Par défaut, le bonus est activé
|
||||
let fullFormula = `${formula} + ${options.rollItem.value}`
|
||||
if (options.isEncumbered) {
|
||||
fullFormula += ` - 1D`
|
||||
}
|
||||
if (options.vehicleBonus && options.useVehicleBonus) {
|
||||
fullFormula += ` + ${options.vehicleBonus}`
|
||||
}
|
||||
options.fullFormula = fullFormula
|
||||
options.formula = formula
|
||||
|
||||
// Prepare available skills if provided (for vehicle/starship piloting)
|
||||
let availableSkills = null
|
||||
if (options.availableSkills) {
|
||||
availableSkills = Object.entries(options.availableSkills).map(([id, skill]) => ({
|
||||
id: id,
|
||||
label: skill.label,
|
||||
value: skill.value,
|
||||
selected: id === options.selectedSkillId
|
||||
}))
|
||||
}
|
||||
|
||||
let dialogContext = {
|
||||
actorId: options.actorId,
|
||||
actorName: options.actorName,
|
||||
@@ -150,11 +174,17 @@ export default class FTLNomadRoll extends Roll {
|
||||
rollModes,
|
||||
fieldRollMode,
|
||||
choiceModifier,
|
||||
choiceNumericModifier,
|
||||
choiceRangeModifier,
|
||||
choiceDamageModifier,
|
||||
rangeModifier,
|
||||
damageModifier,
|
||||
formula,
|
||||
hasTarget: options.hasTarget,
|
||||
modifier,
|
||||
numericModifierSelect,
|
||||
vehicleBonus: options.vehicleBonus,
|
||||
availableSkills: availableSkills,
|
||||
}
|
||||
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-ftl-nomad/templates/roll-dialog.hbs", dialogContext)
|
||||
|
||||
@@ -169,7 +199,10 @@ export default class FTLNomadRoll extends Roll {
|
||||
label: label,
|
||||
callback: (event, button, dialog) => {
|
||||
const output = Array.from(button.form.elements).reduce((obj, input) => {
|
||||
if (input.name) obj[input.name] = input.value
|
||||
if (input.name) {
|
||||
// For checkboxes, use checked property instead of value
|
||||
obj[input.name] = input.type === 'checkbox' ? input.checked : input.value
|
||||
}
|
||||
return obj
|
||||
}, {})
|
||||
return output
|
||||
@@ -181,10 +214,26 @@ export default class FTLNomadRoll extends Roll {
|
||||
rejectClose: false, // Click on Close button will not launch an error
|
||||
render: (event, dialog) => {
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
$(".roll-skill-selector").change(event => {
|
||||
const skillId = event.target.value
|
||||
if (options.availableSkills && options.availableSkills[skillId]) {
|
||||
options.rollItem = foundry.utils.duplicate(options.availableSkills[skillId])
|
||||
options.selectedSkillId = skillId
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
}
|
||||
})
|
||||
$(".roll-skill-modifier").change(event => {
|
||||
options.skillModifier = Number(event.target.value)
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
})
|
||||
$(".roll-numeric-modifier").change(event => {
|
||||
options.numericModifierSelect = Number(event.target.value)
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
})
|
||||
$(".roll-damage-modifier").change(event => {
|
||||
options.damageModifier = Number(event.target.value)
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
})
|
||||
$(".roll-skill-range-modifier").change(event => {
|
||||
options.rangeModifier = Number(event.target.value)
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
@@ -192,13 +241,17 @@ export default class FTLNomadRoll extends Roll {
|
||||
$(".select-combat-option").change(event => {
|
||||
let field = $(event.target).data("field")
|
||||
let modifier = SYSTEM.ATTACK_MODIFIERS[field]
|
||||
if ( event.target.checked) {
|
||||
if (event.target.checked) {
|
||||
options.numericModifier += modifier
|
||||
} else {
|
||||
options.numericModifier -= modifier
|
||||
}
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
})
|
||||
$(".use-vehicle-bonus").change(event => {
|
||||
options.useVehicleBonus = event.target.checked
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
@@ -212,13 +265,55 @@ export default class FTLNomadRoll extends Roll {
|
||||
|
||||
if (Hooks.call("fvtt-ftl-nomad.preRoll", options, rollData) === false) return
|
||||
|
||||
let diceFormula = `${2+Math.abs(options.numericModifier)}D6`
|
||||
if ( options.numericModifier > 0 ) {
|
||||
diceFormula += `kh2 + ${options.rollItem.value}`
|
||||
} else {
|
||||
diceFormula += `kl2 + ${options.rollItem.value}`
|
||||
// Update rollItem if a skill was selected from the dropdown
|
||||
if (rollData.selectedSkill && options.availableSkills) {
|
||||
options.rollItem = foundry.utils.duplicate(options.availableSkills[rollData.selectedSkill])
|
||||
}
|
||||
|
||||
options.numericModifier = Number(rollData.numericModifier) || 0
|
||||
options.skillModifier = Number(rollData.skillModifier) || 0
|
||||
options.rangeModifier = Number(rollData.rangeModifier) || 0
|
||||
options.numericModifierSelect = Number(rollData.numericModifierSelect) || 0
|
||||
options.useVehicleBonus = rollData.useVehicleBonus === true
|
||||
options.finalModifier = options.numericModifier + options.skillModifier + options.rangeModifier
|
||||
let mod = options.rollItem?.value || 0
|
||||
mod += options.numericModifierSelect
|
||||
if (options.useVehicleBonus) {
|
||||
mod += options.vehicleBonus || 0
|
||||
}
|
||||
|
||||
// Build the dice formula
|
||||
let diceFormula = "2d6"
|
||||
if (options.rollType === "damage") {
|
||||
let damageFormula = options.weapon.system.damage.toUpperCase().replace(/D/g, "d")
|
||||
// Extract the mod (if present), like in 3d6+1
|
||||
let match = damageFormula.match(/([+-]\d+)$/)
|
||||
if (match) {
|
||||
mod += Number(match[1])
|
||||
damageFormula = damageFormula.replace(match[1], "")
|
||||
}
|
||||
// Replace the D6 by the correct number of D6
|
||||
damageFormula = damageFormula.replace(/(\d*)d6/gi, (match, p1) => {
|
||||
let numDice = Number(p1) || 1
|
||||
let damageModifier = Number(options.damageModifier)
|
||||
let postArg = ""
|
||||
if (damageModifier && damageModifier !== 0) {
|
||||
postArg = (damageModifier > 0) ? `kh${numDice}` : `kl${numDice}`
|
||||
numDice += Math.abs(damageModifier)
|
||||
}
|
||||
return `${numDice}d6${postArg} + ${mod}`
|
||||
})
|
||||
diceFormula = damageFormula
|
||||
} else {
|
||||
diceFormula = `${2 + Math.abs(options.finalModifier)}D6`
|
||||
if (options.finalModifier > 0) {
|
||||
diceFormula += `kh2 + ${mod}`
|
||||
} else {
|
||||
diceFormula += `kl2 + ${mod}`
|
||||
}
|
||||
}
|
||||
|
||||
console.log("FTLNomadRoll | Rolling ", diceFormula, options, rollData)
|
||||
const roll = new this(diceFormula, options.data, rollData)
|
||||
await roll.evaluate()
|
||||
|
||||
@@ -254,6 +349,8 @@ export default class FTLNomadRoll extends Roll {
|
||||
*/
|
||||
static createTitle(type, target) {
|
||||
switch (type) {
|
||||
case "damage":
|
||||
return `${game.i18n.localize("FTLNOMAD.Label.titleDamage")}`
|
||||
case "skill":
|
||||
return `${game.i18n.localize("FTLNOMAD.Label.titleSkill")}`
|
||||
case "weapon":
|
||||
|
||||
@@ -11,4 +11,4 @@ export { default as FTLNomadImplant } from "./implant.mjs"
|
||||
export { default as FTLNomadStarship } from "./starship.mjs"
|
||||
export { default as FTLNomadCreatureTrait } from "./creature-trait.mjs"
|
||||
export { default as FTLNomadCreatureAbility } from "./creature-ability.mjs"
|
||||
|
||||
export { default as FTLNomadRobot } from "./robot.mjs"
|
||||
|
||||
@@ -35,8 +35,8 @@ export default class FTLNomadProtagonist extends foundry.abstract.TypeDataModel
|
||||
schema.health = new fields.SchemaField({
|
||||
staminaValue: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
|
||||
staminaMax: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
|
||||
wounds: new fields.NumberField({ ...requiredInteger, initial:0, min: 0 }),
|
||||
triageResults: new fields.StringField({ required: true, nullable: false, initial: "none", choices: SYSTEM.TRIAGE_RESULTS })
|
||||
wounds: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
|
||||
triageResults: new fields.StringField({ required: true, nullable: false, initial: "none", choices: SYSTEM.TRIAGE_RESULTS })
|
||||
})
|
||||
|
||||
schema.enc = new fields.SchemaField({
|
||||
@@ -76,18 +76,15 @@ export default class FTLNomadProtagonist extends foundry.abstract.TypeDataModel
|
||||
|
||||
prepareDerivedData() {
|
||||
super.prepareDerivedData();
|
||||
|
||||
let encMax = 10 + (2*this.skills.physical.value)
|
||||
if (encMax !== this.enc.max) {
|
||||
this.enc.max = encMax
|
||||
}
|
||||
|
||||
let encMax = this.enc.max // 10 + (2 * this.skills.physical.value)
|
||||
let enc = 0
|
||||
let armor = 0
|
||||
for (let i of this.parent.items) {
|
||||
for (let i of this.parent.items) {
|
||||
if (i.system?.enc) {
|
||||
enc += i.system.enc
|
||||
}
|
||||
if ( i.system?.protection) {
|
||||
if (i.system?.protection) {
|
||||
armor += i.system.protection
|
||||
}
|
||||
}
|
||||
@@ -97,12 +94,12 @@ export default class FTLNomadProtagonist extends foundry.abstract.TypeDataModel
|
||||
if (armor !== this.armor.value) {
|
||||
this.armor.value = armor
|
||||
}
|
||||
let staminaMax = 14 + (3*this.skills.physical.value)
|
||||
let staminaMax = 14 + (3 * this.skills.physical.value)
|
||||
if (staminaMax !== this.health.staminaMax) {
|
||||
this.health.staminaMax = staminaMax
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
isEncumbered() {
|
||||
return this.enc.value > this.enc.max
|
||||
}
|
||||
|
||||
94
module/models/robot.mjs
Normal file
94
module/models/robot.mjs
Normal file
@@ -0,0 +1,94 @@
|
||||
import { SYSTEM } from "../config/system.mjs"
|
||||
import FTLNomadRoll from "../documents/roll.mjs"
|
||||
|
||||
export default class FTLNomadRobot extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields
|
||||
const requiredInteger = { required: true, nullable: false, integer: true }
|
||||
const schema = {}
|
||||
|
||||
schema.description = new fields.HTMLField({ required: true, textSearch: true })
|
||||
schema.notes = new fields.HTMLField({ required: true, textSearch: true })
|
||||
schema.name = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
|
||||
schema.techAge = new fields.StringField({ required: true, choices: SYSTEM.TECH_AGES, initial: "lateatomic" })
|
||||
schema.robotSize = new fields.StringField({ required: true, choices: SYSTEM.ROBOT_SIZES, initial: "medium" })
|
||||
schema.durability = new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 })
|
||||
schema.protection = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.brain = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
schema.speed = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||
|
||||
// Carac
|
||||
const skillField = (label) => {
|
||||
const schema = {
|
||||
value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0, max: 5 }),
|
||||
label: new fields.StringField({ required: true, nullable: false, initial: label })
|
||||
}
|
||||
return new fields.SchemaField(schema, { label })
|
||||
}
|
||||
|
||||
schema.skills = new fields.SchemaField(
|
||||
Object.values(SYSTEM.SKILLS).reduce((obj, characteristic) => {
|
||||
obj[characteristic.id] = skillField(characteristic.label)
|
||||
return obj
|
||||
}, {}),
|
||||
)
|
||||
|
||||
schema.enc = new fields.SchemaField({
|
||||
value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
|
||||
max: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
})
|
||||
|
||||
schema.cost = new fields.StringField({ required: true, initial: "0" })
|
||||
|
||||
return schema
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static LOCALIZATION_PREFIXES = ["FTLNOMAD.Robot"]
|
||||
|
||||
prepareDerivedData() {
|
||||
super.prepareDerivedData();
|
||||
|
||||
let encMax = this.enc.max // this.durability + (2 * this.skills.physical.value)
|
||||
let enc = 0
|
||||
for (let i of this.parent.items) {
|
||||
if (i.system?.enc) {
|
||||
enc += i.system.enc
|
||||
}
|
||||
}
|
||||
if (enc !== this.enc.value) {
|
||||
this.enc.value = enc
|
||||
}
|
||||
}
|
||||
|
||||
isEncumbered() {
|
||||
return this.enc.value > this.enc.max
|
||||
}
|
||||
|
||||
/** */
|
||||
/**
|
||||
* Rolls a dice for a character.
|
||||
* @param {("save"|"resource|damage")} rollType The type of the roll.
|
||||
* @param {number} rollItem The target value for the roll. Which caracteristic or resource. If the roll is a damage roll, this is the id of the item.
|
||||
* @returns {Promise<null>} - A promise that resolves to null if the roll is cancelled.
|
||||
*/
|
||||
async roll(rollType, rollItem) {
|
||||
let opponentTarget
|
||||
const hasTarget = opponentTarget !== undefined
|
||||
|
||||
let roll = await FTLNomadRoll.prompt({
|
||||
rollType,
|
||||
rollItem,
|
||||
actorId: this.parent.id,
|
||||
actorName: this.parent.name,
|
||||
actorImage: this.parent.img,
|
||||
isEncumbered: this.isEncumbered(),
|
||||
hasTarget,
|
||||
target: opponentTarget
|
||||
})
|
||||
if (!roll) return null
|
||||
|
||||
await roll.toMessage({}, { rollMode: roll.options.rollMode })
|
||||
}
|
||||
}
|
||||
@@ -11,13 +11,18 @@ export default class FTLNomadStarship extends foundry.abstract.TypeDataModel {
|
||||
schema.hullType = new fields.StringField({ required: true, initial: "small", choices: SYSTEM.STARSHIP_HULL })
|
||||
schema.endurance = new fields.StringField({ required: true, initial: "" })
|
||||
schema.armor = new fields.StringField({ required: true, initial: "" })
|
||||
schema.crew = new fields.StringField({ required: true, initial: "" })
|
||||
schema.armorRegular = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.armorCritical = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.crewList = new fields.ArrayField(new fields.StringField({ required: true }), { initial: [] })
|
||||
schema.crewCapacity = new fields.StringField({ required: true, initial: "" })
|
||||
schema.npcCrew = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.cargo = new fields.StringField({ required: true, initial: "" })
|
||||
schema.guns = new fields.StringField({ required: true, initial: "1d6" })
|
||||
schema.travelMultiplier = new fields.StringField({ required: true, initial: "" })
|
||||
schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0 })
|
||||
schema.monthlyCost = new fields.NumberField({ required: true, initial: 0, min: 0 })
|
||||
schema.cost = new fields.StringField({ required: true, initial: "0" })
|
||||
schema.monthlyCost = new fields.StringField({ required: true, initial: "0" })
|
||||
schema.damages = new fields.StringField({ required: true, initial: "" })
|
||||
schema.techAge = new fields.StringField({ required: true, choices: SYSTEM.TECH_AGES, initial: "lateatomic" })
|
||||
|
||||
schema.description = new fields.HTMLField({ required: true, textSearch: true })
|
||||
schema.modifications = new fields.HTMLField({ required: true, textSearch: true })
|
||||
@@ -33,4 +38,24 @@ export default class FTLNomadStarship extends foundry.abstract.TypeDataModel {
|
||||
return false
|
||||
}
|
||||
|
||||
async roll(rollType, rollItem) {
|
||||
let opponentTarget
|
||||
const hasTarget = opponentTarget !== undefined
|
||||
|
||||
let roll = await FTLNomadRoll.prompt({
|
||||
rollType,
|
||||
rollItem,
|
||||
actorId: this.parent.id,
|
||||
actorName: this.parent.name,
|
||||
actorImage: this.parent.img,
|
||||
isEncumbered: false,
|
||||
hasTarget,
|
||||
target: opponentTarget
|
||||
})
|
||||
if (!roll) return null
|
||||
|
||||
await roll.toMessage({}, { rollMode: roll.options.rollMode })
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -9,16 +9,20 @@ export default class FTLNomadVehicle extends foundry.abstract.TypeDataModel {
|
||||
|
||||
schema.agility = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.armor = new fields.StringField({ required: true, initial: "" })
|
||||
schema.armorRegular = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.armorCritical = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.cargo = new fields.StringField({ required: true, initial: "" })
|
||||
schema.crew = new fields.StringField({ required: true, initial: "" })
|
||||
schema.crewList = new fields.ArrayField(new fields.StringField({ required: true }), { initial: [] })
|
||||
schema.crewCapacity = new fields.StringField({ required: true, initial: "" })
|
||||
schema.npcCrew = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.force = new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 })
|
||||
schema.range = new fields.StringField({ required: true, initial: "1d6" })
|
||||
schema.speed = new fields.StringField({ required: true, initial: "1d6" })
|
||||
schema.techAge = new fields.StringField({ required: true, initial: "1d6" })
|
||||
schema.techAge = new fields.StringField({ required: true, choices: SYSTEM.TECH_AGES, initial: "lateatomic" })
|
||||
schema.tonnage = new fields.StringField({ required: true, initial: "" })
|
||||
schema.damages = new fields.StringField({ required: true, initial: "" })
|
||||
|
||||
schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0 })
|
||||
schema.cost = new fields.StringField({ required: true, initial: "0" })
|
||||
|
||||
schema.description = new fields.HTMLField({ required: true, textSearch: true })
|
||||
schema.notes = new fields.HTMLField({ required: true, textSearch: true })
|
||||
@@ -33,23 +37,23 @@ export default class FTLNomadVehicle extends foundry.abstract.TypeDataModel {
|
||||
return false
|
||||
}
|
||||
|
||||
async roll(rollType, rollItem) {
|
||||
let opponentTarget
|
||||
const hasTarget = opponentTarget !== undefined
|
||||
async roll(rollType, rollItem) {
|
||||
let opponentTarget
|
||||
const hasTarget = opponentTarget !== undefined
|
||||
|
||||
let roll = await FTLNomadRoll.prompt({
|
||||
rollType,
|
||||
rollItem,
|
||||
actorId: this.parent.id,
|
||||
actorName: this.parent.name,
|
||||
actorImage: this.parent.img,
|
||||
isEncumbered: this.isEncumbered(),
|
||||
hasTarget,
|
||||
target: opponentTarget
|
||||
})
|
||||
if (!roll) return null
|
||||
let roll = await FTLNomadRoll.prompt({
|
||||
rollType,
|
||||
rollItem,
|
||||
actorId: this.parent.id,
|
||||
actorName: this.parent.name,
|
||||
actorImage: this.parent.img,
|
||||
isEncumbered: this.isEncumbered(),
|
||||
hasTarget,
|
||||
target: opponentTarget
|
||||
})
|
||||
if (!roll) return null
|
||||
|
||||
await roll.toMessage({}, { rollMode: roll.options.rollMode })
|
||||
}
|
||||
await roll.toMessage({}, { rollMode: roll.options.rollMode })
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -8,14 +8,14 @@ export default class FTLNomadWeapon extends foundry.abstract.TypeDataModel {
|
||||
|
||||
schema.description = new fields.HTMLField({ required: true, textSearch: true })
|
||||
|
||||
schema.techAge = new fields.StringField({ required: true, choices: SYSTEM.TECH_AGES, initial : "lateatomic" })
|
||||
schema.techAge = new fields.StringField({ required: true, choices: SYSTEM.TECH_AGES, initial: "lateatomic" })
|
||||
schema.weaponType = new fields.StringField({ required: true, initial: "melee", choices: SYSTEM.WEAPON_TYPES })
|
||||
schema.rangeType = new fields.StringField({ required: true, initial: "melee", choices: SYSTEM.WEAPON_RANGE })
|
||||
|
||||
schema.damage = new fields.StringField({required: true, initial: "1d6"})
|
||||
schema.damage = new fields.StringField({ required: true, initial: "1d6" })
|
||||
schema.magazine = new fields.NumberField({ required: true, initial: 1, min: 0 })
|
||||
|
||||
schema.range = new fields.SchemaField({
|
||||
schema.range = new fields.SchemaField({
|
||||
close: new fields.NumberField({ ...requiredInteger, initial: 0 }),
|
||||
near: new fields.NumberField({ ...requiredInteger, initial: 0 }),
|
||||
far: new fields.NumberField({ ...requiredInteger, initial: 0 }),
|
||||
@@ -23,7 +23,7 @@ export default class FTLNomadWeapon extends foundry.abstract.TypeDataModel {
|
||||
})
|
||||
|
||||
schema.enc = new fields.NumberField({ required: true, initial: 1, min: 0 })
|
||||
schema.aspect = new fields.StringField({ required: true, initial: ""})
|
||||
schema.aspect = new fields.StringField({ required: true, initial: "" })
|
||||
|
||||
schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0 })
|
||||
schema.ammoCost = new fields.NumberField({ required: true, initial: 0, min: 0 })
|
||||
|
||||
@@ -675,7 +675,7 @@ export default class FTLNomadUtils {
|
||||
return [];
|
||||
});
|
||||
|
||||
console.log("Melee Weapons Data", meleeWeaponsData);
|
||||
console.log("Melee Weapons Data", meleeWeaponsData);
|
||||
// Import each melee weapon
|
||||
for (const weapon of meleeWeaponsData) {
|
||||
// Check if the weapon already exists
|
||||
@@ -705,4 +705,51 @@ export default class FTLNomadUtils {
|
||||
}
|
||||
}
|
||||
|
||||
static async importVehicleWeapons() {
|
||||
// Create a melee weapons folder if it doesn't exist
|
||||
const meleeWeaponsFolder = game.folders.getName("Vehicle Weapons") || await Folder.create({
|
||||
name: "Vehicle Weapons", type: "Item"
|
||||
})
|
||||
if (!meleeWeaponsFolder) {
|
||||
console.error("Failed to create Vehicle Weapons folder");
|
||||
return;
|
||||
}
|
||||
// Load the melee weapons JSON file
|
||||
const meleeWeaponsData = await fetch("systems/fvtt-ftl-nomad/assets/json_data/vehicleweapons.json")
|
||||
.then(response => response.json())
|
||||
.catch(error => {
|
||||
console.error("Failed to load vehicle weapons data:", error);
|
||||
return [];
|
||||
});
|
||||
|
||||
console.log("vehicle Weapons Data", meleeWeaponsData);
|
||||
// Import each melee weapon
|
||||
for (const weapon of meleeWeaponsData) {
|
||||
// Check if the weapon already exists
|
||||
const existingWeapon = game.items.find(i => i.name === weapon.name && i.type === "weapon");
|
||||
if (existingWeapon) {
|
||||
console.warn(`Weapon ${weapon.name} already exists, skipping import.`);
|
||||
}
|
||||
// Create the weapon item
|
||||
await Item.create({
|
||||
name: weapon.name,
|
||||
type: "weapon",
|
||||
img: "systems/fvtt-ftl-nomad/assets/icons/icon_weapon.svg",
|
||||
system: {
|
||||
description: weapon.description,
|
||||
damage: weapon.damage,
|
||||
techAge: this.getTechAgeKeyFromLabel(weapon.tech_age),
|
||||
weaponType: "vehicle", //SYSTEM.WEAPON_TYPES.melee.id,
|
||||
rangeType: SYSTEM.WEAPON_RANGE.melee.id,
|
||||
enc: 0,
|
||||
aspect: weapon.aspects,
|
||||
cost: weapon.cost || 0,
|
||||
ammoCost: weapon.ammo_cost || 0,
|
||||
magazine: weapon.mag || 1,
|
||||
},
|
||||
folder: meleeWeaponsFolder.id
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Binary file not shown.
BIN
packs/ftl-nomad-items/000119.ldb
Normal file
BIN
packs/ftl-nomad-items/000119.ldb
Normal file
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000035
|
||||
MANIFEST-000144
|
||||
|
||||
@@ -1,15 +1,7 @@
|
||||
2025/07/13-19:19:55.407043 7f3fa77fe6c0 Recovering log #33
|
||||
2025/07/13-19:19:55.417622 7f3fa77fe6c0 Delete type=3 #31
|
||||
2025/07/13-19:19:55.417740 7f3fa77fe6c0 Delete type=0 #33
|
||||
2025/07/13-19:30:09.138052 7f3fa57fa6c0 Level-0 table #38: started
|
||||
2025/07/13-19:30:09.142514 7f3fa57fa6c0 Level-0 table #38: 69052 bytes OK
|
||||
2025/07/13-19:30:09.149276 7f3fa57fa6c0 Delete type=0 #36
|
||||
2025/07/13-19:30:09.149522 7f3fa57fa6c0 Manual compaction at level-0 from '!folders!AuBtSOj1mJmh88qx' @ 72057594037927935 : 1 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at (end)
|
||||
2025/07/13-19:30:09.149572 7f3fa57fa6c0 Manual compaction at level-1 from '!folders!AuBtSOj1mJmh88qx' @ 72057594037927935 : 1 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at '!items!zv9dwgL3p7ThQn7j' @ 347 : 0
|
||||
2025/07/13-19:30:09.149581 7f3fa57fa6c0 Compacting 1@1 + 1@2 files
|
||||
2025/07/13-19:30:09.155375 7f3fa57fa6c0 Generated table #39@1: 273 keys, 107280 bytes
|
||||
2025/07/13-19:30:09.155393 7f3fa57fa6c0 Compacted 1@1 + 1@2 files => 107280 bytes
|
||||
2025/07/13-19:30:09.161181 7f3fa57fa6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
||||
2025/07/13-19:30:09.161294 7f3fa57fa6c0 Delete type=2 #14
|
||||
2025/07/13-19:30:09.161440 7f3fa57fa6c0 Delete type=2 #38
|
||||
2025/07/13-19:30:09.181330 7f3fa57fa6c0 Manual compaction at level-1 from '!items!zv9dwgL3p7ThQn7j' @ 347 : 0 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at (end)
|
||||
2025/11/24-19:41:43.032349 7f91477fe6c0 Recovering log #142
|
||||
2025/11/24-19:41:43.121482 7f91477fe6c0 Delete type=3 #140
|
||||
2025/11/24-19:41:43.121644 7f91477fe6c0 Delete type=0 #142
|
||||
2025/11/24-19:48:51.201740 7f91467fc6c0 Level-0 table #147: started
|
||||
2025/11/24-19:48:51.201811 7f91467fc6c0 Level-0 table #147: 0 bytes OK
|
||||
2025/11/24-19:48:51.208431 7f91467fc6c0 Delete type=0 #145
|
||||
2025/11/24-19:48:51.222941 7f91467fc6c0 Manual compaction at level-0 from '!folders!AuBtSOj1mJmh88qx' @ 72057594037927935 : 1 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
2025/07/13-10:30:52.384204 7f3fa77fe6c0 Recovering log #29
|
||||
2025/07/13-10:30:52.394989 7f3fa77fe6c0 Delete type=3 #27
|
||||
2025/07/13-10:30:52.395058 7f3fa77fe6c0 Delete type=0 #29
|
||||
2025/07/13-10:33:26.219686 7f3fa57fa6c0 Level-0 table #34: started
|
||||
2025/07/13-10:33:26.219728 7f3fa57fa6c0 Level-0 table #34: 0 bytes OK
|
||||
2025/07/13-10:33:26.225987 7f3fa57fa6c0 Delete type=0 #32
|
||||
2025/07/13-10:33:26.233983 7f3fa57fa6c0 Manual compaction at level-0 from '!folders!AuBtSOj1mJmh88qx' @ 72057594037927935 : 1 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at (end)
|
||||
2025/07/13-10:33:26.244796 7f3fa57fa6c0 Manual compaction at level-1 from '!folders!AuBtSOj1mJmh88qx' @ 72057594037927935 : 1 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at (end)
|
||||
2025/11/16-13:42:15.516505 7f47817fa6c0 Recovering log #138
|
||||
2025/11/16-13:42:15.531915 7f47817fa6c0 Delete type=3 #136
|
||||
2025/11/16-13:42:15.531986 7f47817fa6c0 Delete type=0 #138
|
||||
2025/11/16-13:48:27.487704 7f4780bff6c0 Level-0 table #143: started
|
||||
2025/11/16-13:48:27.487749 7f4780bff6c0 Level-0 table #143: 0 bytes OK
|
||||
2025/11/16-13:48:27.494893 7f4780bff6c0 Delete type=0 #141
|
||||
2025/11/16-13:48:27.501327 7f4780bff6c0 Manual compaction at level-0 from '!folders!AuBtSOj1mJmh88qx' @ 72057594037927935 : 1 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
BIN
packs/ftl-nomad-items/MANIFEST-000144
Normal file
BIN
packs/ftl-nomad-items/MANIFEST-000144
Normal file
Binary file not shown.
0
packs/ftl-nomad-items/lost/000065.log
Normal file
0
packs/ftl-nomad-items/lost/000065.log
Normal file
0
packs/ftl-nomad-items/lost/000113.log
Normal file
0
packs/ftl-nomad-items/lost/000113.log
Normal file
Binary file not shown.
BIN
packs/ftl-nomad-vehicles/000097.ldb
Normal file
BIN
packs/ftl-nomad-vehicles/000097.ldb
Normal file
Binary file not shown.
0
packs/ftl-nomad-vehicles/000124.log
Normal file
0
packs/ftl-nomad-vehicles/000124.log
Normal file
@@ -1 +1 @@
|
||||
MANIFEST-000014
|
||||
MANIFEST-000122
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
2025/07/13-19:19:55.423004 7f3fa5ffb6c0 Recovering log #12
|
||||
2025/07/13-19:19:55.432450 7f3fa5ffb6c0 Delete type=3 #10
|
||||
2025/07/13-19:19:55.432507 7f3fa5ffb6c0 Delete type=0 #12
|
||||
2025/07/13-19:30:09.131809 7f3fa57fa6c0 Level-0 table #17: started
|
||||
2025/07/13-19:30:09.131855 7f3fa57fa6c0 Level-0 table #17: 0 bytes OK
|
||||
2025/07/13-19:30:09.137925 7f3fa57fa6c0 Delete type=0 #15
|
||||
2025/07/13-19:30:09.149491 7f3fa57fa6c0 Manual compaction at level-0 from '!actors!3pydTJsM73Z4o0V6' @ 72057594037927935 : 1 .. '!folders!vRnrOJqSMlxbSgyX' @ 0 : 0; will stop at (end)
|
||||
2025/07/13-19:30:09.149534 7f3fa57fa6c0 Manual compaction at level-1 from '!actors!3pydTJsM73Z4o0V6' @ 72057594037927935 : 1 .. '!folders!vRnrOJqSMlxbSgyX' @ 0 : 0; will stop at (end)
|
||||
2025/11/24-19:41:43.155366 7f9146ffd6c0 Recovering log #120
|
||||
2025/11/24-19:41:43.249081 7f9146ffd6c0 Delete type=3 #118
|
||||
2025/11/24-19:41:43.249224 7f9146ffd6c0 Delete type=0 #120
|
||||
2025/11/24-19:48:51.208632 7f91467fc6c0 Level-0 table #125: started
|
||||
2025/11/24-19:48:51.208686 7f91467fc6c0 Level-0 table #125: 0 bytes OK
|
||||
2025/11/24-19:48:51.216157 7f91467fc6c0 Delete type=0 #123
|
||||
2025/11/24-19:48:51.222968 7f91467fc6c0 Manual compaction at level-0 from '!actors!0FQ6XaRi24OorI21' @ 72057594037927935 : 1 .. '!folders!vRnrOJqSMlxbSgyX' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
2025/07/13-10:30:52.399161 7f3fa5ffb6c0 Recovering log #8
|
||||
2025/07/13-10:30:52.409521 7f3fa5ffb6c0 Delete type=3 #6
|
||||
2025/07/13-10:30:52.409646 7f3fa5ffb6c0 Delete type=0 #8
|
||||
2025/07/13-10:33:26.202414 7f3fa57fa6c0 Level-0 table #13: started
|
||||
2025/07/13-10:33:26.202485 7f3fa57fa6c0 Level-0 table #13: 0 bytes OK
|
||||
2025/07/13-10:33:26.208789 7f3fa57fa6c0 Delete type=0 #11
|
||||
2025/07/13-10:33:26.233915 7f3fa57fa6c0 Manual compaction at level-0 from '!actors!3pydTJsM73Z4o0V6' @ 72057594037927935 : 1 .. '!folders!vRnrOJqSMlxbSgyX' @ 0 : 0; will stop at (end)
|
||||
2025/07/13-10:33:26.234020 7f3fa57fa6c0 Manual compaction at level-1 from '!actors!3pydTJsM73Z4o0V6' @ 72057594037927935 : 1 .. '!folders!vRnrOJqSMlxbSgyX' @ 0 : 0; will stop at (end)
|
||||
2025/11/16-13:42:15.536081 7f4781ffb6c0 Recovering log #116
|
||||
2025/11/16-13:42:15.550548 7f4781ffb6c0 Delete type=3 #114
|
||||
2025/11/16-13:42:15.550621 7f4781ffb6c0 Delete type=0 #116
|
||||
2025/11/16-13:48:27.494999 7f4780bff6c0 Level-0 table #121: started
|
||||
2025/11/16-13:48:27.495027 7f4780bff6c0 Level-0 table #121: 0 bytes OK
|
||||
2025/11/16-13:48:27.501164 7f4780bff6c0 Delete type=0 #119
|
||||
2025/11/16-13:48:27.501339 7f4780bff6c0 Manual compaction at level-0 from '!actors!0FQ6XaRi24OorI21' @ 72057594037927935 : 1 .. '!folders!vRnrOJqSMlxbSgyX' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
BIN
packs/ftl-nomad-vehicles/MANIFEST-000122
Normal file
BIN
packs/ftl-nomad-vehicles/MANIFEST-000122
Normal file
Binary file not shown.
0
packs/ftl-nomad-vehicles/lost/000020.log
Normal file
0
packs/ftl-nomad-vehicles/lost/000020.log
Normal file
0
packs/ftl-nomad-vehicles/lost/000043.log
Normal file
0
packs/ftl-nomad-vehicles/lost/000043.log
Normal file
0
packs/ftl-nomad-vehicles/lost/000091.log
Normal file
0
packs/ftl-nomad-vehicles/lost/000091.log
Normal file
@@ -123,23 +123,27 @@
|
||||
}
|
||||
|
||||
.encumbrance {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
.form-group {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
label {
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
min-width: 3rem;
|
||||
max-width: 3rem;
|
||||
}
|
||||
input {
|
||||
max-width: 3rem;
|
||||
min-width: 3rem;
|
||||
}
|
||||
.character-credit {
|
||||
input {
|
||||
max-width: 9rem;
|
||||
min-width: 9rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.character-name {
|
||||
@@ -168,7 +172,7 @@
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
justify-content: space-evenly;
|
||||
flex: 1;
|
||||
|
||||
.character-skill {
|
||||
@@ -219,10 +223,10 @@
|
||||
.character-biography {
|
||||
background-color: var(--color-light-1);
|
||||
prose-mirror.inactive {
|
||||
min-height: 40px;
|
||||
min-height: 16rem;
|
||||
}
|
||||
prose-mirror.active {
|
||||
min-height: 150px;
|
||||
min-height: 16rem;
|
||||
}
|
||||
.field-label {
|
||||
margin-left: 8px;
|
||||
|
||||
@@ -129,7 +129,7 @@
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
justify-content: space-evenly;
|
||||
flex: 1;
|
||||
|
||||
.creature-skill {
|
||||
@@ -201,6 +201,16 @@
|
||||
}
|
||||
}
|
||||
|
||||
.section-editor {
|
||||
min-height: 10rem;
|
||||
.editor {
|
||||
min-height: 10rem;
|
||||
}
|
||||
.editor-content {
|
||||
min-height: 10rem;
|
||||
}
|
||||
}
|
||||
|
||||
.biodata {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
@import "mixins.less";
|
||||
@import "character.less";
|
||||
@import "vehicle.less";
|
||||
@import "robot.less";
|
||||
@import "starship.less";
|
||||
@import "creature.less";
|
||||
@import "weapon.less";
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
:root {
|
||||
--font-size-standard: 0.9rem;
|
||||
--font-size-result: 1.4rem;
|
||||
--background-image-base: linear-gradient(rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.8)),
|
||||
url("../assets/ui/ftl_nomad_background_01.webp");
|
||||
--background-image-base: linear-gradient(
|
||||
rgba(255, 255, 255, 0.8),
|
||||
rgba(255, 255, 255, 0.8)
|
||||
),
|
||||
url("../assets/ui/ftl_nomad_background_01.webp");
|
||||
--font-primary: "Atkinson";
|
||||
--font-secondary: "Atkinson";
|
||||
--font-title: "Ethnocentric";
|
||||
@@ -12,12 +15,14 @@
|
||||
--color-warning: darkorange;
|
||||
--color-critical-success: rgb(21, 39, 204);
|
||||
--color-critical-failure: rgb(141, 32, 231);
|
||||
|
||||
/*--img-icon-color-filter: invert(60%) sepia(12%) saturate(6853%) hue-rotate(81deg) brightness(113%) contrast(104%);*/
|
||||
}
|
||||
|
||||
body {
|
||||
--color-text-secondary: rgb(22, 3, 3);
|
||||
--color-text-emphatic: rgb(9, 97, 14);
|
||||
--input-height: 1.6rem;
|
||||
}
|
||||
|
||||
.d100 {
|
||||
@@ -65,7 +70,7 @@ i.fvtt-ftl-nomad {
|
||||
|
||||
.application.dialog.fvtt-ftl-nomad {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.0);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
background-image: var(--background-image-base);
|
||||
button:hover {
|
||||
background: var(--color-dark-6);
|
||||
@@ -75,11 +80,17 @@ i.fvtt-ftl-nomad {
|
||||
}
|
||||
}
|
||||
|
||||
.sheet-tabs {
|
||||
background-color: var(--color-light-1);
|
||||
font-family: Ethnocentric;
|
||||
font-size: 0.7rem;
|
||||
}
|
||||
|
||||
.chat-message,
|
||||
.chat-message.whisper {
|
||||
font-family: var(--font-primary);
|
||||
background-image: var(--background-image-base);
|
||||
background-repeat:repeat-y;
|
||||
background-repeat: repeat-y;
|
||||
background-position: 0%;
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
|
||||
@@ -61,7 +61,6 @@
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.vehicle-sheet-common {
|
||||
@@ -78,8 +77,8 @@
|
||||
label {
|
||||
font-weight: bold;
|
||||
margin-right: 8px;
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -103,6 +102,27 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.robot-sheet-common {
|
||||
label {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
}
|
||||
.form-group {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
margin-bottom: 4px;
|
||||
|
||||
label {
|
||||
font-weight: bold;
|
||||
margin-right: 8px;
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.creature-sheet-common {
|
||||
label {
|
||||
font-family: var(--font-secondary);
|
||||
|
||||
339
styles/robot.less
Normal file
339
styles/robot.less
Normal file
@@ -0,0 +1,339 @@
|
||||
.robot-content {
|
||||
.sheet-common();
|
||||
.robot-sheet-common();
|
||||
overflow: scroll;
|
||||
}
|
||||
|
||||
.sheet-tabs {
|
||||
background-color: var(--color-light-1);
|
||||
}
|
||||
|
||||
.robot-main {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
|
||||
.robot-pc {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
flex: 1;
|
||||
|
||||
.robot-left {
|
||||
min-width: 180px;
|
||||
max-width: 180px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.robot-left-image {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding-bottom: 8px;
|
||||
.robot-img {
|
||||
height: 140px;
|
||||
width: auto;
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
|
||||
.robot-cost {
|
||||
label {
|
||||
min-width: 3rem;
|
||||
max-width: 3rem;
|
||||
}
|
||||
input {
|
||||
min-width: 6rem;
|
||||
max-width: 6rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.robot-right {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
|
||||
.robot-name {
|
||||
display: flex;
|
||||
input {
|
||||
font-family: var(--font-title);
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
width: 380px;
|
||||
}
|
||||
}
|
||||
|
||||
.robot-brain {
|
||||
min-width: 25rem;
|
||||
max-width: 25rem;
|
||||
textarea {
|
||||
min-width: 23rem;
|
||||
max-width: 23rem;
|
||||
background-color: rgba(0, 0, 0, 0.2);
|
||||
color: var(--color-dark-3);
|
||||
}
|
||||
}
|
||||
|
||||
.main-stats {
|
||||
min-width: 25rem;
|
||||
max-width: 25rem;
|
||||
.encumbered {
|
||||
color: red;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
.cargo,
|
||||
.capacity {
|
||||
label {
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
}
|
||||
input {
|
||||
max-width: 6rem;
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
.cargo-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
.robot-infos {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
|
||||
label {
|
||||
min-width: 120px;
|
||||
}
|
||||
|
||||
.robot-hp {
|
||||
display: flex;
|
||||
gap: 2px;
|
||||
align-items: center;
|
||||
.robot-hp-value {
|
||||
.form-fields input {
|
||||
flex: none;
|
||||
width: 50px;
|
||||
margin-left: 4px;
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
}
|
||||
}
|
||||
.robot-hp-max {
|
||||
clear: both;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
margin: 3px 0;
|
||||
align-items: center;
|
||||
input {
|
||||
width: 50px;
|
||||
text-align: center;
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
}
|
||||
}
|
||||
.hp-separator {
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.robot-skills {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-evenly;
|
||||
flex: 1;
|
||||
|
||||
.robot-skill {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.icon-skill {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
.rollable:hover,
|
||||
.rollable:focus {
|
||||
text-shadow: 0 0 8px var(--color-shadow-primary);
|
||||
cursor: pointer;
|
||||
}
|
||||
.rollable {
|
||||
min-width: 4.5rem;
|
||||
max-width: 4.5rem;
|
||||
}
|
||||
.char-text {
|
||||
margin-left: 0.5rem;
|
||||
}
|
||||
.d100 {
|
||||
flex: 0;
|
||||
max-width: 0.6rem;
|
||||
}
|
||||
.form-group {
|
||||
flex: 0;
|
||||
padding-left: 5px;
|
||||
.form-fields {
|
||||
font-size: 1.1rem;
|
||||
flex: none;
|
||||
width: 40px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.robot-skill-play {
|
||||
min-width: 225px;
|
||||
}
|
||||
|
||||
.robot-skill-edit {
|
||||
min-width: 225px;
|
||||
}
|
||||
|
||||
.robot-pc-play {
|
||||
min-width: 500px;
|
||||
}
|
||||
|
||||
.robot-pc-edit {
|
||||
min-width: 500px;
|
||||
}
|
||||
}
|
||||
|
||||
.robot-description {
|
||||
.text-center {
|
||||
text-align: left;
|
||||
align-content: center;
|
||||
}
|
||||
background-color: var(--color-light-1);
|
||||
prose-mirror.inactive {
|
||||
min-height: 40px;
|
||||
}
|
||||
prose-mirror.active {
|
||||
min-height: 150px;
|
||||
}
|
||||
.field-label {
|
||||
margin-left: 8px;
|
||||
}
|
||||
.robot-brain {
|
||||
input {
|
||||
min-width: 32rem;
|
||||
max-width: 32rem;
|
||||
}
|
||||
}
|
||||
.section-editor {
|
||||
min-height: 10rem;
|
||||
.editor {
|
||||
min-height: 10rem;
|
||||
}
|
||||
.editor-content {
|
||||
min-height: 10rem;
|
||||
}
|
||||
}
|
||||
|
||||
.biodata {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 8px;
|
||||
label {
|
||||
min-width: 3rem;
|
||||
}
|
||||
.feature {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
min-width: 18rem;
|
||||
max-width: 18rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tab.robot-equipment .main-div {
|
||||
background-color: var(--color-light-1);
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
legend {
|
||||
a {
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
padding-left: 5px;
|
||||
}
|
||||
}
|
||||
.weapons {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 4px;
|
||||
.weapon {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
min-width: 13rem;
|
||||
max-width: 13srem;
|
||||
.rollable:hover,
|
||||
.rollable:focus {
|
||||
text-shadow: 0 0 8px var(--color-shadow-primary);
|
||||
cursor: pointer;
|
||||
}
|
||||
.controls {
|
||||
min-width: 2rem;
|
||||
max-width: 2rem;
|
||||
}
|
||||
.damage {
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
.name {
|
||||
min-width: 8rem;
|
||||
max-width: 8rem;
|
||||
}
|
||||
.item-img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
margin: 4px 0 0 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.equipments {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 4px;
|
||||
.equipment {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
min-width: 13rem;
|
||||
max-width: 13srem;
|
||||
.rollable:hover,
|
||||
.rollable:focus {
|
||||
text-shadow: 0 0 8px var(--color-shadow-primary);
|
||||
cursor: pointer;
|
||||
}
|
||||
.controls {
|
||||
min-width: 2rem;
|
||||
max-width: 2rem;
|
||||
}
|
||||
.damage {
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
.name {
|
||||
min-width: 8rem;
|
||||
max-width: 8rem;
|
||||
}
|
||||
.item-img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
margin: 4px 0 0 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
prose-mirror.inactive {
|
||||
min-height: 40px;
|
||||
}
|
||||
prose-mirror.active {
|
||||
min-height: 150px;
|
||||
}
|
||||
}
|
||||
@@ -4,10 +4,6 @@
|
||||
overflow: scroll;
|
||||
}
|
||||
|
||||
.sheet-tabs {
|
||||
background-color: var(--color-light-1);
|
||||
}
|
||||
|
||||
.starship-main {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
@@ -42,7 +38,6 @@
|
||||
max-width: 4rem;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.starship-right {
|
||||
@@ -69,6 +64,12 @@
|
||||
text-shadow: 0 0 8px var(--color-shadow-primary);
|
||||
cursor: pointer;
|
||||
}
|
||||
.hull-field {
|
||||
select {
|
||||
min-width: 10rem;
|
||||
max-width: 10rem;
|
||||
}
|
||||
}
|
||||
label {
|
||||
margin-left: 0.2rem;
|
||||
max-width: 7rem;
|
||||
@@ -79,6 +80,11 @@
|
||||
align-items: center;
|
||||
align-self: center;
|
||||
gap: 4px;
|
||||
.starship-guns-label {
|
||||
min-width: 7.4rem;
|
||||
max-width: 7.4rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
input {
|
||||
max-width: 5rem;
|
||||
@@ -99,10 +105,20 @@
|
||||
select {
|
||||
max-width: 5rem;
|
||||
}
|
||||
|
||||
.npc-crew-field {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
.npc-crew-roll {
|
||||
cursor: pointer;
|
||||
color: var(--color-text-dark-primary);
|
||||
&:hover {
|
||||
color: var(--color-text-hyperlink);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.starship-infos {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -169,23 +185,31 @@
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.section-editor {
|
||||
min-height: 10rem;
|
||||
.editor {
|
||||
min-height: 10rem;
|
||||
}
|
||||
.editor-content {
|
||||
min-height: 10rem;
|
||||
}
|
||||
}
|
||||
|
||||
.biodata {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 8px;
|
||||
label {
|
||||
min-width: 3.0rem;
|
||||
min-width: 3rem;
|
||||
}
|
||||
.feature {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
min-width: 18rem;
|
||||
max-width: 18rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
min-width: 18rem;
|
||||
max-width: 18rem;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.tab.starship-equipment {
|
||||
@@ -198,6 +222,68 @@
|
||||
padding-left: 5px;
|
||||
}
|
||||
}
|
||||
.crew {
|
||||
.crew-list {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 8px;
|
||||
padding: 4px;
|
||||
}
|
||||
.crew-member {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 4px;
|
||||
border: 1px solid var(--color-border-dark);
|
||||
border-radius: 4px;
|
||||
background: var(--color-light-2);
|
||||
.crew-img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 50%;
|
||||
border: 1px solid var(--color-border-dark);
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
opacity: 0.8;
|
||||
box-shadow: 0 0 4px var(--color-shadow-primary);
|
||||
}
|
||||
}
|
||||
.crew-name {
|
||||
flex: 1;
|
||||
font-size: var(--font-size-small);
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
color: var(--color-text-dark-highlight);
|
||||
text-shadow: 0 0 4px var(--color-shadow-primary);
|
||||
}
|
||||
}
|
||||
.controls {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
min-width: 3rem;
|
||||
a {
|
||||
color: var(--color-text-dark-primary);
|
||||
&:hover {
|
||||
color: var(--color-text-dark-highlight);
|
||||
}
|
||||
}
|
||||
.pilot-button {
|
||||
color: var(--color-text-light-primary);
|
||||
&:hover {
|
||||
color: var(--color-text-light-highlight);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.crew-empty {
|
||||
grid-column: 1 / -1;
|
||||
text-align: center;
|
||||
padding: 8px;
|
||||
font-style: italic;
|
||||
color: var(--color-text-dark-secondary);
|
||||
}
|
||||
}
|
||||
|
||||
.weapons {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
|
||||
@@ -34,6 +34,14 @@
|
||||
}
|
||||
}
|
||||
|
||||
.spec {
|
||||
label {
|
||||
max-width: 4rem;
|
||||
}
|
||||
input {
|
||||
max-width: 4rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.vehicle-right {
|
||||
@@ -53,17 +61,33 @@
|
||||
.cargo,
|
||||
.capacity {
|
||||
label {
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
max-width: 7rem;
|
||||
}
|
||||
input {
|
||||
max-width: 6rem;
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
.cargo-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
.cargo-line {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
}
|
||||
.npc-crew-field {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
.npc-crew-roll {
|
||||
cursor: pointer;
|
||||
color: var(--color-text-dark-primary);
|
||||
&:hover {
|
||||
color: var(--color-text-hyperlink);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,23 +161,31 @@
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.section-editor {
|
||||
min-height: 10rem;
|
||||
.editor {
|
||||
min-height: 10rem;
|
||||
}
|
||||
.editor-content {
|
||||
min-height: 10rem;
|
||||
}
|
||||
}
|
||||
|
||||
.biodata {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 8px;
|
||||
label {
|
||||
min-width: 3.0rem;
|
||||
min-width: 3rem;
|
||||
}
|
||||
.feature {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
min-width: 18rem;
|
||||
max-width: 18rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
min-width: 18rem;
|
||||
max-width: 18rem;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.tab.vehicle-equipment .main-div {
|
||||
@@ -166,6 +198,68 @@
|
||||
padding-left: 5px;
|
||||
}
|
||||
}
|
||||
.crew {
|
||||
.crew-list {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 8px;
|
||||
padding: 4px;
|
||||
}
|
||||
.crew-member {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 4px;
|
||||
border: 1px solid var(--color-border-dark);
|
||||
border-radius: 4px;
|
||||
background: var(--color-light-2);
|
||||
.crew-img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 50%;
|
||||
border: 1px solid var(--color-border-dark);
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
opacity: 0.8;
|
||||
box-shadow: 0 0 4px var(--color-shadow-primary);
|
||||
}
|
||||
}
|
||||
.crew-name {
|
||||
flex: 1;
|
||||
font-size: var(--font-size-small);
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
color: var(--color-text-dark-highlight);
|
||||
text-shadow: 0 0 4px var(--color-shadow-primary);
|
||||
}
|
||||
}
|
||||
.controls {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
min-width: 3rem;
|
||||
a {
|
||||
color: var(--color-text-dark-primary);
|
||||
&:hover {
|
||||
color: var(--color-text-dark-highlight);
|
||||
}
|
||||
}
|
||||
.pilot-button {
|
||||
color: var(--color-text-light-primary);
|
||||
&:hover {
|
||||
color: var(--color-text-light-highlight);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.crew-empty {
|
||||
grid-column: 1 / -1;
|
||||
text-align: center;
|
||||
padding: 8px;
|
||||
font-style: italic;
|
||||
color: var(--color-text-dark-secondary);
|
||||
}
|
||||
}
|
||||
|
||||
.weapons {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"id": "fvtt-ftl-nomad",
|
||||
"title": "Faster Than Light : Nomad",
|
||||
"description": "Faster Than Light : Nomad is a system for Foundry VTT, based on the FTL system. It is a system for playing in a universe of space opera, where the players are the crew of a spaceship, traveling from planet to planet, from system to system, in search of adventure and fortune.",
|
||||
"manifest": "https://www.uberwald.me/gitea/public/fvtt-ftl-nomad/raw/branch/main/system.json",
|
||||
"manifest": "https://www.uberwald.me/gitea/uberwald/fvtt-ftl-nomad/releases/download/latest/system.json",
|
||||
"download": "#{DOWNLOAD}#",
|
||||
"url": "https://www.uberwald.me/gitea/public/fvtt-ftl-nomad",
|
||||
"license": "LICENSE",
|
||||
@@ -37,7 +37,8 @@
|
||||
"character": { "htmlFields": ["description", "notes"] },
|
||||
"creature": { "htmlFields": ["description", "notes"] },
|
||||
"vehicle": { "htmlFields": ["description", "notes"] },
|
||||
"starship": { "htmlFields": ["description", "notes"] }
|
||||
"starship": { "htmlFields": ["description", "notes"] },
|
||||
"robot": { "htmlFields": ["description", "notes"] }
|
||||
},
|
||||
"Item": {
|
||||
"talent": { "htmlFields": ["description"] },
|
||||
|
||||
@@ -23,12 +23,12 @@
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.description"}}</legend>
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true class="character-description"}}
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.notes"}}</legend>
|
||||
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}}
|
||||
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true class="character-notes"}}
|
||||
</fieldset>
|
||||
</div>
|
||||
</section>
|
||||
@@ -1,109 +1,265 @@
|
||||
<section class="character-main character-main-{{ifThen isPlayMode 'play' 'edit'}}">
|
||||
<section
|
||||
class="character-main character-main-{{ifThen isPlayMode 'play' 'edit'}}"
|
||||
>
|
||||
{{!log "character-main" this}}
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.character"}}</legend>
|
||||
<div class="character-pc character-pc-{{ifThen isPlayMode 'play' 'edit'}}">
|
||||
<div class="character-left">
|
||||
<div class="character-left-image">
|
||||
<img class="character-img" src="{{actor.img}}" data-edit="img" data-action="editImage"
|
||||
data-tooltip="{{actor.name}}" />
|
||||
<img
|
||||
class="character-img"
|
||||
src="{{actor.img}}"
|
||||
data-edit="img"
|
||||
data-action="editImage"
|
||||
data-tooltip="{{actor.name}}"
|
||||
/>
|
||||
</div>
|
||||
<fieldset class="character-hp">
|
||||
<legend>{{localize "FTLNOMAD.Label.Stamina"}}</legend>
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.health.fields.staminaValue value=system.health.staminaValue}}
|
||||
{{formField systemFields.health.fields.staminaMax value=system.health.staminaMax rootId=partId disabled=true}}
|
||||
{{formField
|
||||
systemFields.health.fields.staminaValue
|
||||
value=system.health.staminaValue
|
||||
}}
|
||||
{{formField
|
||||
systemFields.health.fields.staminaMax
|
||||
value=system.health.staminaMax
|
||||
rootId=partId
|
||||
disabled=true
|
||||
}}
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.health.fields.wounds value=system.health.wounds }}
|
||||
{{formField
|
||||
systemFields.health.fields.wounds
|
||||
value=system.health.wounds
|
||||
}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
<div class="character-right">
|
||||
<div class="character-name">
|
||||
{{formInput fields.name value=source.name rootId=partId disabled=isPlayMode}}
|
||||
<a class="control" data-action="toggleSheet" data-tooltip="FTLNOMAD.ToggleSheet" data-tooltip-direction="UP">
|
||||
{{formInput
|
||||
fields.name
|
||||
value=source.name
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
<a
|
||||
class="control"
|
||||
data-action="toggleSheet"
|
||||
data-tooltip="FTLNOMAD.ToggleSheet"
|
||||
data-tooltip-direction="UP"
|
||||
>
|
||||
<i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<fieldset class="character-spec">
|
||||
{{formField systemFields.concept value=system.concept rootId=partId disabled=isPlayMode}}
|
||||
{{formField systemFields.species value=system.species rootId=partId disabled=isPlayMode}}
|
||||
{{formField systemFields.archetype value=system.archetype rootId=partId disabled=isPlayMode}}
|
||||
{{formField
|
||||
systemFields.concept
|
||||
value=system.concept
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
{{formField
|
||||
systemFields.species
|
||||
value=system.species
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
{{formField
|
||||
systemFields.archetype
|
||||
value=system.archetype
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
<div class="hero-armor">
|
||||
{{formField systemFields.heroPoints value=system.heroPoints rootId=partId }}
|
||||
{{formField systemFields.armor.fields.value value=system.armor.value rootId=partId disabled=isPlayMode}}
|
||||
{{formField
|
||||
systemFields.heroPoints
|
||||
value=system.heroPoints
|
||||
rootId=partId
|
||||
}}
|
||||
{{formField
|
||||
systemFields.armor.fields.value
|
||||
value=system.armor.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="encumbrance">
|
||||
{{#if isEncumbered}}
|
||||
{{formField systemFields.enc.fields.value value=system.enc.value rootId=partId disabled=true classes="encumbered"}}
|
||||
{{else }}
|
||||
{{formField systemFields.enc.fields.value value=system.enc.value rootId=partId disabled=true}}
|
||||
{{/if}}
|
||||
{{formField systemFields.enc.fields.max value=system.enc.max rootId=partId disabled=isPlayMode}}
|
||||
{{formField systemFields.credits value=system.credits rootId=partId }}
|
||||
</fieldset>
|
||||
{{#if isEncumbered}}
|
||||
{{formField
|
||||
systemFields.enc.fields.value
|
||||
value=system.enc.value
|
||||
rootId=partId
|
||||
disabled=true
|
||||
classes="encumbered"
|
||||
}}
|
||||
{{else}}
|
||||
{{formField
|
||||
systemFields.enc.fields.value
|
||||
value=system.enc.value
|
||||
rootId=partId
|
||||
disabled=true
|
||||
}}
|
||||
{{/if}}
|
||||
{{formField
|
||||
systemFields.enc.fields.max
|
||||
value=system.enc.max
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
<span class="character-credit">
|
||||
{{formField
|
||||
systemFields.credits
|
||||
value=system.credits
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</span>
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="character-skills character-skills-{{ifThen isPlayMode 'play' 'edit'}}">
|
||||
<fieldset
|
||||
class="character-skills character-skills-{{ifThen
|
||||
isPlayMode
|
||||
'play'
|
||||
'edit'
|
||||
}}"
|
||||
>
|
||||
<legend>{{localize "FTLNOMAD.Label.skills"}}</legend>
|
||||
<div class="character-skill">
|
||||
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_combat.svg" class="icon-skill" />
|
||||
<label class="rollable" data-roll-type="skill" data-skill-id="combat">{{localize
|
||||
"FTLNOMAD.Label.combat"}}</label>
|
||||
{{formInput systemFields.skills.fields.combat.fields.value value=system.skills.combat.value rootId=partId disabled=isPlayMode type="number" }}
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_combat.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="combat"
|
||||
>{{localize "FTLNOMAD.Label.combat"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.combat.fields.value
|
||||
value=system.skills.combat.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="character-skill">
|
||||
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_knowledge.svg" class="icon-skill" />
|
||||
<label class="rollable" data-roll-type="skill" data-skill-id="knowledge">{{localize
|
||||
"FTLNOMAD.Label.knowledge"}}</label>
|
||||
{{formInput systemFields.skills.fields.knowledge.fields.value value=system.skills.knowledge.value
|
||||
rootId=partId disabled=isPlayMode type="number"}}
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_knowledge.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="knowledge"
|
||||
>{{localize "FTLNOMAD.Label.knowledge"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.knowledge.fields.value
|
||||
value=system.skills.knowledge.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="character-skill">
|
||||
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_social.svg" class="icon-skill" />
|
||||
<label class="rollable" data-roll-type="skill" data-skill-id="social">{{localize
|
||||
"FTLNOMAD.Label.social"}}</label>
|
||||
{{formInput systemFields.skills.fields.social.fields.value value=system.skills.social.value
|
||||
rootId=partId disabled=isPlayMode type="number"}}
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_social.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="social"
|
||||
>{{localize "FTLNOMAD.Label.social"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.social.fields.value
|
||||
value=system.skills.social.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="character-skill">
|
||||
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_physical.svg" class="icon-skill" />
|
||||
<label class="rollable" data-roll-type="skill" data-skill-id="physical">{{localize
|
||||
"FTLNOMAD.Label.physical"}}</label>
|
||||
{{formInput systemFields.skills.fields.physical.fields.value value=system.skills.physical.value
|
||||
rootId=partId disabled=isPlayMode type="number"}}
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_physical.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="physical"
|
||||
>{{localize "FTLNOMAD.Label.physical"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.physical.fields.value
|
||||
value=system.skills.physical.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="character-skill">
|
||||
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_stealth.svg" class="icon-skill" />
|
||||
<label class="rollable" data-roll-type="skill" data-skill-id="stealth">{{localize
|
||||
"FTLNOMAD.Label.stealth"}}</label>
|
||||
{{formInput systemFields.skills.fields.stealth.fields.value value=system.skills.stealth.value
|
||||
rootId=partId disabled=isPlayMode type="number"}}
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_stealth.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="stealth"
|
||||
>{{localize "FTLNOMAD.Label.stealth"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.stealth.fields.value
|
||||
value=system.skills.stealth.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="character-skill">
|
||||
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_vehicles.svg" class="icon-skill" />
|
||||
<label class="rollable" data-roll-type="skill" data-skill-id="vehicles">{{localize
|
||||
"FTLNOMAD.Label.vehicles"}}</label>
|
||||
{{formInput systemFields.skills.fields.vehicles.fields.value value=system.skills.vehicles.value
|
||||
rootId=partId disabled=isPlayMode type="number"}}
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_vehicles.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="vehicles"
|
||||
>{{localize "FTLNOMAD.Label.vehicles"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.vehicles.fields.value
|
||||
value=system.skills.vehicles.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="character-skill">
|
||||
<img src="systems/fvtt-ftl-nomad/assets/icons/icon_technology.svg" class="icon-skill" />
|
||||
<label class="rollable" data-roll-type="skill" data-skill-id="technology">{{localize
|
||||
"FTLNOMAD.Label.technology"}}</label>
|
||||
{{formInput systemFields.skills.fields.technology.fields.value value=system.skills.technology.value
|
||||
rootId=partId disabled=isPlayMode type="number"}}
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_technology.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="technology"
|
||||
>{{localize "FTLNOMAD.Label.technology"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.technology.fields.value
|
||||
value=system.skills.technology.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
|
||||
|
||||
</section>
|
||||
@@ -8,50 +8,67 @@
|
||||
<ul>
|
||||
|
||||
{{#if (eq rollType "skill")}}
|
||||
<li><strong>{{localize "FTLNOMAD.Label.skillRoll"}}</strong></li>
|
||||
<li><strong>{{localize "FTLNOMAD.Label.skillRoll"}}</strong></li>
|
||||
{{/if}}
|
||||
|
||||
|
||||
{{#if weapon}}
|
||||
<li><strong>Weapon : {{weapon.name}}</strong></li>
|
||||
{{#if (eq rollType "damage")}}
|
||||
<li class="result-success">Weapon Damage</li>
|
||||
<li><strong>{{weapon.name}}</strong></li>
|
||||
{{else}}
|
||||
{{#if weapon}}
|
||||
<li><strong>Weapon : {{weapon.name}}</strong></li>
|
||||
<li><strong>Aspects : {{weapon.system.aspect}}</strong></li>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
<li><strong>{{localize rollItem.label}} : {{fullFormula}}</strong></li>
|
||||
|
||||
{{#if isEncumbered}}
|
||||
<li class="red-warning">Encumbered : -1D</li>
|
||||
{{#if (eq rollType "damage")}}{{else}}
|
||||
{{#if isEncumbered}}
|
||||
<li class="red-warning">Encumbered : -1D</li>
|
||||
{{/if}}
|
||||
<li>{{localize "FTLNOMAD.Label.modifier"}}
|
||||
:
|
||||
{{skillModifier}}D
|
||||
{{rangeModifier}}D
|
||||
{{numericModifier}}D</li>
|
||||
{{/if}}
|
||||
|
||||
<li>{{localize "FTLNOMAD.Label.modifier"}} : {{skillModifier}}D {{rangeModifier}}D {{numericModifier}}D</li>
|
||||
{{#if (eq rollType "damage")}}{{else}}
|
||||
{{#if isSuccess}}
|
||||
<li class="result-success">
|
||||
{{localize "FTLNOMAD.Label.success"}}
|
||||
</li>
|
||||
{{/if}}
|
||||
|
||||
{{#if isSuccess}}
|
||||
<li class="result-success">
|
||||
{{localize "FTLNOMAD.Label.success"}}
|
||||
</li>
|
||||
{{#if isFailure}}
|
||||
<li class="result-failure">
|
||||
{{localize "FTLNOMAD.Label.failure"}}
|
||||
</li>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
{{#if isFailure}}
|
||||
<li class="result-failure">
|
||||
{{localize "FTLNOMAD.Label.failure"}}
|
||||
</li>
|
||||
{{/if}}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{#if isDamage}}
|
||||
<div>
|
||||
{{#if (and isGM hasTarget)}}
|
||||
{{{localize "FTLNOMAD.Roll.displayArmor" targetName=targetName targetArmor=targetArmor
|
||||
realDamage=realDamage}}}
|
||||
{{/if}}
|
||||
</div>
|
||||
<div>
|
||||
{{#if (and isGM hasTarget)}}
|
||||
{{{localize
|
||||
"FTLNOMAD.Roll.displayArmor"
|
||||
targetName=targetName
|
||||
targetArmor=targetArmor
|
||||
realDamage=realDamage
|
||||
}}}
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
{{#unless isPrivate}}
|
||||
<div class="dice-result">
|
||||
<h4 class="dice-total">{{total}}</h4>
|
||||
<div class="dice-formula">{{formula}}</div>
|
||||
{{{tooltip}}}
|
||||
</div>
|
||||
<div class="dice-result">
|
||||
<h4 class="dice-total">{{total}}</h4>
|
||||
<div class="dice-formula">{{formula}}</div>
|
||||
{{{tooltip}}}
|
||||
</div>
|
||||
{{/unless}}
|
||||
</div>
|
||||
@@ -1,18 +1,33 @@
|
||||
<section class="tab creature-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
|
||||
<section
|
||||
class="tab creature-{{tab.id}} {{tab.cssClass}}"
|
||||
data-tab="{{tab.id}}"
|
||||
data-group="{{tab.group}}"
|
||||
>
|
||||
|
||||
<div class="main-div">
|
||||
<div class="main-div">
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.description"}}</legend>
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description"
|
||||
toggled=true}}
|
||||
</fieldset>
|
||||
<fieldset class="section-editor">
|
||||
<legend>{{localize "FTLNOMAD.Label.description"}}</legend>
|
||||
{{formInput
|
||||
systemFields.description
|
||||
enriched=enrichedDescription
|
||||
value=system.description
|
||||
name="system.description"
|
||||
toggled=true
|
||||
}}
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.notes"}}</legend>
|
||||
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}}
|
||||
</fieldset>
|
||||
<fieldset class="section-editor">
|
||||
<legend>{{localize "FTLNOMAD.Label.notes"}}</legend>
|
||||
{{formInput
|
||||
systemFields.notes
|
||||
enriched=enrichedNotes
|
||||
value=system.notes
|
||||
name="system.notes"
|
||||
toggled=true
|
||||
}}
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
53
templates/robot-description.hbs
Normal file
53
templates/robot-description.hbs
Normal file
@@ -0,0 +1,53 @@
|
||||
<section
|
||||
class="tab robot-{{tab.id}} {{tab.cssClass}}"
|
||||
data-tab="{{tab.id}}"
|
||||
data-group="{{tab.group}}"
|
||||
>
|
||||
<fieldset>
|
||||
<legend>Tech Age</legend>
|
||||
<div class="flexrow">
|
||||
{{formField
|
||||
systemFields.techAge
|
||||
value=system.techAge
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<!-- <fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.damages"}}</legend>
|
||||
<div class="text-center">
|
||||
<textarea
|
||||
class="form-control"
|
||||
cols="64"
|
||||
rows="5"
|
||||
name="system.damages"
|
||||
data-tooltip="{{localize 'FTLNOMAD.Tooltip.damages'}}"
|
||||
>{{system.damages}}</textarea>
|
||||
</div>
|
||||
</fieldset> -->
|
||||
|
||||
<fieldset class="section-editor">
|
||||
<legend>{{localize "FTLNOMAD.Label.description"}}</legend>
|
||||
{{formInput
|
||||
systemFields.description
|
||||
enriched=enrichedDescription
|
||||
value=system.description
|
||||
name="system.description"
|
||||
toggled=true
|
||||
}}
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="section-editor">
|
||||
<legend>{{localize "FTLNOMAD.Label.notes"}}</legend>
|
||||
{{formInput
|
||||
systemFields.notes
|
||||
enriched=enrichedNotes
|
||||
value=system.notes
|
||||
name="system.notes"
|
||||
toggled=true
|
||||
}}
|
||||
</fieldset>
|
||||
|
||||
</section>
|
||||
108
templates/robot-equipment.hbs
Normal file
108
templates/robot-equipment.hbs
Normal file
@@ -0,0 +1,108 @@
|
||||
<section
|
||||
class="tab robot-{{tab.id}} {{tab.cssClass}}"
|
||||
data-tab="{{tab.id}}"
|
||||
data-group="{{tab.group}}"
|
||||
>
|
||||
<div class="main-div">
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.weapons"}}{{#if isEditMode}}
|
||||
<a
|
||||
class="action"
|
||||
data-tooltip="{{localize 'FTLNOMAD.Tooltip.addWeapon'}}"
|
||||
data-tooltip-direction="UP"
|
||||
><i class="fas fa-plus" data-action="createWeapon"></i></a>{{/if}}
|
||||
</legend>
|
||||
<div class="weapons">
|
||||
{{#each weapons as |item|}}
|
||||
{{!log 'weapon' this}}
|
||||
<div
|
||||
class="weapon item"
|
||||
data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"
|
||||
data-drag="true"
|
||||
>
|
||||
<img
|
||||
class="item-img"
|
||||
src="{{item.img}}"
|
||||
data-tooltip="{{item.name}}"
|
||||
/>
|
||||
<i class="fa-regular fa-dice"></i>
|
||||
<div
|
||||
class="name rollable"
|
||||
data-roll-type="weapon"
|
||||
data-tooltip="{{{item.system.description}}}"
|
||||
>
|
||||
{{item.name}}
|
||||
</div>
|
||||
<a
|
||||
class="damage rollable"
|
||||
data-item-id="{{item.id}}"
|
||||
data-action="roll"
|
||||
data-roll-type="damage"
|
||||
data-roll-value="{{item.system.damage}}"
|
||||
>{{localize "FTLNOMAD.Label.damageShort"}}
|
||||
:
|
||||
{{item.system.damage}}</a>
|
||||
<div class="controls">
|
||||
<a
|
||||
data-tooltip="{{localize 'FTLNOMAD.Edit'}}"
|
||||
data-action="edit"
|
||||
data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"
|
||||
><i class="fas fa-edit"></i></a>
|
||||
<a
|
||||
data-tooltip="{{localize 'FTLNOMAD.Delete'}}"
|
||||
data-action="delete"
|
||||
data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"
|
||||
><i class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.equipment"}}{{#if isEditMode}}
|
||||
<a
|
||||
class="action"
|
||||
data-tooltip="{{localize 'FTLNOMAD.Tooltip.addEquipment'}}"
|
||||
data-tooltip-direction="UP"
|
||||
><i class="fas fa-plus" data-action="createEquipment"></i></a>{{/if}}
|
||||
</legend>
|
||||
<div class="equipments">
|
||||
{{#each equipments as |item|}}
|
||||
{{!log 'armor' this}}
|
||||
<div
|
||||
class="equipment"
|
||||
data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"
|
||||
>
|
||||
<img
|
||||
class="item-img"
|
||||
src="{{item.img}}"
|
||||
data-tooltip="{{item.name}}"
|
||||
/>
|
||||
<div class="name" data-tooltip="{{{item.system.description}}}">
|
||||
{{item.name}}
|
||||
</div>
|
||||
<div class="controls">
|
||||
<a
|
||||
data-tooltip="{{localize 'FTLNOMAD.Edit'}}"
|
||||
data-action="edit"
|
||||
data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"
|
||||
><i class="fas fa-edit"></i></a>
|
||||
<a
|
||||
data-tooltip="{{localize 'FTLNOMAD.Delete'}}"
|
||||
data-action="delete"
|
||||
data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"
|
||||
><i class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</section>
|
||||
258
templates/robot-main.hbs
Normal file
258
templates/robot-main.hbs
Normal file
@@ -0,0 +1,258 @@
|
||||
<section class="robot-main robot-main-{{ifThen isPlayMode 'play' 'edit'}}">
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.robot"}}</legend>
|
||||
<div class="robot-pc robot-pc-{{ifThen isPlayMode 'play' 'edit'}}">
|
||||
|
||||
<div class="robot-left">
|
||||
<div class="robot-left-image">
|
||||
<img
|
||||
class="robot-img"
|
||||
src="{{actor.img}}"
|
||||
data-edit="img"
|
||||
data-action="editImage"
|
||||
data-tooltip="{{actor.name}}"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<fieldset class="robot-cost">
|
||||
<legend>Cost</legend>
|
||||
<div class="flexrow">
|
||||
{{formField
|
||||
systemFields.cost
|
||||
value=system.cost
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="robot-right">
|
||||
<div class="robot-name">
|
||||
{{formInput
|
||||
fields.name
|
||||
value=source.name
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
<a
|
||||
class="control"
|
||||
data-action="toggleSheet"
|
||||
data-tooltip="FTLNOMAD.ToggleSheet"
|
||||
data-tooltip-direction="UP"
|
||||
>
|
||||
<i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<fieldset class="main-stats">
|
||||
<legend>{{localize "FTLNOMAD.Label.mainStats"}}</legend>
|
||||
<div class="flexrow">
|
||||
{{formField
|
||||
systemFields.robotSize
|
||||
value=system.robotSize
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.protection
|
||||
value=system.protection
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
{{formField
|
||||
systemFields.speed
|
||||
value=system.speed
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.durability
|
||||
value=system.durability
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
{{#if isEncumbered}}
|
||||
{{formField
|
||||
systemFields.enc.fields.value
|
||||
value=system.enc.value
|
||||
rootId=partId
|
||||
disabled=true
|
||||
classes="encumbered"
|
||||
}}
|
||||
{{else}}
|
||||
{{formField
|
||||
systemFields.enc.fields.value
|
||||
value=system.enc.value
|
||||
rootId=partId
|
||||
disabled=true
|
||||
}}
|
||||
{{/if}}
|
||||
|
||||
{{formField
|
||||
systemFields.enc.fields.max
|
||||
value=system.enc.max
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="robot-brain">
|
||||
<legend>Brain</legend>
|
||||
<div class="flexrow">
|
||||
<textarea
|
||||
cols="64"
|
||||
rows="2"
|
||||
name="system.brain"
|
||||
data-tooltip="{{localize 'FTLNOMAD.Tooltip.brain'}}"
|
||||
{{#if isPlayMode}}disabled{{/if}}>{{system.brain}}</textarea>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
|
||||
<fieldset
|
||||
class="robot-skills robot-skills-{{ifThen isPlayMode 'play' 'edit'}}"
|
||||
>
|
||||
<legend>{{localize "FTLNOMAD.Label.skills"}}</legend>
|
||||
<div class="robot-skill">
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_combat.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="combat"
|
||||
>{{localize "FTLNOMAD.Label.combat"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.combat.fields.value
|
||||
value=system.skills.combat.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="robot-skill">
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_knowledge.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="knowledge"
|
||||
>{{localize "FTLNOMAD.Label.knowledge"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.knowledge.fields.value
|
||||
value=system.skills.knowledge.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="robot-skill">
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_social.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="social"
|
||||
>{{localize "FTLNOMAD.Label.social"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.social.fields.value
|
||||
value=system.skills.social.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="robot-skill">
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_physical.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="physical"
|
||||
>{{localize "FTLNOMAD.Label.physical"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.physical.fields.value
|
||||
value=system.skills.physical.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="robot-skill">
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_stealth.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="stealth"
|
||||
>{{localize "FTLNOMAD.Label.stealth"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.stealth.fields.value
|
||||
value=system.skills.stealth.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="robot-skill">
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_vehicles.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="vehicles"
|
||||
>{{localize "FTLNOMAD.Label.vehicles"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.vehicles.fields.value
|
||||
value=system.skills.vehicles.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="robot-skill">
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_technology.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="technology"
|
||||
>{{localize "FTLNOMAD.Label.technology"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.technology.fields.value
|
||||
value=system.skills.technology.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
</section>
|
||||
@@ -3,42 +3,136 @@
|
||||
<fieldSet>
|
||||
|
||||
{{#if (eq rollType "skill")}}
|
||||
<legend>{{localize "FTLNOMAD.Label.skill"}}</legend>
|
||||
<legend>{{localize "FTLNOMAD.Label.skill"}}</legend>
|
||||
{{/if}}
|
||||
|
||||
<div class="dialog-skill">{{localize rollItem.label}} : 2d6+{{rollItem.value}}</div>
|
||||
{{#if (eq rollType "damage")}}
|
||||
<div class="dialog-skill">Damage : {{weapon.system.damage}}</div>
|
||||
<div class="dialog-skill">Weapon : {{weapon.name}}</div>
|
||||
{{else}}
|
||||
{{#if availableSkills}}
|
||||
<label>{{localize "FTLNOMAD.Label.selectSkill"}}</label>
|
||||
<select name="selectedSkill" class="roll-skill-selector">
|
||||
{{#each availableSkills as |skill|}}
|
||||
<option
|
||||
value="{{skill.id}}"
|
||||
{{#if skill.selected}}selected{{/if}}
|
||||
>{{localize skill.label}} (2d6+{{skill.value}})</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
{{else}}
|
||||
<div class="dialog-skill">{{localize rollItem.label}}
|
||||
: 2d6+{{rollItem.value}}</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
{{#if weapon}}
|
||||
<div class="dialog-skill">Weapon : {{weapon.name}}</div>
|
||||
{{#if (eq rollType "weapon")}}
|
||||
<div class="dialog-skill">Weapon : {{weapon.name}}</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if isEncumbered}}
|
||||
<div class="dialog-skill red-warning">Encumbered : -1D</div>
|
||||
<div class="dialog-skill red-warning">Encumbered : -1D for Physical Attacks</div>
|
||||
{{/if}}
|
||||
|
||||
</fieldSet>
|
||||
|
||||
<fieldSet class="dialog-modifier">
|
||||
<legend>{{localize "FTLNOMAD.Label.modifier"}}</legend>
|
||||
|
||||
<select name="modifier" class="roll-skill-modifier">
|
||||
{{selectOptions choiceModifier selected=modifier localize=true}}
|
||||
</select>
|
||||
{{#if (eq rollType "damage")}}
|
||||
<legend>Damage advantages/disadvantages</legend>
|
||||
<select name="damageModifier" class="roll-damage-modifier">
|
||||
{{selectOptions
|
||||
choiceDamageModifier
|
||||
selected=damageModifier
|
||||
localize=true
|
||||
}}
|
||||
</select>
|
||||
{{else}}
|
||||
<legend>{{localize "FTLNOMAD.Label.modifier"}}</legend>
|
||||
<select name="modifier" class="roll-skill-modifier">
|
||||
{{selectOptions choiceModifier selected=modifier localize=true}}
|
||||
</select>
|
||||
<label>{{localize "FTLNOMAD.Label.numericModifier"}}</label>
|
||||
<select name="numericModifierSelect" class="roll-numeric-modifier">
|
||||
{{selectOptions choiceNumericModifier selected=numericModifierSelect}}
|
||||
</select>
|
||||
{{#if vehicleBonus}}
|
||||
<div class="vehicle-bonus-info">
|
||||
<label>
|
||||
<input
|
||||
type="checkbox"
|
||||
name="useVehicleBonus"
|
||||
class="use-vehicle-bonus"
|
||||
checked
|
||||
/>
|
||||
{{localize "FTLNOMAD.Label.vehicleBonus"}}
|
||||
</label>
|
||||
<span class="vehicle-bonus-value">+{{vehicleBonus}}</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
{{#if weapon}}
|
||||
{{#if (eq rollType "weapon")}}
|
||||
<select name="range-modifier" class="roll-skill-range-modifier">
|
||||
{{selectOptions choiceRangeModifier selected=rangeModifier}}
|
||||
</select>
|
||||
<ul>
|
||||
<li>Two Attacks : <input type="checkbox" name="isAiming" data-field="two-attacks" class="select-combat-option"></li>
|
||||
<li>Aiming : <input type="checkbox" data-field="aiming" class="select-combat-option"></li>
|
||||
<li>Dim Lightning : <input type="checkbox" data-field="dim" class="select-combat-option"></li>
|
||||
<li>Darkness : <input type="checkbox" data-field="darkness" class="select-combat-option"></li>
|
||||
<li>Target Prone/Obscured : <input type="checkbox" data-field="prone" class="select-combat-option"></li>
|
||||
<li>Target Cover : <input type="checkbox" data-field="cover" class="select-combat-option"></li>
|
||||
<li>1/2 Auto Fire Recoil : <input type="checkbox" data-field="recoil-first" class="select-combat-option"></li>
|
||||
<li>2+ Auto Fire Recoil : <input type="checkbox" data-field="recoil-third" class="select-combat-option"></li>
|
||||
<li>Target Aware : <input type="checkbox" data-field="aware" class="select-combat-option"></li>
|
||||
<li>Two Attacks :
|
||||
<input
|
||||
type="checkbox"
|
||||
name="isAiming"
|
||||
data-field="two-attacks"
|
||||
class="select-combat-option"
|
||||
/>
|
||||
</li>
|
||||
<li>Aiming :
|
||||
<input
|
||||
type="checkbox"
|
||||
data-field="aiming"
|
||||
class="select-combat-option"
|
||||
/></li>
|
||||
<li>Dim Lightning :
|
||||
<input
|
||||
type="checkbox"
|
||||
data-field="dim"
|
||||
class="select-combat-option"
|
||||
/></li>
|
||||
<li>Darkness :
|
||||
<input
|
||||
type="checkbox"
|
||||
data-field="darkness"
|
||||
class="select-combat-option"
|
||||
/></li>
|
||||
<li>Target Prone/Obscured :
|
||||
<input
|
||||
type="checkbox"
|
||||
data-field="prone"
|
||||
class="select-combat-option"
|
||||
/></li>
|
||||
<li>Target Cover :
|
||||
<input
|
||||
type="checkbox"
|
||||
data-field="cover"
|
||||
class="select-combat-option"
|
||||
/></li>
|
||||
<li>1/2 Auto Fire Recoil :
|
||||
<input
|
||||
type="checkbox"
|
||||
data-field="recoil-first"
|
||||
class="select-combat-option"
|
||||
/></li>
|
||||
<li>2+ Auto Fire Recoil :
|
||||
<input
|
||||
type="checkbox"
|
||||
data-field="recoil-third"
|
||||
class="select-combat-option"
|
||||
/></li>
|
||||
<li>Target Aware :
|
||||
<input
|
||||
type="checkbox"
|
||||
data-field="aware"
|
||||
class="select-combat-option"
|
||||
/></li>
|
||||
</ul>
|
||||
{{/if}}
|
||||
|
||||
@@ -46,7 +140,10 @@
|
||||
|
||||
<fieldSet class="dialog-formula">
|
||||
<legend>{{localize "FTLNOMAD.Label.formula"}}</legend>
|
||||
<label name="fullFormula" id="roll-dialog-full-formula" >{{fullFormula}}</label>
|
||||
<label
|
||||
name="fullFormula"
|
||||
id="roll-dialog-full-formula"
|
||||
>{{fullFormula}}</label>
|
||||
</fieldSet>
|
||||
|
||||
<fieldSet>
|
||||
|
||||
@@ -1,24 +1,78 @@
|
||||
<section class="tab starship-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
|
||||
<section
|
||||
class="tab starship-{{tab.id}} {{tab.cssClass}}"
|
||||
data-tab="{{tab.id}}"
|
||||
data-group="{{tab.group}}"
|
||||
>
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.techAge"}}</legend>
|
||||
<div class="flexrow">
|
||||
{{formField
|
||||
systemFields.techAge
|
||||
value=system.techAge
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.cost
|
||||
value=system.cost
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.monthlyCost
|
||||
value=system.monthlyCost
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.damages"}}</legend>
|
||||
<textarea class="form-control" cols="66" rows="5" name="system.damages"
|
||||
data-tooltip="{{localize "FTLNOMAD.Tooltip.damages"}}">{{system.damages}}</textarea>
|
||||
<textarea
|
||||
class="form-control"
|
||||
cols="66"
|
||||
rows="5"
|
||||
name="system.damages"
|
||||
data-tooltip="{{localize 'FTLNOMAD.Tooltip.damages'}}"
|
||||
>{{system.damages}}</textarea>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<fieldset class="section-editor">
|
||||
<legend>{{localize "FTLNOMAD.Label.description"}}</legend>
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||
{{formInput
|
||||
systemFields.description
|
||||
enriched=enrichedDescription
|
||||
value=system.description
|
||||
name="system.description"
|
||||
toggled=true
|
||||
}}
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<fieldset class="section-editor">
|
||||
<legend>{{localize "FTLNOMAD.Label.modifications"}}</legend>
|
||||
{{formInput systemFields.modifications enriched=enrichedModifications value=system.modifications name="system.modifications" toggled=true}}
|
||||
{{formInput
|
||||
systemFields.modifications
|
||||
enriched=enrichedModifications
|
||||
value=system.modifications
|
||||
name="system.modifications"
|
||||
toggled=true
|
||||
}}
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<fieldset class="section-editor">
|
||||
<legend>{{localize "FTLNOMAD.Label.notes"}}</legend>
|
||||
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}}
|
||||
{{formInput
|
||||
systemFields.notes
|
||||
enriched=enrichedNotes
|
||||
value=system.notes
|
||||
name="system.notes"
|
||||
toggled=true
|
||||
}}
|
||||
</fieldset>
|
||||
|
||||
</section>
|
||||
88
templates/starship-equipment.hbs
Normal file
88
templates/starship-equipment.hbs
Normal file
@@ -0,0 +1,88 @@
|
||||
<section
|
||||
class="tab vehicle-{{tab.id}} {{tab.cssClass}}"
|
||||
data-tab="{{tab.id}}"
|
||||
data-group="{{tab.group}}"
|
||||
>
|
||||
<div class="main-div">
|
||||
<fieldset class="crew">
|
||||
<legend>{{localize "FTLNOMAD.Label.crew"}}
|
||||
({{crewMembers.length}}{{#if
|
||||
system.crewCapacity
|
||||
}}/{{system.crewCapacity}}{{/if}})</legend>
|
||||
<div class="crew-list">
|
||||
{{#each crewMembers as |member|}}
|
||||
<div
|
||||
class="crew-member"
|
||||
data-actor-uuid="{{member.uuid}}"
|
||||
data-drag="true"
|
||||
>
|
||||
<img
|
||||
class="crew-img"
|
||||
src="{{member.img}}"
|
||||
data-tooltip="{{member.name}}"
|
||||
data-action="viewCrew"
|
||||
/>
|
||||
<div class="crew-name" data-action="viewCrew">{{member.name}}</div>
|
||||
<div class="controls">
|
||||
<a
|
||||
class="pilot-button"
|
||||
data-tooltip="{{localize 'FTLNOMAD.PilotStarship'}}"
|
||||
data-action="pilotCrew"
|
||||
><i class="fas fa-dice-d6"></i></a>
|
||||
<a
|
||||
data-tooltip="{{localize 'FTLNOMAD.RemoveCrew'}}"
|
||||
data-action="removeCrew"
|
||||
data-crew-uuid="{{member.uuid}}"
|
||||
><i class="fas fa-times"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="crew-empty">{{localize "FTLNOMAD.Label.noCrew"}}</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.equipment"}}{{#if isEditMode}}
|
||||
<a
|
||||
class="action"
|
||||
data-tooltip="{{localize ' FTLNOMAD.Tooltip.addEquipment'}}"
|
||||
data-tooltip-direction="UP"
|
||||
><i class="fas fa-plus" data-action="createEquipment"></i></a>{{/if}}
|
||||
</legend>
|
||||
<div class="equipments">
|
||||
{{#each equipments as |item|}}
|
||||
{{!log 'armor' this}}
|
||||
<div
|
||||
class="equipment"
|
||||
data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"
|
||||
>
|
||||
<img
|
||||
class="item-img"
|
||||
src="{{item.img}}"
|
||||
data-tooltip="{{item.name}}"
|
||||
/>
|
||||
<div class="name" data-tooltip="{{{item.system.description}}}">
|
||||
{{item.name}}
|
||||
</div>
|
||||
<div class="controls">
|
||||
<a
|
||||
data-tooltip="{{localize 'FTLNOMAD.Edit'}}"
|
||||
data-action="edit"
|
||||
data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"
|
||||
><i class="fas fa-edit"></i></a>
|
||||
<a
|
||||
data-tooltip="{{localize 'FTLNOMAD.Delete'}}"
|
||||
data-action="delete"
|
||||
data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"
|
||||
><i class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</section>
|
||||
@@ -1,45 +1,102 @@
|
||||
<section class="starship-main starship-main-{{ifThen isPlayMode 'play' 'edit'}}">
|
||||
<section
|
||||
class="starship-main starship-main-{{ifThen isPlayMode 'play' 'edit'}}"
|
||||
>
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.starship"}}</legend>
|
||||
<div class="starship-pc starship-pc-{{ifThen isPlayMode 'play' 'edit'}}">
|
||||
<div class="starship-left">
|
||||
<div class="starship-left-image">
|
||||
<img class="starship-img" src="{{actor.img}}" data-edit="img" data-action="editImage"
|
||||
data-tooltip="{{actor.name}}" />
|
||||
<img
|
||||
class="starship-img"
|
||||
src="{{actor.img}}"
|
||||
data-edit="img"
|
||||
data-action="editImage"
|
||||
data-tooltip="{{actor.name}}"
|
||||
/>
|
||||
</div>
|
||||
<fieldset class="spec">
|
||||
{{formField systemFields.agility value=system.agility localize=true}}
|
||||
{{formField systemFields.armor value=system.armor localize=true}}
|
||||
{{formField systemFields.endurance value=system.endurance localize=true}}
|
||||
{{formField
|
||||
systemFields.agility
|
||||
value=system.agility
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.armorRegular
|
||||
value=system.armorRegular
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.armorCritical
|
||||
value=system.armorCritical
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.endurance
|
||||
value=system.endurance
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="starship-right">
|
||||
<div class="starship-name">
|
||||
{{formInput fields.name value=source.name rootId=partId disabled=isPlayMode}}
|
||||
<a class="control" data-action="toggleSheet" data-tooltip="FTLNOMAD.ToggleSheet"
|
||||
data-tooltip-direction="UP">
|
||||
{{formInput
|
||||
fields.name
|
||||
value=source.name
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
<a
|
||||
class="control"
|
||||
data-action="toggleSheet"
|
||||
data-tooltip="FTLNOMAD.ToggleSheet"
|
||||
data-tooltip-direction="UP"
|
||||
>
|
||||
<i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<fieldset class="capacity ">
|
||||
<fieldset class="capacity">
|
||||
<legend>{{localize "FTLNOMAD.Label.capacity"}}</legend>
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.hullType value=system.hullType localize=true}}
|
||||
{{formField systemFields.cost value=system.cost- localize=true}}
|
||||
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.travelMultiplier value=system.travelMultiplier localize=true}}
|
||||
{{formField systemFields.monthlyCost value=system.monthlyCost localize=true}}
|
||||
<div class="flexrow hull-field">
|
||||
{{formField
|
||||
systemFields.hullType
|
||||
value=system.hullType
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
|
||||
<div class="flexrow-guns rollable" data-roll-type="starship-guns">
|
||||
<i class="fa-regular fa-dice dice-2d6"></i>
|
||||
{{formField systemFields.guns value=system.guns localize=true}}
|
||||
<div class="flexrow-guns">
|
||||
<a
|
||||
class="rollable starship-guns-label"
|
||||
data-roll-type="starship-guns"
|
||||
>
|
||||
<i class="fa-regular fa-dice dice-2d6"></i>Guns
|
||||
</a>
|
||||
{{formInput
|
||||
systemFields.guns
|
||||
value=system.guns
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.travelMultiplier
|
||||
value=system.travelMultiplier
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
@@ -47,8 +104,33 @@
|
||||
<fieldset class="cargo">
|
||||
<legend>{{localize "FTLNOMAD.Label.cargo"}}</legend>
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.crew value=system.crew localize=true}}
|
||||
{{formField systemFields.cargo value=system.cargo localize=true}}
|
||||
{{formField
|
||||
systemFields.crewCapacity
|
||||
value=system.crewCapacity
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
<div class="npc-crew-field">
|
||||
<a
|
||||
class="npc-crew-roll rollable"
|
||||
data-action="rollNpcCrew"
|
||||
data-tooltip="{{localize 'FTLNOMAD.RollNpcCrew'}}"
|
||||
><i class="fas fa-dice-d6"></i></a>
|
||||
{{formField
|
||||
systemFields.npcCrew
|
||||
value=system.npcCrew
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
{{formField
|
||||
systemFields.cargo
|
||||
value=system.cargo
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
|
||||
@@ -1,21 +1,67 @@
|
||||
<section class="tab vehicle-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
|
||||
|
||||
<section
|
||||
class="tab vehicle-{{tab.id}} {{tab.cssClass}}"
|
||||
data-tab="{{tab.id}}"
|
||||
data-group="{{tab.group}}"
|
||||
>
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.damages"}}</legend>
|
||||
<div class="text-center">
|
||||
<textarea class="form-control " cols="64" rows="5" name="system.damages"
|
||||
data-tooltip="{{localize "FTLNOMAD.Tooltip.damages"}}">{{system.damages}}</textarea>
|
||||
<legend>{{localize "FTLNOMAD.Label.techAge"}}</legend>
|
||||
<div class="flexrow">
|
||||
{{formField
|
||||
systemFields.techAge
|
||||
value=system.techAge
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.cost
|
||||
value=system.cost
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.monthlyCost
|
||||
value=system.monthlyCost
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.description"}}</legend>
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||
<legend>{{localize "FTLNOMAD.Label.damages"}}</legend>
|
||||
<div class="text-center">
|
||||
<textarea
|
||||
class="form-control"
|
||||
cols="64"
|
||||
rows="5"
|
||||
name="system.damages"
|
||||
data-tooltip="{{localize 'FTLNOMAD.Tooltip.damages'}}"
|
||||
>{{system.damages}}</textarea>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<fieldset class="section-editor">
|
||||
<legend>{{localize "FTLNOMAD.Label.description"}}</legend>
|
||||
{{formInput
|
||||
systemFields.description
|
||||
enriched=enrichedDescription
|
||||
value=system.description
|
||||
name="system.description"
|
||||
toggled=true
|
||||
}}
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="section-editor">
|
||||
<legend>{{localize "FTLNOMAD.Label.notes"}}</legend>
|
||||
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}}
|
||||
{{formInput
|
||||
systemFields.notes
|
||||
enriched=enrichedNotes
|
||||
value=system.notes
|
||||
name="system.notes"
|
||||
toggled=true
|
||||
}}
|
||||
</fieldset>
|
||||
|
||||
</section>
|
||||
@@ -1,54 +1,146 @@
|
||||
<section class="tab vehicle-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
|
||||
<div class="main-div">
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.weapons"}}{{#if isEditMode}}
|
||||
<a class="action" data-tooltip="{{localize "FTLNOMAD.Tooltip.addWeapon"}}" data-tooltip-direction="UP"><i
|
||||
class="fas fa-plus" data-action="createWeapon"></i></a>{{/if}}
|
||||
</legend>
|
||||
<div class="weapons">
|
||||
{{#each weapons as |item|}}
|
||||
{{!log 'weapon' this}}
|
||||
<div class="weapon item" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
|
||||
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
|
||||
<div class="name rollable" data-roll-type="weapon" data-tooltip="{{{item.system.description}}}">
|
||||
{{item.name}}
|
||||
</div>
|
||||
<a class="damage rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage"
|
||||
data-roll-value="{{item.system.damage}}">{{localize "FTLNOMAD.Label.damageShort"}} :
|
||||
{{item.system.damage}}</a>
|
||||
<div class="controls">
|
||||
<a data-tooltip="{{localize 'FTLNOMAD.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
|
||||
<a data-tooltip="{{localize 'FTLNOMAD.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</fieldset>
|
||||
<section
|
||||
class="tab vehicle-{{tab.id}} {{tab.cssClass}}"
|
||||
data-tab="{{tab.id}}"
|
||||
data-group="{{tab.group}}"
|
||||
>
|
||||
<div class="main-div">
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.equipment"}}{{#if isEditMode}}
|
||||
<a class="action" data-tooltip="{{localize "FTLNOMAD.Tooltip.addEquipment"}}" data-tooltip-direction="UP"><i
|
||||
class="fas fa-plus" data-action="createEquipment"></i></a>{{/if}}
|
||||
</legend>
|
||||
<div class="equipments">
|
||||
{{#each equipments as |item|}}
|
||||
{{!log 'armor' this}}
|
||||
<div class="equipment" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}">
|
||||
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
|
||||
<div class="name" data-tooltip="{{{item.system.description}}}">
|
||||
{{item.name}}
|
||||
</div>
|
||||
<div class="controls">
|
||||
<a data-tooltip="{{localize 'FTLNOMAD.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
|
||||
<a data-tooltip="{{localize 'FTLNOMAD.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
<fieldset class="crew">
|
||||
<legend>{{localize "FTLNOMAD.Label.crew"}}
|
||||
({{crewMembers.length}}{{#if
|
||||
system.crewCapacity
|
||||
}}/{{system.crewCapacity}}{{/if}})</legend>
|
||||
<div class="crew-list">
|
||||
{{#each crewMembers as |member|}}
|
||||
<div
|
||||
class="crew-member"
|
||||
data-actor-uuid="{{member.uuid}}"
|
||||
data-drag="true"
|
||||
>
|
||||
<img
|
||||
class="crew-img"
|
||||
src="{{member.img}}"
|
||||
data-tooltip="{{member.name}}"
|
||||
data-action="viewCrew"
|
||||
/>
|
||||
<div class="crew-name" data-action="viewCrew">{{member.name}}</div>
|
||||
<div class="controls">
|
||||
<a
|
||||
class="pilot-button"
|
||||
data-tooltip="{{localize 'FTLNOMAD.PilotVehicle'}}"
|
||||
data-action="pilotCrew"
|
||||
><i class="fas fa-dice-d6"></i></a>
|
||||
<a
|
||||
data-tooltip="{{localize 'FTLNOMAD.RemoveCrew'}}"
|
||||
data-action="removeCrew"
|
||||
data-crew-uuid="{{member.uuid}}"
|
||||
><i class="fas fa-times"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="crew-empty">{{localize "FTLNOMAD.Label.noCrew"}}</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.weapons"}}{{#if isEditMode}}
|
||||
<a
|
||||
class="action"
|
||||
data-tooltip="{{localize 'FTLNOMAD.Tooltip.addWeapon'}}"
|
||||
data-tooltip-direction="UP"
|
||||
><i class="fas fa-plus" data-action="createWeapon"></i></a>{{/if}}
|
||||
</legend>
|
||||
<div class="weapons">
|
||||
{{#each weapons as |item|}}
|
||||
{{!log 'weapon' this}}
|
||||
<div
|
||||
class="weapon item"
|
||||
data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"
|
||||
data-drag="true"
|
||||
>
|
||||
<img
|
||||
class="item-img"
|
||||
src="{{item.img}}"
|
||||
data-tooltip="{{item.name}}"
|
||||
/>
|
||||
<div
|
||||
class="name"
|
||||
data-roll-type="weapon"
|
||||
data-tooltip="{{{item.system.description}}}"
|
||||
>
|
||||
{{item.name}}
|
||||
</div>
|
||||
<a
|
||||
class="damage rollable"
|
||||
data-item-id="{{item.id}}"
|
||||
data-action="roll"
|
||||
data-roll-type="damage"
|
||||
data-roll-value="{{item.system.damage}}"
|
||||
>{{localize "FTLNOMAD.Label.damageShort"}}
|
||||
:
|
||||
{{item.system.damage}}</a>
|
||||
<div class="controls">
|
||||
<a
|
||||
data-tooltip="{{localize 'FTLNOMAD.Edit'}}"
|
||||
data-action="edit"
|
||||
data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"
|
||||
><i class="fas fa-edit"></i></a>
|
||||
<a
|
||||
data-tooltip="{{localize 'FTLNOMAD.Delete'}}"
|
||||
data-action="delete"
|
||||
data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"
|
||||
><i class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.equipment"}}{{#if isEditMode}}
|
||||
<a
|
||||
class="action"
|
||||
data-tooltip="{{localize 'FTLNOMAD.Tooltip.addEquipment'}}"
|
||||
data-tooltip-direction="UP"
|
||||
><i class="fas fa-plus" data-action="createEquipment"></i></a>{{/if}}
|
||||
</legend>
|
||||
<div class="equipments">
|
||||
{{#each equipments as |item|}}
|
||||
{{!log 'armor' this}}
|
||||
<div
|
||||
class="equipment"
|
||||
data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"
|
||||
>
|
||||
<img
|
||||
class="item-img"
|
||||
src="{{item.img}}"
|
||||
data-tooltip="{{item.name}}"
|
||||
/>
|
||||
<div class="name" data-tooltip="{{{item.system.description}}}">
|
||||
{{item.name}}
|
||||
</div>
|
||||
<div class="controls">
|
||||
<a
|
||||
data-tooltip="{{localize 'FTLNOMAD.Edit'}}"
|
||||
data-action="edit"
|
||||
data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"
|
||||
><i class="fas fa-edit"></i></a>
|
||||
<a
|
||||
data-tooltip="{{localize 'FTLNOMAD.Delete'}}"
|
||||
data-action="delete"
|
||||
data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"
|
||||
><i class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</section>
|
||||
@@ -5,48 +5,121 @@
|
||||
<div class="vehicle-pc vehicle-pc-{{ifThen isPlayMode 'play' 'edit'}}">
|
||||
<div class="vehicle-left">
|
||||
<div class="vehicle-left-image">
|
||||
<img class="vehicle-img" src="{{actor.img}}" data-edit="img" data-action="editImage"
|
||||
data-tooltip="{{actor.name}}" />
|
||||
<img
|
||||
class="vehicle-img"
|
||||
src="{{actor.img}}"
|
||||
data-edit="img"
|
||||
data-action="editImage"
|
||||
data-tooltip="{{actor.name}}"
|
||||
/>
|
||||
</div>
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.Agility"}}</legend>
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.agility value=system.agility localize=true}}
|
||||
</div>
|
||||
<fieldset class="spec">
|
||||
{{formField
|
||||
systemFields.agility
|
||||
value=system.agility
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
{{formField
|
||||
systemFields.armorRegular
|
||||
value=system.armorRegular
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
{{formField
|
||||
systemFields.armorCritical
|
||||
value=system.armorCritical
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="vehicle-right">
|
||||
<div class="vehicle-name">
|
||||
{{formInput fields.name value=source.name rootId=partId disabled=isPlayMode}}
|
||||
<a class="control" data-action="toggleSheet" data-tooltip="FTLNOMAD.ToggleSheet"
|
||||
data-tooltip-direction="UP">
|
||||
{{formInput
|
||||
fields.name
|
||||
value=source.name
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
<a
|
||||
class="control"
|
||||
data-action="toggleSheet"
|
||||
data-tooltip="FTLNOMAD.ToggleSheet"
|
||||
data-tooltip-direction="UP"
|
||||
>
|
||||
<i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<fieldset class="capacity ">
|
||||
<fieldset class="capacity">
|
||||
<legend>{{localize "FTLNOMAD.Label.capacity"}}</legend>
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.armor value=system.armor localize=true}}
|
||||
{{formField systemFields.force value=system.force localize=true}}
|
||||
{{formField
|
||||
systemFields.force
|
||||
value=system.force
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.range value=system.range localize=true}}
|
||||
{{formField systemFields.speed value=system.speed localize=true}}
|
||||
{{formField
|
||||
systemFields.range
|
||||
value=system.range
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
{{formField
|
||||
systemFields.speed
|
||||
value=system.speed
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="cargo">
|
||||
<legend>{{localize "FTLNOMAD.Label.cargo"}}</legend>
|
||||
<div class="cargo-content">
|
||||
{{formField systemFields.crew value=system.crew localize=true}}
|
||||
{{formField systemFields.cargo value=system.cargo localize=true}}
|
||||
{{formField systemFields.tonnage value=system.tonnage localize=true}}
|
||||
<div class="cargo-line">
|
||||
{{formField
|
||||
systemFields.crewCapacity
|
||||
value=system.crewCapacity
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
<div class="npc-crew-field">
|
||||
<a
|
||||
class="npc-crew-roll rollable"
|
||||
data-action="rollNpcCrew"
|
||||
data-tooltip="{{localize 'FTLNOMAD.RollNpcCrew'}}"
|
||||
><i class="fas fa-dice-d6"></i></a>
|
||||
{{formField
|
||||
systemFields.npcCrew
|
||||
value=system.npcCrew
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="cargo-line">
|
||||
{{formField
|
||||
systemFields.cargo
|
||||
value=system.cargo
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
{{formField
|
||||
systemFields.tonnage
|
||||
value=system.tonnage
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
@@ -13,7 +13,12 @@
|
||||
{{formField systemFields.damage value=system.damage}}
|
||||
{{formField systemFields.enc value=system.enc}}
|
||||
|
||||
{{formField systemFields.cost value=system.cost}}
|
||||
{{formField cost value=system.cost}}
|
||||
{{#if (eq system.weaponType "vehicle")}}
|
||||
{{formField systemFields.ammoCost value=system.ammoCost}}
|
||||
{{formField systemFields.magazine value=system.magazine}}
|
||||
{{/if}}
|
||||
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
|
||||
Reference in New Issue
Block a user