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