From 3557748229b3d2d40fefb220b6980fb55c2813d9 Mon Sep 17 00:00:00 2001
From: Contrabang <91113370+Contrabang@users.noreply.github.com>
Date: Mon, 11 Mar 2024 14:13:59 -0400
Subject: [PATCH] People are now hidden behind smoke (#24229)
* no, that is NOT solid snake
* lol
* more names
* Update code/game/objects/items/weapons/storage/boxes.dm
Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>
* Apply suggestions from code review
Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>
* Update code/game/objects/items/weapons/storage/belt.dm
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
---------
Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
---
code/__DEFINES/layers.dm | 3 +-
code/_onclick/hud/plane_master.dm | 6 ++
code/datums/outfits/outfit_admin.dm | 69 +++++++++++++++++++
.../effects/effect_system/effects_smoke.dm | 3 +
.../objects/items/devices/radio/headset.dm | 3 +
.../objects/items/weapons/storage/belt.dm | 27 ++++++--
.../objects/items/weapons/storage/boxes.dm | 18 ++---
code/modules/clothing/under/solgov.dm | 5 ++
code/modules/mob/mob.dm | 7 ++
9 files changed, 127 insertions(+), 14 deletions(-)
diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm
index 9e475ab6e9e..bdd5ac8e110 100644
--- a/code/__DEFINES/layers.dm
+++ b/code/__DEFINES/layers.dm
@@ -94,7 +94,8 @@
#define HIGH_LANDMARK_LAYER 9.2
#define AREA_LAYER 10
#define MASSIVE_OBJ_LAYER 11
-#define POINT_LAYER 12
+#define SMOKE_PLANE 12
+#define POINT_LAYER 13
#define CHAT_LAYER 12.0001 // Do not insert layers between these two values
#define CHAT_LAYER_MAX 12.9999
diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm
index d9da09946af..3f7d221f500 100644
--- a/code/_onclick/hud/plane_master.dm
+++ b/code/_onclick/hud/plane_master.dm
@@ -104,3 +104,9 @@
blend_mode = BLEND_ADD
render_target = GRAVITY_PULSE_RENDER_TARGET
appearance_flags = PLANE_MASTER | NO_CLIENT_COLOR
+
+/obj/screen/plane_master/smoke
+ name = "point plane master"
+ plane = SMOKE_PLANE
+ appearance_flags = PLANE_MASTER
+ blend_mode = BLEND_OVERLAY
diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm
index 611b449b7e5..47f3e37da94 100644
--- a/code/datums/outfits/outfit_admin.dm
+++ b/code/datums/outfits/outfit_admin.dm
@@ -1431,3 +1431,72 @@
var/obj/item/card/id/I = H.wear_id
if(istype(I))
apply_to_card(I, H, get_all_accesses(), "Oblivion Enforcer")
+
+/datum/outfit/admin/viper
+ name = "Solar Federation Viper Infiltrator"
+
+ uniform = /obj/item/clothing/under/solgov/viper
+ back = /obj/item/storage/backpack/satchel
+ belt = /obj/item/storage/belt/viper
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/jackboots
+ head = null // will end up being the bandana
+ mask = /obj/item/clothing/mask/bandana/black // will end up being a cigar
+ l_ear = /obj/item/radio/headset/ert/alt/solgov
+ glasses = /obj/item/clothing/glasses/thermal/eyepatch
+ id = /obj/item/card/id
+ l_pocket = /obj/item/kitchen/knife/combat
+ r_pocket = /obj/item/gun/projectile/automatic/pistol
+ box = /obj/item/storage/box/responseteam
+
+ backpack_contents = list(
+ /obj/item/storage/box/smoke_grenades = 1,
+ /obj/item/lighter/zippo = 1,
+ /obj/item/clothing/mask/cigarette/cigar = 3,
+ /obj/item/clothing/mask/gas/explorer = 1
+ )
+
+ bio_chips = list(/obj/item/bio_chip/stealth)
+
+ cybernetic_implants = list(
+ /obj/item/organ/internal/cyberimp/eyes/hud/security,
+ /obj/item/organ/internal/cyberimp/chest/nutriment/hardened
+ )
+
+/datum/outfit/admin/viper/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+ var/codename = pick("Viper", "Serpent", "Python", "Boa", "Basilisk", "Snake", "Mamba", "Sidewinder")
+ if(prob(50))
+ var/codename_prefix = pick("Exposed", "Unveiled", "Phantom", "Mirage", "Punished", "Invisible", "Swift")
+ codename = "[codename_prefix] [codename]"
+ H.rename_character(null, codename)
+
+ var/hair_color = "#361A00"
+
+ var/obj/item/organ/external/head/head_organ = H.get_organ("head")
+ head_organ.h_style = "Bedhead 2"
+ head_organ.f_style = "Full Beard"
+ head_organ.hair_colour = hair_color
+ head_organ.sec_facial_colour = hair_color
+ head_organ.facial_colour = hair_color
+ head_organ.sec_hair_colour = hair_color
+ H.update_hair()
+ H.update_fhair()
+ H.update_dna()
+
+ H.wear_mask.adjustmask(H) // push it back on the head
+ equip_item(H, /obj/item/clothing/mask/cigarette/cigar, SLOT_HUD_WEAR_MASK) // get them their cigar
+ if(istype(H.glasses, /obj/item/clothing/glasses)) // this is gonna be always true
+ var/obj/item/clothing/glasses/glassass = H.glasses
+ glassass.over_mask = TRUE
+ H.update_inv_glasses()
+ H.gloves.siemens_coefficient = 0 // black "insulated" gloves, since combat gloves look kinda shit
+ var/obj/item/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, list(ACCESS_MAINT_TUNNELS), "Solar Federation Infilitrator", "lifetimeid")
+
+ qdel(H.GetComponent(/datum/component/footstep)) // they're literally stealth
+ var/datum/martial_art/cqc/CQC = new()
+ CQC.teach(H)
diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm
index cc88b207b85..1decfcb6238 100644
--- a/code/game/objects/effects/effect_system/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_smoke.dm
@@ -12,6 +12,9 @@
pixel_y = -32
opacity = TRUE
anchored = FALSE
+ plane = SMOKE_PLANE
+ layer = FLY_LAYER
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/steps = 0
var/lifetime = 5
var/direction
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 6914b911553..f04502612d6 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -349,6 +349,9 @@
/obj/item/radio/headset/ert/alt/solgov
name = "\improper Trans-Solar Federation Marine's bowman headset"
+/obj/item/radio/headset/ert/alt/solgovviper
+ name = "\improper Trans-Solar Federation Infiltrator's bowman headset"
+
/obj/item/radio/headset/ert/alt/commander
name = "ERT commander's bowman headset"
desc = "The headset of the boss. Protects ears from flashbangs. Can transmit even if telecomms are down."
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index cf5b79d57c1..3ed49639435 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -67,11 +67,11 @@
if(!M.restrained() && !M.stat && can_use())
switch(over_object.name)
if("r_hand")
- M.unEquip(src, silent = TRUE)
- M.put_in_r_hand(src)
+ if(M.unEquip(src, silent = TRUE))
+ M.put_in_r_hand(src)
if("l_hand")
- M.unEquip(src, silent = TRUE)
- M.put_in_l_hand(src)
+ if(M.unEquip(src, silent = TRUE))
+ M.put_in_l_hand(src)
add_fingerprint(usr)
return
@@ -504,6 +504,25 @@
new /obj/item/grenade/plastic/c4/thermite(src)
update_icon()
+/obj/item/storage/belt/viper
+ name = "utility belt"
+ desc = "Holds smokebombs, bolas, and knives. Excellent for sneaking around."
+ icon_state = "securitybelt"
+ item_state = "security"
+ max_w_class = WEIGHT_CLASS_NORMAL
+ max_combined_w_class = 18
+ can_hold = list(
+ /obj/item/grenade/smokebomb,
+ /obj/item/restraints/legcuffs/bola,
+ /obj/item/kitchen/knife/combat
+ )
+
+/obj/item/storage/belt/viper/populate_contents()
+ for(var/I in 1 to 5)
+ new /obj/item/grenade/smokebomb(src)
+ new /obj/item/restraints/legcuffs/bola(src)
+ new /obj/item/restraints/legcuffs/bola(src)
+
/obj/item/storage/belt/janitor
name = "janibelt"
desc = "A belt used to hold most janitorial supplies."
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index e3d689a6e48..11038163140 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -250,15 +250,6 @@
for(var/I in 1 to 7)
new /obj/item/ammo_casing/shotgun/tranquilizer(src)
-/obj/item/storage/box/flashbangs
- name = "box of flashbangs (WARNING)"
- desc = "WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use."
- icon_state = "flashbang"
-
-/obj/item/storage/box/flashbangs/populate_contents()
- for(var/I in 1 to 7)
- new /obj/item/grenade/flashbang(src)
-
/obj/item/storage/box/flashes
name = "box of flashbulbs"
desc = "WARNING: Flashes can cause serious eye damage, protective eyewear is required."
@@ -648,6 +639,15 @@
for(var/I in 1 to 7)
new /obj/item/grenade/flashbang(src)
+/obj/item/storage/box/smoke_grenades
+ name = "smoke grenades"
+ desc = "A box with 7 smoke grenades."
+ icon_state = "teargas_box"
+
+/obj/item/storage/box/smoke_grenades/populate_contents()
+ for(var/I in 1 to 7)
+ new /obj/item/grenade/smokebomb(src)
+
/obj/item/storage/box/flashes
name = "box of flashbulbs"
desc = "WARNING: Flashes can cause serious eye damage, protective eyewear is required."
diff --git a/code/modules/clothing/under/solgov.dm b/code/modules/clothing/under/solgov.dm
index cda11534aee..7230c596738 100644
--- a/code/modules/clothing/under/solgov.dm
+++ b/code/modules/clothing/under/solgov.dm
@@ -36,3 +36,8 @@
desc = "A formal uniform worn by the diplomatic representatives of the Trans-Solar Federation."
icon_state = "solgovr"
item_color = "solgovr"
+
+/obj/item/clothing/under/solgov/viper
+ name = "\improper Trans-Solar Federation Infiltrator uniform"
+ desc = "Olive Drab camoflauge. Commonly known as OD. A battle uniform for TSF infiltrators."
+ color = "#f5cf53" // custom sprites are for losers (this makes it a light green)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index bccd1463282..86ee0316940 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1390,6 +1390,13 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
var/atom/movable/screen/plane_master/lighting/L = hud_used.plane_masters["[LIGHTING_PLANE]"]
if(L)
L.alpha = lighting_alpha
+ var/obj/screen/plane_master/smoke/S = hud_used.plane_masters["[SMOKE_PLANE]"]
+ if(S)
+ S.alpha = 255
+ if(sight & SEE_MOBS)
+ S.alpha = 200
+ if((sight & SEE_TURFS|SEE_MOBS|SEE_OBJS) == (SEE_TURFS|SEE_MOBS|SEE_OBJS))
+ S.alpha = 128
sync_nightvision_screen() //Sync up the overlay used for nightvision to the amount of see_in_dark a mob has. This needs to be called everywhere sync_lighting_plane_alpha() is.