From 7d959f63db58dcc5321bbbc65ebc0d69b3ad6985 Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Thu, 5 Aug 2010 16:34:38 +0000
Subject: [PATCH] Implemented Body of Fire for alchemy

git-svn-id: http://svn.net-core.org/repos/t-engine4@986 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/engine/Game.lua                          |   2 +
 game/modules/tome/class/Actor.lua             |   4 +
 .../tome/data/talents/spells/fire-alchemy.lua | 106 ++++++++++++------
 ideas/crafting.ods                            | Bin 23253 -> 23255 bytes
 4 files changed, 78 insertions(+), 34 deletions(-)

diff --git a/game/engine/Game.lua b/game/engine/Game.lua
index 85a9ae52fd..18b0bc2578 100644
--- a/game/engine/Game.lua
+++ b/game/engine/Game.lua
@@ -52,6 +52,8 @@ function _M:loaded()
 	self.key = engine.Key.current
 	self.mouse = engine.Mouse.new()
 	self.mouse:setCurrent()
+
+	self.__threads = self.__threads or {}
 end
 
 --- Defines the default fields to be saved by the savefile code
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index d36058be7f..b3fa3ae119 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -178,6 +178,10 @@ function _M:act()
 		local t = self:getTalentFromId(self.T_THUNDERSTORM)
 		t.do_storm(self, t)
 	end
+	if self:isTalentActive(self.T_BODY_OF_FIRE) then
+		local t = self:getTalentFromId(self.T_BODY_OF_FIRE)
+		t.do_fire(self, t)
+	end
 	if self:isTalentActive(self.T_HYMN_OF_MOONLIGHT) then
 		local t = self:getTalentFromId(self.T_HYMN_OF_MOONLIGHT)
 		t.do_beams(self, t)
diff --git a/game/modules/tome/data/talents/spells/fire-alchemy.lua b/game/modules/tome/data/talents/spells/fire-alchemy.lua
index fa05788054..2db3bc60c6 100644
--- a/game/modules/tome/data/talents/spells/fire-alchemy.lua
+++ b/game/modules/tome/data/talents/spells/fire-alchemy.lua
@@ -83,43 +83,11 @@ newTalent{
 		return ([[Throw a smoke bomb, blocking line of sight. The smoke dissipates after %d turns.]]):format(2 + self:combatSpellpower(0.03) * self:getTalentLevel(t))
 	end,
 }
-newTalent{
-	name = "Body of Fire",
-	type = {"spell/fire-alchemy",3},
-	require = spells_req3,
-	cooldown = 20,
-	mana = 20,
-	points = 5,
-	range = 1,
-	action = function(self, t)
-		local ammo = self:hasAlchemistWeapon()
-		if not ammo or ammo:getNumber() < 5 then
-			game.logPlayer(self, "You need to ready 2 alchemist gems in your quiver.")
-			return
-		end
-
-		local tg = {type="bolt", range=self:getTalentRange(t), nolock=true, talent=t}
-		local x, y = self:getTarget(tg)
-		if not x or not y then return nil end
-		local _ _, x, y = self:canProject(tg, x, y)
-
-		for i = 1, 5 do self:removeObject(self:getInven("QUIVER"), 1) end
-		local power = math.floor(4 + self:combatSpellpower(0.06) * self:getTalentLevel(t))
-		self:probabilityTravel(x, y, power)
-		game:playSoundNear(self, "talents/arcane")
-		return true
-	end,
-	info = function(self, t)
-		return ([[Turn your body into pure flame, increasing your fire resistance, burning any creatures attacking you for %0.2f fire damage and projecting randomly fire bolts at targets in sight.
-		The damage will increase with Magic stat.]]):
-		format(math.floor(4 + self:combatSpellpower(0.06) * self:getTalentLevel(t)))
-	end,
-}
 
 newTalent{
 	name = "Magma Pool",
-	type = {"spell/fire-alchemy",4},
-	require = spells_req4,
+	type = {"spell/fire-alchemy",3},
+	require = spells_req3,
 	points = 5,
 	mana = 80,
 	cooldown = 15,
@@ -152,3 +120,73 @@ newTalent{
 		At level 3 it will become a beam.]]):format(math.floor((3 + self:getTalentLevel(t)) / 1.5))
 	end,
 }
+
+newTalent{
+	name = "Body of Fire",
+	type = {"spell/fire-alchemy",4},
+	require = spells_req4,
+	mode = "sustained",
+	cooldown = 40,
+	sustain_mana = 250,
+	points = 5,
+	range = 1,
+	proj_speed = 2,
+	do_fire = function(self, t)
+		if self:getMana() <= 0 then
+			local old = self.energy.value
+			self.energy.value = 100000
+			self:useTalent(self.T_BODY_OF_FIRE)
+			self.energy.value = old
+			return
+		end
+
+		local tgts = {}
+		local grids = core.fov.circle_grids(self.x, self.y, 5, true)
+		for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do
+			local a = game.level.map(x, y, Map.ACTOR)
+			if a and self:reactionToward(a) < 0 then
+				tgts[#tgts+1] = a
+			end
+		end end
+
+		-- Randomly take targets
+		local tg = {type="bolt", range=self:getTalentRange(t), talent=t, display={particle="bolt_fire"}}
+		for i = 1, math.floor(self:getTalentLevel(t)) do
+			if #tgts <= 0 then break end
+			local a, id = rng.table(tgts)
+			table.remove(tgts, id)
+
+			self:projectile(tg, a.x, a.y, DamageType.FIRE, self:spellCrit(self:combatTalentSpellDamage(t, 15, 70)), {type="flame"})
+			game:playSoundNear(self, "talents/fire")
+		end
+	end,
+	activate = function(self, t)
+		local res = self:combatTalentSpellDamage(t, 5, 45)
+		local dam = self:combatTalentSpellDamage(t, 5, 25)
+
+		game:playSoundNear(self, "talents/fireflash")
+		game.logSeen(self, "#FF8000#%s turns into pure flame!", self.name:capitalize())
+		return {
+			onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.FIRE]=dam}),
+			res = self:addTemporaryValue("resists", {[DamageType.FIRE] = res}),
+			drain = self:addTemporaryValue("mana_regen", -0.4 * self:getTalentLevelRaw(t)),
+		}
+	end,
+	deactivate = function(self, t, p)
+		game.logSeen(self, "#FF8000#The raging fire around %s calms down and disappears.", self.name)
+		self:removeTemporaryValue("onhit", p.onhit)
+		self:removeTemporaryValue("resists", p.res)
+		self:removeTemporaryValue("mana_regen", p.drain)
+		return true
+	end,
+	info = function(self, t)
+		return ([[Turn your body into pure flame, increasing your fire resistance by %d%%, burning any creatures attacking you for %0.2f fire damage and projecting randomly slow moving fire bolts at targets in sight doing %0.2f fire damage.
+		This powerful spell drains mana while active.
+		The damage will increase with Magic stat.]]):
+		format(
+			self:combatTalentSpellDamage(t, 5, 45),
+			self:combatTalentSpellDamage(t, 5, 25),
+			self:combatTalentSpellDamage(t, 15, 70)
+		)
+	end,
+}
diff --git a/ideas/crafting.ods b/ideas/crafting.ods
index e67c3b641c0a07d7243a60f88a2b59c37f3a0cce..fdce4f767aa8c74e627edf91bcf67f4fc8246c39 100644
GIT binary patch
delta 3444
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

delta 3380
zcmY+H2Q(Z?7snA2tQM;iecvjNRn}rzEqFv*WvyOf1yNr@)YuR$qOH~93$kjWMi8Rc
zNYoWXkBBEE%Cbsy-}5BzeBYciGyj=;&z&=8=KSu=L>=XL9VHXe;1V?(#d-M_v#*L{
zLQ<dicrc|PE|TpZjmtK_=(ps4*`OD~krMXPB8YFcqG$NONLzw<5+&<}BMp`EKcYs9
zYK|Mb`(qi#B0=6^oC0rMS~GOjo>3vFm_OkZ+=cZiuviBs>lW$h0_^5mkRMoHjeP}t
z4IW`D+km|{{H}&j2*@wU_Q6=L(!<0v@n3WkpP|afvRH|R3ccody@Qwlx3Z}j;aBCi
z)_J-~YHe?f%|3)bJ=5i?>u6ryl$ooo*?f(4h2LJ5{fwG)e*5lpE_l3TWIVU4^ya{Q
zjqu2{!e^X<MdQio<FWn|=q-2JFo7;;i)w*n#z^`-+*z3I+7n2r!PqgG)b*buSKU#H
znA4ZfHO2e5Mqcjq%L^3qC)_XXl4LHjmiXa>BhX?Zeh{HeWZ3Oxgf#l5-MEA;KOUye
z2SI~8B84_bm7}J*u7^mBbvde$Ij$zu2qAiNkHdD)kOo(1p+=eM3p^AQ(-o8y7iUCE
zLHo}c;q9;SVds*b!q{3#=7N^-tS=IrQwN8P?^)HA=G#G0X{WQH9Ws^-y04#1y?4zk
zF&PJctM1_Ea>@|(9@U-FoANu(5x_2gzH8{?LjrtVk4s6*<W;wcYW<@xs-$*6@wBR~
znZfeZ`*@IXSS~vypby_DSVUh4mk~xFrI#A5XZP#GuoHX+5)&ZlIJ+{;prn~iQ2=KP
ztdi%EEDSyOplLdOw(LzG&&+5~;5LHS53Rx;q>i?Bi5RU6dAlqzZ@__3)eACp)-lO%
zaH|cg->ScX@{HO$I=Ok~-=UL~zq;y)v9xc0)P<^Zx}5%7oJ@X>KAV&<rkchy$R~_v
zhVex?_OXiaE%S%${FpjcZ7S;5Wvh2`36;iGt@jSrzE3X!p<vtJZ%sU*{9&-<0dKR&
zEw-PdDqGhMN3SUSp55kf7E~^2I<Q+*jVNW+{QJUq5$*2}y#b&kp^zrJK<=1f<o2v4
zX}I%8q=Ybh^RM4kJAVH&Vf$tRv|Wdmg>vd!Dz@I8pos7|V5KwrlVB$}b=<`?X$^;X
z#N_a5^hH;*xa%yIc~X9>r}sz)%zH8q4r#XRxP(f$@frWc02bBL@5F?SHX9kQDGbAh
z63=p;WgYOdHPW!9T}vWYmO9YgF=N$?2zpauw#UMbqD%YA^iaB4S`AJ*3@t5WrRMzP
zi`8}_x!LvMH24?d`#D7>Z!LtyU3sCmg-mdduebaJRcy*k!!+FT?yt$1u`)8CW$n!J
zUHHQkN%yV<$;MNpkWQrPqPkRaXAzQ|fU^2*_xZNU7}ev?Ptlq;iaLunYEw@83zcrK
zw!$o+N2{)gMbDW2=C{i4<eaJLstiC*@>t0HVM#n?8d$nS&h6#L-00S}wt9mK*CsP^
zDg$C=Gy``Oti~7A{n%DM+&}vdGUq(B<%PFtOCikggzXS4San~*ottQe<J&RIzTS{R
zyXf9sT!S0aYS#|ny2~D2rbw9UO_E=Mhwz!^|7NbqV6YMvbWee^xpDyMRxaY^fXy^s
zdxOa8bzY18k|gh0=BULnBVMpSJb&iLVUo}-0ua#3Qb%nUr*X$tFADc-?JLh=WLn=t
zlICM_sn8oV;^xx>rYZxs$@}jM>{=!pI=fIkHm@H#IOm%TjBi)<oJ2(3m)gJ<HRR<%
zHgxZ15d^Z0znCyny4xH`;g$msSVh_fz&+xR&|)P+b#Ky$g|jZubNIok9Ei#%viqi}
z8#L#^nnx*wufZ~mY9u57&)cW#O<a3XUv0CBgseSE=+xW2t`Ct5Ccgp8AozzhYjzF}
zSIgD!9U~qo%O7#m3&{p^>p1`rJ+5PnvVLuXR(Lv+6Wxw$mOi=NpEgYZo9J^)&9+bp
zRR%Un5J<b!2hC=u7E56^a<;k!$@yc&E=)y{ih(B-No?0n1C$t8a|U+S3#5G-(4(R&
z%tz_Da@=a0HoJQ}jS|9GYAC}EM{DOxnjPju7hz;z?^7@5z+Sp)aKBRQPL8OdK>rMk
zZsE&!xk$qNyXtq&k8p-q$WC;A^pB!IJMsG>Oml;jMzLdW$=sb$o<n*GCqYC(fc&fa
z<J4Cr=#2)wUB%aaS1T>`7oGs;nrH`;H7%69)fTBlZLAfZHjl118?K9o<Dw3e7fT*K
za25hTG~-^|#Uc&PP;dDwy`aH2>i{$vLs6<sdb-c0a(JB^NuBSoniEk1^I5}RQAf5u
zbRNX5_4Rc|IQ#3=?@>|s*;Uo)3?mRjVXWq;XTzVL=2u#3nc-`<f*y;kR*CRNIT`Kh
zsq<3tZ0@tv`OcU`xn<ciW!258Pk0+%*@?h}Ci6bcj}H(U+{RO0MVKIP!Li28T{1eq
zElXs5<P(#rQM41oc8W1{mN^{^BxepIgQ9B-6SXca`XYE`v;`_YW@fIg^wA(J)lT-+
zY>k4S1E8E4`-hDHFU%Qoov>AZE%B_^?wIqO@_=ECcOwl2#UwAqPs;zw#I6&oB8=1&
z6z7%p?@4c0e`o0+Z!cB#zZ=0CFOe^ljEYinPzzZlxPk&)RuOLt0$owmla(=&RmR7H
zq^V)bst`N@#8xv1dP#Yaej~tE;ujft4#|)8zB{eNavI(ixfR%Ho2{Z6!9*}xke<NE
zyr0|s&r43C_Qw!W?%2~qyzIsU7jROwO3ueTt{w7PNZnC+?T4i!aHaxGP*g`v2JYrv
zKsl=$OCE1;$a7RYlljDqZR%c1opyq|A4&U-r#(yK7v>FtXWkk^$b@wmiKgDb139sU
zFT8+=&s)%KzuGrIjyhG@K7lK5ZN!JY>LLY|03mK-mKDZr^S<jLiv$=MWWU7Do~Xta
z9XC%M4HS00*V(wf7c6<`3*EcHpH=M1;G)u<r`|jZhzrlQh~S+ruJ&a@@p9P|z9F!L
z)nwyfq@bZo>HZx~q7Mc}<i8l#?PC4GOMP6gA-2PspQytw8K4-+>SLy>&=sGmqtIo{
zJ{@r!j@mVD8YO-0@ont(G}~wgD(PFZ6jpukN!o){4;IK$n}Z3(7FtaYWEoWM+TH{!
zP#di%gQtb7#6wh<fDOUNzH5L-Uzk9s>60^~nt--RIKRkQ=64Vc!Y?us8?IAHTcfHw
zKEI;z;n0%}9Hd06vtCLBPWN(1$ZIk0R#9Lvl8q794ih#}F~N6wmt}*>eczX}cMZJ~
zThgArGo_;2qE$qcy1Ea@SD6qi3h}2s)X2)yPJG^o9=nX85ejXM3pZt%wQ<?hCyIJP
zSh!hy7}7U|t|=F7En#rj9wLzCajMv1vs`>7cjK*<Y=URZDTsSIq%a{}dxXa1y0X||
ze(_3nzGr-;_~As+%G(M*jkN1yG$PVhOatk)CJgQ60|v(w%+KNsbH-aFZ!R-d*axc=
zgoo>Gf`KVgDb+MrpZwrx*`6LTzE_KEPp2RUfd!kH`|mV@oaMT(tK_%?DyqQ4{`$}W
z{^Q~2rIFGc@l`^x&s{KLtVD(`jqm=DkhzVf$daCdfQohrpm5#y)_ylG!v`x)Rl0F?
zmyy}N5*m4ZwvMuW9n*~f%!f$K7b%^%o=1wk+&KDFfW0n8r``NbTTF#vCqtnFY3+`F
zlYL4=>gG4wE#LxH3cEmLOb4Mub0bP59mfKM_eX%~A2Vh=Bc6swlj^~fjvXb;DbL7l
zui|*ZG&^a+`|m!6`yOM07h}l1p~FJ-ub3-a;Gl8w7smSP0XIU7KD<LK{Wh@oq&S|u
zK-zIeVSC+9z$bh&eTf8@F_Vv$9NL{d2kcAQUfUXps>xVy5-5&Y8z<KaJEEIYh^GnQ
z`@E=dwcAq2AouXuM$BfqNiOH~9w@@KL#v(Z1Q~w$`);|@E{^s_P%3&Ga>QOPHsMj;
zuo(8&(Bo~BxyqK?6G2P8D<M>vcdSJdTE%1tOPFX~1u4u&GOy4g*g#w=g;7<zD#G_5
zi%>4SpzUOv;Tf^PXII5z%p+U;!$Ii9@uSDG3$T~;dyaZfpM2sIa(mw{(PeCY;Cx1$
z`Cy!p!{xw&3!ZdGg#I<x7jmk0EO3r6B?C{O>feykfc!$(uZL<43Kf3=9{i%^&%eVl
zng=hBmbieBGure*Bw6v`iD<El!7*C<LTFp*{xWO*5<K_~tDk;6*7|hkf0ch;%6Knp
z8G-ZB{}Pq{9H##kV|<e}H|@F4Ia~3w*3uV2nQXKe&u9PL2;SaC>gRekJd`^47dB#-
JM=a0d{1?zVQKA3<

-- 
GitLab