Add spells rolls and enhance CSS styling
- Add spell roll functionality to character sheets - Enhance CSS and LESS styling for better visual presentation - Update character templates and models - Remove old backup files (roll-old.mjs, roll.mjs.backup) - Improve character combat and equipment templates - Update utility functions and actor documents Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
@@ -18,10 +18,15 @@ export default class PrismRPGCharacterSheet extends PrismRPGActorSheet {
|
||||
rollInitiative: PrismRPGCharacterSheet.#onRollInitiative,
|
||||
armorHitPointsPlus: PrismRPGCharacterSheet.#onArmorHitPointsPlus,
|
||||
armorHitPointsMinus: PrismRPGCharacterSheet.#onArmorHitPointsMinus,
|
||||
armorPointsPlus: PrismRPGCharacterSheet.#onArmorPointsPlus,
|
||||
armorPointsMinus: PrismRPGCharacterSheet.#onArmorPointsMinus,
|
||||
actionPointsPlus: PrismRPGCharacterSheet.#onActionPointsPlus,
|
||||
actionPointsMinus: PrismRPGCharacterSheet.#onActionPointsMinus,
|
||||
manaPointsPlus: PrismRPGCharacterSheet.#onManaPointsPlus,
|
||||
manaPointsMinus: PrismRPGCharacterSheet.#onManaPointsMinus,
|
||||
hpPlus: PrismRPGCharacterSheet.#onHpPlus,
|
||||
hpMinus: PrismRPGCharacterSheet.#onHpMinus,
|
||||
postItemToChat: PrismRPGCharacterSheet.#onPostItemToChat,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -158,43 +163,215 @@ export default class PrismRPGCharacterSheet extends PrismRPGActorSheet {
|
||||
await this.document.system.rollInitiative()
|
||||
}
|
||||
|
||||
static #onArmorHitPointsPlus(event, target) {
|
||||
static async #onArmorHitPointsPlus(event, target) {
|
||||
let armorHP = this.actor.system.combat.armorHitPoints
|
||||
armorHP += 1
|
||||
this.actor.update({ "system.combat.armorHitPoints": armorHP })
|
||||
}
|
||||
|
||||
static #onArmorHitPointsMinus(event, target) {
|
||||
static async #onArmorHitPointsMinus(event, target) {
|
||||
let armorHP = this.actor.system.combat.armorHitPoints
|
||||
armorHP -= 1
|
||||
this.actor.update({ "system.combat.armorHitPoints": Math.max(armorHP, 0) })
|
||||
}
|
||||
|
||||
static #onManaPointsPlus(event, target) {
|
||||
static async #onManaPointsPlus(event, target) {
|
||||
let mana = this.actor.system.manaPoints.value
|
||||
mana += 1
|
||||
this.actor.update({ "system.manaPoints.value": Math.min(mana, this.actor.system.manaPoints.max) })
|
||||
}
|
||||
|
||||
static #onManaPointsMinus(event, target) {
|
||||
static async #onManaPointsMinus(event, target) {
|
||||
let mana = this.actor.system.manaPoints.value
|
||||
mana -= 1
|
||||
this.actor.update({ "system.manaPoints.value": Math.max(mana, 0) })
|
||||
}
|
||||
|
||||
static #onHpPlus(event, target) {
|
||||
static async #onArmorPointsPlus(event, target) {
|
||||
let armor = this.actor.system.armorPoints.value
|
||||
armor += 1
|
||||
this.actor.update({ "system.armorPoints.value": Math.min(armor, this.actor.system.armorPoints.max) })
|
||||
}
|
||||
|
||||
static async #onArmorPointsMinus(event, target) {
|
||||
let armor = this.actor.system.armorPoints.value
|
||||
armor -= 1
|
||||
this.actor.update({ "system.armorPoints.value": Math.max(armor, 0) })
|
||||
}
|
||||
|
||||
static async#onActionPointsPlus(event, target) {
|
||||
let actionPoints = this.actor.system.actionPoints.value
|
||||
actionPoints += 1
|
||||
this.actor.update({ "system.actionPoints.value": Math.min(actionPoints, this.actor.system.actionPoints.max) })
|
||||
}
|
||||
|
||||
static async#onActionPointsMinus(event, target) {
|
||||
let actionPoints = this.actor.system.actionPoints.value
|
||||
actionPoints -= 1
|
||||
this.actor.update({ "system.actionPoints.value": Math.max(actionPoints, 0) })
|
||||
}
|
||||
|
||||
static async#onHpPlus(event, target) {
|
||||
let hp = this.actor.system.hp.value
|
||||
hp += 1
|
||||
this.actor.update({ "system.hp.value": Math.min(hp, this.actor.system.hp.max) })
|
||||
}
|
||||
|
||||
static #onHpMinus(event, target) {
|
||||
static async#onHpMinus(event, target) {
|
||||
let hp = this.actor.system.hp.value
|
||||
hp -= 1
|
||||
this.actor.update({ "system.hp.value": Math.max(hp, 0) })
|
||||
}
|
||||
|
||||
static #onCreateEquipment(event, target) {
|
||||
static async #onCreateEquipment(event, target) {
|
||||
}
|
||||
|
||||
static async #onPostItemToChat(event, target) {
|
||||
console.log("PRISM RPG | PostItemToChat action triggered", { event: event, target: target })
|
||||
|
||||
// Try to find the item element from the clicked target or its parents
|
||||
let itemElement = null
|
||||
|
||||
// First try with the target (the actual clicked element)
|
||||
if (event.target) {
|
||||
itemElement = event.target.closest('[data-item-id]')
|
||||
}
|
||||
|
||||
// If not found, try with currentTarget (the element with the action)
|
||||
if (!itemElement && event.currentTarget) {
|
||||
itemElement = event.currentTarget.closest('[data-item-id]')
|
||||
}
|
||||
|
||||
// If still not found, try with the target parameter
|
||||
if (!itemElement && target) {
|
||||
itemElement = target.closest('[data-item-id]')
|
||||
}
|
||||
|
||||
console.log("PRISM RPG | Found item element", { itemElement: itemElement })
|
||||
|
||||
if (!itemElement) {
|
||||
console.warn("PRISM RPG | Could not find item element for posting to chat")
|
||||
return
|
||||
}
|
||||
|
||||
const itemId = itemElement.dataset.itemId
|
||||
|
||||
if (!itemId) {
|
||||
console.warn("PRISM RPG | Item ID not found for posting to chat")
|
||||
return
|
||||
}
|
||||
|
||||
const item = this.actor.items.get(itemId)
|
||||
|
||||
if (!item) {
|
||||
console.warn("PRISM RPG | Item not found for posting to chat", { itemId: itemId })
|
||||
return
|
||||
}
|
||||
|
||||
// Create a chat message with the item data
|
||||
const speaker = ChatMessage.getSpeaker({ actor: this.actor })
|
||||
const content = await this.formatItemForChat(item)
|
||||
|
||||
await ChatMessage.create({
|
||||
content: content,
|
||||
speaker: speaker,
|
||||
})
|
||||
}
|
||||
|
||||
async formatItemForChat(item) {
|
||||
// Format the item data for chat display
|
||||
const itemTypeClass = `${item.type}-item`
|
||||
let htmlContent = `
|
||||
<div class="prismrpg-item-chat-card ${itemTypeClass}">
|
||||
<div class="item-header">
|
||||
<h3>${item.name}</h3>
|
||||
<span class="item-type">${game.i18n.localize(`TYPES.Item.${item.type}`) || item.type}</span>
|
||||
</div>
|
||||
`
|
||||
|
||||
// Add item image if available
|
||||
if (item.img && !item.img.includes('icons/svg/mystery-man.svg')) {
|
||||
htmlContent += `<div class="item-image"><img src="${item.img}" alt="${item.name}"></div>`
|
||||
}
|
||||
|
||||
// Add item description if available
|
||||
if (item.system.description && item.system.description.trim() !== '') {
|
||||
const enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(item.system.description, { async: true })
|
||||
htmlContent += `<div class="item-description">${enrichedDescription}</div>`
|
||||
}
|
||||
|
||||
// Add specific item data based on item type
|
||||
htmlContent += `<div class="item-details">`
|
||||
|
||||
switch (item.type) {
|
||||
case 'weapon':
|
||||
htmlContent += `
|
||||
<div class="item-detail"><strong>Type:</strong> ${item.system.weaponType || 'Unknown'}</div>
|
||||
<div class="item-detail"><strong>Damage:</strong> ${item.system.damage || 'N/A'}</div>
|
||||
<div class="item-detail"><strong>APC:</strong> ${item.system.apc || 0}</div>
|
||||
`
|
||||
if (item.system.damageType) {
|
||||
const damageTypes = []
|
||||
if (item.system.damageType.piercing) damageTypes.push('Piercing')
|
||||
if (item.system.damageType.bludgeoning) damageTypes.push('Bludgeoning')
|
||||
if (item.system.damageType.slashing) damageTypes.push('Slashing')
|
||||
if (damageTypes.length > 0) {
|
||||
htmlContent += `<div class="item-detail"><strong>Damage Type:</strong> ${damageTypes.join('/')}</div>`
|
||||
}
|
||||
}
|
||||
break
|
||||
|
||||
case 'armor':
|
||||
htmlContent += `
|
||||
<div class="item-detail"><strong>Armor Type:</strong> ${item.system.armorType || 'Unknown'}</div>
|
||||
<div class="item-detail"><strong>Armor Points:</strong> ${item.system.armorPoints || 0}</div>
|
||||
<div class="item-detail"><strong>APC:</strong> ${item.system.apc || 0}</div>
|
||||
`
|
||||
break
|
||||
|
||||
case 'shield':
|
||||
htmlContent += `
|
||||
<div class="item-detail"><strong>Shield Type:</strong> ${item.system.shieldType || 'Unknown'}</div>
|
||||
<div class="item-detail"><strong>Armor Points:</strong> ${item.system.armorPoints || 0}</div>
|
||||
<div class="item-detail"><strong>APC:</strong> ${item.system.apc || 0}</div>
|
||||
`
|
||||
break
|
||||
|
||||
case 'skill':
|
||||
htmlContent += `
|
||||
<div class="item-detail"><strong>Modifier:</strong> ${item.system.modifier || 0}</div>
|
||||
<div class="item-detail"><strong>Core Skill:</strong> ${item.system.isCoreSkill ? 'Yes' : 'No'}</div>
|
||||
`
|
||||
break
|
||||
|
||||
case 'spell':
|
||||
htmlContent += `
|
||||
<div class="item-detail"><strong>Level:</strong> ${item.system.level || 'Unknown'}</div>
|
||||
<div class="item-detail"><strong>Mana Cost:</strong> ${item.system.manaCost || 0}</div>
|
||||
<div class="item-detail"><strong>Casting Time:</strong> ${item.system.castingTime || 'N/A'}</div>
|
||||
`
|
||||
break
|
||||
|
||||
case 'miracle':
|
||||
htmlContent += `
|
||||
<div class="item-detail"><strong>Prayer Time:</strong> ${item.system.prayerTime || 'N/A'}</div>
|
||||
`
|
||||
break
|
||||
|
||||
case 'equipment':
|
||||
htmlContent += `
|
||||
<div class="item-detail"><strong>Weight:</strong> ${item.system.weight || 'N/A'}</div>
|
||||
`
|
||||
break
|
||||
|
||||
default:
|
||||
// For other item types, just show basic info
|
||||
htmlContent += `<div class="item-detail"><strong>Item Type:</strong> ${item.type}</div>`
|
||||
}
|
||||
|
||||
htmlContent += `</div></div>`
|
||||
|
||||
return htmlContent
|
||||
}
|
||||
|
||||
_onRender(context, options) {
|
||||
|
||||
Reference in New Issue
Block a user