initial upgrade tabled for mr meat (wip)
This commit is contained in:
parent
5077f3390f
commit
868e7ef8f7
4 changed files with 224 additions and 3 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Loading…
Add table
Add a link
Reference in a new issue