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