diff --git a/code/_onclick/hud/ability_screen_objects.dm b/code/_onclick/hud/ability_screen_objects.dm
index 0192713aff..1e6844b6ad 100644
--- a/code/_onclick/hud/ability_screen_objects.dm
+++ b/code/_onclick/hud/ability_screen_objects.dm
@@ -97,7 +97,8 @@
var/i = 1
for(var/obj/screen/ability/ability in ability_objects)
ability.update_icon(forced)
- ability.maptext = "[i]" // Slot number
+ ability.index = i
+ ability.maptext = "[ability.index]" // Slot number
i++
/obj/screen/movable/ability_master/update_icon()
@@ -195,6 +196,7 @@
maptext_x = 3
var/background_base_state = "grey"
var/ability_icon_state = null
+ var/index = 0
// var/spell/spell = null
var/obj/screen/movable/ability_master/ability_master
@@ -260,6 +262,16 @@
// spell.perform(usr)
activate()
+/obj/screen/ability/MouseDrop(var/atom/A)
+ if(!A || A == src)
+ return
+ if(istype(A, /obj/screen/ability))
+ var/obj/screen/ability/ability = A
+ if(ability.ability_master && ability.ability_master == src.ability_master)
+ ability_master.ability_objects.Swap(src.index, ability.index)
+ ability_master.toggle_open(2) // To update the UI.
+
+
// Makes the ability be triggered. The subclasses of this are responsible for carrying it out in whatever way it needs to.
/obj/screen/ability/proc/activate()
world << "[src] had activate() called."
diff --git a/code/game/antagonist/outsider/technomancer.dm b/code/game/antagonist/outsider/technomancer.dm
index 88a27cf7ed..4ec49230fd 100644
--- a/code/game/antagonist/outsider/technomancer.dm
+++ b/code/game/antagonist/outsider/technomancer.dm
@@ -81,3 +81,25 @@ var/datum/antagonist/technomancer/technomancers
feedback_set_details("round_end_result","loss - technomancer killed")
world << "The [(current_antagonists.len>1)?"[role_text_plural] have":"[role_text] has"] been \
killed!"
+
+/datum/antagonist/technomancer/print_player_summary()
+ ..()
+ for(var/obj/item/weapon/technomancer_core/core in technomancer_belongings)
+ if(core.wearer)
+ continue // Only want abandoned cores.
+ if(!core.spells.len)
+ continue // Cores containing spells only.
+ world << "Abandoned [core] had [english_list(core.spells)].
"
+
+/datum/antagonist/technomancer/print_player_full(var/datum/mind/player)
+ var/text = print_player_lite(player)
+
+ var/obj/item/weapon/technomancer_core/core
+ if(player.original)
+ core = locate() in player.original
+ if(core)
+ text += "
Bought [english_list(core.spells)], and used \a [core]."
+ else
+ text += "
They've lost their core."
+
+ return text
diff --git a/code/game/gamemodes/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm
index 74019d7149..87ece90f8b 100644
--- a/code/game/gamemodes/technomancer/catalog.dm
+++ b/code/game/gamemodes/technomancer/catalog.dm
@@ -12,7 +12,6 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
/datum/technomancer
var/name = "technomancer thing"
var/desc = "If you can see this, something broke."
- var/enhancement_desc = "No effect."
var/cost = 100
var/hidden = 0
var/obj_path = null
@@ -20,6 +19,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
/datum/technomancer/spell
var/category = ALL_SPELLS
+ var/enhancement_desc = null
+ var/spell_power_desc = null
/obj/item/weapon/technomancer_catalog
name = "catalog"
@@ -28,6 +29,7 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
icon = 'icons/obj/storage.dmi'
icon_state ="scientology" //placeholder
w_class = ITEMSIZE_SMALL
+ slot_flags = SLOT_BELT
var/budget = 1000
var/max_budget = 1000
var/mob/living/carbon/human/owner = null
@@ -35,7 +37,7 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
var/list/equipment_instances = list()
var/list/consumable_instances = list()
var/list/assistance_instances = list()
- var/tab = 0
+ var/tab = 4 // Info tab, so new players can read it before doing anything.
var/spell_tab = ALL_SPELLS
var/show_scepter_text = 0
@@ -116,7 +118,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "Functions | "
dat += "Equipment | "
dat += "Consumables | "
- dat += "Assistance
"
+ dat += "Assistance | "
+ dat += "Info
"
dat += "You currently have a budget of [budget]/[max_budget].
"
dat += "Refund Functions
"
@@ -129,8 +132,10 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
continue
dat += "[spell.name]
"
dat += "[spell.desc]
"
- if(show_scepter_text)
- dat += "[spell.enhancement_desc]"
+ if(spell.spell_power_desc)
+ dat += "Spell Power: [spell.spell_power_desc]
"
+ if(spell.enhancement_desc)
+ dat += "Scepter Effect: [spell.enhancement_desc]
"
if(spell.cost <= budget)
dat += "Purchase ([spell.cost])
"
else
@@ -143,7 +148,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "Functions | "
dat += "Equipment | "
dat += "Consumables | "
- dat += "Assistance
"
+ dat += "Assistance | "
+ dat += "Info
"
dat += "You currently have a budget of [budget]/[max_budget].
"
for(var/datum/technomancer/equipment/E in equipment_instances)
dat += "[E.name]
"
@@ -160,7 +166,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "Functions | "
dat += "Equipment | "
dat += "Consumables | "
- dat += "Assistance
"
+ dat += "Assistance | "
+ dat += "Info
"
dat += "You currently have a budget of [budget]/[max_budget].
"
for(var/datum/technomancer/consumable/C in consumable_instances)
dat += "[C.name]
"
@@ -177,7 +184,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "Functions | "
dat += "Equipment | "
dat += "Consumables | "
- dat += "Assistance
"
+ dat += "Assistance | "
+ dat += "Info
"
dat += "You currently have a budget of [budget]/[max_budget].
"
for(var/datum/technomancer/assistance/A in assistance_instances)
dat += "[A.name]
"
@@ -188,6 +196,72 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "Cannot afford!
"
user << browse(dat, "window=radio")
onclose(user, "radio")
+ if(4) //Info
+ var/dat = ""
+ user.set_machine(src)
+ dat += "Functions | "
+ dat += "Equipment | "
+ dat += "Consumables | "
+ dat += "Assistance | "
+ dat += "Info
"
+ dat += "You currently have a budget of [budget]/[max_budget].
"
+ dat += "
"
+ dat += "
Manipulation Core Owner's Manual
"
+ dat += "This brief entry in your catelog will try to explain what everything does. For starters, the thing you're \
+ probably wearing on your back is known as a Manipulation Core, or just a 'Core'. It allows you to do amazing \
+ things with almost no effort, depending on what functions you've purchased for it. Don't lose your core!
"
+ dat += "
"
+ dat += "There are a few things you need to keep in mind as you use your Core to manipulate the universe. The core \
+ requires a special type of energy, that is referred to as just 'Energy' in the catelog. All cores generate \
+ their own energy, some more than others. Most functions require energy be spent in order to work, so make sure not \
+ to run out in a critical moment. Besides waiting for your Core to recharge, you can buy certain functions which \
+ do something to generate energy.
"
+ dat += "
"
+ dat += "The second thing you need to know is that awesome power over the physical world has consquences, in the form \
+ of Instability. Instability is the result of your Core's energy being used to fuel it, and so little is \
+ understood about it, even among fellow Core owners, however it is almost always a bad thing to have. Instability will \
+ 'cling' to you as you use functions, with powerful functions creating lots of instability. The effects of holding onto \
+ instability are generally harmless or mildly annoying at low levels, with effects such as sparks in the air or forced \
+ blinking. Accumulating more and more instability will lead to worse things happening, which can easily be fatal, if not \
+ managed properly.
"
+ dat += "
"
+ dat += "Fortunately, all Cores come with a meter to tell you how much instability you currently hold. \
+ Instability will go away on its own as time goes on. You can tell if you have instability by the characteristic \
+ purple colored lightning that appears around something with instability lingering on it. High amounts of instability \
+ may cause the object afflicted with it to glow a dark purple, which is often known simply as Glow, which spreads \
+ the instability. You should stay far away from anyone afflicted by Glow, as they will be a danger to both themselves and \
+ anything nearby. Multiple sources of Glow can perpetuate the glow for a very long time if they are not seperated.
"
+ dat += "
"
+ dat += "You should strive to keep you and your apprentices' cores secure. To help with this, each core comes with a \
+ locking mechanism, which should make attempts at forceful removal by third parties (or you) futile, until it is \
+ unlocked again. Do note that there is a safety mechanism, which will automatically unlock the core if the wearer \
+ suffers death. There exists a secondary safety mechanism (safety for the core, not you) that is triggered when \
+ the core detects itself being carried, with the carrier not being authorized. It will respond by giving a \
+ massive amount of Instability to them, so be careful, or perhaps make use of that.
"
+ dat += "
"
+ dat += "You can refund functions, equipment items, and assistance items, so long as you are in your base. \
+ Once you leave, you can't refund anything, however you can still buy things if you still have points remaining. \
+ To refund functions, just click the 'Refund Functions' button on the top, when in the functions tabs. \
+ For equipment items, you need to hit it against the catelog.
"
+ dat += "
"
+ dat += "Your blue robes and hat are both stylish, and somewhat protective against hostile energies, which includes \
+ EXTERNAL instability sources (like Glow), and mundane electricity. If you're looking for protection against other \
+ things, it's suggested you purchase or otherwise obtain armor.
"
+ dat += "
"
+ dat += "There are a few terms you may not understand in the catelog, so this will try to explain them.
"
+ dat += "A function can be thought of as a 'spell', that you use by holding in your hands and trying to use it on \
+ a target of your choice.
"
+ dat += "Some functions can have their abilities enhanced by a special rod called the Scepter of Enhancement. \
+ If a function is able to be boosted with it, it will be shown underneath the description of the function as \
+ 'Scepter Effect:'. Note that you must hold the scepter for it to work, so try to avoid losing it.
"
+ dat += "Functions can also be boosted with the core itself. A function that is able to benefit \
+ from this will have 'Spell Power:' underneath. Different Cores have different \
+ amounts of spell power.
"
+ dat += "When a function refers to 'allies', it means you, your apprentices, currently controlled entities (with the \
+ Control function), and friendly simple-minded entities that you've summoned with the Scepter of Enhancement.
"
+ dat += "A meter is equal to one 'tile'.
"
+ user << browse(dat, "window=radio")
+ onclose(user, "radio")
// Proc: Topic()
// Parameters: 2 (href - don't know, href_list - the choice that the person using the interface above clicked on.)
@@ -266,8 +340,36 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
if(core)
for(var/obj/spellbutton/spell in core.spells)
for(var/datum/technomancer/spell/spell_datum in spell_instances)
- if(spell_datum.obj_path == spell.spellpath && !spell.was_bought_by_preset)
+ if(spell_datum.obj_path == spell.spellpath)
budget += spell_datum.cost
core.remove_spell(spell)
break
attack_self(H)
+
+/obj/item/weapon/technomancer_catalog/attackby(var/atom/movable/AM, var/mob/user)
+ if(user.z != 2)
+ to_chat(user, "You can only refund at your base, it's too late now!")
+ return
+ for(var/datum/technomancer/equipment/E in equipment_instances + assistance_instances)
+ if(AM.type == E.obj_path) // We got a match.
+ if(budget + E.cost > max_budget)
+ to_chat(user, "\The [src] will not allow you to overflow your maximum budget by refunding that.")
+ return
+ else
+ budget = budget + E.cost
+ to_chat(user, "You've refunded \the [AM].")
+
+ // We sadly need to do special stuff here or else people who refund cores with spells will lose points permanently.
+ if(istype(AM, /obj/item/weapon/technomancer_core))
+ var/obj/item/weapon/technomancer_core/core = AM
+ for(var/obj/spellbutton/spell in core.spells)
+ for(var/datum/technomancer/spell/spell_datum in spell_instances)
+ if(spell_datum.obj_path == spell.spellpath)
+ budget += spell_datum.cost
+ to_chat(user, "[spell.name] was inside \the [core], and was refunded.")
+ core.remove_spell(spell)
+ break
+ qdel(AM)
+ return
+ to_chat(user, "\The [src] is unable to refund \the [AM].")
+
diff --git a/code/game/gamemodes/technomancer/core_obj.dm b/code/game/gamemodes/technomancer/core_obj.dm
index fc89f5ce69..491f9c4c3c 100644
--- a/code/game/gamemodes/technomancer/core_obj.dm
+++ b/code/game/gamemodes/technomancer/core_obj.dm
@@ -20,7 +20,9 @@
var/regen_rate = 50 // 200 seconds to full
var/energy_delta = 0 // How much we're gaining (or perhaps losing) every process().
var/mob/living/wearer = null // Reference to the mob wearing the core.
- var/instability_modifer = 0.8 // Multiplier on how much instability is added.
+ var/instability_modifier = 0.8 // Multiplier on how much instability is added.
+ var/energy_cost_modifier = 1.0 // Multiplier on how much spells will cost.
+ var/spell_power_modifier = 1.0 // Multiplier on how strong spells are.
var/list/spells = list() // This contains the buttons used to make spells in the user's hand.
var/list/appearances = list( // Assoc list containing possible icon_states that the wiz can change the core to.
"default" = "technomancer_core",
@@ -67,6 +69,7 @@
return 0
/obj/item/weapon/technomancer_core/proc/pay_energy(amount)
+ amount = round(amount * energy_cost_modifier, 0.1)
if(amount <= energy)
energy = max(energy - amount, 0)
return 1
@@ -131,7 +134,6 @@
name = "generic spellbutton"
var/spellpath = null
var/obj/item/weapon/technomancer_core/core = null
- var/was_bought_by_preset = 0 // Relevant for refunding via the spellbook. Presets may be priced differently.
var/ability_icon_state = null
/obj/spellbutton/New(loc, var/path, var/new_name, var/new_icon_state)
@@ -222,7 +224,9 @@
energy = 13000
max_energy = 13000
regen_rate = 35 //~371 seconds to full, 118 seconds to full at 50 instability (rate of 110)
- instability_modifer = 1.2
+ instability_modifier = 1.2
+ energy_cost_modifier = 0.7
+ spell_power_modifier = 1.1
/obj/item/weapon/technomancer_core/unstable/regenerate()
var/instability_bonus = 0
@@ -243,19 +247,21 @@
max_energy = 7000
regen_rate = 70 //100 seconds to full
slowdown = -1
- instability_modifer = 0.9
+ instability_modifier = 0.9
//Big batteries but slow regen, buying energy spells is highly recommended.
/obj/item/weapon/technomancer_core/bulky
name = "bulky core"
desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This variant is more \
- cumbersome and bulky, due to the additional energy capacitors installed. It also comes at a price of a subpar fractal \
+ cumbersome and bulky, due to the additional energy capacitors installed, which allows for a massive energy storage, as well \
+ as stronger function usage. It also comes at a price of a subpar fractal \
reactor."
energy = 20000
max_energy = 20000
regen_rate = 25 //800 seconds to full
slowdown = 1
- instability_modifer = 1.0
+ instability_modifier = 1.0
+ spell_power_modifier = 1.4
// Using this can result in abilities costing less energy. If you're lucky.
/obj/item/weapon/technomancer_core/recycling
@@ -265,15 +271,17 @@
energy = 12000
max_energy = 12000
regen_rate = 40 //300 seconds to full
- instability_modifer = 0.6
+ instability_modifier = 0.6
+ energy_cost_modifier = 0.8
/obj/item/weapon/technomancer_core/recycling/pay_energy(amount)
- ..()
- if(.)
+ var/success = ..()
+ if(success)
if(prob(30))
give_energy(round(amount / 2))
- if(amount >= 100) // Managing to recover less than half of this isn't worth telling the user about.
+ if(amount >= 50) // Managing to recover less than half of this isn't worth telling the user about.
wearer << "\The [src] has recovered [amount/2 >= 1000 ? "a lot of" : "some"] energy."
+ return success
// For those dedicated to summoning hoards of things.
/obj/item/weapon/technomancer_core/summoner
@@ -285,12 +293,37 @@
max_energy = 8000
regen_rate = 35 //228 seconds to full
max_summons = 40
- instability_modifer = 1.0
+ instability_modifier = 1.2
+ spell_power_modifier = 1.2
/obj/item/weapon/technomancer_core/summoner/pay_dues()
if(summoned_mobs.len)
pay_energy( round(summoned_mobs.len) )
+// For those who hate instability.
+/obj/item/weapon/technomancer_core/safety
+ name = "safety core"
+ desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This type is designed to be \
+ the closest thing you can get to 'safe' for a Core. Instability from this is significantly reduced. You can even dance if \
+ you want to, and leave your apprentice behind."
+ energy = 7000
+ max_energy = 7000
+ regen_rate = 30 //233 seconds to full
+ instability_modifier = 0.3
+ spell_power_modifier = 0.7
+
+// For those who want to blow everything on a few spells.
+/obj/item/weapon/technomancer_core/overcharged
+ name = "overcharged core"
+ desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. This type will use as much \
+ energy as it can in order to pump up the strength of functions used to insane levels."
+ energy = 15000
+ max_energy = 15000
+ regen_rate = 40 //375 seconds to full
+ instability_modifier = 1.1
+ spell_power_modifier = 1.75
+ energy_cost_modifier = 2.0
+
/obj/item/weapon/technomancer_core/verb/toggle_lock()
set name = "Toggle Core Lock"
set category = "Object"
diff --git a/code/game/gamemodes/technomancer/equipment.dm b/code/game/gamemodes/technomancer/equipment.dm
index 97978086b3..5c440d0dcd 100644
--- a/code/game/gamemodes/technomancer/equipment.dm
+++ b/code/game/gamemodes/technomancer/equipment.dm
@@ -1,55 +1,106 @@
/datum/technomancer/equipment/default_core
name = "Manipulation Core"
+// desc = "The default core that you most likely already have. This is here in-case you change your mind after buying \
+// another core, don't forget to refund the old core. This has a capacity of 10,000 units of energy, and recharges at a \
+// rate of 50 units. It also reduces incoming instability from functions by 20%."
desc = "The default core that you most likely already have. This is here in-case you change your mind after buying \
- another core, don't forget to refund the old core. This has a capacity of 10,000 units of energy, and recharges at a \
- rate of 50 units. It also reduces incoming instability from functions by 20%."
+ another core, don't forget to refund the old core.
\
+ Capacity: 10k
\
+ Recharge: 50/s
\
+ Instability Modifier: 80%
\
+ Energy Cost Modifier: 100%
\
+ Spell Power: 100%"
cost = 100
obj_path = /obj/item/weapon/technomancer_core
/datum/technomancer/equipment/rapid_core
name = "Rapid Core"
desc = "A core optimized for passive regeneration, however at the cost of capacity. Has a capacity of 7,000 units of energy, and \
- recharges at a rate of 70 units. Complex gravatics and force manipulation allows the wearer to also run slightly faster, and \
- reduces incoming instability from functions by 10%."
+ recharges at a rate of 70 units. Complex gravatics and force manipulation allows the wearer to also run slightly faster.
\
+ Capacity: 7k
\
+ Recharge: 70/s
\
+ Instability Modifier: 90%
\
+ Energy Cost Modifier: 100%
\
+ Spell Power: 100%"
cost = 100
obj_path = /obj/item/weapon/technomancer_core/rapid
/datum/technomancer/equipment/bulky_core
name = "Bulky Core"
desc = "This core has very large capacitors, however it also has a subpar fractal reactor. The user is recommended to \
- purchase one or more energy-generating Functions as well if using this core. Has a capacity of 20,000 units of energy, \
- and recharges at a rate of 25 units. The intense weight of the core unfortunately can cause the wear to move slightly slower, \
- and the closeness of the capacitors causes a slight increase in incoming instability by 10%."
+ purchase one or more energy-generating Functions as well if using this core. The intense weight of the core unfortunately can \
+ cause the wear to move slightly slower, and the closeness of the capacitors causes a slight increase in incoming instability.
\
+ Capacity: 20k
\
+ Recharge: 25/s
\
+ Instability Modifier: 100%
\
+ Energy Cost Modifier: 100%
\
+ Spell Power: 140%"
cost = 100
obj_path = /obj/item/weapon/technomancer_core/bulky
/datum/technomancer/equipment/unstable
name = "Unstable Core"
desc = "This core feeds off unstable energies around the user in addition to a fractal reactor. This means that it performs \
- better as the user has more instability, which could prove dangerous to the inexperienced or unprepared. Has a capacity of 13,000 \
- units of energy, and recharges at a rate of 35 units at no instability, and approximately 110 units when within the \
- 'yellow zone' of instability. Incoming instability is also amplified by 30%, due to the nature of this core."
+ better as the user has more instability, which could prove dangerous to the inexperienced or unprepared. The rate of recharging \
+ increases as the user accumulates more instability, eventually exceeding even the rapid core in regen speed, at a huge risk.
\
+ Capacity: 13k
\
+ Recharge: 35/s to 110/s+
\
+ Instability Modifier: 130%
\
+ Energy Cost Modifier: 70%
\
+ Spell Power: 110%"
cost = 100
obj_path = /obj/item/weapon/technomancer_core/unstable
/datum/technomancer/equipment/recycling
name = "Recycling Core"
desc = "This core is optimized for energy efficency, being able to sometimes recover energy that would have been lost with other \
- cores. The focus on efficency also makes instability less of an issue, as incoming instability from functions are reduced by \
- 40%. The capacitor is also slightly better, holding 12,000 units of energy, however the reactor is slower to recharge, at a rate \
- of 40 units."
+ cores. Each time energy is spent, there is a 30% chance of recovering half of what was spent.
\
+ Capacity: 12k
\
+ Recharge: 40/s
\
+ Instability Modifier: 60%
\
+ Energy Cost Modifier: 80%
\
+ Spell Power: 100%"
cost = 100
obj_path = /obj/item/weapon/technomancer_core/recycling
/datum/technomancer/equipment/summoning
name = "Summoning Core"
desc = "A unique type of core, this one sacrifices other characteristics in order to optimize it for the purposes teleporting \
- entities from vast distances, and keeping them there. Wearers of this core can maintain up to 30 summons at once, and the energy \
- demand for maintaining summons is severely reduced. This comes at the price of capcitors that can only hold 8,000 units of energy, \
- a recharging rate of 35 energy, and no shielding from instability."
+ entities from vast distances, and keeping them there. Wearers of this core can maintain up to 40 summons at once, and the energy \
+ demand for maintaining summons is severely reduced.
\
+ Capacity: 8k
\
+ Recharge: 35/s
\
+ Instability Modifier: 120%
\
+ Energy Cost Modifier: 100%
\
+ Spell Power: 120%"
cost = 100
obj_path = /obj/item/weapon/technomancer_core/summoner
+/datum/technomancer/equipment/safety
+ name = "Safety Core"
+ desc = "This core is designed so that the wearer suffers almost no instability. It unfortunately comes at a cost of subpar \
+ ratings for everything else.
\
+ Capacity: 7k
\
+ Recharge: 30/s
\
+ Instability Modifier: 30%
\
+ Energy Cost Modifier: 100%
\
+ Spell Power: 70%"
+ cost = 100
+ obj_path = /obj/item/weapon/technomancer_core/safety
+
+/datum/technomancer/equipment/overcharged
+ name = "Overcharged Core"
+ desc = "A core that was created in order to get the most power out of functions. It does this by shoving the most power into \
+ those functions, so it is the opposite of energy efficent, however the enhancement of functions is second to none for other \
+ cores.
\
+ Capacity: 15k (effectively 7.5k)
\
+ Recharge: 40/s
\
+ Instability Modifier: 110%
\
+ Energy Cost Modifier: 200%
\
+ Spell Power: 175%"
+ cost = 100
+ obj_path = /obj/item/weapon/technomancer_core/overcharged
+
/datum/technomancer/equipment/hypo_belt
name = "Hypo Belt"
desc = "A medical belt designed to carry autoinjectors and other medical equipment. Comes with one of each hypo."
@@ -154,3 +205,15 @@
if(istype(item_to_test, /obj/item/weapon/spell))
var/obj/item/weapon/spell/S = item_to_test
S.on_scepter_ranged_cast(target, user)
+
+/datum/technomancer/equipment/spyglass
+ name = "Spyglass"
+ desc = "A mundane spyglass, it may prove useful to those who wish to scout ahead, or fight from an extreme range."
+ cost = 100
+ obj_path = /obj/item/device/binoculars/spyglass
+
+/obj/item/device/binoculars/spyglass
+ name = "spyglass"
+ desc = "It's a hand-held telescope, useful for star-gazing, peeping, and recon."
+ icon_state = "spyglass"
+ slot_flags = SLOT_BELT
diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm
index e00c8d123e..d4f7b4b7d5 100644
--- a/code/game/gamemodes/technomancer/spell_objs.dm
+++ b/code/game/gamemodes/technomancer/spell_objs.dm
@@ -112,7 +112,7 @@
/obj/item/weapon/spell/proc/adjust_instability(var/amount)
if(!owner || !core)
return 0
- amount = round(amount * core.instability_modifer, 0.1)
+ amount = round(amount * core.instability_modifier, 0.1)
owner.adjust_instability(amount)
// Proc: New()
diff --git a/code/game/gamemodes/technomancer/spell_objs_helpers.dm b/code/game/gamemodes/technomancer/spell_objs_helpers.dm
index 9b638e8c12..caaa6f01c5 100644
--- a/code/game/gamemodes/technomancer/spell_objs_helpers.dm
+++ b/code/game/gamemodes/technomancer/spell_objs_helpers.dm
@@ -25,6 +25,15 @@
return 0
return 1
+/obj/item/weapon/spell/proc/within_range(var/atom/target, var/max_range = 7) // Beyond 7 is off the screen.
+ if(range(get_dist(owner, target) <= max_range))
+ return TRUE
+ return FALSE
+
+/obj/item/weapon/spell/proc/calculate_spell_power(var/amount)
+ if(core)
+ return round(amount * core.spell_power_modifier, 1)
+
// Returns a 'target' mob from a radius around T.
/obj/item/weapon/spell/proc/targeting_assist(var/turf/T, radius = 5)
var/chosen_target = null
diff --git a/code/game/gamemodes/technomancer/spells/abjuration.dm b/code/game/gamemodes/technomancer/spells/abjuration.dm
index 005f1561bf..146c90a987 100644
--- a/code/game/gamemodes/technomancer/spells/abjuration.dm
+++ b/code/game/gamemodes/technomancer/spells/abjuration.dm
@@ -14,7 +14,7 @@
aspect = ASPECT_TELE
/obj/item/weapon/spell/abjuration/on_ranged_cast(atom/hit_atom, mob/user)
- if(istype(hit_atom, /mob/living) && pay_energy(500))
+ if(istype(hit_atom, /mob/living) && pay_energy(500) && within_range(hit_atom))
var/mob/living/L = hit_atom
var/mob/living/simple_animal/SA = null
diff --git a/code/game/gamemodes/technomancer/spells/apportation.dm b/code/game/gamemodes/technomancer/spells/apportation.dm
index 9cc95b1e6e..9fafc47ae3 100644
--- a/code/game/gamemodes/technomancer/spells/apportation.dm
+++ b/code/game/gamemodes/technomancer/spells/apportation.dm
@@ -2,6 +2,7 @@
name = "Apportation"
desc = "This allows you to teleport objects into your hand, or to pull people towards you. If they're close enough, the function \
will grab them automatically."
+ enhancement_desc = "Range is unlimited."
cost = 25
obj_path = /obj/item/weapon/spell/apportation
category = UTILITY_SPELLS
@@ -22,6 +23,9 @@
if(AM.anchored)
user << "\The [hit_atom] is firmly secured and anchored, you can't move it!"
return
+ if(!within_range(hit_atom) && !check_for_scepter())
+ user << "\The [hit_atom] is too far away."
+ return
//Teleporting an item.
if(istype(hit_atom, /obj/item))
var/obj/item/I = hit_atom
@@ -38,6 +42,7 @@
src.loc = null
user.put_in_hands(I)
user.visible_message("\A [I] appears in \the [user]'s hand!")
+ log_and_message_admins("has stolen [I] with [src].")
qdel(src)
//Now let's try to teleport a living mob.
else if(istype(hit_atom, /mob/living))
diff --git a/code/game/gamemodes/technomancer/spells/audible_deception.dm b/code/game/gamemodes/technomancer/spells/audible_deception.dm
index 832714f202..43dfdf978a 100644
--- a/code/game/gamemodes/technomancer/spells/audible_deception.dm
+++ b/code/game/gamemodes/technomancer/spells/audible_deception.dm
@@ -1,8 +1,8 @@
/datum/technomancer/spell/audible_deception
name = "Audible Deception"
desc = "Allows you to create a specific sound at a location of your choosing."
- enhancement_desc = "An extremely loud sound that a large amount of energy and instability becomes available, which will \
- deafen and stun all who are near the targeted tile, including yourself if unprotected."
+ enhancement_desc = "An extremely loud bike horn sound that costs large amount of energy and instability becomes available, \
+ which will deafen and stun all who are near the targeted tile, including yourself if unprotected."
cost = 50
obj_path = /obj/item/weapon/spell/audible_deception
ability_icon_state = "tech_audibledeception"
diff --git a/code/game/gamemodes/technomancer/spells/aura/aura.dm b/code/game/gamemodes/technomancer/spells/aura/aura.dm
index 8ccdc89d0a..a265507091 100644
--- a/code/game/gamemodes/technomancer/spells/aura/aura.dm
+++ b/code/game/gamemodes/technomancer/spells/aura/aura.dm
@@ -8,11 +8,13 @@
/obj/item/weapon/spell/aura/New()
..()
- set_light(7, 4, l_color = glow_color)
+ set_light(7, calculate_spell_power(4), l_color = glow_color)
processing_objects |= src
+ log_and_message_admins("has started casting [src].")
/obj/item/weapon/spell/aura/Destroy()
processing_objects -= src
+ log_and_message_admins("has stopped maintaining [src].")
..()
/obj/item/weapon/spell/aura/process()
diff --git a/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm b/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm
index 7eee612b8f..ec73fb1011 100644
--- a/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm
+++ b/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm
@@ -1,6 +1,7 @@
/datum/technomancer/spell/biomed_aura
name = "Restoration Aura"
desc = "Heals you and your allies (or everyone, if you want) of trauma and burns slowly, as long as they remain within four meters."
+ spell_power_desc = "Increases the radius and healing amount of the aura."
cost = 100
obj_path = /obj/item/weapon/spell/aura/biomed
ability_icon_state = "tech_biomedaura"
@@ -21,7 +22,7 @@
qdel(src)
regen_tick++
if(regen_tick % 5 == 0)
- var/list/nearby_mobs = range(4,owner)
+ var/list/nearby_mobs = range(calculate_spell_power(4),owner)
var/list/mobs_to_heal = list()
for(var/mob/living/L in nearby_mobs)
if(heal_allies_only)
@@ -30,8 +31,8 @@
else
mobs_to_heal |= L // Heal everyone!
for(var/mob/living/L in mobs_to_heal)
- L.adjustBruteLoss(-2)
- L.adjustFireLoss(-2)
+ L.adjustBruteLoss(calculate_spell_power(-2))
+ L.adjustFireLoss(calculate_spell_power(-2))
adjust_instability(2)
/obj/item/weapon/spell/aura/biomed/on_use_cast(mob/living/user)
diff --git a/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm b/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm
index 431828ed54..0cea17f7d9 100644
--- a/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm
+++ b/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm
@@ -4,6 +4,7 @@
This does not affect you or your allies. It also causes a large amount of fire to erupt around you, however the main threat is \
still the heating up."
enhancement_desc = "Increased heat generation, more fires, and higher temperature cap."
+ spell_power_desc = "Radius, heat rate, heat capacity, and amount of fires made increased."
cost = 100
obj_path = /obj/item/weapon/spell/aura/fire
ability_icon_state = "tech_fireaura"
@@ -19,16 +20,17 @@
/obj/item/weapon/spell/aura/fire/process()
if(!pay_energy(100))
qdel(src)
- var/list/nearby_things = range(4,owner)
+ var/list/nearby_things = range(calculate_spell_power(4),owner)
- var/temp_change = 40
- var/temp_cap = 600
- var/fire_power = 2
+ var/temp_change = calculate_spell_power(40)
+ var/temp_cap = calculate_spell_power(600)
+ var/fire_power = calculate_spell_power(2)
if(check_for_scepter())
- temp_change = 80
- temp_cap = 1000
- fire_power = 4
+ temp_change = calculate_spell_power(80)
+ temp_cap = calculate_spell_power(1000)
+ fire_power = calculate_spell_power(4)
+
for(var/mob/living/carbon/human/H in nearby_things)
if(is_ally(H))
continue
diff --git a/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm b/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm
index 4ed1a469c1..08986faa9a 100644
--- a/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm
+++ b/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm
@@ -1,8 +1,9 @@
/datum/technomancer/spell/frost_aura
name = "Chilling Aura"
- desc = "Lowers the core body temperature of everyone around you (except for your friends), causing them to freeze to death if \
+ desc = "Lowers the core body temperature of everyone around you (except for your friends), causing them to become very slow if \
they stay within four meters of you."
enhancement_desc = "The chill becomes lethal."
+ spell_power_desc = "Radius and rate of cooling are scaled."
cost = 100
obj_path = /obj/item/weapon/spell/aura/frost
ability_icon_state = "tech_frostaura"
@@ -19,13 +20,13 @@
/obj/item/weapon/spell/aura/frost/process()
if(!pay_energy(100))
qdel(src)
- var/list/nearby_mobs = range(4,owner)
+ var/list/nearby_mobs = range(calculate_spell_power(4),owner)
- var/temp_change = 25
+ var/temp_change = calculate_spell_power(25)
var/temp_cap = 260 // Just above the damage threshold, for humans. Unathi are less fortunate.
if(check_for_scepter())
- temp_change = 50
+ temp_change = calculate_spell_power(50)
temp_cap = 200
for(var/mob/living/carbon/human/H in nearby_mobs)
if(is_ally(H))
diff --git a/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm b/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm
index b4c6027d9d..2cc1b5d73f 100644
--- a/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm
+++ b/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm
@@ -1,6 +1,8 @@
/datum/technomancer/spell/shock_aura
name = "Electric Aura"
desc = "Repeatively electrocutes enemies within four meters of you, as well as nearby electronics."
+ enhancement_desc = "Aura does twice as much damage."
+ spell_power_desc = "Radius and damage scaled up."
cost = 100
obj_path = /obj/item/weapon/spell/aura/shock
ability_icon_state = "tech_shockaura"
@@ -17,11 +19,11 @@
/obj/item/weapon/spell/aura/shock/process()
if(!pay_energy(1000))
qdel(src)
- var/list/nearby_mobs = range(4,owner)
- var/power = 7
+ var/list/nearby_mobs = range(calculate_spell_power(4),owner)
+ var/power = calculate_spell_power(7)
if(check_for_scepter())
- power = 15
- for(var/obj/machinery/light/light in range(7, owner))
+ power = calculate_spell_power(15)
+ for(var/obj/machinery/light/light in range(calculate_spell_power(7), owner))
light.flicker()
for(var/mob/living/L in nearby_mobs)
if(is_ally(L))
diff --git a/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm b/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm
index 726e7d87b1..431e72a32f 100644
--- a/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm
+++ b/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm
@@ -1,7 +1,9 @@
/datum/technomancer/spell/unstable_aura
name = "Degen Aura"
desc = "Destabalizes your enemies, breaking their elements down to their basic levels, slowly killing them from the inside. \
- For each person within fourteen meters of you, they suffer 1% of their current health every second. Your allies are unharmed."
+ For each person within fourteen meters of you, they suffer 1% of their current health every second. Your allies are \
+ unharmed."
+ spell_power_desc = "Radius is increased."
cost = 150
obj_path = /obj/item/weapon/spell/aura/unstable
ability_icon_state = "tech_unstableaura"
@@ -13,12 +15,12 @@
icon_state = "generic"
cast_methods = null
aspect = ASPECT_UNSTABLE
- glow_color = "#0000FF" //TODO
+ glow_color = "#CC00CC"
/obj/item/weapon/spell/aura/unstable/process()
if(!pay_energy(200))
qdel(src)
- var/list/nearby_mobs = range(14,owner)
+ var/list/nearby_mobs = range(calculate_spell_power(14),owner)
for(var/mob/living/L in nearby_mobs)
if(is_ally(L))
continue
diff --git a/code/game/gamemodes/technomancer/spells/blink.dm b/code/game/gamemodes/technomancer/spells/blink.dm
index 19f6e84c83..a3ddae6517 100644
--- a/code/game/gamemodes/technomancer/spells/blink.dm
+++ b/code/game/gamemodes/technomancer/spells/blink.dm
@@ -3,6 +3,7 @@
desc = "Force the target to teleport a short distance away. This target could be anything from something lying on the ground, to someone trying to \
fight you, or even yourself. Using this on someone next to you makes their potential distance after teleportation greater."
enhancement_desc = "Blink distance is increased greatly."
+ spell_power_desc = "Blink distance is scaled up with more spell power."
cost = 50
obj_path = /obj/item/weapon/spell/blink
category = UTILITY_SPELLS
@@ -50,22 +51,28 @@
/obj/item/weapon/spell/blink/on_ranged_cast(atom/hit_atom, mob/user)
if(istype(hit_atom, /atom/movable))
var/atom/movable/AM = hit_atom
+ if(!within_range(AM))
+ user << "\The [AM] is too far away to blink."
+ return
if(check_for_scepter())
- safe_blink(user, 6)
+ safe_blink(AM, calculate_spell_power(6))
else
- safe_blink(AM, 3)
+ safe_blink(AM, calculate_spell_power(3))
+ log_and_message_admins("has blinked [AM] away.")
/obj/item/weapon/spell/blink/on_use_cast(mob/user)
if(check_for_scepter())
- safe_blink(user, 10)
+ safe_blink(user, calculate_spell_power(10))
else
- safe_blink(user, 6)
+ safe_blink(user, calculate_spell_power(6))
+ log_and_message_admins("has blinked themselves away.")
/obj/item/weapon/spell/blink/on_melee_cast(atom/hit_atom, mob/living/user, def_zone)
if(istype(hit_atom, /atom/movable))
var/atom/movable/AM = hit_atom
visible_message("\The [user] reaches out towards \the [AM] with a glowing hand.")
if(check_for_scepter())
- safe_blink(user, 10)
+ safe_blink(AM, 10)
else
- safe_blink(AM, 6)
\ No newline at end of file
+ safe_blink(AM, 6)
+ log_and_message_admins("has blinked [AM] away.")
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/condensation.dm b/code/game/gamemodes/technomancer/spells/condensation.dm
index 285f414f15..f4c7be60ff 100644
--- a/code/game/gamemodes/technomancer/spells/condensation.dm
+++ b/code/game/gamemodes/technomancer/spells/condensation.dm
@@ -17,7 +17,7 @@
/obj/item/weapon/spell/condensation/on_ranged_cast(atom/hit_atom, mob/user)
if(pay_energy(200))
- if(istype(hit_atom, /turf/simulated))
+ if(istype(hit_atom, /turf/simulated) && within_range(hit_atom))
var/turf/simulated/T = hit_atom
for(var/direction in alldirs + null) // null is for the center tile.
@@ -30,6 +30,7 @@
W.set_color()
W.set_up(desired_turf)
flick(initial(icon_state),W) // Otherwise pooling causes the animation to stay stuck at the end.
+ log_and_message_admins("has wetted the floor with [src] at [T.x],[T.y],[T.z].")
else if(hit_atom.reagents && !ismob(hit_atom))
hit_atom.reagents.add_reagent(id = "water", amount = 60, data = null, safety = 0)
adjust_instability(5)
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/control.dm b/code/game/gamemodes/technomancer/spells/control.dm
index 0cee9a9350..7ff42299b8 100644
--- a/code/game/gamemodes/technomancer/spells/control.dm
+++ b/code/game/gamemodes/technomancer/spells/control.dm
@@ -146,6 +146,7 @@
return 0
if(pay_energy(50 * controlled_mobs.len))
attack_all(L)
+ log_and_message_admins("has commanded their army of [controlled_mobs.len] to attack [L].")
user << "You command your [controlled_mobs.len > 1 ? "entities" : "[controlled_mobs[1]]"] to \
attack \the [L]."
//This is to stop someone from controlling beepsky and getting him to stun someone 5 times a second.
diff --git a/code/game/gamemodes/technomancer/spells/dispel.dm b/code/game/gamemodes/technomancer/spells/dispel.dm
index 771bc6b625..87edf6a621 100644
--- a/code/game/gamemodes/technomancer/spells/dispel.dm
+++ b/code/game/gamemodes/technomancer/spells/dispel.dm
@@ -16,9 +16,10 @@
aspect = ASPECT_BIOMED
/obj/item/weapon/spell/dispel/on_ranged_cast(atom/hit_atom, mob/living/user)
- if(isliving(hit_atom) && pay_energy(1000))
+ if(isliving(hit_atom) && within_range(hit_atom) && pay_energy(1000))
var/mob/living/target = hit_atom
for(var/obj/item/weapon/inserted_spell/I in target)
I.on_expire(dispelled = 1)
+ log_and_message_admins("dispelled [I] on [target].")
user.adjust_instability(10)
qdel(src)
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/energy_siphon.dm b/code/game/gamemodes/technomancer/spells/energy_siphon.dm
index ad379b2d3c..e5c83c91b6 100644
--- a/code/game/gamemodes/technomancer/spells/energy_siphon.dm
+++ b/code/game/gamemodes/technomancer/spells/energy_siphon.dm
@@ -4,6 +4,7 @@
Every second, electricity is stolen until the link is broken by the target moving too far away, or having no more energy left. \
Can drain from powercells, microbatteries, and other Cores. The beam created by the siphoning is harmful to touch."
enhancement_desc = "Rate of siphoning is doubled."
+ spell_power_desc = "Rate of siphoning is scaled up based on spell power."
cost = 100
obj_path = /obj/item/weapon/spell/energy_siphon
ability_icon_state = "tech_energysiphon"
@@ -48,7 +49,7 @@
/obj/item/weapon/spell/energy_siphon/on_ranged_cast(atom/hit_atom, mob/user)
- if(istype(hit_atom, /atom/movable))
+ if(istype(hit_atom, /atom/movable) && within_range(hit_atom, 4))
var/atom/movable/AM = hit_atom
populate_siphon_list(AM)
if(!things_to_siphon.len)
@@ -56,6 +57,7 @@
return 0
siphoning = AM
update_icon()
+ log_and_message_admins("is siphoning energy from \a [AM].")
else
stop_siphoning()
@@ -84,7 +86,7 @@
/obj/item/weapon/spell/energy_siphon/proc/siphon(atom/movable/siphoning, mob/user)
var/list/things_to_drain = things_to_siphon // Temporary list copy of what we're gonna steal from.
var/charge_to_give = 0 // How much energy to give to the Technomancer at the end.
- var/flow_remaining = flow_rate
+ var/flow_remaining = calculate_spell_power(flow_rate)
if(!siphoning)
return 0
diff --git a/code/game/gamemodes/technomancer/spells/flame_tongue.dm b/code/game/gamemodes/technomancer/spells/flame_tongue.dm
index 79e613aa0f..01b923ead8 100644
--- a/code/game/gamemodes/technomancer/spells/flame_tongue.dm
+++ b/code/game/gamemodes/technomancer/spells/flame_tongue.dm
@@ -46,6 +46,7 @@
visible_message("\The [user] reaches out towards \the [L] with the flaming hand, and they ignite!")
L << "You ignite!"
L.fire_act()
+ log_and_message_admins("has ignited [L] with [src].")
adjust_instability(12)
else
//This is needed in order for the welder to work, and works similarly to grippers.
diff --git a/code/game/gamemodes/technomancer/spells/insert/corona.dm b/code/game/gamemodes/technomancer/spells/insert/corona.dm
index a070108a68..0ecd700732 100644
--- a/code/game/gamemodes/technomancer/spells/insert/corona.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/corona.dm
@@ -2,6 +2,7 @@
name = "Corona"
desc = "Causes the victim to glow very brightly, which while harmless in itself, makes it easier for them to be hit. The \
bright glow also makes it very difficult to be stealthy. The effect lasts for one minute."
+ spell_power_desc = "Enemies become even easier to hit."
cost = 50
obj_path = /obj/item/weapon/spell/insert/corona
ability_icon_state = "tech_corona"
@@ -18,11 +19,16 @@
spell_light_range = 3
inserting = /obj/item/weapon/inserted_spell/corona
+
+/obj/item/weapon/inserted_spell/corona
+ var/evasion_reduction = 2 // We store this here because spell power may change when the spell expires.
+
/obj/item/weapon/inserted_spell/corona/on_insert()
spawn(1)
if(isliving(host))
var/mob/living/L = host
- L.evasion -= 2
+ evasion_reduction = round(2 * spell_power_at_creation, 1)
+ L.evasion -= evasion_reduction
L.visible_message("You start to glow very brightly!")
spawn(1 MINUTE)
if(src)
@@ -31,6 +37,6 @@
/obj/item/weapon/inserted_spell/corona/on_expire()
if(isliving(host))
var/mob/living/L = host
- L.evasion += 2
+ L.evasion += evasion_reduction
L << "Your glow has ended."
..()
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/insert/haste.dm b/code/game/gamemodes/technomancer/spells/insert/haste.dm
index 8a3455701a..30422cef3f 100644
--- a/code/game/gamemodes/technomancer/spells/insert/haste.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/haste.dm
@@ -2,6 +2,7 @@
name = "Haste"
desc = "Allows the target to run at speeds that should not be possible for an ordinary being. For five seconds, the target \
runs extremly fast, and cannot be slowed by any means."
+ spell_power_desc = "Duration is scaled up."
cost = 100
obj_path = /obj/item/weapon/spell/insert/haste
ability_icon_state = "tech_haste"
@@ -23,7 +24,7 @@
L.force_max_speed = 1
L << "You suddenly find it much easier to move."
L.adjust_instability(10)
- spawn(5 SECONDS)
+ spawn(round(5 SECONDS * spell_power_at_creation, 1))
if(src)
on_expire()
diff --git a/code/game/gamemodes/technomancer/spells/insert/insert.dm b/code/game/gamemodes/technomancer/spells/insert/insert.dm
index d74e570d3f..168300f6ce 100644
--- a/code/game/gamemodes/technomancer/spells/insert/insert.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/insert.dm
@@ -18,6 +18,7 @@
/obj/item/weapon/inserted_spell
var/mob/living/carbon/human/origin = null
var/mob/living/host = null
+ var/spell_power_at_creation = 1.0 // This is here because the spell object that made this object probably won't exist.
/obj/item/weapon/inserted_spell/New(var/newloc, var/user, var/obj/item/weapon/spell/insert/inserter)
..(newloc)
@@ -42,7 +43,9 @@
if(IS.type == inserting)
user << "\The [L] is already affected by \the [src]."
return
- new inserting(L,user,src)
+ var/obj/item/weapon/inserted_spell/inserted = new inserting(L,user,src)
+ inserted.spell_power_at_creation = calculate_spell_power(1.0)
+ log_and_message_admins("has casted [src] on [L].")
qdel(src)
/obj/item/weapon/spell/insert/on_melee_cast(atom/hit_atom, mob/user)
diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm b/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm
index ff6d3dfdd6..2201787d34 100644
--- a/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm
@@ -1,6 +1,7 @@
/datum/technomancer/spell/mend_burns
name = "Mend Burns"
desc = "Heals minor burns, such as from exposure to flame, electric shock, or lasers."
+ spell_power_desc = "Healing amount increased."
cost = 50
obj_path = /obj/item/weapon/spell/insert/mend_burns
ability_icon_state = "tech_mendburns"
@@ -20,6 +21,7 @@
if(ishuman(host))
var/mob/living/carbon/human/H = host
var/heal_power = host == origin ? 10 : 30
+ heal_power = round(heal_power * spell_power_at_creation, 1)
origin.adjust_instability(10)
for(var/i = 0, i<5,i++)
if(H)
diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm b/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm
index 5b3f1bdc2b..376ab8df1c 100644
--- a/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm
@@ -1,6 +1,7 @@
/datum/technomancer/spell/mend_metal
name = "Mend Metal"
desc = "Restores integrity to external robotic components."
+ spell_power_desc = "Healing amount increased."
cost = 50
obj_path = /obj/item/weapon/spell/insert/mend_metal
ability_icon_state = "tech_mendwounds"
@@ -20,6 +21,7 @@
if(ishuman(host))
var/mob/living/carbon/human/H = host
var/heal_power = host == origin ? 10 : 30
+ heal_power = round(heal_power * spell_power_at_creation, 1)
origin.adjust_instability(10)
for(var/i = 0, i<5,i++)
if(H)
diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm b/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm
index 294393cbb4..98ef33168d 100644
--- a/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm
@@ -2,6 +2,7 @@
name = "Great Mend Wounds"
desc = "Greatly heals the target's wounds, both external and internal. Restores internal organs to functioning states, even if \
robotic, reforms bones, patches internal bleeding, and restores missing blood."
+ spell_power_desc = "Healing amount increased."
cost = 100
obj_path = /obj/item/weapon/spell/insert/mend_organs
ability_icon_state = "tech_mendwounds"
@@ -21,6 +22,7 @@
if(ishuman(host))
var/mob/living/carbon/human/H = host
var/heal_power = host == origin ? 2 : 5
+ heal_power = round(heal_power * spell_power_at_creation, 1)
origin.adjust_instability(15)
for(var/i = 0, i<5,i++)
diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm b/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm
index 089a02152c..aad59dc7c4 100644
--- a/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm
@@ -1,6 +1,7 @@
/datum/technomancer/spell/mend_wires
name = "Mend Wires"
desc = "Binds the internal wiring of robotic limbs and components over time."
+ spell_power_desc = "Healing amount increased."
cost = 50
obj_path = /obj/item/weapon/spell/insert/mend_wires
ability_icon_state = "tech_mendwounds"
@@ -20,6 +21,7 @@
if(ishuman(host))
var/mob/living/carbon/human/H = host
var/heal_power = host == origin ? 10 : 30
+ heal_power = round(heal_power * spell_power_at_creation, 1)
origin.adjust_instability(10)
for(var/i = 0, i<5,i++)
if(H)
diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm b/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm
index 60e334cb39..38f5b5dc55 100644
--- a/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm
@@ -2,6 +2,7 @@
name = "Mend Wounds"
desc = "Heals minor wounds, such as cuts, bruises, and other non-lifethreatening injuries. \
Instability is split between the target and technomancer, if seperate."
+ spell_power_desc = "Healing amount increased."
cost = 50
obj_path = /obj/item/weapon/spell/insert/mend_wounds
ability_icon_state = "tech_mendwounds"
@@ -21,6 +22,7 @@
if(ishuman(host))
var/mob/living/carbon/human/H = host
var/heal_power = host == origin ? 10 : 30
+ heal_power = round(heal_power * spell_power_at_creation, 1)
origin.adjust_instability(10)
for(var/i = 0, i<5,i++)
if(H)
diff --git a/code/game/gamemodes/technomancer/spells/insert/purify.dm b/code/game/gamemodes/technomancer/spells/insert/purify.dm
index dc0003f802..b1e369f6e8 100644
--- a/code/game/gamemodes/technomancer/spells/insert/purify.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/purify.dm
@@ -1,6 +1,7 @@
/datum/technomancer/spell/purify
name = "Purify"
desc = "Clenses the body of harmful impurities, such as toxins, radiation, viruses, genetic damage, and such."
+ spell_power_desc = "Healing amount increased."
cost = 25
obj_path = /obj/item/weapon/spell/insert/purify
ability_icon_state = "tech_purify"
@@ -24,6 +25,7 @@
// for(var/datum/disease/D in H.viruses)
// D.cure()
var/heal_power = host == origin ? 10 : 30
+ heal_power = round(heal_power * spell_power_at_creation, 1)
origin.adjust_instability(10)
for(var/i = 0, i<5,i++)
if(H)
diff --git a/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm b/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm
index a95afa0a1f..38e4ef4720 100644
--- a/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm
@@ -2,6 +2,7 @@
name = "Repel Missiles"
desc = "Places a repulsion field around you, which attempts to deflect incoming bullets and lasers, making them 30% less likely \
to hit you. The field lasts for five minutes and can be granted to yourself or an ally."
+ spell_power_desc = "Projectiles will be more likely to be deflected."
cost = 25
obj_path = /obj/item/weapon/spell/insert/repel_missiles
ability_icon_state = "tech_repelmissiles"
@@ -16,11 +17,15 @@
light_color = "#FF5C5C"
inserting = /obj/item/weapon/inserted_spell/repel_missiles
+/obj/item/weapon/inserted_spell/repel_missiles
+ var/evasion_increased = 2 // We store this here because spell power may change when the spell expires.
+
/obj/item/weapon/inserted_spell/repel_missiles/on_insert()
spawn(1)
if(isliving(host))
var/mob/living/L = host
- L.evasion += 2
+ evasion_increased = round(2 * spell_power_at_creation, 1)
+ L.evasion += evasion_increased
L << "You have a repulsion field around you, which will attempt to deflect projectiles."
spawn(5 MINUTES)
if(src)
@@ -29,6 +34,6 @@
/obj/item/weapon/inserted_spell/repel_missiles/on_expire()
if(isliving(host))
var/mob/living/L = host
- L.evasion -= 2
+ L.evasion -= evasion_increased
L << "Your repulsion field has expired."
..()
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/instability_tap.dm b/code/game/gamemodes/technomancer/spells/instability_tap.dm
index ea1e9ff2e4..9092039165 100644
--- a/code/game/gamemodes/technomancer/spells/instability_tap.dm
+++ b/code/game/gamemodes/technomancer/spells/instability_tap.dm
@@ -2,6 +2,7 @@
name = "Instability Tap"
desc = "Creates a large sum of energy, at the cost of a very large amount of instability afflicting you."
enhancement_desc = "50% more energy gained, 20% less instability gained."
+ spell_power_desc = "Amount of energy gained scaled up with spell power."
cost = 100
obj_path = /obj/item/weapon/spell/instability_tap
ability_icon_state = "tech_instabilitytap"
@@ -18,10 +19,11 @@
set_light(3, 2, l_color = "#FA58F4")
/obj/item/weapon/spell/instability_tap/on_use_cast(mob/user)
+ var/amount = calculate_spell_power(5000)
if(check_for_scepter())
- core.give_energy(7500)
+ core.give_energy(amount * 1.5)
adjust_instability(40)
else
- core.give_energy(5000)
+ core.give_energy(amount)
adjust_instability(50)
qdel(src)
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/oxygenate.dm b/code/game/gamemodes/technomancer/spells/oxygenate.dm
index 67451c8c39..b121e6f4d4 100644
--- a/code/game/gamemodes/technomancer/spells/oxygenate.dm
+++ b/code/game/gamemodes/technomancer/spells/oxygenate.dm
@@ -16,6 +16,8 @@
cooldown = 30
/obj/item/weapon/spell/oxygenate/on_ranged_cast(atom/hit_atom, mob/user)
+ if(!within_range(hit_atom))
+ return
if(ishuman(hit_atom))
var/mob/living/carbon/human/H = hit_atom
if(pay_energy(1500))
diff --git a/code/game/gamemodes/technomancer/spells/phase_shift.dm b/code/game/gamemodes/technomancer/spells/phase_shift.dm
index 02cbb6e2bf..e0a2bf3957 100644
--- a/code/game/gamemodes/technomancer/spells/phase_shift.dm
+++ b/code/game/gamemodes/technomancer/spells/phase_shift.dm
@@ -15,7 +15,6 @@
/obj/item/weapon/spell/phase_shift/New()
..()
set_light(3, 2, l_color = "#FA58F4")
- processing_objects |= src
/obj/effect/phase_shift
name = "rift"
@@ -29,6 +28,7 @@
/obj/effect/phase_shift/New()
..()
set_light(3, 5, l_color = "#FA58F4")
+ processing_objects |= src
/obj/effect/phase_shift/Destroy()
for(var/atom/movable/AM in contents) //Eject everything out.
diff --git a/code/game/gamemodes/technomancer/spells/projectile/beam.dm b/code/game/gamemodes/technomancer/spells/projectile/beam.dm
index 13d5fe934a..6eb5e03be3 100644
--- a/code/game/gamemodes/technomancer/spells/projectile/beam.dm
+++ b/code/game/gamemodes/technomancer/spells/projectile/beam.dm
@@ -1,6 +1,7 @@
/datum/technomancer/spell/beam
name = "Beam"
desc = "Fires a laser at your target. Cheap, reliable, and a bit boring."
+ spell_power_desc = "Increases damage dealt."
cost = 100
ability_icon_state = "tech_beam"
obj_path = /obj/item/weapon/spell/projectile/beam
diff --git a/code/game/gamemodes/technomancer/spells/projectile/chain_lightning.dm b/code/game/gamemodes/technomancer/spells/projectile/chain_lightning.dm
index 5133d8a647..5b45105038 100644
--- a/code/game/gamemodes/technomancer/spells/projectile/chain_lightning.dm
+++ b/code/game/gamemodes/technomancer/spells/projectile/chain_lightning.dm
@@ -2,7 +2,7 @@
name = "Chain Lightning"
desc = "This dangerous function shoots lightning that will strike someone, then bounce to a nearby person. Be careful that \
it does not bounce to you. The lighting prefers to bounce to people with the least resistance to electricity. It will \
- strike up to four targets, including yourself if conditions allow it to occur."
+ strike up to four targets, including yourself if conditions allow it to occur. Lightning functions cannot miss due to distance."
cost = 150
obj_path = /obj/item/weapon/spell/projectile/chain_lightning
ability_icon_state = "tech_chain_lightning"
diff --git a/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm b/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm
index ab295f58f3..b16e9ea3c4 100644
--- a/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm
+++ b/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm
@@ -2,6 +2,7 @@
name = "Force Missile"
desc = "This fires a missile at your target. It's cheap to use, however the projectile itself moves and impacts in such a way \
that armor designed to protect from blunt force will mitigate this function as well."
+ spell_power_desc = "Increases damage dealt."
cost = 50
obj_path = /obj/item/weapon/spell/projectile/force_missile
category = OFFENSIVE_SPELLS
diff --git a/code/game/gamemodes/technomancer/spells/projectile/lightning.dm b/code/game/gamemodes/technomancer/spells/projectile/lightning.dm
index c4b69a923a..f6db21da25 100644
--- a/code/game/gamemodes/technomancer/spells/projectile/lightning.dm
+++ b/code/game/gamemodes/technomancer/spells/projectile/lightning.dm
@@ -2,7 +2,7 @@
name = "Lightning Strike"
desc = "This uses a hidden electrolaser, which creates a laser beam to ionize the enviroment, allowing for ideal conditions \
for a directed lightning strike to occur. The lightning is very strong, however it requires a few seconds to prepare a \
- strike."
+ strike. Lightning functions cannot miss due to distance."
cost = 150
obj_path = /obj/item/weapon/spell/projectile/lightning
category = OFFENSIVE_SPELLS
diff --git a/code/game/gamemodes/technomancer/spells/projectile/overload.dm b/code/game/gamemodes/technomancer/spells/projectile/overload.dm
index 62a7c03714..94ff7cf4b4 100644
--- a/code/game/gamemodes/technomancer/spells/projectile/overload.dm
+++ b/code/game/gamemodes/technomancer/spells/projectile/overload.dm
@@ -1,7 +1,8 @@
/datum/technomancer/spell/overload
name = "Overload"
desc = "Fires a bolt of highly unstable energy, that does damaged equal to 0.3% of the technomancer's current reserve of energy. \
- This energy pierces all known armor."
+ This energy pierces all known armor. Energy cost is equal to 10% of maximum core charge."
+ enhancement_desc = "Will do damage equal to 0.4% of current energy."
cost = 100
obj_path = /obj/item/weapon/spell/projectile/overload
category = OFFENSIVE_SPELLS
diff --git a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm
index 3c9fe6017c..5ba88cee20 100644
--- a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm
+++ b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm
@@ -12,6 +12,7 @@
/obj/item/weapon/spell/projectile/on_ranged_cast(atom/hit_atom, mob/living/user)
if(set_up(hit_atom, user))
var/obj/item/projectile/new_projectile = new spell_projectile(get_turf(user))
+ new_projectile.damage = calculate_spell_power(new_projectile.damage)
new_projectile.launch(hit_atom)
log_and_message_admins("has casted [src] at \the [hit_atom].")
if(fire_sound)
diff --git a/code/game/gamemodes/technomancer/spells/radiance.dm b/code/game/gamemodes/technomancer/spells/radiance.dm
index d94b064197..4d1fb551ee 100644
--- a/code/game/gamemodes/technomancer/spells/radiance.dm
+++ b/code/game/gamemodes/technomancer/spells/radiance.dm
@@ -1,6 +1,9 @@
/datum/technomancer/spell/radiance
name = "Radiance"
- desc = "Causes you to be very radiant, glowing brightly in visible light, thermal energy, and deadly ionizing radiation."
+ desc = "Causes you to be very radiant, glowing brightly in visible light, thermal energy, and deadly ionizing radiation. Note \
+ that this WILL affect you."
+ enhancement_desc = "Radiation will not affect the caster or their allies."
+ spell_power_desc = "Spell power increases the amount of radiation and heat radiated, as well as the radius."
cost = 100
obj_path = /obj/item/weapon/spell/radiance
category = OFFENSIVE_SPELLS
@@ -10,36 +13,41 @@
desc = "You will glow with a radiance similar to that of Supermatter."
icon_state = "radiance"
aspect = ASPECT_LIGHT
- var/power = 100
+ var/power = 250
toggled = 1
/obj/item/weapon/spell/radiance/New()
..()
set_light(7, 4, l_color = "#D9D900")
processing_objects |= src
+ log_and_message_admins("has casted [src].")
/obj/item/weapon/spell/radiance/Destroy()
processing_objects -= src
+ log_and_message_admins("has stopped maintaining [src].")
..()
/obj/item/weapon/spell/radiance/process()
var/turf/T = get_turf(src)
var/datum/gas_mixture/removed = null
var/datum/gas_mixture/env = null
+ var/adjusted_power = calculate_spell_power(power)
if(!istype(T, /turf/space))
env = T.return_air()
removed = env.remove(0.25 * env.total_moles) //Remove gas from surrounding area
- var/thermal_power = 300 * power
+ var/thermal_power = 300 * adjusted_power
removed.add_thermal_energy(thermal_power)
removed.temperature = between(0, removed.temperature, 10000)
env.merge(removed)
- for(var/mob/living/L in range(T, round(sqrt(power / 2))))
+ for(var/mob/living/L in range(T, round(sqrt(adjusted_power / 2))))
+ if(check_for_scepter() && is_ally(L))
+ continue
var/radius = max(get_dist(L, src), 1)
- var/rads = (power / 10) * ( 1 / (radius**2) )
+ var/rads = (adjusted_power / 10) * ( 1 / (radius**2) )
L.apply_effect(rads, IRRADIATE)
adjust_instability(2)
diff --git a/code/game/gamemodes/technomancer/spells/resurrect.dm b/code/game/gamemodes/technomancer/spells/resurrect.dm
index 8d7eca3393..a652239721 100644
--- a/code/game/gamemodes/technomancer/spells/resurrect.dm
+++ b/code/game/gamemodes/technomancer/spells/resurrect.dm
@@ -25,7 +25,7 @@
user << "\The [L] isn't dead!"
return 0
if(pay_energy(5000))
- if(L.tod > world.time + 10 MINUTES)
+ if(L.tod > world.time + 30 MINUTES)
user << "\The [L]'s been dead for too long, even this function cannot replace cloning at \
this point."
return 0
@@ -57,7 +57,8 @@
H.timeofdeath = null
visible_message("\The [H]'s eyes open!")
user << "It's alive!"
- adjust_instability(100)
+ adjust_instability(50)
+ log_and_message_admins("has resurrected [H].")
else
user << "The body of \the [H] doesn't seem to respond, perhaps you could try again?"
adjust_instability(10)
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/shared_burden.dm b/code/game/gamemodes/technomancer/spells/shared_burden.dm
index 7c3e7447a8..21dfd5fe81 100644
--- a/code/game/gamemodes/technomancer/spells/shared_burden.dm
+++ b/code/game/gamemodes/technomancer/spells/shared_burden.dm
@@ -1,6 +1,7 @@
/datum/technomancer/spell/shared_burden
name = "Shared Burden"
desc = "One of the few functions able to adjust instability, this allows you to take someone else's instability."
+ spell_power_desc = "Draws bonus instability from the target, with the bonus dissipating harmlessly, for 'free'."
cost = 50
obj_path = /obj/item/weapon/spell/shared_burden
category = SUPPORT_SPELLS
@@ -13,16 +14,16 @@
aspect = ASPECT_UNSTABLE
/obj/item/weapon/spell/shared_burden/on_melee_cast(atom/hit_atom, mob/living/user, def_zone)
- if(ishuman(hit_atom))
+ if(ishuman(hit_atom) && within_range(hit_atom))
var/mob/living/carbon/human/H = hit_atom
if(H == user)
user << "Draining instability out of you to put it back seems a bit pointless."
return 0
- if(!H.instability)
+ if(H.instability <= 0)
user << "\The [H] has no instability to drain."
return 0
if(pay_energy(500))
var/instability_to_drain = min(H.instability, 25)
user << "You draw instability away from \the [H] and towards you."
adjust_instability(instability_to_drain)
- H.adjust_instability(-instability_to_drain)
\ No newline at end of file
+ H.adjust_instability(-calculate_spell_power(instability_to_drain))
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/shield.dm b/code/game/gamemodes/technomancer/spells/shield.dm
index ac6910c478..a9514aaa29 100644
--- a/code/game/gamemodes/technomancer/spells/shield.dm
+++ b/code/game/gamemodes/technomancer/spells/shield.dm
@@ -1,7 +1,9 @@
/datum/technomancer/spell/shield
name = "Shield"
desc = "Emits a protective shield fron your hand in front of you, which will protect you from almost anything able to harm \
- you, so long as you can power it."
+ you, so long as you can power it. Stronger attacks blocked cost more energy to sustain. \
+ Note that holding two shields will make blocking more energy efficent."
+ enhancement_desc = "Blocking is twice as efficent in terms of energy cost per hit."
cost = 100
obj_path = /obj/item/weapon/spell/shield
ability_icon_state = "tech_shield"
diff --git a/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm b/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm
index 1890bfd320..ff1a3f7644 100644
--- a/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm
+++ b/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm
@@ -15,7 +15,7 @@
spawner_type = /obj/effect/temporary_effect/fire_blast
/obj/item/weapon/spell/spawner/fire_blast/on_ranged_cast(atom/hit_atom, mob/user)
- if(pay_energy(2000))
+ if(within_range(hit_atom) && pay_energy(2000))
adjust_instability(12)
..() // Makes the booms happen.
diff --git a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm
index 78711b2942..7c11bc000a 100644
--- a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm
+++ b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm
@@ -18,7 +18,7 @@
set_light(3, 2, l_color = "#2ECCFA")
/obj/item/weapon/spell/spawner/pulsar/on_ranged_cast(atom/hit_atom, mob/user)
- if(pay_energy(4000))
+ if(within_range(hit_atom) && pay_energy(4000))
adjust_instability(8)
..()
diff --git a/code/game/gamemodes/technomancer/spells/spawner/spawner.dm b/code/game/gamemodes/technomancer/spells/spawner/spawner.dm
index e748145e42..218c446739 100644
--- a/code/game/gamemodes/technomancer/spells/spawner/spawner.dm
+++ b/code/game/gamemodes/technomancer/spells/spawner/spawner.dm
@@ -27,4 +27,5 @@
if(T)
new spawner_type(T)
user << "You shift \the [src] onto \the [T]."
+ log_and_message_admins("has casted [src] at [T.x],[T.y],[T.z].")
qdel(src)
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/summon/summon.dm b/code/game/gamemodes/technomancer/spells/summon/summon.dm
index 01321c8cb0..e4e3f8bb0c 100644
--- a/code/game/gamemodes/technomancer/spells/summon/summon.dm
+++ b/code/game/gamemodes/technomancer/spells/summon/summon.dm
@@ -13,7 +13,7 @@
/obj/item/weapon/spell/summon/on_ranged_cast(atom/hit_atom, mob/living/user)
var/turf/T = get_turf(hit_atom)
- if(summoned_mob_type && core.summoned_mobs.len < core.max_summons && pay_energy(energy_cost))
+ if(summoned_mob_type && core.summoned_mobs.len < core.max_summons && within_range(hit_atom) && pay_energy(energy_cost))
var/obj/effect/E = new(T)
E.icon = 'icons/obj/objects.dmi'
E.icon_state = "anom"
@@ -29,6 +29,7 @@
on_summon(L)
user << "You've successfully teleported \a [L] to you!"
visible_message("\A [L] appears from no-where!")
+ log_and_message_admins("has summoned \a [L] at [T.x],[T.y],[T.z].")
user.adjust_instability(instability_cost)
/obj/item/weapon/spell/summon/on_use_cast(mob/living/user)
diff --git a/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm b/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm
index 053f449095..ea7d426c4b 100644
--- a/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm
+++ b/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm
@@ -6,6 +6,7 @@
The creatures take a few moments to be teleported to the targeted tile. Note that the creatures summoned are \
not inherently loyal to the technomancer, and that the creatures will be hurt slightly from being teleported to you."
enhancement_desc = "Summoned entities will never harm their summoner."
+ spell_power_desc = "The strength and endurance of the summoned creature will be greater."
cost = 100
obj_path = /obj/item/weapon/spell/summon/summon_creature
category = UTILITY_SPELLS
@@ -37,10 +38,18 @@
instability_cost = 10
energy_cost = 1000
-/obj/item/weapon/spell/summon/summon_creature/on_summon(var/mob/living/summoned)
+/obj/item/weapon/spell/summon/summon_creature/on_summon(var/mob/living/simple_animal/summoned)
if(check_for_scepter())
// summoned.faction = "technomancer"
if(istype(summoned, /mob/living/simple_animal/hostile))
var/mob/living/simple_animal/SA = summoned
SA.friends.Add(owner)
+
+ // Makes their new pal big and strong, if they have spell power.
+ summoned.maxHealth = calculate_spell_power(summoned.maxHealth)
+ summoned.health = calculate_spell_power(summoned.health)
+ summoned.melee_damage_lower = calculate_spell_power(summoned.melee_damage_lower)
+ summoned.melee_damage_upper = calculate_spell_power(summoned.melee_damage_upper)
+
+ // Now we hurt their new pal, because being forcefully abducted by teleportation can't be healthy.
summoned.health = round(summoned.maxHealth * 0.7)
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm b/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm
index f6b6b87dfe..5bb032b9c7 100644
--- a/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm
+++ b/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm
@@ -1,8 +1,9 @@
/datum/technomancer/spell/summon_ward
name = "Summon Ward"
desc = "Teleports a prefabricated 'ward' drone to the target location, which will alert you and your allies when it sees entities \
- moving around it, or when it is attacked. They can see for up to five meters. Wards expire in six minutes."
- enhancement_desc = "Wards can detect invisibile entities, and are more specific in relaying information about what it sees."
+ moving around it, or when it is attacked. They can see for up to five meters."
+ enhancement_desc = "Wards can detect invisibile entities, and are more specific in relaying information about what it sees. \
+ Invisible entities that are spotted by it will be decloaked."
cost = 25
obj_path = /obj/item/weapon/spell/summon/summon_ward
category = UTILITY_SPELLS
diff --git a/code/game/gamemodes/technomancer/spells/warp_strike.dm b/code/game/gamemodes/technomancer/spells/warp_strike.dm
index 539277031f..94074ffcf0 100644
--- a/code/game/gamemodes/technomancer/spells/warp_strike.dm
+++ b/code/game/gamemodes/technomancer/spells/warp_strike.dm
@@ -23,6 +23,8 @@
/obj/item/weapon/spell/warp_strike/on_ranged_cast(atom/hit_atom, mob/user)
var/turf/T = get_turf(hit_atom)
if(T)
+ if(!within_range(T))
+ return
//First, we handle who to teleport to.
user.setClickCooldown(5)
var/mob/living/chosen_target = targeting_assist(T,5) //The person who's about to get attacked.
@@ -74,4 +76,5 @@
I.afterattack(chosen_target, user)
else
chosen_target.attack_hand(user)
+ log_and_message_admins("has warp striked [chosen_target].")
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 2c2e234a3f..41da2fe40a 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ