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
zcmV<E6Bq1>P)<h;3K|Lk000e1NJLTq002M$002M;0ssI2B@5<>00001b5ch_0Itp)
z=>Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX2o)AMAAF<qQ~&@IdPzh<RA}Dq
zT6ug`MV9_f-TU^ukdTEX0YV4~`x@CqK*Vlo6m7%}2XR5Lp+yvFaatR7T-vsoR#ddb
z1yn#5br2O55rqa>TtF6qBm@!ySziKqFK@Z`)|o%<eJ?KoWYL+P`Te?nzpSrr)%Tq`
zb?VglF7U7R&uvPxzgxRA$7N4#;Y?8!C1m(@ssHma5<1zl2fGGe<-O7^JjGgZ{D*3@
z&WW}b*Js^lNL>-C0+oeU9xSPBD6I*X*G4MpLX|ba@@lQTHd1jiSm&n`Qu_sL=z%*?
zZILcowX(HJSJN|<%yw#KrkdGN>Cnm6$&Ca6%!a|n1GRJ32iE@-0fq!1*^tuEI1B^H
zw${mst-%n0!a{|jLRF!tP!uKwBEtTYkrNT!U(YABu*On?H65Bt>K*%j3yIs?P9N$W
zVTaw$c0r0mu_ux@2`yUKS|oF_!U{<SGgyKpOUaPL5KMwWOc8{@0GLQf$Yy|>6OfPq
zfdB@`;=}}D{sI`#nGJ&}BB6i?5RwuoQP`5wIYX#|0KpJaBr0AAKqAlCb5O#i!ooxX
z7C2#0fc*prDFj0Rf`uRmiRj!W00xnX#DH-Y0tO6<f+mv##W|z-0RRROfulSb))#>!
zY-G19Hm~9|A9D(aS9lF+7|<9xn7{yt%`q9)OdNFr5{-s7(VO21XI}vWI%3wRM#qXm
zBoISV?0-ZA%V6YIJcYp@Hr0H#z3!``;Qq=`h57V7g}2=!Zp(J$bocZc;l2Ed7FQ)x
zvd$4QCn1;v#<?*!`hfM*f}=w}3xS{!B2W{%m?i)yYJ1Zp6!kD7p$c_b*^4WV{k<Ys
ze)^p%aVS`LC|J0r`n_5B-N3{lGty`M#xu6T2r!5&qmbpM7Vg+|=F$*>LL52^fp9oX
zCSSImC2DFC%S6_SJB53B*$eXv=Q3L!AOsCf9@QhEZ?-eHrD*AZGsynRNO@s!|Bm`C
zyZt)>Y&*H-=9636JKMj~{>_W*19a9w09z&}iKshSwzn(=5z@{^fDw-RWz>VBj?=gi
z0FnSuXH?$u&DF;mO3hD3rjNO?&7Bu}M@5W?G&BJc48af(LP8`7XB&rv_O5TqOBH`B
z3Ko`xO0GCK;<}bM{JrfW!_cDEp(fK=+rXj{L~{b7+20`qiK6C?;b+Tz5Z$YSly6UL
z7{9rniT;wb%hwLx`{&M!dbtPs4Zm)k4va>>U<QXdWJqINi<`FQ?OV}#O`1I&z)Iip
zt_M1vKwT^#SUWEE%?d#bPzb@Z5YRP_?f`29B1F-f#)ks+lj@~&c1|=M=DEHrp6T+A
zmy&hXtjFS)J?hf&V+3SikZb7vuBE?gbvJ+tt-Sle&SiR8G`cmJ4s78dhyVx9LI8lI
zkQLL&iZz7BC`2qa`_|0cb3cGoXRD8f9O&)2IKtt$h)dR@b2Oqf8rAX;bEu$fcr^Xb
z%R9XfAZ&#5i+a~_9he)pT4T(x_CuY1;_L)!wc2>*apoX^kA@FEx@#(cR_=^<27cop
zx7C%{qH6_LQiQ6KO(j)<O(7*3OX4;tNP|Ayb=mryO#mV?GVoA;RoJ2(sIk9!6ackc
zdzMWMAgtB9YzZ)fQ8bbY)Afazx#Ma8Zd<~l{EgN!F#xD!a|)+VKfXV(v!tP@JXBhv
zRcl62W6c4l+m_H;ZPUTgG1t+hkE_2^Iy4yp3}Rw%Pe-3s*{jDNy1G)Uy!H4kZ?{^a
zBVq-m=ngh_!iiH>;4}p4jM^l7o4A;1SwV&RQo)=C%@5%DeybI-gUL>g5Kewsz2+Y^
zYq!^JY|t9cC4X!0>@dPRYE0tTQ3+QVhR&>C=KR&&=`)|Ne0F8sifKvHF0$pD=}VKO
z1_&T<N~(HFd+ee&dnOHQb}$M?U8LgHjROH(-|?;~9p>6d{i15+du6ZhuKngrKr`L#
zJ>;p;tE$7*XG)c?OTOWEDR&RD4*_I$L1uZRJkya`npGN<LBa8E1R)gLLC4uwpgMRQ
zNsUWq#t=d38-<SpaH!5Ho#wt-{Pfb|7vgUVF4Y~>E%RTNHfB=m=>rpnL4uf7C}G*K
zw)VYek3CTmJYx1quzCDi0F0Hs<tu&5vz^%wr_Wv9Zq@Ljp-00<-wVD!+VN||!Y}|(
znSSha7C5C%=zQ<^ta~UfpJOoC825P&fDYcABlU%`&OMU)jcapTD`(s3-(L$L!RCFf
z$C^AxFM~BJ{R9anAt8VSk+87pxkrvX03gkl{$cLtD}Bpet$wLat20N-vS%GPj)#r#
z0QZ2cnOh?=L~$U$jeI+#Wa!zWP)(#<Kp>Wl0$}>=_)_!J82T$SCak*nyO(=^HZ<io
z(|2AAprt+a)BJr|jxHKU0H|d5C|<9U=oTJ9f`Nb$xTWRP6?q>4sM0EDluUgn?Xl9X
zH7m1M_x1Dxa5!=}Y=i-9Z`fWbE6^Ce0iet{%?g}`KvhGTLQ4F7Ai@p*RlG3PVRYtA
z9}GWmZ_d0VC0(-dOyT|J6ifPkDWDQqAzMLs&$NQ^UA{@k+Un@PGvl$c*<lWuSET{2
zp-*=BPXOEMzy3Jzf#2{CcaGSUwf*y)ue!Oq#b%jZGuuH<j-DqBF40QPi9lIHkwU8J
zIW{=9`#!#LeYf(4QUJM0J>R-y+r6FVImj)c6A+Lm)|I~xU|RMclay2fY{L0!`O`P<
zylj(iy{;Pod=cN0^4EIr%sdd<13<!<-17H1u3P|5l+Seu7Xv|V=xgh{Gi%RV?Uy)&
z1HfCgZ?`+rzRV~i5@1rG9Ecn^Cju3LGKCaowh8-Rf4u9d@1~jmpVjMcFJAOTOSQED
z1I%Dz;N!|==BKx0%rMWewZ7#G4*vx}iaqs#tjGVB_xf#Zr<p5x)&AiDt_P#R2+V0S
z7r@@Yo@2(*n3o4QFxEBJms>X>X##+wk)xf8J1=cmW+#UV^?-KpoCpA@(n=%TFlF<Q
zFORMU(6L3{J0tfFOB)w5g7FEejqKZMHUJo$dMQ`|;8NU=6wUyU=k2zsf6;`rDWejv
zoZa^E4ZU}n;p9Kc9#lvL_{zlJnsa^OU)Lm*5G2b*>5JF4Un@uexb@g=xBG5~5a+rA
z0JhhBa?4l!j{A=Q7}sg?3xhT~$P-QOVwVh3g<2fg51_j@UuO;AZ~dDhdIZ2<JHHV&
zLa{<Y8#VLpwzC1eU%T8TTmTd(+0IS?_J{USY@?c~D?>wMxMNs#r>d^bE&$%}EgE%f
zRJm4ut_0@qd@!Pi0X%Zi;#)gC8kWKMi?4ZIGQ(_xQ3oK+mS#R!+E8qcn&<2tMMPjQ
z^Pq%F02qdBpn8BL%T!xBfExCRSa~Y$7736Wu6^zH-JCQ5z<U4s(?S(Ledd2uvIvmT
zgtp1;-VC#X?Xd0{48U#km>0+p2O8}OW^k2JWj^fY1haF*2mx@AgPG$8k3}8=73qba
z`Pcmf!qXE-_p}+>W;B2u6&r5b)W24*pjfJGEdwzi*=Xg-1W*zv6i@)lPrSq&;q8i-
z%)`Wd$fG1ItauJU7f(0y0%<4vfyjOU?bQyFjJOPx&3mkqTq}Yra*A`S^eO-y9Uaeu
zKxN?g!+jRtoO>UDnqcJ}Uk>`Le2G)IquH{#hgsuD4{ttz&AxR`;R4u8$-`1F2k@6e
z54~Hn$gOzXipPLH`Ox^i^*;c(yUpy741wvO{$o%N0?2m{h+YyJ%Qj4WO~o}6%O(L3
zB);viqorthhGgmt?ePIid$zdb$CFzh+HsSa^K?$`Ik)E<DQasl3kd=V#@_mE_k4dX
zfH(WE%W-rUAcM70JG#X3qEvfYb;NR>U#E<Dt;5QQ45_R<R{r3t6$>Cx*F7ATVKdhd
zObPJ3+pucV(ObeY1faXK`&StoQj}CWD9&#W?5x=+A#=U?%SP_)lQtMYLGA8;+nE3A
zp+|^7L}s2fAZcVvX9|GF3ud|$514FhTi^f3{N%w_Y8XX7J!96wtd$`Sf>9@HU#(aG
zU`oogFq^4A>|{S;93E0S=*E)kP4s_Cdw5T~JqbwI6xwv=%I_IkyTt652W^RPh?$*=
z=b1fsZYWzFt8`4tzVGJt_o;@$EVtHu^6$Iv0B~oAd+*A8NS6^I$wjU*t!PW#hC1Ds
zW$XB>7FXKX0hWT{6prEh`xZ46065a4%FZ@7xeK)e50^jq@re&(06uK@;jbN+OBe)t
zsP<2Psd?u72mn}l`F<5n0L)w**gfm(vCTS+&Aj=#jHx|c1E=r(&E~500H$R<a9743
z!+L|2gaSem0g5C65JMsH+k%ll)b9lFdiIiW-s@MNT=`<v{O$g&@gqAFM<^#0HiE>k
z3s+uA?!j=ud56)B<*S+5EEM!e9BjHu=cMjq+f6b%d~kHh#BIZVwXH+fgg$PY8^D6Y
zPfy%CvQjT|3TLcxN&u1YDBcbJPkR5*-bCN8MgMgtK1tebn^Zi(MDJ9bPh>o0j(k_r
zU8Wa-s6v*X3H@1Cpl9m9C;PpxbHogtUsbGncK7`NULN>qrYn1S$qTDW7Y5I8hwSF<
zH6r<n&aSR*;i}Vod;H(6@vW+h)SbSwyZemPdvEvNF}-~1!kSkAROMEC*d>^V@qGP@
z_gBuo5CQ;Jjyj;i!2}`UR9q7_cK3y<)7))V4%(#|T7u%<Ui-zT6)QGWeGt@w=c{aV
za^+mz;@XMHw{}u;!ZLV7E6y+I4PaWz^m!@sn5AGi$kny9>;BOG3nVbP>qBEQCYu3T
zFpB&;@7s0_fH9dj&F=i1ZbSs2vg#4;;^4mT>i)6k<TnQzc9%39GGlzRmTFJUapv`K
z_Zj3FGTbw=B~l_BB9<h{MrzK%c0SGL60VxuS~d(bOdpj;a}MSHr2h1iEyb0#WZ1r-
z444G$aJ*bNXZ4ZA0A_Z5;+ph3q|^n3kSrhsLxtjiU4>17tTn2`kr1(=!rsE3n9MC%
zN-1?i>I5lRm;#K#>>}5Q;=$hsz5}o!dt-mKpTZ!J3T0;Xy$fnzIuDVrd9__{=$4wF
z>d3IFL@bA-jNVf7QEj+-YxNf??$quH7cm>e(ZUU2u&&F9&bp0lZsBnYk4w0PAvBKY
ztVxzcOl%z^1lWar%;C#+1hxZsw9Vt!dB#V}szQMnd+h3;MkvnesY?t0YA0u`TpW?1
z7yEyf=57OE-j8#hE&hX3xDZzfByeLf5YeI<HKuCdSgnTw>>pIv`)mIe0F%?E{2^(M
z&N^F_P&|8bJ{Uijz@C~NhXcF0F_$A|etY27jtRK{-Yt3K`fu`&Yll^`MH6nK7-C{m
zAZaX@M+FNHdEPtuPTszDg~0*<Gh5G^pSB>xp;#%@L5_#39zJiK__VDgc;JdQ6D8{e
zih2u;%eb>jD=DbodqS&SRrdOk@WCF5{ZrLehSWtg(I6%w5EFrgsR%-Ng?F9*<B5mI
zEv<gj9RIbfH>W4gh;Ya(>=O&Y^nCsNkL%Z-gNS@??dgH5x+LUBHAZ3PUUoQkocMh1
z-YEgiZ+6S|b{&&;!_cHr-JHEi5-}6A!io(_ko`OAH*Yxc={wbn1G-fq%=ZphoVhHG
z(kLcfnxZ8k;a~zY|6&AE-L2ogc$a2`1+$qZ5R<|nhMjE7%ASAa@Y9;nMD<Q_q$a7!
zF1YG(vNBT9?4aoE&U>`&Q={EihKyj;E|v~!hiyjH?-%+Oo|}w+&h7TRIpZ>>6H9YG
zVqpe5!BCi-<owe2!3Py@Z}NS9iWVBj%APtpdF-T?ll$89gEFA75CF*-0U^MLw4%O6
zea`tkg!5@{4cpODNsk47Vpu|$gn$stb~v2EQP8maP~gX7k<xib=0ajr@|XdMLpnRV
z^m6rWt7L?Y5TrB_6AJ<JaZ^weE^=fSWgUx@{f`jH@N`%_c!#E&j%1xgA}Y<tBzOV|
zi9{u_^9~nuJe~dWRmtNUUEKV|%1`47kOTJnt7g7j{nEKZ66ZyrEO6wxf?2Atp@|3>
z3y$VhoX=z@ib?a96iv-Uq|bw&o)`M_CIDc~k+(M0tR@nTT2WJ7KUP#gbET9S@k(U0
z<Px<)m8`ht$k_A6bKV31Jhp3UN$3FL^L=hY=Ty(6n7w1Cuz7ipmVu;@Lk<l9<9~wy
zfIGL1s@1CEmE%U0lF%e~INe&9E*BF*ZNfIBu)k09T>z2`B*4rQw_jW@>*CbxIPsBA
zfgh_JHhyHu*EV6h^ze|PaM6V!xj+H{!g}zgtpiRPzQ&hs;#4(o(~S^QhnZtiF@aT5
zFD)Lt%fIu2VO%%?03kg%{_DQSw8L>Kw^f&F`l3<vEtFV7YQDWh#=wG}yZyU<4u+pa
z0D#WMgl!jp@86`Dd0~7a9k&A9{QV88k`=x7<s1$b|4aZsmw@$3)2<udDu31~TxKno
zsJT<czxJcT_H}S$|GiyK=ygAT>R*NcfCWWQ-nnlK#hbp#9<TzFOSqn>_~T6lSN~G;
z{$d0GeCykM>9*|sq3>0w&GrB>2~eG^8MeRI-;dA#1t<L_2>=Kh!AUzuKUs30D%AKD
za4GI3zE=k9$~7yB{|}ni=3UzJQ`i7tdgkmLcOL%L{?-0Zw*Ll^;W;U=1cBlJ0000<
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
zcmV;!4?OURP)<h;3K|Lk000e1NJLTq002M$002M;0ssI2B@5<>00001b5ch_0Itp)
z=>Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX2o)AJB@Y2ps{jBGRY^oaRA}Dq
zT4{7uRhHgopL5?x2rmf<K>~y!3_=_OH~<1Rjx9>zSnaf2PK~8iPOa6BxXRMfUR4fl
zRW%l^qJr&+f>R+VV>E;S5+npjfJ}tU<Ry9U-m`cAIQPDnu0@ct2-0hLk{|D_`|i2t
zJA3-}cP_wB<EL?4j_Jc@y)kFQsX1r&_Jib6pD_~3cx3YY^M?PNgq}KVRwN}-yl-{y
z0T4%bx*Jb^VAhD6IyuUcSP)BMNe4Qs9{T9|j#%`#2Jp`#ue)Z<y(p2;VI-EsNQ|1L
zCP5^f-z@vrU3J@!M;AIj_v(3PzJ6NPbTI1{%#vAZ7R-tWnUO&9jPbKNbjz;V?Z=S?
zt{rpttf997B4ONYIU%t$7SN2$s96#VO_Eq@RJeZU=kq^)=C}YLQ7pZ%uAN(05G!KT
z-nxmpeKsz{N;5JG2NdjX*!I-I`;Qg?{K0o-g>!6(F&b~tjIISpXh32#zC?rsNFZEm
zkkCU0jCkyp=Mlw^44_{iOQQqAWE)0_8|zkD$^zGsT;~B~lAcWjF=`gnKRs*Soi8Bb
zj|#xoPYZ`6F_Mt5wEX2~SKagUmvb$j&)t5Z8JPru(16THjLgU;T2fOYkKg_Ke>@9*
z4*(^turKA%F(3krnuTUbfLwEM9{_CJxAy5T?zDW$4GGjBi6ke!vUH8WNGU0)*Ij;F
zFQ!o?<owBNZpwT7#PotTr?Dnl(f#VkjQrCFP9y2CV3N+nq0<j^?W=4ouWQ}6xn|we
zu@{mF3`v06+jxV78HuEh#tuIBU%z4I-U9H)sb8g810A;0eFLXuUw%>UbvAVFXx?nD
z?rkjtMJEm@(86XU2jUZkof~ypcJANS+}^OF^n(ebri4Oa5@z)pq*vV}F;X<v_V}~+
zI@<Z(B`PVYXOKMtc&y-+;h~cRxPJs%DeL6Ssk2Al;$YYIh7x8j-CwkH$E$<VbBCno
zIS_NeK6&UFeNy^tuKYUg#QwVJ143s^?#bOUEHjew%k33go_g^it@UBnJ$S_6DVI#X
z`d3$+KJ(O~&x=XZ-%$rH7;??+qn^=h0|Nk<gvh8FHAx1fxQH&;^4pa=KQO-^mO1*4
z=}%;&WH}-Z685x|J@w8#F}n)@5OGGq#ixv&m>$X0Xz#8nTUq$YuF4(e#yNAYX=-U`
zZfRm*5FAbkrDdiK%pEv*bPiZ-Q`|f>8jb$p)|a%Sj|f0tU%xk|mD&^+AOM&Fyeg{=
zSs>xCWTBuww)eT!_wPPXW^SA@e%8NCzEcaEghop&{PKmbN<QgngR`?wxc&BD2EqZ5
z1QvKDPm|D$4oPNoxLfo$R5$$Tu2+u8h2|B!-p|SsLNG7@xXD{G2u;f4m`H?9&=)#y
z>=h?u4B1?@-qB7)ec30Q77xlCnv<Cu=UD!T)2B_ikigmBRAbxmq;KTp&c5vG%jf)D
zD6?)RbVz6wRK;tH934+d53^*G-^}VsQZUV*lGdlZX!rM6pdjm<M^9R0bBvjV076Pq
z8q{tzO@3vP4hTlS_@AObF5R%mOp=##;%%2c5DbP%Xi#MNt#-S$Ia&__`e$Z>;<%1=
zn~=fc{k1g<UwXBnz9Azk{qE;~6?eJ_bpi%S%|fd%F1+jAJzJ{|XMv|Dz9+#FAOr|P
z_NLGtzh_Ej5@zF6$XYmKb55C(e|}l*me%&B#<l~Wee=H0Z;co-MhnM*xIhSoL&0!B
zgQLClYKVsN%cbuud27L<j%Wt}WDd$2RWMTckiGQ9$RLT4G&^}yh8Dh6(j$N~2FyG+
z`x*vj01ym{gd{*g=&&S~nvlUu<Q`$xED3}rB%jZJ?rF0kk+e<aUjsm-Z)E)F(+NHN
zsL3qIkZmMJ>Wp<f`{+|UO1A?*I3;}JgEvgOVk$@i>HX3xe}K%AWKc*c_im~=bS2*0
zwA#V|FaR>6-qO74XG`;5-u6g?U2Q2J3j#sprt`%15V>rWSn4j_5se)*v(5geYc)77
zgAl}$Kx#0b1qlU}mAmKN`*2HBGXR`9^NfH0^MeCN46vOzBfAO1*h;wj1xO_HnKzwm
z`P88Sbi_LkI`xLeNM$YB@p}OHbl2j!AD?&s%F8w#Smh7;-4z%k2(Nts*Qr3#J1brR
zfQk8Mhr(fZ{|q@rCP6GTNJ2|&-dOUd|9H_n_vQz0zVO-$;yUg{tw|Ez_PhV)iR{?U
z)Y~TX7z2|BU6SI9FtQf$Gje81AMS46s!2C@G_0-s?9;M0{XYMQ>=OwcuRIY*O-PJ{
z3Kp&Sb45)#0Ni!`!)OV{?w(+11*2cAS^4GLuP+9Glzx5hd-lG_z<yo};Ux@7;I-5&
z*+d{A2_XPP_Ne~rUMo2?fT`KD(?Xf%VM?j7{U=<RKX-8Y@Vbu5=8ndg6Wd(1{{4~#
z%95i7<tKQ7anS1Kir1FC2mt3#xom7+ez%^+`<Wz`dhedfh4cR#0J3ui-u2{N%8#Ik
z1%d1ywVIGX5r`y%0st#u6)!4%;};+HXo1T|-5OMVT+qlQwau}t)SQ{4ubMDyN~_&a
z-Mj|?wpEub+3+eVk(V>xgefZV$o#pEWA_QC%)Ryj!?eNMcoy2k2?@>^m|ncDsI#LZ
zlHPC9`4ctRgbdPj5nknz49J9@1(2j4tBUt8ym`rvH5G?Tqc@FvSbGmMSrU+0vIFsO
zAZ60<b7!73yWMHoQ(q1M+p9J&D_R^$P0t%L?zao?sc)(UfCp}W(jN?fA<~$@z#gSz
zTgNj8^)Fdp($><JJ9=o}{$WUDXA|*~88x{UV@7hioDYA!V%35oJLVj&ke!e+^rh)v
zc5#%ITfhk!q(hiUe3~T*gebSZT{!=%O)gVVN;!@L09Rgo!`THhG-?)_lp)e?8S<nG
zVyRU~J$v8p4%8mV8kF^m=WdVNF~cKRk@ri7kQucKiw%oPm%p&~h}h^QBX1lL$#;vC
z@kP{RLQp2#c0w%`<`17Z?bHiuTlVa4swE--m|QU9;&ZQbgzaW-!#G4T1`=`aP&_Lq
zvt-StXj^pfm_dEB`WXKKH{#9h+}_as+RaN!mzN)DKk(2Q^QBTk0!S7T0NJfv(j&tr
zq$H7GmX5NlN#m!D8+A(gzO5%@4Zh{-d*Zr_{}0iiWE<d861TVPKRCU#u(Z7`TD7D4
z%%4rrY<Ig#DkKXRmc0AWr=178j#O5O1T#iu<lA6_pnwR1uq>Yn1_OQ(wEX_mP$U!z
z_YI{*Qqv-->8PX@wgYhuHlbF26{8Msi6)u2T#^JODsi$gkSqhZ=yz|G7HtE7OMiLM
z*l8n45Gc)(+8Wy5y6>Z=nwDPFg_Nbz`(|dPWoKm!?4L2<)bSH7zm*h)3~}-TiIGT>
zhm9CD25{Mej|)HjCNbgt@6HtgP$60L_NLEYTJ?7eTSHQZ=ky%`Lb6~G%);q{j*eJI
z+>Wz|H+MA0oQ}?}&Yotu^!%&NIqSUcBAk~uH47%?u;4^Z07V;?7k{*1S@#(R49&d$
zKj*x8-v|4))%*};ZqArnE+2PiciIe+S+en9kPMQAf;OkIt*hxkTW!O^{RdiW>l&-e
zE5AD!Z5^63?4COwvpGh>3mB73&|%3*`YnltuG(Gw@}mommNMtEqNaE~3r7owg=Rq{
zGy^efW@0AN8h{8iBBu69@0*&Mi=zOwP_VIV{a+S8U%78Lqh{715~>L&<WWfEAE6y>
zFL?Zwqo|F#WUj7#k5FiMqQ_f2bv99qP_yu=x*(S12z%tP(PoBywUvfNx(Z5CL^0)z
z8MPHsuRQU($+<@vK+VBQl)_6F<T6c}&;yAKBX=)p*GUBTi$sjdSyfx<iCo_8o?r^7
zNf00xf3dM@SJly#*IfWD9nB<dx9*@}g6vu&!3~9}O`HTN$zeM)GaCRJn(B?MD4~J6
z0;92jCeZJ{wB)ECa3uSIUCmoru-QLyYktC`Tu-2+H@j_$MkgE!13+6_D=2VhkcqC%
z&@uuA%imnV0KEv{+q%MJ^C6O~FwtQo+=&yuBsGB(?h^)pxE%x8EoP+WY(g`#ZO7Lw
z`x<%`z{b6+rKJoF>>h%EB%}}$P=Qb&Bm*)?Hf;bP6B7Wi08W&!1XQ=RrPUv->!nl5
zWOG?o`)!n(8$0&5b~QG&A82=)+dHCKbagtN@p#PEHcBC+Komj>l;{gsQYs-ubyXDr
zgu@{c+O(r25}~3Q*$T?SrC;|t006k{<%@stM4=P|Kzj|E>pU#<j^c`V%sv(Xx(~lE
zkRHkK%ODHz`7Nasu_h*BA|fJ9Odx<*$78Y1uC9#i4DO!0Jo*U|O4ohYdk5V;0+=!3
zqRY;?o`ho>fNp9Wfsx9*CIJ*1itj)?k$j9O0>}rO+qSOyF#u@Raq1)_Ce1=KGn2!D
znH-j&B*vUr#jc(8`|DcUT3AqeR>tVlM*36zL?-!=6;kUy{QA?Em-p(s5<LRw+b2Ru
zAQGw$fdb2~%667*`L?)p>$i=K4S##jU*M!O^Dn#O60o4PzIE}xy}N%;eQ&?)(IbH2
zgY&>}W7NKYuWa|0!s0a>iVOedR3Z=zq-CTrb8S^E0Bl~jrM|X4C+~!BJ}W*puf-f1
zfRs3Fa9*d5f*|EnPyXS-s_MPT-YqRM{?wE5#^ntgJKPFN2W(Suzj)`16>qPst*EQ5
zs5@rw^&A?&DPt$aIR=7BvZmN+r%bG>-kYADQ8000!C8|cnUR>&Nl1iFmu)j@0?kZQ
zuQ;o#vvb|jLO6z_$CmQ>c?-=sHc6*59_@@r`)6mybZ57gh1qMhND`nX)aVoQW<UK8
z9y}hMQ%dENxw#_@JCJ_q5BVH$On&UfNnITQ+^&}xsq0`@b$RVE1JL6^_p-mfCnR{i
zNRri&^b|jlU_P3pD`Jw+<ED>3mM+vI03!N$`FlcgHxjDN(R??>)6>5Mk<@?$l7~$i
zERObzU_V?|dHR{>5=V&MqKTEEYssS*umCMlv8A%Cu>8BV<!y}zj~4)^6%<@`!*veC
zlNRt?pHPEj6~vt-J2$S_{Ozi3@M8>h_{+sbMQ2T)JYYz6Le?~FM+Rg|UDMi+))y}?
z(WK$W8{hA&fnea#=bj+2&FPp5;HEX3)-GLFU0DOi!8oF58##95&A-02E8emC<5eq{
peCgN@{J$HyqlUsy<EL?m@xLIUnak3<DU$#I002ovPDHLkV1lAYqDue(

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