diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 3df635790a5e2..7e427f97cd2c6 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -257,6 +257,8 @@ #define TRAIT_SPEC(spec_type) "t_spec_[spec_type]" /// If the mob won't drop items held in face slot when downed #define TRAIT_IRON_TEETH "t_iron_teeth" +///Sight Optic buff if it's active +#define TRAIT_HUD_SIGHT "t_hud_sight" // -- ability traits -- /// Xenos with this trait cannot have plasma transferred to them diff --git a/code/datums/fluff_emails.dm b/code/datums/fluff_emails.dm index a58bd1b0692a3..57197f7dda7fc 100644 --- a/code/datums/fluff_emails.dm +++ b/code/datums/fluff_emails.dm @@ -101,6 +101,58 @@ "} +/datum/fluff_email/almayer/nightvision ///lore explanation why NVO's so bad, now marines have an answer. + title = "Night Vision problem" + entry_text = {" + After the explosion at the warehouse, we lost almost all of the night vision devices – they were simply blown up, and the ones that did survive barely work. + Harrison and I tried to repair them, but the damage is too severe. We only managed to get them into some kind of working condition; + a full repair is impossible because we don't have the capacity. Today I tried to replace the battery on one of the lenses with Harrison + the NVO exploded, and Harrison suffered severe burns to his hands. They put him in medical cryosleep, so now I'm alone – shit! + Yes, they make special batteries for NVOs, because standard ones don't fit. I also tried to restore the zoom‑in/zoom‑out function, and... it didn't work. + I almost broke a second lens, barely managed to roll back the effect, and left it as is. Anyway, when the marines wake up, they are going to be very surprised that they have no proper NVGs, and the ones they do have are CRAP! + + "} + +/datum/fluff_email/almayer/heapammo + title = "M309 HEAP are DONE!" + entry_text = {" + The entire shipment of our standard M309 ammunition exploded we're cooked! we don't even have standard ammo! All we have left is antipersonnel ammunition. + The grunts call it "regular" or "FMJ", but in the tech manual it's antipersonnel, yeah. Worse than M309, but at least these guys won't blow themselves up with friendly fire, + I believe. Alright, I'm going to refill all preparation and requisition storages with antipersonnel rounds, and I'll make some standard AP from the materials I've got not much, + but if they run into anything heavily armored, they're done. + + "} + +/datum/fluff_email/almayer/predator ///scary story about predator during previous op, adds atmosphere and reason why predators sometimes appear during the round (cuz they track the almayer since tychoon tackle) and love targeting intelligence officers (revenge for their hunter) + title = "Intel Leader MIA report" + entry_text = {" + I am reporting the disappearance of the Almayer's Intelligence squad Leader, First Lieutenant Richard Voss, under the following circumstances. + During the deployment of the intelligence officer team, everything proceeded normally. However, when our main forces began to encounter heavy pressure from the CLF, + the situation changed drastically. As a result of a sudden attack by the enemy, the group was forced to split up. The CLF militants threw a grenade at the scouts' feet as they were moving near the edge of a cliff. + Everyone jumped aside; Lieutenant Voss also tried to evade the blast, but a CLF fighter ran up to him, and they both rolled off the cliff into tall grass. + I saw Voss use the militant as a cushion during the fall, and after landing, he slit the militant's throat with his own knife. Immediately after that, communication with the lieutenant was lost presumably his helmet was damaged in the fall. + The rest of the group was successfully evacuated, but the leader remained behind. + I repeatedly tried to contact Voss, but a stable connection could only be maintained for a few seconds at a time. His personal tracker was malfunctioning, making it impossible to pinpoint his exact location. Nevertheless, + I managed to re-establish contact briefly and learned that he was approximately three kilometres from the operational area. How he got there remains a mystery. Voice transmission was heavily distorted he was trying to say something over the radio, + but I could not make out the words due to the damaged equipment. + Additionally, I had access to the motion detector embedded in his vest. The system repeatedly registered extremely fast contacts approaching from various directions, but mostly from behind the lieutenant. + Someone was moving near him at high speed and almost invisibly. Twice I was able to briefly activate his helmet camera. + First - The camera turned on for 20 frames. A contact was detected 15 metres behind Voss. The footage shows him spinning around, aiming his M41 rifle at a tree, and opening fire. After that, the image cuts out. + Second episode 7 minutes later: The camera reactivated for 4 frames with intervals of approximately 3 seconds. + Frame 1 - The image shows Voss inside a cave. A CLF flag is hanging on the wall, and there is a weapon rack with MAR type rifles by all indications, this is a hidden enemy camp. + Frame 2 - Voss aims his M41 at a silhouette standing near the cave entrance. The recording is heavily noisy. + Frame 3 - Voss fires an under barrel grenade launcher at the ceiling near the silhouette, where a wooden support beam is visible. + Frame 4 - Severe interference; the aftermath of the explosion is visible. The lens is smeared with a bright green substance, but it is possible to make out that the cave entrance has collapsed, and the silhouette appears to have been crushed by falling rocks. + Final view - After Voss entered the cave, his vital signs indicators disappeared completely. However, they did not terminate with a death signal this means that he may have survived the collapse and either: + remained trapped inside the collapsed cave, exited through another possible entrance, or fallen into the hands of the CLF. + His status is currently listed as Missing in Action. I want to believe he is still alive. + Regarding the silhouette due to heavy interference, it is difficult to determine, but it appeared to be unusually tall much taller than any normal human. This is likely a distortion, but... + it raised a question for me. Voss has served in the Reconnaissance Battalion for four years, been through numerous operations, and holds a Medal for Heroism and two other decorations. He is a Green Beret. Could it be that, with all his equipment, + he could not simply shoot a CLF soldier with stealth camouflage? Or perhaps it was not CLF at all, but some kind of UPP commandos? I do not know what to think. I will send the camera recordings to ARES for image processing and analysis, and also forward them to High Command. + And Voss, if you will see this, somehow - You are ultimate badass... + + "} + /datum/fluff_email/almayer/tunes title = "RE: Tunes" diff --git a/code/game/machinery/vending/vendor_types/engineering.dm b/code/game/machinery/vending/vendor_types/engineering.dm index 1fdab8fd6e220..d9460d8c8a746 100644 --- a/code/game/machinery/vending/vendor_types/engineering.dm +++ b/code/game/machinery/vending/vendor_types/engineering.dm @@ -24,6 +24,7 @@ list("Insulated Gloves", floor(scale * 2), /obj/item/clothing/gloves/yellow, VENDOR_ITEM_REGULAR), list("Utility Tool Belt", floor(scale * 2), /obj/item/storage/belt/utility, VENDOR_ITEM_REGULAR), list("Welding Goggles", floor(scale * 2), /obj/item/clothing/glasses/welding, VENDOR_ITEM_REGULAR), + list("Welding Visor", floor(scale *2), /obj/item/device/helmet_visor/welding_visor, VENDOR_ITEM_REGULAR), list("Welding Helmet", floor(scale * 2), /obj/item/clothing/head/welding, VENDOR_ITEM_REGULAR), list("Engineer Kit", floor(scale * 2), /obj/item/storage/toolkit/empty, VENDOR_ITEM_REGULAR), @@ -56,6 +57,7 @@ list("Utility Tool Belt", floor(scale * 4), /obj/item/storage/belt/utility, VENDOR_ITEM_REGULAR), list("Cable Coil", floor(scale * 4), /obj/item/stack/cable_coil/random, VENDOR_ITEM_REGULAR), list("Welding Goggles", floor(scale * 2), /obj/item/clothing/glasses/welding, VENDOR_ITEM_REGULAR), + list("Welding Visor", floor(scale *2), /obj/item/device/helmet_visor/welding_visor, VENDOR_ITEM_REGULAR), list("Engineer Kit", floor(scale * 2), /obj/item/storage/toolkit/empty, VENDOR_ITEM_REGULAR), list("TOOLS", -1, null, null), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm index 349db37efc3ac..2f137a4fc7918 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm @@ -36,6 +36,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_leader, list( list("Laser Designator", 5, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_REGULAR), list("HELMET OPTICS", 0, null, null, null), + list("Sight Optic", 5, /obj/item/device/helmet_visor/sight, null, VENDOR_ITEM_REGULAR),///built in m11, buy if you wanna increase your Squad accuracy list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_REGULAR), list("SensorMate Medical Optic", 4, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_RECOMMENDED), list("Night Vision Optic", 25, /obj/item/device/helmet_visor/night_vision, null, VENDOR_ITEM_RECOMMENDED), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm index 4bf8cd9a4ee16..249bbf9bd9924 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm @@ -210,7 +210,6 @@ list("OPTICS", -1, null, null, null), list("Advanced Medical Optic (CORPSMAN ONLY)", floor(scale * 4), /obj/item/device/helmet_visor/medical/advanced, VENDOR_ITEM_REGULAR), - list("Squad Optic", floor(scale * 15), /obj/item/device/helmet_visor, VENDOR_ITEM_REGULAR), ) diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm index a2a517f88d08f..adb654fe273dd 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm @@ -119,6 +119,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_marine, list( list("Laser Designator", 15, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_REGULAR), list("HELMET OPTICS", 0, null, null, null), + list("Sight Optic", 15, /obj/item/device/helmet_visor/sight, null, VENDOR_ITEM_REGULAR), list("SensorMate Medical Optic", 15, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR), list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm index 219d3f97c2926..0e8b6985c7a4c 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm @@ -52,6 +52,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_smartgun, list( list("Laser Designator", 15, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_REGULAR), list("HELMET OPTICS", 0, null, null, null), + list("Sight Optic", 15, /obj/item/device/helmet_visor/sight, null, VENDOR_ITEM_REGULAR), list("SensorMate Medical Optic", 15, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR), list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm index df00298c39412..b10c03add7d06 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm @@ -195,6 +195,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_specialist, list( list("Laser Designator", 15, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_REGULAR), list("HELMET OPTICS", 0, null, null, null), + list("Sight Optic", 15, /obj/item/device/helmet_visor/sight, null, VENDOR_ITEM_REGULAR), list("SensorMate Medical Optic", 15, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR), list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm index d7367848b2133..89283c4803277 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm @@ -44,7 +44,6 @@ GLOBAL_LIST_INIT(cm_vending_gear_tl, list( list("M276 Pattern Combat Toolbelt Rig", 15, /obj/item/storage/belt/gun/utility, null, VENDOR_ITEM_REGULAR), list("Autoinjector Pouch (Full)", 15, /obj/item/storage/pouch/autoinjector/full, null, VENDOR_ITEM_REGULAR), list("Insulated Gloves", 3, /obj/item/clothing/gloves/yellow, null, VENDOR_ITEM_REGULAR), - list("Night Vision Optic", 30, /obj/item/device/helmet_visor/night_vision, null, VENDOR_ITEM_RECOMMENDED), list("ENGINEERING SUPPLIES", 0, null, null, null), list("Plastic Explosive", 10, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR), @@ -66,6 +65,8 @@ GLOBAL_LIST_INIT(cm_vending_gear_tl, list( list("Laser Designator", 15, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_REGULAR), list("HELMET OPTICS", 0, null, null, null), + list("Night Vision Optic", 30, /obj/item/device/helmet_visor/night_vision, null, VENDOR_ITEM_RECOMMENDED),///what it did in CLOTHING??? + list("Sight Optic", 15, /obj/item/device/helmet_visor/sight, null, VENDOR_ITEM_REGULAR), list("SensorMate Medical Optic", 15, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR), list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_REGULAR), diff --git a/code/game/objects/items/devices/helmet_visors.dm b/code/game/objects/items/devices/helmet_visors.dm index 4060c22dc29cf..2f05c4f09a0a1 100644 --- a/code/game/objects/items/devices/helmet_visors.dm +++ b/code/game/objects/items/devices/helmet_visors.dm @@ -2,7 +2,7 @@ name = "squad optic" desc = "An insertable visor HUD into a standard USCM helmet." icon = 'icons/obj/items/clothing/helmet_visors.dmi' - icon_state = "hud_sight" + icon_state = "hud_squad" w_class = SIZE_TINY ///The type of HUD our visor shows @@ -67,11 +67,15 @@ /// Called by toggle_visor() to activate the visor's effects /obj/item/device/helmet_visor/proc/activate_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user) var/datum/mob_hud/current_mob_hud = GLOB.huds[hud_type] - current_mob_hud.add_hud_to(user, attached_helmet) + if(!current_mob_hud) + return + current_mob_hud.remove_hud_from(user, attached_helmet) /// Called by toggle_visor() to deactivate the visor's effects /obj/item/device/helmet_visor/proc/deactivate_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user) var/datum/mob_hud/current_mob_hud = GLOB.huds[hud_type] + if(!current_mob_hud) + return current_mob_hud.remove_hud_from(user, attached_helmet) /// Called by /obj/item/clothing/head/helmet/marine/get_examine_text(mob/user) to get extra examine text for this visor @@ -211,6 +215,7 @@ /obj/item/device/helmet_visor/night_vision name = "night vision optic" desc = "An insertable visor HUD into a standard USCM helmet. This type gives a form of night vision and is standard issue in units with regular funding." + desc_lore = "The AN/NVPAV-75 visor (or image intensifier). This unit allows visibility in total darkness, as it features an infrared illuminator, and operates for 12 hours without recharging. The NVO automatically recharges after being turned off, drawing power from the suits internal battery that also powers the shoulder lamp and other visors, a full recharge takes about 2 hours on average. Unfortunately, after the explosion of the M309 HEAP ammunition storage - located in another section containing these NVOs was also damaged. 94% of the lenses were destroyed; the remaining units were repaired and distributed to critical roles. The damaged lens has impaired zoom in/zoom out functionality, making it incompatible with binoculars and weapon scopes. Additionally, the infrared illuminator was repaired in a makeshift manner, but as a negative side effect, it now gives off a visible glow in the dark. As for the battery and electronics themselves, they lost their calibration after the blast and can no longer receive a recharge from the suit, and they now operate for only 10 minutes. The technicians aboard the Almayer were only able to devise a jury rigged charging system using standard batteries it is inefficient, but it is still better than nothing." icon_state = "nvg_sight" hud_type = null action_icon_string = "nvg_sight_down" @@ -234,6 +239,11 @@ /// Whether or not the sight uses on_light and produces light var/visor_glows = TRUE + var/charging = FALSE + + /// Used to prevent spamming low-battery sound + var/low_battery_alerted = FALSE + /obj/item/device/helmet_visor/night_vision/Initialize(mapload, ...) . = ..() power_cell = new(src) @@ -260,6 +270,8 @@ on_light.set_light_on(TRUE) START_PROCESSING(SSobj, src) RegisterSignal(user, COMSIG_MOB_CHANGE_VIEW, PROC_REF(change_view)) + ///Reset low battery alert when activated + low_battery_alerted = FALSE /obj/item/device/helmet_visor/night_vision/deactivate_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user) user.remove_client_color_matrix("nvg_visor", 1 SECONDS) @@ -276,7 +288,6 @@ /obj/item/device/helmet_visor/night_vision/process(delta_time) if(!NVG_VISOR_USAGE(delta_time)) - if(!istype(loc, /obj/item/clothing/head/helmet/marine)) return PROCESS_KILL @@ -289,6 +300,16 @@ deactivate_visor(attached_helmet, user) return PROCESS_KILL + ///Low power warning + var/percent = power_cell.percent() + if(percent <= 20 && !low_battery_alerted) + var/obj/item/clothing/head/helmet/marine/attached_helmet = loc + if(istype(attached_helmet) && istype(attached_helmet.loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/user = attached_helmet.loc + playsound_client(user.client, 'sound/handling/lowbattery.ogg', null, 50) + to_chat(user, SPAN_DANGER("[src] battery is low! [round(percent)]% remaining. Estimated time to failure - 2 MINUTES. Recharge immediately.")) + low_battery_alerted = TRUE + /obj/item/device/helmet_visor/night_vision/can_toggle(mob/living/carbon/human/user) . = ..() if(!.) @@ -319,7 +340,7 @@ /obj/item/device/helmet_visor/night_vision/proc/change_view(mob/user, new_size) SIGNAL_HANDLER - if(new_size > 7) // cannot use binos with NVO + if(new_size > 7 && !istype(src, /obj/item/device/helmet_visor/night_vision/marine_raider))///only elite ert's got raider nvo (like only admin MARSOC and extremely rare VAISO) during endgame, they dont need optics restiction and i dont think you do much CAS/MORTAR/OB laze in Almayer corridors. var/obj/item/clothing/head/helmet/marine/attached_helmet = loc if(!istype(attached_helmet)) return @@ -332,6 +353,69 @@ if(cycle_action) cycle_action.set_default_overlay() +///High capacity battery cell recharges only 50%, Super 100%, lower capacity batteries are SUPER innefective. Super and High are extremely rare, and they recharging super slow in rechargers, self-recharging designed in emergency situations when player REALLY need extra energy, so pretty balanced. +/obj/item/device/helmet_visor/night_vision/attackby(obj/item/W, mob/user) + if(!istype(W, /obj/item/cell)) + return ..() + + if(charging) + to_chat(user, SPAN_WARNING("[src] is already being charged.")) + return + + var/obj/item/cell/external_cell = W + + if(external_cell.charge <= 0) + to_chat(user, SPAN_WARNING("[external_cell] is dead.")) + return + + if(power_cell.charge >= power_cell.maxcharge) + to_chat(user, SPAN_WARNING("[src] is already fully charged.")) + return + + charging = TRUE + user.visible_message(SPAN_NOTICE("[user] starts recharging [src] with [external_cell]."), + SPAN_NOTICE("You start recharging [src] with [external_cell].")) + + if(!do_after(user, 10 SECONDS, INTERRUPT_ALL, BUSY_ICON_GENERIC, src)) + charging = FALSE + return + + if(!external_cell || external_cell.charge <= 0) + charging = FALSE + return + + if(!power_cell) + charging = FALSE + return + + if(power_cell.charge >= power_cell.maxcharge) + charging = FALSE + return + + var/transfer_amount = min( + external_cell.charge, + power_cell.maxcharge - power_cell.charge + ) + + if(transfer_amount <= 0) + charging = FALSE + return + + if(!external_cell.use(transfer_amount)) + to_chat(user, SPAN_WARNING("Could not drain [external_cell].")) + charging = FALSE + return + + power_cell.give(transfer_amount) + to_chat(user, SPAN_NOTICE("You finish recharging [src]. Current charge: [floor(power_cell.percent())]%.")) + external_cell.update_icon() + charging = FALSE + + if(power_cell.percent() > 20) + low_battery_alerted = FALSE + +// ============================================================= + #undef NVG_VISOR_USAGE /atom/movable/nvg_light @@ -344,6 +428,7 @@ /obj/item/device/helmet_visor/night_vision/marine_raider name = "advanced night vision optic" desc = "An insertable visor HUD into a standard USCM helmet. This type gives a form of night vision and is standard issue in special forces units." + desc_lore = "The AN/NVPAV-77 visor (or advanced image intensifier) is an improved version of the AN/NVPAV-75. Unlike the 75, this model does not require power from the suit's internal source, as it features a more advanced and optimized power supply. It also has a covert infrared illuminator that does not reveal the NVO to other night vision devices or thermal imagers and as a bonus - integrated medical optic. It operates continuously for 32 hours, and recharging while switched off takes 2 hours."///lore explanation why NVO's so bad, now marines have an answer. hud_type = list(MOB_HUD_FACTION_MARINE, MOB_HUD_MEDICAL_ADVANCED) helmet_overlay = "nvg_sight_right_raider" power_use = 0 @@ -354,6 +439,8 @@ for(var/type in hud_type) var/datum/mob_hud/current_mob_hud = GLOB.huds[type] + if(!current_mob_hud) + continue current_mob_hud.add_hud_to(user, attached_helmet) /obj/item/device/helmet_visor/night_vision/marine_raider/deactivate_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user) @@ -361,6 +448,8 @@ for(var/type in hud_type) var/datum/mob_hud/current_mob_hud = GLOB.huds[type] + if(!current_mob_hud) + continue current_mob_hud.remove_hud_from(user, attached_helmet) /obj/item/device/helmet_visor/night_vision/marine_raider/process(delta_time) @@ -455,3 +544,25 @@ icon_state = "po_visor_yellow" action_icon_string = "po_visor_yellow_down" helmet_overlay = "po_visor_yellow" + +///SIGHT OPTIC, increases accuracy slighty when activated and gives movielike soul visor effect +/obj/item/device/helmet_visor/sight + name = "sight optic" + desc = "M10 pattern helmet optic that grants its user point and shoot capabilities and provides tactical squad HUD display." + desc_lore = "AN/PAV-70 is the guts of a Personal Augmented Viewer HUD unit. Fitted as standard in almost all helmets in use by UA forces. It synchronizes with shipboard time, as well as the ships satellite and other sensors, which in turn allows the marine to see time information, information about approaching and current weather, and ambient temperature. It has a reticle that responds to eye movement, aiding in aiming with all types of weapons." + icon = 'icons/obj/items/clothing/helmet_visors.dmi' + icon_state = "hud_sight" + hud_type = null +/obj/item/device/helmet_visor/sight/activate_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user) + . = ..() + + user.client.color = "#E0FFFF" ///SOUL + user.overlay_fullscreen("optic", /atom/movable/screen/fullscreen/flash/noise/nvg) + ADD_TRAIT(user, TRAIT_HUD_SIGHT, src) + +/obj/item/device/helmet_visor/sight/deactivate_visor(obj/item/clothing/head/helmet/marine/attached_helmet, mob/living/carbon/human/user) + . = ..() + + user.client.color = initial(user.client.color) + user.clear_fullscreen("optic", 0.5 SECONDS) + REMOVE_TRAIT(user, TRAIT_HUD_SIGHT, src) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 338d28c737be0..e2c097604db33 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -881,14 +881,14 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( desc = "A modified M10 marine helmet for ComTechs. Features a toggleable welding screen for eye protection." icon_state = "tech_helmet" specialty = "M10 technician" - built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/welding_visor) + built_in_visors = list(new /obj/item/device/helmet_visor/welding_visor) clothing_traits = list(TRAIT_EAR_PROTECTION) /obj/item/clothing/head/helmet/marine/welding name = "\improper M10 welding helmet" desc = "A modified M10 marine helmet, Features a toggleable welding screen for eye protection. Completely invisible while toggled off as opposed to the technician helmet." specialty = "M10 welding" - built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/welding_visor) + built_in_visors = list(new /obj/item/device/helmet_visor/welding_visor) clothing_traits = list(TRAIT_EAR_PROTECTION) @@ -950,14 +950,14 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( flags_inventory = BLOCKSHARPOBJ flags_inv_hide = HIDEEARS|HIDETOPHAIR specialty = "M50 tanker" - built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/welding_visor/tanker) + built_in_visors = list(new /obj/item/device/helmet_visor/welding_visor/tanker) /obj/item/clothing/head/helmet/marine/medic name = "\improper M10 corpsman helmet" desc = "An M10 marine helmet version worn by marine hospital corpsmen. Has red cross painted on its front." icon_state = "med_helmet" specialty = "M10 pattern medic" - built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/medical/advanced) + built_in_visors = list(new /obj/item/device/helmet_visor/medical/advanced) start_down_visor_type = /obj/item/device/helmet_visor/medical/advanced /obj/item/clothing/head/helmet/marine/medic/white @@ -1053,15 +1053,18 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( desc = "A variant of the standard M10 pattern. The front plate is reinforced. This one contains a small built-in camera and has cushioning to project your fragile brain." icon_state = "sl_helmet" armor_bio = CLOTHING_ARMOR_MEDIUMHIGH + armor_melee = CLOTHING_ARMOR_MEDIUMHIGH specialty = "M11 pattern marine" + built_in_visors = list(new /obj/item/device/helmet_visor/sight) /obj/item/clothing/head/helmet/marine/rto name = "\improper M12 pattern dust helmet" desc = "An experimental brain-bucket. A dust ruffle hangs from back instead of the standard lobster shell design. Moderately better at deflecting blunt objects at the cost of humiliation, can also hold a second visor optic. But who will be laughing at the memorial? Not you, you'll be busy getting medals for your fantastic leadership." + desc_lore = "The M12 helmet is part of the M4 armor system developed after Operation Canton. The new technology offers greater resistance to small arms fire and explosives, making it ideal for firefights. The second visor slot was designed at the request of Colonel Cadigan to allow the installation of night vision without compromising the medical optic, due to the increased threat of CLF and the growing need for night vision capabilities among troops. Unfortunately, night vision is not included with this helmet by default, but the slot remains." icon_state = "io" item_state = "io" - armor_melee = CLOTHING_ARMOR_MEDIUMHIGH - armor_bio = CLOTHING_ARMOR_MEDIUMHIGH + armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH + armor_bomb = CLOTHING_ARMOR_MEDIUMLOW specialty = "M12 pattern" max_inserted_visors = 2 item_state_slots = list( @@ -1082,10 +1085,10 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( flags_atom = NO_GAMEMODE_SKIN /obj/item/clothing/head/helmet/marine/rto/army/engi - built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/welding_visor) + built_in_visors = list(new /obj/item/device/helmet_visor/welding_visor) /obj/item/clothing/head/helmet/marine/rto/army/medic - built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/medical/advanced) + built_in_visors = list(new /obj/item/device/helmet_visor/medical/advanced) /obj/item/clothing/head/helmet/marine/rto/intel name = "\improper XM12 pattern intelligence helmet" @@ -1348,7 +1351,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( flags_inventory = BLOCKSHARPOBJ flags_inv_hide = HIDEEARS|HIDETOPHAIR specialty = "MK30 tactical" - built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/medical/advanced) + built_in_visors = list(new /obj/item/device/helmet_visor/medical/advanced) inserted_visors = list(new /obj/item/device/helmet_visor/po_visor) max_inserted_visors = 1 @@ -1400,7 +1403,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( armor_bio = CLOTHING_ARMOR_MEDIUMHIGH specialty = "M11 pattern commanding officer" flags_atom = NO_NAME_OVERRIDE - built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/medical/advanced, new /obj/item/device/helmet_visor/security) + built_in_visors = list(new /obj/item/device/helmet_visor/sight, new /obj/item/device/helmet_visor/medical/advanced, new /obj/item/device/helmet_visor/security) /obj/item/clothing/head/helmet/marine/leader/CO/general name = "\improper M11 pattern ceremonial helmet" @@ -1493,10 +1496,10 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( WEAR_R_HAND = "helmet" ) specialty = "M10 pattern officer" - built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/medical/advanced) + built_in_visors = list(new /obj/item/device/helmet_visor/medical/advanced) /obj/item/clothing/head/helmet/marine/MP/SO/basic - built_in_visors = list(new /obj/item/device/helmet_visor, new /obj/item/device/helmet_visor/medical) + built_in_visors = list(new /obj/item/device/helmet_visor/medical) /obj/item/clothing/head/helmet/marine/MP/provost/marshal name = "\improper M10 pattern MP riot helmet" diff --git a/code/modules/clothing/suits/marine_armor/_marine_armor.dm b/code/modules/clothing/suits/marine_armor/_marine_armor.dm index 6800bd0f34af5..3c3161f5bd48a 100644 --- a/code/modules/clothing/suits/marine_armor/_marine_armor.dm +++ b/code/modules/clothing/suits/marine_armor/_marine_armor.dm @@ -276,8 +276,9 @@ armor_variation = 0 name = "\improper M4 pattern marine armor" desc = "A well tinkered and crafted hybrid of Smart-Gunner mesh and M3 pattern plates. Robust, yet nimble, with room for all your pouches." - armor_bio = CLOTHING_ARMOR_MEDIUMHIGH - armor_rad = CLOTHING_ARMOR_MEDIUM + desc_lore = "After Operation Canton, which resulted in heavy casualties during firefights and from improvised explosive devices, the USCM command ordered the development of a next generation ARMAT armor suit to replace the M3 one that would provide better protection against small arms fire and explosives. ARMAT developed two variants of the new protection: the M3 EOD and the M4. The M4 features greater resistance to small arms and explosives, as well as improved load distribution, yet it does not impair mobility unlike the EOD variant. Unfortunately, due to its more advanced and expensive production technology, the M4 could not fully replace the M3, since one set of M4 armor cost as much as two and a half sets of M3. Instead, it is issued to fire team leaders and reconnaissance officers as limited issue equipment." + armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH + armor_bomb = CLOTHING_ARMOR_MEDIUMHIGH flags_bodypart_hidden = BODY_FLAG_CHEST|BODY_FLAG_LEGS storage_slots = 4 specialty = "M4 pattern marine" diff --git a/code/modules/cm_marines/equipment/kit_boxes.dm b/code/modules/cm_marines/equipment/kit_boxes.dm index 612739367541d..c028557cb1d4b 100644 --- a/code/modules/cm_marines/equipment/kit_boxes.dm +++ b/code/modules/cm_marines/equipment/kit_boxes.dm @@ -675,6 +675,7 @@ new /obj/item/storage/pouch/construction/low_grade_full(src) new /obj/item/storage/pouch/electronics/full(src) new /obj/item/clothing/glasses/welding(src) + new /obj/item/device/helmet_visor/welding_visor(src) /obj/item/storage/box/kit/UPP_leader_AR diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 621fbaa274642..cb9f1330992a8 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -2033,6 +2033,10 @@ not all weapons use normal magazines etc. load_into_chamber() itself is designed skill_accuracy = 1.5 else // Max level skill of firearms. skill_accuracy = 2 + + if(HAS_TRAIT(user, TRAIT_HUD_SIGHT)) + skill_accuracy += 0.5 + if(skill_accuracy) gun_accuracy_mult += skill_accuracy * HIT_ACCURACY_MULT_TIER_3 // Accuracy mult increase/decrease per level is equal to attaching/removing a red dot sight diff --git a/icons/mob/humans/onmob/clothing/helmet_garb/huds.dmi b/icons/mob/humans/onmob/clothing/helmet_garb/huds.dmi index b92844ce262dd..8222c0c16dbdd 100644 Binary files a/icons/mob/humans/onmob/clothing/helmet_garb/huds.dmi and b/icons/mob/humans/onmob/clothing/helmet_garb/huds.dmi differ diff --git a/icons/obj/items/clothing/helmet_visors.dmi b/icons/obj/items/clothing/helmet_visors.dmi index 291610df3c3d9..6cd4c7f65993a 100644 Binary files a/icons/obj/items/clothing/helmet_visors.dmi and b/icons/obj/items/clothing/helmet_visors.dmi differ diff --git a/sound/handling/lowbattery.ogg b/sound/handling/lowbattery.ogg new file mode 100644 index 0000000000000..0bf3ed2422d5a Binary files /dev/null and b/sound/handling/lowbattery.ogg differ