61 lines
2.3 KiB
Lua
61 lines
2.3 KiB
Lua
-- A mimic disguises itself as ordinary loot until a hand reaches for it.
|
|
-- Builder.build drops one as a plain floorItem tagged `mimic = true`,
|
|
-- wearing a random disguise's name and glyph (Mimics.DISGUISES) - utterly
|
|
-- indistinguishable at rest from a real item, since render.lua and
|
|
-- Game:pickupHere both just read an ordinary floorItem's own `.item.glyph`
|
|
-- and `.item.name`, with no idea a given tile might be a trap. The instant
|
|
-- the player steps onto it (Game:triggerMimic, called from pickupHere),
|
|
-- Mimics.reveal builds the real hostile monster underneath, scaled by
|
|
-- depth the same way Monsters.create scales a wild species's hp, and gets
|
|
-- one free ambush swing in (via combat.lua, so it still respects the
|
|
-- player's defense and resistances) before it settles into an ordinary
|
|
-- chase like any other monster on its own turns from then on.
|
|
|
|
local Entity = require("entity")
|
|
local Factions = require("factions")
|
|
|
|
local Mimics = {}
|
|
|
|
Mimics.FACTION = Factions.BEAST
|
|
|
|
Mimics.DISGUISES = {
|
|
{ name = "a weathered chest", glyph = "=" },
|
|
{ name = "a glinting pile of gold", glyph = "$" },
|
|
{ name = "an ornate tome", glyph = "&" },
|
|
{ name = "a discarded shield", glyph = "[" },
|
|
}
|
|
|
|
-- The inert floorItem a builder drops: it looks exactly like whichever
|
|
-- disguise it rolled until Game:pickupHere unmasks it.
|
|
function Mimics.floorItem(rng)
|
|
local disguise = Mimics.DISGUISES[rng:range(1, #Mimics.DISGUISES)]
|
|
return { kind = "mimic", mimic = true, name = disguise.name, glyph = disguise.glyph }
|
|
end
|
|
|
|
-- The hostile monster a disguised item becomes the instant it is
|
|
-- disturbed, its hp scaled by depth exactly the way Monsters.create scales
|
|
-- a wild species's own base hp.
|
|
function Mimics.reveal(id, x, y, depth)
|
|
local bonusHp = depth - 1
|
|
local entity = Entity.new({
|
|
id = id, x = x, y = y,
|
|
glyph = "M", name = "mimic", kind = "monster",
|
|
species = "mimic", ai = "chase",
|
|
hp = 12 + bonusHp, maxHp = 12 + bonusHp,
|
|
attack = 5, defense = 1, speed = 100,
|
|
})
|
|
entity.cooldown = 0
|
|
entity.faction = Mimics.FACTION
|
|
entity.mimic = true
|
|
return entity
|
|
end
|
|
|
|
-- Flat xp reward for felling a revealed mimic - kept separate from
|
|
-- Monsters.xpFor since a mimic is never a member of the wild bestiary
|
|
-- Monsters.forDepth draws its ordinary per-floor population from.
|
|
function Mimics.xpFor()
|
|
return 10
|
|
end
|
|
|
|
return Mimics
|