Commit a22f7184bc637384d53f6567d103f8f506f216cd

Authored by DarkGod
2 parents 84c15aa5 d6972771

Merge branch 'sunpalevo'

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,
... ...
... ... @@ -161,6 +161,7 @@ newBirthDescriptor
161 161 confusion_immune = 0.35,
162 162 max_air = 200,
163 163 moddable_tile = "yeek",
  164 + moddable_tile_nude = 1,
164 165 random_name_def = "yeek_#sex#",
165 166 },
166 167 experience = 0.85,
... ...
  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),
... ...
... ... @@ -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
... ...
... ... @@ -34,6 +34,7 @@ return {
34 34 no_level_connectivity = true,
35 35 force_controlled_teleport = true,
36 36 no_autoexplore = true,
  37 + in_orbit = true,
37 38 effects = {"EFF_ZONE_AURA_ABASHED"},
38 39
39 40 generator = {
... ...
... ... @@ -29,6 +29,7 @@ return {
29 29 no_worldport = true,
30 30 is_demon_plane = true,
31 31 no_planechange = true,
  32 + in_orbit = true,
32 33 ambient_music = "Straight Into Ambush.ogg",
33 34 effects = {"EFF_ZONE_AURA_FEARSCAPE"},
34 35 generator = {
... ...
... ... @@ -29,6 +29,7 @@ return {
29 29 -- all_lited = true,
30 30 persistent = "zone",
31 31 no_worldport = true,
  32 + in_orbit = true,
32 33 is_demon_plane = true,
33 34 ambient_music = "Straight Into Ambush.ogg",
34 35 min_material_level = 4,
... ...
... ... @@ -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
... ...