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

fixed generation probabilities

git-svn-id: http://svn.net-core.org/repos/t-engine4@143 51575b47-30f0-44d4-a5cc-537603b46e54
parent a31d0032
No related branches found
No related tags found
No related merge requests found
Showing
with 160 additions and 56 deletions
......@@ -26,7 +26,7 @@ end
function _M:call(str, ...)
local lines = str:format(...):splitLines(self.w - 4, self.font)
for i = 1, #lines do
-- print("[LOG]", lines[i])
print("[LOG]", lines[i])
table.insert(self.log, 1, lines[i])
end
while #self.log > self.max do
......
......@@ -24,11 +24,22 @@ end
function _M:init(short_name)
self.short_name = short_name
self:load()
self.level_range = self.level_range or {1,1}
if type(self.level_range) == "number" then self.level_range = {self.level_range, self.level_range} end
self.level_scheme = self.level_scheme or "fixed"
assert(self.max_level, "no zone max level")
self.levels = self.levels or {}
self.npc_list = self.npc_class:loadList("/data/zones/"..self.short_name.."/npcs.lua")
self.grid_list = self.grid_class:loadList("/data/zones/"..self.short_name.."/grids.lua")
self.object_list = self.object_class:loadList("/data/zones/"..self.short_name.."/objects.lua")
-- Determine a zone base level
self.base_level = self.level_range[1]
if self.level_scheme == "player" then
local plev = game:getPlayer().level
self.base_level = util.bound(plev, self.level_range[1], self.level_range[2])
end
print("Initiated zone", self.name, "with base_level", self.base_level)
end
--- Parses the npc/objects list and compute rarities for random generation
......@@ -40,19 +51,19 @@ function _M:computeRarities(type, list, level, ood, filter)
for i, e in ipairs(list) do
if e.rarity and e.level_range and (not filter or filter(e)) then
-- print("computing rarity of", e.name)
local lev = level.level
local lev = self.base_level + (level.level - 1)
-- Out of Depth chance
-- if ood and rng.percent(ood.chance) then
-- lev = level.level + rng.range(ood.range[1], ood.range[2])
-- lev = self.base_level + level.level - 1 + rng.range(ood.range[1], ood.range[2])
-- print("OOD Entity !", e.name, ":=:", level.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])
local max = 1000
if lev < e.level_range[1] then max = 1000 / (3 * (e.level_range[1] - lev))
elseif lev > e.level_range[2] then max = 1000 / (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, "egoable", e.egos)
local genprob = math.ceil(max / e.rarity)
print(("Entity(%30s) got %3d (=%3d / %3d) chance to generate. Level range(%2d-%2d), current %2d"):format(e.name, math.floor(genprob), math.floor(max), e.rarity, e.level_range[1], e.level_range[2], lev))
-- Generate and store egos list if needed
if e.egos and not level:getEntitiesList(type.."/"..e.egos) then
......@@ -63,15 +74,17 @@ function _M:computeRarities(type, list, level, ood, filter)
end
end
r.total = r.total + genprob
r[#r+1] = { e=e, genprob=r.total + genprob, level_diff = lev - level.level }
if genprob > 0 then
r.total = r.total + genprob
r[#r+1] = { e=e, genprob=r.total, level_diff = lev - level.level }
end
end
end
table.sort(r, function(a, b) return a.genprob < b.genprob end)
print("*DONE", r.total)
for i, ee in ipairs(r) do
print(("entity chance %02d : chance(%04d): %s"):format(i, ee.genprob, ee.e.name))
print(("entity chance %2d : chance(%4d): %s"):format(i, ee.genprob, ee.e.name))
end
return r
......@@ -103,13 +116,15 @@ function _M:getEgosList(level, type, group, class)
end
function _M:makeEntity(level, type)
resolvers.current_level = self.base_level + level.level - 1
local list = level:getEntitiesList(type)
local e = self:pickEntity(list)
e = e:clone()
e:resolve()
-- Add "ego" properties
if e.egos then
-- Add "ego" properties, sometimes
if e.egos and e.egos_chance and rng.percent(e.egos_chance) then
local egos = self:getEgosList(level, type, e.egos, e.__CLASSNAME)
local ego = self:pickEntity(egos)
if ego then
......
......@@ -9,11 +9,12 @@ newAI("dumb_talented", function(self)
local t = self:getTalentFromId(tid)
if not self:isTalentCoolingDown(t) and target_dist <= self:getTalentRange(t) and self:preUseTalent(t, true) then
avail[#avail+1] = tid
print(self.name, self.uid, "dumb ai talents can use", t.name)
print(self.name, self.uid, "dumb ai talents can use", t.name, tid)
end
end
if #avail > 0 then
local tid = avail[rng.range(1, #avail)]
print("dumb ai uses", tid)
self:useTalent(tid)
end
end)
......
......@@ -11,11 +11,10 @@ function _M:init(zone, map, level)
-- Setup the entities list
level:setEntitiesList("actor", zone:computeRarities("actor", zone.npc_list, level, data.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]}
if data.adjust_level and game:getPlayer() then
self.adjust_level = {base=zone.base_level, min=data.adjust_level[1], max=data.adjust_level[2]}
end
self.nb_npc = data.nb_npc or {10, 20}
self.level_range = data.level_range or {level, level}
end
function _M:generate()
......@@ -33,8 +32,8 @@ function _M:generate()
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)
if self.adjust_level then
local newlevel = self.adjust_level.base + rng.avg(self.adjust_level.min, self.adjust_level.max)
m:forceLevelup(newlevel)
end
end
......
......@@ -17,6 +17,11 @@ function resolvers.calc.rngavg(t)
return rng.avg(t[1], t[2])
end
-- Load resolvers of the module, if any
local mod_resolver = loadfile("mod.resolvers")
if mod_resolver then mod_resolver() end
--- Random bonus based on level
resolvers.current_level = 1
function resolvers.mbonus(max, add)
return {__resolver="mbonus", max, add}
end
function resolvers.calc.mbonus(t)
return rng.mbonus(t[1], resolvers.current_level, 50) + (t[2] or 0)
end
......@@ -52,10 +52,9 @@ function _M:init(t, no_default)
t.stamina_rating = t.stamina_rating or 10
-- Default regen
self.mana_regen = 0.5
self.stamina_regen = 0.5
self.life_regen = 0.1
self.life_rating = 10
t.mana_regen = t.mana_regen or 0.5
t.stamina_regen = t.stamina_renge or 0.5
t.life_regen = t.life_regen or 0.1
-- Default melee barehanded damage
self.combat = { dam=1, atk=1, apr=0, dammod={str=1} }
......
......@@ -39,6 +39,9 @@ function _M:display()
self.surface:drawColorString(self.font, ("WIL: #00ff00#%3d"):format(game.player:getWil()), 0, h, 255, 255, 255) h = h + self.font_h
self.surface:drawColorString(self.font, ("CUN: #00ff00#%3d"):format(game.player:getCun()), 0, h, 255, 255, 255) h = h + self.font_h
self.surface:drawColorString(self.font, ("CON: #00ff00#%3d"):format(game.player:getCon()), 0, h, 255, 255, 255) h = h + self.font_h
h = h + self.font_h
self.surface:drawString(self.font, ("Armor %3d"):format(game.player:combatArmor()), 0, h, 255, 255, 255) h = h + self.font_h
self.surface:drawString(self.font, ("Defence %3d"):format(game.player:combatDefense()), 0, h, 255, 255, 255) h = h + self.font_h
if game.zone and game.level then
self.surface:drawString(self.font, ("%s (%d)"):format(game.zone.name, game.level.level), 0, self.h - self.font_h, 0, 255, 255) h = h + self.font_h
......
......@@ -17,7 +17,7 @@ function _M:bumpInto(target)
if self.player and target.can_talk then
-- TODO: implement !
elseif target.player and self.can_talk then
-- TODO: implement! requet the player to talk
-- TODO: implement! request the player to talk
elseif self.move_others then
-- Displace
game.level.map:remove(self.x, self.y, Map.ACTOR)
......
--[[
newEntity{
name = "flaming ", prefix=true,
level_range = {1, 10},
rarity = 3,
wielder = {
melee_project={[DamageType.FIRE] = 4},
-- melee_project={[DamageType.FIRE] = 4},
},
}
--]]
newEntity{
name = " of accuracy",
level_range = {1, 10},
level_range = {1, 50},
rarity = 3,
wielder = {
combat_atk = resolvers.mbonus(20),
},
}
newEntity{
name = "kinetic ", prefix=true,
level_range = {1, 50},
rarity = 3,
wielder = {
combat_atk = 4,
combat_apr = resolvers.mbonus(15),
},
}
load("/data/general/staves.lua")
load("/data/general/swords.lua")
load("/data/general/shields.lua")
load("/data/general/massive-armor.lua")
newEntity{
name = "& tower shield~",
display = "[", color_r=255,
level_range = {1, 10},
rarity = 2,
encumber = 6,
wielder = {
combat_def = 6,
combat_armor = 1,
},
}
newEntity{
name = "& Staff of Olorin",
type = "weapon",
......
newEntity{
define_as = "BASE_SHIELD",
slot = "OFFHAND",
type = "armor", subtype="shield",
display = ")", color=colors.UMBER,
encumber = 7,
rarity = 3,
desc = [[Handheld deflection devices]],
}
-- All shields have a "special_combat" field, this is used to compute damage mde with them
-- when using special talents
newEntity{ base = "BASE_SHIELD",
name = "iron shield",
level_range = {1, 10},
require = { stat = { str=11 }, },
special_combat = {
dam = resolvers.rngavg(7,11),
physcrit = 2.5,
dammod = {str=1},
},
wielder = {
combat_armor = 2,
combat_def = 4,
},
}
newEntity{ base = "BASE_SHIELD",
name = "steel shield",
level_range = {10, 20},
require = { stat = { str=16 }, },
special_combat = {
dam = resolvers.rngavg(10,20),
physcrit = 3,
dammod = {str=1},
},
wielder = {
combat_armor = 3,
combat_def = 6,
},
}
newEntity{ base = "BASE_SHIELD",
name = "dwarven-steel shield",
level_range = {20, 30},
require = { stat = { str=24 }, },
special_combat = {
dam = resolvers.rngavg(25,35),
physcrit = 3.5,
dammod = {str=1},
},
wielder = {
combat_armor = 4,
combat_def = 8,
},
}
newEntity{ base = "BASE_SHIELD",
name = "galvorn shield",
level_range = {30, 40},
require = { stat = { str=35 }, },
special_combat = {
dam = resolvers.rngavg(40,55),
physcrit = 4.5,
dammod = {str=1},
},
wielder = {
combat_armor = 4,
combat_def = 10,
},
}
newEntity{ base = "BASE_SHIELD",
name = "mithril shield",
level_range = {40, 50},
require = { stat = { str=48 }, },
special_combat = {
dam = resolvers.rngavg(60,75),
physcrit = 5,
dammod = {str=1},
},
wielder = {
combat_armor = 4,
combat_def = 12,
},
}
......@@ -6,7 +6,7 @@ newEntity{
encumber = 5,
rarity = 3,
desc = [[Staves designed for wielders of magic, by the greats of the art.]],
egos = "/data/general/egos.lua",
egos = "/data/general/egos.lua", egos_chance = resolvers.mbonus(40, 5),
}
newEntity{ base = "BASE_STAFF",
......
......@@ -6,7 +6,7 @@ newEntity{
encumber = 3,
rarity = 3,
desc = [[Sharp, long, and deadly.]],
egos = "/data/general/egos.lua",
egos = "/data/general/egos.lua", egos_chance = resolvers.mbonus(40, 5),
}
newEntity{ base = "BASE_LONGSWORD",
......
......@@ -15,7 +15,7 @@ newTalent{
newTalent{
name = "Freeze",
type = {"spell/water", 1},
mana = 14,
mana = 4,
cooldown = 3,
tactical = {
ATTACK = 10,
......
return {
name = "ancient ruins",
level_range = {1, 5},
level_scheme = "player",
max_level = 5,
width = 50, height = 50,
all_remembered = true,
......@@ -19,9 +20,9 @@ return {
},
actor = {
class = "engine.generator.actor.Random",
nb_npc = {2, 3},
nb_npc = {20, 30},
ood = {chance=5, range={1, 10}},
adjust_level_to_player = {-1, 2},
adjust_level = {-1, 2},
},
object = {
class = "engine.generator.object.Random",
......
......@@ -11,6 +11,9 @@ local Birther = require "engine.Birther"
-- Some default colors
dofile("/mod/colors.lua")
-- Additional entities resolvers
dofile("/mod/resolvers.lua")
-- Damage types
DamageType:loadDefinition("/data/damage_types.lua")
-- Talents
......@@ -51,5 +54,4 @@ ActorInventory:defineInventory("TOOL", "Tool", true, "This si your readied tool,
-- Birther descriptor
Birther:loadDefinition("/data/birth/descriptors.lua")
return require "mod.class.Game"
--- Random bonus based on level
resolvers.current_level = 1
function resolvers.mbonus(max)
return {__resolver="mbonus", max}
end
function resolvers.calc.mbonus(t)
return rng.mbonus(t[1], resolvers.current_level, 50)
end
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