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