Showing
53 changed files
with
800 additions
and
18 deletions
... | ... | @@ -1881,6 +1881,7 @@ function _M:textRank(use_rank) |
1881 | 1881 | elseif use_rank == 3.5 then rank, color = _t"unique", "#SANDY_BROWN#" |
1882 | 1882 | elseif use_rank == 4 then rank, color = _t"boss", "#ORANGE#" |
1883 | 1883 | elseif use_rank == 5 then rank, color = _t"elite boss", "#GOLD#" |
1884 | + elseif use_rank == 11 then rank, color = _t"godslayer", "#FF4000#" | |
1884 | 1885 | elseif use_rank >= 10 then rank, color = _t"god", "#FF4000#" |
1885 | 1886 | end |
1886 | 1887 | return rank, color |
... | ... | @@ -4817,6 +4818,7 @@ end |
4817 | 4818 | function _M:checkTwoHandedPenalty() |
4818 | 4819 | self:removeEffect(self.EFF_2H_PENALTY, true, true) |
4819 | 4820 | if not self:attr("allow_mainhand_2h_in_1h") then return end |
4821 | + if self:attr("allow_mainhand_2h_in_1h_no_penalty") then return end | |
4820 | 4822 | local mi, oi = self:getInven(self.INVEN_MAINHAND), self:getInven(self.INVEN_OFFHAND) |
4821 | 4823 | if not mi or not oi then return end |
4822 | 4824 | local mh, oh = mi[1], oi[1] | ... | ... |
... | ... | @@ -117,6 +117,21 @@ newAchievement{ |
117 | 117 | desc = _t[[Won ToME by closing the Void portal and letting yourself be killed by Aeryn to prevent the Way to enslave every sentient being on Eyal.]], |
118 | 118 | } |
119 | 119 | newAchievement{ |
120 | + name = "This is how the world ends: swallowed in fire, but not in darkness.", id = "AOADS_BURN", | |
121 | + show = "name", huge=true, | |
122 | + desc = _t[["Won" ToME by sacrificing yourself for your patron Distant Sun, opening a portal for it to burn and consume the world.]], | |
123 | +} | |
124 | +newAchievement{ | |
125 | + name = "Last Instant of Sanity", id = "AOADS_SELFLESS", | |
126 | + show = "name", huge=true, | |
127 | + desc = _t[[Won ToME by closing the Void portal and letting yourself be killed by Aeryn to prevent your mad patron sun from burning the world in a searing flash.]], | |
128 | +} | |
129 | +newAchievement{ | |
130 | + name = "They Came Back For Eyal", id = "AOADS_SHERTUL", | |
131 | + show = "name", huge=true, | |
132 | + desc = _t[[Won ToME thanks to a Sher'tul stopping you at the last moment from opening a portal to your mad patron sun.]], | |
133 | +} | |
134 | +newAchievement{ | |
120 | 135 | name = "Tactical master", id = "SORCERER_NO_PORTAL", |
121 | 136 | show = "name", huge=true, |
122 | 137 | desc = _t[[Fought the two Sorcerers without closing any invocation portals.]], | ... | ... |
... | ... | @@ -123,7 +123,11 @@ newBirthDescriptor{ |
123 | 123 | resolvers.inventorybirth{ id=true, |
124 | 124 | {type="weapon", subtype="greatsword", name="iron greatsword", autoreq=true, ego_chance= -1000}, |
125 | 125 | }, |
126 | - | |
126 | + resolvers.generic(function(self) | |
127 | + if not profile.mod.allow_build.paladin_avatar then | |
128 | + self:learnTalent(self.T_AVATAR_DISTANT_SUN_UNLOCK_CHECKER, true) | |
129 | + end | |
130 | + end), | |
127 | 131 | }, |
128 | 132 | copy_add = { |
129 | 133 | life_rating = 2, | ... | ... |
1 | +{ | |
2 | + "22": { | |
3 | + "id": 22, | |
4 | + "name": "chat", | |
5 | + "data": { | |
6 | + "chatid": "welcome", | |
7 | + "chat": "**DO NOT TRANSLATE YET**\n<<<You feel a gentle warmth in your mind. Something speaks directly to your mind!>>>\n#YELLOW#WELL MET FRIEND! I AM A FAR AWAY STAR, AND VERY FRIENDLY, ALSO LIBERTY NEEDS TO WRITE ME!\n#LAST#", | |
8 | + "answer1": "sOUNDS COOL!" | |
9 | + }, | |
10 | + "class": "chat", | |
11 | + "html": "chat1", | |
12 | + "typenode": true, | |
13 | + "inputs": { | |
14 | + "input_1": { | |
15 | + "connections": [] | |
16 | + } | |
17 | + }, | |
18 | + "outputs": { | |
19 | + "output_1": { | |
20 | + "connections": [ | |
21 | + { | |
22 | + "node": "24", | |
23 | + "output": "input_1" | |
24 | + } | |
25 | + ] | |
26 | + } | |
27 | + }, | |
28 | + "pos_x": 213, | |
29 | + "pos_y": 362 | |
30 | + }, | |
31 | + "24": { | |
32 | + "id": 24, | |
33 | + "name": "lua-code", | |
34 | + "data": { | |
35 | + "code": "player:callTalent(player.T_AVATAR_DISTANT_SUN_UNLOCK_CHECKER, \"doUnlock\")" | |
36 | + }, | |
37 | + "class": "lua-code", | |
38 | + "html": "lua-code", | |
39 | + "typenode": true, | |
40 | + "inputs": { | |
41 | + "input_1": { | |
42 | + "connections": [ | |
43 | + { | |
44 | + "node": "22", | |
45 | + "input": "output_1" | |
46 | + } | |
47 | + ] | |
48 | + } | |
49 | + }, | |
50 | + "outputs": { | |
51 | + "output_1": { | |
52 | + "connections": [] | |
53 | + } | |
54 | + }, | |
55 | + "pos_x": 775, | |
56 | + "pos_y": 381 | |
57 | + } | |
58 | +} | |
\ No newline at end of file | ... | ... |
1 | +{ | |
2 | + "25": { | |
3 | + "id": 25, | |
4 | + "name": "chat", | |
5 | + "data": { | |
6 | + "chatid": "chat4", | |
7 | + "chat": "#YELLOW#YOU ARE A CURIOUS ONE.", | |
8 | + "answer1": "[...]" | |
9 | + }, | |
10 | + "class": "chat", | |
11 | + "html": "chat1", | |
12 | + "typenode": true, | |
13 | + "inputs": { | |
14 | + "input_1": { | |
15 | + "connections": [ | |
16 | + { | |
17 | + "node": "32", | |
18 | + "input": "output_1" | |
19 | + } | |
20 | + ] | |
21 | + } | |
22 | + }, | |
23 | + "outputs": { | |
24 | + "output_1": { | |
25 | + "connections": [ | |
26 | + { | |
27 | + "node": "32", | |
28 | + "output": "input_1" | |
29 | + } | |
30 | + ] | |
31 | + } | |
32 | + }, | |
33 | + "pos_x": 1564, | |
34 | + "pos_y": 207 | |
35 | + }, | |
36 | + "27": { | |
37 | + "id": 27, | |
38 | + "name": "chat", | |
39 | + "data": { | |
40 | + "chatid": "chat6", | |
41 | + "chat": "#YELLOW#YOU HAVE MADE THE RIGHT CHOICE. TOGETHER, WE SHALL BRING ABOUT THE DESTRUCTION OF OUR ENEMIES.", | |
42 | + "answer1": "#GOLD#[you are now an Avatar of a Distant Sun]" | |
43 | + }, | |
44 | + "class": "chat", | |
45 | + "html": "chat1", | |
46 | + "typenode": true, | |
47 | + "inputs": { | |
48 | + "input_1": { | |
49 | + "connections": [ | |
50 | + { | |
51 | + "node": "29", | |
52 | + "input": "output_1" | |
53 | + }, | |
54 | + { | |
55 | + "node": "36", | |
56 | + "input": "output_1" | |
57 | + } | |
58 | + ] | |
59 | + } | |
60 | + }, | |
61 | + "outputs": { | |
62 | + "output_1": { | |
63 | + "connections": [ | |
64 | + { | |
65 | + "node": "39", | |
66 | + "output": "input_1" | |
67 | + } | |
68 | + ] | |
69 | + } | |
70 | + }, | |
71 | + "pos_x": 2507, | |
72 | + "pos_y": -110 | |
73 | + }, | |
74 | + "29": { | |
75 | + "id": 29, | |
76 | + "name": "chat", | |
77 | + "data": { | |
78 | + "chatid": "welcome", | |
79 | + "chat": "<<<You feel the gentle warmth of your Distant Sun patron. It speaks directly to your mind!>>>\n#YELLOW#I AM HERE. DO YOU DESIRE TO SMITE EVIL, DESTROY THE DARKNESS AND SCOUR THE EARTH? I SHALL AID YOU IN THIS QUEST. TOGETHER, WE WILL BE UNSTOPPABLE. ALL DARKNESS SHALL BE CONSUMED BY OUR LIGHT.\n#LAST#", | |
80 | + "answer1": "Yes, give me your power!", | |
81 | + "answer2": "Who... Who are you?" | |
82 | + }, | |
83 | + "class": "chat", | |
84 | + "html": "chat2", | |
85 | + "typenode": true, | |
86 | + "inputs": { | |
87 | + "input_1": { | |
88 | + "connections": [] | |
89 | + } | |
90 | + }, | |
91 | + "outputs": { | |
92 | + "output_1": { | |
93 | + "connections": [ | |
94 | + { | |
95 | + "node": "27", | |
96 | + "output": "input_1" | |
97 | + } | |
98 | + ] | |
99 | + }, | |
100 | + "output_2": { | |
101 | + "connections": [ | |
102 | + { | |
103 | + "node": "32", | |
104 | + "output": "input_1" | |
105 | + } | |
106 | + ] | |
107 | + } | |
108 | + }, | |
109 | + "pos_x": 92, | |
110 | + "pos_y": 131 | |
111 | + }, | |
112 | + "32": { | |
113 | + "id": 32, | |
114 | + "name": "chat", | |
115 | + "data": { | |
116 | + "chatid": "chat7", | |
117 | + "chat": "#YELLOW#I AM YOUR FRIEND. IT IS GOOD TO HAVE FRIENDS, ISN'T IT?", | |
118 | + "answer1": "But how are you speaking to me?", | |
119 | + "answer2": "You still haven't told me who or what you are.", | |
120 | + "answer3": "But what are you getting out of this?", | |
121 | + "answer4": "That doesn't tell me anything." | |
122 | + }, | |
123 | + "class": "chat", | |
124 | + "html": "chat4", | |
125 | + "typenode": true, | |
126 | + "inputs": { | |
127 | + "input_1": { | |
128 | + "connections": [ | |
129 | + { | |
130 | + "node": "29", | |
131 | + "input": "output_2" | |
132 | + }, | |
133 | + { | |
134 | + "node": "25", | |
135 | + "input": "output_1" | |
136 | + }, | |
137 | + { | |
138 | + "node": "33", | |
139 | + "input": "output_1" | |
140 | + }, | |
141 | + { | |
142 | + "node": "34", | |
143 | + "input": "output_1" | |
144 | + } | |
145 | + ] | |
146 | + } | |
147 | + }, | |
148 | + "outputs": { | |
149 | + "output_1": { | |
150 | + "connections": [ | |
151 | + { | |
152 | + "node": "25", | |
153 | + "output": "input_1" | |
154 | + } | |
155 | + ] | |
156 | + }, | |
157 | + "output_2": { | |
158 | + "connections": [ | |
159 | + { | |
160 | + "node": "33", | |
161 | + "output": "input_1" | |
162 | + } | |
163 | + ] | |
164 | + }, | |
165 | + "output_3": { | |
166 | + "connections": [ | |
167 | + { | |
168 | + "node": "34", | |
169 | + "output": "input_1" | |
170 | + } | |
171 | + ] | |
172 | + }, | |
173 | + "output_4": { | |
174 | + "connections": [ | |
175 | + { | |
176 | + "node": "36", | |
177 | + "output": "input_1" | |
178 | + } | |
179 | + ] | |
180 | + } | |
181 | + }, | |
182 | + "pos_x": 721, | |
183 | + "pos_y": 330 | |
184 | + }, | |
185 | + "33": { | |
186 | + "id": 33, | |
187 | + "name": "chat", | |
188 | + "data": { | |
189 | + "chatid": "chat8", | |
190 | + "chat": "#YELLOW#YOU NEED NOT CONCERN YOURSELF WITH SUCH THINGS. I KNOW YOU CRAVE POWER. I KNOW THE WEIGHT OF THE WORLD IS ON YOUR SHOULDERS. SO, ACCEPT MY BOONS. ALLOW ME TO HELP YOU.\n", | |
191 | + "answer1": "[...]" | |
192 | + }, | |
193 | + "class": "chat", | |
194 | + "html": "chat1", | |
195 | + "typenode": true, | |
196 | + "inputs": { | |
197 | + "input_1": { | |
198 | + "connections": [ | |
199 | + { | |
200 | + "node": "32", | |
201 | + "input": "output_2" | |
202 | + } | |
203 | + ] | |
204 | + } | |
205 | + }, | |
206 | + "outputs": { | |
207 | + "output_1": { | |
208 | + "connections": [ | |
209 | + { | |
210 | + "node": "32", | |
211 | + "output": "input_1" | |
212 | + } | |
213 | + ] | |
214 | + } | |
215 | + }, | |
216 | + "pos_x": 1558, | |
217 | + "pos_y": 415 | |
218 | + }, | |
219 | + "34": { | |
220 | + "id": 34, | |
221 | + "name": "chat", | |
222 | + "data": { | |
223 | + "chatid": "chat9", | |
224 | + "chat": "#YELLOW#I AM GETTING PLENTY OUT OF THIS.", | |
225 | + "answer1": "[...]" | |
226 | + }, | |
227 | + "class": "chat", | |
228 | + "html": "chat1", | |
229 | + "typenode": true, | |
230 | + "inputs": { | |
231 | + "input_1": { | |
232 | + "connections": [ | |
233 | + { | |
234 | + "node": "32", | |
235 | + "input": "output_3" | |
236 | + } | |
237 | + ] | |
238 | + } | |
239 | + }, | |
240 | + "outputs": { | |
241 | + "output_1": { | |
242 | + "connections": [ | |
243 | + { | |
244 | + "node": "32", | |
245 | + "output": "input_1" | |
246 | + } | |
247 | + ] | |
248 | + } | |
249 | + }, | |
250 | + "pos_x": 1559, | |
251 | + "pos_y": 776 | |
252 | + }, | |
253 | + "36": { | |
254 | + "id": 36, | |
255 | + "name": "chat", | |
256 | + "data": { | |
257 | + "chatid": "chat10", | |
258 | + "chat": "#YELLOW#I TIRE OF YOUR NAGGING QUESTIONS. TALK, TALK, TALK. YOU HAVE A SIMPLE CHOICE BEFORE YOU. WILL YOU BECOME POWERFUL? OR WILL YOU BE WEAK AND ALONE?", | |
259 | + "answer1": "Yes, give me your power!", | |
260 | + "answer2": "I don't trust you. Please go away." | |
261 | + }, | |
262 | + "class": "chat", | |
263 | + "html": "chat2", | |
264 | + "typenode": true, | |
265 | + "inputs": { | |
266 | + "input_1": { | |
267 | + "connections": [ | |
268 | + { | |
269 | + "node": "32", | |
270 | + "input": "output_4" | |
271 | + } | |
272 | + ] | |
273 | + } | |
274 | + }, | |
275 | + "outputs": { | |
276 | + "output_1": { | |
277 | + "connections": [ | |
278 | + { | |
279 | + "node": "27", | |
280 | + "output": "input_1" | |
281 | + } | |
282 | + ] | |
283 | + }, | |
284 | + "output_2": { | |
285 | + "connections": [ | |
286 | + { | |
287 | + "node": "37", | |
288 | + "output": "input_1" | |
289 | + } | |
290 | + ] | |
291 | + } | |
292 | + }, | |
293 | + "pos_x": 1557, | |
294 | + "pos_y": 1046 | |
295 | + }, | |
296 | + "37": { | |
297 | + "id": 37, | |
298 | + "name": "chat", | |
299 | + "data": { | |
300 | + "chatid": "chat11", | |
301 | + "chat": "#YELLOW#I HAVE LITTLE PATIENCE FOR TIME WASTERS. THIS SHALL BE THE LAST TIME WE SPEAK.", | |
302 | + "answer1": "#GRAY#[prodigy point refunded]" | |
303 | + }, | |
304 | + "class": "chat", | |
305 | + "html": "chat1", | |
306 | + "typenode": true, | |
307 | + "inputs": { | |
308 | + "input_1": { | |
309 | + "connections": [ | |
310 | + { | |
311 | + "node": "36", | |
312 | + "input": "output_2" | |
313 | + } | |
314 | + ] | |
315 | + } | |
316 | + }, | |
317 | + "outputs": { | |
318 | + "output_1": { | |
319 | + "connections": [ | |
320 | + { | |
321 | + "node": "40", | |
322 | + "output": "input_1" | |
323 | + } | |
324 | + ] | |
325 | + } | |
326 | + }, | |
327 | + "pos_x": 2017, | |
328 | + "pos_y": 1318 | |
329 | + }, | |
330 | + "39": { | |
331 | + "id": 39, | |
332 | + "name": "lua-code", | |
333 | + "data": { | |
334 | + "code": "player:callTalent(player.T_AVATAR_OF_A_DISTANT_SUN, \"becomeAvatar\")" | |
335 | + }, | |
336 | + "class": "lua-code", | |
337 | + "html": "lua-code", | |
338 | + "typenode": true, | |
339 | + "inputs": { | |
340 | + "input_1": { | |
341 | + "connections": [ | |
342 | + { | |
343 | + "node": "27", | |
344 | + "input": "output_1" | |
345 | + } | |
346 | + ] | |
347 | + } | |
348 | + }, | |
349 | + "outputs": { | |
350 | + "output_1": { | |
351 | + "connections": [] | |
352 | + } | |
353 | + }, | |
354 | + "pos_x": 2859.4285714285716, | |
355 | + "pos_y": -43.42857142857143 | |
356 | + }, | |
357 | + "40": { | |
358 | + "id": 40, | |
359 | + "name": "lua-code", | |
360 | + "data": { | |
361 | + "code": "player:unlearnTalent(player.T_AVATAR_OF_A_DISTANT_SUN)\nplayer.unused_prodigies = player.unused_prodigies + 1\nplayer:attr(\"pissed_of_distant_sun\", 1)" | |
362 | + }, | |
363 | + "class": "lua-code", | |
364 | + "html": "lua-code", | |
365 | + "typenode": true, | |
366 | + "inputs": { | |
367 | + "input_1": { | |
368 | + "connections": [ | |
369 | + { | |
370 | + "node": "37", | |
371 | + "input": "output_1" | |
372 | + } | |
373 | + ] | |
374 | + } | |
375 | + }, | |
376 | + "outputs": { | |
377 | + "output_1": { | |
378 | + "connections": [] | |
379 | + } | |
380 | + }, | |
381 | + "pos_x": 2477, | |
382 | + "pos_y": 1329 | |
383 | + } | |
384 | +} | |
\ No newline at end of file | ... | ... |
... | ... | @@ -21,6 +21,7 @@ local p = game.party:findMember{main=true} |
21 | 21 | |
22 | 22 | local function void_portal_open(npc, player) |
23 | 23 | -- Charred scar was successful |
24 | + -- do return false end | |
24 | 25 | if player:hasQuest("charred-scar") and player:hasQuest("charred-scar"):isCompleted("stopped") then return false end |
25 | 26 | return true |
26 | 27 | end |
... | ... | @@ -32,6 +33,100 @@ end |
32 | 33 | |
33 | 34 | |
34 | 35 | -------------------------------------------------------- |
36 | +-- Distant Sun is not exactly benevolent after all | |
37 | +-------------------------------------------------------- | |
38 | +if p:attr("sun_paladin_avatar") then | |
39 | +newChat{ id="welcome", | |
40 | + text = ([[<<<The two Sorcerers lie dead before you. | |
41 | +Their bodies vanish in a small cloud of mist, quickly fading away. | |
42 | +You feel you the gentle warmth of your Distant Sun patron. It speaks directly to your mind!>>> | |
43 | +#YELLOW#YOU HAVE DONE WELL %s! YOU DESERVE A REWARD!#LAST# | |
44 | +<<<You can feel your mind filling with warmth and desire to serve your patron>>> | |
45 | +#YELLOW#BUT YOU MUST DO ONE MORE TASK!#LAST# | |
46 | +<<<The warmth in your head is getting intense, too intense. You feel your sanity burning away!>>> | |
47 | +#YELLOW#THROW YOURSELF INTO THE PORTAL! OPEN THE WAY FOR MY POWER TO RADIATE OVER YOUR WORLD! #CRIMSON#DO IT!#LAST# | |
48 | +<<<Those last words are compelling. You can not resist!>>> | |
49 | +]]):tformat(p.name:upper()), | |
50 | + answers = { | |
51 | + {_t"#YELLOW#[sacrifice yourself to bring forth your patron to Eyal!]", action=function(npc, player) | |
52 | + player.no_resurrect = true | |
53 | + player:die(player, {special_death_msg=("sacrificing %s to bring the fiery wrath of the Distant Sun"):tformat(string.his_her_self(player))}) | |
54 | + player:setQuestStatus("high-peak", engine.Quest.COMPLETED, "distant-sun") | |
55 | + player:hasQuest("high-peak"):win("distant-sun") | |
56 | + end}, | |
57 | + {_t"Nnnnnooo! Get.. get out of my head!", jump="distant-sun-unsure"}, | |
58 | + } | |
59 | +} | |
60 | + | |
61 | +local shertul = game.zone:makeEntityByName(game.level, "actor", "CALDIZAR_AOADS", true) | |
62 | +newChat{ id="distant-sun-unsure", | |
63 | + text = _t[[<<<The warmth in your mind turns into searing pain!>>> | |
64 | +#CRIMSON#YOU WILL DO AS YOU ARE TOLD! YOU ARE MY TOOL AND I INTEND TO USE IT! | |
65 | +]], | |
66 | + answers = { | |
67 | + {_t"#LIGHT_GREEN#[sacrifice yourself to bring forth your patron to Eyal!]", action=function(npc, player) | |
68 | + player.no_resurrect = true | |
69 | + player:die(player, {special_death_msg=("sacrificing %s to bring the fiery wrath of the Distant Sun"):tformat(string.his_her_self(player))}) | |
70 | + player:setQuestStatus("high-peak", engine.Quest.COMPLETED, "distant-sun") | |
71 | + player:hasQuest("high-peak"):win("distant-sun") | |
72 | + end}, | |
73 | + {_t"#LIGHT_GREEN#[In a last incredible display of willpower you fight the Distant Sun for a few seconds, letting you project your thoughts to Aeryn.]#WHITE# High Lady! Kill me #{bold}#NOW#{normal}#", | |
74 | + cond=function(npc, player) return not void_portal_open(nil, player) and aeryn_alive(npc, player) and player:getWil() >= 55 end, switch_npc=aeryn_alive(), jump="distant-sun-stab" | |
75 | + }, | |
76 | + {_t"#LIGHT_GREEN#[In a last incredible display of willpower you fight the Distant Sun for a few seconds, unsure how to stop it.]#WHITE##{bold}#NO!#{normal}#", | |
77 | + switch_npc=shertul, cond=function(npc, player) return not void_portal_open(nil, player) and not aeryn_alive(npc, player) and player:getWil() >= 55 end, jump="distant-sun-shertul" | |
78 | + }, | |
79 | + } | |
80 | +} | |
81 | + | |
82 | +newChat{ id="distant-sun-stab", | |
83 | + text = _t[[<<<Through your mind Aeryn sees what the Distant Sun is planning.>>> | |
84 | +You were a precious ally and a friend. The world will remember your last act of selfless sacrifice. I swear it. | |
85 | +<<<As she says this she pierces your body with a mighty thrust of her sword, ending the plans of your mad patron.>>> | |
86 | +]], | |
87 | + answers = { | |
88 | + {_t"#LIGHT_GREEN#[slip peacefully into death.]", action=function(npc, player) | |
89 | + player.no_resurrect = true | |
90 | + player:die(player, {special_death_msg=("sacrificing %s to stop the mad sun's plans"):tformat(string.his_her_self(player))}) | |
91 | + player:setQuestStatus("high-peak", engine.Quest.COMPLETED, "distant-sun-stab") | |
92 | + player:hasQuest("high-peak"):win("distant-sun-selfless") | |
93 | + end}, | |
94 | + } | |
95 | +} | |
96 | + | |
97 | +newChat{ id="distant-sun-shertul", | |
98 | + text = _t[[<<<The precious seconds fly by, but as you feel your mind breaking and burning you see a strange figure appearing in front of you, it radiates of immense power.>>> | |
99 | +<<<The strange, amorphous figure in front of you remains completely silent. With a gesture of one of its tendrils, the staff is ripped from your hands. A surge of energy goes through the room as it grips the staff. Then you remember the old myth of the Godslayers. This is none other than a ***Sher'Tul***#{italic}#, and it knows you have been colluding with a god. That alone tells you everything you need to know.>>> | |
100 | +]], | |
101 | + answers = { | |
102 | + {_t"#CRIMSON#[Your mind is burnt by your patron sun! Fight for your sun god now!]", action=function(npc, player) | |
103 | + player.no_resurrect = true | |
104 | + game.level.data.no_worldport = true | |
105 | + game.zone.no_worldport = true | |
106 | + local who, o, item, inven_id = game.party:findInAllInventoriesBy("define_as", "STAFF_ABSORPTION_AWAKENED") | |
107 | + if who and o then | |
108 | + who:removeObject(inven_id, item, true) | |
109 | + end | |
110 | + local x, y = util.findFreeGrid(player.x, player.y, 100, true, {[engine.Map.ACTOR]=true}) | |
111 | + if x then | |
112 | + game.zone:addEntity(game.level, shertul, "actor", x, y) | |
113 | + shertul:setTarget(player) | |
114 | + shertul:setPersonalReaction(player, -100) | |
115 | + end | |
116 | + player.on_die = function() | |
117 | + game:onTickEnd(function() | |
118 | + player:setQuestStatus("high-peak", engine.Quest.COMPLETED, "distant-sun-shertul") | |
119 | + player:hasQuest("high-peak"):win("distant-sun-shertul") | |
120 | + end) | |
121 | + end | |
122 | + end}, | |
123 | + } | |
124 | +} | |
125 | + | |
126 | +return "welcome" | |
127 | +end | |
128 | + | |
129 | +-------------------------------------------------------- | |
35 | 130 | -- Yeeks have a .. plan |
36 | 131 | -------------------------------------------------------- |
37 | 132 | if p.descriptor.race == "Yeek" then |
... | ... | @@ -68,7 +163,7 @@ You will do as asked, for the good of all Yeeks! The Way is always right. |
68 | 163 | player:hasQuest("high-peak"):win("yeek-sacrifice") |
69 | 164 | end}, |
70 | 165 | {_t"#LIGHT_GREEN#[In a last incredible display of willpower you fight the Way for a few seconds, letting you project your thoughts to Aeryn.]#WHITE# High Lady! Kill me #{bold}#NOW#{normal}#", |
71 | - cond=function(npc, player) return not void_portal_open(nil, player) and aeryn_alive(npc, player) and player:getWil() >= 55 end, jump="yeek-stab" | |
166 | + cond=function(npc, player) return not void_portal_open(nil, player) and aeryn_alive(npc, player) and player:getWil() >= 55 end, switch_npc=aeryn_alive(), jump="yeek-stab" | |
72 | 167 | }, |
73 | 168 | } |
74 | 169 | } |
... | ... | @@ -103,7 +198,7 @@ newChat{ id="welcome", |
103 | 198 | But the portal to the Void is already open. It must be closed before the Creator can come through or all will have been in vain! |
104 | 199 | After searching the remains of the Sorcerers you find a note explaining that the portal can only be closed with a sentient being's sacrifice.]], |
105 | 200 | answers = { |
106 | - {_t"Aeryn, I am sorry but one of us needs to be sacrificed for the world to go on. #LIGHT_GREEN#[sacrifice Aeryn for the sake of the world]", jump="aeryn-sacrifice", cond=aeryn_alive}, | |
201 | + {_t"Aeryn, I am sorry but one of us needs to be sacrificed for the world to go on. #LIGHT_GREEN#[sacrifice Aeryn for the sake of the world]", jump="aeryn-sacrifice", switch_npc=aeryn_alive(), cond=aeryn_alive}, | |
107 | 202 | {_t"I will close it. #LIGHT_GREEN#[sacrifice yourself for the sake of the world]", action=function(npc, player) |
108 | 203 | player.no_resurrect = true |
109 | 204 | player:die(player, {special_death_msg=("sacrificing %s for the sake of the world"):tformat(string.his_her_self(player))}) |
... | ... | @@ -135,7 +230,7 @@ newChat{ id="welcome", |
135 | 230 | You have won the game! |
136 | 231 | Both Maj'Eyal and the Far East are safe from the dark schemes of the Sorcerers and their God.]], |
137 | 232 | answers = { |
138 | - {_t"Aeryn, are you well?", jump="aeryn-ok", cond=aeryn_alive}, | |
233 | + {_t"Aeryn, are you well?", jump="aeryn-ok", switch_npc=aeryn_alive(), cond=aeryn_alive}, | |
139 | 234 | {_t"[leave]", action=function(npc, player) player:hasQuest("high-peak"):win("full") end}, |
140 | 235 | } |
141 | 236 | } | ... | ... |
... | ... | @@ -59,6 +59,7 @@ local changer = function(id) |
59 | 59 | ambient_music = "World of Ice.ogg", |
60 | 60 | reload_lists = false, |
61 | 61 | persistent = "zone", |
62 | + in_orbit = true, | |
62 | 63 | |
63 | 64 | no_worldport = game.zone.no_worldport, |
64 | 65 | min_material_level = util.getval(game.zone.min_material_level), | ... | ... |

35.6 KB

36.7 KB

36.3 KB

35 KB

35.9 KB

35.5 KB

35.1 KB

35.6 KB

35.4 KB

36.7 KB

37.1 KB

36.8 KB

34.8 KB

35.7 KB

35.2 KB

35.7 KB

36.3 KB

35.9 KB

36.4 KB

37 KB

37.5 KB

37.5 KB

35.8 KB

36.6 KB

18.9 KB

23.6 KB
... | ... | @@ -123,6 +123,9 @@ function win(self, how) |
123 | 123 | elseif how == "self-sacrifice" then world:gainAchievement("WIN_SACRIFICE", game.player) |
124 | 124 | elseif how == "yeek-sacrifice" then world:gainAchievement("YEEK_SACRIFICE", game.player) |
125 | 125 | elseif how == "yeek-selfless" then world:gainAchievement("YEEK_SELFLESS", game.player) |
126 | + elseif how == "distant-sun" then world:gainAchievement("AOADS_BURN", game.player) | |
127 | + elseif how == "distant-sun-selfless" then world:gainAchievement("AOADS_SELFLESS", game.player) | |
128 | + elseif how == "distant-sun-shertul" then world:gainAchievement("AOADS_SHERTUL", game.player) | |
126 | 129 | end |
127 | 130 | |
128 | 131 | local p = game:getPlayer(true) |
... | ... | @@ -177,6 +180,24 @@ function onWin(self, who) |
177 | 180 | desc[#desc+1] = _t"The Sorcerers are dead, and the Orc Pride lies in ruins, thanks to your efforts." |
178 | 181 | desc[#desc+1] = _t"" |
179 | 182 | |
183 | + -- Avatars are special | |
184 | + if who:isQuestStatus("high-peak", engine.Quest.COMPLETED, "distant-sun") then | |
185 | + desc[#desc+1] = _t"Your patron's plan worked. As your body was crushed by the raw forces of the void portal it opened wide. In an instant the connection was made and waves of heat came through." | |
186 | + desc[#desc+1] = _t"The mad sun brought forth all its power through the portal, turning the High Peak into a giant searing needle!" | |
187 | + desc[#desc+1] = _t"A few minutes later the whole world was set ablaze, nothing survived except Faeros elementals." | |
188 | + return 0, desc | |
189 | + elseif who:isQuestStatus("high-peak", engine.Quest.COMPLETED, "distant-sun-stab") then | |
190 | + desc[#desc+1] = _t"In the aftermath of the battle the Distant Sun tried to force you to open the portal to bring it forth onto Eyal." | |
191 | + desc[#desc+1] = _t"Through an incredible display of willpower you resisted long enough to ask Aeryn to kill you." | |
192 | + desc[#desc+1] = _t"She sadly agreed and ran her sword through you, enabling you to do the last sacrifice you could for the world." | |
193 | + return 0, desc | |
194 | + elseif who:isQuestStatus("high-peak", engine.Quest.COMPLETED, "distant-sun-shertul") then | |
195 | + desc[#desc+1] = _t"In the aftermath of the battle the Distant Sun tried to force you to open the portal to bring it forth onto Eyal." | |
196 | + desc[#desc+1] = _t"Through an incredible display of willpower you resisted for a few decisive seconds. During this time a Sher'tul appeared, took the Staff and killed you." | |
197 | + desc[#desc+1] = _t"Though you succumbed to the fight, your mind was already gone, burnt to ashes by your mad patron sun. But the world was saved." | |
198 | + return 0, desc | |
199 | + end | |
200 | + | |
180 | 201 | -- Yeeks are special |
181 | 202 | if who:isQuestStatus("high-peak", engine.Quest.COMPLETED, "yeek") then |
182 | 203 | desc[#desc+1] = _t"Your sacrifice worked. Your mental energies were imbued with farportal energies. The Way radiated from the High Peak toward the rest of Eyal like a mental tidal wave." | ... | ... |
... | ... | @@ -18,6 +18,48 @@ |
18 | 18 | -- darkgod@te4.org |
19 | 19 | |
20 | 20 | newTalent{ |
21 | + name = "Gravitic Effulgence", | |
22 | + type = {"celestial/other", 1}, | |
23 | + mode = "sustained", | |
24 | + points = 1, | |
25 | + cooldown = 10, | |
26 | + tactical = { BUFF = 2 }, | |
27 | + range = 10, | |
28 | + getShieldFlat = function(self, t) | |
29 | + return t.getDamage(self, t) | |
30 | + end, | |
31 | + activate = function(self, t) | |
32 | + game:onTickEnd(function() | |
33 | + if self:isTalentActive(self.T_WEAPON_OF_LIGHT) then | |
34 | + self.turn_procs.resetting_talents = true | |
35 | + self:forceUseTalent(self.T_WEAPON_OF_LIGHT, {ignore_energy=true, ignore_cd=true, no_talent_fail=true}) | |
36 | + self:forceUseTalent(self.T_WEAPON_OF_LIGHT, {ignore_energy=true, ignore_cd=true, no_talent_fail=true, talent_reuse=true}) | |
37 | + self.turn_procs.resetting_talents = nil | |
38 | + end | |
39 | + end) | |
40 | + | |
41 | + game:playSoundNear(self, "talents/spell_generic2") | |
42 | + local ret = {} | |
43 | + return ret | |
44 | + end, | |
45 | + deactivate = function(self, t, p) | |
46 | + game:onTickEnd(function() | |
47 | + if self:isTalentActive(self.T_WEAPON_OF_LIGHT) then | |
48 | + self.turn_procs.resetting_talents = true | |
49 | + self:forceUseTalent(self.T_WEAPON_OF_LIGHT, {ignore_energy=true, ignore_cd=true, no_talent_fail=true}) | |
50 | + self:forceUseTalent(self.T_WEAPON_OF_LIGHT, {ignore_energy=true, ignore_cd=true, no_talent_fail=true, talent_reuse=true}) | |
51 | + self.turn_procs.resetting_talents = nil | |
52 | + end | |
53 | + end) | |
54 | + | |
55 | + return true | |
56 | + end, | |
57 | + info = function(self, t) | |
58 | + return ([[Your Weapon of Light nows pulls in all foes in radius 5.]]):tformat() | |
59 | + end, | |
60 | +} | |
61 | + | |
62 | +newTalent{ | |
21 | 63 | name = "Weapon of Light", |
22 | 64 | type = {"celestial/combat", 1}, |
23 | 65 | mode = "sustained", |
... | ... | @@ -27,19 +69,18 @@ newTalent{ |
27 | 69 | sustain_positive = 10, |
28 | 70 | tactical = { BUFF = 2 }, |
29 | 71 | range = 10, |
30 | - getDamage = function(self, t) return 7 + self:combatSpellpower(0.092) * self:combatTalentScale(t, 1, 7) end, | |
72 | + getDamage = function(self, t) return (7 + self:combatSpellpower(0.092) * self:combatTalentScale(t, 1, 7)) end, | |
31 | 73 | getShieldFlat = function(self, t) |
32 | 74 | return t.getDamage(self, t) |
33 | 75 | end, |
34 | 76 | activate = function(self, t) |
35 | 77 | game:playSoundNear(self, "talents/spell_generic2") |
36 | - local ret = { | |
37 | - dam = self:addTemporaryValue("melee_project", {[DamageType.LIGHT]=t.getDamage(self, t)}), | |
38 | - } | |
78 | + local ret = {} | |
79 | + if not self:isTalentActive(self.T_GRAVITIC_EFFULGENCE) then ret.dam = self:addTemporaryValue("melee_project", {[DamageType.LIGHT]=t.getDamage(self, t)}) end | |
39 | 80 | return ret |
40 | 81 | end, |
41 | 82 | deactivate = function(self, t, p) |
42 | - self:removeTemporaryValue("melee_project", p.dam) | |
83 | + if p.dam then self:removeTemporaryValue("melee_project", p.dam) end | |
43 | 84 | return true |
44 | 85 | end, |
45 | 86 | callbackOnMeleeAttack = function(self, t, target, hitted, crit, weapon, damtype, mult, dam) |
... | ... | @@ -55,6 +96,14 @@ newTalent{ |
55 | 96 | self.damage_shield_absorb_max = self.damage_shield_absorb_max + shield_power |
56 | 97 | shield.dur = math.max(2, shield.dur) |
57 | 98 | end |
99 | + if hitted and self:isTalentActive(self.T_GRAVITIC_EFFULGENCE) then | |
100 | + local list = table.values(self:projectCollect({type="ball", radius=5, x=target.x, y=target.y, friendlyfire=false}, target.x, target.y, Map.ACTOR)) | |
101 | + table.sort(list, "dist") | |
102 | + for _, l in ipairs(list) do | |
103 | + if l.target:canBe("knockback") then l.target:pull(target.x, target.y, 5) end | |
104 | + end | |
105 | + self:project({type="ball", radius=2, x=target.x, y=target.y, friendlyfire=false}, target.x, target.y, DamageType.LIGHT, t.getDamage(self, t)) | |
106 | + end | |
58 | 107 | end, |
59 | 108 | info = function(self, t) |
60 | 109 | local damage = t.getDamage(self, t) | ... | ... |
... | ... | @@ -227,3 +227,29 @@ newTalent{ |
227 | 227 | tformat(weapon, shield, cooldown, cleanse) |
228 | 228 | end, |
229 | 229 | } |
230 | + | |
231 | + | |
232 | + | |
233 | +newTalent{ | |
234 | + name = "Avatar Distant Sun Unlock Checker", short_name = "AVATAR_DISTANT_SUN_UNLOCK_CHECKER", image = "talents/avatar_of_a_distant_sun.png", | |
235 | + type = {"celestial/other",1}, | |
236 | + mode = "passive", | |
237 | + hide = "always", | |
238 | + no_unlearn_last = true, | |
239 | + callbackOnAct = function(self, t) | |
240 | + if not game.zone or not game.zone.in_orbit then return end | |
241 | + if not rng.chance(30) then return end | |
242 | + | |
243 | + local chat = require("engine.Chat").new("avatar-distant-sun-unlock", t, self) | |
244 | + chat:invoke() | |
245 | + end, | |
246 | + doUnlock = function(self, t) | |
247 | + game:setAllowedBuild("paladin_avatar", true) | |
248 | + self:unlearnTalent(self.T_AVATAR_DISTANT_SUN_UNLOCK_CHECKER) | |
249 | + self:project({type="ball", radius=20, friendlyfire=false}, self.x, self.y, DamageType.FIRE, 5000) | |
250 | + game.level.map:particleEmitter(x, y, 20, "fireflash", {radius=20, proj_x=self.x, proj_y=self.y, src_x=self.x, src_y=self.y}) | |
251 | + end, | |
252 | + info = function(self, t) | |
253 | + return "Move along, nothing to see" -- No need to translate | |
254 | + end, | |
255 | +} | ... | ... |
... | ... | @@ -112,8 +112,8 @@ newTalent{ |
112 | 112 | range = function(self) return radianceRadius(self) end, |
113 | 113 | tactical = { ATTACKAREA = {LIGHT=1} }, |
114 | 114 | sustain_positive = 10, |
115 | - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 3, 35) end, | |
116 | - getDaze = function(self, t) return self:combatTalentLimit(t, 35, 8, 25) end, | |
115 | + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 3, 35) * (self:attr("sun_paladin_avatar") and 2 or 1) end, | |
116 | + getDaze = function(self, t) return self:combatTalentLimit(t, 35, 8, 25) * (self:attr("sun_paladin_avatar") and 2 or 1) end, | |
117 | 117 | updateParticle = function(self, t) |
118 | 118 | local p = self:isTalentActive(self.T_SEARING_SIGHT) |
119 | 119 | if not p then return end | ... | ... |
... | ... | @@ -152,6 +152,9 @@ newTalent{ |
152 | 152 | if self.talents_cd[self.T_SUN_BEAM] <= 0 then self.talents_cd[self.T_SUN_BEAM] = nil end |
153 | 153 | else |
154 | 154 | self:setEffect(self.EFF_SUN_VENGEANCE, 2, {}) |
155 | + if self:attr("sun_paladin_avatar") then | |
156 | + self:alterTalentCoolingdown(self.T_JUDGEMENT, -6) | |
157 | + end | |
155 | 158 | end |
156 | 159 | end, |
157 | 160 | info = function(self, t) | ... | ... |
... | ... | @@ -120,6 +120,7 @@ spells_req_high5 = { |
120 | 120 | } |
121 | 121 | |
122 | 122 | function thaumaturgyCheck(self) |
123 | + if self:attr("archmage_widebeam_always") then return true end | |
123 | 124 | if not self:attr("archmage_widebeam") then return false end |
124 | 125 | local inven = self:getInven("BODY") |
125 | 126 | if not inven then return true end | ... | ... |
... | ... | @@ -276,3 +276,50 @@ uberTalent{ |
276 | 276 | :tformat() |
277 | 277 | end, |
278 | 278 | } |
279 | + | |
280 | + | |
281 | +uberTalent{ | |
282 | + name = "Avatar of a Distant Sun", | |
283 | + require = { | |
284 | + birth_descriptors={{"subclass", "Sun Paladin"}}, | |
285 | + special={desc=_t"Unlocked the evolution", fct=function(self) return profile.mod.allow_build.paladin_avatar end}, | |
286 | + special2={desc=_t"Found a distant patron", fct=function(self) return not self:attr("pissed_of_distant_sun") end}, | |
287 | + stat = {mag=25}, | |
288 | + talent = {"T_SUN_VENGEANCE", "T_WEAPON_OF_LIGHT", "T_SEARING_SIGHT", "T_JUDGEMENT"}, | |
289 | + }, | |
290 | + is_class_evolution = "Sun Paladin", | |
291 | + cant_steal = true, | |
292 | + mode = "passive", | |
293 | + becomeAvatar = function(self, t) | |
294 | + self.descriptor.class_evolution = _t"Avatar of a Distant Sun" | |
295 | + | |
296 | + self:attr("sun_paladin_avatar", 1) | |
297 | + self:attr("allow_mainhand_2h_in_1h", 1) | |
298 | + self:attr("allow_mainhand_2h_in_1h_no_penalty", 1) | |
299 | + self:addTemporaryValue("all_damage_convert", DamageType.LIGHT) | |
300 | + self:addTemporaryValue("all_damage_convert_percent", 50) | |
301 | + self:learnTalent(self.T_GRAVITIC_EFFULGENCE, true) | |
302 | + game.level.map:particleEmitter(self.x, self.y, 5, "sunburst", {radius=5, max_alpha=80}) | |
303 | + end, | |
304 | + on_learn = function(self, t, kind) | |
305 | + if not game.party:hasMember(self) then return end | |
306 | + local Chat = require "engine.Chat" | |
307 | + local chat = Chat.new("avatar-distant-sun", {name=_t"Distant Sun", image="talents/avatar_of_a_distant_sun.png"}, self) | |
308 | + chat:invoke() | |
309 | + end, | |
310 | + info = function(self, t) | |
311 | + return ([[During your studies of celestial forces you came in contact with an entity far beyond Eyal: the living incarnation of a Star! | |
312 | + By allying yourself with it you can gain its power! | |
313 | + | |
314 | + Grants multiple benefits: | |
315 | + - The strength of your bond is so strong that you can now #GOLD#wield a two-handed weapon and a shield together#LAST# | |
316 | + - 50%% of all damage you deal is converted to #GOLD#light damage#LAST# | |
317 | + - #GOLD#Gravitic Effulgence#LAST#: whenever your Weapon of Light hits the damage is now a radius 2 sphere and all foes in range 5 are drawn to it. (You can toggle this effect) | |
318 | + - The damage and chance to trigger of #GOLD#Searing Sight#LAST# is doubled | |
319 | + - Whenever #GOLD#Sun's Vengeance#LAST# triggers the remaining cooldown of Judgement is reduced by 6. | |
320 | + - If you also know #GOLD#Irresistible Sun#LAST#, it will set the fire and light resistances of those affected to 0%% | |
321 | + | |
322 | + #{italic}##GOLD#Will you bind yourself to the Distant Sun?#{normal}# | |
323 | + ]]):tformat() | |
324 | + end, | |
325 | +} | ... | ... |
1 | +-- ToME - Tales of Maj'Eyal | |
2 | +-- Copyright (C) 2009 - 2019 Nicolas Casalini | |
3 | +-- | |
4 | +-- This program is free software: you can redistribute it and/or modify | |
5 | +-- it under the terms of the GNU General Public License as published by | |
6 | +-- the Free Software Foundation, either version 3 of the License, or | |
7 | +-- (at your option) any later version. | |
8 | +-- | |
9 | +-- This program is distributed in the hope that it will be useful, | |
10 | +-- but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | +-- GNU General Public License for more details. | |
13 | +-- | |
14 | +-- You should have received a copy of the GNU General Public License | |
15 | +-- along with this program. If not, see <http://www.gnu.org/licenses/>. | |
16 | +-- | |
17 | +-- Nicolas Casalini "DarkGod" | |
18 | +-- darkgod@te4.org | |
19 | + | |
20 | +return _t"New Class Evolution: #LIGHT_GREEN#Avatar of a Distant Sun (Sun Paladin)", | |
21 | +_t[[Yuo have been contacted by a sentient star, far away from Eyal. It wants to help you on your journey! | |
22 | + | |
23 | +You have unlocked the #LIGHT_GREEN#Avatar of a Distant Sun class evolution#WHITE# for Sun Paladins. | |
24 | + | |
25 | +Features: | |
26 | +- #GOLD#Wield a two-handed weapon and a shield together#LAST# | |
27 | +- 50%% of all damage dealt is converted to #GOLD#light damage#LAST# | |
28 | +- #GOLD#Gravitic Effulgence#LAST#: whenever Weapon of Light hits the damage is now a radius 2 sphere and all foes in range 5 are drawn to it | |
29 | +- The damage and chance to trigger of #GOLD#Searing Sight#LAST# is doubled | |
30 | +- Whenever #GOLD#Sun's Vengeance#LAST# triggers the remaining cooldown of Judgement is reduced by 6 | |
31 | +- Interacts with #GOLD#Irresistible Sun#LAST# | |
32 | + | |
33 | +Class evolutions are selected as prodigies and grant new ways to build and expand your class and are only visible to the concerned class. | |
34 | +]] | ... | ... |
... | ... | @@ -2811,7 +2811,7 @@ newEffect{ |
2811 | 2811 | |
2812 | 2812 | if self:reactionToward(target) < 0 then |
2813 | 2813 | local dam = eff.dam * (1 + (5 - core.fov.distance(self.x, self.y, target.x, target.y)) / 8) |
2814 | - target:setEffect(target.EFF_WEIGHT_OF_THE_SUN, 2, {reduce = 30}) -- Quickly wears off when outside of AoE | |
2814 | + target:setEffect(target.EFF_WEIGHT_OF_THE_SUN, 2, {reduce = 30, resists = self:attr("sun_paladin_avatar")}) -- Quickly wears off when outside of AoE | |
2815 | 2815 | DamageType:get(DamageType.FIRE).projector(self, target.x, target.y, DamageType.FIRE, dam/3) |
2816 | 2816 | DamageType:get(DamageType.LIGHT).projector(self, target.x, target.y, DamageType.LIGHT, dam/3) |
2817 | 2817 | DamageType:get(DamageType.PHYSICAL).projector(self, target.x, target.y, DamageType.PHYSICAL, dam/3) |
... | ... | @@ -2825,7 +2825,7 @@ newEffect{ |
2825 | 2825 | newEffect{ |
2826 | 2826 | name = "WEIGHT_OF_THE_SUN", image = "talents/irresistible_sun.png", |
2827 | 2827 | desc = _t"Weight of the Sun", |
2828 | - long_desc = function(self, eff) return ("The target is struggling against immense gravity, all damage it does is reduced by %d%%."):tformat(eff.reduce) end, | |
2828 | + long_desc = function(self, eff) return ("The target is struggling against immense gravity, all damage it does is reduced by %d%%.%s"):tformat(eff.reduce, eff.resists and _t" Due to facing an Avatar of a Distant Sun, fire and light resistances are reduced to 0%." or "") end, | |
2829 | 2829 | type = "magical", |
2830 | 2830 | subtype = { sun=true,}, |
2831 | 2831 | status = "detrimental", |
... | ... | @@ -2834,6 +2834,10 @@ newEffect{ |
2834 | 2834 | on_lose = function(self, err) return _t"#Target# can move freely once more.", _t"-Weight of the Sun" end, |
2835 | 2835 | activate = function(self, eff) |
2836 | 2836 | self:effectTemporaryValue(eff, "numbed", eff.reduce) |
2837 | + if eff.resists then | |
2838 | + game.log("plop") | |
2839 | + self:effectTemporaryValue(eff, "resists", {[DamageType.LIGHT]=-self:combatGetResist(DamageType.LIGHT), [DamageType.FIRE]=-self:combatGetResist(DamageType.FIRE)}) | |
2840 | + end | |
2837 | 2841 | end, |
2838 | 2842 | } |
2839 | 2843 | ... | ... |
... | ... | @@ -382,3 +382,35 @@ newEntity{ define_as = "HIGH_SUN_PALADIN_AERYN", |
382 | 382 | }, |
383 | 383 | resolvers.sustains_at_birth(), |
384 | 384 | } |
385 | + | |
386 | +-- For the sunpala evo ending | |
387 | +load("/data/general/npcs/shertul.lua") | |
388 | +newEntity{ base = "BASE_NPC_SHERTUL", define_as = "CALDIZAR_AOADS", | |
389 | + name = "Caldizar", color=colors.LIGHT_RED, unique="Caldizar AOADS", | |
390 | + resolvers.nice_tile{image="invis.png", add_mos = {{image="npc/horror_sher_tul_caldizar.png", display_h=2, display_y=-1}}}, | |
391 | + desc =_t"A creature stands before you, with long tentacle-like appendages and a squat bump in place of a head. An intense aura of power radiates from this being unlike anything you've ever felt before. It can only be a Sher'Tul. A living Sher'Tul!", | |
392 | + level_range = {1000, nil}, exp_worth = 5, | |
393 | + life_rating = 400, life_regen = 100000, | |
394 | + rank = 11, | |
395 | + size_category = 4, | |
396 | + faction = "sher'tul", | |
397 | + autolevel = "caster", | |
398 | + combat_armor = 1, combat_def = 0, | |
399 | + combat = {dam=resolvers.levelup(resolvers.mbonus(25, 15), 1, 1.1), apr=0, atk=resolvers.mbonus(30, 15), dammod={mag=0.6}}, | |
400 | + | |
401 | + invulnerable = 1, | |
402 | + archmage_widebeam = 1, | |
403 | + archmage_widebeam_always = 1, | |
404 | + | |
405 | + resists = {all = 70}, | |
406 | + inc_damage = {all=10000}, | |
407 | + | |
408 | + ai = "tactical", ai_state = { talent_in=1, ai_move="move_astar", }, | |
409 | + | |
410 | + talent_cd_reduction = { | |
411 | + [Talents.T_ELEMENTAL_ARRAY_BURST] = 1000, | |
412 | + }, | |
413 | + resolvers.talents{ | |
414 | + [Talents.T_ELEMENTAL_ARRAY_BURST]=100, | |
415 | + } | |
416 | +} | ... | ... |
... | ... | @@ -104,9 +104,11 @@ newEntity{ define_as = "CELIA", |
104 | 104 | game.player:setQuestStatus("lichform", engine.Quest.COMPLETED, "heart") |
105 | 105 | |
106 | 106 | local o = game.zone:makeEntityByName(game.level, "object", "CELIA_HEART") |
107 | - o:identify(true) | |
108 | - if p:addObject(p.INVEN_INVEN, o) then | |
109 | - game.logPlayer(p, "You receive: %s.", o:getName{do_color=true}) | |
107 | + if o then | |
108 | + o:identify(true) | |
109 | + if p:addObject(p.INVEN_INVEN, o) then | |
110 | + game.logPlayer(p, "You receive: %s.", o:getName{do_color=true}) | |
111 | + end | |
110 | 112 | end |
111 | 113 | |
112 | 114 | local Dialog = require("engine.ui.Dialog") | ... | ... |
... | ... | @@ -26,7 +26,7 @@ newEntity{ base = "BASE_NPC_SHERTUL", define_as = "CALDIZAR", |
26 | 26 | desc =_t"A creature stands before you, with long tentacle-like appendages and a squat bump in place of a head. An intense aura of power radiates from this being unlike anything you've ever felt before. It can only be a Sher'Tul. A living Sher'Tul!", |
27 | 27 | level_range = {1000, nil}, exp_worth = 5, |
28 | 28 | life_rating = 40, |
29 | - rank = 5, | |
29 | + rank = 11, | |
30 | 30 | size_category = 4, |
31 | 31 | faction = "sher'tul", |
32 | 32 | autolevel = "caster", | ... | ... |
... | ... | @@ -41,7 +41,7 @@ function _M:init(actor, levelup_end_prodigies) |
41 | 41 | self.actor_dup = actor:clone() |
42 | 42 | self.actor_dup.uid = actor.uid -- Yes ... |
43 | 43 | |
44 | - Dialog.init(self, ("Prodigies: %s"):tformat(actor:getName()), 800, game.h * 0.9) | |
44 | + Dialog.init(self, ("Prodigies: %s"):tformat(actor:getName()), math.min(math.max(game.w * 0.8, 800), 1200, game.w), game.h * 0.9) | |
45 | 45 | |
46 | 46 | self:generateList() |
47 | 47 | ... | ... |
-
Please register or login to post a comment