Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • amagad/t-engine4
  • HirumaKai/t-engine4
  • Hogulus/t-engine4
  • Inkie/t-engine4
  • Liberty/t-engine4
  • Lokean/t-engine4
  • Mawootad/t-engine4
  • Michelle/t-engine4
  • MrFrog/t-engine4
  • Nagyhal/t-engine4
  • Recaiden/t-engine4
  • RootOfAllThings/t-engine4
  • Sebsebeleb/t-engine4
  • Sheila/t-engine4
  • Shibari/t-engine4
  • Stof/t-engine4
  • Umbral/t-engine4
  • tome/t-engine4
  • 0player/t-engine4
  • BreezyIdiot/t-engine4
  • Bunny/t-engine4
  • Effigy/t-engine4
  • Hachem_Muche/t-engine4
  • razakai/t-engine4
  • Zireael/t-engine4
  • cinornu/t-engine4
  • edge2054/t-engine4
  • gordaxx727/t-engine4
  • grayswandir/t-engine4
  • helminthauge/t-engine4
  • housepet/t-engine4
  • minqmay/t-engine4
  • nsrr/t-engine4
  • orange/t-engine4
  • otowakotori/t-engine4
  • purequestion/t-engine4
  • rexorcorum/t-engine4
  • rgeens/t-engine4
  • sageacrin/t-engine4
  • stuntofthelitter/t-engine4
  • tiger_eye/t-engine4
  • xelivous/t-engine4
  • yutio888/t-engine4
43 results
Show changes
Commits on Source (23)
Showing
with 74 additions and 44 deletions
game/engines/default/data/gfx/background/tome-logo.png

197 KiB | W: 0px | H: 0px

game/engines/default/data/gfx/background/tome-logo.png

211 KiB | W: 0px | H: 0px

game/engines/default/data/gfx/background/tome-logo.png
game/engines/default/data/gfx/background/tome-logo.png
game/engines/default/data/gfx/background/tome-logo.png
game/engines/default/data/gfx/background/tome-logo.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -386,10 +386,11 @@ function _M:performlogin(login, pass)
end
end
function _M:performloginSteam(token, name, email)
function _M:performloginSteam(token, name, email, news)
self.steam_token = token
self.steam_token_name = name
if email then self.steam_token_email = email end
if news ~= nil then self.steam_token_news = news end
print("[ONLINE PROFILE] attempting log in steam", token)
self.auth_tried = nil
self:tryAuth()
......@@ -579,7 +580,7 @@ function _M:tryAuth()
print("[ONLINE PROFILE] auth")
self.auth_last_error = nil
if self.steam_token then
core.profile.pushOrder(table.serialize{o="SteamLogin", token=self.steam_token, name=self.steam_token_name, email=self.steam_token_email})
core.profile.pushOrder(table.serialize{o="SteamLogin", token=self.steam_token, name=self.steam_token_name, email=self.steam_token_email, news=self.steam_token_news})
else
core.profile.pushOrder(table.serialize{o="Login", l=self.login, p=self.pass})
end
......@@ -861,10 +862,10 @@ function _M:currentCharacter(module, title, uuid)
print("[ONLINE PROFILE] current character ", title)
end
function _M:newProfile(Login, Name, Password, Email)
print("[ONLINE PROFILE] profile options ", Login, Email, Name)
function _M:newProfile(Login, Name, Password, Email, Newsletter)
print("[ONLINE PROFILE] profile options ", Login, Email, Name, Newsletter)
core.profile.pushOrder(table.serialize{o="NewProfile2", login=Login, email=Email, name=Name, pass=Password})
core.profile.pushOrder(table.serialize{o="NewProfile2", login=Login, email=Email, name=Name, pass=Password, newsletter=Newsletter and 'yes' or 'no'})
local id = nil
local reason = nil
self:waitEvent("NewProfile2", function(e) id = e.uid reason = e.reason end)
......
......@@ -123,6 +123,11 @@ function _M:getFragment(name)
code[#code+1] = l
end
f:close()
-- if config.settings.cheat then
-- print("====== FRAG")
-- local nb = 1 for line in table.concat(code):gmatch("([^\n]*)\n") do print(nb, line) nb = nb + 1 end
-- print("======")
-- end
self.frags[name] = core.shader.newShader(table.concat(code))
print("[SHADER] created fragment shader from /data/gfx/shaders/"..name..".frag")
return self.frags[name]
......@@ -139,6 +144,11 @@ function _M:getVertex(name)
code[#code+1] = l
end
f:close()
-- if config.settings.cheat then
-- print("====== VERT")
-- local nb = 1 for line in table.concat(code):gmatch("([^\n]*)\n") do print(nb, line) nb = nb + 1 end
-- print("======")
-- end
self.verts[name] = core.shader.newShader(table.concat(code), true)
print("[SHADER] created vertex shader from /data/gfx/shaders/"..name..".vert")
return self.verts[name]
......
......@@ -36,7 +36,7 @@ function _M:init(t)
if fs.exists(self.dest) then
self.dest = fs.getRealPath(self.dest)
else
local _, _, dir, name = self.dest:find("(.+)/([^/]+)$")
local _, _, dir, name = self.dest:find("(.+/)([^/]+)$")
if dir then
self.dest = fs.getRealPath(dir)..fs.getPathSeparator()..name
end
......
......@@ -891,7 +891,7 @@ end
--- Is talent in cooldown?
function _M:isTalentCoolingDown(t)
t = self:getTalentFromId(t)
if not t.cooldown then return false end
if not t or not t.cooldown then return false end
if self.talents_cd[t.id] and self.talents_cd[t.id] > 0 then return self.talents_cd[t.id] else return false end
end
......
......@@ -21,7 +21,7 @@
-- Where values are {major, minor, patch, engine_name, c_core}
-- @script engine.version
engine.version = {1,5,0,"te4",17}
engine.version = {1,5,1,"te4",17}
engine.require_c_core = engine.version[5]
engine.version_id = ("%s-%d_%d.%d.%d"):format(engine.version[4], engine.require_c_core, engine.version[1], engine.version[2], engine.version[3])
......
......@@ -281,7 +281,7 @@ function _M:grabAddons()
local ok = d:start()
if ok then
local wdir = fs.getWritePath()
local _, _, dir, name = add.file:find("(.+)/([^/]+)$")
local _, _, dir, name = add.file:find("(.+/)([^/]+)$")
if dir then
fs.setWritePath(fs.getRealPath(dir))
fs.delete(name)
......@@ -594,7 +594,7 @@ function _M:createProfile(loginItem)
else
self.auth_tried = nil
local d = Dialog:simpleWaiter("Registering...", "Registering on http://te4.org/, please wait...") core.display.forceRedraw()
local ok, err = profile:newProfile(loginItem.login, loginItem.name, loginItem.pass, loginItem.email)
local ok, err = profile:newProfile(loginItem.login, loginItem.name, loginItem.pass, loginItem.email, loginItem.news)
profile:waitFirstAuth()
d:done()
if profile.auth then
......
......@@ -20,6 +20,7 @@
require "engine.class"
local Dialog = require "engine.ui.Dialog"
local Button = require "engine.ui.Button"
local Checkbox = require "engine.ui.Checkbox"
local Textbox = require "engine.ui.Textbox"
local Textzone = require "engine.ui.Textzone"
......@@ -64,6 +65,8 @@ function _M:init(dialogdef, profile_help_text)
self.c_pass = Textbox.new{title="Password: ", size_title=pwa, text="", chars=30, max_len=20, hide=true, filter=pass_filter, fct=function(text) self:okclick() end}
self.c_pass2 = Textbox.new{title=pwa, text="", size_title=pwa, chars=30, max_len=20, hide=true, filter=pass_filter, fct=function(text) self:okclick() end}
self.c_email = Textbox.new{title="Email: ", size_title=pwa, text="", chars=30, max_len=60, filter=pass_filter, fct=function(text) self:okclick() end}
self.c_news = Checkbox.new{title="Accept to receive #{bold}#very infrequent#{normal}# (a few per year) mails", default=true, fct=function() self:okclick() end}
self.c_news2 = Textzone.new{text="about important game events from us.", width=self.iw - 20, auto_height=true}
local ok = require("engine.ui.Button").new{text="Create", fct=function() self:okclick() end}
local cancel = require("engine.ui.Button").new{text="Cancel", fct=function() self:cancelclick() end}
......@@ -73,6 +76,8 @@ function _M:init(dialogdef, profile_help_text)
{left=0, top=self.c_desc.h+self.c_login.h+5, ui=self.c_pass},
{left=0, top=self.c_desc.h+self.c_login.h+self.c_pass.h+5, ui=self.c_pass2},
{left=0, top=self.c_desc.h+self.c_login.h+self.c_pass.h+self.c_pass2.h+10, ui=self.c_email},
{left=0, top=self.c_desc.h+self.c_login.h+self.c_pass.h+self.c_pass2.h+self.c_email.h+10, ui=self.c_news},
{left=0, top=self.c_desc.h+self.c_login.h+self.c_pass.h+self.c_pass2.h+self.c_email.h+self.c_news2.h+10, ui=self.c_news2},
{left=0, bottom=0, ui=ok},
{right=0, bottom=0, ui=cancel},
}
......@@ -105,7 +110,7 @@ function _M:okclick()
end
game:unregisterDialog(self)
game:createProfile({create=self.c_email and true or false, login=self.c_login.text, pass=self.c_pass.text, email=self.c_email and self.c_email.text})
game:createProfile({create=self.c_email and true or false, login=self.c_login.text, pass=self.c_pass.text, email=self.c_email and self.c_email.text, news=self.c_news.checked})
end
function _M:cancelclick()
......
......@@ -20,6 +20,7 @@
require "engine.class"
local Dialog = require "engine.ui.Dialog"
local Button = require "engine.ui.Button"
local Checkbox = require "engine.ui.Checkbox"
local Textbox = require "engine.ui.Textbox"
local Textzone = require "engine.ui.Textzone"
......@@ -42,12 +43,16 @@ Luckily this is very easy to do: you only require a profile name and optionally
self.c_login = Textbox.new{title="Username: ", text="", chars=30, max_len=20, fct=function(text) self:okclick() end}
self.c_email = Textbox.new{title="Email: ", size_title=self.c_login.title, text="", chars=30, max_len=60, fct=function(text) self:okclick() end}
self.c_news = Checkbox.new{title="Accept to receive #{bold}#very infrequent#{normal}# (a few per year) mails", default=true, fct=function() self:okclick() end}
self.c_news2 = Textzone.new{text="about important game events from us.", width=self.iw - 20, auto_height=true}
local ok = require("engine.ui.Button").new{text="Register", fct=function() self:okclick() end}
local cancel = require("engine.ui.Button").new{text="Cancel", fct=function() self:cancelclick() end}
self:loadUI{
{left=0, top=0, ui=self.c_desc},
{left=0, top=self.c_desc.h, ui=self.c_login},
{left=0, top=self.c_desc.h+self.c_login.h+5, ui=self.c_email},
{left=0, top=self.c_desc.h+self.c_login.h+self.c_email.h+5, ui=self.c_news},
{left=0, top=self.c_desc.h+self.c_login.h+self.c_email.h+self.c_news.h+5, ui=self.c_news2},
{left=0, bottom=0, ui=ok},
{right=0, bottom=0, ui=cancel},
}
......@@ -78,7 +83,7 @@ function _M:okclick()
return
end
profile:performloginSteam(ticket:toHex(), self.c_login.text, self.c_email.text ~= "" and self.c_email.text)
profile:performloginSteam(ticket:toHex(), self.c_login.text, self.c_email.text ~= "" and self.c_email.text, self.c_news.checked)
profile:waitFirstAuth()
d:done()
if not profile.auth and profile.auth_last_error then
......
......@@ -1839,9 +1839,8 @@ function _M:tooltip(x, y, seen_by)
ts:add(self.type:capitalize(), " / ", self.subtype:capitalize(), true)
ts:add("Rank: ") ts:merge(rank_color:toTString()) ts:add(rank, {"color", "WHITE"}, true)
ts:add({"color", 0, 255, 255}, ("Level: %d"):format(self.level), {"color", "WHITE"}, true)
if self.life < 0 then ts:add({"color", 255, 0, 0}, "HP: unknown", {"color", "WHITE"})
else ts:add({"color", 255, 0, 0}, ("HP: %d (%d%%)"):format(self.life, self.life * 100 / self.max_life), {"color", "WHITE"})
end
ts:add({"color", 255, 0, 0}, ("HP: %d (%d%%)"):format(self.life, self.life * 100 / self.max_life), {"color", "WHITE"})
if self:knowTalent(self.T_SOLIPSISM) then
local psi_percent = 100*self.psi/self.max_psi
ts:add((("#7fffd4# / %d")):format(self.psi), (" (%d%%)"):format(psi_percent),{"color", "WHITE"})
......
......@@ -93,10 +93,11 @@ function _M:unlockShimmer(o)
local shimmer_name
local unique = nil
-- if o.randart or o.rare then return end
if o.unique and not o.randart then
shimmer_name = o:getName{do_color=true, no_add_name=true, no_image=true, force_id=true}
unique = true
elseif o.__original and not o.__original.randart then
elseif o.__original and not o.__original.randart and not o.__original.rare then
o = o.__original
shimmer_name = o:getName{do_color=true, no_add_name=true, no_image=true, force_id=true}
else
......
......@@ -96,10 +96,11 @@ local function samecolor(c1, c2)
end
function _M:makeTextureBar(text, nfmt, val, max, reg, x, y, r, g, b, bar_col, bar_bgcol)
local oval = val
val = util.bound(val, 0, max)
local cached = self.tex_cache.texture_bars[text]
-- it's a bunch of number comparisons so it's sufficiently fast for jit
local cached_ok = cached and (nfmt == cached.nfmt) and (val == cached.val) and (max == cached.max) and (reg == cached.reg) and
local cached_ok = cached and (nfmt == cached.nfmt) and (oval == cached.val) and (max == cached.max) and (reg == cached.reg) and
(r == cached.r) and (g == cached.g) and (b == cached.b) and samecolor(bar_col, cached.bar_col) and samecolor(bar_bgcol, cached.bar_bgcol)
if not cached_ok then
local items = {}
......@@ -110,14 +111,14 @@ function _M:makeTextureBar(text, nfmt, val, max, reg, x, y, r, g, b, bar_col, ba
core.display.drawQuad(disp_x + self.bars_x, disp_y, self.bars_w * val / max, self.font_h, bar_col.r, bar_col.g, bar_col.b, 255)
end
items[#items+1] = {self.font:draw(text, self.w, r, g, b, true)[1], x=0, y=0}
items[#items+1] = {self.font:draw((nfmt or "%d/%s"):format(val, max and math.round(max) or "--"), self.w, r, g, b, true)[1], x=self.bars_x + 5, y=0}
items[#items+1] = {self.font:draw((nfmt or "%d/%s"):format(oval, max and math.round(max) or "--"), self.w, r, g, b, true)[1], x=self.bars_x + 5, y=0}
if reg and reg ~= 0 then
local reg_txt = string.limit_decimals(reg, 3, "+")
local tex = self.font:draw(reg_txt, self.w, r, g, b, true)[1]
items[#items+1] = {tex, x = self.bars_x + self.bars_w - self.font:size(reg_txt) - 3, y=0}
end
cached = {nfmt=nfmt, val=val, max=max, reg=reg, r=r, g=g, b=b, bar_col=bar_col, bar_bgcol=bar_bgcol, items}
cached = {nfmt=nfmt, val=oval, max=max, reg=reg, r=r, g=g, b=b, bar_col=bar_col, bar_bgcol=bar_bgcol, items}
self.tex_cache.texture_bars[text] = cached
end
local items = cached[1]
......@@ -292,11 +293,7 @@ function _M:display()
self:mouseTooltip(self.TOOLTIP_MAGWILCUN, self:makeTexture(("Mag/Wil/Cun: #00ff00#%3d/%3d/%3d"):format(player:getMag(), player:getWil(), player:getCun()), x, h, 255, 255, 255)) h = h + self.font_h
h = h + self.font_h
if player.life < 0 then
self:mouseTooltip(self.TOOLTIP_LIFE, self:makeTextureBar("#c00000#Life :", nil, player.life, player.max_life, player.life_regen * util.bound((player.healing_factor or 1), 0, 2.5), x, h, 255, 255, 255, colors.DARK_RED, colors.VERY_DARK_RED)) h = h + self.font_h
else
self:mouseTooltip(self.TOOLTIP_LIFE, self:makeTextureBar("#c00000#Life :", nil, player.life, player.max_life, player.life_regen * util.bound((player.healing_factor or 1), 0, 2.5), x, h, 255, 255, 255, colors.DARK_RED, colors.VERY_DARK_RED)) h = h + self.font_h
end
self:mouseTooltip(self.TOOLTIP_LIFE, self:makeTextureBar("#c00000#Life :", nil, player.life, player.max_life, player.life_regen * util.bound((player.healing_factor or 1), 0, 2.5), x, h, 255, 255, 255, colors.DARK_RED, colors.VERY_DARK_RED)) h = h + self.font_h
local shield, max_shield = 0, 0
if player:attr("time_shield") then shield = shield + player.time_shield_absorb max_shield = max_shield + player.time_shield_absorb_max end
......
......@@ -89,8 +89,10 @@ setDefaultProjector(function(src, x, y, type, dam, state)
return dam
end
local source_talent = src.__projecting_for and src.__projecting_for.project_type and (src.__projecting_for.project_type.talent_id or src.__projecting_for.project_type.talent) and src.getTalentFromId and src:getTalentFromId(src.__projecting_for.project_type.talent or src.__projecting_for.project_type.talent_id)
local terrain = game.level.map(x, y, Map.TERRAIN)
if terrain then terrain:check("damage_project", src, x, y, type, dam) end
if terrain then terrain:check("damage_project", src, x, y, type, dam, source_talent) end
local target = game.level.map(x, y, Map.ACTOR)
if target then
......@@ -485,7 +487,6 @@ setDefaultProjector(function(src, x, y, type, dam, state)
print("[PROJECTOR] final dam after hooks and callbacks", dam)
local source_talent = src.__projecting_for and src.__projecting_for.project_type and (src.__projecting_for.project_type.talent_id or src.__projecting_for.project_type.talent) and src.getTalentFromId and src:getTalentFromId(src.__projecting_for.project_type.talent or src.__projecting_for.project_type.talent_id)
local dead
dead, dam = target:takeHit(dam, src, {damtype=type, source_talent=source_talent, initial_dam=initial_dam})
......@@ -1781,7 +1782,7 @@ newDamageType{
projector = function(src, x, y, type, dam, state)
state = initState(state)
useImplicitCrit(src, state)
if _G.type(dam) == "number" then dam = {dam=dam, dur=3, heal_factor=dam.fail} end
if _G.type(dam) == "number" then dam = {dam=dam, dur=3, fail=50*dam.power/(dam.power+50)} end
DamageType:get(DamageType.NATURE).projector(src, x, y, DamageType.NATURE, dam.dam / dam.dur, state)
local target = game.level.map(x, y, Map.ACTOR)
if target and target:canBe("poison") then
......
......@@ -877,6 +877,11 @@ newEntity{ define_as = "RUNED_SKULL",
encumber = 3,
material_level = 5,
desc = [[Dull red runes are etched all over this blackened skull.]],
color_attributes = {
damage_type = 'FIRE',
alt_damage_type = 'FLAMESHOCK',
particle = 'flame',
},
carrier = {
combat_spellpower = 7,
......@@ -1189,7 +1194,7 @@ newEntity{ base = "BASE_GEM", define_as = "CRYSTAL_HEART",
o.use_no_wear = true
o.use_power = { name = "recover the Crystal Heart (destroys this armour)", power = 1, use = function(self, who, inven, item)
local art_list = mod.class.Object:loadList("/data/general/objects/objects-maj-eyal.lua")
local o = art_list["CRYSTAL_FOCUS"]:clone()
local o = art_list["CRYSTAL_HEART"]:clone()
o:resolve()
o:resolve(nil, true)
o:identify(true)
......
......@@ -836,13 +836,13 @@ newEntity{
on_kill = 1,
desc=function(self, who, special)
local targets = self.combat.projection_targets
return ("Projects up to %d attacks dealing 30%% weapon damage to random targets in range 10 (cannot hit the initial target)"):format(targets or 0)
return ("Projects up to %d attacks dealing 30%% weapon damage to random targets in range 7 (cannot hit the initial target)"):format(targets or 0)
end,
fct=function(combat, who, target)
if who.turn_procs.ego_projection then return end
who.turn_procs.ego_projection = true
local tg = {type="ball", radius=10}
local tg = {type="ball", radius=7}
local grids = who:project(tg, who.x, who.y, function() end)
local tgts = {}
for x, ys in pairs(grids) do for y, _ in pairs(ys) do
......
......@@ -162,7 +162,7 @@ newEntity{ theme={defense=true, physical=true}, name="def", points = 1, rarity =
combat_def_ranged = resolvers.randartmax(3, 9), },
}
newEntity{ theme={defense=true, physical=true}, name="armor", points = 1, rarity = 10, level_range = {1, 50},
wielder = { combat_armor = resolvers.randartmax(3, 9), },
wielder = { combat_armor = resolvers.randartmax(2, 6), },
}
----------------------------------------------------------------
-- Saves
......@@ -513,7 +513,7 @@ newEntity{ theme={defense=true, mental=true}, name="save mental greater", points
}
newEntity{ theme={defense=true, physical=true}, name="armor greater", points = 2, rarity = 10, level_range = {30, 50},
wielder = { combat_armor = resolvers.randartmax(3, 15), },
wielder = { combat_armor = resolvers.randartmax(2, 14), },
}
......@@ -949,7 +949,7 @@ newEntity{ base = "BASE_CLOTH_ARMOR",
on_melee_hit={[DamageType.POISON] = 20, [DamageType.SLIME] = 20},
},
on_wear = function(self, who)
if not game.state.spydre_mantra then
if not game.state.spydre_mantra and who.player then
game.state.spydre_mantra = true
require("engine.ui.Dialog"):simpleLongPopup("Huh?", "As you wear the strange set of robes, you notice something folded into one of its pockets...", 500, function()
game.party:learnLore("shiiak-mantra")
......
......@@ -50,14 +50,15 @@ vec4 GetColor(const int layerIndex, vec2 texPos)
vec2 GetDistortion(vec2 texPos, int layerIndex, int distortionType, float deformRate)
{
float layerIndexF = float(layerIndex);
if (distortionType == 0) {
float alpha = 0.2 * sin(tick / time_factor * (layerIndex * 0.5 + 1.0) + layerIndex * 100.0) * deformRate;
float alpha = 0.2 * sin(tick / time_factor * (layerIndexF * 0.5 + 1.0) + layerIndexF * 100.0) * deformRate;
mat2 rotation = mat2(cos(alpha), sin(alpha), -sin(alpha), cos(alpha));
return clamp(rotation * (texPos - vec2(0.5)) + vec2(0.5), 0.01, 0.99);
} else if (distortionType == 1) {
float phase = length(texPos - vec2(0.5));
float alpha = 0.2 * sin(-tick / time_factor * (layerIndex * 0.5 + 1.0) + phase * 30.0 + layerIndex * 100.0) * deformRate;
float alpha = 0.2 * sin(-tick / time_factor * (layerIndexF * 0.5 + 1.0) + phase * 30.0 + layerIndexF * 100.0) * deformRate;
mat2 rotation = mat2(cos(alpha), sin(alpha), -sin(alpha), cos(alpha));
return clamp(rotation * (texPos - vec2(0.5)) + vec2(0.5), 0.01, 0.99);
......@@ -83,8 +84,8 @@ void main(void)
int backLayersCount = int(backgroundLayersCount + 0.5);
for(int layerIndex = 0; layerIndex < 4; layerIndex++)
{
if(noup == 1 && layerIndex < backLayersCount) continue;
if(noup == 2 && layerIndex >= backLayersCount) continue;
if(noup == 1.0 && layerIndex < backLayersCount) continue;
if(noup == 2.0 && layerIndex >= backLayersCount) continue;
float deformRate = GetDistortionRange(layerIndex, pos);
vec2 texPos = GetDistortion(pos, layerIndex, distortionType, deformRate);
vec4 layerColor = GetColor(layerIndex, texPos);
......
......@@ -20,6 +20,7 @@
-- Corruptions
newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="celestial/guardian", name = "guardian", min_lev = 10, description = "Your devotion grants you additional protection." }
newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="celestial/chants", name = "chants", generic = true, description = "Chant the glory of the Sun." }
newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="celestial/chants-chants", name = "chants", generic = true, description = "Chant the glory of the Sun." }
newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="celestial/light", name = "light", generic = true, description = "Invoke the power of the light to heal and mend." }
newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="celestial/combat", name = "combat", description = "Your devotion allows you to combat your foes with indomitable determination." }
newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="celestial/radiance", name = "radiance", description = "You channel the light of the sun through your body." }
......@@ -30,6 +31,7 @@ newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="celestia
newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="celestial/twilight", name = "twilight", description = "Stand between the darkness and the light, harnessing both." }
newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="celestial/star-fury", name = "star fury", description = "Call the fury of the Stars and the Moon to destroy your foes." }
newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="celestial/hymns", name = "hymns", generic = true, description = "Chant the glory of the Moon." }
newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="celestial/hymns-hymns", name = "hymns", generic = true, description = "Chant the glory of the Moon." }
newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="celestial/circles", name = "circles", min_lev = 10, description = "Bind the power of the Moon into circles at your feet." }
newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="celestial/eclipse", name = "eclipse", description = "The moment of the Eclipse is the moment of Truth, when Sun and Moon are in tandem and the energies of the world hang in the balance. Intense focus allows the greatest Anorithils to harness these energies to unleash devastating forces..." }
......
......@@ -20,7 +20,7 @@
-- Looks weaker than the other options, but extra life is a more universally useful stat and mind save is generally lower for celestial classes.
newTalent{
name = "Chant of Fortitude",
type = {"celestial/other", 1},
type = {"celestial/chants-chants", 1},
mode = "sustained",
hide = true,
require = divi_req1,
......@@ -82,7 +82,7 @@ newTalent{
-- Physical and weapon protection Chant.
newTalent{
name = "Chant of Fortress",
type = {"celestial/other", 1},
type = {"celestial/chants-chants", 1},
mode = "sustained",
hide = true,
require = divi_req1,
......@@ -146,7 +146,7 @@ newTalent{
-- This can be swapped to reactively with a projectile already in the air
newTalent{
name = "Chant of Resistance",
type = {"celestial/other",1},
type = {"celestial/chants-chants",1},
mode = "sustained",
hide = true,
require = divi_req1,
......@@ -227,7 +227,7 @@ newTalent{
-- Depreciated, but retained for compatability.
newTalent{
name = "Chant of Light",
type = {"celestial/other", 4},
type = {"celestial/chants-chants", 4},
mode = "sustained",
require = divi_req4,
points = 5,
......@@ -278,6 +278,9 @@ newTalent{
require = divi_req1,
points = 5,
mode = "passive",
passives = function(self, t)
self:setTalentTypeMastery("celestial/chants-chants", self:getTalentMastery(t))
end,
on_learn = function(self, t)
self:learnTalent(self.T_CHANT_OF_FORTITUDE, true, nil, {no_unlearn=true})
self:learnTalent(self.T_CHANT_OF_FORTRESS, true, nil, {no_unlearn=true})
......@@ -318,7 +321,7 @@ newTalent{
-- Might also make some people consider Chants as an escort reward.
newTalent{
name = "Chant Illuminate",
type = {"celestial/chants", 5},
type = {"celestial/chants", 2},
require = divi_req2,
points = 5,
mode = "passive",
......@@ -333,7 +336,7 @@ newTalent{
-- Remember that Chants can be swapped instantly.
newTalent{
name = "Chant Adept",
type = {"celestial/chants", 6},
type = {"celestial/chants", 3},
require = divi_req3,
points = 5,
mode = "passive",
......@@ -390,7 +393,7 @@ newTalent{
newTalent{
name = "Chant Radiant",
type = {"celestial/chants", 7},
type = {"celestial/chants", 4},
require = divi_req4,
points = 5,
mode = "passive",
......