Another Big Technomancer PR

See PR for details.
This commit is contained in:
Neerti
2016-10-22 11:25:47 -04:00
parent 67330d1df6
commit 8bf97faaef
53 changed files with 433 additions and 102 deletions

View File

@@ -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."

View File

@@ -81,3 +81,25 @@ var/datum/antagonist/technomancer/technomancers
feedback_set_details("round_end_result","loss - technomancer killed")
world << "<span class='danger'><font size = 3>The [(current_antagonists.len>1)?"[role_text_plural] have":"[role_text] has"] been \
killed!</font></span>"
/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)].<br>"
/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 += "<br>Bought [english_list(core.spells)], and used \a [core]."
else
text += "<br>They've lost their core."
return text

View File

@@ -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 += "<align='center'><b>Functions</b> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=1'>Equipment</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=2'>Consumables</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a></align><br>"
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Info</a></align><br>"
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
dat += "<a href='byond://?src=\ref[src];refund_functions=1'>Refund Functions</a><br><br>"
@@ -129,8 +132,10 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
continue
dat += "<b>[spell.name]</b><br>"
dat += "<i>[spell.desc]</i><br>"
if(show_scepter_text)
dat += "<span class='info'><i>[spell.enhancement_desc]</i></span>"
if(spell.spell_power_desc)
dat += "<font color='purple'>Spell Power: [spell.spell_power_desc]</font><br>"
if(spell.enhancement_desc)
dat += "<font color='blue'>Scepter Effect: [spell.enhancement_desc]</font><br>"
if(spell.cost <= budget)
dat += "<a href='byond://?src=\ref[src];spell_choice=[spell.name]'>Purchase</a> ([spell.cost])<br><br>"
else
@@ -143,7 +148,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "<align='center'><a href='byond://?src=\ref[src];tab_choice=0'>Functions</a> | "
dat += "<b>Equipment</b> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=2'>Consumables</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a></align><br>"
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Info</a></align><br>"
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
for(var/datum/technomancer/equipment/E in equipment_instances)
dat += "<b>[E.name]</b><br>"
@@ -160,7 +166,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "<align='center'><a href='byond://?src=\ref[src];tab_choice=0'>Functions</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=1'>Equipment</a> | "
dat += "<b>Consumables</b> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a></align><br>"
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Info</a></align><br>"
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
for(var/datum/technomancer/consumable/C in consumable_instances)
dat += "<b>[C.name]</b><br>"
@@ -177,7 +184,8 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "<align='center'><a href='byond://?src=\ref[src];tab_choice=0'>Functions</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=1'>Equipment</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=2'>Consumables</a> | "
dat += "<b>Assistance</b></align><br>"
dat += "<b>Assistance</b> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Info</a></align><br>"
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
for(var/datum/technomancer/assistance/A in assistance_instances)
dat += "<b>[A.name]</b><br>"
@@ -188,6 +196,72 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "<font color='red'><b>Cannot afford!</b></font><br><br>"
user << browse(dat, "window=radio")
onclose(user, "radio")
if(4) //Info
var/dat = ""
user.set_machine(src)
dat += "<align='center'><a href='byond://?src=\ref[src];tab_choice=0'>Functions</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=1'>Equipment</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=2'>Consumables</a> | "
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
dat += "<b>Info</b></align><br>"
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
dat += "<br>"
dat += "<h1>Manipulation Core Owner's Manual</h1><br>"
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 <b>Manipulation Core</b>, or just a 'Core'. It allows you to do amazing \
things with almost no effort, depending on what <b>functions</b> you've purchased for it. Don't lose your core!<br>"
dat += "<br>"
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 <b>energy</b>, 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.<br>"
dat += "<br>"
dat += "The second thing you need to know is that awesome power over the physical world has consquences, in the form \
of <b>Instability</b>. 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.<br>"
dat += "<br>"
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 <b>Glow</b>, 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.<br>"
dat += "<br>"
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.<br>"
dat += "<br>"
dat += "<b>You can refund functions, equipment items, and assistance items, so long as you are in your base.</b> \
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.<br>"
dat += "<br>"
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.<br>"
dat += "<br>"
dat += "There are a few terms you may not understand in the catelog, so this will try to explain them.<br>"
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.<br>"
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 \
<font color='blue'><i>'Scepter Effect:'</i></font>. Note that you must hold the scepter for it to work, so try to avoid losing it.<br>"
dat += "Functions can also be boosted with the core itself. A function that is able to benefit \
from this will have <font color='purple'><i>'Spell Power:'</i></font> underneath. Different Cores have different \
amounts of spell power.<br>"
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.<br>"
dat += "A meter is equal to one 'tile'.<br>"
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, "<span class='danger'>You can only refund at your base, it's too late now!</span>")
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, "<span class='warning'>\The [src] will not allow you to overflow your maximum budget by refunding that.</span>")
return
else
budget = budget + E.cost
to_chat(user, "<span class='notice'>You've refunded \the [AM].</span>")
// 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, "<span class='notice'>[spell.name] was inside \the [core], and was refunded.</span>")
core.remove_spell(spell)
break
qdel(AM)
return
to_chat(user, "<span class='warn'>\The [src] is unable to refund \the [AM].</span>")

View File

@@ -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 << "<span class='notice'>\The [src] has recovered [amount/2 >= 1000 ? "a lot of" : "some"] energy.</span>"
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"

View File

@@ -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.<br>\
Capacity: 10k<br>\
Recharge: 50/s<br>\
Instability Modifier: 80%<br>\
Energy Cost Modifier: 100%<br>\
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.<br>\
<font color='red'>Capacity: 7k</font><br>\
<font color='green'><b>Recharge: 70/s</b></font><br>\
<font color='red'>Instability Modifier: 90%</font><br>\
Energy Cost Modifier: 100%<br>\
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.<br>\
<font color='green'><b>Capacity: 20k</b></font><br>\
<font color='red'>Recharge: 25/s</font><br>\
<font color='red'>Instability Modifier: 100%</font><br>\
Energy Cost Modifier: 100%<br>\
<font color='green'>Spell Power: 140%</font>"
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.<br>\
<font color='green'>Capacity: 13k</font><br>\
<font color='green'>Recharge: 35/s to 110/s+</font><br>\
<font color='red'><b>Instability Modifier: 130%</b></font><br>\
<font color='green'>Energy Cost Modifier: 70%</font><br>\
<font color='green'>Spell Power: 110%</font>"
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.<br>\
<font color='green'>Capacity: 12k</font><br>\
<font color='red'>Recharge: 40/s</font><br>\
<font color='green'>Instability Modifier: 60%</font><br>\
<font color='green'>Energy Cost Modifier: 80%</font><br>\
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.<br>\
<font color='red'>Capacity: 8k</font><br>\
<font color='red'>Recharge: 35/s</font><br>\
<font color='red'>Instability Modifier: 120%</font><br>\
Energy Cost Modifier: 100%<br>\
<font color='green'>Spell Power: 120%</font>"
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.<br>\
<font color='red'>Capacity: 7k</font><br>\
<font color='red'>Recharge: 30/s</font><br>\
<font color='green'><b>Instability Modifier: 30%</b></font><br>\
Energy Cost Modifier: 100%<br>\
<font color='red'><b>Spell Power: 70%</b></font>"
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.<br>\
<font color='red'>Capacity: 15k (effectively 7.5k)</font><br>\
<font color='red'>Recharge: 40/s</font><br>\
<font color='red'>Instability Modifier: 110%</font><br>\
<font color='red'><b>Energy Cost Modifier: 200%</b></font><br>\
<font color='green'><b>Spell Power: 175%</b></font>"
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

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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 << "<span class='warning'>\The [hit_atom] is firmly secured and anchored, you can't move it!</span>"
return
if(!within_range(hit_atom) && !check_for_scepter())
user << "<span class='warning'>\The [hit_atom] is too far away.</span>"
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("<span class='notice'>\A [I] appears in \the [user]'s hand!</span>")
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))

View File

@@ -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"

View File

@@ -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()

View File

@@ -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)

View File

@@ -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

View File

@@ -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))

View File

@@ -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))

View File

@@ -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 <b>fourteen meters</b> 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

View File

@@ -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 << "<span class='warning'>\The [AM] is too far away to blink.</span>"
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("<span class='danger'>\The [user] reaches out towards \the [AM] with a glowing hand.</span>")
if(check_for_scepter())
safe_blink(user, 10)
safe_blink(AM, 10)
else
safe_blink(AM, 6)
log_and_message_admins("has blinked [AM] away.")

View File

@@ -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)

View File

@@ -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 << "<span class='notice'>You command your [controlled_mobs.len > 1 ? "entities" : "[controlled_mobs[1]]"] to \
attack \the [L].</span>"
//This is to stop someone from controlling beepsky and getting him to stun someone 5 times a second.

View File

@@ -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)

View File

@@ -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

View File

@@ -46,6 +46,7 @@
visible_message("<span class='danger'>\The [user] reaches out towards \the [L] with the flaming hand, and they ignite!</span>")
L << "<span class='danger'>You ignite!</span>"
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.

View File

@@ -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("<span class='warning'>You start to glow very brightly!</span>")
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 << "<span class='notice'>Your glow has ended.</span>"
..()

View File

@@ -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 << "<span class='notice'>You suddenly find it much easier to move.</span>"
L.adjust_instability(10)
spawn(5 SECONDS)
spawn(round(5 SECONDS * spell_power_at_creation, 1))
if(src)
on_expire()

View File

@@ -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 << "<span class='warning'>\The [L] is already affected by \the [src].</span>"
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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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++)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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 << "<span class='notice'>You have a repulsion field around you, which will attempt to deflect projectiles.</span>"
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 << "<span class='warning'>Your repulsion field has expired.</span>"
..()

View File

@@ -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)

View File

@@ -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))

View File

@@ -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.

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -25,7 +25,7 @@
user << "<span class='warning'>\The [L] isn't dead!</span>"
return 0
if(pay_energy(5000))
if(L.tod > world.time + 10 MINUTES)
if(L.tod > world.time + 30 MINUTES)
user << "<span class='danger'>\The [L]'s been dead for too long, even this function cannot replace cloning at \
this point.</span>"
return 0
@@ -57,7 +57,8 @@
H.timeofdeath = null
visible_message("<span class='danger'>\The [H]'s eyes open!</span>")
user << "<span class='notice'>It's alive!</span>"
adjust_instability(100)
adjust_instability(50)
log_and_message_admins("has resurrected [H].")
else
user << "<span class='warning'>The body of \the [H] doesn't seem to respond, perhaps you could try again?</span>"
adjust_instability(10)

View File

@@ -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 << "<span class='warning'>Draining instability out of you to put it back seems a bit pointless.</span>"
return 0
if(!H.instability)
if(H.instability <= 0)
user << "<span class='warning'>\The [H] has no instability to drain.</span>"
return 0
if(pay_energy(500))
var/instability_to_drain = min(H.instability, 25)
user << "<span class='notice'>You draw instability away from \the [H] and towards you.</span>"
adjust_instability(instability_to_drain)
H.adjust_instability(-instability_to_drain)
H.adjust_instability(-calculate_spell_power(instability_to_drain))

View File

@@ -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"

View File

@@ -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.

View File

@@ -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)
..()

View File

@@ -27,4 +27,5 @@
if(T)
new spawner_type(T)
user << "<span class='notice'>You shift \the [src] onto \the [T].</span>"
log_and_message_admins("has casted [src] at [T.x],[T.y],[T.z].")
qdel(src)

View File

@@ -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 << "<span class='notice'>You've successfully teleported \a [L] to you!</span>"
visible_message("<span class='warning'>\A [L] appears from no-where!</span>")
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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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].")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB