Skip to content
Snippets Groups Projects
Commit 248a5255 authored by dg's avatar dg
Browse files

objects

git-svn-id: http://svn.net-core.org/repos/t-engine4@105 51575b47-30f0-44d4-a5cc-537603b46e54
parent 82dabaf0
No related branches found
No related tags found
No related merge requests found
Showing
with 204 additions and 35 deletions
......@@ -52,7 +52,6 @@ function _M:init(actor, order, at_end)
_UP = function() self.sel = util.boundWrap(self.sel - 1, 1, #self.list) end,
_DOWN = function() self.sel = util.boundWrap(self.sel + 1, 1, #self.list) end,
_RETURN = function() self:next() end,
_ESCAPE = function() game:unregisterDialog(self) end,
}
self:mouseZones{
{ x=2, y=25, w=350, h=self.h, fct=function(button, x, y, xrel, yrel, tx, ty)
......
......@@ -12,3 +12,8 @@ end
function _M:getName()
return self.name
end
function _M:resolve(t)
Entity.resolve(self, t)
self.egos = nil
end
......@@ -35,26 +35,46 @@ end
-- ONLY entities with a rarity properties will be considered.<br/>
-- This means that to get a never-random entity you simply do not put a rarity property on it.
function _M:computeRarities(list, level, ood, filter)
local r = {}
local r = { total=0 }
print("******************", level)
for i, e in ipairs(list) do
if e.rarity and (not filter or filter(e)) then
local lev = level
-- Out of Depth chance
if ood and rng.percent(ood.chance) then
lev = level + rng.range(ood.range[1], ood.range[2])
print("OOD Entity !", e.name, ":=:", level, "to", lev)
-- if ood and rng.percent(ood.chance) then
-- lev = level + rng.range(ood.range[1], ood.range[2])
-- print("OOD Entity !", e.name, ":=:", level, "to", lev)
-- end
local max = 100
if lev < e.level_range[1] then max = 100 / (3 * (e.level_range[1] - lev))
elseif lev > e.level_range[2] then max = 100 / (lev - e.level_range[2])
end
local genprob = max / e.rarity
print("prob", e.name, math.floor(genprob), "max", math.floor(max), e.level_range[1], e.level_range[2], lev)
-- if lev <
local genprob = 100 / e.rarity
r[#r+1] = { e=e, genprob=genprob, level_diff = lev - level }
r.total = r.total + genprob
r[#r+1] = { e=e, genprob=r.total + genprob, level_diff = lev - level }
end
end
table.sort(r, function(a, b) return a.genprob < b.genprob end)
print("*DONE", r.total)
return r
end
function _M:pickEntity(list)
if #list == 0 then return nil end
local r = rng.range(1, list.total)
for i = 1, #list do
-- print("test", r, ":=:", list[i].genprob)
if r < list[i].genprob then
-- print(" * select", list[i].e.name)
return list[i].e
end
end
return nil
end
function _M:load()
local f, err = loadfile("/data/zones/"..self.short_name.."/zone.lua")
if err then error(err) end
......@@ -137,10 +157,17 @@ function _M:newLevel(level_data, lev, game)
-- Generate actors
if level_data.generator.actor then
local generator = require(level_data.generator.actor.class).new(
self,
map,
level
)
generator:generate()
end
if level_data.generator.object then
local generator = require(level_data.generator.object.class).new(
self,
map,
level,
self.npc_list,
level_data.generator.actor
level
)
generator:generate()
end
......
......@@ -3,10 +3,12 @@ local Map = require "engine.Map"
require "engine.Generator"
module(..., package.seeall, class.inherit(engine.Generator))
function _M:init(map, level, npc_list, data)
function _M:init(zone, map, level)
engine.Generator.init(self, map)
self.zone = zone
self.level = level
self.npc_list = npc_list
local data = level.data
self.npc_list = zone:computeRarities(zone.npc_list, level.level, data.generator and data.generator.actor and data.generator.actor.ood, nil)
if data.adjust_level_to_player and game:getPlayer() then
self.adjust_level_to_player = {base=game:getPlayer().level, min=data.adjust_level_to_player[1], max=data.adjust_level_to_player[2]}
end
......@@ -16,22 +18,25 @@ end
function _M:generate()
for i = 1, rng.range(self.nb_npc[1], self.nb_npc[2]) do
local m = self.npc_list[rng.range(1, #self.npc_list)]:clone()
m:resolve()
local x, y = rng.range(0, self.map.w), rng.range(0, self.map.h)
local tries = 0
while m:canMove(x, y) and tries < 100 do
x, y = rng.range(0, self.map.w), rng.range(0, self.map.h)
tries = tries + 1
end
if tries < 100 then
m:move(x, y, true)
self.level:addEntity(m)
local m = self.zone:pickEntity(self.npc_list)
if m then
m = m:clone()
m:resolve()
local x, y = rng.range(0, self.map.w), rng.range(0, self.map.h)
local tries = 0
while not m:canMove(x, y) and tries < 100 do
x, y = rng.range(0, self.map.w), rng.range(0, self.map.h)
tries = tries + 1
end
if tries < 100 then
m:move(x, y, true)
self.level:addEntity(m)
-- Levelup ?
if self.adjust_level_to_player then
local newlevel = self.adjust_level_to_player.base + rng.avg(self.adjust_level_to_player.min, self.adjust_level_to_player.max)
m:forceLevelup(newlevel)
-- Levelup ?
if self.adjust_level_to_player then
local newlevel = self.adjust_level_to_player.base + rng.avg(self.adjust_level_to_player.min, self.adjust_level_to_player.max)
m:forceLevelup(newlevel)
end
end
end
end
......
require "engine.class"
local Map = require "engine.Map"
require "engine.Generator"
module(..., package.seeall, class.inherit(engine.Generator))
function _M:init(zone, map, level)
engine.Generator.init(self, map)
self.zone = zone
self.level = level
local data = level.data
self.object_list = zone:computeRarities(zone.object_list, level.level, data.generator and data.generator.actor and data.generator.actor.ood, nil)
if data.adjust_level_to_player and game:getPlayer() then
self.adjust_level_to_player = {base=game:getPlayer().level, min=data.adjust_level_to_player[1], max=data.adjust_level_to_player[2]}
end
self.nb_object = data.nb_object or {10, 20}
self.level_range = data.level_range or {level, level}
end
function _M:generate()
for i = 1, rng.range(self.nb_object[1], self.nb_object[2]) do
local o = self.zone:pickEntity(self.object_list)
if o then
o = o:clone()
o:resolve()
local x, y = rng.range(0, self.map.w), rng.range(0, self.map.h)
local tries = 0
while self.map(x, y, Map.OBJECT) and tries < 100 do
x, y = rng.range(0, self.map.w), rng.range(0, self.map.h)
tries = tries + 1
end
if tries < 100 then
self.map(x, y, Map.OBJECT, o)
end
end
end
end
require "engine.class"
--- Handles actors stats
module(..., package.seeall, class.make)
_M.inven_def = {}
--- Defines stats
-- Static!
function _M:defineInventory(short_name, name, is_worn, desc)
assert(name, "no inventory slot name")
assert(short_name, "no inventory slot short_name")
assert(desc, "no inventory slot desc")
table.insert(self.inven_def, {
name = name,
short_name = short_name,
description = desc,
is_worn = is_worn,
})
self.inven_def[#self.inven_def].id = #self.inven_def
self.inven_def[short_name] = self.inven_def[#self.inven_def]
self["INVEN_"..short_name:upper()] = #self.inven_def
end
--- Initialises inventories with default values if needed
function _M:init(t)
self.inven = t.inven or {}
if t.body then
for inven, max in pairs(t.body) do
self.inven[self["INVEN_"..inven]] = {}
end
end
end
function _M:pickup()
end
require "engine.class"
require "engine.Actor"
require "engine.Autolevel"
require "engine.interface.ActorInventory"
require "engine.interface.ActorTemporaryEffects"
require "engine.interface.ActorLife"
require "engine.interface.ActorLevel"
......@@ -13,6 +14,7 @@ require "mod.class.interface.Combat"
module(..., package.seeall, class.inherit(
-- a ToME actor is a complex beast it uses may inetrfaces
engine.Actor,
engine.interface.ActorInventory,
engine.interface.ActorTemporaryEffects,
engine.interface.ActorLife,
engine.interface.ActorLevel,
......@@ -25,6 +27,7 @@ module(..., package.seeall, class.inherit(
function _M:init(t)
engine.Actor.init(self, t)
engine.interface.ActorInventory.init(self, t)
engine.interface.ActorTemporaryEffects.init(self, t)
engine.interface.ActorLife.init(self, t)
engine.interface.ActorLevel.init(self, t)
......
......@@ -88,7 +88,7 @@ function _M:newGame()
end
function _M:loaded()
Zone:setup{npc_class="mod.class.NPC", grid_class="mod.class.Grid", object_class="engine.Entity"}
Zone:setup{npc_class="mod.class.NPC", grid_class="mod.class.Grid", object_class="mod.class.Object"}
Map:setViewPort(self.w * 0.2, 0, self.w * 0.8, math.floor(self.h * 0.80), 16, 16)
engine.GameTurnBased.loaded(self)
self.key = engine.KeyCommand.new()
......
require "engine.class"
require "engine.Object"
module(..., package.seeall, class.inherit(engine.Object))
function _M:init(t)
engine.Object.init(self, t)
end
function _M:tooltip()
return self:getName()
end
require "engine.class"
require "mod.class.Actor"
local Map = require "engine.Map"
local Dialog = require "engine.Dialog"
local ActorTalents = require "engine.interface.ActorTalents"
module(..., package.seeall, class.inherit(mod.class.Actor))
function _M:init(t)
t.body = {
INVEN = 1000,
MAIN_HAND = 1,
OFF_HAND = 1,
FINGER = 2,
NECK = 1,
LITE = 1,
BODY = 1,
HEAD = 1,
HANDS = 1,
FEET = 1,
TOOL = 1,
}
mod.class.Actor.init(self, t)
self.player = true
self.faction = "players"
......@@ -21,6 +35,11 @@ function _M:move(x, y, force)
local moved = mod.class.Actor.move(self, x, y, force)
if moved then
game.level.map:moveViewSurround(self.x, self.y, 4, 4)
local obj = game.level.map(self.x, self.y, Map.OBJECT)
if obj then
game.logSeen(self, "There is an item here: "..obj:getName())
end
end
return moved
end
......
--[[
newBirthDescriptor{
type = "class",
name = "Warrior",
......@@ -29,7 +30,7 @@ newBirthDescriptor{
["physical/1hweapon"]=true,
},
}
]]
newBirthDescriptor{
type = "class",
name = "Mage",
......
--[[
newBirthDescriptor{
type = "race",
name = "Human",
......@@ -19,7 +20,7 @@ newBirthDescriptor{
talents = {},
experience = 1.0,
}
]]
newBirthDescriptor{
type = "race",
name = "Elf",
......@@ -42,7 +43,7 @@ newBirthDescriptor{
},
experience = 1.05,
}
--[[
newBirthDescriptor{
type = "race",
name = "Dwarf",
......@@ -107,3 +108,4 @@ newBirthDescriptor{
ActorTalents.T_IMPROVED_HEALTH_II,
},
}
]]
\ No newline at end of file
......@@ -76,6 +76,7 @@ newBirthDescriptor
experience = 1.3,
talents = {},
}
--[[
newBirthDescriptor
{
type = "subrace",
......@@ -93,7 +94,7 @@ newBirthDescriptor
talents = { ActorTalents.DECREASED_HEALTH_I },
experience = 1.1,
}
]]
---------------------------------------------------------
-- Hobbits --
---------------------------------------------------------
......
......@@ -21,6 +21,7 @@ newEntity{
name = "& tower shield~",
display = "[", color_r=255,
level_range = {1, 10},
rarity = 2,
encumber = 6,
wielder = {
combat_def=6,
......@@ -32,6 +33,7 @@ newEntity{
type = "weapon",
display = "/", color_b=255,
level_range = {1, 10},
rarity = 2,
encumber = 4,
wielder = {
combat_dam=3,
......@@ -44,6 +46,7 @@ newEntity{
type = "weapon",
display = "/", color_r=255, color_b=255,
level_range = {10,10},
rarity = 15,
encumber = 3,
unique = "STAFF_OLORIN",
wielder = {
......
......@@ -34,7 +34,7 @@ newEntity{
newEntity{
group = "icky things",
name = "white icky thing",
name = "white icky",
display = "i", color_r=255, color_g=255, color_b=255,
level_range = {3, 7}, exp_worth = 100,
rarity = 1,
......
......@@ -21,5 +21,10 @@ return {
ood = {chance=5, range={1, 10}},
adjust_level_to_player = {-1, 2},
},
object = {
class = "engine.generator.object.Random",
nb_object = {10, 10},
ood = {chance=5, range={1, 10}},
},
}
}
......@@ -5,6 +5,7 @@ local ActorResource = require "engine.interface.ActorResource"
local ActorTalents = require "engine.interface.ActorTalents"
local ActorTemporaryEffects = require "engine.interface.ActorTemporaryEffects"
local ActorAI = require "engine.interface.ActorAI"
local ActorInventory = require "engine.interface.ActorInventory"
local Birther = require "engine.Birther"
-- Damage types
......@@ -30,6 +31,20 @@ dofile("/data/autolevel_schemes.lua")
-- Actor AIs
ActorAI:loadDefinition("/engine/ai/")
-- Body parts
ActorInventory:defineInventory("INVEN", "In inventory", false, "")
ActorInventory:defineInventory("MAIN_HAND", "In main hand", true, "")
ActorInventory:defineInventory("OFF_HAND", "In off hand", true, "")
ActorInventory:defineInventory("FINGER", "On fingers", true, "")
ActorInventory:defineInventory("NECK", "Around neck", true, "")
ActorInventory:defineInventory("LITE", "Light source", true, "")
ActorInventory:defineInventory("BODY", "Main armor", true, "")
ActorInventory:defineInventory("CLOAK", "Cloak", true, "")
ActorInventory:defineInventory("HEAD", "On head", true, "")
ActorInventory:defineInventory("HANDS", "On hands", true, "")
ActorInventory:defineInventory("FEET", "On feet", true, "")
ActorInventory:defineInventory("TOOL", "Tool", true, "")
-- Birther descriptor
Birther:loadDefinition("/data/birth/descriptors.lua")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment