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"