initial upgrade tabled for mr meat (wip)

This commit is contained in:
Juan 2025-09-11 23:41:26 -04:00
parent 5077f3390f
commit 868e7ef8f7
4 changed files with 224 additions and 3 deletions

View file

@ -9,6 +9,9 @@ function Cleaver:new()
instance.score = 0
instance.images = {}
instance.frame = 1
-- Upgrade properties
instance.pointsPerChop = 1
instance.windupSpeedBonus = 0
Cleaver.loadImages(instance)
return instance
end
@ -34,9 +37,11 @@ function Cleaver:loadImages()
end
function Cleaver:update(dt)
local windupSpeed = math.max(0.05, 0.1 - self.windupSpeedBonus)
if self.state == "windup" then
self.timer = self.timer + dt
if self.timer >= 0.1 then
if self.timer >= windupSpeed then
self.frame = self.frame + 1
if self.frame > #self.images.windup then
self.state = "charged"
@ -100,7 +105,7 @@ function Cleaver:mousereleased(button)
-- Remove the meat instance from the table
meat.meatFactory.hasMeat = false
table.remove(instances.meats, i)
self.score = self.score + 1
self.score = self.score + self.pointsPerChop
break
end
end
@ -117,4 +122,4 @@ function Cleaver:getScore()
return self.score
end
return Cleaver
return Cleaver

View file

@ -0,0 +1,183 @@
-- upgrade_table.lua
UpgradeTable = {}
UpgradeTable.__index = UpgradeTable
function UpgradeTable:new()
local instance = setmetatable({}, UpgradeTable)
instance.isVisible = false
instance.image = love.graphics.newImage("assets/images/ui/butcher_upgrades.png")
instance.x = (love.graphics.getWidth() - instance.image:getWidth()) / 2
instance.y = (love.graphics.getHeight() - instance.image:getHeight()) / 2
-- Define upgrades
instance.upgrades = {
{
name = "Sharp Blade",
description = "Increases points per chop by 1",
cost = 10,
level = 0,
maxLevel = 10,
effect = "pointsPerChop",
value = 1,
x = instance.x + 50,
y = instance.y + 80,
width = 120,
height = 40
},
{
name = "Quick Hands",
description = "Reduces windup time",
cost = 25,
level = 0,
maxLevel = 5,
effect = "windupSpeed",
value = 0.02,
x = instance.x + 50,
y = instance.y + 130,
width = 120,
height = 40
},
{
name = "Meat Magnet",
description = "Increases meat spawn rate",
cost = 50,
level = 0,
maxLevel = 8,
effect = "spawnRate",
value = 0.5,
x = instance.x + 50,
y = instance.y + 180,
width = 120,
height = 40
}
}
return instance
end
function UpgradeTable:update(dt)
-- Update position in case window is resized
self.x = (love.graphics.getWidth() - self.image:getWidth()) / 2
self.y = (love.graphics.getHeight() - self.image:getHeight()) / 2
-- Update upgrade button positions
for _, upgrade in ipairs(self.upgrades) do
upgrade.x = self.x + 50
upgrade.y = self.y + 80 + (_ - 1) * 50
end
end
function UpgradeTable:draw()
if not self.isVisible then return end
-- Draw upgrade table background
love.graphics.draw(self.image, self.x, self.y)
-- Draw upgrades
local font = love.graphics.getFont()
for _, upgrade in ipairs(self.upgrades) do
-- Draw upgrade button background
if upgrade.level < upgrade.maxLevel then
love.graphics.setColor(0.2, 0.2, 0.2, 0.8)
else
love.graphics.setColor(0.1, 0.5, 0.1, 0.8)
end
love.graphics.rectangle("fill", upgrade.x, upgrade.y, upgrade.width, upgrade.height)
-- Draw upgrade button border
love.graphics.setColor(1, 1, 1)
love.graphics.rectangle("line", upgrade.x, upgrade.y, upgrade.width, upgrade.height)
-- Draw upgrade text
love.graphics.setColor(1, 1, 1)
local nameText = upgrade.name .. " (" .. upgrade.level .. "/" .. upgrade.maxLevel .. ")"
love.graphics.print(nameText, upgrade.x + 5, upgrade.y + 5, 0, 0.4, 0.4)
local costText = "Cost: $" .. self:getUpgradeCost(upgrade)
if upgrade.level >= upgrade.maxLevel then
costText = "MAX LEVEL"
end
love.graphics.print(costText, upgrade.x + 5, upgrade.y + 20, 0, 0.3, 0.3)
end
-- Draw close button
love.graphics.setColor(0.8, 0.2, 0.2)
love.graphics.rectangle("fill", self.x + self.image:getWidth() - 30, self.y + 10, 20, 20)
love.graphics.setColor(1, 1, 1)
love.graphics.rectangle("line", self.x + self.image:getWidth() - 30, self.y + 10, 20, 20)
love.graphics.print("X", self.x + self.image:getWidth() - 25, self.y + 12, 0, 0.5, 0.5)
love.graphics.setColor(1, 1, 1) -- Reset color
end
function UpgradeTable:getUpgradeCost(upgrade)
return math.floor(upgrade.cost * math.pow(1.5, upgrade.level))
end
function UpgradeTable:canAffordUpgrade(upgrade, playerMoney)
return playerMoney >= self:getUpgradeCost(upgrade) and upgrade.level < upgrade.maxLevel
end
function UpgradeTable:purchaseUpgrade(upgrade, cleaver)
local cost = self:getUpgradeCost(upgrade)
if cleaver:getScore() >= cost and upgrade.level < upgrade.maxLevel then
cleaver.score = cleaver.score - cost
upgrade.level = upgrade.level + 1
-- Apply upgrade effect
if upgrade.effect == "pointsPerChop" then
cleaver.pointsPerChop = (cleaver.pointsPerChop or 1) + upgrade.value
elseif upgrade.effect == "windupSpeed" then
cleaver.windupSpeedBonus = (cleaver.windupSpeedBonus or 0) + upgrade.value
elseif upgrade.effect == "spawnRate" then
-- Apply to all meat factories
for _, factory in ipairs(instances.meat_factories) do
factory.spawnRate = math.max(0.5, factory.spawnRate - upgrade.value)
end
end
return true
end
return false
end
function UpgradeTable:toggle()
self.isVisible = not self.isVisible
end
function UpgradeTable:isOpen()
return self.isVisible
end
function UpgradeTable:mousepressed(x, y, button)
if not self.isVisible or button ~= 1 then return false end
-- Check close button
local closeX = self.x + self.image:getWidth() - 30
local closeY = self.y + 10
if x >= closeX and x <= closeX + 20 and y >= closeY and y <= closeY + 20 then
self:toggle()
return true
end
-- Check upgrade buttons
for _, upgrade in ipairs(self.upgrades) do
if x >= upgrade.x and x <= upgrade.x + upgrade.width and
y >= upgrade.y and y <= upgrade.y + upgrade.height then
if self:canAffordUpgrade(upgrade, cursor.cleaver:getScore()) then
self:purchaseUpgrade(upgrade, cursor.cleaver)
end
return true
end
end
-- If clicked inside the upgrade table but not on any button, consume the click
if x >= self.x and x <= self.x + self.image:getWidth() and
y >= self.y and y <= self.y + self.image:getHeight() then
return true
end
return false
end
return UpgradeTable