From eb2aef790efa578d6f517016a71132616847943f Mon Sep 17 00:00:00 2001 From: Ivan Date: Sat, 1 Aug 2026 03:34:51 -0700 Subject: [PATCH 1/8] implement base-engine items --- engine/assets/langs/en.txt | 71 ++++++++++++ engine/items/bisicle.lua | 35 ++++++ engine/items/blanket.lua | 26 +++++ engine/items/butterscotch_pie.lua | 26 +++++ engine/items/cinnamon_bunny.lua | 26 +++++ engine/items/monster_candy.lua | 87 ++++++++++++++ engine/items/nice_cream.lua | 108 ++++++++++++++++++ engine/items/snowman_piece.lua | 26 +++++ engine/items/spider_cider.lua | 26 +++++ engine/items/spider_donut.lua | 80 +++++++++++++ engine/items/temmie_flakes.lua | 26 +++++ engine/items/unisicle.lua | 26 +++++ engine/mods/world_example/assets/langs/en.txt | 14 ++- engine/mods/world_example/mod.lua | 6 +- .../world_example/scripts/items/bisicle2.lua | 35 ++++++ .../scripts/world/shop/dummy_shop.lua | 8 +- engine/utils/utils.lua | 13 +++ 17 files changed, 629 insertions(+), 10 deletions(-) create mode 100644 engine/items/bisicle.lua create mode 100644 engine/items/blanket.lua create mode 100644 engine/items/butterscotch_pie.lua create mode 100644 engine/items/cinnamon_bunny.lua create mode 100644 engine/items/monster_candy.lua create mode 100644 engine/items/nice_cream.lua create mode 100644 engine/items/snowman_piece.lua create mode 100644 engine/items/spider_cider.lua create mode 100644 engine/items/spider_donut.lua create mode 100644 engine/items/temmie_flakes.lua create mode 100644 engine/items/unisicle.lua create mode 100644 engine/mods/world_example/scripts/items/bisicle2.lua diff --git a/engine/assets/langs/en.txt b/engine/assets/langs/en.txt index ed0ec41..a2316ba 100644 --- a/engine/assets/langs/en.txt +++ b/engine/assets/langs/en.txt @@ -103,6 +103,77 @@ ITEM_STICK_SHORTNAME=Stick ITEM_STICK_DESCRIPTION=* "Stick" - Weapon AT 0\n* Its bark is worse than\n its bite. ITEM_STICK_USE=* You threw the stick away.[wait:5]\n* Then picked it back up. +ITEM_MONSTER_CANDY_NAME=Monster Candy +ITEM_MONSTER_CANDY_SHORTNAME=MnstrCndy +ITEM_MONSTER_CANDY_DESCRIPTION=* "Monster Candy" - Heals 10 HP\n* Has a distinct,[wait:5] \n non-licorice flavor. +ITEM_MONSTER_CANDY_DESCRIPTION_SHOP=Heals 10 HP\n(Licorice-\nfree\nguaranteed.) +BATTLE_MONSTER_CANDY_USE=\n* Very un-licorice-like. +BATTLE_MONSTER_CANDY_USE_2=\n* ... tastes like licorice. + +ITEM_SPIDER_DONUT_NAME=Spider Donut +ITEM_SPIDER_DONUT_SHORTNAME=SpidrDont +ITEM_SPIDER_DONUT_SHORTNAME2=SpdrDonut +ITEM_SPIDER_DONUT_DESCRIPTION=* "Spider Donut" - Heals 12 HP\n* A donut made with Spider\n Cider in the batter. +ITEM_SPIDER_DONUT_DESCRIPTION_SHOP=undefined +BATTLE_SPIDER_DONUT_USE=* Don't worry,[wait:5] Spider didn't. + +ITEM_SPIDER_CIDER_NAME=Spider Cider +ITEM_SPIDER_CIDER_SHORTNAME=SpidrCidr +ITEM_SPIDER_CIDER_SHORTNAME2=SpdrCider +ITEM_SPIDER_CIDER_DESCRIPTION=* "Spider Cider" - Heals 24 HP\n* Made with whole spiders,[wait:5]\n not just the juice. +ITEM_SPIDER_CIDER_DESCRIPTION_SHOP=undefined + +ITEM_BUTTERSCOTCH_PIE_NAME=Butterscotch Pie +ITEM_BUTTERSCOTCH_PIE_SHORTNAME=ButtsPie +ITEM_BUTTERSCOTCH_PIE_SHORTNAME2=Pie +ITEM_BUTTERSCOTCH_PIE_DESCRIPTION=* "Butterscotch Pie" - All HP\n* Butterscotch-cinnamon\n pie,[wait:5] one slice. +ITEM_BUTTERSCOTCH_PIE_DESCRIPTION_SHOP=undefined + +ITEM_SNOWMAN_PIECE_NAME=Snowman Piece +ITEM_SNOWMAN_PIECE_SHORTNAME=SnowPiece +ITEM_SNOWMAN_PIECE_SHORTNAME2=SnowPiece +ITEM_SNOWMAN_PIECE_DESCRIPTION=* "Snowman Piece" - Heals 45 HP\n* Please take this to the\n ends of the earth. +ITEM_SNOWMAN_PIECE_DESCRIPTION_SHOP=undefined + +ITEM_NICE_CREAM_NAME=Nice Cream +ITEM_NICE_CREAM_SHORTNAME=NiceCream +ITEM_NICE_CREAM_SHORTNAME2=NiceCream +ITEM_NICE_CREAM_DESCRIPTION=* "Nice Cream" - Heals 15 HP\n* Instead of a joke,[wait:5] the\n wrapper says something nice. +ITEM_NICE_CREAM_DESCRIPTION_SHOP=undefined +BATTLE_NICE_CREAM_USE=* You're just great! +BATTLE_NICE_CREAM_USE_2=* You look nice today! +BATTLE_NICE_CREAM_USE_3=* Are those claws natural? +BATTLE_NICE_CREAM_USE_4=* You're super spiffy! +BATTLE_NICE_CREAM_USE_5=* Have a wonderful day! +BATTLE_NICE_CREAM_USE_6=* Is this as sweet as you? +BATTLE_NICE_CREAM_USE_7=* (An illustration of a hug.) +BATTLE_NICE_CREAM_USE_8=* Love yourself! I love you! + +ITEM_BISICLE_NAME=Bisicle +ITEM_BISICLE_SHORTNAME=Bisicle +ITEM_BISICLE_SHORTNAME2=Bisicle +ITEM_BISICLE_DESCRIPTION=* "Bisicle" - Heals 11 HP\n* It's a two-pronged popsicle,[wait:5]\n so you can eat it twice. +ITEM_BISICLE_DESCRIPTION_SHOP=Heals 11HP x 2\nEat it twice! +BATTLE_BISICLE_USE=* You eat one half of\n the Bisicle. + +ITEM_UNISICLE_NAME=Unisicle +ITEM_UNISICLE_SHORTNAME=Unisicle +ITEM_UNISICLE_SHORTNAME2=Popsicle +ITEM_UNISICLE_DESCRIPTION=* "Unisicle" - Heals 11 HP\n* It's a SINGLE-pronged popsicle.[wait:5]\n* Wait,[wait:5] that's just normal... +ITEM_UNISICLE_DESCRIPTION_SHOP=undefined + +ITEM_CINNAMON_BUNNY_NAME=Cinnamon Bunny +ITEM_CINNAMON_BUNNY_SHORTNAME=CinnaBun +ITEM_CINNAMON_BUNNY_SHORTNAME2=C. Bun +ITEM_CINNAMON_BUNNY_DESCRIPTION=* "Cinnamon Bunny" - Heals 22 HP\n* A cinnamon roll in the shape\n of a bunny. +ITEM_CINNAMON_BUNNY_DESCRIPTION_SHOP=Heals 22HP\nIt's my own\nrecipe. + +ITEM_TEMMIE_FLAKES_NAME=Temmie Flakes +ITEM_TEMMIE_FLAKES_SHORTNAME=TemFlakes +ITEM_TEMMIE_FLAKES_SHORTNAME2=TemFlakes +ITEM_TEMMIE_FLAKES_DESCRIPTION=* "Temmie Flakes" - Heals 2 HP\n* It's just torn up pieces\n of colored construction paper. +ITEM_TEMMIE_FLAKES_DESCRIPTION_SHOP=Heals 2HP\nfood of\ntem + # World shop WORLD_SHOP_ACTION_BUY=Buy WORLD_SHOP_ACTION_SELL=Sell diff --git a/engine/items/bisicle.lua b/engine/items/bisicle.lua new file mode 100644 index 0000000..897e7ce --- /dev/null +++ b/engine/items/bisicle.lua @@ -0,0 +1,35 @@ +--- @class Item.Bisicle : Dummy.Item.Consumable +local BisicleItem = Class(ItemConsumable, "Item.Bisicle") + +--- Creates a bisicle +--- @return Item.Bisicle +function BisicleItem:new() + self = Class:new(BisicleItem, { + "bisicle", -- item identifier + "ITEM_BISICLE_NAME", -- item name + "ITEM_BISICLE_SHORTNAME", -- item short name + "ITEM_BISICLE_DESCRIPTION", -- item description + 11, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(15) + -- the price at which the item will be sold in the shop + self:setSellPrice(5) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_BISICLE_DESCRIPTION_SHOP") + + self.use_texts = { + "BATTLE_BISICLE_USE" + } + + return self +end + +function BisicleItem:onUse() + local unisicle = modRequire("scripts.items.unisicle"):new() + Player.addItem(unisicle) +end + +return BisicleItem diff --git a/engine/items/blanket.lua b/engine/items/blanket.lua new file mode 100644 index 0000000..67d9899 --- /dev/null +++ b/engine/items/blanket.lua @@ -0,0 +1,26 @@ +--- @class Item.Blanket : Dummy.Item.Consumable +local BlanketItem = Class(ItemEquipment, "Item.Blanket") + +--- Creates a monster candy +--- @return Item.Blanket +function BlanketItem:new() + self = Class:new(BlanketItem, { + "blanket", -- item identifier + "WORLD_EXAMPLE_MOD_ITEM_BLANKET_NAME", -- item name + "WORLD_EXAMPLE_MOD_ITEM_BLANKET_SHORTNAME", -- item short name + "WORLD_EXAMPLE_MOD_ITEM_BLANKET_DESCRIPTION", -- item description + 1, + "armor" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(10) + -- the price at which the item will be sold in the shop + self:setSellPrice(1) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("WORLD_EXAMPLE_MOD_ITEM_BLANKET_DESCRIPTION_SHOP") + + return self +end + +return BlanketItem diff --git a/engine/items/butterscotch_pie.lua b/engine/items/butterscotch_pie.lua new file mode 100644 index 0000000..1e592ae --- /dev/null +++ b/engine/items/butterscotch_pie.lua @@ -0,0 +1,26 @@ +--- @class Item.ButterScotchPie : Dummy.Item.Consumable +local ButterScotchPieItem = Class(ItemConsumable, "Item.ButterScotchPie") + +--- Creates a spider donut +--- @return Item.ButterScotchPie +function ButterScotchPieItem:new() + self = Class:new(ButterScotchPieItem, { + "butterscotch_pie", -- item identifier + "ITEM_BUTTERSCOTCH_PIE_NAME", -- item name + "ITEM_BUTTERSCOTCH_PIE_SHORTNAME", -- item short name + "ITEM_BUTTERSCOTCH_PIE_DESCRIPTION", -- item description + Player.getMaxHP(), + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(1) + -- the price at which the item will be sold in the shop + self:setSellPrice(180) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_BUTTERSCOTCH_PIE_DESCRIPTION_SHOP") + + return self +end + +return ButterScotchPieItem diff --git a/engine/items/cinnamon_bunny.lua b/engine/items/cinnamon_bunny.lua new file mode 100644 index 0000000..33aa7aa --- /dev/null +++ b/engine/items/cinnamon_bunny.lua @@ -0,0 +1,26 @@ +--- @class Item.CinnamonBunny : Dummy.Item.Consumable +local CinnamonBunnyItem = Class(ItemConsumable, "Item.CinnamonBunny") + +--- Creates a cinnamon bunny +--- @return Item.CinnamonBunny +function CinnamonBunnyItem:new() + self = Class:new(CinnamonBunnyItem, { + "cinnamon_bunny", -- item identifier + "ITEM_CINNAMON_BUNNY_NAME", -- item name + "ITEM_CINNAMON_BUNNY_SHORTNAME", -- item short name + "ITEM_CINNAMON_BUNNY_DESCRIPTION", -- item description + 22, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(25) + -- the price at which the item will be sold in the shop + self:setSellPrice(8) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_CINNAMON_BUNNY_DESCRIPTION_SHOP") + + return self +end + +return CinnamonBunnyItem diff --git a/engine/items/monster_candy.lua b/engine/items/monster_candy.lua new file mode 100644 index 0000000..80e98d7 --- /dev/null +++ b/engine/items/monster_candy.lua @@ -0,0 +1,87 @@ +--- @class Item.MonsterCandy : Dummy.Item.Consumable +local MonsterCandyItem = Class(ItemConsumable, "Item.MonsterCandy") + +--- Creates a monster candy +--- @return Item.MonsterCandy +function MonsterCandyItem:new() + self = Class:new(MonsterCandyItem, { + "monster_candy", -- item identifier + "ITEM_MONSTER_CANDY_NAME", -- item name + "ITEM_MONSTER_CANDY_SHORTNAME", -- item short name + "ITEM_MONSTER_CANDY_DESCRIPTION", -- item description + 10, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(15) + -- the price at which the item will be sold in the shop + self:setSellPrice(25) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_MONSTER_CANDY_DESCRIPTION_SHOP") + + self.use_texts = { + "BATTLE_ITEM_FOOD_USE" + } + + -- Use Comments. Randomly selected. Discarded if empty. + + self.use_comments = { + "BATTLE_MONSTER_CANDY_USE", + "BATTLE_MONSTER_CANDY_USE_2" + } + + return self +end + +function MonsterCandyItem:use() + local rand = love.math.random(1, 15) + -- Random comments on use + local usecomment = "" -- Default + if #self.use_comments > 0 then -- Check nil + if rand <= 2 then + usecomment = self.use_comments[1] + elseif rand == 15 then + usecomment = self.use_comments[2] + end + end + + if type(self.onBeforeUse) == "function" then + self:onBeforeUse() + end + + local heal_text = Lang.translate("BATTLE_ITEM_HEAL", self:getHeal()) + if self:getHeal() + Player.getHP() >= Player.getMaxHP() then + heal_text = Lang.translate("BATTLE_ITEM_HEAL_MAX") + end + + local dialogue_text = heal_text + local use_texts = self:getUseTexts() + if #use_texts > 0 then + if usecomment ~= "" then + dialogue_text = Lang.translate(use_texts[1], Lang.translate(self:getName())) .. Lang.translate(usecomment) .. "\n" .. heal_text + else + dialogue_text = Lang.translate(use_texts[1], Lang.translate(self:getName())) .. "\n" .. heal_text + end + end + + local texts = { dialogue_text, table.unpack(use_texts, 2) } + if World.isInBattle() then + Battle.playDialogueText(table.unpack(texts)) + else + World.playDialogue(texts) + end + Player.removeItem(self) + Assets.playSound("swallow") + + Soul.heal(self:getHeal(), true) + Timer.after(0.5, function() + Assets.playSound("heal") + end) + + if type(self.onUse) == "function" then + self:onUse() + end +end + +return MonsterCandyItem diff --git a/engine/items/nice_cream.lua b/engine/items/nice_cream.lua new file mode 100644 index 0000000..4fd6333 --- /dev/null +++ b/engine/items/nice_cream.lua @@ -0,0 +1,108 @@ +--- @class Item.NiceCream : Dummy.Item.Consumable +local NiceCreamItem = Class(ItemConsumable, "Item.NiceCream") + +--- Creates a spider donut +--- @return Item.NiceCream +function NiceCreamItem:new() + self = Class:new(NiceCreamItem, { + "nice_cream", -- item identifier + "ITEM_NICE_CREAM_NAME", -- item name + "ITEM_NICE_CREAM_SHORTNAME", -- item short name + "ITEM_NICE_CREAM_DESCRIPTION", -- item description + 15, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(15) + -- the price at which the item will be sold in the shop + self:setSellPrice(2) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_NICE_CREAM_DESCRIPTION_SHOP") + + self.use_texts = { + "BATTLE_ITEM_FOOD_USE" + } + + -- Use Comments. Randomly selected. Discarded if empty. + + self.use_comments = { + "BATTLE_NICE_CREAM_USE", + "BATTLE_NICE_CREAM_USE_2", + "BATTLE_NICE_CREAM_USE_3", + "BATTLE_NICE_CREAM_USE_4", + "BATTLE_NICE_CREAM_USE_5", + "BATTLE_NICE_CREAM_USE_6", + "BATTLE_NICE_CREAM_USE_7", + "BATTLE_NICE_CREAM_USE_8" + } + + return self +end + +function NiceCreamItem:use() + + if type(self.onBeforeUse) == "function" then + self:onBeforeUse() + end + + local heal_text = Lang.translate("BATTLE_ITEM_HEAL", self:getHeal()) + if self:getHeal() + Player.getHP() >= Player.getMaxHP() then + heal_text = Lang.translate("BATTLE_ITEM_HEAL_MAX") + end + + local dialogue_text = heal_text + local use_texts = self:getUseTexts() + if #use_texts > 0 then + dialogue_text = Lang.translate(use_texts[1], Lang.translate(self:getName())) .. "\n" .. heal_text + end + + local rand = love.math.random(8) + -- Random comments on use + if #self.use_comments > 0 then -- Check nil + if rand == 0 then + dialogue_text = Lang.translate(self.use_comments[1]) + end + if rand == 1 then + dialogue_text = Lang.translate(self.use_comments[2]) + end + if rand == 2 then + dialogue_text = Lang.translate(self.use_comments[3]) + end + if rand == 3 then + dialogue_text = Lang.translate(self.use_comments[4]) + end + if rand == 4 then + dialogue_text = Lang.translate(self.use_comments[5]) + end + if rand == 5 then + dialogue_text = Lang.translate(self.use_comments[6]) + end + if rand == 6 then + dialogue_text = Lang.translate(self.use_comments[7]) + end + if rand == 7 then + dialogue_text = Lang.translate(self.use_comments[8]) + end + end + + local texts = { dialogue_text, table.unpack(use_texts, 2) } + if World.isInBattle() then + Battle.playDialogueText(table.unpack(texts)) + else + World.playDialogue(texts) + end + Player.removeItem(self) + Assets.playSound("swallow") + + Soul.heal(self:getHeal(), true) + Timer.after(0.5, function() + Assets.playSound("heal") + end) + + if type(self.onUse) == "function" then + self:onUse() + end +end + +return NiceCreamItem diff --git a/engine/items/snowman_piece.lua b/engine/items/snowman_piece.lua new file mode 100644 index 0000000..3b04234 --- /dev/null +++ b/engine/items/snowman_piece.lua @@ -0,0 +1,26 @@ +--- @class Item.SnowManPiece : Dummy.Item.Consumable +local SnowManPieceItem = Class(ItemConsumable, "Item.SnowManPiece") + +--- Creates a spider donut +--- @return Item.SnowManPiece +function SnowManPieceItem:new() + self = Class:new(SnowManPieceItem, { + "snowman_piece", -- item identifier + "ITEM_SNOWMAN_PIECE_NAME", -- item name + "ITEM_SNOWMAN_PIECE_SHORTNAME", -- item short name + "ITEM_SNOWMAN_PIECE_DESCRIPTION", -- item description + 45, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(1) + -- the price at which the item will be sold in the shop + self:setSellPrice(40) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_SNOWMAN_PIECE_DESCRIPTION_SHOP") + + return self +end + +return SnowManPieceItem diff --git a/engine/items/spider_cider.lua b/engine/items/spider_cider.lua new file mode 100644 index 0000000..9fe0b43 --- /dev/null +++ b/engine/items/spider_cider.lua @@ -0,0 +1,26 @@ +--- @class Item.SpiderCider : Dummy.Item.Consumable +local SpiderCiderItem = Class(ItemConsumable, "Item.SpiderCider") + +--- Creates a spider Cider +--- @return Item.SpiderCider +function SpiderCiderItem:new() + self = Class:new(SpiderCiderItem, { + "spider_cider", -- item identifier + "ITEM_SPIDER_CIDER_NAME", -- item name + "ITEM_SPIDER_CIDER_SHORTNAME", -- item short name + "ITEM_SPIDER_CIDER_DESCRIPTION", -- item description + 24, + "drink" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(18) + -- the price at which the item will be sold in the shop + self:setSellPrice(60) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_SPIDER_CIDER_DESCRIPTION_SHOP") + + return self +end + +return SpiderCiderItem diff --git a/engine/items/spider_donut.lua b/engine/items/spider_donut.lua new file mode 100644 index 0000000..bbbfac1 --- /dev/null +++ b/engine/items/spider_donut.lua @@ -0,0 +1,80 @@ +--- @class Item.SpiderDonut : Dummy.Item.Consumable +local SpiderDonutItem = Class(ItemConsumable, "Item.SpiderDonut") + +--- Creates a spider donut +--- @return Item.SpiderDonut +function SpiderDonutItem:new() + self = Class:new(SpiderDonutItem, { + "spider_donut", -- item identifier + "ITEM_SPIDER_DONUT_NAME", -- item name + "ITEM_SPIDER_DONUT_SHORTNAME", -- item short name + "ITEM_SPIDER_DONUT_DESCRIPTION", -- item description + 12, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(7) + -- the price at which the item will be sold in the shop + self:setSellPrice(30) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_SPIDER_DONUT_DESCRIPTION_SHOP") + + self.use_texts = { + "BATTLE_ITEM_FOOD_USE" + } + + -- Use Comments. Randomly selected. Discarded if empty. + + self.use_comments = { + "BATTLE_SPIDER_DONUT_USE" + } + + return self +end + +function SpiderDonutItem:use() + + if type(self.onBeforeUse) == "function" then + self:onBeforeUse() + end + + local heal_text = Lang.translate("BATTLE_ITEM_HEAL", self:getHeal()) + if self:getHeal() + Player.getHP() >= Player.getMaxHP() then + heal_text = Lang.translate("BATTLE_ITEM_HEAL_MAX") + end + + local dialogue_text = heal_text + local use_texts = self:getUseTexts() + if #use_texts > 0 then + dialogue_text = Lang.translate(use_texts[1], Lang.translate(self:getName())) .. "\n" .. heal_text + end + + local rand = love.math.random(10) + -- Random comments on use + if #self.use_comments > 0 then -- Check nil + if rand > 9 then + dialogue_text = Lang.translate(self.use_comments[1]) + end + end + + local texts = { dialogue_text, table.unpack(use_texts, 2) } + if World.isInBattle() then + Battle.playDialogueText(table.unpack(texts)) + else + World.playDialogue(texts) + end + Player.removeItem(self) + Assets.playSound("swallow") + + Soul.heal(self:getHeal(), true) + Timer.after(0.5, function() + Assets.playSound("heal") + end) + + if type(self.onUse) == "function" then + self:onUse() + end +end + +return SpiderDonutItem diff --git a/engine/items/temmie_flakes.lua b/engine/items/temmie_flakes.lua new file mode 100644 index 0000000..d87cb96 --- /dev/null +++ b/engine/items/temmie_flakes.lua @@ -0,0 +1,26 @@ +--- @class Item.TemmieFlakes : Dummy.Item.Consumable +local TemmieFlakesItem = Class(ItemConsumable, "Item.TemmieFlakes") + +--- Creates a spider Cider +--- @return Item.TemmieFlakes +function TemmieFlakesItem:new() + self = Class:new(TemmieFlakesItem, { + "temmie_flakes", -- item identifier + "ITEM_TEMMIE_FLAKES_NAME", -- item name + "ITEM_TEMMIE_FLAKES_SHORTNAME", -- item short name + "ITEM_TEMMIE_FLAKES_DESCRIPTION", -- item description + 2, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(1) + -- the price at which the item will be sold in the shop + self:setSellPrice(2) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_TEMMIE_FLAKES_DESCRIPTION_SHOP") + + return self +end + +return TemmieFlakesItem diff --git a/engine/items/unisicle.lua b/engine/items/unisicle.lua new file mode 100644 index 0000000..bfece41 --- /dev/null +++ b/engine/items/unisicle.lua @@ -0,0 +1,26 @@ +--- @class Item.Unisicle : Dummy.Item.Consumable +local UnisicleItem = Class(ItemConsumable, "Item.Unisicle") + +--- Creates a spider Cider +--- @return Item.Unisicle +function UnisicleItem:new() + self = Class:new(UnisicleItem, { + "unisicle", -- item identifier + "ITEM_UNISICLE_NAME", -- item name + "ITEM_UNISICLE_SHORTNAME", -- item short name + "ITEM_UNISICLE_DESCRIPTION", -- item description + 11, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(1) + -- the price at which the item will be sold in the shop + self:setSellPrice(2) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_UNISICLE_DESCRIPTION_SHOP") + + return self +end + +return UnisicleItem diff --git a/engine/mods/world_example/assets/langs/en.txt b/engine/mods/world_example/assets/langs/en.txt index 45ed427..2bae46f 100644 --- a/engine/mods/world_example/assets/langs/en.txt +++ b/engine/mods/world_example/assets/langs/en.txt @@ -81,11 +81,15 @@ WORLD_EXAMPLE_MOD_WORLD_SHOP_DUMMY_TALK_PAT_TEXT_2=* (...but it doesn't respond. WORLD_EXAMPLE_MOD_WORLD_SHOP_DUMMY_TALK_SIDE_TEXT=. . . # Items -WORLD_EXAMPLE_MOD_ITEM_MONSTER_CANDY_NAME=Monster Candy -WORLD_EXAMPLE_MOD_ITEM_MONSTER_CANDY_SHORTNAME=MnstrCndy -WORLD_EXAMPLE_MOD_ITEM_MONSTER_CANDY_DESCRIPTION=* "Monster Candy" - Heals 10 HP\n* Has a distinct,[wait:5] \n non-licorice flavor. -WORLD_EXAMPLE_MOD_ITEM_MONSTER_CANDY_DESCRIPTION_SHOP=Heals 10 HP\n(Licorice-\nfree\nguaranteed.) WORLD_EXAMPLE_MOD_ITEM_BLANKET_NAME=Blanket WORLD_EXAMPLE_MOD_ITEM_BLANKET_SHORTNAME=Blanket WORLD_EXAMPLE_MOD_ITEM_BLANKET_DESCRIPTION=* "Blanket" - Armor DF 1\n* The fabric is very soft. -WORLD_EXAMPLE_MOD_ITEM_BLANKET_DESCRIPTION_SHOP=Armor: 1DF\n({} DF)\n(It makes\nyou sleepy...) \ No newline at end of file +WORLD_EXAMPLE_MOD_ITEM_BLANKET_DESCRIPTION_SHOP=Armor: 1DF\n({} DF)\n(It makes\nyou sleepy...) + +# This overrides engine content +ITEM_BISICLE_NAME=Bisicle SP +ITEM_BISICLE_SHORTNAME=BscleSP +ITEM_BISICLE_SHORTNAME2=BscleSP +ITEM_BISICLE_DESCRIPTION=* "Bisicle SP" - Heals 11 HP\n* It's like a regular bisicle,[wait:5]\n but local to a mod! +ITEM_BISICLE_DESCRIPTION_SHOP=Heals 11HP x 2\nspecil +BATTLE_BISICLE_USE=* You eat one half of it.[wait:5]\n* You feel special. \ No newline at end of file diff --git a/engine/mods/world_example/mod.lua b/engine/mods/world_example/mod.lua index 121a317..0c0c185 100644 --- a/engine/mods/world_example/mod.lua +++ b/engine/mods/world_example/mod.lua @@ -85,14 +85,14 @@ function WorldExampleMod:loadSaveData() -- equipped weapon if save_data.weapon ~= nil then if save_data.weapon ~= "stick" then - Player.setWeapon(modRequire("scripts.items." .. save_data.weapon):new()) + Player.setWeapon(tryRequire("scripts.items." .. save_data.weapon, "items." .. save_data.weapon):new()) end end -- equipped armor if save_data.armor ~= nil then if save_data.armor ~= "bandage" then - Player.setArmor(modRequire("scripts.items." .. save_data.armor):new()) + Player.setArmor(tryRequire("scripts.items." .. save_data.armor, "items." .. save_data.armor):new()) end end @@ -134,7 +134,7 @@ function WorldExampleMod:loadItem(item_id) item = bandage end else - item = modRequire("scripts.items." .. item_id):new() + item = tryRequire("scripts.items." .. item_id, "items." .. item_id):new() end return item end diff --git a/engine/mods/world_example/scripts/items/bisicle2.lua b/engine/mods/world_example/scripts/items/bisicle2.lua new file mode 100644 index 0000000..b43aec5 --- /dev/null +++ b/engine/mods/world_example/scripts/items/bisicle2.lua @@ -0,0 +1,35 @@ +--- @class Item.Bisicle : Dummy.Item.Consumable +local BisicleItem = Class(ItemConsumable, "Item.Bisicle") + +--- Creates a bisicle +--- @return Item.Bisicle +function BisicleItem:new() + self = Class:new(BisicleItem, { + "bisicle", -- item identifier + "ITEM_BISICLE_NAME", -- item name + "ITEM_BISICLE_SHORTNAME", -- item short name + "ITEM_BISICLE_DESCRIPTION", -- item description + 11, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(15) + -- the price at which the item will be sold in the shop + self:setSellPrice(5) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_BISICLE_DESCRIPTION_SHOP") + + self.use_texts = { + "BATTLE_BISICLE_USE" + } + + return self +end + +function BisicleItem:onUse() + local unisicle = require("items.unisicle"):new() + Player.addItem(unisicle) +end + +return BisicleItem diff --git a/engine/mods/world_example/scripts/world/shop/dummy_shop.lua b/engine/mods/world_example/scripts/world/shop/dummy_shop.lua index 49f6c9a..64aa5bb 100644 --- a/engine/mods/world_example/scripts/world/shop/dummy_shop.lua +++ b/engine/mods/world_example/scripts/world/shop/dummy_shop.lua @@ -41,11 +41,15 @@ end --- Prepares the shop items function DummyShop:prepareItems() - local MonsterCandy = modRequire("scripts.items.monster_candy") + local MonsterCandy = require("items.monster_candy") + local SpiderDonut = require("items.spider_donut") + local bisicle2 = modRequire("scripts.items.bisicle2") -- amount `-1` for infinite stock self:addItem(MonsterCandy, -1) + self:addItem(SpiderDonut, -1) + self:addItem(bisicle2, -1) - local BlanketItem = modRequire("scripts.items.blanket") + local BlanketItem = require("items.blanket") local blanket_amount = 1 -- track wether the blanket has been bought if WorldExampleMod.flag["dummy_shop_blanket"] == 1 then diff --git a/engine/utils/utils.lua b/engine/utils/utils.lua index df08acd..315f2e7 100644 --- a/engine/utils/utils.lua +++ b/engine/utils/utils.lua @@ -7,6 +7,19 @@ function modRequire(modname) return require("mods." .. mod:getId() .. "." .. modname) end +--- Tries to require a module from the current mod, or the base game if it fails. +--- @param modname string +--- @param altname string +--- @return unknown +function tryRequire(modname, altname) + local mod = ModList.getCurrentMod() + local success, result = pcall(modRequire, modname) + if success then + return result + else + return require(altname) + end +end -- table -- -- https://gist.github.com/revolucas/dd1ecccfca32d558fddf70ddb39eb8a6 From b554775e0d9a44079f62a9008df7e4230a98ec8e Mon Sep 17 00:00:00 2001 From: Ivan Date: Mon, 3 Aug 2026 02:33:53 -0700 Subject: [PATCH 2/8] stop overriding use functions in items items of every type have a getdialoguetexts() function which allows you to override text in an item without reconstructing the use function --- engine/item/consumable.lua | 26 ++++-- engine/item/equipment.lua | 14 +++- engine/item/item.lua | 13 ++- engine/items/bisicle.lua | 2 +- engine/items/blanket.lua | 2 +- engine/items/butterscotch_pie.lua | 2 +- engine/items/monster_candy.lua | 55 +++---------- engine/items/nice_cream.lua | 82 ++++++------------- engine/items/snowman_piece.lua | 2 +- engine/items/spider_donut.lua | 45 ++-------- engine/items/temmie_flakes.lua | 2 +- engine/items/unisicle.lua | 2 +- engine/mods/froggit/mod.lua | 9 +- .../world_example/scripts/items/bisicle.lua | 35 ++++++++ .../scripts/world/shop/dummy_shop.lua | 6 +- 15 files changed, 125 insertions(+), 172 deletions(-) create mode 100644 engine/mods/world_example/scripts/items/bisicle.lua diff --git a/engine/item/consumable.lua b/engine/item/consumable.lua index 534b08d..de76564 100644 --- a/engine/item/consumable.lua +++ b/engine/item/consumable.lua @@ -28,16 +28,20 @@ function ItemConsumable:setType(type) self.type = type end ---- Uses the consumable item -function ItemConsumable:use() - if type(self.onBeforeUse) == "function" then - self:onBeforeUse() - end - +--- Gets the item's heal text +--- @return Dummy.Text.Text +function ItemConsumable:getHealText() local heal_text = Lang.translate("BATTLE_ITEM_HEAL", self:getHeal()) if self:getHeal() + Player.getHP() >= Player.getMaxHP() then heal_text = Lang.translate("BATTLE_ITEM_HEAL_MAX") end + return heal_text +end + +--- (Override) Gets the item's final dialogue text when used +--- @return Dummy.Text.Text[] +function ItemConsumable:getDialogueTexts() + local heal_text = self:getHealText() local dialogue_text = heal_text local use_texts = self:getUseTexts() @@ -46,6 +50,16 @@ function ItemConsumable:use() end local texts = { dialogue_text, table.unpack(use_texts, 2) } + return texts +end + +--- Uses the consumable item +function ItemConsumable:use() + if type(self.onBeforeUse) == "function" then + self:onBeforeUse() + end + + local texts = self:getDialogueTexts() if World.isInBattle() then Battle.playDialogueText(table.unpack(texts)) else diff --git a/engine/item/equipment.lua b/engine/item/equipment.lua index 4480b61..3f51511 100644 --- a/engine/item/equipment.lua +++ b/engine/item/equipment.lua @@ -28,16 +28,22 @@ function ItemEquipment:setType(type) self.type = type end +--- (Override) Gets the item's final dialogue text when used +--- @return Dummy.Text.Text[] +function ItemEquipment:getDialogueTexts() + local texts = self:getUseTexts() + if #texts <= 0 then + texts = { { "BATTLE_ITEM_EQUIPMENT_USE", Lang.translate(self:getName()) } } + end + return texts +end --- Uses the equipment item function ItemEquipment:use() if type(self.onBeforeUse) == "function" then self:onBeforeUse() end - local texts = self:getUseTexts() - if #texts <= 0 then - texts = { { "BATTLE_ITEM_EQUIPMENT_USE", Lang.translate(self:getName()) } } - end + local texts = self:getDialogueTexts() if World.isInBattle() then Battle.playDialogueText(table.unpack(texts)) else diff --git a/engine/item/item.lua b/engine/item/item.lua index 789888b..626b411 100644 --- a/engine/item/item.lua +++ b/engine/item/item.lua @@ -91,6 +91,11 @@ function Item:setDropText(text, ...) self.drop_texts = { text, ... } end +--- (Override) Gets the item's final dialogue text when used +--- @return Dummy.Text.Text[] +function Item:getDialogueTexts() + return self:getUseTexts() +end --- Gets the item's buy price --- @return integer function Item:getBuyPrice() @@ -123,12 +128,12 @@ function Item:use() end if not can_use then return end - local use_texts = self:getUseTexts() - if #use_texts > 0 then + local dialogue_texts = self:getDialogueTexts() + if #dialogue_texts > 0 then if World.isInBattle() then - Battle.playDialogueText(table.unpack(use_texts)) + Battle.playDialogueText(table.unpack(dialogue_texts)) else - World.playDialogue(use_texts) + World.playDialogue(dialogue_texts) end end diff --git a/engine/items/bisicle.lua b/engine/items/bisicle.lua index 897e7ce..5051b53 100644 --- a/engine/items/bisicle.lua +++ b/engine/items/bisicle.lua @@ -28,7 +28,7 @@ function BisicleItem:new() end function BisicleItem:onUse() - local unisicle = modRequire("scripts.items.unisicle"):new() + local unisicle = require("items.unisicle"):new() Player.addItem(unisicle) end diff --git a/engine/items/blanket.lua b/engine/items/blanket.lua index 67d9899..bdc7db3 100644 --- a/engine/items/blanket.lua +++ b/engine/items/blanket.lua @@ -1,7 +1,7 @@ --- @class Item.Blanket : Dummy.Item.Consumable local BlanketItem = Class(ItemEquipment, "Item.Blanket") ---- Creates a monster candy +--- Creates a blanket --- @return Item.Blanket function BlanketItem:new() self = Class:new(BlanketItem, { diff --git a/engine/items/butterscotch_pie.lua b/engine/items/butterscotch_pie.lua index 1e592ae..f5264bb 100644 --- a/engine/items/butterscotch_pie.lua +++ b/engine/items/butterscotch_pie.lua @@ -1,7 +1,7 @@ --- @class Item.ButterScotchPie : Dummy.Item.Consumable local ButterScotchPieItem = Class(ItemConsumable, "Item.ButterScotchPie") ---- Creates a spider donut +--- Creates a butterscotch pie --- @return Item.ButterScotchPie function ButterScotchPieItem:new() self = Class:new(ButterScotchPieItem, { diff --git a/engine/items/monster_candy.lua b/engine/items/monster_candy.lua index 80e98d7..4074660 100644 --- a/engine/items/monster_candy.lua +++ b/engine/items/monster_candy.lua @@ -34,54 +34,21 @@ function MonsterCandyItem:new() return self end -function MonsterCandyItem:use() +function MonsterCandyItem:getDialogueTexts() local rand = love.math.random(1, 15) + local usecomment = "" + local dialogue_text = { Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. + "\n" .. self:getHealText() } -- Random comments on use - local usecomment = "" -- Default - if #self.use_comments > 0 then -- Check nil - if rand <= 2 then - usecomment = self.use_comments[1] - elseif rand == 15 then - usecomment = self.use_comments[2] - end + if rand <= 2 then + usecomment = self.use_comments[1] + elseif rand == 15 then + usecomment = self.use_comments[2] end - - if type(self.onBeforeUse) == "function" then - self:onBeforeUse() - end - - local heal_text = Lang.translate("BATTLE_ITEM_HEAL", self:getHeal()) - if self:getHeal() + Player.getHP() >= Player.getMaxHP() then - heal_text = Lang.translate("BATTLE_ITEM_HEAL_MAX") - end - - local dialogue_text = heal_text - local use_texts = self:getUseTexts() - if #use_texts > 0 then - if usecomment ~= "" then - dialogue_text = Lang.translate(use_texts[1], Lang.translate(self:getName())) .. Lang.translate(usecomment) .. "\n" .. heal_text - else - dialogue_text = Lang.translate(use_texts[1], Lang.translate(self:getName())) .. "\n" .. heal_text - end - end - - local texts = { dialogue_text, table.unpack(use_texts, 2) } - if World.isInBattle() then - Battle.playDialogueText(table.unpack(texts)) - else - World.playDialogue(texts) - end - Player.removeItem(self) - Assets.playSound("swallow") - - Soul.heal(self:getHeal(), true) - Timer.after(0.5, function() - Assets.playSound("heal") - end) - - if type(self.onUse) == "function" then - self:onUse() + if usecomment ~= "" then + dialogue_text = { Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. Lang.translate(usecomment) .. "\n" .. self:getHealText() } end + return { dialogue_text, table.unpack(self:getUseTexts(), 2) } end return MonsterCandyItem diff --git a/engine/items/nice_cream.lua b/engine/items/nice_cream.lua index 4fd6333..8c1a09d 100644 --- a/engine/items/nice_cream.lua +++ b/engine/items/nice_cream.lua @@ -1,7 +1,7 @@ --- @class Item.NiceCream : Dummy.Item.Consumable local NiceCreamItem = Class(ItemConsumable, "Item.NiceCream") ---- Creates a spider donut +--- Creates a nice cream --- @return Item.NiceCream function NiceCreamItem:new() self = Class:new(NiceCreamItem, { @@ -40,69 +40,35 @@ function NiceCreamItem:new() return self end -function NiceCreamItem:use() - - if type(self.onBeforeUse) == "function" then - self:onBeforeUse() +function NiceCreamItem:getDialogueTexts() + local rand = love.math.random(8) + local dialogue_text = Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. "\n" .. self:getHealText() + -- Random comments on use + if rand == 0 then + dialogue_text = Lang.translate(self.use_comments[1]) end - - local heal_text = Lang.translate("BATTLE_ITEM_HEAL", self:getHeal()) - if self:getHeal() + Player.getHP() >= Player.getMaxHP() then - heal_text = Lang.translate("BATTLE_ITEM_HEAL_MAX") + if rand == 1 then + dialogue_text = Lang.translate(self.use_comments[2]) end - - local dialogue_text = heal_text - local use_texts = self:getUseTexts() - if #use_texts > 0 then - dialogue_text = Lang.translate(use_texts[1], Lang.translate(self:getName())) .. "\n" .. heal_text + if rand == 2 then + dialogue_text = Lang.translate(self.use_comments[3]) end - - local rand = love.math.random(8) - -- Random comments on use - if #self.use_comments > 0 then -- Check nil - if rand == 0 then - dialogue_text = Lang.translate(self.use_comments[1]) - end - if rand == 1 then - dialogue_text = Lang.translate(self.use_comments[2]) - end - if rand == 2 then - dialogue_text = Lang.translate(self.use_comments[3]) - end - if rand == 3 then - dialogue_text = Lang.translate(self.use_comments[4]) - end - if rand == 4 then - dialogue_text = Lang.translate(self.use_comments[5]) - end - if rand == 5 then - dialogue_text = Lang.translate(self.use_comments[6]) - end - if rand == 6 then - dialogue_text = Lang.translate(self.use_comments[7]) - end - if rand == 7 then - dialogue_text = Lang.translate(self.use_comments[8]) - end + if rand == 3 then + dialogue_text = Lang.translate(self.use_comments[4]) end - - local texts = { dialogue_text, table.unpack(use_texts, 2) } - if World.isInBattle() then - Battle.playDialogueText(table.unpack(texts)) - else - World.playDialogue(texts) + if rand == 4 then + dialogue_text = Lang.translate(self.use_comments[5]) end - Player.removeItem(self) - Assets.playSound("swallow") - - Soul.heal(self:getHeal(), true) - Timer.after(0.5, function() - Assets.playSound("heal") - end) - - if type(self.onUse) == "function" then - self:onUse() + if rand == 5 then + dialogue_text = Lang.translate(self.use_comments[6]) + end + if rand == 6 then + dialogue_text = Lang.translate(self.use_comments[7]) + end + if rand == 7 then + dialogue_text = Lang.translate(self.use_comments[8]) end + return { dialogue_text, table.unpack(self:getUseTexts(), 2) } end return NiceCreamItem diff --git a/engine/items/snowman_piece.lua b/engine/items/snowman_piece.lua index 3b04234..1ff4749 100644 --- a/engine/items/snowman_piece.lua +++ b/engine/items/snowman_piece.lua @@ -1,7 +1,7 @@ --- @class Item.SnowManPiece : Dummy.Item.Consumable local SnowManPieceItem = Class(ItemConsumable, "Item.SnowManPiece") ---- Creates a spider donut +--- Creates a snowman piece --- @return Item.SnowManPiece function SnowManPieceItem:new() self = Class:new(SnowManPieceItem, { diff --git a/engine/items/spider_donut.lua b/engine/items/spider_donut.lua index bbbfac1..e48dedf 100644 --- a/engine/items/spider_donut.lua +++ b/engine/items/spider_donut.lua @@ -33,48 +33,13 @@ function SpiderDonutItem:new() return self end -function SpiderDonutItem:use() - - if type(self.onBeforeUse) == "function" then - self:onBeforeUse() - end - - local heal_text = Lang.translate("BATTLE_ITEM_HEAL", self:getHeal()) - if self:getHeal() + Player.getHP() >= Player.getMaxHP() then - heal_text = Lang.translate("BATTLE_ITEM_HEAL_MAX") - end - - local dialogue_text = heal_text - local use_texts = self:getUseTexts() - if #use_texts > 0 then - dialogue_text = Lang.translate(use_texts[1], Lang.translate(self:getName())) .. "\n" .. heal_text - end - +function SpiderDonutItem:getDialogueTexts() local rand = love.math.random(10) - -- Random comments on use - if #self.use_comments > 0 then -- Check nil - if rand > 9 then - dialogue_text = Lang.translate(self.use_comments[1]) - end - end - - local texts = { dialogue_text, table.unpack(use_texts, 2) } - if World.isInBattle() then - Battle.playDialogueText(table.unpack(texts)) - else - World.playDialogue(texts) - end - Player.removeItem(self) - Assets.playSound("swallow") - - Soul.heal(self:getHeal(), true) - Timer.after(0.5, function() - Assets.playSound("heal") - end) - - if type(self.onUse) == "function" then - self:onUse() + local dialogue_text = Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. "\n" .. self:getHealText() + if rand > 9 then + dialogue_text = Lang.translate(self.use_comments[1]) end + return { dialogue_text, table.unpack(self:getUseTexts(), 2) } end return SpiderDonutItem diff --git a/engine/items/temmie_flakes.lua b/engine/items/temmie_flakes.lua index d87cb96..6027da7 100644 --- a/engine/items/temmie_flakes.lua +++ b/engine/items/temmie_flakes.lua @@ -1,7 +1,7 @@ --- @class Item.TemmieFlakes : Dummy.Item.Consumable local TemmieFlakesItem = Class(ItemConsumable, "Item.TemmieFlakes") ---- Creates a spider Cider +--- Creates a temmie flakes --- @return Item.TemmieFlakes function TemmieFlakesItem:new() self = Class:new(TemmieFlakesItem, { diff --git a/engine/items/unisicle.lua b/engine/items/unisicle.lua index bfece41..fd93a2e 100644 --- a/engine/items/unisicle.lua +++ b/engine/items/unisicle.lua @@ -1,7 +1,7 @@ --- @class Item.Unisicle : Dummy.Item.Consumable local UnisicleItem = Class(ItemConsumable, "Item.Unisicle") ---- Creates a spider Cider +--- Creates a unisicle --- @return Item.Unisicle function UnisicleItem:new() self = Class:new(UnisicleItem, { diff --git a/engine/mods/froggit/mod.lua b/engine/mods/froggit/mod.lua index c67eb32..1e0d1ee 100644 --- a/engine/mods/froggit/mod.lua +++ b/engine/mods/froggit/mod.lua @@ -19,14 +19,7 @@ function mod:load() Player.setLV(1) -- add items - Player.addItem(ItemConsumable:new( - "monster_candy", - "FROGGIT_MOD_MONSTER_CANDY_NAME", - "FROGGIT_MOD_MONSTER_CANDY_SHORTNAME", - "", - 50, - "food" - )) + Player.addItem(require("items.monster_candy"):new()) Player.addItem(ItemEquipment:new( "toy_knife", "FROGGIT_MOD_TOY_KNIFE_NAME", diff --git a/engine/mods/world_example/scripts/items/bisicle.lua b/engine/mods/world_example/scripts/items/bisicle.lua new file mode 100644 index 0000000..b43aec5 --- /dev/null +++ b/engine/mods/world_example/scripts/items/bisicle.lua @@ -0,0 +1,35 @@ +--- @class Item.Bisicle : Dummy.Item.Consumable +local BisicleItem = Class(ItemConsumable, "Item.Bisicle") + +--- Creates a bisicle +--- @return Item.Bisicle +function BisicleItem:new() + self = Class:new(BisicleItem, { + "bisicle", -- item identifier + "ITEM_BISICLE_NAME", -- item name + "ITEM_BISICLE_SHORTNAME", -- item short name + "ITEM_BISICLE_DESCRIPTION", -- item description + 11, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(15) + -- the price at which the item will be sold in the shop + self:setSellPrice(5) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_BISICLE_DESCRIPTION_SHOP") + + self.use_texts = { + "BATTLE_BISICLE_USE" + } + + return self +end + +function BisicleItem:onUse() + local unisicle = require("items.unisicle"):new() + Player.addItem(unisicle) +end + +return BisicleItem diff --git a/engine/mods/world_example/scripts/world/shop/dummy_shop.lua b/engine/mods/world_example/scripts/world/shop/dummy_shop.lua index 64aa5bb..8b96797 100644 --- a/engine/mods/world_example/scripts/world/shop/dummy_shop.lua +++ b/engine/mods/world_example/scripts/world/shop/dummy_shop.lua @@ -43,11 +43,13 @@ end function DummyShop:prepareItems() local MonsterCandy = require("items.monster_candy") local SpiderDonut = require("items.spider_donut") - local bisicle2 = modRequire("scripts.items.bisicle2") + local bisicle = tryRequire("scripts.items.bisicle", "items.bisicle") + local nice_cream = require("items.nice_cream") -- amount `-1` for infinite stock self:addItem(MonsterCandy, -1) self:addItem(SpiderDonut, -1) - self:addItem(bisicle2, -1) + self:addItem(bisicle, -1) + self:addItem(nice_cream, -1) local BlanketItem = require("items.blanket") local blanket_amount = 1 From b61f1ea6a6b684a76e8bc6c632c89ff6582013e4 Mon Sep 17 00:00:00 2001 From: Ivan Date: Mon, 3 Aug 2026 03:54:51 -0700 Subject: [PATCH 3/8] Clean up, delete unused files & Comment stuff --- engine/assets/langs/en.txt | 24 ++++---- engine/items/bisicle.lua | 5 +- engine/items/monster_candy.lua | 20 +++---- engine/items/nice_cream.lua | 59 ++++++------------- engine/items/spider_donut.lua | 22 +++---- .../world_example/scripts/items/bisicle2.lua | 35 ----------- .../world_example/scripts/items/blanket.lua | 26 -------- .../scripts/items/monster_candy.lua | 26 -------- 8 files changed, 51 insertions(+), 166 deletions(-) delete mode 100644 engine/mods/world_example/scripts/items/bisicle2.lua delete mode 100644 engine/mods/world_example/scripts/items/blanket.lua delete mode 100644 engine/mods/world_example/scripts/items/monster_candy.lua diff --git a/engine/assets/langs/en.txt b/engine/assets/langs/en.txt index a2316ba..1df7944 100644 --- a/engine/assets/langs/en.txt +++ b/engine/assets/langs/en.txt @@ -107,15 +107,15 @@ ITEM_MONSTER_CANDY_NAME=Monster Candy ITEM_MONSTER_CANDY_SHORTNAME=MnstrCndy ITEM_MONSTER_CANDY_DESCRIPTION=* "Monster Candy" - Heals 10 HP\n* Has a distinct,[wait:5] \n non-licorice flavor. ITEM_MONSTER_CANDY_DESCRIPTION_SHOP=Heals 10 HP\n(Licorice-\nfree\nguaranteed.) -BATTLE_MONSTER_CANDY_USE=\n* Very un-licorice-like. -BATTLE_MONSTER_CANDY_USE_2=\n* ... tastes like licorice. +ITEM_MONSTER_CANDY_USE=\n* Very un-licorice-like. +ITEM_MONSTER_CANDY_USE_2=\n* ... tastes like licorice. ITEM_SPIDER_DONUT_NAME=Spider Donut ITEM_SPIDER_DONUT_SHORTNAME=SpidrDont ITEM_SPIDER_DONUT_SHORTNAME2=SpdrDonut ITEM_SPIDER_DONUT_DESCRIPTION=* "Spider Donut" - Heals 12 HP\n* A donut made with Spider\n Cider in the batter. ITEM_SPIDER_DONUT_DESCRIPTION_SHOP=undefined -BATTLE_SPIDER_DONUT_USE=* Don't worry,[wait:5] Spider didn't. +ITEM_SPIDER_DONUT_USE=* Don't worry,[wait:5] Spider didn't. ITEM_SPIDER_CIDER_NAME=Spider Cider ITEM_SPIDER_CIDER_SHORTNAME=SpidrCidr @@ -140,21 +140,21 @@ ITEM_NICE_CREAM_SHORTNAME=NiceCream ITEM_NICE_CREAM_SHORTNAME2=NiceCream ITEM_NICE_CREAM_DESCRIPTION=* "Nice Cream" - Heals 15 HP\n* Instead of a joke,[wait:5] the\n wrapper says something nice. ITEM_NICE_CREAM_DESCRIPTION_SHOP=undefined -BATTLE_NICE_CREAM_USE=* You're just great! -BATTLE_NICE_CREAM_USE_2=* You look nice today! -BATTLE_NICE_CREAM_USE_3=* Are those claws natural? -BATTLE_NICE_CREAM_USE_4=* You're super spiffy! -BATTLE_NICE_CREAM_USE_5=* Have a wonderful day! -BATTLE_NICE_CREAM_USE_6=* Is this as sweet as you? -BATTLE_NICE_CREAM_USE_7=* (An illustration of a hug.) -BATTLE_NICE_CREAM_USE_8=* Love yourself! I love you! +ITEM_NICE_CREAM_USE=* You're just great! +ITEM_NICE_CREAM_USE_2=* You look nice today! +ITEM_NICE_CREAM_USE_3=* Are those claws natural? +ITEM_NICE_CREAM_USE_4=* You're super spiffy! +ITEM_NICE_CREAM_USE_5=* Have a wonderful day! +ITEM_NICE_CREAM_USE_6=* Is this as sweet as you? +ITEM_NICE_CREAM_USE_7=* (An illustration of a hug.) +ITEM_NICE_CREAM_USE_8=* Love yourself! I love you! ITEM_BISICLE_NAME=Bisicle ITEM_BISICLE_SHORTNAME=Bisicle ITEM_BISICLE_SHORTNAME2=Bisicle ITEM_BISICLE_DESCRIPTION=* "Bisicle" - Heals 11 HP\n* It's a two-pronged popsicle,[wait:5]\n so you can eat it twice. ITEM_BISICLE_DESCRIPTION_SHOP=Heals 11HP x 2\nEat it twice! -BATTLE_BISICLE_USE=* You eat one half of\n the Bisicle. +ITEM_BISICLE_USE=* You eat one half of\n the Bisicle. ITEM_UNISICLE_NAME=Unisicle ITEM_UNISICLE_SHORTNAME=Unisicle diff --git a/engine/items/bisicle.lua b/engine/items/bisicle.lua index 5051b53..e0a7ab4 100644 --- a/engine/items/bisicle.lua +++ b/engine/items/bisicle.lua @@ -19,15 +19,16 @@ function BisicleItem:new() self:setSellPrice(5) -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item self:setShopDescription("ITEM_BISICLE_DESCRIPTION_SHOP") - + -- the main text that will appear when the item is used. self.use_texts = { - "BATTLE_BISICLE_USE" + "ITEM_BISICLE_USE" } return self end function BisicleItem:onUse() + -- Add a unisicle to the player's inventory when the bisicle is used. local unisicle = require("items.unisicle"):new() Player.addItem(unisicle) end diff --git a/engine/items/monster_candy.lua b/engine/items/monster_candy.lua index 4074660..47199b9 100644 --- a/engine/items/monster_candy.lua +++ b/engine/items/monster_candy.lua @@ -19,32 +19,30 @@ function MonsterCandyItem:new() self:setSellPrice(25) -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item self:setShopDescription("ITEM_MONSTER_CANDY_DESCRIPTION_SHOP") - - self.use_texts = { - "BATTLE_ITEM_FOOD_USE" - } - - -- Use Comments. Randomly selected. Discarded if empty. - + -- Random comments on use self.use_comments = { - "BATTLE_MONSTER_CANDY_USE", - "BATTLE_MONSTER_CANDY_USE_2" + "ITEM_MONSTER_CANDY_USE", + "ITEM_MONSTER_CANDY_USE_2" } return self end function MonsterCandyItem:getDialogueTexts() - local rand = love.math.random(1, 15) + -- Generate a random number + local rand = love.math.random(0, 15) + -- Set the comment to initially be empty local usecomment = "" + -- Set Default Dialogue Text local dialogue_text = { Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. "\n" .. self:getHealText() } - -- Random comments on use + -- Change use comment based on random number if rand <= 2 then usecomment = self.use_comments[1] elseif rand == 15 then usecomment = self.use_comments[2] end + -- If the use comment is not empty, change the dialogue text to include the use comment if usecomment ~= "" then dialogue_text = { Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. Lang.translate(usecomment) .. "\n" .. self:getHealText() } end diff --git a/engine/items/nice_cream.lua b/engine/items/nice_cream.lua index 8c1a09d..3dbd470 100644 --- a/engine/items/nice_cream.lua +++ b/engine/items/nice_cream.lua @@ -19,54 +19,31 @@ function NiceCreamItem:new() self:setSellPrice(2) -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item self:setShopDescription("ITEM_NICE_CREAM_DESCRIPTION_SHOP") - - self.use_texts = { - "BATTLE_ITEM_FOOD_USE" - } - - -- Use Comments. Randomly selected. Discarded if empty. - + -- Random comments on use self.use_comments = { - "BATTLE_NICE_CREAM_USE", - "BATTLE_NICE_CREAM_USE_2", - "BATTLE_NICE_CREAM_USE_3", - "BATTLE_NICE_CREAM_USE_4", - "BATTLE_NICE_CREAM_USE_5", - "BATTLE_NICE_CREAM_USE_6", - "BATTLE_NICE_CREAM_USE_7", - "BATTLE_NICE_CREAM_USE_8" + "ITEM_NICE_CREAM_USE", + "ITEM_NICE_CREAM_USE_2", + "ITEM_NICE_CREAM_USE_3", + "ITEM_NICE_CREAM_USE_4", + "ITEM_NICE_CREAM_USE_5", + "ITEM_NICE_CREAM_USE_6", + "ITEM_NICE_CREAM_USE_7", + "ITEM_NICE_CREAM_USE_8" } return self end function NiceCreamItem:getDialogueTexts() - local rand = love.math.random(8) - local dialogue_text = Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. "\n" .. self:getHealText() - -- Random comments on use - if rand == 0 then - dialogue_text = Lang.translate(self.use_comments[1]) - end - if rand == 1 then - dialogue_text = Lang.translate(self.use_comments[2]) - end - if rand == 2 then - dialogue_text = Lang.translate(self.use_comments[3]) - end - if rand == 3 then - dialogue_text = Lang.translate(self.use_comments[4]) - end - if rand == 4 then - dialogue_text = Lang.translate(self.use_comments[5]) - end - if rand == 5 then - dialogue_text = Lang.translate(self.use_comments[6]) - end - if rand == 6 then - dialogue_text = Lang.translate(self.use_comments[7]) - end - if rand == 7 then - dialogue_text = Lang.translate(self.use_comments[8]) + -- Generate a random number + local rand = love.math.random(9) + print(rand) + -- Set Default Dialogue Text + local dialogue_text = Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. + "\n" .. self:getHealText() + -- Override dialogue text with a random comment based on the random number + if rand < 9 then + dialogue_text = Lang.translate(self.use_comments[rand]) end return { dialogue_text, table.unpack(self:getUseTexts(), 2) } end diff --git a/engine/items/spider_donut.lua b/engine/items/spider_donut.lua index e48dedf..f9ccc1b 100644 --- a/engine/items/spider_donut.lua +++ b/engine/items/spider_donut.lua @@ -20,24 +20,20 @@ function SpiderDonutItem:new() -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item self:setShopDescription("ITEM_SPIDER_DONUT_DESCRIPTION_SHOP") - self.use_texts = { - "BATTLE_ITEM_FOOD_USE" - } - - -- Use Comments. Randomly selected. Discarded if empty. - - self.use_comments = { - "BATTLE_SPIDER_DONUT_USE" - } - return self end function SpiderDonutItem:getDialogueTexts() - local rand = love.math.random(10) + -- Set Default Dialogue Text local dialogue_text = Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. "\n" .. self:getHealText() - if rand > 9 then - dialogue_text = Lang.translate(self.use_comments[1]) + -- Check if the player is in a battle + if World.isInBattle() then + -- Generate a random number + local rand = love.math.random(0, 10) + -- Override dialogue text with a comment based on the random number + if rand > 9 then + dialogue_text = Lang.translate("ITEM_SPIDER_DONUT_USE") + end end return { dialogue_text, table.unpack(self:getUseTexts(), 2) } end diff --git a/engine/mods/world_example/scripts/items/bisicle2.lua b/engine/mods/world_example/scripts/items/bisicle2.lua deleted file mode 100644 index b43aec5..0000000 --- a/engine/mods/world_example/scripts/items/bisicle2.lua +++ /dev/null @@ -1,35 +0,0 @@ ---- @class Item.Bisicle : Dummy.Item.Consumable -local BisicleItem = Class(ItemConsumable, "Item.Bisicle") - ---- Creates a bisicle ---- @return Item.Bisicle -function BisicleItem:new() - self = Class:new(BisicleItem, { - "bisicle", -- item identifier - "ITEM_BISICLE_NAME", -- item name - "ITEM_BISICLE_SHORTNAME", -- item short name - "ITEM_BISICLE_DESCRIPTION", -- item description - 11, - "food" - }) - - -- the price the player will pay to buy the item in the shop - self:setBuyPrice(15) - -- the price at which the item will be sold in the shop - self:setSellPrice(5) - -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item - self:setShopDescription("ITEM_BISICLE_DESCRIPTION_SHOP") - - self.use_texts = { - "BATTLE_BISICLE_USE" - } - - return self -end - -function BisicleItem:onUse() - local unisicle = require("items.unisicle"):new() - Player.addItem(unisicle) -end - -return BisicleItem diff --git a/engine/mods/world_example/scripts/items/blanket.lua b/engine/mods/world_example/scripts/items/blanket.lua deleted file mode 100644 index 6e4003b..0000000 --- a/engine/mods/world_example/scripts/items/blanket.lua +++ /dev/null @@ -1,26 +0,0 @@ ---- @class WorldExample.Item.Blanket : Dummy.Item.Consumable -local BlanketItem = Class(ItemEquipment, "WorldExample.Item.Blanket") - ---- Creates a monster candy ---- @return WorldExample.Item.Blanket -function BlanketItem:new() - self = Class:new(BlanketItem, { - "blanket", -- item identifier - "WORLD_EXAMPLE_MOD_ITEM_BLANKET_NAME", -- item name - "WORLD_EXAMPLE_MOD_ITEM_BLANKET_SHORTNAME", -- item short name - "WORLD_EXAMPLE_MOD_ITEM_BLANKET_DESCRIPTION", -- item description - 1, - "armor" - }) - - -- the price the player will pay to buy the item in the shop - self:setBuyPrice(10) - -- the price at which the item will be sold in the shop - self:setSellPrice(1) - -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item - self:setShopDescription("WORLD_EXAMPLE_MOD_ITEM_BLANKET_DESCRIPTION_SHOP") - - return self -end - -return BlanketItem diff --git a/engine/mods/world_example/scripts/items/monster_candy.lua b/engine/mods/world_example/scripts/items/monster_candy.lua deleted file mode 100644 index 79460d9..0000000 --- a/engine/mods/world_example/scripts/items/monster_candy.lua +++ /dev/null @@ -1,26 +0,0 @@ ---- @class WorldExample.Item.MonsterCandy : Dummy.Item.Consumable -local MonsterCandyItem = Class(ItemConsumable, "WorldExample.Item.MonsterCandy") - ---- Creates a monster candy ---- @return WorldExample.Item.MonsterCandy -function MonsterCandyItem:new() - self = Class:new(MonsterCandyItem, { - "monster_candy", -- item identifier - "WORLD_EXAMPLE_MOD_ITEM_MONSTER_CANDY_NAME", -- item name - "WORLD_EXAMPLE_MOD_ITEM_MONSTER_CANDY_SHORTNAME", -- item short name - "WORLD_EXAMPLE_MOD_ITEM_MONSTER_CANDY_DESCRIPTION", -- item description - 10, - "food" - }) - - -- the price the player will pay to buy the item in the shop - self:setBuyPrice(15) - -- the price at which the item will be sold in the shop - self:setSellPrice(5) - -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item - self:setShopDescription("WORLD_EXAMPLE_MOD_ITEM_MONSTER_CANDY_DESCRIPTION_SHOP") - - return self -end - -return MonsterCandyItem From b8d62b5547f8e947e6cbfff1cb754fb8b4da324e Mon Sep 17 00:00:00 2001 From: Ivan Date: Mon, 3 Aug 2026 07:58:13 -0700 Subject: [PATCH 4/8] dog residue + quiche --- engine/assets/langs/en.txt | 24 +++++++ engine/assets/sounds/dogresidue.wav | Bin 0 -> 112718 bytes engine/items/abandoned_quiche.lua | 30 ++++++++ engine/items/dog_residue.lua | 65 ++++++++++++++++++ engine/items/nice_cream.lua | 1 - .../world_example/scripts/items/bisicle.lua | 2 +- .../scripts/world/shop/dummy_shop.lua | 6 +- 7 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 engine/assets/sounds/dogresidue.wav create mode 100644 engine/items/abandoned_quiche.lua create mode 100644 engine/items/dog_residue.lua diff --git a/engine/assets/langs/en.txt b/engine/assets/langs/en.txt index 1df7944..6ef7dcc 100644 --- a/engine/assets/langs/en.txt +++ b/engine/assets/langs/en.txt @@ -174,6 +174,30 @@ ITEM_TEMMIE_FLAKES_SHORTNAME2=TemFlakes ITEM_TEMMIE_FLAKES_DESCRIPTION=* "Temmie Flakes" - Heals 2 HP\n* It's just torn up pieces\n of colored construction paper. ITEM_TEMMIE_FLAKES_DESCRIPTION_SHOP=Heals 2HP\nfood of\ntem +ITEM_ABANDONED_QUICHE_NAME=Abandoned Quiche +ITEM_ABANDONED_QUICHE_SHORTNAME=Ab Quiche +ITEM_ABANDONED_QUICHE_SHORTNAME2=Quiche +ITEM_ABANDONED_QUICHE_DESCRIPTION=* "Abandoned Quiche" Heals 34 HP\n* A psychologically damaged\n spinach egg pie. +ITEM_ABANDONED_QUICHE_DESCRIPTION_SHOP=undefined +ITEM_ABANDONED_QUICHE_DROP=* You leave the Quiche on the\n ground and tell it you'll\n be right back. +ITEM_ABANDONED_QUICHE_USE=* You eat the quiche. + +ITEM_DOG_RESIDUE_NAME=Dog Residue +ITEM_DOG_RESIDUE_SHORTNAME=DogResidu +ITEM_DOG_RESIDUE_SHORTNAME2=D.Residue +ITEM_DOG_RESIDUE_DESCRIPTION=* "Dog Residue" - Dog Item\n* Shiny trail left\n behind by a dog. +ITEM_DOG_RESIDUE_DESCRIPTION_2=* "Dog Residue" - Dog Item\n* Dog-shaped husk shed\n from a dog's carapace. +ITEM_DOG_RESIDUE_DESCRIPTION_3=* "Dog Residue" - Dog Item\n* Dirty dishes left\n unwashed by a dog. +ITEM_DOG_RESIDUE_DESCRIPTION_4=* "Dog Residue" - Dog Item\n* Glowing crystals secreted\n by a dog. +ITEM_DOG_RESIDUE_DESCRIPTION_5=* "Dog Residue" - Dog Item\n* Jigsaw puzzle left\n unfinished by a dog. +ITEM_DOG_RESIDUE_DESCRIPTION_6=* "Dog Residue" - Dog Item\n* Web spun by a dog\n to ensnare prey. +ITEM_DOG_RESIDUE_DESCRIPTION_SHOP=undefined +ITEM_DOG_RESIDUE_USE=* You used the Dog Residue. +ITEM_DOG_RESIDUE_USE_SUCCESS=* The rest of your inventory\n filled up with Dog Residue. +ITEM_DOG_RESIDUE_USE_FAIL=* ... +ITEM_DOG_RESIDUE_USE_FAIL_2=* You finished using it. +ITEM_DOG_RESIDUE_USE_FAIL_3=* An uneasy atmosphere fills\n the room. + # World shop WORLD_SHOP_ACTION_BUY=Buy WORLD_SHOP_ACTION_SELL=Sell diff --git a/engine/assets/sounds/dogresidue.wav b/engine/assets/sounds/dogresidue.wav new file mode 100644 index 0000000000000000000000000000000000000000..055029b6a6b6cfc579e73214cc29203243470130 GIT binary patch literal 112718 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 T literal 0 HcmV?d00001 diff --git a/engine/items/abandoned_quiche.lua b/engine/items/abandoned_quiche.lua new file mode 100644 index 0000000..94c996e --- /dev/null +++ b/engine/items/abandoned_quiche.lua @@ -0,0 +1,30 @@ +--- @class Item.AbandonedQuiche : Dummy.Item.Consumable +local AbandonedQuicheItem = Class(ItemConsumable, "Item.AbandonedQuiche") + +--- Creates an abandoned quiche +--- @return Item.AbandonedQuiche +function AbandonedQuicheItem:new() + self = Class:new(AbandonedQuicheItem, { + "abandoned_quiche", -- item identifier + "ITEM_ABANDONED_QUICHE_NAME", -- item name + "ITEM_ABANDONED_QUICHE_SHORTNAME", -- item short name + "ITEM_ABANDONED_QUICHE_DESCRIPTION", -- item description + Player.getMaxHP(), + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(1) + -- the price at which the item will be sold in the shop + self:setSellPrice(76) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_ABANDONED_QUICHE_DESCRIPTION_SHOP") + -- the text that will appear when the item is dropped on the ground + self:setDropText("ITEM_ABANDONED_QUICHE_DROP") + -- the text that will appear when the item is used + self:setUseText("ITEM_ABANDONED_QUICHE_USE") + + return self +end + +return AbandonedQuicheItem diff --git a/engine/items/dog_residue.lua b/engine/items/dog_residue.lua new file mode 100644 index 0000000..9e4c166 --- /dev/null +++ b/engine/items/dog_residue.lua @@ -0,0 +1,65 @@ +--- @class Item.DogResidue : Dummy.Item.Consumable +local DogResidueItem = Class(Item, "Item.DogResidue") + +--- Creates a dog residue +--- @return Item.DogResidue +function DogResidueItem:new() + self = Class:new(DogResidueItem, { + "dog_residue", -- item identifier + "ITEM_DOG_RESIDUE_NAME", -- item name + "ITEM_DOG_RESIDUE_SHORTNAME", -- item short name + "ITEM_DOG_RESIDUE_DESCRIPTION" -- item description + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(1) + -- the price at which the item will be sold in the shop + self:setSellPrice(180) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_DOG_RESIDUE_DESCRIPTION_SHOP") + -- the text that will appear when the item is used + self:setUseText("ITEM_DOG_RESIDUE_USE") + -- descriptions for each dog residue type + self.descriptions = { + "ITEM_DOG_RESIDUE_DESCRIPTION", + "ITEM_DOG_RESIDUE_DESCRIPTION_2", + "ITEM_DOG_RESIDUE_DESCRIPTION_3", + "ITEM_DOG_RESIDUE_DESCRIPTION_4", + "ITEM_DOG_RESIDUE_DESCRIPTION_5", + "ITEM_DOG_RESIDUE_DESCRIPTION_6" + } + -- Random description when a new version of the object is added (copies will retain the same description) + self.random_description = love.math.random(6) + + return self +end + +function DogResidueItem:getDialogueTexts() + -- define dialogue_text as an empty table because it keeps adding to it if we don't. For some reason. + local dialogue_text = {} + table.insert(dialogue_text, self:getUseTexts()) + -- Show mini-cutscene depending on if the item can create clones + if #Player.getItems() == Player.getMaxItems() then + table.insert(dialogue_text, Lang.translate("ITEM_DOG_RESIDUE_USE_FAIL")) + table.insert(dialogue_text, Lang.translate("ITEM_DOG_RESIDUE_USE_FAIL_2")) + table.insert(dialogue_text, Lang.translate("ITEM_DOG_RESIDUE_USE_FAIL_3")) + else + table.insert(dialogue_text, Lang.translate("ITEM_DOG_RESIDUE_USE_SUCCESS")) + end + return dialogue_text +end + +function DogResidueItem:onUse() + -- Clone the item to all empty slots in the player's inventory + Assets.playSound("dogresidue") + for i = 1, Player.getMaxItems() - #Player.getItems() do + local dog_residue = require("items.dog_residue"):new() + Player.addItem(dog_residue) + end +end + +function DogResidueItem:getDescription() + return Lang.translate(self.descriptions[self.random_description]) +end + +return DogResidueItem diff --git a/engine/items/nice_cream.lua b/engine/items/nice_cream.lua index 3dbd470..e330b9f 100644 --- a/engine/items/nice_cream.lua +++ b/engine/items/nice_cream.lua @@ -37,7 +37,6 @@ end function NiceCreamItem:getDialogueTexts() -- Generate a random number local rand = love.math.random(9) - print(rand) -- Set Default Dialogue Text local dialogue_text = Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. "\n" .. self:getHealText() diff --git a/engine/mods/world_example/scripts/items/bisicle.lua b/engine/mods/world_example/scripts/items/bisicle.lua index b43aec5..f719602 100644 --- a/engine/mods/world_example/scripts/items/bisicle.lua +++ b/engine/mods/world_example/scripts/items/bisicle.lua @@ -21,7 +21,7 @@ function BisicleItem:new() self:setShopDescription("ITEM_BISICLE_DESCRIPTION_SHOP") self.use_texts = { - "BATTLE_BISICLE_USE" + "ITEM_BISICLE_USE" } return self diff --git a/engine/mods/world_example/scripts/world/shop/dummy_shop.lua b/engine/mods/world_example/scripts/world/shop/dummy_shop.lua index 8b96797..558af90 100644 --- a/engine/mods/world_example/scripts/world/shop/dummy_shop.lua +++ b/engine/mods/world_example/scripts/world/shop/dummy_shop.lua @@ -45,11 +45,13 @@ function DummyShop:prepareItems() local SpiderDonut = require("items.spider_donut") local bisicle = tryRequire("scripts.items.bisicle", "items.bisicle") local nice_cream = require("items.nice_cream") + local quiche = require("items.abandoned_quiche") + local dog_residue = require("items.dog_residue") -- amount `-1` for infinite stock self:addItem(MonsterCandy, -1) - self:addItem(SpiderDonut, -1) self:addItem(bisicle, -1) - self:addItem(nice_cream, -1) + self:addItem(quiche, -1) + self:addItem(dog_residue, -1) local BlanketItem = require("items.blanket") local blanket_amount = 1 From 05d9f59ff6b83b77a79bf20b16776925f9fc6163 Mon Sep 17 00:00:00 2001 From: Ivan Date: Mon, 3 Aug 2026 08:03:44 -0700 Subject: [PATCH 5/8] last minute numerical changes --- engine/items/abandoned_quiche.lua | 2 +- engine/items/dog_residue.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/engine/items/abandoned_quiche.lua b/engine/items/abandoned_quiche.lua index 94c996e..9816231 100644 --- a/engine/items/abandoned_quiche.lua +++ b/engine/items/abandoned_quiche.lua @@ -9,7 +9,7 @@ function AbandonedQuicheItem:new() "ITEM_ABANDONED_QUICHE_NAME", -- item name "ITEM_ABANDONED_QUICHE_SHORTNAME", -- item short name "ITEM_ABANDONED_QUICHE_DESCRIPTION", -- item description - Player.getMaxHP(), + 34, "food" }) diff --git a/engine/items/dog_residue.lua b/engine/items/dog_residue.lua index 9e4c166..fa1d38d 100644 --- a/engine/items/dog_residue.lua +++ b/engine/items/dog_residue.lua @@ -14,7 +14,7 @@ function DogResidueItem:new() -- the price the player will pay to buy the item in the shop self:setBuyPrice(1) -- the price at which the item will be sold in the shop - self:setSellPrice(180) + self:setSellPrice(love.math.random(4)) -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item self:setShopDescription("ITEM_DOG_RESIDUE_DESCRIPTION_SHOP") -- the text that will appear when the item is used From 4709410caccc1af26b1f2a4a79b082c719147c1b Mon Sep 17 00:00:00 2001 From: Ivan Date: Tue, 4 Aug 2026 17:28:45 -0700 Subject: [PATCH 6/8] nearly done with consumables --- engine/assets/langs/en.txt | 102 ++++++++++++++++++ engine/assets/sounds/catsalad.wav | Bin 0 -> 105038 bytes engine/assets/sounds/dogsalad.wav | Bin 0 -> 62798 bytes engine/item/consumable.lua | 6 +- engine/items/astronaut_food.lua | 26 +++++ engine/items/bad_memory.lua | 37 +++++++ engine/items/crab_apple.lua | 26 +++++ engine/items/dog_residue.lua | 15 +-- engine/items/dog_salad.lua | 64 +++++++++++ engine/items/face_steak.lua | 28 +++++ engine/items/glamburger.lua | 26 +++++ engine/items/hot_cat.lua | 30 ++++++ engine/items/hot_dog.lua | 30 ++++++ engine/items/instant_noodles.lua | 63 +++++++++++ engine/items/legendary_hero.lua | 42 ++++++++ engine/items/monster_candy.lua | 2 +- engine/items/nice_cream.lua | 8 +- engine/items/popato_chisps.lua | 26 +++++ engine/items/sea_tea.lua | 43 ++++++++ engine/items/spider_donut.lua | 2 +- engine/items/starfait.lua | 26 +++++ engine/mods/froggit/mod.lua | 5 + engine/mods/world_example/mod.lua | 11 +- .../scripts/world/shop/dummy_shop.lua | 12 ++- 24 files changed, 611 insertions(+), 19 deletions(-) create mode 100644 engine/assets/sounds/catsalad.wav create mode 100644 engine/assets/sounds/dogsalad.wav create mode 100644 engine/items/astronaut_food.lua create mode 100644 engine/items/bad_memory.lua create mode 100644 engine/items/crab_apple.lua create mode 100644 engine/items/dog_salad.lua create mode 100644 engine/items/face_steak.lua create mode 100644 engine/items/glamburger.lua create mode 100644 engine/items/hot_cat.lua create mode 100644 engine/items/hot_dog.lua create mode 100644 engine/items/instant_noodles.lua create mode 100644 engine/items/legendary_hero.lua create mode 100644 engine/items/popato_chisps.lua create mode 100644 engine/items/sea_tea.lua create mode 100644 engine/items/starfait.lua diff --git a/engine/assets/langs/en.txt b/engine/assets/langs/en.txt index 6ef7dcc..9846516 100644 --- a/engine/assets/langs/en.txt +++ b/engine/assets/langs/en.txt @@ -40,6 +40,7 @@ BATTLE_FLEE_REWARD= * Ran away with {} EXP\n and {} GOLD. BATTLE_WIN_REWARD=* YOU WON!\n* You earned {} EXP and {} gold. BATTLE_WIN_LEVEL_UP=* Your LOVE increased. BATTLE_ITEM_HEAL=* You recovered {} HP! +BATTLE_ITEM_HURT=* You lost {} HP! BATTLE_ITEM_HEAL_MAX=* Your HP was maxed out. BATTLE_ITEM_FOOD_USE=* You eat the {}. BATTLE_ITEM_DRINK_USE=* You drink the {}. @@ -198,6 +199,107 @@ ITEM_DOG_RESIDUE_USE_FAIL=* ... ITEM_DOG_RESIDUE_USE_FAIL_2=* You finished using it. ITEM_DOG_RESIDUE_USE_FAIL_3=* An uneasy atmosphere fills\n the room. +ITEM_DOG_SALAD_NAME=Dog Salad +ITEM_DOG_SALAD_SHORTNAME=Dog Salad +ITEM_DOG_SALAD_SHORTNAME2=Dog Salad +ITEM_DOG_SALAD_DESCRIPTION=* "Dog Salad" - Heals ?? HP\n* Recovers HP.\n* (Hit Poodles.) +ITEM_DOG_SALAD_DESCRIPTION_SHOP=undefined +ITEM_DOG_SALAD_USE=* Oh.[wait:5] Tastes yappy... +ITEM_DOG_SALAD_USE_2=* Oh.[wait:5] Fried tennis ball... +ITEM_DOG_SALAD_USE_3=* Oh.[wait:5] There are bones... +ITEM_DOG_SALAD_USE_4=* It's literally garbage??? + +ITEM_ASTRONAUT_FOOD_NAME=Astronaut Food +ITEM_ASTRONAUT_FOOD_SHORTNAME=AstroFood +ITEM_ASTRONAUT_FOOD_SHORTNAME2=Astr.Food +ITEM_ASTRONAUT_FOOD_DESCRIPTION=* "Astronaut Food" Heals 21 HP\n* For feeding a pet\n astronaut. +ITEM_ASTRONAUT_FOOD_DESCRIPTION_SHOP=undefined + +ITEM_INSTANT_NOODLES_NAME=Instant Noodles +ITEM_INSTANT_NOODLES_SHORTNAME=InstaNood +ITEM_INSTANT_NOODLES_SHORTNAME2=I.Noodles +ITEM_INSTANT_NOODLES_DESCRIPTION=* "Instant Noodles" Heals HP\n* Comes with everything you\n need for a quick meal! +ITEM_INSTANT_NOODLES_DESCRIPTION_SHOP=undefined +ITEM_INSTANT_NOODLES_USE=* You remove the Instant\n Noodles from their\n packaging. +ITEM_INSTANT_NOODLES_USE_1=[noskip]* You put some water in\n the pot and place it on\n the heat. +ITEM_INSTANT_NOODLES_USE_2=[noskip]* You wait for the water\n to boil... +ITEM_INSTANT_NOODLES_USE_3=[noskip]* ...[wait:20]\n* ...[wait:20]\n* ... +ITEM_INSTANT_NOODLES_USE_4=[noskip]* It's[wait:10] boiling. +ITEM_INSTANT_NOODLES_USE_5=[noskip]* You place the noodles[wait:5]\n into the pot. +ITEM_INSTANT_NOODLES_USE_6=[noskip]* 4[wait:15] minutes left[wait:15] until\n the noodles[wait:10] are finished. +ITEM_INSTANT_NOODLES_USE_7=[noskip]* 3[wait:15] minutes left[wait:15] until\n the noodles[wait:10] are finished. +ITEM_INSTANT_NOODLES_USE_8=[noskip]* 2[wait:15] minutes left[wait:15] until\n the noodles[wait:10] are finished. +ITEM_INSTANT_NOODLES_USE_9=[noskip]* 1[wait:15] minute left[wait:15] until\n the noodles[wait:10] are finished. +ITEM_INSTANT_NOODLES_USE_10=[noskip]* The noodles[wait:15] are finished. +ITEM_INSTANT_NOODLES_USE_11=[noskip]* ... they don't taste very\n good. +ITEM_INSTANT_NOODLES_USE_12=[noskip]* You add the flavor packet. +ITEM_INSTANT_NOODLES_USE_13=[noskip]* That's better. +ITEM_INSTANT_NOODLES_USE_14=[noskip]* Not great,[wait:5] but better. + +ITEM_CRAB_APPLE_NAME=Crab Apple +ITEM_CRAB_APPLE_SHORTNAME=CrabApple +ITEM_CRAB_APPLE_SHORTNAME2=CrabApple +ITEM_CRAB_APPLE_DESCRIPTION=* "Crab Apple" Heals 18 HP\n* An aquatic fruit that\n resembles a crustacean. +ITEM_CRAB_APPLE_DESCRIPTION_SHOP=Heals 18HP\n(Looks\nlike a\ncrab.) + +ITEM_HOT_DOG_NAME=Hot Dog...? +ITEM_HOT_DOG_SHORTNAME=Hot Dog +ITEM_HOT_DOG_SHORTNAME2=Hot Dog +ITEM_HOT_DOG_DESCRIPTION=* "Hot Dog...?" Heals 20 HP\n* The "meat" is made of something\n called a "water sausage." +ITEM_HOT_DOG_DESCRIPTION_SHOP=undefined + +ITEM_HOT_CAT_NAME=Hot Cat +ITEM_HOT_CAT_SHORTNAME=Hot Cat +ITEM_HOT_CAT_SHORTNAME2=Hot Cat +ITEM_HOT_CAT_DESCRIPTION=* "Hot Cat" Heals 21 HP\n* Like a hot dog,[wait:5] but with\n little cat ears on the end. +ITEM_HOT_CAT_DESCRIPTION_SHOP=undefined + +ITEM_GLAMBURGER_NAME=Glamburger +ITEM_GLAMBURGER_SHORTNAME=GlamBurg +ITEM_GLAMBURGER_SHORTNAME2=G.Burger +ITEM_GLAMBURGER_DESCRIPTION=* "Glamburger" Heals 27 HP\n* A hamburger made of edible\n glitter and sequins. +ITEM_GLAMBURGER_DESCRIPTION_SHOP=Heals 27HP\nVery popular\nfood. + +ITEM_STARFAIT_NAME=Starfait +ITEM_STARFAIT_SHORTNAME=Starfait +ITEM_STARFAIT_SHORTNAME2=Starfait +ITEM_STARFAIT_DESCRIPTION=* "Starfait" Heals 14 HP\n* A sweet treat made of\n sparkling stars. +ITEM_STARFAIT_DESCRIPTION_SHOP=Heals 14HP\nVery popular\nfood. + +ITEM_SEATEA_NAME=Sea Tea +ITEM_SEATEA_SHORTNAME=Sea Tea +ITEM_SEATEA_SHORTNAME2=Sea Tea +ITEM_SEATEA_DESCRIPTION=* "Sea Tea" Heals 10 HP\n* Made from glowing marshwater.\n* Increases SPEED for one battle. +ITEM_SEATEA_DESCRIPTION_SHOP=Heals 10HP\nSPEED\nup in\nbattle. +ITEM_SEATEA_USE=* Your SPEED boosts! + +ITEM_LEGENDARY_HERO_NAME=Legendary Hero +ITEM_LEGENDARY_HERO_SHORTNAME=Leg.Hero +ITEM_LEGENDARY_HERO_SHORTNAME2=L. Hero +ITEM_LEGENDARY_HERO_DESCRIPTION=* "Legendary Hero" Heals 40 HP\n* Sandwich shaped like a sword.\n* Increases ATTACK when eaten. +ITEM_LEGENDARY_HERO_DESCRIPTION_SHOP=Heals 40HP\nHero Sandwich.\nATTACK UP\nin battle. +ITEM_LEGENDARY_HERO_USE=* ATTACK increased by 4! + +ITEM_FACE_STEAK_NAME=Steak in the Shape of Mettaton's Face +ITEM_FACE_STEAK_SHORTNAME=FaceSteak +ITEM_FACE_STEAK_SHORTNAME2=Steak +ITEM_FACE_STEAK_DESCRIPTION=* "Face Steak" Heals 60 HP\n* Huge steak in the shape\n of Mettaton's face. +ITEM_FACE_STEAK_DESCRIPTION_SHOP=Heals 60HP\nDon't ask.\nPlease. +ITEM_FACE_STEAK_USE=* You eat the Face Steak. + +ITEM_POPATO_CHISPS_NAME=Popato Chisps +ITEM_POPATO_CHISPS_SHORTNAME=PT Chisps +ITEM_POPATO_CHISPS_SHORTNAME2=Chips +ITEM_POPATO_CHISPS_DESCRIPTION=* "Popato Chisps" Heals 13 HP\n* Regular old popato chisps. +ITEM_POPATO_CHISPS_DESCRIPTION_SHOP=undefined + +ITEM_BAD_MEMORY_NAME=Bad Memory +ITEM_BAD_MEMORY_SHORTNAME=BadMemory +ITEM_BAD_MEMORY_SHORTNAME2=BadMemory +ITEM_BAD_MEMORY_DESCRIPTION=* "Bad Memory" Hurts 1 HP\n* ????? +ITEM_BAD_MEMORY_DESCRIPTION_SHOP=undefined +ITEM_BAD_MEMORY_USE=* You consume the Bad Memory.[wait:5] + # World shop WORLD_SHOP_ACTION_BUY=Buy WORLD_SHOP_ACTION_SELL=Sell diff --git a/engine/assets/sounds/catsalad.wav b/engine/assets/sounds/catsalad.wav new file mode 100644 index 0000000000000000000000000000000000000000..33f06662802df1e2a9fce9c566e1adb543562aa6 GIT binary patch literal 105038 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 literal 0 HcmV?d00001 diff --git a/engine/assets/sounds/dogsalad.wav b/engine/assets/sounds/dogsalad.wav new file mode 100644 index 0000000000000000000000000000000000000000..858017662897ca48cc618a3d3f9bbe910a08fd19 GIT binary patch literal 62798 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 Player.getMaxHP() then heal_text = Lang.translate("BATTLE_ITEM_HEAL_MAX") end + -- Hurt the player for some reason + if self:getHeal() < 0 then + heal_text = Lang.translate("BATTLE_ITEM_HURT", math.abs(self:getHeal())) + end return heal_text end ---- (Override) Gets the item's final dialogue text when used +--- (Override) Gets the item's final dialogue text --- @return Dummy.Text.Text[] function ItemConsumable:getDialogueTexts() local heal_text = self:getHealText() diff --git a/engine/items/astronaut_food.lua b/engine/items/astronaut_food.lua new file mode 100644 index 0000000..24731c2 --- /dev/null +++ b/engine/items/astronaut_food.lua @@ -0,0 +1,26 @@ +--- @class Item.AstronautFood : Dummy.Item.Consumable +local AstronautFoodItem = Class(ItemConsumable, "Item.AstronautFood") + +--- Creates a astronaut food +--- @return Item.AstronautFood +function AstronautFoodItem:new() + self = Class:new(AstronautFoodItem, { + "astronaut_food", -- item identifier + "ITEM_ASTRONAUT_FOOD_NAME", -- item name + "ITEM_ASTRONAUT_FOOD_SHORTNAME", -- item short name + "ITEM_ASTRONAUT_FOOD_DESCRIPTION", -- item description + 21, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(1) + -- the price at which the item will be sold in the shop + self:setSellPrice(25) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_ASTRONAUT_FOOD_DESCRIPTION_SHOP") + + return self +end + +return AstronautFoodItem diff --git a/engine/items/bad_memory.lua b/engine/items/bad_memory.lua new file mode 100644 index 0000000..5af70dd --- /dev/null +++ b/engine/items/bad_memory.lua @@ -0,0 +1,37 @@ +--- @class Item.BadMemory : Dummy.Item.Consumable +local BadMemoryItem = Class(ItemConsumable, "Item.BadMemory") + +--- Creates a ??? +--- @return Item.BadMemory +function BadMemoryItem:new() + self = Class:new(BadMemoryItem, { + "bad_memory", -- item identifier + "ITEM_BAD_MEMORY_NAME", -- item name + "ITEM_BAD_MEMORY_SHORTNAME", -- item short name + "ITEM_BAD_MEMORY_DESCRIPTION", -- item description + -1, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(1) + -- the price at which the item will be sold in the shop + self:setSellPrice(300) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_BAD_MEMORY_DESCRIPTION_SHOP") + -- the text that will appear when the item is used + self:setUseText("ITEM_BAD_MEMORY_USE") + + return self +end + +function BadMemoryItem:getHeal() + -- Heal the player fully if they're below 3 HP, hurt them otherwise. + if Player.getHP() <=2 then + return Player.getMaxHP() + else + return -1 + end +end + +return BadMemoryItem diff --git a/engine/items/crab_apple.lua b/engine/items/crab_apple.lua new file mode 100644 index 0000000..00a59ed --- /dev/null +++ b/engine/items/crab_apple.lua @@ -0,0 +1,26 @@ +--- @class Item.CrabApple : Dummy.Item.Consumable +local CrabAppleItem = Class(ItemConsumable, "Item.CrabApple") + +--- Creates a crab apple +--- @return Item.CrabApple +function CrabAppleItem:new() + self = Class:new(CrabAppleItem, { + "crab_apple", -- item identifier + "ITEM_CRAB_APPLE_NAME", -- item name + "ITEM_CRAB_APPLE_SHORTNAME", -- item short name + "ITEM_CRAB_APPLE_DESCRIPTION", -- item description + 18, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(25) + -- the price at which the item will be sold in the shop + self:setSellPrice(5) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_CRAB_APPLE_DESCRIPTION_SHOP") + + return self +end + +return CrabAppleItem diff --git a/engine/items/dog_residue.lua b/engine/items/dog_residue.lua index fa1d38d..41c0e17 100644 --- a/engine/items/dog_residue.lua +++ b/engine/items/dog_residue.lua @@ -29,7 +29,8 @@ function DogResidueItem:new() "ITEM_DOG_RESIDUE_DESCRIPTION_6" } -- Random description when a new version of the object is added (copies will retain the same description) - self.random_description = love.math.random(6) + local rand = love.math.random(6) + self:setDescription(self.descriptions[rand]) return self end @@ -53,13 +54,15 @@ function DogResidueItem:onUse() -- Clone the item to all empty slots in the player's inventory Assets.playSound("dogresidue") for i = 1, Player.getMaxItems() - #Player.getItems() do + local rand = love.math.random(8) + local dog_salad = require("items.dog_salad"):new() local dog_residue = require("items.dog_residue"):new() - Player.addItem(dog_residue) + if rand == 1 then + Player.addItem(dog_salad) + else + Player.addItem(dog_residue) + end end end -function DogResidueItem:getDescription() - return Lang.translate(self.descriptions[self.random_description]) -end - return DogResidueItem diff --git a/engine/items/dog_salad.lua b/engine/items/dog_salad.lua new file mode 100644 index 0000000..bad0d98 --- /dev/null +++ b/engine/items/dog_salad.lua @@ -0,0 +1,64 @@ +--- @class Item.DogSalad : Dummy.Item.Consumable +local DogSaladItem = Class(ItemConsumable, "Item.DogSalad") + +--- Creates a dog salad +--- @return Item.DogSalad +function DogSaladItem:new() + self = Class:new(DogSaladItem, { + "dog_salad", -- item identifier + "ITEM_DOG_SALAD_NAME", -- item name + "ITEM_DOG_SALAD_SHORTNAME", -- item short name + "ITEM_DOG_SALAD_DESCRIPTION", -- item description + 15, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(15) + -- the price at which the item will be sold in the shop + self:setSellPrice(2) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_DOG_SALAD_DESCRIPTION_SHOP") + -- Random comments on use + self.use_comments = { + "ITEM_DOG_SALAD_USE", + "ITEM_DOG_SALAD_USE_2", + "ITEM_DOG_SALAD_USE_3", + "ITEM_DOG_SALAD_USE_4" + } + -- Random comments on use + self.rand = love.math.random(4) + + return self +end + +function DogSaladItem:getDialogueTexts() + -- Select a random comment when getting dialogue text + local dialogue_text = Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. "\n" .. + Lang.translate(self.use_comments[self.rand]) .. "\n" .. self:getHealText() + + return {dialogue_text} +end + +function DogSaladItem:onUse() + Assets.playSound("dogresidue") +end + +function DogSaladItem:getHeal() + local val + if self.rand == 1 then + val = 2 + end + if self.rand == 2 then + val = 10 + end + if self.rand == 3 then + val = 30 + end + if self.rand == 4 then + val = Player.getMaxHP() + end + return val +end + +return DogSaladItem diff --git a/engine/items/face_steak.lua b/engine/items/face_steak.lua new file mode 100644 index 0000000..d269e65 --- /dev/null +++ b/engine/items/face_steak.lua @@ -0,0 +1,28 @@ +--- @class Item.FaceSteak : Dummy.Item.Consumable +local FaceSteakItem = Class(ItemConsumable, "Item.FaceSteak") + +--- Creates a face steak +--- @return Item.FaceSteak +function FaceSteakItem:new() + self = Class:new(FaceSteakItem, { + "face_steak", -- item identifier + "ITEM_FACE_STEAK_NAME", -- item name + "ITEM_FACE_STEAK_SHORTNAME", -- item short name + "ITEM_FACE_STEAK_DESCRIPTION", -- item description + 60, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(500) + -- the price at which the item will be sold in the shop + self:setSellPrice(14) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_FACE_STEAK_DESCRIPTION_SHOP") + -- the text that will appear when the item is used + self:setUseText("ITEM_FACE_STEAK_USE") + + return self +end + +return FaceSteakItem diff --git a/engine/items/glamburger.lua b/engine/items/glamburger.lua new file mode 100644 index 0000000..eda7c59 --- /dev/null +++ b/engine/items/glamburger.lua @@ -0,0 +1,26 @@ +--- @class Item.GlamBurger : Dummy.Item.Consumable +local GlamBurgerItem = Class(ItemConsumable, "Item.GlamBurger") + +--- Creates a glamburger +--- @return Item.GlamBurger +function GlamBurgerItem:new() + self = Class:new(GlamBurgerItem, { + "glamburger", -- item identifier + "ITEM_GLAMBURGER_NAME", -- item name + "ITEM_GLAMBURGER_SHORTNAME", -- item short name + "ITEM_GLAMBURGER_DESCRIPTION", -- item description + 27, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(120) + -- the price at which the item will be sold in the shop + self:setSellPrice(15) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_GLAMBURGER_DESCRIPTION_SHOP") + + return self +end + +return GlamBurgerItem diff --git a/engine/items/hot_cat.lua b/engine/items/hot_cat.lua new file mode 100644 index 0000000..43fe801 --- /dev/null +++ b/engine/items/hot_cat.lua @@ -0,0 +1,30 @@ +--- @class Item.HotCat : Dummy.Item.Consumable +local HotCatItem = Class(ItemConsumable, "Item.HotCat") + +--- Creates a hot cat +--- @return Item.HotCat +function HotCatItem:new() + self = Class:new(HotCatItem, { + "hot_cat", -- item identifier + "ITEM_HOT_CAT_NAME", -- item name + "ITEM_HOT_CAT_SHORTNAME", -- item short name + "ITEM_HOT_CAT_DESCRIPTION", -- item description + 21, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(30) + -- the price at which the item will be sold in the shop + self:setSellPrice(11) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_HOT_CAT_DESCRIPTION_SHOP") + + return self +end + +function HotCatItem:onUse() + Assets.playSound("catsalad") +end + +return HotCatItem diff --git a/engine/items/hot_dog.lua b/engine/items/hot_dog.lua new file mode 100644 index 0000000..aeb5492 --- /dev/null +++ b/engine/items/hot_dog.lua @@ -0,0 +1,30 @@ +--- @class Item.HotDog : Dummy.Item.Consumable +local HotDogItem = Class(ItemConsumable, "Item.HotDog") + +--- Creates a hot dog...? Maybe. +--- @return Item.HotDog +function HotDogItem:new() + self = Class:new(HotDogItem, { + "hot_dog", -- item identifier + "ITEM_HOT_DOG_NAME", -- item name + "ITEM_HOT_DOG_SHORTNAME", -- item short name + "ITEM_HOT_DOG_DESCRIPTION", -- item description + 20, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(30) + -- the price at which the item will be sold in the shop + self:setSellPrice(10) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_HOT_DOG_DESCRIPTION_SHOP") + + return self +end + +function HotDogItem:onUse() + Assets.playSound("dogsalad") +end + +return HotDogItem diff --git a/engine/items/instant_noodles.lua b/engine/items/instant_noodles.lua new file mode 100644 index 0000000..42dfb75 --- /dev/null +++ b/engine/items/instant_noodles.lua @@ -0,0 +1,63 @@ +--- @class Item.InstantNoodles : Dummy.Item.Consumable +local InstantNoodlesItem = Class(ItemConsumable, "Item.InstantNoodles") + +--- Creates an instant noodles +--- @return Item.InstantNoodles +function InstantNoodlesItem:new() + self = Class:new(InstantNoodlesItem, { + "instant_noodles", -- item identifier + "ITEM_INSTANT_NOODLES_NAME", -- item name + "ITEM_INSTANT_NOODLES_SHORTNAME", -- item short name + "ITEM_INSTANT_NOODLES_DESCRIPTION", -- item description + 15, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(1) + -- the price at which the item will be sold in the shop + self:setSellPrice(50) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_INSTANT_NOODLES_DESCRIPTION_SHOP") + --self:setUseText("ITEM_INSTANT_NOODLES_USE") + return self +end + +function InstantNoodlesItem:getHeal() + if World.isInBattle() then + --TODO: Serious Mode Check? + return 4 + else + return 15 + end +end + +function InstantNoodlesItem:getDialogueTexts() + -- TODO: Make this accurate. Stop music and delay use sounds. Override use function? + local usetext = { Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. + "\n" .. self:getHealText() } + local dialogue_text = usetext + if World.isInBattle() then + dialogue_text = { + Lang.translate("ITEM_INSTANT_NOODLES_USE"), + Lang.translate("ITEM_INSTANT_NOODLES_USE_2"), + Lang.translate("ITEM_INSTANT_NOODLES_USE_3"), + Lang.translate("ITEM_INSTANT_NOODLES_USE_4"), + Lang.translate("ITEM_INSTANT_NOODLES_USE_5"), + Lang.translate("ITEM_INSTANT_NOODLES_USE_6"), + Lang.translate("ITEM_INSTANT_NOODLES_USE_7"), + Lang.translate("ITEM_INSTANT_NOODLES_USE_8"), + Lang.translate("ITEM_INSTANT_NOODLES_USE_9"), + Lang.translate("ITEM_INSTANT_NOODLES_USE_10"), + Lang.translate("ITEM_INSTANT_NOODLES_USE_11"), + Lang.translate("ITEM_INSTANT_NOODLES_USE_12"), + Lang.translate("ITEM_INSTANT_NOODLES_USE_13"), + Lang.translate("ITEM_INSTANT_NOODLES_USE_14"), + } + table.insert(dialogue_text, usetext) + end + return dialogue_text +end + + +return InstantNoodlesItem diff --git a/engine/items/legendary_hero.lua b/engine/items/legendary_hero.lua new file mode 100644 index 0000000..df4b81a --- /dev/null +++ b/engine/items/legendary_hero.lua @@ -0,0 +1,42 @@ +--- @class Item.LegendaryHero : Dummy.Item.Consumable +local LegendaryHeroItem = Class(ItemConsumable, "Item.LegendaryHero") + +--- Creates a legendary hero +--- @return Item.LegendaryHero +function LegendaryHeroItem:new() + self = Class:new(LegendaryHeroItem, { + "legendary_hero", -- item identifier + "ITEM_LEGENDARY_HERO_NAME", -- item name + "ITEM_LEGENDARY_HERO_SHORTNAME", -- item short name + "ITEM_LEGENDARY_HERO_DESCRIPTION", -- item description + 40, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(300) + -- the price at which the item will be sold in the shop + self:setSellPrice(40) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_LEGENDARY_HERO_DESCRIPTION_SHOP") + + return self +end + +function LegendaryHeroItem:onUse() + if Player.getAT() < 150 then + Player.setAT(Player.getAT() + 4) + end +end + +function LegendaryHeroItem:getDialogueTexts() + local usecomment = "ITEM_LEGENDARY_HERO_USE" + if Player.getAT() < 150 then + return { Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. "\n" .. + Lang.translate(usecomment) .. "\n" .. self:getHealText() } + else + return { Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. "\n" .. self:getHealText() } + end +end + +return LegendaryHeroItem diff --git a/engine/items/monster_candy.lua b/engine/items/monster_candy.lua index 47199b9..cf82aab 100644 --- a/engine/items/monster_candy.lua +++ b/engine/items/monster_candy.lua @@ -46,7 +46,7 @@ function MonsterCandyItem:getDialogueTexts() if usecomment ~= "" then dialogue_text = { Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. Lang.translate(usecomment) .. "\n" .. self:getHealText() } end - return { dialogue_text, table.unpack(self:getUseTexts(), 2) } + return { dialogue_text } end return MonsterCandyItem diff --git a/engine/items/nice_cream.lua b/engine/items/nice_cream.lua index e330b9f..06b22d3 100644 --- a/engine/items/nice_cream.lua +++ b/engine/items/nice_cream.lua @@ -36,15 +36,13 @@ end function NiceCreamItem:getDialogueTexts() -- Generate a random number - local rand = love.math.random(9) + local rand = love.math.random(8) -- Set Default Dialogue Text local dialogue_text = Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. "\n" .. self:getHealText() -- Override dialogue text with a random comment based on the random number - if rand < 9 then - dialogue_text = Lang.translate(self.use_comments[rand]) - end - return { dialogue_text, table.unpack(self:getUseTexts(), 2) } + dialogue_text = Lang.translate(self.use_comments[rand]) + return { dialogue_text } end return NiceCreamItem diff --git a/engine/items/popato_chisps.lua b/engine/items/popato_chisps.lua new file mode 100644 index 0000000..67520b3 --- /dev/null +++ b/engine/items/popato_chisps.lua @@ -0,0 +1,26 @@ +--- @class Item.PopatoChisps : Dummy.Item.Consumable +local PopatoChispsItem = Class(ItemConsumable, "Item.PopatoChisps") + +--- Creates a popato chisps +--- @return Item.PopatoChisps +function PopatoChispsItem:new() + self = Class:new(PopatoChispsItem, { + "popato_chisps", -- item identifier + "ITEM_POPATO_CHISPS_NAME", -- item name + "ITEM_POPATO_CHISPS_SHORTNAME", -- item short name + "ITEM_POPATO_CHISPS_DESCRIPTION", -- item description + 13, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(25) + -- the price at which the item will be sold in the shop + self:setSellPrice(35) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_POPATO_CHISPS_DESCRIPTION_SHOP") + + return self +end + +return PopatoChispsItem diff --git a/engine/items/sea_tea.lua b/engine/items/sea_tea.lua new file mode 100644 index 0000000..1fbfc6e --- /dev/null +++ b/engine/items/sea_tea.lua @@ -0,0 +1,43 @@ +--- @class Item.SeaTea : Dummy.Item.Consumable +local SeaTeaItem = Class(ItemConsumable, "Item.SeaTea") + +--- Creates a sea tea +--- @return Item.SeaTea +function SeaTeaItem:new() + self = Class:new(SeaTeaItem, { + "seatea", -- item identifier + "ITEM_SEATEA_NAME", -- item name + "ITEM_SEATEA_SHORTNAME", -- item short name + "ITEM_SEATEA_DESCRIPTION", -- item description + 10, + "drink" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(18) + -- the price at which the item will be sold in the shop + self:setSellPrice(5) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_SEATEA_DESCRIPTION_SHOP") + + return self +end + +function SeaTeaItem:onUse() + if Soul.getSpeed() < 2 then + Soul.setSpeed(Soul.getSpeed() + 0.25) + print(Soul.getSpeed()) + end +end + +function SeaTeaItem:getDialogueTexts() + local usecomment = "ITEM_SEATEA_USE" + if Soul.getSpeed() < 2 then + return { Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. "\n" .. + Lang.translate(usecomment) .. "\n" .. self:getHealText() } + else + return { Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. "\n" .. self:getHealText() } + end +end + +return SeaTeaItem diff --git a/engine/items/spider_donut.lua b/engine/items/spider_donut.lua index f9ccc1b..751afc7 100644 --- a/engine/items/spider_donut.lua +++ b/engine/items/spider_donut.lua @@ -35,7 +35,7 @@ function SpiderDonutItem:getDialogueTexts() dialogue_text = Lang.translate("ITEM_SPIDER_DONUT_USE") end end - return { dialogue_text, table.unpack(self:getUseTexts(), 2) } + return { dialogue_text } end return SpiderDonutItem diff --git a/engine/items/starfait.lua b/engine/items/starfait.lua new file mode 100644 index 0000000..5faec9e --- /dev/null +++ b/engine/items/starfait.lua @@ -0,0 +1,26 @@ +--- @class Item.Starfait : Dummy.Item.Consumable +local StarfaitItem = Class(ItemConsumable, "Item.Starfait") + +--- Creates a starfait +--- @return Item.Starfait +function StarfaitItem:new() + self = Class:new(StarfaitItem, { + "starfait", -- item identifier + "ITEM_STARFAIT_NAME", -- item name + "ITEM_STARFAIT_SHORTNAME", -- item short name + "ITEM_STARFAIT_DESCRIPTION", -- item description + 14, + "drink" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(60) + -- the price at which the item will be sold in the shop + self:setSellPrice(10) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_STARFAIT_DESCRIPTION_SHOP") + + return self +end + +return StarfaitItem diff --git a/engine/mods/froggit/mod.lua b/engine/mods/froggit/mod.lua index 1e0d1ee..eab10dc 100644 --- a/engine/mods/froggit/mod.lua +++ b/engine/mods/froggit/mod.lua @@ -20,6 +20,11 @@ function mod:load() -- add items Player.addItem(require("items.monster_candy"):new()) + Player.addItem(require("items.sea_tea"):new()) + Player.addItem(require("items.sea_tea"):new()) + Player.addItem(require("items.sea_tea"):new()) + Player.addItem(require("items.sea_tea"):new()) + Player.addItem(require("items.sea_tea"):new()) Player.addItem(ItemEquipment:new( "toy_knife", "FROGGIT_MOD_TOY_KNIFE_NAME", diff --git a/engine/mods/world_example/mod.lua b/engine/mods/world_example/mod.lua index 0c0c185..53fed62 100644 --- a/engine/mods/world_example/mod.lua +++ b/engine/mods/world_example/mod.lua @@ -193,8 +193,15 @@ function WorldExampleMod:onEncounterEnd(encounter) WorldExampleMod:setTitle("WORLD_EXAMPLE_MOD_TITLE") end ---- Updates the mod, called on every game update +--- Updates the mod, called on every game updatez --- @param dt number -function WorldExampleMod:update(dt) end +function WorldExampleMod:update(dt) + if Input.isPressed("f1") then + if not World.isInBattle() then + local encounter = modRequire("scripts.encounters.dummy"):new() + World.startEncounter(encounter) + end + end +end return WorldExampleMod diff --git a/engine/mods/world_example/scripts/world/shop/dummy_shop.lua b/engine/mods/world_example/scripts/world/shop/dummy_shop.lua index 558af90..3946cf4 100644 --- a/engine/mods/world_example/scripts/world/shop/dummy_shop.lua +++ b/engine/mods/world_example/scripts/world/shop/dummy_shop.lua @@ -47,11 +47,17 @@ function DummyShop:prepareItems() local nice_cream = require("items.nice_cream") local quiche = require("items.abandoned_quiche") local dog_residue = require("items.dog_residue") + local instant_noodles = require("items.instant_noodles") + local hot_dog = require("items.hot_dog") + local hot_cat = require("items.hot_cat") + local sea_tea = require("items.sea_tea") + local bad_memory = require("items.bad_memory") -- amount `-1` for infinite stock - self:addItem(MonsterCandy, -1) - self:addItem(bisicle, -1) - self:addItem(quiche, -1) + self:addItem(bad_memory, -1) + self:addItem(sea_tea, -1) + self:addItem(instant_noodles, -1) self:addItem(dog_residue, -1) + self:addItem(hot_dog, -1) local BlanketItem = require("items.blanket") local blanket_amount = 1 From dbda7e0ddfac8dc51ca40fc45ecb80f32abb064e Mon Sep 17 00:00:00 2001 From: Ivan Date: Tue, 4 Aug 2026 17:33:57 -0700 Subject: [PATCH 7/8] revert froggit battle mod.lua (was testing sea teas......) --- engine/mods/froggit/mod.lua | 5 ----- 1 file changed, 5 deletions(-) diff --git a/engine/mods/froggit/mod.lua b/engine/mods/froggit/mod.lua index eab10dc..1e0d1ee 100644 --- a/engine/mods/froggit/mod.lua +++ b/engine/mods/froggit/mod.lua @@ -20,11 +20,6 @@ function mod:load() -- add items Player.addItem(require("items.monster_candy"):new()) - Player.addItem(require("items.sea_tea"):new()) - Player.addItem(require("items.sea_tea"):new()) - Player.addItem(require("items.sea_tea"):new()) - Player.addItem(require("items.sea_tea"):new()) - Player.addItem(require("items.sea_tea"):new()) Player.addItem(ItemEquipment:new( "toy_knife", "FROGGIT_MOD_TOY_KNIFE_NAME", From 77310cbc24ab4431d0074598181ad6457c9d89d0 Mon Sep 17 00:00:00 2001 From: Ivan Date: Tue, 4 Aug 2026 22:00:49 -0700 Subject: [PATCH 8/8] finish consumables I think --- engine/assets/langs/en.txt | 27 +++++++++++++ engine/item/item.lua | 2 + engine/items/hush_puppy.lua | 31 +++++++++++++++ engine/items/junk_food.lua | 26 +++++++++++++ engine/items/last_dream.lua | 27 +++++++++++++ engine/items/snail_pie.lua | 38 +++++++++++++++++++ .../scripts/world/shop/dummy_shop.lua | 18 +-------- 7 files changed, 153 insertions(+), 16 deletions(-) create mode 100644 engine/items/hush_puppy.lua create mode 100644 engine/items/junk_food.lua create mode 100644 engine/items/last_dream.lua create mode 100644 engine/items/snail_pie.lua diff --git a/engine/assets/langs/en.txt b/engine/assets/langs/en.txt index 9846516..e604e94 100644 --- a/engine/assets/langs/en.txt +++ b/engine/assets/langs/en.txt @@ -300,6 +300,33 @@ ITEM_BAD_MEMORY_DESCRIPTION=* "Bad Memory" Hurts 1 HP\n* ????? ITEM_BAD_MEMORY_DESCRIPTION_SHOP=undefined ITEM_BAD_MEMORY_USE=* You consume the Bad Memory.[wait:5] +ITEM_JUNK_FOOD_NAME=Junk Food +ITEM_JUNK_FOOD_SHORTNAME=Junk Food +ITEM_JUNK_FOOD_SHORTNAME2=Junk Food +ITEM_JUNK_FOOD_DESCRIPTION=* "Junk Food" Heals 17 HP\n* Food that was probably\n once thrown away. +ITEM_JUNK_FOOD_DESCRIPTION_SHOP=Heals 17HP\nHas a big\nbite out of\nit. + +ITEM_HUSH_PUPPY_NAME=Hush Puppy +ITEM_HUSH_PUPPY_SHORTNAME=HushPupe +ITEM_HUSH_PUPPY_SHORTNAME2=HushPuppy +ITEM_HUSH_PUPPY_DESCRIPTION=* "Hush Puppy" Heals 65 HP\n* This wonderful spell will stop\n a dog from casting magic. +ITEM_HUSH_PUPPY_DESCRIPTION_SHOP=undefined +ITEM_HUSH_PUPPY_USE=\n* Dog-magic is neutralized. + +ITEM_SNAIL_PIE_NAME=Snail Pie +ITEM_SNAIL_PIE_SHORTNAME=Snail Pie +ITEM_SNAIL_PIE_SHORTNAME2=Snail Pie +ITEM_SNAIL_PIE_DESCRIPTION=* "Snail Pie" - Heals Some HP\n* An acquired taste. +ITEM_SNAIL_PIE_DESCRIPTION_SHOP=undefined +ITEM_SNAIL_PIE_HEAL=* Your HP was maxed out. + +ITEM_LAST_DREAM_NAME=Last Dream +ITEM_LAST_DREAM_SHORTNAME="Dream" +ITEM_LAST_DREAM_SHORTNAME2="Dream" +ITEM_LAST_DREAM_DESCRIPTION=* "Dream" Heals 12 HP\n* The goal of "Determination." +ITEM_LAST_DREAM_DESCRIPTION_SHOP=undefined +ITEM_LAST_DREAM_USE=* Through DETERMINATION,[wait:5] the\n dream became true. + # World shop WORLD_SHOP_ACTION_BUY=Buy WORLD_SHOP_ACTION_SELL=Sell diff --git a/engine/item/item.lua b/engine/item/item.lua index 626b411..7a0d050 100644 --- a/engine/item/item.lua +++ b/engine/item/item.lua @@ -96,6 +96,7 @@ end function Item:getDialogueTexts() return self:getUseTexts() end + --- Gets the item's buy price --- @return integer function Item:getBuyPrice() @@ -126,6 +127,7 @@ function Item:use() if type(self.onBeforeUse) == "function" then can_use = self:onBeforeUse() end + if not can_use then return end local dialogue_texts = self:getDialogueTexts() diff --git a/engine/items/hush_puppy.lua b/engine/items/hush_puppy.lua new file mode 100644 index 0000000..5387118 --- /dev/null +++ b/engine/items/hush_puppy.lua @@ -0,0 +1,31 @@ +--- @class Item.HushPuppy : Dummy.Item.Consumable +local HushPuppyItem = Class(ItemConsumable, "Item.HushPuppy") + +--- Creates hush puppy +--- @return Item.HushPuppy +function HushPuppyItem:new() + self = Class:new(HushPuppyItem, { + "butterscotch_pie", -- item identifier + "ITEM_HUSH_PUPPY_NAME", -- item name + "ITEM_HUSH_PUPPY_SHORTNAME", -- item short name + "ITEM_HUSH_PUPPY_DESCRIPTION", -- item description + 65, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(1) + -- the price at which the item will be sold in the shop + self:setSellPrice(150) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_HUSH_PUPPY_DESCRIPTION_SHOP") + + return self +end + +function HushPuppyItem:getDialogueTexts() + return {Lang.translate(self:getUseTexts()[1], Lang.translate(self:getName())) .. + Lang.translate("ITEM_HUSH_PUPPY_USE") .. "\n" .. self:getHealText()} +end + +return HushPuppyItem diff --git a/engine/items/junk_food.lua b/engine/items/junk_food.lua new file mode 100644 index 0000000..7600a48 --- /dev/null +++ b/engine/items/junk_food.lua @@ -0,0 +1,26 @@ +--- @class Item.JunkFood : Dummy.Item.Consumable +local JunkFoodItem = Class(ItemConsumable, "Item.JunkFood") + +--- Creates junk food +--- @return Item.JunkFood +function JunkFoodItem:new() + self = Class:new(JunkFoodItem, { + "butterscotch_pie", -- item identifier + "ITEM_JUNK_FOOD_NAME", -- item name + "ITEM_JUNK_FOOD_SHORTNAME", -- item short name + "ITEM_JUNK_FOOD_DESCRIPTION", -- item description + 17, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(25) + -- the price at which the item will be sold in the shop + self:setSellPrice(1) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_JUNK_FOOD_DESCRIPTION_SHOP") + + return self +end + +return JunkFoodItem diff --git a/engine/items/last_dream.lua b/engine/items/last_dream.lua new file mode 100644 index 0000000..5e3d645 --- /dev/null +++ b/engine/items/last_dream.lua @@ -0,0 +1,27 @@ +--- @class Item.LastDream : Dummy.Item.Consumable +local LastDreamItem = Class(ItemConsumable, "Item.LastDream") + +--- Creates a last dream +--- @return Item.LastDream +function LastDreamItem:new() + self = Class:new(LastDreamItem, { + "last_dream", -- item identifier + "ITEM_LAST_DREAM_NAME", -- item name + "ITEM_LAST_DREAM_SHORTNAME", -- item short name + "ITEM_LAST_DREAM_DESCRIPTION", -- item description + 17, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(1) + -- the price at which the item will be sold in the shop + self:setSellPrice(250) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_LAST_DREAM_DESCRIPTION_SHOP") + self:setUseText("ITEM_LAST_DREAM_USE") + + return self +end + +return LastDreamItem diff --git a/engine/items/snail_pie.lua b/engine/items/snail_pie.lua new file mode 100644 index 0000000..f5853a6 --- /dev/null +++ b/engine/items/snail_pie.lua @@ -0,0 +1,38 @@ +--- @class Item.SnailPie : Dummy.Item.Consumable +local SnailPieItem = Class(ItemConsumable, "Item.SnailPie") + +--- Creates a snail pie +--- @return Item.SnailPie +function SnailPieItem:new() + self = Class:new(SnailPieItem, { + "snail_pie", -- item identifier + "ITEM_SNAIL_PIE_NAME", -- item name + "ITEM_SNAIL_PIE_SHORTNAME", -- item short name + "ITEM_SNAIL_PIE_DESCRIPTION", -- item description + math.pi, + "food" + }) + + -- the price the player will pay to buy the item in the shop + self:setBuyPrice(1) + -- the price at which the item will be sold in the shop + self:setSellPrice(350) + -- the text that will appear in the shop item info at the top right on the buy menu when hovering an item + self:setShopDescription("ITEM_SNAIL_PIE_DESCRIPTION_SHOP") + + return self +end + +function SnailPieItem:getHeal() + if Player.getHP() < Player.getMaxHP() then + return (Player.getMaxHP() - Player.getHP()) - 1 + else + return 0 + end +end + +function SnailPieItem:getHealText() + return Lang.translate("ITEM_SNAIL_PIE_HEAL") +end + +return SnailPieItem diff --git a/engine/mods/world_example/scripts/world/shop/dummy_shop.lua b/engine/mods/world_example/scripts/world/shop/dummy_shop.lua index 3946cf4..a6e4cf3 100644 --- a/engine/mods/world_example/scripts/world/shop/dummy_shop.lua +++ b/engine/mods/world_example/scripts/world/shop/dummy_shop.lua @@ -42,22 +42,8 @@ end --- Prepares the shop items function DummyShop:prepareItems() local MonsterCandy = require("items.monster_candy") - local SpiderDonut = require("items.spider_donut") - local bisicle = tryRequire("scripts.items.bisicle", "items.bisicle") - local nice_cream = require("items.nice_cream") - local quiche = require("items.abandoned_quiche") - local dog_residue = require("items.dog_residue") - local instant_noodles = require("items.instant_noodles") - local hot_dog = require("items.hot_dog") - local hot_cat = require("items.hot_cat") - local sea_tea = require("items.sea_tea") - local bad_memory = require("items.bad_memory") - -- amount `-1` for infinite stock - self:addItem(bad_memory, -1) - self:addItem(sea_tea, -1) - self:addItem(instant_noodles, -1) - self:addItem(dog_residue, -1) - self:addItem(hot_dog, -1) + -- amount `-1` for infinite stocks + self:addItem(MonsterCandy, -1) local BlanketItem = require("items.blanket") local blanket_amount = 1