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.