diff --git a/aurorastation.dme b/aurorastation.dme
index 6be60ad2b00..9ba15fa5a3b 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -299,6 +299,7 @@
#include "code\datums\uplink\highly visible and dangerous weapons.dm"
#include "code\datums\uplink\implants.dm"
#include "code\datums\uplink\medical.dm"
+#include "code\datums\uplink\ninja_modules.dm"
#include "code\datums\uplink\specialty.dm"
#include "code\datums\uplink\stealth and camouflage items.dm"
#include "code\datums\uplink\stealthy and inconspicuous weapons.dm"
diff --git a/code/datums/uplink/ninja_modules.dm b/code/datums/uplink/ninja_modules.dm
new file mode 100644
index 00000000000..7440408a49d
--- /dev/null
+++ b/code/datums/uplink/ninja_modules.dm
@@ -0,0 +1,71 @@
+/***************
+* Special Ninja Modules *
+***************/
+/datum/uplink_item/item/ninja_modules
+ category = /datum/uplink_category/ninja_modules
+
+/datum/uplink_item/item/ninja_modules/energency_generator
+ name = "Emergency Power Generator"
+ desc = "An emergency use power generator that gives 1000 power to the suits battery. Has a long cooldown."
+ item_cost = 4
+ path = /obj/item/rig_module/emergency_powergenerator
+
+/datum/uplink_item/item/ninja_modules/energy_net
+ name = "Energy Net"
+ desc = "An unlimited use net, if the user has enough power, that can be thrown at others causing them to be trapped. The net can be broken with brute force.."
+ item_cost = 4
+ path = /obj/item/rig_module/fabricator/energy_net
+
+/datum/uplink_item/item/ninja_modules/stealth_field
+ name = "Stealth Field"
+ desc = "A module that allows the user to go invisible. Consumes power when active."
+ item_cost = 6
+ path = /obj/item/rig_module/stealth_field
+
+/datum/uplink_item/item/ninja_modules/normal_grenade_lancher
+ name = "Standard Grenade Launcher"
+ desc = "A shoulder mounted grenade launcher with 3 EMP, Smoke, and flashbang grenades.It can be refilled with more grenades."
+ item_cost = 6
+ path = /obj/item/rig_module/grenade_launcher
+
+/datum/uplink_item/item/ninja_modules/enery_blade
+ name = "Energy Blade and dart launcher."
+ desc = "A module that can produce a powerful energy blade in the users hand. It can also shoot stun-darts."
+ item_cost = 8
+ path = /obj/item/rig_module/mounted/energy_blade
+
+/datum/uplink_item/item/ninja_modules/matter_fab
+ name = "Matter Fabricator"
+ desc = "A hardsuit matter fabricator that can produce sharp ninja stars used for throwing."
+ item_cost = 5
+ path = /obj/item/rig_module/fabricator
+
+/datum/uplink_item/item/ninja_modules/sink
+ name = "Power Sink"
+ desc = "A module that sucks power out of powered items and into the users suit."
+ item_cost = 4
+ path = /obj/item/rig_module/power_sink
+
+/datum/uplink_item/item/ninja_modules/emag_hand
+ name = "EMAG Hand Module"
+ desc = "A module that allows the user to apply an EMAG effect to the targeted item."
+ item_cost = 5
+ path = /obj/item/rig_module/emag_hand
+
+/datum/uplink_item/item/ninja_modules/chem_injector
+ name = "Chemical Injector"
+ desc = "A chemical injector that allows the user to inject themsleves with medical chemicals."
+ item_cost = 3
+ path = /obj/item/rig_module/chem_dispenser
+
+/datum/uplink_item/item/ninja_modules/EMP_Shield
+ name = "Active EMP Shielding"
+ desc = "A very complicated module for a hardsuit that protects it to some degree from EMPs."
+ item_cost = 4
+ path = /obj/item/rig_module/emp_shielding
+
+/datum/uplink_item/item/ninja_modules/combat_injector
+ name = "Combat Injector"
+ desc = "A chemical injector that allows the user to inject themsleves with combat chemicals."
+ item_cost = 4
+ path = /obj/item/rig_module/chem_dispenser/combat
\ No newline at end of file
diff --git a/code/datums/uplink/uplink_categories.dm b/code/datums/uplink/uplink_categories.dm
index 5d9dceda8ee..bdbc9d5f1d4 100644
--- a/code/datums/uplink/uplink_categories.dm
+++ b/code/datums/uplink/uplink_categories.dm
@@ -1,15 +1,25 @@
/datum/uplink_category
var/name = ""
var/list/datum/uplink_item/items
+ var/list/datum/antagonist/antag_roles
/datum/uplink_category/New()
..()
items = list()
/datum/uplink_category/proc/can_view(obj/item/device/uplink/U)
+ for(var/antag_role in antag_roles)
+ var/datum/antagonist/antag = all_antag_types[antag_role]
+ if(antag.is_antagonist(U.uplink_owner))
+ return 1
+
for(var/datum/uplink_item/item in items)
if(item.can_view(U))
return 1
+
+ if(!antag_roles.len)
+ return 1
+
return 0
/datum/uplink_category/ammunition
@@ -51,4 +61,7 @@
/datum/uplink_category/specialty //snowflake antag items - a brave new frontier!
name = "Specialised Items"
+/datum/uplink_category/ninja_modules
+ name = "Infiltration Items"
+ antag_roles = list(MODE_NINJA)
diff --git a/code/game/antagonist/outsider/ninja.dm b/code/game/antagonist/outsider/ninja.dm
index 9a2a8d31bbf..dc53177efed 100644
--- a/code/game/antagonist/outsider/ninja.dm
+++ b/code/game/antagonist/outsider/ninja.dm
@@ -6,7 +6,7 @@ var/datum/antagonist/ninja/ninjas
role_text_plural = "Ninja"
bantype = "ninja"
landmark_id = "ninjastart"
- welcome_text = "You are an elite mercenary assassin of the Spider Clan. You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor."
+ welcome_text = "You are an elite stealth agent. You can equip your suit with the latest technology using your uplink."
restricted_species = list("Diona")
flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_RANDSPAWN | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE
antaghud_indicator = "hudninja"
@@ -107,7 +107,7 @@ var/datum/antagonist/ninja/ninjas
player.equip_to_slot_or_del(R, slot_l_ear)
player.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(player), slot_w_uniform)
player.equip_to_slot_or_del(new /obj/item/device/flashlight(player), slot_belt)
- player.equip_to_slot_or_del(new /obj/item/device/contract_uplink(player), slot_l_store)
+ player.equip_to_slot_or_del(new /obj/item/device/ninja_uplink(player, player.mind), slot_l_store)
create_id("Infiltrator", player)
var/obj/item/weapon/rig/light/ninja/ninjasuit = new(get_turf(player))
diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm
index d26ffbb3bd3..25aa3887ef2 100644
--- a/code/game/objects/items/devices/uplink.dm
+++ b/code/game/objects/items/devices/uplink.dm
@@ -384,5 +384,24 @@ A list of items and costs is stored under the datum of every game mode, alongsid
if(!message)
return
- command_announcement.Announce("[message]", title, new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1, do_newscast=1, do_print=1);
- qdel(src)
\ No newline at end of file
+ command_announcement.Announce("[message]", title, new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1);
+ qdel(src)
+
+//ninja
+/obj/item/device/ninja_uplink
+ name = "infiltrator uplink"
+ desc = "A small device used for access to a restricted cache of specialized items."
+ icon = 'icons/obj/radio.dmi'
+ icon_state = "radio"
+ flags = CONDUCT
+ w_class = 2
+
+/obj/item/device/ninja_uplink/New()
+ ..()
+ hidden_uplink = new(src)
+ hidden_uplink.uses = DEFAULT_TELECRYSTAL_AMOUNT
+ hidden_uplink.nanoui_menu = 1
+
+/obj/item/device/ninja_uplink/attack_self(mob/user as mob)
+ if (hidden_uplink)
+ hidden_uplink.trigger(user)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/material/thrown.dm b/code/game/objects/items/weapons/material/thrown.dm
index 0e632de06bf..64f1c9831cb 100644
--- a/code/game/objects/items/weapons/material/thrown.dm
+++ b/code/game/objects/items/weapons/material/thrown.dm
@@ -18,7 +18,13 @@
..()
if(material.radioactivity>0 && istype(hit_atom,/mob/living))
var/mob/living/M = hit_atom
- M.adjustToxLoss(rand(20,40))
+ M.adjustToxLoss(rand(25,50))
/obj/item/weapon/material/star/ninja
- default_material = "uranium"
\ No newline at end of file
+ default_material = "uranium"
+
+/obj/item/weapon/material/star/ninja/throw_impact(atom/hit_atom)
+ ..()
+ if(prob(30) && istype(hit_atom,/mob/living))
+ var/mob/living/M = hit_atom
+ M.Weaken(7)
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm
index 45ace050ef3..124b546449c 100644
--- a/code/modules/clothing/spacesuits/rig/modules/computer.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm
@@ -481,31 +481,3 @@
drain_loc = null
interfaced_with = null
total_power_drained = 0
-
-/*
-//Maybe make this use power when active or something
-/obj/item/rig_module/emp_shielding
- name = "\improper EMP dissipation module"
- desc = "A bewilderingly complex bundle of fiber optics and chips."
- toggleable = 1
- usable = 0
-
- activate_string = "Enable active EMP shielding"
- deactivate_string = "Disable active EMP shielding"
-
- interface_name = "active EMP shielding system"
- interface_desc = "A highly experimental system that augments the hardsuit's existing EM shielding."
- var/protection_amount = 20
-
-/obj/item/rig_module/emp_shielding/activate()
- if(!..())
- return
-
- holder.emp_protection += protection_amount
-
-/obj/item/rig_module/emp_shielding/deactivate()
- if(!..())
- return
-
- holder.emp_protection = max(0,(holder.emp_protection - protection_amount))
-*/
diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm
index 72225e05366..df856d5968a 100644
--- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm
@@ -4,6 +4,9 @@
* /obj/item/rig_module/teleporter
* /obj/item/rig_module/fabricator/energy_net
* /obj/item/rig_module/self_destruct
+ * /obj/item/rig_module/emp_shielding
+ * /obj/item/rig_module/emergency_powergenerator
+ * /obj/item/rig_module/emag_hand
*/
/obj/item/rig_module/stealth_field
@@ -152,7 +155,7 @@
engage_string = "Fabricate Net"
fabrication_type = /obj/item/weapon/energy_net
- use_power_cost = 70
+ use_power_cost = 60
/obj/item/rig_module/fabricator/energy_net/engage(atom/target)
@@ -175,10 +178,10 @@
interface_name = "dead man's switch"
interface_desc = "An integrated self-destruct module. When the wearer dies, so does the surrounding area. Do not press this button."
- var/list/explosion_values = list(1,2,4,5)
+ var/list/explosion_values = list(3,4,5,6)
/obj/item/rig_module/self_destruct/small
- explosion_values = list(0,0,3,4)
+ explosion_values = list(1,2,3,4)
/obj/item/rig_module/self_destruct/activate()
return
@@ -205,3 +208,111 @@
holder.wearer.drop_from_inventory(src)
qdel(holder)
qdel(src)
+
+/obj/item/rig_module/emp_shielding
+ name = "EMP dissipation module"
+ desc = "A bewilderingly complex bundle of fiber optics and chips. Seems like it uses a good deal of power."
+ active_power_cost = 10
+ toggleable = 1
+ usable = 0
+ use_power_cost = 70
+ module_cooldown = 30
+
+ activate_string = "Enable Active EMP Shielding"
+ deactivate_string = "Disable Active EMP Shielding"
+
+ interface_name = "active EMP shielding system"
+ interface_desc = "A highly experimental system that augments the hardsuit's existing EM shielding."
+ var/protection_amount = 30
+
+/obj/item/rig_module/emp_shielding/activate()
+ if(!..())
+ return
+
+ holder.emp_protection += protection_amount
+
+/obj/item/rig_module/emp_shielding/deactivate()
+ if(!..())
+ return
+
+ holder.emp_protection = max(0,(holder.emp_protection - protection_amount))
+
+/obj/item/rig_module/emergency_powergenerator
+ name = "emergency power generator"
+ desc = "A high yield power generating device that takes a long time to recharge."
+ active_power_cost = 0
+ toggleable = 0
+ usable = 1
+ confined_use = 1
+ var/cooldown = 0
+
+ engage_string = "Use Emergency Power"
+
+ interface_name = "emergency power generator"
+ interface_desc = "A high yield power generating device that takes a long time to recharge."
+ var/generation_ammount = 1500
+
+/obj/item/rig_module/emergency_powergenerator/engage()
+ if(!..())
+ return
+ var/mob/living/carbon/human/H = holder.wearer
+ if(cooldown)
+ H << "There isn't enough power stored up yet!"
+ return 0
+ else
+ H << "Your suit emits a loud sound as power is rapidly injected into your suits battery!"
+ playsound(H.loc, 'sound/effects/sparks2.ogg', 50, 1)
+ holder.cell.give(generation_ammount)
+ cooldown = 1
+ addtimer(CALLBACK(src, /obj/item/rig_module/emergency_powergenerator/proc/reset_cooldown), 240)
+
+/obj/item/rig_module/emergency_powergenerator/proc/reset_cooldown()
+ cooldown = 0
+
+/obj/item/rig_module/emag_hand
+ name = "EMAG integrated hand"
+ desc = "A complex uprade that allows the user to touch things with their hand and apply an EMAG effect. High power cost."
+ use_power_cost = 100
+ usable = 0
+ toggleable = 1
+ activates_on_touch = 1
+ disruptive = 0
+
+ activate_string = "Enable EMAG"
+ deactivate_string = "Disable EMAG"
+
+ interface_name = "enable EMAG"
+ interface_desc = "A complex uprade that allows the user to touch things with their hand and apply an EMAG effect. High power cost."
+ var/atom/interfaced_with
+ module_cooldown = 4800
+
+/obj/item/rig_module/emag_hand/activate()
+ if(!..())
+ return
+
+/obj/item/rig_module/emag_hand/deactivate()
+ if(!..())
+ return
+
+/obj/item/rig_module/emag_hand/engage(atom/target)
+
+ if(!..())
+ return 0
+
+ if(interfaced_with)
+ return 0
+
+ if(!target)
+ return 1
+
+ if(!target.Adjacent(holder.wearer))
+ return 0
+
+ holder.wearer << "You stick your hand on [target] shorting out some of its circuits!"
+ interfaced_with = target
+ target.emag_act(user, src)
+ addtimer(CALLBACK(src, /obj/item/rig_module/emag_hand/proc/reset_interface, 2))
+ return 1
+
+/obj/item/rig_module/emag_hand/proc/reset_interface()
+ interfaced_with = null
diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm
index 88e8ef2ebb5..bded04aee77 100644
--- a/code/modules/clothing/spacesuits/rig/suits/light.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/light.dm
@@ -72,20 +72,30 @@
siemens_coefficient = 0
/obj/item/weapon/rig/light/ninja
- name = "ominous suit control module"
- suit_type = "ominous"
- desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins."
+ name = "stealth suit control module"
+ suit_type = "stealth suit"
+ desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for stealth operations."
icon_state = "ninja_rig"
- armor = list(melee = 50, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 30)
- emp_protection = 40 //change this to 30 if too high.
+ armor = list(melee = 50, bullet = 35, laser = 35, energy = 30, bomb = 25, bio = 100, rad = 30)
+ emp_protection = 40
slowdown = 0
chest_type = /obj/item/clothing/suit/space/rig/light/ninja
glove_type = /obj/item/clothing/gloves/rig/light/ninja
helm_type = /obj/item/clothing/head/helmet/space/rig/light/ninja
+ boot_type = /obj/item/clothing/shoes/rig/light/ninja
req_access = list(access_syndicate)
+ initial_modules = list(
+ /obj/item/rig_module/teleporter,
+ /obj/item/rig_module/vision,
+ /obj/item/rig_module/voice,
+ /obj/item/rig_module/ai_container,
+ /obj/item/rig_module/datajack,
+ /obj/item/rig_module/self_destruct
+ )
+/obj/item/weapon/rig/light/ninja/equipped
initial_modules = list(
/obj/item/rig_module/teleporter,
/obj/item/rig_module/stealth_field,
@@ -102,12 +112,13 @@
/obj/item/rig_module/actuators/combat
)
- ..()
-
/obj/item/clothing/gloves/rig/light/ninja
name = "insulated gloves"
siemens_coefficient = 0
+/obj/item/clothing/shoes/rig/light/ninja
+ silent = 1
+
/obj/item/clothing/suit/space/rig/light/ninja
species_restricted = list("exclude","Diona","Xenomorph", "Golem")
breach_threshold = 38 //comparable to regular hardsuits