From dc412e4679dea8410a58d18cc60913e07edf84ec Mon Sep 17 00:00:00 2001 From: InsaneRed <47158596+InsaneRed@users.noreply.github.com> Date: Thu, 22 Feb 2024 12:17:43 +0300 Subject: [PATCH 01/50] Abomination rework and predator plasma rifle buff. (#5432) # About the pull request This pr intends to catch up predalien towards current gameplay by reworking a few abilities and adding new ones. # Explain why it's good for the game Currently the predalien has been untouched (practically) for over 3-4 years now, while being rare and decent enough to hold its own against current year marines and predators, its highly outdated. It's main power being "the gib" which is not fun for marines to be instantly removed from the game as most of the time you will be accompined by a queen and the entire hive. its not being fun being comboed into a queen screech + gib As their natural counter, the predators are currently lacking in a strong way to counter it, i believe the Plasma Rifle thats only available when an abomination is present is very weak, underpowered and generaly not that good. I can go into deeper details if anyone wants me to. So my natural response was to make it set people on fire because generally the predalien will be guarded by an entire hive. This will make it so that atleast the xenomorph hit, will have to back off allowing the predator to breathe. I havent touched the recharge rate because i think this incin bullet will be powerful enough to compensate for the low recharge rate, and only 16 shots (you need 14 dead on shots to kill an abomination, not counting its movement, phermones, and the entire hive guarding it.) below are all the changes ive decided to make; "Feral Frenzy" is a mashup of the old gut ability, it now has a toggle that lets you choose between AOE/SINGLE TARGET. I think this is a defining factor in predalien reworks, because currently it is too focused on fighting predators and not enough on marines. This will help you fend off against a marine group by letting you become devastating against grouped up marines. Or chosing to catch one by switching to single target since it has a root. (Also retaining its ability to fight off predators). "Feral Rush"; Feral rush incrases your armor and speed by a certain number, i wanted to add this instead of the useless pounce as i felt like the pounce was basically not providing you with anything other then just a distance closer, and it didnt fit in with the new gutting abilities, this way you can speed up, armor up and then go inside the marine force and do your aoe ability and get back out. This will ensure that you arent useless while going in since without the armor and speed, you will melt by the time you go in marine numbers, (also remember the AOE gut has a windup of 2 seconds.), The armor is removed 6 seconds after the slow (the speed lasts 3 seconds, so you're just armored for an extra 3 seconds) as to have that extra armor while retreating from more open places. "Stomp" ; the reason ive decided to remove this ability is it felt way out of place for this kit and just simply wasnt good enough (in my opinion) to being there although a slow or aoe root might be needed if this gets approval enough for gametesting. "Frenzy Smash" ; Grabs somebody by the leg and smashes them to the ground, this honestly just felt like a cool ability to add, it lets you keep somebody in place but also keep them moving, this is mostly a flair ability but still VERY deadly, may be buffed to make preds slower for a duration. deals 20 damage and scales with kills THIS IS ALL UP FOR DEBATE, AND I WOULD LIKE TO WATCH THIS ALL INGAME VIA ABOM EVENTS BY ADMINS IF THATS POSSIBLE. # Testing Photographs and Procedure
Screenshots & Videos https://github.com/cmss13-devs/cmss13/assets/47158596/f28a5048-701f-4b9d-a2bf-dd5dbc6d08be https://github.com/cmss13-devs/cmss13/assets/47158596/53da1e18-1a4a-49de-a73d-1ab7f1abb1d8 https://github.com/cmss13-devs/cmss13/assets/47158596/69eeb0e9-cbe6-4712-a15a-b599dbc56109
# Changelog :cl: add: Added a new ability to the predalien "Feral Rush" that increases it's armor and speed for a short duration. add: Added two new abilities to the predalien "Feral Frenzy" and a toggle. The predalien can now switch between a single target GUT and an AOE one, both of which has damage that scale with your kills. del: Removed the predaliens gib ability del: Removed the predaliens "pounce" ability del: Removed the predaliens "Ground Smash" ability balance: Predalien no longer has plasma costs, or plasma. balance: The Plasma Rifle, which is ONLY used to hunt abominations now has a higher ROF and has incin bullets. spellcheck: Re-wrote the predalien text to be more up to date and remove missinformation qol: Everyone can see how many kills the predalien has by examining it. add: Added a "Feral Smash" ability that lets you grab somebody and smash them to the ground, this scales with kills and is a devastating attack. balance: Removed screenshake from predalien's screech balance: Predalien removes fire stacks faster. fix: Girders are now slashable by very_sharp_claws instead of just having a queen chack /:cl: --------- Co-authored-by: InsaneRed Co-authored-by: Birdtalon Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- code/__DEFINES/xeno.dm | 3 + code/datums/ammo/energy.dm | 7 + code/modules/cm_preds/yaut_weapons.dm | 2 +- .../predalien/predalien_abilities.dm | 80 +++-- .../abilities/predalien/predalien_macros.dm | 35 +++ .../abilities/predalien/predalien_powers.dm | 283 +++++++++++++----- .../living/carbon/xenomorph/attack_alien.dm | 2 +- .../carbon/xenomorph/castes/Predalien.dm | 80 ++--- colonialmarines.dme | 1 + 9 files changed, 329 insertions(+), 164 deletions(-) create mode 100644 code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_macros.dm diff --git a/code/__DEFINES/xeno.dm b/code/__DEFINES/xeno.dm index 6f6e4eef7c20..fb9d6bfb4faf 100644 --- a/code/__DEFINES/xeno.dm +++ b/code/__DEFINES/xeno.dm @@ -62,6 +62,9 @@ #define ACID_SPRAY_LINE 0 #define ACID_SPRAY_CONE 1 +/// Defines for Abomination ability /datum/action/xeno_action/activable/feralfrenzy +#define SINGLETARGETGUT 0 +#define AOETARGETGUT 1 #define WARDEN_HEAL_SHIELD 0 #define WARDEN_HEAL_HP 1 diff --git a/code/datums/ammo/energy.dm b/code/datums/ammo/energy.dm index 16cbab378438..1f48806d2d52 100644 --- a/code/datums/ammo/energy.dm +++ b/code/datums/ammo/energy.dm @@ -230,3 +230,10 @@ var/mob/living/carbon/xenomorph/xeno = hit_mob xeno.apply_damage(damage * 0.75, BURN) xeno.interference = 30 + +/datum/ammo/energy/yautja/rifle/bolt/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 9cb8a8bef3fc..34233f2ee9cd 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -938,7 +938,7 @@ /obj/item/weapon/gun/energy/yautja/plasmarifle/set_gun_config_values() ..() - set_fire_delay(FIRE_DELAY_TIER_6*2) + set_fire_delay(FIRE_DELAY_TIER_4*2) accuracy_mult = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_10 accuracy_mult_unwielded = BASE_ACCURACY_MULT + HIT_ACCURACY_MULT_TIER_10 scatter = SCATTER_AMOUNT_TIER_6 diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_abilities.dm index aa98f063b8d5..b1358e30c26b 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_abilities.dm @@ -1,14 +1,22 @@ -/datum/action/xeno_action/activable/pounce/predalien - name = "Leap" + +/datum/action/xeno_action/onclick/feralrush + name = "Feral Rush" + action_icon_state = "charge_spit" + ability_name = "toughen up" + macro_path = /datum/action/xeno_action/verb/verb_feralrush ability_primacy = XENO_PRIMARY_ACTION_1 + action_type = XENO_ACTION_ACTIVATE + xeno_cooldown = 12 SECONDS + + // Config + var/speed_duration = 3 SECONDS + var/armor_duration = 6 SECONDS + var/speed_buff_amount = 0.8 // Go from shit slow to kindafast + var/armor_buff_amount = 10 // hopefully-minor buff so they can close the distance - knockdown = FALSE + var/speed_buff = FALSE + var/armor_buff = FALSE - distance = 5 - knockdown = FALSE // Should we knock down the target? - slash = FALSE // Do we slash upon reception? - freeze_self = FALSE // Should we freeze ourselves after the lunge? - should_destroy_objects = TRUE // Only used for ravager charge /datum/action/xeno_action/onclick/predalien_roar name = "Roar" @@ -16,37 +24,53 @@ ability_name = "roar" action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_2 + macro_path = /datum/action/xeno_action/verb/verb_predalien_roar xeno_cooldown = 25 SECONDS - plasma_cost = 50 - var/predalien_roar = list("sound/voice/predalien_roar.ogg") var/bonus_damage_scale = 2.5 var/bonus_speed_scale = 0.05 -/datum/action/xeno_action/onclick/smash - name = "Smash" - action_icon_state = "stomp" - ability_name = "smash" +/datum/action/xeno_action/activable/feral_smash + name = "Feral Smash" + ability_name = "Feral Smash" + action_icon_state = "lunge" action_type = XENO_ACTION_CLICK + macro_path = /datum/action/xeno_action/verb/feral_smash ability_primacy = XENO_PRIMARY_ACTION_3 xeno_cooldown = 20 SECONDS - plasma_cost = 80 - - var/freeze_duration = 1.5 SECONDS - var/activation_delay = 1 SECONDS - var/smash_sounds = list('sound/effects/alien_footstep_charge1.ogg', 'sound/effects/alien_footstep_charge2.ogg', 'sound/effects/alien_footstep_charge3.ogg') + // Configurables + var/grab_range = 4 + var/click_miss_cooldown = 15 + var/twitch_message_cooldown = 0 //apparently this is necessary for a tiny code that makes the lunge message on cooldown not be spammable, doesn't need to be big so 5 will do. + var/smash_damage = 20 + var/smash_scale = 10 + var/stun_duration = 2 SECONDS -/datum/action/xeno_action/activable/devastate - name = "Devastate" - action_icon_state = "gut" - ability_name = "devastate" +/datum/action/xeno_action/activable/feralfrenzy + name = "Feral Frenzy" + action_icon_state = "rav_eviscerate" + ability_name = "Feral Frenzy" action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_4 - xeno_cooldown = 20 SECONDS - plasma_cost = 110 - - var/activation_delay = 1 SECONDS + macro_path = /datum/action/xeno_action/verb/verb_feralfrenzy + xeno_cooldown = 15 SECONDS + //AOE + var/activation_delay_aoe = 1 SECONDS + var/base_damage_aoe = 15 + var/damage_scale_aoe = 10 + //SINGLE TARGET + var/activation_delay = 0.5 SECONDS var/base_damage = 25 - var/damage_scale = 10 // How much it scales by every kill + var/damage_scale = 10 + var/targeting = SINGLETARGETGUT + /// The orange used for a AOETARGETGUT + var/range = 2 + +/datum/action/xeno_action/onclick/toggle_gut_targeting + name = "Toggle Gutting Type" + action_icon_state = "gut" // starting targetting is SINGLETARGETGUT + macro_path = /datum/action/xeno_action/verb/verb_toggle_gut_targeting + action_type = XENO_ACTION_ACTIVATE + ability_primacy = XENO_PRIMARY_ACTION_5 diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_macros.dm b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_macros.dm new file mode 100644 index 000000000000..450a0ac67745 --- /dev/null +++ b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_macros.dm @@ -0,0 +1,35 @@ +/datum/action/xeno_action/verb/verb_feralfrenzy() + set category = "Alien" + set name = "Feral Frenzy" + set hidden = TRUE + var/action_name = "Feral Frenzy" + handle_xeno_macro(src, action_name) + +/datum/action/xeno_action/verb/verb_toggle_gut_targeting() + set category = "Alien" + set name = "Toggle Gutting Type" + set hidden = TRUE + var/action_name = "Toggle Gutting Type" + handle_xeno_macro(src, action_name) + + +/datum/action/xeno_action/verb/verb_feralrush() + set category = "Alien" + set name = "Feral Rush" + set hidden = TRUE + var/action_name = "Feral Rush" + handle_xeno_macro(src, action_name) + +/datum/action/xeno_action/verb/verb_predalien_roar() + set category = "Alien" + set name = "Predalien Roar" + set hidden = TRUE + var/action_name = "Roar" + handle_xeno_macro(src, action_name) + +/datum/action/xeno_action/verb/feral_smash() + set category = "Alien" + set name = "Feral Smash" + set hidden = TRUE + var/action_name = "Feral Smash" + handle_xeno_macro(src, action_name) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm index cdf0d3840084..6e6fef86a2f4 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm @@ -1,13 +1,10 @@ -/datum/action/xeno_action/activable/pounce/predalien/pre_pounce_effects() - playsound(owner, 'sound/voice/predalien_pounce.ogg', 75, 0, status = 0) - /datum/action/xeno_action/onclick/predalien_roar/use_ability(atom/target) var/mob/living/carbon/xenomorph/xeno = owner - if (!action_cooldown_check()) + if(!action_cooldown_check()) return - if (!xeno.check_state()) + if(!xeno.check_state()) return if(!check_and_use_plasma_owner()) @@ -34,124 +31,258 @@ continue new /datum/effects/xeno_buff(carbon, xeno, ttl = (0.25 SECONDS * behavior.kills + 3 SECONDS), bonus_damage = bonus_damage_scale * behavior.kills, bonus_speed = (bonus_speed_scale * behavior.kills)) - - for(var/mob/M in view(xeno)) - if(M && M.client) - shake_camera(M, 10, 1) - apply_cooldown() return ..() -/datum/action/xeno_action/onclick/smash/use_ability(atom/target) +/datum/action/xeno_action/activable/feralfrenzy/use_ability(atom/target) var/mob/living/carbon/xenomorph/xeno = owner - - if (!action_cooldown_check()) + if(!action_cooldown_check() || xeno.action_busy) + return + if(!xeno.check_state()) return - if (!xeno.check_state()) + var/datum/behavior_delegate/predalien_base/predalienbehavior = xeno.behavior_delegate + if(!istype(predalienbehavior)) return + if(targeting == AOETARGETGUT) + xeno.visible_message(SPAN_XENOHIGHDANGER("[xeno] begins digging in for a massive strike!"), SPAN_XENOHIGHDANGER("We begin digging in for a massive strike!")) + ADD_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Eviscerate")) + xeno.anchored = TRUE + if (do_after(xeno, (activation_delay_aoe), INTERRUPT_ALL | BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) + xeno.emote("roar") + xeno.spin_circle() + + for (var/mob/living/carbon/carbon in orange(xeno, range)) + if(!isliving(carbon) || xeno.can_not_harm(carbon)) + continue + + if (carbon.stat == DEAD) + continue + + if(!check_clear_path_to_target(xeno, carbon)) + continue + + xeno.visible_message(SPAN_XENOHIGHDANGER("[xeno] rips open the guts of [carbon]!"), SPAN_XENOHIGHDANGER("We rip open the guts of [carbon]!")) + carbon.spawn_gibs() + xeno.animation_attack_on(carbon) + xeno.spin_circle() + xeno.flick_attack_overlay(carbon, "tail") + playsound(get_turf(carbon), 'sound/effects/gibbed.ogg', 30, 1) + carbon.apply_effect(get_xeno_stun_duration(carbon, 0.5), WEAKEN) + playsound(get_turf(carbon), "alien_claw_flesh", 30, 1) + carbon.apply_armoured_damage(get_xeno_damage_slash(carbon, base_damage_aoe + damage_scale_aoe * predalienbehavior.kills), ARMOR_MELEE, BRUTE, "chest", 20) + playsound(owner, 'sound/voice/predalien_death.ogg', 75, 0, status = 0) + REMOVE_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Eviscerate")) + xeno.anchored = FALSE + apply_cooldown() + return ..() - var/datum/behavior_delegate/predalien_base/behavior = xeno.behavior_delegate - if(!istype(behavior)) + //single target checks + if(xeno.can_not_harm(target)) + to_chat(xeno, SPAN_XENOWARNING("We must target a hostile!")) return - if(!check_plasma_owner()) + if(!isliving(target)) return - if(!do_after(xeno, activation_delay, INTERRUPT_ALL, BUSY_ICON_GENERIC)) - to_chat(xeno, "Keep still whilst trying to smash into the ground") + if(get_dist_sqrd(target, xeno) > 2) + to_chat(xeno, SPAN_XENOWARNING("[target] is too far away!")) + return - var/real_cooldown = xeno_cooldown + var/mob/living/carbon/carbon = target - xeno_cooldown = 3 SECONDS + if(carbon.stat == DEAD) + to_chat(xeno, SPAN_XENOWARNING("[carbon] is dead, why would we want to touch them?")) + return + if(targeting == SINGLETARGETGUT) // single target + ADD_TRAIT(carbon, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Devastate")) apply_cooldown() - xeno_cooldown = real_cooldown + + ADD_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Devastate")) + xeno.anchored = TRUE + + if(do_after(xeno, activation_delay, INTERRUPT_ALL | BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) + xeno.visible_message(SPAN_XENOHIGHDANGER("[xeno] rips open the guts of [carbon]!"), SPAN_XENOHIGHDANGER("We rapidly slice into [carbon]!")) + carbon.spawn_gibs() + playsound(get_turf(carbon), 'sound/effects/gibbed.ogg', 50, 1) + carbon.apply_effect(get_xeno_stun_duration(carbon, 0.5), WEAKEN) + carbon.apply_armoured_damage(get_xeno_damage_slash(carbon, base_damage + damage_scale * predalienbehavior.kills), ARMOR_MELEE, BRUTE, "chest", 20) + + xeno.animation_attack_on(carbon) + xeno.spin_circle() + xeno.flick_attack_overlay(carbon, "tail") + + playsound(owner, 'sound/voice/predalien_growl.ogg', 50, 0, status = 0) + + REMOVE_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Devastate")) + xeno.anchored = FALSE + unroot_human(carbon, TRAIT_SOURCE_ABILITY("Devastate")) + + return ..() + + +/datum/action/xeno_action/onclick/feralrush/use_ability(atom/A) + var/mob/living/carbon/xenomorph/predatoralien = owner + + if(!action_cooldown_check()) + return + + if(!istype(predatoralien) || !predatoralien.check_state()) + return + + if(armor_buff && speed_buff) + to_chat(predatoralien, SPAN_XENOHIGHDANGER("We cannot stack this!")) return if(!check_and_use_plasma_owner()) return - playsound(xeno.loc, pick(smash_sounds), 50, 0, status = 0) - xeno.visible_message(SPAN_XENOHIGHDANGER("[xeno] smashes into the ground!")) - xeno.create_stomp() + addtimer(CALLBACK(src, PROC_REF(remove_rush_effects)), speed_duration) + addtimer(CALLBACK(src, PROC_REF(remove_armor_effects)), armor_duration) // calculate armor and speed differently, so it's a bit more armored while trying to get out + predatoralien.add_filter("predalien_toughen", 1, list("type" = "outline", "color" = "#421313", "size" = 1)) + to_chat(predatoralien, SPAN_XENOWARNING("We feel our muscles tense as our speed and armor increase!")) + speed_buff = TRUE + armor_buff = TRUE + predatoralien.speed_modifier -= speed_buff_amount + predatoralien.armor_modifier += armor_buff_amount + predatoralien.recalculate_speed() + predatoralien.recalculate_armor() + playsound(predatoralien, 'sound/voice/predalien_growl.ogg', 75, 0, status = 0) + apply_cooldown() - for(var/mob/living/carbon/carbon in oview(round(behavior.kills * 0.5 + 2), xeno)) - if(!xeno.can_not_harm(carbon) && carbon.stat != DEAD) - ADD_TRAIT(carbon, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Smash")) - if (ishuman(carbon)) - var/mob/living/carbon/human/human = carbon - human.update_xeno_hostile_hud() +/datum/action/xeno_action/onclick/feralrush/proc/remove_rush_effects() + SIGNAL_HANDLER + var/mob/living/carbon/xenomorph/predatoralien = owner + if(speed_buff == TRUE) + to_chat(predatoralien, SPAN_XENOWARNING("Our muscles relax as we feel our speed wane.")) + predatoralien.remove_filter("predalien_toughen") + predatoralien.speed_modifier += speed_buff_amount + predatoralien.recalculate_speed() + speed_buff = FALSE - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(unroot_human), carbon, TRAIT_SOURCE_ABILITY("Smash")), get_xeno_stun_duration(carbon, freeze_duration)) +/datum/action/xeno_action/onclick/feralrush/proc/remove_armor_effects() + SIGNAL_HANDLER + var/mob/living/carbon/xenomorph/predatoralien = owner + if(armor_buff) + to_chat(predatoralien, SPAN_XENOWARNING("We are no longer armored.")) + predatoralien.armor_modifier -= armor_buff_amount + predatoralien.recalculate_armor() + armor_buff = FALSE - for(var/mob/M in view(xeno)) - if(M && M.client) - shake_camera(M, 0.2 SECONDS, 1) - apply_cooldown() - return ..() +/datum/action/xeno_action/onclick/toggle_gut_targeting/use_ability(atom/A) -/datum/action/xeno_action/activable/devastate/use_ability(atom/target) var/mob/living/carbon/xenomorph/xeno = owner + var/action_icon_result - if (!action_cooldown_check()) + if(!xeno.check_state()) return - if (!xeno.check_state()) + var/datum/action/xeno_action/activable/feralfrenzy/guttype = get_xeno_action_by_type(xeno, /datum/action/xeno_action/activable/feralfrenzy) + if(!guttype) return - if (!isxeno_human(target) || xeno.can_not_harm(target)) - to_chat(xeno, SPAN_XENOWARNING("We must target a hostile!")) - return + if(guttype.targeting == SINGLETARGETGUT) + action_icon_result = "rav_scissor_cut" + guttype.targeting = AOETARGETGUT + to_chat(xeno, SPAN_XENOWARNING("We will now attack everyone around us during a Feral Frenzy.")) + else + action_icon_result = "gut" + guttype.targeting = SINGLETARGETGUT + to_chat(xeno, SPAN_XENOWARNING("We will now focus our Feral Frenzy on one person!")) + + button.overlays.Cut() + button.overlays += image('icons/mob/hud/actions_xeno.dmi', button, action_icon_result) + return ..() - if (get_dist_sqrd(target, xeno) > 2) - to_chat(xeno, SPAN_XENOWARNING("[target] is too far away!")) - return +/datum/action/xeno_action/activable/feral_smash/use_ability(atom/affected_atom) + var/mob/living/carbon/xenomorph/predalien_smash = owner + var/datum/behavior_delegate/predalien_base/predalienbehavior = predalien_smash.behavior_delegate - var/mob/living/carbon/carbon = target + if(!action_cooldown_check()) + if(twitch_message_cooldown < world.time ) + predalien_smash.visible_message(SPAN_XENOWARNING("[predalien_smash]'s muscles twitch."), SPAN_XENOWARNING("Our claws twitch as we try to grab onto the target but lack the strength. Wait a moment to try again.")) + twitch_message_cooldown = world.time + 5 SECONDS + return //this gives a little feedback on why your lunge didn't hit other than the lunge button going grey. Plus, it might spook marines that almost got lunged if they know why the message appeared, and extra spookiness is always good. - if (carbon.stat == DEAD) - to_chat(xeno, SPAN_XENOWARNING("[carbon] is dead, why would we want to touch them?")) + if(!affected_atom) return - var/datum/behavior_delegate/predalien_base/behavior = xeno.behavior_delegate - if(!istype(behavior)) + if(!isturf(predalien_smash.loc)) + to_chat(predalien_smash, SPAN_XENOWARNING("We can't lunge from here!")) return - if (!check_and_use_plasma_owner()) + if(!predalien_smash.check_state() || predalien_smash.agility) return - ADD_TRAIT(carbon, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Devastate")) - - if (ishuman(carbon)) - var/mob/living/carbon/human/human = carbon - human.update_xeno_hostile_hud() - - apply_cooldown() - - ADD_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Devastate")) - xeno.anchored = TRUE + if(predalien_smash.can_not_harm(affected_atom) || !ismob(affected_atom)) + apply_cooldown_override(click_miss_cooldown) + return - if (do_after(xeno, activation_delay, INTERRUPT_ALL | BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE)) - xeno.visible_message(SPAN_XENOHIGHDANGER("[xeno] rips open the guts of [carbon]!"), SPAN_XENOHIGHDANGER("We rip open the guts of [carbon]!")) - carbon.spawn_gibs() - playsound(get_turf(carbon), 'sound/effects/gibbed.ogg', 75, 1) - carbon.apply_effect(get_xeno_stun_duration(carbon, 0.5), WEAKEN) - carbon.apply_armoured_damage(get_xeno_damage_slash(carbon, base_damage + damage_scale * behavior.kills), ARMOR_MELEE, BRUTE, "chest", 20) - xeno.animation_attack_on(carbon) - xeno.spin_circle() - xeno.flick_attack_overlay(carbon, "tail") + var/mob/living/carbon/carbon = affected_atom + if(carbon.stat == DEAD) + return - playsound(owner, 'sound/voice/predalien_growl.ogg', 75, 0, status = 0) + if(!isliving(affected_atom)) + return - REMOVE_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Devastate")) - xeno.anchored = FALSE - unroot_human(carbon, TRAIT_SOURCE_ABILITY("Devastate")) + if(!check_and_use_plasma_owner()) + return - xeno.visible_message(SPAN_XENODANGER("[xeno] rapidly slices into [carbon]!")) + apply_cooldown() + predalien_smash.throw_atom(get_step_towards(affected_atom, predalien_smash), grab_range, SPEED_FAST, predalien_smash) + + if(predalien_smash.Adjacent(carbon) && predalien_smash.start_pulling(carbon, TRUE)) + playsound(carbon.pulledby, 'sound/voice/predalien_growl.ogg', 75, 0, status = 0) // bang and roar for dramatic effect + playsound(carbon, 'sound/effects/bang.ogg', 25, 0) + animate(carbon, pixel_y = carbon.pixel_y + 32, time = 4, easing = SINE_EASING) + sleep(4) + playsound(carbon, 'sound/effects/bang.ogg', 25, 0) + playsound(carbon,"slam", 50, 1) + animate(carbon, pixel_y = 0, time = 4, easing = BOUNCE_EASING) //animates the smash + carbon.apply_armoured_damage(get_xeno_damage_slash(carbon, smash_damage + smash_scale * predalienbehavior.kills), ARMOR_MELEE, BRUTE, "chest", 20) + else + predalien_smash.visible_message(SPAN_XENOWARNING("[predalien_smash]'s claws twitch."), SPAN_XENOWARNING("We couldn't grab our target. Wait a moment to try again.")) + + return TRUE + +/mob/living/carbon/xenomorph/predalien/stop_pulling() + if(isliving(pulling) && smashing) + smashing = FALSE // To avoid extreme cases of stopping a lunge then quickly pulling and stopping to pull someone else + var/mob/living/smashed = pulling + smashed.set_effect(0, STUN) + smashed.set_effect(0, WEAKEN) return ..() + +/mob/living/carbon/xenomorph/predalien/start_pulling(atom/movable/movable_atom, feral_smash) + if(!check_state()) + return FALSE + + if(!isliving(movable_atom)) + return FALSE + var/mob/living/living_mob = movable_atom + var/should_neckgrab = !(src.can_not_harm(living_mob)) && feral_smash + + + . = ..(living_mob, feral_smash, should_neckgrab) + + if(.) //successful pull + if(isxeno(living_mob)) + var/mob/living/carbon/xenomorph/xeno = living_mob + if(xeno.tier >= 2) // Tier 2 castes or higher immune to warrior grab stuns + return + + if(should_neckgrab && living_mob.mob_size < MOB_SIZE_BIG) + visible_message(SPAN_XENOWARNING("[src] grabs [living_mob] by the back of their leg and slams them onto the ground!"), \ + SPAN_XENOWARNING("We grab [living_mob] by the back of their leg and slam them onto the ground!")) // more flair + smashing = TRUE + living_mob.drop_held_items() + var/duration = get_xeno_stun_duration(living_mob, 1) + living_mob.KnockDown(duration) + living_mob.Stun(duration) + addtimer(VARSET_CALLBACK(src, smashing, FALSE), duration) diff --git a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm index 2aefff19c684..9f42f8ae8928 100644 --- a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm +++ b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm @@ -911,7 +911,7 @@ return XENO_ATTACK_ACTION /obj/structure/girder/attack_alien(mob/living/carbon/xenomorph/M) - if((M.caste && M.caste.tier < 2 && !isqueen(M)) || unacidable) + if((M.caste && M.caste.tier < 2 && M.claw_type < CLAW_TYPE_VERY_SHARP) || unacidable) to_chat(M, SPAN_WARNING("Our claws aren't sharp enough to damage [src].")) return XENO_NO_DELAY_ACTION M.animation_attack_on(src) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm b/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm index ebae6f56830f..841675234e63 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm @@ -6,8 +6,7 @@ melee_damage_upper = XENO_DAMAGE_TIER_5 melee_vehicle_damage = XENO_DAMAGE_TIER_5 max_health = XENO_HEALTH_TIER_9 - plasma_gain = XENO_PLASMA_GAIN_TIER_9 - plasma_max = XENO_PLASMA_TIER_3 + plasma_max = XENO_NO_PLASMA xeno_explosion_resistance = XENO_EXPLOSIVE_ARMOR_TIER_10 armor_deflection = XENO_ARMOR_TIER_3 evasion = XENO_EVASION_NONE @@ -41,6 +40,7 @@ speaking_noise = 'sound/voice/predalien_click.ogg' plasma_types = list(PLASMA_CATECHOLAMINE) faction = FACTION_PREDALIEN + claw_type = CLAW_TYPE_VERY_SHARP wall_smash = TRUE hardcore = FALSE pixel_x = -16 @@ -56,18 +56,19 @@ /datum/action/xeno_action/onclick/regurgitate, /datum/action/xeno_action/watch_xeno, /datum/action/xeno_action/activable/tail_stab, - /datum/action/xeno_action/activable/pounce/predalien, + /datum/action/xeno_action/onclick/feralrush, /datum/action/xeno_action/onclick/predalien_roar, - /datum/action/xeno_action/onclick/smash, - /datum/action/xeno_action/activable/devastate, + /datum/action/xeno_action/activable/feral_smash, + /datum/action/xeno_action/activable/feralfrenzy, + /datum/action/xeno_action/onclick/toggle_gut_targeting, /datum/action/xeno_action/onclick/tacmap, ) weed_food_icon = 'icons/mob/xenos/weeds_64x64.dmi' weed_food_states = list("Predalien_1","Predalien_2","Predalien_3") weed_food_states_flipped = list("Predalien_1","Predalien_2","Predalien_3") + var/smashing = FALSE - var/butcher_time = 6 SECONDS /mob/living/carbon/xenomorph/predalien/Initialize(mapload, mob/living/carbon/xenomorph/oldxeno, h_number) @@ -86,15 +87,20 @@ to_chat(src, {" |______________________| -You are a predator-alien hybrid! -You are a very powerful xenomorph creature that was born of a Yautja warrior body. -You are stronger, faster, and smarter than a regular xenomorph, but you must still listen to the queen. -You have a degree of freedom to where you can hunt and claim the heads of the hive's enemies, so check your verbs. -Your health meter will not regenerate normally, so kill and die for the hive! +You are a yautja-alien hybrid! +You are a xenomorph born from the body of your natural enemy, you are considered an abomination to all of the yautja race and they will do WHATEVER it takes to kill you. +However, being born from one you also harbor their intelligence and strength. You are built to be able to take them on but that does not mean you are invincible. Stay with your hive and overwhelm them with your numbers. Your sisters have sacrificed a lot for you; Do not just wander off and die. +You must still listen to the queen. + |______________________| "}) emote("roar") + +/mob/living/carbon/xenomorph/predalien/resist_fire() + ..() + SetKnockDown(0.1 SECONDS) + /datum/behavior_delegate/predalien_base name = "Base Predalien Behavior Delegate" @@ -118,53 +124,11 @@ Your health meter will not regenerate normally, so kill and die for the hive! Date: Thu, 22 Feb 2024 09:27:12 +0000 Subject: [PATCH 02/50] Automatic changelog for PR #5432 [ci skip] --- html/changelogs/AutoChangeLog-pr-5432.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5432.yml diff --git a/html/changelogs/AutoChangeLog-pr-5432.yml b/html/changelogs/AutoChangeLog-pr-5432.yml new file mode 100644 index 000000000000..73d5a2476ff2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5432.yml @@ -0,0 +1,16 @@ +author: "InsaneRed" +delete-after: True +changes: + - rscadd: "Added a new ability to the predalien \"Feral Rush\" that increases it's armor and speed for a short duration." + - rscadd: "Added two new abilities to the predalien \"Feral Frenzy\" and a toggle. The predalien can now switch between a single target GUT and an AOE one, both of which has damage that scale with your kills." + - rscdel: "Removed the predaliens gib ability" + - rscdel: "Removed the predaliens \"pounce\" ability" + - rscdel: "Removed the predaliens \"Ground Smash\" ability" + - balance: "Predalien no longer has plasma costs, or plasma." + - balance: "The Plasma Rifle, which is ONLY used to hunt abominations now has a higher ROF and has incin bullets." + - spellcheck: "Re-wrote the predalien text to be more up to date and remove missinformation" + - qol: "Everyone can see how many kills the predalien has by examining it." + - rscadd: "Added a \"Feral Smash\" ability that lets you grab somebody and smash them to the ground, this scales with kills and is a devastating attack." + - balance: "Removed screenshake from predalien's screech" + - balance: "Predalien removes fire stacks faster." + - bugfix: "Girders are now slashable by very_sharp_claws instead of just having a queen chack" \ No newline at end of file From 1675e4eeb90fd4051de60688c6d6c5e24dec555b Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Thu, 22 Feb 2024 10:05:18 +0000 Subject: [PATCH 03/50] Fixes xeno tacklestrength (#5773) # About the pull request Fixes #5765. This was caused by me in #5542 deleting a couple of lines from `/mob/living/carbon/xenomorph/proc/recalculate_tackle()`, when I should have only removed the `mutators`/`hive.mutators` part. ![image](https://github.com/cmss13-devs/cmss13/assets/57483089/b54a3e03-03cd-49a3-a093-ab0765059a7b) # Explain why it's good for the game Whoops # Testing Photographs and Procedure
Screenshots & Videos `tacklestrength_min` and `tacklestrength_max` are being applied correctly: ![image](https://github.com/cmss13-devs/cmss13/assets/57483089/8404ddf3-17e0-42a5-a3cf-91a85beb1e50)
# Changelog :cl: fix: Fixed Xenomorphs not having their caste's tackle duration values applied to them. /:cl: --- code/modules/mob/living/carbon/xenomorph/Xenomorph.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm index c8d3df91c975..03ba544be6b8 100644 --- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm +++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm @@ -839,6 +839,8 @@ tackle_min = caste.tackle_min tackle_max = caste.tackle_max tackle_chance = caste.tackle_chance + tackle_chance_modifier + tacklestrength_min = caste.tacklestrength_min + tacklestrength_max = caste.tacklestrength_max /mob/living/carbon/xenomorph/proc/recalculate_health() var/new_max_health = nocrit ? health_modifier + maxHealth : health_modifier + caste.max_health From 1e7703b5d2072129b3c7a4e076d289f3a6893a7c Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 22 Feb 2024 10:14:28 +0000 Subject: [PATCH 04/50] Automatic changelog for PR #5773 [ci skip] --- html/changelogs/AutoChangeLog-pr-5773.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5773.yml diff --git a/html/changelogs/AutoChangeLog-pr-5773.yml b/html/changelogs/AutoChangeLog-pr-5773.yml new file mode 100644 index 000000000000..702fda68396b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5773.yml @@ -0,0 +1,4 @@ +author: "SabreML" +delete-after: True +changes: + - bugfix: "Fixed Xenomorphs not having their caste's tackle duration values applied to them." \ No newline at end of file From d72106f7735d71b1a90c817f7c6edc60b664c284 Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Thu, 22 Feb 2024 10:16:11 +0000 Subject: [PATCH 05/50] TGUI input list search fix (#5775) # About the pull request Fixes the search function of `tgui_input_list`, and also makes the search bar automatically focus when toggled. This was caused by the same issue as #5581. # Explain why it's good for the game Bugfix, and a little QOL thing. # Testing Photographs and Procedure
Screenshots & Videos ('Teleport to Area' menu as an example, but it's the same on any others.) **Before:** https://github.com/cmss13-devs/cmss13/assets/57483089/8450adef-38f4-4ae4-963a-11533a328841 **After:** https://github.com/cmss13-devs/cmss13/assets/57483089/ede80ffa-7ce6-47c9-9711-a5f29560d1bd
# Changelog :cl: fix: Fixed the search function of TGUI input lists. qol: Made the TGUI input list search bar automatically focus when toggled. /:cl: --- tgui/packages/tgui/interfaces/ListInput.jsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tgui/packages/tgui/interfaces/ListInput.jsx b/tgui/packages/tgui/interfaces/ListInput.jsx index 2ed72bcc63bf..324e1f6b64fe 100644 --- a/tgui/packages/tgui/interfaces/ListInput.jsx +++ b/tgui/packages/tgui/interfaces/ListInput.jsx @@ -123,9 +123,9 @@ export const ListInput = (props) => { }} /> }> - {displayedArray.map((button) => ( + {displayedArray.map((button, i) => ( ); }; diff --git a/tgui/packages/tgui/components/Button.jsx b/tgui/packages/tgui/components/Button.jsx index 4264b0767115..dbffb6a72c95 100644 --- a/tgui/packages/tgui/components/Button.jsx +++ b/tgui/packages/tgui/components/Button.jsx @@ -172,6 +172,9 @@ export class ButtonConfirm extends Component { } else { window.removeEventListener('click', this.handleClick); } + if (this.props.onConfirmChange) { + this.props.onConfirmChange(clickedOnce); + } } render() { @@ -183,6 +186,7 @@ export class ButtonConfirm extends Component { color, content, onClick, + onConfirmChange, ...rest } = this.props; return ( diff --git a/tgui/packages/tgui/interfaces/PingRelaysPanel.jsx b/tgui/packages/tgui/interfaces/PingRelaysPanel.jsx new file mode 100644 index 000000000000..7b6c3016504e --- /dev/null +++ b/tgui/packages/tgui/interfaces/PingRelaysPanel.jsx @@ -0,0 +1,175 @@ +import { useBackend } from '../backend'; +import { round } from 'common/math'; +import { Box, Stack, Button, Icon, RoundGauge, Flex } from '../components'; +import { Window } from '../layouts'; +import { Color } from 'common/color'; +import { Ping } from 'common/ping'; +import { Component } from 'react'; + +const RED = new Color(220, 40, 40); + +export class PingResult { + constructor(desc = 'Loading...', url = '', ping = -1) { + this.desc = desc; + this.url = url; + this.ping = ping; + this.error = null; + } + + update = function (desc, url, ping, error) { + this.desc = desc; + this.url = url; + this.ping = ping; + this.error = error; + }; +} + +class PingApp extends Component { + constructor() { + super(); + + this.pinger = new Ping(); + this.results = new Array(); + this.state = { + currentIndex: 0, + lastClickedIndex: 0, + lastClickedState: false, + }; + } + + startTest(desc, pingURL, connectURL) { + this.pinger.ping('http://' + pingURL, (error, pong) => { + this.results[this.state.currentIndex]?.update( + desc, + 'byond://' + connectURL, + round(pong * 0.75), // The ping is inflated so lets compensate a bit + error + ); + this.setState((prevState) => ({ + currentIndex: prevState.currentIndex + 1, + })); + }); + } + + handleConfirmChange(index, newState) { + if (newState || this.state.lastClickedIndex === index) { + this.setState({ lastClickedIndex: index }); + this.setState({ lastClickedState: newState }); + } + } + + componentDidMount() { + this.setState({ currentIndex: 0 }); + for (let i = 0; i < this.props.relayNames.length; i++) { + this.results.push(new PingResult()); + this.startTest( + this.props.relayNames[i], + this.props.relayPings[i], + this.props.relayCons[i] + ); + } + } + + componentWillUnmount() { + this.pinger.cancel(); + } + + render() { + const { act } = useBackend(); + + return ( + + {this.results.map((result, i) => ( + + + this.handleConfirmChange(i, clickedOnce) + } + onClick={() => + act('connect', { url: result.url, desc: result.desc }) + }> + {result.ping <= -1 && result.error === null && ( + + + + + + {result.desc} + + + + )} + {result.ping > -1 && result.error === null && ( + + + + + + + {this.state.lastClickedIndex === i && + this.state.lastClickedState + ? 'Connect via ' + result.desc + '?' + : result.desc} + + + + x + 'ms'} + inline + /> + + + )} + {result.error !== null && ( + + + + + + {result.desc} + + + + {' (' + result.error + ')'} + + + + )} + + + ))} + + ); + } +} + +export const PingRelaysPanel = () => { + const { data } = useBackend(); + const { relay_names, relay_pings, relay_cons } = data; + + return ( + + + + + + ); +}; From 159bc598426d8fc304d2826a633afd46f56cfada Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 24 Feb 2024 10:10:27 +0000 Subject: [PATCH 41/50] Automatic changelog for PR #5777 [ci skip] --- html/changelogs/AutoChangeLog-pr-5777.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5777.yml diff --git a/html/changelogs/AutoChangeLog-pr-5777.yml b/html/changelogs/AutoChangeLog-pr-5777.yml new file mode 100644 index 000000000000..fa3c5b3cbc0e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5777.yml @@ -0,0 +1,6 @@ +author: "Drathek" +delete-after: True +changes: + - ui: "Added the relay ping browser accessed by the tgchat ping to test and use alternative connections to the server" + - ui: "Added onConfirmChange prop to Button.Confirm component." + - config: "Added CONNECTION_RELAY_PING and CONNECTION_RELAY_CON in the relays.txt config that is optionally included in config.txt" \ No newline at end of file From 747b74de4d343d0465f2e01c3404771f2b8988e2 Mon Sep 17 00:00:00 2001 From: Julian56 <117036822+Huffie56@users.noreply.github.com> Date: Sat, 24 Feb 2024 21:20:07 +0100 Subject: [PATCH 42/50] Refactor marine_armor.dm and split it into multiples files. (#5740) # About the pull request 1-Refactor the marine_armor.dm file by splitting them into multiples files. 2-in marine_armor.dm i also remove a serie of duplicate declaration of the same items. # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: refactor: refactor marine_armor.dm and split it into multiples files. /:cl: --------- Co-authored-by: Julien Co-authored-by: SabreML <57483089+SabreML@users.noreply.github.com> --- code/modules/clothing/suits/marine_armor.dm | 2008 ----------------- .../suits/marine_armor/_marine_armor.dm | 669 ++++++ .../clothing/suits/marine_armor/ert.dm | 822 +++++++ .../clothing/suits/marine_armor/ghillie.dm | 162 ++ .../clothing/suits/marine_armor/intel.dm | 118 + .../suits/marine_armor/smartgunner.dm | 60 + .../clothing/suits/marine_armor/spec_fire.dm | 150 ++ colonialmarines.dme | 7 +- 8 files changed, 1987 insertions(+), 2009 deletions(-) delete mode 100644 code/modules/clothing/suits/marine_armor.dm create mode 100644 code/modules/clothing/suits/marine_armor/_marine_armor.dm create mode 100644 code/modules/clothing/suits/marine_armor/ert.dm create mode 100644 code/modules/clothing/suits/marine_armor/ghillie.dm create mode 100644 code/modules/clothing/suits/marine_armor/intel.dm create mode 100644 code/modules/clothing/suits/marine_armor/smartgunner.dm create mode 100644 code/modules/clothing/suits/marine_armor/spec_fire.dm diff --git a/code/modules/clothing/suits/marine_armor.dm b/code/modules/clothing/suits/marine_armor.dm deleted file mode 100644 index bc29b0a33570..000000000000 --- a/code/modules/clothing/suits/marine_armor.dm +++ /dev/null @@ -1,2008 +0,0 @@ -#define DEBUG_ARMOR_PROTECTION 0 - -#if DEBUG_ARMOR_PROTECTION -/mob/living/carbon/human/verb/check_overall_protection() - set name = "Get Armor Value" - set category = "Debug" - set desc = "Shows the armor value of the bullet category." - - var/armor = 0 - var/counter = 0 - for(var/X in H.limbs) - var/obj/limb/E = X - armor = getarmor_organ(E, ARMOR_BULLET) - to_chat(src, SPAN_DEBUG("[E.name] is protected with [armor] armor against bullets.")) - counter += armor - to_chat(src, SPAN_DEBUG("The overall armor score is: [counter].")) -#endif - -//=======================================================================\\ -//=======================================================================\\ - -#define ALPHA 1 -#define BRAVO 2 -#define CHARLIE 3 -#define DELTA 4 -#define ECHO 5 -#define CRYO 6 -#define SOF 7 -#define NOSQUAD 8 - -// MARINE STORAGE ARMOR - -/obj/item/clothing/suit/storage/marine - name = "\improper M3 pattern marine armor" - desc = "A standard Colonial Marines M3 Pattern Chestplate. Protects the chest from ballistic rounds, bladed objects and accidents. It has a small leather pouch strapped to it for limited storage." - icon = 'icons/obj/items/clothing/cm_suits.dmi' - icon_state = "1" - item_state = "marine_armor" //Make unique states for Officer & Intel armors. - item_icons = list( - WEAR_JACKET = 'icons/mob/humans/onmob/suit_1.dmi' - ) - flags_atom = FPRINT|CONDUCT - flags_inventory = BLOCKSHARPOBJ - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS - flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS - flags_heat_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS - min_cold_protection_temperature = HELMET_MIN_COLD_PROT - max_heat_protection_temperature = HELMET_MAX_HEAT_PROT - blood_overlay_type = "armor" - armor_melee = CLOTHING_ARMOR_MEDIUM - armor_bullet = CLOTHING_ARMOR_MEDIUM - armor_laser = CLOTHING_ARMOR_MEDIUMLOW - armor_energy = CLOTHING_ARMOR_NONE - armor_bomb = CLOTHING_ARMOR_MEDIUMLOW - armor_bio = CLOTHING_ARMOR_MEDIUM - armor_rad = CLOTHING_ARMOR_MEDIUMLOW - armor_internaldamage = CLOTHING_ARMOR_MEDIUM - movement_compensation = SLOWDOWN_ARMOR_LIGHT - storage_slots = 3 - siemens_coefficient = 0.7 - slowdown = SLOWDOWN_ARMOR_MEDIUM - allowed = list( - /obj/item/weapon/gun, - /obj/item/prop/prop_gun, - /obj/item/tank/emergency_oxygen, - /obj/item/device/flashlight, - /obj/item/storage/fancy/cigarettes, - /obj/item/tool/lighter, - /obj/item/storage/bible, - /obj/item/attachable/bayonet, - /obj/item/storage/backpack/general_belt, - /obj/item/storage/large_holster/machete, - /obj/item/storage/belt/gun/type47, - /obj/item/storage/belt/gun/m4a3, - /obj/item/storage/belt/gun/m44, - /obj/item/storage/belt/gun/smartpistol, - /obj/item/storage/belt/gun/flaregun, - /obj/item/device/motiondetector, - /obj/item/device/walkman, - /obj/item/storage/belt/gun/m39, - /obj/item/storage/belt/gun/xm51, - ) - valid_accessory_slots = list(ACCESSORY_SLOT_MEDAL, ACCESSORY_SLOT_PONCHO) - - light_power = 3 - light_range = 4 - light_system = MOVABLE_LIGHT - - var/flashlight_cooldown = 0 //Cooldown for toggling the light - var/locate_cooldown = 0 //Cooldown for SL locator - var/armor_overlays[] - actions_types = list(/datum/action/item_action/toggle) - var/flags_marine_armor = ARMOR_SQUAD_OVERLAY|ARMOR_LAMP_OVERLAY - var/specialty = "M3 pattern marine" //Same thing here. Give them a specialty so that they show up correctly in vendors. speciality does NOTHING if you have NO_NAME_OVERRIDE - w_class = SIZE_HUGE - uniform_restricted = list(/obj/item/clothing/under/marine) - sprite_sheets = list(SPECIES_MONKEY = 'icons/mob/humans/species/monkeys/onmob/suit_monkey_1.dmi') - time_to_unequip = 20 - time_to_equip = 20 - pickup_sound = "armorequip" - drop_sound = "armorequip" - equip_sounds = list('sound/handling/putting_on_armor1.ogg') - var/armor_variation = 0 - /// The dmi where the grayscale squad overlays are contained - var/squad_overlay_icon = 'icons/mob/humans/onmob/suit_1.dmi' - - var/atom/movable/marine_light/light_holder - -/obj/item/clothing/suit/storage/marine/Initialize(mapload) - . = ..() - if(!(flags_atom & NO_NAME_OVERRIDE)) - name = "[specialty]" - if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD]) - name += " snow armor" //Leave marine out so that armors don't have to have "Marine" appended (see: generals). - else - name += " armor" - - if(!(flags_atom & NO_SNOW_TYPE)) - select_gamemode_skin(type) - armor_overlays = list("lamp") //Just one for now, can add more later. - if(armor_variation && mapload) - set_armor_style("Random") - update_icon() - pockets.max_w_class = SIZE_SMALL //Can contain small items AND rifle magazines. - pockets.bypass_w_limit = list( - /obj/item/ammo_magazine/rifle, - /obj/item/ammo_magazine/smg, - /obj/item/ammo_magazine/sniper, - ) - pockets.max_storage_space = 8 - - light_holder = new(src) - -/obj/item/clothing/suit/storage/marine/Destroy() - QDEL_NULL(light_holder) - return ..() - -/obj/item/clothing/suit/storage/marine/update_icon(mob/user) - var/image/I - armor_overlays["lamp"] = null - if(flags_marine_armor & ARMOR_LAMP_OVERLAY) - if(flags_marine_armor & ARMOR_LAMP_ON) - I = image('icons/obj/items/clothing/cm_suits.dmi', src, "lamp-on") - else - I = image('icons/obj/items/clothing/cm_suits.dmi', src, "lamp-off") - armor_overlays["lamp"] = I - overlays += I - else armor_overlays["lamp"] = null - if(user) user.update_inv_wear_suit() - - -/obj/item/clothing/suit/storage/marine/post_vendor_spawn_hook(mob/living/carbon/human/user) //used for randomizing/selecting a variant for armors. - if(!armor_variation) - return - - if(user?.client?.prefs) - // Set the armor style to the user's preference. - set_armor_style(user.client.prefs.preferred_armor) - else - // Or if that isn't possible, just pick a random one. - set_armor_style("Random") - update_icon(user) - -/obj/item/clothing/suit/storage/marine/attack_self(mob/user) - ..() - - if(!isturf(user.loc)) - to_chat(user, SPAN_WARNING("You cannot turn the light [light_on ? "off" : "on"] while in [user.loc].")) //To prevent some lighting anomalies. - return - - if(flashlight_cooldown > world.time) - return - if(!ishuman(user)) - return - - var/mob/living/carbon/human/H = user - if(H.wear_suit != src) - return - - turn_light(user, !light_on) - -/obj/item/clothing/suit/storage/marine/item_action_slot_check(mob/user, slot) - if(!ishuman(user)) - return FALSE - if(slot != WEAR_JACKET) - return FALSE - return TRUE //only give action button when armor is worn. - -/obj/item/clothing/suit/storage/marine/turn_light(mob/user, toggle_on) - . = ..() - if(. != CHECKS_PASSED) - return - set_light_range(initial(light_range)) - set_light_power(Floor(initial(light_power) * 0.5)) - set_light_on(toggle_on) - flags_marine_armor ^= ARMOR_LAMP_ON - - light_holder.set_light_flags(LIGHT_ATTACHED) - light_holder.set_light_range(initial(light_range)) - light_holder.set_light_power(initial(light_power)) - light_holder.set_light_on(toggle_on) - - if(!toggle_on) - playsound(src, 'sound/handling/click_2.ogg', 50, 1) - - playsound(src, 'sound/handling/suitlight_on.ogg', 50, 1) - update_icon(user) - - for(var/X in actions) - var/datum/action/A = X - A.update_button_icon() - -/obj/item/clothing/suit/storage/marine/mob_can_equip(mob/living/carbon/human/M, slot, disable_warning = 0) - . = ..() - if (.) - if(issynth(M) && M.allow_gun_usage == FALSE && !(flags_marine_armor & SYNTH_ALLOWED)) - M.visible_message(SPAN_DANGER("Your programming prevents you from wearing this!")) - return 0 - -/** - * Updates the armor's `icon_state` to the style represented by `new_style`. - * - * Arguments: - * * new_style - The new armor style. May only be one of `GLOB.armor_style_list`'s keys, or `"Random"`. - */ -/obj/item/clothing/suit/storage/marine/proc/set_armor_style(new_style) - // Regex to match one or more digits. - var/static/regex/digits = new("\\d+") - // Integer for the new armor style's `icon_state`. - var/new_look - - if(new_style == "Random") - // The style icon states are all numbers between 1 and `armor_variation`, so this picks a random one. - new_look = rand(1, armor_variation) - else - new_look = GLOB.armor_style_list[new_style] - - // Replace the digits in the current icon state with `new_look`. (E.g. "L6" -> "L2") - icon_state = digits.Replace(icon_state, new_look) - -/obj/item/clothing/suit/storage/marine/medium/padded - name = "M3 pattern padded marine armor" - icon_state = "1" - specialty = "M3 pattern padded marine" - -/obj/item/clothing/suit/storage/marine/medium/padless - name = "M3 pattern padless marine armor" - icon_state = "2" - specialty = "M3 pattern padless marine" - -/obj/item/clothing/suit/storage/marine/medium/padless_lines - name = "M3 pattern ridged marine armor" - icon_state = "3" - specialty = "M3 pattern ridged marine" - -/obj/item/clothing/suit/storage/marine/medium/carrier - name = "M3 pattern carrier marine armor" - icon_state = "4" - specialty = "M3 pattern carrier marine" - -/obj/item/clothing/suit/storage/marine/medium/skull - name = "M3 pattern skull marine armor" - icon_state = "5" - specialty = "M3 pattern skull marine" - -/obj/item/clothing/suit/storage/marine/medium/smooth - name = "M3 pattern smooth marine armor" - icon_state = "6" - specialty = "M3 pattern smooth marine" - -/obj/item/clothing/suit/storage/marine/medium/rto - icon_state = "io" - 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 - storage_slots = 4 - light_range = 5 //slightly higher - specialty = "M4 pattern marine" - -/obj/item/clothing/suit/storage/marine/medium/rto/intel - name = "\improper XM4 pattern intelligence officer armor" - uniform_restricted = list(/obj/item/clothing/under/marine/officer/intel) - specialty = "XM4 pattern intel" - desc = "Tougher than steel, quieter than whispers, the XM4 Intel Armor provides capable protection combined with an experimental integrated motion tracker. It took an R&D team a weekend to develop and costs more than the Chinook Station... probably. When worn, uniform accessories such as webbing cannot be attached due to the motion sensors occupying the clips." - desc_lore = "ARMAT Perfection. The XM4 Soldier Awareness System mixes M4-style hard armor and a distributed series of motion sensors clipped onto the breastplate. When connected to any HUD optic, it replicates the effects of an M314 Motion Detector unit, increasing user situational awareness. It is currently undergoing field trials by intelligence operatives." - storage_slots = 5 - /// XM4 Integral Motion Detector Ability - actions_types = list(/datum/action/item_action/toggle, /datum/action/item_action/intel/toggle_motion_detector) - var/motion_detector = FALSE - var/obj/item/device/motiondetector/xm4/proximity - var/long_range_cooldown = 2 - var/recycletime = 120 - -/obj/item/clothing/suit/storage/marine/medium/rto/intel/Initialize(mapload, ...) - . = ..() - proximity = new(src) - update_icon() - -/datum/action/item_action/intel/action_activate() - if(!ishuman(owner)) - return - -/datum/action/item_action/intel/update_button_icon() - return - -/datum/action/item_action/intel/toggle_motion_detector/New(Target, obj/item/holder) - . = ..() - name = "Toggle Motion Detector" - action_icon_state = "motion_detector" - button.name = name - button.overlays.Cut() - button.overlays += image('icons/mob/hud/actions.dmi', button, action_icon_state) - -/datum/action/item_action/intel/toggle_motion_detector/action_activate() - . = ..() - var/obj/item/clothing/suit/storage/marine/medium/rto/intel/recon = holder_item - recon.toggle_motion_detector(owner) - -/datum/action/item_action/intel/toggle_motion_detector/proc/update_icon() - if(!holder_item) - return - var/obj/item/clothing/suit/storage/marine/medium/rto/intel/recon = holder_item - if(recon.motion_detector) - button.icon_state = "template_on" - else - button.icon_state = "template" - -/obj/item/clothing/suit/storage/marine/medium/rto/intel/process() - if(!motion_detector) - STOP_PROCESSING(SSobj, src) - if(motion_detector) - recycletime-- - if(!recycletime) - recycletime = initial(recycletime) - proximity.refresh_blip_pool() - long_range_cooldown-- - if(long_range_cooldown) - return - long_range_cooldown = initial(long_range_cooldown) - proximity.scan() - -/obj/item/clothing/suit/storage/marine/medium/rto/intel/proc/toggle_motion_detector(mob/user) - to_chat(user,SPAN_NOTICE("You [motion_detector? "disable" : "enable"] \the [src]'s motion detector.")) - if(!motion_detector) - playsound(loc,'sound/items/detector_turn_on.ogg', 25, 1) - else - playsound(loc,'sound/items/detector_turn_off.ogg', 25, 1) - motion_detector = !motion_detector - var/datum/action/item_action/intel/toggle_motion_detector/TMD = locate(/datum/action/item_action/intel/toggle_motion_detector) in actions - TMD.update_icon() - motion_detector() - -/obj/item/clothing/suit/storage/marine/medium/rto/intel/proc/motion_detector() - if(motion_detector) - START_PROCESSING(SSobj, src) - else - STOP_PROCESSING(SSobj, src) - -/obj/item/clothing/suit/storage/marine/medium/rto/intel/mob_can_equip(mob/living/carbon/human/user, slot, disable_warning) //Thanks to Drathek for the help on this part! - if(!..()) - return FALSE - - // Only equip if uniform doesn't already have a utility accessory slot equipped - var/obj/item/clothing/under/uniform = user.w_uniform - var/accessory = locate(/obj/item/clothing/accessory/storage) in uniform.accessories - if(accessory) - to_chat(user, SPAN_WARNING("[src] can't be worn with [accessory].")) - return FALSE - // Only equip if user has expert intel skill level - if(!skillcheck(user, SKILL_INTEL, SKILL_INTEL_EXPERT)) - to_chat(user, SPAN_WARNING("You don't seem to know how to use [src]...")) - return FALSE - return TRUE - -/obj/item/clothing/suit/storage/marine/medium/rto/intel/equipped(mob/user, slot, silent) //When XM4 is equipped this removes ACCESSORY_SLOT_UTILITY as a valid accessory for the uniform - . = ..() - if(slot == WEAR_JACKET) - var/mob/living/carbon/human/human = user - var/obj/item/clothing/under/uniform = human.w_uniform - if(uniform?.valid_accessory_slots) - uniform?.valid_accessory_slots -= ACCESSORY_SLOT_UTILITY - -/obj/item/clothing/suit/storage/marine/medium/rto/intel/unequipped(mob/user, slot) //When unequipped this adds the ACCESSORY_SLOT_UTILITY back as a valid accessory - . = ..() - if(slot == WEAR_JACKET) - var/mob/living/carbon/human/human = user - var/obj/item/clothing/under/uniform = human.w_uniform - if(uniform) - // Figure out if the uniform originally allowed ACCESSORY_SLOT_UTILITY - var/obj/item/clothing/under/temp_uniform = new uniform.type - if(temp_uniform.valid_accessory_slots) - for(var/allowed in temp_uniform.valid_accessory_slots) - if(allowed == ACCESSORY_SLOT_UTILITY) - // It was allowed previously, now add it back - uniform.valid_accessory_slots += ACCESSORY_SLOT_UTILITY - break - qdel(temp_uniform) - -/obj/item/clothing/suit/storage/marine/MP - name = "\improper M2 pattern MP armor" - desc = "A standard Colonial Marines M2 Pattern Chestplate. Protects the chest from ballistic rounds, bladed objects and accidents. It has a small leather pouch strapped to it for limited storage." - icon_state = "mp_armor" - armor_melee = CLOTHING_ARMOR_MEDIUMHIGH - armor_bullet = CLOTHING_ARMOR_LOW - armor_laser = CLOTHING_ARMOR_LOW - armor_energy = CLOTHING_ARMOR_LOW - armor_bomb = CLOTHING_ARMOR_MEDIUM - armor_bio = CLOTHING_ARMOR_MEDIUMLOW - armor_internaldamage = CLOTHING_ARMOR_MEDIUMLOW - storage_slots = 2 - slowdown = SLOWDOWN_ARMOR_LIGHT - allowed = list( - /obj/item/weapon/gun, - /obj/item/tank/emergency_oxygen, - /obj/item/device/flashlight, - /obj/item/ammo_magazine/, - /obj/item/storage/fancy/cigarettes, - /obj/item/tool/lighter, - /obj/item/weapon/baton, - /obj/item/handcuffs, - /obj/item/explosive/grenade, - /obj/item/device/binoculars, - /obj/item/attachable/bayonet, - /obj/item/storage/backpack/general_belt, - /obj/item/device/hailer, - /obj/item/storage/belt/gun, - /obj/item/weapon/sword/ceremonial, - /obj/item/device/motiondetector, - /obj/item/device/walkman, - ) - uniform_restricted = list(/obj/item/clothing/under/marine/mp) - specialty = "M2 pattern MP" - item_state_slots = list(WEAR_JACKET = "mp_armor") - black_market_value = 20 - -/obj/item/clothing/suit/storage/marine/MP/warden - icon_state = "warden" - name = "\improper M3 pattern warden MP armor" - desc = "A well-crafted suit of M3 Pattern Armor typically distributed to Wardens. Useful for letting your men know who is in charge." - armor_bio = CLOTHING_ARMOR_MEDIUMLOW - armor_rad = CLOTHING_ARMOR_MEDIUMLOW - uniform_restricted = list(/obj/item/clothing/under/marine/warden) - specialty = "M3 pattern warden MP" - item_state_slots = list(WEAR_JACKET = "warden") - -/obj/item/clothing/suit/storage/marine/MP/WO - icon_state = "warrant_officer" - name = "\improper M3 pattern chief MP armor" - desc = "A well-crafted suit of M3 Pattern Armor typically distributed to Chief MPs. Useful for letting your men know who is in charge." - uniform_restricted = list(/obj/item/clothing/under/marine/officer/warrant) - specialty = "M3 pattern chief MP" - item_state_slots = list(WEAR_JACKET = "warrant_officer") - black_market_value = 30 - -/obj/item/clothing/suit/storage/marine/MP/general - name = "\improper M3 pattern general officer armor" - desc = "A well-crafted suit of M3 Pattern Armor with a gold shine. It looks very expensive, but shockingly fairly easy to carry and wear." - icon_state = "general" - armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH - armor_bio = CLOTHING_ARMOR_MEDIUM - uniform_restricted = list(/obj/item/clothing/under/marine/officer/general) - specialty = "M3 pattern general" - item_state_slots = list(WEAR_JACKET = "general") - w_class = SIZE_MEDIUM - -/obj/item/clothing/suit/storage/marine/MP/SO - name = "\improper M3 pattern officer armor" - desc = "A well-crafted suit of M3 Pattern Armor typically found in the hands of higher-ranking officers. Useful for letting your men know who is in charge when taking to the field." - icon_state = "officer" - storage_slots = 3 - flags_atom = null - uniform_restricted = list(/obj/item/clothing/under/marine/officer, /obj/item/clothing/under/rank/qm_suit, /obj/item/clothing/under/rank/chief_medical_officer, /obj/item/clothing/under/marine/dress) - specialty = "M3 pattern officer" - item_state_slots = list(WEAR_JACKET = "officer") - -//Making a new object because we might want to edit armor values and such. -//Or give it its own sprite. It's more for the future. -/obj/item/clothing/suit/storage/marine/MP/CO - name = "\improper M3 pattern commanding officer armor" - desc = "A robust, well-polished suit of armor for the Commanding Officer. Custom-made to fit its owner with special straps to operate a smartgun. Show those Marines who's really in charge." - icon_state = "co_officer" - item_state = "co_officer" - armor_bullet = CLOTHING_ARMOR_HIGH - storage_slots = 3 - flags_atom = NO_SNOW_TYPE - flags_inventory = BLOCKSHARPOBJ|SMARTGUN_HARNESS - uniform_restricted = list(/obj/item/clothing/under/marine, /obj/item/clothing/under/rank/qm_suit) - specialty = "M3 pattern captain" - item_state_slots = list(WEAR_JACKET = "co_officer") - valid_accessory_slots = list(ACCESSORY_SLOT_MEDAL, ACCESSORY_SLOT_RANK, ACCESSORY_SLOT_DECOR, ACCESSORY_SLOT_PONCHO) - black_market_value = 35 - - -/obj/item/clothing/suit/storage/marine/MP/CO/jacket - name = "\improper M3 pattern commanding officer armored coat" - desc = "A robust, well-polished suit of armor for the Commanding Officer. Custom-made to fit its owner with special straps to operate a smartgun. Show those Marines who's really in charge. This one has a coat over it for added warmth." - icon_state = "bridge_coat_armored" - item_state = "bridge_coat_armored" - item_state_slots = list(WEAR_JACKET = "bridge_coat_armored") - valid_accessory_slots = list(ACCESSORY_SLOT_MEDAL, ACCESSORY_SLOT_RANK) - - -/obj/item/clothing/suit/storage/marine/smartgunner - name = "\improper M56 combat harness" - desc = "A heavy protective vest designed to be worn with the M56 Smartgun System. \nIt has specially designed straps and reinforcement to carry the Smartgun and accessories." - icon_state = "8" - item_state = "armor" - armor_laser = CLOTHING_ARMOR_LOW - armor_bomb = CLOTHING_ARMOR_MEDIUM - armor_rad = CLOTHING_ARMOR_MEDIUM - storage_slots = 2 - slowdown = SLOWDOWN_ARMOR_LIGHT - flags_inventory = BLOCKSHARPOBJ|SMARTGUN_HARNESS - allowed = list( - /obj/item/tank/emergency_oxygen, - /obj/item/device/flashlight, - /obj/item/ammo_magazine, - /obj/item/explosive/mine, - /obj/item/attachable/bayonet, - /obj/item/weapon/gun/smartgun, - /obj/item/storage/backpack/general_belt, - /obj/item/device/motiondetector, - /obj/item/device/walkman, - ) - -/obj/item/clothing/suit/storage/marine/smartgunner/Initialize() - . = ..() - if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD] && name == "M56 combat harness") - name = "M56 snow combat harness" - else - name = "M56 combat harness" - //select_gamemode_skin(type) - -/obj/item/clothing/suit/storage/marine/smartgunner/mob_can_equip(mob/equipping_mob, slot, disable_warning = FALSE) - . = ..() - - if(equipping_mob.back) - to_chat(equipping_mob, SPAN_WARNING("You can't equip [src] while wearing a backpack.")) - return FALSE - -/obj/item/clothing/suit/storage/marine/smartgunner/equipped(mob/user, slot, silent) - . = ..() - - if(slot == WEAR_JACKET) - RegisterSignal(user, COMSIG_HUMAN_ATTEMPTING_EQUIP, PROC_REF(check_equipping)) - -/obj/item/clothing/suit/storage/marine/smartgunner/proc/check_equipping(mob/living/carbon/human/equipping_human, obj/item/equipping_item, slot) - SIGNAL_HANDLER - - if(slot != WEAR_BACK) - return - - . = COMPONENT_HUMAN_CANCEL_ATTEMPT_EQUIP - - if(equipping_item.flags_equip_slot == SLOT_BACK) - to_chat(equipping_human, SPAN_WARNING("You can't equip [equipping_item] on your back while wearing [src].")) - return - -/obj/item/clothing/suit/storage/marine/smartgunner/unequipped(mob/user, slot) - . = ..() - - UnregisterSignal(user, COMSIG_HUMAN_ATTEMPTING_EQUIP) - -/obj/item/clothing/suit/storage/marine/medium/leader - name = "\improper B12 pattern marine armor" - desc = "A lightweight suit of carbon fiber body armor built for quick movement. Designed in a lovely forest green. Use it to toggle the built-in flashlight." - icon_state = "7" - armor_variation = 0 - armor_melee = CLOTHING_ARMOR_MEDIUMHIGH - armor_bomb = CLOTHING_ARMOR_MEDIUM - armor_bio = CLOTHING_ARMOR_MEDIUMHIGH - armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH - specialty = "B12 pattern marine" - light_range = 5 - -/obj/item/clothing/suit/storage/marine/tanker - name = "\improper M3 pattern tanker armor" - desc = "A modified and refashioned suit of M3 Pattern armor designed to be worn by the loader of a USCM vehicle crew. While the suit is a bit more encumbering to wear with the crewman uniform, it offers the loader a degree of protection that would otherwise not be enjoyed." - icon_state = "tanker" - uniform_restricted = list(/obj/item/clothing/under/marine/officer/tanker) - specialty = "M3 pattern tanker" - storage_slots = 2 - -//===========================//PFC ARMOR CLASSES\\================================\\ -//=================================================================================\\ - -/obj/item/clothing/suit/storage/marine/medium - armor_variation = 6 - light_power = 4 - -/obj/item/clothing/suit/storage/marine/medium/padded - name = "M3 pattern padded marine armor" - icon_state = "1" - armor_variation = 0 - specialty = "M3 pattern padded marine" - -/obj/item/clothing/suit/storage/marine/medium/padless - name = "M3 pattern padless marine armor" - icon_state = "2" - armor_variation = 0 - specialty = "M3 pattern padless marine" - -/obj/item/clothing/suit/storage/marine/medium/padless_lines - name = "M3 pattern ridged marine armor" - icon_state = "3" - armor_variation = 0 - specialty = "M3 pattern ridged marine" - -/obj/item/clothing/suit/storage/marine/medium/carrier - name = "M3 pattern carrier marine armor" - icon_state = "4" - armor_variation = 0 - specialty = "M3 pattern carrier marine" - -/obj/item/clothing/suit/storage/marine/medium/skull - name = "M3 pattern skull marine armor" - icon_state = "5" - armor_variation = 0 - specialty = "M3 pattern skull marine" - -/obj/item/clothing/suit/storage/marine/medium/smooth - name = "M3 pattern smooth marine armor" - icon_state = "6" - armor_variation = 0 - specialty = "M3 pattern smooth marine" - -/obj/item/clothing/suit/storage/marine/light - name = "\improper M3-L pattern light armor" - desc = "A lighter, cut down version of the standard M3 pattern armor. It sacrifices durability for more speed." - specialty = "\improper M3-L pattern light" - icon_state = "L1" - armor_variation = 6 - slowdown = SLOWDOWN_ARMOR_LIGHT - armor_melee = CLOTHING_ARMOR_MEDIUMLOW - armor_bullet = CLOTHING_ARMOR_MEDIUMLOW - armor_bomb = CLOTHING_ARMOR_MEDIUM - armor_bio = CLOTHING_ARMOR_MEDIUMLOW - armor_rad = CLOTHING_ARMOR_MEDIUMHIGH - armor_internaldamage = CLOTHING_ARMOR_LOW - storage_slots = 2 - -/obj/item/clothing/suit/storage/marine/light/padded - icon_state = "L1" - armor_variation = 0 - -/obj/item/clothing/suit/storage/marine/light/padless - icon_state = "L2" - armor_variation = 0 - -/obj/item/clothing/suit/storage/marine/light/padless_lines - icon_state = "L3" - armor_variation = 0 - -/obj/item/clothing/suit/storage/marine/light/carrier - icon_state = "L4" - armor_variation = 0 - -/obj/item/clothing/suit/storage/marine/light/skull - icon_state = "L5" - armor_variation = 0 - -/obj/item/clothing/suit/storage/marine/light/smooth - icon_state = "L6" - armor_variation = 0 - -/obj/item/clothing/suit/storage/marine/light/vest - name = "\improper M3-VL pattern ballistics vest" - desc = "Up until 2182 USCM non-combat personnel were issued non-standardized ballistics vests, though the lack of IMP compatibility and suit lamps proved time and time again inefficient. This modified M3-L shell is the result of a 6-year R&D program; It provides utility, protection, AND comfort to all USCM non-combat personnel." - icon_state = "VL" - flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE - flags_marine_armor = ARMOR_LAMP_OVERLAY //No squad colors when wearing this since it'd look funny. - armor_melee = CLOTHING_ARMOR_MEDIUMLOW - armor_bullet = CLOTHING_ARMOR_HIGH - armor_energy = CLOTHING_ARMOR_LOW - armor_bomb = CLOTHING_ARMOR_LOW - armor_bio = CLOTHING_ARMOR_VERYLOW - armor_rad = CLOTHING_ARMOR_NONE - armor_internaldamage = CLOTHING_ARMOR_MEDIUM - storage_slots = 1 - time_to_unequip = 0.5 SECONDS - time_to_equip = 1 SECONDS - siemens_coefficient = 0.7 - uniform_restricted = null - -/obj/item/clothing/suit/storage/marine/light/vest/dcc - name = "\improper M3-VL pattern flak vest" - desc = "A combination of the standard non-combat M3-VL ballistics vest and M70 flak jacket, this piece of armor has been distributed to dropship crew to keep them safe from threats external and internal..." - icon_state = "VL_FLAK" - storage_slots = 2 - -/obj/item/clothing/suit/storage/marine/light/synvest - name = "\improper M3A1 Synthetic Utility Vest" - desc = "This variant of the ubiquitous M3 pattern ballistics vest has been extensively modified, providing no protection in exchange for maximum mobility and storage space. Synthetic programming compliant." - icon_state = "VL_syn_camo" - flags_atom = NO_NAME_OVERRIDE - flags_marine_armor = ARMOR_LAMP_OVERLAY|SYNTH_ALLOWED //No squad colors + can be worn by synths. - armor_melee = CLOTHING_ARMOR_NONE - armor_bullet = CLOTHING_ARMOR_NONE - armor_laser = CLOTHING_ARMOR_NONE - armor_energy = CLOTHING_ARMOR_NONE - armor_bomb = CLOTHING_ARMOR_NONE - armor_bio = CLOTHING_ARMOR_NONE - armor_rad = CLOTHING_ARMOR_NONE - armor_internaldamage = CLOTHING_ARMOR_NONE - storage_slots = 3 - slowdown = SLOWDOWN_ARMOR_VERY_LIGHT - time_to_unequip = 0.5 SECONDS - time_to_equip = 1 SECONDS - uniform_restricted = null - -/obj/item/clothing/suit/storage/marine/light/synvest/grey - icon_state = "VL_syn" - flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE - -/obj/item/clothing/suit/storage/marine/light/synvest/jungle - icon_state = "VL_syn_camo" - flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE - -/obj/item/clothing/suit/storage/marine/light/synvest/snow - icon_state = "s_VL_syn_camo" - flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE - -/obj/item/clothing/suit/storage/marine/light/synvest/desert - icon_state = "d_VL_syn_camo" - flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE - -/obj/item/clothing/suit/storage/marine/light/synvest/dgrey - icon_state = "c_VL_syn_camo" - flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE - -/obj/item/clothing/suit/storage/marine/heavy - name = "\improper M3-EOD pattern heavy armor" - desc = "A heavier version of the standard M3 pattern armor, the armor is primarily designed to withstand ballistic, explosive, and internal damage, with the drawback of increased bulk and thus reduced movement speed, alongside little additional protection from standard blunt force impacts and biological threats." - desc_lore = "This configuration of the iconic armor was developed during the Canton War in 2160 between the UPP and USCM - Designed in response to a need for higher protection for ComTechs assigned as EODs during the conflict, this is the pinnacle of protection for your average marine. The shoulders and kneepads have both been expanded upon heavily, covering up the arteries on each limb. A special spall liner was developed for this suit, with the same technology being used in the M70 Flak Jacket being developed at the same time." - specialty = "\improper M3-EOD pattern" - icon_state = "H1" - armor_variation = 6 - armor_melee = CLOTHING_ARMOR_MEDIUMHIGH - armor_bullet = CLOTHING_ARMOR_HIGHPLUS - armor_bomb = CLOTHING_ARMOR_HIGHPLUS - armor_bio = CLOTHING_ARMOR_MEDIUMHIGH - armor_rad = CLOTHING_ARMOR_MEDIUM - armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH - storage_slots = 2 - slowdown = SLOWDOWN_ARMOR_LOWHEAVY - movement_compensation = SLOWDOWN_ARMOR_MEDIUM - light_power = 4 - light_range = 5 - -/obj/item/clothing/suit/storage/marine/heavy/padded - icon_state = "H1" - armor_variation = 0 - -/obj/item/clothing/suit/storage/marine/heavy/padless - icon_state = "H2" - armor_variation = 0 - -/obj/item/clothing/suit/storage/marine/heavy/padless_lines - icon_state = "H3" - armor_variation = 0 - -/obj/item/clothing/suit/storage/marine/heavy/carrier - icon_state = "H4" - armor_variation = 0 - -/obj/item/clothing/suit/storage/marine/heavy/skull - icon_state = "H5" - armor_variation = 0 - -/obj/item/clothing/suit/storage/marine/heavy/smooth - icon_state = "H6" - armor_variation = 0 - -//===========================//SPECIALIST\\================================\\ -//=======================================================================\\ - -/obj/item/clothing/suit/storage/marine/specialist - name = "\improper B18 defensive armor" - desc = "A heavy, rugged set of armor plates for when you really, really need to not die horribly. Slows you down though.\nComes with two tricord injectors in each arm guard." - icon_state = "xarmor" - armor_melee = CLOTHING_ARMOR_HIGH - armor_bullet = CLOTHING_ARMOR_HIGH - armor_bomb = CLOTHING_ARMOR_VERYHIGH - armor_bio = CLOTHING_ARMOR_MEDIUMLOW - armor_rad = CLOTHING_ARMOR_MEDIUMHIGH - armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH - storage_slots = 2 - flags_inventory = BLOCKSHARPOBJ|BLOCK_KNOCKDOWN - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET - flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET - flags_heat_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET - slowdown = SLOWDOWN_ARMOR_HEAVY - specialty = "B18 defensive" - unacidable = TRUE - var/injections = 4 - -/obj/item/clothing/suit/storage/marine/specialist/verb/inject() - set name = "Create Injector" - set category = "Object" - set src in usr - - if(usr.is_mob_incapacitated()) - return 0 - - if(!injections) - to_chat(usr, "Your armor is all out of injectors.") - return 0 - - if(usr.get_active_hand()) - to_chat(usr, "Your active hand must be empty.") - return 0 - - to_chat(usr, "You feel a faint hiss and an injector drops into your hand.") - var/obj/item/reagent_container/hypospray/autoinjector/skillless/O = new(usr) - usr.put_in_active_hand(O) - injections-- - playsound(src,'sound/machines/click.ogg', 15, 1) - return - -/obj/item/clothing/suit/storage/marine/M3G - name = "\improper M3-G4 grenadier armor" - desc = "A custom set of M3 armor packed to the brim with padding, plating, and every form of ballistic protection under the sun. Used exclusively by USCM Grenadiers." - icon_state = "grenadier" - armor_melee = CLOTHING_ARMOR_MEDIUMHIGH - armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH - armor_bomb = CLOTHING_ARMOR_VERYHIGH - armor_bio = CLOTHING_ARMOR_MEDIUMLOW - armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH - flags_inventory = BLOCKSHARPOBJ|BLOCK_KNOCKDOWN - flags_item = MOB_LOCK_ON_EQUIP|NO_CRYO_STORE - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET - flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET - flags_heat_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET - slowdown = SLOWDOWN_ARMOR_HEAVY - specialty = "M3-G4 grenadier" - unacidable = TRUE - -/obj/item/clothing/suit/storage/marine/M3T - name = "\improper M3-T light armor" - desc = "A custom set of M3 armor designed for users of long-ranged explosive weaponry." - icon_state = "demolitionist" - armor_bomb = CLOTHING_ARMOR_HIGH - slowdown = SLOWDOWN_ARMOR_LIGHT - specialty = "M3-T light" - flags_item = MOB_LOCK_ON_EQUIP|NO_CRYO_STORE - unacidable = TRUE - -/obj/item/clothing/suit/storage/marine/M3S - name = "\improper M3-S light armor" - desc = "A custom set of M3 armor designed for USCM Scouts." - icon_state = "scout_armor" - armor_melee = CLOTHING_ARMOR_MEDIUMHIGH - slowdown = SLOWDOWN_ARMOR_LIGHT - specialty = "M3-S light" - flags_item = MOB_LOCK_ON_EQUIP|NO_CRYO_STORE - unacidable = TRUE - -#define FIRE_SHIELD_CD 150 - -/obj/item/clothing/suit/storage/marine/M35 - name = "\improper M35 pyrotechnician armor" - desc = "A custom set of M35 armor designed for use by USCM Pyrotechnicians." - icon_state = "pyro_armor" - armor_bio = CLOTHING_ARMOR_MEDIUMHIGH - armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH - fire_intensity_resistance = BURN_LEVEL_TIER_1 - max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROT - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET - flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET - flags_heat_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET - flags_item = MOB_LOCK_ON_EQUIP|NO_CRYO_STORE - specialty = "M35 pyrotechnician" - actions_types = list(/datum/action/item_action/toggle, /datum/action/item_action/specialist/fire_shield) - unacidable = TRUE - var/fire_shield_on = FALSE - var/can_activate = TRUE - -/obj/item/clothing/suit/storage/marine/M35/equipped(mob/user, slot) - if(slot == WEAR_JACKET) - RegisterSignal(user, COMSIG_LIVING_FLAMER_CROSSED, PROC_REF(flamer_fire_callback)) - ..() - -/obj/item/clothing/suit/storage/marine/M35/verb/fire_shield() - set name = "Activate Fire Shield" - set desc = "Activate your armor's FIREWALK protocol for a short duration." - set category = "Pyro" - set src in usr - if(!usr || usr.is_mob_incapacitated(TRUE)) - return - if(!ishuman(usr)) - return - var/mob/living/carbon/human/H = usr - - if(H.wear_suit != src) - to_chat(H, SPAN_WARNING("You must be wearing the M35 pyro armor to activate FIREWALK protocol!")) - return - - if(!skillcheck(H, SKILL_SPEC_WEAPONS, SKILL_SPEC_ALL) && H.skills.get_skill_level(SKILL_SPEC_WEAPONS) != SKILL_SPEC_PYRO) - to_chat(H, SPAN_WARNING("You don't seem to know how to use [src]...")) - return - - if(fire_shield_on) - to_chat(H, SPAN_WARNING("You already have FIREWALK protocol activated!")) - return - - if(!can_activate) - to_chat(H, SPAN_WARNING("FIREWALK protocol was recently activated, wait before trying to activate it again.")) - return - - to_chat(H, SPAN_NOTICE("FIREWALK protocol has been activated. You will now be immune to fire for 6 seconds!")) - RegisterSignal(H, COMSIG_LIVING_PREIGNITION, PROC_REF(fire_shield_is_on)) - RegisterSignal(H, list( - COMSIG_LIVING_FLAMER_FLAMED, - ), PROC_REF(flamer_fire_callback)) - fire_shield_on = TRUE - can_activate = FALSE - for(var/X in actions) - var/datum/action/A = X - A.update_button_icon() - addtimer(CALLBACK(src, PROC_REF(end_fire_shield), H), 6 SECONDS) - - H.add_filter("firewalk_on", 1, list("type" = "outline", "color" = "#03fcc6", "size" = 1)) - -/obj/item/clothing/suit/storage/marine/M35/proc/end_fire_shield(mob/living/carbon/human/user) - if(!istype(user)) - return - to_chat(user, SPAN_NOTICE("FIREWALK protocol has finished.")) - UnregisterSignal(user, list( - COMSIG_LIVING_PREIGNITION, - COMSIG_LIVING_FLAMER_FLAMED, - )) - fire_shield_on = FALSE - - user.remove_filter("firewalk_on") - - addtimer(CALLBACK(src, PROC_REF(enable_fire_shield), user), FIRE_SHIELD_CD) - -/obj/item/clothing/suit/storage/marine/M35/proc/enable_fire_shield(mob/living/carbon/human/user) - if(!istype(user)) - return - to_chat(user, SPAN_NOTICE("FIREWALK protocol can be activated again.")) - can_activate = TRUE - - for(var/X in actions) - var/datum/action/A = X - A.update_button_icon() - -/// This proc is solely so that IgniteMob() fails -/obj/item/clothing/suit/storage/marine/M35/proc/fire_shield_is_on(mob/living/L) - SIGNAL_HANDLER - - if(L.fire_reagent?.fire_penetrating) - return - - return COMPONENT_CANCEL_IGNITION - -/obj/item/clothing/suit/storage/marine/M35/proc/flamer_fire_callback(mob/living/L, datum/reagent/R) - SIGNAL_HANDLER - - if(R.fire_penetrating) - return - - . = COMPONENT_NO_IGNITE - if(fire_shield_on) - . |= COMPONENT_NO_BURN - -/obj/item/clothing/suit/storage/marine/M35/dropped(mob/user) - if (!istype(user)) - return - UnregisterSignal(user, list( - COMSIG_LIVING_PREIGNITION, - COMSIG_LIVING_FLAMER_CROSSED, - COMSIG_LIVING_FLAMER_FLAMED, - )) - ..() - -#undef FIRE_SHIELD_CD - -/datum/action/item_action/specialist/fire_shield - ability_primacy = SPEC_PRIMARY_ACTION_2 - -/datum/action/item_action/specialist/fire_shield/New(mob/living/user, obj/item/holder) - ..() - name = "Activate Fire Shield" - button.name = name - button.overlays.Cut() - var/image/IMG = image('icons/obj/items/clothing/cm_suits.dmi', button, "pyro_armor") - button.overlays += IMG - -/datum/action/item_action/specialist/fire_shield/action_cooldown_check() - var/obj/item/clothing/suit/storage/marine/M35/armor = holder_item - if (!istype(armor)) - return FALSE - - return !armor.can_activate - -/datum/action/item_action/specialist/fire_shield/can_use_action() - var/mob/living/carbon/human/H = owner - if(istype(H) && !H.is_mob_incapacitated() && H.wear_suit == holder_item) - return TRUE - -/datum/action/item_action/specialist/fire_shield/action_activate() - var/obj/item/clothing/suit/storage/marine/M35/armor = holder_item - if (!istype(armor)) - return - - armor.fire_shield() - -#define FULL_CAMOUFLAGE_ALPHA 15 - -/obj/item/clothing/suit/storage/marine/ghillie - name = "\improper M45 pattern ghillie armor" - desc = "A lightweight ghillie camouflage suit, used by USCM snipers on recon missions. Very lightweight, but doesn't protect much." - icon_state = "ghillie_armor" - armor_bio = CLOTHING_ARMOR_MEDIUMHIGH - slowdown = SLOWDOWN_ARMOR_LIGHT - flags_marine_armor = ARMOR_LAMP_OVERLAY - flags_item = MOB_LOCK_ON_EQUIP - specialty = "M45 pattern ghillie" - valid_accessory_slots = list(ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_DECOR, ACCESSORY_SLOT_MEDAL, ACCESSORY_SLOT_PONCHO) - restricted_accessory_slots = list(ACCESSORY_SLOT_ARMBAND) - - var/camo_active = FALSE - var/hide_in_progress = FALSE - var/full_camo_alpha = FULL_CAMOUFLAGE_ALPHA - var/incremental_shooting_camo_penalty = 35 - var/current_camo = FULL_CAMOUFLAGE_ALPHA - var/camouflage_break = 5 SECONDS - var/camouflage_enter_delay = 4 SECONDS - var/can_camo = TRUE - - actions_types = list(/datum/action/item_action/toggle, /datum/action/item_action/specialist/prepare_position) - -/obj/item/clothing/suit/storage/marine/ghillie/dropped(mob/user) - if(ishuman(user) && !issynth(user)) - deactivate_camouflage(user, FALSE) - - . = ..() - -/obj/item/clothing/suit/storage/marine/ghillie/verb/camouflage() - set name = "Prepare Position" - set desc = "Use the ghillie suit and the nearby environment to become near invisible." - set category = "Object" - set src in usr - if(!usr || usr.is_mob_incapacitated(TRUE)) - return - - if(!ishuman(usr) || hide_in_progress || !can_camo) - return - var/mob/living/carbon/human/H = usr - if(!skillcheck(H, SKILL_SPEC_WEAPONS, SKILL_SPEC_ALL) && H.skills.get_skill_level(SKILL_SPEC_WEAPONS) != SKILL_SPEC_SNIPER && !(GLOB.character_traits[/datum/character_trait/skills/spotter] in H.traits)) - to_chat(H, SPAN_WARNING("You don't seem to know how to use [src]...")) - return - if(H.wear_suit != src) - to_chat(H, SPAN_WARNING("You must be wearing the ghillie suit to activate it!")) - return - - if(camo_active) - deactivate_camouflage(H) - return - - H.visible_message(SPAN_DANGER("[H] goes prone, and begins adjusting \his ghillie suit!"), SPAN_NOTICE("You go prone, and begins adjusting your ghillie suit."), max_distance = 4) - hide_in_progress = TRUE - H.unset_interaction() // If we're sticking to a machine gun or what not. - if(!do_after(H, camouflage_enter_delay, INTERRUPT_NO_NEEDHAND|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - hide_in_progress = FALSE - return - hide_in_progress = FALSE - RegisterSignal(H, list( - COMSIG_MOB_FIRED_GUN, - COMSIG_MOB_FIRED_GUN_ATTACHMENT) - , PROC_REF(fade_in)) - RegisterSignal(H, list( - COMSIG_MOB_DEATH, - COMSIG_HUMAN_EXTINGUISH - ), PROC_REF(deactivate_camouflage)) - camo_active = TRUE - H.alpha = full_camo_alpha - H.FF_hit_evade = 1000 - ADD_TRAIT(H, TRAIT_UNDENSE, SPECIALIST_GEAR_TRAIT) - - RegisterSignal(H, COMSIG_MOB_MOVE_OR_LOOK, PROC_REF(handle_mob_move_or_look)) - - var/datum/mob_hud/security/advanced/SA = GLOB.huds[MOB_HUD_SECURITY_ADVANCED] - SA.remove_from_hud(H) - var/datum/mob_hud/xeno_infection/XI = GLOB.huds[MOB_HUD_XENO_INFECTION] - XI.remove_from_hud(H) - - anim(H.loc, H, 'icons/mob/mob.dmi', null, "cloak", null, H.dir) - - -/obj/item/clothing/suit/storage/marine/ghillie/proc/deactivate_camouflage(mob/user) - SIGNAL_HANDLER - var/mob/living/carbon/human/H = user - if(!istype(H)) - return FALSE - - if(!camo_active) - return - - UnregisterSignal(H, list( - COMSIG_MOB_FIRED_GUN, - COMSIG_MOB_FIRED_GUN_ATTACHMENT, - COMSIG_MOB_DEATH, - COMSIG_HUMAN_EXTINGUISH, - COMSIG_MOB_MOVE_OR_LOOK - )) - - camo_active = FALSE - animate(H, alpha = initial(H.alpha), flags = ANIMATION_END_NOW) - H.FF_hit_evade = initial(H.FF_hit_evade) - REMOVE_TRAIT(H, TRAIT_UNDENSE, SPECIALIST_GEAR_TRAIT) - - var/datum/mob_hud/security/advanced/SA = GLOB.huds[MOB_HUD_SECURITY_ADVANCED] - SA.add_to_hud(H) - var/datum/mob_hud/xeno_infection/XI = GLOB.huds[MOB_HUD_XENO_INFECTION] - XI.add_to_hud(H) - - H.visible_message(SPAN_DANGER("[H]'s camouflage fails!"), SPAN_WARNING("Your camouflage fails!"), max_distance = 4) - -/obj/item/clothing/suit/storage/marine/ghillie/proc/fade_in(mob/user) - SIGNAL_HANDLER - var/mob/living/carbon/human/H = user - if(camo_active) - if(current_camo < full_camo_alpha) - current_camo = full_camo_alpha - current_camo = clamp(current_camo + incremental_shooting_camo_penalty, full_camo_alpha, 255) - H.alpha = current_camo - addtimer(CALLBACK(src, PROC_REF(fade_out_finish), H), camouflage_break, TIMER_OVERRIDE|TIMER_UNIQUE) - animate(H, alpha = full_camo_alpha + 5, time = camouflage_break, easing = LINEAR_EASING, flags = ANIMATION_END_NOW) - -/obj/item/clothing/suit/storage/marine/ghillie/proc/fade_out_finish(mob/living/carbon/human/H) - if(camo_active && H.wear_suit == src) - to_chat(H, SPAN_BOLDNOTICE("The smoke clears and your position is once again hidden completely!")) - animate(H, alpha = full_camo_alpha) - current_camo = full_camo_alpha - -/obj/item/clothing/suit/storage/marine/ghillie/proc/handle_mob_move_or_look(mob/living/mover, actually_moving, direction, specific_direction) - SIGNAL_HANDLER - - if(camo_active && actually_moving) - deactivate_camouflage(mover) - -/datum/action/item_action/specialist/prepare_position - ability_primacy = SPEC_PRIMARY_ACTION_1 - -/datum/action/item_action/specialist/prepare_position/New(mob/living/user, obj/item/holder) - ..() - name = "Prepare Position" - button.name = name - button.overlays.Cut() - var/image/IMG = image('icons/mob/hud/actions.dmi', button, "prepare_position") - button.overlays += IMG - -/datum/action/item_action/specialist/prepare_position/can_use_action() - var/mob/living/carbon/human/H = owner - if(istype(H) && !H.is_mob_incapacitated() && H.body_position == STANDING_UP && holder_item == H.wear_suit) - return TRUE - -/datum/action/item_action/specialist/prepare_position/action_activate() - var/obj/item/clothing/suit/storage/marine/ghillie/GS = holder_item - GS.camouflage() - -#undef FULL_CAMOUFLAGE_ALPHA - -/obj/item/clothing/suit/storage/marine/ghillie/forecon - name = "UDEP Thermal Poncho" - desc = "UDEP or the Ultra Diffusive Environmental Poncho is a camouflaged rain-cover worn to protect against the elements and chemical spills. It's commonly treated with an infrared absorbing coating, making a marine almost invisible in the rain. Favoured by USCM specialists for it's comfort and practicality." - icon_state = "mercenary_miner_armor" - flags_atom = MOB_LOCK_ON_EQUIP|NO_SNOW_TYPE|NO_NAME_OVERRIDE - -/obj/item/clothing/suit/storage/marine/sof - name = "\improper SOF Armor" - desc = "A heavily customized suit of M3 armor. Used by Marine Raiders." - icon_state = "marsoc" - armor_melee = CLOTHING_ARMOR_HIGH - armor_bullet = CLOTHING_ARMOR_HIGH - armor_bomb = CLOTHING_ARMOR_VERYHIGH - armor_bio = CLOTHING_ARMOR_MEDIUMLOW - armor_rad = CLOTHING_ARMOR_MEDIUMHIGH - armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH - slowdown = SLOWDOWN_ARMOR_LIGHT - unacidable = TRUE - flags_atom = MOB_LOCK_ON_EQUIP|NO_CRYO_STORE|NO_SNOW_TYPE - storage_slots = 4 - -//=============================//pmcS\\==================================\\ -//=======================================================================\\ - -/obj/item/clothing/suit/storage/marine/veteran - flags_marine_armor = ARMOR_LAMP_OVERLAY - flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE //Let's make these keep their name and icon. - -/obj/item/clothing/suit/storage/marine/veteran/pmc - name = "\improper M4 pattern PMC armor" - desc = "A modification of the standard Armat Systems M3 armor. Designed for high-profile security operators and corporate mercenaries in mind." - icon_state = "pmc_armor" - armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH - armor_energy = CLOTHING_ARMOR_MEDIUMLOW - armor_bomb = CLOTHING_ARMOR_MEDIUM - armor_rad = CLOTHING_ARMOR_MEDIUM - storage_slots = 2 - slowdown = SLOWDOWN_ARMOR_LIGHT - flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE - allowed = list( - /obj/item/weapon/gun, - /obj/item/tank/emergency_oxygen, - /obj/item/device/flashlight, - /obj/item/ammo_magazine/, - /obj/item/weapon/baton, - /obj/item/handcuffs, - /obj/item/storage/fancy/cigarettes, - /obj/item/tool/lighter, - /obj/item/explosive/grenade, - /obj/item/storage/bible, - /obj/item/tool/crowbar, - /obj/item/storage/large_holster/katana, - /obj/item/storage/large_holster/machete, - /obj/item/weapon/sword/machete, - /obj/item/attachable/bayonet, - /obj/item/device/motiondetector, - /obj/item/tool/crew_monitor, - /obj/item/device/walkman, - ) - uniform_restricted = list(/obj/item/clothing/under/marine/veteran/pmc) - item_state_slots = list(WEAR_JACKET = "pmc_armor") - -/obj/item/clothing/suit/storage/marine/veteran/pmc/light - name = "\improper M4 pattern light PMC armor" - desc = "A modification of the standard Armat Systems M3 armor. Designed for high-profile security operators and corporate mercenaries in mind. Has some armor plating removed for extra mobility." - icon_state = "pmc_sniper" - armor_melee = CLOTHING_ARMOR_MEDIUMLOW - armor_bullet = CLOTHING_ARMOR_MEDIUM - armor_energy = CLOTHING_ARMOR_MEDIUMLOW - armor_bomb = CLOTHING_ARMOR_MEDIUMLOW - armor_rad = CLOTHING_ARMOR_MEDIUM - armor_internaldamage = CLOTHING_ARMOR_MEDIUMLOW - slowdown = SLOWDOWN_ARMOR_VERY_LIGHT - item_state_slots = list(WEAR_JACKET = "pmc_sniper") - -/obj/item/clothing/suit/storage/marine/veteran/pmc/light/corporate - name = "\improper M1 pattern corporate security armor" - desc = "A basic vest with a Weyland-Yutani badge on the right breast. This is commonly worn by low-level guards protecting Weyland-Yutani facilities." - icon = 'icons/mob/humans/onmob/contained/wy_goons.dmi' - icon_state = "armor" - item_state = "armor" - item_state_slots = null - contained_sprite = TRUE - - flags_armor_protection = BODY_FLAG_CHEST - flags_cold_protection = BODY_FLAG_CHEST - flags_heat_protection = BODY_FLAG_CHEST - - slowdown = SLOWDOWN_ARMOR_NONE // only protects chest, but enables rapid movement - -/obj/item/clothing/suit/storage/marine/veteran/pmc/light/corporate/lead - desc = "A basic vest with a Weyland-Yutani badge on the right breast. This variant is worn by low-level guards that have elevated in rank due to 'good conduct in the field', also known as corporate bootlicking." - icon_state = "lead_armor" - item_state = "lead_armor" - -/obj/item/clothing/suit/storage/marine/veteran/pmc/leader - name = "\improper M4 pattern PMC leader armor" - desc = "A modification of the standard Armat Systems M3 armor. Designed for high-profile security operators and corporate mercenaries in mind. This particular suit looks like it belongs to a high-ranking officer." - icon_state = "officer_armor" - uniform_restricted = list(/obj/item/clothing/under/marine/veteran/pmc/leader) - item_state_slots = list(WEAR_JACKET = "officer_armor") - -/obj/item/clothing/suit/storage/marine/veteran/pmc/sniper - name = "\improper M4 pattern PMC sniper armor" - icon_state = "pmc_sniper" - armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH - armor_energy = CLOTHING_ARMOR_MEDIUMLOW - armor_bomb = CLOTHING_ARMOR_MEDIUM - armor_rad = CLOTHING_ARMOR_MEDIUM - armor_internaldamage = CLOTHING_ARMOR_MEDIUM - flags_inv_hide = HIDELOWHAIR - item_state_slots = list(WEAR_JACKET = "pmc_sniper") - -/obj/item/clothing/suit/storage/marine/veteran/pmc/light/synth - name = "\improper M4 Synthetic PMC armor" - desc = "A serious modification of the standard Armat Systems M3 armor. This variant was designed for PMC Support Units in the field, with every armor insert removed. It's designed with the idea of a high speed lifesaver in mind." - time_to_unequip = 0.5 SECONDS - time_to_equip = 1 SECONDS - armor_melee = CLOTHING_ARMOR_NONE - armor_bullet = CLOTHING_ARMOR_NONE - armor_laser = CLOTHING_ARMOR_NONE - armor_energy = CLOTHING_ARMOR_NONE - armor_bomb = CLOTHING_ARMOR_NONE - armor_bio = CLOTHING_ARMOR_NONE - armor_rad = CLOTHING_ARMOR_NONE - armor_internaldamage = CLOTHING_ARMOR_NONE - storage_slots = 3 - slowdown = SLOWDOWN_ARMOR_SUPER_LIGHT - -/obj/item/clothing/suit/storage/marine/veteran/pmc/light/synth/Initialize() - flags_atom |= NO_NAME_OVERRIDE - flags_marine_armor |= SYNTH_ALLOWED - return ..() - -/obj/item/clothing/suit/storage/marine/smartgunner/veteran/pmc - name = "\improper PMC gunner armor" - desc = "A modification of the standard Armat Systems M3 armor. Hooked up with harnesses and straps allowing the user to carry an M56 Smartgun." - icon_state = "heavy_armor" - flags_inventory = BLOCKSHARPOBJ|BLOCK_KNOCKDOWN|SMARTGUN_HARNESS - flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE - armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH - armor_laser = CLOTHING_ARMOR_MEDIUMLOW - armor_energy = CLOTHING_ARMOR_MEDIUMLOW - armor_bomb = CLOTHING_ARMOR_MEDIUM - armor_rad = CLOTHING_ARMOR_MEDIUM - item_state_slots = list(WEAR_JACKET = "heavy_armor") - -/obj/item/clothing/suit/storage/marine/smartgunner/veteran/pmc/terminator - name = "\improper M5Xg exoskeleton gunner armor" - desc = "A complex system of overlapping plates intended to render the wearer all but impervious to small arms fire. A passive exoskeleton supports the weight of the armor, allowing a human to carry its massive bulk. This variant is designed to support a M56 Smartgun." - icon_state = "commando_armor" - slowdown = SLOWDOWN_ARMOR_MEDIUM - movement_compensation = SLOWDOWN_ARMOR_VERY_HEAVY - armor_melee = CLOTHING_ARMOR_HIGH - armor_bullet = CLOTHING_ARMOR_ULTRAHIGH - armor_laser = CLOTHING_ARMOR_MEDIUM - armor_energy = CLOTHING_ARMOR_MEDIUM - armor_bomb = CLOTHING_ARMOR_VERYHIGH - armor_rad = CLOTHING_ARMOR_MEDIUMHIGH - armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET - uniform_restricted = list(/obj/item/clothing/under/marine/veteran/pmc/commando) - item_state_slots = list(WEAR_JACKET = "commando_armor") - unacidable = TRUE - -/obj/item/clothing/suit/storage/marine/veteran/pmc/commando - name = "\improper M5X exoskeleton armor" - desc = "A complex system of overlapping plates intended to render the wearer all but impervious to small arms fire. A passive exoskeleton supports the weight of the armor, allowing a human to carry its massive bulk." - icon_state = "commando_armor" - slowdown = SLOWDOWN_ARMOR_MEDIUM - movement_compensation = SLOWDOWN_ARMOR_VERY_HEAVY - armor_melee = CLOTHING_ARMOR_VERYHIGH - armor_bullet = CLOTHING_ARMOR_ULTRAHIGH - armor_energy = CLOTHING_ARMOR_MEDIUM - armor_bomb = CLOTHING_ARMOR_VERYHIGH - armor_rad = CLOTHING_ARMOR_MEDIUMHIGH - armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH - flags_inventory = BLOCK_KNOCKDOWN - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET - uniform_restricted = list(/obj/item/clothing/under/marine/veteran/pmc/commando) - item_state_slots = list(WEAR_JACKET = "commando_armor") - unacidable = TRUE - -//===========================//DISTRESS\\================================\\ -//=======================================================================\\ - -/obj/item/clothing/suit/storage/marine/veteran/bear - name = "\improper H1 Iron Bears vest" - desc = "A protective vest worn by Iron Bears mercenaries." - icon_state = "bear_armor" - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN - armor_energy = CLOTHING_ARMOR_MEDIUMLOW - armor_bomb = CLOTHING_ARMOR_MEDIUM - armor_rad = CLOTHING_ARMOR_MEDIUM - storage_slots = 2 - slowdown = SLOWDOWN_ARMOR_VERY_LIGHT - uniform_restricted = list(/obj/item/clothing/under/marine/veteran/bear) - -/obj/item/clothing/suit/storage/marine/veteran/dutch - name = "\improper D2 armored vest" - desc = "A protective vest worn by some seriously experienced mercs." - icon_state = "dutch_armor" - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS //Makes no sense but they need leg/arm armor too. - armor_melee = CLOTHING_ARMOR_HIGH - armor_bullet = CLOTHING_ARMOR_HIGHPLUS - armor_energy = CLOTHING_ARMOR_MEDIUMLOW - armor_bomb = CLOTHING_ARMOR_HIGH - armor_rad = CLOTHING_ARMOR_MEDIUM - storage_slots = 2 - light_range = 7 - slowdown = SLOWDOWN_ARMOR_VERY_LIGHT - uniform_restricted = list(/obj/item/clothing/under/marine/veteran/dutch) - -/obj/item/clothing/suit/storage/marine/veteran/van_bandolier - name = "safari jacket" - desc = "A tailored hunting jacket, cunningly lined with segmented armor plates. Sometimes the game shoots back." - icon_state = "van_bandolier" - item_state = "van_bandolier_jacket" - blood_overlay_type = "coat" - flags_marine_armor = NO_FLAGS //No shoulder light. - actions_types = list() - slowdown = SLOWDOWN_ARMOR_LIGHT - storage_slots = 2 - movement_compensation = SLOWDOWN_ARMOR_LIGHT - uniform_restricted = list(/obj/item/clothing/under/marine/veteran/van_bandolier) - allowed = list( - /obj/item/weapon/gun, - /obj/item/tank/emergency_oxygen, - /obj/item/device/flashlight, - /obj/item/storage/fancy/cigarettes, - /obj/item/tool/lighter, - /obj/item/storage/bible, - /obj/item/attachable/bayonet, - /obj/item/storage/backpack/general_belt, - /obj/item/storage/large_holster/machete, - /obj/item/storage/belt/gun/m4a3, - /obj/item/storage/belt/gun/m44, - /obj/item/storage/belt/gun/smartpistol, - /obj/item/storage/belt/gun/flaregun, - /obj/item/device/motiondetector, - /obj/item/device/walkman, - /obj/item/storage/belt/shotgun/van_bandolier, - ) - -//===========================//U.P.P\\================================\\ -//=====================================================================\\ - -/obj/item/clothing/suit/storage/marine/faction - flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS - flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS - flags_heat_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS - min_cold_protection_temperature = HELMET_MIN_COLD_PROT - max_heat_protection_temperature = HELMET_MAX_HEAT_PROT - blood_overlay_type = "armor" - armor_melee = CLOTHING_ARMOR_MEDIUM - armor_bullet = CLOTHING_ARMOR_MEDIUM - armor_laser = CLOTHING_ARMOR_MEDIUMLOW - armor_energy = CLOTHING_ARMOR_MEDIUMLOW - armor_bomb = CLOTHING_ARMOR_MEDIUM - armor_bio = CLOTHING_ARMOR_MEDIUM - armor_rad = CLOTHING_ARMOR_MEDIUM - armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH - slowdown = SLOWDOWN_ARMOR_MEDIUM - movement_compensation = SLOWDOWN_ARMOR_LIGHT - - -/obj/item/clothing/suit/storage/marine/faction/UPP - name = "\improper UM5 personal armor" - desc = "Standard body armor of the UPP military, the UM5 (Union Medium MK5) is a medium body armor, roughly on par with the M3 pattern body armor in service with the USCM, specialized towards ballistics protection. Unlike the M3, however, the plate has a heavier neckplate. This has earned many UA members to refer to UPP soldiers as 'tin men'." - icon_state = "upp_armor" - armor_bullet = CLOTHING_ARMOR_HIGH - armor_energy = CLOTHING_ARMOR_MEDIUM - armor_bio = CLOTHING_ARMOR_MEDIUMLOW - armor_rad = CLOTHING_ARMOR_MEDIUMLOW - armor_internaldamage = CLOTHING_ARMOR_HIGH - storage_slots = 1 - uniform_restricted = list(/obj/item/clothing/under/marine/veteran/UPP, /obj/item/clothing/under/marine/veteran/UPP/medic, /obj/item/clothing/under/marine/veteran/UPP/engi) - -/obj/item/clothing/suit/storage/marine/faction/UPP/support - name = "\improper UL6 personal armor" - desc = "Standard body armor of the UPP military, the UL6 (Union Light MK6) is a light body armor, slightly weaker than the M3 pattern body armor in service with the USCM, specialized towards ballistics protection. This set of personal armor lacks the iconic neck piece and some of the armor in favor of user mobility." - storage_slots = 3 - icon_state = "upp_armor_support" - slowdown = SLOWDOWN_ARMOR_LIGHT - armor_melee = CLOTHING_ARMOR_HIGH - armor_energy = CLOTHING_ARMOR_MEDIUM - armor_bio = CLOTHING_ARMOR_MEDIUMLOW - armor_rad = CLOTHING_ARMOR_MEDIUMLOW - armor_internaldamage = CLOTHING_ARMOR_HIGH - -/obj/item/clothing/suit/storage/marine/faction/UPP/commando - name = "\improper UM5CU personal armor" - desc = "A modification of the UM5, designed for stealth operations." - icon_state = "upp_armor_commando" - storage_slots = 2 - slowdown = SLOWDOWN_ARMOR_LIGHT - -/obj/item/clothing/suit/storage/marine/faction/UPP/heavy - name = "\improper UH7 heavy plated armor" - desc = "An extremely heavy-duty set of body armor in service with the UPP military, the UH7 (Union Heavy MK7) is known for having powerful ballistic protection, alongside a noticeable neck guard, fortified in order to allow the wearer to endure the stresses of the bulky helmet." - icon_state = "upp_armor_heavy" - storage_slots = 3 - slowdown = SLOWDOWN_ARMOR_HEAVY - flags_inventory = BLOCKSHARPOBJ|BLOCK_KNOCKDOWN - flags_armor_protection = BODY_FLAG_ALL_BUT_HEAD - armor_melee = CLOTHING_ARMOR_MEDIUMHIGH - armor_bullet = CLOTHING_ARMOR_HIGHPLUS - armor_laser = CLOTHING_ARMOR_MEDIUMLOW - armor_energy = CLOTHING_ARMOR_MEDIUM - armor_bomb = CLOTHING_ARMOR_HIGH - armor_bio = CLOTHING_ARMOR_MEDIUM - armor_rad = CLOTHING_ARMOR_MEDIUMLOW - armor_internaldamage = CLOTHING_ARMOR_HIGHPLUS - -/obj/item/clothing/suit/storage/marine/faction/UPP/heavy/Initialize() - . = ..() - pockets.bypass_w_limit = list( - /obj/item/ammo_magazine/minigun, - /obj/item/ammo_magazine/pkp, - ) - -/obj/item/clothing/suit/storage/marine/faction/UPP/officer - name = "\improper UL4 officer jacket" - desc = "A lightweight jacket, issued to officers of the UPP's military. Slightly protective from incoming damage, best off with proper armor however." - icon_state = "upp_coat_officer" - slowdown = SLOWDOWN_ARMOR_NONE - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS - armor_melee = CLOTHING_ARMOR_LOW //wear actual armor if you go into combat - armor_bullet = CLOTHING_ARMOR_LOW - armor_energy = CLOTHING_ARMOR_LOW - armor_bomb = CLOTHING_ARMOR_LOW - armor_bio = CLOTHING_ARMOR_LOW - armor_rad = CLOTHING_ARMOR_LOW - armor_internaldamage = CLOTHING_ARMOR_LOW - storage_slots = 3 - uniform_restricted = list(/obj/item/clothing/under/marine/veteran/UPP/officer) - -/obj/item/clothing/suit/storage/marine/faction/UPP/kapitan - name = "\improper UL4 senior officer jacket" - desc = "A lightweight jacket, issued to senior officers of the UPP's military. Made of high-quality materials, even going as far as having the ranks and insignia of the Kapitan and their Company emblazoned on the shoulders and front of the jacket. Slightly protective from incoming damage, best off with proper armor however." - icon_state = "upp_coat_kapitan" - slowdown = SLOWDOWN_ARMOR_NONE - armor_melee = CLOTHING_ARMOR_LOW //wear actual armor if you go into combat - armor_bullet = CLOTHING_ARMOR_LOW - armor_energy = CLOTHING_ARMOR_LOW - armor_bomb = CLOTHING_ARMOR_LOW - armor_bio = CLOTHING_ARMOR_LOW - armor_rad = CLOTHING_ARMOR_LOW - armor_internaldamage = CLOTHING_ARMOR_LOW - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS - storage_slots = 4 - uniform_restricted = list(/obj/item/clothing/under/marine/veteran/UPP/officer) - -/obj/item/clothing/suit/storage/marine/faction/UPP/mp - name = "\improper UL4 camouflaged jacket" - desc = "A lightweight jacket, issued to troops when they're not expected to engage in combat. Still studded to the brim with kevlar shards, though the synthread construction reduces its effectiveness." - icon_state = "upp_coat_mp" - slowdown = SLOWDOWN_ARMOR_NONE - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS - armor_melee = CLOTHING_ARMOR_LOW //wear actual armor if you go into combat - armor_bullet = CLOTHING_ARMOR_LOW - armor_energy = CLOTHING_ARMOR_LOW - armor_bomb = CLOTHING_ARMOR_LOW - armor_bio = CLOTHING_ARMOR_LOW - armor_rad = CLOTHING_ARMOR_LOW - armor_internaldamage = CLOTHING_ARMOR_LOW - storage_slots = 4 - uniform_restricted = list(/obj/item/clothing/under/marine/veteran/UPP) - valid_accessory_slots = list(ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_DECOR, ACCESSORY_SLOT_MEDAL) - restricted_accessory_slots = list(ACCESSORY_SLOT_ARMBAND) - -/obj/item/clothing/suit/storage/marine/faction/UPP/jacket/ivan - name = "\improper UH4 Camo Jacket" - desc = "An experimental heavily armored variant of the UL4 given to only the most elite units... usually." - slowdown = SLOWDOWN_ARMOR_MEDIUM - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_ARMS|BODY_FLAG_HANDS|BODY_FLAG_FEET - armor_melee = CLOTHING_ARMOR_HIGH - armor_energy = CLOTHING_ARMOR_MEDIUMLOW - armor_bomb = CLOTHING_ARMOR_HIGH - armor_bio = CLOTHING_ARMOR_MEDIUM - armor_rad = CLOTHING_ARMOR_MEDIUM - armor_internaldamage = CLOTHING_ARMOR_HIGH - storage_slots = 2 - - -//===========================//FREELANCER\\================================\\ -//=====================================================================\\ - -/obj/item/clothing/suit/storage/marine/faction/freelancer - name = "freelancer cuirass" - desc = "An armored protective chestplate scrapped together from various plates. It keeps up remarkably well, as the craftsmanship is solid, and the design mirrors such armors in the UPP and the USCM. The many skilled craftsmen in the freelancers ranks produce these vests at a rate about one a month." - icon_state = "freelancer_armor" - slowdown = SLOWDOWN_ARMOR_LIGHT - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS - armor_melee = CLOTHING_ARMOR_MEDIUMHIGH - armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH - armor_energy = CLOTHING_ARMOR_MEDIUMLOW - storage_slots = 2 - uniform_restricted = list(/obj/item/clothing/under/marine/veteran/freelancer) - -//this one is for CLF -/obj/item/clothing/suit/storage/militia - name = "colonial militia hauberk" - desc = "The hauberk of a colonist militia member, created from boiled leather and some modern armored plates. While not the most powerful form of armor, and primitive compared to most modern suits of armor, it gives the wearer almost perfect mobility, which suits the needs of the local colonists. It is also quick to don, easy to hide, and cheap to produce in large workshops." - icon = 'icons/obj/items/clothing/cm_suits.dmi' - icon_state = "rebel_armor" - item_icons = list( - WEAR_JACKET = 'icons/mob/humans/onmob/suit_1.dmi' - ) - sprite_sheets = list(SPECIES_MONKEY = 'icons/mob/humans/species/monkeys/onmob/suit_monkey_1.dmi') - slowdown = SLOWDOWN_ARMOR_VERY_LIGHT - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_ARMS - movement_compensation = SLOWDOWN_ARMOR_MEDIUM - armor_melee = CLOTHING_ARMOR_MEDIUM - armor_bullet = CLOTHING_ARMOR_MEDIUMLOW - armor_laser = CLOTHING_ARMOR_MEDIUMLOW - armor_energy = CLOTHING_ARMOR_MEDIUMLOW - armor_bomb = CLOTHING_ARMOR_MEDIUM - armor_bio = CLOTHING_ARMOR_MEDIUMLOW - armor_rad = CLOTHING_ARMOR_MEDIUM - armor_internaldamage = CLOTHING_ARMOR_MEDIUM - storage_slots = 2 - uniform_restricted = list(/obj/item/clothing/under/colonist) - allowed = list( - /obj/item/weapon/gun, - /obj/item/tank/emergency_oxygen, - /obj/item/device/flashlight, - /obj/item/ammo_magazine, - /obj/item/explosive/grenade, - /obj/item/device/binoculars, - /obj/item/attachable/bayonet, - /obj/item/storage/backpack/general_belt, - /obj/item/storage/large_holster/machete, - /obj/item/weapon/baseballbat, - /obj/item/weapon/baseballbat/metal, - /obj/item/device/motiondetector, - /obj/item/device/walkman, - ) - flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_FEET|BODY_FLAG_ARMS|BODY_FLAG_HANDS - min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROT - valid_accessory_slots = list(ACCESSORY_SLOT_MEDAL) - -/obj/item/clothing/suit/storage/militia/Initialize() - . = ..() - pockets.max_w_class = SIZE_SMALL //Can contain small items AND rifle magazines. - pockets.bypass_w_limit = list( - /obj/item/ammo_magazine/rifle, - /obj/item/ammo_magazine/smg, - /obj/item/ammo_magazine/sniper, - ) - pockets.max_storage_space = 8 - -/obj/item/clothing/suit/storage/militia/vest - name = "colonial militia vest" - desc = "The hauberk of a colonist militia member, created from boiled leather and some modern armored plates. While not the most powerful form of armor, and primitive compared to most modern suits of armor, it gives the wearer almost perfect mobility, which suits the needs of the local colonists. It is also quick to don, easy to hide, and cheap to produce in large workshops. This extremely light variant protects only the chest and abdomen." - icon_state = "clf_2" - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN - flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN - slowdown = 0.2 - movement_compensation = SLOWDOWN_ARMOR_MEDIUM - -/obj/item/clothing/suit/storage/militia/brace - name = "colonial militia brace" - desc = "The hauberk of a colonist militia member, created from boiled leather and some modern armored plates. While not the most powerful form of armor, and primitive compared to most modern suits of armor, it gives the wearer almost perfect mobility, which suits the needs of the local colonists. It is also quick to don, easy to hide, and cheap to produce in large workshops. This extremely light variant has some of the chest pieces removed." - icon_state = "clf_3" - flags_armor_protection = BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS - flags_cold_protection = BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS - slowdown = 0.2 - movement_compensation = SLOWDOWN_ARMOR_MEDIUM - -/obj/item/clothing/suit/storage/militia/partial - name = "colonial militia partial hauberk" - desc = "The hauberk of a colonist militia member, created from boiled leather and some modern armored plates. While not the most powerful form of armor, and primitive compared to most modern suits of armor, it gives the wearer almost perfect mobility, which suits the needs of the local colonists. It is also quick to don, easy to hide, and cheap to produce in large workshops. This even lighter variant has some of the arm pieces removed." - icon_state = "clf_4" - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS - flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS - slowdown = 0.2 - -/obj/item/clothing/suit/storage/militia/smartgun - name = "colonial militia harness" - desc = "The hauberk of a colonist militia member, created from boiled leather and some modern armored plates. While not the most powerful form of armor, and primitive compared to most modern suits of armor, it gives the wearer almost perfect mobility, which suits the needs of the local colonists. It is also quick to don, easy to hide, and cheap to produce in large workshops. This one has straps interweaved with the plates, that allow the user to fire a captured smartgun, if a bit uncomfortably." - flags_inventory = BLOCKSHARPOBJ|SMARTGUN_HARNESS - -/obj/item/clothing/suit/storage/CMB - name = "\improper CMB jacket" - desc = "A black jacket worn by Colonial Marshals. The back is enscribed with the powerful letters of 'MARSHAL' representing justice, authority, and protection in the outer rim. The laws of the Earth stretch beyond the Sol." - icon_state = "CMB_jacket" - blood_overlay_type = "coat" - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS - flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS - armor_melee = CLOTHING_ARMOR_MEDIUMLOW - armor_bullet = CLOTHING_ARMOR_MEDIUMLOW - armor_energy = CLOTHING_ARMOR_LOW - armor_bomb = CLOTHING_ARMOR_LOW - armor_bio = CLOTHING_ARMOR_LOW - armor_internaldamage = CLOTHING_ARMOR_LOW - allowed = list( - /obj/item/weapon/gun, - /obj/item/storage/fancy/cigarettes, - /obj/item/tool/lighter, - /obj/item/weapon/baton, - /obj/item/handcuffs, - /obj/item/device/binoculars, - /obj/item/attachable/bayonet, - /obj/item/device/flashlight, - /obj/item/device/healthanalyzer, - /obj/item/device/radio, - /obj/item/tank/emergency_oxygen, - /obj/item/tool/crowbar, - /obj/item/tool/crew_monitor, - /obj/item/tool/pen, - /obj/item/storage/belt/gun/m4a3, - /obj/item/storage/belt/gun/m44, - /obj/item/storage/belt/gun/mateba, - /obj/item/storage/belt/gun/smartpistol, - /obj/item/storage/large_holster/machete, - /obj/item/storage/large_holster/katana, - /obj/item/device/motiondetector, - /obj/item/device/walkman, - ) - valid_accessory_slots = list(ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_DECOR) - restricted_accessory_slots = list(ACCESSORY_SLOT_ARMBAND) - -/obj/item/clothing/suit/storage/CMB/Initialize() - . = ..() - pockets.max_w_class = SIZE_SMALL //Can contain small items AND rifle magazines. - pockets.bypass_w_limit = list( - /obj/item/ammo_magazine/rifle, - /obj/item/ammo_magazine/smg, - /obj/item/ammo_magazine/sniper, - ) - pockets.max_storage_space = 8 - -/obj/item/clothing/suit/storage/RO - name = "quartermaster jacket" - desc = "A green jacket worn by USCM personnel. The back has the flag of the United Americas on it." - icon_state = "RO_jacket" - blood_overlay_type = "coat" - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_ARMS - valid_accessory_slots = list(ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_DECOR, ACCESSORY_SLOT_MEDAL) - restricted_accessory_slots = list(ACCESSORY_SLOT_ARMBAND) - -//===========================//HELGHAST - MERCENARY\\================================\\ -//=====================================================================\\ - -/obj/item/clothing/suit/storage/marine/veteran/mercenary - name = "\improper K12 ceramic plated armor" - desc = "A set of grey, heavy ceramic armor with dark blue highlights. It is the standard uniform of an unknown mercenary group working in the sector." - icon_state = "mercenary_heavy_armor" - flags_inventory = BLOCKSHARPOBJ|BLOCK_KNOCKDOWN - armor_melee = CLOTHING_ARMOR_VERYHIGH - armor_bullet = CLOTHING_ARMOR_VERYHIGH - armor_energy = CLOTHING_ARMOR_MEDIUMLOW - armor_bomb = CLOTHING_ARMOR_MEDIUM - armor_bio = CLOTHING_ARMOR_HIGHPLUS - armor_rad = CLOTHING_ARMOR_MEDIUM - armor_internaldamage = CLOTHING_ARMOR_HIGHPLUS - storage_slots = 2 - slowdown = SLOWDOWN_ARMOR_LIGHT - allowed = list( - /obj/item/weapon/gun, - /obj/item/tank/emergency_oxygen, - /obj/item/device/flashlight, - /obj/item/ammo_magazine/, - /obj/item/weapon/baton, - /obj/item/handcuffs, - /obj/item/storage/fancy/cigarettes, - /obj/item/tool/lighter, - /obj/item/explosive/grenade, - /obj/item/storage/bible, - /obj/item/weapon/sword/machete, - /obj/item/attachable/bayonet, - /obj/item/device/motiondetector, - /obj/item/device/walkman, - ) - uniform_restricted = list(/obj/item/clothing/under/marine/veteran/mercenary) - item_state_slots = list(WEAR_JACKET = "mercenary_heavy_armor") - -/obj/item/clothing/suit/storage/marine/veteran/mercenary/heavy - name = "\improper Modified K12 ceramic plated armor" - desc = "A set of grey, heavy ceramic armor with dark blue highlights. It has been modified with extra ceramic plates placed in its storage pouch, and seems intended to support an extremely heavy weapon." - armor_melee = CLOTHING_ARMOR_ULTRAHIGH - armor_bullet = CLOTHING_ARMOR_ULTRAHIGHPLUS - armor_bomb = CLOTHING_ARMOR_HIGHPLUS - armor_bio = CLOTHING_ARMOR_HIGHPLUS - armor_rad = CLOTHING_ARMOR_MEDIUM - armor_internaldamage = CLOTHING_ARMOR_VERYHIGHPLUS - storage_slots = 1 - -/obj/item/clothing/suit/storage/marine/veteran/mercenary/miner - name = "\improper Y8 armored miner vest" - desc = "A set of beige, light armor built for protection while mining. It is a specialized uniform of an unknown mercenary group working in the sector." - icon_state = "mercenary_miner_armor" - storage_slots = 3 - allowed = list( - /obj/item/weapon/gun, - /obj/item/tank/emergency_oxygen, - /obj/item/device/flashlight, - /obj/item/ammo_magazine/, - /obj/item/weapon/baton, - /obj/item/handcuffs, - /obj/item/storage/fancy/cigarettes, - /obj/item/tool/lighter, - /obj/item/explosive/grenade, - /obj/item/storage/bible, - /obj/item/weapon/sword/machete, - /obj/item/attachable/bayonet, - /obj/item/device/motiondetector, - /obj/item/device/walkman, - ) - uniform_restricted = list(/obj/item/clothing/under/marine/veteran/mercenary) - item_state_slots = list(WEAR_JACKET = "mercenary_miner_armor") - -/obj/item/clothing/suit/storage/marine/veteran/mercenary/support - name = "\improper Z7 armored vest" - desc = "A set of blue armor with yellow highlights built for protection while building or carrying out medical treatment in highly dangerous environments. It is a specialized uniform of an unknown mercenary group working in the sector." - icon_state = "mercenary_engineer_armor" - item_state_slots = list(WEAR_JACKET = "mercenary_engineer_armor") - -/obj/item/clothing/suit/storage/marine/M3G/hefa - name = "\improper HEFA Knight armor" - desc = "A thick piece of armor adorning a HEFA. Usually seen on a HEFA knight." - specialty = "HEFA Knight" - icon_state = "hefadier" - flags_atom = NO_NAME_OVERRIDE|NO_SNOW_TYPE - flags_item = NO_CRYO_STORE - flags_marine_armor = ARMOR_LAMP_OVERLAY - armor_bullet = CLOTHING_ARMOR_VERYHIGH - armor_melee = CLOTHING_ARMOR_VERYHIGH - armor_bomb = CLOTHING_ARMOR_GIGAHIGH - - -//=========================//PROVOST\\================================\\ -//=======================================================================\\ - -/obj/item/clothing/suit/storage/marine/MP/provost - name = "\improper M3 pattern Provost armor" - desc = "A standard Provost M3 Pattern Chestplate. Protects the chest from ballistic rounds, bladed objects and accidents. It has a small leather pouch strapped to it for limited storage." - icon_state = "pvmedium" - item_state_slots = list(WEAR_JACKET = "pvmedium") - slowdown = SLOWDOWN_ARMOR_LIGHT - armor_bullet = CLOTHING_ARMOR_MEDIUM - armor_laser = CLOTHING_ARMOR_MEDIUMLOW - armor_bomb = CLOTHING_ARMOR_MEDIUMHIGH - armor_bio = CLOTHING_ARMOR_MEDIUMHIGH - armor_internaldamage = CLOTHING_ARMOR_MEDIUM - flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE - storage_slots = 3 - -/obj/item/clothing/suit/storage/marine/MP/provost/tml - name = "\improper M3 pattern Senior Provost armor" - desc = "A more refined Provost M3 Pattern Chestplate for senior officers. Protects the chest from ballistic rounds, bladed objects and accidents. It has a small leather pouch strapped to it for limited storage." - icon_state = "pvleader" - item_state_slots = list(WEAR_JACKET = "pvleader") - -/obj/item/clothing/suit/storage/marine/MP/provost/marshal - name = "\improper M5 pattern Provost Marshal armor" - desc = "A custom fit luxury armor suit for Provost Marshals. Useful for letting your men know who is in charge when taking to the field." - icon_state = "pvmarshal" - item_state_slots = list(WEAR_JACKET = "pvmarshal") - w_class = SIZE_MEDIUM - storage_slots = 4 - -/obj/item/clothing/suit/storage/marine/MP/provost/light - name = "\improper M3 pattern Provost light armor" - desc = "A lighter Provost M3 Pattern Chestplate. Protects the chest from ballistic rounds, bladed objects and accidents. It has a small leather pouch strapped to it for limited storage." - icon_state = "pvlight" - item_state_slots = list(WEAR_JACKET = "pvlight") - slowdown = SLOWDOWN_ARMOR_VERY_LIGHT - -/obj/item/clothing/suit/storage/marine/MP/provost/light/flexi - name = "\improper M3 pattern Provost flexi-armor" - desc = "A flexible and easy to store M3 Pattern Chestplate. Protects the chest from ballistic rounds, bladed objects and accidents. It has a small leather pouch strapped to it for limited storage." - w_class = SIZE_MEDIUM - icon_state = "pvlight_2" - item_state_slots = list(WEAR_JACKET = "pvlight_2") - storage_slots = 2 - -//================//UNITED AMERICAS ALLIED COMMAND\\=====================\\ -//=======================================================================\\ - -/obj/item/clothing/suit/storage/marine/uaac/tis/sa - name = "\improper M3 pattern UAAC-TIS Special Agent Armor" - desc = "A modified luxury armor, originally meant for a USCM Provost Marshall, modified to use the colors and insignia of the TIS. The Three Eyes is technically able to requisition any equipment or personnel to fulfill its mission and often uses this privilege to outfit their agents with high-quality gear from other UA military forces." - icon_state = "tis" - item_state_slots = list(WEAR_JACKET = "tis") - armor_melee = CLOTHING_ARMOR_MEDIUMHIGH - armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH - armor_laser = CLOTHING_ARMOR_LOW - armor_energy = CLOTHING_ARMOR_LOW - armor_bomb = CLOTHING_ARMOR_MEDIUM - armor_internaldamage = CLOTHING_ARMOR_MEDIUMLOW - storage_slots = 2 - slowdown = SLOWDOWN_ARMOR_LIGHT - flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE - allowed = list( - /obj/item/weapon/gun, - /obj/item/tank/emergency_oxygen, - /obj/item/device/flashlight, - /obj/item/ammo_magazine/, - /obj/item/storage/fancy/cigarettes, - /obj/item/tool/lighter, - /obj/item/weapon/baton, - /obj/item/handcuffs, - /obj/item/explosive/grenade, - /obj/item/device/binoculars, - /obj/item/attachable/bayonet, - /obj/item/storage/backpack/general_belt, - /obj/item/device/hailer, - /obj/item/storage/belt/gun, - /obj/item/weapon/sword/ceremonial, - /obj/item/device/motiondetector, - /obj/item/device/walkman, - ) - uniform_restricted = list(/obj/item/clothing/under/uaac/tis) - -//================//UNITED AMERICAS RIOT CONTROL\\=====================\\ -//=======================================================================\\ - -/obj/item/clothing/suit/storage/marine/veteran/ua_riot - name = "\improper UA-M1 body armor" - desc = "Based on the M-3 pattern employed by the USCM, the UA-M1 body armor is employed by UA security, riot control and union-busting teams. While robust against melee and bullet attacks, it critically lacks coverage of the legs and arms." - icon_state = "ua_riot" - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN - flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN - flags_heat_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN - armor_melee = CLOTHING_ARMOR_MEDIUMHIGH - armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH - armor_energy = CLOTHING_ARMOR_MEDIUM - armor_bomb = CLOTHING_ARMOR_MEDIUM - armor_rad = CLOTHING_ARMOR_MEDIUM - armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH - slowdown = SLOWDOWN_ARMOR_VERY_LIGHT // it's lighter - uniform_restricted = list(/obj/item/clothing/under/marine/ua_riot) - flags_atom = NO_SNOW_TYPE - -//==================War Correspondent==================\\ - -/obj/item/clothing/suit/storage/marine/light/reporter - name = "press body armor" - desc = "Body armor used by war correspondents in battles and wars across the universe." - icon = 'icons/mob/humans/onmob/contained/war_correspondent.dmi' - icon_state = "wc_armor" - flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE - contained_sprite = TRUE - - -//=ROYAL MARINES=\\ - -/obj/item/clothing/suit/storage/marine/veteran/royal_marine - name = "kestrel armoured vest" - desc = "A customizable personal armor system used by the Three World Empire's Royal Marines Commandos. Designers from a Weyland Yutani subsidary, Lindenthal-Ehrenfeld Militärindustrie, iterated on the USCMC's M3 pattern personal armor in their Tokonigara lab to create an armor systemed to suit the unique needs of the Three World Empire's smaller but better equipped Royal Marines." - icon_state = "rmc_light" - item_state = "rmc_light" - flags_atom = NO_NAME_OVERRIDE|NO_SNOW_TYPE - allowed = list( - /obj/item/weapon/gun, - /obj/item/tank/emergency_oxygen, - /obj/item/device/flashlight, - /obj/item/ammo_magazine/, - /obj/item/weapon/baton, - /obj/item/handcuffs, - /obj/item/storage/fancy/cigarettes, - /obj/item/tool/lighter, - /obj/item/explosive/grenade, - /obj/item/storage/bible, - /obj/item/weapon/sword/machete, - /obj/item/attachable/bayonet, - /obj/item/device/motiondetector, - /obj/item/device/walkman, - ) - -/obj/item/clothing/suit/storage/marine/veteran/royal_marine/light //RMC Rifleman Armor - icon_state = "rmc_light" - item_state = "rmc_light" - armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH - armor_energy = CLOTHING_ARMOR_MEDIUMLOW - armor_bomb = CLOTHING_ARMOR_MEDIUM - armor_rad = CLOTHING_ARMOR_MEDIUM - slowdown = SLOWDOWN_ARMOR_LIGHT - -/obj/item/clothing/suit/storage/marine/veteran/royal_marine/light/team_leader //RMC TL & LT Armor - name = "kestrel armoured carry vest" - icon_state = "rmc_light_padded" - item_state = "rmc_light_padded" - storage_slots = 7 - -/obj/item/clothing/suit/storage/marine/veteran/royal_marine/smartgun //Smartgun Spec Armor - name = "kestrel armoured smartgun harness" - icon_state = "rmc_smartgun" - item_state = "rmc_smartgun" - flags_inventory = BLOCKSHARPOBJ|BLOCK_KNOCKDOWN|SMARTGUN_HARNESS - -/obj/item/clothing/suit/storage/marine/veteran/royal_marine/pointman //Pointman Spec Armor - name = "kestrel pointman armour" - desc = "A heavier version of the armor system used by the Three World Empire's Royal Marines Commandos. Designers from a Weyland Yutani subsidary, Lindenthal-Ehrenfeld Militärindustrie, iterated on the USCMC's M3 pattern personal armor in their Tokonigara lab to create an armor systemed to suit the unique needs of the Three World Empire's smaller but better equipped Royal Marines." - icon_state = "rmc_pointman" - item_state = "rmc_pointman" - armor_melee = CLOTHING_ARMOR_HIGH - armor_bullet = CLOTHING_ARMOR_HIGHPLUS - armor_bomb = CLOTHING_ARMOR_HIGHPLUS - armor_bio = CLOTHING_ARMOR_MEDIUM - armor_rad = CLOTHING_ARMOR_MEDIUM - armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH - storage_slots = 7 - slowdown = SLOWDOWN_ARMOR_LOWHEAVY - movement_compensation = SLOWDOWN_ARMOR_MEDIUM - -/atom/movable/marine_light - light_system = DIRECTIONAL_LIGHT - -//CBRN -/obj/item/clothing/suit/storage/marine/cbrn - name = "\improper M3-M armor" - desc = "While lacking the appearance of the M3 pattern armor worn in regular service, this armor piece is still a derivative of it. It has been heavily modified to fit over the MOPP suit with additional padding and Venlar composite layers removed, so as not to restrict the wearer’s movement. However, with the reduction of composite layers, the personal protection offered is less than desired with complaints having been lodged since 2165." - icon_state = "cbrn" - item_state = "cbrn" - slowdown = SLOWDOWN_ARMOR_HEAVY - armor_melee = CLOTHING_ARMOR_MEDIUM - armor_bullet = CLOTHING_ARMOR_MEDIUM - armor_bomb = CLOTHING_ARMOR_MEDIUM - armor_bio = CLOTHING_ARMOR_LOW - armor_rad =CLOTHING_ARMOR_MEDIUMLOW - armor_internaldamage = CLOTHING_ARMOR_LOW - flags_marine_armor = NO_FLAGS - flags_atom = NO_NAME_OVERRIDE|NO_SNOW_TYPE - flags_inventory = BLOCKSHARPOBJ - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN - flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN - flags_heat_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN - uniform_restricted = list(/obj/item/clothing/under/marine/cbrn) - -/obj/item/clothing/suit/storage/marine/cbrn/advanced - slowdown = SLOWDOWN_ARMOR_LOWHEAVY - armor_melee = CLOTHING_ARMOR_HIGH - armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH - armor_bomb = CLOTHING_ARMOR_ULTRAHIGH - armor_bio = CLOTHING_ARMOR_GIGAHIGHPLUS - armor_rad = CLOTHING_ARMOR_GIGAHIGHPLUS - armor_internaldamage = CLOTHING_ARMOR_HIGHPLUS diff --git a/code/modules/clothing/suits/marine_armor/_marine_armor.dm b/code/modules/clothing/suits/marine_armor/_marine_armor.dm new file mode 100644 index 000000000000..89b284be86b0 --- /dev/null +++ b/code/modules/clothing/suits/marine_armor/_marine_armor.dm @@ -0,0 +1,669 @@ +#define DEBUG_ARMOR_PROTECTION 0 + +#if DEBUG_ARMOR_PROTECTION +/mob/living/carbon/human/verb/check_overall_protection() + set name = "Get Armor Value" + set category = "Debug" + set desc = "Shows the armor value of the bullet category." + + var/armor = 0 + var/counter = 0 + for(var/X in H.limbs) + var/obj/limb/E = X + armor = getarmor_organ(E, ARMOR_BULLET) + to_chat(src, SPAN_DEBUG("[E.name] is protected with [armor] armor against bullets.")) + counter += armor + to_chat(src, SPAN_DEBUG("The overall armor score is: [counter].")) +#endif + +//=======================================================================\\ +//=======================================================================\\ + +#define ALPHA 1 +#define BRAVO 2 +#define CHARLIE 3 +#define DELTA 4 +#define ECHO 5 +#define CRYO 6 +#define SOF 7 +#define NOSQUAD 8 + +// MARINE STORAGE ARMOR + +/obj/item/clothing/suit/storage/marine + name = "\improper M3 pattern marine armor" + desc = "A standard Colonial Marines M3 Pattern Chestplate. Protects the chest from ballistic rounds, bladed objects and accidents. It has a small leather pouch strapped to it for limited storage." + icon = 'icons/obj/items/clothing/cm_suits.dmi' + icon_state = "1" + item_state = "marine_armor" //Make unique states for Officer & Intel armors. + item_icons = list( + WEAR_JACKET = 'icons/mob/humans/onmob/suit_1.dmi' + ) + flags_atom = FPRINT|CONDUCT + flags_inventory = BLOCKSHARPOBJ + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS + flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS + flags_heat_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS + min_cold_protection_temperature = HELMET_MIN_COLD_PROT + max_heat_protection_temperature = HELMET_MAX_HEAT_PROT + blood_overlay_type = "armor" + armor_melee = CLOTHING_ARMOR_MEDIUM + armor_bullet = CLOTHING_ARMOR_MEDIUM + armor_laser = CLOTHING_ARMOR_MEDIUMLOW + armor_energy = CLOTHING_ARMOR_NONE + armor_bomb = CLOTHING_ARMOR_MEDIUMLOW + armor_bio = CLOTHING_ARMOR_MEDIUM + armor_rad = CLOTHING_ARMOR_MEDIUMLOW + armor_internaldamage = CLOTHING_ARMOR_MEDIUM + movement_compensation = SLOWDOWN_ARMOR_LIGHT + storage_slots = 3 + siemens_coefficient = 0.7 + slowdown = SLOWDOWN_ARMOR_MEDIUM + allowed = list( + /obj/item/weapon/gun, + /obj/item/prop/prop_gun, + /obj/item/tank/emergency_oxygen, + /obj/item/device/flashlight, + /obj/item/storage/fancy/cigarettes, + /obj/item/tool/lighter, + /obj/item/storage/bible, + /obj/item/attachable/bayonet, + /obj/item/storage/backpack/general_belt, + /obj/item/storage/large_holster/machete, + /obj/item/storage/belt/gun/type47, + /obj/item/storage/belt/gun/m4a3, + /obj/item/storage/belt/gun/m44, + /obj/item/storage/belt/gun/smartpistol, + /obj/item/storage/belt/gun/flaregun, + /obj/item/device/motiondetector, + /obj/item/device/walkman, + /obj/item/storage/belt/gun/m39, + /obj/item/storage/belt/gun/xm51, + ) + valid_accessory_slots = list(ACCESSORY_SLOT_MEDAL, ACCESSORY_SLOT_PONCHO) + + light_power = 3 + light_range = 4 + light_system = MOVABLE_LIGHT + + var/flashlight_cooldown = 0 //Cooldown for toggling the light + var/locate_cooldown = 0 //Cooldown for SL locator + var/armor_overlays[] + actions_types = list(/datum/action/item_action/toggle) + var/flags_marine_armor = ARMOR_SQUAD_OVERLAY|ARMOR_LAMP_OVERLAY + var/specialty = "M3 pattern marine" //Same thing here. Give them a specialty so that they show up correctly in vendors. speciality does NOTHING if you have NO_NAME_OVERRIDE + w_class = SIZE_HUGE + uniform_restricted = list(/obj/item/clothing/under/marine) + sprite_sheets = list(SPECIES_MONKEY = 'icons/mob/humans/species/monkeys/onmob/suit_monkey_1.dmi') + time_to_unequip = 20 + time_to_equip = 20 + pickup_sound = "armorequip" + drop_sound = "armorequip" + equip_sounds = list('sound/handling/putting_on_armor1.ogg') + var/armor_variation = 0 + /// The dmi where the grayscale squad overlays are contained + var/squad_overlay_icon = 'icons/mob/humans/onmob/suit_1.dmi' + + var/atom/movable/marine_light/light_holder + +/obj/item/clothing/suit/storage/marine/Initialize(mapload) + . = ..() + if(!(flags_atom & NO_NAME_OVERRIDE)) + name = "[specialty]" + if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD]) + name += " snow armor" //Leave marine out so that armors don't have to have "Marine" appended (see: generals). + else + name += " armor" + + if(!(flags_atom & NO_SNOW_TYPE)) + select_gamemode_skin(type) + armor_overlays = list("lamp") //Just one for now, can add more later. + if(armor_variation && mapload) + set_armor_style("Random") + update_icon() + pockets.max_w_class = SIZE_SMALL //Can contain small items AND rifle magazines. + pockets.bypass_w_limit = list( + /obj/item/ammo_magazine/rifle, + /obj/item/ammo_magazine/smg, + /obj/item/ammo_magazine/sniper, + ) + pockets.max_storage_space = 8 + + light_holder = new(src) + +/obj/item/clothing/suit/storage/marine/Destroy() + QDEL_NULL(light_holder) + return ..() + +/obj/item/clothing/suit/storage/marine/update_icon(mob/user) + var/image/I + armor_overlays["lamp"] = null + if(flags_marine_armor & ARMOR_LAMP_OVERLAY) + if(flags_marine_armor & ARMOR_LAMP_ON) + I = image('icons/obj/items/clothing/cm_suits.dmi', src, "lamp-on") + else + I = image('icons/obj/items/clothing/cm_suits.dmi', src, "lamp-off") + armor_overlays["lamp"] = I + overlays += I + else armor_overlays["lamp"] = null + if(user) user.update_inv_wear_suit() + + +/obj/item/clothing/suit/storage/marine/post_vendor_spawn_hook(mob/living/carbon/human/user) //used for randomizing/selecting a variant for armors. + if(!armor_variation) + return + + if(user?.client?.prefs) + // Set the armor style to the user's preference. + set_armor_style(user.client.prefs.preferred_armor) + else + // Or if that isn't possible, just pick a random one. + set_armor_style("Random") + update_icon(user) + +/obj/item/clothing/suit/storage/marine/attack_self(mob/user) + ..() + + if(!isturf(user.loc)) + to_chat(user, SPAN_WARNING("You cannot turn the light [light_on ? "off" : "on"] while in [user.loc].")) //To prevent some lighting anomalies. + return + + if(flashlight_cooldown > world.time) + return + if(!ishuman(user)) + return + + var/mob/living/carbon/human/H = user + if(H.wear_suit != src) + return + + turn_light(user, !light_on) + +/obj/item/clothing/suit/storage/marine/item_action_slot_check(mob/user, slot) + if(!ishuman(user)) + return FALSE + if(slot != WEAR_JACKET) + return FALSE + return TRUE //only give action button when armor is worn. + +/obj/item/clothing/suit/storage/marine/turn_light(mob/user, toggle_on) + . = ..() + if(. != CHECKS_PASSED) + return + set_light_range(initial(light_range)) + set_light_power(Floor(initial(light_power) * 0.5)) + set_light_on(toggle_on) + flags_marine_armor ^= ARMOR_LAMP_ON + + light_holder.set_light_flags(LIGHT_ATTACHED) + light_holder.set_light_range(initial(light_range)) + light_holder.set_light_power(initial(light_power)) + light_holder.set_light_on(toggle_on) + + if(!toggle_on) + playsound(src, 'sound/handling/click_2.ogg', 50, 1) + + playsound(src, 'sound/handling/suitlight_on.ogg', 50, 1) + update_icon(user) + + for(var/X in actions) + var/datum/action/A = X + A.update_button_icon() + +/obj/item/clothing/suit/storage/marine/mob_can_equip(mob/living/carbon/human/M, slot, disable_warning = 0) + . = ..() + if (.) + if(issynth(M) && M.allow_gun_usage == FALSE && !(flags_marine_armor & SYNTH_ALLOWED)) + M.visible_message(SPAN_DANGER("Your programming prevents you from wearing this!")) + return 0 + +/** + * Updates the armor's `icon_state` to the style represented by `new_style`. + * + * Arguments: + * * new_style - The new armor style. May only be one of `GLOB.armor_style_list`'s keys, or `"Random"`. + */ +/obj/item/clothing/suit/storage/marine/proc/set_armor_style(new_style) + // Regex to match one or more digits. + var/static/regex/digits = new("\\d+") + // Integer for the new armor style's `icon_state`. + var/new_look + + if(new_style == "Random") + // The style icon states are all numbers between 1 and `armor_variation`, so this picks a random one. + new_look = rand(1, armor_variation) + else + new_look = GLOB.armor_style_list[new_style] + + // Replace the digits in the current icon state with `new_look`. (E.g. "L6" -> "L2") + icon_state = digits.Replace(icon_state, new_look) + +/obj/item/clothing/suit/storage/marine/medium/rto + icon_state = "io" + 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 + storage_slots = 4 + light_range = 5 //slightly higher + specialty = "M4 pattern marine" + +/obj/item/clothing/suit/storage/marine/MP + name = "\improper M2 pattern MP armor" + desc = "A standard Colonial Marines M2 Pattern Chestplate. Protects the chest from ballistic rounds, bladed objects and accidents. It has a small leather pouch strapped to it for limited storage." + icon_state = "mp_armor" + armor_melee = CLOTHING_ARMOR_MEDIUMHIGH + armor_bullet = CLOTHING_ARMOR_LOW + armor_laser = CLOTHING_ARMOR_LOW + armor_energy = CLOTHING_ARMOR_LOW + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_bio = CLOTHING_ARMOR_MEDIUMLOW + armor_internaldamage = CLOTHING_ARMOR_MEDIUMLOW + storage_slots = 2 + slowdown = SLOWDOWN_ARMOR_LIGHT + allowed = list( + /obj/item/weapon/gun, + /obj/item/tank/emergency_oxygen, + /obj/item/device/flashlight, + /obj/item/ammo_magazine/, + /obj/item/storage/fancy/cigarettes, + /obj/item/tool/lighter, + /obj/item/weapon/baton, + /obj/item/handcuffs, + /obj/item/explosive/grenade, + /obj/item/device/binoculars, + /obj/item/attachable/bayonet, + /obj/item/storage/backpack/general_belt, + /obj/item/device/hailer, + /obj/item/storage/belt/gun, + /obj/item/weapon/sword/ceremonial, + /obj/item/device/motiondetector, + /obj/item/device/walkman, + ) + uniform_restricted = list(/obj/item/clothing/under/marine/mp) + specialty = "M2 pattern MP" + item_state_slots = list(WEAR_JACKET = "mp_armor") + black_market_value = 20 + +/obj/item/clothing/suit/storage/marine/MP/warden + icon_state = "warden" + name = "\improper M3 pattern warden MP armor" + desc = "A well-crafted suit of M3 Pattern Armor typically distributed to Wardens. Useful for letting your men know who is in charge." + armor_bio = CLOTHING_ARMOR_MEDIUMLOW + armor_rad = CLOTHING_ARMOR_MEDIUMLOW + uniform_restricted = list(/obj/item/clothing/under/marine/warden) + specialty = "M3 pattern warden MP" + item_state_slots = list(WEAR_JACKET = "warden") + +/obj/item/clothing/suit/storage/marine/MP/WO + icon_state = "warrant_officer" + name = "\improper M3 pattern chief MP armor" + desc = "A well-crafted suit of M3 Pattern Armor typically distributed to Chief MPs. Useful for letting your men know who is in charge." + uniform_restricted = list(/obj/item/clothing/under/marine/officer/warrant) + specialty = "M3 pattern chief MP" + item_state_slots = list(WEAR_JACKET = "warrant_officer") + black_market_value = 30 + +/obj/item/clothing/suit/storage/marine/MP/general + name = "\improper M3 pattern general officer armor" + desc = "A well-crafted suit of M3 Pattern Armor with a gold shine. It looks very expensive, but shockingly fairly easy to carry and wear." + icon_state = "general" + armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH + armor_bio = CLOTHING_ARMOR_MEDIUM + uniform_restricted = list(/obj/item/clothing/under/marine/officer/general) + specialty = "M3 pattern general" + item_state_slots = list(WEAR_JACKET = "general") + w_class = SIZE_MEDIUM + +/obj/item/clothing/suit/storage/marine/MP/SO + name = "\improper M3 pattern officer armor" + desc = "A well-crafted suit of M3 Pattern Armor typically found in the hands of higher-ranking officers. Useful for letting your men know who is in charge when taking to the field." + icon_state = "officer" + storage_slots = 3 + flags_atom = null + uniform_restricted = list(/obj/item/clothing/under/marine/officer, /obj/item/clothing/under/rank/qm_suit, /obj/item/clothing/under/rank/chief_medical_officer, /obj/item/clothing/under/marine/dress) + specialty = "M3 pattern officer" + item_state_slots = list(WEAR_JACKET = "officer") + +//Making a new object because we might want to edit armor values and such. +//Or give it its own sprite. It's more for the future. +/obj/item/clothing/suit/storage/marine/MP/CO + name = "\improper M3 pattern commanding officer armor" + desc = "A robust, well-polished suit of armor for the Commanding Officer. Custom-made to fit its owner with special straps to operate a smartgun. Show those Marines who's really in charge." + icon_state = "co_officer" + item_state = "co_officer" + armor_bullet = CLOTHING_ARMOR_HIGH + storage_slots = 3 + flags_atom = NO_SNOW_TYPE + flags_inventory = BLOCKSHARPOBJ|SMARTGUN_HARNESS + uniform_restricted = list(/obj/item/clothing/under/marine, /obj/item/clothing/under/rank/qm_suit) + specialty = "M3 pattern captain" + item_state_slots = list(WEAR_JACKET = "co_officer") + valid_accessory_slots = list(ACCESSORY_SLOT_MEDAL, ACCESSORY_SLOT_RANK, ACCESSORY_SLOT_DECOR, ACCESSORY_SLOT_PONCHO) + black_market_value = 35 + + +/obj/item/clothing/suit/storage/marine/MP/CO/jacket + name = "\improper M3 pattern commanding officer armored coat" + desc = "A robust, well-polished suit of armor for the Commanding Officer. Custom-made to fit its owner with special straps to operate a smartgun. Show those Marines who's really in charge. This one has a coat over it for added warmth." + icon_state = "bridge_coat_armored" + item_state = "bridge_coat_armored" + item_state_slots = list(WEAR_JACKET = "bridge_coat_armored") + valid_accessory_slots = list(ACCESSORY_SLOT_MEDAL, ACCESSORY_SLOT_RANK) + +/obj/item/clothing/suit/storage/marine/medium/leader + name = "\improper B12 pattern marine armor" + desc = "A lightweight suit of carbon fiber body armor built for quick movement. Designed in a lovely forest green. Use it to toggle the built-in flashlight." + icon_state = "7" + armor_variation = 0 + armor_melee = CLOTHING_ARMOR_MEDIUMHIGH + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_bio = CLOTHING_ARMOR_MEDIUMHIGH + armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH + specialty = "B12 pattern marine" + light_range = 5 + +/obj/item/clothing/suit/storage/marine/tanker + name = "\improper M3 pattern tanker armor" + desc = "A modified and refashioned suit of M3 Pattern armor designed to be worn by the loader of a USCM vehicle crew. While the suit is a bit more encumbering to wear with the crewman uniform, it offers the loader a degree of protection that would otherwise not be enjoyed." + icon_state = "tanker" + uniform_restricted = list(/obj/item/clothing/under/marine/officer/tanker) + specialty = "M3 pattern tanker" + storage_slots = 2 + +//===========================//PFC ARMOR CLASSES\\================================\\ +//=================================================================================\\ + +// M3 pattern marine armor +/obj/item/clothing/suit/storage/marine/medium + armor_variation = 6 + light_power = 4 + +/obj/item/clothing/suit/storage/marine/medium/padded + name = "M3 pattern padded marine armor" + icon_state = "1" + armor_variation = 0 + specialty = "M3 pattern padded marine" + +/obj/item/clothing/suit/storage/marine/medium/padless + name = "M3 pattern padless marine armor" + icon_state = "2" + armor_variation = 0 + specialty = "M3 pattern padless marine" + +/obj/item/clothing/suit/storage/marine/medium/padless_lines + name = "M3 pattern ridged marine armor" + icon_state = "3" + armor_variation = 0 + specialty = "M3 pattern ridged marine" + +/obj/item/clothing/suit/storage/marine/medium/carrier + name = "M3 pattern carrier marine armor" + icon_state = "4" + armor_variation = 0 + specialty = "M3 pattern carrier marine" + +/obj/item/clothing/suit/storage/marine/medium/skull + name = "M3 pattern skull marine armor" + icon_state = "5" + armor_variation = 0 + specialty = "M3 pattern skull marine" + +/obj/item/clothing/suit/storage/marine/medium/smooth + name = "M3 pattern smooth marine armor" + icon_state = "6" + armor_variation = 0 + specialty = "M3 pattern smooth marine" + +// M3-L pattern light armor +/obj/item/clothing/suit/storage/marine/light + name = "\improper M3-L pattern light armor" + desc = "A lighter, cut down version of the standard M3 pattern armor. It sacrifices durability for more speed." + specialty = "\improper M3-L pattern light" + icon_state = "L1" + armor_variation = 6 + slowdown = SLOWDOWN_ARMOR_LIGHT + armor_melee = CLOTHING_ARMOR_MEDIUMLOW + armor_bullet = CLOTHING_ARMOR_MEDIUMLOW + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_bio = CLOTHING_ARMOR_MEDIUMLOW + armor_rad = CLOTHING_ARMOR_MEDIUMHIGH + armor_internaldamage = CLOTHING_ARMOR_LOW + storage_slots = 2 + +/obj/item/clothing/suit/storage/marine/light/padded + icon_state = "L1" + armor_variation = 0 + +/obj/item/clothing/suit/storage/marine/light/padless + icon_state = "L2" + armor_variation = 0 + +/obj/item/clothing/suit/storage/marine/light/padless_lines + icon_state = "L3" + armor_variation = 0 + +/obj/item/clothing/suit/storage/marine/light/carrier + icon_state = "L4" + armor_variation = 0 + +/obj/item/clothing/suit/storage/marine/light/skull + icon_state = "L5" + armor_variation = 0 + +/obj/item/clothing/suit/storage/marine/light/smooth + icon_state = "L6" + armor_variation = 0 + +/obj/item/clothing/suit/storage/marine/light/vest + name = "\improper M3-VL pattern ballistics vest" + desc = "Up until 2182 USCM non-combat personnel were issued non-standardized ballistics vests, though the lack of IMP compatibility and suit lamps proved time and time again inefficient. This modified M3-L shell is the result of a 6-year R&D program; It provides utility, protection, AND comfort to all USCM non-combat personnel." + icon_state = "VL" + flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE + flags_marine_armor = ARMOR_LAMP_OVERLAY //No squad colors when wearing this since it'd look funny. + armor_melee = CLOTHING_ARMOR_MEDIUMLOW + armor_bullet = CLOTHING_ARMOR_HIGH + armor_energy = CLOTHING_ARMOR_LOW + armor_bomb = CLOTHING_ARMOR_LOW + armor_bio = CLOTHING_ARMOR_VERYLOW + armor_rad = CLOTHING_ARMOR_NONE + armor_internaldamage = CLOTHING_ARMOR_MEDIUM + storage_slots = 1 + time_to_unequip = 0.5 SECONDS + time_to_equip = 1 SECONDS + siemens_coefficient = 0.7 + uniform_restricted = null + +/obj/item/clothing/suit/storage/marine/light/vest/dcc + name = "\improper M3-VL pattern flak vest" + desc = "A combination of the standard non-combat M3-VL ballistics vest and M70 flak jacket, this piece of armor has been distributed to dropship crew to keep them safe from threats external and internal..." + icon_state = "VL_FLAK" + storage_slots = 2 + +/obj/item/clothing/suit/storage/marine/light/synvest + name = "\improper M3A1 Synthetic Utility Vest" + desc = "This variant of the ubiquitous M3 pattern ballistics vest has been extensively modified, providing no protection in exchange for maximum mobility and storage space. Synthetic programming compliant." + icon_state = "VL_syn_camo" + flags_atom = NO_NAME_OVERRIDE + flags_marine_armor = ARMOR_LAMP_OVERLAY|SYNTH_ALLOWED //No squad colors + can be worn by synths. + armor_melee = CLOTHING_ARMOR_NONE + armor_bullet = CLOTHING_ARMOR_NONE + armor_laser = CLOTHING_ARMOR_NONE + armor_energy = CLOTHING_ARMOR_NONE + armor_bomb = CLOTHING_ARMOR_NONE + armor_bio = CLOTHING_ARMOR_NONE + armor_rad = CLOTHING_ARMOR_NONE + armor_internaldamage = CLOTHING_ARMOR_NONE + storage_slots = 3 + slowdown = SLOWDOWN_ARMOR_VERY_LIGHT + time_to_unequip = 0.5 SECONDS + time_to_equip = 1 SECONDS + uniform_restricted = null + +/obj/item/clothing/suit/storage/marine/light/synvest/grey + icon_state = "VL_syn" + flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE + +/obj/item/clothing/suit/storage/marine/light/synvest/jungle + icon_state = "VL_syn_camo" + flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE + +/obj/item/clothing/suit/storage/marine/light/synvest/snow + icon_state = "s_VL_syn_camo" + flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE + +/obj/item/clothing/suit/storage/marine/light/synvest/desert + icon_state = "d_VL_syn_camo" + flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE + +/obj/item/clothing/suit/storage/marine/light/synvest/dgrey + icon_state = "c_VL_syn_camo" + flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE + +// M3-EOD pattern heavy armor +/obj/item/clothing/suit/storage/marine/heavy + name = "\improper M3-EOD pattern heavy armor" + desc = "A heavier version of the standard M3 pattern armor, the armor is primarily designed to withstand ballistic, explosive, and internal damage, with the drawback of increased bulk and thus reduced movement speed, alongside little additional protection from standard blunt force impacts and biological threats." + desc_lore = "This configuration of the iconic armor was developed during the Canton War in 2160 between the UPP and USCM - Designed in response to a need for higher protection for ComTechs assigned as EODs during the conflict, this is the pinnacle of protection for your average marine. The shoulders and kneepads have both been expanded upon heavily, covering up the arteries on each limb. A special spall liner was developed for this suit, with the same technology being used in the M70 Flak Jacket being developed at the same time." + specialty = "\improper M3-EOD pattern" + icon_state = "H1" + armor_variation = 6 + armor_melee = CLOTHING_ARMOR_MEDIUMHIGH + armor_bullet = CLOTHING_ARMOR_HIGHPLUS + armor_bomb = CLOTHING_ARMOR_HIGHPLUS + armor_bio = CLOTHING_ARMOR_MEDIUMHIGH + armor_rad = CLOTHING_ARMOR_MEDIUM + armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH + storage_slots = 2 + slowdown = SLOWDOWN_ARMOR_LOWHEAVY + movement_compensation = SLOWDOWN_ARMOR_MEDIUM + light_power = 4 + light_range = 5 + +/obj/item/clothing/suit/storage/marine/heavy/padded + icon_state = "H1" + armor_variation = 0 + +/obj/item/clothing/suit/storage/marine/heavy/padless + icon_state = "H2" + armor_variation = 0 + +/obj/item/clothing/suit/storage/marine/heavy/padless_lines + icon_state = "H3" + armor_variation = 0 + +/obj/item/clothing/suit/storage/marine/heavy/carrier + icon_state = "H4" + armor_variation = 0 + +/obj/item/clothing/suit/storage/marine/heavy/skull + icon_state = "H5" + armor_variation = 0 + +/obj/item/clothing/suit/storage/marine/heavy/smooth + icon_state = "H6" + armor_variation = 0 + +//===========================//SPECIALIST\\================================\\ +//=======================================================================\\ + +/obj/item/clothing/suit/storage/marine/specialist + name = "\improper B18 defensive armor" + desc = "A heavy, rugged set of armor plates for when you really, really need to not die horribly. Slows you down though.\nComes with two tricord injectors in each arm guard." + icon_state = "xarmor" + armor_melee = CLOTHING_ARMOR_HIGH + armor_bullet = CLOTHING_ARMOR_HIGH + armor_bomb = CLOTHING_ARMOR_VERYHIGH + armor_bio = CLOTHING_ARMOR_MEDIUMLOW + armor_rad = CLOTHING_ARMOR_MEDIUMHIGH + armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH + storage_slots = 2 + flags_inventory = BLOCKSHARPOBJ|BLOCK_KNOCKDOWN + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET + flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET + flags_heat_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET + slowdown = SLOWDOWN_ARMOR_HEAVY + specialty = "B18 defensive" + unacidable = TRUE + var/injections = 4 + +/obj/item/clothing/suit/storage/marine/specialist/verb/inject() + set name = "Create Injector" + set category = "Object" + set src in usr + + if(usr.is_mob_incapacitated()) + return 0 + + if(!injections) + to_chat(usr, "Your armor is all out of injectors.") + return 0 + + if(usr.get_active_hand()) + to_chat(usr, "Your active hand must be empty.") + return 0 + + to_chat(usr, "You feel a faint hiss and an injector drops into your hand.") + var/obj/item/reagent_container/hypospray/autoinjector/skillless/O = new(usr) + usr.put_in_active_hand(O) + injections-- + playsound(src,'sound/machines/click.ogg', 15, 1) + return + +/obj/item/clothing/suit/storage/marine/M3G + name = "\improper M3-G4 grenadier armor" + desc = "A custom set of M3 armor packed to the brim with padding, plating, and every form of ballistic protection under the sun. Used exclusively by USCM Grenadiers." + icon_state = "grenadier" + armor_melee = CLOTHING_ARMOR_MEDIUMHIGH + armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH + armor_bomb = CLOTHING_ARMOR_VERYHIGH + armor_bio = CLOTHING_ARMOR_MEDIUMLOW + armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH + flags_inventory = BLOCKSHARPOBJ|BLOCK_KNOCKDOWN + flags_item = MOB_LOCK_ON_EQUIP|NO_CRYO_STORE + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET + flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET + flags_heat_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET + slowdown = SLOWDOWN_ARMOR_HEAVY + specialty = "M3-G4 grenadier" + unacidable = TRUE + +/obj/item/clothing/suit/storage/marine/M3T + name = "\improper M3-T light armor" + desc = "A custom set of M3 armor designed for users of long-ranged explosive weaponry." + icon_state = "demolitionist" + armor_bomb = CLOTHING_ARMOR_HIGH + slowdown = SLOWDOWN_ARMOR_LIGHT + specialty = "M3-T light" + flags_item = MOB_LOCK_ON_EQUIP|NO_CRYO_STORE + unacidable = TRUE + +/obj/item/clothing/suit/storage/marine/M3S + name = "\improper M3-S light armor" + desc = "A custom set of M3 armor designed for USCM Scouts." + icon_state = "scout_armor" + armor_melee = CLOTHING_ARMOR_MEDIUMHIGH + slowdown = SLOWDOWN_ARMOR_LIGHT + specialty = "M3-S light" + flags_item = MOB_LOCK_ON_EQUIP|NO_CRYO_STORE + unacidable = TRUE + +/obj/item/clothing/suit/storage/RO + name = "quartermaster jacket" + desc = "A green jacket worn by USCM personnel. The back has the flag of the United Americas on it." + icon_state = "RO_jacket" + blood_overlay_type = "coat" + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_ARMS + valid_accessory_slots = list(ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_DECOR, ACCESSORY_SLOT_MEDAL) + restricted_accessory_slots = list(ACCESSORY_SLOT_ARMBAND) + +//==================War Correspondent==================\\ + +/obj/item/clothing/suit/storage/marine/light/reporter + name = "press body armor" + desc = "Body armor used by war correspondents in battles and wars across the universe." + icon = 'icons/mob/humans/onmob/contained/war_correspondent.dmi' + icon_state = "wc_armor" + flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE + contained_sprite = TRUE diff --git a/code/modules/clothing/suits/marine_armor/ert.dm b/code/modules/clothing/suits/marine_armor/ert.dm new file mode 100644 index 000000000000..17816b93dc15 --- /dev/null +++ b/code/modules/clothing/suits/marine_armor/ert.dm @@ -0,0 +1,822 @@ +//=============================//Marine Raiders\\==================================\\ +//=======================================================================\\ + +/obj/item/clothing/suit/storage/marine/sof + name = "\improper SOF Armor" + desc = "A heavily customized suit of M3 armor. Used by Marine Raiders." + icon_state = "marsoc" + armor_melee = CLOTHING_ARMOR_HIGH + armor_bullet = CLOTHING_ARMOR_HIGH + armor_bomb = CLOTHING_ARMOR_VERYHIGH + armor_bio = CLOTHING_ARMOR_MEDIUMLOW + armor_rad = CLOTHING_ARMOR_MEDIUMHIGH + armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH + slowdown = SLOWDOWN_ARMOR_LIGHT + unacidable = TRUE + flags_atom = MOB_LOCK_ON_EQUIP|NO_CRYO_STORE|NO_SNOW_TYPE + storage_slots = 4 + + +//=============================//PMCs\\==================================\\ +//=======================================================================\\ + +/obj/item/clothing/suit/storage/marine/veteran + flags_marine_armor = ARMOR_LAMP_OVERLAY + flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE //Let's make these keep their name and icon. + +/obj/item/clothing/suit/storage/marine/veteran/pmc + name = "\improper M4 pattern PMC armor" + desc = "A modification of the standard Armat Systems M3 armor. Designed for high-profile security operators and corporate mercenaries in mind." + icon_state = "pmc_armor" + armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH + armor_energy = CLOTHING_ARMOR_MEDIUMLOW + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_rad = CLOTHING_ARMOR_MEDIUM + storage_slots = 2 + slowdown = SLOWDOWN_ARMOR_LIGHT + flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE + allowed = list( + /obj/item/weapon/gun, + /obj/item/tank/emergency_oxygen, + /obj/item/device/flashlight, + /obj/item/ammo_magazine/, + /obj/item/weapon/baton, + /obj/item/handcuffs, + /obj/item/storage/fancy/cigarettes, + /obj/item/tool/lighter, + /obj/item/explosive/grenade, + /obj/item/storage/bible, + /obj/item/tool/crowbar, + /obj/item/storage/large_holster/katana, + /obj/item/storage/large_holster/machete, + /obj/item/weapon/sword/machete, + /obj/item/attachable/bayonet, + /obj/item/device/motiondetector, + /obj/item/tool/crew_monitor, + /obj/item/device/walkman, + ) + uniform_restricted = list(/obj/item/clothing/under/marine/veteran/pmc) + item_state_slots = list(WEAR_JACKET = "pmc_armor") + +/obj/item/clothing/suit/storage/marine/veteran/pmc/light + name = "\improper M4 pattern light PMC armor" + desc = "A modification of the standard Armat Systems M3 armor. Designed for high-profile security operators and corporate mercenaries in mind. Has some armor plating removed for extra mobility." + icon_state = "pmc_sniper" + armor_melee = CLOTHING_ARMOR_MEDIUMLOW + armor_bullet = CLOTHING_ARMOR_MEDIUM + armor_energy = CLOTHING_ARMOR_MEDIUMLOW + armor_bomb = CLOTHING_ARMOR_MEDIUMLOW + armor_rad = CLOTHING_ARMOR_MEDIUM + armor_internaldamage = CLOTHING_ARMOR_MEDIUMLOW + slowdown = SLOWDOWN_ARMOR_VERY_LIGHT + item_state_slots = list(WEAR_JACKET = "pmc_sniper") + +/obj/item/clothing/suit/storage/marine/veteran/pmc/light/corporate + name = "\improper M1 pattern corporate security armor" + desc = "A basic vest with a Weyland-Yutani badge on the right breast. This is commonly worn by low-level guards protecting Weyland-Yutani facilities." + icon = 'icons/mob/humans/onmob/contained/wy_goons.dmi' + icon_state = "armor" + item_state = "armor" + item_state_slots = null + contained_sprite = TRUE + + flags_armor_protection = BODY_FLAG_CHEST + flags_cold_protection = BODY_FLAG_CHEST + flags_heat_protection = BODY_FLAG_CHEST + + slowdown = SLOWDOWN_ARMOR_NONE // only protects chest, but enables rapid movement + +/obj/item/clothing/suit/storage/marine/veteran/pmc/light/corporate/lead + desc = "A basic vest with a Weyland-Yutani badge on the right breast. This variant is worn by low-level guards that have elevated in rank due to 'good conduct in the field', also known as corporate bootlicking." + icon_state = "lead_armor" + item_state = "lead_armor" + +/obj/item/clothing/suit/storage/marine/veteran/pmc/leader + name = "\improper M4 pattern PMC leader armor" + desc = "A modification of the standard Armat Systems M3 armor. Designed for high-profile security operators and corporate mercenaries in mind. This particular suit looks like it belongs to a high-ranking officer." + icon_state = "officer_armor" + uniform_restricted = list(/obj/item/clothing/under/marine/veteran/pmc/leader) + item_state_slots = list(WEAR_JACKET = "officer_armor") + +/obj/item/clothing/suit/storage/marine/veteran/pmc/sniper + name = "\improper M4 pattern PMC sniper armor" + icon_state = "pmc_sniper" + armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH + armor_energy = CLOTHING_ARMOR_MEDIUMLOW + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_rad = CLOTHING_ARMOR_MEDIUM + armor_internaldamage = CLOTHING_ARMOR_MEDIUM + flags_inv_hide = HIDELOWHAIR + item_state_slots = list(WEAR_JACKET = "pmc_sniper") + +/obj/item/clothing/suit/storage/marine/veteran/pmc/light/synth + name = "\improper M4 Synthetic PMC armor" + desc = "A serious modification of the standard Armat Systems M3 armor. This variant was designed for PMC Support Units in the field, with every armor insert removed. It's designed with the idea of a high speed lifesaver in mind." + time_to_unequip = 0.5 SECONDS + time_to_equip = 1 SECONDS + armor_melee = CLOTHING_ARMOR_NONE + armor_bullet = CLOTHING_ARMOR_NONE + armor_laser = CLOTHING_ARMOR_NONE + armor_energy = CLOTHING_ARMOR_NONE + armor_bomb = CLOTHING_ARMOR_NONE + armor_bio = CLOTHING_ARMOR_NONE + armor_rad = CLOTHING_ARMOR_NONE + armor_internaldamage = CLOTHING_ARMOR_NONE + storage_slots = 3 + slowdown = SLOWDOWN_ARMOR_SUPER_LIGHT + +/obj/item/clothing/suit/storage/marine/veteran/pmc/light/synth/Initialize() + flags_atom |= NO_NAME_OVERRIDE + flags_marine_armor |= SYNTH_ALLOWED + return ..() + +/obj/item/clothing/suit/storage/marine/smartgunner/veteran/pmc + name = "\improper PMC gunner armor" + desc = "A modification of the standard Armat Systems M3 armor. Hooked up with harnesses and straps allowing the user to carry an M56 Smartgun." + icon_state = "heavy_armor" + flags_inventory = BLOCKSHARPOBJ|BLOCK_KNOCKDOWN|SMARTGUN_HARNESS + flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE + armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH + armor_laser = CLOTHING_ARMOR_MEDIUMLOW + armor_energy = CLOTHING_ARMOR_MEDIUMLOW + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_rad = CLOTHING_ARMOR_MEDIUM + item_state_slots = list(WEAR_JACKET = "heavy_armor") + +/obj/item/clothing/suit/storage/marine/smartgunner/veteran/pmc/terminator + name = "\improper M5Xg exoskeleton gunner armor" + desc = "A complex system of overlapping plates intended to render the wearer all but impervious to small arms fire. A passive exoskeleton supports the weight of the armor, allowing a human to carry its massive bulk. This variant is designed to support a M56 Smartgun." + icon_state = "commando_armor" + slowdown = SLOWDOWN_ARMOR_MEDIUM + movement_compensation = SLOWDOWN_ARMOR_VERY_HEAVY + armor_melee = CLOTHING_ARMOR_HIGH + armor_bullet = CLOTHING_ARMOR_ULTRAHIGH + armor_laser = CLOTHING_ARMOR_MEDIUM + armor_energy = CLOTHING_ARMOR_MEDIUM + armor_bomb = CLOTHING_ARMOR_VERYHIGH + armor_rad = CLOTHING_ARMOR_MEDIUMHIGH + armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET + uniform_restricted = list(/obj/item/clothing/under/marine/veteran/pmc/commando) + item_state_slots = list(WEAR_JACKET = "commando_armor") + unacidable = TRUE + +/obj/item/clothing/suit/storage/marine/veteran/pmc/commando + name = "\improper M5X exoskeleton armor" + desc = "A complex system of overlapping plates intended to render the wearer all but impervious to small arms fire. A passive exoskeleton supports the weight of the armor, allowing a human to carry its massive bulk." + icon_state = "commando_armor" + slowdown = SLOWDOWN_ARMOR_MEDIUM + movement_compensation = SLOWDOWN_ARMOR_VERY_HEAVY + armor_melee = CLOTHING_ARMOR_VERYHIGH + armor_bullet = CLOTHING_ARMOR_ULTRAHIGH + armor_energy = CLOTHING_ARMOR_MEDIUM + armor_bomb = CLOTHING_ARMOR_VERYHIGH + armor_rad = CLOTHING_ARMOR_MEDIUMHIGH + armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH + flags_inventory = BLOCK_KNOCKDOWN + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET + uniform_restricted = list(/obj/item/clothing/under/marine/veteran/pmc/commando) + item_state_slots = list(WEAR_JACKET = "commando_armor") + unacidable = TRUE + + +//===========================//DISTRESS\\================================\\ +//=======================================================================\\ + +/obj/item/clothing/suit/storage/marine/veteran/bear + name = "\improper H1 Iron Bears vest" + desc = "A protective vest worn by Iron Bears mercenaries." + icon_state = "bear_armor" + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN + armor_energy = CLOTHING_ARMOR_MEDIUMLOW + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_rad = CLOTHING_ARMOR_MEDIUM + storage_slots = 2 + slowdown = SLOWDOWN_ARMOR_VERY_LIGHT + uniform_restricted = list(/obj/item/clothing/under/marine/veteran/bear) + +/obj/item/clothing/suit/storage/marine/veteran/dutch + name = "\improper D2 armored vest" + desc = "A protective vest worn by some seriously experienced mercs." + icon_state = "dutch_armor" + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS //Makes no sense but they need leg/arm armor too. + armor_melee = CLOTHING_ARMOR_HIGH + armor_bullet = CLOTHING_ARMOR_HIGHPLUS + armor_energy = CLOTHING_ARMOR_MEDIUMLOW + armor_bomb = CLOTHING_ARMOR_HIGH + armor_rad = CLOTHING_ARMOR_MEDIUM + storage_slots = 2 + light_range = 7 + slowdown = SLOWDOWN_ARMOR_VERY_LIGHT + uniform_restricted = list(/obj/item/clothing/under/marine/veteran/dutch) + +/obj/item/clothing/suit/storage/marine/veteran/van_bandolier + name = "safari jacket" + desc = "A tailored hunting jacket, cunningly lined with segmented armor plates. Sometimes the game shoots back." + icon_state = "van_bandolier" + item_state = "van_bandolier_jacket" + blood_overlay_type = "coat" + flags_marine_armor = NO_FLAGS //No shoulder light. + actions_types = list() + slowdown = SLOWDOWN_ARMOR_LIGHT + storage_slots = 2 + movement_compensation = SLOWDOWN_ARMOR_LIGHT + uniform_restricted = list(/obj/item/clothing/under/marine/veteran/van_bandolier) + allowed = list( + /obj/item/weapon/gun, + /obj/item/tank/emergency_oxygen, + /obj/item/device/flashlight, + /obj/item/storage/fancy/cigarettes, + /obj/item/tool/lighter, + /obj/item/storage/bible, + /obj/item/attachable/bayonet, + /obj/item/storage/backpack/general_belt, + /obj/item/storage/large_holster/machete, + /obj/item/storage/belt/gun/m4a3, + /obj/item/storage/belt/gun/m44, + /obj/item/storage/belt/gun/smartpistol, + /obj/item/storage/belt/gun/flaregun, + /obj/item/device/motiondetector, + /obj/item/device/walkman, + /obj/item/storage/belt/shotgun/van_bandolier, + ) + +//===========================//U.P.P\\================================\\ +//=====================================================================\\ + +/obj/item/clothing/suit/storage/marine/faction + flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS + flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS + flags_heat_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS + min_cold_protection_temperature = HELMET_MIN_COLD_PROT + max_heat_protection_temperature = HELMET_MAX_HEAT_PROT + blood_overlay_type = "armor" + armor_melee = CLOTHING_ARMOR_MEDIUM + armor_bullet = CLOTHING_ARMOR_MEDIUM + armor_laser = CLOTHING_ARMOR_MEDIUMLOW + armor_energy = CLOTHING_ARMOR_MEDIUMLOW + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_bio = CLOTHING_ARMOR_MEDIUM + armor_rad = CLOTHING_ARMOR_MEDIUM + armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH + slowdown = SLOWDOWN_ARMOR_MEDIUM + movement_compensation = SLOWDOWN_ARMOR_LIGHT + + +/obj/item/clothing/suit/storage/marine/faction/UPP + name = "\improper UM5 personal armor" + desc = "Standard body armor of the UPP military, the UM5 (Union Medium MK5) is a medium body armor, roughly on par with the M3 pattern body armor in service with the USCM, specialized towards ballistics protection. Unlike the M3, however, the plate has a heavier neckplate. This has earned many UA members to refer to UPP soldiers as 'tin men'." + icon_state = "upp_armor" + armor_bullet = CLOTHING_ARMOR_HIGH + armor_energy = CLOTHING_ARMOR_MEDIUM + armor_bio = CLOTHING_ARMOR_MEDIUMLOW + armor_rad = CLOTHING_ARMOR_MEDIUMLOW + armor_internaldamage = CLOTHING_ARMOR_HIGH + storage_slots = 1 + uniform_restricted = list(/obj/item/clothing/under/marine/veteran/UPP, /obj/item/clothing/under/marine/veteran/UPP/medic, /obj/item/clothing/under/marine/veteran/UPP/engi) + +/obj/item/clothing/suit/storage/marine/faction/UPP/support + name = "\improper UL6 personal armor" + desc = "Standard body armor of the UPP military, the UL6 (Union Light MK6) is a light body armor, slightly weaker than the M3 pattern body armor in service with the USCM, specialized towards ballistics protection. This set of personal armor lacks the iconic neck piece and some of the armor in favor of user mobility." + storage_slots = 3 + icon_state = "upp_armor_support" + slowdown = SLOWDOWN_ARMOR_LIGHT + armor_melee = CLOTHING_ARMOR_HIGH + armor_energy = CLOTHING_ARMOR_MEDIUM + armor_bio = CLOTHING_ARMOR_MEDIUMLOW + armor_rad = CLOTHING_ARMOR_MEDIUMLOW + armor_internaldamage = CLOTHING_ARMOR_HIGH + +/obj/item/clothing/suit/storage/marine/faction/UPP/commando + name = "\improper UM5CU personal armor" + desc = "A modification of the UM5, designed for stealth operations." + icon_state = "upp_armor_commando" + storage_slots = 2 + slowdown = SLOWDOWN_ARMOR_LIGHT + +/obj/item/clothing/suit/storage/marine/faction/UPP/heavy + name = "\improper UH7 heavy plated armor" + desc = "An extremely heavy-duty set of body armor in service with the UPP military, the UH7 (Union Heavy MK7) is known for having powerful ballistic protection, alongside a noticeable neck guard, fortified in order to allow the wearer to endure the stresses of the bulky helmet." + icon_state = "upp_armor_heavy" + storage_slots = 3 + slowdown = SLOWDOWN_ARMOR_HEAVY + flags_inventory = BLOCKSHARPOBJ|BLOCK_KNOCKDOWN + flags_armor_protection = BODY_FLAG_ALL_BUT_HEAD + armor_melee = CLOTHING_ARMOR_MEDIUMHIGH + armor_bullet = CLOTHING_ARMOR_HIGHPLUS + armor_laser = CLOTHING_ARMOR_MEDIUMLOW + armor_energy = CLOTHING_ARMOR_MEDIUM + armor_bomb = CLOTHING_ARMOR_HIGH + armor_bio = CLOTHING_ARMOR_MEDIUM + armor_rad = CLOTHING_ARMOR_MEDIUMLOW + armor_internaldamage = CLOTHING_ARMOR_HIGHPLUS + +/obj/item/clothing/suit/storage/marine/faction/UPP/heavy/Initialize() + . = ..() + pockets.bypass_w_limit = list( + /obj/item/ammo_magazine/minigun, + /obj/item/ammo_magazine/pkp, + ) + +/obj/item/clothing/suit/storage/marine/faction/UPP/officer + name = "\improper UL4 officer jacket" + desc = "A lightweight jacket, issued to officers of the UPP's military. Slightly protective from incoming damage, best off with proper armor however." + icon_state = "upp_coat_officer" + slowdown = SLOWDOWN_ARMOR_NONE + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS + armor_melee = CLOTHING_ARMOR_LOW //wear actual armor if you go into combat + armor_bullet = CLOTHING_ARMOR_LOW + armor_energy = CLOTHING_ARMOR_LOW + armor_bomb = CLOTHING_ARMOR_LOW + armor_bio = CLOTHING_ARMOR_LOW + armor_rad = CLOTHING_ARMOR_LOW + armor_internaldamage = CLOTHING_ARMOR_LOW + storage_slots = 3 + uniform_restricted = list(/obj/item/clothing/under/marine/veteran/UPP/officer) + +/obj/item/clothing/suit/storage/marine/faction/UPP/kapitan + name = "\improper UL4 senior officer jacket" + desc = "A lightweight jacket, issued to senior officers of the UPP's military. Made of high-quality materials, even going as far as having the ranks and insignia of the Kapitan and their Company emblazoned on the shoulders and front of the jacket. Slightly protective from incoming damage, best off with proper armor however." + icon_state = "upp_coat_kapitan" + slowdown = SLOWDOWN_ARMOR_NONE + armor_melee = CLOTHING_ARMOR_LOW //wear actual armor if you go into combat + armor_bullet = CLOTHING_ARMOR_LOW + armor_energy = CLOTHING_ARMOR_LOW + armor_bomb = CLOTHING_ARMOR_LOW + armor_bio = CLOTHING_ARMOR_LOW + armor_rad = CLOTHING_ARMOR_LOW + armor_internaldamage = CLOTHING_ARMOR_LOW + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS + storage_slots = 4 + uniform_restricted = list(/obj/item/clothing/under/marine/veteran/UPP/officer) + +/obj/item/clothing/suit/storage/marine/faction/UPP/mp + name = "\improper UL4 camouflaged jacket" + desc = "A lightweight jacket, issued to troops when they're not expected to engage in combat. Still studded to the brim with kevlar shards, though the synthread construction reduces its effectiveness." + icon_state = "upp_coat_mp" + slowdown = SLOWDOWN_ARMOR_NONE + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS + armor_melee = CLOTHING_ARMOR_LOW //wear actual armor if you go into combat + armor_bullet = CLOTHING_ARMOR_LOW + armor_energy = CLOTHING_ARMOR_LOW + armor_bomb = CLOTHING_ARMOR_LOW + armor_bio = CLOTHING_ARMOR_LOW + armor_rad = CLOTHING_ARMOR_LOW + armor_internaldamage = CLOTHING_ARMOR_LOW + storage_slots = 4 + uniform_restricted = list(/obj/item/clothing/under/marine/veteran/UPP) + valid_accessory_slots = list(ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_DECOR, ACCESSORY_SLOT_MEDAL) + restricted_accessory_slots = list(ACCESSORY_SLOT_ARMBAND) + +/obj/item/clothing/suit/storage/marine/faction/UPP/jacket/ivan + name = "\improper UH4 Camo Jacket" + desc = "An experimental heavily armored variant of the UL4 given to only the most elite units... usually." + slowdown = SLOWDOWN_ARMOR_MEDIUM + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_ARMS|BODY_FLAG_HANDS|BODY_FLAG_FEET + armor_melee = CLOTHING_ARMOR_HIGH + armor_energy = CLOTHING_ARMOR_MEDIUMLOW + armor_bomb = CLOTHING_ARMOR_HIGH + armor_bio = CLOTHING_ARMOR_MEDIUM + armor_rad = CLOTHING_ARMOR_MEDIUM + armor_internaldamage = CLOTHING_ARMOR_HIGH + storage_slots = 2 + + +//===========================//FREELANCER\\================================\\ +//=====================================================================\\ + +/obj/item/clothing/suit/storage/marine/faction/freelancer + name = "freelancer cuirass" + desc = "An armored protective chestplate scrapped together from various plates. It keeps up remarkably well, as the craftsmanship is solid, and the design mirrors such armors in the UPP and the USCM. The many skilled craftsmen in the freelancers ranks produce these vests at a rate about one a month." + icon_state = "freelancer_armor" + slowdown = SLOWDOWN_ARMOR_LIGHT + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS + armor_melee = CLOTHING_ARMOR_MEDIUMHIGH + armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH + armor_energy = CLOTHING_ARMOR_MEDIUMLOW + storage_slots = 2 + uniform_restricted = list(/obj/item/clothing/under/marine/veteran/freelancer) + +//this one is for CLF +/obj/item/clothing/suit/storage/militia + name = "colonial militia hauberk" + desc = "The hauberk of a colonist militia member, created from boiled leather and some modern armored plates. While not the most powerful form of armor, and primitive compared to most modern suits of armor, it gives the wearer almost perfect mobility, which suits the needs of the local colonists. It is also quick to don, easy to hide, and cheap to produce in large workshops." + icon = 'icons/obj/items/clothing/cm_suits.dmi' + icon_state = "rebel_armor" + item_icons = list( + WEAR_JACKET = 'icons/mob/humans/onmob/suit_1.dmi' + ) + sprite_sheets = list(SPECIES_MONKEY = 'icons/mob/humans/species/monkeys/onmob/suit_monkey_1.dmi') + slowdown = SLOWDOWN_ARMOR_VERY_LIGHT + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_ARMS + movement_compensation = SLOWDOWN_ARMOR_MEDIUM + armor_melee = CLOTHING_ARMOR_MEDIUM + armor_bullet = CLOTHING_ARMOR_MEDIUMLOW + armor_laser = CLOTHING_ARMOR_MEDIUMLOW + armor_energy = CLOTHING_ARMOR_MEDIUMLOW + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_bio = CLOTHING_ARMOR_MEDIUMLOW + armor_rad = CLOTHING_ARMOR_MEDIUM + armor_internaldamage = CLOTHING_ARMOR_MEDIUM + storage_slots = 2 + uniform_restricted = list(/obj/item/clothing/under/colonist) + allowed = list( + /obj/item/weapon/gun, + /obj/item/tank/emergency_oxygen, + /obj/item/device/flashlight, + /obj/item/ammo_magazine, + /obj/item/explosive/grenade, + /obj/item/device/binoculars, + /obj/item/attachable/bayonet, + /obj/item/storage/backpack/general_belt, + /obj/item/storage/large_holster/machete, + /obj/item/weapon/baseballbat, + /obj/item/weapon/baseballbat/metal, + /obj/item/device/motiondetector, + /obj/item/device/walkman, + ) + flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_FEET|BODY_FLAG_ARMS|BODY_FLAG_HANDS + min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROT + valid_accessory_slots = list(ACCESSORY_SLOT_MEDAL) + +/obj/item/clothing/suit/storage/militia/Initialize() + . = ..() + pockets.max_w_class = SIZE_SMALL //Can contain small items AND rifle magazines. + pockets.bypass_w_limit = list( + /obj/item/ammo_magazine/rifle, + /obj/item/ammo_magazine/smg, + /obj/item/ammo_magazine/sniper, + ) + pockets.max_storage_space = 8 + +/obj/item/clothing/suit/storage/militia/vest + name = "colonial militia vest" + desc = "The hauberk of a colonist militia member, created from boiled leather and some modern armored plates. While not the most powerful form of armor, and primitive compared to most modern suits of armor, it gives the wearer almost perfect mobility, which suits the needs of the local colonists. It is also quick to don, easy to hide, and cheap to produce in large workshops. This extremely light variant protects only the chest and abdomen." + icon_state = "clf_2" + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN + flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN + slowdown = 0.2 + movement_compensation = SLOWDOWN_ARMOR_MEDIUM + +/obj/item/clothing/suit/storage/militia/brace + name = "colonial militia brace" + desc = "The hauberk of a colonist militia member, created from boiled leather and some modern armored plates. While not the most powerful form of armor, and primitive compared to most modern suits of armor, it gives the wearer almost perfect mobility, which suits the needs of the local colonists. It is also quick to don, easy to hide, and cheap to produce in large workshops. This extremely light variant has some of the chest pieces removed." + icon_state = "clf_3" + flags_armor_protection = BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS + flags_cold_protection = BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS + slowdown = 0.2 + movement_compensation = SLOWDOWN_ARMOR_MEDIUM + +/obj/item/clothing/suit/storage/militia/partial + name = "colonial militia partial hauberk" + desc = "The hauberk of a colonist militia member, created from boiled leather and some modern armored plates. While not the most powerful form of armor, and primitive compared to most modern suits of armor, it gives the wearer almost perfect mobility, which suits the needs of the local colonists. It is also quick to don, easy to hide, and cheap to produce in large workshops. This even lighter variant has some of the arm pieces removed." + icon_state = "clf_4" + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS + flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS + slowdown = 0.2 + +/obj/item/clothing/suit/storage/militia/smartgun + name = "colonial militia harness" + desc = "The hauberk of a colonist militia member, created from boiled leather and some modern armored plates. While not the most powerful form of armor, and primitive compared to most modern suits of armor, it gives the wearer almost perfect mobility, which suits the needs of the local colonists. It is also quick to don, easy to hide, and cheap to produce in large workshops. This one has straps interweaved with the plates, that allow the user to fire a captured smartgun, if a bit uncomfortably." + flags_inventory = BLOCKSHARPOBJ|SMARTGUN_HARNESS + +/obj/item/clothing/suit/storage/CMB + name = "\improper CMB jacket" + desc = "A black jacket worn by Colonial Marshals. The back is enscribed with the powerful letters of 'MARSHAL' representing justice, authority, and protection in the outer rim. The laws of the Earth stretch beyond the Sol." + icon_state = "CMB_jacket" + blood_overlay_type = "coat" + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS + flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS + armor_melee = CLOTHING_ARMOR_MEDIUMLOW + armor_bullet = CLOTHING_ARMOR_MEDIUMLOW + armor_energy = CLOTHING_ARMOR_LOW + armor_bomb = CLOTHING_ARMOR_LOW + armor_bio = CLOTHING_ARMOR_LOW + armor_internaldamage = CLOTHING_ARMOR_LOW + allowed = list( + /obj/item/weapon/gun, + /obj/item/storage/fancy/cigarettes, + /obj/item/tool/lighter, + /obj/item/weapon/baton, + /obj/item/handcuffs, + /obj/item/device/binoculars, + /obj/item/attachable/bayonet, + /obj/item/device/flashlight, + /obj/item/device/healthanalyzer, + /obj/item/device/radio, + /obj/item/tank/emergency_oxygen, + /obj/item/tool/crowbar, + /obj/item/tool/crew_monitor, + /obj/item/tool/pen, + /obj/item/storage/belt/gun/m4a3, + /obj/item/storage/belt/gun/m44, + /obj/item/storage/belt/gun/mateba, + /obj/item/storage/belt/gun/smartpistol, + /obj/item/storage/large_holster/machete, + /obj/item/storage/large_holster/katana, + /obj/item/device/motiondetector, + /obj/item/device/walkman, + ) + valid_accessory_slots = list(ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_DECOR) + restricted_accessory_slots = list(ACCESSORY_SLOT_ARMBAND) + +/obj/item/clothing/suit/storage/CMB/Initialize() + . = ..() + pockets.max_w_class = SIZE_SMALL //Can contain small items AND rifle magazines. + pockets.bypass_w_limit = list( + /obj/item/ammo_magazine/rifle, + /obj/item/ammo_magazine/smg, + /obj/item/ammo_magazine/sniper, + ) + pockets.max_storage_space = 8 + + +//===========================//HELGHAST - MERCENARY\\================================\\ +//=====================================================================\\ + +/obj/item/clothing/suit/storage/marine/veteran/mercenary + name = "\improper K12 ceramic plated armor" + desc = "A set of grey, heavy ceramic armor with dark blue highlights. It is the standard uniform of an unknown mercenary group working in the sector." + icon_state = "mercenary_heavy_armor" + flags_inventory = BLOCKSHARPOBJ|BLOCK_KNOCKDOWN + armor_melee = CLOTHING_ARMOR_VERYHIGH + armor_bullet = CLOTHING_ARMOR_VERYHIGH + armor_energy = CLOTHING_ARMOR_MEDIUMLOW + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_bio = CLOTHING_ARMOR_HIGHPLUS + armor_rad = CLOTHING_ARMOR_MEDIUM + armor_internaldamage = CLOTHING_ARMOR_HIGHPLUS + storage_slots = 2 + slowdown = SLOWDOWN_ARMOR_LIGHT + allowed = list( + /obj/item/weapon/gun, + /obj/item/tank/emergency_oxygen, + /obj/item/device/flashlight, + /obj/item/ammo_magazine/, + /obj/item/weapon/baton, + /obj/item/handcuffs, + /obj/item/storage/fancy/cigarettes, + /obj/item/tool/lighter, + /obj/item/explosive/grenade, + /obj/item/storage/bible, + /obj/item/weapon/sword/machete, + /obj/item/attachable/bayonet, + /obj/item/device/motiondetector, + /obj/item/device/walkman, + ) + uniform_restricted = list(/obj/item/clothing/under/marine/veteran/mercenary) + item_state_slots = list(WEAR_JACKET = "mercenary_heavy_armor") + +/obj/item/clothing/suit/storage/marine/veteran/mercenary/heavy + name = "\improper Modified K12 ceramic plated armor" + desc = "A set of grey, heavy ceramic armor with dark blue highlights. It has been modified with extra ceramic plates placed in its storage pouch, and seems intended to support an extremely heavy weapon." + armor_melee = CLOTHING_ARMOR_ULTRAHIGH + armor_bullet = CLOTHING_ARMOR_ULTRAHIGHPLUS + armor_bomb = CLOTHING_ARMOR_HIGHPLUS + armor_bio = CLOTHING_ARMOR_HIGHPLUS + armor_rad = CLOTHING_ARMOR_MEDIUM + armor_internaldamage = CLOTHING_ARMOR_VERYHIGHPLUS + storage_slots = 1 + +/obj/item/clothing/suit/storage/marine/veteran/mercenary/miner + name = "\improper Y8 armored miner vest" + desc = "A set of beige, light armor built for protection while mining. It is a specialized uniform of an unknown mercenary group working in the sector." + icon_state = "mercenary_miner_armor" + storage_slots = 3 + allowed = list( + /obj/item/weapon/gun, + /obj/item/tank/emergency_oxygen, + /obj/item/device/flashlight, + /obj/item/ammo_magazine/, + /obj/item/weapon/baton, + /obj/item/handcuffs, + /obj/item/storage/fancy/cigarettes, + /obj/item/tool/lighter, + /obj/item/explosive/grenade, + /obj/item/storage/bible, + /obj/item/weapon/sword/machete, + /obj/item/attachable/bayonet, + /obj/item/device/motiondetector, + /obj/item/device/walkman, + ) + uniform_restricted = list(/obj/item/clothing/under/marine/veteran/mercenary) + item_state_slots = list(WEAR_JACKET = "mercenary_miner_armor") + +/obj/item/clothing/suit/storage/marine/veteran/mercenary/support + name = "\improper Z7 armored vest" + desc = "A set of blue armor with yellow highlights built for protection while building or carrying out medical treatment in highly dangerous environments. It is a specialized uniform of an unknown mercenary group working in the sector." + icon_state = "mercenary_engineer_armor" + item_state_slots = list(WEAR_JACKET = "mercenary_engineer_armor") + +/obj/item/clothing/suit/storage/marine/M3G/hefa + name = "\improper HEFA Knight armor" + desc = "A thick piece of armor adorning a HEFA. Usually seen on a HEFA knight." + specialty = "HEFA Knight" + icon_state = "hefadier" + flags_atom = NO_NAME_OVERRIDE|NO_SNOW_TYPE + flags_item = NO_CRYO_STORE + flags_marine_armor = ARMOR_LAMP_OVERLAY + armor_bullet = CLOTHING_ARMOR_VERYHIGH + armor_melee = CLOTHING_ARMOR_VERYHIGH + armor_bomb = CLOTHING_ARMOR_GIGAHIGH + + +//=========================//PROVOST\\================================\\ +//=======================================================================\\ + +/obj/item/clothing/suit/storage/marine/MP/provost + name = "\improper M3 pattern Provost armor" + desc = "A standard Provost M3 Pattern Chestplate. Protects the chest from ballistic rounds, bladed objects and accidents. It has a small leather pouch strapped to it for limited storage." + icon_state = "pvmedium" + item_state_slots = list(WEAR_JACKET = "pvmedium") + slowdown = SLOWDOWN_ARMOR_LIGHT + armor_bullet = CLOTHING_ARMOR_MEDIUM + armor_laser = CLOTHING_ARMOR_MEDIUMLOW + armor_bomb = CLOTHING_ARMOR_MEDIUMHIGH + armor_bio = CLOTHING_ARMOR_MEDIUMHIGH + armor_internaldamage = CLOTHING_ARMOR_MEDIUM + flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE + storage_slots = 3 + +/obj/item/clothing/suit/storage/marine/MP/provost/tml + name = "\improper M3 pattern Senior Provost armor" + desc = "A more refined Provost M3 Pattern Chestplate for senior officers. Protects the chest from ballistic rounds, bladed objects and accidents. It has a small leather pouch strapped to it for limited storage." + icon_state = "pvleader" + item_state_slots = list(WEAR_JACKET = "pvleader") + +/obj/item/clothing/suit/storage/marine/MP/provost/marshal + name = "\improper M5 pattern Provost Marshal armor" + desc = "A custom fit luxury armor suit for Provost Marshals. Useful for letting your men know who is in charge when taking to the field." + icon_state = "pvmarshal" + item_state_slots = list(WEAR_JACKET = "pvmarshal") + w_class = SIZE_MEDIUM + storage_slots = 4 + +/obj/item/clothing/suit/storage/marine/MP/provost/light + name = "\improper M3 pattern Provost light armor" + desc = "A lighter Provost M3 Pattern Chestplate. Protects the chest from ballistic rounds, bladed objects and accidents. It has a small leather pouch strapped to it for limited storage." + icon_state = "pvlight" + item_state_slots = list(WEAR_JACKET = "pvlight") + slowdown = SLOWDOWN_ARMOR_VERY_LIGHT + +/obj/item/clothing/suit/storage/marine/MP/provost/light/flexi + name = "\improper M3 pattern Provost flexi-armor" + desc = "A flexible and easy to store M3 Pattern Chestplate. Protects the chest from ballistic rounds, bladed objects and accidents. It has a small leather pouch strapped to it for limited storage." + w_class = SIZE_MEDIUM + icon_state = "pvlight_2" + item_state_slots = list(WEAR_JACKET = "pvlight_2") + storage_slots = 2 + +//================//UNITED AMERICAS ALLIED COMMAND\\=====================\\ +//=======================================================================\\ + +/obj/item/clothing/suit/storage/marine/uaac/tis/sa + name = "\improper M3 pattern UAAC-TIS Special Agent Armor" + desc = "A modified luxury armor, originally meant for a USCM Provost Marshall, modified to use the colors and insignia of the TIS. The Three Eyes is technically able to requisition any equipment or personnel to fulfill its mission and often uses this privilege to outfit their agents with high-quality gear from other UA military forces." + icon_state = "tis" + item_state_slots = list(WEAR_JACKET = "tis") + armor_melee = CLOTHING_ARMOR_MEDIUMHIGH + armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH + armor_laser = CLOTHING_ARMOR_LOW + armor_energy = CLOTHING_ARMOR_LOW + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_internaldamage = CLOTHING_ARMOR_MEDIUMLOW + storage_slots = 2 + slowdown = SLOWDOWN_ARMOR_LIGHT + flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE + allowed = list( + /obj/item/weapon/gun, + /obj/item/tank/emergency_oxygen, + /obj/item/device/flashlight, + /obj/item/ammo_magazine/, + /obj/item/storage/fancy/cigarettes, + /obj/item/tool/lighter, + /obj/item/weapon/baton, + /obj/item/handcuffs, + /obj/item/explosive/grenade, + /obj/item/device/binoculars, + /obj/item/attachable/bayonet, + /obj/item/storage/backpack/general_belt, + /obj/item/device/hailer, + /obj/item/storage/belt/gun, + /obj/item/weapon/sword/ceremonial, + /obj/item/device/motiondetector, + /obj/item/device/walkman, + ) + uniform_restricted = list(/obj/item/clothing/under/uaac/tis) + +//================//UNITED AMERICAS RIOT CONTROL\\=====================\\ +//=======================================================================\\ + +/obj/item/clothing/suit/storage/marine/veteran/ua_riot + name = "\improper UA-M1 body armor" + desc = "Based on the M-3 pattern employed by the USCM, the UA-M1 body armor is employed by UA security, riot control and union-busting teams. While robust against melee and bullet attacks, it critically lacks coverage of the legs and arms." + icon_state = "ua_riot" + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN + flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN + flags_heat_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN + armor_melee = CLOTHING_ARMOR_MEDIUMHIGH + armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH + armor_energy = CLOTHING_ARMOR_MEDIUM + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_rad = CLOTHING_ARMOR_MEDIUM + armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH + slowdown = SLOWDOWN_ARMOR_VERY_LIGHT // it's lighter + uniform_restricted = list(/obj/item/clothing/under/marine/ua_riot) + flags_atom = NO_SNOW_TYPE + +//================//=ROYAL MARINES=\\====================================\\ +//=======================================================================\\ + +/obj/item/clothing/suit/storage/marine/veteran/royal_marine + name = "kestrel armoured vest" + desc = "A customizable personal armor system used by the Three World Empire's Royal Marines Commandos. Designers from a Weyland Yutani subsidary, Lindenthal-Ehrenfeld Militärindustrie, iterated on the USCMC's M3 pattern personal armor in their Tokonigara lab to create an armor systemed to suit the unique needs of the Three World Empire's smaller but better equipped Royal Marines." + icon_state = "rmc_light" + item_state = "rmc_light" + flags_atom = NO_NAME_OVERRIDE|NO_SNOW_TYPE + allowed = list( + /obj/item/weapon/gun, + /obj/item/tank/emergency_oxygen, + /obj/item/device/flashlight, + /obj/item/ammo_magazine/, + /obj/item/weapon/baton, + /obj/item/handcuffs, + /obj/item/storage/fancy/cigarettes, + /obj/item/tool/lighter, + /obj/item/explosive/grenade, + /obj/item/storage/bible, + /obj/item/weapon/sword/machete, + /obj/item/attachable/bayonet, + /obj/item/device/motiondetector, + /obj/item/device/walkman, + ) + +/obj/item/clothing/suit/storage/marine/veteran/royal_marine/light //RMC Rifleman Armor + icon_state = "rmc_light" + item_state = "rmc_light" + armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH + armor_energy = CLOTHING_ARMOR_MEDIUMLOW + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_rad = CLOTHING_ARMOR_MEDIUM + slowdown = SLOWDOWN_ARMOR_LIGHT + +/obj/item/clothing/suit/storage/marine/veteran/royal_marine/light/team_leader //RMC TL & LT Armor + name = "kestrel armoured carry vest" + icon_state = "rmc_light_padded" + item_state = "rmc_light_padded" + storage_slots = 7 + +/obj/item/clothing/suit/storage/marine/veteran/royal_marine/smartgun //Smartgun Spec Armor + name = "kestrel armoured smartgun harness" + icon_state = "rmc_smartgun" + item_state = "rmc_smartgun" + flags_inventory = BLOCKSHARPOBJ|BLOCK_KNOCKDOWN|SMARTGUN_HARNESS + +/obj/item/clothing/suit/storage/marine/veteran/royal_marine/pointman //Pointman Spec Armor + name = "kestrel pointman armour" + desc = "A heavier version of the armor system used by the Three World Empire's Royal Marines Commandos. Designers from a Weyland Yutani subsidary, Lindenthal-Ehrenfeld Militärindustrie, iterated on the USCMC's M3 pattern personal armor in their Tokonigara lab to create an armor systemed to suit the unique needs of the Three World Empire's smaller but better equipped Royal Marines." + icon_state = "rmc_pointman" + item_state = "rmc_pointman" + armor_melee = CLOTHING_ARMOR_HIGH + armor_bullet = CLOTHING_ARMOR_HIGHPLUS + armor_bomb = CLOTHING_ARMOR_HIGHPLUS + armor_bio = CLOTHING_ARMOR_MEDIUM + armor_rad = CLOTHING_ARMOR_MEDIUM + armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH + storage_slots = 7 + slowdown = SLOWDOWN_ARMOR_LOWHEAVY + movement_compensation = SLOWDOWN_ARMOR_MEDIUM + +/atom/movable/marine_light + light_system = DIRECTIONAL_LIGHT + +//CBRN +/obj/item/clothing/suit/storage/marine/cbrn + name = "\improper M3-M armor" + desc = "While lacking the appearance of the M3 pattern armor worn in regular service, this armor piece is still a derivative of it. It has been heavily modified to fit over the MOPP suit with additional padding and Venlar composite layers removed, so as not to restrict the wearer’s movement. However, with the reduction of composite layers, the personal protection offered is less than desired with complaints having been lodged since 2165." + icon_state = "cbrn" + item_state = "cbrn" + slowdown = SLOWDOWN_ARMOR_HEAVY + armor_melee = CLOTHING_ARMOR_MEDIUM + armor_bullet = CLOTHING_ARMOR_MEDIUM + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_bio = CLOTHING_ARMOR_LOW + armor_rad =CLOTHING_ARMOR_MEDIUMLOW + armor_internaldamage = CLOTHING_ARMOR_LOW + flags_marine_armor = NO_FLAGS + flags_atom = NO_NAME_OVERRIDE|NO_SNOW_TYPE + flags_inventory = BLOCKSHARPOBJ + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN + flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN + flags_heat_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN + uniform_restricted = list(/obj/item/clothing/under/marine/cbrn) + +/obj/item/clothing/suit/storage/marine/cbrn/advanced + slowdown = SLOWDOWN_ARMOR_LOWHEAVY + armor_melee = CLOTHING_ARMOR_HIGH + armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH + armor_bomb = CLOTHING_ARMOR_ULTRAHIGH + armor_bio = CLOTHING_ARMOR_GIGAHIGHPLUS + armor_rad = CLOTHING_ARMOR_GIGAHIGHPLUS + armor_internaldamage = CLOTHING_ARMOR_HIGHPLUS diff --git a/code/modules/clothing/suits/marine_armor/ghillie.dm b/code/modules/clothing/suits/marine_armor/ghillie.dm new file mode 100644 index 000000000000..1f1b71227655 --- /dev/null +++ b/code/modules/clothing/suits/marine_armor/ghillie.dm @@ -0,0 +1,162 @@ +#define FULL_CAMOUFLAGE_ALPHA 15 + +/obj/item/clothing/suit/storage/marine/ghillie + name = "\improper M45 pattern ghillie armor" + desc = "A lightweight ghillie camouflage suit, used by USCM snipers on recon missions. Very lightweight, but doesn't protect much." + icon_state = "ghillie_armor" + armor_bio = CLOTHING_ARMOR_MEDIUMHIGH + slowdown = SLOWDOWN_ARMOR_LIGHT + flags_marine_armor = ARMOR_LAMP_OVERLAY + flags_item = MOB_LOCK_ON_EQUIP + specialty = "M45 pattern ghillie" + valid_accessory_slots = list(ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_DECOR, ACCESSORY_SLOT_MEDAL, ACCESSORY_SLOT_PONCHO) + restricted_accessory_slots = list(ACCESSORY_SLOT_ARMBAND) + + var/camo_active = FALSE + var/hide_in_progress = FALSE + var/full_camo_alpha = FULL_CAMOUFLAGE_ALPHA + var/incremental_shooting_camo_penalty = 35 + var/current_camo = FULL_CAMOUFLAGE_ALPHA + var/camouflage_break = 5 SECONDS + var/camouflage_enter_delay = 4 SECONDS + var/can_camo = TRUE + + actions_types = list(/datum/action/item_action/toggle, /datum/action/item_action/specialist/prepare_position) + +/obj/item/clothing/suit/storage/marine/ghillie/dropped(mob/user) + if(ishuman(user) && !issynth(user)) + deactivate_camouflage(user, FALSE) + + . = ..() + +/obj/item/clothing/suit/storage/marine/ghillie/verb/camouflage() + set name = "Prepare Position" + set desc = "Use the ghillie suit and the nearby environment to become near invisible." + set category = "Object" + set src in usr + if(!usr || usr.is_mob_incapacitated(TRUE)) + return + + if(!ishuman(usr) || hide_in_progress || !can_camo) + return + var/mob/living/carbon/human/H = usr + if(!skillcheck(H, SKILL_SPEC_WEAPONS, SKILL_SPEC_ALL) && H.skills.get_skill_level(SKILL_SPEC_WEAPONS) != SKILL_SPEC_SNIPER && !(GLOB.character_traits[/datum/character_trait/skills/spotter] in H.traits)) + to_chat(H, SPAN_WARNING("You don't seem to know how to use [src]...")) + return + if(H.wear_suit != src) + to_chat(H, SPAN_WARNING("You must be wearing the ghillie suit to activate it!")) + return + + if(camo_active) + deactivate_camouflage(H) + return + + H.visible_message(SPAN_DANGER("[H] goes prone, and begins adjusting \his ghillie suit!"), SPAN_NOTICE("You go prone, and begins adjusting your ghillie suit."), max_distance = 4) + hide_in_progress = TRUE + H.unset_interaction() // If we're sticking to a machine gun or what not. + if(!do_after(H, camouflage_enter_delay, INTERRUPT_NO_NEEDHAND|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) + hide_in_progress = FALSE + return + hide_in_progress = FALSE + RegisterSignal(H, list( + COMSIG_MOB_FIRED_GUN, + COMSIG_MOB_FIRED_GUN_ATTACHMENT) + , PROC_REF(fade_in)) + RegisterSignal(H, list( + COMSIG_MOB_DEATH, + COMSIG_HUMAN_EXTINGUISH + ), PROC_REF(deactivate_camouflage)) + camo_active = TRUE + H.alpha = full_camo_alpha + H.FF_hit_evade = 1000 + ADD_TRAIT(H, TRAIT_UNDENSE, SPECIALIST_GEAR_TRAIT) + + RegisterSignal(H, COMSIG_MOB_MOVE_OR_LOOK, PROC_REF(handle_mob_move_or_look)) + + var/datum/mob_hud/security/advanced/SA = GLOB.huds[MOB_HUD_SECURITY_ADVANCED] + SA.remove_from_hud(H) + var/datum/mob_hud/xeno_infection/XI = GLOB.huds[MOB_HUD_XENO_INFECTION] + XI.remove_from_hud(H) + + anim(H.loc, H, 'icons/mob/mob.dmi', null, "cloak", null, H.dir) + + +/obj/item/clothing/suit/storage/marine/ghillie/proc/deactivate_camouflage(mob/user) + SIGNAL_HANDLER + var/mob/living/carbon/human/H = user + if(!istype(H)) + return FALSE + + if(!camo_active) + return + + UnregisterSignal(H, list( + COMSIG_MOB_FIRED_GUN, + COMSIG_MOB_FIRED_GUN_ATTACHMENT, + COMSIG_MOB_DEATH, + COMSIG_HUMAN_EXTINGUISH, + COMSIG_MOB_MOVE_OR_LOOK + )) + + camo_active = FALSE + animate(H, alpha = initial(H.alpha), flags = ANIMATION_END_NOW) + H.FF_hit_evade = initial(H.FF_hit_evade) + REMOVE_TRAIT(H, TRAIT_UNDENSE, SPECIALIST_GEAR_TRAIT) + + var/datum/mob_hud/security/advanced/SA = GLOB.huds[MOB_HUD_SECURITY_ADVANCED] + SA.add_to_hud(H) + var/datum/mob_hud/xeno_infection/XI = GLOB.huds[MOB_HUD_XENO_INFECTION] + XI.add_to_hud(H) + + H.visible_message(SPAN_DANGER("[H]'s camouflage fails!"), SPAN_WARNING("Your camouflage fails!"), max_distance = 4) + +/obj/item/clothing/suit/storage/marine/ghillie/proc/fade_in(mob/user) + SIGNAL_HANDLER + var/mob/living/carbon/human/H = user + if(camo_active) + if(current_camo < full_camo_alpha) + current_camo = full_camo_alpha + current_camo = clamp(current_camo + incremental_shooting_camo_penalty, full_camo_alpha, 255) + H.alpha = current_camo + addtimer(CALLBACK(src, PROC_REF(fade_out_finish), H), camouflage_break, TIMER_OVERRIDE|TIMER_UNIQUE) + animate(H, alpha = full_camo_alpha + 5, time = camouflage_break, easing = LINEAR_EASING, flags = ANIMATION_END_NOW) + +/obj/item/clothing/suit/storage/marine/ghillie/proc/fade_out_finish(mob/living/carbon/human/H) + if(camo_active && H.wear_suit == src) + to_chat(H, SPAN_BOLDNOTICE("The smoke clears and your position is once again hidden completely!")) + animate(H, alpha = full_camo_alpha) + current_camo = full_camo_alpha + +/obj/item/clothing/suit/storage/marine/ghillie/proc/handle_mob_move_or_look(mob/living/mover, actually_moving, direction, specific_direction) + SIGNAL_HANDLER + + if(camo_active && actually_moving) + deactivate_camouflage(mover) + +/datum/action/item_action/specialist/prepare_position + ability_primacy = SPEC_PRIMARY_ACTION_1 + +/datum/action/item_action/specialist/prepare_position/New(mob/living/user, obj/item/holder) + ..() + name = "Prepare Position" + button.name = name + button.overlays.Cut() + var/image/IMG = image('icons/mob/hud/actions.dmi', button, "prepare_position") + button.overlays += IMG + +/datum/action/item_action/specialist/prepare_position/can_use_action() + var/mob/living/carbon/human/H = owner + if(istype(H) && !H.is_mob_incapacitated() && H.body_position == STANDING_UP && holder_item == H.wear_suit) + return TRUE + +/datum/action/item_action/specialist/prepare_position/action_activate() + var/obj/item/clothing/suit/storage/marine/ghillie/GS = holder_item + GS.camouflage() + +#undef FULL_CAMOUFLAGE_ALPHA + +/obj/item/clothing/suit/storage/marine/ghillie/forecon + name = "UDEP Thermal Poncho" + desc = "UDEP or the Ultra Diffusive Environmental Poncho is a camouflaged rain-cover worn to protect against the elements and chemical spills. It's commonly treated with an infrared absorbing coating, making a marine almost invisible in the rain. Favoured by USCM specialists for it's comfort and practicality." + icon_state = "mercenary_miner_armor" + flags_atom = MOB_LOCK_ON_EQUIP|NO_SNOW_TYPE|NO_NAME_OVERRIDE diff --git a/code/modules/clothing/suits/marine_armor/intel.dm b/code/modules/clothing/suits/marine_armor/intel.dm new file mode 100644 index 000000000000..b3f0f93e004d --- /dev/null +++ b/code/modules/clothing/suits/marine_armor/intel.dm @@ -0,0 +1,118 @@ +/obj/item/clothing/suit/storage/marine/medium/rto/intel + name = "\improper XM4 pattern intelligence officer armor" + uniform_restricted = list(/obj/item/clothing/under/marine/officer/intel) + specialty = "XM4 pattern intel" + desc = "Tougher than steel, quieter than whispers, the XM4 Intel Armor provides capable protection combined with an experimental integrated motion tracker. It took an R&D team a weekend to develop and costs more than the Chinook Station... probably. When worn, uniform accessories such as webbing cannot be attached due to the motion sensors occupying the clips." + desc_lore = "ARMAT Perfection. The XM4 Soldier Awareness System mixes M4-style hard armor and a distributed series of motion sensors clipped onto the breastplate. When connected to any HUD optic, it replicates the effects of an M314 Motion Detector unit, increasing user situational awareness. It is currently undergoing field trials by intelligence operatives." + storage_slots = 5 + /// XM4 Integral Motion Detector Ability + actions_types = list(/datum/action/item_action/toggle, /datum/action/item_action/intel/toggle_motion_detector) + var/motion_detector = FALSE + var/obj/item/device/motiondetector/xm4/proximity + var/long_range_cooldown = 2 + var/recycletime = 120 + +/obj/item/clothing/suit/storage/marine/medium/rto/intel/Initialize(mapload, ...) + . = ..() + proximity = new(src) + update_icon() + +/datum/action/item_action/intel/action_activate() + if(!ishuman(owner)) + return + +/datum/action/item_action/intel/update_button_icon() + return + +/datum/action/item_action/intel/toggle_motion_detector/New(Target, obj/item/holder) + . = ..() + name = "Toggle Motion Detector" + action_icon_state = "motion_detector" + button.name = name + button.overlays.Cut() + button.overlays += image('icons/mob/hud/actions.dmi', button, action_icon_state) + +/datum/action/item_action/intel/toggle_motion_detector/action_activate() + . = ..() + var/obj/item/clothing/suit/storage/marine/medium/rto/intel/recon = holder_item + recon.toggle_motion_detector(owner) + +/datum/action/item_action/intel/toggle_motion_detector/proc/update_icon() + if(!holder_item) + return + var/obj/item/clothing/suit/storage/marine/medium/rto/intel/recon = holder_item + if(recon.motion_detector) + button.icon_state = "template_on" + else + button.icon_state = "template" + +/obj/item/clothing/suit/storage/marine/medium/rto/intel/process() + if(!motion_detector) + STOP_PROCESSING(SSobj, src) + if(motion_detector) + recycletime-- + if(!recycletime) + recycletime = initial(recycletime) + proximity.refresh_blip_pool() + long_range_cooldown-- + if(long_range_cooldown) + return + long_range_cooldown = initial(long_range_cooldown) + proximity.scan() + +/obj/item/clothing/suit/storage/marine/medium/rto/intel/proc/toggle_motion_detector(mob/user) + to_chat(user,SPAN_NOTICE("You [motion_detector? "disable" : "enable"] \the [src]'s motion detector.")) + if(!motion_detector) + playsound(loc,'sound/items/detector_turn_on.ogg', 25, 1) + else + playsound(loc,'sound/items/detector_turn_off.ogg', 25, 1) + motion_detector = !motion_detector + var/datum/action/item_action/intel/toggle_motion_detector/TMD = locate(/datum/action/item_action/intel/toggle_motion_detector) in actions + TMD.update_icon() + motion_detector() + +/obj/item/clothing/suit/storage/marine/medium/rto/intel/proc/motion_detector() + if(motion_detector) + START_PROCESSING(SSobj, src) + else + STOP_PROCESSING(SSobj, src) + +/obj/item/clothing/suit/storage/marine/medium/rto/intel/mob_can_equip(mob/living/carbon/human/user, slot, disable_warning) //Thanks to Drathek for the help on this part! + if(!..()) + return FALSE + + // Only equip if uniform doesn't already have a utility accessory slot equipped + var/obj/item/clothing/under/uniform = user.w_uniform + var/accessory = locate(/obj/item/clothing/accessory/storage) in uniform.accessories + if(accessory) + to_chat(user, SPAN_WARNING("[src] can't be worn with [accessory].")) + return FALSE + // Only equip if user has expert intel skill level + if(!skillcheck(user, SKILL_INTEL, SKILL_INTEL_EXPERT)) + to_chat(user, SPAN_WARNING("You don't seem to know how to use [src]...")) + return FALSE + return TRUE + +/obj/item/clothing/suit/storage/marine/medium/rto/intel/equipped(mob/user, slot, silent) //When XM4 is equipped this removes ACCESSORY_SLOT_UTILITY as a valid accessory for the uniform + . = ..() + if(slot == WEAR_JACKET) + var/mob/living/carbon/human/human = user + var/obj/item/clothing/under/uniform = human.w_uniform + if(uniform?.valid_accessory_slots) + uniform?.valid_accessory_slots -= ACCESSORY_SLOT_UTILITY + +/obj/item/clothing/suit/storage/marine/medium/rto/intel/unequipped(mob/user, slot) //When unequipped this adds the ACCESSORY_SLOT_UTILITY back as a valid accessory + . = ..() + if(slot == WEAR_JACKET) + var/mob/living/carbon/human/human = user + var/obj/item/clothing/under/uniform = human.w_uniform + if(uniform) + // Figure out if the uniform originally allowed ACCESSORY_SLOT_UTILITY + var/obj/item/clothing/under/temp_uniform = new uniform.type + if(temp_uniform.valid_accessory_slots) + for(var/allowed in temp_uniform.valid_accessory_slots) + if(allowed == ACCESSORY_SLOT_UTILITY) + // It was allowed previously, now add it back + uniform.valid_accessory_slots += ACCESSORY_SLOT_UTILITY + break + qdel(temp_uniform) diff --git a/code/modules/clothing/suits/marine_armor/smartgunner.dm b/code/modules/clothing/suits/marine_armor/smartgunner.dm new file mode 100644 index 000000000000..430942fbbef8 --- /dev/null +++ b/code/modules/clothing/suits/marine_armor/smartgunner.dm @@ -0,0 +1,60 @@ +/obj/item/clothing/suit/storage/marine/smartgunner + name = "\improper M56 combat harness" + desc = "A heavy protective vest designed to be worn with the M56 Smartgun System. \nIt has specially designed straps and reinforcement to carry the Smartgun and accessories." + icon_state = "8" + item_state = "armor" + armor_laser = CLOTHING_ARMOR_LOW + armor_bomb = CLOTHING_ARMOR_MEDIUM + armor_rad = CLOTHING_ARMOR_MEDIUM + storage_slots = 2 + slowdown = SLOWDOWN_ARMOR_LIGHT + flags_inventory = BLOCKSHARPOBJ|SMARTGUN_HARNESS + allowed = list( + /obj/item/tank/emergency_oxygen, + /obj/item/device/flashlight, + /obj/item/ammo_magazine, + /obj/item/explosive/mine, + /obj/item/attachable/bayonet, + /obj/item/weapon/gun/smartgun, + /obj/item/storage/backpack/general_belt, + /obj/item/device/motiondetector, + /obj/item/device/walkman, + ) + +/obj/item/clothing/suit/storage/marine/smartgunner/Initialize() + . = ..() + if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD] && name == "M56 combat harness") + name = "M56 snow combat harness" + else + name = "M56 combat harness" + //select_gamemode_skin(type) + +/obj/item/clothing/suit/storage/marine/smartgunner/mob_can_equip(mob/equipping_mob, slot, disable_warning = FALSE) + . = ..() + + if(equipping_mob.back) + to_chat(equipping_mob, SPAN_WARNING("You can't equip [src] while wearing a backpack.")) + return FALSE + +/obj/item/clothing/suit/storage/marine/smartgunner/equipped(mob/user, slot, silent) + . = ..() + + if(slot == WEAR_JACKET) + RegisterSignal(user, COMSIG_HUMAN_ATTEMPTING_EQUIP, PROC_REF(check_equipping)) + +/obj/item/clothing/suit/storage/marine/smartgunner/proc/check_equipping(mob/living/carbon/human/equipping_human, obj/item/equipping_item, slot) + SIGNAL_HANDLER + + if(slot != WEAR_BACK) + return + + . = COMPONENT_HUMAN_CANCEL_ATTEMPT_EQUIP + + if(equipping_item.flags_equip_slot == SLOT_BACK) + to_chat(equipping_human, SPAN_WARNING("You can't equip [equipping_item] on your back while wearing [src].")) + return + +/obj/item/clothing/suit/storage/marine/smartgunner/unequipped(mob/user, slot) + . = ..() + + UnregisterSignal(user, COMSIG_HUMAN_ATTEMPTING_EQUIP) diff --git a/code/modules/clothing/suits/marine_armor/spec_fire.dm b/code/modules/clothing/suits/marine_armor/spec_fire.dm new file mode 100644 index 000000000000..4d577cc98b15 --- /dev/null +++ b/code/modules/clothing/suits/marine_armor/spec_fire.dm @@ -0,0 +1,150 @@ +#define FIRE_SHIELD_CD 150 + +/obj/item/clothing/suit/storage/marine/M35 + name = "\improper M35 pyrotechnician armor" + desc = "A custom set of M35 armor designed for use by USCM Pyrotechnicians." + icon_state = "pyro_armor" + armor_bio = CLOTHING_ARMOR_MEDIUMHIGH + armor_internaldamage = CLOTHING_ARMOR_MEDIUMHIGH + fire_intensity_resistance = BURN_LEVEL_TIER_1 + max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROT + flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET + flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET + flags_heat_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS|BODY_FLAG_LEGS|BODY_FLAG_FEET + flags_item = MOB_LOCK_ON_EQUIP|NO_CRYO_STORE + specialty = "M35 pyrotechnician" + actions_types = list(/datum/action/item_action/toggle, /datum/action/item_action/specialist/fire_shield) + unacidable = TRUE + var/fire_shield_on = FALSE + var/can_activate = TRUE + +/obj/item/clothing/suit/storage/marine/M35/equipped(mob/user, slot) + if(slot == WEAR_JACKET) + RegisterSignal(user, COMSIG_LIVING_FLAMER_CROSSED, PROC_REF(flamer_fire_callback)) + ..() + +/obj/item/clothing/suit/storage/marine/M35/verb/fire_shield() + set name = "Activate Fire Shield" + set desc = "Activate your armor's FIREWALK protocol for a short duration." + set category = "Pyro" + set src in usr + if(!usr || usr.is_mob_incapacitated(TRUE)) + return + if(!ishuman(usr)) + return + var/mob/living/carbon/human/H = usr + + if(H.wear_suit != src) + to_chat(H, SPAN_WARNING("You must be wearing the M35 pyro armor to activate FIREWALK protocol!")) + return + + if(!skillcheck(H, SKILL_SPEC_WEAPONS, SKILL_SPEC_ALL) && H.skills.get_skill_level(SKILL_SPEC_WEAPONS) != SKILL_SPEC_PYRO) + to_chat(H, SPAN_WARNING("You don't seem to know how to use [src]...")) + return + + if(fire_shield_on) + to_chat(H, SPAN_WARNING("You already have FIREWALK protocol activated!")) + return + + if(!can_activate) + to_chat(H, SPAN_WARNING("FIREWALK protocol was recently activated, wait before trying to activate it again.")) + return + + to_chat(H, SPAN_NOTICE("FIREWALK protocol has been activated. You will now be immune to fire for 6 seconds!")) + RegisterSignal(H, COMSIG_LIVING_PREIGNITION, PROC_REF(fire_shield_is_on)) + RegisterSignal(H, list( + COMSIG_LIVING_FLAMER_FLAMED, + ), PROC_REF(flamer_fire_callback)) + fire_shield_on = TRUE + can_activate = FALSE + for(var/X in actions) + var/datum/action/A = X + A.update_button_icon() + addtimer(CALLBACK(src, PROC_REF(end_fire_shield), H), 6 SECONDS) + + H.add_filter("firewalk_on", 1, list("type" = "outline", "color" = "#03fcc6", "size" = 1)) + +/obj/item/clothing/suit/storage/marine/M35/proc/end_fire_shield(mob/living/carbon/human/user) + if(!istype(user)) + return + to_chat(user, SPAN_NOTICE("FIREWALK protocol has finished.")) + UnregisterSignal(user, list( + COMSIG_LIVING_PREIGNITION, + COMSIG_LIVING_FLAMER_FLAMED, + )) + fire_shield_on = FALSE + + user.remove_filter("firewalk_on") + + addtimer(CALLBACK(src, PROC_REF(enable_fire_shield), user), FIRE_SHIELD_CD) + +/obj/item/clothing/suit/storage/marine/M35/proc/enable_fire_shield(mob/living/carbon/human/user) + if(!istype(user)) + return + to_chat(user, SPAN_NOTICE("FIREWALK protocol can be activated again.")) + can_activate = TRUE + + for(var/X in actions) + var/datum/action/A = X + A.update_button_icon() + +/// This proc is solely so that IgniteMob() fails +/obj/item/clothing/suit/storage/marine/M35/proc/fire_shield_is_on(mob/living/L) + SIGNAL_HANDLER + + if(L.fire_reagent?.fire_penetrating) + return + + return COMPONENT_CANCEL_IGNITION + +/obj/item/clothing/suit/storage/marine/M35/proc/flamer_fire_callback(mob/living/L, datum/reagent/R) + SIGNAL_HANDLER + + if(R.fire_penetrating) + return + + . = COMPONENT_NO_IGNITE + if(fire_shield_on) + . |= COMPONENT_NO_BURN + +/obj/item/clothing/suit/storage/marine/M35/dropped(mob/user) + if (!istype(user)) + return + UnregisterSignal(user, list( + COMSIG_LIVING_PREIGNITION, + COMSIG_LIVING_FLAMER_CROSSED, + COMSIG_LIVING_FLAMER_FLAMED, + )) + ..() + +#undef FIRE_SHIELD_CD + +/datum/action/item_action/specialist/fire_shield + ability_primacy = SPEC_PRIMARY_ACTION_2 + +/datum/action/item_action/specialist/fire_shield/New(mob/living/user, obj/item/holder) + ..() + name = "Activate Fire Shield" + button.name = name + button.overlays.Cut() + var/image/IMG = image('icons/obj/items/clothing/cm_suits.dmi', button, "pyro_armor") + button.overlays += IMG + +/datum/action/item_action/specialist/fire_shield/action_cooldown_check() + var/obj/item/clothing/suit/storage/marine/M35/armor = holder_item + if (!istype(armor)) + return FALSE + + return !armor.can_activate + +/datum/action/item_action/specialist/fire_shield/can_use_action() + var/mob/living/carbon/human/H = owner + if(istype(H) && !H.is_mob_incapacitated() && H.wear_suit == holder_item) + return TRUE + +/datum/action/item_action/specialist/fire_shield/action_activate() + var/obj/item/clothing/suit/storage/marine/M35/armor = holder_item + if (!istype(armor)) + return + + armor.fire_shield() diff --git a/colonialmarines.dme b/colonialmarines.dme index 12862cb2c544..7569f131d1ec 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -1569,11 +1569,16 @@ #include "code\modules\clothing\suits\bio.dm" #include "code\modules\clothing\suits\jobs.dm" #include "code\modules\clothing\suits\labcoat.dm" -#include "code\modules\clothing\suits\marine_armor.dm" #include "code\modules\clothing\suits\marine_coat.dm" #include "code\modules\clothing\suits\miscellaneous.dm" #include "code\modules\clothing\suits\storage.dm" #include "code\modules\clothing\suits\utility.dm" +#include "code\modules\clothing\suits\marine_armor\_marine_armor.dm" +#include "code\modules\clothing\suits\marine_armor\ert.dm" +#include "code\modules\clothing\suits\marine_armor\ghillie.dm" +#include "code\modules\clothing\suits\marine_armor\intel.dm" +#include "code\modules\clothing\suits\marine_armor\smartgunner.dm" +#include "code\modules\clothing\suits\marine_armor\spec_fire.dm" #include "code\modules\clothing\under\color.dm" #include "code\modules\clothing\under\gimmick.dm" #include "code\modules\clothing\under\marine_uniform.dm" From 35a4d031f61e7e4567bbd70aa9e21b202d0853dc Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 24 Feb 2024 20:29:14 +0000 Subject: [PATCH 43/50] Automatic changelog for PR #5740 [ci skip] --- html/changelogs/AutoChangeLog-pr-5740.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5740.yml diff --git a/html/changelogs/AutoChangeLog-pr-5740.yml b/html/changelogs/AutoChangeLog-pr-5740.yml new file mode 100644 index 000000000000..f80440f4fbf9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5740.yml @@ -0,0 +1,4 @@ +author: "Huffie56" +delete-after: True +changes: + - refactor: "refactor marine_armor.dm and split it into multiples files." \ No newline at end of file From 4546ee033e2020e2f5cc4d5770a04ecbff178182 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Sat, 24 Feb 2024 12:23:10 -0800 Subject: [PATCH 44/50] Barricades Multi-Weld Revert & Refactoring (#5795) # About the pull request This PR is a follow up to #5609 which removed a busy check from some barricades allowing multi-welding. This PR restores that setting (which is a return to normal for all but folding barricades which incorrectly allowed multi-welding before). I have also added automatic looping to barricade welding if there is still work to be done, and it can be performed. # Explain why it's good for the game The PR that introduced this change was not intended to be a balance change. Additionally, it's far more difficult to tune welding speeds if the quantity of barricades being welded at the same time is variable. Technically this is a nerf though because previously multi-welding folding barricades was possible. # Testing Photographs and Procedure
Screenshots & Videos https://github.com/cmss13-devs/cmss13/assets/76988376/32deb97f-31b0-4fd0-8baf-54637cfbf81d After looping welding addition: https://github.com/cmss13-devs/cmss13/assets/76988376/e67efe06-711e-4847-aa36-345c1e85222d
# Changelog :cl: Drathek add: Welding a barricade will now repeat automatically if it can still be repaired. balance: Reverted multi-welding change to barricades: All barricades must be welded one at a time. refactor: Refactored more barricade code. /:cl: --- .../objects/structures/barricade/barricade.dm | 33 ++++++++---- .../structures/barricade/deployable.dm | 28 ++++------ .../objects/structures/barricade/metal.dm | 34 +++++++----- .../game/objects/structures/barricade/misc.dm | 6 +-- .../objects/structures/barricade/plasteel.dm | 52 +++++++++++-------- 5 files changed, 90 insertions(+), 63 deletions(-) diff --git a/code/game/objects/structures/barricade/barricade.dm b/code/game/objects/structures/barricade/barricade.dm index 37975d4a8960..2dea5cd33050 100644 --- a/code/game/objects/structures/barricade/barricade.dm +++ b/code/game/objects/structures/barricade/barricade.dm @@ -366,9 +366,8 @@ if(50 to 75) damage_state = BARRICADE_DMG_SLIGHT if(75 to INFINITY) damage_state = BARRICADE_DMG_NONE -/obj/structure/barricade/proc/weld_cade(obj/item/tool/weldingtool/welder, mob/user) - if(!metallic) - user.visible_message(SPAN_WARNING("You can't weld \the [src]!")) +/obj/structure/barricade/proc/try_weld_cade(obj/item/tool/weldingtool/welder, mob/user, repeat = TRUE, skip_check = FALSE) + if(!skip_check && !can_weld(welder, user)) return FALSE if(!(welder.remove_fuel(2, user))) @@ -387,6 +386,14 @@ user.count_niche_stat(STATISTICS_NICHE_REPAIR_CADES) update_health(-200) playsound(src.loc, 'sound/items/Welder2.ogg', 25, TRUE) + + welder = user.get_active_hand() + if(repeat && can_weld(welder, user, silent = TRUE)) + // Assumption: The implementation of can_weld will return false if fully repaired + if(!try_weld_cade(welder, user, repeat = TRUE, skip_check = TRUE)) + // If this returned false, then we were interrupted or ran out of fuel, so stop looping + return TRUE + return TRUE /obj/structure/barricade/verb/count_rotate() @@ -476,20 +483,28 @@ nailgun.load_into_chamber() return TRUE -// This proc is to check a bunch of condition to cancel the action that a welder user is trying to do while giving -// a explanation on why... +/obj/structure/barricade/proc/can_weld(obj/item/item, mob/user, silent) + if(user.action_busy) + return FALSE + + if(!metallic) + if(!silent) + user.visible_message(SPAN_WARNING("You can't weld \the [src]!")) + return FALSE -/obj/structure/barricade/proc/attackby_welder(obj/item/item, mob/user) if(!HAS_TRAIT(item, TRAIT_TOOL_BLOWTORCH)) - to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) + if(!silent) + to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) return FALSE if(health == maxhealth) - to_chat(user, SPAN_WARNING("[src] doesn't need repairs.")) + if(!silent) + to_chat(user, SPAN_WARNING("[src] doesn't need repairs.")) return FALSE if(!(isnull(damage_state)) && !(isnull(welder_lower_damage_limit)) && damage_state >= welder_lower_damage_limit) - to_chat(user, SPAN_WARNING("[src] has sustained too much structural damage to be repaired.")) + if(!silent) + to_chat(user, SPAN_WARNING("[src] has sustained too much structural damage to be repaired.")) return FALSE return TRUE diff --git a/code/game/objects/structures/barricade/deployable.dm b/code/game/objects/structures/barricade/deployable.dm index 3de5ba1928a2..ca35f82bdde5 100644 --- a/code/game/objects/structures/barricade/deployable.dm +++ b/code/game/objects/structures/barricade/deployable.dm @@ -24,34 +24,28 @@ . += SPAN_INFO("Drag its sprite onto yourself to undeploy.") /obj/structure/barricade/deployable/attackby(obj/item/item, mob/user) - if(iswelder(item)) - if(!attackby_welder(item, user)) - return FALSE - - - weld_cade(item, user) + try_weld_cade(item, user) return - else if(HAS_TRAIT(item, TRAIT_TOOL_CROWBAR)) + if(HAS_TRAIT(item, TRAIT_TOOL_CROWBAR)) if(user.action_busy) return if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You do not know how to collapse [src] using a crowbar...")) return + user.visible_message(SPAN_NOTICE("[user] starts collapsing [src]."), \ + SPAN_NOTICE("You begin collapsing [src]...")) + playsound(loc, 'sound/items/Crowbar.ogg', 25, 1) + if(do_after(user, 1.5 SECONDS, INTERRUPT_NO_NEEDHAND, BUSY_ICON_FRIENDLY, src)) + collapse(usr) else - user.visible_message(SPAN_NOTICE("[user] starts collapsing [src]."), \ - SPAN_NOTICE("You begin collapsing [src]...")) - playsound(loc, 'sound/items/Crowbar.ogg', 25, 1) - if(do_after(user, 1.5 SECONDS, INTERRUPT_NO_NEEDHAND, BUSY_ICON_FRIENDLY, src)) - collapse(usr) - else - to_chat(user, SPAN_WARNING("You stop collapsing [src].")) + to_chat(user, SPAN_WARNING("You stop collapsing [src].")) if(try_nailgun_usage(item, user)) return - . = ..() + return ..() /obj/structure/barricade/deployable/MouseDrop(obj/over_object as obj) if(!ishuman(usr)) @@ -196,7 +190,7 @@ to_chat(user, SPAN_INFO("You transfer [to_transfer] between the stacks.")) return - else if(iswelder(item)) + if(iswelder(item)) if(!HAS_TRAIT(item, TRAIT_TOOL_BLOWTORCH)) to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) return @@ -242,7 +236,7 @@ playsound(loc, 'sound/items/Welder2.ogg', 25, TRUE) return - . = ..() + return ..() /obj/item/stack/folding_barricade/attack_hand(mob/user) var/mob/living/carbon/human/human = user diff --git a/code/game/objects/structures/barricade/metal.dm b/code/game/objects/structures/barricade/metal.dm index 59f4ad314878..3e79af2e21e1 100644 --- a/code/game/objects/structures/barricade/metal.dm +++ b/code/game/objects/structures/barricade/metal.dm @@ -44,18 +44,20 @@ if(BARRICADE_UPGRADE_ANTIFF) . += SPAN_NOTICE("The cade is protected by a composite upgrade.") -/obj/structure/barricade/metal/attackby(obj/item/item, mob/user) - if(iswelder(item)) - if(!attackby_welder(item, user)) - return FALSE +/obj/structure/barricade/metal/can_weld(obj/item/item, mob/user, silent) + if(!..()) + return FALSE - - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) + if(!silent) to_chat(user, SPAN_WARNING("You're not trained to repair [src]...")) - return FALSE + return FALSE - weld_cade(item, user) + return TRUE +/obj/structure/barricade/metal/attackby(obj/item/item, mob/user) + if(iswelder(item)) + try_weld_cade(item, user) return if(try_nailgun_usage(item, user)) @@ -198,11 +200,13 @@ to_chat(user, SPAN_WARNING("You are not trained to assemble [src]...")) return playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, 1) - if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) return + if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) + return user.visible_message(SPAN_NOTICE("[user] set [src]'s protection panel back."), SPAN_NOTICE("You set [src]'s protection panel back.")) build_state = BARRICADE_BSTATE_SECURED return + if(HAS_TRAIT(item, TRAIT_TOOL_WRENCH)) if(user.action_busy) return @@ -210,13 +214,15 @@ to_chat(user, SPAN_WARNING("You are not trained to disassemble [src]...")) return playsound(src.loc, 'sound/items/Ratchet.ogg', 25, 1) - if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) return + if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) + return user.visible_message(SPAN_NOTICE("[user] loosens [src]'s anchor bolts."), SPAN_NOTICE("You loosen [src]'s anchor bolts.")) anchored = FALSE build_state = BARRICADE_BSTATE_MOVABLE update_icon() //unanchored changes layer return + if(BARRICADE_BSTATE_MOVABLE) //Anchor bolts loosened step. Apply crowbar to unseat the panel and take apart the whole thing. Apply wrench to resecure anchor bolts if(HAS_TRAIT(item, TRAIT_TOOL_WRENCH)) if(user.action_busy) @@ -233,13 +239,15 @@ to_chat(user, SPAN_WARNING("[src] must be secured on a proper surface!")) return playsound(src.loc, 'sound/items/Ratchet.ogg', 25, 1) - if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) return + if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) + return user.visible_message(SPAN_NOTICE("[user] secures [src]'s anchor bolts."), SPAN_NOTICE("You secure [src]'s anchor bolts.")) build_state = BARRICADE_BSTATE_UNSECURED anchored = TRUE update_icon() //unanchored changes layer return + if(HAS_TRAIT(item, TRAIT_TOOL_CROWBAR)) if(user.action_busy) return @@ -256,7 +264,7 @@ deconstruct(TRUE) //Note : Handles deconstruction too ! return - . = ..() + return ..() /obj/structure/barricade/metal/wired/New() maxhealth += 50 @@ -265,7 +273,7 @@ is_wired = TRUE climbable = FALSE update_icon() - . = ..() + return ..() /obj/structure/barricade/metal/wired/initialize_pass_flags(datum/pass_flags_container/PF) ..() diff --git a/code/game/objects/structures/barricade/misc.dm b/code/game/objects/structures/barricade/misc.dm index 5e0958f974b1..a0465de8f070 100644 --- a/code/game/objects/structures/barricade/misc.dm +++ b/code/game/objects/structures/barricade/misc.dm @@ -44,8 +44,8 @@ user.visible_message(SPAN_NOTICE("\The [user] removes \the [src].")) deconstruct(TRUE) return - else - . = ..() + + return ..() /obj/structure/barricade/snow/hit_barricade(obj/item/I) switch(I.damtype) @@ -101,7 +101,7 @@ if(try_nailgun_usage(W, user)) return - . = ..() + return ..() /obj/structure/barricade/wooden/hit_barricade(obj/item/I) switch(I.damtype) diff --git a/code/game/objects/structures/barricade/plasteel.dm b/code/game/objects/structures/barricade/plasteel.dm index bba07832f790..1acedae9997d 100644 --- a/code/game/objects/structures/barricade/plasteel.dm +++ b/code/game/objects/structures/barricade/plasteel.dm @@ -47,7 +47,7 @@ if(!closed) // Closed = gate down for plasteel for some reason return ..() else - return 0 + return FALSE /obj/structure/barricade/plasteel/get_examine_text(mob/user) . = ..() @@ -60,22 +60,25 @@ if(BARRICADE_BSTATE_MOVABLE) . += SPAN_INFO("The protection panel has been removed and the anchor bolts loosened. It's ready to be taken apart.") -/obj/structure/barricade/plasteel/weld_cade(obj/item/item, mob/user) +/obj/structure/barricade/plasteel/try_weld_cade(obj/item/item, mob/user, repeat = TRUE, skip_check = FALSE) busy = TRUE ..() busy = FALSE -/obj/structure/barricade/plasteel/attackby(obj/item/item, mob/user) - if(iswelder(item)) - if(!attackby_welder(item, user)) - return FALSE +/obj/structure/barricade/plasteel/can_weld(obj/item/item, mob/user, silent) + if(!..()) + return FALSE - - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) + if(!silent) to_chat(user, SPAN_WARNING("You're not trained to repair [src]...")) - return FALSE + return FALSE + + return TRUE - weld_cade(item, user) +/obj/structure/barricade/plasteel/attackby(obj/item/item, mob/user) + if(iswelder(item)) + try_weld_cade(item, user) return if(try_nailgun_usage(item, user)) @@ -87,7 +90,7 @@ return switch(build_state) - if(2) //Fully constructed step. Use screwdriver to remove the protection panels to reveal the bolts + if(BARRICADE_BSTATE_SECURED) //Fully constructed step. Use screwdriver to remove the protection panels to reveal the bolts if(HAS_TRAIT(item, TRAIT_TOOL_SCREWDRIVER)) if(busy || tool_cooldown > world.time) return @@ -100,12 +103,14 @@ if(B != src && B.dir == dir) to_chat(user, SPAN_WARNING("There's already a barricade here.")) return - if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) return + if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) + return user.visible_message(SPAN_NOTICE("[user] removes [src]'s protection panel."), SPAN_NOTICE("You remove [src]'s protection panels, exposing the anchor bolts.")) playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, 1) build_state = BARRICADE_BSTATE_UNSECURED return + if(HAS_TRAIT(item, TRAIT_TOOL_CROWBAR)) if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) to_chat(user, SPAN_WARNING("You are not trained to modify [src]...")) @@ -125,7 +130,8 @@ for(var/obj/structure/barricade/plasteel/cade in get_step(src, direction)) cade.update_icon() update_icon() - if(1) //Protection panel removed step. Screwdriver to put the panel back, wrench to unsecure the anchor bolts + + if(BARRICADE_BSTATE_UNSECURED) //Protection panel removed step. Screwdriver to put the panel back, wrench to unsecure the anchor bolts if(HAS_TRAIT(item, TRAIT_TOOL_SCREWDRIVER)) if(busy || tool_cooldown > world.time) return @@ -133,12 +139,14 @@ if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) to_chat(user, SPAN_WARNING("You are not trained to assemble [src]...")) return - if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) return + if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) + return user.visible_message(SPAN_NOTICE("[user] set [src]'s protection panel back."), SPAN_NOTICE("You set [src]'s protection panel back.")) playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, 1) build_state = BARRICADE_BSTATE_SECURED return + if(HAS_TRAIT(item, TRAIT_TOOL_WRENCH)) if(busy || tool_cooldown > world.time) return @@ -146,7 +154,8 @@ if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) to_chat(user, SPAN_WARNING("You are not trained to assemble [src]...")) return - if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) return + if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) + return user.visible_message(SPAN_NOTICE("[user] loosens [src]'s anchor bolts."), SPAN_NOTICE("You loosen [src]'s anchor bolts.")) playsound(src.loc, 'sound/items/Ratchet.ogg', 25, 1) @@ -155,7 +164,7 @@ update_icon() //unanchored changes layer return - if(0) //Anchor bolts loosened step. Apply crowbar to unseat the panel and take apart the whole thing. Apply wrench to rescure anchor bolts + if(BARRICADE_BSTATE_MOVABLE) //Anchor bolts loosened step. Apply crowbar to unseat the panel and take apart the whole thing. Apply wrench to rescure anchor bolts if(HAS_TRAIT(item, TRAIT_TOOL_WRENCH)) if(busy || tool_cooldown > world.time) return @@ -167,7 +176,8 @@ if(!(istype(T) && T.allow_construction)) to_chat(user, SPAN_WARNING("[src] must be secured on a proper surface!")) return - if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) return + if(!do_after(user, 10, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) + return user.visible_message(SPAN_NOTICE("[user] secures [src]'s anchor bolts."), SPAN_NOTICE("You secure [src]'s anchor bolts.")) playsound(src.loc, 'sound/items/Ratchet.ogg', 25, 1) @@ -175,6 +185,7 @@ build_state = BARRICADE_BSTATE_UNSECURED update_icon() //unanchored changes layer return + if(HAS_TRAIT(item, TRAIT_TOOL_CROWBAR)) if(busy || tool_cooldown > world.time) return @@ -187,15 +198,14 @@ playsound(src.loc, 'sound/items/Crowbar.ogg', 25, 1) busy = TRUE if(do_after(user, 50 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src)) - busy = FALSE user.visible_message(SPAN_NOTICE("[user] takes [src]'s panels apart."), SPAN_NOTICE("You take [src]'s panels apart.")) playsound(loc, 'sound/items/Deconstruct.ogg', 25, 1) deconstruct(TRUE) //Note : Handles deconstruction too ! - else busy = FALSE + busy = FALSE return - . = ..() + return ..() /obj/structure/barricade/plasteel/attack_hand(mob/user as mob) if(isxeno(user)) @@ -257,7 +267,7 @@ is_wired = TRUE climbable = FALSE update_icon() - . = ..() + return ..() /obj/structure/barricade/plasteel/wired/initialize_pass_flags(datum/pass_flags_container/PF) ..() From 031dff0b24797e2439f88a80365475b1c4668443 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 24 Feb 2024 20:45:18 +0000 Subject: [PATCH 45/50] Automatic changelog for PR #5795 [ci skip] --- html/changelogs/AutoChangeLog-pr-5795.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5795.yml diff --git a/html/changelogs/AutoChangeLog-pr-5795.yml b/html/changelogs/AutoChangeLog-pr-5795.yml new file mode 100644 index 000000000000..3e466e1cb3a3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5795.yml @@ -0,0 +1,6 @@ +author: "Drathek" +delete-after: True +changes: + - rscadd: "Welding a barricade will now repeat automatically if it can still be repaired." + - balance: "Reverted multi-welding change to barricades: All barricades must be welded one at a time." + - refactor: "Refactored more barricade code." \ No newline at end of file From bab9f8619e277df64c23952ca1b393b4ffb9df2d Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Sat, 24 Feb 2024 20:35:38 +0000 Subject: [PATCH 46/50] Small auto-observe fixes (#5788) # About the pull request Fixes/tweaks a couple of auto-observe things that I noticed after #5751. Specifically: - Fixes `runtime error: client_screen_add overridden. Use override = TRUE to suppress this warning`/`runtime error: client_screen_remove overridden. Use override = TRUE to suppress this warning`. *This error was consistently thrown when a ghost who's body is being observed re-enters their body. `observe_target_new_mind()` tries to re-register the some signals on the body's new client, but didn't have the `override` argument set.* - Stops 'hidden' actions being added to the screen of observing players. (e.g. the xeno tacmap action if the queen isn't ovied) - Makes any observers transfer over to the new body when a xenomorph evolves/de-evolves. *(I also added `/mob/dead/observer` to the `observers` variable's declaration since it wasn't particularly clear what the list held.)* - Fixes the target player's action buttons disappearing for observers if they reconnect or re-enter their body. *(The actions were being shown to the player in `Login()`>`show_hud()`>`update_action_buttons()` before the observer could re-register signals in `observe_target_login()`.) In order to fix this I renamed the existing `COMSIG_GLOB_MOB_LOGIN`, `COMSIG_CLIENT_MOB_LOGIN`, `COMSIG_MOB_LOGIN` signals, and made `COMSIG_MOB_LOGIN` send a bit earlier in the proc.* # Explain why it's good for the game Bugfixes :) # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: Fixed 'hidden' action buttons being shown to observing players. qol: Made any observers transfer over when a Xenomorph evolves/de-evolves. /:cl: --- code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm | 8 ++++++-- code/__DEFINES/dcs/signals/signals_client.dm | 4 ++-- code/__DEFINES/dcs/signals/signals_global.dm | 6 ++++-- code/controllers/subsystem/ticker.dm | 2 +- code/controllers/subsystem/vote.dm | 4 ++-- code/game/objects/items/devices/radio/headset.dm | 4 ++-- code/modules/client/client_procs.dm | 2 +- code/modules/escape_menu/escape_menu.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 11 +++++++---- code/modules/mob/living/carbon/carbon.dm | 6 +++++- code/modules/mob/living/carbon/xenomorph/Xenomorph.dm | 5 +++++ code/modules/mob/login.dm | 8 +++++--- code/modules/mob/mob_defines.dm | 4 ++-- code/modules/vehicles/van/van.dm | 6 +++--- 14 files changed, 46 insertions(+), 26 deletions(-) diff --git a/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm b/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm index 61eb757e9c4d..f4df347c62db 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm @@ -75,9 +75,13 @@ #define COMSIG_MOB_PRE_CLICK "mob_pre_click" #define COMPONENT_INTERRUPT_CLICK (1<<0) -///from base of /mob/Login(): () +/// From base of /mob/Login(), called when a client logs into this mob: () +/// Not to be confused with [COMSIG_MOB_LOGGED_IN] #define COMSIG_MOB_LOGIN "mob_login" -///from base of /mob/Logout(): () +/// From base of /mob/Login(), called after a client logs into this mob: () +/// Not to be confused with [COMSIG_MOB_LOGIN] +#define COMSIG_MOB_LOGGED_IN "mob_logged_in" +/// From base of /mob/Logout(): () #define COMSIG_MOB_LOGOUT "mob_logout" /// From /mob/proc/change_real_name(): (old_name, new_name) diff --git a/code/__DEFINES/dcs/signals/signals_client.dm b/code/__DEFINES/dcs/signals/signals_client.dm index 3968f654c486..36a60c153d0f 100644 --- a/code/__DEFINES/dcs/signals/signals_client.dm +++ b/code/__DEFINES/dcs/signals/signals_client.dm @@ -19,8 +19,8 @@ /// Called after one or more verbs are added: (list of verbs added) #define COMSIG_CLIENT_VERB_REMOVED "client_verb_removed" -/// Called after a client logs into a mob: (mob) -#define COMSIG_CLIENT_MOB_LOGIN "client_mob_changed" +/// Called from /mob/Login() after a client logs into a mob: (mob) +#define COMSIG_CLIENT_MOB_LOGGED_IN "client_mob_logged_in" /// Called when something is added to a client's screen : /client/proc/add_to_screen(screen_add) #define COMSIG_CLIENT_SCREEN_ADD "client_screen_add" diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index 8aa700f4fb3a..378948347a81 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -34,9 +34,11 @@ #define COMSIG_GLOB_REMOVE_VOTE_BUTTON "!remove_vote_button" -#define COMSIG_GLOB_CLIENT_LOGIN "!client_login" +/// Called from /client/New() when a client logs in to the game: (client) +#define COMSIG_GLOB_CLIENT_LOGGED_IN "!client_logged_in" -#define COMSIG_GLOB_MOB_LOGIN "!mob_login" +/// Called from /mob/Login() when a client logs into a mob: (mob) +#define COMSIG_GLOB_MOB_LOGGED_IN "!mob_logged_in" ///from /datum/controller/subsystem/ticker/PostSetup #define COMSIG_GLOB_POST_SETUP "!post_setup" diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 2b9812abade4..20691a1a7723 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -207,7 +207,7 @@ SUBSYSTEM_DEF(ticker) CHECK_TICK mode.announce() if(mode.taskbar_icon) - RegisterSignal(SSdcs, COMSIG_GLOB_CLIENT_LOGIN, PROC_REF(handle_mode_icon)) + RegisterSignal(SSdcs, COMSIG_GLOB_CLIENT_LOGGED_IN, PROC_REF(handle_mode_icon)) set_clients_taskbar_icon(mode.taskbar_icon) if(GLOB.perf_flags & PERF_TOGGLE_LAZYSS) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 6188e38e8d60..33967fab1004 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -59,7 +59,7 @@ SUBSYSTEM_DEF(vote) voting.Cut() remove_action_buttons() - UnregisterSignal(SSdcs, COMSIG_GLOB_CLIENT_LOGIN) + UnregisterSignal(SSdcs, COMSIG_GLOB_CLIENT_LOGGED_IN) for(var/c in GLOB.player_list) update_static_data(c) @@ -373,7 +373,7 @@ SUBSYSTEM_DEF(vote) if(send_clients_vote) C.mob.vote() - RegisterSignal(SSdcs, COMSIG_GLOB_CLIENT_LOGIN, PROC_REF(handle_client_joining)) + RegisterSignal(SSdcs, COMSIG_GLOB_CLIENT_LOGGED_IN, PROC_REF(handle_client_joining)) SStgui.update_uis(src) return TRUE return FALSE diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 7b987752011c..e1a28c7eb7a7 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -233,7 +233,7 @@ ), PROC_REF(turn_on)) wearer = user RegisterSignal(user, COMSIG_MOB_STAT_SET_ALIVE, PROC_REF(update_minimap_icon)) - RegisterSignal(user, COMSIG_MOB_LOGIN, PROC_REF(add_hud_tracker)) + RegisterSignal(user, COMSIG_MOB_LOGGED_IN, PROC_REF(add_hud_tracker)) RegisterSignal(user, COMSIG_MOB_DEATH, PROC_REF(update_minimap_icon)) RegisterSignal(user, COMSIG_HUMAN_SET_UNDEFIBBABLE, PROC_REF(update_minimap_icon)) if(headset_hud_on) @@ -250,7 +250,7 @@ UnregisterSignal(user, list( COMSIG_LIVING_REJUVENATED, COMSIG_HUMAN_REVIVED, - COMSIG_MOB_LOGIN, + COMSIG_MOB_LOGGED_IN, COMSIG_MOB_DEATH, COMSIG_HUMAN_SET_UNDEFIBBABLE, COMSIG_MOB_STAT_SET_ALIVE diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 44820444a955..5796d5ff505e 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -444,7 +444,7 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( view = GLOB.world_view_size - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CLIENT_LOGIN, src) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CLIENT_LOGGED_IN, src) ////////////// //DISCONNECT// diff --git a/code/modules/escape_menu/escape_menu.dm b/code/modules/escape_menu/escape_menu.dm index c31234678b62..b61bbd5b3f36 100644 --- a/code/modules/escape_menu/escape_menu.dm +++ b/code/modules/escape_menu/escape_menu.dm @@ -49,7 +49,7 @@ GLOBAL_LIST_EMPTY(escape_menus) show_page() RegisterSignal(client, COMSIG_PARENT_QDELETING, PROC_REF(on_client_qdel)) - RegisterSignal(client, COMSIG_CLIENT_MOB_LOGIN, PROC_REF(on_client_mob_login)) + RegisterSignal(client, COMSIG_CLIENT_MOB_LOGGED_IN, PROC_REF(on_client_mob_login)) if (!isnull(ckey)) GLOB.escape_menus[ckey] = src diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index ba84f1cca76d..3a27af37f669 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -236,8 +236,9 @@ if(observe_target_client != new_client) observe_target_client = new_client - RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_ADD, PROC_REF(observe_target_screen_add)) - RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_REMOVE, PROC_REF(observe_target_screen_remove)) + // Override the signal from any previous targets. + RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_ADD, PROC_REF(observe_target_screen_add), TRUE) + RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_REMOVE, PROC_REF(observe_target_screen_remove), TRUE) /// When the observe target logs in our observer connect to the new client /mob/dead/observer/proc/observe_target_login(mob/living/new_character) @@ -246,8 +247,9 @@ if(observe_target_client != new_character.client) observe_target_client = new_character.client - RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_ADD, PROC_REF(observe_target_screen_add)) - RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_REMOVE, PROC_REF(observe_target_screen_remove)) + // Override the signal from any previous targets. + RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_ADD, PROC_REF(observe_target_screen_add), TRUE) + RegisterSignal(observe_target_client, COMSIG_CLIENT_SCREEN_REMOVE, PROC_REF(observe_target_screen_remove), TRUE) ///makes the ghost see the target hud and sets the eye at the target. /mob/dead/observer/proc/do_observe(atom/movable/target) @@ -266,6 +268,7 @@ client.clear_screen() client.eye = carbon_target observe_target_mob = carbon_target + carbon_target.auto_observed(src) RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(observer_move_react)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index c56ccafc85ab..08daa5348022 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -431,8 +431,12 @@ observers |= observer hud_used.show_hud(hud_used.hud_version, observer) + // Add the player's action buttons (not the actions themselves) to the observer's screen. for(var/datum/action/action as anything in actions) - // Add the action's button (not the action itself) to the observer's screen. + // Skip any hidden ones (of course). + if(action.hidden || action.player_hidden) + continue + observer.client.add_to_screen(action.button) //generates realistic-ish pulse output based on preset levels diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm index 03ba544be6b8..69ab18431237 100644 --- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm +++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm @@ -766,6 +766,11 @@ var/datum/mob_hud/MH = GLOB.huds[MOB_HUD_XENO_INFECTION] MH.add_hud_to(src, src) +// Transfer any observing players over to the xeno's new body (`target`) on evolve/de-evolve. +/mob/living/carbon/xenomorph/transfer_observers_to(atom/target) + for(var/mob/dead/observer/observer as anything in observers) + observer.clean_observe_target() + observer.do_observe(target) /mob/living/carbon/xenomorph/check_improved_pointing() //xeno leaders get a big arrow and less cooldown diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 775e69dc0b92..38157a067367 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -18,6 +18,8 @@ update_Login_details() + SEND_SIGNAL(src, COMSIG_MOB_LOGIN) + client.images = null client.screen = null //remove hud items just in case if(!hud_used) @@ -58,6 +60,6 @@ client.init_verbs() - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MOB_LOGIN, src) - SEND_SIGNAL(client, COMSIG_CLIENT_MOB_LOGIN, src) - SEND_SIGNAL(src, COMSIG_MOB_LOGIN) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MOB_LOGGED_IN, src) + SEND_SIGNAL(client, COMSIG_CLIENT_MOB_LOGGED_IN, src) + SEND_SIGNAL(src, COMSIG_MOB_LOGGED_IN) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index f8df788aa5fc..0dc2a27594a7 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -28,7 +28,8 @@ I'll make some notes on where certain variable defines should probably go. Changing this around would probably require a good look-over the pre-existing code. */ - var/list/observers //The list of people observing this mob. + /// The list of people observing this mob. + var/list/mob/dead/observer/observers var/zone_selected = "chest" var/use_me = 1 //Allows all mobs to use the me verb by default, will have to manually specify they cannot @@ -429,4 +430,3 @@ return src.regenerate_icons() - diff --git a/code/modules/vehicles/van/van.dm b/code/modules/vehicles/van/van.dm index c4aa64360ec0..8bf114d6b4a8 100644 --- a/code/modules/vehicles/van/van.dm +++ b/code/modules/vehicles/van/van.dm @@ -83,7 +83,7 @@ icon_state = null - RegisterSignal(SSdcs, COMSIG_GLOB_MOB_LOGIN, PROC_REF(add_default_image)) + RegisterSignal(SSdcs, COMSIG_GLOB_MOB_LOGGED_IN, PROC_REF(add_default_image)) for(var/I in GLOB.player_list) add_default_image(SSdcs, I) @@ -125,7 +125,7 @@ mobs_under += L RegisterSignal(L, COMSIG_PARENT_QDELETING, PROC_REF(remove_under_van)) - RegisterSignal(L, COMSIG_MOB_LOGIN, PROC_REF(add_client)) + RegisterSignal(L, COMSIG_MOB_LOGGED_IN, PROC_REF(add_client)) RegisterSignal(L, COMSIG_MOVABLE_MOVED, PROC_REF(check_under_van)) if(L.client) @@ -141,7 +141,7 @@ UnregisterSignal(L, list( COMSIG_PARENT_QDELETING, - COMSIG_MOB_LOGIN, + COMSIG_MOB_LOGGED_IN, COMSIG_MOVABLE_MOVED, )) From 65ee67b6b8ffc91c3f2bfb01a0a70de1a5942c25 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 24 Feb 2024 21:00:49 +0000 Subject: [PATCH 47/50] Automatic changelog for PR #5788 [ci skip] --- html/changelogs/AutoChangeLog-pr-5788.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5788.yml diff --git a/html/changelogs/AutoChangeLog-pr-5788.yml b/html/changelogs/AutoChangeLog-pr-5788.yml new file mode 100644 index 000000000000..c06069867b58 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5788.yml @@ -0,0 +1,5 @@ +author: "SabreML" +delete-after: True +changes: + - bugfix: "Fixed 'hidden' action buttons being shown to observing players." + - qol: "Made any observers transfer over when a Xenomorph evolves/de-evolves." \ No newline at end of file From 084e3837a4acc73b2ee98323a86eb8532a77b439 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 25 Feb 2024 01:11:13 +0000 Subject: [PATCH 48/50] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-5740.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5777.yml | 6 ------ html/changelogs/AutoChangeLog-pr-5788.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5790.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5791.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5793.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5794.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5795.yml | 6 ------ html/changelogs/archive/2024-02.yml | 22 ++++++++++++++++++++++ 9 files changed, 22 insertions(+), 37 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5740.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5777.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5788.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5790.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5791.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5793.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5794.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5795.yml diff --git a/html/changelogs/AutoChangeLog-pr-5740.yml b/html/changelogs/AutoChangeLog-pr-5740.yml deleted file mode 100644 index f80440f4fbf9..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5740.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Huffie56" -delete-after: True -changes: - - refactor: "refactor marine_armor.dm and split it into multiples files." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5777.yml b/html/changelogs/AutoChangeLog-pr-5777.yml deleted file mode 100644 index fa3c5b3cbc0e..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5777.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - ui: "Added the relay ping browser accessed by the tgchat ping to test and use alternative connections to the server" - - ui: "Added onConfirmChange prop to Button.Confirm component." - - config: "Added CONNECTION_RELAY_PING and CONNECTION_RELAY_CON in the relays.txt config that is optionally included in config.txt" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5788.yml b/html/changelogs/AutoChangeLog-pr-5788.yml deleted file mode 100644 index c06069867b58..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5788.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SabreML" -delete-after: True -changes: - - bugfix: "Fixed 'hidden' action buttons being shown to observing players." - - qol: "Made any observers transfer over when a Xenomorph evolves/de-evolves." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5790.yml b/html/changelogs/AutoChangeLog-pr-5790.yml deleted file mode 100644 index b7fb64e23b50..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5790.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SpartanBobby" -delete-after: True -changes: - - maptweak: "Edits to southwest dorms LV522" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5791.yml b/html/changelogs/AutoChangeLog-pr-5791.yml deleted file mode 100644 index 1f951d5f06f1..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5791.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SpartanBobby" -delete-after: True -changes: - - maptweak: "Redetails bigred Libary" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5793.yml b/html/changelogs/AutoChangeLog-pr-5793.yml deleted file mode 100644 index bdc839aed92d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5793.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SpartanBobby" -delete-after: True -changes: - - maptweak: "Make a few unabreakable walls on kutjevo breakable, touches the east botony caves flanks ands removes some ledges from combat routes" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5794.yml b/html/changelogs/AutoChangeLog-pr-5794.yml deleted file mode 100644 index cff7e530f96b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5794.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SpartanBobby" -delete-after: True -changes: - - maptweak: "Edits to secure storage LV624s detailing" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5795.yml b/html/changelogs/AutoChangeLog-pr-5795.yml deleted file mode 100644 index 3e466e1cb3a3..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5795.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - rscadd: "Welding a barricade will now repeat automatically if it can still be repaired." - - balance: "Reverted multi-welding change to barricades: All barricades must be welded one at a time." - - refactor: "Refactored more barricade code." \ No newline at end of file diff --git a/html/changelogs/archive/2024-02.yml b/html/changelogs/archive/2024-02.yml index ba6a0a2ccd26..6b3b809713e2 100644 --- a/html/changelogs/archive/2024-02.yml +++ b/html/changelogs/archive/2024-02.yml @@ -365,3 +365,25 @@ the case of the special cigarette packs) - imageadd: Added sprites of the WeyYu Trading Cards, trading card packs, and special WeyYu Gold cigarette packs. +2024-02-25: + Drathek: + - ui: Added the relay ping browser accessed by the tgchat ping to test and use alternative + connections to the server + - ui: Added onConfirmChange prop to Button.Confirm component. + - config: Added CONNECTION_RELAY_PING and CONNECTION_RELAY_CON in the relays.txt + config that is optionally included in config.txt + - rscadd: Welding a barricade will now repeat automatically if it can still be repaired. + - balance: 'Reverted multi-welding change to barricades: All barricades must be + welded one at a time.' + - refactor: Refactored more barricade code. + Huffie56: + - refactor: refactor marine_armor.dm and split it into multiples files. + SabreML: + - bugfix: Fixed 'hidden' action buttons being shown to observing players. + - qol: Made any observers transfer over when a Xenomorph evolves/de-evolves. + SpartanBobby: + - maptweak: Edits to secure storage LV624s detailing + - maptweak: Make a few unabreakable walls on kutjevo breakable, touches the east + botony caves flanks ands removes some ledges from combat routes + - maptweak: Edits to southwest dorms LV522 + - maptweak: Redetails bigred Libary From df45b8ab932bd6c955912deac194dd5b28e2251a Mon Sep 17 00:00:00 2001 From: spartanbobby <71467726+spartanbobby@users.noreply.github.com> Date: Sun, 25 Feb 2024 14:08:42 +0000 Subject: [PATCH 49/50] Changes to south yard Sci-annex (#5792) # About the pull request South Yard kind of sucks alot to fight in this PR opens it up, removes alot of hullwalls and tries to make it slightly more enjoyable # Explain why it's good for the game Sci-annex is a bumbling mess of chokes this area is a mass of 1x1s 2x2s and longhalls this tries to rectify this slightly # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: SpartanBobby maptweak: Edits to southyard sci-annex /:cl: --- .../FOP_v3_Sciannex/Fiorina_SciAnnex.dmm | 487 ++++++++---------- 1 file changed, 201 insertions(+), 286 deletions(-) diff --git a/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm b/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm index d7d206c01c50..a344e32c6e56 100644 --- a/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm +++ b/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm @@ -883,14 +883,10 @@ }, /area/fiorina/station/flight_deck) "ayW" = ( -/obj/structure/bed{ - icon_state = "abed" - }, /obj/item/explosive/grenade/incendiary/molotov, /obj/effect/landmark/objective_landmark/close, /turf/open/floor/prison{ - dir = 10; - icon_state = "yellow" + icon_state = "floor_plate" }, /area/fiorina/station/lowsec) "ayX" = ( @@ -1973,13 +1969,9 @@ /turf/open/floor/prison, /area/fiorina/station/security) "bjt" = ( -/obj/structure/bed{ - icon_state = "abed" - }, -/obj/item/bedsheet/green, +/obj/structure/girder, /turf/open/floor/prison{ - dir = 6; - icon_state = "yellow" + icon_state = "yellowfull" }, /area/fiorina/station/lowsec) "bjR" = ( @@ -1999,14 +1991,9 @@ /turf/open/floor/prison, /area/fiorina/station/power_ring) "bki" = ( -/obj/structure/closet{ - density = 0; - pixel_y = 18 - }, -/obj/item/clothing/gloves/boxing/yellow, +/obj/structure/surface/table/reinforced/prison, /turf/open/floor/prison{ - dir = 5; - icon_state = "yellow" + icon_state = "floor_plate" }, /area/fiorina/station/lowsec) "bkQ" = ( @@ -4688,12 +4675,14 @@ }, /area/fiorina/station/transit_hub) "cQf" = ( -/obj/structure/machinery/power/apc{ - dir = 1 +/obj/structure/machinery/light/double/blue{ + dir = 1; + pixel_y = 21 }, +/obj/structure/surface/table/reinforced/prison, +/obj/item/explosive/grenade/incendiary/molotov, /turf/open/floor/prison{ - dir = 1; - icon_state = "yellow" + icon_state = "floor_plate" }, /area/fiorina/station/lowsec) "cQv" = ( @@ -5700,20 +5689,11 @@ }, /area/fiorina/lz/near_lzI) "dxl" = ( -/obj/structure/platform/kutjevo/smooth{ - dir = 1 - }, -/obj/structure/barricade/handrail{ - dir = 1; - icon_state = "hr_kutjevo"; - name = "solar lattice" - }, -/obj/structure/platform/kutjevo/smooth{ - dir = 4 +/obj/structure/barricade/metal/wired, +/turf/open/floor/prison{ + icon_state = "yellowfull" }, -/obj/structure/platform/kutjevo/smooth, -/turf/open/space, -/area/fiorina/oob) +/area/fiorina/station/lowsec) "dxv" = ( /turf/open/floor/prison{ dir = 10; @@ -7946,10 +7926,6 @@ }, /area/fiorina/station/telecomm/lz1_cargo) "eQb" = ( -/obj/structure/closet{ - density = 0; - pixel_y = 18 - }, /obj/item/clothing/gloves/boxing/green, /turf/open/floor/prison{ dir = 1; @@ -9155,20 +9131,12 @@ }, /area/fiorina/tumor/civres) "fCJ" = ( -/obj/structure/platform/kutjevo/smooth, -/obj/structure/platform/kutjevo/smooth{ - dir = 1 - }, -/obj/structure/barricade/handrail{ +/obj/structure/girder, +/turf/open/floor/prison{ dir = 1; - icon_state = "hr_kutjevo"; - name = "solar lattice" - }, -/obj/structure/platform/kutjevo/smooth{ - dir = 8 + icon_state = "yellow" }, -/turf/open/space, -/area/fiorina/oob) +/area/fiorina/station/lowsec) "fCW" = ( /obj/structure/surface/table/reinforced/prison, /obj/structure/machinery/computer/communications, @@ -9412,7 +9380,7 @@ "fLb" = ( /obj/effect/decal/cleanable/blood/gibs, /turf/open/floor/prison{ - dir = 9; + dir = 1; icon_state = "yellow" }, /area/fiorina/station/lowsec) @@ -9527,11 +9495,12 @@ }, /area/fiorina/station/power_ring) "fPl" = ( -/obj/structure/barricade/metal/wired{ - dir = 8 +/obj/structure/machinery/power/apc{ + dir = 1 }, /turf/open/floor/prison{ - icon_state = "yellowfull" + dir = 1; + icon_state = "yellow" }, /area/fiorina/station/lowsec) "fPB" = ( @@ -13081,17 +13050,11 @@ /turf/open/floor/plating/prison, /area/fiorina/station/transit_hub) "hTN" = ( -/obj/structure/platform_decoration/kutjevo, -/obj/structure/platform/kutjevo/smooth{ - dir = 1 - }, -/obj/structure/barricade/handrail{ - dir = 1; - icon_state = "hr_kutjevo"; - name = "solar lattice" +/obj/structure/girder, +/turf/open/floor/prison{ + icon_state = "yellow" }, -/turf/open/space, -/area/fiorina/oob) +/area/fiorina/station/lowsec) "hUi" = ( /obj/item/stack/sheet/metal, /turf/open/floor/plating/prison, @@ -14176,18 +14139,11 @@ }, /area/fiorina/oob) "iCf" = ( -/obj/structure/closet{ - density = 0; - pixel_y = 18 - }, -/obj/item/clothing/gloves/boxing, -/obj/structure/machinery/light/double/blue{ - dir = 1; - pixel_y = 21 - }, +/obj/structure/closet/wardrobe/orange, +/obj/item/clothing/gloves/boxing/blue, +/obj/item/clothing/gloves/boxing/blue, /turf/open/floor/prison{ - dir = 1; - icon_state = "yellow" + icon_state = "yellowfull" }, /area/fiorina/station/lowsec) "iCE" = ( @@ -17474,10 +17430,6 @@ }, /area/fiorina/tumor/servers) "kCT" = ( -/obj/structure/toilet{ - dir = 8; - pixel_y = 8 - }, /obj/effect/spawner/random/gun/smg, /turf/open/floor/prison{ dir = 5; @@ -23856,13 +23808,9 @@ }, /area/fiorina/station/chapel) "opj" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 12 - }, /obj/effect/decal/cleanable/blood/gibs, /turf/open/floor/prison{ - dir = 6; + dir = 4; icon_state = "yellow" }, /area/fiorina/station/lowsec) @@ -25963,13 +25911,8 @@ dir = 4 }, /obj/item/device/flashlight/lamp/tripod, -/obj/structure/machinery/light/double/blue{ - dir = 1; - pixel_y = 21 - }, /turf/open/floor/prison{ - dir = 1; - icon_state = "yellow" + icon_state = "floor_plate" }, /area/fiorina/station/lowsec) "pIs" = ( @@ -27957,10 +27900,10 @@ /turf/open/floor/prison, /area/fiorina/station/medbay) "qSz" = ( -/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/closet/wardrobe/orange, +/obj/item/clothing/gloves/boxing/yellow, /turf/open/floor/prison{ - dir = 1; - icon_state = "yellow" + icon_state = "yellowfull" }, /area/fiorina/station/lowsec) "qSA" = ( @@ -29120,9 +29063,12 @@ }, /area/fiorina/station/research_cells) "rLJ" = ( -/obj/structure/largecrate/random/case/double, -/turf/open/floor/plating/plating_catwalk/prison, -/area/fiorina/station/chapel) +/obj/item/clothing/gloves/boxing, +/turf/open/floor/prison{ + dir = 10; + icon_state = "yellow" + }, +/area/fiorina/station/lowsec) "rMo" = ( /obj/effect/landmark/objective_landmark/far, /obj/structure/closet/secure_closet/engineering_personal, @@ -29445,13 +29391,6 @@ icon_state = "darkbrown2" }, /area/fiorina/maintenance) -"rVL" = ( -/obj/structure/largecrate/supply, -/turf/open/floor/prison{ - dir = 1; - icon_state = "yellow" - }, -/area/fiorina/station/lowsec) "rVM" = ( /obj/structure/closet/crate/miningcar, /obj/structure/barricade/wooden{ @@ -33656,17 +33595,6 @@ icon_state = "darkredfull2" }, /area/fiorina/station/research_cells) -"utG" = ( -/obj/structure/closet{ - density = 0; - pixel_y = 18 - }, -/obj/item/clothing/gloves/boxing/blue, -/turf/open/floor/prison{ - dir = 1; - icon_state = "yellow" - }, -/area/fiorina/station/lowsec) "utL" = ( /obj/structure/bed/chair, /turf/open/floor/prison{ @@ -34739,12 +34667,6 @@ icon_state = "darkbrownfull2" }, /area/fiorina/tumor/aux_engi) -"vbG" = ( -/obj/structure/prop/structure_lattice{ - dir = 4 - }, -/turf/open/floor/plating/prison, -/area/fiorina/maintenance) "vbV" = ( /obj/structure/machinery/vending/coffee, /turf/open/floor/prison, @@ -36931,13 +36853,6 @@ icon_state = "whitegreenfull" }, /area/fiorina/tumor/ice_lab) -"wsX" = ( -/obj/item/trash/snack_bowl, -/turf/open/floor/prison{ - dir = 5; - icon_state = "yellow" - }, -/area/fiorina/station/lowsec) "wtm" = ( /obj/structure/monorail{ name = "launch track" @@ -66439,9 +66354,9 @@ iKs nTv dtS fQA -bFr -bFr -bFr +bis +bis +bis oLV nxq dBy @@ -66650,10 +66565,10 @@ iKs nTv dtS fQA -bFr -bFr -bQM -bFr +bis +bis +cME +bis bis gXd dBy @@ -66861,12 +66776,12 @@ tyj tyj dtS fQA -bFr -bFr -bQM -bQM -bFr -rLJ +bis +bis +cME +cME +wpD +iKs oeY dBy nxq @@ -67072,12 +66987,12 @@ rJF fmb dBy dBy +dBy +bis +cME +cME +cME bis -bFr -bQM -bQM -bQM -bFr bis gXd qIT @@ -67284,12 +67199,12 @@ bFr twb eLu tLC +tLC +eLu +cME +cME +cME eLu -twb -twb -twb -twb -twb tIn dwP dBy @@ -67721,7 +67636,7 @@ twb eBO eBO eBO -twb +eLu eLu eLu eLu @@ -67925,7 +67840,7 @@ tIU gZc tIU cME -liA +cME cME qIq eLu @@ -67933,7 +67848,7 @@ uvF rzp vds elO -uvF +cME wQT eLu cME @@ -68133,11 +68048,11 @@ twb twb twb cME -eLu -eLu -eLu +cME +cME +cME bgy -eLu +cME cME cME cME @@ -68349,7 +68264,7 @@ cME cME cME cME -liA +cME cME cME cME @@ -68561,7 +68476,7 @@ twb twb cME cME -eLu +cME cME rJh eLu @@ -68569,7 +68484,7 @@ eLu dHD xbM fHo -vbG +cME vZD cME cME @@ -68777,8 +68692,8 @@ eLu mrk cME jkg -uvF -rVL +cME +dHD xbM fHo xno @@ -68985,15 +68900,15 @@ bQM twb nSU cME -eLu +cME cME cME eLu -uvF +jkg dHD xbM fHo -uvF +cME wQT eLu cYP @@ -69197,7 +69112,7 @@ bQM twb uts cME -liA +cME cME cME cME @@ -69409,17 +69324,17 @@ iYw twb eLu eLu -eLu +cME srI dTf +cME eLu -twb dHD xbM fHo -wzE -sfu -jyF +ioc +bjt +bjt kqC sfu jyF @@ -69624,13 +69539,13 @@ tmo gfo cME wQT -eLu +cME kqC dHD xbM fHo -kqC -wsX +ioc +ioc bjt kqC qNF @@ -69829,21 +69744,21 @@ ssc aeI nQu suX -bLJ -twb -twb -tPN -tPN -tPN -twb +neY +liA +yfK +tmo +gfo +cME +cME eLu kqC -dHD +fCJ xbM fHo -kqC -ryJ -end +ioc +ioc +kgN kqC ryJ end @@ -70041,16 +69956,16 @@ aeI aeI aeI nQu -hCh -sKY -bQM -bQM -bQM -bQM -bQM +bLJ +iYw +wzE +hZR +hZR +hZR +wzE wzE kqC -dHD +fCJ bPn fHo ioc @@ -70688,7 +70603,7 @@ srp bqD cAJ xbM -fHo +hTN kqC rzp tKk @@ -70900,7 +70815,7 @@ mGr upY dHD xbM -fHo +hTN kqC qLi dpe @@ -71112,7 +71027,7 @@ mGr upY dHD xbM -fHo +voO kqC kqC kqC @@ -71325,9 +71240,9 @@ upY dHD xbM fHo -kqC -sfu -jyF +ioc +ioc +ioc kqC sfu iEG @@ -71537,9 +71452,9 @@ iox dHD xbM fHo -kqC -qNF -bjt +ioc +ioc +ioc kqC qNF mDO @@ -71748,10 +71663,10 @@ iYw izh dHD xbM -voO -kqC -ryJ -end +fHo +ioc +ioc +kgN kqC ryJ end @@ -71951,14 +71866,14 @@ aeI nQu hCh sKY -hTN -fyC -qOk -mKS -erT -wzE +cAW +cAW +cAW +cAW +cAW wzE -dHD +kqC +fPl xbM fHo ioc @@ -72163,14 +72078,14 @@ aeI nQu hCh sKY -dxl -afk -afk -afk -ghg +cAW +cAW +cAW wzE wzE -dHD +wzE +kqC +nBb xbM fHo ioc @@ -72375,19 +72290,19 @@ nQu bVE iYw iYw -urJ -afk -hkh -afk -tCZ -pcu +cAW +cAW +wzE wzE +cQf +xbM +dxl dHD xbM -voO -kqC -ryJ -end +fHo +ioc +ioc +kgN kqC ryJ end @@ -72586,20 +72501,20 @@ eMI nQu bVE iYw -jKI -mdJ -afk -afk -afk -xMW -jlH +cAW +cAW +cAW wzE +bki +xbM +xbM +dxl cPh xbM fHo -kqC -rzp -mwP +ioc +ioc +ioc kqC rzp ldz @@ -72800,18 +72715,18 @@ aPv iYw iYw iYw -fCJ -llQ -jKI -bUB -bQM +cAW wzE -nBb +xbM +xbM +xbM +ioc +dHD xbM fHo -kqC -qLi -dpe +ioc +ioc +ioc kqC qLi dpe @@ -73014,16 +72929,16 @@ vOZ iYw sKY wzE -wzE -wzE -wzE -wzE -cQf +xbM +xbM +xbM +ioc +dHD jpx fHo -kqC -kqC -kqC +ioc +ioc +ioc kqC kqC kqC @@ -73229,13 +73144,13 @@ oFI mCe xbM sJP -kqC +ioc dHD xbM fHo -kqC -sfu -jyF +ioc +ioc +ioc kqC sfu jyF @@ -73445,9 +73360,9 @@ ioc dHD xbM fHo -kqC -qNF -mDO +ioc +ioc +ioc kqC qNF eub @@ -73656,10 +73571,10 @@ xbM ioc nbP xbM -voO -kqC -cRB -end +fHo +ioc +ioc +kgN kqC ryJ end @@ -73864,7 +73779,7 @@ bce wzE kqC ioc -fPl +ioc kqC oFp xbM @@ -74300,7 +74215,7 @@ kqC ryJ end kqC -iCf +nBb xbM voO kqC @@ -75143,12 +75058,12 @@ xbM bkQ xbM qNF -qSz +dHD kqC rkp iKy kqC -utG +dHD xbM jbm xbM @@ -75360,7 +75275,7 @@ kqC qNF efW kqC -bki +qNF xRI iXq xRI @@ -75771,11 +75686,11 @@ ioc ioc ioc qNF -xRI -xRI -xRI nAK xbM +xbM +xbM +xbM jET xbM xbM @@ -75786,12 +75701,12 @@ elO hZR bQM hZR -jvi +iCf rzp vds vds vds -elO +rLJ jvi duF jTN @@ -75983,9 +75898,9 @@ kqC ecd kqC kqC -cRB -end -kqC +dHD +xbM +xbM pHx xbM eNa @@ -76197,8 +76112,8 @@ vRA kqC fLb ayW -kqC -dHD +xbM +xbM xbM rYK kqC @@ -76210,7 +76125,7 @@ end wzE bQM hZR -jvi +qSz dHD eNa rwK @@ -76409,8 +76324,8 @@ arl oFI kCT opj -kqC -dHD +xRI +nAK xbM fHo kqC From 6cd49d34e4e2db6bc4719755cbb85b659d3c8bf0 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 25 Feb 2024 14:17:52 +0000 Subject: [PATCH 50/50] Automatic changelog for PR #5792 [ci skip] --- html/changelogs/AutoChangeLog-pr-5792.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5792.yml diff --git a/html/changelogs/AutoChangeLog-pr-5792.yml b/html/changelogs/AutoChangeLog-pr-5792.yml new file mode 100644 index 000000000000..da482c895c07 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5792.yml @@ -0,0 +1,4 @@ +author: "SpartanBobby" +delete-after: True +changes: + - maptweak: "Edits to southyard sci-annex" \ No newline at end of file