162 lines
5.9 KiB
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)
|