Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8a5d1cc1d8 | |||
| 99d9cb435f | |||
| f57b016b46 | |||
| 09907dbbf7 | |||
| e65f0a1670 | |||
| 941db9436f | |||
| 0874507025 | |||
| 2578ea4dc1 | |||
| d80e3e4658 | |||
| 188501423a | |||
| 668da28d2c | |||
| 8a5b402388 | |||
| ebb3bd9fb3 | |||
| d2cbe71731 | |||
| 8197e3c369 | |||
| 4b38dc0a1d | |||
| 0ce629ea49 | |||
| a77d19fb04 |
@@ -1,6 +1,6 @@
|
||||
name: Release Creation
|
||||
|
||||
on:
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
@@ -8,45 +8,45 @@ jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo "💡 The ${{ gitea.repository }} repository will cloned to the runner."
|
||||
|
||||
#- uses: actions/checkout@v3
|
||||
- uses: RouxAntoine/checkout@v3.5.4
|
||||
- run: echo "💡 The ${{ gitea.repository }} repository will cloned to the runner."
|
||||
|
||||
# get part of the tag after the `v`
|
||||
- name: Extract tag version number
|
||||
id: get_version
|
||||
uses: battila7/get-version-action@v2
|
||||
#- uses: actions/checkout@v3
|
||||
- uses: RouxAntoine/checkout@v3.5.4
|
||||
|
||||
# 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
|
||||
|
||||
# Create a zip file with all files required by the module to add to the release
|
||||
- run: |
|
||||
apt update -y
|
||||
apt install -y zip
|
||||
# get part of the tag after the `v`
|
||||
- name: Extract tag version number
|
||||
id: get_version
|
||||
uses: battila7/get-version-action@v2
|
||||
|
||||
- run: zip -r ./fvtt-ftl-nomad-${{github.event.release.tag_name}}.zip system.json README.md LICENSE assets/ css/ lang/ module/ 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: 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}}'
|
||||
# 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
|
||||
|
||||
- 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: Use Go Action
|
||||
id: use-go-action
|
||||
uses: https://gitea.com/actions/release-action@main
|
||||
with:
|
||||
files: |-
|
||||
./fvtt-ftl-nomad-${{github.event.release.tag_name}}.zip
|
||||
system.json
|
||||
api_key: "${{secrets.ALLOW_PUSH_RELEASE}}"
|
||||
|
||||
15
README.md
15
README.md
@@ -1,3 +1,14 @@
|
||||
# fvtt-ftl-nomad
|
||||
Faster Than Light: Nomad (FTL: Nomad) for Foundry Virtual TableTop
|
||||
|
||||
Faster Than Light : Nomad system for FoundryVTT
|
||||
The official game system for playing Faster Than Light: Nomad on FoundryVTT. This framework covers all the fundemental aspects of Faster Than Light: Nomad and permits full FTL:N online gameplay.
|
||||
|
||||
This product's format, computer code, graphics, and presentation are copyrighted by Stellagama Publishing.
|
||||
|
||||
This system is used with permission granted as part of the partnership agreement between Foundry Gaming LLC and Stellagama Publishing. It uses the following copyright:
|
||||
|
||||
Faster Than Light: Nomad, © 2025 Stellagama Publishing. All rights reserved.
|
||||
|
||||
Stellagama Publishing's web page is available at https://stellagamapublishing.co/ and the company's owner, Omer Golan-Joel, may be contacted at golan2072@gmail.com.
|
||||
|
||||
Community
|
||||
You are invited to join Stellagama Publishing's Discord server: https://discord.gg/MHpMDBpcZ6
|
||||
|
||||
1
assets/icons/icon_robot.svg
Normal file
1
assets/icons/icon_robot.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><filter id="shadow-1" height="300%" width="300%" x="-100%" y="-100%"><feFlood flood-color="rgba(255, 255, 255, 1)" result="flood"></feFlood><feComposite in="flood" in2="SourceGraphic" operator="atop" result="composite"></feComposite><feGaussianBlur in="composite" stdDeviation="15" result="blur"></feGaussianBlur><feOffset dx="0" dy="0" result="offset"></feOffset><feComposite in="SourceGraphic" in2="offset" operator="over"></feComposite></filter></defs><g class="" style="" transform="translate(0,0)"><path d="M265.344 18.563v302.863h-18.69V18.59c-61.403 3.005-115.44 34.412-149.238 81.336l35.022 60.658a46.633 46.633 0 0 1 12.11-1.598c25.747 0 46.62 20.872 46.62 46.62 0 22.556-16.02 41.37-37.3 45.687v174.084c13.712 21.43 27.6 41.98 40.712 60.754V369.01h122.838v117.117c13.11-18.773 27-39.324 40.713-60.754V251.294c-21.282-4.317-37.302-23.13-37.302-45.688 0-25.747 20.873-46.62 46.62-46.62 4.19 0 8.25.562 12.113 1.6l35.13-60.847c-33.74-47-87.758-78.375-149.346-81.175zM426.03 117.47l-29.74 51.52c10.824 8.537 17.782 21.76 17.782 36.615 0 22.54-15.995 41.343-37.254 45.68V395.38c9.833-16.237 19.31-32.676 28.014-48.927 27.3-50.976 46.564-100.37 46.564-132.36 0-35.127-9.22-68.104-25.365-96.622zm-339.973.157c-16.196 28.486-25.46 61.408-25.46 96.465 0 31.992 19.267 81.385 46.567 132.36 8.704 16.253 18.182 32.694 28.016 48.933v-144.1c-21.26-4.336-37.254-23.14-37.254-45.68 0-14.856 6.957-28.08 17.783-36.617l-29.653-51.36zm127.213 270.07V488.98h85.46V387.696h-85.46z" fill="#7ed321" fill-opacity="1" filter="url(#shadow-1)" stroke="#ffffff" stroke-opacity="1" stroke-width="8"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
1
assets/icons/icon_starship.svg
Normal file
1
assets/icons/icon_starship.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><filter id="shadow-1" height="300%" width="300%" x="-100%" y="-100%"><feFlood flood-color="rgba(11, 1, 1, 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 34 47.898 35.924 61.563 123.123-8.057 32.23-24.943-4.158 3.16-10.533 2.842-9.473L256 182.823l-91.463 18.29 6.002 20.006-24.943 4.156-8.057-32.228L199.1 69.926 247 34v56h-39l-16 32 64 38 64-38-16-32h-39zm188.313 169.258 30.3 10.101-13.478 29.205-30.016-5.001zm-394.626 0 13.194 34.304-30.016 5.002-13.478-29.205zM256 205.32l53.8 58.692L281.306 359h-50.61L202.2 264.012zm25.254.909 43.283 8.658-8.715 29.052zm-50.508.002-34.568 37.709-8.715-29.053zm105.5 32.267L482.5 262.873 429.799 368.28 329.98 259.385zm-160.492 0 6.266 20.887L82.2 368.279 29.5 262.873zm148.205 40.96 72.201 78.765-84.556-37.582zm-135.918 0 12.355 41.183-84.556 37.582zm118.348 58.564 28.646 12.732L312.973 439H265v-62h29.695zm-100.778 0L217.305 377H247v62h-47.973l-22.062-88.246zM387.6 374.115l18.105 8.047-9.984 21.635-16.387-8.193zm-263.2 0 8.266 21.489-16.387 8.193-9.984-21.635zM311 457v30h-30v-30zm-80 0v30h-30v-30z" fill="#7ed321" fill-opacity="1" filter="url(#shadow-1)" stroke="#ccc" stroke-opacity="1" stroke-width="8"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
1
assets/icons/icon_vehicle.svg
Normal file
1
assets/icons/icon_vehicle.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><filter id="shadow-1" height="300%" width="300%" x="-100%" y="-100%"><feFlood flood-color="rgba(11, 1, 1, 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="M304 25c-9.496 0-17.002 7.504-17.002 17S294.504 59.002 304 59.002c9.496 0 17.002-7.506 17.002-17.002 0-9.496-7.506-17-17.002-17zm-9 50.809V201h-95.377l-13.314 79.885L256 294.822l69.691-13.937L313 204.738V75.808A34.63 34.63 0 0 1 304 77a34.63 34.63 0 0 1-9-1.191zM228.2 137l-38.557 46H277v-46zM55 179.402v139.405l-14.621 13.209 22.738 23.492 164.969-5.906-3.014-29.946-15.199-15.705-35.639-7.127-8.543-1.709 4.266-25.597-42.064-16.569L73 302.543v-123.14zm128.07 11.438-23.379 27.892 17.844 5.323zM329.123 192l5.342 32.055 17.844-5.323c-5.456-6.278-8.806-10.732-23.186-26.732zm54.984 60.95-42.064 16.568 4.266 25.597-44.182 8.836-15.2 15.705-3.013 29.946 164.969 5.906 22.738-23.492zm-265.744 28.687 48 48-12.726 12.726-48-48zm275.274 0 12.726 12.726-48 48-12.726-12.726zm-240.453 88.119-20.323.396-24.914 49.83L96 416l-32 32 48 16 32-32-18.805-6.268zm205.906.547 27.715 55.43L368 432l32 32 48-16-32-32-11.947 3.982-24.473-48.945z" fill="#7ed321" fill-opacity="1" stroke="#ccc" stroke-opacity="1" stroke-width="8" filter="url(#shadow-1)"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
114
assets/json_data/armors.json
Normal file
114
assets/json_data/armors.json
Normal file
@@ -0,0 +1,114 @@
|
||||
[
|
||||
{
|
||||
"name": "Leather",
|
||||
"protection": 2,
|
||||
"cost": 50,
|
||||
"enc": 1,
|
||||
"techAge": "Early Primitive",
|
||||
"description": "Made from Boiled animal hide or other non-metallic material, this armor can be worn as regular clothing. When facing firearms or other weapons from the Early Mechanical Eras or later, this armor provides 1 point of Protection [1]."
|
||||
},
|
||||
{
|
||||
"name": "Chainmail",
|
||||
"protection": 4,
|
||||
"cost": 300,
|
||||
"enc": 2,
|
||||
"techAge": "Late Primitive",
|
||||
"description": "Manufactured from rings of iron or primitive steel woven together. Typically, chainmail covers the upper body and hangs to the knees. When facing firearms or other weapons from the Early Mechanical Age or later, this armor provides 2 points of Protection [2]."
|
||||
},
|
||||
{
|
||||
"name": "Plate Mail",
|
||||
"protection": 6,
|
||||
"cost": 1000,
|
||||
"enc": 3,
|
||||
"techAge": "Late Primitive",
|
||||
"description": "A full suit of metal plated armor with a thick woven undergarment to reduce irritation. Plate mail is normally only worn by the wealthy nobles. When facing firearms or other weapons from the Early Mechanical Eras or later, this armor provides 2 points of Protection [3]."
|
||||
},
|
||||
{
|
||||
"name": "Bulletproof Vest",
|
||||
"protection": 4,
|
||||
"cost": 150,
|
||||
"enc": 1,
|
||||
"techAge": "Early Atomic",
|
||||
"description": "A lightweight ballistic armor for torso protection. Bulletproof vests are easy to wear under clothes and are quite concealable [3]."
|
||||
},
|
||||
{
|
||||
"name": "Ceramic Plates",
|
||||
"protection": 8,
|
||||
"cost": 300,
|
||||
"enc": 2,
|
||||
"techAge": "Early Atomic",
|
||||
"description": "Modern heavy-duty ballistic-cloth armor. Commonly worn by soldiers, well-equipped security, and Atomic Age mercenaries. Ceramic Plate counts as two Items for encumbrance purposes and is not concealable [4]."
|
||||
},
|
||||
{
|
||||
"name": "Synthsilk Armor",
|
||||
"protection": 7,
|
||||
"cost": 6000,
|
||||
"enc": 0,
|
||||
"techAge": "Early Interstellar",
|
||||
"description": "This advanced personal armor is bio-engineered from spider silk. Synthsilk is easily concealable and does not count as an item for Encumbrance [5]."
|
||||
},
|
||||
{
|
||||
"name": "Energy Shield",
|
||||
"protection": 0,
|
||||
"cost": 20000,
|
||||
"enc": 1,
|
||||
"techAge": "Late Galactic",
|
||||
"description": "This high-energy emitter is worn on a belt clip. The energy shield is capable of stopping massive amounts of damage and may be worn with other armor. An energy shield completely negates the first hit it receives in combat but is then depleted. Roll 1d6 every following combat round; on a result of 4-6, the shield regenerates on the wearer’s turn, and may negate another hit afterwards [6]."
|
||||
},
|
||||
{
|
||||
"name": "Envirosuit",
|
||||
"protection": 4,
|
||||
"cost": 700,
|
||||
"enc": 2,
|
||||
"techAge": "Early Atomic",
|
||||
"description": "A full body sealed suit with attached filters and ports to attach oxygen tanks as well. The Envirosuit fully protects against airborne toxins and pathogens. An Envirosuit will absorb the first 20 rads of radiation exposure [6]."
|
||||
},
|
||||
{
|
||||
"name": "Spacesuit",
|
||||
"protection": 6,
|
||||
"cost": 2000,
|
||||
"enc": 2,
|
||||
"techAge": "Early Space",
|
||||
"description": "This is a standard space suit, much lighter and cheaper than a 20th Century Terran space suit. A space suit carries life support supplies for up to 6 hours. It protects against Vacuum, Tainted, and Exotic atmospheres, as well as airborne pathogens. Absorbs 60 rads [7]."
|
||||
},
|
||||
{
|
||||
"name": "Spacesuit, Advanced",
|
||||
"protection": 6,
|
||||
"cost": 4000,
|
||||
"enc": 0,
|
||||
"techAge": "Early Interstellar",
|
||||
"description": "This represents the final evolution of the space suit. An advanced space suit does not count as an item for encumbrance and provides life support for 12 hours. It offers the same protection as a regular space suit [7]."
|
||||
},
|
||||
{
|
||||
"name": "Spacesuit, Hostile Environment",
|
||||
"protection": 10,
|
||||
"cost": 10000,
|
||||
"enc": 3,
|
||||
"techAge": "Late Space",
|
||||
"description": "A heavy-duty and reinforced space suit designed for extreme conditions. It protects against vacuum and corrosive atmospheres, as well as airborne pathogens and toxins, and provides 2d6 hours of protection from highly corrosive atmospheres. The Hostile Environment space suit carries life support supplies for 6 hours and absorbs 150 rads’ worth of radiation [5]."
|
||||
},
|
||||
{
|
||||
"name": "Envirosuit, Advanced",
|
||||
"protection": 6,
|
||||
"cost": 5000,
|
||||
"enc": 0,
|
||||
"techAge": "Early Interstellar",
|
||||
"description": "This is a much higher-tech version of the Enrivosuit, and works the same way, but is ultra-light. It can absorb 40 rads’ worth of radiation [8]."
|
||||
},
|
||||
{
|
||||
"name": "Encased Armor",
|
||||
"protection": 10,
|
||||
"cost": 10000,
|
||||
"enc": 2,
|
||||
"techAge": "Late Space",
|
||||
"description": "A suit of heavy, full body rigid armor, often used by corporate SWAT and high-end mercenaries. The suit offers environmental protection as an Envirosuit (see below) and includes integrated comms and a Heads-Up Display [4]."
|
||||
},
|
||||
{
|
||||
"name": "Powered Armor",
|
||||
"protection": 14,
|
||||
"cost": 200000,
|
||||
"enc": 0,
|
||||
"techAge": "Late Interstellar",
|
||||
"description": "This is servo-assisted, fully enclosed, combat armor. This powerful armor grants +3D to all Physical checks related to brute strength and doubles the wearer’s normal Encumbrance limits. Powered armor grants +1D to all melee damage done by its wearer. It also removes the Bulky aspect from any weapons the wearer is using. Powered Armor protects against vacuum and hostile environments, as a space suit, with 6 hours of life support, and absorbs 50 rads of radiation. Powered armor does not count as an item for encumbrance when worn. It counts as 3 encumbrance items when carried [8]."
|
||||
}
|
||||
]
|
||||
268
assets/json_data/starships.json
Normal file
268
assets/json_data/starships.json
Normal file
@@ -0,0 +1,268 @@
|
||||
[
|
||||
{
|
||||
"name": "Orbital Transit Vehicle",
|
||||
"agility": "+1",
|
||||
"hullType": "Pod",
|
||||
"endurance": "1 week Travel x2",
|
||||
"armor": "2/4",
|
||||
"crew": "1 (3)",
|
||||
"cargo": "8",
|
||||
"guns": "0",
|
||||
"travelMultiplier": "x2",
|
||||
"cost": 66000,
|
||||
"monthlyCost": 4970,
|
||||
"description": "The OTV (Orbital Transfer Vehicle) is a larger and slower version of a standard pod. It trades acceleration and travel velocity for a larger life module that holds a pilot and three passengers. It also has more Endurance, and more Cargo. OTV Pods are often used for moving cargo and passengers from planets to vessels in orbit. They are often carried by colony ships. Often, OTVs double as landers, and are able to convert into a shelter for its four occupants who rely on the OTV’s extended Endurance while waiting for resupply."
|
||||
},
|
||||
{
|
||||
"name": "Defense Fighter",
|
||||
"agility": "+4",
|
||||
"hullType": "Micro",
|
||||
"endurance": "1 Day Travel x2",
|
||||
"armor": "14/17",
|
||||
"crew": "1",
|
||||
"cargo": "0.5",
|
||||
"guns": "5d6",
|
||||
"travelMultiplier": "x2",
|
||||
"cost": 1120000,
|
||||
"monthlyCost": 5300,
|
||||
"description": "The Defense Fighter is a common sight on frontier worlds. Tough little vessels, these fighters have excellent acceleration, and the cutting edge FTL drive provides additional inertial dampening for truly breakneck maneuvers. The ship is otherwise incapable of FTL travel. The ship has minimal cargo space but carries decent guns making it a serious threat to small and medium-sized craft. Any colony world and many settled planets will have these ships on hand to deter pirate, and force down questionable ships for inspection."
|
||||
},
|
||||
{
|
||||
"name": "Shuttle",
|
||||
"agility": "+3",
|
||||
"hullType": "Small",
|
||||
"endurance": "1 Week",
|
||||
"armor": "7/9",
|
||||
"crew": "3 (7)",
|
||||
"cargo": "8",
|
||||
"guns": "2d6",
|
||||
"travelMultiplier": "x1",
|
||||
"cost": 2500000,
|
||||
"monthlyCost": 22500,
|
||||
"description": "A lightly armored and armed transfer vehicle. This shuttle is designed to move people and cargo to and from space. Shuttles take up a bit of cargo space, they are typically only found on larger vessels or based at a space station or spaceport. It lacks the armor or weapons for rougher frontier areas."
|
||||
},
|
||||
{
|
||||
"name": "Tramp Freighter",
|
||||
"agility": "0",
|
||||
"hullType": "Scout",
|
||||
"endurance": "1 Month",
|
||||
"armor": "14/17",
|
||||
"crew": "4 (6)",
|
||||
"cargo": "64",
|
||||
"guns": "4d6",
|
||||
"travelMultiplier": "x1",
|
||||
"cost": 6800000,
|
||||
"monthlyCost": 39000,
|
||||
"description": "The tramp freighter sacrifices Agility, Armor, and Guns for Cargo. Typically, a vessel like this can make a tidy profit of 6000-7000 credits a month, more if the crew/owners forego part of their salary to buy off the ship’s debt. This version retains some weapons and armor to deal with unsavory types and is suited to Frontier regions. Running cargo in risky systems can pay off: freight and passenger rates are liable to be two or three time the normal rate for emergency shipments via these dangerous systems."
|
||||
},
|
||||
{
|
||||
"name": "Merchant",
|
||||
"agility": "0",
|
||||
"hullType": "Picket",
|
||||
"endurance": "3 Months",
|
||||
"armor": "18/21",
|
||||
"crew": "10 (15)",
|
||||
"cargo": "125",
|
||||
"guns": "4d6",
|
||||
"travelMultiplier": "x1",
|
||||
"cost": 23800000,
|
||||
"monthlyCost": 98000,
|
||||
"description": "Merchant pickets are bought outright by mid-sized independent companies. They carry vital supplies to new colonies and outposts, something no large corporation wants to deal with. They are often stripped down former military ships. The largest hull capable of landing, they are very handy for frontier worlds. Many captains crew these ships at half strength to carry five more passengers and make an extra 40000 credits a month. This amounts to working the crew to the point of burn-out. Crew turnover on these vessels is exceedingly high."
|
||||
},
|
||||
{
|
||||
"name": "Explorer",
|
||||
"agility": "0",
|
||||
"hullType": "Picket",
|
||||
"endurance": "6 Months",
|
||||
"armor": "18/21",
|
||||
"crew": "10 (15)",
|
||||
"cargo": "64",
|
||||
"guns": "4d6",
|
||||
"travelMultiplier": "x1",
|
||||
"cost": 27700000,
|
||||
"monthlyCost": 138500,
|
||||
"description": "The Explorer is an under-gunned picket hull that possesses increased Endurance but reduces the armament even more. Propellant is sacrificed as well to allow a suite of advanced sensors. The 15 passengers are explorers and scientists. The shuttle can ferry field teams around a planet being investigated. Some missions forgo this for more cargo and simply land the ship."
|
||||
},
|
||||
{
|
||||
"name": "Gunship",
|
||||
"agility": "+1",
|
||||
"hullType": "Picket",
|
||||
"endurance": "3 Months",
|
||||
"armor": "18/21",
|
||||
"crew": "10 (15)",
|
||||
"cargo": "32",
|
||||
"guns": "6d6",
|
||||
"travelMultiplier": "x1",
|
||||
"cost": 28000000,
|
||||
"monthlyCost": 98000,
|
||||
"description": "The gunship is a vessel much-loved by pirates. Small enough to land on a planet for a raid of opportunity, yet with large enough guns to terrorize a small convoy or space station. Its light armor does mean that it must flee when larger escorts arrive. The 15 passengers comprise the boarding/looting party. The gunship is an all-too-common sight on the wild frontier."
|
||||
},
|
||||
{
|
||||
"name": "Force Transport",
|
||||
"agility": "0",
|
||||
"hullType": "Destroyer",
|
||||
"endurance": "6 Months",
|
||||
"armor": "21/24",
|
||||
"crew": "25 (75)",
|
||||
"cargo": "177",
|
||||
"guns": "6d6",
|
||||
"travelMultiplier": "x1",
|
||||
"cost": 102570000,
|
||||
"monthlyCost": 331500,
|
||||
"description": "The Force Transport is designed to deliver ground troops to serve as garrisons and pacify low-intensity conflicts: civil disorder, unrest, and similar situations. Its guns are supplemented by seven torpedoes to deal with space-borne threats. Torpedo reloads are stored as cargo. Since this hull is too large to land on a planet, three shuttles serve to deliver troops to all but the hottest landing zones."
|
||||
},
|
||||
{
|
||||
"name": "Assault",
|
||||
"agility": "0",
|
||||
"hullType": "Destroyer",
|
||||
"endurance": "3 Months",
|
||||
"armor": "25/28",
|
||||
"crew": "25",
|
||||
"cargo": "7",
|
||||
"guns": "8d6",
|
||||
"travelMultiplier": "x1",
|
||||
"cost": 145700000,
|
||||
"monthlyCost": 264000,
|
||||
"description": "The Assault ship is a powerful ship that is designed to do one thing: go into hot spots, fight the enemy, and win! Its powerful guns make it dangerous to smaller craft, and its compliment of torpedoes make it a threat to larger ships. This ship is common in all space forces anticipating sharp engagements. Force Transports are often paired with Assault ships: the Assault ships clear a path to a planet, and the Transports offload their troops to establish a beachhead."
|
||||
},
|
||||
{
|
||||
"name": "Colonizer",
|
||||
"agility": "-2",
|
||||
"hullType": "Cruiser",
|
||||
"endurance": "2 Years Travel x2",
|
||||
"armor": "25/28",
|
||||
"crew": "100 (1100)",
|
||||
"cargo": "528",
|
||||
"guns": "6d6",
|
||||
"travelMultiplier": "x2",
|
||||
"cost": 381400000,
|
||||
"monthlyCost": 1532000,
|
||||
"description": "Colonizer cruisers are the vanguard of colonization and immigration efforts. They carry the OTV pods and colonists to a hopefully promising planet and carries all the necessary supplies for the initial colony to be established. The colonists are transported in tight confines and spend their days training and preparing for their new lives. Some Colonizers carry cryo-tubes to transport even more colonists at a fraction of the life support cost. By the time the Colonizer arrives over the new planet, the crew will have programmed the on-board OTV pods with descent parameters. Occasionally a colonist will receive a week of training to fly the OTV pod. The pods descend, each with four passengers, and eight tons of supplies. The pods are designed to be dismantled and used to create permanent shelters. The colonizer remains in orbit for four to five months to assist the fledgling colony by using its shuttles to move additional colonists, supplies, and heavier equipment down to the planet. The ship has enough firepower to dissuade all but the most aggressive raiders. This is an older and slower colonizer. One thousand colonist are transported awake, while 800 more are in cryo-tubes!"
|
||||
},
|
||||
{
|
||||
"name": "Miner",
|
||||
"agility": "-1",
|
||||
"hullType": "Scout",
|
||||
"endurance": "1 Month Travel x1.5",
|
||||
"armor": "18/21",
|
||||
"crew": "4",
|
||||
"cargo": "32",
|
||||
"guns": "2d6",
|
||||
"travelMultiplier": "x1.5",
|
||||
"cost": 7600000,
|
||||
"monthlyCost": 32000,
|
||||
"description": "The Mining Scout sacrifices Guns, travel speed and acceleration to mount mining gear and an enlarged cargo hold. It retains the Scout’s armor for protection against mining debris. The Scout is seldom troubled by pirates, who prefer looting a hold of luxury items to raw minerals. In areas where mining operations are harassed, these ships are guarded by interceptors. These ships regularly operate with military operations to provide fuel."
|
||||
},
|
||||
{
|
||||
"name": "Escort Tender",
|
||||
"agility": "0",
|
||||
"hullType": "Picket",
|
||||
"endurance": "1 Month Travel x0.75",
|
||||
"armor": "18/21",
|
||||
"crew": "19 (6)",
|
||||
"cargo": "16",
|
||||
"guns": "4d6",
|
||||
"travelMultiplier": "x0.75",
|
||||
"cost": 30520000,
|
||||
"monthlyCost": 218800,
|
||||
"description": "Escort tenders are the unglamorous workhorses of many navies, as they transport Defense Fighters, the agile combat craft with low Travel Multipliers, to a fight. Tenders are built around large propellant tanks, and very little else. The tenders will deploy their fighters and hang back while the fighters deploy to deal with threats. The six fighters’ pilots are considered passengers in this entry. Attacks that incapacitate crew if a tender while it is operating fighters will soon leave it under-crewed."
|
||||
},
|
||||
{
|
||||
"name": "Express Picket",
|
||||
"agility": "+2",
|
||||
"hullType": "Picket",
|
||||
"endurance": "1 Month Travel x1",
|
||||
"armor": "21/24",
|
||||
"crew": "4 Auto.",
|
||||
"cargo": "32 (10 Cryo)",
|
||||
"guns": "6d6",
|
||||
"travelMultiplier": "x1",
|
||||
"cost": 30800000,
|
||||
"monthlyCost": 69000,
|
||||
"description": "Express pickets are high speed craft that are designed to move vital information, supplies, and individuals over vast distances with very little external support. To reduce the logistical burden and simplify matters, many VIPs are placed in cryo-tubes for the entirety of the voyage. Express Pickets often possess redundant FTL Drives that permit two FTL voyages in rapid succession before requiring recharge. Another unique feature of this vessel is the use of an advanced Artificial Intelligence to reduce crew size to the bare minimum. Meanwhile, with such valuable components and the presence of sensitive information and persons, Express Pickets are armored and armed well enough to deter pirates."
|
||||
},
|
||||
{
|
||||
"name": "Racer Rocket",
|
||||
"agility": "+1",
|
||||
"hullType": "Destroyer",
|
||||
"endurance": "6 months Travel x0.5",
|
||||
"armor": "7/9",
|
||||
"crew": "25",
|
||||
"cargo": "16",
|
||||
"guns": "1d6",
|
||||
"travelMultiplier": "x0.5",
|
||||
"cost": 50000000,
|
||||
"monthlyCost": 450000,
|
||||
"description": "Competitive rocket racing is a popular and profitable sport, with many clubs and racing circuits across many sectors. The Racing Rocket is a standard high-speed, long-distance racer, though other types of rockets also exist for shorter races. This particular rocket is outfitted for dangerous and cutting-edge antimatter fuel. The Agility increases to +3 and the Travel Multiplier increases to x0.33 (faster!) when antimatter fuel is available. Racing rockets are also used as an emergency express courier to quickly send help or supplies to remote outposts in a given system."
|
||||
},
|
||||
{
|
||||
"name": "Pleasure Craft",
|
||||
"agility": "+1",
|
||||
"hullType": "Picket",
|
||||
"endurance": "3 months",
|
||||
"armor": "18/21",
|
||||
"crew": "10(20/70)",
|
||||
"cargo": "16",
|
||||
"guns": "4d6",
|
||||
"travelMultiplier": "x1",
|
||||
"cost": 33732000,
|
||||
"monthlyCost": 167940,
|
||||
"description": "Pleasure craft are popular among the elite and leaders of worlds. The ship is designed to carry many passengers. The ten crew are supported by another twenty stewards who tend to the seventy or so passengers. Of course, many of the passengers are themselves guards, agents, and other members of a wealthy VIP’s household or entourage. It is rare for these vessels to be attacked, but if an attack does occur, the ship uses its Agility to stay out of the field of fire, and launches its torpedoes before fleeing."
|
||||
},
|
||||
{
|
||||
"name": "Refinery",
|
||||
"agility": "-1",
|
||||
"hullType": "Battleship",
|
||||
"endurance": "6 Months Travel x2",
|
||||
"armor": "32/35",
|
||||
"crew": "300",
|
||||
"cargo": "4000",
|
||||
"guns": "6d6",
|
||||
"travelMultiplier": "x2",
|
||||
"cost": 4400000000,
|
||||
"monthlyCost": 2364000,
|
||||
"description": "A Refinery Ship costs is a large and costly vessel. Those that aren’t constructed outright by corporations or governments to serve as the lynchpins of resource exploitation projects are usually hobbled together by several clans of belters pooling together their hard-won resources. A Refinery ship will have huge cargo holds and often have an entire fleet of smaller mining ships operating out of its hangars. Refinery ships are heavily reinforced designs and are constructed to withstand the nearby explosion of an asteroid. They have enough defensive systems to carefully guard their resources. Many belter communities also hire mercenary ships to further bolster their refinery’s defenses. A refinery ship has never been successfully boarded or looted."
|
||||
},
|
||||
{
|
||||
"name": "Prison Ship",
|
||||
"agility": "+1",
|
||||
"hullType": "Picket",
|
||||
"endurance": "6 Months",
|
||||
"armor": "18/21",
|
||||
"crew": "10(15)",
|
||||
"cargo": "22",
|
||||
"guns": "5d6",
|
||||
"travelMultiplier": "x1",
|
||||
"cost": 28020000,
|
||||
"monthlyCost": 116000,
|
||||
"description": "This prison ship serves as a mobile base and prison for affiliated bounty hunters. Five of the passengers are guards, the rest prisoners. Many crews will store extra prisoners on ice in cryo-tubes in the hold. The ship sacrifices some armor and firepower for the larger life support system, and it cannot stand up to similar military ships. However, it remains a credible threat to most pirates who may want to mount a rescue. The guards on such a vessel are often replaced by robots, the likes of which are not likely to be bribed or coerced."
|
||||
},
|
||||
{
|
||||
"name": "Torpedo Boat",
|
||||
"agility": "+2",
|
||||
"hullType": "Scout",
|
||||
"endurance": "1 Week",
|
||||
"armor": "18/21",
|
||||
"crew": "4",
|
||||
"cargo": "0",
|
||||
"guns": "6d6",
|
||||
"travelMultiplier": "x1",
|
||||
"cost": 8000000,
|
||||
"monthlyCost": 39000,
|
||||
"description": "Torpedo Boats serve as a defensive vessel for mid-sized colonies that are occasionally the targets of larger pirate raids. The Torpedo Boat uses its high Agility to maintain an advantageous position, while launching torpedo after torpedo at pirate pickets. Torpedo Boats are often used with Defense Fighters or Gunships. They are also carried by larger ships like Cruisers."
|
||||
},
|
||||
{
|
||||
"name": "Drop Ship",
|
||||
"agility": "+3",
|
||||
"hullType": "Scout",
|
||||
"endurance": "1 Day",
|
||||
"armor": "18/21",
|
||||
"crew": "4(21)",
|
||||
"cargo": "2",
|
||||
"guns": "6d6",
|
||||
"travelMultiplier": "x1",
|
||||
"cost": 9600000,
|
||||
"monthlyCost": 37175,
|
||||
"description": "The Drop Ship is a large, militarized shuttle bristling with weapons. Its primary task is to deliver a platoon of 20 soldiers to a hostile planetary surface in very little time. Its engines give it excellent acceleration, hopefully enough to evade fire—any trooper will tell you that a Drop Ship ride is never a restful experience."
|
||||
}
|
||||
]
|
||||
254
assets/json_data/vehicles.json
Normal file
254
assets/json_data/vehicles.json
Normal file
@@ -0,0 +1,254 @@
|
||||
[
|
||||
{
|
||||
"name": "Ground Car",
|
||||
"agility": 0,
|
||||
"armor": "6/8",
|
||||
"cargo": "250kg",
|
||||
"crew": "1/4",
|
||||
"force": 0,
|
||||
"range": "400km",
|
||||
"speed": "160km/h",
|
||||
"techAge": "Early Mechanical",
|
||||
"tonnage": "2 Tons",
|
||||
"cost": 10000,
|
||||
"description": "The ground car is popular with civilians on many worlds due to its rugged and simple construction. They are ubiquitous with models for sale or rental everywhere. Typically has no weapon."
|
||||
},
|
||||
{
|
||||
"name": "Pickup Truck",
|
||||
"agility": 0,
|
||||
"armor": "6/8",
|
||||
"cargo": "1 ton",
|
||||
"crew": "1/6",
|
||||
"force": 1,
|
||||
"range": "400km",
|
||||
"speed": "120km/h",
|
||||
"techAge": "Early Mechanical",
|
||||
"tonnage": "4 Tons",
|
||||
"cost": 15000,
|
||||
"description": "A bigger version of the ground car with a flat-bed cargo bay instead of passenger seating. Any passengers would sit in the open bay. This is a ubiquitous vehicle and has a notable reputation for being able to go anywhere, and in any condition. Many mercenary teams desperately get their hands on pickup trucks and fit any manner of weapons onto their flatbed. Some manufacturers are happy to see a new market for their vehicles. Others are less enthusiastic. Typically has no weapon."
|
||||
},
|
||||
{
|
||||
"name": "Armored Personnel Carrier",
|
||||
"agility": -1,
|
||||
"armor": "12/16",
|
||||
"cargo": "2 tons",
|
||||
"crew": "2/8",
|
||||
"force": 2,
|
||||
"range": "400km",
|
||||
"speed": "60km/h",
|
||||
"techAge": "Late Mechanical",
|
||||
"tonnage": "5 Tons",
|
||||
"cost": 177250,
|
||||
"description": "Introduced in the Mechanical Age, Armored Personnel Carriers are essential to modern warfare, allowing infantry to keep pace with armored units. Weapons include a Heavy Machinegun (Damage 5d6, Auto, AV 3d6). Some mount a Light Autocannon (Damage 5d6, Auto, AV 4d6)."
|
||||
},
|
||||
{
|
||||
"name": "Light Tank",
|
||||
"agility": -1,
|
||||
"armor": "14/20",
|
||||
"cargo": "1 ton",
|
||||
"crew": "2/8",
|
||||
"force": 2,
|
||||
"range": "500km",
|
||||
"speed": "60km/h",
|
||||
"techAge": "Late Mechanical",
|
||||
"tonnage": "10 Tons",
|
||||
"cost": 177250,
|
||||
"description": "The light tank is popular in various low-tech worlds for internal security and counter insurgency. In wartime they are used to reconnoiter for heavier armored vehicles. Later models include IR sensors and fire suppression systems for the crew. Weapons include a Heavy Machinegun (Dam 5d6, Auto, AV 3d6), Light Cannon (Dam 4d6, AV 4d6)."
|
||||
},
|
||||
{
|
||||
"name": "Sports Car",
|
||||
"agility": 0,
|
||||
"armor": "5/7",
|
||||
"cargo": "200kg",
|
||||
"crew": "1/1",
|
||||
"force": 1,
|
||||
"range": "360km",
|
||||
"speed": "240km/h",
|
||||
"techAge": "Late Mechanical",
|
||||
"tonnage": "2 Tons",
|
||||
"cost": 14825,
|
||||
"description": "The sports car is popular with the wealthy on many worlds due to its speed and comfort. Typically has no weapon."
|
||||
},
|
||||
{
|
||||
"name": "Explorer",
|
||||
"agility": -2,
|
||||
"armor": "7/10",
|
||||
"cargo": "1500kg",
|
||||
"crew": "2/2",
|
||||
"force": 2,
|
||||
"range": "Unlimited",
|
||||
"speed": "60km/h",
|
||||
"techAge": "Early Interstellar",
|
||||
"tonnage": "10 Tons",
|
||||
"cost": 159300,
|
||||
"description": "Explorers are popular ground vehicles in Early Interstellar Age cultures. It is powered by a Fusion pack which provides effectively unlimited range. The Explorer carries a driver, a sensor technician, and two passengers in cramped seats. The sensor operator has dual controls for driving. Two bunks allow sleeping in rotation to recover from fatigue. Life Support lasts indefinitely. The ample cargo bay, rest accommodations, and amenities make the Explorer very popular with survey crews. Sensors: IR, Radar, Ladar, Dynamometer. Has no weapon."
|
||||
},
|
||||
{
|
||||
"name": "Hovercraft",
|
||||
"agility": -1,
|
||||
"armor": "6/8",
|
||||
"cargo": "1750kg",
|
||||
"crew": "1/5",
|
||||
"force": 1,
|
||||
"range": "400km",
|
||||
"speed": "160km/h",
|
||||
"techAge": "Early Atomic",
|
||||
"tonnage": "10 Tons",
|
||||
"cost": 40800,
|
||||
"description": "Hovercraft can travel over virtually any terrain or water. This civilian hovercraft has an unarmored chassis, and transports five passengers in cramped seats alongside the driver. This vehicle also has a waterproof body, allowing it to float. Has no weapon."
|
||||
},
|
||||
{
|
||||
"name": "Cabin Cruiser",
|
||||
"agility": -2,
|
||||
"armor": "6/8",
|
||||
"cargo": "2000kg",
|
||||
"crew": "2/3",
|
||||
"force": 2,
|
||||
"range": "1080km",
|
||||
"speed": "15 km/h",
|
||||
"techAge": "Late Mechanical",
|
||||
"tonnage": "10 Tons",
|
||||
"cost": 25100,
|
||||
"description": "The Cabin Cruiser serves for fishing and other leisure activities. It also can be fitted with weapons and used for security duties (shown in the example). The below-deck area is popular with crew, though a galley is not provided. A skipper, gunner, and three passengers are carried above deck. There are two bunks below-decks. The civilian version removes the weapon station and adds 0.5 tons of cargo and costs 13,600 Credits. Weapon is GP Machinegun (Damage 3d6+3, Auto, AV 2d6)."
|
||||
},
|
||||
{
|
||||
"name": "Speedboat",
|
||||
"agility": 0,
|
||||
"armor": "6/8",
|
||||
"cargo": "750kg",
|
||||
"crew": "1/4",
|
||||
"force": 0,
|
||||
"range": "600km",
|
||||
"speed": "120km/h",
|
||||
"techAge": "Late Mechanical",
|
||||
"tonnage": "2 Tons",
|
||||
"cost": 14750,
|
||||
"description": "The Speed Boat was designed for harbor and coastal patrol, as well as for leisure activities during the Late Mechanical Age. There is no below deck area. A skipper and four passengers are carried above deck. Has no weapon."
|
||||
},
|
||||
{
|
||||
"name": "Mini-Sub",
|
||||
"agility": -3,
|
||||
"armor": "9/12 (pressure hull)",
|
||||
"cargo": "1150kg",
|
||||
"crew": "1/4",
|
||||
"force": 1,
|
||||
"range": "1080km",
|
||||
"speed": "40km/h surface, 20km/h submerged",
|
||||
"techAge": "Late Mechanical",
|
||||
"tonnage": "10 Tons",
|
||||
"cost": 358000,
|
||||
"description": "This mini-sub can carry a pilot and four passengers in cramped seats. It has no airlock. Underwater, the mini-sub travels at 20kph up to two hours before having to surface and recharge its batteries. It has a maximum diving depth of 100 meters. Has no weapon."
|
||||
},
|
||||
{
|
||||
"name": "Biplane",
|
||||
"agility": 1,
|
||||
"armor": "6/9",
|
||||
"cargo": "Negligible",
|
||||
"crew": "1/1",
|
||||
"force": 0,
|
||||
"range": "1000km",
|
||||
"speed": "250km/h",
|
||||
"techAge": "Late Mechanical",
|
||||
"tonnage": "2 Tons",
|
||||
"cost": 61000,
|
||||
"description": "Biplanes are simple aircraft, using twin wings to generate lift. They have a maximum speed of 250km/h, and a Stall Speed of 80km/h. Armed variants carry machineguns, while unarmed variants gain 100kg of cargo space. Weapon is GP Machinegun (Damage 3d6+3, Auto, AV2d6)."
|
||||
},
|
||||
{
|
||||
"name": "Propeller Plane",
|
||||
"agility": 1,
|
||||
"armor": "7/10",
|
||||
"cargo": "500kg",
|
||||
"crew": "2/3",
|
||||
"force": 0,
|
||||
"range": "2000km",
|
||||
"speed": "400km/h",
|
||||
"techAge": "Late Mechanical",
|
||||
"tonnage": "10 Tons",
|
||||
"cost": 166000,
|
||||
"description": "The propeller-driven monoplane soon supersedes the biplane in the Late Mechanical Age. This variant is used for urgent errands on frontier planets, and can carry a pilot, co-pilot, and four passengers (one being a gunner). This aircraft has a stall speed of 120km/h and requires a landing strip. Weapon is GP Machinegun (Damage 3d6+3, Auto, AV2d6)."
|
||||
},
|
||||
{
|
||||
"name": "Cargo Plane",
|
||||
"agility": 0,
|
||||
"armor": "8/11",
|
||||
"cargo": "4000kg",
|
||||
"crew": "2/20",
|
||||
"force": 1,
|
||||
"range": "2000km",
|
||||
"speed": "400km/h",
|
||||
"techAge": "Late Mechanical",
|
||||
"tonnage": "20 Tons",
|
||||
"cost": 250000,
|
||||
"description": "This is a medium sized cargo plane driven by two, three, or four propellers. It is very reliable and rugged and can be found on any world where aircraft are useful and cheap to operate. Has no weapon."
|
||||
},
|
||||
{
|
||||
"name": "Helicopter",
|
||||
"agility": 1,
|
||||
"armor": "7/10",
|
||||
"cargo": "500kg",
|
||||
"crew": "1/1",
|
||||
"force": 1,
|
||||
"range": "2100km",
|
||||
"speed": "250km/h",
|
||||
"techAge": "Late Mechanical",
|
||||
"tonnage": "10 Tons",
|
||||
"cost": 193500,
|
||||
"description": "Introduced in the Late Mechanical Age, the Helicopter is the first heavier-than-air aircraft capable of hovering and vertical flight. It is popular on Earth-like worlds for search and rescue, law enforcement, and supply runs to remote settlements since it doesn’t need a landing strip. Has no weapon."
|
||||
},
|
||||
{
|
||||
"name": "Jump Jet",
|
||||
"agility": 1,
|
||||
"armor": "7/10",
|
||||
"cargo": "1250kg",
|
||||
"crew": "2/3",
|
||||
"force": 1,
|
||||
"range": "2500km",
|
||||
"speed": "800km/h",
|
||||
"techAge": "Early Atomic",
|
||||
"tonnage": "12 Tons",
|
||||
"cost": 656000,
|
||||
"description": "Jump Jets became feasible in the Early Atomic Age. They provide the high speed and high-altitude flight of normal jet aircraft, as well as the hovering, take-off, and landing capabilities of a helicopter. This version carries a pilot, flight engineer/electronics specialist, and three passengers. A commercial passenger version removes the advanced sensors and carries a pilot and 8 passengers with 1.5 tons of cargo. It costs 647000 Credits. Has no weapon."
|
||||
},
|
||||
{
|
||||
"name": "Sky Car",
|
||||
"agility": 2,
|
||||
"armor": "7/9",
|
||||
"cargo": "500kg",
|
||||
"crew": "1/3",
|
||||
"force": 1,
|
||||
"range": "8000km",
|
||||
"speed": "800km/h",
|
||||
"techAge": "Early Space",
|
||||
"tonnage": "5 Tons",
|
||||
"cost": 170000,
|
||||
"description": "This Space Age Skycar or “Buzzer” is a small, lightly armored vehicle. Skycars are often used by the authorities, emergency services, and the super-rich. This vehicle can hover in place. It holds a pilot and three passengers in cramped seats. Has no weapon (as per its listed stats, though an example later states it can be equipped with a Support Laser)."
|
||||
},
|
||||
{
|
||||
"name": "Jet Fighter",
|
||||
"agility": 1,
|
||||
"armor": "7/10",
|
||||
"cargo": "Nil",
|
||||
"crew": "2/0",
|
||||
"force": 1,
|
||||
"range": "5000km",
|
||||
"speed": "2000km/h",
|
||||
"techAge": "Early Atomic",
|
||||
"tonnage": "10 Tons",
|
||||
"cost": 454000,
|
||||
"description": "Jet fighters are a crucial defense against raiders and invasion. First introduced in the Early Atomic Age, they continue to improve until the Interstellar Age and are vital to planets with little or no space presence. This fighter has a crew of two: a pilot and electronics specialist, who both must wear oxygen masks. Jet fighters require extensive landing strips and maintenance to keep them flying. The aircraft’s stall speed is 300km/h, and they cannot reach their top speed without being at very high altitudes. Sensors: IR, Radar. Weapons include Light Autocannon (5d6, Auto, AV 3d6+1), 2x Anti-Tank Missile (5d6, Blast, AV 5d6), 2x Anti-Aircraft Missile (4d6, Blast, AV 3d6)."
|
||||
},
|
||||
{
|
||||
"name": "Grav Car",
|
||||
"agility": 2,
|
||||
"armor": "7/9",
|
||||
"cargo": "1750kg",
|
||||
"crew": "1/5",
|
||||
"force": 1,
|
||||
"range": "Unlimited",
|
||||
"speed": "1000km/h",
|
||||
"techAge": "Late Galactic",
|
||||
"tonnage": "5 Tons",
|
||||
"cost": 170000,
|
||||
"description": "The Grav Car is civilian transportation in the Late Galactic Age. It is built on a small, unarmored chassis. Its gravity drive gives it an impressive top speed and allows hovering or vertical flight. The grav car can reach orbit in 1d6 hours. Its cabin is sealed. Has no weapon."
|
||||
}
|
||||
]
|
||||
112
assets/json_data/vehicleweapons.json
Normal file
112
assets/json_data/vehicleweapons.json
Normal file
@@ -0,0 +1,112 @@
|
||||
[
|
||||
{
|
||||
"name": "Autocannon, Light",
|
||||
"tech_age": "Late Mechanical",
|
||||
"cost": 10000,
|
||||
"range": "heavy",
|
||||
"damage": "5d6",
|
||||
"mag": 100,
|
||||
"ammo_cost": 1000,
|
||||
"aspect": "Auto, AV 3d6+1.",
|
||||
"description": "This weapon can fire bursts of shells at high rates of fire. It is common to find this mounted on aircraft as a dogfighting weapon, as well as on light armored vehicles as a support weapon for infantry."
|
||||
},
|
||||
{
|
||||
"name": "Autocannon, Heavy",
|
||||
"tech_age": "Late Mechanical",
|
||||
"cost": 20000,
|
||||
"range": "heavy",
|
||||
"damage": "5d6",
|
||||
"mag": 50,
|
||||
"ammo_cost": 2000,
|
||||
"aspect": "Auto, AV 3d6+2.",
|
||||
"description": "A larger version of the light autocannon, often found on light armored vehicles, naval vessels, and ground attack aircraft."
|
||||
},
|
||||
{
|
||||
"name": "Cannon, Light",
|
||||
"tech_age": "Early Mechanical",
|
||||
"cost": 15000,
|
||||
"range": "heavy",
|
||||
"damage": "5d6",
|
||||
"mag": 40,
|
||||
"ammo_cost": 2000,
|
||||
"aspect": "AV 4d6+1.",
|
||||
"description": "A multipurpose support weapon usually mounted on a vehicle or gun carriage."
|
||||
},
|
||||
{
|
||||
"name": "Cannon, Heavy",
|
||||
"tech_age": "Early Mechanical",
|
||||
"cost": 30000,
|
||||
"range": "heavy",
|
||||
"damage": "6d6",
|
||||
"mag": 20,
|
||||
"ammo_cost": 3000,
|
||||
"aspect": "AV 5d6.",
|
||||
"description": "This cannon is a main battle tank’s primary weapon. It is often used as field artillery as well."
|
||||
},
|
||||
{
|
||||
"name": "Heavy Flamer",
|
||||
"tech_age": "Late Mechanical",
|
||||
"cost": 1000,
|
||||
"range": "Rifle",
|
||||
"damage": "3d6",
|
||||
"mag": 5,
|
||||
"ammo_cost": 25,
|
||||
"aspect": "AV 2d6, Fire. ",
|
||||
"description": "A brutal close-in anti-infantry weapon used to flush out fortifications and defend against infantry attack in built-up areas. Vehicles that carry flamethrowers are usually the first to be targeted by enemy infantry."
|
||||
},
|
||||
{
|
||||
"name": "Grenade Launcher",
|
||||
"tech_age": "Late Mechanical",
|
||||
"cost": 400,
|
||||
"range": "Rifle",
|
||||
"damage": "According to grenade",
|
||||
"mag": 50,
|
||||
"ammo_cost": 0,
|
||||
"aspect": "",
|
||||
"description": "A light support weapon mounted on many vehicles. This version has a 50 round belt magazine. Many vehicles mount smoke grenade launchers as defensive weapons."
|
||||
},
|
||||
{
|
||||
"name": "Guided Anti-Tank Missile",
|
||||
"tech_age": "Early Atomic",
|
||||
"cost": 4000,
|
||||
"range": "heavy",
|
||||
"damage": "5d6",
|
||||
"mag": 4,
|
||||
"ammo_cost": 200,
|
||||
"aspect": "Blast, AV 5d6. ",
|
||||
"description": "This vehicle mounted version of the portable anti-tank missile launcher has a magazine of four missiles. A system like this is often mounted on a light vehicle to give it significant anti-armor punch."
|
||||
},
|
||||
{
|
||||
"name": "Laser Cannon",
|
||||
"tech_age": "Early Space",
|
||||
"cost": 10000,
|
||||
"range": "heavy",
|
||||
"damage": "5d6",
|
||||
"mag": 100,
|
||||
"ammo_cost": 100,
|
||||
"aspect": "AV 4d6+2.",
|
||||
"description": "The Early Space Age’s replacement for all but the heaviest cannons, this vehicle weapon is highly efficient, and can be recharged from any power grid. This makes it the darling of logistics officers in any military where it is found."
|
||||
},
|
||||
{
|
||||
"name": "Laser, Support",
|
||||
"tech_age": "Early Space",
|
||||
"cost": 5000,
|
||||
"range": "heavy",
|
||||
"damage": "5d6",
|
||||
"mag": 100,
|
||||
"ammo_cost": 100,
|
||||
"aspect": "AV 3d6+1.",
|
||||
"description": "This vehicle mounted version of the portable support laser lacks auto fire capabilities but has a nearly inexhaustible ammunition supply."
|
||||
},
|
||||
{
|
||||
"name": "Rocket Launcher",
|
||||
"tech_age": "Early Atomic",
|
||||
"cost": 2000,
|
||||
"range": "heavy",
|
||||
"damage": "4d6",
|
||||
"mag": 1,
|
||||
"ammo_cost": 150,
|
||||
"aspect": "Greater Blast, AV 3d6.",
|
||||
"description": "A portable rocket launcher utilizing unguided munitions. Rocket payloads are considered high explosive and are not particularly effective against armored vehicles. Vehicle-mounted versions usually have 12 or 24 shots before requiring reloading."
|
||||
}
|
||||
]
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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 })
|
||||
|
||||
127
lang/en.json
127
lang/en.json
@@ -190,6 +190,18 @@
|
||||
"Shallows" : "Shallows"
|
||||
},
|
||||
"FIELDS": {
|
||||
"health": {
|
||||
"staminaValue": {
|
||||
"label": "Cur."
|
||||
},
|
||||
"staminaMax": {
|
||||
"label": "Max"
|
||||
},
|
||||
"wounds": {
|
||||
"label": "Wounds"
|
||||
},
|
||||
"label": "Stamina"
|
||||
},
|
||||
"damage": {
|
||||
"label": "Damage"
|
||||
},
|
||||
@@ -280,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": {
|
||||
@@ -339,7 +435,11 @@
|
||||
}
|
||||
},
|
||||
"Label": {
|
||||
"damages": "Damages",
|
||||
"robot": "Robot",
|
||||
"techAge": "Tech Age",
|
||||
"mainStats": "Main Stats",
|
||||
"formula": "Formula",
|
||||
"damages": "Damage",
|
||||
"modifications": "Modifications",
|
||||
"abilities": "Abilities",
|
||||
"Details": "Details",
|
||||
@@ -350,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",
|
||||
@@ -493,6 +599,9 @@
|
||||
"Carrier": "Carrier"
|
||||
},
|
||||
"FIELDS": {
|
||||
"techAge": {
|
||||
"label": "Tech Age"
|
||||
},
|
||||
"monthlyCost": {
|
||||
"label": "Monthly Cost"
|
||||
},
|
||||
@@ -563,13 +672,15 @@
|
||||
"addSkill" : "Add Skill",
|
||||
"addWeapon" : "Add Weapon",
|
||||
"addArmor" : "Add Armor",
|
||||
"addAbility" : "Add Ability",
|
||||
"addEquipment" : "Add Equipment",
|
||||
"addTrait" : "Add Trait",
|
||||
"addImplant" : "Add Implant",
|
||||
"addLanguage" : "Add Language",
|
||||
"addPsionic" : "Add Psionic",
|
||||
"addCreatureAbility" : "Add Creature Ability",
|
||||
"addCreatureTrait" : "Add Creature Trait",
|
||||
"damages": "Enter current damages suffered"
|
||||
"damages": "Enter current damage suffered"
|
||||
},
|
||||
"Vehicle": {
|
||||
"FIELDS": {
|
||||
@@ -605,6 +716,9 @@
|
||||
},
|
||||
"notes": {
|
||||
"label": "Notes"
|
||||
},
|
||||
"techAge": {
|
||||
"label": "Tech Age"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -634,6 +748,12 @@
|
||||
},
|
||||
"weaponType": {
|
||||
"label": "Type"
|
||||
},
|
||||
"ammoCost": {
|
||||
"label": "Ammo Cost"
|
||||
},
|
||||
"magazine": {
|
||||
"label": "Mag"
|
||||
}
|
||||
},
|
||||
"Range": {
|
||||
@@ -660,7 +780,8 @@
|
||||
"character": "Character",
|
||||
"creature": "Creature",
|
||||
"starship": "Starship",
|
||||
"vehicle": "Vehicle"
|
||||
"vehicle": "Vehicle",
|
||||
"robot": "Robot"
|
||||
},
|
||||
"Item": {
|
||||
"armor": "Armor",
|
||||
|
||||
@@ -11,4 +11,4 @@ export { default as FTLNomadImplantSheet } from "./sheets/implant-sheet.mjs"
|
||||
export { default as FTLNomadStarshipSheet } from "./sheets/starship-sheet.mjs"
|
||||
export { default as FTLNomadCreatureTraitSheet } from "./sheets/creature-trait-sheet.mjs"
|
||||
export { default as FTLNomadCreatureAbilitySheet } from "./sheets/creature-ability-sheet.mjs"
|
||||
|
||||
export { default as FTLNomadRobotSheet } from "./sheets/robot-sheet.mjs"
|
||||
|
||||
174
module/applications/sheets/robot-sheet.mjs
Normal file
174
module/applications/sheets/robot-sheet.mjs
Normal file
@@ -0,0 +1,174 @@
|
||||
import FTLNomadActorSheet from "./base-actor-sheet.mjs"
|
||||
|
||||
export default class FTLNomadRobotSheet extends FTLNomadActorSheet {
|
||||
/** @override */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["robot"],
|
||||
position: {
|
||||
width: 860,
|
||||
height: 620,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["robot-content"],
|
||||
},
|
||||
actions: {
|
||||
createEquipment: FTLNomadRobotSheet.#onCreateEquipment,
|
||||
createArmor: FTLNomadRobotSheet.#onCreateArmor,
|
||||
createWeapon: FTLNomadRobotSheet.#onCreateWeapon,
|
||||
createTalent: FTLNomadRobotSheet.#onCreateTalent,
|
||||
createImplant: FTLNomadRobotSheet.#onCreateImplant,
|
||||
createPsionic: FTLNomadRobotSheet.#onCreatePsionic,
|
||||
createLanguage: FTLNomadRobotSheet.#onCreateLanguage
|
||||
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
template: "systems/fvtt-ftl-nomad/templates/robot-main.hbs",
|
||||
},
|
||||
tabs: {
|
||||
template: "templates/generic/tab-navigation.hbs",
|
||||
},
|
||||
equipment: {
|
||||
template: "systems/fvtt-ftl-nomad/templates/robot-equipment.hbs",
|
||||
},
|
||||
description: {
|
||||
template: "systems/fvtt-ftl-nomad/templates/robot-description.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
tabGroups = {
|
||||
sheet: "equipment",
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare an array of form header tabs.
|
||||
* @returns {Record<string, Partial<ApplicationTab>>}
|
||||
*/
|
||||
#getTabs() {
|
||||
const tabs = {
|
||||
equipment: { id: "equipment", group: "sheet", icon: "fa-solid fa-shapes", label: "FTLNOMAD.Label.equipment" },
|
||||
description: {
|
||||
id: "description", group: "sheet", icon: "fa-solid fa-book", label: "FTLNOMAD.Label.description"
|
||||
}
|
||||
}
|
||||
for (const v of Object.values(tabs)) {
|
||||
v.active = this.tabGroups[v.group] === v.id
|
||||
v.cssClass = v.active ? "active" : ""
|
||||
}
|
||||
return tabs
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _prepareContext() {
|
||||
const context = await super._prepareContext()
|
||||
context.tabs = this.#getTabs()
|
||||
|
||||
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
|
||||
context.enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.notes, { async: true })
|
||||
|
||||
return context
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _preparePartContext(partId, context) {
|
||||
const doc = this.document
|
||||
switch (partId) {
|
||||
case "equipment":
|
||||
context.tab = context.tabs.equipment
|
||||
context.weapons = doc.itemTypes.weapon
|
||||
context.weapons.sort((a, b) => a.name.localeCompare(b.name))
|
||||
context.armors = doc.itemTypes.armor
|
||||
context.armors.sort((a, b) => a.name.localeCompare(b.name))
|
||||
context.equipments = doc.itemTypes.equipment
|
||||
context.equipments.sort((a, b) => a.name.localeCompare(b.name))
|
||||
break
|
||||
case "description":
|
||||
context.tab = context.tabs.description
|
||||
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(doc.system.description, { async: true })
|
||||
context.enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(doc.system.notes, { async: true })
|
||||
break
|
||||
}
|
||||
return context
|
||||
}
|
||||
|
||||
|
||||
static #onCreateEquipment(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("FTLNOMAD.Label.newEquipment"), type: "equipment" }])
|
||||
}
|
||||
|
||||
static #onCreateWeapon(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("FTLNOMAD.Label.newWeapon"), type: "weapon" }])
|
||||
}
|
||||
|
||||
static #onCreateArmor(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("FTLNOMAD.Label.newArmor"), type: "armor" }])
|
||||
}
|
||||
|
||||
static #onCreateTalent(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("FTLNOMAD.Label.newTalent"), type: "talent" }])
|
||||
}
|
||||
|
||||
static #onCreateImplant(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("FTLNOMAD.Label.newImplant"), type: "implant" }])
|
||||
}
|
||||
|
||||
static #onCreatePsionic(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("FTLNOMAD.Label.newPsionic"), type: "psionic" }])
|
||||
}
|
||||
|
||||
static #onCreateLanguage(event, target) {
|
||||
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("FTLNOMAD.Label.newLanguage"), type: "language" }])
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Handles the roll action triggered by user interaction.
|
||||
*
|
||||
* @param {PointerEvent} event The event object representing the user interaction.
|
||||
* @param {HTMLElement} target The target element that triggered the roll.
|
||||
*
|
||||
* @returns {Promise<void>} A promise that resolves when the roll action is complete.
|
||||
*
|
||||
* @throws {Error} Throws an error if the roll type is not recognized.
|
||||
*
|
||||
* @description This method checks the current mode (edit or not) and determines the type of roll
|
||||
* (save, resource, or damage) based on the target element's data attributes. It retrieves the
|
||||
* corresponding value from the document's system and performs the roll.
|
||||
*/
|
||||
async _onRoll(event, target) {
|
||||
const rollType = $(event.currentTarget).data("roll-type")
|
||||
let item
|
||||
let li
|
||||
switch (rollType) {
|
||||
case "skill":
|
||||
let skillId = $(event.currentTarget).data("skill-id");
|
||||
item = this.actor.system.skills[skillId];
|
||||
break
|
||||
case "weapon":
|
||||
case "damage":
|
||||
li = $(event.currentTarget).parents(".item");
|
||||
item = this.actor.items.get(li.data("item-id"));
|
||||
break
|
||||
default:
|
||||
throw new Error(`Unknown roll type ${rollType}`)
|
||||
}
|
||||
await this.document.system.roll(rollType, item)
|
||||
}
|
||||
|
||||
async _onDrop(event) {
|
||||
if (!this.isEditable || !this.isEditMode) return
|
||||
const data = TextEditor.getDragEventData(event)
|
||||
|
||||
// Handle different data types
|
||||
switch (data.type) {
|
||||
case "Item":
|
||||
const item = await fromUuid(data.uuid)
|
||||
return super._onDropItem(item)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -12,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)
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -33,8 +33,8 @@ export default class FTLNomadVehicleSheet extends FTLNomadActorSheet {
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
tabGroups = {
|
||||
/** @override */
|
||||
tabGroups = {
|
||||
sheet: "equipment",
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -62,11 +62,14 @@ export default class FTLNomadRoll extends Roll {
|
||||
|
||||
static updateFullFormula(options) {
|
||||
let fullFormula
|
||||
if ( options.numericModifier >= 0) {
|
||||
fullFormula = `${options.formula} + ${options.rollItem.value} + ${options.numericModifier}D`
|
||||
if (options.rollType === "damage") {
|
||||
fullFormula = `${options.formula} + ${options.damageModifier}D6 `
|
||||
} else {
|
||||
fullFormula = `${options.formula} + ${options.rollItem.value} - ${Math.abs(options.numericModifier)}D`
|
||||
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, "- ")
|
||||
$('#roll-dialog-full-formula').text(fullFormula)
|
||||
options.fullFormula = fullFormula
|
||||
}
|
||||
@@ -87,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
|
||||
@@ -108,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,
|
||||
@@ -118,26 +118,24 @@ 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.numericModifier = rangeModifier
|
||||
options.skillModifier = 0
|
||||
options.numericModifier = 0
|
||||
options.rangeModifier = rangeModifier
|
||||
options.damageModifier = damageModifier
|
||||
let fullFormula = `${formula} + ${options.rollItem.value}`
|
||||
if (options.isEncumbered) {
|
||||
options.numericModifier += -1
|
||||
fullFormula += ` - ${options.numericModifier}D`
|
||||
} else {
|
||||
options.numericModifier += 0
|
||||
fullFormula += ` + ${options.numericModifier}D`
|
||||
fullFormula += ` - 1D`
|
||||
}
|
||||
options.fullFormula = fullFormula
|
||||
options.formula = formula
|
||||
@@ -155,7 +153,9 @@ export default class FTLNomadRoll extends Roll {
|
||||
fieldRollMode,
|
||||
choiceModifier,
|
||||
choiceRangeModifier,
|
||||
choiceDamageModifier,
|
||||
rangeModifier,
|
||||
damageModifier,
|
||||
formula,
|
||||
hasTarget: options.hasTarget,
|
||||
modifier,
|
||||
@@ -184,19 +184,23 @@ export default class FTLNomadRoll extends Roll {
|
||||
},
|
||||
rejectClose: false, // Click on Close button will not launch an error
|
||||
render: (event, dialog) => {
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
$(".roll-skill-modifier").change(event => {
|
||||
options.numericModifier += Number(event.target.value)
|
||||
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.numericModifier += Number(event.target.value)
|
||||
options.rangeModifier = Number(event.target.value)
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
})
|
||||
$(".select-combat-option").change(event => {
|
||||
console.log(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
|
||||
@@ -216,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()
|
||||
|
||||
@@ -258,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":
|
||||
|
||||
@@ -11,4 +11,4 @@ export { default as FTLNomadImplant } from "./implant.mjs"
|
||||
export { default as FTLNomadStarship } from "./starship.mjs"
|
||||
export { default as FTLNomadCreatureTrait } from "./creature-trait.mjs"
|
||||
export { default as FTLNomadCreatureAbility } from "./creature-ability.mjs"
|
||||
|
||||
export { default as FTLNomadRobot } from "./robot.mjs"
|
||||
|
||||
@@ -35,8 +35,8 @@ export default class FTLNomadProtagonist extends foundry.abstract.TypeDataModel
|
||||
schema.health = new fields.SchemaField({
|
||||
staminaValue: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
|
||||
staminaMax: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
|
||||
wounds: new fields.NumberField({ ...requiredInteger, initial:0, min: 0 }),
|
||||
triageResults: new fields.StringField({ required: true, nullable: false, initial: "none", choices: SYSTEM.TRIAGE_RESULTS })
|
||||
wounds: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
|
||||
triageResults: new fields.StringField({ required: true, nullable: false, initial: "none", choices: SYSTEM.TRIAGE_RESULTS })
|
||||
})
|
||||
|
||||
schema.enc = new fields.SchemaField({
|
||||
@@ -76,18 +76,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
|
||||
}
|
||||
|
||||
@@ -7,11 +7,11 @@ export default class FTLNomadEquipment extends foundry.abstract.TypeDataModel {
|
||||
const requiredInteger = { required: true, nullable: false, integer: true }
|
||||
|
||||
schema.description = new fields.HTMLField({ required: true, textSearch: true })
|
||||
|
||||
|
||||
schema.techAge = new fields.StringField({ required: true, choices: SYSTEM.TECH_AGES, initial : "lateatomic" })
|
||||
|
||||
schema.enc = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
|
||||
schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0 })
|
||||
schema.cost = new fields.NumberField({ required: true, initial: 1, min: 0 })
|
||||
|
||||
return schema
|
||||
}
|
||||
|
||||
96
module/models/robot.mjs
Normal file
96
module/models/robot.mjs
Normal 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 })
|
||||
}
|
||||
}
|
||||
@@ -11,16 +11,17 @@ export default class FTLNomadStarship extends foundry.abstract.TypeDataModel {
|
||||
schema.hullType = new fields.StringField({ required: true, initial: "small", choices: SYSTEM.STARSHIP_HULL })
|
||||
schema.endurance = new fields.StringField({ required: true, initial: "" })
|
||||
schema.armor = new fields.StringField({ required: true, initial: "" })
|
||||
schema.crew = new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 })
|
||||
schema.cargo = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.crew = new fields.StringField({ required: true, initial: "" })
|
||||
schema.cargo = new fields.StringField({ required: true, initial: "" })
|
||||
schema.guns = new fields.StringField({ required: true, initial: "1d6" })
|
||||
schema.travelMultiplier = new fields.NumberField({ required: true, initial: 1, min: 0 })
|
||||
schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0 })
|
||||
schema.monthlyCost = new fields.NumberField({ required: true, initial: 0, min: 0 })
|
||||
schema.travelMultiplier = new fields.StringField({ required: true, initial: "" })
|
||||
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 })
|
||||
schema.modifications = new fields.HTMLField({ required: true, textSearch: true })
|
||||
schema.notes = new fields.HTMLField({ required: true, textSearch: true })
|
||||
|
||||
return schema
|
||||
@@ -32,5 +33,25 @@ export default class FTLNomadStarship extends foundry.abstract.TypeDataModel {
|
||||
isEncumbered() {
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
async roll(rollType, rollItem) {
|
||||
let opponentTarget
|
||||
const hasTarget = opponentTarget !== undefined
|
||||
|
||||
let roll = await FTLNomadRoll.prompt({
|
||||
rollType,
|
||||
rollItem,
|
||||
actorId: this.parent.id,
|
||||
actorName: this.parent.name,
|
||||
actorImage: this.parent.img,
|
||||
isEncumbered: false,
|
||||
hasTarget,
|
||||
target: opponentTarget
|
||||
})
|
||||
if (!roll) return null
|
||||
|
||||
await roll.toMessage({}, { rollMode: roll.options.rollMode })
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -9,17 +9,17 @@ export default class FTLNomadVehicle extends foundry.abstract.TypeDataModel {
|
||||
|
||||
schema.agility = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.armor = new fields.StringField({ required: true, initial: "" })
|
||||
schema.cargo = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.crew = new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 })
|
||||
schema.cargo = new fields.StringField({ required: true, initial: "" })
|
||||
schema.crew = new fields.StringField({ required: true, initial: "" })
|
||||
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.tonnage = new fields.NumberField({ required: true, initial: 1, min: 0 })
|
||||
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
|
||||
|
||||
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 })
|
||||
}
|
||||
|
||||
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 })
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -7,27 +7,27 @@ export default class FTLNomadWeapon extends foundry.abstract.TypeDataModel {
|
||||
const requiredInteger = { required: true, nullable: false, integer: true }
|
||||
|
||||
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 }),
|
||||
dist: new fields.NumberField({ ...requiredInteger, initial: 0 }),
|
||||
})
|
||||
|
||||
schema.enc = new fields.NumberField({ required: true, initial: 0, min: 0 })
|
||||
schema.aspect = new fields.StringField({ required: true, initial: ""})
|
||||
|
||||
schema.enc = new fields.NumberField({ required: true, initial: 1, min: 0 })
|
||||
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 })
|
||||
|
||||
|
||||
return schema
|
||||
}
|
||||
|
||||
|
||||
211
module/utils.mjs
211
module/utils.mjs
@@ -450,6 +450,146 @@ export default class FTLNomadUtils {
|
||||
}
|
||||
}
|
||||
|
||||
static async importStarships() {
|
||||
// Create a starships folder if it doesn't exist
|
||||
const starshipsFolder = game.folders.getName("Starships") || await Folder.create({
|
||||
name: "Starships", type: "Actor"
|
||||
})
|
||||
if (!starshipsFolder) {
|
||||
console.error("Failed to create Starships folder");
|
||||
return;
|
||||
}
|
||||
// Load the starships JSON file
|
||||
const starshipsData = await fetch("systems/fvtt-ftl-nomad/assets/json_data/starships.json")
|
||||
.then(response => response.json())
|
||||
.catch(error => {
|
||||
console.error("Failed to load starships data:", error);
|
||||
return [];
|
||||
});
|
||||
|
||||
// Import each starship
|
||||
for (const starship of starshipsData) {
|
||||
// Check if the starship already exists
|
||||
const existingStarship = game.actors.find(a => a.name === starship.name && a.type === "starship");
|
||||
if (existingStarship) {
|
||||
console.warn(`Starship ${starship.name} already exists, skipping import.`);
|
||||
continue;
|
||||
}
|
||||
// Create the starship actor
|
||||
await Actor.create({
|
||||
name: starship.name,
|
||||
type: "starship",
|
||||
img: "systems/fvtt-ftl-nomad/assets/icons/icon_starship.svg",
|
||||
system: {
|
||||
description: starship.description,
|
||||
agility: starship.agility,
|
||||
hullType: starship.hullType.toLowerCase(),
|
||||
endurance: starship.endurance,
|
||||
armor: starship.armor,
|
||||
crew: starship.crew,
|
||||
cargo: starship.cargo,
|
||||
guns: starship.guns,
|
||||
travelMultiplier: starship.travelMultiplier,
|
||||
cost: starship.cost || 0,
|
||||
monthlyCost: starship.monthlyCost || 0,
|
||||
damages: starship.damages,
|
||||
},
|
||||
folder: starshipsFolder.id
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
static async importVehicles() {
|
||||
// Create a vehicles folder if it doesn't exist
|
||||
const vehiclesFolder = game.folders.getName("Vehicles") || await Folder.create({
|
||||
name: "Vehicles", type: "Actor"
|
||||
})
|
||||
if (!vehiclesFolder) {
|
||||
console.error("Failed to create Vehicles folder");
|
||||
return;
|
||||
}
|
||||
// Load the vehicles JSON file
|
||||
const vehiclesData = await fetch("systems/fvtt-ftl-nomad/assets/json_data/vehicles.json")
|
||||
.then(response => response.json())
|
||||
.catch(error => {
|
||||
console.error("Failed to load vehicles data:", error);
|
||||
return [];
|
||||
});
|
||||
|
||||
// Import each vehicle
|
||||
for (const vehicle of vehiclesData) {
|
||||
// Check if the vehicle already exists
|
||||
const existingVehicle = game.items.find(i => i.name === vehicle.name && i.type === "vehicle");
|
||||
if (existingVehicle) {
|
||||
console.warn(`Vehicle ${vehicle.name} already exists, skipping import.`);
|
||||
continue;
|
||||
}
|
||||
// Create the vehicle item
|
||||
await Actor.create({
|
||||
name: vehicle.name,
|
||||
type: "vehicle",
|
||||
img: "systems/fvtt-ftl-nomad/assets/icons/icon_vehicle.svg",
|
||||
system: {
|
||||
description: vehicle.description,
|
||||
agility: vehicle.agility,
|
||||
armor: vehicle.armor,
|
||||
cargo: vehicle.cargo,
|
||||
crew: vehicle.crew,
|
||||
force: vehicle.force,
|
||||
range: vehicle.range,
|
||||
speed: vehicle.speed,
|
||||
techAge: this.getTechAgeKeyFromLabel(vehicle.tech_age),
|
||||
tonnage: vehicle.tonnage,
|
||||
damages: vehicle.damages,
|
||||
cost: vehicle.cost || 0,
|
||||
},
|
||||
folder: vehiclesFolder.id
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
static async importArmors() {
|
||||
// Create an armors folder if it doesn't exist
|
||||
const armorsFolder = game.folders.getName("Armors") || await Folder.create({
|
||||
name: "Armors", type: "Item"
|
||||
})
|
||||
if (!armorsFolder) {
|
||||
console.error("Failed to create Armors folder");
|
||||
return;
|
||||
}
|
||||
// Load the armors JSON file
|
||||
const armorsData = await fetch("systems/fvtt-ftl-nomad/assets/json_data/armors.json")
|
||||
.then(response => response.json())
|
||||
.catch(error => {
|
||||
console.error("Failed to load armors data:", error);
|
||||
return [];
|
||||
});
|
||||
|
||||
// Import each armor
|
||||
for (const armor of armorsData) {
|
||||
// Check if the armor already exists
|
||||
const existingArmor = game.items.find(i => i.name === armor.name && i.type === "armor");
|
||||
if (existingArmor) {
|
||||
console.warn(`Armor ${armor.name} already exists, skipping import.`);
|
||||
continue;
|
||||
}
|
||||
// Create the armor item
|
||||
await Item.create({
|
||||
name: armor.name,
|
||||
type: "armor",
|
||||
img: "systems/fvtt-ftl-nomad/assets/icons/icon_armor.svg",
|
||||
system: {
|
||||
description: armor.description,
|
||||
enc: armor.enc || 0,
|
||||
techAge: this.getTechAgeKeyFromLabel(armor.tech_age),
|
||||
cost: armor.cost || 0,
|
||||
protection: armor.protection || 0,
|
||||
},
|
||||
folder: armorsFolder.id
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
static async importGrenadeWeapons() {
|
||||
// Create a grenade weapons folder if it doesn't exist
|
||||
const grenadeWeaponsFolder = game.folders.getName("Grenade") || await Folder.create({
|
||||
@@ -496,6 +636,28 @@ export default class FTLNomadUtils {
|
||||
}
|
||||
}
|
||||
|
||||
static async fixWeaponsEnc() {
|
||||
// Iterate over all items of type "weapon" from compendium
|
||||
const weapons = game.items.filter(i => i.type === "weapon");
|
||||
for (const weapon of weapons) {
|
||||
// If the weapon's encumbrance is less than 1, set it to 1
|
||||
if (weapon.system.enc < 1) {
|
||||
await weapon.update({ "system.enc": 1 });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static async fixEquipmentEnc() {
|
||||
// Iterate over all items of type "equipment" from compendium
|
||||
const equipments = game.items.filter(i => i.type === "equipment");
|
||||
for (const equipment of equipments) {
|
||||
// If the equipment's encumbrance is less than 1, set it to
|
||||
if (equipment.system.enc < 1) {
|
||||
await equipment.update({ "system.enc": 1 });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static async importMeleeWeapons() {
|
||||
// Create a melee weapons folder if it doesn't exist
|
||||
const meleeWeaponsFolder = game.folders.getName("Melee Weapons") || await Folder.create({
|
||||
@@ -513,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
|
||||
@@ -543,4 +705,51 @@ export default class FTLNomadUtils {
|
||||
}
|
||||
}
|
||||
|
||||
static async importVehicleWeapons() {
|
||||
// Create a melee weapons folder if it doesn't exist
|
||||
const meleeWeaponsFolder = game.folders.getName("Vehicle Weapons") || await Folder.create({
|
||||
name: "Vehicle Weapons", type: "Item"
|
||||
})
|
||||
if (!meleeWeaponsFolder) {
|
||||
console.error("Failed to create Vehicle Weapons folder");
|
||||
return;
|
||||
}
|
||||
// Load the melee weapons JSON file
|
||||
const meleeWeaponsData = await fetch("systems/fvtt-ftl-nomad/assets/json_data/vehicleweapons.json")
|
||||
.then(response => response.json())
|
||||
.catch(error => {
|
||||
console.error("Failed to load vehicle weapons data:", error);
|
||||
return [];
|
||||
});
|
||||
|
||||
console.log("vehicle Weapons Data", meleeWeaponsData);
|
||||
// Import each melee weapon
|
||||
for (const weapon of meleeWeaponsData) {
|
||||
// Check if the weapon already exists
|
||||
const existingWeapon = game.items.find(i => i.name === weapon.name && i.type === "weapon");
|
||||
if (existingWeapon) {
|
||||
console.warn(`Weapon ${weapon.name} already exists, skipping import.`);
|
||||
}
|
||||
// Create the weapon item
|
||||
await Item.create({
|
||||
name: weapon.name,
|
||||
type: "weapon",
|
||||
img: "systems/fvtt-ftl-nomad/assets/icons/icon_weapon.svg",
|
||||
system: {
|
||||
description: weapon.description,
|
||||
damage: weapon.damage,
|
||||
techAge: this.getTechAgeKeyFromLabel(weapon.tech_age),
|
||||
weaponType: "vehicle", //SYSTEM.WEAPON_TYPES.melee.id,
|
||||
rangeType: SYSTEM.WEAPON_RANGE.melee.id,
|
||||
enc: 0,
|
||||
aspect: weapon.aspects,
|
||||
cost: weapon.cost || 0,
|
||||
ammoCost: weapon.ammo_cost || 0,
|
||||
magazine: weapon.mag || 1,
|
||||
},
|
||||
folder: meleeWeaponsFolder.id
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Binary file not shown.
BIN
packs/ftl-nomad-items/000090.ldb
Normal file
BIN
packs/ftl-nomad-items/000090.ldb
Normal file
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000002
|
||||
MANIFEST-000099
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
2025/06/26-21:12:26.487732 7f9f357fa6c0 Delete type=3 #1
|
||||
2025/06/26-22:19:51.043093 7f9c97bff6c0 Level-0 table #5: started
|
||||
2025/06/26-22:19:51.049108 7f9c97bff6c0 Level-0 table #5: 99957 bytes OK
|
||||
2025/06/26-22:19:51.055551 7f9c97bff6c0 Delete type=0 #3
|
||||
2025/06/26-22:19:51.070209 7f9c97bff6c0 Manual compaction at level-0 from '!folders!AuBtSOj1mJmh88qx' @ 72057594037927935 : 1 .. '!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)
|
||||
|
||||
7
packs/ftl-nomad-items/LOG.old
Normal file
7
packs/ftl-nomad-items/LOG.old
Normal file
@@ -0,0 +1,7 @@
|
||||
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.
BIN
packs/ftl-nomad-items/MANIFEST-000099
Normal file
BIN
packs/ftl-nomad-items/MANIFEST-000099
Normal file
Binary file not shown.
0
packs/ftl-nomad-items/lost/000042.log
Normal file
0
packs/ftl-nomad-items/lost/000042.log
Normal file
0
packs/ftl-nomad-items/lost/000065.log
Normal file
0
packs/ftl-nomad-items/lost/000065.log
Normal file
BIN
packs/ftl-nomad-vehicles/000068.ldb
Normal file
BIN
packs/ftl-nomad-vehicles/000068.ldb
Normal file
Binary file not shown.
0
packs/ftl-nomad-vehicles/000079.log
Normal file
0
packs/ftl-nomad-vehicles/000079.log
Normal file
1
packs/ftl-nomad-vehicles/CURRENT
Normal file
1
packs/ftl-nomad-vehicles/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000077
|
||||
0
packs/ftl-nomad-vehicles/LOCK
Normal file
0
packs/ftl-nomad-vehicles/LOCK
Normal file
7
packs/ftl-nomad-vehicles/LOG
Normal file
7
packs/ftl-nomad-vehicles/LOG
Normal file
@@ -0,0 +1,7 @@
|
||||
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)
|
||||
7
packs/ftl-nomad-vehicles/LOG.old
Normal file
7
packs/ftl-nomad-vehicles/LOG.old
Normal file
@@ -0,0 +1,7 @@
|
||||
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)
|
||||
BIN
packs/ftl-nomad-vehicles/MANIFEST-000077
Normal file
BIN
packs/ftl-nomad-vehicles/MANIFEST-000077
Normal file
Binary file not shown.
0
packs/ftl-nomad-vehicles/lost/000020.log
Normal file
0
packs/ftl-nomad-vehicles/lost/000020.log
Normal file
0
packs/ftl-nomad-vehicles/lost/000043.log
Normal file
0
packs/ftl-nomad-vehicles/lost/000043.log
Normal file
@@ -19,6 +19,7 @@
|
||||
|
||||
.character-left {
|
||||
min-width: 180px;
|
||||
max-width: 180px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
@@ -43,6 +44,19 @@
|
||||
margin-left: 2px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
.form-group {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
margin-bottom: 4px;
|
||||
|
||||
label {
|
||||
font-weight: bold;
|
||||
margin-right: 4px;
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
}
|
||||
}
|
||||
.hp-separator {
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
display: flex;
|
||||
@@ -76,18 +90,62 @@
|
||||
gap: 5px;
|
||||
|
||||
.character-spec {
|
||||
label {
|
||||
max-width: 6rem;
|
||||
.form-group {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
margin-bottom: 4px;
|
||||
|
||||
label {
|
||||
font-weight: bold;
|
||||
margin-right: 4px;
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
}
|
||||
input {
|
||||
min-width: 20rem;
|
||||
max-width: 20rem;
|
||||
}
|
||||
}
|
||||
.hero-armor {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 4px;
|
||||
label {
|
||||
min-width: 6rem;
|
||||
max-width: 6rem;
|
||||
}
|
||||
input {
|
||||
max-width: 3rem;
|
||||
}
|
||||
max-width: 5.2rem;
|
||||
min-width: 5.2rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.encumbrance {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
.form-group {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
label {
|
||||
min-width: 3rem;
|
||||
max-width: 3rem;
|
||||
}
|
||||
input {
|
||||
max-width: 3rem;
|
||||
min-width: 3rem;
|
||||
}
|
||||
.character-credit {
|
||||
input {
|
||||
max-width: 9rem;
|
||||
min-width: 9rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.character-name {
|
||||
display: flex;
|
||||
input {
|
||||
@@ -165,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;
|
||||
@@ -190,8 +248,22 @@
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 8px;
|
||||
label {
|
||||
min-width: 12rem;
|
||||
.form-group {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
margin-bottom: 4px;
|
||||
|
||||
label {
|
||||
font-weight: bold;
|
||||
margin-right: 4px;
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
input {
|
||||
min-width: 18rem;
|
||||
max-width: 18rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -222,7 +294,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
.tab.character-skills {
|
||||
.tab.character-skills .main-div {
|
||||
background-color: var(--color-light-1);
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
@@ -270,7 +342,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
.tab.character-status {
|
||||
.tab.character-status .main-div {
|
||||
background-color: var(--color-light-1);
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
@@ -402,7 +474,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
.tab.character-talents {
|
||||
.tab.character-talents .main-div {
|
||||
background-color: var(--color-light-1);
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
@@ -520,10 +592,9 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.tab.character-equipment {
|
||||
.tab.character-equipment .main-div {
|
||||
background-color: var(--color-light-1);
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
@@ -582,7 +653,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.weapons {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
@@ -618,7 +688,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.armors {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
.creature-left {
|
||||
min-width: 180px;
|
||||
max-width: 180px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
@@ -37,11 +38,15 @@
|
||||
.creature-hp {
|
||||
gap: 2px;
|
||||
align-items: center;
|
||||
input {
|
||||
flex: none;
|
||||
width: 2.5rem;
|
||||
margin-left: 2px;
|
||||
label {
|
||||
font-weight: bold;
|
||||
margin-right: 4px;
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
}
|
||||
input {
|
||||
max-width: 3rem;
|
||||
min-width: 3rem;
|
||||
}
|
||||
.hp-separator {
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
@@ -81,6 +86,7 @@
|
||||
}
|
||||
select {
|
||||
max-width: 10rem;
|
||||
min-width: 10rem;
|
||||
}
|
||||
input {
|
||||
max-width: 6rem;
|
||||
@@ -94,7 +100,7 @@
|
||||
cursor: pointer;
|
||||
}
|
||||
.rollable {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.creature-name {
|
||||
@@ -195,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);
|
||||
@@ -231,7 +247,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
.tab.creature-skills {
|
||||
.tab.creature-skills .main-div {
|
||||
background-color: var(--color-light-1);
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
@@ -279,7 +295,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
.tab.creature-status {
|
||||
.tab.creature-status .main-div {
|
||||
background-color: var(--color-light-1);
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
@@ -411,7 +427,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
.tab.creature-traits {
|
||||
.tab.creature-traits .main-div {
|
||||
background-color: var(--color-light-1);
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
@@ -529,10 +545,9 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.tab.creature-equipment {
|
||||
.tab.creature-equipment .main-div {
|
||||
background-color: var(--color-light-1);
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
@@ -591,7 +606,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.weapons {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
@@ -627,7 +641,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.armors {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
@import "mixins.less";
|
||||
@import "character.less";
|
||||
@import "vehicle.less";
|
||||
@import "robot.less";
|
||||
@import "starship.less";
|
||||
@import "creature.less";
|
||||
@import "weapon.less";
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
color: var(--color-dark-1);
|
||||
background-image: var(--background-image-base);
|
||||
background-color: var(--color-light-1);
|
||||
/*background-image: var(--background-image-base);*/
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
|
||||
@@ -67,6 +68,59 @@
|
||||
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: 4rem;
|
||||
max-width: 4rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.starship-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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.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 {
|
||||
@@ -74,6 +128,19 @@
|
||||
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: 12rem;
|
||||
max-width: 12rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.item-sheet-common {
|
||||
|
||||
339
styles/robot.less
Normal file
339
styles/robot.less
Normal file
@@ -0,0 +1,339 @@
|
||||
.robot-content {
|
||||
.sheet-common();
|
||||
.robot-sheet-common();
|
||||
overflow: scroll;
|
||||
}
|
||||
|
||||
.sheet-tabs {
|
||||
background-color: var(--color-light-1);
|
||||
}
|
||||
|
||||
.robot-main {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
|
||||
.robot-pc {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
flex: 1;
|
||||
|
||||
.robot-left {
|
||||
min-width: 180px;
|
||||
max-width: 180px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.robot-left-image {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding-bottom: 8px;
|
||||
.robot-img {
|
||||
height: 140px;
|
||||
width: auto;
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
|
||||
.robot-cost {
|
||||
label {
|
||||
min-width: 3rem;
|
||||
max-width: 3rem;
|
||||
}
|
||||
input {
|
||||
min-width: 6rem;
|
||||
max-width: 6rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.robot-right {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
|
||||
.robot-name {
|
||||
display: flex;
|
||||
input {
|
||||
font-family: var(--font-title);
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
width: 380px;
|
||||
}
|
||||
}
|
||||
|
||||
.robot-brain {
|
||||
min-width: 25rem;
|
||||
max-width: 25rem;
|
||||
textarea {
|
||||
min-width: 23rem;
|
||||
max-width: 23rem;
|
||||
background-color: rgba(0, 0, 0, 0.2);
|
||||
color: var(--color-dark-3);
|
||||
}
|
||||
}
|
||||
|
||||
.main-stats {
|
||||
min-width: 25rem;
|
||||
max-width: 25rem;
|
||||
.encumbered {
|
||||
color: red;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
.cargo,
|
||||
.capacity {
|
||||
label {
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
}
|
||||
input {
|
||||
max-width: 6rem;
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
.cargo-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
.robot-infos {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
|
||||
label {
|
||||
min-width: 120px;
|
||||
}
|
||||
|
||||
.robot-hp {
|
||||
display: flex;
|
||||
gap: 2px;
|
||||
align-items: center;
|
||||
.robot-hp-value {
|
||||
.form-fields input {
|
||||
flex: none;
|
||||
width: 50px;
|
||||
margin-left: 4px;
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
}
|
||||
}
|
||||
.robot-hp-max {
|
||||
clear: both;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
margin: 3px 0;
|
||||
align-items: center;
|
||||
input {
|
||||
width: 50px;
|
||||
text-align: center;
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
}
|
||||
}
|
||||
.hp-separator {
|
||||
font-size: calc(var(--font-size-standard) * 1.2);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.robot-skills {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
.starship-content {
|
||||
.sheet-common();
|
||||
.character-sheet-common();
|
||||
.starship-sheet-common();
|
||||
overflow: scroll;
|
||||
}
|
||||
|
||||
@@ -36,13 +36,12 @@
|
||||
|
||||
.spec {
|
||||
label {
|
||||
max-width: 5rem;
|
||||
max-width: 4rem;
|
||||
}
|
||||
input {
|
||||
max-width: 3rem;
|
||||
max-width: 4rem;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.starship-right {
|
||||
@@ -69,12 +68,30 @@
|
||||
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: 10rem;
|
||||
max-width: 7rem;
|
||||
min-width: 7rem;
|
||||
}
|
||||
.flexrow-guns {
|
||||
display: flex;
|
||||
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: 4rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
select {
|
||||
max-width: 5rem;
|
||||
@@ -83,18 +100,17 @@
|
||||
.cargo {
|
||||
label {
|
||||
margin-left: 0.2rem;
|
||||
max-width: 10rem;
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
}
|
||||
input {
|
||||
max-width: 4rem;
|
||||
max-width: 6rem;
|
||||
}
|
||||
select {
|
||||
max-width: 5rem;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
.starship-infos {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -161,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 {
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.vehicle-right {
|
||||
@@ -53,12 +52,18 @@
|
||||
.cargo,
|
||||
.capacity {
|
||||
label {
|
||||
max-width: 5rem;
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
}
|
||||
input {
|
||||
max-width: 3.5rem;
|
||||
max-width: 6rem;
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
.cargo-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
.vehicle-infos {
|
||||
@@ -81,7 +86,7 @@
|
||||
margin-left: 4px;
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
}
|
||||
}
|
||||
}
|
||||
.vehicle-hp-max {
|
||||
clear: both;
|
||||
display: flex;
|
||||
@@ -116,6 +121,10 @@
|
||||
}
|
||||
|
||||
.vehicle-description {
|
||||
.text-center {
|
||||
text-align: left;
|
||||
align-content: center;
|
||||
}
|
||||
background-color: var(--color-light-1);
|
||||
prose-mirror.inactive {
|
||||
min-height: 40px;
|
||||
@@ -126,27 +135,35 @@
|
||||
.field-label {
|
||||
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 {
|
||||
.tab.vehicle-equipment .main-div {
|
||||
background-color: var(--color-light-1);
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
@@ -190,7 +207,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.equipments {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
|
||||
19
system.json
19
system.json
@@ -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"] },
|
||||
@@ -53,7 +54,7 @@
|
||||
},
|
||||
"packs": [
|
||||
{
|
||||
"label": "FTL Nomad",
|
||||
"label": "FTL Nomad - Items",
|
||||
"type": "Item",
|
||||
"name": "ftl-nomad-items",
|
||||
"path": "packs/ftl-nomad-items",
|
||||
@@ -63,6 +64,18 @@
|
||||
"PLAYER": "NONE",
|
||||
"ASSISTANT": "OWNER"
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "FTL Nomad - Vehicles",
|
||||
"type": "Actor",
|
||||
"name": "ftl-nomad-vehicles",
|
||||
"path": "packs/ftl-nomad-vehicles",
|
||||
"system": "fvtt-ftl-nomad",
|
||||
"flags": {},
|
||||
"ownership": {
|
||||
"PLAYER": "NONE",
|
||||
"ASSISTANT": "OWNER"
|
||||
}
|
||||
}
|
||||
],
|
||||
"grid": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
|
||||
|
||||
<fieldset class="rank">
|
||||
<div class="main-div">
|
||||
<fieldset class="rank">
|
||||
<legend>Rank</legend>
|
||||
{{formField systemFields.rank.fields.experienced value=system.rank.experienced type="number" rootId=partId disabled=isPlayMode}}
|
||||
{{formField systemFields.rank.fields.expert value=system.rank.expert type="number" rootId=partId disabled=isPlayMode}}
|
||||
@@ -23,12 +23,12 @@
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.description"}}</legend>
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
|
||||
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true class="character-description"}}
|
||||
</fieldset>
|
||||
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.notes"}}</legend>
|
||||
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}}
|
||||
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true class="character-notes"}}
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
@@ -1,14 +1,5 @@
|
||||
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
|
||||
|
||||
<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>
|
||||
<div class="main-div">
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.weapons"}}{{#if isEditMode}}
|
||||
@@ -76,12 +67,10 @@
|
||||
<div class="implant 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}}" />
|
||||
<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
|
||||
<div class="name" data-roll-type="weapon" data-tooltip="{{{item.system.description}}}">
|
||||
{{item.name}}
|
||||
</div>
|
||||
|
||||
<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
|
||||
<a class="damage rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage"
|
||||
data-roll-value="{{item.system.damage}}">
|
||||
{{#if item.system.isAdvantage}}
|
||||
@@ -122,5 +111,5 @@
|
||||
{{/each}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
@@ -1,99 +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}}
|
||||
<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.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
|
||||
}}
|
||||
</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
|
||||
}}
|
||||
<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>
|
||||
@@ -1,5 +1,5 @@
|
||||
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
|
||||
|
||||
<div class="main-div">
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.talents"}}{{#if isEditMode}}
|
||||
<a class="action" data-tooltip="{{localize "FTLNOMAD.Tooltip.addTalent"}}" data-tooltip-direction="UP"><i
|
||||
@@ -11,12 +11,10 @@
|
||||
<div class="talent 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}}" />
|
||||
<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
|
||||
<div class="name" data-roll-type="weapon" data-tooltip="{{{item.system.description}}}">
|
||||
{{item.name}}
|
||||
</div>
|
||||
|
||||
<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
|
||||
<a class="damage rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage"
|
||||
data-roll-value="{{item.system.damage}}">
|
||||
{{#if item.system.isAdvantage}}
|
||||
@@ -45,12 +43,10 @@
|
||||
<div class="psionic 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}}" />
|
||||
<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
|
||||
<div class="name" data-roll-type="weapon" data-tooltip="{{{item.system.description}}}">
|
||||
{{item.name}}
|
||||
</div>
|
||||
|
||||
<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
|
||||
<a class="damage rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage"
|
||||
data-roll-value="{{item.system.damage}}">
|
||||
{{#if item.system.isAdvantage}}
|
||||
@@ -79,12 +75,10 @@
|
||||
<div class="language 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}}" />
|
||||
<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
|
||||
<div class="name" data-roll-type="weapon" data-tooltip="{{{item.system.description}}}">
|
||||
{{item.name}}
|
||||
</div>
|
||||
|
||||
<img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />
|
||||
<a class="damage rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage"
|
||||
data-roll-value="{{item.system.damage}}">
|
||||
{{#if item.system.isAdvantage}}
|
||||
@@ -101,6 +95,6 @@
|
||||
{{/each}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
|
||||
</section>
|
||||
@@ -8,50 +8,67 @@
|
||||
<ul>
|
||||
|
||||
{{#if (eq rollType "skill")}}
|
||||
<li><strong>{{localize "FTLNOMAD.Label.skillRoll"}}</strong></li>
|
||||
<li><strong>{{localize "FTLNOMAD.Label.skillRoll"}}</strong></li>
|
||||
{{/if}}
|
||||
|
||||
|
||||
{{#if weapon}}
|
||||
<li><strong>Weapon : {{weapon.name}}</strong></li>
|
||||
{{#if (eq rollType "damage")}}
|
||||
<li class="result-success">Weapon Damage</li>
|
||||
<li><strong>{{weapon.name}}</strong></li>
|
||||
{{else}}
|
||||
{{#if weapon}}
|
||||
<li><strong>Weapon : {{weapon.name}}</strong></li>
|
||||
<li><strong>Aspects : {{weapon.system.aspect}}</strong></li>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
|
||||
<li><strong>{{localize rollItem.label}} : {{fullFormula}}</strong></li>
|
||||
|
||||
{{#if isEncumbered}}
|
||||
<li class="red-warning">Encumbered : -1D</li>
|
||||
{{#if (eq rollType "damage")}}{{else}}
|
||||
{{#if isEncumbered}}
|
||||
<li class="red-warning">Encumbered : -1D</li>
|
||||
{{/if}}
|
||||
<li>{{localize "FTLNOMAD.Label.modifier"}}
|
||||
:
|
||||
{{skillModifier}}D
|
||||
{{rangeModifier}}D
|
||||
{{numericModifier}}D</li>
|
||||
{{/if}}
|
||||
|
||||
<li>{{localize "FTLNOMAD.Label.modifier"}} : {{numericModifier}}D</li>
|
||||
|
||||
{{#if isSuccess}}
|
||||
<li class="result-success">
|
||||
{{localize "FTLNOMAD.Label.success"}}
|
||||
</li>
|
||||
{{#if (eq rollType "damage")}}{{else}}
|
||||
{{#if isSuccess}}
|
||||
<li class="result-success">
|
||||
{{localize "FTLNOMAD.Label.success"}}
|
||||
</li>
|
||||
{{/if}}
|
||||
|
||||
{{#if isFailure}}
|
||||
<li class="result-failure">
|
||||
{{localize "FTLNOMAD.Label.failure"}}
|
||||
</li>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
{{#if isFailure}}
|
||||
<li class="result-failure">
|
||||
{{localize "FTLNOMAD.Label.failure"}}
|
||||
</li>
|
||||
{{/if}}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{#if isDamage}}
|
||||
<div>
|
||||
{{#if (and isGM hasTarget)}}
|
||||
{{{localize "FTLNOMAD.Roll.displayArmor" targetName=targetName targetArmor=targetArmor
|
||||
realDamage=realDamage}}}
|
||||
{{/if}}
|
||||
</div>
|
||||
<div>
|
||||
{{#if (and isGM hasTarget)}}
|
||||
{{{localize
|
||||
"FTLNOMAD.Roll.displayArmor"
|
||||
targetName=targetName
|
||||
targetArmor=targetArmor
|
||||
realDamage=realDamage
|
||||
}}}
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
{{#unless isPrivate}}
|
||||
<div class="dice-result">
|
||||
<h4 class="dice-total">{{total}}</h4>
|
||||
<div class="dice-formula">{{formula}}</div>
|
||||
{{{tooltip}}}
|
||||
</div>
|
||||
<div class="dice-result">
|
||||
<h4 class="dice-total">{{total}}</h4>
|
||||
<div class="dice-formula">{{formula}}</div>
|
||||
{{{tooltip}}}
|
||||
</div>
|
||||
{{/unless}}
|
||||
</div>
|
||||
@@ -1,14 +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">
|
||||
|
||||
<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 class="section-editor">
|
||||
<legend>{{localize "FTLNOMAD.Label.notes"}}</legend>
|
||||
{{formInput
|
||||
systemFields.notes
|
||||
enriched=enrichedNotes
|
||||
value=system.notes
|
||||
name="system.notes"
|
||||
toggled=true
|
||||
}}
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.notes"}}</legend>
|
||||
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}}
|
||||
</fieldset>
|
||||
</section>
|
||||
@@ -8,11 +8,14 @@
|
||||
<img class="creature-img" src="{{actor.img}}" data-edit="img" data-action="editImage"
|
||||
data-tooltip="{{actor.name}}" />
|
||||
</div>
|
||||
|
||||
<fieldset class="creature-hp">
|
||||
<legend>{{localize "FTLNOMAD.Label.Stamina"}}</legend>
|
||||
<div class="flexrow">
|
||||
Curr. {{formField systemFields.health.fields.staminaValue value=system.health.staminaValue}}
|
||||
Max {{formField systemFields.health.fields.staminaMax value=system.health.staminaMax rootId=partId}}
|
||||
{{formField systemFields.health.fields.staminaValue value=system.health.staminaValue}}
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.health.fields.staminaMax value=system.health.staminaMax rootId=partId}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<section class="tab creature-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
|
||||
|
||||
<div class="main-div">
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.traits"}}{{#if isEditMode}}
|
||||
<a class="action" data-tooltip="{{localize "FTLNOMAD.Tooltip.addTrait"}}" data-tooltip-direction="UP"><i
|
||||
@@ -46,5 +46,5 @@
|
||||
{{/each}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
53
templates/robot-description.hbs
Normal file
53
templates/robot-description.hbs
Normal file
@@ -0,0 +1,53 @@
|
||||
<section
|
||||
class="tab robot-{{tab.id}} {{tab.cssClass}}"
|
||||
data-tab="{{tab.id}}"
|
||||
data-group="{{tab.group}}"
|
||||
>
|
||||
<fieldset>
|
||||
<legend>Tech Age</legend>
|
||||
<div class="flexrow">
|
||||
{{formField
|
||||
systemFields.techAge
|
||||
value=system.techAge
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<!-- <fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.damages"}}</legend>
|
||||
<div class="text-center">
|
||||
<textarea
|
||||
class="form-control"
|
||||
cols="64"
|
||||
rows="5"
|
||||
name="system.damages"
|
||||
data-tooltip="{{localize 'FTLNOMAD.Tooltip.damages'}}"
|
||||
>{{system.damages}}</textarea>
|
||||
</div>
|
||||
</fieldset> -->
|
||||
|
||||
<fieldset class="section-editor">
|
||||
<legend>{{localize "FTLNOMAD.Label.description"}}</legend>
|
||||
{{formInput
|
||||
systemFields.description
|
||||
enriched=enrichedDescription
|
||||
value=system.description
|
||||
name="system.description"
|
||||
toggled=true
|
||||
}}
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="section-editor">
|
||||
<legend>{{localize "FTLNOMAD.Label.notes"}}</legend>
|
||||
{{formInput
|
||||
systemFields.notes
|
||||
enriched=enrichedNotes
|
||||
value=system.notes
|
||||
name="system.notes"
|
||||
toggled=true
|
||||
}}
|
||||
</fieldset>
|
||||
|
||||
</section>
|
||||
107
templates/robot-equipment.hbs
Normal file
107
templates/robot-equipment.hbs
Normal 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
258
templates/robot-main.hbs
Normal file
@@ -0,0 +1,258 @@
|
||||
<section class="robot-main robot-main-{{ifThen isPlayMode 'play' 'edit'}}">
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.robot"}}</legend>
|
||||
<div class="robot-pc robot-pc-{{ifThen isPlayMode 'play' 'edit'}}">
|
||||
|
||||
<div class="robot-left">
|
||||
<div class="robot-left-image">
|
||||
<img
|
||||
class="robot-img"
|
||||
src="{{actor.img}}"
|
||||
data-edit="img"
|
||||
data-action="editImage"
|
||||
data-tooltip="{{actor.name}}"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<fieldset class="robot-cost">
|
||||
<legend>Cost</legend>
|
||||
<div class="flexrow">
|
||||
{{formField
|
||||
systemFields.cost
|
||||
value=system.cost
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="robot-right">
|
||||
<div class="robot-name">
|
||||
{{formInput
|
||||
fields.name
|
||||
value=source.name
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
<a
|
||||
class="control"
|
||||
data-action="toggleSheet"
|
||||
data-tooltip="FTLNOMAD.ToggleSheet"
|
||||
data-tooltip-direction="UP"
|
||||
>
|
||||
<i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<fieldset class="main-stats">
|
||||
<legend>{{localize "FTLNOMAD.Label.mainStats"}}</legend>
|
||||
<div class="flexrow">
|
||||
{{formField
|
||||
systemFields.robotSize
|
||||
value=system.robotSize
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.protection
|
||||
value=system.protection
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
{{formField
|
||||
systemFields.speed
|
||||
value=system.speed
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.durability
|
||||
value=system.durability
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
{{#if isEncumbered}}
|
||||
{{formField
|
||||
systemFields.enc.fields.value
|
||||
value=system.enc.value
|
||||
rootId=partId
|
||||
disabled=true
|
||||
classes="encumbered"
|
||||
}}
|
||||
{{else}}
|
||||
{{formField
|
||||
systemFields.enc.fields.value
|
||||
value=system.enc.value
|
||||
rootId=partId
|
||||
disabled=true
|
||||
}}
|
||||
{{/if}}
|
||||
|
||||
{{formField
|
||||
systemFields.enc.fields.max
|
||||
value=system.enc.max
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="robot-brain">
|
||||
<legend>Brain</legend>
|
||||
<div class="flexrow">
|
||||
<textarea
|
||||
cols="64"
|
||||
rows="2"
|
||||
name="system.brain"
|
||||
data-tooltip="{{localize 'FTLNOMAD.Tooltip.brain'}}"
|
||||
{{#if isPlayMode}}disabled{{/if}}>{{system.brain}}</textarea>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
|
||||
<fieldset
|
||||
class="robot-skills robot-skills-{{ifThen isPlayMode 'play' 'edit'}}"
|
||||
>
|
||||
<legend>{{localize "FTLNOMAD.Label.skills"}}</legend>
|
||||
<div class="robot-skill">
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_combat.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="combat"
|
||||
>{{localize "FTLNOMAD.Label.combat"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.combat.fields.value
|
||||
value=system.skills.combat.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="robot-skill">
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_knowledge.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="knowledge"
|
||||
>{{localize "FTLNOMAD.Label.knowledge"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.knowledge.fields.value
|
||||
value=system.skills.knowledge.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="robot-skill">
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_social.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="social"
|
||||
>{{localize "FTLNOMAD.Label.social"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.social.fields.value
|
||||
value=system.skills.social.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="robot-skill">
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_physical.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="physical"
|
||||
>{{localize "FTLNOMAD.Label.physical"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.physical.fields.value
|
||||
value=system.skills.physical.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="robot-skill">
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_stealth.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="stealth"
|
||||
>{{localize "FTLNOMAD.Label.stealth"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.stealth.fields.value
|
||||
value=system.skills.stealth.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="robot-skill">
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_vehicles.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="vehicles"
|
||||
>{{localize "FTLNOMAD.Label.vehicles"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.vehicles.fields.value
|
||||
value=system.skills.vehicles.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
<div class="robot-skill">
|
||||
<img
|
||||
src="systems/fvtt-ftl-nomad/assets/icons/icon_technology.svg"
|
||||
class="icon-skill"
|
||||
/>
|
||||
<label
|
||||
class="rollable"
|
||||
data-roll-type="skill"
|
||||
data-skill-id="technology"
|
||||
>{{localize "FTLNOMAD.Label.technology"}}</label>
|
||||
{{formInput
|
||||
systemFields.skills.fields.technology.fields.value
|
||||
value=system.skills.technology.value
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
type="number"
|
||||
}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
</section>
|
||||
@@ -1,44 +1,108 @@
|
||||
<div class="fvtt-ftl-nomad-roll-dialog">
|
||||
|
||||
|
||||
<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,13 +110,16 @@
|
||||
|
||||
<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>
|
||||
<legend>{{localize "FTLNOMAD.Label.rollView"}}</legend>
|
||||
<select name="visibility">
|
||||
{{selectOptions rollModes selected=visibility}}
|
||||
{{selectOptions rollModes localize=true selected=visibility}}
|
||||
</select>
|
||||
</fieldSet>
|
||||
|
||||
|
||||
@@ -1,24 +1,78 @@
|
||||
<section class="tab starship-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
|
||||
<section
|
||||
class="tab starship-{{tab.id}} {{tab.cssClass}}"
|
||||
data-tab="{{tab.id}}"
|
||||
data-group="{{tab.group}}"
|
||||
>
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.techAge"}}</legend>
|
||||
<div class="flexrow">
|
||||
{{formField
|
||||
systemFields.techAge
|
||||
value=system.techAge
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.cost
|
||||
value=system.cost
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.monthlyCost
|
||||
value=system.monthlyCost
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.damages"}}</legend>
|
||||
<textarea class="form-control" 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>
|
||||
108
templates/starship-equipment.hbs
Normal file
108
templates/starship-equipment.hbs
Normal 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>
|
||||
@@ -1,53 +1,112 @@
|
||||
<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}}
|
||||
<div class="flexrow rollable" data-roll-type="starship-guns">
|
||||
<i class="fa-regular fa-dice dice-2d6"></i>
|
||||
{{formField systemFields.guns value=system.guns localize=true}}
|
||||
</div>
|
||||
<div class="flexrow hull-field">
|
||||
{{formField
|
||||
systemFields.hullType
|
||||
value=system.hullType
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.cost value=system.cost localize=true}}
|
||||
{{formField systemFields.monthlyCost value=system.monthlyCost localize=true}}
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.travelMultiplier value=system.travelMultiplier 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>
|
||||
|
||||
<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>
|
||||
|
||||
|
||||
@@ -1,19 +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.techAge"}}</legend>
|
||||
<div class="flexrow">
|
||||
{{formField
|
||||
systemFields.techAge
|
||||
value=system.techAge
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.cost
|
||||
value=system.cost
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.monthlyCost
|
||||
value=system.monthlyCost
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.damages"}}</legend>
|
||||
<textarea class="form-control" rows="5" name="system.damages"
|
||||
data-tooltip="{{localize "FTLNOMAD.Tooltip.damages"}}">{{system.damages}}</textarea>
|
||||
<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}}
|
||||
{{formInput
|
||||
systemFields.description
|
||||
enriched=enrichedDescription
|
||||
value=system.description
|
||||
name="system.description"
|
||||
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>
|
||||
@@ -1,54 +1,107 @@
|
||||
<section class="tab vehicle-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
|
||||
|
||||
<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>
|
||||
|
||||
</fieldset>
|
||||
</div>
|
||||
</section>
|
||||
@@ -5,45 +5,99 @@
|
||||
<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>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="vehicle-right">
|
||||
<div class="vehicle-name">
|
||||
{{formInput fields.name value=source.name rootId=partId disabled=isPlayMode}}
|
||||
<a class="control" data-action="toggleSheet" data-tooltip="FTLNOMAD.ToggleSheet"
|
||||
data-tooltip-direction="UP">
|
||||
{{formInput
|
||||
fields.name
|
||||
value=source.name
|
||||
rootId=partId
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
<a
|
||||
class="control"
|
||||
data-action="toggleSheet"
|
||||
data-tooltip="FTLNOMAD.ToggleSheet"
|
||||
data-tooltip-direction="UP"
|
||||
>
|
||||
<i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<fieldset class="capacity ">
|
||||
<fieldset class="capacity">
|
||||
<legend>{{localize "FTLNOMAD.Label.capacity"}}</legend>
|
||||
<div class="flexrow">
|
||||
{{formField systemFields.armor value=system.armor localize=true}}
|
||||
{{formField systemFields.force value=system.force localize=true}}
|
||||
{{formField
|
||||
systemFields.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="flexrow">
|
||||
{{formField systemFields.crew value=system.crew localize=true}}
|
||||
{{formField systemFields.cargo value=system.cargo localize=true}}
|
||||
{{formField systemFields.tonnage value=system.tonnage localize=true}}
|
||||
<div class="cargo-content">
|
||||
{{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>
|
||||
|
||||
|
||||
@@ -13,7 +13,12 @@
|
||||
{{formField systemFields.damage value=system.damage}}
|
||||
{{formField systemFields.enc value=system.enc}}
|
||||
|
||||
{{formField systemFields.cost value=system.cost}}
|
||||
{{formField cost value=system.cost}}
|
||||
{{#if (eq system.weaponType "vehicle")}}
|
||||
{{formField systemFields.ammoCost value=system.ammoCost}}
|
||||
{{formField systemFields.magazine value=system.magazine}}
|
||||
{{/if}}
|
||||
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
|
||||
Reference in New Issue
Block a user