diff --git a/code/game/gamemodes/technomancer/devices/boots_of_speed.dm b/code/game/gamemodes/technomancer/devices/boots_of_speed.dm
new file mode 100644
index 0000000000..f5acf80f49
--- /dev/null
+++ b/code/game/gamemodes/technomancer/devices/boots_of_speed.dm
@@ -0,0 +1,19 @@
+/datum/technomancer/equipment/boots_of_speed
+ name = "Boots of Speed"
+ desc = "What appears to be an ordinary pair of boots, is actually a bit more useful than that. These will help against slipping \
+ on flat surfaces, and will make you run a bit faster than if you had normal shoes or boots on."
+ cost = 50
+ obj_path = /obj/item/clothing/shoes/speed
+
+/obj/item/clothing/shoes/speed
+ name = "boots of speed"
+ desc = "The latest in sure footing technology."
+ icon_state = "swat"
+ item_flags = NOSLIP
+ siemens_coefficient = 0.6
+ slowdown = -2 // A bit faster than normal shows.
+
+ cold_protection = FEET
+ min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE
+ heat_protection = FEET
+ max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm b/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm
new file mode 100644
index 0000000000..9c18e774ed
--- /dev/null
+++ b/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm
@@ -0,0 +1,67 @@
+/datum/technomancer/equipment/gloves_of_regen
+ name = "Gloves of Regeneration"
+ desc = "It's a pair of black gloves, with a hypodermic needle on the insides, and a small storage of a secret blend of chemicals \
+ designed to be slowly fed into a living person's system, increasing their metabolism greatly, resulting in accelerated healing. \
+ A side effect of this healing is that the wearer will generally get hungry a lot faster. Sliding the gloves on and off also \
+ hurts a lot. As a bonus, the gloves are more resistant to the elements than most. It should be noted that synthetics will have \
+ little use for these."
+ cost = 50
+ obj_path = /obj/item/clothing/gloves/regen
+
+/obj/item/clothing/gloves/regen
+ name = "gloves of regeneration"
+ desc = "A pair of gloves with a small storage of green liquid on the outside. On the inside, a a hypodermic needle can be seen \
+ on each glove."
+ icon_state = "regen"
+ item_state = "graygloves"
+ siemens_coefficient = 0
+ cold_protection = HANDS
+ min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
+ heat_protection = HANDS
+ max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
+ var/mob/living/carbon/human/wearer = null
+
+/obj/item/clothing/gloves/regen/equipped(var/mob/living/carbon/human/H)
+ if(H && H.gloves == src)
+ wearer = H
+ if(wearer.can_feel_pain())
+ H << "You feel a stabbing sensation in your hands as you slide \the [src] on!"
+ wearer.custom_pain("You feel a sharp pain in your hands!",1)
+ ..()
+
+/obj/item/clothing/gloves/regen/dropped(var/mob/living/carbon/human/H)
+ ..()
+ if(wearer)
+ if(wearer.can_feel_pain())
+ wearer << "You feel the hypodermic needles as you slide \the [src] off!"
+ wearer.custom_pain("Your hands hurt like hell!",1)
+ wearer = null
+
+/obj/item/clothing/gloves/regen/New()
+ processing_objects |= src
+ ..()
+
+/obj/item/clothing/gloves/regen/Destroy()
+ wearer = null
+ processing_objects -= src
+ ..()
+
+/obj/item/clothing/gloves/regen/process()
+ if(!wearer || wearer.isSynthetic() || wearer.stat == DEAD || wearer.nutrition >= 10)
+ return // Robots and dead people don't have a metabolism.
+
+ if(wearer.getBruteLoss())
+ wearer.adjustBruteLoss(-0.1)
+ wearer.nutrition = max(wearer.nutrition - 10, 0)
+ if(wearer.getFireLoss())
+ wearer.adjustFireLoss(-0.1)
+ wearer.nutrition = max(wearer.nutrition - 10, 0)
+ if(wearer.getToxLoss())
+ wearer.adjustToxLoss(-0.1)
+ wearer.nutrition = max(wearer.nutrition - 10, 0)
+ if(wearer.getOxyLoss())
+ wearer.adjustOxyLoss(-0.1)
+ wearer.nutrition = max(wearer.nutrition - 10, 0)
+ if(wearer.getCloneLoss())
+ wearer.adjustCloneLoss(-0.1)
+ wearer.nutrition = max(wearer.nutrition - 20, 0)
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/equipment.dm b/code/game/gamemodes/technomancer/equipment.dm
index 3fb04aab23..efec413e30 100644
--- a/code/game/gamemodes/technomancer/equipment.dm
+++ b/code/game/gamemodes/technomancer/equipment.dm
@@ -71,12 +71,54 @@
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat(src)
..()
+/datum/technomancer/equipment/belt_of_holding
+ name = "Belt of Holding"
+ desc = "A belt with a literal pocket which opens to a localized pocket of 'Blue-Space', allowing for more storage. \
+ The nature of the pocket allows for storage of larger objects than what is typical for other belts, and in larger quanities. \
+ It will also help keep your pants on."
+ cost = 100
+ obj_path = /obj/item/weapon/storage/belt/holding
+
+/obj/item/weapon/storage/belt/holding
+ name = "Belt of Holding"
+ desc = "Can hold more than you'd expect."
+ icon_state = "emsbelt"
+ item_state = "emsbelt"
+ max_w_class = 3 // Can hold normal sized items.
+ storage_slots = 14 // Twice the capacity of a typical belt.
+ max_storage_space = 42
+
/datum/technomancer/equipment/thermals
name = "Thermoncle"
desc = "A fancy monocle with a thermal optics lens installed. Allows you to see people across walls."
cost = 150
obj_path = /obj/item/clothing/glasses/thermal/plain/monocle
+/datum/technomancer/equipment/night_vision
+ name = "Night Vision Goggles"
+ desc = "Strategical goggles which will allow the wearer to see in the dark. Perfect for the sneaky type, just get rid of the \
+ lights first."
+ cost = 50
+ obj_path = /obj/item/clothing/glasses/night
+
+/datum/technomancer/equipment/omni_sight
+ name = "Omnisight Scanner"
+ desc = "A very rare scanner worn on the face, which allows the wearer to see nearly anything across walls."
+ cost = 400
+ obj_path = /obj/item/clothing/glasses/omni
+
+/obj/item/clothing/glasses/omni
+ name = "Omnisight Scanner"
+ desc = "A pair of goggles which, while on the surface appear to be build very poorly, reveal to be very advanced in \
+ capabilities. The lens appear to be multiple optical matrices layered together, allowing the wearer to see almost anything \
+ across physical barriers."
+ icon_state = "uzenwa_sissra_1"
+ action_button_name = "Toggle Goggles"
+ origin_tech = list(TECH_MAGNET = 6, TECH_ENGINEERING = 6)
+ toggleable = 1
+ vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS
+ prescription = 1 // So two versions of these aren't needed.
+
/datum/technomancer/equipment/med_hud
name = "Medical HUD"
desc = "A commonly available HUD for medical professionals, which displays how healthy an individual is. \
@@ -84,7 +126,6 @@
cost = 30
obj_path = /obj/item/clothing/glasses/thermal/plain/monocle
-
/datum/technomancer/equipment/scepter
name = "Scepter of Empowerment"
desc = "A gem sometimes found in the depths of asteroids makes up the basis for this device. Energy is channeled into it from \
@@ -112,4 +153,4 @@
var/obj/item/item_to_test = user.get_other_hand(src)
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)
\ No newline at end of file
+ S.on_scepter_ranged_cast(target, user)
diff --git a/code/game/gamemodes/technomancer/spell_objs_helpers.dm b/code/game/gamemodes/technomancer/spell_objs_helpers.dm
index 0c8c54cf5a..9b638e8c12 100644
--- a/code/game/gamemodes/technomancer/spell_objs_helpers.dm
+++ b/code/game/gamemodes/technomancer/spell_objs_helpers.dm
@@ -23,4 +23,20 @@
/obj/item/weapon/spell/proc/allowed_to_teleport()
if(owner && owner.z in config.admin_levels)
return 0
- return 1
\ No newline at end of file
+ return 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
+ var/potential_targets = view(T,radius)
+ for(var/mob/living/L in potential_targets)
+ if(is_ally(L)) // Don't shoot our friends.
+ continue
+ if(L.invisibility > owner.see_invisible) // Don't target ourselves or people we can't see.
+ continue
+ if(!L in viewers(owner)) // So we don't shoot at walls if someone is hiding behind one.
+ continue
+ if(!L.stat) // Don't want to target dead people or SSDs.
+ chosen_target = L
+ break
+ return chosen_target
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/audible_deception.dm b/code/game/gamemodes/technomancer/spells/audible_deception.dm
index 889623c652..38b55c1342 100644
--- a/code/game/gamemodes/technomancer/spells/audible_deception.dm
+++ b/code/game/gamemodes/technomancer/spells/audible_deception.dm
@@ -31,10 +31,20 @@
"Flash" = 'sound/weapons/flash.ogg',
"Bite" = 'sound/weapons/bite.ogg',
"Gun Firing" = 'sound/weapons/gunshot.ogg',
+ "Desert Eagle Firing" = 'sound/weapons/deagle.ogg',
+ "Rifle Firing" = 'sound/weapons/rifleshot.ogg',
+ "Rifle Firing 2" = 'sound/weapons/svd_shot.ogg',
+ "Sniper Firing" = 'sound/weapons/sniper.ogg',
+ "Shotgun Firing" = 'sound/weapons/shotgun.ogg',
+ "Semi-automatic Firing" = 'sound/weapons/semiauto.ogg',
+ "Machinegun Firing" = 'sound/weapons/machinegun.ogg',
+ "Rocket Launcher Firing"= 'sound/weapons/rpg.ogg',
"Taser Firing" = 'sound/weapons/Taser.ogg',
"Laser Gun Firing" = 'sound/weapons/laser.ogg',
+ "E-Luger Firing" = 'sound/weapons/eLuger.ogg',
"Xray Gun Firing" = 'sound/weapons/laser3.ogg',
"Pulse Gun Firing" = 'sound/weapons/pulse.ogg',
+ "Gauss Gun Firing" = 'sound/weapons/gauss_shoot.ogg',
"Emitter Firing" = 'sound/weapons/emitter.ogg',
"Energy Blade On" = 'sound/weapons/saberon.ogg',
"Energy Blade Off" = 'sound/weapons/saberoff.ogg',
diff --git a/code/game/gamemodes/technomancer/spells/projectile/beam.dm b/code/game/gamemodes/technomancer/spells/projectile/beam.dm
index 8a0da4b3b2..bfee4ec3f1 100644
--- a/code/game/gamemodes/technomancer/spells/projectile/beam.dm
+++ b/code/game/gamemodes/technomancer/spells/projectile/beam.dm
@@ -2,6 +2,7 @@
name = "Beam"
desc = "Fires a laser at your target. Cheap, reliable, and a bit boring."
cost = 150
+ ability_icon_state = "tech_beam"
obj_path = /obj/item/weapon/spell/projectile/beam
/obj/item/weapon/spell/projectile/beam
diff --git a/code/game/gamemodes/technomancer/spells/targeting_matrix.dm b/code/game/gamemodes/technomancer/spells/targeting_matrix.dm
new file mode 100644
index 0000000000..a74aab2ff5
--- /dev/null
+++ b/code/game/gamemodes/technomancer/spells/targeting_matrix.dm
@@ -0,0 +1,35 @@
+/datum/technomancer/spell/targeting_matrix
+ name = "Targeting Matrix"
+ desc = "Automatically targets and fires a ranged weapon or function at a non-friendly target near a targeted tile. \
+ Each target assisted attack costs some energy and instability."
+ cost = 150
+ ability_icon_state = "tech_targetingmatrix"
+ obj_path = /obj/item/weapon/spell/targeting_matrix
+
+/obj/item/weapon/spell/targeting_matrix
+ name = "targeting matrix"
+ desc = "Aiming is too much effort for you."
+ icon_state = "targeting_matrix"
+ cast_methods = CAST_RANGED
+ aspect = ASPECT_FORCE //idk?
+
+/obj/item/weapon/spell/targeting_matrix/on_ranged_cast(atom/hit_atom, mob/user)
+ var/turf/T = get_turf(hit_atom)
+ if(T)
+ var/mob/living/chosen_target = targeting_assist(T,5) //The person who's about to get attacked.
+
+ if(!chosen_target)
+ return 0
+
+ var/obj/item/I = user.get_inactive_hand()
+ if(I && pay_energy(200))
+ var/prox = user.Adjacent(chosen_target)
+ if(prox) // Needed or else they can attack with melee from afar.
+ I.attack(chosen_target,owner)
+ I.afterattack(chosen_target,owner, prox)
+ adjust_instability(2)
+
+ var/image/target_image = image(icon = 'icons/obj/spells.dmi', loc = get_turf(chosen_target), icon_state = "target")
+ user << target_image
+ sleep(5)
+ qdel(target_image)
diff --git a/code/game/gamemodes/technomancer/spells/track.dm b/code/game/gamemodes/technomancer/spells/track.dm
new file mode 100644
index 0000000000..a6249c5eed
--- /dev/null
+++ b/code/game/gamemodes/technomancer/spells/track.dm
@@ -0,0 +1,74 @@
+/datum/technomancer/spell/track
+ name = "Track"
+ desc = "Acts as directional guidance towards an object that belongs to you or your team. It can also point towards your allies. \
+ Wonderful if you're worried someone will steal your valuables, like a certain shiny Scepter..."
+ enhancement_desc = "You will be able to track most other entities in addition to your belongings and allies."
+ cost = 30
+ obj_path = /obj/item/weapon/spell/track
+ ability_icon_state = "tech_track"
+
+// This stores a ref to all important items that belong to a Technomancer, in case of theft. Used by the spell below.
+// I feel dirty for adding yet another global list used by one thing, but the only alternative is to loop through world, and yeahhh.
+var/list/technomancer_belongings = list()
+
+/obj/item/weapon/spell/track
+ name = "track"
+ icon_state = "track"
+ desc = "Never lose your stuff again!"
+ cast_methods = CAST_USE
+ aspect = ASPECT_TELE
+ var/atom/movable/tracked = null // The thing to point towards.
+ var/tracking = 0 // If one, points towards tracked.
+
+/obj/item/weapon/spell/track/Destroy()
+ tracked = null
+ tracking = 0
+
+/obj/item/weapon/spell/track/on_use_cast(mob/user)
+ if(tracking)
+ tracking = 0
+ user << "You stop tracking for \the [tracked]'s whereabouts."
+ tracked = null
+ return
+
+ var/can_track_non_allies = 0
+ var/list/object_choices = technomancer_belongings.Copy()
+ if(check_for_scepter())
+ can_track_non_allies = 1
+ var/list/mob_choices = list()
+ for(var/mob/living/L in mob_list)
+ if(!is_ally(L) && !can_track_non_allies)
+ continue
+ mob_choices += L
+ var/choice = input(user,"Decide what or who to track.","Tracking") as null|anything in object_choices + mob_choices
+ if(choice)
+ tracked = choice
+ tracking = 1
+ track()
+
+/obj/item/weapon/spell/track/proc/track()
+ if(!tracking)
+ icon_state = "track"
+ return
+
+ if(!tracked)
+ icon_state = "track_unknown"
+
+ if(tracked.z != owner.z)
+ icon_state = "track_unknown"
+
+ else
+ set_dir(get_dir(src,tracked))
+
+ switch(get_dist(src,tracked))
+ if(0)
+ icon_state = "track_direct"
+ if(1 to 8)
+ icon_state = "track_close"
+ if(9 to 16)
+ icon_state = "track_medium"
+ if(16 to INFINITY)
+ icon_state = "track_far"
+
+ spawn(5)
+ .()
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/warp_strike.dm b/code/game/gamemodes/technomancer/spells/warp_strike.dm
index 34fc6ffc9d..ffb9749899 100644
--- a/code/game/gamemodes/technomancer/spells/warp_strike.dm
+++ b/code/game/gamemodes/technomancer/spells/warp_strike.dm
@@ -3,11 +3,12 @@
desc = "Teleports you next to your target, and attacks them with whatever is in your off-hand, spell or object."
cost = 200
obj_path = /obj/item/weapon/spell/warp_strike
+ ability_icon_state = "tech_warpstrike"
/obj/item/weapon/spell/warp_strike
name = "warp strike"
desc = "The answer to the problem of bringing a knife to a gun fight."
- icon_state = "tech_warpstrike"
+ icon_state = "warp_strike"
cast_methods = CAST_RANGED
aspect = ASPECT_TELE
var/datum/effect/effect/system/spark_spread/sparks
@@ -23,16 +24,7 @@
if(T)
//First, we handle who to teleport to.
user.setClickCooldown(5)
- var/list/potential_targets = view(T, 2) //Everyone in a 5x5 range of the tile we clicked on.
- var/mob/living/chosen_target = null //The person who's about to get attacked.
-
- //Find us someone to robust.
- for(var/mob/living/L in potential_targets)
- if(L == user || L.invisibility > user.see_invisible) //Don't target ourselves or people we can't see.
- continue
- if(!L.stat) //Don't want to target dead people or SSDs.
- chosen_target = L
- break
+ var/mob/living/chosen_target = targeting_assist(T,5) //The person who's about to get attacked.
if(!chosen_target)
return 0
@@ -60,7 +52,12 @@
//Finally, we handle striking the victim with whatever's in the user's offhand.
var/obj/item/I = user.get_inactive_hand()
- var/list/blacklisted_items = list(/obj/item/weapon/gun) //We don't want these items to be used, likely because it would break balance.
+ // List of items we don't want used, for balance reasons or to avoid infinite loops.
+ var/list/blacklisted_items = list(
+ /obj/item/weapon/gun,
+ /obj/item/weapon/spell/warp_strike,
+ /obj/item/weapon/spell/targeting_matrix
+ )
if(I)
if(is_path_in_list(I.type, blacklisted_items))
diff --git a/icons/mob/screen_spells.dmi b/icons/mob/screen_spells.dmi
index a6b56343de..4859c8b757 100644
Binary files a/icons/mob/screen_spells.dmi and b/icons/mob/screen_spells.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index fe78cc348d..a5a4767b91 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/spells.dmi b/icons/obj/spells.dmi
index d6b53c1c5c..41d3262949 100644
Binary files a/icons/obj/spells.dmi and b/icons/obj/spells.dmi differ
diff --git a/polaris.dme b/polaris.dme
index 710c122ac8..44c9ea385c 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -416,7 +416,9 @@
#include "code\game\gamemodes\technomancer\technomancer.dm"
#include "code\game\gamemodes\technomancer\assistance\assistance.dm"
#include "code\game\gamemodes\technomancer\assistance\golem.dm"
+#include "code\game\gamemodes\technomancer\devices\boots_of_speed.dm"
#include "code\game\gamemodes\technomancer\devices\disposable_teleporter.dm"
+#include "code\game\gamemodes\technomancer\devices\gloves_of_regen.dm"
#include "code\game\gamemodes\technomancer\devices\hypos.dm"
#include "code\game\gamemodes\technomancer\devices\shield_armor.dm"
#include "code\game\gamemodes\technomancer\devices\tesla_armor.dm"
@@ -441,6 +443,8 @@
#include "code\game\gamemodes\technomancer\spells\resurrect.dm"
#include "code\game\gamemodes\technomancer\spells\shared_burden.dm"
#include "code\game\gamemodes\technomancer\spells\shield.dm"
+#include "code\game\gamemodes\technomancer\spells\targeting_matrix.dm"
+#include "code\game\gamemodes\technomancer\spells\track.dm"
#include "code\game\gamemodes\technomancer\spells\warp_strike.dm"
#include "code\game\gamemodes\technomancer\spells\aura\aura.dm"
#include "code\game\gamemodes\technomancer\spells\aura\biomed_aura.dm"