From a05e6de1f11816e688ab3999b2bf025e61640da9 Mon Sep 17 00:00:00 2001 From: AngryBeaver Date: Sat, 15 Oct 2022 00:04:13 +0200 Subject: [PATCH] add RollTable as result --- README.md | 37 +++++-- lang/en.json | 7 +- module.json | 2 +- package.json | 2 +- pictures/rollTable.png | Bin 0 -> 63195 bytes src/Crafting.ts | 129 ++++++++++++++----------- src/Recipe.ts | 34 ++++--- src/RecipeCompendium.ts | 2 + src/{RecipeSheet.js => RecipeSheet.ts} | 36 ++++--- src/helpers/RollTableToComponent.js | 33 +++++++ src/types.ts | 3 + templates/crafting-chat.hbs | 13 +-- 12 files changed, 195 insertions(+), 103 deletions(-) create mode 100644 pictures/rollTable.png rename src/{RecipeSheet.js => RecipeSheet.ts} (80%) create mode 100644 src/helpers/RollTableToComponent.js diff --git a/README.md b/README.md index fa32f0d..08728ca 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,12 @@ ![Download Count](https://img.shields.io/github/downloads/AngryBeaver/beavers-crafting/total?color=bright-green) ## Work in progress -! Carefull structure will probably change until i finalize this module, + +! Carefully structure will probably change until i finalize this module with version 1.0.0 !, so do not start creating tones of recipes already ! The future upgrades might break them. +! breaking change release: 0.1.x -> 0.2.x ! + ## Features ### Loot subtype Recipe ![img.png](pictures/newItem.png) @@ -17,11 +20,21 @@ Default is "Create New Item" obviously you need to adapt if you have a different ### Configure subtype Recipe ![img.png](pictures/configure.png) -- cost: you may add costs to the crafting process -- ingredients: you add items that will get consumed while crafting -- skill: you may add a skill that is required in the crafting process - - your may check that all costs are payed in the crafting process no matter of success or fail. -- results: you may add items as a result of a successfull crafting process of this recipe. +#### cost: +you may add costs to the crafting process +#### Ingredients: + + +You may add Items via drag and drop as Ingredients. +#### skill: +you may add a skill that is required in the crafting process. +you can enable that costs and ingredients are also payed when the check failed. +#### results: +![img.png](pictures/rollTable.png) + +You may add Items or RollTable via drag and drop as result. +The result is the outcome of a successfull crafting process. +If you add a RollTable you will get quantity amount of rolls on that table not one roll quantity of times. ### Crafting ![img.png](pictures/crafting.png) @@ -41,11 +54,16 @@ or throu recipe compendium You will see a chat message with your result +## latest features: +### 0.2.x feature add rollTable result +you now can produce a random Potion. +breaking change 0.1.x -> 0.2.x + ## Upcoming Changes ### "any" of ingredient -I want to create recipes with "any" weapon or mushroom therefor i may need some new fields in recipe or a new subtype ingredient -### results should include rollTables -I want to create a random potion with random ingredients. +I want to create recipes with "any" xxx e.g. (weapon,mushroom,etc) therefor i may need some new fields in recipe or a new subtype ingredient +### results should include rollTables (done 0.2.x) +I want to create a random potion. ### macro I want to be able to add macros to recipes. giving them more flexibility e.g. get damage on certain recipes where you failed your check. @@ -69,6 +87,5 @@ Actor Items will get merged to stacks in the crafting process. (only those that match ingredients or results) - ## Credits Copy organizational structur from midi-qol (gulpfile,package.json,tsconcig.json) \ No newline at end of file diff --git a/lang/en.json b/lang/en.json index 1e3efa7..3fb892f 100644 --- a/lang/en.json +++ b/lang/en.json @@ -20,7 +20,12 @@ }, "crafting-app": { "title": "Beaver's Recipe Compendium", - "button": "Craft" + "button": "Craft", + "errors": { + "tableNotFound": "RollTable not found for : ", + "tableNotValid": "RollTable return invalid Object : ", + "tableItemNotFound": "Item not found in RollTable for :" + } }, "settings": { "craftById": { diff --git a/module.json b/module.json index e1c405b..fe4d822 100644 --- a/module.json +++ b/module.json @@ -2,7 +2,7 @@ "title": "Beaver's Crafting System", "description": "A Crafting Module for DnD", "id": "beavers-crafting", - "version": "0.1.0", + "version": "0.2.0", "authors": [ { "name": "angryBeaver", diff --git a/package.json b/package.json index cfb142f..e5cfed5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "beavers-crafting", "title": "Beaver's Crafting", - "version": "0.1.0", + "version": "0.2.0", "description": "Crafting", "devDir": "C:\\Users\\User\\AppData\\Local\\FoundryVTT\\Data\\modules", "main": "src/main.js", diff --git a/pictures/rollTable.png b/pictures/rollTable.png new file mode 100644 index 0000000000000000000000000000000000000000..66c035e67c0c0b0b99b95aff19671beb75240320 GIT binary patch literal 63195 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�e!QCg@fz@YG8jQedk*CWVC>N-G4R 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 literal 0 HcmV?d00001 diff --git a/src/Crafting.ts b/src/Crafting.ts index e743fa4..0c147f0 100644 --- a/src/Crafting.ts +++ b/src/Crafting.ts @@ -1,7 +1,8 @@ -import {Recipe} from "./Recipe.js"; +import {DefaultComponent, Recipe} from "./Recipe.js"; import {Exchange} from "./Exchange.js"; import {Settings} from "./Settings.js"; import {DefaultResult, RecipeCompendium} from "./RecipeCompendium.js"; +import {rollTableToComponents} from "./helpers/RollTableToComponent.js"; export class Crafting { recipe: Recipe; @@ -14,57 +15,46 @@ export class Crafting { this.actor = actor; this.item = item; } - static fromOwned(item):Crafting{ + + static fromOwned(item): Crafting { return new Crafting(item.parent, item); } - static async from(actorId, itemId):Promise { + static async from(actorId, itemId): Promise { const actor = await fromUuid("Actor." + actorId) const item = await fromUuid("Item." + itemId); return new Crafting(actor, item); } - async craft():Promise { + async craft(): Promise { const result = await this.checkSkill(); - RecipeCompendium.validateRecipeToItemList(this.recipe,this.actor.items,result); + RecipeCompendium.validateRecipeToItemList(this.recipe, this.actor.items, result); this.checkCurrency(result); - this.addResults(result); + await this.addResults(result); await this.updateActor(result); await this._sendToChat(result); - console.log(result); return result; } - //if you have to comment it, its not clean code ! - addResults(result?:Result):Result { + async checkSkill(result?: Result): Promise { if (!result) result = new DefaultResult(); if (result.hasErrors) return result; - for (const [k, component] of Object.entries(this.recipe.results)) { - const itemChange = RecipeCompendium.findComponentInList(this.actor.items,component); - if (itemChange.toUpdate["system.quantity"] == 0) { // actor does not have item - result.changes.items.toCreate.push(component); //add that item - } else { // actor does have item - const updates = result.changes.items.toUpdate - .filter(x => x._id === itemChange.toUpdate._id); - if (updates.length > 0) { //crafting already updated that item - updates.forEach(x => x["system.quantity"] = x["system.quantity"] + component.quantity) //reupdate it - } else { //crafting does not update that item - if (result.changes.items.toDelete.includes(itemChange.toUpdate._id)) { //crafting deleted that item - result.changes.items.toCreate.push(component); //add that item // now i delete it then create it again. - } else { //on actor but not yet touched - itemChange.toUpdate["system.quantity"] = itemChange.toUpdate["system.quantity"] + component.quantity - result.changes.items.toUpdate.push(itemChange.toUpdate); - result.changes.items.toDelete.push(...itemChange.toDelete); - - } - } + if (this.recipe.skill) { + this.roll = await this.actor.rollSkill(this.recipe.skill.name, {"chatMessage": false}); + result.skill = { + name: this.recipe.skill.name, + difference: this.roll.total - this.recipe.skill.dc, + total: this.roll.total + } + if (this.roll.total < this.recipe.skill.dc) { + result.hasErrors = true; } } return result; } //simple stupid functional but not performant (yagni) - checkCurrency(result?:Result):Result { + checkCurrency(result?: Result): Result { if (!result) result = new DefaultResult(); result.changes.currencies = this.actor.system.currency; if (this.recipe.currency) { @@ -78,40 +68,22 @@ export class Crafting { return result; } - async checkSkill(result?:Result):Promise { + async addResults(result?: Result): Promise { if (!result) result = new DefaultResult(); if (result.hasErrors) return result; - if (this.recipe.skill) { - this.roll = await this.actor.rollSkill(this.recipe.skill.name, {"chatMessage": false}); - result.skill = { - name:this.recipe.skill.name, - difference:this.roll.total-this.recipe.skill.dc, - total:this.roll.total - } - if (this.roll.total < this.recipe.skill.dc) { - result.hasErrors = true; - } + const components = await this._getResultComponents(result); + for (const component of components) { + this._addComponentToResult(result, component); } return result; } - async _sendToChat(result:Result) { - let content = await renderTemplate(`modules/${Settings.NAMESPACE}/templates/crafting-chat.hbs`, - {recipe: this.recipe, result: result, roll: this.roll}) - content = await TextEditor.enrichHTML(content); - ChatMessage.create({ - content: content, - speaker: {actor: this.actor.id}, - }) - } - - - async updateActor(result:Result) { + async updateActor(result: Result) { if (!result) result = new DefaultResult(); - if (result.hasErrors && (!this.recipe.skill?.consume || !result.skill)) return; + if (result.hasException || (result.hasErrors && (!this.recipe.skill?.consume || !result.skill))) return; await this.actor.updateEmbeddedDocuments("Item", result.changes.items.toUpdate); await this.actor.deleteEmbeddedDocuments("Item", result.changes.items.toDelete); - const createItems:any[] = []; + const createItems: any[] = []; for (const component of result.changes.items.toCreate) { if (component.uuid) { const item = await fromUuid(component.uuid); @@ -132,8 +104,53 @@ export class Crafting { return result; } - processId() { - return foundry.utils.randomID(); + async _sendToChat(result: Result) { + let content = await renderTemplate(`modules/${Settings.NAMESPACE}/templates/crafting-chat.hbs`, + {recipe: this.recipe, result: result, roll: this.roll}) + content = TextEditor.enrichHTML(content); + await ChatMessage.create({ + content: content, + speaker: {actor: this.actor.id}, + }) + } + + //if you have to comment it, its not clean code ! + _addComponentToResult(result: Result, component: Component) { + const itemChange = RecipeCompendium.findComponentInList(this.actor.items, component); + if(result.results[component.uuid]){ + DefaultComponent.inc(result.results[component.uuid]) + }else{ + result.results[component.uuid] = component; + } + if (itemChange.toUpdate["system.quantity"] == 0) { // actor does not have item + result.changes.items.toCreate.push(component); //add that item + } else { // actor does have item + const updates = result.changes.items.toUpdate + .filter(x => x._id === itemChange.toUpdate._id); + if (updates.length > 0) { //crafting already updated that item + updates.forEach(x => x["system.quantity"] = x["system.quantity"] + component.quantity) //reupdate it + } else { //crafting does not update that item + if (result.changes.items.toDelete.includes(itemChange.toUpdate._id)) { //crafting deleted that item + result.changes.items.toCreate.push(component); //add that item // now i delete it then create it again. + } else { //on actor but not yet touched + itemChange.toUpdate["system.quantity"] = itemChange.toUpdate["system.quantity"] + component.quantity + result.changes.items.toUpdate.push(itemChange.toUpdate); + result.changes.items.toDelete.push(...itemChange.toDelete); + + } + } + } } + async _getResultComponents(result: Result): Promise { + const items = Object.values(this.recipe.results).filter(component => component.type === "Item"); + const tables = Object.values(this.recipe.results).filter(component => component.type === "RollTable"); + for (const component of tables) { + items.push(...await rollTableToComponents(component, result)); + if (result.hasErrors) return []; + } + return items; + } + + } diff --git a/src/Recipe.ts b/src/Recipe.ts index 44ecb50..5aa2058 100644 --- a/src/Recipe.ts +++ b/src/Recipe.ts @@ -56,27 +56,27 @@ export class Recipe implements RecipeStoreData{ return {...this.results,...this._trash.results} } - addIngredient(entity,uuid) { - if(!this.ingredients[entity.id]){ - this.ingredients[entity.id] = new DefaultComponent(entity,uuid); + addIngredient(entity,uuid,type) { + if(!this.ingredients[uuid]){ + this.ingredients[uuid] = new DefaultComponent(entity,uuid,type); }else{ - DefaultComponent.inc(this.ingredients[entity.id]) + DefaultComponent.inc(this.ingredients[uuid]) } } - removeIngredient(id){ - delete this.ingredients[id]; - this._trash.ingredients["-="+id] = null; + removeIngredient(uuid){ + delete this.ingredients[uuid]; + this._trash.ingredients["-="+uuid] = null; } - addResult(entity,uuid) { - if(!this.results[entity.id]){ - this.results[entity.id] = new DefaultComponent(entity,uuid); + addResult(entity,uuid,type) { + if(!this.results[uuid]){ + this.results[uuid] = new DefaultComponent(entity,uuid,type); }else{ - DefaultComponent.inc(this.results[entity.id]) + DefaultComponent.inc(this.results[uuid]) } } - removeResults(id) { - delete this.results[id]; - this._trash.results["-=" + id] = null; + removeResults(uuid) { + delete this.results[uuid]; + this._trash.results["-=" + uuid] = null; } addSkill() { this.skill = new DefaultSkill(); @@ -103,13 +103,15 @@ export class DefaultComponent implements Component { quantity: number; sourceId: string; uuid: string; + type: string; - constructor(entity,uuid) { + constructor(entity, uuid, type) { this.id = entity.id; this.uuid = uuid; + this.type = type; this.name = entity.name; this.img = entity.img; - this.quantity = entity.system.quantity; + this.quantity = entity.system?.quantity || 1; this.sourceId = entity.flags.core?.sourceId; } diff --git a/src/RecipeCompendium.ts b/src/RecipeCompendium.ts index 449e1ac..b23abb2 100644 --- a/src/RecipeCompendium.ts +++ b/src/RecipeCompendium.ts @@ -121,6 +121,8 @@ export class DefaultResult implements Result { }, currencies: {}, }; + results = {}; hasErrors = false; + hasException:false; isAvailable = true; } \ No newline at end of file diff --git a/src/RecipeSheet.js b/src/RecipeSheet.ts similarity index 80% rename from src/RecipeSheet.js rename to src/RecipeSheet.ts index 94116d2..dbfaf27 100644 --- a/src/RecipeSheet.js +++ b/src/RecipeSheet.ts @@ -4,9 +4,16 @@ import {getCurrencies, getSkills} from "./systems/dnd5e.js" import {RecipeCompendium} from "./RecipeCompendium.js"; import {getDataFrom} from "./apps/CraftingApp.js"; -const recipeSheets = []; +const recipeSheets: { [key: string]: RecipeSheet } = {}; export class RecipeSheet { + app; + item; + editable:boolean; + recipe:Recipe; + recipeElement?; + + static bind(app, html, data) { if(RecipeCompendium.isRecipe(app.item)){ if(!recipeSheets[app.id]){ @@ -94,22 +101,27 @@ export class RecipeSheet { async _onDrop(e) { - const isIngredient = !$(e.target).parents(".beavers-crafting .recipe .ingredients").length ==0; - const isResult = !$(e.target).parents(".beavers-crafting .recipe .results").length ==0; + const isIngredient = $(e.target).parents(".beavers-crafting .recipe .ingredients").length !==0; + const isResult = $(e.target).parents(".beavers-crafting .recipe .results").length !==0; if(!isIngredient && !isResult){ return; } const data = getDataFrom(e); - if(!data || data.type !== "Item") return; - const entity = await fromUuid(data.uuid); - if(entity) { - if(isIngredient){ - this.recipe.addIngredient(entity,data.uuid); - } - if(isResult){ - this.recipe.addResult(entity,data.uuid); + if(data && + (data.type === "Item" || + (data.type === "RollTable" && isResult) + ) + ) { + const entity = await fromUuid(data.uuid); + if (entity) { + if (isIngredient) { + this.recipe.addIngredient(entity, data.uuid,data.type); + } + if (isResult) { + this.recipe.addResult(entity, data.uuid, data.type); + } + this.update(); } - this.update(); } } diff --git a/src/helpers/RollTableToComponent.js b/src/helpers/RollTableToComponent.js new file mode 100644 index 0000000..0e04223 --- /dev/null +++ b/src/helpers/RollTableToComponent.js @@ -0,0 +1,33 @@ +import {DefaultComponent} from "../Recipe.js"; + +export async function rollTableToComponents(component,result) { + const table = await fromUuid(component.uuid); + let components = []; + if (!table) { + ui.notifications.error(game.i18n.localize(`beaversCrafting.crafting-app.errors.tableNotFound`) + component.name); + result.hasErrors = true; + result.hasException = true; + return []; + } + for (let x = 0; x < component.quantity; x++) { + const object = await table.roll(); + for (const r of object.results) { + if (r.documentCollection !== "Item") { + ui.notifications.error(game.i18n.localize(`beaversCrafting.crafting-app.errors.tableNotValid`) + r.name); + result.hasErrors = true; + result.hasException = true; + return []; + }else{ + const item = await fromUuid("Item."+r.documentId); + if(!item){ + ui.notifications.error(game.i18n.localize(`beaversCrafting.crafting-app.errors.tableItemNotFound`) + r.name); + result.hasErrors = true; + result.hasException = true; + return []; + } + components.push(new DefaultComponent(item, item.uuid, r.documentCollection)); + } + } + } + return components; +} \ No newline at end of file diff --git a/src/types.ts b/src/types.ts index fda4549..190c427 100644 --- a/src/types.ts +++ b/src/types.ts @@ -10,6 +10,7 @@ interface Result { } ingredients: { [key: string]: IngredientResult } + results: { [key: string]: Component } currencies: boolean; skill?:{ name: string, @@ -17,6 +18,7 @@ interface Result { difference: number, }; hasErrors:boolean; + hasException:boolean; isAvailable:boolean; } @@ -29,6 +31,7 @@ interface IngredientResult { interface Component { id:string; uuid:string; + type:string; sourceId:string; name:string; img:string; diff --git a/templates/crafting-chat.hbs b/templates/crafting-chat.hbs index 1e3fa76..25ce93d 100644 --- a/templates/crafting-chat.hbs +++ b/templates/crafting-chat.hbs @@ -62,14 +62,15 @@
{{localize "beaversCrafting.recipe.results"}}
{{#unless result.hasErrors}} - {{#each recipe.results}} + {{#each result.results}}
-
-
- {{this.quantity}} -
+
+
+

{{this.quantity}}

+
+
-
{{/each}} {{/unless}}