luncher/src/systems/rounds.lua

162 lines
5.9 KiB
Lua

collectedEntities = filteredSystem("collectedEntities", { collected = T.pd_image })
local onCollidingRemove = { "mass", "velocity", "canCollideWith" }
local Drop = { i = T.number, delay = T.number, startAt = T.XyPair }
disableCollisionWhenRoundEnds = filteredSystem("disableCollisionWhenRoundEnds", { disableCollisionWhenRoundEnds = T.marker })
collectableDropSystem = filteredSystem("collectableDrop", { drop = Drop }, function(e, dt, system)
e.drop.delay = e.drop.delay - dt
if e.drop.delay > 0 then
return
end
local collX, collY = e.drop.sprite:getSize()
system.world:addEntity({
drawAsSprite = e.drop.sprite,
size = { x = collX, y = collY / 2 },
mass = 0.5,
velocity = { x = 0, y = 0 },
position = { x = e.drop.startAt.x - (collX / 2), y = e.drop.startAt.y },
canCollideWith = 2,
canBeCollidedBy = 2,
isSolid = true,
stopMovingOnCollision = true,
onCollidingRemove = onCollidingRemove,
focusOnCollide = e.drop.i,
expireBelowScreenBy = 5,
removeAtRoundStart = true,
})
system.world:removeEntity(e)
end)
removeAtRoundStart = filteredSystem("removeAtRoundStart", { removeAtRoundStart = T.bool })
filteredSystem("afterDelayAdd", { afterDelayAdd = { entityToAdd = T.Entity, delay = T.number } }, function(e, dt, system)
e.afterDelayAdd.delay = e.afterDelayAdd.delay - dt
if e.afterDelayAdd.delay > 0 then
return
end
system.world:addEntity(e.afterDelayAdd.entityToAdd)
system.world:removeEntity(e)
end)
roundSystem = filteredSystem("round", { roundAction = T.RoundStateAction, position = Maybe(T.XyPair) }, function(e, _, system)
system.world:removeEntity(e)
if e.roundAction == "start" then
for _, cart in pairs(cartSystem.entities) do
Cart.reset(cart)
system.world:addEntity(cart)
end
for _, remove in pairs(removeAtRoundStart.entities) do
system.world:removeEntity(remove)
end
system.world:addSystem(spawnerSystem)
Ingredients.clearCache(system.world)
elseif e.roundAction == "end" then
system.world:removeSystem(spawnerSystem)
for _, toExpire in pairs(disableCollisionWhenRoundEnds.entities) do
toExpire.canCollideWith = nil
toExpire.canBeCollidedBy = nil
--system.world:addEntity(toExpire)
system.world:removeEntity(toExpire)
end
-- playdate.setAutoLockDisabled(false)
local y = e.position.y - 240
local rectWidth = 150
local plateSize = { x = rectWidth, y = 10 }
system.world:addEntity({
drawAsRectangle = { size = plateSize },
size = plateSize,
mass = 0.5,
velocity = { x = 0, y = 0 },
position = { x = e.position.x - (rectWidth / 2), y = y },
canCollideWith = 2,
canBeCollidedBy = 2,
isSolid = true,
stopMovingOnCollision = true,
removeAtRoundStart = true,
})
-- TODO: Big ol' numbers displaying how many ingredients were collected?
-- TODO: Could layer ingredients in rows of three? Maybe just when it's higher?
local delayPerDrop = 0.100
local delay = 0
for i, collectable in ipairs(collectedEntities.entities) do
local _, collY = collectable.collected:getSize()
y = y - collY - 15
system.world:addEntity({
drop = {
sprite = collectable.collected,
i = i,
delay = delay,
startAt = {
x = e.position.x,
y = y
}
},
})
delay = delay + delayPerDrop
system.world:removeEntity(collectable)
end
---@type NamedUpgrade[]
local availableUpgrades = Utils.getNDifferentValues(getAvailableUpgrades(), 3)
-- Sorting from shortest to longest sort of makes them look like a bun?
table.sort(availableUpgrades, function(a, b)
return #a.name > #b.name
end)
y = y - 50
local menuEntity = {
menuItems = {},
canReceiveInput = T.marker,
}
local upgradeBelow
local i = #collectedEntities.entities
for _, upgrade in ipairs(availableUpgrades) do
i = i + 1
local collX, collY = 75, 21
y = y - collY - 15 - 15
---@type Selectable
local upgradeEntity = {
replacements = { upgrade.replace },
drawAsText = {
text = upgrade.name,
style = TextStyle.Inverted,
},
size = { x = collX, y = collY },
mass = 0.5,
velocity = { x = 0, y = 0 },
position = { x = e.position.x, y = y },
canCollideWith = 2,
canBeCollidedBy = 2,
isSolid = true,
stopMovingOnCollision = true,
onCollidingRemove = onCollidingRemove,
focusOnCollide = i,
navigateDown = upgradeBelow,
highlighted = true,
removeAtRoundStart = true,
}
if upgradeBelow then
upgradeBelow.navigateUp = upgradeEntity
upgradeBelow.highlighted = false
upgradeBelow.drawAsText.style = TextStyle.Bordered
end
upgradeBelow = upgradeEntity
menuEntity.menuItems[#menuEntity.menuItems + 1] = upgradeEntity
delay = delay + delayPerDrop
system.world:addEntity({
afterDelayAdd = {
delay = delay,
entityToAdd = upgradeEntity
},
})
system.world:addEntity(menuEntity)
end
end
end)