summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--textTrigger.lua55
-rw-r--r--textbox.lua2
-rw-r--r--tilemap.lua9
-rw-r--r--world.lua20
4 files changed, 83 insertions, 3 deletions
diff --git a/textTrigger.lua b/textTrigger.lua
new file mode 100644
index 0000000..5202a8c
--- /dev/null
+++ b/textTrigger.lua
@@ -0,0 +1,55 @@
+local Entity = require("entity")
+
+local TextTrigger = {}
+TextTrigger.__index = TextTrigger
+
+function TextTrigger.new(entity)
+ local self = setmetatable({}, TextTrigger)
+
+ self.x = entity.x
+ self.y = entity.y
+ self.width = entity.width
+ self.height = entity.height
+
+ self.text = entity:get("text", "")
+ self.timesToShow = tonumber(entity:get("times_to_show", 1)) or 1
+
+ self.body = nil
+ self.fixture = nil
+ self.isTextTrigger = true
+
+ return self
+end
+
+function TextTrigger:setWorldPhysics(world)
+ local cx = self.x + self.width / 2
+ local cy = self.y + self.height / 2
+
+ self.body = love.physics.newBody(world, cx, cy, "static")
+ local shape = love.physics.newRectangleShape(self.width, self.height)
+
+ self.fixture = love.physics.newFixture(self.body, shape)
+ self.fixture:setSensor(true)
+ self.fixture:setUserData(self)
+end
+
+function TextTrigger:syncFromPhysicsBody() end
+
+function TextTrigger:trigger(world, player)
+ if self.timesToShow < 1 then return end
+
+ world.playerTextbox:show(
+ self.text,
+ { player.x + player.width/2, player.y - 20, "center" },
+ "write",
+ { life = 3, fontSize = 9, centeredText = true, wrapToFit = true }
+ )
+
+ self.timesToShow = self.timesToShow - 1
+end
+
+function TextTrigger:update(dt) end
+
+function TextTrigger:draw() end
+
+return TextTrigger \ No newline at end of file
diff --git a/textbox.lua b/textbox.lua
index 35b66a4..934b7f5 100644
--- a/textbox.lua
+++ b/textbox.lua
@@ -131,8 +131,6 @@ function Textbox:draw()
end
local prevFont = love.graphics.getFont()
love.graphics.setFont(self.font)
- love.graphics.setColor(0, 0, 0, 0.8)
- love.graphics.rectangle("fill", x, y, self.width, self.height)
love.graphics.setColor(1, 1, 1, 1)
love.graphics.printf(self.visibleText, textX, textY, self.width - padding * 2, textAlign)
love.graphics.setFont(prevFont)
diff --git a/tilemap.lua b/tilemap.lua
index 44d0db5..f706e55 100644
--- a/tilemap.lua
+++ b/tilemap.lua
@@ -2,6 +2,7 @@ local Entity = require("entity")
local Liquid = require("liquid")
local LiquidSurface = require("liquidSurface")
local Spike = require("spike")
+local TextTrigger = require("textTrigger")
local Tilemap = {}
Tilemap.__index = Tilemap
@@ -54,6 +55,7 @@ function Tilemap:new(mapPath, tilesets)
self.entitiesLiquidPolygons = {}
self.entitiesLiquidSurfaces = {}
self.entitiesSpikes = {}
+ self.entitiesTextTriggers = {}
self.layerBackground = nil
self.layerDecorationBackground = nil
self.layerDecorationForeground = nil
@@ -132,7 +134,8 @@ function Tilemap:new(mapPath, tilesets)
table.insert(self.entitiesSpawns, entity)
elseif name == "spikes" then
table.insert(self.entitiesSpikes, Spike.new(entity))
-
+ elseif name == "text_trigger" then
+ table.insert(self.entitiesTextTriggers, TextTrigger.new(entity))
elseif name == "camera_border" then
table.insert(self.entitiesCameraBorders, entity)
elseif name == "liquid" then
@@ -168,6 +171,10 @@ function Tilemap:getEntitiesSpikes()
return self.entitiesSpikes
end
+function Tilemap:getEntitiesTextTriggers()
+ return self.entitiesTextTriggers
+end
+
function Tilemap:getEntitiesCameraBorders()
return self.entitiesCameraBorders
end
diff --git a/world.lua b/world.lua
index 861a7da..c7cde9f 100644
--- a/world.lua
+++ b/world.lua
@@ -24,6 +24,7 @@ function World:new()
self.liquidSurfaces = {}
self.liquidSurfaceFixtures = {}
self.spikes = {}
+ self.textTriggers = {}
self.refractionCanvas = nil
self.liquidShader = nil
self.activeSplashes = {}
@@ -153,6 +154,12 @@ function World:load(mapPath, tilesets)
table.insert(self.entities, spike)
end
+ for _, textTrigger in ipairs(self.tilemap:getEntitiesTextTriggers()) do
+ textTrigger:setWorldPhysics(self.physicsWorld)
+ table.insert(self.textTriggers, textTrigger)
+ table.insert(self.entities, textTrigger)
+ end
+
local ok, shader = pcall(love.graphics.newShader, "shaders/liquid.glsl")
self.liquidShader = ok and shader or nil
if not self.liquidShader then
@@ -198,7 +205,19 @@ function World:_isHazard(ud)
return type(ud) == "table" and (ud.isSpike or ud.isEnemy)
end
+function World:handleTextTrigger(trigger, player)
+ if trigger and player and trigger.isTextTrigger and self:_isPlayerLike(player) then
+ trigger:trigger(self, player)
+ end
+end
+
function World:_onBeginContact(udA, udB, nx, ny, contact)
+ if type(udA) == "table" and udA.isTextTrigger then
+ self:handleTextTrigger(udA, udB)
+ elseif type(udB) == "table" and udB.isTextTrigger then
+ self:handleTextTrigger(udB, udA)
+ end
+
if udA == "ground" and self:_isTrackedEntity(udB) then
local kind = self:_normalToContactType(nx, ny)
if kind then
@@ -217,6 +236,7 @@ function World:_onBeginContact(udA, udB, nx, ny, contact)
end
self.groundContacts[udA] = (self.groundContacts[udA] or 0) + 1
if self:_isPlayerLike(udA) then udA.grounded = true end
+
end
local function doWaterSplash(waterData, entity)