13 Commits
13.0.3 ... main

Author SHA1 Message Date
8a5d1cc1d8 Sync robot enc
All checks were successful
Release Creation / build (release) Successful in 1m8s
2025-10-18 18:03:30 +02:00
99d9cb435f Fix robot stuff
All checks were successful
Release Creation / build (release) Successful in 57s
2025-10-16 20:00:03 +02:00
f57b016b46 Cosmetic fixes
All checks were successful
Release Creation / build (release) Successful in 51s
2025-10-15 22:19:35 +02:00
09907dbbf7 Cosmetic fixes 2025-10-15 22:19:20 +02:00
e65f0a1670 New robot stuff
All checks were successful
Release Creation / build (release) Successful in 1m15s
2025-10-15 15:27:58 +02:00
941db9436f Range distance fix + compendiums 2025-10-14 15:49:08 +02:00
0874507025 Fixes for damages + vehicle/ship ehancements
All checks were successful
Release Creation / build (release) Successful in 1m21s
2025-10-13 23:21:13 +02:00
2578ea4dc1 Fix bio + initiative
All checks were successful
Release Creation / build (release) Successful in 1m2s
2025-10-05 18:09:02 +02:00
d80e3e4658 Fix roll options
All checks were successful
Release Creation / build (release) Successful in 1m8s
2025-08-26 22:14:45 +02:00
188501423a Add new roll options
All checks were successful
Release Creation / build (release) Successful in 1m24s
2025-08-25 22:41:42 +02:00
668da28d2c Fix various issues with rolls and compendiums
All checks were successful
Release Creation / build (release) Successful in 57s
2025-08-24 16:19:35 +02:00
8a5b402388 Fix v13 issue
All checks were successful
Release Creation / build (release) Successful in 2m15s
2025-08-20 18:43:53 +02:00
ebb3bd9fb3 Fix enc for equipments/weapons 2025-07-13 21:02:49 +02:00
63 changed files with 2976 additions and 450 deletions

View File

@@ -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}}"

View File

@@ -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

View 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

View 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 tanks 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 Ages 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."
}
]

View File

@@ -118,6 +118,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 +343,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;
}
@@ -413,10 +431,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;
@@ -1104,6 +1122,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);
@@ -1202,6 +1229,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;
gap: 5px;
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);
@@ -1324,6 +1719,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 +1734,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;
}
@@ -1408,6 +1812,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);
@@ -1744,6 +2157,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);

View File

@@ -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 })

View File

@@ -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",
@@ -362,11 +450,17 @@
"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",
@@ -505,6 +599,9 @@
"Carrier": "Carrier"
},
"FIELDS": {
"techAge": {
"label": "Tech Age"
},
"monthlyCost": {
"label": "Monthly Cost"
},
@@ -583,7 +680,7 @@
"addPsionic" : "Add Psionic",
"addCreatureAbility" : "Add Creature Ability",
"addCreatureTrait" : "Add Creature Trait",
"damages": "Enter current damages suffered"
"damages": "Enter current damage suffered"
},
"Vehicle": {
"FIELDS": {
@@ -619,6 +716,9 @@
},
"notes": {
"label": "Notes"
},
"techAge": {
"label": "Tech Age"
}
}
},
@@ -648,6 +748,12 @@
},
"weaponType": {
"label": "Type"
},
"ammoCost": {
"label": "Ammo Cost"
},
"magazine": {
"label": "Mag"
}
},
"Range": {
@@ -674,7 +780,8 @@
"character": "Character",
"creature": "Creature",
"starship": "Starship",
"vehicle": "Vehicle"
"vehicle": "Vehicle",
"robot": "Robot"
},
"Item": {
"armor": "Armor",

View File

@@ -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"

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

View File

@@ -12,6 +12,8 @@ export default class FTLNomadStarshipSheet extends FTLNomadActorSheet {
contentClasses: ["starship-content"],
},
actions: {
createEquipment: FTLNomadStarshipSheet.#onCreateEquipment,
createWeapon: FTLNomadStarshipSheet.#onCreateWeapon,
},
}
@@ -23,14 +25,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 +44,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)) {
@@ -69,6 +75,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 +91,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)
}

View File

@@ -33,8 +33,8 @@ export default class FTLNomadVehicleSheet extends FTLNomadActorSheet {
},
}
/** @override */
tabGroups = {
/** @override */
tabGroups = {
sheet: "equipment",
}

View File

@@ -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,17 @@ 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 STARSHIP_HULL = {
@@ -150,5 +173,7 @@ export const SYSTEM = {
CREATURE_NICHES,
STARSHIP_HULL,
SKILLS,
ROBOT_SIZES,
DAMAGE_MODIFIER_CHOICES,
ASCII
}

View File

@@ -62,9 +62,14 @@ 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`
}
// Replace all the "+ -" with "-"
fullFormula = fullFormula.replace(/\+\s*-/g, "- ")
fullFormula = fullFormula.replace(/\+\s*\-/g, "- ")
$('#roll-dialog-full-formula').text(fullFormula)
options.fullFormula = fullFormula
}
@@ -85,20 +90,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 +107,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,
@@ -116,21 +118,21 @@ export default class FTLNomadRoll extends Roll {
const choiceModifier = SYSTEM.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"
options.skillModifier = 0
options.numericModifier = 0
options.rangeModifier = rangeModifier
options.damageModifier = damageModifier
let fullFormula = `${formula} + ${options.rollItem.value}`
if (options.isEncumbered) {
fullFormula += ` - 1D`
@@ -151,7 +153,9 @@ export default class FTLNomadRoll extends Roll {
fieldRollMode,
choiceModifier,
choiceRangeModifier,
choiceDamageModifier,
rangeModifier,
damageModifier,
formula,
hasTarget: options.hasTarget,
modifier,
@@ -185,6 +189,10 @@ export default class FTLNomadRoll extends Roll {
options.skillModifier = 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,7 +200,7 @@ 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
@@ -212,13 +220,44 @@ 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}`
options.numericModifier = Number(rollData.numericModifier) || 0
options.skillModifier = Number(rollData.skillModifier) || 0
options.rangeModifier = Number(rollData.rangeModifier) || 0
options.finalModifier = options.numericModifier + options.skillModifier + options.rangeModifier
let mod = options.rollItem?.value || 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 += `kl2 + ${options.rollItem.value}`
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 +293,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":

View File

@@ -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"

View File

@@ -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,18 @@ export default class FTLNomadProtagonist extends foundry.abstract.TypeDataModel
prepareDerivedData() {
super.prepareDerivedData();
let encMax = 10 + (2*this.skills.physical.value)
let encMax = 10 + (2 * this.skills.physical.value)
if (encMax !== this.enc.max) {
this.enc.max = encMax
}
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 +97,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
}

96
module/models/robot.mjs Normal file
View File

@@ -0,0 +1,96 @@
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.durability + (2 * this.skills.physical.value)
if (encMax !== this.enc.max) {
this.enc.max = encMax
}
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 })
}
}

View File

@@ -15,9 +15,10 @@ export default class FTLNomadStarship extends foundry.abstract.TypeDataModel {
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 +34,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 })
}
}

View File

@@ -14,11 +14,11 @@ export default class FTLNomadVehicle extends foundry.abstract.TypeDataModel {
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 +33,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 })
}
}

View File

@@ -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 })

View File

@@ -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.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000035
MANIFEST-000099

View File

@@ -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/10/18-17:56:08.077097 7f7b75bfa6c0 Recovering log #97
2025/10/18-17:56:08.086491 7f7b75bfa6c0 Delete type=3 #95
2025/10/18-17:56:08.086541 7f7b75bfa6c0 Delete type=0 #97
2025/10/18-18:03:15.510704 7f7b6f3ff6c0 Level-0 table #102: started
2025/10/18-18:03:15.510749 7f7b6f3ff6c0 Level-0 table #102: 0 bytes OK
2025/10/18-18:03:15.548325 7f7b6f3ff6c0 Delete type=0 #100
2025/10/18-18:03:15.624002 7f7b6f3ff6c0 Manual compaction at level-0 from '!folders!AuBtSOj1mJmh88qx' @ 72057594037927935 : 1 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at (end)

View File

@@ -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/10/16-19:48:48.571698 7f18a4ffa6c0 Recovering log #93
2025/10/16-19:48:48.582163 7f18a4ffa6c0 Delete type=3 #91
2025/10/16-19:48:48.582233 7f18a4ffa6c0 Delete type=0 #93
2025/10/16-19:50:49.674486 7f189e7fc6c0 Level-0 table #98: started
2025/10/16-19:50:49.674520 7f189e7fc6c0 Level-0 table #98: 0 bytes OK
2025/10/16-19:50:49.681475 7f189e7fc6c0 Delete type=0 #96
2025/10/16-19:50:49.691929 7f189e7fc6c0 Manual compaction at level-0 from '!folders!AuBtSOj1mJmh88qx' @ 72057594037927935 : 1 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

Binary file not shown.

Binary file not shown.

View File

View File

@@ -1 +1 @@
MANIFEST-000014
MANIFEST-000077

View File

@@ -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/10/18-17:56:08.089616 7f7b6ffff6c0 Recovering log #75
2025/10/18-17:56:08.099835 7f7b6ffff6c0 Delete type=3 #73
2025/10/18-17:56:08.099933 7f7b6ffff6c0 Delete type=0 #75
2025/10/18-18:03:15.586602 7f7b6f3ff6c0 Level-0 table #80: started
2025/10/18-18:03:15.586654 7f7b6f3ff6c0 Level-0 table #80: 0 bytes OK
2025/10/18-18:03:15.623769 7f7b6f3ff6c0 Delete type=0 #78
2025/10/18-18:03:15.624032 7f7b6f3ff6c0 Manual compaction at level-0 from '!actors!0FQ6XaRi24OorI21' @ 72057594037927935 : 1 .. '!folders!vRnrOJqSMlxbSgyX' @ 0 : 0; will stop at (end)

View File

@@ -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/10/16-19:48:48.588685 7f189f7fe6c0 Recovering log #71
2025/10/16-19:48:48.599841 7f189f7fe6c0 Delete type=3 #69
2025/10/16-19:48:48.599924 7f189f7fe6c0 Delete type=0 #71
2025/10/16-19:50:49.586198 7f189e7fc6c0 Level-0 table #76: started
2025/10/16-19:50:49.586239 7f189e7fc6c0 Level-0 table #76: 0 bytes OK
2025/10/16-19:50:49.598518 7f189e7fc6c0 Delete type=0 #74
2025/10/16-19:50:49.610365 7f189e7fc6c0 Manual compaction at level-0 from '!actors!0FQ6XaRi24OorI21' @ 72057594037927935 : 1 .. '!folders!vRnrOJqSMlxbSgyX' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

View File

View 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 {
@@ -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;

View File

@@ -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);

View File

@@ -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";

View File

@@ -61,7 +61,6 @@
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
}
}
.vehicle-sheet-common {
@@ -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
View 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;
gap: 5px;
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;
}
}

View File

@@ -42,7 +42,6 @@
max-width: 4rem;
}
}
}
.starship-right {
@@ -69,6 +68,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 +84,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 +109,8 @@
select {
max-width: 5rem;
}
}
.starship-infos {
display: flex;
flex-direction: column;
@@ -169,23 +177,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 {

View File

@@ -33,7 +33,6 @@
border: none;
}
}
}
.vehicle-right {
@@ -137,23 +136,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 {

View File

@@ -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"] },

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

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

View File

@@ -0,0 +1,107 @@
<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}}"
/>
<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>

258
templates/robot-main.hbs Normal file
View 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
}}
&nbsp;
{{formField
systemFields.protection
value=system.protection
localize=true
disabled=isPlayMode
}}
</div>
<div class="flexrow">
{{formField
systemFields.speed
value=system.speed
localize=true
disabled=isPlayMode
}}
&nbsp;
{{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}}
&nbsp;
{{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>

View File

@@ -3,42 +3,106 @@
<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}}
<div class="dialog-skill">{{localize rollItem.label}}
: 2d6+{{rollItem.value}}</div>
{{/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</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>
{{/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 +110,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>

View File

@@ -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
}}
&nbsp;
{{formField
systemFields.cost
value=system.cost
localize=true
disabled=isPlayMode
}}
&nbsp;
{{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>

View File

@@ -0,0 +1,108 @@
<section
class="tab vehicle-{{tab.id}} {{tab.cssClass}}"
data-tab="{{tab.id}}"
data-group="{{tab.group}}"
>
<div class="main-div">
<!-- <div class="weapons">
<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>
{{#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> -->
<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>

View File

@@ -1,45 +1,93 @@
<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.armor
value=system.armor
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 +95,18 @@
<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.crew
value=system.crew
localize=true
disabled=isPlayMode
}}
{{formField
systemFields.cargo
value=system.cargo
localize=true
disabled=isPlayMode
}}
</div>
</fieldset>

View File

@@ -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
}}
&nbsp;
{{formField
systemFields.cost
value=system.cost
localize=true
disabled=isPlayMode
}}
&nbsp;
{{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>

View File

@@ -1,54 +1,107 @@
<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>
<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"
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>
{{/each}}
</div>
</fieldset>
</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>
<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>
{{/each}}
</div>
</fieldset>
</div>
</fieldset>
</div>
</section>

View File

@@ -5,13 +5,23 @@
<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}}
{{formField
systemFields.agility
value=system.agility
localize=true
disabled=isPlayMode
}}
</div>
</fieldset>
@@ -19,31 +29,75 @@
<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.armor
value=system.armor
localize=true
disabled=isPlayMode
}}
{{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}}
{{formField
systemFields.crew
value=system.crew
localize=true
disabled=isPlayMode
}}
{{formField
systemFields.cargo
value=system.cargo
localize=true
disabled=isPlayMode
}}
{{formField
systemFields.tonnage
value=system.tonnage
localize=true
disabled=isPlayMode
}}
</div>
</fieldset>

View File

@@ -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>