Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 27b09d4546 | |||
| c180365a61 | |||
| ace607d05c | |||
| 8a5d1cc1d8 | |||
| 99d9cb435f |
@@ -1155,6 +1155,65 @@ i.fvtt-ftl-nomad {
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
padding-left: 5px;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-list {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 8px;
|
||||
padding: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 4px;
|
||||
border: 1px solid var(--color-border-dark);
|
||||
border-radius: 4px;
|
||||
background: var(--color-light-2);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .crew-img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 50%;
|
||||
border: 1px solid var(--color-border-dark);
|
||||
cursor: pointer;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .crew-img:hover {
|
||||
opacity: 0.8;
|
||||
box-shadow: 0 0 4px var(--color-shadow-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .crew-name {
|
||||
flex: 1;
|
||||
font-size: var(--font-size-small);
|
||||
cursor: pointer;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .crew-name:hover {
|
||||
color: var(--color-text-dark-highlight);
|
||||
text-shadow: 0 0 4px var(--color-shadow-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .controls {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
min-width: 3rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .controls a {
|
||||
color: var(--color-text-dark-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .controls a:hover {
|
||||
color: var(--color-text-dark-highlight);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .controls .pilot-button {
|
||||
color: var(--color-text-light-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-member .controls .pilot-button:hover {
|
||||
color: var(--color-text-light-highlight);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .crew .crew-empty {
|
||||
grid-column: 1 / -1;
|
||||
text-align: center;
|
||||
padding: 8px;
|
||||
font-style: italic;
|
||||
color: var(--color-text-dark-secondary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.vehicle-equipment .main-div .weapons {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
@@ -1359,6 +1418,10 @@ i.fvtt-ftl-nomad {
|
||||
min-width: 25rem;
|
||||
max-width: 25rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .main-stats .encumbered {
|
||||
color: red;
|
||||
font-weight: bold;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .cargo label,
|
||||
.fvtt-ftl-nomad .robot-main .robot-pc .robot-right .capacity label {
|
||||
min-width: 4rem;
|
||||
@@ -1841,6 +1904,65 @@ i.fvtt-ftl-nomad {
|
||||
font-size: calc(var(--font-size-standard) * 1.4);
|
||||
padding-left: 5px;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-list {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 8px;
|
||||
padding: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 4px;
|
||||
border: 1px solid var(--color-border-dark);
|
||||
border-radius: 4px;
|
||||
background: var(--color-light-2);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .crew-img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 50%;
|
||||
border: 1px solid var(--color-border-dark);
|
||||
cursor: pointer;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .crew-img:hover {
|
||||
opacity: 0.8;
|
||||
box-shadow: 0 0 4px var(--color-shadow-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .crew-name {
|
||||
flex: 1;
|
||||
font-size: var(--font-size-small);
|
||||
cursor: pointer;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .crew-name:hover {
|
||||
color: var(--color-text-dark-highlight);
|
||||
text-shadow: 0 0 4px var(--color-shadow-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .controls {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
min-width: 3rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .controls a {
|
||||
color: var(--color-text-dark-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .controls a:hover {
|
||||
color: var(--color-text-dark-highlight);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .controls .pilot-button {
|
||||
color: var(--color-text-light-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-member .controls .pilot-button:hover {
|
||||
color: var(--color-text-light-highlight);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .crew .crew-empty {
|
||||
grid-column: 1 / -1;
|
||||
text-align: center;
|
||||
padding: 8px;
|
||||
font-style: italic;
|
||||
color: var(--color-text-dark-secondary);
|
||||
}
|
||||
.fvtt-ftl-nomad .tab.starship-equipment .weapons {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
|
||||
34
lang/en.json
34
lang/en.json
@@ -304,6 +304,15 @@
|
||||
"Gargantuan": "Gargantuan"
|
||||
},
|
||||
"FIELDS": {
|
||||
"enc": {
|
||||
"label": "Enc",
|
||||
"value": {
|
||||
"label": "Enc Curr."
|
||||
},
|
||||
"max": {
|
||||
"label": "Enc Max"
|
||||
}
|
||||
},
|
||||
"brain": {
|
||||
"label": "Brain"
|
||||
},
|
||||
@@ -486,6 +495,7 @@
|
||||
"max": "Max",
|
||||
"maximum": "Maximum",
|
||||
"modifier": "Modifier",
|
||||
"numericModifier": "Additionnal Modifier",
|
||||
"multiplier": "Multiplier",
|
||||
"newArmor": "New Armor",
|
||||
"newWeapon": "New Weapon",
|
||||
@@ -514,7 +524,10 @@
|
||||
"titleWeapon": "Weapon Roll",
|
||||
"total": "Total",
|
||||
"totalScore": "Total Score",
|
||||
"weapons": "Weapons"
|
||||
"weapons": "Weapons",
|
||||
"crew": "Crew",
|
||||
"noCrew": "No crew members assigned",
|
||||
"vehicleBonus": "Vehicle/Starship Agility Bonus"
|
||||
},
|
||||
"Language": {
|
||||
"FIELDS": {
|
||||
@@ -623,6 +636,9 @@
|
||||
"crew": {
|
||||
"label": "Crew"
|
||||
},
|
||||
"crewCapacity": {
|
||||
"label": "Crew Capacity"
|
||||
},
|
||||
"description": {
|
||||
"label": "Description"
|
||||
},
|
||||
@@ -702,6 +718,9 @@
|
||||
"crew": {
|
||||
"label": "Crew"
|
||||
},
|
||||
"crewCapacity": {
|
||||
"label": "Crew Capacity"
|
||||
},
|
||||
"description": {
|
||||
"label": "Description"
|
||||
},
|
||||
@@ -713,7 +732,18 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"Warning": {},
|
||||
"Warning": {
|
||||
"alreadyInCrew": "This actor is already a crew member",
|
||||
"notACharacter": "Only characters can pilot vehicles",
|
||||
"noVehiclesSkill": "This character does not have the vehicles skill",
|
||||
"onlyCharactersAllowed": "Only characters can be added as crew members",
|
||||
"noLinkedPrototype": "This character must be linked to his token to be added as crew member"
|
||||
},
|
||||
"RemoveCrew": "Remove from crew",
|
||||
"RemoveCrewTitle": "Remove crew member?",
|
||||
"RemoveCrewContent": "Are you sure you want to remove {name} from the crew?",
|
||||
"PilotVehicle": "Pilot vehicle (with vehicle agility bonus)",
|
||||
"PilotStarship": "Pilot starship (with starship agility bonus)",
|
||||
"Weapon": {
|
||||
"FIELDS": {
|
||||
"cost": {
|
||||
|
||||
@@ -14,9 +14,100 @@ export default class FTLNomadStarshipSheet extends FTLNomadActorSheet {
|
||||
actions: {
|
||||
createEquipment: FTLNomadStarshipSheet.#onCreateEquipment,
|
||||
createWeapon: FTLNomadStarshipSheet.#onCreateWeapon,
|
||||
removeCrew: FTLNomadStarshipSheet.#onRemoveCrew,
|
||||
viewCrew: FTLNomadStarshipSheet.#onViewCrew,
|
||||
pilotCrew: FTLNomadStarshipSheet.#onPilotCrew,
|
||||
},
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a crew member from the starship
|
||||
* @param {Event} event The initiating click event
|
||||
* @param {HTMLElement} target The current target of the event listener
|
||||
*/
|
||||
static async #onRemoveCrew(event, target) {
|
||||
const crewUuid = target.dataset.crewUuid
|
||||
const actor = await fromUuid(crewUuid)
|
||||
|
||||
// Show confirmation dialog
|
||||
const confirmed = await foundry.applications.api.DialogV2.confirm({
|
||||
window: { title: game.i18n.localize("FTLNOMAD.RemoveCrewTitle") },
|
||||
content: game.i18n.format("FTLNOMAD.RemoveCrewContent", { name: actor?.name || "Unknown" }),
|
||||
rejectClose: false,
|
||||
modal: true
|
||||
})
|
||||
|
||||
if (!confirmed) return
|
||||
|
||||
const currentCrew = this.document.system.crewList || []
|
||||
const updatedCrew = currentCrew.filter(uuid => uuid !== crewUuid)
|
||||
await this.document.update({ "system.crewList": updatedCrew })
|
||||
}
|
||||
|
||||
/**
|
||||
* Open the actor sheet of a crew member
|
||||
* @param {Event} event The initiating click event
|
||||
* @param {HTMLElement} target The current target of the event listener
|
||||
*/
|
||||
static async #onViewCrew(event, target) {
|
||||
const actorUuid = target.closest('.crew-member').dataset.actorUuid
|
||||
const actor = await fromUuid(actorUuid)
|
||||
if (actor) {
|
||||
actor.sheet.render(true)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll a piloting check for a crew member with starship agility bonus
|
||||
* @param {Event} event The initiating click event
|
||||
* @param {HTMLElement} target The current target of the event listener
|
||||
*/
|
||||
static async #onPilotCrew(event, target) {
|
||||
const actorUuid = target.closest('.crew-member').dataset.actorUuid
|
||||
const actor = await fromUuid(actorUuid)
|
||||
|
||||
console.log("Pilot crew - Actor:", actor, "Type:", actor?.type)
|
||||
|
||||
if (!actor) {
|
||||
ui.notifications.warn("Actor not found")
|
||||
return
|
||||
}
|
||||
|
||||
if (actor.type !== "character") {
|
||||
ui.notifications.warn(`This actor is of type "${actor.type}", not "character"`)
|
||||
return
|
||||
}
|
||||
|
||||
// Get starship agility bonus
|
||||
const starshipAgility = this.document.system.agility || 0
|
||||
|
||||
// Get the vehicles skill from the actor
|
||||
const vehiclesSkill = actor.system.skills?.vehicles
|
||||
if (!vehiclesSkill) {
|
||||
ui.notifications.warn(game.i18n.localize("FTLNOMAD.Warning.noVehiclesSkill"))
|
||||
return
|
||||
}
|
||||
|
||||
// Import the Roll class
|
||||
const FTLNomadRoll = (await import("../../documents/roll.mjs")).default
|
||||
|
||||
// Call the roll prompt with the starship agility as a vehicle bonus
|
||||
let roll = await FTLNomadRoll.prompt({
|
||||
rollType: "skill",
|
||||
rollItem: vehiclesSkill,
|
||||
actorId: actor.id,
|
||||
actorName: actor.name,
|
||||
actorImage: actor.img,
|
||||
talents: actor.items.filter(i => i.type === "talent" && i.system.isAdvantage),
|
||||
isEncumbered: actor.system.isEncumbered(),
|
||||
hasTarget: false,
|
||||
vehicleBonus: starshipAgility
|
||||
})
|
||||
if (!roll) return null
|
||||
|
||||
await roll.toMessage({}, { rollMode: roll.options.rollMode })
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
@@ -63,9 +154,35 @@ export default class FTLNomadStarshipSheet extends FTLNomadActorSheet {
|
||||
context.enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.notes, { async: true })
|
||||
context.enrichedModifications = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.modifications, { async: true })
|
||||
|
||||
// Prepare crew members data
|
||||
context.crewMembers = await this.#prepareCrewMembers()
|
||||
|
||||
return context
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare crew members data from stored UUIDs
|
||||
* @returns {Promise<Array>}
|
||||
*/
|
||||
async #prepareCrewMembers() {
|
||||
const crewUuids = this.document.system.crewList || []
|
||||
const crewMembers = []
|
||||
|
||||
for (const uuid of crewUuids) {
|
||||
const actor = await fromUuid(uuid)
|
||||
if (actor) {
|
||||
crewMembers.push({
|
||||
uuid: uuid,
|
||||
id: actor.id,
|
||||
name: actor.name,
|
||||
img: actor.img
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return crewMembers
|
||||
}
|
||||
|
||||
_generateTooltip(type, target) {
|
||||
}
|
||||
|
||||
@@ -128,7 +245,41 @@ export default class FTLNomadStarshipSheet extends FTLNomadActorSheet {
|
||||
case "Item":
|
||||
const item = await fromUuid(data.uuid)
|
||||
return super._onDropItem(item)
|
||||
case "Actor":
|
||||
const actor = await fromUuid(data.uuid)
|
||||
return this.#onDropActor(actor)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle dropping an actor onto the starship sheet to add them to the crew
|
||||
* @param {Actor} actor The actor being dropped
|
||||
*/
|
||||
async #onDropActor(actor) {
|
||||
if (!actor) return
|
||||
|
||||
// Check if actor is of type "character"
|
||||
if (actor.type !== "character") {
|
||||
ui.notifications.info(game.i18n.localize("FTLNOMAD.Warning.onlyCharactersAllowed"))
|
||||
return
|
||||
}
|
||||
// Check if the actor has a linked prototype
|
||||
if (!actor.prototypeToken?.actorLink) {
|
||||
ui.notifications.info(game.i18n.localize("FTLNOMAD.Warning.noLinkedPrototype"))
|
||||
return
|
||||
}
|
||||
|
||||
const currentCrew = this.document.system.crewList || []
|
||||
|
||||
// Check if actor is already in crew
|
||||
if (currentCrew.includes(actor.uuid)) {
|
||||
ui.notifications.warn(game.i18n.localize("FTLNOMAD.Warning.alreadyInCrew"))
|
||||
return
|
||||
}
|
||||
|
||||
// Add actor UUID to crew array
|
||||
const updatedCrew = [...currentCrew, actor.uuid]
|
||||
await this.document.update({ "system.crewList": updatedCrew })
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -14,9 +14,100 @@ export default class FTLNomadVehicleSheet extends FTLNomadActorSheet {
|
||||
actions: {
|
||||
createEquipment: FTLNomadVehicleSheet.#onCreateEquipment,
|
||||
createWeapon: FTLNomadVehicleSheet.#onCreateWeapon,
|
||||
removeCrew: FTLNomadVehicleSheet.#onRemoveCrew,
|
||||
viewCrew: FTLNomadVehicleSheet.#onViewCrew,
|
||||
pilotCrew: FTLNomadVehicleSheet.#onPilotCrew,
|
||||
},
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a crew member from the vehicle
|
||||
* @param {Event} event The initiating click event
|
||||
* @param {HTMLElement} target The current target of the event listener
|
||||
*/
|
||||
static async #onRemoveCrew(event, target) {
|
||||
const crewUuid = target.dataset.crewUuid
|
||||
const actor = await fromUuid(crewUuid)
|
||||
|
||||
// Show confirmation dialog
|
||||
const confirmed = await foundry.applications.api.DialogV2.confirm({
|
||||
window: { title: game.i18n.localize("FTLNOMAD.RemoveCrewTitle") },
|
||||
content: game.i18n.format("FTLNOMAD.RemoveCrewContent", { name: actor?.name || "Unknown" }),
|
||||
rejectClose: false,
|
||||
modal: true
|
||||
})
|
||||
|
||||
if (!confirmed) return
|
||||
|
||||
const currentCrew = this.document.system.crewList || []
|
||||
const updatedCrew = currentCrew.filter(uuid => uuid !== crewUuid)
|
||||
await this.document.update({ "system.crewList": updatedCrew })
|
||||
}
|
||||
|
||||
/**
|
||||
* Open the actor sheet of a crew member
|
||||
* @param {Event} event The initiating click event
|
||||
* @param {HTMLElement} target The current target of the event listener
|
||||
*/
|
||||
static async #onViewCrew(event, target) {
|
||||
const actorUuid = target.closest('.crew-member').dataset.actorUuid
|
||||
const actor = await fromUuid(actorUuid)
|
||||
if (actor) {
|
||||
actor.sheet.render(true)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll a piloting check for a crew member with vehicle agility bonus
|
||||
* @param {Event} event The initiating click event
|
||||
* @param {HTMLElement} target The current target of the event listener
|
||||
*/
|
||||
static async #onPilotCrew(event, target) {
|
||||
const actorUuid = target.closest('.crew-member').dataset.actorUuid
|
||||
const actor = await fromUuid(actorUuid)
|
||||
|
||||
console.log("Pilot crew - Actor:", actor, "Type:", actor?.type)
|
||||
|
||||
if (!actor) {
|
||||
ui.notifications.warn("Actor not found")
|
||||
return
|
||||
}
|
||||
|
||||
if (actor.type !== "character") {
|
||||
ui.notifications.warn(`This actor is of type "${actor.type}", not "character"`)
|
||||
return
|
||||
}
|
||||
|
||||
// Get vehicle agility bonus
|
||||
const vehicleAgility = this.document.system.agility || 0
|
||||
|
||||
// Get the vehicles skill from the actor
|
||||
const vehiclesSkill = actor.system.skills?.vehicles
|
||||
if (!vehiclesSkill) {
|
||||
ui.notifications.warn(game.i18n.localize("FTLNOMAD.Warning.noVehiclesSkill"))
|
||||
return
|
||||
}
|
||||
|
||||
// Import the Roll class
|
||||
const FTLNomadRoll = (await import("../../documents/roll.mjs")).default
|
||||
|
||||
// Call the roll prompt with the vehicle agility as a vehicle bonus
|
||||
let roll = await FTLNomadRoll.prompt({
|
||||
rollType: "skill",
|
||||
rollItem: vehiclesSkill,
|
||||
actorId: actor.id,
|
||||
actorName: actor.name,
|
||||
actorImage: actor.img,
|
||||
talents: actor.items.filter(i => i.type === "talent" && i.system.isAdvantage),
|
||||
isEncumbered: actor.system.isEncumbered(),
|
||||
hasTarget: false,
|
||||
vehicleBonus: vehicleAgility
|
||||
})
|
||||
if (!roll) return null
|
||||
|
||||
await roll.toMessage({}, { rollMode: roll.options.rollMode })
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
@@ -62,9 +153,35 @@ export default class FTLNomadVehicleSheet extends FTLNomadActorSheet {
|
||||
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
|
||||
context.enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.notes, { async: true })
|
||||
|
||||
// Prepare crew members data
|
||||
context.crewMembers = await this.#prepareCrewMembers()
|
||||
|
||||
return context
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare crew members data from stored UUIDs
|
||||
* @returns {Promise<Array>}
|
||||
*/
|
||||
async #prepareCrewMembers() {
|
||||
const crewUuids = this.document.system.crewList || []
|
||||
const crewMembers = []
|
||||
|
||||
for (const uuid of crewUuids) {
|
||||
const actor = await fromUuid(uuid)
|
||||
if (actor) {
|
||||
crewMembers.push({
|
||||
uuid: uuid,
|
||||
id: actor.id,
|
||||
name: actor.name,
|
||||
img: actor.img
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return crewMembers
|
||||
}
|
||||
|
||||
_generateTooltip(type, target) {
|
||||
}
|
||||
|
||||
@@ -128,7 +245,36 @@ export default class FTLNomadVehicleSheet extends FTLNomadActorSheet {
|
||||
case "Item":
|
||||
const item = await fromUuid(data.uuid)
|
||||
return super._onDropItem(item)
|
||||
case "Actor":
|
||||
const actor = await fromUuid(data.uuid)
|
||||
return this.#onDropActor(actor)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle dropping an actor onto the vehicle sheet to add them to the crew
|
||||
* @param {Actor} actor The actor being dropped
|
||||
*/
|
||||
async #onDropActor(actor) {
|
||||
if (!actor) return
|
||||
|
||||
// Check if actor is of type "character"
|
||||
if (actor.type !== "character") {
|
||||
ui.notifications.info(game.i18n.localize("FTLNOMAD.Warning.onlyCharactersAllowed"))
|
||||
return
|
||||
}
|
||||
|
||||
const currentCrew = this.document.system.crewList || []
|
||||
|
||||
// Check if actor is already in crew
|
||||
if (currentCrew.includes(actor.uuid)) {
|
||||
ui.notifications.warn(game.i18n.localize("FTLNOMAD.Warning.alreadyInCrew"))
|
||||
return
|
||||
}
|
||||
|
||||
// Add actor UUID to crew array
|
||||
const updatedCrew = [...currentCrew, actor.uuid]
|
||||
await this.document.update({ "system.crewList": updatedCrew })
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -144,6 +144,20 @@ export const MODIFIER_CHOICES = {
|
||||
"impossible6": { id: "impossible6", label: "FTLNOMAD.Label.Impossible6", value: "-6" }
|
||||
}
|
||||
|
||||
export const NUMERIC_MODIFIER_CHOICES = {
|
||||
"-5": { label: "-5", value: -5 },
|
||||
"-4": { label: "-4", value: -4 },
|
||||
"-3": { label: "-3", value: -3 },
|
||||
"-2": { label: "-2", value: -2 },
|
||||
"-1": { label: "-1", value: -1 },
|
||||
"0": { label: "0", value: 0 },
|
||||
"+1": { label: "+1", value: 1 },
|
||||
"+2": { label: "+2", value: 2 },
|
||||
"+3": { label: "+3", value: 3 },
|
||||
"+4": { label: "+4", value: 4 },
|
||||
"+5": { label: "+5", value: 5 }
|
||||
}
|
||||
|
||||
export const STARSHIP_HULL = {
|
||||
"pod": { id: "pod", label: "FTLNOMAD.Starship.Hull.Pod" },
|
||||
"micro": { id: "micro", label: "FTLNOMAD.Starship.Hull.Micro" },
|
||||
@@ -163,6 +177,7 @@ export const STARSHIP_HULL = {
|
||||
export const SYSTEM = {
|
||||
id: SYSTEM_ID,
|
||||
MODIFIER_CHOICES,
|
||||
NUMERIC_MODIFIER_CHOICES,
|
||||
ATTACK_MODIFIERS,
|
||||
TECH_AGES,
|
||||
WEAPON_TYPES,
|
||||
|
||||
@@ -66,10 +66,13 @@ export default class FTLNomadRoll extends Roll {
|
||||
fullFormula = `${options.formula} + ${options.damageModifier}D6 `
|
||||
} else {
|
||||
let mod = options.rollItem?.value || 0
|
||||
fullFormula = `${options.formula} + ${options.skillModifier}D + ${mod} + ${options.rangeModifier}D + ${options.numericModifier}D`
|
||||
fullFormula = `${options.formula} + ${options.skillModifier}D + ${mod} + ${options.rangeModifier}D + ${options.numericModifier}D + ${options.numericModifierSelect}`
|
||||
if (options.vehicleBonus) {
|
||||
fullFormula += ` + ${options.vehicleBonus}`
|
||||
}
|
||||
}
|
||||
// Replace all the "+ -" with "-"
|
||||
fullFormula = fullFormula.replace(/\+\s*\-/g, "- ")
|
||||
fullFormula = fullFormula.replace(/\+\s*-/g, "- ")
|
||||
$('#roll-dialog-full-formula').text(fullFormula)
|
||||
options.fullFormula = fullFormula
|
||||
}
|
||||
@@ -116,6 +119,7 @@ export default class FTLNomadRoll extends Roll {
|
||||
})
|
||||
|
||||
const choiceModifier = SYSTEM.MODIFIER_CHOICES
|
||||
const choiceNumericModifier = SYSTEM.NUMERIC_MODIFIER_CHOICES
|
||||
let choiceRangeModifier = {}
|
||||
let rangeModifier = 0
|
||||
if (options.weapon) {
|
||||
@@ -129,14 +133,20 @@ export default class FTLNomadRoll extends Roll {
|
||||
let damageModifier = "0"
|
||||
|
||||
let modifier = "0"
|
||||
let numericModifierSelect = 0
|
||||
options.skillModifier = 0
|
||||
options.numericModifier = 0
|
||||
options.numericModifierSelect = 0
|
||||
options.rangeModifier = rangeModifier
|
||||
options.damageModifier = damageModifier
|
||||
options.vehicleBonus = options.vehicleBonus || 0
|
||||
let fullFormula = `${formula} + ${options.rollItem.value}`
|
||||
if (options.isEncumbered) {
|
||||
fullFormula += ` - 1D`
|
||||
}
|
||||
if (options.vehicleBonus) {
|
||||
fullFormula += ` + ${options.vehicleBonus}`
|
||||
}
|
||||
options.fullFormula = fullFormula
|
||||
options.formula = formula
|
||||
|
||||
@@ -152,6 +162,7 @@ export default class FTLNomadRoll extends Roll {
|
||||
rollModes,
|
||||
fieldRollMode,
|
||||
choiceModifier,
|
||||
choiceNumericModifier,
|
||||
choiceRangeModifier,
|
||||
choiceDamageModifier,
|
||||
rangeModifier,
|
||||
@@ -159,6 +170,8 @@ export default class FTLNomadRoll extends Roll {
|
||||
formula,
|
||||
hasTarget: options.hasTarget,
|
||||
modifier,
|
||||
numericModifierSelect,
|
||||
vehicleBonus: options.vehicleBonus,
|
||||
}
|
||||
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-ftl-nomad/templates/roll-dialog.hbs", dialogContext)
|
||||
|
||||
@@ -189,6 +202,10 @@ export default class FTLNomadRoll extends Roll {
|
||||
options.skillModifier = Number(event.target.value)
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
})
|
||||
$(".roll-numeric-modifier").change(event => {
|
||||
options.numericModifierSelect = Number(event.target.value)
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
})
|
||||
$(".roll-damage-modifier").change(event => {
|
||||
options.damageModifier = Number(event.target.value)
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
@@ -223,8 +240,11 @@ export default class FTLNomadRoll extends Roll {
|
||||
options.numericModifier = Number(rollData.numericModifier) || 0
|
||||
options.skillModifier = Number(rollData.skillModifier) || 0
|
||||
options.rangeModifier = Number(rollData.rangeModifier) || 0
|
||||
options.numericModifierSelect = Number(rollData.numericModifierSelect) || 0
|
||||
options.finalModifier = options.numericModifier + options.skillModifier + options.rangeModifier
|
||||
let mod = options.rollItem?.value || 0
|
||||
mod += options.numericModifierSelect
|
||||
mod += options.vehicleBonus || 0
|
||||
|
||||
// Build the dice formula
|
||||
let diceFormula = "2d6"
|
||||
|
||||
@@ -49,7 +49,19 @@ export default class FTLNomadRobot extends foundry.abstract.TypeDataModel {
|
||||
|
||||
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() {
|
||||
|
||||
@@ -11,7 +11,8 @@ export default class FTLNomadStarship extends foundry.abstract.TypeDataModel {
|
||||
schema.hullType = new fields.StringField({ required: true, initial: "small", choices: SYSTEM.STARSHIP_HULL })
|
||||
schema.endurance = new fields.StringField({ required: true, initial: "" })
|
||||
schema.armor = new fields.StringField({ required: true, initial: "" })
|
||||
schema.crew = new fields.StringField({ required: true, initial: "" })
|
||||
schema.crewList = new fields.ArrayField(new fields.StringField({ required: true }), { initial: [] })
|
||||
schema.crewCapacity = 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.StringField({ required: true, initial: "" })
|
||||
|
||||
@@ -10,7 +10,8 @@ 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.StringField({ required: true, initial: "" })
|
||||
schema.crew = new fields.StringField({ required: true, initial: "" })
|
||||
schema.crewList = new fields.ArrayField(new fields.StringField({ required: true }), { initial: [] })
|
||||
schema.crewCapacity = new fields.StringField({ required: true, initial: "" })
|
||||
schema.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" })
|
||||
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000091
|
||||
MANIFEST-000120
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2025/10/15-21:50:26.265715 7f189ffff6c0 Recovering log #88
|
||||
2025/10/15-21:50:26.325136 7f189ffff6c0 Delete type=3 #86
|
||||
2025/10/15-21:50:26.325207 7f189ffff6c0 Delete type=0 #88
|
||||
2025/10/15-22:19:29.836460 7f189e7fc6c0 Level-0 table #94: started
|
||||
2025/10/15-22:19:29.836492 7f189e7fc6c0 Level-0 table #94: 0 bytes OK
|
||||
2025/10/15-22:19:29.881737 7f189e7fc6c0 Delete type=0 #92
|
||||
2025/10/15-22:19:29.944478 7f189e7fc6c0 Manual compaction at level-0 from '!folders!AuBtSOj1mJmh88qx' @ 72057594037927935 : 1 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at (end)
|
||||
2025/11/09-22:04:33.775487 7f0921ffb6c0 Recovering log #117
|
||||
2025/11/09-22:04:33.868329 7f0921ffb6c0 Delete type=3 #115
|
||||
2025/11/09-22:04:33.868406 7f0921ffb6c0 Delete type=0 #117
|
||||
2025/11/09-22:11:34.495817 7f0920bff6c0 Level-0 table #123: started
|
||||
2025/11/09-22:11:34.495875 7f0920bff6c0 Level-0 table #123: 0 bytes OK
|
||||
2025/11/09-22:11:34.530303 7f0920bff6c0 Delete type=0 #121
|
||||
2025/11/09-22:11:34.530590 7f0920bff6c0 Manual compaction at level-0 from '!folders!AuBtSOj1mJmh88qx' @ 72057594037927935 : 1 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
2025/10/15-13:50:39.028219 7f189f7fe6c0 Recovering log #84
|
||||
2025/10/15-13:50:39.038979 7f189f7fe6c0 Delete type=3 #82
|
||||
2025/10/15-13:50:39.039047 7f189f7fe6c0 Delete type=0 #84
|
||||
2025/10/15-15:26:39.732570 7f189e7fc6c0 Level-0 table #89: started
|
||||
2025/10/15-15:26:39.736109 7f189e7fc6c0 Level-0 table #89: 12073 bytes OK
|
||||
2025/10/15-15:26:39.742312 7f189e7fc6c0 Delete type=0 #87
|
||||
2025/10/15-15:26:39.748688 7f189e7fc6c0 Manual compaction at level-0 from '!folders!AuBtSOj1mJmh88qx' @ 72057594037927935 : 1 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at '!items!zoE4ITyfl3od6hYD' @ 721 : 1
|
||||
2025/10/15-15:26:39.748706 7f189e7fc6c0 Compacting 1@0 + 1@1 files
|
||||
2025/10/15-15:26:39.753893 7f189e7fc6c0 Generated table #90@0: 316 keys, 126470 bytes
|
||||
2025/10/15-15:26:39.753929 7f189e7fc6c0 Compacted 1@0 + 1@1 files => 126470 bytes
|
||||
2025/10/15-15:26:39.760361 7f189e7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||
2025/10/15-15:26:39.760492 7f189e7fc6c0 Delete type=2 #73
|
||||
2025/10/15-15:26:39.760637 7f189e7fc6c0 Delete type=2 #89
|
||||
2025/10/15-15:26:39.774069 7f189e7fc6c0 Manual compaction at level-0 from '!items!zoE4ITyfl3od6hYD' @ 721 : 1 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at (end)
|
||||
2025/11/09-19:53:34.147030 7f09217fa6c0 Delete type=3 #1
|
||||
2025/11/09-22:04:27.202802 7f0920bff6c0 Level-0 table #118: started
|
||||
2025/11/09-22:04:27.202844 7f0920bff6c0 Level-0 table #118: 0 bytes OK
|
||||
2025/11/09-22:04:27.240256 7f0920bff6c0 Delete type=0 #116
|
||||
2025/11/09-22:04:27.339388 7f0920bff6c0 Manual compaction at level-0 from '!folders!AuBtSOj1mJmh88qx' @ 72057594037927935 : 1 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at '!items!zv9dwgL3p7ThQn7j' @ 385 : 1
|
||||
2025/11/09-22:04:27.339402 7f0920bff6c0 Compacting 1@0 + 0@1 files
|
||||
2025/11/09-22:04:27.363062 7f0920bff6c0 Generated table #119@0: 316 keys, 126470 bytes
|
||||
2025/11/09-22:04:27.363092 7f0920bff6c0 Compacted 1@0 + 0@1 files => 126470 bytes
|
||||
2025/11/09-22:04:27.437323 7f0920bff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||
2025/11/09-22:04:27.437448 7f0920bff6c0 Delete type=2 #90
|
||||
2025/11/09-22:04:27.535013 7f0920bff6c0 Manual compaction at level-0 from '!items!zv9dwgL3p7ThQn7j' @ 385 : 1 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
BIN
packs/ftl-nomad-items/MANIFEST-000120
Normal file
BIN
packs/ftl-nomad-items/MANIFEST-000120
Normal file
Binary file not shown.
0
packs/ftl-nomad-vehicles/000100.log
Normal file
0
packs/ftl-nomad-vehicles/000100.log
Normal file
@@ -1 +1 @@
|
||||
MANIFEST-000069
|
||||
MANIFEST-000098
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
2025/10/15-21:50:26.444225 7f18a4ffa6c0 Recovering log #66
|
||||
2025/10/15-21:50:26.495317 7f18a4ffa6c0 Delete type=3 #64
|
||||
2025/10/15-21:50:26.495386 7f18a4ffa6c0 Delete type=0 #66
|
||||
2025/10/15-22:19:30.067316 7f189e7fc6c0 Level-0 table #72: started
|
||||
2025/10/15-22:19:30.067349 7f189e7fc6c0 Level-0 table #72: 0 bytes OK
|
||||
2025/10/15-22:19:30.103968 7f189e7fc6c0 Delete type=0 #70
|
||||
2025/10/15-22:19:30.104104 7f189e7fc6c0 Manual compaction at level-0 from '!actors!0FQ6XaRi24OorI21' @ 72057594037927935 : 1 .. '!folders!vRnrOJqSMlxbSgyX' @ 0 : 0; will stop at (end)
|
||||
2025/11/09-22:04:33.872006 7f09217fa6c0 Recovering log #95
|
||||
2025/11/09-22:04:33.928521 7f09217fa6c0 Delete type=3 #93
|
||||
2025/11/09-22:04:33.928601 7f09217fa6c0 Delete type=0 #95
|
||||
2025/11/09-22:11:34.382951 7f0920bff6c0 Level-0 table #101: started
|
||||
2025/11/09-22:11:34.383012 7f0920bff6c0 Level-0 table #101: 0 bytes OK
|
||||
2025/11/09-22:11:34.414745 7f0920bff6c0 Delete type=0 #99
|
||||
2025/11/09-22:11:34.530532 7f0920bff6c0 Manual compaction at level-0 from '!actors!0FQ6XaRi24OorI21' @ 72057594037927935 : 1 .. '!folders!vRnrOJqSMlxbSgyX' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
2025/10/15-13:50:39.042685 7f18a4ffa6c0 Recovering log #62
|
||||
2025/10/15-13:50:39.052767 7f18a4ffa6c0 Delete type=3 #60
|
||||
2025/10/15-13:50:39.052843 7f18a4ffa6c0 Delete type=0 #62
|
||||
2025/10/15-15:26:39.665250 7f189e7fc6c0 Level-0 table #67: started
|
||||
2025/10/15-15:26:39.668457 7f189e7fc6c0 Level-0 table #67: 12881 bytes OK
|
||||
2025/10/15-15:26:39.674498 7f189e7fc6c0 Delete type=0 #65
|
||||
2025/10/15-15:26:39.688322 7f189e7fc6c0 Manual compaction at level-0 from '!actors!0FQ6XaRi24OorI21' @ 72057594037927935 : 1 .. '!folders!vRnrOJqSMlxbSgyX' @ 0 : 0; will stop at '!folders!HobFutlnH6HPTEfT' @ 93 : 1
|
||||
2025/10/15-15:26:39.688334 7f189e7fc6c0 Compacting 1@0 + 1@1 files
|
||||
2025/10/15-15:26:39.692347 7f189e7fc6c0 Generated table #68@0: 78 keys, 62826 bytes
|
||||
2025/10/15-15:26:39.692380 7f189e7fc6c0 Compacted 1@0 + 1@1 files => 62826 bytes
|
||||
2025/10/15-15:26:39.698356 7f189e7fc6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||
2025/10/15-15:26:39.698484 7f189e7fc6c0 Delete type=2 #51
|
||||
2025/10/15-15:26:39.698645 7f189e7fc6c0 Delete type=2 #67
|
||||
2025/10/15-15:26:39.709845 7f189e7fc6c0 Manual compaction at level-0 from '!folders!HobFutlnH6HPTEfT' @ 93 : 1 .. '!folders!vRnrOJqSMlxbSgyX' @ 0 : 0; will stop at (end)
|
||||
2025/11/09-19:53:34.224884 7f09217fa6c0 Delete type=3 #1
|
||||
2025/11/09-22:04:27.111245 7f0920bff6c0 Level-0 table #96: started
|
||||
2025/11/09-22:04:27.111285 7f0920bff6c0 Level-0 table #96: 0 bytes OK
|
||||
2025/11/09-22:04:27.145066 7f0920bff6c0 Delete type=0 #94
|
||||
2025/11/09-22:04:27.287309 7f0920bff6c0 Manual compaction at level-0 from '!actors!0FQ6XaRi24OorI21' @ 72057594037927935 : 1 .. '!folders!vRnrOJqSMlxbSgyX' @ 0 : 0; will stop at '!folders!vRnrOJqSMlxbSgyX' @ 92 : 1
|
||||
2025/11/09-22:04:27.287329 7f0920bff6c0 Compacting 1@0 + 0@1 files
|
||||
2025/11/09-22:04:27.306281 7f0920bff6c0 Generated table #97@0: 78 keys, 62826 bytes
|
||||
2025/11/09-22:04:27.306318 7f0920bff6c0 Compacted 1@0 + 0@1 files => 62826 bytes
|
||||
2025/11/09-22:04:27.339052 7f0920bff6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||
2025/11/09-22:04:27.339182 7f0920bff6c0 Delete type=2 #68
|
||||
2025/11/09-22:04:27.437605 7f0920bff6c0 Manual compaction at level-0 from '!folders!vRnrOJqSMlxbSgyX' @ 92 : 1 .. '!folders!vRnrOJqSMlxbSgyX' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
BIN
packs/ftl-nomad-vehicles/MANIFEST-000098
Normal file
BIN
packs/ftl-nomad-vehicles/MANIFEST-000098
Normal file
Binary file not shown.
0
packs/ftl-nomad-vehicles/lost/000091.log
Normal file
0
packs/ftl-nomad-vehicles/lost/000091.log
Normal file
@@ -75,6 +75,10 @@
|
||||
.main-stats {
|
||||
min-width: 25rem;
|
||||
max-width: 25rem;
|
||||
.encumbered {
|
||||
color: red;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
.cargo,
|
||||
.capacity {
|
||||
|
||||
@@ -214,6 +214,68 @@
|
||||
padding-left: 5px;
|
||||
}
|
||||
}
|
||||
.crew {
|
||||
.crew-list {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 8px;
|
||||
padding: 4px;
|
||||
}
|
||||
.crew-member {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 4px;
|
||||
border: 1px solid var(--color-border-dark);
|
||||
border-radius: 4px;
|
||||
background: var(--color-light-2);
|
||||
.crew-img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 50%;
|
||||
border: 1px solid var(--color-border-dark);
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
opacity: 0.8;
|
||||
box-shadow: 0 0 4px var(--color-shadow-primary);
|
||||
}
|
||||
}
|
||||
.crew-name {
|
||||
flex: 1;
|
||||
font-size: var(--font-size-small);
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
color: var(--color-text-dark-highlight);
|
||||
text-shadow: 0 0 4px var(--color-shadow-primary);
|
||||
}
|
||||
}
|
||||
.controls {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
min-width: 3rem;
|
||||
a {
|
||||
color: var(--color-text-dark-primary);
|
||||
&:hover {
|
||||
color: var(--color-text-dark-highlight);
|
||||
}
|
||||
}
|
||||
.pilot-button {
|
||||
color: var(--color-text-light-primary);
|
||||
&:hover {
|
||||
color: var(--color-text-light-highlight);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.crew-empty {
|
||||
grid-column: 1 / -1;
|
||||
text-align: center;
|
||||
padding: 8px;
|
||||
font-style: italic;
|
||||
color: var(--color-text-dark-secondary);
|
||||
}
|
||||
}
|
||||
|
||||
.weapons {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
|
||||
@@ -173,6 +173,68 @@
|
||||
padding-left: 5px;
|
||||
}
|
||||
}
|
||||
.crew {
|
||||
.crew-list {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 8px;
|
||||
padding: 4px;
|
||||
}
|
||||
.crew-member {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 4px;
|
||||
border: 1px solid var(--color-border-dark);
|
||||
border-radius: 4px;
|
||||
background: var(--color-light-2);
|
||||
.crew-img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 50%;
|
||||
border: 1px solid var(--color-border-dark);
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
opacity: 0.8;
|
||||
box-shadow: 0 0 4px var(--color-shadow-primary);
|
||||
}
|
||||
}
|
||||
.crew-name {
|
||||
flex: 1;
|
||||
font-size: var(--font-size-small);
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
color: var(--color-text-dark-highlight);
|
||||
text-shadow: 0 0 4px var(--color-shadow-primary);
|
||||
}
|
||||
}
|
||||
.controls {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
min-width: 3rem;
|
||||
a {
|
||||
color: var(--color-text-dark-primary);
|
||||
&:hover {
|
||||
color: var(--color-text-dark-highlight);
|
||||
}
|
||||
}
|
||||
.pilot-button {
|
||||
color: var(--color-text-light-primary);
|
||||
&:hover {
|
||||
color: var(--color-text-light-highlight);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.crew-empty {
|
||||
grid-column: 1 / -1;
|
||||
text-align: center;
|
||||
padding: 8px;
|
||||
font-style: italic;
|
||||
color: var(--color-text-dark-secondary);
|
||||
}
|
||||
}
|
||||
|
||||
.weapons {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<!-- <fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.damages"}}</legend>
|
||||
<div class="text-center">
|
||||
<textarea
|
||||
@@ -26,7 +26,7 @@
|
||||
data-tooltip="{{localize 'FTLNOMAD.Tooltip.damages'}}"
|
||||
>{{system.damages}}</textarea>
|
||||
</div>
|
||||
</fieldset>
|
||||
</fieldset> -->
|
||||
|
||||
<fieldset class="section-editor">
|
||||
<legend>{{localize "FTLNOMAD.Label.description"}}</legend>
|
||||
|
||||
@@ -79,6 +79,31 @@
|
||||
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">
|
||||
@@ -86,11 +111,10 @@
|
||||
<div class="flexrow">
|
||||
<textarea
|
||||
cols="64"
|
||||
rows="5"
|
||||
rows="2"
|
||||
name="system.brain"
|
||||
data-tooltip="{{localize 'FTLNOMAD.Tooltip.brain'}}"
|
||||
disabled="isPlayMode"
|
||||
>{{system.brain}}</textarea>
|
||||
{{#if isPlayMode}}disabled{{/if}}>{{system.brain}}</textarea>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
|
||||
@@ -40,6 +40,16 @@
|
||||
<select name="modifier" class="roll-skill-modifier">
|
||||
{{selectOptions choiceModifier selected=modifier localize=true}}
|
||||
</select>
|
||||
<label>{{localize "FTLNOMAD.Label.numericModifier"}}</label>
|
||||
<select name="numericModifierSelect" class="roll-numeric-modifier">
|
||||
{{selectOptions choiceNumericModifier selected=numericModifierSelect}}
|
||||
</select>
|
||||
{{#if vehicleBonus}}
|
||||
<div class="vehicle-bonus-info">
|
||||
<label>{{localize "FTLNOMAD.Label.vehicleBonus"}}</label>
|
||||
<span class="vehicle-bonus-value">+{{vehicleBonus}}</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
{{#if (eq rollType "weapon")}}
|
||||
|
||||
@@ -4,63 +4,43 @@
|
||||
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}}
|
||||
<fieldset class="crew">
|
||||
<legend>{{localize "FTLNOMAD.Label.crew"}}
|
||||
({{crewMembers.length}}{{#if
|
||||
system.crewCapacity
|
||||
}}/{{system.crewCapacity}}{{/if}})</legend>
|
||||
<div class="crew-list">
|
||||
{{#each crewMembers as |member|}}
|
||||
<div
|
||||
class="weapon item"
|
||||
data-item-id="{{item.id}}"
|
||||
data-item-uuid="{{item.uuid}}"
|
||||
class="crew-member"
|
||||
data-actor-uuid="{{member.uuid}}"
|
||||
data-drag="true"
|
||||
>
|
||||
<img
|
||||
class="item-img"
|
||||
src="{{item.img}}"
|
||||
data-tooltip="{{item.name}}"
|
||||
class="crew-img"
|
||||
src="{{member.img}}"
|
||||
data-tooltip="{{member.name}}"
|
||||
data-action="viewCrew"
|
||||
/>
|
||||
<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="crew-name" data-action="viewCrew">{{member.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>
|
||||
class="pilot-button"
|
||||
data-tooltip="{{localize 'FTLNOMAD.PilotStarship'}}"
|
||||
data-action="pilotCrew"
|
||||
><i class="fas fa-dice-d6"></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>
|
||||
data-tooltip="{{localize 'FTLNOMAD.RemoveCrew'}}"
|
||||
data-action="removeCrew"
|
||||
data-crew-uuid="{{member.uuid}}"
|
||||
><i class="fas fa-times"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="crew-empty">{{localize "FTLNOMAD.Label.noCrew"}}</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</fieldset> -->
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.equipment"}}{{#if isEditMode}}
|
||||
|
||||
@@ -96,8 +96,8 @@
|
||||
<legend>{{localize "FTLNOMAD.Label.cargo"}}</legend>
|
||||
<div class="flexrow">
|
||||
{{formField
|
||||
systemFields.crew
|
||||
value=system.crew
|
||||
systemFields.crewCapacity
|
||||
value=system.crewCapacity
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
@@ -4,6 +4,45 @@
|
||||
data-group="{{tab.group}}"
|
||||
>
|
||||
<div class="main-div">
|
||||
|
||||
<fieldset class="crew">
|
||||
<legend>{{localize "FTLNOMAD.Label.crew"}}
|
||||
({{crewMembers.length}}{{#if
|
||||
system.crewCapacity
|
||||
}}/{{system.crewCapacity}}{{/if}})</legend>
|
||||
<div class="crew-list">
|
||||
{{#each crewMembers as |member|}}
|
||||
<div
|
||||
class="crew-member"
|
||||
data-actor-uuid="{{member.uuid}}"
|
||||
data-drag="true"
|
||||
>
|
||||
<img
|
||||
class="crew-img"
|
||||
src="{{member.img}}"
|
||||
data-tooltip="{{member.name}}"
|
||||
data-action="viewCrew"
|
||||
/>
|
||||
<div class="crew-name" data-action="viewCrew">{{member.name}}</div>
|
||||
<div class="controls">
|
||||
<a
|
||||
class="pilot-button"
|
||||
data-tooltip="{{localize 'FTLNOMAD.PilotVehicle'}}"
|
||||
data-action="pilotCrew"
|
||||
><i class="fas fa-dice-d6"></i></a>
|
||||
<a
|
||||
data-tooltip="{{localize 'FTLNOMAD.RemoveCrew'}}"
|
||||
data-action="removeCrew"
|
||||
data-crew-uuid="{{member.uuid}}"
|
||||
><i class="fas fa-times"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="crew-empty">{{localize "FTLNOMAD.Label.noCrew"}}</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.weapons"}}{{#if isEditMode}}
|
||||
<a
|
||||
|
||||
@@ -81,8 +81,8 @@
|
||||
<legend>{{localize "FTLNOMAD.Label.cargo"}}</legend>
|
||||
<div class="cargo-content">
|
||||
{{formField
|
||||
systemFields.crew
|
||||
value=system.crew
|
||||
systemFields.crewCapacity
|
||||
value=system.crewCapacity
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
@@ -100,7 +100,6 @@
|
||||
}}
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
Reference in New Issue
Block a user