From 9d5aa4ef4de2789909ae79d09c68c2ef17ee6ddf Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Wed, 7 Jul 2010 22:13:41 +0000
Subject: [PATCH] start alchemy

git-svn-id: http://svn.net-core.org/repos/t-engine4@886 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/modules/tome/class/interface/Combat.lua  |  15 +-
 game/modules/tome/data/birth/classes/mage.lua |  45 +++++-
 game/modules/tome/data/birth/worlds.lua       |   2 +-
 .../modules/tome/data/general/objects/gem.lua |  63 ++++----
 .../tome/data/talents/spells/alchemy.lua      | 144 ++++++++++++++++++
 .../tome/data/talents/spells/spells.lua       |  12 +-
 ideas/crafting.ods                            | Bin 24808 -> 25692 bytes
 7 files changed, 246 insertions(+), 35 deletions(-)
 create mode 100644 game/modules/tome/data/talents/spells/alchemy.lua

diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua
index 2f62f3461e..82fbff6d20 100644
--- a/game/modules/tome/class/interface/Combat.lua
+++ b/game/modules/tome/class/interface/Combat.lua
@@ -490,11 +490,11 @@ function _M:combatSpellpower(mod)
 end
 
 --- Gets damage based on talent
-function _M:combatTalentSpellDamage(t, base, max)
+function _M:combatTalentSpellDamage(t, base, max, spellpower_override)
 	-- Compute at "max"
 	local mod = max / ((base + 100) * ((math.sqrt(5) - 1) * 0.8 + 1))
 	-- Compute real
-	return (base + self:combatSpellpower()) * ((math.sqrt(self:getTalentLevel(t)) - 1) * 0.8 + 1) * mod
+	return (base + (spellpower_override or self:combatSpellpower())) * ((math.sqrt(self:getTalentLevel(t)) - 1) * 0.8 + 1) * mod
 end
 
 --- Gets weapon damage mult based on talent
@@ -570,7 +570,6 @@ function _M:combatMentalResist()
 	return self.combat_mentalresist + (self:getCun() + self:getWil() + (self:getLck() - 50) * 0.5) * 0.25
 end
 
-
 --- Check if the actor has a bow or sling and corresponding ammo
 function _M:hasArcheryWeapon()
 	if not self:getInven("MAINHAND") then return nil, "no shooter" end
@@ -586,6 +585,16 @@ function _M:hasArcheryWeapon()
 	return weapon, ammo
 end
 
+--- Check if the actor has a gem bomb in quiver
+function _M:hasAlchemistWeapon()
+	if not self:getInven("QUIVER") then return nil, "no ammo" end
+	local ammo = self:getInven("QUIVER")[1]
+	if not ammo or not ammo.alchemist_power then
+		return nil, "bad or no ammo"
+	end
+	return ammo
+end
+
 --- Check if the actor has a two handed weapon
 function _M:hasTwoHandedWeapon()
 	if not self:getInven("MAINHAND") then return end
diff --git a/game/modules/tome/data/birth/classes/mage.lua b/game/modules/tome/data/birth/classes/mage.lua
index 267476a0e8..6a41b5502d 100644
--- a/game/modules/tome/data/birth/classes/mage.lua
+++ b/game/modules/tome/data/birth/classes/mage.lua
@@ -22,18 +22,16 @@ newBirthDescriptor{
 	name = "Mage",
 	desc = {
 		"Mages are the wielders of the arcane powers, able to cast powerful spells of destruction or to heal their wounds with nothing but a thought.",
-		"All mages have been trained in the secret town of Angolwen and posses a unique spell to teleport to it directly.",
 	},
 	descriptor_choices =
 	{
 		subclass =
 		{
 			__ALL__ = "disallow",
-			Archmage = "allow",
---			Necromancer = "allow",
+			Archmage = function() return profile.mod.allow_build.mage and "allow" or "disallow" end,
+			Alchemist = "allow",
 		},
 	},
-	talents = { [ActorTalents.T_TELEPORT_ANGOLWEN]=1 },
 	copy = {
 		-- All mages are of angolwen faction
 		faction = "angolwen",
@@ -52,6 +50,7 @@ newBirthDescriptor{
 		"An Archmage devotes their whole life to the study of magic above anything else.",
 		"Most archmagi lack basic skills that others take for granted (like general fighting sense), but they make up for it by their raw magical power.",
 		"Archmagi know all schools of magic but the more intricate (Temporal and Meta) from the start. They however usually refuse to have anything to do with Necromancy.",
+		"All archmagi have been trained in the secret town of Angolwen and posses a unique spell to teleport to it directly.",
 		"Their most important stats are: Magic and Willpower",
 	},
 	stats = { mag=5, wil=3, cun=1, },
@@ -75,6 +74,44 @@ newBirthDescriptor{
 		[ActorTalents.T_FLAME] = 1,
 		[ActorTalents.T_LIGHTNING] = 1,
 		[ActorTalents.T_PHASE_DOOR] = 1,
+		[ActorTalents.T_TELEPORT_ANGOLWEN]=1,
+	},
+	copy = {
+		max_life = 90,
+		life_rating = 10,
+		resolvers.equip{ id=true,
+			{type="weapon", subtype="staff", name="elm staff", autoreq=true},
+			{type="armor", subtype="cloth", name="robe", autoreq=true}
+			{type="alchemist-gem", subtype="black", autoreq=true},
+		},
+		resolvers.inventory{ id=true,
+			{type="potion", subtype="potion", name="potion of lesser mana", ego_chance=-1000},
+			{type="potion", subtype="potion", name="potion of lesser mana", ego_chance=-1000},
+		},
+	},
+}
+
+newBirthDescriptor{
+	type = "subclass",
+	name = "Alchemist",
+	desc = {
+		"An Alchemist is a dabbler in magic, while 'true' magic is thought to have been lost with the departure of Gandalf and the fall of Saruman.",
+		"Alchemists have an empirical knowledge of magic, which they can not use directly but through focuses.",
+		"A focus is usualy a gem which they can imbue with power to throw at their foes, exploding in fires, acid, ...",
+		"Alchemists are also known for their golem craft and are usualy accompagnied by such a construct which acts as a body guard.",
+		"Their most important stats are: Magic and Willpower",
+	},
+	stats = { mag=5, wil=3, cun=1, },
+	talents_types = {
+		["spell/alchemy"]={true, 0.3},
+		["spell/infusion"]={true, 0.3},
+		["spell/golemancy"]={true, 0.3},
+		["spell/advanced-golemancy"]={true, 0.3},
+		["spell/gemology"]={true, 0.3},
+		["spell/herbalism"]={true, 0.3},
+		["cunning/survival"]={false, -0.1},
+	},
+	talents = {
 	},
 	copy = {
 		max_life = 90,
diff --git a/game/modules/tome/data/birth/worlds.lua b/game/modules/tome/data/birth/worlds.lua
index fff95e14bb..055b37fbc6 100644
--- a/game/modules/tome/data/birth/worlds.lua
+++ b/game/modules/tome/data/birth/worlds.lua
@@ -46,7 +46,7 @@ newBirthDescriptor{
 		class =
 		{
 			__ALL__ = "allow",
-			Mage = function() return profile.mod.allow_build.mage and "allow" or "disallow" end,
+			Mage = "allow",
 			Divine = function() return profile.mod.allow_build.divine and "allow" or "disallow" end,
 			Wilder = function() return (
 				profile.mod.allow_build.wilder_summoner or
diff --git a/game/modules/tome/data/general/objects/gem.lua b/game/modules/tome/data/general/objects/gem.lua
index 8fdf11ee73..d2834bcd27 100644
--- a/game/modules/tome/data/general/objects/gem.lua
+++ b/game/modules/tome/data/general/objects/gem.lua
@@ -27,36 +27,47 @@ newEntity{
 	desc = [[Gems can be sold for money or used in arcane rituals.]],
 }
 
-local function newGem(name, cost, rarity, color, min_level, max_level)
-	newEntity{ base = "BASE_GEM",
+local function newGem(name, cost, rarity, color, min_level, max_level, tier, power)
+	-- Gems, randomly lootable
+	newEntity{ base = "BASE_GEM", define_as = "GEM_"..name:upper(),
 		name = name:lower(), subtype = color,
 		color = colors[color:upper()],
 		level_range = {min_level, max_level},
 		rarity = rarity, cost = cost,
+		material_level = tier,
+	}
+	-- Alchemist gems, not lootable, only created by talents
+	newEntity{ base = "BASE_GEM", define_as = "GEM_ALCHEMIST_"..name:upper(),
+		name = name:lower(), type='alchemist-gem', subtype = color,
+		slot = "QUIVER",
+		color = colors[color:upper()],
+		cost = 0,
+		material_level = tier,
+		alchemist_power = power,
 	}
 end
 
-newGem("Diamond",5,18,"white",40,50)
-newGem("Pearl",5,18,"white",40,50)
-newGem("Moonstone",5,18,"white",40,50)
-newGem("Fire Opal",5,18,"red",40,50)
-newGem("Bloodstone",5,18,"red",40,50)
-newGem("Ruby",4,16,"red",30,40)
-newGem("Amber",4,16,"yellow",30,40)
-newGem("Turquoise",4,16,"green",30,40)
-newGem("Jade",4,16,"green",30,40)
-newGem("Sapphire",4,16,"blue",30,40)
-newGem("Quartz",3,12,"white",20,30)
-newGem("Emerald",3,12,"green",20,30)
-newGem("Lapis Lazuli",3,12,"blue",20,30)
-newGem("Garnets",3,12,"red",20,30)
-newGem("Onyx",3,12,"black",20,30)
-newGem("Amethyst",2,10,"violet",10,20)
-newGem("Opal",2,10,"blue",10,20)
-newGem("Topaz",2,10,"blue",10,20)
-newGem("Aquamarine",2,10,"blue",10,20)
-newGem("Ametrine",1,8,"yellow",1,10)
-newGem("Zircon",1,8,"yellow",1,10)
-newGem("Spinel",1,8,"green",1,10)
-newGem("Citrine",1,8,"yellow",1,10)
-newGem("Agate",1,8,"black",1,10)
+newGem("Diamond",	5,	18,	"white",	40,	50, 5, 70)
+newGem("Pearl",		5,	18,	"white",	40,	50, 5, 70)
+newGem("Moonstone",	5,	18,	"white",	40,	50, 5, 70)
+newGem("Fire Opal",	5,	18,	"red",		40,	50, 5, 70)
+newGem("Bloodstone",	5,	18,	"red",		40,	50, 5, 70)
+newGem("Ruby",		4,	16,	"red",		30,	40, 4, 65)
+newGem("Amber",		4,	16,	"yellow",	30,	40, 4, 65)
+newGem("Turquoise",	4,	16,	"green",	30,	40, 4, 65)
+newGem("Jade",		4,	16,	"green",	30,	40, 4, 65)
+newGem("Sapphire",	4,	16,	"blue",		30,	40, 4, 65)
+newGem("Quartz",	3,	12,	"white",	20,	30, 3, 50)
+newGem("Emerald",	3,	12,	"green",	20,	30, 3, 50)
+newGem("Lapis Lazuli",	3,	12,	"blue",		20,	30, 3, 50)
+newGem("Garnets",	3,	12,	"red",		20,	30, 3, 50)
+newGem("Onyx",		3,	12,	"black",	20,	30, 3, 50)
+newGem("Amethyst",	2,	10,	"violet",	10,	20, 2, 35)
+newGem("Opal",		2,	10,	"blue",		10,	20, 2, 35)
+newGem("Topaz",		2,	10,	"blue",		10,	20, 2, 35)
+newGem("Aquamarine",	2,	10,	"blue",		10,	20, 2, 35)
+newGem("Ametrine",	1,	8,	"yellow",	1,	10, 1, 20)
+newGem("Zircon",	1,	8,	"yellow",	1,	10, 1, 20)
+newGem("Spinel",	1,	8,	"green",	1,	10, 1, 20)
+newGem("Citrine",	1,	8,	"yellow",	1,	10, 1, 20)
+newGem("Agate",		1,	8,	"black",	1,	10, 1, 20)
diff --git a/game/modules/tome/data/talents/spells/alchemy.lua b/game/modules/tome/data/talents/spells/alchemy.lua
new file mode 100644
index 0000000000..9f6acfe0a5
--- /dev/null
+++ b/game/modules/tome/data/talents/spells/alchemy.lua
@@ -0,0 +1,144 @@
+-- ToME - Tales of Middle-Earth
+-- Copyright (C) 2009, 2010 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
+
+newTalent{
+	name = "Throw Bomb",
+	type = {"spell/alchemy", 1},
+	require = spells_req1,
+	points = 5,
+	range = function(self, t)
+		return math.ceil(5 + self:getDex(12))
+	end,
+	action = function(self, t)
+		local ammo = self:hasAlchemistWeapon()
+		if not ammo then
+			game.logPlayer(self, "You need to ready alchemist gems in your quiver.")
+			return
+		end
+
+		local tg = {type="ball", range=self:getTalentRange(t), radius=0, talent=t}
+		local x, y = self:getTarget(tg)
+		if not x or not y then return nil end
+
+		ammo = self:removeObject(self:getInven("QUIVER"), 1)
+		if not ammo then return end
+
+		local inc_dam = 1 --+ self:getTalentLevel(t) * 0.05
+		local dam = self:combatTalentSpellDamage(t, 15, 150, ammo.alchemist_power)
+		dam = dam * inc_dam
+
+		self:project(tg, x, y, DamageType.FIRE, self:spellCrit(dam), nil)
+		game:playSoundNear(self, "talents/arcane")
+		return true
+	end,
+	info = function(self, t)
+		return ([[Imbue an alchemist gem with an explosive charge of mana and throw it.
+		The gem will explode for %0.2f damage (default damage type is fire, it can be altered by other talents).
+		The damage will improve with better gems and the range with your dexterity.]]):format(1)
+	end,
+}
+
+newTalent{
+	name = "Explosion Expert",
+	type = {"spell/alchemy", 2},
+	require = spells_req2,
+	points = 5,
+	mana = 10,
+	cooldown = 3,
+	tactical = {
+		ATTACK = 10,
+	},
+	range = 20,
+	reflectable = true,
+	action = function(self, t)
+		local tg = {type="bolt", range=self:getTalentRange(t), talent=t}
+		if self:getTalentLevel(t) >= 3 then tg.type = "beam" end
+		local x, y = self:getTarget(tg)
+		if not x or not y then return nil end
+		self:project(tg, x, y, DamageType.ARCANE, self:spellCrit(self:combatTalentSpellDamage(t, 20, 230)), nil)
+		local _ _, x, y = self:canProject(tg, x, y)
+		if tg.type == "beam" then
+			game.level.map:particleEmitter(self.x, self.y, math.max(math.abs(x-self.x), math.abs(y-self.y)), "mana_beam", {tx=x-self.x, ty=y-self.y})
+		else
+			game.level.map:particleEmitter(x, y, 1, "manathrust")
+		end
+		game:playSoundNear(self, "talents/arcane")
+		return true
+	end,
+	info = function(self, t)
+		return ([[Conjures up mana into a powerful bolt doing %0.2f arcane damage.
+		At level 3 it becomes a beam.
+		The damage will increase with the Magic stat]]):format(self:combatTalentSpellDamage(t, 20, 230))
+	end,
+}
+
+newTalent{
+	name = "Alchemist Protection",
+	type = {"spell/alchemy", 3},
+	require = spells_req3,
+	points = 5,
+	mana = 0,
+	cooldown = 300,
+	tactical = {
+		MANA = 20,
+	},
+	action = function(self, t)
+		if not self:hasEffect(self.EFF_MANAFLOW) then
+			self:setEffect(self.EFF_MANAFLOW, 10, {power=self:combatTalentSpellDamage(t, 10, 20)})
+			game:playSoundNear(self, "talents/arcane")
+		end
+		return true
+	end,
+	info = function(self, t)
+		return ([[Engulf yourself in a surge of mana, quickly restoring %d mana every turns for 10 turns.
+		The mana restored will increase with the Magic stat]]):format(self:combatTalentSpellDamage(t, 10, 20))
+	end,
+}
+
+newTalent{
+	name = "Create Complex Bomb",
+	type = {"spell/alchemy",4},
+	require = spells_req4, no_sustain_autoreset = true,
+	points = 5,
+	mode = "sustained",
+	sustain_mana = 150,
+	tactical = {
+		DEFEND = 10,
+	},
+	activate = function(self, t)
+		local power = math.max(0.8, 3 - (self:combatSpellpower(1) * self:getTalentLevel(t)) / 280)
+		self.disruption_shield_absorb = 0
+		game:playSoundNear(self, "talents/arcane")
+		return {
+			shield = self:addTemporaryValue("disruption_shield", power),
+			particle = self:addParticles(Particles.new("disruption_shield", 1)),
+		}
+	end,
+	deactivate = function(self, t, p)
+		self:removeParticles(p.particle)
+		self:removeTemporaryValue("disruption_shield", p.shield)
+		self.disruption_shield_absorb = nil
+		return true
+	end,
+	info = function(self, t)
+		return ([[Uses mana instead of life to take damage. Uses %0.2f mana per damage point taken.
+		If your mana is brought too low by the shield, it will de-activate and the chain reaction will release a deadly arcane explosion of the amount of damage absorbed.
+		The damage to mana ratio increases with the Magic stat]]):format(math.max(0.8, 3 - (self:combatSpellpower(1) * self:getTalentLevel(t)) / 280))
+	end,
+}
diff --git a/game/modules/tome/data/talents/spells/spells.lua b/game/modules/tome/data/talents/spells/spells.lua
index 983f4974e9..539307ead8 100644
--- a/game/modules/tome/data/talents/spells/spells.lua
+++ b/game/modules/tome/data/talents/spells/spells.lua
@@ -17,7 +17,7 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
--- Spells
+-- Archmage spells
 newTalentType{ type="spell/arcane", name = "arcane", description = "Arcane manipulates the raw magic energies to shape them into both offensive and defensive spells." }
 newTalentType{ type="spell/fire", name = "fire", description = "Harness the power of fire to burn your foes to ashes." }
 newTalentType{ type="spell/earth", name = "earth", description = "Harness the power of the earth to protect and destroy." }
@@ -31,6 +31,14 @@ newTalentType{ type="spell/temporal", name = "temporal", description = "The scho
 newTalentType{ type="spell/phantasm", name = "phantasm", description = "Control the power of tricks and illusions." }
 newTalentType{ type="spell/enhancement", name = "enhancement", description = "Magical enhancement of your body." }
 
+-- Alchemist spells
+newTalentType{ type="spell/alchemy", name = "alchemy", description = "Manipulate gems to turn them into explosive magical bombs." }
+newTalentType{ type="spell/infusion", name = "infusion", description = "Infusion your gem bombs with the powers of the elements." }
+newTalentType{ type="spell/golemancy", name = "golemancy", description = "Learn to craft and upgrade your golem." }
+newTalentType{ type="spell/advanced-golemancy", name = "advanced-golemancy", description = "Advanced golem operations." }
+newTalentType{ type="spell/gemology", name = "gemology", generic = true, description = "Manipulate gems, imbue their powers into other objects." }
+newTalentType{ type="spell/herbalism", name = "herbalism", generic = true, description = "Herbs lore." }
+
 -- Generic requires for spells based on talent level
 spells_req1 = {
 	stat = { mag=function(level) return 12 + (level-1) * 2 end },
@@ -65,3 +73,5 @@ load("/data/talents/spells/divination.lua")
 load("/data/talents/spells/temporal.lua")
 load("/data/talents/spells/phantasm.lua")
 load("/data/talents/spells/enhancement.lua")
+
+load("/data/talents/spells/alchemy.lua")
diff --git a/ideas/crafting.ods b/ideas/crafting.ods
index 368c0d306839475410128f84aabbb4b5a9ce184d..e2acf163dfa3cd895e956fa4b2aa4fb55bd8d73f 100644
GIT binary patch
delta 8430
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

delta 7561
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

-- 
GitLab