diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 3e19baa5b8a..f164c78d422 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -227,6 +227,7 @@ GLOBAL_LIST_INIT(security_vest_allowed, list( /obj/item/storage/belt/holster/nukie, /obj/item/storage/belt/holster/energy, /obj/item/gun/ballistic/shotgun/automatic/combat/compact, + /obj/item/pen/red/security, /obj/item/gun/microfusion, //SKYRAT EDIT ADDITION )) diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index a2aa81ebb69..598b78ca9df 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -334,6 +334,22 @@ owner.emote("surrender") +///For when you need to make someone be prompted for surrender, but not forever +/datum/status_effect/surrender_timed + id = "surrender_timed" + duration = 30 SECONDS + status_type = STATUS_EFFECT_UNIQUE + alert_type = null + +/datum/status_effect/surrender_timed/on_apply() + owner.apply_status_effect(/datum/status_effect/grouped/surrender, REF(src)) + return ..() + +/datum/status_effect/surrender_timed/on_remove() + owner.remove_status_effect(/datum/status_effect/grouped/surrender, REF(src)) + return ..() + + /* * A status effect used for preventing caltrop message spam * diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 027595a38d8..9ba63151c7c 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -295,25 +295,33 @@ w_class = WEIGHT_CLASS_TINY flags_1 = CONDUCT_1 light_range = 2 - var/holo_cooldown = 0 + COOLDOWN_DECLARE(holosign_cooldown) /obj/item/flashlight/pen/afterattack(atom/target, mob/user, proximity_flag) . = ..() - if(!proximity_flag) - if(holo_cooldown > world.time) - to_chat(user, span_warning("[src] is not ready yet!")) - return - var/T = get_turf(target) - if(locate(/mob/living) in T) - new /obj/effect/temp_visual/medical_holosign(T,user) //produce a holographic glow - holo_cooldown = world.time + 10 SECONDS - return + if(proximity_flag) + return + + if(!COOLDOWN_FINISHED(src, holosign_cooldown)) + balloon_alert(user, "not ready!") + return + + var/target_turf = get_turf(target) + var/mob/living/living_target = locate(/mob/living) in target_turf + + if(!living_target || (living_target == user)) + return + + to_chat(living_target, span_boldnotice("[user] is offering medical assistance; please halt your actions.")) + new /obj/effect/temp_visual/medical_holosign(target_turf, user) //produce a holographic glow + COOLDOWN_START(src, holosign_cooldown, 10 SECONDS) // see: [/datum/wound/burn/flesh/proc/uv()] /obj/item/flashlight/pen/paramedic name = "paramedic penlight" desc = "A high-powered UV penlight intended to help stave off infection in the field on serious burned patients. Probably really bad to look into." icon_state = "penlight_surgical" + light_color = LIGHT_COLOR_PURPLE /// Our current UV cooldown COOLDOWN_DECLARE(uv_cooldown) /// How long between UV fryings diff --git a/code/modules/modular_computers/computers/item/role_tablet_presets.dm b/code/modules/modular_computers/computers/item/role_tablet_presets.dm index e2f1b354eda..4ccdfe8ec21 100644 --- a/code/modules/modular_computers/computers/item/role_tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/role_tablet_presets.dm @@ -47,6 +47,7 @@ name = "head of security PDA" greyscale_config = /datum/greyscale_config/tablet/head greyscale_colors = "#EA3232#0000CC" + inserted_item = /obj/item/pen/red/security starting_programs = list( /datum/computer_file/program/crew_manifest, /datum/computer_file/program/status, @@ -122,6 +123,7 @@ /obj/item/modular_computer/pda/security name = "security PDA" greyscale_colors = "#EA3232#0000cc" + inserted_item = /obj/item/pen/red/security starting_programs = list( /datum/computer_file/program/records/security, /datum/computer_file/program/crew_manifest, @@ -131,6 +133,7 @@ /obj/item/modular_computer/pda/detective name = "detective PDA" greyscale_colors = "#805A2F#990202" + inserted_item = /obj/item/pen/red/security starting_programs = list( /datum/computer_file/program/records/security, /datum/computer_file/program/crew_manifest, @@ -141,6 +144,7 @@ name = "warden PDA" greyscale_config = /datum/greyscale_config/tablet/stripe_double greyscale_colors = "#EA3232#0000CC#363636" + inserted_item = /obj/item/pen/red/security starting_programs = list( /datum/computer_file/program/records/security, /datum/computer_file/program/crew_manifest, diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 05606ac3a2e..69af56d3419 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -400,3 +400,44 @@ . = ..() icon_state = "[initial(icon_state)][HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) ? "_out" : null]" inhand_icon_state = initial(inhand_icon_state) //since transforming component switches the icon. + +//The Security holopen +/obj/item/pen/red/security + name = "security pen" + desc = "This is a red ink pen exclusively provided to members of the Security Department. Its opposite end features a built-in holographic projector designed for issuing arrest prompts to individuals." + icon_state = "pen_sec" + COOLDOWN_DECLARE(holosign_cooldown) + +/obj/item/pen/red/security/examine(mob/user) + . = ..() + . += span_notice("To initiate the surrender prompt, simply click on an individual within your proximity.") + +//Code from the medical penlight +/obj/item/pen/red/security/afterattack(atom/target, mob/living/user, proximity) + . = ..() + if(!COOLDOWN_FINISHED(src, holosign_cooldown)) + balloon_alert(user, "not ready!") + return + + var/target_turf = get_turf(target) + var/mob/living/living_target = locate(/mob/living) in target_turf + + if(!living_target || (living_target == user)) + return + + living_target.apply_status_effect(/datum/status_effect/surrender_timed) + to_chat(living_target, span_userdanger("[user] requests your immediate surrender! You are given 30 seconds to comply!")) + new /obj/effect/temp_visual/security_holosign(target_turf, user) //produce a holographic glow + COOLDOWN_START(src, holosign_cooldown, 30 SECONDS) + +/obj/effect/temp_visual/security_holosign + name = "security holosign" + desc = "A small holographic glow that indicates you're under arrest." + icon_state = "sec_holo" + duration = 60 + +/obj/effect/temp_visual/security_holosign/Initialize(mapload, creator) + . = ..() + playsound(loc, 'sound/machines/chime.ogg', 50, FALSE) //make some noise! + if(creator) + visible_message(span_danger("[creator] created a security hologram!")) diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 285878e7f26..150c69bc21f 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -359,6 +359,28 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/penlight + name = "Penlight" + id = "penlight" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*0.5) + build_path = /obj/item/flashlight/pen + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/design/penlight_paramedic + name = "Paramedic Penlight" + id = "penlight_paramedic" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*1) + build_path = /obj/item/flashlight/pen/paramedic + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + ///////////////////////////////////////// //////////Cybernetic Implants//////////// ///////////////////////////////////////// diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index fcbf39ec794..a99c5e24217 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -819,6 +819,17 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY +/datum/design/sec_pen + name = "Security Pen" + id = "sec_pen" + build_type = PROTOLATHE | AUTOLATHE + materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT) + build_path = /obj/item/pen/red/security + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SECURITY + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + /datum/design/plumbing_rcd name = "Plumbing Constructor" id = "plumbing_rcd" diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 4f1e7dd0e2a..95fb324a079 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -98,6 +98,7 @@ "sec_dart", "sec_Islug", "sec_rshot", + "sec_pen", "servingtray", "shaker", "shot_glass", @@ -299,6 +300,7 @@ "plumbing_rcd_service", "plumbing_rcd_sci", "portable_chem_mixer", + "penlight", "retractor", "scalpel", "stethoscope", @@ -417,6 +419,7 @@ "medigel", "medipen_refiller", "pandemic", + "penlight_paramedic", "soda_dispenser", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 9828e307431..bbde393b5ef 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 061099defd4..2bda7341e51 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/service/bureaucracy.dmi b/icons/obj/service/bureaucracy.dmi index 8cccb7f5910..d8190ba2e72 100644 Binary files a/icons/obj/service/bureaucracy.dmi and b/icons/obj/service/bureaucracy.dmi differ diff --git a/strings/tips.txt b/strings/tips.txt index 75d0e4d1851..8461c0bb71e 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -94,6 +94,7 @@ As a Security Officer, mindshield implants can only prevent someone from being t As a Security Officer, remember that correlation does not equal causation. Someone may have just been at the wrong place at the wrong time! As a Security Officer, remember that you can attach a sec-lite to your disabler or your helmet! As a Security Officer, your sechuds or HUDsunglasses can not only see crewmates' job assignments and criminal status, but also if they are mindshield implanted. You can tell by the flashing blue outline around their job icon. Use this to your advantage in a revolution to definitively tell who is on your side! +As a Security Officer, you have a special pen in your PDA that you can use to prompt people to surrender. This will stun them without the need to use a baton! As a Service Cyborg, your spray can knocks people down. However, it is blocked by masks and glasses. As a Shaft Miner, always have a GPS on you, so a fellow miner or cyborg can come to save you if you die. As a Shaft Miner, every monster on Lavaland has a pattern you can exploit to minimize damage from the encounters.