Replace manual distance check with combined targetQuery and distance query intersection for cleaner spell targeting logic Fix query combinators to correctly reference self in closures
29 lines
1.2 KiB
Lua
29 lines
1.2 KiB
Lua
--- @alias SpellTargetTest fun(caster: Character, targetPosition: Vec3) : boolean
|
|
|
|
return {
|
|
-- любой тайл
|
|
any = function() return true end,
|
|
-- тайл, где находится кастующий
|
|
caster = function(caster, targetPosition)
|
|
local targetCharacterId = Tree.level.characterGrid:get(targetPosition)
|
|
return caster.id == targetCharacterId
|
|
end,
|
|
-- тайл, где находится любой персонаж
|
|
character = function(caster, targetPosition)
|
|
local targetCharacterId = Tree.level.characterGrid:get(targetPosition)
|
|
return not not targetCharacterId
|
|
end,
|
|
-- тайл в пределах окружности в нашей кривой метрике
|
|
--- @param radius number
|
|
distance = function(radius)
|
|
return function(caster, targetPosition)
|
|
return caster:try(Tree.behaviors.positioned, function(p)
|
|
local dist = math.max(math.abs(p.position.x - targetPosition.x),
|
|
math.abs(p.position.y - targetPosition.y))
|
|
print("dist:", dist)
|
|
return dist <= radius
|
|
end)
|
|
end
|
|
end
|
|
}
|