From e107825b7ed7cefb3160a160b88dd570d06186d8 Mon Sep 17 00:00:00 2001 From: DarkGod <darkgod@net-core.org> Date: Thu, 4 Aug 2016 16:12:23 +0200 Subject: [PATCH] Infinite Dungeon levels now can have challenges. Each level after the second will have 30% + level chances of having one. Challenges can be a range of different things that you have to do on this level. If you manage to do them you get a random reward, which can be a randart, stats/class/generic/category or even prodigy points and perhaps more! --- game/modules/tome/class/Actor.lua | 4 + game/modules/tome/class/GameState.lua | 133 ++++++++++++++++++ .../data/gfx/effects/zone_aura_challenge.png | Bin 0 -> 5934 bytes .../modules/tome/data/timed_effects/other.lua | 19 +++ .../tome/data/zones/infinite-dungeon/zone.lua | 30 ++-- game/modules/tome/dialogs/Birther.lua | 1 + game/modules/tome/dialogs/QuestPopup.lua | 5 +- 7 files changed, 178 insertions(+), 14 deletions(-) create mode 100644 game/modules/tome/data/gfx/effects/zone_aura_challenge.png diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua index 30dd3be1fc..6456635617 100644 --- a/game/modules/tome/class/Actor.lua +++ b/game/modules/tome/class/Actor.lua @@ -3148,6 +3148,10 @@ function _M:die(src, death_note) elseif self.rank >= 3.2 and self.rank < 3.5 then p.all_kills_kind.rare = (p.all_kills_kind.rare or 0) + 1 elseif self.rank >= 3.5 then p.all_kills_kind.boss = (p.all_kills_kind.boss or 0) + 1 end + + if game.level and game.level.data.record_player_kills then + game.level.data.record_player_kills = game.level.data.record_player_kills + 1 + end end -- Ingredients diff --git a/game/modules/tome/class/GameState.lua b/game/modules/tome/class/GameState.lua index 4fb65d4638..9f14949e24 100644 --- a/game/modules/tome/class/GameState.lua +++ b/game/modules/tome/class/GameState.lua @@ -2463,4 +2463,137 @@ function _M:allowOnlineEvent() end function _M:infiniteDungeonChallenge(zone, lev, data, id_layout_name, id_grids_name) + if lev < 3 then return end + -- if not rng.percent(30 + lev) then return end + + local challenges = { + { id = "pacifist", rarity = 3 }, + { id = "exterminator", rarity = 1 }, + { id = "dream-horror", rarity = 10, min_lev = 15 }, + } + self:triggerHook{"InfiniteDungeon:getChallenges", challenges=challenges} + + for i, c in ripairs(challenges) do + if c.min_lev and lev < c.min_lev then table.remove(challenges, i) end + end + + local challenge = rng.rarityTable(challenges) + data.id_challenge = challenge.id + data.id_layout_name = id_layout_name + data.id_grids_name = id_grids_name + print("[INFINITE DUNGEON] Selected challenge", data.id_challenge) +end + +function _M:makeChallengeQuest(level, name, desc, data) + local q = { + id = "id-challenge-"..level.level, + name = "Level "..level.level.." Challenge: "..name, + challenge_desc = desc, + desc = function(self, who) + local desc = {} + desc[#desc+1] = self.challenge_desc + return table.concat(desc, "\n") + end, + on_status_change = function(self, who, status, sub) + if self:isCompleted() then + who:setQuestStatus(self.id, engine.Quest.DONE) + game:getPlayer(true):removeEffect(who.EFF_ZONE_AURA_CHALLENGE, true, true) + self:check("on_challenge_success", who) + end + end, + on_exit_level = function(self, who) + self:check("on_exit_check", who) + if self.status ~= self.DONE then + who:setQuestStatus(self.id, self.FAILED) + end + end, + on_challenge_success = function(self, who) + game.state:infiniteDungeonChallengeReward(self, who) + end, + popup_text = {}, + } + table.merge(q, data) + local p = game:getPlayer(true) + p:grantQuest(q) + game:onTickEnd(function() p:setEffect(p.EFF_ZONE_AURA_CHALLENGE, 1, {id_challenge_quest = q.id}) end) + return q +end + + +function _M:infiniteDungeonChallengeFinish(zone, level) + local id_challenge = level.data.id_challenge + if not id_challenge then return end + + if id_challenge == "pacifist" then + level.data.record_player_kills = 0 + self:makeChallengeQuest(level, "Pacifist", "Get to the end of the level without killing a single creature.", { + on_exit_check = function(self, who) + if self.check_level.data.record_player_kills == 0 then who:setQuestStatus(self.id, self.COMPLETED) end + self.check_level = nil + end, + check_level = level, + }) + elseif id_challenge == "exterminator" then + self:makeChallengeQuest(level, "Exterminator", "Exit the level with no single foes left alive.", { + on_exit_check = function(self, who) + local nb = 0 + for uid, e in pairs(self.check_level.entities) do + if who:reactionToward(e) < 0 then nb = nb + 1 break end + end + if nb == 0 then who:setQuestStatus(self.id, self.COMPLETED) end + self.check_level = nil + end, + check_level = level, + }) + elseif id_challenge == "dream-horror" then + local m = zone:makeEntity(level, "actor", {name="dreaming horror", random_boss=true}, nil, true) + if m then + local x, y = rng.range(1, level.map.w - 2), rng.range(1, level.map.h - 2) + local tries = 0 + while not m:canMove(x, y) and tries < 100 do + x, y = rng.range(1, level.map.w - 2), rng.range(1, level.map.h - 2) + tries = tries + 1 + end + if tries < 100 then + local q = self:makeChallengeQuest(level, "Dream Hunter", "Wake up and kill the dreaming horror boss '"..m.name.."'.", {}) + m.id_challenge_quest = q.id + m.on_die = function(self, who) + who:setQuestStatus(self.id_challenge_quest, engine.Quest.COMPLETED) + end + zone:addEntity(level, m, "actor", x, y) + end + end + else + self:triggerHook{"InfiniteDungeon:setupChallenge", id_challenge=id_challenge, zone=zone, level=level} + end +end + +function _M:infiniteDungeonChallengeReward(quest, who) + local rewards = { + {name = "Random Artifact", rarity=1, give=function(who) + local tries = 100 + while tries > 0 do + local o = game.zone:makeEntity(game.level, "object", {random_object=true, properties={"randart_able"}}, nil, true) + if o then + o:identify(true) + who:addObject(who.INVEN_INVEN, o) + who:sortInven() + return "Random Artifact: "..o:getName{do_color=true} + end + end + -- Fallback + who.unused_stats = who.unused_stats + 3 + return "+3 Stat Points" + end}, + {name = "+3 Stat Points", rarity=3, give=function(who) who.unused_stats = who.unused_stats + 3 end}, + {name = "+1 Class Point", rarity=5, give=function(who) who.unused_talents = who.unused_talents + 1 end}, + {name = "+1 Generic Point", rarity=4, give=function(who) who.unused_generics = who.unused_generics + 1 end}, + {name = "+1 Category Point", rarity=30, give=function(who) who.unused_talents_types = who.unused_talents_types + 1 end}, + {name = "+1 Prodigy Point", rarity=60, give=function(who) who.unused_prodigies = who.unused_prodigies + 1 end}, + } + self:triggerHook{"InfiniteDungeon:getRewards", rewards=rewards} + + local reward = rng.rarityTable(rewards) + reward.name = reward.give(who) or reward.name + quest.popup_text[engine.Quest.DONE] = "#OLIVE_DRAB#Reward: "..reward.name end diff --git a/game/modules/tome/data/gfx/effects/zone_aura_challenge.png b/game/modules/tome/data/gfx/effects/zone_aura_challenge.png new file mode 100644 index 0000000000000000000000000000000000000000..fbe56c3cbda0e5bf317782a12d51ffae7e679188 GIT binary patch literal 5934 zcmV+}7t!d6P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00006VoOIv0CE6w z0CJNrr2YT^010qNS#tmY3ljhU3ljkVnw%H_000McNliru;0Oc>Ff$6p0p0)r7Q0DA zK~#9!<(hfCT~(FmzkBU{&bjx#DeomAK!7k41`!#`780cZaRAgX#8^Uo1WTHd(vNfv zG}tIkl!fV{KV?};RktPDRw+V>C6frP0-q|dL9h)n1u%pRkK`q9y3;v(=s(UmcX&xK zSg}6Zz4N(w_uhT>I%{6Pwa!%s9B@FOXNd?=6j7;Eh~pR$Apju+ymMG<vDV_eM~fgL zD5c1<j5JM2(-eRtNifDBB3Nrl(-iA0MjPTdCXQpg_cR&}TCEn=T8uFym4qZtFh-MQ zmUg?1wHEI^-upg2wblTgYm`!Gt%;(jvzMkR&1RE!yN!rYNfP2DA&z4JOcce0kP~;# z;hf8bEj}A#IyWu94<SJDUMWQgfe-@DIkGJ4XH*HkpiiM{??bMTLNRHY=5&GB#}FX+ zenCYf=K%;k^j(ipj5bKrRg6OAN=*{92+n&{Nhbu9QW#@2)`kwTlKGNo6h$bd@FAdj zJS7zWJLeFQ;;ic^F3YkG<KBmkFiI($v$WfeEKA9<tSf-`v<k0^Rj!Eqyzelq0JJWQ z(G}iW+o7*iE`F&T040J}T?tBWF<F*%tQSJ)xSQ6xBTTtp9y%(HdDeTJw>TH_8*2rq zj-}2P;rqq8&J9I_qVP1^=WX75(lpJjBAOv!p;A0o7{z;!6w2u?#Zkaxs(atuI~6|o zj$%p=E%^`;L>HdbY&L1NT4ZU~vBq4NZnayq+wG2fZ}y(6LSVppvMfL6tV03D<njHm zF<e^;7fOHWhR~4r{6UmkxXcwD@3EGvhEkr%GMxALLJ6gD04^F;{PE$!Q^k3$HChXW z@q1h~^jW<(q?A&adcBS+Tx0IvJU4)MzN<MArh#u0_@e;Z3H*2ONxk3|#Wk8)B?RZV zI0U{N0-+No9%miz844UcDn#ogkKH0!iU^-w9C)&x(rQt-w1Of8&KvcdvQ*=Z@TU)k zzGSGB>cn^{14Y<qQJ{p#7(^+&^LXbmrQ2x{v@xB7rKLg$2%rlqQ6!-?A+V2v<3#gk zz^u3Yl?QJOO6ArV2M$uO!g+2jV$nH=cb>zVo*B`+R%?D92_`aFYx(#ns3>s%c8m26 zQMskwd7$FdMc@ti09QY(5G8#cRK73yFY`{H)dA-{)~0ytF~%4as)z{%NFlf<gj|zB zsZPevvJ6{%zEgxHB8&+nKJYQ?Xl5B-6=6Gyf6<!rYL27Rz)xob&ldFFM!*pmnF^d= zh0mZ17uGBq3n;PtTs#s2tA-V)o+QLZ!FFM|rC9w_@OT2DFE5nuop+RlLMiFcE)9@n zZPK(zyaTmb9%sdgPN^dxs_RZ=g6vHwBElErm}?Qz%u{!cL8Z9TS~hFLFSIbM6{_ZV za?<5lR}9M+Dni@Qa2^R3<At>Fys7mte+jIb56h2$B!PBK(F}&#zQP@kz?u+%(3c!b z0m~5c-gfrpCff34twk?fu;5yh!e*AtW_e~-0fj<|>bO_vxuLTTA1oo{H~e4DvRq}P zt&CKAW(Nb+MZ%#K&!D%wxZQGp>WOs3(j?~i0fVY45^?C*ap-K|VH6=Kp7f44Xv-3p zq1R<(vw?;Zgor0L3SZx(I?1vZZ<NMM)0C{h6}^h-#S0~H0x(JozU@h~ly<v~QYuG) zMmh;7gh2460xZs#UXXS&?Khm`+##@lsavv*j!iYq_z--0HsmpAgbN3S*c&R1Ks!sZ zHn9KR4!236wBkkQX|^r2Q@pfbR?zF9JrMKvTQ#c35M6InfG30kh*^smgEqQ@S;{ls zdxShx1TYj<wAPYkS)N3cLL{&2*4mD?%U5qXD%Zo_v)^_&4KP@clxR$7c){AZn?SXv zsT~zjRD6tX2vG|z7x+R5gaCJr2hJL^%uIn2PZSzlv%N~K8e@A9Yq!dEOP%+gP=r%a z6#J^8QVJ6rV##?jy=bY-qDE^(G|su)rLwF8EuHUPUoK+|agkwt#WN)y)$qjAo?Ev< z8UrGHcz&C~TE@VvW;8YUkqEzELTmzOH5^}h$`XR(drEQk-il-pR2$5+=e1eJx+I}p zV3WM(5R4I&2vQ2IHByvpRV2j@k_<)V(1JF3&tS^LRti#r3enPMc@cpk`|k}L3A_e4 z$QVqmLe*$O6!10$*P<;jtKq@CBSA!1IPBRh9`=LkP=zIGkOSHYuCACR<?T9fdx1h< zs7D+;kU;{&dkI(U1@kJNEO;gwmY;35Jh@4DY@1<=)*YN;j6sV=3Pj}TBETR;Zp(Xs zE)?#CnVqcZJOjWPN^zvtjA%^)G&7hjoGu1@r9wy&l-5Y>Q99t8DGJX+&90Z6k0-d4 z(6qP-Pa0ahJf>l<2sJ-Kw-x8?7x>OvhxdWizcBpGn`=}ekJ1s1T7>d>KccI`(s{zc zON8Img3%CLP0eYV6NV>Vg1crtTObDw1&At}GgTN8z<BR-93Vn(J^*Nkz+EETUDVN~ zz#-nVI87M=s<oJbv6vwp6C{ukXljL;6_VKV-LxAb%Z?Dld4l)Y3|iKcOiZC{gpP%F z<{-5k=sjzL#~8!ZR>RnmKqV0tR0N;EOe9p=1~PCJ*t|tp_q_1jM#Y9mlj#Cd7iGKb zH+oB9nHY)&%!5)GF}d*G_T_}Klo(@J3p`b+U<<UBBnb=Bh~pI;DKK173>rfiuCR8i zC9Zgk7+xoW8U>YE5+Kt+1Mn#m`=*#h39ja;Ha!=M<LYN~H~rEYxV)-J1qKq2^`2)p z!K2S99(S5RE|}K&D+&Q|9_wshmskqjN#w<Qr4%L<ZLY)T|GdYSNv;DcyE!6?qCTxo zSj)XA?g^eFTkr=<6-|j*+e{cK6!?4dJfp$W9urz7C2^kGIE<z+KY_XlY*&G;HIF&Y z5uOp86E+BV<!DdB$DYU&Sjl5q_siKt8Rz{SY_9_HzNTZ`LJ5WrHnw<cbM2IYYb_Xq z_YS4vK1^Mf%@R?0@40jz!Odz$h9ZWO3RRPzsV;_O#3Ei}+Ma3GVB>)2eplhlrNV#& z_G(x*JI}U=qA4m$u7<G@#hKN>?bAINAIYUCh4-E`wfG(n?v_3%swRj~;$$BJrqo*L zE~TX@T!q4IvMfVH^~IC5wlmK9w1Az0Y8ytUDlBL!Y*mQkm|9Ti*dRtQqNz^CY@bMZ z_!;4M_l2p<GBxa}R}`w2(@kv(9`>#Zp<y`t1bFl=%X8j$%3p~sj8cWw`-daa(;1fK z(1<|KC{IeLxC6N98$3|p=-lGn@|b`B0YKMaa|+ECq|(C8%rG-EL%m+7R!<pdda6N4 zDhZXrDh-#g*%+z~M>3NV>W+9^k*v#eQR#-6^$=O&Vas(F6fRqaK@Tv?vaAD+WCz~E zPUnfLtO9d4J99wq5iuyO`ld!@muQS|P8_p*VT;Kbh~`0C!6pq8)>5z6$+8T!IY#R$ zNm?Pa1!)M?mjv%KhEkYT0YnigNF?{b(i^jVz(t<KgKfb-{ztgr#zM%#ox82CK}6GK z-}hzy4xZ^9kd&pOgXrQoPj)6Eu2hICF>w^<8tVxc=PX7kE<W6#Yr@bxcyJ@!xei<v znjNo6nbs*Tv~ViLi^UCkCW`stn78aV>{*~4VIUw;uGlz^F(QmuSi1&Zo`vZuyd1&m z%M2zqeRF_9WVFtEnWUKfmNNBva__*z%!R?-!J_I24WO0oVDNJE{ne9%48t$B2p`>) z6J7{hur1F|C0$pC$tX~jHbE?@aopKXNv&mr_Y4M)i4F5&a09A{af273GM@6u`*PZE zI}A=g4MqlHK5%->O+WI*kTvUsqjRn^7SGGK##+}Ik<axCQ`W;gNzjJ@RL`(c5Q2nG zzPMqb=jqMDr`CJC?S{}GkYq3*LR=^`3W990H0u^OX0d~wXIeSKYg=%zgCP&|jlrA# zytB!5Ki~B%eD68o9VcndKUFiiLG#_`^ByGiS%>%X8A0CC3tD%>syE!d_XQB@#7lRG zP^nZpwN`6QpbM8T65*P0&-A!Qq`&0EfU<CB$Mpo!p5Rm5bV?o2^}NCYywrdt8k(kH zv{s_gJk)~e?>YhQeIjuGvw@GF2J2sfN35cNH+_{Ux1IErK6*m4P=M{Y4?qPt#(RF! zYEi4zI=z7^JVI;DH;p0nzR%4|!utSQMh!FV?$e*7<{?<TgX(tBBVA#d2K<7YeH%R0 zsglXu7>yRx3gFm<C;8r0cjk%O`rHe15qt-m^d|Oqoh3YQpJ$7uudO$8+Im{RyMc>= z$GzuU^pBOxDN)HpZxiLcXPF3}+Y}Kealx!-<Dg|x)njKswLtYqGx-$gQy_^fCgk9z zSAfsn4NHJ0dw9%qkjL-n9DP=v2dsDxoUqgrCBkiY$PU*PA<(~ZKXArk_?;Row~h^| z;w!U(Epy6c*+%y&V!bhJ(;D#<s4T_Xlr~ULAdWzE_g*i0K{uh@@<d7Qg1y$;P#9&d zaIdt^JPOWv7c9~_0(1uc@qs+7c2GcBK6=+3BD~cIb!|z9g^>ZzN7_O#iidx$_-6UI zNvYzjbeQ^P9#??vJo{@~PpiOII)==4l{jGx0~SIMR7Genv^y|4u^YlK20n5!9JV*q zDmho%4uDOIAkuKh7j~{JGxv*52RIIcqn>)r<E&tvpaqs631@g1ANO4Ug6C!5?H<Z7 zn44&lAsE{iqM>{|H9ZOPShws}_lJfO^e|L~SG86cSa~jtF36?H>d?r*Ov2Ffu-8Ud zvklm|n+hm9r!P0)(#2q=pw<vn0wWDUX(1RG7=!;|JP$k#*UwR2FA4)_H=r>MaSO%{ zgmkDJN($Q$YWsS0u-F)8)b0y^{n_xEH^9(#aCJyCa0-YZXs`ma0$=_5u4$N^ClL5C zaNz(rfmC^vhgJk*kuao%fhkWq4R2Wt*#@{_juLxoZvI3UB!PBjSpQ63o`UjB2T$z< zkFI%|BZ3{>J>mcMjd0vCU>o4(LAo$6t(7|X>6~w4p*agb+4?FK(3$kEh1VSk&O$}y zb1*MpjnEtbtstF*w;c`96Y!TkmM_sFz=(s21($)hmWgdSv(^eC(A?m0LqNk*ZU1uN zzi>JncLJb=qylO1B<;NIO^3jZfdnuC9=i9HX}w~^eSH>u3NAnpkcvlDB+udlLOKk| zVIae>^0Yh@%EZ^Zh69X7Fk~PS81H1YTv^RgkP#SZ!RYiWGyLTX;Dl2kBtnS5Igj(; zfRLkTlz@ss55bN1{1OGsZ5`*fli50$KM4aZ@PjZl&oi+AHjW4rH5i}CLt{e0vhzIG z?Ym=^RspI37B*l(6I^o+_DG=7hL;z^%wD@@_FJb4|KSKjLX3_LO(#rPm}o*PKn8dP z&V$nM;wG5lRVrZa=YN`n*uhX64%`BVZ19Y3wQPRg^5lA$TmYLqY?*`?p7tDj1bn2@ zf0Ku1V0;+1MzC!Fo}LqUYCh;gKv$q`cj5MLh5c3t)B6bOU_&$_3|Bqt)_`k4J%zT0 zRu!fPV4?<p^@Cp?PBIr9%$*NB3fKXdQm}poW}GE<mSaaOUw#Je{vOm^J_{H<1fu!y zuG8U?!7k0!<M4l;f^7fX%8$(va*HeGF9NEzBa^G&0>_^SVlB~_$L-^B`+Kgu)w8Jr z$)dcOs%S6{h5|4Rk3Fy(3YZImcD62g3d~@h2PP)rg-xD~8{v~jz;}Qf{uQJOTboc< z;6~uWRdC5cT^iS{fgg@T6vOl!Xg3{$8wNcO?tHR;??acv(QnGFYg1s_;y1Q9{=F%c zC2;aPplzTr1k;0{lN@Nh_anPkO?Df0yzeJa83Mf!d<EK3J~X~=F+2ji`*s*Q2=oG& ziD7Gix4#8GcxaC$Z_7(mWlo4p6}`a^*1&Z)cE7*uN;u^Rm`q@1UY_KhdKyl;IPZ=w zehW;czz8sqSE-F2&j0Z4V+qywWN|mvjmLv`pd3UMs13n`KZ7q6wf5_)AlU~d1P0nL zIt;hp4_|z6*EGNV*RXjj{Nc6T?>>10{LUeurl2wl@f19C8(i^FzW=rVmNTygKo7%U z3fr3S`<K2tB&kK@+7NbM2e)s6bC-fDnwpt99I!WRSf8WKe_8`aFNDSOK@2n^c<oY{ zpTUn`+&Rrnb@-c`x}UH9JiPuWXotLciWB&UufeDOCEx$bH6RMS&Qag|CL|NE;={b^ zr7Ce8eA!cbzuN~te>zAT5`bzR79ad>{`&xc>xN<3N|;U{)L>A-?f1cdee{*-e)eiu zwlsgDoDGAG;N6$P><h(xuYki2%<;Yi2uWW0&ifF*(o&U5CG`F{^3^Ee)^|WQ0eS|~ z`A|z>#ogWgi-AA97<>#)gW3yz_yf55M?0r?)#u=pqrlF>kU)C|-hN4U|NXxQE0;l9 z&oO_^L46ihe2QOrskrcfot41dS@)j=se`EuT7!@^;eC&H_YVjDeig`Ao<QeS;NAz| zgLn4R`Sa`H@MFO@VN}D$_3-<bclVDz1+Kdsun_qim}Qf2#((DDw4|KAyjts*>y7_A zZ#)K@;J1VE@QGu(`_BN&zmZ!_UIzC(y!lvIy{w<ke%oQuI4o+x&mQO(UKYbAuE?Ks z8}cE?jQh6>|0`92U3FCd{7!gz8k*BET!Tkmgd5iNUw8L=VbKB5R8W}*_k9!ov?nKg z?Mis@1^DRAbG&Rd)C05!a=f7eoO20#WbF|JbjsO^e0Z6)p|(HVd<Wd}QvWsgtc0=G zfNeu1f!l6@Yk#_Hns<K&k_dv!K~%d1XMB`BwuC*nR(u=$Fbs@>s>3Dcz_Q^v^SYa1 z?OLd5Xg1)S^We`9-$nEDVHj<JOhA%Cb862DzsD5-aM4X*k{koHQur?)fc@t*KdWwn zA3m6eik*Zr-UZh$>A&U!uZKm8p;6CA^?ozF^^@%JrGabrG|}%p2A3TMvORa*6>oxX zJe>FJou@o6z*Y@M9Rtw@IA(7+XbXJ5p6~x;1Dq(Z?-FQkhcmy_#Ta{X?a>@Ccm3!c z&>qP>!c^eYzuvL+de5P7*-A)XhGF2Io8g+Cp~xqe!Dk-q{3P?YO92M>=lAA+WhhTz zXMJVI>rOlrR(~x2fyMl3_`%oUKRw02%lfq{pj`J|0@I@~a~RAv;e%J~c+H{v!{1#G zeikYozW*b*_8<NqQ2@ZLAIcw!%2Ie{2L5Cx@O9A`{LdR<MxZtT_uK)0`T1WjU&6oB zI`8v&ztEV4r5gU?{2i|u-v$?41XT_74BmJqTz>g)sRGVD1HO1A4EB`3m7jyS0j()G z<|z2|PLwd&f_GjB$t<uP-uxz5`A5HH3ON5{IPO>&4{+jfa}={0tb^HEIBqFiwQR@p z=`5W6p8T1EZ@~E{z{*v>9tG@i9Ps|-aOUe_uLvG^0Pgtlj@R7sFkEzU-qkHVF3$~* zy|fb~co!W11{e(Rn&V+{1P`tG4OYM(9|FtX094>R_rT4M?E2bU{uM5KV-Aj9cOtZB zVa-k^M)%$eC$E6ng>b;puulq)KKUCM0v~@JoN_Wm0dBhkZhm~{H`}+kqXo|TZ2p@8 zXW{+tgVWF0Iqg5WG@mm>0&iLcmtFQ7rhqfY;J{JX{33k!TX4(IcQNid0&ZH_eIRLp zb3d0)l^=Zq-nSg)&)@mkKU)QlKMQM~h7*p0(~kKq!vVjkOa6ZpxL4@^3!6j{K(n#` Q)Bpeg07*qoM6N<$f~ut(5C8xG literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/timed_effects/other.lua b/game/modules/tome/data/timed_effects/other.lua index 2426a14f2c..5ab0ca8256 100644 --- a/game/modules/tome/data/timed_effects/other.lua +++ b/game/modules/tome/data/timed_effects/other.lua @@ -3042,6 +3042,25 @@ newEffect{ end, } +newEffect{ + name = "ZONE_AURA_CHALLENGE", + desc = "Challenge", + no_stop_enter_worlmap = true, + long_desc = function(self, eff) if not eff.id_challenge_quest or not self:hasQuest(eff.id_challenge_quest) then return "???" else return self:hasQuest(eff.id_challenge_quest).name end end, + decrease = 0, no_remove = true, + type = "other", + subtype = { aura=true }, + status = "neutral", + zone_wide_effect = true, + parameters = {}, + activate = function(self, eff) + end, + deactivate = function(self, eff) + if not eff.id_challenge_quest or not self:hasQuest(eff.id_challenge_quest) then return end + self:hasQuest(eff.id_challenge_quest):on_exit_level(self) + end, +} + newEffect{ name = "THROWING_KNIVES", image = "talents/throwing_knives.png", desc = "Throwing Knives", decrease = 0, diff --git a/game/modules/tome/data/zones/infinite-dungeon/zone.lua b/game/modules/tome/data/zones/infinite-dungeon/zone.lua index a5b3d48c65..a2a2adae41 100644 --- a/game/modules/tome/data/zones/infinite-dungeon/zone.lua +++ b/game/modules/tome/data/zones/infinite-dungeon/zone.lua @@ -169,12 +169,12 @@ return { force_square_size = true, }, } - self:triggerHook{"InfiniteDungeon:getLayouts", layouts=layouts} + zone:triggerHook{"InfiniteDungeon:getLayouts", layouts=layouts} local layout = rng.table(layouts) data.generator.map = layout - local vgrids = rng.table{ + local vgrids = { {id_grids_name="tree", floor="GRASS", wall="TREE", door="GRASS_ROCK", down="GRASS_DOWN2"}, {id_grids_name="wall", floor="FLOOR", wall="WALL", door="DOOR", down="DOWN"}, {id_grids_name="underground", floor="UNDERGROUND_FLOOR", wall="UNDERGROUND_TREE", door="UNDERGROUND_ROCK", down="UNDERGROUND_LADDER_DOWN"}, @@ -193,22 +193,24 @@ return { {id_grids_name="lava", floor="LAVA_FLOOR_FAKE", wall="LAVA_WALL_FAKE", door="LAVA_FLOOR_FAKE", down="LAVA_DOWN_FAKE"}, {id_grids_name="autumn_forest", floor="AUTUMN_GRASS", wall="AUTUMN_TREE", door="AUTUMN_GRASS", down="AUTUMN_GRASS_DOWN2"}, } - self:triggerHook{"InfiniteDungeon:getGrids", grids=vgrids} + zone:triggerHook{"InfiniteDungeon:getGrids", grids=vgrids} + local vgrid = rng.table(vgrids) + -- local vgrid = vgrids[#vgrids] - data.generator.map.floor = vgrids.floor - data.generator.map['.'] = vgrids.floor - data.generator.map.external_floor = vgrids.floor + data.generator.map.floor = vgrid.floor + data.generator.map['.'] = vgrid.floor + data.generator.map.external_floor = vgrid.floor if data.generator.map.widen_w then -- Special sanity check. Maze generation tends to... mess up if their height/width values aren't multiplies of the tunnel sizes. while data.width % data.generator.map.widen_w ~= 0 do data.width = data.width + 1 end while data.height % data.generator.map.widen_h ~= 0 do data.height = data.height + 1 end end - data.generator.map.wall = vgrids.wall - data.generator.map['#'] = vgrids.wall - data.generator.map.up = vgrids.floor - data.generator.map.down = vgrids.down - data.generator.map.door = vgrids.door - data.generator.map["'"] = vgrids.door + data.generator.map.wall = vgrid.wall + data.generator.map['#'] = vgrid.wall + data.generator.map.up = vgrid.floor + data.generator.map.down = vgrid.down + data.generator.map.door = vgrid.door + data.generator.map["'"] = vgrid.door data.width = vx data.height = vy @@ -221,7 +223,7 @@ return { local enemy_count = math.ceil((vx + vy) * 0.35) data.generator.actor.nb_npc = {enemy_count-5, enemy_count+5} - game.state:infiniteDungeonChallenge(zone, lev, data, data.generator.map.id_layout_name, vgrids.id_grids_name) + game.state:infiniteDungeonChallenge(zone, lev, data, data.generator.map.id_layout_name, vgrid.id_grids_name) end, post_process = function(level) -- Provide some achievements @@ -256,6 +258,8 @@ return { end end end + + game.state:infiniteDungeonChallengeFinish(game.zone, level) end, } diff --git a/game/modules/tome/dialogs/Birther.lua b/game/modules/tome/dialogs/Birther.lua index 1e72ff009d..b25642ce90 100644 --- a/game/modules/tome/dialogs/Birther.lua +++ b/game/modules/tome/dialogs/Birther.lua @@ -331,6 +331,7 @@ end function _M:makeDefault() self:setDescriptor("sex", "Female") self:setDescriptor("world", "Maj'Eyal") + -- self:setDescriptor("world", "Infinite") self:setDescriptor("difficulty", "Normal") self:setDescriptor("permadeath", "Adventure") self:setDescriptor("race", "Human") diff --git a/game/modules/tome/dialogs/QuestPopup.lua b/game/modules/tome/dialogs/QuestPopup.lua index bb8b95916c..6a77b5c59a 100644 --- a/game/modules/tome/dialogs/QuestPopup.lua +++ b/game/modules/tome/dialogs/QuestPopup.lua @@ -39,6 +39,9 @@ function _M:init(quest, status) self.ui = "quest" Dialog.init(self, "", 666, 150) + local add = '' + if quest.popup_text and quest.popup_text[status] then add = quest.popup_text[status].."\n" end + self.blight = self:getUITexture("ui/dialogframe_backglow.png") local f, fs = FontPackage:getFont("bold") @@ -46,7 +49,7 @@ function _M:init(quest, status) quest:setTextShadow(3) quest:setShadowShader(Shader.default.textoutline and Shader.default.textoutline.shad, 2) - local info = Textzone.new{auto_width=true, auto_height=true, text='#ANTIQUE_WHITE#(See your Journal for further details or click here)', font={f, math.ceil(fs)}} + local info = Textzone.new{auto_width=true, auto_height=true, text=add..'#ANTIQUE_WHITE#(See your Journal for further details or click here)', font={f, math.ceil(fs)}} info:setTextShadow(3) info:setShadowShader(Shader.default.textoutline and Shader.default.textoutline.shad, 2) -- GitLab