Infinite 500: Gameplay Beyond Level 50

A place to post your add ons and ideas for them

Moderator: Moderator

Post Reply
Message
Author
Hachem_Muche
Uruivellas
Posts: 744
Joined: Thu Nov 18, 2010 6:42 pm

Infinite 500: Gameplay Beyond Level 50

#1 Post by Hachem_Muche »

The latest version of this addon can be downloaded from the download page at:

http://te4.org/games/addons/tome/infini ... d-level-50

Version 2.5d: Compatible with ToME 1.4.0

This addon supports game play for character levels higher than 50, primarily for the infinite dungeon (I.D.). It implements a wide spread, but subtle, rescaling of game mechanics and balance for character levels above 50 in the Maj'Eyal, Infinite, and Arena campaigns for ToME. The intent is to make it possible (though certainly not easy) to reach level 500 of the Infinite Dungeon. This is not a nerf or a buff to game difficulty per se, but, rather, an extension of the well-balanced game play from the Maj'Eyal campaign to higher levels.

Once a character enters the I.D., the level 50 cap is removed and normal stats-per-level progression is enabled from level 51 onward - including extra category points every 30 levels starting at level 66.
The limit on how high primary stats may be trained is removed (limited by character level as normal) and dependent computed value limits are also appropriately increased.
No additional Prodigies are gained after level 50.
Talent levels are unlearnable as normal in the I.D.

Isolated shops can appear randomly in the I.D. There is guaranteed to be at least one shop on level 1, and they are more common therafter, but they become more rare with depth.

The usual number of random escorts are enabled at lower levels of the I.D for characters that start there. (Note: These are harder than normal to keep alive.)

The ability to shrug off critical hits has been changed. Instead of using the percent value to ignore crits completely, it reduces the crit multiplier by the same amount to a minimum of 100%.

Hate gain from killing very high level foes has a cap.

Most monsters and bosses from the Maj'Eyal campaign are imported into the I.D. along with their respective unique drops.

The lichform quest is completed in the I.D. with a new random drop instead of automatically being completed at the appropriate step. There is a new greater vault in the I.D. that affects this quest.

The Corruption/Hexes tree can be learned from a new random drop.

Traps (detect, disarm, effects) update with the level of the zone and have been added back to the I.D. and rebalanced.

Most major events from the Maj'Eyal campaign are enabled in the I.D., and there is a new event that can award the cursed-aura tree.

Undead characters starting in the I.D. come with an artifact cloak. This is similar to the Cloak of Deception, but it's stats scale with character level, and it can spawn randombly for other characters.

NPC levels in the I.D. have been adjusted to be compatible with higher game difficulty settings.

This addon incorporates some modified game mechanics:
Modified checkHit and checkHitOld functions are employed that allow for wider level differences between opponents (see http://forums.te4.org/viewtopic.php?f=36&t=35229).
Saving throws have been modified slightly to make them more effective at reducing the duration of status effects you fail to save against. (See http://forums.te4.org/viewtopic.php?f=36&t=36715 for details.)

Things planned for the future: scaling of world artefacts with character level, map effects with dungeon level, more level variability (layout, size, etc.).

CORE CODE CHANGES
Key code changes appear in:

Engine:
engine\generator\map\Static.lua
engine\interface\ActorStats.lua
engine\interface\ActorTalents.lua

TOME Module:
mod\load.lua
mod\resolvers.lua
mod\class\Actor.lua
mod\class\Game.lua
mod\class\GameState.lua
mod\class\Object.lua
mod\class\Player.lua
mod\class\interface\Combat.lua
mod\class\interface\TooltipsData.lua
mod\dialogs\LevelupDialog.lua
data\birth\worlds.lua
data\general\events\damp-cave.lua
data\general\events\drake-cave.lua
data\general\events\fearscape-portal.lua
data\general\events\naga-portal.lua
data\general\events\old-battle-field.lua
data\general\events\rat-lich.lua
data\general\objects\world-artifacts.lua
data\general\objects\world-artifacts-far-east.lua
data\damage_types.lua
data\quests\lichform.lua
data\rooms\greater_vault.lua
data\zones\infinite-dungeon\events.lua
data\zones\infinite-dungeon\npcs.lua
data\zones\infinite-dungeon\objects.lua
data\zones\infinite-dungeon\zone.lua
data\zones\ruined-dungeon\grids.lua

Other addons that affect these files might not be compatible.

PROCEDURE TO UPDATE an existing character to use I500 (v2.5+):

The addons a character uses are set at character creation (as a list), but the list can be revised later.
(Note: While this works for I500, it is not recommended for most addons in general, as it can cause fatal bugs.)

Procedure:

Exit the game, saving your character if needed.

Locate the save file directory for your character. In Windows, it should be in:

<windows_root>\Users\<username>\T-Engine\4.0\tome\save\<character_name>
(i.e. C:\Users\MyUserName\T-Engine\4.0\tome\save\my_character_name)

Open the file desc.lua with a text editor and locate the line:

addons = {...}

This is the list of addons the game will load with the character.

Add 'Infinite500' (including the single quotes) to the beginning of the list inside of the brackets (making sure there is a comma between each addon name) and save the file.

Start the game.

At the Load Game screen, 'Infinite500' should now show up in the "Requires addons" line for your character.

Load the character as normal.

Some changes won't take effect for previously visited zones and levels. If your character is already in the Infinite Dungeon, most of the new I.D. features won't take effect until you change levels.
Last edited by Hachem_Muche on Wed Jan 27, 2016 1:48 am, edited 12 times in total.
Author of the Infinite 500 and PlenumTooltip addons, and the joys of Scaling in ToME.

drayath
Wayist
Posts: 22
Joined: Sat Nov 27, 2010 10:53 pm

Re: Infinite 500: Gameplay Beyond Level 50

#2 Post by drayath »

Hi, been playing with this in the ID and having fun so far (if not surviving anywhere near long enough to test the new scaling at high level!!!)

Have some additions for you to add in a bunch of missing items from the ID

Selection of items that are garenteed drops from Uniques were not preset, so not being created when you killed them (i assume this can all be found in ID, seen at least sandworm queen in vault and on debug create npc list):
- Sandworm and Currupted sandworm queen drop heart/potion (bonus stats, points and category point)
- Shade of Telos drops Telos Staff (bottom half) allow the full staff to be created.
- Draebore the Imp drops Shifting Boots
- Atamathon drops Atamathon's Ruby Eye (im not 100% sure he can appear, in debug create npc list but i rather hope not!)
- Epoch drops Epoch's Curve
- Slazor drops Eldritch Pearl

Added as normal drops, generally with x5 rarity (as would normally only appear in one zone) and if they had no level restriction used the level restriction from the zone they normally appear in: Rod of Spydric Poison, Void Star, Bindings of Eternal Night set, Celia's Still Beating Heart (for necromancers), Bloodcaller, Robes of Deflection, Rune of the Rift, Tome of Wildfire, Tome of Uttercold

Also have a seperate addon that is almost tested that adds a mystic forge to the ID (via dungeon event) to give a use for gold. Simular to Lost Merchent artifact creation but can create items of different tiers (e.g. iron->vortrum) at differing costs, obeying dungeon level material restrictions.

--

Replacement for tome-i500v1.0.teaa\overload\data\zones\infinite-dungeon\objects.lua

Code: Select all

-- ToME - Tales of Maj'Eyal
-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
--
-- 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

load("/data/general/objects/objects.lua")
load("/data/general/objects/objects-far-east.lua")
  
 -- Note, many of the below items are only included so that they can be dropped by the appropiate npc if they appear.
 -- Some quest rewards have been made droppable, and items that would normally drop have had their rarity multiplied by 5
  
local Stats = require "engine.interface.ActorStats"
local Talents = require "engine.interface.ActorTalents"

newEntity{
	power_source = {technique=true},
	unique = true,
	type = "potion", subtype="potion",
	name = "Potion of Martial Prowess",
	unided_name = "phial filled with metallic liquid",
	level_range = {1, 50},
	display = '!', color=colors.VIOLET, image="object/elixir_of_stoneskin.png",
	encumber = 0.4,
	rarity = 150,
	desc = [[This potent elixir can give insights into martial combat to those unlucky enough to ignore the basics.]],
	cost = 500,

	use_simple = { name = "quaff the elixir", use = function(self, who)
		game.logSeen(who, "%s quaffs the %s!", who.name:capitalize(), self:getName())

		local done = 0

		if not who:knowTalentType("technique/combat-training") then
			who:learnTalentType("technique/combat-training", true)
			game.logPlayer(who, "#VIOLET#You seem to understand the basic martial pratices. (Combat Training talents unlocked)")
			done = done + 1
		end
		if not who:knowTalent(who.T_SHOOT) then
			who:learnTalent(who.T_SHOOT, true, nil, {no_unlearn=true})
			game.logPlayer(who, "#VIOLET#You seem to now know how to properly use a bow or a sling.")
			done = done + 1
		end

		if done == 0 then
			game.logPlayer(who, "#VIOLET#It seems you already knew all the elixir could teach you.")
		end

		return {used=true, id=true, destroy=true}
	end},
}

newEntity{
	power_source = {technique=true},
	unique = true,
	type = "potion", subtype="potion",
	name = "Antimagic Wyrm Bile Extract",
	unided_name = "phial filled with slimy liquid",
	level_range = {10, 50},
	display = '!', color=colors.VIOLET, image="object/elixir_of_avoidance.png",
	encumber = 0.4,
	rarity = 150,
	desc = [[This potent elixir extracted from a powerful wyrm can grant the power to repel arcane forces.]],
	cost = 500,

	use_simple = { name = "quaff the elixir", use = function(self, who, inven, item)
		local d = require("engine.ui.Dialog"):yesnoLongPopup("Antimagic", [[Quaffing this potion will grant you access to the antimagic talents but at the cost of all access to runes, arcane items and spells.]], 500, function(ret)
			if ret then
				game.logSeen(who, "%s quaffs the %s!", who.name:capitalize(), self:getName())

				who:removeObject(inven, item)

				for tid, _ in pairs(who.sustain_talents) do
					local t = who:getTalentFromId(tid)
					if t.is_spell then who:forceUseTalent(tid, {ignore_energy=true}) end
				end

				-- Remove equipment
				for inven_id, inven in pairs(who.inven) do
					for i = #inven, 1, -1 do
						local o = inven[i]
						if o.power_source and o.power_source.arcane then
							game.logPlayer(who, "You can not use your %s anymore, it is tainted by magic.", o:getName{do_color=true})
							local o = who:removeObject(inven, i, true)
							who:addObject(who.INVEN_INVEN, o)
							who:sortInven()
						end
					end
				end

				who:attr("forbid_arcane", 1)
				who:learnTalentType("wild-gift/antimagic", true)
				who:learnTalent(who.T_RESOLVE, true, nil, {no_unlearn=true})
			end
		end)

		return {used=true, id=true}
	end},
}

-- ------------------------------------------------------------------------------------------------------
-- abashed-expance
-- ------------------------------------------------------------------------------------------------------

-- Normally dropped by Spacial Disturbance who is not in ID (onDie action issue)
-- Copied over level range and added rarity 
newEntity{ base = "BASE_LITE", define_as = "VOID_STAR",
	power_source = {arcane=true},
	unique = true,
	name = "Void Star", image="object/artifact/void_star.png",
	unided_name = "tiny black star",
	level_range = {1, 10},
	color = colors.GREY,
	encumber = 1,
	encumber = 1,
	level_range = {7, nil},
	rarity = 200,
	desc = [[It looks like a very tiny star - deep black - and yet it somehow shines.]],
	cost = 120,
	material_level = 2,

	wielder = {
		combat_spellcrit = 5,
		inc_damage = {
			[DamageType.ARCANE]    = 6,
			[DamageType.FIRE]      = 6,
			[DamageType.COLD]      = 6,
			[DamageType.ACID]      = 6,
			[DamageType.LIGHTNING] = 6,
		},
		lite = 2,
	},

	max_power = 70, power_regen = 1,
	use_talent = { id = Talents.T_ECHOES_FROM_THE_VOID, level = 2, power = 70 },
}

--------------------------------------------------------------------------------------------------------
-- ancient-elven-ruins
--------------------------------------------------------------------------------------------------------

-- Included manually from general\data\object\mummy-wrappings.lua
-- to ensure that we don't intoduce none-artifact mummy wrappings
newEntity{
	define_as = "BASE_MUMMY_WRAPPING",
	slot = "BODY",
	type = "armor", subtype="mummy",
	add_name = " (#ARMOR#)",
	display = "[", color=colors.ANTIQUE_WHITE, image="object/mummy_wrappings.png",
	moddable_tile = resolvers.moddable_tile("mummy_wrapping"),
	encumber = 6,
	rarity = false,
	desc = [[Decaying mummy wrappings.]],
	egos = "/data/general/objects/egos/armor.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
	wielder = {
		resists={[DamageType.FIRE] = -50},
	}
}

-- Taken level range from zone, increased rarity
newEntity{ base = "BASE_MUMMY_WRAPPING", define_as = "BINDINGS_ETERNAL_NIGHT",
	power_source = {arcane=true},
	unique = true,
	name = "Bindings of Eternal Night", image = "object/artifact/bindings_of_eternal_night.png",
	unided_name = "blackened, slithering mummy wrappings",
	desc = [[Woven through with fel magics of undeath, these bindings suck the light and life out of everything they touch. Any who don them will find themselves suspended in a nightmarish limbo between life and death.]],
	color = colors.DARK_GREY,
	level_range = {33,42},
	rarity = 500,
	cost = 1000,
	material_level = 3,
	wielder = {
		combat_armor = 7,
		inc_stats = { [Stats.STAT_WIL] = 5, [Stats.STAT_MAG] = 5, },
		resists = {
			[DamageType.BLIGHT] = 30,
			[DamageType.DARKNESS] = 30,
			[DamageType.LIGHT] = -30,
			[DamageType.FIRE] = -30,
		},
		on_melee_hit={[DamageType.BLIGHT] = 10},
		life_regen = 0.3,
		lite = -1,
		poison_immune = 1,
		disease_immune = 1,
		undead = 1,
		forbid_nature = 1,
	},
	max_power = 80, power_regen = 1,

	set_list = { {"define_as","CROWN_ETERNAL_NIGHT"} },
	on_set_complete = function(self, who)
		self.use_talent = { id = "T_ABYSSAL_SHROUD", level = 2, power = 47 }
	end,
	on_set_broken = function(self, who)
		self.use_talent = nil
	end,
}

-- Taken level range from zone, increased rarity
newEntity{ base = "BASE_LEATHER_CAP", define_as = "CROWN_ETERNAL_NIGHT",
	power_source = {arcane=true},
	unique = true,
	name = "Crown of Eternal Night", image = "object/artifact/crown_of_eternal_night.png",
	unided_name = "blackened crown",
	desc = [[This crown looks useless, yet you can feel it woven with fell magics of undeath. Maybe it has a use.]],
	color = colors.DARK_GREY,
	level_range = {33,42},
	cost = 500,
	material_level = 3,
	wielder = {
		combat_armor = 3,
		fatigue = 3,
		inc_damage = {},
		melee_project = {},
	},
	max_power = 80, power_regen = 1,

	set_list = { {"define_as","BINDINGS_ETERNAL_NIGHT"} },
	on_set_complete = function(self, who)
		self:specialSetAdd({"wielder","lite"}, -1)
		self:specialSetAdd({"wielder","confusion_immune"}, 0.3)
		self:specialSetAdd({"wielder","knockback_immune"}, 0.3)
		self:specialSetAdd({"wielder","combat_mentalresist"}, 15)
		self:specialSetAdd({"wielder","combat_spellresist"}, 15)
		self:specialSetAdd({"wielder","inc_stats"}, {[who.STAT_CUN]=10})
		self:specialSetAdd({"wielder","melee_project"}, {[engine.DamageType.DARKNESS]=40})
		self:specialSetAdd({"wielder","inc_damage"}, {[engine.DamageType.DARKNESS]=20})
		self.use_talent = { id = "T_RETCH", level = 2, power = 47 }
		game.logSeen(who, "#ANTIQUE_WHITE#The Crown of Eternal Night seems to react with the Bindings, you feel tremounduous dark power.")
	end,
	on_set_broken = function(self, who)
		game.logPlayer(who, "#ANTIQUE_WHITE#The powerful darkness aura you felt vanes away.")
		self.use_talent = nil
	end,
}

-- ------------------------------------------------------------------------------------------------------
-- ardhungol
-- ------------------------------------------------------------------------------------------------------

-- Normally dropped by Ungolë who does not appear in ID (issue with onDie action), so added rarity and copied level range from npc
newEntity{ base = "BASE_ROD",
	power_source = {nature=true},
	define_as = "ROD_SPYDRIC_POISON",
	unided_name = "poison dripping wand", image = "object/artifact/rod_of_spydric_poison.png",
	name = "Rod of Spydric Poison", color=colors.LIGHT_GREEN, unique=true,
	desc = [[This rod carved out of a giant spider fang continuously drips venom.]],
	cost = 50,
	level_range = {30, nil},
	rarity = 1000,
	elec_proof = true,

	max_power = 75, power_regen = 1,
	use_power = { name = "shoot a bolt of spydric poison", power = 25,
		use = function(self, who)
			local tg = {type="bolt", range=12, talent=t}
			local x, y = who:getTarget(tg)
			if not x or not y then return nil end
			who:project(tg, x, y, engine.DamageType.SPYDRIC_POISON, {dam=200 + who:getMag() * 4, dur=6}, {type="slime"})
			return {id=true, used=true}
		end
	},
}

-- ------------------------------------------------------------------------------------------------------
-- demon-plane
-- ------------------------------------------------------------------------------------------------------

-- Dropped by Draebor, the Imp
newEntity{ base = "BASE_LEATHER_BOOT",
	power_source = {arcane=true},
	define_as = "BOOTS_OF_PHASING",
	unique = true,
	name = "Shifting Boots", image = "object/artifact/shifting_boots.png",
	unided_name = "pair of shifting boots",
	desc = [[Those leather boots can make anybody as annoying as their former possessor, Draebor.]],
	color = colors.BLUE,
	rarity = false,
	cost = 200,
	material_level = 5,
	wielder = {
		combat_armor = 1,
		combat_def = 7,
		fatigue = 2,
		talents_types_mastery = { ["spell/temporal"] = 0.1 },
		inc_stats = { [Stats.STAT_CUN] = 8, [Stats.STAT_DEX] = 4, },
	},

	max_power = 40, power_regen = 1,
	use_power = { name = "blink to a nearby random location", power = 22, use = function(self, who)
		game.level.map:particleEmitter(who.x, who.y, 1, "teleport")
		who:teleportRandom(who.x, who.y, 10 + who:getMag(5))
		game.level.map:particleEmitter(who.x, who.y, 1, "teleport")
		game.logSeen(who, "%s uses %s!", who.name:capitalize(), self:getName{no_count=true})
		return {id=true, used=true}
	end}
}

-- ------------------------------------------------------------------------------------------------------
-- golem-graveyard
-- ------------------------------------------------------------------------------------------------------

-- Dropped by Atamathon (who is on the ID creature list!!!)
newEntity{ base = "BASE_GEM",
	define_as = "ATAMATHON_RUBY_EYE",
	subtype = "red",
	name = "Atamathon's Ruby Eye", color=colors.VIOLET, quest=true, unique=true, identified=true, image="object/artifact/atamathons_lost_ruby_eye.png",
	desc = [[One of the ruby eyes of the legendary giant golem: Atamathon.
It is said it was made by the halflings during the Age of Pyre as a weapon against the orcs. Even though it was destroyed it managed to deal a crippling blow by killing their leader, Garkul the Devourer.]],
	material_level = 5,
	cost = 100,
	wielder = {
		inc_damage = {[DamageType.FIRE]=20},
		lite = 2,
		max_life = 60,
		pin_immune = 0.5,
		pin_immune = 0.5,
	},
	imbue_powers = {
		inc_damage = {[DamageType.FIRE]=20},
		lite = 2,
		max_life = 60,
		pin_immune = 0.5,
	},
}

-- ------------------------------------------------------------------------------------------------------
-- high-peak (The npc's that drop these items don't appear in the ID)
-- ------------------------------------------------------------------------------------------------------


--------------------------------------------------------------------------------------------------------
-- last-hope-graveyard (quest reward, added rarity)
--------------------------------------------------------------------------------------------------------

newEntity{ define_as = "CELIA_HEART",
	power_source = {arcane=true},
	unique = true,
	type = "misc", subtype="heart",
	unided_name = "bloody heart",
	name = "Celia's Still Beating Heart",
	level_range = {20, 35},
	rarity = 200,
	display = "*", color=colors.RED,  image = "object/artifact/celias_heart.png",
	encumber = 2,
	not_in_stores = true,
	desc = [[The living heart of the necromancer Celia, carved out of her chest and preserved with magic.]],

	max_power = 75, power_regen = 1,
	use_sound = "talents/slime",
	use_power = { name = "extract a tiny part of Celia's soul", power = 75, use = function(self, who)
		local p = who:isTalentActive(who.T_NECROTIC_AURA)
		if not p then return end
		p.souls = util.bound(p.souls + 1, 0, p.souls_max)
		who.changed = true
		game.logPlayer(who, "You squeeze Celia's heart in your hand, absorbing part of her soul into your necrotic aura.")
		self.max_power = self.max_power + 5
		self.use_power.power = self.use_power.power + 5
		return {id=true, used=true}
	end },
}


-- ------------------------------------------------------------------------------------------------------
-- maze
-- ------------------------------------------------------------------------------------------------------

-- This allow characters with trap mastery to learn Poisoned Trap when they read this note
newEntity{ base = "BASE_LORE", define_as = "NOTE_LEARN_TRAP",
	name = "the perfect killing device", lore="maze-note-trap", unique=true, no_unique_lore=true,
	desc = [[Some notes describing how to create poison gas traps, left by an unfortunate rogue.]],
	rarity = false,
}

-- ------------------------------------------------------------------------------------------------------
-- paradox-plane
-- ------------------------------------------------------------------------------------------------------

-- Dropped by Epoch
newEntity{ base = "BASE_LONGBOW",
	power_source = {arcane=true},
	define_as = "EPOCH_CURVE",
	-- not sure what rarity does so commented out for now
	rarity=false,
	name = "Epoch's Curve", unided_name = "white ash longbow", unique=true, image="object/artifact/bow_epochs_curve.png",
	desc = [[Epoch's Curve has served the Wardens for generations and was passed from Warden to Warden for many generations before being lost.
According to legend it was made from the first ash sapling to sprout after the Spellblaze and carries powers of both time and renewal.]],
	level_range = {20, 40},
	rarity = 200,
	require = { stat = { dex=24 }, },
	cost = 200,
	material_level = 5,
	combat = {
		range = 9,
		physspeed = 0.6,
	},
	wielder = {
		life_regen = 2.0,
		stamina_regen = 1.0,
		inc_damage={ [DamageType.TEMPORAL] = 10, },
		inc_stats = { [Stats.STAT_DEX] = 5, [Stats.STAT_WIL] = 4,  },
		ranged_project={[DamageType.TEMPORAL] = 15},
	},
}

-- ------------------------------------------------------------------------------------------------------
-- ring-of-blood (normally quest reward, added a rarity + level range)
-- ------------------------------------------------------------------------------------------------------

newEntity{ base = "BASE_RING",
	power_source = {psionic=true},
	define_as = "RING_OF_BLOOD", rarity=false,
	name = "Bloodcaller", unique=true, image = "object/artifact/jewelry_ring_bloodcaller.png",
	desc = [[You won the Ring of Blood trial, this is your reward.]],
	unided_name = "bloody ring",
	rarity = 1000,
	level_range = {30, nil},
	cost = 300,
	material_level = 4,
	wielder = {
		combat_mentalresist = -7,
		fatigue = -5,
		life = 35,
		life_leech_chance = 15,
		life_leech_value = 30,
	},
}

-- ------------------------------------------------------------------------------------------------------
-- sandworm-lair
-- ------------------------------------------------------------------------------------------------------

-- Dropped by the sandworm queen
newEntity{
	power_source = {nature=true},
	define_as = "SANDQUEEN_HEART",
	type = "corpse", subtype = "heart", image = "object/artifact/queen_heart.png",
	name = "Heart of the Sandworm Queen", unique=true, unided_name="pulsing organ",
	display = "*", color=colors.VIOLET,
	desc = [[The heart of the Sandworm Queen, ripped from her dead body. You could ... consume it, should you feel mad enough.]],
	cost = 3000,

	use_simple = { name="consume the heart", use = function(self, who)
		game.logPlayer(who, "#00FFFF#You consume the heart and feel the knowledge of this very old creature fill you!")
		who.unused_stats = who.unused_stats + 3
		who.unused_talents = who.unused_talents + 1
		who.unused_generics = who.unused_generics + 1
		game.logPlayer(who, "You have %d stat point(s) to spend. Press G to use them.", who.unused_stats)
		game.logPlayer(who, "You have %d class talent point(s) to spend. Press G to use them.", who.unused_talents)
		game.logPlayer(who, "You have %d generic talent point(s) to spend. Press G to use them.", who.unused_generics)

		if not who:attr("forbid_nature") then
			if who:knowTalentType("wild-gift/harmony") then
				who:setTalentTypeMastery("wild-gift/harmony", who:getTalentTypeMastery("wild-gift/harmony") + 0.1)
			elseif who:knowTalentType("wild-gift/harmony") == false then
				who:learnTalentType("wild-gift/harmony", true)
			else
				who:learnTalentType("wild-gift/harmony", false)
			end
			-- Make sure a previous amulet didnt bug it out
			if who:getTalentTypeMastery("wild-gift/harmony") == 0 then who:setTalentTypeMastery("wild-gift/harmony", 1) end
			game.logPlayer(who, "You are transformed by the heart of the Queen!.")
			game.logPlayer(who, "#00FF00#You gain an affinity for nature. You can now learn new Harmony talents (press G).")
		end

		game:setAllowedBuild("wilder_wyrmic", true)

		return {used=true, id=true, destroy=true}
	end}
}

-- Dropped by corrupted sandworm queen
newEntity{
	power_source = {nature=true},
	define_as = "PUTRESCENT_POTION",
	type = "corpse", subtype = "blood",
	name = "Wyrm Bile", unique=true, unided_name="putrescent potion", image="object/artifact/vial_wyrm_bile.png",
	display = "*", color=colors.VIOLET,
	desc = [[A vial of thick, lumpy fluid. Who knows what this will do to you if you drink it?]],
	cost = 3000,

	use_simple = { name="drink the vile blood", use = function(self, who)
		game.logPlayer(who, "#00FFFF#You drink the wyrm bile and feel forever transformed!")
		who.unused_talents_types = who.unused_talents_types + 1
		game.log("You have %d category point(s) to spend. Press G to use them.", who.unused_talents_types)

		local str, dex, con, mag, wil, cun = rng.range(-3, 6), rng.range(-3, 6), rng.range(-3, 6), rng.range(-3, 6), rng.range(-3, 6), rng.range(-3, 6)
		who:incStat("str", str) if str >= 0 then str="+"..str end
		who:incStat("dex", dex) if dex >= 0 then dex="+"..dex end
		who:incStat("mag", mag) if mag >= 0 then mag="+"..mag end
		who:incStat("wil", wil) if wil >= 0 then wil="+"..wil end
		who:incStat("cun", cun) if cun >= 0 then cun="+"..cun end
		who:incStat("con", con) if con >= 0 then con="+"..con end
		game.logPlayer(who, "#00FF00#Your stats have changed! (Str %s, Dex %s, Mag %s, Wil %s, Cun %s, Con %s)", str, dex, mag, wil, cun, con)

		return {used=true, id=true, destroy=true}
	end}
}

newEntity{ base = "BASE_GEM",
	define_as = "ATAMATHON_ACTIVATE",
	subtype = "red",
	name = "Atamathon's Lost Ruby Eye", color=colors.VIOLET, quest=true, unique=true, identified=true, image="object/artifact/atamathons_lost_ruby_eye.png",
	desc = [[One of the ruby eyes of the legendary giant golem: Atamathon.
It is said it was made by the halflings during the Age of Pyre as a weapon against the orcs. Even though it was destroyed it managed to deal a crippling blow by killing their leader, Garkul the Devourer.]],
	material_level = 5,
	cost = 100,
	wielder = { inc_damage = {[DamageType.FIRE]=12} },
	imbue_powers = { inc_damage = {[DamageType.FIRE]=12} },
}

-- ------------------------------------------------------------------------------------------------------
-- slazish-fen (the npc [Lady Zoisla the Tidebringer] that drops this does not appear in the ID) so added rarity
-- ------------------------------------------------------------------------------------------------------

newEntity{ base = "BASE_CLOTH_ARMOR", define_as = "ROBES_DEFLECTION",
	power_source = {arcane=true},
	unique = true,
	name = "Robes of Deflection", color = colors.UMBER, image = "object/artifact/robes_of_deflection.png",
	unided_name = "iridescent robe",
	desc = [[This set of robes seems to shine with metallic colors.]],
	level_range = {1, 10},
	rarity = 200,
	cost = 70,
	material_level = 1,
	wielder = {
		combat_armor_hardiness = 30,
		combat_armor = 7,
		inc_stats = { [Stats.STAT_CON] = 3, [Stats.STAT_MAG] = 3, },
		combat_spellpower = 4,
	},
	talent_on_spell = { {chance=4, talent=Talents.T_EVASION, level=1} },
}

-- ------------------------------------------------------------------------------------------------------
-- telmur (drop by Shade of Telos)
-- ------------------------------------------------------------------------------------------------------

newEntity{ base = "BASE_STAFF",
	power_source = {arcane=true},
	slot = "OFFHAND", slot_forbid = false,
	twohanded = false, add_name=false,
	define_as = "TELOS_BOTTOM_HALF", rarity=false, image = "object/artifact/staff_broken_bottom_telos.png",
	unided_name = "broken staff",
	name = "Telos's Staff (Bottom Half)", unique=true,
	desc = [[The bottom part of Telos's broken staff.]],
	require = { stat = { mag=35 }, },
	encumberance = 2.5,
	cost = 500,
	wielder = {
		inc_stats = { [Stats.STAT_MAG] = 4, },
		max_mana = 50,
		combat_mentalresist = 8,
		inc_damage={
			[DamageType.COLD] = 20,
			[DamageType.ACID] = 20,
		},
	},
}

-- ------------------------------------------------------------------------------------------------------
-- temple of creation (drop by Slazor)
-- ------------------------------------------------------------------------------------------------------

newEntity{ base = "BASE_LITE",
	power_source = {arcane=true},
	define_as = "ELDRITCH_PEARL",
	unided_name = "bright pearl",
	name = "Eldritch Pearl", unique=true, image = "object/artifact/eldritch_pearl.png",
	display ='*', color = colors.AQUAMARINE,
	desc = [[Thousands of years spent inside the temple of creation have infused this pearl with the fury of rushing water. It pulses light.]],

	-- No cost, it's invaluable
	wielder = {
		lite = 6,
		can_breath = {water=1},
		combat_dam = 12,
		combat_spellpower = 12,
		inc_stats = {
			[Stats.STAT_STR] = 4,
			[Stats.STAT_DEX] = 4,
			[Stats.STAT_MAG] = 4,
			[Stats.STAT_WIL] = 4,
			[Stats.STAT_CUN] = 4,
			[Stats.STAT_CON] = 4,
			[Stats.STAT_LCK] = -5,
		},
	},

	max_power = 150, power_regen = 1,
	use_talent = { id = Talents.T_TIDAL_WAVE, level=4, power = 80 },
}

-- ------------------------------------------------------------------------------------------------------
-- temporal-rift (quest reward, added rarity)
-- ------------------------------------------------------------------------------------------------------

newEntity{ base = "BASE_RUNE", define_as = "RUNE_RIFT",
	power_source = {arcane=true},
	name = "Rune of the Rift", unique = true, identified = true, image = "object/artifact/rune_of_the_rift.png",
	rarity = 1000,
	cost = 100,
	material_level = 3,

	inscription_data = {
		cooldown = 14,
	},
	inscription_talent = "RUNE_OF_THE_RIFT",
}

-- ------------------------------------------------------------------------------------------------------
-- vor pride
-- ------------------------------------------------------------------------------------------------------

newEntity{ base = "BASE_SCROLL", subtype="tome",
	power_source = {arcane=true},
	name = "Tome of Wildfire", unided_name = "burning book", unique=true, no_unique_lore=true, image = "object/artifact/tome_of_wildfire.png",
	desc = "This huge book is covered in searing flames. Yet they do not harm you.",
	color = colors.VIOLET,
	level_range = {35, 45},
	rarity = 1000,
	cost = 100,

	use_simple = { name="learn the ancient secrets", use = function(self, who)
		if not who:knowTalent(who.T_FLAME) then
			who:learnTalent(who.T_FLAME, true, 3, {no_unlearn=true})
			game.logPlayer(who, "#00FFFF#You read the tome and learn about ancient forgotten fire magic!")
		else
			who.talents_types_mastery["spell/fire"] = (who.talents_types_mastery["spell/fire"] or 1) + 0.1
			who.talents_types_mastery["spell/wildfire"] = (who.talents_types_mastery["spell/wildfire"] or 1) + 0.1
			game.logPlayer(who, "#00FFFF#You read the tome and perfect your mastery of fire magic!")
		end

		return {used=true, id=true, destroy=true}
	end}
}

newEntity{ base = "BASE_SCROLL", subtype="tome",
	power_source = {arcane=true},
	name = "Tome of Uttercold", unided_name = "frozen book", unique=true, no_unique_lore=true, image = "object/artifact/tome_of_uttercold.png",
	desc = "This huge book is covered in slowly shifting patterns of ice. Yet they do not harm you.",
	color = colors.VIOLET,
	level_range = {35, 45},
	rarity = 1000,
	cost = 100,

	use_simple = { name="learn the ancient secrets", use = function(self, who)
		if not who:knowTalent(who.T_ICE_STORM) then
			who:learnTalent(who.T_ICE_STORM, true, 3, {no_unlearn=true})
			game.logPlayer(who, "#00FFFF#You read the tome and learn about ancient forgotten ice magic!")
		else
			who.talents_types_mastery["spell/water"] = (who.talents_types_mastery["spell/water"] or 1) + 0.1
			who.talents_types_mastery["spell/ice"] = (who.talents_types_mastery["spell/ice"] or 1) + 0.1
			game.logPlayer(who, "#00FFFF#You read the tome and perfect your mastery of ice magic!")
		end

		return {used=true, id=true, destroy=true}
	end}
}

Mewtarthio
Uruivellas
Posts: 717
Joined: Mon Jul 16, 2012 6:03 pm

Re: Infinite 500: Gameplay Beyond Level 50

#3 Post by Mewtarthio »

Might be easier to just load the objects file of all the zones.

(Oh, and Atamathon is definitely flagged to spawn in the ID, by the way).

drayath
Wayist
Posts: 22
Joined: Sat Nov 27, 2010 10:53 pm

Re: Infinite 500: Gameplay Beyond Level 50

#4 Post by drayath »

Tried that first; had an issue where doing so pulled in stuff you did not want (e.g. tridents, mummy wrappings, lore scrolls) and a lot of the items never drop as they have no rarity but the npc/quest that would drop them is not present in the ID.

Have an actual bug for you as well, lua error during a fight with a unique that looks like it is from the talent changes. (nb/ the above file is the only one i've modified)
Attachments
log.png
log.png (226.4 KiB) Viewed 49149 times
error.png
error.png (185.58 KiB) Viewed 49149 times

Hachem_Muche
Uruivellas
Posts: 744
Joined: Thu Nov 18, 2010 6:42 pm

Re: Infinite 500: Gameplay Beyond Level 50

#5 Post by Hachem_Muche »

Thanks for the feedback.

The lua error looks like an existing bug not caused by the addon. (The relevant parts of the I500 functions referenced in the call stack were copied unchanged from the original for programming convenience.)

As for the unique drops, I'm glad you caught those, and I'm looking into how to import them cleanly into the I.D. I'd prefer to reference the existing definitions if possible, but may need to redefine them as you have done.
Author of the Infinite 500 and PlenumTooltip addons, and the joys of Scaling in ToME.

Parcae2
Uruivellas
Posts: 709
Joined: Sat Jan 14, 2012 12:02 am

Re: Infinite 500: Gameplay Beyond Level 50

#6 Post by Parcae2 »

Threads of Fate also won't drop in the ID.

Hachem_Muche
Uruivellas
Posts: 744
Joined: Thu Nov 18, 2010 6:42 pm

Re: Infinite 500: Gameplay Beyond Level 50

#7 Post by Hachem_Muche »

I've posted an update at

http://te4.org/games/addons/tome/infini ... level-50-1

I've revised the loading code to more cleanly import bosses from the various zones. Artifacts are a bit less clean but work well.

In summary:

The potions of martial prowess and wyrm bile extract could already drop as could Threads of fate (though rare).

I added Crown of Eternal Night and Bindings of Eternal Night to the drop list (had to hard code them, unfortunately.)

The Sandworm Queen, Corrupted Sandworm, Draebor, Ungole, and Atamathon could already spawn, but now drop their specific artifacts like normal.

The Shade of Telos, Epoch, Slasul, Spacial Disturbance, and Lady Zoisla have now been added and have their specific drops also.

It's now possible to complete the lichform quest in the I.D. The quest is rewarded as normal, you need to kill Celia (who can now spawn randomly) and find a new drop which I have added to the I.D. This, in turn is needed to complete the last step in the quest chain that was not possible in the I.D. before. I think I've put in plenty of clues in the item and quest descriptions to get players pointed in the right direction. Let me know what your think.
Author of the Infinite 500 and PlenumTooltip addons, and the joys of Scaling in ToME.

drayath
Wayist
Posts: 22
Joined: Sat Nov 27, 2010 10:53 pm

Re: Infinite 500: Gameplay Beyond Level 50

#8 Post by drayath »

Not got round to trying the new version yet (got distracted learning lua), however do have something for you.

Replacement for the zone\object file that now properly loads all objects from the zone file (eternal night set removed from file).

Now contains a table at the top of the file to allow any item properties to be adjusted as they are loaded, with values added to adjust the existing items that looked like they needed the rarity changing.

There is also an flag to prevent all lore not specified in the table from being loaded.

Hope this is of some use, code might be a bit ropey as this is my first bit of proper lua code.
Attachments
objects.zip
(4.81 KiB) Downloaded 785 times

Hachem_Muche
Uruivellas
Posts: 744
Joined: Thu Nov 18, 2010 6:42 pm

Re: Infinite 500: Gameplay Beyond Level 50

#9 Post by Hachem_Muche »

I released version 1.3 (Beta 43 compatible):

http://te4.org/games/addons/tome/infini ... d-level-50

The new version includes support for prodigies and re-balancing some speed effects. This addon now includes rescaling of 459 talents.
Author of the Infinite 500 and PlenumTooltip addons, and the joys of Scaling in ToME.

darkgod
Master of Eyal
Posts: 10750
Joined: Wed Jul 24, 2002 9:26 pm
Location: Angolwen
Contact:

Re: Infinite 500: Gameplay Beyond Level 50

#10 Post by darkgod »

Do you have it in patch format too ?
[tome] joylove: You can't just release an expansion like one would release a Kraken XD
--
[tome] phantomfrettchen: your ability not to tease anyone is simply stunning ;)

Hachem_Muche
Uruivellas
Posts: 744
Joined: Thu Nov 18, 2010 6:42 pm

Re: Infinite 500: Gameplay Beyond Level 50

#11 Post by Hachem_Muche »

I don't have this as a patch. How would you like me to create it?

Note that the talent changes are effectively only code snippets that are merged on load with the existing talent definitions. I'm not sure how TortoiseSVN will treat these.

Also, I'd need to learn how to create a patch with TortoiseSVN. :arrow:
Author of the Infinite 500 and PlenumTooltip addons, and the joys of Scaling in ToME.

darkgod
Master of Eyal
Posts: 10750
Joined: Wed Jul 24, 2002 9:26 pm
Location: Angolwen
Contact:

Re: Infinite 500: Gameplay Beyond Level 50

#12 Post by darkgod »

Yeah a patch would be super, if I am to add that to the game it should not be an addon :)

As for hwo to make them I dont know turtoise :< but it's probably some click somewhere to generate a diff
[tome] joylove: You can't just release an expansion like one would release a Kraken XD
--
[tome] phantomfrettchen: your ability not to tease anyone is simply stunning ;)

cttw
Archmage
Posts: 394
Joined: Sat Oct 22, 2011 10:31 am

Re: Infinite 500: Gameplay Beyond Level 50

#13 Post by cttw »

How about making ID a sort of hell for characters when they die? Maybe ID far beyond your level, where you can only die to much stronger foes. And regular ID if you enter alive.

Hachem_Muche
Uruivellas
Posts: 744
Joined: Thu Nov 18, 2010 6:42 pm

Re: Infinite 500: Gameplay Beyond Level 50

#14 Post by Hachem_Muche »

cttw wrote:How about making ID a sort of hell for characters when they die? Maybe ID far beyond your level, where you can only die to much stronger foes. And regular ID if you enter alive.
Sounds like a post for the ideas forum. I wonder how many players who have run out of lives want to continue their characters in an even harder zone...
Author of the Infinite 500 and PlenumTooltip addons, and the joys of Scaling in ToME.

Hachem_Muche
Uruivellas
Posts: 744
Joined: Thu Nov 18, 2010 6:42 pm

Re: Infinite 500: Gameplay Beyond Level 50

#15 Post by Hachem_Muche »

darkgod wrote:Yeah a patch would be super ....
I have a complete (and somewhat tested) patch at:
http://www.mediafire.com/download.php?gqda3v1det7sgde

This is a unified diff file from TortoiseSVN based on the B43 release.

As far as implementing it piecemeal, I suggest starting with the changes to

engine\interface\ActorStats.lua
engine\interface\ActorTalents.lua
and
mod\load.lua
mod\class\Actor.lua
mod\class\Player.lua
mod\class\Trap.lua
mod\class\interface\Combat.lua

then updating the associated talent definitions (20-30 that require changes to these files to work -- the comments I've left in should make what I've done obvious) to get a working game, followed by the remaining changes.

Let me know how this works or if you have any questions about what I was thinking about any of the changes.....
Author of the Infinite 500 and PlenumTooltip addons, and the joys of Scaling in ToME.

Post Reply