enables selling of goods

pull/64/head
macniel 2025-11-01 12:26:10 +01:00
parent 95712704b5
commit 1d714a3773
4 changed files with 111 additions and 58 deletions

View File

@ -54,6 +54,63 @@ async function preloadHandlebarsTemplates() {
Hooks.once("init", () => {
const displayCurrency = (data) => {
// schema for Mittelreich: 1 Ducat = 10 Silver = 100 Kreutzer = 1000 Heller
// internally the price is always given in Silver
// so we need to inflate the value of price by 100 to be able to divide beginning from Heller
const baseValue = data * 100
// then we can regex over it
const currencyRegexp = /(.*)(.)(.)(.)/g
const withDucats = currencyRegexp.exec(baseValue)
let _ = undefined
let ducats = 0
let silver = 0
let kreutzer = 0
let heller = 0
if (withDucats) {
[_, ducats, silver, kreutzer, heller] = withDucats
} else {
const currencyRegexp = /(.)(.)(.)/g
const withSilver = currencyRegexp.exec(baseValue)
if (withSilver) {
[_, silver, kreutzer, heller] = withSilver
} else {
const currencyRegexp = /(.)(.)/g
const withKreutzer = currencyRegexp.exec(baseValue)
if (withKreutzer) {
[_, kreutzer, heller] = withKreutzer
} else {
heller = baseValue
}
}
}
let str = `<span class='coins' data-tooltip="${ducats > 0 ? ducats + ' Dukaten ' : ''}${silver > 0 ? silver + ' Silbertaler ' : ''}${kreutzer > 0 ? kreutzer + ' Kreuzer ' : ''}${heller > 0 ? heller + ' Heller' : ''}">`
if (ducats > 0) {
str += ducats + "<i class='symbol ducat'></i>"
}
if (silver > 0) {
str += silver + "<i class='symbol silver'></i>"
}
if (kreutzer > 0) {
str += kreutzer + "<i class='symbol kreutzer'></i>"
}
if (heller > 0) {
str += heller + "<i class='symbol heller'></i>"
}
str = str + "</span>"
return new Handlebars.SafeString(str)
}
game.DSA41 = {
rollItemMacro,
Zonenruestung,
@ -62,7 +119,8 @@ Hooks.once("init", () => {
Wunde,
RestingDialog,
BattleDialog,
Talent
Talent,
displayCurrency
}
// Configure custom Document implementations.
@ -331,62 +389,7 @@ Hooks.once("init", () => {
return new Handlebars.SafeString(tooltip)
})
Handlebars.registerHelper("currency", (data) => {
// schema for Mittelreich: 1 Ducat = 10 Silver = 100 Kreutzer = 1000 Heller
// internally the price is always given in Silver
// so we need to inflate the value of price by 100 to be able to divide beginning from Heller
const baseValue = data * 100
// then we can regex over it
const currencyRegexp = /(.*)(.)(.)(.)/g
const withDucats = currencyRegexp.exec(baseValue)
let _ = undefined
let ducats = 0
let silver = 0
let kreutzer = 0
let heller = 0
if (withDucats) {
[_, ducats, silver, kreutzer, heller] = withDucats
} else {
const currencyRegexp = /(.)(.)(.)/g
const withSilver = currencyRegexp.exec(baseValue)
if (withSilver) {
[_, silver, kreutzer, heller] = withSilver
} else {
const currencyRegexp = /(.)(.)/g
const withKreutzer = currencyRegexp.exec(baseValue)
if (withKreutzer) {
[_, kreutzer, heller] = withKreutzer
} else {
heller = baseValue
}
}
}
let str = `<span class='coins' data-tooltip="${ducats > 0 ? ducats + ' Dukaten ' : ''}${silver > 0 ? silver + ' Silbertaler ' : ''}${kreutzer > 0 ? kreutzer + ' Kreuzer ' : ''}${heller > 0 ? heller + ' Heller' : ''}">`
if (ducats > 0) {
str += ducats + "<i class='symbol ducat'></i>"
}
if (silver > 0) {
str += silver + "<i class='symbol silver'></i>"
}
if (kreutzer > 0) {
str += kreutzer + "<i class='symbol kreutzer'></i>"
}
if (heller > 0) {
str += heller + "<i class='symbol heller'></i>"
}
str = str + "</span>"
return new Handlebars.SafeString(str)
})
Handlebars.registerHelper("currency", game.DSA41.displayCurrency)
return preloadHandlebarsTemplates();
})

View File

@ -310,6 +310,11 @@ export class Character extends Actor {
return updateObject;
}
reduceWealth(by) {
console.log('Reichtum reduziert um ', by)
return true
}
isWorn(itemId) {

View File

@ -20,6 +20,7 @@ export class MerchantSheet extends HandlebarsApplicationMixin(ActorSheetV2) {
resizable: true,
},
actions: {
buy: MerchantSheet.#buyWare,
editImage: DocumentSheetV2.DEFAULT_OPTIONS.actions.editImage,
editServiceImage: MerchantSheet.#editServiceImage,
editNewServiceImage: MerchantSheet.#editNewServiceImage,
@ -81,6 +82,50 @@ export class MerchantSheet extends HandlebarsApplicationMixin(ActorSheetV2) {
await this.document.update(formData.object) // Note: formData.object
}
static async #buyWare(event, target) {
const {itemId} = target.dataset
const item = this.document.items.get(itemId)
let selections = ''
game.actors.filter(p => p.isOwner).forEach(actor => {
selections += `<option value=${actor.id}>${actor.name}</option>`
})
const actorId = await foundry.applications.api.DialogV2.prompt({
window: {title: `${item.name} kaufen mit wem?`},
content: `<select name="actor">${selections}</select>`,
ok: {
label: `Kaufen`,
callback: (event, button, dialog) => button.form.elements.actor.value
}
});
const actor = game.actors.get(actorId)
let wealth = 0
actor.itemTypes["Equipment"].forEach(coin => {
if (coin.system.category.indexOf("Währung") !== -1) {
wealth += (coin.system.quantity * coin.system.currencyDenominator)
}
})
if (wealth >= item.system.price) {
actor.reduceWealth(item.system.price)
actor.createEmbeddedDocuments('Item', [item])
this.document.deleteEmbeddedDocuments('Item', [item._id])
} else {
ui.notifications.error(item.name + " ist zu teuer für " + actor.name)
}
console.log(actorId)
}
static async #removeService(event, target) {
const {rowId} = target.dataset;

View File

@ -8,7 +8,7 @@
<img src="{{this.img}}" style="width: 32px; height: 32px;"/>
<span class="name">{{this.name}}</span>
<span class="price">{{currency this.system.price}}</span>
<button><i class="fa-solid fa-coins"></i></button>
<button data-action="buy" data-item-id="{{this._id}}"><i class="fa-solid fa-coins"></i></button>
</div>
{{/each}}
</div>