Skip to content
Snippets Groups Projects
amulets.lua 15.8 KiB
Newer Older
dg's avatar
dg committed
-- ToME - Tales of Maj'Eyal
DarkGod's avatar
DarkGod committed
-- Copyright (C) 2009 - 2019 Nicolas Casalini
dg's avatar
dg committed
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
--
-- Nicolas Casalini "DarkGod"
-- darkgod@te4.org

dg's avatar
dg committed
local Stats = require "engine.interface.ActorStats"
local DamageType = require "engine.DamageType"
local Talents = require "engine.interface.ActorTalents"

dg's avatar
dg committed
--load("/data/general/objects/egos/charged-attack.lua")
--load("/data/general/objects/egos/charged-defensive.lua")
--load("/data/general/objects/egos/charged-utility.lua")
-- Stat boosting amulets
dg's avatar
dg committed
newEntity{
	power_source = {nature=true},
dg's avatar
dg committed
	name = " of cunning (#STATBONUS#)", suffix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {cunning=true},
dg's avatar
dg committed
	level_range = {1, 50},
	rarity = 6,
	cost = 4,
	wielder = {
dg's avatar
dg committed
		inc_stats = { [Stats.STAT_CUN] = resolvers.mbonus_material(8, 2) },
dg's avatar
dg committed
	},
}
newEntity{
	power_source = {nature=true},
dg's avatar
dg committed
	name = " of willpower (#STATBONUS#)", suffix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {willpower=true},
dg's avatar
dg committed
	level_range = {1, 50},
	rarity = 6,
	cost = 4,
	wielder = {
dg's avatar
dg committed
		inc_stats = { [Stats.STAT_WIL] = resolvers.mbonus_material(8, 2) },
dg's avatar
dg committed
	},
}
dg's avatar
dg committed
newEntity{
	power_source = {nature=true},
	name = " of dexterity (#STATBONUS#)", suffix=true, instant_resolve=true,
	keywords = {dexterity=true},
	level_range = {1, 50},
	rarity = 6,
	cost = 4,
	wielder = {
		inc_stats = { [Stats.STAT_DEX] = resolvers.mbonus_material(8, 2) },
	},
}
newEntity{
	power_source = {nature=true},
	name = " of strength (#STATBONUS#)", suffix=true, instant_resolve=true,
	keywords = {strength=true},
	level_range = {1, 50},
	rarity = 6,
	cost = 4,
	wielder = {
		inc_stats = { [Stats.STAT_STR] = resolvers.mbonus_material(8, 2) },
	},
}
newEntity{
	power_source = {nature=true},
	name = " of constitution (#STATBONUS#)", suffix=true, instant_resolve=true,
	keywords = {constitution=true},
	level_range = {1, 50},
	rarity = 6,
	cost = 4,
	wielder = {
		inc_stats = { [Stats.STAT_CON] = resolvers.mbonus_material(8, 2) },
	},
}
newEntity{
	power_source = {arcane=true},
	name = " of magic (#STATBONUS#)", suffix=true, instant_resolve=true,
	keywords = {magic=true},
	level_range = {1, 50},
	rarity = 6,
	cost = 4,
	wielder = {
		inc_stats = { [Stats.STAT_MAG] = resolvers.mbonus_material(8, 2) },
	},
}
newEntity{
	power_source = {technique=true},
dg's avatar
dg committed
	name = " of mastery (#MASTERY#)", suffix=true,
dg's avatar
dg committed
	keywords = {mastery=true},
dg's avatar
dg committed
	level_range = {1, 50},
dg's avatar
dg committed
	cost = 2,
	wielder = {},
		local tts = {}
		for i, def in ipairs(engine.interface.ActorTalents.talents_types_def) do
DarkGod's avatar
DarkGod committed
			if p and def.allow_random and p:knowTalentType(def.type) or p:knowTalentType(def.type) == false then 
				if not (e.power_source.antimagic and def.is_spell) or (e.power_source.arcane and def.is_antimagic) then
					tts[#tts+1] = def.type
				end
			end
		end
		local tt = rng.table(tts)
		if not tt then tt = "technique/combat-training" end
dg's avatar
dg committed

		e.wielder.talents_types_mastery = {}
		local v = (10 + rng.mbonus(math.ceil(30 * e.material_level / 5), resolvers.current_level, 50)) / 100
		e.wielder.talents_types_mastery[tt] = v
		e.cost = e.cost + v * 60
dg's avatar
dg committed
	end),
}
-- Immunity/Resist amulets
dg's avatar
dg committed
newEntity{
	power_source = {nature=true},
dg's avatar
dg committed
	name = "insulating ", prefix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {insulating=true},
dg's avatar
dg committed
	level_range = {1, 50},
	rarity = 6,
	cost = 5,
	wielder = {
			[DamageType.FIRE] = resolvers.mbonus_material(20, 10),
			[DamageType.COLD] = resolvers.mbonus_material(20, 10),
dg's avatar
dg committed
	},
}
newEntity{
	power_source = {nature=true},
	name = "grounding ", prefix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {grounding=true},
dg's avatar
dg committed
	level_range = {1, 50},
	rarity = 6,
	cost = 5,
	wielder = {
		resists={
			[DamageType.LIGHTNING] = resolvers.mbonus_material(20, 10),
dg's avatar
dg committed
		},
		stun_immune = resolvers.mbonus_material(30, 20, function(e, v) v=v/100 return 0, v end),
dg's avatar
dg committed
	},
}
dg's avatar
dg committed
newEntity{
	power_source = {nature=true},
	name = "stabilizing ", prefix=true, instant_resolve=true,
	keywords = {stabilizing=true},
dg's avatar
dg committed
	level_range = {1, 50},
	rarity = 6,
	cost = 5,
	wielder = {
		resists={
			[DamageType.TEMPORAL] = resolvers.mbonus_material(20, 10),
dg's avatar
dg committed
		},
		knockback_immune = resolvers.mbonus_material(30, 20, function(e, v) v=v/100 return 0, v end),
		pin_immune = resolvers.mbonus_material(30, 20, function(e, v) v=v/100 return 0, v end),
dg's avatar
dg committed
	},
}
dg's avatar
dg committed
newEntity{
	power_source = {nature=true},
	name = "warrior's ", prefix=true, instant_resolve=true,
	keywords = {warrior=true},
dg's avatar
dg committed
	level_range = {1, 50},
	rarity = 6,
	cost = 5,
	wielder = {
		resists={
			[DamageType.PHYSICAL] = resolvers.mbonus_material(10, 5),
		},
		stamina_regen = resolvers.mbonus_material(10, 2, function(e, v) v=v/10 return 0, v end),
	},
}
newEntity{
	power_source = {nature=true},
	name = "clarifying ", prefix=true, instant_resolve=true,
	keywords = {clarifying=true},
	level_range = {1, 50},
	rarity = 6,
	cost = 5,
	wielder = {
		resists={
			[DamageType.MIND] = resolvers.mbonus_material(20, 10),
		},
		confusion_immune = resolvers.mbonus_material(30, 20, function(e, v) v=v/100 return 0, v end),
dg's avatar
dg committed
	},
}
newEntity{
	power_source = {nature=true},
	name = "starlit ", prefix=true, instant_resolve=true,
	keywords = {starlit=true},
dg's avatar
dg committed
	level_range = {1, 50},
	rarity = 6,
	cost = 5,
	wielder = {
		resists={
			[DamageType.LIGHT] = resolvers.mbonus_material(20, 10),
			[DamageType.DARKNESS] = resolvers.mbonus_material(20, 10),
		},
		blind_immune = resolvers.mbonus_material(30, 20, function(e, v) v=v/100 return 0, v end),
dg's avatar
dg committed
	},
}
newEntity{
dg's avatar
dg committed
	power_source = {antimagic=true},
dg's avatar
dg committed
	name = "cleansing ", prefix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {cleansing=true},
dg's avatar
dg committed
	level_range = {1, 50},
	rarity = 6,
	cost = 5,
dg's avatar
dg committed
	wielder = {
		resists={
			[DamageType.NATURE] = resolvers.mbonus_material(20, 10),
dg's avatar
dg committed
			[DamageType.BLIGHT] = resolvers.mbonus_material(20, 10),
dg's avatar
dg committed
		},
dg's avatar
dg committed
		disease_immune = resolvers.mbonus_material(30, 20, function(e, v) return 0, v/100 end),
		poison_immune = resolvers.mbonus_material(30, 20, function(e, v) return 0, v/100 end),
dg's avatar
dg committed

dg's avatar
dg committed
newEntity{
	power_source = {technique=true},
	name = "restful ", prefix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {restful=true},
	level_range = {1, 50},
dg's avatar
dg committed
	rarity = 6,
	cost = 10,
	wielder = {
dg's avatar
dg committed
		fatigue = resolvers.mbonus_material(6, 4, function(e, v) return 0, -v end),
		life_regen = resolvers.mbonus_material(4, 1, function(e, v) return 0, v end),
dg's avatar
dg committed
	},
}

dg's avatar
dg committed
newEntity{
	power_source = {nature=true},
dg's avatar
dg committed
	name = "vitalizing ", prefix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {vitalizing=true},
	level_range = {30, 50},
dg's avatar
dg committed
	rarity = 15,
	cost = 30,
	wielder = {
		inc_stats={
dg's avatar
dg committed
			[Stats.STAT_CON] = resolvers.mbonus_material(4, 2),
dg's avatar
dg committed
		},
		combat_physresist = resolvers.mbonus_material(15, 5),
dg's avatar
dg committed
		max_life = resolvers.mbonus_material(50, 30),
		life_regen = resolvers.mbonus_material(10, 1, function(e, v) return 0, v end),
	power_source = {technique=true},
	name = " of murder", suffix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {murder=true},
	level_range = {30, 50},
	cost = 40,
	wielder = {
dg's avatar
dg committed
		combat_critical_power = resolvers.mbonus_material(10, 10),
		combat_atk = resolvers.mbonus_material(5, 5),
		combat_apr = resolvers.mbonus_material(10, 10),
	power_source = {nature=true},
	name = " of vision", suffix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {vision=true},
	level_range = {25, 50},
	rarity = 15,
	cost = 30,
	wielder = {
dg's avatar
dg committed
		see_invisible = resolvers.mbonus_material(10, 5),
		blind_immune = resolvers.mbonus_material(30, 10, function(e, v) v=v/100 return 0, v end),
		infravision = resolvers.mbonus_material(8, 2),
dg's avatar
dg committed
		trap_detect_power = resolvers.mbonus_material(15, 5),
	power_source = {nature=true},
	name = " of healing", suffix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {healing=true},
	level_range = {10, 50},
	rarity = 10,
	cost = 60,
	wielder = {
dg's avatar
dg committed
		healing_factor = resolvers.mbonus_material(20, 10, function(e, v) v=v/100 return 0, v end),
		cut_immune = resolvers.mbonus_material(4, 4, function(e, v) v=v/10 return 0, v end),
	resolvers.charmt(Talents.T_HEAL_NATURE, {1,2,3}, 35),
	power_source = {technique=true},
	name = "protective ", prefix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {protect=true},
	level_range = {30, 50},
	rarity = 16,
	cost = 40,
	wielder = {
		combat_armor = resolvers.mbonus_material(5, 3),
		combat_def = resolvers.mbonus_material(8, 4),
dg's avatar
dg committed
		combat_physresist = resolvers.mbonus_material(20, 7),
		resists_cap = { all = resolvers.mbonus_material(5, 2) },
	power_source = {technique=true},
	name = "enraging ", prefix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {enraging=true},
	level_range = {30, 50},
	rarity = 20,
	cost = 90,
	wielder = {
dg's avatar
dg committed
		combat_dam = resolvers.mbonus_material(5, 5),
		inc_damage = { [DamageType.PHYSICAL] = resolvers.mbonus_material(5, 5) },
		combat_physspeed = 0.1,
	power_source = {arcane=true},
	name = "archmage's ", prefix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {archmage=true},
	level_range = {30, 50},
	rarity = 16,
	cost = 40,
	wielder = {
dg's avatar
dg committed
		combat_spellpower = resolvers.mbonus_material(3, 3),
		combat_spellcrit = resolvers.mbonus_material(3, 3),
DarkGod's avatar
DarkGod committed
		inc_stats = {
			[Stats.STAT_MAG] = resolvers.mbonus_material(5, 1),
		},
dg's avatar
dg committed
			[DamageType.FIRE] = resolvers.mbonus_material(4, 4),
			[DamageType.COLD] = resolvers.mbonus_material(4, 4),
			[DamageType.ACID] = resolvers.mbonus_material(4, 4),
			[DamageType.LIGHTNING] = resolvers.mbonus_material(4, 4),
dg's avatar
dg committed
	},
Eric Wykoff's avatar
Eric Wykoff committed
}

newEntity{
	power_source = {arcane=true},
	name = "starseer's ", prefix=true, instant_resolve=true,
	keywords = {starseer=true},
	level_range = {30, 50},
	greater_ego = 1,
	rarity = 16,
	cost = 40,
	wielder = {
		combat_spellpower = resolvers.mbonus_material(3, 3),
		combat_spellcrit = resolvers.mbonus_material(3, 3),
		inc_stats = {
			[Stats.STAT_MAG] = resolvers.mbonus_material(5, 1),
		},
		inc_damage = {
			[DamageType.LIGHT] = resolvers.mbonus_material(4, 4),
			[DamageType.DARKNESS] = resolvers.mbonus_material(4, 4),
			[DamageType.TEMPORAL] = resolvers.mbonus_material(4, 4),
			[DamageType.PHYSICAL] = resolvers.mbonus_material(4, 4),
		},
	},
dg's avatar
dg committed
}
dg's avatar
dg committed

newEntity{
	power_source = {technique=true},
	name = "warmaker's ", prefix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {warmaker=true},
dg's avatar
dg committed
	level_range = {30, 50},
	greater_ego = 1,
	rarity = 25,
	cost = 80,
	wielder = {
		inc_stats = {
dg's avatar
dg committed
			[Stats.STAT_STR] = resolvers.mbonus_material(6, 4),
			[Stats.STAT_DEX] = resolvers.mbonus_material(6, 4),
			[Stats.STAT_WIL] = resolvers.mbonus_material(6, 4),
dg's avatar
dg committed
		},
	},
}

newEntity{
dg's avatar
dg committed
	power_source = {psionic=true},
dg's avatar
dg committed
	name = "mindweaver's ", prefix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {mindweaver=true},
dg's avatar
dg committed
	level_range = {20, 50},
	greater_ego = 1,
	rarity = 15,
	cost = 30,
	wielder = {
		inc_stats = {
			[Stats.STAT_WIL] = resolvers.mbonus_material(5, 1),
dg's avatar
dg committed
		},
dg's avatar
dg committed
		confusion_immune = resolvers.mbonus_material(15, 10, function(e, v) v=v/100 return 0, v end),
		combat_mentalresist = resolvers.mbonus_material(10, 5),
		combat_mindpower = resolvers.mbonus_material(10, 5),
dg's avatar
dg committed
	},
}

newEntity{
	power_source = {technique=true},
	name = "savior's ", prefix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {savior=true},
dg's avatar
dg committed
	level_range = {20, 50},
	greater_ego = 1,
	rarity = 15,
	cost = 30,
	wielder = {
		combat_mentalresist = resolvers.mbonus_material(15, 10),
		combat_physresist = resolvers.mbonus_material(15, 10),
		combat_spellresist = resolvers.mbonus_material(15, 10),
dg's avatar
dg committed
	},
}

newEntity{
	power_source = {technique=true},
	name = "wanderer's ", prefix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {wanderer=true},
dg's avatar
dg committed
	level_range = {20, 50},
	greater_ego = 1,
	rarity = 15,
	cost = 30,
	wielder = {
		inc_stats = {
			[Stats.STAT_DEX] = resolvers.mbonus_material(7, 3),
dg's avatar
dg committed
			[Stats.STAT_CON] = resolvers.mbonus_material(7, 3),
			[Stats.STAT_CUN] = resolvers.mbonus_material(7, 3),
dg's avatar
dg committed
		},
		fatigue = resolvers.mbonus_material(6, 4, function(e, v) return 0, -v end),
		life_regen = resolvers.mbonus_material(4, 1, function(e, v) return 0, v end),
		stamina_regen = resolvers.mbonus_material(12, 3, function(e, v) v=v/10 return 0, v end),
dg's avatar
dg committed
	},
}

newEntity{
	power_source = {nature=true},
	name = "serendipitous ", prefix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {['serend.']=true},
dg's avatar
dg committed
	level_range = {20, 50},
	greater_ego = 1,
	rarity = 15,
	cost = 30,
	wielder = {
		inc_stats = {
			[Stats.STAT_LCK] = resolvers.mbonus_material(15, 5),
dg's avatar
dg committed
		},
DarkGod's avatar
DarkGod committed
		resist_unseen = resolvers.mbonus_material(10, 10), -- Makes more sense on Precognition helm, but I didn't want to overlap with the original stat use
		combat_def = resolvers.mbonus_material(15, 5),
		combat_atk = resolvers.mbonus_material(15, 5),
dg's avatar
dg committed
	},
}

newEntity{
	power_source = {arcane=true},
	name = " of soulsearing", suffix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {soulsear=true},
dg's avatar
dg committed
	level_range = {40, 50},
	greater_ego = 1,
dg's avatar
dg committed
	cost = 90,
	wielder = {
dg's avatar
dg committed
		combat_spellpower = resolvers.mbonus_material(10, 5),
		combat_critical_power = resolvers.mbonus_material(10, 10),
dg's avatar
dg committed
		inc_damage = {
dg's avatar
dg committed
			[DamageType.FIRE] = resolvers.mbonus_material(10, 5),
dg's avatar
dg committed
			[DamageType.BLIGHT] = resolvers.mbonus_material(10, 5),
dg's avatar
dg committed
		},
	},
}
dg's avatar
dg committed

dg's avatar
dg committed
newEntity{
	power_source = {arcane=true},
	name = " of manastreaming", suffix=true, instant_resolve=true,
dg's avatar
dg committed
	keywords = {manastream=true},
dg's avatar
dg committed
	level_range = {20, 50},
	greater_ego = 1,
dg's avatar
dg committed
	cost = 70,
	wielder = {
		inc_stats = {
dg's avatar
dg committed
			[Stats.STAT_MAG] = resolvers.mbonus_material(5, 1),
dg's avatar
dg committed
		},
		spellsurge_on_crit = resolvers.mbonus_material(4, 2),
dg's avatar
dg committed
		max_mana = resolvers.mbonus_material(40, 20),
		mana_regen = resolvers.mbonus_material(50, 10, function(e, v) v=v/100 return 0, v end),
dg's avatar
dg committed
	},
}

newEntity{
dg's avatar
dg committed
	power_source = {arcane=true},
	name = " of the eclipse", suffix=true, instant_resolve=true,
	keywords = {eclipse=true},
dg's avatar
dg committed
	level_range = {25, 50},
	greater_ego = 1,
	rarity = 20,
	cost = 40,
	wielder = {
dg's avatar
dg committed
			[DamageType.LIGHT] = resolvers.mbonus_material(10, 5),
			[DamageType.DARKNESS] = resolvers.mbonus_material(10, 5),
dg's avatar
dg committed
		},
		on_melee_hit = {
DarkGod's avatar
DarkGod committed
			[DamageType.ITEM_LIGHT_BLIND] = resolvers.mbonus_material(10, 5),
			[DamageType.ITEM_DARKNESS_NUMBING] = resolvers.mbonus_material(10, 5),
dg's avatar
dg committed
		},
		melee_project={
			[DamageType.LIGHT] = resolvers.mbonus_material(10, 5),
			[DamageType.DARKNESS] = resolvers.mbonus_material(10, 5),
dg's avatar
dg committed
		},
	},
DarkGod's avatar
DarkGod committed
}

-- Upgraded Mastery
newEntity{
	power_source = {technique=true},
	name = " of perfection (#MASTERY#)", suffix=true,
	keywords = {perfection=true},
	level_range = {30, 50},
	rarity = 25,
	greater_ego = 1,
	cost = 2,
	wielder = {},
DarkGod's avatar
DarkGod committed
		local tts = {}
		local p = game:getPlayer(true)
		for i, def in ipairs(engine.interface.ActorTalents.talents_types_def) do
            if p and def.allow_random and p:knowTalentType(def.type) or p:knowTalentType(def.type) == false then 
                if not (e.power_source.antimagic and def.is_spell) or (e.power_source.arcane and def.is_antimagic) then
                    tts[#tts+1] = def.type
                end
            end
        end
DarkGod's avatar
DarkGod committed
		--local tt = tts[rng.range(1, #tts)]
		local tt = rng.tableRemove(tts)
		local tt2 = rng.tableRemove(tts)

		e.wielder.talents_types_mastery = {}
		local v = (10 + rng.mbonus(math.ceil(30 * e.material_level / 5), resolvers.current_level, 50)) / 100
DarkGod's avatar
DarkGod committed
		if tt then e.wielder.talents_types_mastery[tt] = v end
		if tt2 then e.wielder.talents_types_mastery[tt2] = v end
DarkGod's avatar
DarkGod committed
		e.cost = e.cost + v * 60
	end),
dg's avatar
dg committed
}