From fdf1976e5c835fd4afa0e024c62f44d304422a89 Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Tue, 21 Aug 2012 23:11:48 +0000 Subject: [PATCH] prodigies! git-svn-id: http://svn.net-core.org/repos/t-engine4@5551 51575b47-30f0-44d4-a5cc-537603b46e54 --- game/modules/tome/class/Game.lua | 4 +- .../tome/data/general/events/meteor.lua | 1 + .../data/gfx/talents/aether_permeation.png | Bin 0 -> 4828 bytes .../tome/data/gfx/talents/draconic_body.png | Bin 0 -> 4224 bytes .../tome/data/gfx/talents/draconic_will.png | Bin 0 -> 3516 bytes .../data/gfx/talents/fast_as_lightning.png | Bin 0 -> 2880 bytes .../data/gfx/talents/garkul_s_revenge.png | Bin 0 -> 4439 bytes .../tome/data/gfx/talents/meteoric_crash.png | Bin 0 -> 4213 bytes .../tome/data/gfx/talents/spectral_shield.png | Bin 0 -> 5096 bytes .../tome/data/gfx/talents/swift_hands.png | Bin 0 -> 4035 bytes .../data/gfx/talents/through_the_crowd.png | Bin 0 -> 2618 bytes game/modules/tome/data/talents/uber/uber.lua | 26 +- game/modules/tome/data/talents/uber/wil.lua | 4 +- game/modules/tome/dialogs/UberTalent.lua | 809 +----------------- 14 files changed, 56 insertions(+), 788 deletions(-) create mode 100644 game/modules/tome/data/gfx/talents/aether_permeation.png create mode 100644 game/modules/tome/data/gfx/talents/draconic_body.png create mode 100644 game/modules/tome/data/gfx/talents/draconic_will.png create mode 100644 game/modules/tome/data/gfx/talents/fast_as_lightning.png create mode 100644 game/modules/tome/data/gfx/talents/garkul_s_revenge.png create mode 100644 game/modules/tome/data/gfx/talents/meteoric_crash.png create mode 100644 game/modules/tome/data/gfx/talents/spectral_shield.png create mode 100644 game/modules/tome/data/gfx/talents/swift_hands.png create mode 100644 game/modules/tome/data/gfx/talents/through_the_crowd.png diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua index 292199f3c3..d95aa3f488 100644 --- a/game/modules/tome/class/Game.lua +++ b/game/modules/tome/class/Game.lua @@ -1234,7 +1234,9 @@ function _M:setupCommands() end end end end, [{"_g","ctrl"}] = function() if config.settings.cheat then - self.player:learnTalentType("uber/uber", true) + package.loaded["mod.dialogs.UberTalent"] = nil + self:registerDialog(require("mod.dialogs.UberTalent").new(self.player)) +-- self.player:learnTalentType("uber/uber", true) do return end local f, err = loadfile("/data/general/events/slimey-pool.lua") print(f, err) diff --git a/game/modules/tome/data/general/events/meteor.lua b/game/modules/tome/data/general/events/meteor.lua index 7392e6d7b5..5d2e2fa110 100644 --- a/game/modules/tome/data/general/events/meteor.lua +++ b/game/modules/tome/data/general/events/meteor.lua @@ -85,6 +85,7 @@ game.zone.on_turn = function() end end world:gainAchievement("EVENT_METEOR", game:getPlayer(true)) + game:getPlayer(true):attr("meteoric_crash", 1) require("engine.ui.Dialog"):simplePopup("Meteor!", "As you walk you notice a huge rock falling from the sky, it crashes right near you!") end end diff --git a/game/modules/tome/data/gfx/talents/aether_permeation.png b/game/modules/tome/data/gfx/talents/aether_permeation.png new file mode 100644 index 0000000000000000000000000000000000000000..878702c6ab6dd6429fbbaf0cd2660e9ccf29ee3c GIT binary patch literal 4828 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 C*J_CX literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/draconic_body.png b/game/modules/tome/data/gfx/talents/draconic_body.png new file mode 100644 index 0000000000000000000000000000000000000000..c4989c7ff0ea8e78cf9a96f497fd8d5d7dcd459c GIT binary patch literal 4224 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 W9X|y@WBAzs0000<MNUMnLSTXn;2+ii literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/draconic_will.png b/game/modules/tome/data/gfx/talents/draconic_will.png new file mode 100644 index 0000000000000000000000000000000000000000..dfa8118a34314499c00997339cc092227b0cb7d3 GIT binary patch literal 3516 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/fast_as_lightning.png b/game/modules/tome/data/gfx/talents/fast_as_lightning.png new file mode 100644 index 0000000000000000000000000000000000000000..c514c328ac15f071690caec81cc849976220d4d1 GIT binary patch literal 2880 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/garkul_s_revenge.png b/game/modules/tome/data/gfx/talents/garkul_s_revenge.png new file mode 100644 index 0000000000000000000000000000000000000000..2335d5f45567d83865d3e036779435178d0b61f1 GIT binary patch literal 4439 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/meteoric_crash.png b/game/modules/tome/data/gfx/talents/meteoric_crash.png new file mode 100644 index 0000000000000000000000000000000000000000..218cb3dbf4276e091ff510d26d12799ffe3a05dd GIT binary patch literal 4213 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 LNkvXXu0mjf2+TPG literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/spectral_shield.png b/game/modules/tome/data/gfx/talents/spectral_shield.png new file mode 100644 index 0000000000000000000000000000000000000000..60710cd4fef4744fe421f89c607d5e78681db311 GIT binary patch literal 5096 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 KMNUMnLSTaN*}}8{ literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/swift_hands.png b/game/modules/tome/data/gfx/talents/swift_hands.png new file mode 100644 index 0000000000000000000000000000000000000000..c51e8e031258e06f68aee370e11175abfe9b790f GIT binary patch literal 4035 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/talents/through_the_crowd.png b/game/modules/tome/data/gfx/talents/through_the_crowd.png new file mode 100644 index 0000000000000000000000000000000000000000..229748c70e04c552140273595570c1efa0036d91 GIT binary patch literal 2618 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 literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/talents/uber/uber.lua b/game/modules/tome/data/talents/uber/uber.lua index b20940ca4b..69d686f2ce 100644 --- a/game/modules/tome/data/talents/uber/uber.lua +++ b/game/modules/tome/data/talents/uber/uber.lua @@ -17,11 +17,16 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org -newTalentType{ type="uber/uber", name = "uber", description = "Ultimate talents you may only know one." } - +newTalentType{ hide = true, type="uber/strength", name = "strength", description = "Ultimate talents you may only know one." } +newTalentType{ hide = true, type="uber/dexterity", name = "dexterity", description = "Ultimate talents you may only know one." } +newTalentType{ hide = true, type="uber/constitution", name = "constitution", description = "Ultimate talents you may only know one." } +newTalentType{ hide = true, type="uber/magic", name = "magic", description = "Ultimate talents you may only know one." } +newTalentType{ hide = true, type="uber/willpower", name = "willpower", description = "Ultimate talents you may only know one." } +newTalentType{ hide = true, type="uber/cunning", name = "cunning", description = "Ultimate talents you may only know one." } uberTalent = function(t) - t.type = {"uber/uber", 1} + t.type = {"uber/strength", 1} + t.uber = true t.require = t.require or {} t.require.level = 40 t.require.stat = t.require.stat or {} @@ -31,7 +36,8 @@ end load("/data/talents/uber/str.lua") uberTalent = function(t) - t.type = {"uber/uber", 1} + t.type = {"uber/dexterity", 1} + t.uber = true t.require = t.require or {} t.require.stat = t.require.stat or {} t.require.level = 40 @@ -41,7 +47,8 @@ end load("/data/talents/uber/dex.lua") uberTalent = function(t) - t.type = {"uber/uber", 1} + t.type = {"uber/constitution", 1} + t.uber = true t.require = t.require or {} t.require.stat = t.require.stat or {} t.require.level = 40 @@ -51,7 +58,8 @@ end load("/data/talents/uber/const.lua") uberTalent = function(t) - t.type = {"uber/uber", 1} + t.type = {"uber/magic", 1} + t.uber = true t.require = t.require or {} t.require.stat = t.require.stat or {} t.require.level = 40 @@ -61,7 +69,8 @@ end load("/data/talents/uber/mag.lua") uberTalent = function(t) - t.type = {"uber/uber", 1} + t.type = {"uber/willpower", 1} + t.uber = true t.require = t.require or {} t.require.level = 40 t.require.stat = t.require.stat or {} @@ -71,7 +80,8 @@ end load("/data/talents/uber/wil.lua") uberTalent = function(t) - t.type = {"uber/uber", 1} + t.type = {"uber/cunning", 1} + t.uber = true t.require = t.require or {} t.require.level = 40 t.require.stat = t.require.stat or {} diff --git a/game/modules/tome/data/talents/uber/wil.lua b/game/modules/tome/data/talents/uber/wil.lua index a5a48ef642..93144d4873 100644 --- a/game/modules/tome/data/talents/uber/wil.lua +++ b/game/modules/tome/data/talents/uber/wil.lua @@ -38,7 +38,7 @@ uberTalent{ mode = "passive", cooldown = 15, getDamage = function(self, t) return 100 + self:combatSpellpower() * 4 end, - require = { special={desc="Been into planetary orbit", fct=function(self) return self:attr("planetary_orbit") end} }, + require = { special={desc="Witness a meteoric crash", fct=function(self) return self:attr("meteoric_crash") end} }, trigger = function(self, t, target) self:startTalentCooldown(t) local terrains = t.terrains or mod.class.Grid:loadList("/data/general/grids/lava.lua") @@ -102,7 +102,7 @@ uberTalent{ local dam = t.getDamage(self, t)/2 return ([[With the release of your willpower when casting damaging spells you can call forth a meteor to crash down near your foes. The affected area is turned into lava for 8 turns and the crash will deal %0.2f fire and %0.2f physical damage. - The meteor has 20%% chance to stun affected creatures for 3 turns.]]) + The meteor also stun affected creatures for 3 turns.]]) :format(damDesc(self, DamageType.FIRE, dam), damDesc(self, DamageType.PHYSICAL, dam)) end, } diff --git a/game/modules/tome/dialogs/UberTalent.lua b/game/modules/tome/dialogs/UberTalent.lua index 2a9f68b518..1c672f23fc 100644 --- a/game/modules/tome/dialogs/UberTalent.lua +++ b/game/modules/tome/dialogs/UberTalent.lua @@ -25,46 +25,22 @@ local Button = require "engine.ui.Button" local Textzone = require "engine.ui.Textzone" local TextzoneList = require "engine.ui.TextzoneList" local UIContainer = require "engine.ui.UIContainer" -local TalentTrees = require "mod.dialogs.elements.TalentTrees" +local ImageList = require "engine.ui.ImageList" local Separator = require "engine.ui.Separator" local DamageType = require "engine.DamageType" module(..., package.seeall, class.inherit(Dialog, mod.class.interface.TooltipsData)) -function _M:init(actor, on_finish, on_birth) - self.on_birth = on_birth - actor.no_last_learnt_talents_cap = true +function _M:init(actor, on_finish) self.actor = actor - self.unused_stats = self.actor.unused_stats - self.new_stats_changed = false - self.new_talents_changed = false - - self.talents_changed = {} - self.on_finish = on_finish - self.running = true - self.prev_stats = {} - self.font_h = self.font:lineSkip() - self.talents_learned = {} - self.talent_types_learned = {} - self.stats_increased = {} self.font = core.display.newFont("/data/font/DroidSansMono.ttf", 12) self.font_h = self.font:lineSkip() - self.actor.__hidden_talent_types = self.actor.__hidden_talent_types or {} - self.actor.__increased_talent_types = self.actor.__increased_talent_types or {} - self.actor_dup = actor:clone() self.actor_dup.uid = actor.uid -- Yes ... - for _, v in pairs(game.engine.Birther.birth_descriptor_def) do - if v.type == "subclass" and v.name == actor.descriptor.subclass then self.desc_def = v break end - end - - Dialog.init(self, "Levelup: "..actor.name, game.w * 0.9, game.h * 0.9, game.w * 0.05, game.h * 0.05) - if game.w * 0.9 >= 1000 then - self.no_tooltip = true - end + Dialog.init(self, "Prodigies: "..actor.name, game.w * 0.9, game.h * 0.9, game.w * 0.05, game.h * 0.05) self:generateList() @@ -72,708 +48,66 @@ function _M:init(actor, on_finish, on_birth) self:setupUI() self.key:addCommands{ - __TEXTINPUT = function(c) - if c == "+" and self.focus_ui and self.focus_ui.ui.onUse then - self.focus_ui.ui:onUse(self.focus_ui.ui.last_mz.item, true) - elseif c == "-" then - self.focus_ui.ui:onUse(self.focus_ui.ui.last_mz.item, false) - end - end, } self.key:addBinds{ EXIT = function() - if self.actor.unused_stats~=self.actor_dup.unused_stats or self.actor.unused_talents_types~=self.actor_dup.unused_talents_types or - self.actor.unused_talents~=self.actor_dup.unused_talents or self.actor.unused_generics~=self.actor_dup.unused_generics then - self:yesnocancelPopup("Finish","Do you accept changes?", function(yes, cancel) - if cancel then - return nil - else - if yes then ok = self:finish() else ok = true self:cancel() end - end - if ok then - game:unregisterDialog(self) - self.actor_dup = {} - if self.on_finish then self.on_finish() end - end - end) - else - game:unregisterDialog(self) - self.actor_dup = {} - if self.on_finish then self.on_finish() end - end + game:unregisterDialog(self) end, } + + self.actor:learnTalentType("uber/strength", true) + self.actor:learnTalentType("uber/dexterity", true) + self.actor:learnTalentType("uber/constitution", true) + self.actor:learnTalentType("uber/magic", true) + self.actor:learnTalentType("uber/willpower", true) + self.actor:learnTalentType("uber/cunning", true) end function _M:on_register() game:onTickEnd(function() self.key:unicodeInput(true) end) end -function _M:unload() - self.actor.no_last_learnt_talents_cap = nil - self.actor:capLastLearntTalents("class") - self.actor:capLastLearntTalents("generic") -end - -function _M:cancel() - local ax, ay = self.actor.x, self.actor.y - self.actor_dup.replacedWith = false - self.actor:replaceWith(self.actor_dup) - self.actor.replacedWith = nil - self.actor.x, self.actor.y = ax, ay - self.actor.changed = true - self.actor:removeAllMOs() - if game.level and self.actor.x then game.level.map:updateMap(self.actor.x, self.actor.y) end -end - -function _M:getMaxTPoints(t) - if t.points == 1 then return 1 end - return t.points + math.max(0, math.floor((self.actor.level - 50) / 10)) -end - -function _M:finish() - local ok, dep_miss = self:checkDeps(true) - if not ok then - self:simpleLongPopup("Impossible", "You cannot learn this talent(s): "..dep_miss, game.w * 0.4) - return nil - end - - local txt = "#LIGHT_BLUE#Warning: You have increased some of your statistics or talent. Talent(s) actually sustained: \n %s If these are dependent on one of the stats you changed, you need to re-use them for the changes to take effect." - local talents = "" - local reset = {} - for tid, act in pairs(self.actor.sustain_talents) do - if act then - local t = self.actor:getTalentFromId(tid) - if t.no_sustain_autoreset and self.actor:knowTalent(tid) then - talents = talents.."#GOLD# - "..t.name.."#LAST#\n" - else - reset[#reset+1] = tid - end - end - end - if talents ~= "" then - game.logPlayer(self.actor, txt:format(talents)) - end - for i, tid in ipairs(reset) do - self.actor:forceUseTalent(tid, {ignore_energy=true, ignore_cd=true, no_equilibrium_fail=true, no_paradox_fail=true}) - if self.actor:knowTalent(tid) then self.actor:forceUseTalent(tid, {ignore_energy=true, ignore_cd=true, no_equilibrium_fail=true, no_paradox_fail=true, talent_reuse=true}) end - end - - if not self.on_birth then - for t_id, _ in pairs(self.talents_learned) do - local t = self.actor:getTalentFromId(t_id) - if not self.actor:isTalentCoolingDown(t) and not self.actor_dup:knowTalent(t_id) then self.actor:startTalentCooldown(t) end - end - end - return true -end - -function _M:incStat(sid, v) - if v == 1 then - if self.actor.unused_stats <= 0 then - self:simplePopup("Not enough stat points", "You have no stat points left!") - return - end - if self.actor:getStat(sid, nil, nil, true) >= self.actor.level * 1.4 + 20 then - self:simplePopup("Stat is at the maximum for your level", "You cannot increase this stat further until next level!") - return - end - if self.actor:isStatMax(sid) or self.actor:getStat(sid, nil, nil, true) >= 60 + math.max(0, (self.actor.level - 50)) then - self:simplePopup("Stat is at the maximum", "You cannot increase this stat further!") - return - end - else - if self.actor_dup:getStat(sid, nil, nil, true) == self.actor:getStat(sid, nil, nil, true) then - self:simplePopup("Impossible", "You cannot take out more points!") - return - end - end - - self.actor:incStat(sid, v) - self.actor.unused_stats = self.actor.unused_stats - v - - self.stats_increased[sid] = (self.stats_increased[sid] or 0) + v - self:updateTooltip() -end - -function _M:computeDeps(t) - local d = {} - self.talents_deps[t.id] = d - - -- Check prerequisites - if rawget(t, "require") then - local req = t.require - if type(req) == "function" then req = req(self.actor, t) end - - if req.talent then - for _, tid in ipairs(req.talent) do - if type(tid) == "table" then - d[tid[1]] = true --- print("Talent deps: ", t.id, "depends on", tid[1]) - else - d[tid] = true --- print("Talent deps: ", t.id, "depends on", tid) - end - end - end - end - - -- Check number of talents - for id, nt in pairs(self.actor.talents_def) do - if nt.type[1] == t.type[1] then - d[id] = true --- print("Talent deps: ", t.id, "same category as", id) - end - end -end - -function _M:checkDeps(simple) - local talents = "" - local stats_ok = true - - local checked = {} - - local function check(t_id) - if checked[t_id] then return end - checked[t_id] = true - - local t = self.actor:getTalentFromId(t_id) - local ok, reason = self.actor:canLearnTalent(t, 0) - if not ok and self.actor:knowTalent(t) then talents = talents.."\n#GOLD##{bold}# - "..t.name.."#{normal}##LAST#("..reason..")" end - if reason == "not enough stat" then - stats_ok = false - end - - local dlist = self.talents_deps[t_id] - if dlist and not simple then for dtid, _ in pairs(dlist) do check(dtid) end end - end - - for t_id, _ in pairs(self.talents_changed) do check(t_id) end - - if talents ~="" then - return false, talents, stats_ok - else - return true, "", stats_ok - end -end - -function _M:isUnlearnable(t, limit) - if not self.actor.last_learnt_talents then return end - if self.on_birth and self.actor:knowTalent(t.id) and not t.no_unlearn_last then return 1 end -- On birth we can reset any talents except a very few - local list = self.actor.last_learnt_talents[t.generic and "generic" or "class"] - local max = self.actor:lastLearntTalentsMax(t.generic and "generic" or "class") - local min = 1 - if limit then min = math.max(1, #list - (max - 1)) end - for i = #list, min, -1 do - if list[i] == t.id then return i end - end - return nil -end - -function _M:learnTalent(t_id, v) - self.talents_learned[t_id] = self.talents_learned[t_id] or 0 - local t = self.actor:getTalentFromId(t_id) - if not t.generic then - if v then - if self.actor.unused_talents < 1 then - self:simplePopup("Not enough class talent points", "You have no class talent points left!") - return - end - if not self.actor:canLearnTalent(t) then - self:simplePopup("Cannot learn talent", "Prerequisites not met!") - return - end - if self.actor:getTalentLevelRaw(t_id) >= self:getMaxTPoints(t) then - self:simplePopup("Already known", "You already fully know this talent!") - return - end - self.actor:learnTalent(t_id, true) - self.actor.unused_talents = self.actor.unused_talents - 1 - self.talents_changed[t_id] = true - self.talents_learned[t_id] = self.talents_learned[t_id] + 1 - self.new_talents_changed = true - else - if not self.actor:knowTalent(t_id) then - self:simplePopup("Impossible", "You do not know this talent!") - return - end - if not self:isUnlearnable(t, true) and self.actor_dup:getTalentLevelRaw(t_id) >= self.actor:getTalentLevelRaw(t_id) then - self:simplePopup("Impossible", "You cannot unlearn talents!") - return - end - self.actor:unlearnTalent(t_id, nil, true) - self.talents_changed[t_id] = true - local _, reason = self.actor:canLearnTalent(t, 0) - local ok, dep_miss, stats_ok = self:checkDeps() - if ok or reason == "not enough stat" or not stats_ok then - self.actor.unused_talents = self.actor.unused_talents + 1 - self.talents_learned[t_id] = self.talents_learned[t_id] - 1 - self.new_talents_changed = true - else - self:simpleLongPopup("Impossible", "You cannot unlearn this talent because of talent(s): "..dep_miss, game.w * 0.4) - self.actor:learnTalent(t_id) - return - end - end - else - if v then - if self.actor.unused_generics < 1 then - self:simplePopup("Not enough generic talent points", "You have no generic talent points left!") - return - end - if not self.actor:canLearnTalent(t) then - self:simplePopup("Cannot learn talent", "Prerequisites not met!") - return - end - if self.actor:getTalentLevelRaw(t_id) >= self:getMaxTPoints(t) then - self:simplePopup("Already known", "You already fully know this talent!") - return - end - self.actor:learnTalent(t_id) - self.actor.unused_generics = self.actor.unused_generics - 1 - self.talents_changed[t_id] = true - self.talents_learned[t_id] = self.talents_learned[t_id] + 1 - self.new_talents_changed = true - else - if not self.actor:knowTalent(t_id) then - self:simplePopup("Impossible", "You do not know this talent!") - return - end - if not self:isUnlearnable(t, true) and self.actor_dup:getTalentLevelRaw(t_id) >= self.actor:getTalentLevelRaw(t_id) then - self:simplePopup("Impossible", "You cannot unlearn talents!") - return - end - self.actor:unlearnTalent(t_id, nil, true) - self.talents_changed[t_id] = true - local _, reason = self.actor:canLearnTalent(t, 0) - local ok, dep_miss, stats_ok = self:checkDeps() - if ok or reason == "not enough stat" or not stats_ok then - self.actor.unused_generics = self.actor.unused_generics + 1 - self.talents_learned[t_id] = self.talents_learned[t_id] - 1 - self.new_talents_changed = true - else - self:simpleLongPopup("Impossible", "You can not unlearn this talent because of talent(s): "..dep_miss, game.w * 0.4) - self.actor:learnTalent(t_id) - return - end - end - end - self:updateTooltip() -end - -function _M:learnType(tt, v) - self.talent_types_learned[tt] = self.talent_types_learned[tt] or {} - if v then - if self.actor:knowTalentType(tt) and self.actor.__increased_talent_types[tt] and self.actor.__increased_talent_types[tt] >= 1 then - self:simplePopup("Impossible", "You can only improve a category mastery once!") - return - end - if self.actor.unused_talents_types <= 0 then - self:simplePopup("Not enough talent category points", "You have no category points left!") - return - end - if not self.actor.talents_types_def[tt] or (self.actor.talents_types_def[tt].min_lev or 0) > self.actor.level then - self:simplePopup("Too low level", ("This talent tree only provides talents starting at level %d. Learning it now would be useless."):format(self.actor.talents_types_def[tt].min_lev)) - return - end - if not self.actor:knowTalentType(tt) then - self.actor:learnTalentType(tt) - self.talent_types_learned[tt][1] = true - else - self.actor.__increased_talent_types[tt] = (self.actor.__increased_talent_types[tt] or 0) + 1 - self.actor:setTalentTypeMastery(tt, self.actor:getTalentTypeMastery(tt) + 0.2) - self.talent_types_learned[tt][2] = true - end - self:triggerHook{"PlayerLevelup:addTalentType", actor=self.actor, tt=tt} - self.actor.unused_talents_types = self.actor.unused_talents_types - 1 - self.new_talents_changed = true - else - if self.actor_dup:knowTalentType(tt) == true and self.actor:knowTalentType(tt) == true and (self.actor_dup.__increased_talent_types[tt] or 0) >= (self.actor.__increased_talent_types[tt] or 0) then - self:simplePopup("Impossible", "You cannot take out more points!") - return - end - if self.actor_dup:knowTalentType(tt) == true and self.actor:knowTalentType(tt) == true and (self.actor.__increased_talent_types[tt] or 0) == 0 then - self:simplePopup("Impossible", "You cannot unlearn this category!") - return - end - if not self.actor:knowTalentType(tt) then - self:simplePopup("Impossible", "You do not know this category!") - return - end - - if (self.actor.__increased_talent_types[tt] or 0) > 0 then - self.actor.__increased_talent_types[tt] = (self.actor.__increased_talent_types[tt] or 0) - 1 - self.actor:setTalentTypeMastery(tt, self.actor:getTalentTypeMastery(tt) - 0.2) - self.actor.unused_talents_types = self.actor.unused_talents_types + 1 - self.new_talents_changed = true - self.talent_types_learned[tt][2] = nil - else - self.actor:unlearnTalentType(tt) - local ok, dep_miss = self:checkDeps() - if ok then - self.actor.unused_talents_types = self.actor.unused_talents_types + 1 - self.new_talents_changed = true - self.talent_types_learned[tt][1] = nil - else - self:simpleLongPopup("Impossible", "You cannot unlearn this category because of: "..dep_miss, game.w * 0.4) - self.actor:learnTalentType(tt) - return - end - end - self:triggerHook{"PlayerLevelup:subTalentType", actor=self.actor, tt=tt} - end - self:updateTooltip() -end - function _M:generateList() - self.actor.__show_special_talents = self.actor.__show_special_talents or {} -- Makes up the list - local ctree = {} - local gtree = {} - self.talents_deps = {} - for i, tt in ipairs(self.actor.talents_types_def) do - if not tt.hide and not (self.actor.talents_types[tt.type] == nil) then - local cat = tt.type:gsub("/.*", "") - local ttknown = self.actor:knowTalentType(tt.type) - local isgeneric = self.actor.talents_types_def[tt.type].generic - local tshown = (self.actor.__hidden_talent_types[tt.type] == nil and ttknown) or (self.actor.__hidden_talent_types[tt.type] ~= nil and not self.actor.__hidden_talent_types[tt.type]) - local node = { - name=function(item) return tstring{{"font", "bold"}, cat:capitalize().." / "..tt.name:capitalize() ..(" (%s)"):format((isgeneric and "generic" or "class")), {"font", "normal"}} end, - rawname=function(item) return cat:capitalize().." / "..tt.name:capitalize() ..(" (x%.2f)"):format(self.actor:getTalentTypeMastery(item.type)) end, - type=tt.type, - color=function(item) return ((self.actor:knowTalentType(item.type) ~= self.actor_dup:knowTalentType(item.type)) or ((self.actor.__increased_talent_types[item.type] or 0) ~= (self.actor_dup.__increased_talent_types[item.type] or 0))) and {255, 215, 0} or self.actor:knowTalentType(item.type) and {0,200,0} or {175,175,175} end, - shown = tshown, - status = function(item) return self.actor:knowTalentType(item.type) and tstring{{"font", "bold"}, ((self.actor.__increased_talent_types[item.type] or 0) >=1) and {"color", 255, 215, 0} or {"color", 0x00, 0xFF, 0x00}, ("%.2f"):format(self.actor:getTalentTypeMastery(item.type)), {"font", "normal"}} or tstring{{"color", 0xFF, 0x00, 0x00}, "unknown"} end, - nodes = {}, - isgeneric = isgeneric and 0 or 1, - order_id = i, + local list = {} + for tid, t in pairs(self.actor.talents_def) do + if t.uber then + list[#list+1] = { + image=t.image, + talent = tid, + rawname = t.name, } - if isgeneric then gtree[#gtree+1] = node - else ctree[#ctree+1] = node end - - local list = node.nodes - - -- Find all talents of this school - for j, t in ipairs(tt.talents) do - if not t.hide or self.actor.__show_special_talents[t.id] then - self:computeDeps(t) - local isgeneric = self.actor.talents_types_def[tt.type].generic - - -- Pregenenerate icon with the Tiles instance that allows images - if t.display_entity then t.display_entity:getMapObjects(game.uiset.hotkeys_display_icons.tiles, {}, 1) end - - list[#list+1] = { - __id=t.id, - name=t.name:toTString(), - rawname=t.name, - entity=t.display_entity, - talent=t.id, - isgeneric=isgeneric and 0 or 1, - _type=tt.type, - do_shadow = function(item) if not self.actor:canLearnTalent(t) then return true else return false end end, - color=function(item) - if ((self.actor.talents[item.talent] or 0) ~= (self.actor_dup.talents[item.talent] or 0)) then return {255, 215, 0} - elseif self:isUnlearnable(t, true) then return colors.simple(colors.LIGHT_BLUE) - elseif self.actor:knowTalentType(item._type) then return {255,255,255} - else return {175,175,175} - end - end, - } - list[#list].status = function(item) - local t = self.actor:getTalentFromId(item.talent) - local ttknown = self.actor:knowTalentType(item._type) - if self.actor:getTalentLevelRaw(t.id) == self:getMaxTPoints(t) then - return tstring{{"color", 0x00, 0xFF, 0x00}, self.actor:getTalentLevelRaw(t.id).."/"..self:getMaxTPoints(t)} - else - if not self.actor:canLearnTalent(t) then - return tstring{(ttknown and {"color", 0xFF, 0x00, 0x00} or {"color", 0x80, 0x80, 0x80}), self.actor:getTalentLevelRaw(t.id).."/"..self:getMaxTPoints(t)} - else - return tstring{(ttknown and {"color", "WHITE"} or {"color", 0x80, 0x80, 0x80}), self.actor:getTalentLevelRaw(t.id).."/"..self:getMaxTPoints(t)} - end - end - end - end - end end end - table.sort(ctree, function(a, b) - return a.order_id < b.order_id - end) - self.ctree = ctree - table.sort(gtree, function(a, b) - return a.order_id < b.order_id - end) - self.gtree = gtree - - -- Makes up the stats list - local stats = {} - self.tree_stats = stats - - for i, sid in ipairs{self.actor.STAT_STR, self.actor.STAT_DEX, self.actor.STAT_CON, self.actor.STAT_MAG, self.actor.STAT_WIL, self.actor.STAT_CUN } do - local s = self.actor.stats_def[sid] - local e = engine.Entity.new{image="stats/"..s.name:lower()..".png", is_stat=true} - e:getMapObjects(game.uiset.hotkeys_display_icons.tiles, {}, 1) - - stats[#stats+1] = {shown=true, nodes={{ - name=s.name, - rawname=s.name, - entity=e, - stat=sid, - desc=s.description, - color=function(item) - if self.actor:getStat(sid, nil, nil, true) ~= self.actor_dup:getStat(sid, nil, nil, true) then return {255, 215, 0} - elseif self.actor:getStat(sid, nil, nil, true) >= self.actor.level * 1.4 + 20 or - self.actor:isStatMax(sid) or - self.actor:getStat(sid, nil, nil, true) >= 60 + math.max(0, (self.actor.level - 50)) then - return {0, 255, 0} - else - return {175,175,175} - end - end, - status = function(item) - if self.actor:getStat(sid, nil, nil, true) >= self.actor.level * 1.4 + 20 or - self.actor:isStatMax(sid) or - self.actor:getStat(sid, nil, nil, true) >= 60 + math.max(0, (self.actor.level - 50)) then - return tstring{{"color", 175, 175, 175}, ("%d (%d)"):format(self.actor:getStat(sid), self.actor:getStat(sid, nil, nil, true))} - else - return tstring{{"color", 0x00, 0xFF, 0x00}, ("%d (%d)"):format(self.actor:getStat(sid), self.actor:getStat(sid, nil, nil, true))} - end - end, - }}} - end + table.print(list) + self.list = list end ----------------------------------------------------------------- -- UI Stuff ----------------------------------------------------------------- -local _points_left = [[ -Stats points left: #00FF00#%d#LAST# -Category points left: #00FF00#%d#LAST# -Class talent points left: #00FF00#%d#LAST# -Generic talent points left: #00FF00#%d#LAST#]] - -local desc_stats = ([[Stat points allow you to increase your core stats. -Each level you gain 3 new stat points to use. - -You may only increase stats to a natural maximum of 60 or lower (relative to your level).]]):toTString() - -local desc_class = ([[Class talent points allow you to learn new class talents or improve them. -Class talents are core to your class and can not be learnt by training. - -Each level you gain 1 new class point to use. -Each five levels you gain one more. -]]):toTString() - -local desc_generic = ([[Generic talent points allow you to learn new generic talents or improve them. -Generic talents comes from your class, your race or various outside training you can get during your adventures. - -Each level you gain 1 new class point to use. -Each five levels you gain one less. -]]):toTString() - -local desc_types = ([[Talent category points allow you to either: -- learn a new talent (class or generic) category -- improve a known talent category efficiency by 0.2 -- learn a new inscription slot (up to a maximum of 5, learning it is automatic when using an inscription) - -You gain a new point at level 10, 20 and 30. -Some races or items may increase them as well.]]):toTString() - function _M:createDisplay() - self.c_ctree = TalentTrees.new{ - font = core.display.newFont("/data/font/DroidSans.ttf", 14), - tiles=game.uiset.hotkeys_display_icons, - tree=self.ctree, - width=320, height=self.ih-50, - tooltip=function(item) - local x = self.display_x + self.uis[5].x - game.tooltip.max - if self.display_x + self.w + game.tooltip.max <= game.w then x = self.display_x + self.w end - local ret = self:getTalentDesc(item), x, nil - if self.no_tooltip then - self.c_desc:erase() - self.c_desc:switchItem(ret, ret) - end - return ret - end, - on_use = function(item, inc) self:onUseTalent(item, inc) end, - on_expand = function(item) self.actor.__hidden_talent_types[item.type] = not item.shown end, - scrollbar = true, no_tooltip = self.no_tooltip, - } - - self.c_gtree = TalentTrees.new{ - font = core.display.newFont("/data/font/DroidSans.ttf", 14), - tiles=game.uiset.hotkeys_display_icons, - tree=self.gtree, - width=320, height=self.ih-50, - tooltip=function(item) - local x = self.display_x + self.uis[8].x - game.tooltip.max - if self.display_x + self.w + game.tooltip.max <= game.w then x = self.display_x + self.w end - local ret = self:getTalentDesc(item), x, nil - if self.no_tooltip then - self.c_desc:erase() - self.c_desc:switchItem(ret, ret) - end - return ret - end, - on_use = function(item, inc) self:onUseTalent(item, inc) end, - on_expand = function(item) self.actor.__hidden_talent_types[item.type] = not item.shown end, - scrollbar = true, no_tooltip = self.no_tooltip, - } - - self.c_stat = TalentTrees.new{ - font = core.display.newFont("/data/font/DroidSans.ttf", 14), - tiles=game.uiset.hotkeys_display_icons, - tree=self.tree_stats, no_cross = true, - width=50, height=self.ih, - dont_select_top = true, - tooltip=function(item) - local x = self.display_x + self.uis[2].x + self.uis[2].ui.w - if self.display_x + self.w + game.tooltip.max <= game.w then x = self.display_x + self.w end - local ret = self:getStatDesc(item), x, nil - if self.no_tooltip then - self.c_desc:erase() - self.c_desc:switchItem(ret, ret) - end - return ret - end, - on_use = function(item, inc) self:onUseTalent(item, inc) end, - no_tooltip = self.no_tooltip, - } - - local vsep1 = Separator.new{dir="horizontal", size=self.ih - 20} - local vsep2 = Separator.new{dir="horizontal", size=self.ih - 20} - local hsep = Separator.new{dir="vertical", size=180} - - self.b_stat = Button.new{can_focus = false, can_focus_mouse=true, text="Stats: "..self.actor.unused_stats, fct=function() end, on_select=function() - local str = desc_stats - if self.no_tooltip then - self.c_desc:erase() - self.c_desc:switchItem(str, str, true) - else - game:tooltipDisplayAtMap(self.b_stat.last_display_x + self.b_stat.w, self.b_stat.last_display_y, str) - end - end} - self.b_class = Button.new{can_focus = false, can_focus_mouse=true, text="Class points: "..self.actor.unused_talents, fct=function() end, on_select=function() - local str = desc_class - if self.no_tooltip then - self.c_desc:erase() - self.c_desc:switchItem(str, str, true) - else - game:tooltipDisplayAtMap(self.b_stat.last_display_x + self.b_stat.w, self.b_stat.last_display_y, str) - end - end} - self.b_generic = Button.new{can_focus = false, can_focus_mouse=true, text="Generic points: "..self.actor.unused_generics, fct=function() end, on_select=function() - local str = desc_generic - if self.no_tooltip then - self.c_desc:erase() - self.c_desc:switchItem(str, str, true) - else - game:tooltipDisplayAtMap(self.b_stat.last_display_x + self.b_stat.w, self.b_stat.last_display_y, str) - end - end} - self.b_types = Button.new{can_focus = false, can_focus_mouse=true, text="Category points: "..self.actor.unused_talents_types, fct=function() end, on_select=function() - local str = desc_types - if self.no_tooltip then - self.c_desc:erase() - self.c_desc:switchItem(str, str, true) - else - game:tooltipDisplayAtMap(self.b_stat.last_display_x + self.b_stat.w, self.b_stat.last_display_y, str) - end - end} + self.c_list = ImageList.new{width=self.iw, height=self.ih, tile_w=48, tile_h=48, padding=10, scrollbar=true, list=self.list, fct=function(item) self:use(item) end, on_select=function(item) self:onSelect(item) end} local ret = { - {left=-10, top=0, ui=self.b_stat}, - {left=0, top=self.b_stat.h+10, ui=self.c_stat}, - - {left=self.c_stat, top=40, ui=vsep1}, - - {left=vsep1, top=0, ui=self.b_class}, - {left=vsep1, top=self.b_class.h + 10, ui=self.c_ctree}, - - {left=self.c_ctree, top=40, ui=vsep2}, - - {left=580, top=0, ui=self.b_generic}, - {left=vsep2, top=self.b_generic.h + 10, ui=self.c_gtree}, - - {left=330, top=0, ui=self.b_types}, + {left=0, top=0, ui=self.c_list}, } - if self.no_tooltip then - local vsep3 = Separator.new{dir="horizontal", size=self.ih - 20} - self.c_desc = TextzoneList.new{ focus_check = true, scrollbar = true, width=self.iw - 200 - 530 - 40, height = self.ih, dest_area = { h = self.ih } } - ret[#ret+1] = {right=0, top=0, ui=self.c_desc} - ret[#ret+1] = {right=self.c_desc.w, top=0, ui=vsep3} - end return ret end -function _M:getStatDesc(item) - local stat_id = item.stat - if not stat_id then return item.desc end - local text = tstring{} - text:merge(item.desc:toTString()) - text:add(true, true) - local diff = self.actor:getStat(stat_id, nil, nil, true) - self.actor_dup:getStat(stat_id, nil, nil, true) - local color = diff >= 0 and {"color", "LIGHT_GREEN"} or {"color", "RED"} - local dc = {"color", "LAST"} - - text:add("Current value: ", {"color", "LIGHT_GREEN"}, ("%d"):format(self.actor:getStat(stat_id)), dc, true) - text:add("Base value: ", {"color", "LIGHT_GREEN"}, ("%d"):format(self.actor:getStat(stat_id, nil, nil, true)), dc, true, true) +function _M:onSelect(item) + if item == self.cur_sel then return end - text:add({"color", "LIGHT_BLUE"}, "Stat gives:", dc, true) - if stat_id == self.actor.STAT_CON then - local multi_life = 4 + (self.actor.inc_resource_multi.life or 0) - text:add("Max life: ", color, ("%0.2f"):format(diff * multi_life), dc, true) - text:add("Physical save: ", color, ("%0.2f"):format(diff * 0.35), dc, true) - elseif stat_id == self.actor.STAT_WIL then - if self.actor:knowTalent(self.actor.T_MANA_POOL) then - local multi_mana = 5 + (self.actor.inc_resource_multi.mana or 0) - text:add("Max mana: ", color, ("%0.2f"):format(diff * multi_mana), dc, true) - end - if self.actor:knowTalent(self.actor.T_STAMINA_POOL) then - local multi_stamina = 2.5 + (self.actor.inc_resource_multi.stamina or 0) - text:add("Max stamina: ", color, ("%0.2f"):format(diff * multi_stamina), dc, true) - end - if self.actor:knowTalent(self.actor.T_PSI_POOL) then - local multi_psi = 1 + (self.actor.inc_resource_multi.psi or 0) - text:add("Max psi: ", color, ("%0.2f"):format(diff * multi_psi), dc, true) - end - text:add("Mindpower: ", color, ("%0.2f"):format(diff * 0.7), dc, true) - text:add("Mental save: ", color, ("%0.2f"):format(diff * 0.35), dc, true) - text:add("Spell save: ", color, ("%0.2f"):format(diff * 0.35), dc, true) - if self.actor.use_psi_combat then - text:add("Accuracy: ", color, ("%0.2f"):format(diff * 0.35), dc, true) - end - elseif stat_id == self.actor.STAT_STR then - text:add("Physical power: ", color, ("%0.2f"):format(diff), dc, true) - text:add("Max encumberance: ", color, ("%0.2f"):format(diff * 1.8), dc, true) - text:add("Physical save: ", color, ("%0.2f"):format(diff * 0.35), dc, true) - elseif stat_id == self.actor.STAT_CUN then - text:add("Crit. chance: ", color, ("%0.2f"):format(diff * 0.3), dc, true) - text:add("Mental save: ", color, ("%0.2f"):format(diff * 0.35), dc, true) - text:add("Mindpower: ", color, ("%0.2f"):format(diff * 0.4), dc, true) - if self.actor.use_psi_combat then - text:add("Accuracy: ", color, ("%0.2f"):format(diff * 0.35), dc, true) - end - elseif stat_id == self.actor.STAT_MAG then - text:add("Spell save: ", color, ("%0.2f"):format(diff * 0.35), dc, true) - text:add("Spellpower: ", color, ("%0.2f"):format(diff * 1), dc, true) - elseif stat_id == self.actor.STAT_DEX then - text:add("Defense: ", color, ("%0.2f"):format(diff * 0.35), dc, true) - text:add("Ranged defense: ", color, ("%0.2f"):format(diff * 0.35), dc, true) - text:add("Accuracy: ", color, ("%0.2f"):format(diff), dc, true) - end - - if self.actor.player and self.desc_def and self.desc_def.getStatDesc and self.desc_def.getStatDesc(stat_id, self.actor) then - text:add({"color", "LIGHT_BLUE"}, "Class powers:", dc, true) - text:add(self.desc_def.getStatDesc(stat_id, self.actor)) - end - return text + game:tooltipDisplayAtMap(item.last_display_x+item.w, item.last_display_y, self:getTalentDesc(item.data)) + self.cur_sel = item end +function _M:use(item) +end function _M:getTalentDesc(item) local text = tstring{} @@ -781,91 +115,12 @@ function _M:getTalentDesc(item) text:add({"color", "GOLD"}, {"font", "bold"}, util.getval(item.rawname, item), {"color", "LAST"}, {"font", "normal"}) text:add(true, true) - if item.type then - text:add({"color",0x00,0xFF,0xFF}, "Talent Category", true) - text:add({"color",0x00,0xFF,0xFF}, "A talent category contains talents you may learn. You gain a talent category point at level 10, 20 and 30. You may also find trainers or artifacts that allow you to learn more.\nA talent category point can be used either to learn a new category or increase the mastery of a known one.", true, true, {"color", "WHITE"}) - - if self.actor.talents_types_def[item.type].generic then - text:add({"color",0x00,0xFF,0xFF}, "Generic talent tree", true) - text:add({"color",0x00,0xFF,0xFF}, "A generic talent allows you to perform various utility actions and improve your character. It represents a skill anybody can learn (should you find a trainer for it). You gain one point every level (except every 5th level). You may also find trainers or artifacts that allow you to learn more.", true, true, {"color", "WHITE"}) - else - text:add({"color",0x00,0xFF,0xFF}, "Class talent tree", true) - text:add({"color",0x00,0xFF,0xFF}, "A class talent allows you to perform new combat moves, cast spells, and improve your character. It represents the core function of your class. You gain one point every level and two every 5th level. You may also find trainers or artifacts that allow you to learn more.", true, true, {"color", "WHITE"}) - end - - text:add(self.actor:getTalentTypeFrom(item.type).description) - - else + if item.talent then local t = self.actor:getTalentFromId(item.talent) - - if self:isUnlearnable(t, true) then - local max = tostring(self.actor:lastLearntTalentsMax(t.generic and "generic" or "class")) - text:add({"color","LIGHT_BLUE"}, "This talent was recently learnt, you can still unlearn it.", true, "The last ", max, t.generic and " generic" or " class", " talents you learnt are always unlearnable.", {"color","LAST"}, true, true) - elseif t.no_unlearn_last then - text:add({"color","YELLOW"}, "This talent can alter the world in a permanent way, as such you can never unlearn it once known.", {"color","LAST"}, true, true) - end - - local traw = self.actor:getTalentLevelRaw(t.id) - local diff = function(i2, i1, res) - res:add({"color", "LIGHT_GREEN"}, i1, {"color", "LAST"}, " [->", {"color", "YELLOW_GREEN"}, i2, {"color", "LAST"}, "]") - end - if traw == 0 then - local req = self.actor:getTalentReqDesc(item.talent, 1):toTString():tokenize(" ()[]") - text:add{"color","WHITE"} - text:add({"font", "bold"}, "First talent level: ", tostring(traw+1), {"font", "normal"}) - text:add(true) - text:merge(req) - text:merge(self.actor:getTalentFullDescription(t, 1)) - elseif traw < self:getMaxTPoints(t) then - local req = self.actor:getTalentReqDesc(item.talent):toTString():tokenize(" ()[]") - local req2 = self.actor:getTalentReqDesc(item.talent, 1):toTString():tokenize(" ()[]") - text:add{"color","WHITE"} - text:add({"font", "bold"}, traw == 0 and "Next talent level" or "Current talent level: ", tostring(traw), " [-> ", tostring(traw + 1), "]", {"font", "normal"}) - text:add(true) - text:merge(req2:diffWith(req, diff)) - text:merge(self.actor:getTalentFullDescription(t, 1):diffWith(self.actor:getTalentFullDescription(t), diff)) - else - local req = self.actor:getTalentReqDesc(item.talent) - text:add({"font", "bold"}, "Current talent level: "..traw, {"font", "normal"}) - text:add(true) - text:merge(req) - text:merge(self.actor:getTalentFullDescription(t)) - end + local req = self.actor:getTalentReqDesc(item.talent) + text:merge(req) + text:merge(self.actor:getTalentFullDescription(t, 1)) end return text end - -function _M:onUseTalent(item, inc) - if item.type then - self:learnType(item.type, inc) - item.shown = (self.actor.__hidden_talent_types[item.type] == nil and self.actor:knowTalentType(item.type)) or (self.actor.__hidden_talent_types[item.type] ~= nil and not self.actor.__hidden_talent_types[item.type]) - local t = (item.isgeneric==0 and self.c_gtree or self.c_ctree) - t:redrawAllItems() - elseif item.talent then - self:learnTalent(item.talent, inc) - local t = (item.isgeneric==0 and self.c_gtree or self.c_ctree) - t:redrawAllItems() - elseif item.stat then - self:incStat(item.stat, inc and 1 or -1) - self.c_stat:redrawAllItems() - self.c_ctree:redrawAllItems() - self.c_gtree:redrawAllItems() - end - - self.b_stat.text = "Stats: "..self.actor.unused_stats - self.b_stat:generate() - self.b_class.text = "Class points: "..self.actor.unused_talents - self.b_class:generate() - self.b_generic.text = "Generic points: "..self.actor.unused_generics - self.b_generic:generate() - self.b_types.text = "Category points: "..self.actor.unused_talents_types - self.b_types:generate() -end - -function _M:updateTooltip() - self.c_gtree:updateTooltip() - self.c_ctree:updateTooltip() - self.c_stat:updateTooltip() - if self.focus_ui and self.focus_ui.ui and self.focus_ui.ui.updateTooltip then self.focus_ui.ui:updateTooltip() end -end -- GitLab