feat(entity): add player and monster actors
This commit is contained in:
1 parent
0eb49b4705
commit
f501fb1e40
1 file changed
+82
@@ -0,0 +1,82 @@
|
|||||||
|
-- Player and monster actors. attack/defense are the effective values already
|
||||||
|
-- including equipment; baseAttack/baseDefense keep the unequipped totals. Energy
|
||||||
|
-- and speed drive the turn scheduler; statuses layer temporary modifiers on top.
|
||||||
|
|
||||||
|
local Status = require("status")
|
||||||
|
|
||||||
|
local Entity = {}
|
||||||
|
Entity.__index = Entity
|
||||||
|
|
||||||
|
function Entity.new(spec)
|
||||||
|
return setmetatable({
|
||||||
|
id = spec.id,
|
||||||
|
x = spec.x, y = spec.y,
|
||||||
|
glyph = spec.glyph,
|
||||||
|
name = spec.name,
|
||||||
|
kind = spec.kind,
|
||||||
|
species = spec.species,
|
||||||
|
ai = spec.ai,
|
||||||
|
hp = spec.hp,
|
||||||
|
maxHp = spec.maxHp or spec.hp,
|
||||||
|
attack = spec.attack,
|
||||||
|
defense = spec.defense,
|
||||||
|
baseAttack = spec.attack,
|
||||||
|
baseDefense = spec.defense,
|
||||||
|
speed = spec.speed or 100,
|
||||||
|
energy = spec.energy or 0,
|
||||||
|
range = spec.range or 0,
|
||||||
|
inventory = {},
|
||||||
|
statuses = {},
|
||||||
|
weapon = nil,
|
||||||
|
armor = nil,
|
||||||
|
ring = nil,
|
||||||
|
}, Entity)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Entity:isAlive()
|
||||||
|
return self.hp > 0
|
||||||
|
end
|
||||||
|
|
||||||
|
function Entity:effectiveAttack()
|
||||||
|
return self.attack + Status.attackModifier(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Entity:effectiveDefense()
|
||||||
|
return self.defense
|
||||||
|
end
|
||||||
|
|
||||||
|
function Entity:effectiveSpeed()
|
||||||
|
local speed = self.speed + Status.speedModifier(self)
|
||||||
|
if speed < 10 then speed = 10 end
|
||||||
|
return speed
|
||||||
|
end
|
||||||
|
|
||||||
|
function Entity:toData()
|
||||||
|
return {
|
||||||
|
id = self.id,
|
||||||
|
x = self.x, y = self.y,
|
||||||
|
glyph = self.glyph, name = self.name, kind = self.kind,
|
||||||
|
species = self.species, ai = self.ai,
|
||||||
|
hp = self.hp, maxHp = self.maxHp,
|
||||||
|
attack = self.attack, defense = self.defense,
|
||||||
|
baseAttack = self.baseAttack, baseDefense = self.baseDefense,
|
||||||
|
speed = self.speed, energy = self.energy, range = self.range,
|
||||||
|
inventory = self.inventory,
|
||||||
|
statuses = self.statuses,
|
||||||
|
weapon = self.weapon,
|
||||||
|
armor = self.armor,
|
||||||
|
ring = self.ring,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
function Entity.fromData(snapshot)
|
||||||
|
local entity = setmetatable({}, Entity)
|
||||||
|
for field, value in pairs(snapshot) do
|
||||||
|
entity[field] = value
|
||||||
|
end
|
||||||
|
entity.inventory = snapshot.inventory or {}
|
||||||
|
entity.statuses = snapshot.statuses or {}
|
||||||
|
return entity
|
||||||
|
end
|
||||||
|
|
||||||
|
return Entity
|
||||||
Reference in new issue
Block a user