Crew member enhancements
All checks were successful
Release Creation / build (release) Successful in 59s
All checks were successful
Release Creation / build (release) Successful in 59s
This commit is contained in:
@@ -24,6 +24,7 @@
|
||||
body {
|
||||
--color-text-secondary: #160303;
|
||||
--color-text-emphatic: #09610e;
|
||||
--input-height: 1.6rem;
|
||||
}
|
||||
.d100 {
|
||||
width: 18px;
|
||||
@@ -74,6 +75,11 @@ i.fvtt-ftl-nomad {
|
||||
.application.dialog.fvtt-ftl-nomad .legend {
|
||||
font-family: var(--font-primary);
|
||||
}
|
||||
.sheet-tabs {
|
||||
background-color: var(--color-light-1);
|
||||
font-family: Ethnocentric;
|
||||
font-size: 0.7rem;
|
||||
}
|
||||
.chat-message,
|
||||
.chat-message.whisper {
|
||||
font-family: var(--font-primary);
|
||||
@@ -99,8 +105,8 @@ i.fvtt-ftl-nomad {
|
||||
.fvtt-ftl-nomad .vehicle-sheet-common .form-group label {
|
||||
font-weight: bold;
|
||||
margin-right: 8px;
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-sheet-common label {
|
||||
font-family: var(--font-secondary);
|
||||
@@ -384,7 +390,7 @@ i.fvtt-ftl-nomad {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
justify-content: space-evenly;
|
||||
flex: 1;
|
||||
}
|
||||
.fvtt-ftl-nomad .character-main .character-skills .character-skill {
|
||||
@@ -1002,8 +1008,8 @@ i.fvtt-ftl-nomad {
|
||||
.fvtt-ftl-nomad .vehicle-content .form-group label {
|
||||
font-weight: bold;
|
||||
margin-right: 8px;
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .sheet-tabs {
|
||||
background-color: var(--color-light-1);
|
||||
@@ -1033,6 +1039,12 @@ i.fvtt-ftl-nomad {
|
||||
width: auto;
|
||||
border: none;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-left .spec label {
|
||||
max-width: 4rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-left .spec input {
|
||||
max-width: 4rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -1048,8 +1060,7 @@ i.fvtt-ftl-nomad {
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .cargo label,
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .capacity label {
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
max-width: 7rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .cargo input,
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .capacity input {
|
||||
@@ -1058,10 +1069,31 @@ i.fvtt-ftl-nomad {
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .cargo .cargo-content,
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .capacity .cargo-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .cargo .cargo-content .cargo-line,
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .capacity .cargo-content .cargo-line {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .cargo .npc-crew-field,
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .capacity .npc-crew-field {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .cargo .npc-crew-field .npc-crew-roll,
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .capacity .npc-crew-field .npc-crew-roll {
|
||||
cursor: pointer;
|
||||
color: var(--color-text-dark-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .cargo .npc-crew-field .npc-crew-roll:hover,
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .capacity .npc-crew-field .npc-crew-roll:hover {
|
||||
color: var(--color-text-hyperlink);
|
||||
}
|
||||
.fvtt-ftl-nomad .vehicle-main .vehicle-pc .vehicle-right .vehicle-infos {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -1480,7 +1512,7 @@ i.fvtt-ftl-nomad {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
justify-content: space-evenly;
|
||||
flex: 1;
|
||||
}
|
||||
.fvtt-ftl-nomad .robot-main .robot-skills .robot-skill {
|
||||
@@ -1722,9 +1754,6 @@ i.fvtt-ftl-nomad {
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .sheet-tabs {
|
||||
background-color: var(--color-light-1);
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-main {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
@@ -1815,6 +1844,18 @@ i.fvtt-ftl-nomad {
|
||||
.fvtt-ftl-nomad .starship-main .starship-pc .starship-right .cargo select {
|
||||
max-width: 5rem;
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-main .starship-pc .starship-right .cargo .npc-crew-field {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-main .starship-pc .starship-right .cargo .npc-crew-field .npc-crew-roll {
|
||||
cursor: pointer;
|
||||
color: var(--color-text-dark-primary);
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-main .starship-pc .starship-right .cargo .npc-crew-field .npc-crew-roll:hover {
|
||||
color: var(--color-text-hyperlink);
|
||||
}
|
||||
.fvtt-ftl-nomad .starship-main .starship-pc .starship-right .starship-infos {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -2209,7 +2250,7 @@ i.fvtt-ftl-nomad {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
justify-content: space-evenly;
|
||||
flex: 1;
|
||||
}
|
||||
.fvtt-ftl-nomad .creature-main .creature-skills .creature-skill {
|
||||
|
||||
25
lang/en.json
25
lang/en.json
@@ -447,6 +447,7 @@
|
||||
"capacity" : "Capacity",
|
||||
"Agility" : "Agility",
|
||||
"Armor": "Armor",
|
||||
"ArmorCritical": "Armor Critical",
|
||||
"cargo": "Cargo",
|
||||
"vehicle": "Vehicle",
|
||||
"starship": "Starship",
|
||||
@@ -475,6 +476,7 @@
|
||||
"Unarmed": "Unarmed",
|
||||
"Vehicle": "Vehicle",
|
||||
"armor": "Armor",
|
||||
"armorCritical": "Armor (Crit.)",
|
||||
"armors": "Armors",
|
||||
"biodata": "Biodata",
|
||||
"biography": "Biography",
|
||||
@@ -527,7 +529,9 @@
|
||||
"weapons": "Weapons",
|
||||
"crew": "Crew",
|
||||
"noCrew": "No crew members assigned",
|
||||
"vehicleBonus": "Vehicle/Starship Agility Bonus"
|
||||
"vehicleBonus": "Vehicle/Starship Agility Bonus",
|
||||
"selectSkill": "Select Skill",
|
||||
"npcCrewSkill": "NPC Crew"
|
||||
},
|
||||
"Language": {
|
||||
"FIELDS": {
|
||||
@@ -613,7 +617,10 @@
|
||||
"label": "Hull Type"
|
||||
},
|
||||
"armor": {
|
||||
"label": "Armor"
|
||||
"label": "Armor (Reg.)"
|
||||
},
|
||||
"armorCritical": {
|
||||
"label": "Armor (Crit.)"
|
||||
},
|
||||
"guns" : {
|
||||
"label": "Guns"
|
||||
@@ -639,6 +646,9 @@
|
||||
"crewCapacity": {
|
||||
"label": "Crew Capacity"
|
||||
},
|
||||
"npcCrew": {
|
||||
"label": "NPC Skill"
|
||||
},
|
||||
"description": {
|
||||
"label": "Description"
|
||||
},
|
||||
@@ -713,7 +723,10 @@
|
||||
"label": "Speed"
|
||||
},
|
||||
"armor": {
|
||||
"label": "Armor"
|
||||
"label": "Armor (Reg.)"
|
||||
},
|
||||
"armorCritical": {
|
||||
"label": "Armor (Crit.)"
|
||||
},
|
||||
"crew": {
|
||||
"label": "Crew"
|
||||
@@ -721,6 +734,9 @@
|
||||
"crewCapacity": {
|
||||
"label": "Crew Capacity"
|
||||
},
|
||||
"npcCrew": {
|
||||
"label": "NPC Skill"
|
||||
},
|
||||
"description": {
|
||||
"label": "Description"
|
||||
},
|
||||
@@ -736,6 +752,8 @@
|
||||
"alreadyInCrew": "This actor is already a crew member",
|
||||
"notACharacter": "Only characters can pilot vehicles",
|
||||
"noVehiclesSkill": "This character does not have the vehicles skill",
|
||||
"noSkills": "This character does not have any skills",
|
||||
"noNpcCrew": "NPC Crew level is below 0",
|
||||
"onlyCharactersAllowed": "Only characters can be added as crew members",
|
||||
"noLinkedPrototype": "This character must be linked to his token to be added as crew member"
|
||||
},
|
||||
@@ -744,6 +762,7 @@
|
||||
"RemoveCrewContent": "Are you sure you want to remove {name} from the crew?",
|
||||
"PilotVehicle": "Pilot vehicle (with vehicle agility bonus)",
|
||||
"PilotStarship": "Pilot starship (with starship agility bonus)",
|
||||
"RollNpcCrew": "Roll for NPC Crew",
|
||||
"Weapon": {
|
||||
"FIELDS": {
|
||||
"cost": {
|
||||
|
||||
@@ -17,6 +17,7 @@ export default class FTLNomadStarshipSheet extends FTLNomadActorSheet {
|
||||
removeCrew: FTLNomadStarshipSheet.#onRemoveCrew,
|
||||
viewCrew: FTLNomadStarshipSheet.#onViewCrew,
|
||||
pilotCrew: FTLNomadStarshipSheet.#onPilotCrew,
|
||||
rollNpcCrew: FTLNomadStarshipSheet.#onRollNpcCrew,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -81,20 +82,25 @@ export default class FTLNomadStarshipSheet extends FTLNomadActorSheet {
|
||||
// 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"))
|
||||
// Get all skills from the actor
|
||||
const actorSkills = actor.system.skills
|
||||
if (!actorSkills) {
|
||||
ui.notifications.warn(game.i18n.localize("FTLNOMAD.Warning.noSkills"))
|
||||
return
|
||||
}
|
||||
|
||||
// Default to vehicles skill
|
||||
const defaultSkill = actorSkills.vehicles || Object.values(actorSkills)[0]
|
||||
|
||||
// Import the Roll class
|
||||
const FTLNomadRoll = (await import("../../documents/roll.mjs")).default
|
||||
|
||||
// Call the roll prompt with the starship agility as a vehicle bonus
|
||||
// Call the roll prompt with all skills available and starship agility as a vehicle bonus
|
||||
let roll = await FTLNomadRoll.prompt({
|
||||
rollType: "skill",
|
||||
rollItem: vehiclesSkill,
|
||||
rollItem: defaultSkill,
|
||||
availableSkills: actorSkills,
|
||||
selectedSkillId: "vehicles",
|
||||
actorId: actor.id,
|
||||
actorName: actor.name,
|
||||
actorImage: actor.img,
|
||||
@@ -108,6 +114,48 @@ export default class FTLNomadStarshipSheet extends FTLNomadActorSheet {
|
||||
await roll.toMessage({}, { rollMode: roll.options.rollMode })
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll a check for NPC crew with starship agility bonus
|
||||
* @param {Event} event The initiating click event
|
||||
* @param {HTMLElement} target The current target of the event listener
|
||||
*/
|
||||
static async #onRollNpcCrew(event, target) {
|
||||
const npcCrewLevel = this.document.system.npcCrew || 0
|
||||
|
||||
if (npcCrewLevel < 0) {
|
||||
ui.notifications.warn(game.i18n.localize("FTLNOMAD.Warning.noNpcCrew"))
|
||||
return
|
||||
}
|
||||
|
||||
// Get starship agility bonus
|
||||
const starshipAgility = this.document.system.agility || 0
|
||||
|
||||
// Create a fake skill object for the NPC crew
|
||||
const npcSkill = {
|
||||
value: npcCrewLevel,
|
||||
label: "FTLNOMAD.Label.npcCrewSkill"
|
||||
}
|
||||
|
||||
// Import the Roll class
|
||||
const FTLNomadRoll = (await import("../../documents/roll.mjs")).default
|
||||
|
||||
// Call the roll prompt with NPC crew level as skill
|
||||
let roll = await FTLNomadRoll.prompt({
|
||||
rollType: "skill",
|
||||
rollItem: npcSkill,
|
||||
actorId: this.document.id,
|
||||
actorName: `${this.document.name} (NPC Crew)`,
|
||||
actorImage: this.document.img,
|
||||
talents: [],
|
||||
isEncumbered: false,
|
||||
hasTarget: false,
|
||||
vehicleBonus: starshipAgility
|
||||
})
|
||||
if (!roll) return null
|
||||
|
||||
await roll.toMessage({}, { rollMode: roll.options.rollMode })
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
|
||||
@@ -5,8 +5,8 @@ export default class FTLNomadVehicleSheet extends FTLNomadActorSheet {
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ["vehicle"],
|
||||
position: {
|
||||
width: 680,
|
||||
height: 540,
|
||||
width: 720,
|
||||
height: 640,
|
||||
},
|
||||
window: {
|
||||
contentClasses: ["vehicle-content"],
|
||||
@@ -17,6 +17,7 @@ export default class FTLNomadVehicleSheet extends FTLNomadActorSheet {
|
||||
removeCrew: FTLNomadVehicleSheet.#onRemoveCrew,
|
||||
viewCrew: FTLNomadVehicleSheet.#onViewCrew,
|
||||
pilotCrew: FTLNomadVehicleSheet.#onPilotCrew,
|
||||
rollNpcCrew: FTLNomadVehicleSheet.#onRollNpcCrew,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -81,20 +82,25 @@ export default class FTLNomadVehicleSheet extends FTLNomadActorSheet {
|
||||
// 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"))
|
||||
// Get all skills from the actor
|
||||
const actorSkills = actor.system.skills
|
||||
if (!actorSkills) {
|
||||
ui.notifications.warn(game.i18n.localize("FTLNOMAD.Warning.noSkills"))
|
||||
return
|
||||
}
|
||||
|
||||
// Default to vehicles skill
|
||||
const defaultSkill = actorSkills.vehicles || Object.values(actorSkills)[0]
|
||||
|
||||
// Import the Roll class
|
||||
const FTLNomadRoll = (await import("../../documents/roll.mjs")).default
|
||||
|
||||
// Call the roll prompt with the vehicle agility as a vehicle bonus
|
||||
// Call the roll prompt with all skills available and vehicle agility as a vehicle bonus
|
||||
let roll = await FTLNomadRoll.prompt({
|
||||
rollType: "skill",
|
||||
rollItem: vehiclesSkill,
|
||||
rollItem: defaultSkill,
|
||||
availableSkills: actorSkills,
|
||||
selectedSkillId: "vehicles",
|
||||
actorId: actor.id,
|
||||
actorName: actor.name,
|
||||
actorImage: actor.img,
|
||||
@@ -108,6 +114,48 @@ export default class FTLNomadVehicleSheet extends FTLNomadActorSheet {
|
||||
await roll.toMessage({}, { rollMode: roll.options.rollMode })
|
||||
}
|
||||
|
||||
/**
|
||||
* Roll a check for NPC crew with vehicle agility bonus
|
||||
* @param {Event} event The initiating click event
|
||||
* @param {HTMLElement} target The current target of the event listener
|
||||
*/
|
||||
static async #onRollNpcCrew(event, target) {
|
||||
const npcCrewLevel = this.document.system.npcCrew || 0
|
||||
|
||||
if (npcCrewLevel < 0) {
|
||||
ui.notifications.warn(game.i18n.localize("FTLNOMAD.Warning.noNpcCrew"))
|
||||
return
|
||||
}
|
||||
|
||||
// Get vehicle agility bonus
|
||||
const vehicleAgility = this.document.system.agility || 0
|
||||
|
||||
// Create a fake skill object for the NPC crew
|
||||
const npcSkill = {
|
||||
value: npcCrewLevel,
|
||||
label: "FTLNOMAD.Label.npcCrewSkill"
|
||||
}
|
||||
|
||||
// Import the Roll class
|
||||
const FTLNomadRoll = (await import("../../documents/roll.mjs")).default
|
||||
|
||||
// Call the roll prompt with NPC crew level as skill
|
||||
let roll = await FTLNomadRoll.prompt({
|
||||
rollType: "skill",
|
||||
rollItem: npcSkill,
|
||||
actorId: this.document.id,
|
||||
actorName: `${this.document.name} (NPC Crew)`,
|
||||
actorImage: this.document.img,
|
||||
talents: [],
|
||||
isEncumbered: false,
|
||||
hasTarget: false,
|
||||
vehicleBonus: vehicleAgility
|
||||
})
|
||||
if (!roll) return null
|
||||
|
||||
await roll.toMessage({}, { rollMode: roll.options.rollMode })
|
||||
}
|
||||
|
||||
/** @override */
|
||||
static PARTS = {
|
||||
main: {
|
||||
|
||||
@@ -67,7 +67,7 @@ export default class FTLNomadRoll extends Roll {
|
||||
} else {
|
||||
let mod = options.rollItem?.value || 0
|
||||
fullFormula = `${options.formula} + ${options.skillModifier}D + ${mod} + ${options.rangeModifier}D + ${options.numericModifier}D + ${options.numericModifierSelect}`
|
||||
if (options.vehicleBonus) {
|
||||
if (options.vehicleBonus && options.useVehicleBonus) {
|
||||
fullFormula += ` + ${options.vehicleBonus}`
|
||||
}
|
||||
}
|
||||
@@ -140,16 +140,28 @@ export default class FTLNomadRoll extends Roll {
|
||||
options.rangeModifier = rangeModifier
|
||||
options.damageModifier = damageModifier
|
||||
options.vehicleBonus = options.vehicleBonus || 0
|
||||
options.useVehicleBonus = true // Par défaut, le bonus est activé
|
||||
let fullFormula = `${formula} + ${options.rollItem.value}`
|
||||
if (options.isEncumbered) {
|
||||
fullFormula += ` - 1D`
|
||||
}
|
||||
if (options.vehicleBonus) {
|
||||
if (options.vehicleBonus && options.useVehicleBonus) {
|
||||
fullFormula += ` + ${options.vehicleBonus}`
|
||||
}
|
||||
options.fullFormula = fullFormula
|
||||
options.formula = formula
|
||||
|
||||
// Prepare available skills if provided (for vehicle/starship piloting)
|
||||
let availableSkills = null
|
||||
if (options.availableSkills) {
|
||||
availableSkills = Object.entries(options.availableSkills).map(([id, skill]) => ({
|
||||
id: id,
|
||||
label: skill.label,
|
||||
value: skill.value,
|
||||
selected: id === options.selectedSkillId
|
||||
}))
|
||||
}
|
||||
|
||||
let dialogContext = {
|
||||
actorId: options.actorId,
|
||||
actorName: options.actorName,
|
||||
@@ -172,6 +184,7 @@ export default class FTLNomadRoll extends Roll {
|
||||
modifier,
|
||||
numericModifierSelect,
|
||||
vehicleBonus: options.vehicleBonus,
|
||||
availableSkills: availableSkills,
|
||||
}
|
||||
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-ftl-nomad/templates/roll-dialog.hbs", dialogContext)
|
||||
|
||||
@@ -198,6 +211,14 @@ export default class FTLNomadRoll extends Roll {
|
||||
rejectClose: false, // Click on Close button will not launch an error
|
||||
render: (event, dialog) => {
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
$(".roll-skill-selector").change(event => {
|
||||
const skillId = event.target.value
|
||||
if (options.availableSkills && options.availableSkills[skillId]) {
|
||||
options.rollItem = foundry.utils.duplicate(options.availableSkills[skillId])
|
||||
options.selectedSkillId = skillId
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
}
|
||||
})
|
||||
$(".roll-skill-modifier").change(event => {
|
||||
options.skillModifier = Number(event.target.value)
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
@@ -224,6 +245,10 @@ export default class FTLNomadRoll extends Roll {
|
||||
}
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
})
|
||||
$(".use-vehicle-bonus").change(event => {
|
||||
options.useVehicleBonus = event.target.checked
|
||||
FTLNomadRoll.updateFullFormula(options)
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
@@ -237,14 +262,22 @@ export default class FTLNomadRoll extends Roll {
|
||||
|
||||
if (Hooks.call("fvtt-ftl-nomad.preRoll", options, rollData) === false) return
|
||||
|
||||
// Update rollItem if a skill was selected from the dropdown
|
||||
if (rollData.selectedSkill && options.availableSkills) {
|
||||
options.rollItem = foundry.utils.duplicate(options.availableSkills[rollData.selectedSkill])
|
||||
}
|
||||
|
||||
options.numericModifier = Number(rollData.numericModifier) || 0
|
||||
options.skillModifier = Number(rollData.skillModifier) || 0
|
||||
options.rangeModifier = Number(rollData.rangeModifier) || 0
|
||||
options.numericModifierSelect = Number(rollData.numericModifierSelect) || 0
|
||||
options.useVehicleBonus = rollData.useVehicleBonus !== "off" && rollData.useVehicleBonus !== false
|
||||
options.finalModifier = options.numericModifier + options.skillModifier + options.rangeModifier
|
||||
let mod = options.rollItem?.value || 0
|
||||
mod += options.numericModifierSelect
|
||||
if (options.useVehicleBonus) {
|
||||
mod += options.vehicleBonus || 0
|
||||
}
|
||||
|
||||
// Build the dice formula
|
||||
let diceFormula = "2d6"
|
||||
|
||||
@@ -11,8 +11,10 @@ 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.armorCritical = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.crewList = new fields.ArrayField(new fields.StringField({ required: true }), { initial: [] })
|
||||
schema.crewCapacity = new fields.StringField({ required: true, initial: "" })
|
||||
schema.npcCrew = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.cargo = new fields.StringField({ required: true, initial: "" })
|
||||
schema.guns = new fields.StringField({ required: true, initial: "1d6" })
|
||||
schema.travelMultiplier = new fields.StringField({ required: true, initial: "" })
|
||||
|
||||
@@ -9,9 +9,11 @@ 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.armorCritical = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.cargo = new fields.StringField({ required: true, initial: "" })
|
||||
schema.crewList = new fields.ArrayField(new fields.StringField({ required: true }), { initial: [] })
|
||||
schema.crewCapacity = new fields.StringField({ required: true, initial: "" })
|
||||
schema.npcCrew = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||
schema.force = new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 })
|
||||
schema.range = new fields.StringField({ required: true, initial: "1d6" })
|
||||
schema.speed = new fields.StringField({ required: true, initial: "1d6" })
|
||||
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000120
|
||||
MANIFEST-000132
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
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)
|
||||
2025/11/11-09:55:29.500472 7f0922ffd6c0 Recovering log #130
|
||||
2025/11/11-09:55:29.510925 7f0922ffd6c0 Delete type=3 #128
|
||||
2025/11/11-09:55:29.511008 7f0922ffd6c0 Delete type=0 #130
|
||||
2025/11/11-12:13:09.876661 7f0920bff6c0 Level-0 table #135: started
|
||||
2025/11/11-12:13:09.876709 7f0920bff6c0 Level-0 table #135: 0 bytes OK
|
||||
2025/11/11-12:13:09.882679 7f0920bff6c0 Delete type=0 #133
|
||||
2025/11/11-12:13:09.882804 7f0920bff6c0 Manual compaction at level-0 from '!folders!AuBtSOj1mJmh88qx' @ 72057594037927935 : 1 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
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)
|
||||
2025/11/11-09:17:46.334216 7f0921ffb6c0 Recovering log #126
|
||||
2025/11/11-09:17:46.344001 7f0921ffb6c0 Delete type=3 #124
|
||||
2025/11/11-09:17:46.344052 7f0921ffb6c0 Delete type=0 #126
|
||||
2025/11/11-09:53:31.537774 7f0920bff6c0 Level-0 table #131: started
|
||||
2025/11/11-09:53:31.537826 7f0920bff6c0 Level-0 table #131: 0 bytes OK
|
||||
2025/11/11-09:53:31.544859 7f0920bff6c0 Delete type=0 #129
|
||||
2025/11/11-09:53:31.558512 7f0920bff6c0 Manual compaction at level-0 from '!folders!AuBtSOj1mJmh88qx' @ 72057594037927935 : 1 .. '!items!zv9dwgL3p7ThQn7j' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000098
|
||||
MANIFEST-000110
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
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)
|
||||
2025/11/11-09:55:29.516089 7f0921ffb6c0 Recovering log #108
|
||||
2025/11/11-09:55:29.525977 7f0921ffb6c0 Delete type=3 #106
|
||||
2025/11/11-09:55:29.526050 7f0921ffb6c0 Delete type=0 #108
|
||||
2025/11/11-12:13:09.863976 7f0920bff6c0 Level-0 table #113: started
|
||||
2025/11/11-12:13:09.864017 7f0920bff6c0 Level-0 table #113: 0 bytes OK
|
||||
2025/11/11-12:13:09.870509 7f0920bff6c0 Delete type=0 #111
|
||||
2025/11/11-12:13:09.882783 7f0920bff6c0 Manual compaction at level-0 from '!actors!0FQ6XaRi24OorI21' @ 72057594037927935 : 1 .. '!folders!vRnrOJqSMlxbSgyX' @ 0 : 0; will stop at (end)
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
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)
|
||||
2025/11/11-09:17:46.347112 7f09217fa6c0 Recovering log #104
|
||||
2025/11/11-09:17:46.357554 7f09217fa6c0 Delete type=3 #102
|
||||
2025/11/11-09:17:46.357636 7f09217fa6c0 Delete type=0 #104
|
||||
2025/11/11-09:53:31.551245 7f0920bff6c0 Level-0 table #109: started
|
||||
2025/11/11-09:53:31.551306 7f0920bff6c0 Level-0 table #109: 0 bytes OK
|
||||
2025/11/11-09:53:31.558404 7f0920bff6c0 Delete type=0 #107
|
||||
2025/11/11-09:53:31.558535 7f0920bff6c0 Manual compaction at level-0 from '!actors!0FQ6XaRi24OorI21' @ 72057594037927935 : 1 .. '!folders!vRnrOJqSMlxbSgyX' @ 0 : 0; will stop at (end)
|
||||
|
||||
Binary file not shown.
@@ -172,7 +172,7 @@
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
justify-content: space-evenly;
|
||||
flex: 1;
|
||||
|
||||
.character-skill {
|
||||
|
||||
@@ -129,7 +129,7 @@
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
justify-content: space-evenly;
|
||||
flex: 1;
|
||||
|
||||
.creature-skill {
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
:root {
|
||||
--font-size-standard: 0.9rem;
|
||||
--font-size-result: 1.4rem;
|
||||
--background-image-base: linear-gradient(rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.8)),
|
||||
--background-image-base: linear-gradient(
|
||||
rgba(255, 255, 255, 0.8),
|
||||
rgba(255, 255, 255, 0.8)
|
||||
),
|
||||
url("../assets/ui/ftl_nomad_background_01.webp");
|
||||
--font-primary: "Atkinson";
|
||||
--font-secondary: "Atkinson";
|
||||
@@ -12,12 +15,14 @@
|
||||
--color-warning: darkorange;
|
||||
--color-critical-success: rgb(21, 39, 204);
|
||||
--color-critical-failure: rgb(141, 32, 231);
|
||||
|
||||
/*--img-icon-color-filter: invert(60%) sepia(12%) saturate(6853%) hue-rotate(81deg) brightness(113%) contrast(104%);*/
|
||||
}
|
||||
|
||||
body {
|
||||
--color-text-secondary: rgb(22, 3, 3);
|
||||
--color-text-emphatic: rgb(9, 97, 14);
|
||||
--input-height: 1.6rem;
|
||||
}
|
||||
|
||||
.d100 {
|
||||
@@ -65,7 +70,7 @@ i.fvtt-ftl-nomad {
|
||||
|
||||
.application.dialog.fvtt-ftl-nomad {
|
||||
font-family: var(--font-primary);
|
||||
font-size: calc(var(--font-size-standard) * 1.0);
|
||||
font-size: calc(var(--font-size-standard) * 1);
|
||||
background-image: var(--background-image-base);
|
||||
button:hover {
|
||||
background: var(--color-dark-6);
|
||||
@@ -75,6 +80,12 @@ i.fvtt-ftl-nomad {
|
||||
}
|
||||
}
|
||||
|
||||
.sheet-tabs {
|
||||
background-color: var(--color-light-1);
|
||||
font-family: Ethnocentric;
|
||||
font-size: 0.7rem;
|
||||
}
|
||||
|
||||
.chat-message,
|
||||
.chat-message.whisper {
|
||||
font-family: var(--font-primary);
|
||||
|
||||
@@ -77,8 +77,8 @@
|
||||
label {
|
||||
font-weight: bold;
|
||||
margin-right: 8px;
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
min-width: 5rem;
|
||||
max-width: 5rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
justify-content: space-evenly;
|
||||
flex: 1;
|
||||
|
||||
.robot-skill {
|
||||
|
||||
@@ -4,10 +4,6 @@
|
||||
overflow: scroll;
|
||||
}
|
||||
|
||||
.sheet-tabs {
|
||||
background-color: var(--color-light-1);
|
||||
}
|
||||
|
||||
.starship-main {
|
||||
background-color: var(--color-light-1);
|
||||
display: flex;
|
||||
@@ -109,6 +105,18 @@
|
||||
select {
|
||||
max-width: 5rem;
|
||||
}
|
||||
.npc-crew-field {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
.npc-crew-roll {
|
||||
cursor: pointer;
|
||||
color: var(--color-text-dark-primary);
|
||||
&:hover {
|
||||
color: var(--color-text-hyperlink);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.starship-infos {
|
||||
|
||||
@@ -33,6 +33,15 @@
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
|
||||
.spec {
|
||||
label {
|
||||
max-width: 4rem;
|
||||
}
|
||||
input {
|
||||
max-width: 4rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.vehicle-right {
|
||||
@@ -52,19 +61,35 @@
|
||||
.cargo,
|
||||
.capacity {
|
||||
label {
|
||||
min-width: 4rem;
|
||||
max-width: 4rem;
|
||||
max-width: 7rem;
|
||||
}
|
||||
input {
|
||||
max-width: 6rem;
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
.cargo-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
.cargo-line {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
}
|
||||
.npc-crew-field {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
.npc-crew-roll {
|
||||
cursor: pointer;
|
||||
color: var(--color-text-dark-primary);
|
||||
&:hover {
|
||||
color: var(--color-text-hyperlink);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.vehicle-infos {
|
||||
display: flex;
|
||||
|
||||
@@ -9,10 +9,22 @@
|
||||
{{#if (eq rollType "damage")}}
|
||||
<div class="dialog-skill">Damage : {{weapon.system.damage}}</div>
|
||||
<div class="dialog-skill">Weapon : {{weapon.name}}</div>
|
||||
{{else}}
|
||||
{{#if availableSkills}}
|
||||
<label>{{localize "FTLNOMAD.Label.selectSkill"}}</label>
|
||||
<select name="selectedSkill" class="roll-skill-selector">
|
||||
{{#each availableSkills as |skill|}}
|
||||
<option
|
||||
value="{{skill.id}}"
|
||||
{{#if skill.selected}}selected{{/if}}
|
||||
>{{localize skill.label}} (2d6+{{skill.value}})</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
{{else}}
|
||||
<div class="dialog-skill">{{localize rollItem.label}}
|
||||
: 2d6+{{rollItem.value}}</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
{{#if (eq rollType "weapon")}}
|
||||
<div class="dialog-skill">Weapon : {{weapon.name}}</div>
|
||||
@@ -46,7 +58,15 @@
|
||||
</select>
|
||||
{{#if vehicleBonus}}
|
||||
<div class="vehicle-bonus-info">
|
||||
<label>{{localize "FTLNOMAD.Label.vehicleBonus"}}</label>
|
||||
<label>
|
||||
<input
|
||||
type="checkbox"
|
||||
name="useVehicleBonus"
|
||||
class="use-vehicle-bonus"
|
||||
checked
|
||||
/>
|
||||
{{localize "FTLNOMAD.Label.vehicleBonus"}}
|
||||
</label>
|
||||
<span class="vehicle-bonus-value">+{{vehicleBonus}}</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
@@ -22,12 +22,21 @@
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.armor
|
||||
value=system.armor
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.armorCritical
|
||||
value=system.armorCritical
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
|
||||
{{formField
|
||||
systemFields.endurance
|
||||
value=system.endurance
|
||||
@@ -101,6 +110,21 @@
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
<div class="npc-crew-field">
|
||||
<a
|
||||
class="npc-crew-roll rollable"
|
||||
data-action="rollNpcCrew"
|
||||
data-tooltip="{{localize 'FTLNOMAD.RollNpcCrew'}}"
|
||||
><i class="fas fa-dice-d6"></i></a>
|
||||
{{formField
|
||||
systemFields.npcCrew
|
||||
value=system.npcCrew
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
{{formField
|
||||
systemFields.cargo
|
||||
value=system.cargo
|
||||
|
||||
@@ -13,16 +13,25 @@
|
||||
data-tooltip="{{actor.name}}"
|
||||
/>
|
||||
</div>
|
||||
<fieldset>
|
||||
<legend>{{localize "FTLNOMAD.Label.Agility"}}</legend>
|
||||
<div class="flexrow">
|
||||
<fieldset class="spec">
|
||||
{{formField
|
||||
systemFields.agility
|
||||
value=system.agility
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
{{formField
|
||||
systemFields.armor
|
||||
value=system.armor
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
{{formField
|
||||
systemFields.armorCritical
|
||||
value=system.armorCritical
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
@@ -48,12 +57,6 @@
|
||||
<fieldset class="capacity">
|
||||
<legend>{{localize "FTLNOMAD.Label.capacity"}}</legend>
|
||||
<div class="flexrow">
|
||||
{{formField
|
||||
systemFields.armor
|
||||
value=system.armor
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
{{formField
|
||||
systemFields.force
|
||||
value=system.force
|
||||
@@ -80,12 +83,28 @@
|
||||
<fieldset class="cargo">
|
||||
<legend>{{localize "FTLNOMAD.Label.cargo"}}</legend>
|
||||
<div class="cargo-content">
|
||||
<div class="cargo-line">
|
||||
{{formField
|
||||
systemFields.crewCapacity
|
||||
value=system.crewCapacity
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
<div class="npc-crew-field">
|
||||
<a
|
||||
class="npc-crew-roll rollable"
|
||||
data-action="rollNpcCrew"
|
||||
data-tooltip="{{localize 'FTLNOMAD.RollNpcCrew'}}"
|
||||
><i class="fas fa-dice-d6"></i></a>
|
||||
{{formField
|
||||
systemFields.npcCrew
|
||||
value=system.npcCrew
|
||||
localize=true
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="cargo-line">
|
||||
{{formField
|
||||
systemFields.cargo
|
||||
value=system.cargo
|
||||
@@ -99,6 +118,7 @@
|
||||
disabled=isPlayMode
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user