diff --git a/.github/guides/AUTODOC.md b/.github/guides/AUTODOC.md
index dd2f30627b7d..90e5b2d1ac66 100644
--- a/.github/guides/AUTODOC.md
+++ b/.github/guides/AUTODOC.md
@@ -1,9 +1,9 @@
# dmdoc
-[DOCUMENTATION]: **PUT DOCUMENTATION LINK HERE**
+[DOCUMENTATION]: https://docs.cm-ss13.com/
[BYOND]: https://secure.byond.com/
-[DMDOC]: https://github.com/SpaceManiac/SpacemanDMM/tree/master/src/dmdoc
+[DMDOC]: https://github.com/SpaceManiac/SpacemanDMM/tree/master/crates/dmdoc
[DMDOC] is a documentation generator for DreamMaker, the scripting language
of the [BYOND] game engine. It produces simple static HTML files based on
@@ -13,9 +13,9 @@ We use **dmdoc** to generate [DOCUMENTATION] for our code, and that documentatio
is automatically generated and built on every new commit to the master branch
This gives new developers a clickable reference [DOCUMENTATION] they can browse to better help
-gain understanding of the /tg/station codebase structure and api reference.
+gain understanding of the CM-SS13 codebase structure and api reference.
-## Documenting code on /tg/station
+## Documenting code on CM-SS13
We use block comments to document procs and classes, and we use `///` line comments
when documenting individual variables.
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/__DEFINES/dropships.dm b/code/__DEFINES/dropships.dm
index f7df570a2864..d53e7c68d8db 100644
--- a/code/__DEFINES/dropships.dm
+++ b/code/__DEFINES/dropships.dm
@@ -10,3 +10,8 @@
#define DROPSHIP_MIN_AUTO_DELAY 10 SECONDS
#define DROPSHIP_AUTO_RETRY_COOLDOWN 20 SECONDS
#define DROPSHIP_MEDEVAC_COOLDOWN 20 SECONDS
+
+//Hatches states
+#define SHUTTLE_DOOR_BROKEN -1
+#define SHUTTLE_DOOR_UNLOCKED 0
+#define SHUTTLE_DOOR_LOCKED 1
diff --git a/code/__DEFINES/mob_hud.dm b/code/__DEFINES/mob_hud.dm
index 02f992694832..c451d01d3c90 100644
--- a/code/__DEFINES/mob_hud.dm
+++ b/code/__DEFINES/mob_hud.dm
@@ -35,7 +35,7 @@
#define MOB_HUD_XENO_INFECTION 6
#define MOB_HUD_XENO_STATUS 7
#define MOB_HUD_XENO_HOSTILE 8
-#define MOB_HUD_FACTION_USCM 9
+#define MOB_HUD_FACTION_MARINE 9
#define MOB_HUD_FACTION_OBSERVER 10
#define MOB_HUD_FACTION_UPP 11
#define MOB_HUD_FACTION_WY 12
diff --git a/code/__DEFINES/mode.dm b/code/__DEFINES/mode.dm
index 2b018c0a2810..ef3dfb03b337 100644
--- a/code/__DEFINES/mode.dm
+++ b/code/__DEFINES/mode.dm
@@ -279,6 +279,7 @@ DEFINE_BITFIELD(whitelist_status, list(
#define FACTION_LIST_MERCENARY list(FACTION_MERCENARY)
#define FACTION_LIST_MARSHAL list(FACTION_MARSHAL)
#define FACTION_LIST_DUTCH list(FACTION_DUTCH)
+#define FACTION_LIST_SURVIVOR_WY list(FACTION_SURVIVOR, FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_WY)
#define FACTION_LIST_MARINE_WY list(FACTION_MARINE, FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_WY)
#define FACTION_LIST_MARINE_UPP list(FACTION_MARINE, FACTION_UPP)
#define FACTION_LIST_MARINE_TWE list(FACTION_MARINE, FACTION_TWE)
diff --git a/code/__DEFINES/sentry_laptop_configurations.dm b/code/__DEFINES/sentry_laptop_configurations.dm
index 8626ba2cfaee..6f4e2bec14ca 100644
--- a/code/__DEFINES/sentry_laptop_configurations.dm
+++ b/code/__DEFINES/sentry_laptop_configurations.dm
@@ -1,4 +1,3 @@
-#define FACTION_USCM "USCM"
#define FACTION_WEYLAND "WY"
#define FACTION_HUMAN "HUMAN"
#define FACTION_COLONY "COLONY"
diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm
index dc49d2c6f02c..a4fb6d40be73 100644
--- a/code/__DEFINES/tgs.dm
+++ b/code/__DEFINES/tgs.dm
@@ -1,6 +1,6 @@
// tgstation-server DMAPI
-#define TGS_DMAPI_VERSION "7.1.0"
+#define TGS_DMAPI_VERSION "7.1.1"
// All functions and datums outside this document are subject to change with any version and should not be relied on.
@@ -496,7 +496,7 @@
/// Returns a list of connected [/datum/tgs_chat_channel]s if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping!
/world/proc/TgsChatChannelInfo()
return
-
+
/**
* Trigger an event in TGS. Requires TGS version >= 6.3.0. Returns [TRUE] if the event was triggered successfully, [FALSE] otherwise. This function may sleep!
*
diff --git a/code/__DEFINES/vendors.dm b/code/__DEFINES/vendors.dm
index 086b70a92428..dc78f7caa4d3 100644
--- a/code/__DEFINES/vendors.dm
+++ b/code/__DEFINES/vendors.dm
@@ -19,6 +19,8 @@
#define MARINE_CAN_BUY_COMBAT_ARMOR "combat_armor"
#define MARINE_CAN_BUY_KIT "kit"
#define MARINE_CAN_BUY_DRESS "dress"
+#define CIVILIAN_CAN_BUY_BACKPACK "civilian_backpack"
+#define CIVILIAN_CAN_BUY_UTILITY "civilian_utility"
#define MARINE_CAN_BUY_ALL list(MARINE_CAN_BUY_UNIFORM = 1, MARINE_CAN_BUY_SHOES = 1, MARINE_CAN_BUY_HELMET = 1, MARINE_CAN_BUY_ARMOR = 1, MARINE_CAN_BUY_GLOVES = 1, MARINE_CAN_BUY_EAR = 1, MARINE_CAN_BUY_BACKPACK = 1, MARINE_CAN_BUY_POUCH = 2, MARINE_CAN_BUY_BELT = 1, MARINE_CAN_BUY_GLASSES = 1, MARINE_CAN_BUY_MASK = 1, MARINE_CAN_BUY_ESSENTIALS = 1, MARINE_CAN_BUY_SECONDARY = 1, MARINE_CAN_BUY_ATTACHMENT = 1, MARINE_CAN_BUY_MRE = 1, MARINE_CAN_BUY_ACCESSORY = 1, MARINE_CAN_BUY_COMBAT_SHOES = 1, MARINE_CAN_BUY_COMBAT_HELMET = 1, MARINE_CAN_BUY_COMBAT_ARMOR = 1, MARINE_CAN_BUY_KIT = 1, MARINE_CAN_BUY_DRESS = 99)
diff --git a/code/_globalvars/lists/mapping_globals.dm b/code/_globalvars/lists/mapping_globals.dm
index 47cc22dae5e1..772561dbf4a6 100644
--- a/code/_globalvars/lists/mapping_globals.dm
+++ b/code/_globalvars/lists/mapping_globals.dm
@@ -53,6 +53,7 @@ GLOBAL_LIST_EMPTY(teleporter_landmarks)
GLOBAL_LIST_INIT(cardinals, list(NORTH, SOUTH, EAST, WEST))
GLOBAL_LIST_EMPTY(nightmare_landmarks)
+GLOBAL_LIST_EMPTY(nightmare_landmark_tags_removed)
GLOBAL_LIST_EMPTY(ship_areas)
diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm
index c47531f5fc45..d71bf1d747c9 100644
--- a/code/controllers/configuration/config_entry.dm
+++ b/code/controllers/configuration/config_entry.dm
@@ -4,6 +4,7 @@
#define KEY_MODE_TEXT 0
#define KEY_MODE_TYPE 1
+#define KEY_MODE_TEXT_UNALTERED 2
/datum/config_entry
var/name //read-only, this is determined by the last portion of the derived entry type
@@ -153,7 +154,9 @@
var/key_value = null
if(key_pos || value_mode == VALUE_MODE_FLAG)
- key_name = lowertext(copytext(str_val, 1, key_pos))
+ key_name = copytext(str_val, 1, key_pos)
+ if(key_mode != KEY_MODE_TEXT_UNALTERED)
+ key_name = lowertext(key_name)
if(key_pos)
key_value = copytext(str_val, key_pos + length(str_val[key_pos]))
var/new_key
@@ -161,7 +164,7 @@
var/continue_check_value
var/continue_check_key
switch(key_mode)
- if(KEY_MODE_TEXT)
+ if(KEY_MODE_TEXT, KEY_MODE_TEXT_UNALTERED)
new_key = key_name
continue_check_key = new_key
if(KEY_MODE_TYPE)
diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm
index 83929ecf8803..e2572e5e2d61 100644
--- a/code/controllers/configuration/entries/general.dm
+++ b/code/controllers/configuration/entries/general.dm
@@ -629,3 +629,14 @@ This maintains a list of ip addresses that are able to bypass topic filtering.
/datum/config_entry/flag/guest_ban
/datum/config_entry/flag/auto_profile
+
+/// Relay Ping Browser configuration
+/datum/config_entry/keyed_list/connection_relay_ping
+ splitter = "|"
+ key_mode = KEY_MODE_TEXT_UNALTERED
+ value_mode = VALUE_MODE_TEXT
+
+/datum/config_entry/keyed_list/connection_relay_con
+ splitter = "|"
+ key_mode = KEY_MODE_TEXT_UNALTERED
+ value_mode = VALUE_MODE_TEXT
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 2b9812abade4..f265315460e3 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -8,6 +8,10 @@ SUBSYSTEM_DEF(ticker)
var/current_state = GAME_STATE_STARTUP //State of current round used by process()
var/force_ending = FALSE //Round was ended by admin intervention
+
+ /// If TRUE, there is no lobby phase, the game starts immediately.
+ var/start_immediately = FALSE
+
var/bypass_checks = FALSE //Bypass mode init checks
var/setup_failed = FALSE //If the setup has failed at any point
var/setup_started = FALSE
@@ -80,6 +84,10 @@ SUBSYSTEM_DEF(ticker)
var/mob/new_player/player = i
if(player.ready) // TODO: port this == PLAYER_READY_TO_PLAY)
++totalPlayersReady
+
+ if(start_immediately)
+ time_left = 0
+
if(time_left < 0 || delay_start)
return
@@ -207,7 +215,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..2438577a1771 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
@@ -525,7 +525,7 @@ GLOBAL_LIST_INIT(possible_vote_types, list(
if(!(params["vote_type"] in GLOB.possible_vote_types))
return
- if(!check_rights(R_ADMIN))
+ if(!check_rights(R_MOD))
var/list/vote_type = GLOB.possible_vote_types[params["vote_type"]]
if(vote_type["admin_only"])
return
diff --git a/code/datums/ammo/ammo.dm b/code/datums/ammo/ammo.dm
index 7a4006deee73..229c10b31e3a 100644
--- a/code/datums/ammo/ammo.dm
+++ b/code/datums/ammo/ammo.dm
@@ -84,7 +84,7 @@
/// that will be given to a projectile with the current ammo datum
var/list/list/traits_to_give
- var/flamer_reagent_type = /datum/reagent/napalm/ut
+ var/flamer_reagent_id = "utnapthal"
/// The flicker that plays when a bullet hits a target. Usually red. Can be nulled so it doesn't show up at all.
var/hit_effect_color = "#FF0000"
@@ -237,11 +237,12 @@
P.fire_at(new_target, original_P.firer, original_P.shot_from, P.ammo.max_range, P.ammo.shell_speed, original_P.original) //Fire!
-/datum/ammo/proc/drop_flame(turf/T, datum/cause_data/cause_data) // ~Art updated fire 20JAN17
- if(!istype(T))
+/datum/ammo/proc/drop_flame(turf/turf, datum/cause_data/cause_data) // ~Art updated fire 20JAN17
+ if(!istype(turf))
return
- if(locate(/obj/flamer_fire) in T)
+ if(locate(/obj/flamer_fire) in turf)
return
- var/datum/reagent/R = new flamer_reagent_type()
- new /obj/flamer_fire(T, cause_data, R)
+ var/datum/reagent/chemical = GLOB.chemical_reagents_list[flamer_reagent_id]
+
+ new /obj/flamer_fire(turf, cause_data, chemical)
diff --git a/code/datums/ammo/misc.dm b/code/datums/ammo/misc.dm
index 62a78539b6a2..bcb9673548db 100644
--- a/code/datums/ammo/misc.dm
+++ b/code/datums/ammo/misc.dm
@@ -49,11 +49,11 @@
drop_flame(get_turf(P), P.weapon_cause_data)
/datum/ammo/flamethrower/tank_flamer
- flamer_reagent_type = /datum/reagent/napalm/blue
+ flamer_reagent_id = "napalmx"
/datum/ammo/flamethrower/sentry_flamer
flags_ammo_behavior = AMMO_IGNORE_ARMOR|AMMO_IGNORE_COVER|AMMO_FLAME
- flamer_reagent_type = /datum/reagent/napalm/blue
+ flamer_reagent_id = "napalmx"
accuracy = HIT_ACCURACY_TIER_8
accurate_range = 6
diff --git a/code/datums/diseases/black_goo.dm b/code/datums/diseases/black_goo.dm
index 7d94ef8ed8e2..a5f67c8445be 100644
--- a/code/datums/diseases/black_goo.dm
+++ b/code/datums/diseases/black_goo.dm
@@ -2,6 +2,7 @@
#define ZOMBIE_INFECTION_STAGE_ONE 1
#define ZOMBIE_INFECTION_STAGE_TWO 2
#define ZOMBIE_INFECTION_STAGE_THREE 3
+#define ZOMBIE_INFECTION_STAGE_FOUR 4
#define SLOW_INFECTION_RATE 1
#define FAST_INFECTION_RATE 7
#define STAGE_LEVEL_THRESHOLD 360
@@ -9,7 +10,7 @@
/datum/disease/black_goo
name = "Black Goo"
- max_stages = 3
+ max_stages = 4
cure = "Anti-Zed"
cure_id = "antiZed"
spread = "Bites"
@@ -120,17 +121,23 @@
stage_level += 42
if(ZOMBIE_INFECTION_STAGE_THREE)
- //check if the mob is already a zombie and just return to avoid weird stuff, edge case if zombie_is_transforming deoesn't work.
+ // if zombie or transforming we upgrade it to stage four.
if(iszombie(infected_mob))
+ stage++
return
-
- if(infected_mob.stat == DEAD && stage_counter != stage)
- to_chat(infected_mob, SPAN_CENTERBOLD("Your zombie infection is now at stage three! Zombie transformation begin!"))
- stage_counter = stage
- hidden = list(0,0)
+ // if not a zombie(above check) and isn't transforming then we transform you into a zombie.
if(!zombie_is_transforming)
+ // if your dead we inform you that you're going to turn into a zombie.
+ if(infected_mob.stat == DEAD && stage_counter != stage)
+ to_chat(infected_mob, SPAN_CENTERBOLD("Your zombie infection is now at stage three! Zombie transformation begin!"))
+ stage_counter = stage
zombie_transform(infected_mob)
- infected_mob.next_move_slowdown = max(infected_mob.next_move_slowdown, 2)
+ hidden = list(0,0)
+ infected_mob.next_move_slowdown = max(infected_mob.next_move_slowdown, 2)
+
+ if(ZOMBIE_INFECTION_STAGE_FOUR)
+ return
+ // final stage of infection it's to avoid running the above test once you're a zombie for now. maybe more later.
/datum/disease/black_goo/proc/zombie_transform(mob/living/carbon/human/human)
set waitfor = 0
@@ -149,7 +156,7 @@
playsound(human.loc, 'sound/hallucinations/wail.ogg', 25, 1)
human.jitteriness = 0
human.set_species(SPECIES_ZOMBIE)
- stage = 3
+ stage = 4
human.faction = FACTION_ZOMBIE
zombie_is_transforming = FALSE
@@ -309,6 +316,7 @@
#undef ZOMBIE_INFECTION_STAGE_ONE
#undef ZOMBIE_INFECTION_STAGE_TWO
#undef ZOMBIE_INFECTION_STAGE_THREE
+#undef ZOMBIE_INFECTION_STAGE_FOUR
#undef STAGE_LEVEL_THRESHOLD
#undef SLOW_INFECTION_RATE
#undef FAST_INFECTION_RATE
diff --git a/code/datums/mob_hud.dm b/code/datums/mob_hud.dm
index 778ec2b75a36..b7b5544777b3 100644
--- a/code/datums/mob_hud.dm
+++ b/code/datums/mob_hud.dm
@@ -10,7 +10,7 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list(
MOB_HUD_XENO_INFECTION = new /datum/mob_hud/xeno_infection(),
MOB_HUD_XENO_STATUS = new /datum/mob_hud/xeno(),
MOB_HUD_XENO_HOSTILE = new /datum/mob_hud/xeno_hostile(),
- MOB_HUD_FACTION_USCM = new /datum/mob_hud/faction(),
+ MOB_HUD_FACTION_MARINE = new /datum/mob_hud/faction(),
MOB_HUD_FACTION_OBSERVER = new /datum/mob_hud/faction/observer(),
MOB_HUD_FACTION_UPP = new /datum/mob_hud/faction/upp(),
MOB_HUD_FACTION_WY = new /datum/mob_hud/faction/wy(),
diff --git a/code/datums/supply_packs/ammo.dm b/code/datums/supply_packs/ammo.dm
index 326ca075a343..0929f24f7c95 100644
--- a/code/datums/supply_packs/ammo.dm
+++ b/code/datums/supply_packs/ammo.dm
@@ -346,15 +346,15 @@
//------------------------Sentries Ammo----------------
-/datum/supply_packs/ammo_sentry
- name = "UA 571-C sentry ammunition (x2)"
+/datum/supply_packs/ammo_sentry_shotgun
+ name = "UA 12-G sentry shotgun ammunition (x2)"
contains = list(
- /obj/item/ammo_magazine/sentry,
- /obj/item/ammo_magazine/sentry,
+ /obj/item/ammo_magazine/sentry/shotgun,
+ /obj/item/ammo_magazine/sentry/shotgun,
)
cost = 40
containertype = /obj/structure/closet/crate/ammo
- containername = "\improper sentry ammo crate"
+ containername = "\improper sentry shotgun ammo crate"
group = "Ammo"
/datum/supply_packs/ammo_sentry_flamer
@@ -368,15 +368,37 @@
containername = "\improper sentry flamer ammo crate"
group = "Ammo"
-/datum/supply_packs/ammo_sentry_shotgun
- name = "UA 12-G sentry shotgun ammunition (x2)"
+/datum/supply_packs/ammo_mini_sentry_flamer
+ name = "UA 45-F mini sentry flamer ammunition (x2)"
contains = list(
- /obj/item/ammo_magazine/sentry/shotgun,
- /obj/item/ammo_magazine/sentry/shotgun,
+ /obj/item/ammo_magazine/sentry_flamer/mini,
+ /obj/item/ammo_magazine/sentry_flamer/mini,
)
cost = 40
containertype = /obj/structure/closet/crate/ammo
- containername = "\improper sentry shotgun ammo crate"
+ containername = "\improper mini sentry flamer ammo crate"
+ group = "Ammo"
+
+/datum/supply_packs/ammo_glob_sentry_flamer
+ name = "UA 60-FP sentry plasma incinerator tank (x2)"
+ contains = list(
+ /obj/item/ammo_magazine/sentry_flamer/glob,
+ /obj/item/ammo_magazine/sentry_flamer/glob,
+ )
+ cost = 40
+ containertype = /obj/structure/closet/crate/ammo
+ containername = "\improper sentry plasma incinerator ammo crate"
+ group = "Ammo"
+
+/datum/supply_packs/ammo_sentry
+ name = "UA 571-C sentry ammunition (x2)"
+ contains = list(
+ /obj/item/ammo_magazine/sentry,
+ /obj/item/ammo_magazine/sentry,
+ )
+ cost = 40
+ containertype = /obj/structure/closet/crate/ammo
+ containername = "\improper sentry ammo crate"
group = "Ammo"
//------------------------M240 flamer tanks----------------
@@ -419,6 +441,28 @@
containertype = /obj/structure/closet/crate/ammo/alt/flame
group = "Ammo"
+//------------------------Mounted guns ammo----------------
+/datum/supply_packs/ammo_m2c
+ name = "M2C ammunition crate (x2)"
+ contains = list(
+ /obj/item/ammo_magazine/m2c,
+ /obj/item/ammo_magazine/m2c,
+ )
+ cost = 25
+ containertype = /obj/structure/closet/crate/ammo
+ containername = "\improper m2c ammunition crate"
+ group = "Ammo"
+
+/datum/supply_packs/ammo_m56d
+ name = "M56D drum magazine crate (x1)"
+ contains = list(
+ /obj/item/ammo_magazine/m56d,
+ )
+ cost = 25
+ containertype = /obj/structure/closet/crate/ammo
+ containername = "\improper m56d drum magazine crate"
+ group = "Ammo"
+
//This crate has a little bit of everything, mostly okay stuff, but it does have some really unique picks.
/datum/supply_packs/ammo_surplus
name = "Surplus ammo crate (various USCM magazines x10)"
diff --git a/code/game/area/almayer.dm b/code/game/area/almayer.dm
index 14bc1891ea1f..c3898283cbbb 100644
--- a/code/game/area/almayer.dm
+++ b/code/game/area/almayer.dm
@@ -241,8 +241,11 @@
/area/almayer/shipboard/brig/armory
name = "\improper Brig Armory"
-/area/almayer/shipboard/brig/main_office
- name = "\improper Brig Main Office"
+/area/almayer/shipboard/brig/mp_bunks
+ name = "\improper Brig MP Bunks"
+
+/area/almayer/shipboard/brig/starboard_hallway
+ name = "\improper Brig Starboard Hallway"
/area/almayer/shipboard/brig/perma
name = "\improper Brig Perma Cells"
@@ -250,8 +253,11 @@
/area/almayer/shipboard/brig/cryo
name = "\improper Brig Cryo Pods"
-/area/almayer/shipboard/brig/surgery
- name = "\improper Brig Surgery"
+/area/almayer/shipboard/brig/medical
+ name = "\improper Brig Medical"
+
+/area/almayer/shipboard/brig/interrogation
+ name = "\improper Brig Interrogation Room"
/area/almayer/shipboard/brig/general_equipment
name = "\improper Brig General Equipment"
@@ -262,11 +268,15 @@
/area/almayer/shipboard/brig/execution
name = "\improper Brig Execution Room"
+/area/almayer/shipboard/brig/execution_storage
+ name = "\improper Brig Execution Storage"
+
/area/almayer/shipboard/brig/cic_hallway
name = "\improper Brig CiC Hallway"
/area/almayer/shipboard/brig/dress
name = "\improper CIC Dress Uniform Room"
+
/area/almayer/shipboard/brig/processing
name = "\improper Brig Processing and Holding"
@@ -278,6 +288,10 @@
name = "\improper Brig Chief MP Office"
icon_state = "chiefmpoffice"
+/area/almayer/shipboard/brig/warden_office
+ name = "\improper Brig Warden Office"
+ icon_state = "chiefmpoffice"
+
/area/almayer/shipboard/sea_office
name = "\improper Lower Deck Senior Enlisted Advisor Office"
icon_state = "chiefmpoffice"
diff --git a/code/game/gamemodes/cm_initialize.dm b/code/game/gamemodes/cm_initialize.dm
index f8c8be5c10ad..30e179949be5 100644
--- a/code/game/gamemodes/cm_initialize.dm
+++ b/code/game/gamemodes/cm_initialize.dm
@@ -934,7 +934,7 @@ Additional game mode variables.
var/marine_pop_size = 0
var/uscm_personnel_count = 0
for(var/mob/living/carbon/human/human as anything in GLOB.alive_human_list)
- if(human.faction == FACTION_USCM)
+ if(human.faction == FACTION_MARINE)
uscm_personnel_count++
var/datum/job/job = GET_MAPPED_ROLE(human.job)
marine_pop_size += GLOB.RoleAuthority.calculate_role_weight(job)
diff --git a/code/game/jobs/job/civilians/other/survivors.dm b/code/game/jobs/job/civilians/other/survivors.dm
index a85731aa781a..71dd5f1b96e8 100644
--- a/code/game/jobs/job/civilians/other/survivors.dm
+++ b/code/game/jobs/job/civilians/other/survivors.dm
@@ -85,6 +85,8 @@
if(hostile)
to_chat(survivor, SPAN_HIGHDANGER("You are HOSTILE to the USCM!"))
+ else if(survivor.faction == FACTION_CLF)
+ to_chat(survivor, SPAN_HIGHDANGER("You are HOSTILE to the USCM, but NOT to other survivors!"))
else
to_chat(survivor, SPAN_XENOHIGHDANGER("You are NON-HOSTILE to the USCM!"))
diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm
index f943cd696897..9e734a0152e7 100644
--- a/code/game/machinery/doors/multi_tile.dm
+++ b/code/game/machinery/doors/multi_tile.dm
@@ -241,10 +241,43 @@
no_panel = 1
not_weldable = 1
var/queen_pryable = TRUE
+ var/obj/docking_port/mobile/marine_dropship/linked_dropship
+
/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ex_act(severity)
return
+/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/attackby(obj/item/item, mob/user)
+ if(HAS_TRAIT(item, TRAIT_TOOL_MULTITOOL))
+ var/direction
+ switch(id)
+ if("starboard_door")
+ direction = "starboard"
+ if("port_door")
+ direction = "port"
+ if("aft_door")
+ direction = "aft"
+ if(!linked_dropship || !linked_dropship.door_control.door_controllers[direction])
+ return ..()
+ var/datum/door_controller/single/control = linked_dropship.door_control.door_controllers[direction]
+ if (control.status != SHUTTLE_DOOR_BROKEN)
+ return ..()
+ if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI))
+ to_chat(user, SPAN_WARNING("You don't seem to understand how to restore a remote connection to [src]."))
+ return
+ if(user.action_busy)
+ return
+
+ to_chat(user, SPAN_WARNING("You begin to restore the remote connection to [src]."))
+ if(!do_after(user, 5 SECONDS, INTERRUPT_ALL, BUSY_ICON_BUILD))
+ to_chat(user, SPAN_WARNING("You fail to restore a remote connection to [src]."))
+ return
+ unlock(TRUE)
+ close(FALSE)
+ control.status = SHUTTLE_DOOR_UNLOCKED
+ to_chat(user, SPAN_WARNING("You successfully restored the remote connection to [src]."))
+ return
+ ..()
/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/unlock()
if(is_reserved_level(z))
@@ -261,11 +294,26 @@
if(!locked)
return ..()
+ if(xeno.action_busy)
+ return
+
to_chat(xeno, SPAN_NOTICE("You try and force the doors open"))
if(do_after(xeno, 3 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE))
unlock(TRUE)
open(1)
lock(TRUE)
+ var/direction
+ switch(id)
+ if("starboard_door")
+ direction = "starboard"
+ if("port_door")
+ direction = "port"
+ if("aft_door")
+ direction = "aft"
+ if(linked_dropship && linked_dropship.door_control.door_controllers[direction])
+ var/datum/door_controller/single/control = linked_dropship.door_control.door_controllers[direction]
+ control.status = SHUTTLE_DOOR_BROKEN
+
/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ds1
name = "\improper Alamo cargo door"
@@ -569,4 +617,3 @@
icon = 'icons/obj/structures/doors/2x1almayerdoor_glass.dmi'
opacity = FALSE
glass = TRUE
-
diff --git a/code/game/machinery/fax_machine.dm b/code/game/machinery/fax_machine.dm
index 53b8736f75f3..b3c981a0cf71 100644
--- a/code/game/machinery/fax_machine.dm
+++ b/code/game/machinery/fax_machine.dm
@@ -87,7 +87,7 @@ GLOBAL_LIST_EMPTY(alldepartments)
else
to_chat(user, SPAN_NOTICE("\The [src] jammed! It can only accept up to five papers at once."))
playsound(src, "sound/machines/terminal_insert_disc.ogg", 50, TRUE)
- flick("faxsend", src)
+ flick("[initial(icon_state)]send", src)
updateUsrDialog()
return
@@ -245,7 +245,7 @@ GLOBAL_LIST_EMPTY(alldepartments)
else
to_chat(ui.user, SPAN_NOTICE("\The [src] jammed! It can only accept up to five papers at once."))
playsound(src, "sound/machines/terminal_insert_disc.ogg", 50, TRUE)
- flick("faxsend", src)
+ flick("[initial(icon_state)]send", src)
. = TRUE
if("ejectid")
@@ -408,10 +408,10 @@ GLOBAL_LIST_EMPTY(alldepartments)
return
if(! (F.inoperable() ) )
- flick("faxreceive", F)
+ flick("[initial(icon_state)]receive", F)
// give the sprite some time to flick
- spawn(20)
+ spawn(30)
var/obj/item/paper/P = new(F.loc,faxcontents.photo_list)
P.name = "faxed message"
P.info = "[faxcontents.data]"
@@ -515,6 +515,85 @@ GLOBAL_LIST_EMPTY(alldepartments)
target_department = "Brig"
network = "USCM High Command Quantum Relay"
+
+///The deployed fax machine backpack
+/obj/structure/machinery/faxmachine/backpack
+ name = "\improper Portable Press Fax Machine"
+ desc = "A standard issue portable fax machine for civilian reporters. Functions off of an internal battery. Cannot receive faxes while being worn. It is currently deployed. Click-drag the device towards you to pick it up."
+ icon_state = "fax_backpack"
+ needs_power = FALSE
+ use_power = USE_POWER_NONE
+ health = 150
+
+///The wearable and deployable part of the fax machine backpack
+/obj/item/device/fax_backpack
+ name = "\improper Portable Press Fax Machine"
+ desc = "A standard issue portable fax machine for civilian reporters. Functions off of an internal battery. Cannot receive faxes while being worn. It is currently undeployed. Activate the device inhand to deploy it."
+ icon = 'icons/obj/structures/machinery/library.dmi'
+ icon_state = "fax_backpack"
+ item_state = "fax_backpack"
+ w_class = SIZE_HUGE
+ flags_equip_slot = SLOT_BACK
+ flags_item = ITEM_OVERRIDE_NORTHFACE
+
+/obj/item/device/fax_backpack/attack_self(mob/user) //activate item version fax inhand to deploy
+ if(!ishuman(user))
+ return
+ var/turf/deployturf = get_turf(user)
+ if(istype(deployturf, /turf/open))
+ var/turf/open/floor = deployturf
+ if(!floor.allow_construction)
+ to_chat(user, SPAN_WARNING("You cannot deploy [src] here, find a more secure surface!"))
+ return FALSE
+ var/fail = FALSE
+ if(deployturf.density)
+ fail = TRUE
+ else
+ var/static/list/blocking_types = typecacheof(list(
+ /obj/structure/machinery/defenses,
+ /obj/structure/window,
+ /obj/structure/windoor_assembly,
+ /obj/structure/machinery/door,
+ ))
+ for(var/obj/blockingobj in deployturf.contents)
+ if(blockingobj.density && !(blockingobj.flags_atom & ON_BORDER))
+ fail = TRUE
+ break
+ if(is_type_in_typecache(blockingobj, blocking_types))
+ fail = TRUE
+ break
+ if(fail)
+ to_chat(user, SPAN_WARNING("You can't deploy [src] here, something is in the way."))
+ return
+ to_chat(user, SPAN_NOTICE("You begin to deploy [src]..."))
+ if(do_after(user, 4.5 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD))
+ to_chat(user, SPAN_NOTICE("You deploy [src]."))
+ var/obj/structure/machinery/faxmachine/backpack/deployedfax = new(deployturf)
+ transfer_label_component(deployedfax)
+ playsound(src.loc, 'sound/machines/print.ogg', 40, 1)
+ qdel(src)
+ return
+ return ..()
+
+/obj/structure/machinery/faxmachine/backpack/MouseDrop(over_object, src_location, over_location) //Drag the deployed fax onto you to pick it up.
+ if(!ishuman(usr))
+ return
+ var/mob/living/carbon/human/user = usr
+ if(over_object == user && in_range(src, user))
+ if(original_fax || scan)
+ to_chat(user, SPAN_NOTICE("There is still something in [src]. Remove it before you pick it up."))
+ return
+ to_chat(user, SPAN_NOTICE("You begin to pick up [src]..."))
+ if(do_after(user, 4.5 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD))
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 25, 1)
+ to_chat(user, SPAN_NOTICE("You pick up [src]."))
+ var/obj/item/device/fax_backpack/faxbag = new(loc)
+ transfer_label_component(faxbag)
+ user.put_in_hands(faxbag)
+ qdel(src)
+ return
+ return ..()
+
/datum/fax
var/data
var/list/photo_list
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index e87bb56da489..d86a5c0e30d0 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -8,14 +8,23 @@
use_power = USE_POWER_IDLE
idle_power_usage = 50
active_power_usage = 50
+ can_buckle = TRUE
+ /// the borg inside
var/mob/living/occupant = null
- var/max_internal_charge = 15000 // Two charged borgs in a row with default cell
- var/current_internal_charge = 15000 // Starts charged, to prevent power surges on round start
- var/charging_cap_active = 25000 // Active Cap - When cyborg is inside
- var/charging_cap_passive = 2500 // Passive Cap - Recharging internal capacitor when no cyborg is inside
- var/icon_update_tick = 0 // Used to update icon only once every 10 ticks
+ /// Two charged borgs in a row with default cell
+ var/max_internal_charge = 15000
+ /// Starts charged, to prevent power surges on round start
+ var/current_internal_charge = 15000
+ /// Active Cap - When cyborg is inside
+ var/charging_cap_active = 25000
+ /// Passive Cap - Recharging internal capacitor when no cyborg is inside
+ var/charging_cap_passive = 2500
+ /// Used to update icon only once every 10 ticks
+ var/icon_update_tick = 0
+ /// implants to not remove
var/known_implants = list(/obj/item/implant/chem, /obj/item/implant/death_alarm, /obj/item/implant/loyalty, /obj/item/implant/tracking, /obj/item/implant/neurostim)
- can_buckle = TRUE
+ ///stun time upon exiting, if at all
+ var/exit_stun = 2
/obj/structure/machinery/recharge_station/Initialize(mapload, ...)
@@ -183,18 +192,23 @@
/obj/structure/machinery/recharge_station/proc/go_out()
- if(!( src.occupant ))
+ if(!occupant)
return
- //for(var/obj/O in src)
- // O.forceMove(src.loc)
- if (src.occupant.client)
- src.occupant.client.eye = src.occupant.client.mob
- src.occupant.client.perspective = MOB_PERSPECTIVE
- src.occupant.forceMove(loc)
- src.occupant = null
+ var/mob/living/synth = occupant
+
+ if(synth.client)
+ synth.client.eye = synth.client.mob
+ synth.client.perspective = MOB_PERSPECTIVE
+
+ synth.forceMove(loc)
+ if(exit_stun)
+ synth.Stun(exit_stun) //Action delay when going out of a closet
+ if(synth.mobility_flags & MOBILITY_MOVE)
+ synth.visible_message(SPAN_WARNING("[synth] suddenly gets out of [src]!"), SPAN_WARNING("You get out of [src] and get your bearings!"))
+
+ occupant = null
update_icon()
update_use_power(USE_POWER_IDLE)
- return
/obj/structure/machinery/recharge_station/verb/move_eject()
set category = "Object"
diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm
index c97a28932262..7a9f5babbd7a 100644
--- a/code/game/machinery/telecomms/presets.dm
+++ b/code/game/machinery/telecomms/presets.dm
@@ -267,7 +267,7 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers)
to_chat(user, SPAN_WARNING("\The [src.name] needs repairs to have frequencies added to its software!"))
return
var/choice = tgui_input_list(user, "What do you wish to do?", "TC-3T comms tower", list("Wipe communication frequencies", "Add your faction's frequencies"))
- if(choice == "Wipe frequencies")
+ if(choice == "Wipe communication frequencies")
freq_listening = null
to_chat(user, SPAN_NOTICE("You wipe the preexisting frequencies from \the [src]."))
return
@@ -277,12 +277,16 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers)
switch(user.faction)
if(FACTION_SURVIVOR)
freq_listening |= COLONY_FREQ
+ if(FACTION_MARINE in user.faction_group) //FORECON survivors
+ freq_listening |= SOF_FREQ
if(FACTION_CLF)
freq_listening |= CLF_FREQS
if(FACTION_UPP)
freq_listening |= UPP_FREQS
if(FACTION_WY,FACTION_PMC)
freq_listening |= PMC_FREQS
+ if(FACTION_TWE)
+ freq_listening |= RMC_FREQ
if(FACTION_YAUTJA)
to_chat(user, SPAN_WARNING("You decide to leave the human machine alone."))
return
diff --git a/code/game/machinery/vending/vendor_types/crew/combat_correspondent.dm b/code/game/machinery/vending/vendor_types/crew/combat_correspondent.dm
new file mode 100644
index 000000000000..b0894ca2a5a2
--- /dev/null
+++ b/code/game/machinery/vending/vendor_types/crew/combat_correspondent.dm
@@ -0,0 +1,51 @@
+//------------ CC CLOTHING VENDOR---------------
+
+GLOBAL_LIST_INIT(cm_vending_clothing_combat_correspondent, list(
+ list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null),
+ list("Essential Reporter's Set", 0, /obj/effect/essentials_set/cc, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY),
+ list("Portable Press Fax Machine", 0, /obj/item/device/fax_backpack, CIVILIAN_CAN_BUY_BACKPACK, VENDOR_ITEM_RECOMMENDED),
+ list("Press Broadcasting Camera", 0, /obj/item/device/camera/broadcasting, CIVILIAN_CAN_BUY_UTILITY, VENDOR_ITEM_RECOMMENDED),
+ list("Leather Satchel", 0, /obj/item/storage/backpack/satchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR),
+
+ list("UNIFORM (CHOOSE 1)", 0, null, null, null),
+ list("Black Uniform", 0, /obj/item/clothing/under/marine/reporter/black, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Orange Uniform", 0, /obj/item/clothing/under/marine/reporter/orange, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Red Uniform", 0, /obj/item/clothing/under/marine/reporter/red, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+
+ list("ARMOR (CHOOSE 1)", 0, null, null, null),
+ list("Combat Correspondent's Armor", 0, /obj/item/clothing/suit/storage/marine/light/reporter, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_RECOMMENDED),
+ list("Blue Vest", 0, /obj/item/clothing/suit/storage/jacket/marine/reporter/blue, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Black Vest", 0, /obj/item/clothing/suit/storage/hazardvest/black, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Black Coat", 0, /obj/item/clothing/suit/storage/jacket/marine/reporter/black, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Green Coat", 0, /obj/item/clothing/suit/storage/jacket/marine/reporter/green, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+
+ list("HELMET (CHOOSE 1)", 0, null, null, null),
+ list("Combat Correspondent's Helmet", 0, /obj/item/clothing/head/helmet/marine/reporter, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED),
+ list("Combat Correspondent's Cap", 0, /obj/item/clothing/head/cmcap/reporter, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+ list("Fedora", 0, /obj/item/clothing/head/fedora, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+
+ list("REFILLS", 0, null, null, null),
+ list("Camera", 10, /obj/item/device/camera, null, VENDOR_ITEM_REGULAR),
+ list("Camera Film", 5, /obj/item/device/camera_film, null, VENDOR_ITEM_REGULAR),
+ list("Toner", 5, /obj/item/device/toner, null, VENDOR_ITEM_REGULAR),
+ list("Regulation Tapes", 15, /obj/item/storage/box/tapes, null, VENDOR_ITEM_REGULAR),
+ list("Paper Bin", 10, /obj/item/paper_bin/uscm, null, VENDOR_ITEM_REGULAR),
+ ))
+
+/obj/structure/machinery/cm_vending/clothing/combat_correspondent
+ name = "\improper ColMarTech Combat Correspondent Equipment Rack"
+ desc = "An automated rack hooked up to a colossal storage of Reporter standard-issue equipment."
+ req_access = list(ACCESS_PRESS)
+ vendor_role = list(JOB_COMBAT_REPORTER)
+
+/obj/structure/machinery/cm_vending/clothing/combat_correspondent/get_listed_products(mob/user)
+ return GLOB.cm_vending_clothing_combat_correspondent
+
+/obj/effect/essentials_set/cc
+ spawned_gear_list = list(
+ /obj/item/device/flashlight,
+ /obj/item/tool/pen,
+ /obj/item/device/binoculars,
+ /obj/item/notepad,
+ /obj/item/device/taperecorder,
+ )
diff --git a/code/game/machinery/vending/vendor_types/crew/engineering.dm b/code/game/machinery/vending/vendor_types/crew/engineering.dm
new file mode 100644
index 000000000000..9d5a809e52f7
--- /dev/null
+++ b/code/game/machinery/vending/vendor_types/crew/engineering.dm
@@ -0,0 +1,74 @@
+//------------ MT CLOTHING VENDOR---------------
+
+GLOBAL_LIST_INIT(cm_vending_clothing_maintenance_technician, list(
+ list("MAINTENANCE SET (MANDATORY)", 0, null, null, null),
+ list("Essential Maintenance Set", 0, /obj/effect/essentials_set/maintenance, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY),
+
+ list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null),
+ list("Insulated Gloves", 0, /obj/item/clothing/gloves/yellow, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY),
+ list("Headset", 0, /obj/item/device/radio/headset/almayer/mt, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY),
+ list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY),
+ list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY),
+
+ list("HELMET (CHOOSE 1)", 0, null, null, null),
+ list("Beret, Engineering", 0, /obj/item/clothing/head/beret/eng, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+ list("White Hardhat", 0, /obj/item/clothing/head/hardhat/white, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+ list("Orange Hardhat", 0, /obj/item/clothing/head/hardhat/orange, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+ list("Blue Hardhat", 0, /obj/item/clothing/head/hardhat/dblue, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+ list("Welding Helmet", 0, /obj/item/clothing/head/welding, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+
+ list("SUIT (CHOOSE 1)", 0, null, null, null),
+ list("Black Hazard Vest", 0, /obj/item/clothing/suit/storage/hazardvest/black, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Blue Hazard Vest", 0, /obj/item/clothing/suit/storage/hazardvest/blue, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Orange Hazard Vest", 0, /obj/item/clothing/suit/storage/hazardvest, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Yellow Hazard Vest", 0, /obj/item/clothing/suit/storage/hazardvest/yellow, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+
+ list("BACKPACK (CHOOSE 1)", 0, null, null, null),
+ list("Technician Backpack", 0, /obj/item/storage/backpack/marine/tech, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR),
+ list("Technician Satchel", 0, /obj/item/storage/backpack/marine/satchel/tech, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR),
+ list("Technician Welderpack", 0, /obj/item/storage/backpack/marine/engineerpack, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR),
+ list("Technician Welder-Satchel", 0, /obj/item/storage/backpack/marine/engineerpack/satchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_RECOMMENDED),
+ list("Technician Welder Chestrig", 0, /obj/item/storage/backpack/marine/engineerpack/welder_chestrig, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR),
+
+ list("BELT (CHOOSE 1)", 0, null, null, null),
+ list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR),
+ list("M276 Toolbelt Rig (Full)", 0, /obj/item/storage/belt/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_MANDATORY),
+
+ list("POUCHES (CHOOSE 2)", 0, null, null, null),
+ list("Medium General Pouch", 0, /obj/item/storage/pouch/general/medium, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("First-Aid Pouch (Splints, Gauze, Ointment)", 0, /obj/item/storage/pouch/firstaid/full/alternate, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("First-Aid Pouch (Pill Packets)", 0, /obj/item/storage/pouch/firstaid/full/pills, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Construction Pouch", 0, /obj/item/storage/pouch/construction, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Electronics Pouch (Full)", 0, /obj/item/storage/pouch/electronics/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Tools Pouch (Full)", 0, /obj/item/storage/pouch/tools/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+
+ list("MASK (CHOOSE 1)", 0, null, null, null),
+ list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
+ list("Heat Absorbent Coif", 0, /obj/item/clothing/mask/rebreather/scarf, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
+ list("Rebreather", 0, /obj/item/clothing/mask/rebreather, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
+
+ list("ACCESSORIES (CHOOSE 1)", 0, null, null, null),
+ list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED),
+ list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
+ list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
+ ))
+
+/obj/structure/machinery/cm_vending/clothing/maintenance_technician
+ name = "\improper ColMarTech Maintenance Technician Equipment Rack"
+ desc = "An automated rack hooked up to a colossal storage of Maintenance Technician standard-issue equipment."
+ req_access = list(ACCESS_MARINE_ENGINEERING)
+ vendor_role = list(JOB_MAINT_TECH)
+
+/obj/structure/machinery/cm_vending/clothing/maintenance_technician/get_listed_products(mob/user)
+ return GLOB.cm_vending_clothing_maintenance_technician
+
+/obj/effect/essentials_set/maintenance
+ spawned_gear_list = list(
+ /obj/item/device/lightreplacer,
+ /obj/item/device/demo_scanner,
+ /obj/item/storage/bag/trash,
+ /obj/item/storage/toolbox/mechanical,
+ /obj/item/device/flashlight,
+ )
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm
index 4053b9294c13..95864404f4e8 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm
@@ -51,7 +51,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_engi, list(
list("ARMORS", 0, null, null, null),
list("M3 B12 Pattern Marine Armor", 24, /obj/item/clothing/suit/storage/marine/medium/leader, null, VENDOR_ITEM_REGULAR),
- list("M4 Pattern Armor", 30, /obj/item/clothing/suit/storage/marine/medium/rto, null, VENDOR_ITEM_REGULAR),
+ list("M4 Pattern Armor", 16, /obj/item/clothing/suit/storage/marine/medium/rto, null, VENDOR_ITEM_REGULAR),
list("RESTRICTED FIREARMS", 0, null, null, null),
list("VP78 Pistol", 8, /obj/item/storage/box/guncase/vp78, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm
index 845d169a701a..0039d5b03250 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm
@@ -16,7 +16,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_leader, list(
list("Basic Engineering Supplies", 0, /obj/item/storage/box/kit/engineering_supply_kit, MARINE_CAN_BUY_KIT, VENDOR_ITEM_REGULAR),
list("ARMORS", 0, null, null, null),
- list("M4 Pattern Armor", 30, /obj/item/clothing/suit/storage/marine/medium/rto, null, VENDOR_ITEM_REGULAR),
+ list("M4 Pattern Armor", 16, /obj/item/clothing/suit/storage/marine/medium/rto, null, VENDOR_ITEM_REGULAR),
list("CLOTHING ITEMS", 0, null, null, null),
list("Machete Scabbard (Full)", 4, /obj/item/storage/large_holster/machete/full, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm
index 7d16d15af6fd..b29b528ded13 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm
@@ -72,8 +72,8 @@ GLOBAL_LIST_INIT(cm_vending_gear_medic, list(
list("VP78 Magazine", 3, /obj/item/ammo_magazine/pistol/vp78, null, VENDOR_ITEM_REGULAR),
list("ARMORS", 0, null, null, null),
- list("M3 B12 Pattern Marine Armor", 28, /obj/item/clothing/suit/storage/marine/medium/leader, null, VENDOR_ITEM_REGULAR),
- list("M4 Pattern Armor", 28, /obj/item/clothing/suit/storage/marine/medium/rto, null, VENDOR_ITEM_REGULAR),
+ list("M3 B12 Pattern Marine Armor", 24, /obj/item/clothing/suit/storage/marine/medium/leader, null, VENDOR_ITEM_REGULAR),
+ list("M4 Pattern Armor", 16, /obj/item/clothing/suit/storage/marine/medium/rto, null, VENDOR_ITEM_REGULAR),
list("RESTRICTED FIREARMS", 0, null, null, null),
list("VP78 Pistol", 8, /obj/item/storage/box/guncase/vp78, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm
index b132d8d4f13d..0b980fc31960 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm
@@ -82,13 +82,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_marine, list(
list("ARMORS", 0, null, null, null),
list("M3 B12 Pattern Marine Armor", 30, /obj/item/clothing/suit/storage/marine/medium/leader, null, VENDOR_ITEM_REGULAR),
- list("M4 Pattern Armor", 30, /obj/item/clothing/suit/storage/marine/medium/rto, null, VENDOR_ITEM_REGULAR),
+ list("M4 Pattern Armor", 20, /obj/item/clothing/suit/storage/marine/medium/rto, null, VENDOR_ITEM_REGULAR),
list("CLOTHING ITEMS", 0, null, null, null),
list("Webbing", 10, /obj/item/clothing/accessory/storage/webbing, null, VENDOR_ITEM_REGULAR),
list("Brown Webbing Vest", 15, /obj/item/clothing/accessory/storage/black_vest/brown_vest, null, VENDOR_ITEM_REGULAR),
list("Black Webbing Vest", 15, /obj/item/clothing/accessory/storage/black_vest, null, VENDOR_ITEM_REGULAR),
- list("Drop Pouch", 15, /obj/item/clothing/accessory/storage/droppouch, null, VENDOR_ITEM_REGULAR),
+ list("Drop Pouch", 10, /obj/item/clothing/accessory/storage/droppouch, null, VENDOR_ITEM_REGULAR),
list("Shoulder Holster", 15, /obj/item/clothing/accessory/storage/holster, null, VENDOR_ITEM_REGULAR),
list("Machete Scabbard (Full)", 15, /obj/item/storage/large_holster/machete/full, null, VENDOR_ITEM_REGULAR),
list("Machete Pouch (Full)", 15, /obj/item/storage/pouch/machete/full, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/objects/effects/landmarks/landmarks.dm b/code/game/objects/effects/landmarks/landmarks.dm
index a7afb80ef080..bf3b952edcf5 100644
--- a/code/game/objects/effects/landmarks/landmarks.dm
+++ b/code/game/objects/effects/landmarks/landmarks.dm
@@ -90,9 +90,11 @@
return
GLOB.nightmare_landmarks[insert_tag] = get_turf(src)
/obj/effect/landmark/nightmare/Destroy()
- if(insert_tag && autoremove \
- && GLOB.nightmare_landmarks[insert_tag] == get_turf(src))
- GLOB.nightmare_landmarks.Remove(insert_tag)
+ if(insert_tag)
+ var/turf/turf = get_turf(src)
+ if(autoremove && GLOB.nightmare_landmarks[insert_tag] == turf)
+ GLOB.nightmare_landmarks.Remove(insert_tag)
+ GLOB.nightmare_landmark_tags_removed += insert_tag
return ..()
/obj/effect/landmark/ert_spawns/distress
diff --git a/code/game/objects/effects/landmarks/survivor_spawner.dm b/code/game/objects/effects/landmarks/survivor_spawner.dm
index 2250ebf3edf2..a22198d3d703 100644
--- a/code/game/objects/effects/landmarks/survivor_spawner.dm
+++ b/code/game/objects/effects/landmarks/survivor_spawner.dm
@@ -144,6 +144,47 @@
spawn_priority = SPAWN_PRIORITY_VERY_HIGH
+/obj/effect/landmark/survivor_spawner/shivas_panic_room_cl
+ equipment = /datum/equipment_preset/survivor/wy/asstmanager
+ synth_equipment = /datum/equipment_preset/synth/survivor/wy/corporate_synth
+ intro_text = list("
You are the last alive Senior Administrator on the Colony!
",\
+ "You are aware of the xenomorph threat.",\
+ "Your primary objective is to survive the outbreak.")
+ story_text = "You are the Assistant Operations Manager stationed on 'Ifrit' by Weyland-Yutani. This whole outbreak has been a giant mess, you and all other Company personnel ran to the Operations Panic Room, until you heard shooting outside and closed the shutters. You are running low on food, water and ammunition for the weapons you one-day said were 'useless' and a waste of Company dollars. You remember that Administrator Stahl sent out a distress beacon to any ship in range, hoping to get picked up by the Company, he ran to the Spaceport. You have not seen him since. In their attempts at trying to breach in, the so called 'xenomorphs' have tried attacking the shutters, but to no avail. They will soon try again. You must survive and find a way to contact Weyland-Yutani."
+
+ spawn_priority = SPAWN_PRIORITY_VERY_HIGH
+
+/obj/effect/landmark/survivor_spawner/shivas_panic_room_doc
+ equipment = /datum/equipment_preset/survivor/doctor
+ synth_equipment = /datum/equipment_preset/synth/survivor/emt_synth
+ intro_text = list("
You are a Medical Doctor on the Colony!
",\
+ "You are aware of the xenomorph threat.",\
+ "Your primary objective is to survive the outbreak.")
+ story_text = "You are a Doctor working on 'Ifrit' for Weyland-Yutani. This whole outbreak has been a giant mess, you and all other Company personnel ran to the Operations Panic Room, until you heard shooting outside and closed the shutters. You are running low on food, water and ammunition for the weapons. You remember that the xenomorphs have a sort of implanter which latches on to your face and then... something bursts out of your chest, through the rib cage. You had plenty of those cases at the Medical Bay. In their attempts at trying to breach in, the so called 'xenomorphs' have tried attacking the shutters, but to no avail. They will soon try again. You must survive and find a way to contact Weyland-Yutani."
+
+ spawn_priority = SPAWN_PRIORITY_HIGH
+
+/obj/effect/landmark/survivor_spawner/shivas_panic_room_sci
+ equipment = /datum/equipment_preset/survivor/scientist
+ synth_equipment = /datum/equipment_preset/synth/survivor/scientist_synth
+ intro_text = list("
You are a Weyland-Yutani Scientist on the Colony!
",\
+ "You are aware of the xenomorph threat.",\
+ "Your primary objective is to survive the outbreak.")
+ story_text = "You are a Scientist working on 'Ifrit' for Weyland-Yutani. This whole outbreak has been a giant mess, you and all other Company personnel ran to the Operations Panic Room, until you heard shooting outside and closed the shutters. You are running low on food, water and ammunition for the weapons. You remember that the XX-121 species, codenamed that by Research Director Clarke, have a variety of different species, what you can assume a 'leader' of some sort and that their acid is deadly should it come in contact with you or the shutters. You ran far from the labs and have not seen some your coworkers since. In their attempts at trying to breach in, these so called 'xenomorphs' have tried attacking the shutters, but to no avail. They will soon try again. You must survive and find a way to contact Weyland-Yutani."
+
+ spawn_priority = SPAWN_PRIORITY_HIGH
+
+/obj/effect/landmark/survivor_spawner/shivas_panic_room_civ
+ equipment = /datum/equipment_preset/survivor/civilian
+ synth_equipment = /datum/equipment_preset/synth/survivor/chef_synth
+ intro_text = list("
You are a worker on the Colony!
",\
+ "You are aware of the xenomorph threat.",\
+ "Your primary objective is to survive the outbreak.")
+ story_text = "You are a civilian working on 'Ifrit' for Weyland-Yutani. This whole outbreak has been a giant mess, you and all other Company personnel ran to the Operations Panic Room, until you heard shooting outside and closed the shutters. You are running low on food, water and ammunition for the weapons. You remember hearing the alarms blaring and decided to run with a couple others to the Panic Room, hoping to be safe from the threat until rescue arrives. Now you wait along with others for their second attack on the Panic Room. In their first attempt at trying to breach in, the so called 'xenomorphs' have tried attacking the shutters, but to no avail. They will soon try again. You must survive and find a way to contact Weyland-Yutani."
+
+ spawn_priority = SPAWN_PRIORITY_MEDIUM
+
+
//Military Survivors//
/obj/effect/landmark/survivor_spawner/lv522_forecon_tech
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 58e86998f39a..2af343c8de26 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -238,7 +238,7 @@
desc = "A red USCM issued flare. There are instructions on the side, it reads 'pull cord, make light'."
w_class = SIZE_SMALL
light_power = 2
- light_range = 7
+ light_range = 5
icon_state = "flare"
item_state = "flare"
actions = list() //just pull it manually, neckbeard.
diff --git a/code/game/objects/items/devices/helmet_visors.dm b/code/game/objects/items/devices/helmet_visors.dm
index 05d75a9fefd6..4d1b38491791 100644
--- a/code/game/objects/items/devices/helmet_visors.dm
+++ b/code/game/objects/items/devices/helmet_visors.dm
@@ -6,7 +6,7 @@
w_class = SIZE_TINY
///The type of HUD our visor shows
- var/hud_type = MOB_HUD_FACTION_USCM
+ var/hud_type = MOB_HUD_FACTION_MARINE
///The sound when toggling on the visor
var/toggle_on_sound = 'sound/handling/hud_on.ogg'
@@ -302,7 +302,7 @@
/obj/item/device/helmet_visor/night_vision/marine_raider
name = "advanced night vision optic"
desc = "An insertable visor HUD into a standard USCM helmet. This type gives a form of night vision and is standard issue in special forces units."
- hud_type = list(MOB_HUD_FACTION_USCM, MOB_HUD_MEDICAL_ADVANCED)
+ hud_type = list(MOB_HUD_FACTION_MARINE, MOB_HUD_MEDICAL_ADVANCED)
helmet_overlay = "nvg_sight_right_raider"
power_use = 0
visor_glows = FALSE
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 7b987752011c..00f0ad16220c 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -35,7 +35,7 @@
var/headset_hud_on = FALSE
var/locate_setting = TRACKER_SL
var/misc_tracking = FALSE
- var/hud_type = MOB_HUD_FACTION_USCM
+ var/hud_type = MOB_HUD_FACTION_MARINE
var/default_freq
///The type of minimap this headset is added to
@@ -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
@@ -341,7 +341,7 @@
var/z_level = turf_gotten.z
if(wearer.assigned_equipment_preset.always_minimap_visible == TRUE || wearer.stat == DEAD) //We show to all marines if we have this flag, separated by faction
- if(hud_type == MOB_HUD_FACTION_USCM)
+ if(hud_type == MOB_HUD_FACTION_MARINE)
marker_flags = MINIMAP_FLAG_USCM
else if(hud_type == MOB_HUD_FACTION_UPP)
marker_flags = MINIMAP_FLAG_UPP
@@ -1013,7 +1013,7 @@
icon_state = "cmb_headset"
initial_keys = list(/obj/item/device/encryptionkey/cmb)
has_hud = TRUE
- hud_type = MOB_HUD_FACTION_USCM
+ hud_type = MOB_HUD_FACTION_MARINE
/obj/item/device/radio/headset/distress/CMB/limited
name = "\improper Damaged CMB Earpiece"
@@ -1058,7 +1058,7 @@
initial_keys = list(/obj/item/device/encryptionkey/soc/forecon)
volume = RADIO_VOLUME_QUIET
has_hud = TRUE
- hud_type = MOB_HUD_FACTION_USCM
+ hud_type = MOB_HUD_FACTION_MARINE
/obj/item/device/radio/headset/almayer/mcom/vc
name = "marine vehicle crew radio headset"
diff --git a/code/game/objects/items/toys/trading_cards.dm b/code/game/objects/items/toys/trading_cards.dm
index 23a35abec45e..9fb83cd1e5e1 100644
--- a/code/game/objects/items/toys/trading_cards.dm
+++ b/code/game/objects/items/toys/trading_cards.dm
@@ -14,11 +14,11 @@
var/front_description = "A red trading card with a picture of the United Americas flag emblazoned on it. It is number one out of the five red cards."
var/back_icon_state = "trading_red"
var/front_icon_state = "trading_red_one"
- var/picture_descriptions = list("5" = list("red" = "a Holy Order of the HEFA cultist", "green" = "General Delyla S. Vaughn (the Assistant Commandant of the United States Colonial Marines)", "blue" = "the Weyland Yutani logo"),
- "4" = list("red" = "a UPPA officer", "green" = "General Diego Dellamarggio (the Commandant of the United States Colonial Marines)", "blue" = "the Independent Core System Colonies logo"),
+ var/picture_descriptions = list("5" = list("red" = "a fanatical colonial seditionist", "green" = "Almirante Joelle De La Cruz (the United Americas Secretary of Defense)", "blue" = "the United Americas flag"),
+ "4" = list("red" = "a UPPA soldier", "green" = "Marechal-do-ar Enzo Gabriel Lurdes (the Chief of Naval Operations of the Latin American Colonial Navy)", "blue" = "the Union of Progressive Peoples flag"),
"3" = list("red" = "a UPPA minigunner", "green" = "Generale d'armee Felix Couture (the Commandant of the Canadian Colonial Armed Forces)", "blue" = "the Three World Empire flag"),
- "2" = list("red" = "a UPPA soldier", "green" = "Marechal-do-ar Enzo Gabriel Lurdes (the Chief of Naval Operations of the Latin American Colonial Navy)", "blue" = "the Union of Progressive Peoples flag"),
- "1" = list("red" = "a fanatical colonial seditionist", "green" = "Almirante Joelle De La Cruz (the United Americas Secretary of Defense)", "blue" = "the United Americas flag",)
+ "2" = list("red" = "a UPPA officer", "green" = "General Diego Dellamarggio (the Commandant of the United States Colonial Marines)", "blue" = "the Weyland Yutani logo"),
+ "1" = list("red" = "a Holy Order of the HEFA cultist", "green" = "General Delyla S. Vaughn (the Assistant Commandant of the United States Colonial Marines)", "blue" = "the Independent Core System Colonies logo",)
)
/obj/item/toy/trading_card/Initialize()
diff --git a/code/game/objects/structures/barricade/barricade.dm b/code/game/objects/structures/barricade/barricade.dm
index 37975d4a8960..313067ca6a56 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,16 @@
user.count_niche_stat(STATISTICS_NICHE_REPAIR_CADES)
update_health(-200)
playsound(src.loc, 'sound/items/Welder2.ogg', 25, TRUE)
+
+ var/current_tool = user.get_active_hand()
+ if(current_tool != welder)
+ return TRUE // Swapped hands or tool
+ 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 +485,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)
..()
diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm
index 39a659c5f397..5620f106b560 100644
--- a/code/game/objects/structures/crates_lockers/largecrate.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate.dm
@@ -22,32 +22,18 @@
playsound(src, unpacking_sound, 35)
- /// Store the reference of the crate material
- var/obj/item/stack/sheet/material_sheet
- if(parts_type) // Create the crate material and store its reference
- material_sheet = new parts_type(current_turf, 2)
-
- // Move the objects back to the turf, above the crate material
+ // Move the contents back to the turf
for(var/atom/movable/moving_atom as anything in contents)
moving_atom.forceMove(current_turf)
- deconstruct(TRUE)
-
- // Move the crate material to the bottom of the turf's contents
- if(material_sheet)
- move_to_bottom(material_sheet, current_turf)
+ if(parts_type) // Create the crate material
+ new parts_type(current_turf, 2)
-/// Custom proc to move an object to the bottom of the turf's contents
-/obj/structure/largecrate/proc/move_to_bottom(obj/moving_down, turf/current_turf)
- if(!istype(moving_down) || !istype(current_turf))
- return
- for(var/atom/movable/checking_atom in current_turf.contents)
- if(checking_atom != moving_down)
- checking_atom.layer = max(checking_atom.layer, moving_down.layer + 0.1)
+ deconstruct(TRUE)
/obj/structure/largecrate/deconstruct(disassembled = TRUE)
if(!disassembled)
- new /obj/item/stack/sheet/wood(loc)
+ new parts_type(loc)
return ..()
diff --git a/code/game/objects/structures/vulture_spotter.dm b/code/game/objects/structures/vulture_spotter.dm
index d90a1ec1615a..4d8e5d06749b 100644
--- a/code/game/objects/structures/vulture_spotter.dm
+++ b/code/game/objects/structures/vulture_spotter.dm
@@ -87,7 +87,7 @@
if(user.client)
RegisterSignal(user.client, COMSIG_PARENT_QDELETING, PROC_REF(do_unscope))
user.client.change_view(scope_zoom, src)
- RegisterSignal(user, list(COMSIG_MOB_PICKUP_ITEM, COMSIG_MOB_RESISTED), PROC_REF(do_unscope))
+ RegisterSignal(user, list(COMSIG_MOB_PICKUP_ITEM, COMSIG_MOB_RESISTED, COMSIG_MOB_DEATH, COMSIG_LIVING_SET_BODY_POSITION), PROC_REF(do_unscope))
user.see_in_dark += darkness_view
user.lighting_alpha = 127
user.sync_lighting_plane_alpha()
@@ -234,7 +234,7 @@
user.lighting_alpha = user.default_lighting_alpha
user.sync_lighting_plane_alpha()
user.clear_fullscreen("vulture_spotter")
- UnregisterSignal(user, list(COMSIG_MOB_PICKUP_ITEM, COMSIG_MOB_RESISTED))
+ UnregisterSignal(user, list(COMSIG_MOB_PICKUP_ITEM, COMSIG_MOB_RESISTED, COMSIG_MOB_DEATH, COMSIG_LIVING_SET_BODY_POSITION))
user.pixel_x = 0
user.pixel_y = 0
if(user.client)
@@ -295,6 +295,10 @@
return rifle.attachments["rail"]
+/obj/structure/vulture_spotter_tripod/check_eye(mob/living/user)
+ if((user.body_position != STANDING_UP) || (get_dist(user, src) > 0) || user.is_mob_incapacitated() || !user.client)
+ do_unscope()
+
/datum/action/vulture_tripod_unscope
name = "Stop Using Scope"
action_icon_state = "vulture_tripod_close"
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index 5871fdc7a152..a73a3b96e5e4 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -17,6 +17,7 @@
FACTION_PMC = 0,
FACTION_CLF = 0,
FACTION_UPP = 0,
+ FACTION_TWE = 0,
FACTION_FREELANCER = 0,
FACTION_SURVIVOR = 0,
FACTION_WY_DEATHSQUAD = 0,
diff --git a/code/game/world.dm b/code/game/world.dm
index 958278042ea5..e55741ca71e5 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -374,6 +374,7 @@ GLOBAL_LIST_INIT(reboot_sfx, file2list("config/reboot_sfx.txt"))
/world/proc/HandleTestRun()
// Wait for the game ticker to initialize
Master.sleep_offline_after_initializations = FALSE
+ SSticker.start_immediately = TRUE
UNTIL(SSticker.initialized)
//trigger things to run the whole process
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index f3eae1447ba0..b99394a52fee 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -111,6 +111,7 @@ GLOBAL_LIST_INIT(admin_verbs_minor_event, list(
/client/proc/cmd_admin_change_custom_event,
/datum/admins/proc/admin_force_distress,
/datum/admins/proc/admin_force_ERT_shuttle,
+ /client/proc/enable_event_mob_verbs,
/client/proc/force_hijack,
/datum/admins/proc/force_predator_round, //Force spawns a predator round.
/client/proc/adjust_predator_round,
@@ -141,7 +142,6 @@ GLOBAL_LIST_INIT(admin_verbs_minor_event, list(
))
GLOBAL_LIST_INIT(admin_verbs_major_event, list(
- /client/proc/enable_event_mob_verbs,
/client/proc/cmd_admin_dress_all,
/client/proc/free_all_mobs_in_view,
/client/proc/drop_bomb,
@@ -238,6 +238,7 @@ GLOBAL_LIST_INIT(debug_verbs, list(
))
GLOBAL_LIST_INIT(admin_verbs_possess, list(
+ /client/proc/cmd_assume_direct_control,
/client/proc/possess,
/client/proc/release
))
@@ -262,10 +263,7 @@ GLOBAL_LIST_INIT(admin_mob_event_verbs_hideable, list(
/client/proc/editappear,
/client/proc/cmd_admin_addhud,
/client/proc/cmd_admin_change_their_hivenumber,
- /client/proc/cmd_assume_direct_control,
/client/proc/free_mob_for_ghosts,
- /client/proc/possess,
- /client/proc/release,
/client/proc/cmd_admin_grantfullaccess,
/client/proc/cmd_admin_grantallskills,
/client/proc/admin_create_account
@@ -273,6 +271,7 @@ GLOBAL_LIST_INIT(admin_mob_event_verbs_hideable, list(
//verbs which can be hidden - needs work
GLOBAL_LIST_INIT(admin_verbs_hideable, list(
+ /client/proc/cmd_assume_direct_control,
/client/proc/release,
/client/proc/possess,
/client/proc/callproc_datum,
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 5f10b8d24d22..4b52f03c1ec8 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -469,6 +469,11 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
/datum/admin_help/proc/Close(key_name = key_name_admin(usr), silent = FALSE)
if(state != AHELP_ACTIVE)
return
+
+ if(marked_admin != usr.key)
+ to_chat(usr, SPAN_WARNING("This ticket is currently marked by [marked_admin]. Please override their mark to interact with this ticket!"))
+ return
+
RemoveActive()
state = AHELP_CLOSED
GLOB.ahelp_tickets.ListInsert(src)
@@ -483,6 +488,11 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
/datum/admin_help/proc/Resolve(key_name = key_name_admin(usr), silent = FALSE)
if(state != AHELP_ACTIVE)
return
+
+ if(marked_admin != usr.key)
+ to_chat(usr, SPAN_WARNING("This ticket is currently marked by [marked_admin]. Please override their mark to interact with this ticket!"))
+ return
+
RemoveActive()
state = AHELP_RESOLVED
GLOB.ahelp_tickets.ListInsert(src)
@@ -501,6 +511,10 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
if(state != AHELP_ACTIVE || !initial_message)
return
+ if(marked_admin != usr.key)
+ to_chat(usr, SPAN_WARNING("This ticket is currently marked by [marked_admin]. Please override their mark to interact with this ticket!"))
+ return
+
if(!initiator.current_mhelp)
initiator.current_mhelp = new(initiator)
@@ -559,6 +573,10 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
if(state != AHELP_ACTIVE)
return
+ if(marked_admin != usr.key)
+ to_chat(usr, SPAN_WARNING("This ticket is currently marked by [marked_admin]. Please override their mark to interact with this ticket!"))
+ return
+
if(initiator)
initiator.giveadminhelpverb()
@@ -582,6 +600,10 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
to_chat(usr, SPAN_WARNING("This ticket is already closed!"))
return
+ if(marked_admin != usr.key)
+ to_chat(usr, SPAN_WARNING("This ticket is currently marked by [marked_admin]. Please override their mark to interact with this ticket!"))
+ return
+
var/chosen = tgui_input_list(usr, "Which auto response do you wish to send?", "AutoReply", GLOB.adminreplies)
var/datum/autoreply/admin/response = GLOB.adminreplies[chosen]
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index e5fed9db2fc4..a9a3a90ff35a 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -60,7 +60,7 @@
var/message_prompt = "Message:"
- if((AH?.opening_responders && length(AH.ticket_interactions) == 1 ) || (AH?.marked_admin && AH?.marked_admin != usr.key) && length(AH.ticket_interactions) == 2)
+ if((AH?.opening_responders && length(AH.ticket_interactions) == 1 ) || ((AH?.marked_admin && AH?.marked_admin != usr.key) && length(AH.ticket_interactions) == 2))
SEND_SOUND(src, sound('sound/machines/buzz-sigh.ogg', volume=30))
message_prompt += "\n\n**This ticket is already being responded to by: [length(AH.opening_responders) ? english_list(AH.opening_responders) : AH.marked_admin]**"
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index ede1cd029d9d..60c2092d8dc3 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -117,8 +117,8 @@
var/datum/space_level/cur_level = SSmapping.z_list[cur_z]
cur_x += cur_level.bounds[MAP_MINX] - 1
cur_y += cur_level.bounds[MAP_MINY] - 1
- width = cur_level.bounds[MAP_MAXX] - cur_level.bounds[MAP_MINX] - half_chunk_size + 1
- height = cur_level.bounds[MAP_MAXY] - cur_level.bounds[MAP_MINY] - half_chunk_size + 1
+ width = cur_level.bounds[MAP_MAXX] - cur_level.bounds[MAP_MINX] - half_chunk_size + 3
+ height = cur_level.bounds[MAP_MAXY] - cur_level.bounds[MAP_MINY] - half_chunk_size + 3
else
width = world.maxx - half_chunk_size + 2
height = world.maxy - half_chunk_size + 2
@@ -283,6 +283,8 @@
account_user.mind.store_memory(remembered_info)
account_user.mind.initial_account = generated_account
+ log_admin("[key_name(usr)] has created a new bank account for [key_name(account_user)].")
+
/client/proc/cmd_assume_direct_control(mob/M in GLOB.mob_list)
set name = "Control Mob"
set desc = "Assume control of the mob"
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/clothing/head/head.dm b/code/modules/clothing/head/head.dm
index 9121485ee76a..86527457bfce 100644
--- a/code/modules/clothing/head/head.dm
+++ b/code/modules/clothing/head/head.dm
@@ -416,10 +416,8 @@
/obj/item/clothing/head/cmcap/reporter
name = "combat correspondent cap"
desc = "A faithful cap for any terrain war correspondents may find themselves in."
- icon = 'icons/mob/humans/onmob/contained/war_correspondent.dmi'
- icon_state = "wc_flagcap"
- item_state = "wc_flagcap"
- contained_sprite = TRUE
+ icon_state = "cc_flagcap"
+ item_state = "cc_flagcap"
flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE
flags_marine_hat = HAT_GARB_OVERLAY
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index adfbfb023309..26c92f632ee2 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -511,7 +511,17 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list(
new_action.give_to(user)
return
- if(HAS_TRAIT(attacking_item, TRAIT_TOOL_SCREWDRIVER) && length(inserted_visors))
+ if(HAS_TRAIT(attacking_item, TRAIT_TOOL_SCREWDRIVER))
+ // If there isn't anything to remove, return.
+ if(!length(inserted_visors))
+ // If the user is trying to remove a built-in visor, give them a more helpful failure message.
+ switch(length(built_in_visors))
+ if(1) // Messy plural handling
+ to_chat(user, SPAN_WARNING("The visor on [src] is built-in!"))
+ if(2 to INFINITY)
+ to_chat(user, SPAN_WARNING("The visors on [src] are built-in!"))
+ return
+
if(active_visor)
var/obj/item/device/helmet_visor/temp_visor_holder = active_visor
active_visor = null
@@ -1403,10 +1413,8 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list(
/obj/item/clothing/head/helmet/marine/reporter
name = "press helmet"
desc = "A helmet designed to make it clear that the wearer is safety aware and not looking for a fight."
- icon = 'icons/mob/humans/onmob/contained/war_correspondent.dmi'
- icon_state = "wc_helm"
- item_state = "wc_helm"
- contained_sprite = TRUE
+ icon_state = "cc_helmet"
+ item_state = "cc_helmet"
flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE
built_in_visors = list()
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..fd926c4ffd50
--- /dev/null
+++ b/code/modules/clothing/suits/marine_armor/_marine_armor.dm
@@ -0,0 +1,668 @@
+#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)
+
+//==================Combat 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_state = "cc_armor"
+ flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE
+
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..19009606db35
--- /dev/null
+++ b/code/modules/clothing/suits/marine_armor/ert.dm
@@ -0,0 +1,828 @@
+//=============================//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 Deputy jacket"
+ desc = "A thick and stylish black leather jacket with a Marshal's Deputy badge pinned to it. The back is enscribed with the powerful letters of 'DEPUTY' representing justice, authority, and protection in the outer rim. The laws of the Earth stretch beyond the Sol."
+ icon_state = "CMB_jacket"
+ item_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/CMB/marshal
+ name = "\improper CMB Marshal jacket"
+ desc = "A thick and stylish black leather jacket with a Marshal's badge pinned to it. 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_marshal"
+ item_state = "CMB_jacket_marshal"
+
+//===========================//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/code/modules/clothing/suits/marine_coat.dm b/code/modules/clothing/suits/marine_coat.dm
index 49569ec1295d..2dd93eb66aee 100644
--- a/code/modules/clothing/suits/marine_coat.dm
+++ b/code/modules/clothing/suits/marine_coat.dm
@@ -278,15 +278,29 @@
icon_state = "o_jacket"
item_state = "o_jacket"
-//==================War Correspondent==================\\
+//==================Combat Correspondent==================\\
/obj/item/clothing/suit/storage/jacket/marine/reporter
name = "combat correspondent jacket"
desc = "A jacket for the most fashionable war correspondents."
- icon = 'icons/mob/humans/onmob/contained/war_correspondent.dmi'
- icon_state = "wc_suit"
- item_state = "wc_suit"
- contained_sprite = TRUE
+ icon_state = "cc_brown"
+ item_state = "cc_brown"
+ flags_atom = NO_SNOW_TYPE
+ has_buttons = FALSE
+
+/obj/item/clothing/suit/storage/jacket/marine/reporter/green
+ icon_state = "cc_green"
+ item_state = "cc_green"
+
+
+/obj/item/clothing/suit/storage/jacket/marine/reporter/black
+ icon_state = "cc_black"
+ item_state = "cc_black"
+
+/obj/item/clothing/suit/storage/jacket/marine/reporter/blue
+ icon_state = "cc_blue"
+ item_state = "cc_blue"
+
//==================Corporate Liaison==================\\
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index b5859bb6f2d4..54148d4f7076 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -143,8 +143,8 @@
valid_accessory_slots = list(ACCESSORY_SLOT_MEDAL)
/obj/item/clothing/suit/storage/apron/overalls
- name = "coveralls"
- desc = "A set of denim overalls."
+ name = "blue coveralls"
+ desc = "A pair of denim overalls. With a large pocket in the front these overalls are popular with workers of all kinds."
icon_state = "overalls"
item_state = "overalls"
flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS
@@ -167,6 +167,18 @@
)
valid_accessory_slots = list(ACCESSORY_SLOT_MEDAL)
+/obj/item/clothing/suit/storage/apron/overalls/tan
+ name = "tan coveralls"
+ desc = "A pair of tan overalls. With a large pocket in the front these overalls are popular with workers of all kinds."
+ icon_state = "overalls_tan"
+ item_state = "overalls_tan"
+
+/obj/item/clothing/suit/storage/apron/overalls/red
+ name = "red coveralls"
+ desc = "A pair of reddish-brown overalls. With a large pocket in the front these overalls are popular with workers of all kinds."
+ icon_state = "overalls_red"
+ item_state = "overalls_red"
+
/obj/item/clothing/suit/syndicatefake
name = "red space suit replica"
icon_state = "syndicate"
diff --git a/code/modules/clothing/under/gimmick.dm b/code/modules/clothing/under/gimmick.dm
index d8e0a16fc7a2..793bc0593735 100644
--- a/code/modules/clothing/under/gimmick.dm
+++ b/code/modules/clothing/under/gimmick.dm
@@ -11,6 +11,10 @@
has_sensor = UNIFORM_NO_SENSORS
displays_id = 0
+ item_icons = list(
+ WEAR_BODY = 'icons/mob/humans/onmob/uniform_1.dmi',
+ )
+
//JASON
/obj/item/clothing/under/gimmick/jason
name = "dirty work attire"
diff --git a/code/modules/clothing/under/marine_uniform.dm b/code/modules/clothing/under/marine_uniform.dm
index 3b41b2db02c7..4f0c06273d9e 100644
--- a/code/modules/clothing/under/marine_uniform.dm
+++ b/code/modules/clothing/under/marine_uniform.dm
@@ -692,6 +692,40 @@
has_sensor = UNIFORM_HAS_SENSORS
sensor_faction = FACTION_COLONIST
+/obj/item/clothing/under/colonist/workwear
+ name = "grey workwear"
+ desc = "A pair of black slacks and a short-sleeve grey workshirt. Standard uniform for Weyland Yutani employees working in colony operations and administration."
+ icon_state = "workwear_grey"
+ worn_state = "workwear_grey"
+
+/obj/item/clothing/under/colonist/workwear/khaki
+ name = "khaki workwear"
+ desc = "A pair of jeans paired with a khaki workshirt. A common pairing among blue-collar workers due to its drab look."
+ icon_state = "workwear_khaki"
+ worn_state = "workwear_khaki"
+ flags_jumpsuit = UNIFORM_SLEEVE_ROLLABLE|UNIFORM_JACKET_REMOVABLE
+
+/obj/item/clothing/under/colonist/workwear/pink
+ name = "pink workwear"
+ desc = "A pair of jeans paired with a pink workshirt. Pink? Your wife might not think so, but such outlandish attire deserves questioning by corporate security. What are you, some kind of free-thinking anarchist?"
+ icon_state = "workwear_pink"
+ worn_state = "workwear_pink"
+ flags_jumpsuit = UNIFORM_SLEEVE_ROLLABLE|UNIFORM_JACKET_REMOVABLE
+
+/obj/item/clothing/under/colonist/workwear/blue
+ name = "blue workwear"
+ desc = "A pair of brown canvas workpants paired with a dark blue workshirt. A common pairing among blue-collar workers."
+ icon_state = "workwear_blue"
+ worn_state = "workwear_blue"
+ flags_jumpsuit = UNIFORM_SLEEVE_ROLLABLE|UNIFORM_JACKET_REMOVABLE
+
+/obj/item/clothing/under/colonist/workwear/green
+ name = "green workwear"
+ desc = "A pair of brown canvas workpants paired with a green workshirt. An common pairing among blue-collar workers."
+ icon_state = "workwear_green"
+ worn_state = "workwear_green"
+ flags_jumpsuit = UNIFORM_SLEEVE_ROLLABLE|UNIFORM_JACKET_REMOVABLE
+
/obj/item/clothing/under/colonist/clf
name = "\improper Colonial Liberation Front uniform"
desc = "A stylish grey-green jumpsuit - standard issue for colonists. This version appears to have the symbol of the Colonial Liberation Front emblazoned in select areas."
@@ -735,6 +769,7 @@
displays_id = FALSE
has_sensor = UNIFORM_HAS_SENSORS
sensor_faction = FACTION_MARINE
+
/obj/item/clothing/under/tshirt/gray_blu
name = "gray T-shirt and jeans"
desc = "A comfortable gray T-shirt and blue jeans."
@@ -755,7 +790,7 @@
/obj/item/clothing/under/CM_uniform
name = "\improper Colonial Marshal uniform"
- desc = "A blue shirt and tan trousers - the official uniform for a Colonial Marshal."
+ desc = "A pair of off-white slacks and a blue button-down shirt with a dark brown tie; the standard uniform of the Colonial Marshals."
icon_state = "marshal"
worn_state = "marshal"
armor_melee = CLOTHING_ARMOR_LOW
@@ -766,7 +801,7 @@
armor_bio = CLOTHING_ARMOR_NONE
armor_rad = CLOTHING_ARMOR_NONE
armor_internaldamage = CLOTHING_ARMOR_LOW
-
+ flags_jumpsuit = UNIFORM_SLEEVE_ROLLABLE|UNIFORM_JACKET_REMOVABLE
/obj/item/clothing/under/liaison_suit
name = "liaison's tan suit"
@@ -847,11 +882,24 @@
/obj/item/clothing/under/marine/reporter
name = "combat correspondent uniform"
desc = "A relaxed and robust uniform fit for any potential reporting needs."
- icon = 'icons/mob/humans/onmob/contained/war_correspondent.dmi'
- icon_state = "wc_uniform"
- worn_state = "wc_uniform"
- contained_sprite = TRUE
- flags_atom = NO_NAME_OVERRIDE
+ icon_state = "cc_white"
+ worn_state = "cc_white"
+ flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE
+ item_icons = list(
+ WEAR_BODY = 'icons/mob/humans/onmob/uniform_1.dmi',
+ )
+
+/obj/item/clothing/under/marine/reporter/black
+ icon_state = "cc_black"
+ worn_state = "cc_black"
+
+/obj/item/clothing/under/marine/reporter/orange
+ icon_state = "cc_orange"
+ worn_state = "cc_orange"
+
+/obj/item/clothing/under/marine/reporter/red
+ icon_state = "cc_red"
+ worn_state = "cc_red"
/obj/item/clothing/under/twe_suit
name = "representative's fine suit"
diff --git a/code/modules/cm_aliens/XenoStructures.dm b/code/modules/cm_aliens/XenoStructures.dm
index ab38e59002d8..c014fbf9c211 100644
--- a/code/modules/cm_aliens/XenoStructures.dm
+++ b/code/modules/cm_aliens/XenoStructures.dm
@@ -578,6 +578,9 @@
if(current_mob.stat == DEAD)
return FALSE
+ if(HAS_TRAIT(current_mob, TRAIT_NESTED))
+ return FALSE
+
var/turf/current_turf
var/turf/last_turf = loc
var/atom/temp_atom = new acid_type()
diff --git a/code/modules/cm_aliens/structures/trap.dm b/code/modules/cm_aliens/structures/trap.dm
index e4b021e98f46..9cd95f22b158 100644
--- a/code/modules/cm_aliens/structures/trap.dm
+++ b/code/modules/cm_aliens/structures/trap.dm
@@ -4,7 +4,7 @@
/obj/effect/alien/resin/trap
desc = "It looks like a hiding hole."
- name = "resin hole"
+ name = "resin trap"
icon_state = "trap0"
density = FALSE
opacity = FALSE
@@ -12,7 +12,7 @@
health = 5
layer = RESIN_STRUCTURE_LAYER
var/list/tripwires = list()
- var/hivenumber = XENO_HIVE_NORMAL //Hivenumber of the xeno that planted it OR the last Facehugger that was placed (essentially taking over the hole)
+ var/hivenumber = XENO_HIVE_NORMAL //Hivenumber of the xeno that planted it OR the last Facehugger that was placed (essentially taking over the trap)
var/trap_type = RESIN_TRAP_EMPTY
var/armed = 0
var/created_by // ckey
@@ -247,7 +247,7 @@
to_chat(B, SPAN_XENOWARNING("You must produce more plasma before doing this."))
return XENO_NO_DELAY_ACTION
- to_chat(X, SPAN_XENONOTICE("You begin charging the resin hole with acid gas."))
+ to_chat(X, SPAN_XENONOTICE("You begin charging the resin trap with acid gas."))
xeno_attack_delay(X)
if(!do_after(B, 30, INTERRUPT_NO_NEEDHAND, BUSY_ICON_HOSTILE, src))
return XENO_NO_DELAY_ACTION
@@ -268,8 +268,8 @@
playsound(loc, 'sound/effects/refill.ogg', 25, 1)
set_state(RESIN_TRAP_GAS)
cause_data = create_cause_data("resin gas trap", B)
- B.visible_message(SPAN_XENOWARNING("\The [B] pressurises the resin hole with acid gas!"), \
- SPAN_XENOWARNING("You pressurise the resin hole with acid gas!"), null, 5)
+ B.visible_message(SPAN_XENOWARNING("\The [B] pressurises the resin trap with acid gas!"), \
+ SPAN_XENOWARNING("You pressurise the resin trap with acid gas!"), null, 5)
else
//Non-boiler acid types
var/acid_cost = 70
@@ -282,7 +282,7 @@
to_chat(X, SPAN_XENOWARNING("You must produce more plasma before doing this."))
return XENO_NO_DELAY_ACTION
- to_chat(X, SPAN_XENONOTICE("You begin charging the resin hole with acid."))
+ to_chat(X, SPAN_XENONOTICE("You begin charging the resin trap with acid."))
xeno_attack_delay(X)
if(!do_after(X, 3 SECONDS, INTERRUPT_NO_NEEDHAND, BUSY_ICON_HOSTILE, src))
return XENO_NO_DELAY_ACTION
@@ -300,8 +300,8 @@
else
set_state(RESIN_TRAP_ACID1 + X.acid_level - 1)
- X.visible_message(SPAN_XENOWARNING("\The [X] pressurises the resin hole with acid!"), \
- SPAN_XENOWARNING("You pressurise the resin hole with acid!"), null, 5)
+ X.visible_message(SPAN_XENOWARNING("\The [X] pressurises the resin trap with acid!"), \
+ SPAN_XENOWARNING("You pressurise the resin trap with acid!"), null, 5)
return XENO_NO_DELAY_ACTION
@@ -310,15 +310,15 @@
for(var/turf/T in orange(1,loc))
if(T.density)
continue
- var/obj/effect/hole_tripwire/HT = new /obj/effect/hole_tripwire(T)
- HT.linked_trap = src
- tripwires += HT
+ var/obj/effect/trap_tripwire/new_tripwire = new /obj/effect/trap_tripwire(T)
+ new_tripwire.linked_trap = src
+ tripwires += new_tripwire
/obj/effect/alien/resin/trap/attackby(obj/item/W, mob/user)
if(!(istype(W, /obj/item/clothing/mask/facehugger) && isxeno(user)))
return ..()
if(trap_type != RESIN_TRAP_EMPTY)
- to_chat(user, SPAN_XENOWARNING("You can't put a hugger in this hole!"))
+ to_chat(user, SPAN_XENOWARNING("You can't put a hugger in this trap!"))
return
var/obj/item/clothing/mask/facehugger/FH = W
if(FH.stat == DEAD)
@@ -329,7 +329,7 @@
return
if (X.hivenumber != hivenumber)
- to_chat(user, SPAN_XENOWARNING("This resin hole doesn't belong to your hive!"))
+ to_chat(user, SPAN_XENOWARNING("This resin trap doesn't belong to your hive!"))
return
if (FH.hivenumber != hivenumber)
@@ -353,21 +353,21 @@
QDEL_NULL_LIST(tripwires)
. = ..()
-/obj/effect/hole_tripwire
- name = "hole tripwire"
+/obj/effect/trap_tripwire
+ name = "trap tripwire"
anchored = TRUE
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
invisibility = 101
unacidable = TRUE //You never know
var/obj/effect/alien/resin/trap/linked_trap
-/obj/effect/hole_tripwire/Destroy()
+/obj/effect/trap_tripwire/Destroy()
if(linked_trap)
linked_trap.tripwires -= src
linked_trap = null
. = ..()
-/obj/effect/hole_tripwire/Crossed(atom/A)
+/obj/effect/trap_tripwire/Crossed(atom/A)
if(!linked_trap)
qdel(src)
return
diff --git a/code/modules/cm_aliens/weeds.dm b/code/modules/cm_aliens/weeds.dm
index 5298e7ab02f1..d614d87bf9b9 100644
--- a/code/modules/cm_aliens/weeds.dm
+++ b/code/modules/cm_aliens/weeds.dm
@@ -123,7 +123,7 @@
update_icon()
/obj/effect/alien/weeds/node/weak
- name = "weak resin node"
+ name = "weak weed node"
health = WEED_HEALTH_STANDARD
alpha = 127
@@ -469,7 +469,7 @@
/obj/effect/alien/weeds/node
- name = "resin node"
+ name = "weed node"
desc = "A weird, pulsating node."
icon_state = "weednode"
// Weed nodes start out with normal weed health and become stronger once they've stopped spreading
diff --git a/code/modules/cm_marines/Donator_Items.dm b/code/modules/cm_marines/Donator_Items.dm
index 17669b0157dc..e534997ddd42 100644
--- a/code/modules/cm_marines/Donator_Items.dm
+++ b/code/modules/cm_marines/Donator_Items.dm
@@ -972,8 +972,11 @@
icon_state = null
item_state = null
min_cold_protection_temperature = ICE_PLANET_MIN_COLD_PROT
- //DON'T GRAB STUFF BETWEEN THIS LINE
- //AND THIS LINE
+
+ item_icons = list(
+ WEAR_BODY = 'icons/mob/humans/onmob/uniform_1.dmi',
+ )
+
//END UNIFORM TEMPLATE
/obj/item/clothing/under/marine/fluff/marinemedic //UNUSED
diff --git a/code/modules/cm_marines/dropship_ammo.dm b/code/modules/cm_marines/dropship_ammo.dm
index 19086b36c957..93768e218375 100644
--- a/code/modules/cm_marines/dropship_ammo.dm
+++ b/code/modules/cm_marines/dropship_ammo.dm
@@ -427,7 +427,7 @@
max_ammo_count = 1
ammo_name = "area denial sentry"
travelling_time = 0 // handled by droppod
- point_cost = 800
+ point_cost = 800 //handled by printer
accuracy_range = 0 // pinpoint
max_inaccuracy = 0
/// Special structures it needs to break with drop pod
diff --git a/code/modules/cm_marines/dropship_equipment.dm b/code/modules/cm_marines/dropship_equipment.dm
index b162fb7c6a87..bd40076ea500 100644
--- a/code/modules/cm_marines/dropship_equipment.dm
+++ b/code/modules/cm_marines/dropship_equipment.dm
@@ -21,6 +21,7 @@
var/skill_required = SKILL_PILOT_TRAINED
var/combat_equipment = TRUE
+
/obj/structure/dropship_equipment/Destroy()
QDEL_NULL(ammo_equipped)
if(linked_shuttle)
@@ -35,6 +36,7 @@
linked_console = null
. = ..()
+
/obj/structure/dropship_equipment/attack_alien(mob/living/carbon/xenomorph/current_xenomorph)
if(unslashable)
return XENO_NO_DELAY_ACTION
diff --git a/code/modules/cm_marines/vehicle_part_fabricator.dm b/code/modules/cm_marines/vehicle_part_fabricator.dm
index 0095ff54a2ab..fd9b0faafa61 100644
--- a/code/modules/cm_marines/vehicle_part_fabricator.dm
+++ b/code/modules/cm_marines/vehicle_part_fabricator.dm
@@ -10,8 +10,8 @@
icon_state = "drone_fab_idle"
var/busy = FALSE
var/generate_points = TRUE
- var/valid_parts = null
- var/valid_ammo = null
+ var/omnisentry_price_scale = 100
+ var/omnisentry_price = 300
/obj/structure/machinery/part_fabricator/New()
..()
@@ -28,7 +28,8 @@
/obj/structure/machinery/part_fabricator/dropship/ui_data(mob/user)
return list(
- "points" = get_point_store()
+ "points" = get_point_store(),
+ "omnisentrygun_price" = omnisentry_price
)
/obj/structure/machinery/part_fabricator/power_change()
@@ -53,11 +54,15 @@
/obj/structure/machinery/part_fabricator/proc/build_part(part_type, cost, mob/user)
set waitfor = 0
if(stat & NOPOWER) return
+ if(ispath(part_type,/obj/structure/ship_ammo/sentry))
+ cost = omnisentry_price
if(get_point_store() < cost)
to_chat(user, SPAN_WARNING("You don't have enough points to build that."))
return
visible_message(SPAN_NOTICE("[src] starts printing something."))
spend_point_store(cost)
+ if(ispath(part_type,/obj/structure/ship_ammo/sentry))
+ omnisentry_price += omnisentry_price_scale
icon_state = "drone_fab_active"
busy = TRUE
addtimer(CALLBACK(src, PROC_REF(do_build_part), part_type), 10 SECONDS)
@@ -68,7 +73,7 @@
new part_type(get_step(src, SOUTHEAST))
icon_state = "drone_fab_idle"
-/obj/structure/machinery/part_fabricator/ui_act(action, params)
+/obj/structure/machinery/part_fabricator/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if(.)
return
@@ -77,27 +82,33 @@
to_chat(usr, SPAN_WARNING("The [name] is busy. Please wait for completion of previous operation."))
return
- if(action == "produce")
- var/produce = text2path(params["path"])
- var/cost = text2num(params["cost"])
- var/exploiting = TRUE
-
- if (valid_parts && ispath(produce, valid_parts))
- exploiting = FALSE
- else if (valid_ammo && ispath(produce, valid_ammo))
- exploiting = FALSE
+ var/mob/user = ui.user
- if (cost < 0)
- exploiting = TRUE
+ if(action == "produce")
+ var/cost = 0
+ var/is_ammo = params["is_ammo"]
+ var/index = params["index"]
+
+ if(is_ammo == 0)
+ var/obj/structure/dropship_equipment/produce = (typesof(/obj/structure/dropship_equipment))[index]
+ if(SSticker.mode && MODE_HAS_TOGGLEABLE_FLAG(MODE_NO_COMBAT_CAS) && produce.combat_equipment)
+ log_admin("Bad topic: [user] may be trying to HREF exploit [src] to bypass no combat cas")
+ return
+ cost = initial(produce.point_cost)
+ build_part(produce, cost, user)
+ return
- if (exploiting)
- log_admin("Bad topic: [usr] may be trying to HREF exploit [src] with [produce], [cost]")
+ else
+ var/obj/structure/ship_ammo/produce = (typesof(/obj/structure/ship_ammo))[index]
+ if(SSticker.mode && MODE_HAS_TOGGLEABLE_FLAG(MODE_NO_COMBAT_CAS) && produce.combat_equipment)
+ log_admin("Bad topic: [user] may be trying to HREF exploit [src] to bypass no combat cas")
+ return
+ cost = initial(produce.point_cost)
+ build_part(produce, cost, user)
return
- build_part(produce, cost, usr)
- return
else
- log_admin("Bad topic: [usr] may be trying to HREF exploit [src]")
+ log_admin("Bad topic: [user] may be trying to HREF exploit [src]")
return
/obj/structure/machinery/part_fabricator/attack_hand(mob/user)
@@ -116,12 +127,11 @@
name = "dropship part fabricator"
desc = "A large automated 3D printer for producing dropship parts. You can recycle parts or ammo in it, and get 80% of your points back, by clicking it while holding them in a powerloader claw."
req_access = list(ACCESS_MARINE_DROPSHIP)
- valid_parts = /obj/structure/dropship_equipment
- valid_ammo = /obj/structure/ship_ammo
unslashable = TRUE
unacidable = TRUE
+
/obj/structure/machinery/part_fabricator/dropship/get_point_store()
return GLOB.supply_controller.dropship_points
@@ -134,86 +144,100 @@
/obj/structure/machinery/part_fabricator/dropship/ui_static_data(mob/user)
var/list/static_data = list()
static_data["Equipment"] = list()
+ var/is_ammo = 0
+ var/index = 1
for(var/build_type in typesof(/obj/structure/dropship_equipment))
- var/obj/structure/dropship_equipment/DE = build_type
- if(SSticker.mode && MODE_HAS_TOGGLEABLE_FLAG(MODE_NO_COMBAT_CAS) && initial(DE.combat_equipment))
+ var/obj/structure/dropship_equipment/dropship_equipment_data = build_type
+ if(SSticker.mode && MODE_HAS_TOGGLEABLE_FLAG(MODE_NO_COMBAT_CAS) && dropship_equipment_data.combat_equipment)
+ index += 1
continue
- var/build_name = initial(DE.name)
- var/build_description = initial(DE.desc)
- var/build_cost = initial(DE.point_cost)
+ var/build_name = initial(dropship_equipment_data.name)
+ var/build_description = initial(dropship_equipment_data.desc)
+ var/build_cost = initial(dropship_equipment_data.point_cost)
if(build_cost)
static_data["Equipment"] += list(list(
"name" = capitalize_first_letters(build_name),
"desc" = build_description,
- "path" = build_type,
- "cost" = build_cost
+ "cost" = build_cost,
+ "index" = index,
+ "is_ammo" = is_ammo
))
+ index += 1
static_data["Ammo"] = list()
+ is_ammo = 1
+ index = 1
for(var/build_type in typesof(/obj/structure/ship_ammo))
- var/obj/structure/ship_ammo/SA = build_type
- if(SSticker.mode && MODE_HAS_TOGGLEABLE_FLAG(MODE_NO_COMBAT_CAS) && initial(SA.combat_equipment))
+ var/obj/structure/ship_ammo/ship_ammo_data = build_type
+ if(SSticker.mode && MODE_HAS_TOGGLEABLE_FLAG(MODE_NO_COMBAT_CAS) && ship_ammo_data.combat_equipment)
+ index = index + 1
continue
- var/build_name = initial(SA.name)
- var/build_description = initial(SA.desc)
- var/build_cost = initial(SA.point_cost)
+ var/build_name = initial(ship_ammo_data.name)
+ var/build_description = initial(ship_ammo_data.desc)
+ var/build_cost = initial(ship_ammo_data.point_cost)
if(build_cost)
static_data["Ammo"] += list(list(
"name" = capitalize_first_letters(build_name),
"desc" = build_description,
- "path" = build_type,
- "cost" = build_cost
+ "cost" = build_cost,
+ "index" = index,
+ "is_ammo" = is_ammo
))
+ index += 1
return static_data
/obj/structure/machinery/part_fabricator/dropship/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/powerloader_clamp))
- var/obj/item/powerloader_clamp/PC = I
- recycle_equipment(PC, user)
+ var/obj/item/powerloader_clamp/powerloader_clamp_used = I
+ recycle_equipment(powerloader_clamp_used, user)
return
return ..()
-/obj/structure/machinery/part_fabricator/dropship/proc/recycle_equipment(obj/item/powerloader_clamp/PC, mob/living/user)
- if(!PC.loaded)
- to_chat(user, SPAN_WARNING("There is nothing loaded in \the [PC]."))
+/obj/structure/machinery/part_fabricator/dropship/proc/recycle_equipment(obj/item/powerloader_clamp/powerloader_clamp_used, mob/living/user)
+ if(!powerloader_clamp_used.loaded)
+ to_chat(user, SPAN_WARNING("There is nothing loaded in \the [powerloader_clamp_used]."))
return
var/recycle_points
- if(istype(PC.loaded, /obj/structure/dropship_equipment))
- var/obj/structure/dropship_equipment/SE = PC.loaded
- recycle_points = SE.point_cost
- else if(istype(PC.loaded, /obj/structure/ship_ammo))
- var/obj/structure/ship_ammo/SE = PC.loaded
- if(!SE.ammo_count)
- to_chat(user, SPAN_WARNING("\The [SE] is empty!"))
+ if(istype(powerloader_clamp_used.loaded, /obj/structure/dropship_equipment))
+ var/obj/structure/dropship_equipment/sold_eqipment = powerloader_clamp_used.loaded
+ recycle_points = sold_eqipment.point_cost
+ else if(istype(powerloader_clamp_used.loaded, /obj/structure/ship_ammo))
+ var/obj/structure/ship_ammo/sold_eqipment = powerloader_clamp_used.loaded
+ if(!sold_eqipment.ammo_count)
+ to_chat(user, SPAN_WARNING("\The [sold_eqipment] is empty!"))
return
- if(SE.ammo_count != SE.max_ammo_count)
- recycle_points = (SE.point_cost * (SE.ammo_count / SE.max_ammo_count))
- to_chat(user, SPAN_WARNING("\The [SE] is not fully loaded, and less points will be able to be refunded."))
+ if(sold_eqipment.ammo_count != sold_eqipment.max_ammo_count)
+ recycle_points = (sold_eqipment.point_cost * (sold_eqipment.ammo_count / sold_eqipment.max_ammo_count))
+ to_chat(user, SPAN_WARNING("\The [sold_eqipment] is not fully loaded, and less points will be able to be refunded."))
else
- recycle_points = SE.point_cost
+ recycle_points = sold_eqipment.point_cost
+ if(istype(powerloader_clamp_used.loaded, /obj/structure/ship_ammo/sentry))
+ recycle_points = omnisentry_price - omnisentry_price_scale
if(!recycle_points)
- to_chat(user, SPAN_WARNING("\The [PC.loaded] can't be recycled!"))
+ to_chat(user, SPAN_WARNING("\The [powerloader_clamp_used.loaded] can't be recycled!"))
return
- var/thing_to_recycle = PC.loaded
- to_chat(user, SPAN_WARNING("You start recycling \the [PC.loaded]!"))
+ var/thing_to_recycle = powerloader_clamp_used.loaded
+ to_chat(user, SPAN_WARNING("You start recycling \the [powerloader_clamp_used.loaded]!"))
playsound(loc, 'sound/machines/hydraulics_1.ogg', 40, 1)
- if(!user || !do_after(user, (7 SECONDS) * user.get_skill_duration_multiplier(SKILL_ENGINEER), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE, PC.loaded, INTERRUPT_ALL))
+ if(!user || !do_after(user, (7 SECONDS) * user.get_skill_duration_multiplier(SKILL_ENGINEER), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE, powerloader_clamp_used.loaded, INTERRUPT_ALL))
to_chat(user, SPAN_NOTICE("You stop recycling \the [thing_to_recycle]."))
return
- for(var/obj/thing as anything in PC.loaded)
+ if(istype(powerloader_clamp_used.loaded, /obj/structure/ship_ammo/sentry))
+ omnisentry_price -= omnisentry_price_scale
+ for(var/obj/thing as anything in powerloader_clamp_used.loaded)
thing.forceMove(loc) // no sentries popping out when we qdel please
qdel(thing)
- qdel(PC.loaded)
- PC.loaded = null
+ qdel(powerloader_clamp_used.loaded)
+ powerloader_clamp_used.loaded = null
to_chat(user, SPAN_NOTICE("You recycle \the [thing_to_recycle] into [src], and get back [round(recycle_points * 0.8)] points."))
msg_admin_niche("[key_name(user)] recycled a [thing_to_recycle] into \the [src] for [round(recycle_points * 0.8)] points.")
add_to_point_store(round(recycle_points * 0.8))
playsound(loc, 'sound/machines/fax.ogg', 40, 1)
- PC.update_icon()
+ powerloader_clamp_used.update_icon()
// WARNING: IF YOU DECIDE TO READD THIS, GIVE THE HARDPOINTS POINT COSTS
@@ -223,8 +247,6 @@
desc = "A large automated 3D printer for producing vehicle parts."
req_access = list(ACCESS_MARINE_CREWMAN)
generate_points = FALSE
- valid_parts = /obj/item/hardpoint
- valid_ammo = /obj/item/ammo_magazine/hardpoint
unacidable = TRUE
indestructible = TRUE
@@ -242,9 +264,9 @@
var/list/static_data = list()
static_data["Equipment"] = list()
for(var/build_type in typesof(/obj/item/hardpoint))
- var/obj/item/hardpoint/TE = build_type
- var/build_name = initial(TE.name)
- var/build_description = initial(TE.desc)
+ var/obj/item/hardpoint/hardpoint_data = build_type
+ var/build_name = initial(hardpoint_data.name)
+ var/build_description = initial(hardpoint_data.desc)
var/build_cost = 0
if(build_cost)
static_data["Equipment"] += list(list(
@@ -256,9 +278,9 @@
static_data["Ammo"] = list()
for(var/build_type in typesof(/obj/item/ammo_magazine/hardpoint))
- var/obj/item/ammo_magazine/hardpoint/TA = build_type
- var/build_name = initial(TA.name)
- var/build_description = initial(TA.desc)
+ var/obj/item/ammo_magazine/hardpoint/ammo_data = build_type
+ var/build_name = initial(ammo_data.name)
+ var/build_description = initial(ammo_data.desc)
var/build_cost = 0
if(build_cost)
static_data["Ammo"] += list(list(
diff --git a/code/modules/defenses/bell_tower.dm b/code/modules/defenses/bell_tower.dm
index 6939557342f0..b4741734e0f4 100644
--- a/code/modules/defenses/bell_tower.dm
+++ b/code/modules/defenses/bell_tower.dm
@@ -18,11 +18,11 @@
can_be_near_defense = TRUE
choice_categories = list(
- SENTRY_CATEGORY_IFF = list(FACTION_USCM, FACTION_WEYLAND, FACTION_HUMAN),
+ SENTRY_CATEGORY_IFF = list(FACTION_MARINE, FACTION_WEYLAND, FACTION_HUMAN),
)
selected_categories = list(
- SENTRY_CATEGORY_IFF = FACTION_USCM,
+ SENTRY_CATEGORY_IFF = FACTION_MARINE,
)
diff --git a/code/modules/defenses/defenses.dm b/code/modules/defenses/defenses.dm
index fefd3c640c65..aedbad2d46e9 100644
--- a/code/modules/defenses/defenses.dm
+++ b/code/modules/defenses/defenses.dm
@@ -134,7 +134,7 @@
*/
/obj/structure/machinery/defenses/proc/handle_iff(selection)
switch(selection)
- if(FACTION_USCM)
+ if(FACTION_MARINE)
faction_group = FACTION_LIST_MARINE
if(FACTION_WEYLAND)
faction_group = FACTION_LIST_MARINE_WY
diff --git a/code/modules/defenses/planted_flag.dm b/code/modules/defenses/planted_flag.dm
index fac725047fa9..12bcab9b0475 100644
--- a/code/modules/defenses/planted_flag.dm
+++ b/code/modules/defenses/planted_flag.dm
@@ -16,11 +16,11 @@
can_be_near_defense = TRUE
choice_categories = list(
- SENTRY_CATEGORY_IFF = list(FACTION_USCM, FACTION_WEYLAND, FACTION_HUMAN),
+ SENTRY_CATEGORY_IFF = list(FACTION_MARINE, FACTION_WEYLAND, FACTION_HUMAN),
)
selected_categories = list(
- SENTRY_CATEGORY_IFF = FACTION_USCM,
+ SENTRY_CATEGORY_IFF = FACTION_MARINE,
)
diff --git a/code/modules/defenses/sentry.dm b/code/modules/defenses/sentry.dm
index bfb44a38a6a5..a02e4e7808c9 100644
--- a/code/modules/defenses/sentry.dm
+++ b/code/modules/defenses/sentry.dm
@@ -45,12 +45,12 @@
/// action list is configurable for all subtypes, this is just an example
choice_categories = list(
// SENTRY_CATEGORY_ROF = list(ROF_SINGLE, ROF_BURST, ROF_FULL_AUTO),
- SENTRY_CATEGORY_IFF = list(FACTION_USCM, FACTION_WEYLAND, FACTION_HUMAN),
+ SENTRY_CATEGORY_IFF = list(FACTION_MARINE, FACTION_WEYLAND, FACTION_HUMAN),
)
selected_categories = list(
// SENTRY_CATEGORY_ROF = ROF_SINGLE,
- SENTRY_CATEGORY_IFF = FACTION_USCM,
+ SENTRY_CATEGORY_IFF = FACTION_MARINE,
)
/obj/structure/machinery/defenses/sentry/Initialize()
@@ -478,7 +478,7 @@
/obj/structure/machinery/defenses/sentry/premade/Initialize()
. = ..()
if(selected_categories[SENTRY_CATEGORY_IFF])
- selected_categories[SENTRY_CATEGORY_IFF] = FACTION_USCM
+ selected_categories[SENTRY_CATEGORY_IFF] = FACTION_MARINE
/obj/structure/machinery/defenses/sentry/premade/get_examine_text(mob/user)
. = ..()
@@ -562,11 +562,11 @@
handheld_type = /obj/item/defenses/handheld/sentry/dmr
choice_categories = list(
- SENTRY_CATEGORY_IFF = list(FACTION_USCM, FACTION_WEYLAND, FACTION_HUMAN),
+ SENTRY_CATEGORY_IFF = list(FACTION_MARINE, FACTION_WEYLAND, FACTION_HUMAN),
)
selected_categories = list(
- SENTRY_CATEGORY_IFF = FACTION_USCM,
+ SENTRY_CATEGORY_IFF = FACTION_MARINE,
)
diff --git a/code/modules/defenses/sentry_flamer.dm b/code/modules/defenses/sentry_flamer.dm
index 9ae794e3c811..f884b4ec5d14 100644
--- a/code/modules/defenses/sentry_flamer.dm
+++ b/code/modules/defenses/sentry_flamer.dm
@@ -11,12 +11,12 @@
choice_categories = list(
// SENTRY_CATEGORY_ROF = list(ROF_SINGLE, ROF_FULL_AUTO),
- SENTRY_CATEGORY_IFF = list(FACTION_USCM, FACTION_WEYLAND, FACTION_HUMAN),
+ SENTRY_CATEGORY_IFF = list(FACTION_MARINE, FACTION_WEYLAND, FACTION_HUMAN),
)
selected_categories = list(
SENTRY_CATEGORY_ROF = ROF_SINGLE,
- SENTRY_CATEGORY_IFF = FACTION_USCM,
+ SENTRY_CATEGORY_IFF = FACTION_MARINE,
)
/obj/structure/machinery/defenses/sentry/flamer/handle_rof(level)
diff --git a/code/modules/defenses/tesla_coil.dm b/code/modules/defenses/tesla_coil.dm
index 4c0888e28f6d..cb0646b29775 100644
--- a/code/modules/defenses/tesla_coil.dm
+++ b/code/modules/defenses/tesla_coil.dm
@@ -20,11 +20,11 @@
has_camera = FALSE
choice_categories = list(
- SENTRY_CATEGORY_IFF = list(FACTION_USCM, FACTION_WEYLAND, FACTION_HUMAN),
+ SENTRY_CATEGORY_IFF = list(FACTION_MARINE, FACTION_WEYLAND, FACTION_HUMAN),
)
selected_categories = list(
- SENTRY_CATEGORY_IFF = FACTION_USCM,
+ SENTRY_CATEGORY_IFF = FACTION_MARINE,
)
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/gear_presets/clf.dm b/code/modules/gear_presets/clf.dm
index d9833f0cc038..392cb63646f6 100644
--- a/code/modules/gear_presets/clf.dm
+++ b/code/modules/gear_presets/clf.dm
@@ -745,35 +745,42 @@
/datum/equipment_preset/clf/synth/load_race(mob/living/carbon/human/new_human)
new_human.set_species(SYNTH_COLONY_GEN_ONE)
-/datum/equipment_preset/clf/synth/load_gear(mob/living/carbon/human/new_human)
- var/obj/item/clothing/under/colonist/clf/CLF = new()
- var/obj/item/clothing/accessory/storage/webbing/W = new()
- CLF.attach_accessory(new_human, W)
- new_human.equip_to_slot_or_del(CLF, WEAR_BODY)
+/datum/equipment_preset/clf/synth/load_skills(mob/living/carbon/human/new_human)
+ new_human.allow_gun_usage = FALSE
+/datum/equipment_preset/clf/synth/load_gear(mob/living/carbon/human/new_human)
+ //back
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/engineerpack/ert, WEAR_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat, WEAR_HANDS)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat, WEAR_FEET)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/militia, WEAR_JACKET)
- new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/full/with_suture_and_graft, WEAR_WAIST)
- new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(new_human), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic, WEAR_IN_BACK)
-
- spawn_weapon(/obj/item/weapon/gun/rifle/mar40/carbine, /obj/item/ammo_magazine/rifle/mar40/extended, new_human, 0, 10)
-
new_human.equip_to_slot_or_del(new /obj/item/roller, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/attachable/bayonet/upp, WEAR_FACE)
- new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/CLF/command(new_human), WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/tools/synth, WEAR_L_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/construction/full_barbed_wire, WEAR_R_STORE)
+ //face
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/CLF/command(new_human), WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/attachable/bayonet/upp, WEAR_FACE)
if(new_human.disabilities & NEARSIGHTED)
new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/prescription(new_human), WEAR_EYES)
else
new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(new_human), WEAR_EYES)
+ //head
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/jan, WEAR_HEAD)
+ //body
+ var/obj/item/clothing/under/colonist/clf/CLF = new()
+ var/obj/item/clothing/accessory/storage/webbing/webbing = new()
+ CLF.attach_accessory(new_human, webbing)
+ new_human.equip_to_slot_or_del(CLF, WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/militia, WEAR_JACKET)
+ //waist
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/full/with_suture_and_graft, WEAR_WAIST)
+ new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(new_human), WEAR_IN_BELT)
+ //limbs
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat, WEAR_HANDS)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat, WEAR_FEET)
+ //pockets
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/tools/synth, WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/construction/full_barbed_wire, WEAR_R_STORE)
/datum/equipment_preset/clf/synth/get_antag_clothing_equipment()
return list(
diff --git a/code/modules/gear_presets/cmb.dm b/code/modules/gear_presets/cmb.dm
index ae6544fa3d63..7bf6cbb8325d 100644
--- a/code/modules/gear_presets/cmb.dm
+++ b/code/modules/gear_presets/cmb.dm
@@ -51,7 +51,7 @@
var/obj/item/clothing/under/uniform = new_human.w_uniform
if(istype(uniform))
uniform.has_sensor = UNIFORM_HAS_SENSORS
- uniform.sensor_faction = FACTION_USCM
+ uniform.sensor_faction = FACTION_MARINE
return ..()
//*****************************************************************************************************/
@@ -162,7 +162,7 @@
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/cmb/normalpoint, WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/holobadge/cord, WEAR_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar, WEAR_FACE)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/CMB, WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/CMB/marshal, WEAR_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range, WEAR_IN_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/weapon/telebaton, WEAR_IN_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/pump/dual_tube/cmb/m3717, WEAR_J_STORE)
diff --git a/code/modules/gear_presets/corpses.dm b/code/modules/gear_presets/corpses.dm
index cfec62a3c65b..cbe8bc0abce4 100644
--- a/code/modules/gear_presets/corpses.dm
+++ b/code/modules/gear_presets/corpses.dm
@@ -988,7 +988,7 @@
paygrade = PAY_SHORT_ME5
idtype = /obj/item/card/id/dogtag
role_comm_title = "FORECON"
- faction_group = list(FACTION_USCM, FACTION_SURVIVOR)
+ faction_group = list(FACTION_MARINE, FACTION_SURVIVOR)
access = list(
ACCESS_CIVILIAN_PUBLIC,
ACCESS_CIVILIAN_ENGINEERING,
diff --git a/code/modules/gear_presets/royal_marines.dm b/code/modules/gear_presets/royal_marines.dm
index b916a52c4b6f..aa33eac97733 100644
--- a/code/modules/gear_presets/royal_marines.dm
+++ b/code/modules/gear_presets/royal_marines.dm
@@ -1,7 +1,7 @@
/datum/equipment_preset/twe
name = "Three World Empire"
faction = FACTION_TWE
- faction_group = list(FACTION_TWE, FACTION_USCM)
+ faction_group = list(FACTION_TWE, FACTION_MARINE)
languages = list(LANGUAGE_ENGLISH, LANGUAGE_JAPANESE)
/datum/equipment_preset/twe/royal_marine/load_name(mob/living/carbon/human/new_human, randomise)
diff --git a/code/modules/gear_presets/survivors/lv_522/forcon_survivors.dm b/code/modules/gear_presets/survivors/lv_522/forcon_survivors.dm
index 34cbc8e0ab9c..c4e08af9dcfa 100644
--- a/code/modules/gear_presets/survivors/lv_522/forcon_survivors.dm
+++ b/code/modules/gear_presets/survivors/lv_522/forcon_survivors.dm
@@ -5,7 +5,7 @@
idtype = /obj/item/card/id/dogtag
role_comm_title = "FORECON"
rank = JOB_SURVIVOR
- faction_group = list(FACTION_USCM, FACTION_SURVIVOR)
+ faction_group = list(FACTION_MARINE, FACTION_SURVIVOR)
flags = EQUIPMENT_PRESET_START_OF_ROUND
access = list(
ACCESS_CIVILIAN_PUBLIC,
diff --git a/code/modules/gear_presets/survivors/shivas_snowball/panic_room_insert_shivas.dm b/code/modules/gear_presets/survivors/shivas_snowball/panic_room_insert_shivas.dm
new file mode 100644
index 000000000000..9f1e2c705efb
--- /dev/null
+++ b/code/modules/gear_presets/survivors/shivas_snowball/panic_room_insert_shivas.dm
@@ -0,0 +1,43 @@
+// /obj/effect/landmark/survivor_spawner/shivas_assistant_manager
+// panic_room_insert_shivas.dmm
+
+/datum/equipment_preset/survivor/wy/asstmanager
+ name = "Survivor - Corporate Assistant Manager"
+ flags = EQUIPMENT_PRESET_EXTRA
+ paygrade = PAY_SHORT_WYC7
+ skills = /datum/skills/civilian/survivor/manager
+ assignment = "Assistant Operations Manager"
+ idtype = /obj/item/card/id/silver/clearance_badge/manager
+ faction_group = list(FACTION_WY, FACTION_SURVIVOR)
+ access = list(
+ ACCESS_WY_GENERAL,
+ ACCESS_WY_COLONIAL,
+ ACCESS_WY_MEDICAL,
+ ACCESS_WY_SECURITY,
+ ACCESS_WY_RESEARCH,
+ ACCESS_WY_ARMORY,
+ ACCESS_CIVILIAN_PUBLIC,
+ ACCESS_CIVILIAN_RESEARCH,
+ ACCESS_CIVILIAN_ENGINEERING,
+ ACCESS_CIVILIAN_LOGISTICS,
+ ACCESS_CIVILIAN_BRIG,
+ ACCESS_CIVILIAN_MEDBAY,
+ ACCESS_CIVILIAN_COMMAND,
+ )
+ languages = list(LANGUAGE_ENGLISH, LANGUAGE_JAPANESE)
+
+ survivor_variant = CORPORATE_SURVIVOR
+
+/datum/equipment_preset/survivor/wy/asstmanager/load_gear(mob/living/carbon/human/new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/manager(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/lockable/liaison, WEAR_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/glass/beaker/vial/random/good(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/paper/research_notes/grant, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/snow_suit/survivor/parka/navy(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/WY, WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/rebreather/scarf(new_human), WEAR_FACE)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife, WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_R_STORE)
+ add_survivor_weapon_civilian(new_human)
+ ..()
diff --git a/code/modules/gear_presets/survivors/solaris/preset_solaris.dm b/code/modules/gear_presets/survivors/solaris/preset_solaris.dm
index 91dd05ef8154..2d0f634a6948 100644
--- a/code/modules/gear_presets/survivors/solaris/preset_solaris.dm
+++ b/code/modules/gear_presets/survivors/solaris/preset_solaris.dm
@@ -6,7 +6,7 @@
/datum/equipment_preset/survivor/trucker/solaris/load_gear(mob/living/carbon/human/new_human)
new_human.equip_to_slot_or_del(new /obj/item/clothing/under/rank/worker_overalls(new_human), WEAR_BODY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/apron/overalls(new_human), WEAR_JACKET)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/head/soft/red(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/soft/trucker/red(new_human), WEAR_HEAD)
new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/big(new_human), WEAR_EYES)
..()
diff --git a/code/modules/gear_presets/survivors/survivors.dm b/code/modules/gear_presets/survivors/survivors.dm
index 9240d1782912..0cecaccce43d 100644
--- a/code/modules/gear_presets/survivors/survivors.dm
+++ b/code/modules/gear_presets/survivors/survivors.dm
@@ -301,6 +301,7 @@ Everything bellow is a parent used as a base for one or multiple maps.
skills = /datum/skills/civilian/survivor
flags = EQUIPMENT_PRESET_START_OF_ROUND
paygrade = PAY_SHORT_WYC2
+ faction_group = FACTION_LIST_SURVIVOR_WY
idtype = /obj/item/card/id/silver/clearance_badge/cl
access = list(
ACCESS_CIVILIAN_PUBLIC,
@@ -381,7 +382,7 @@ Everything bellow is a parent used as a base for one or multiple maps.
access = list(ACCESS_CIVILIAN_PUBLIC,ACCESS_CIVILIAN_LOGISTICS,ACCESS_WY_FLIGHT)
/datum/equipment_preset/survivor/flight_control_operator/load_gear(mob/living/carbon/human/new_human)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/bluesuit(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/colonist/workwear/khaki(new_human), WEAR_BODY)
if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD])
add_ice_colony_survivor_equipment(new_human)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/windbreaker/windbreaker_brown(new_human), WEAR_JACKET)
@@ -425,10 +426,11 @@ Everything bellow is a parent used as a base for one or multiple maps.
name = "Survivor - Interstellar Commerce Commission Liaison"
assignment = "Interstellar Commerce Commission Corporate Liaison"
skills = /datum/skills/civilian/survivor
- idtype = /obj/item/card/id/silver/cl
+ flags = EQUIPMENT_PRESET_START_OF_ROUND
paygrade = PAY_SHORT_ICCL
+ faction_group = FACTION_LIST_SURVIVOR_WY
+ idtype = /obj/item/card/id/silver/cl
role_comm_title = "ICC Rep."
- flags = EQUIPMENT_PRESET_START_OF_ROUND
survivor_variant = CORPORATE_SURVIVOR
diff --git a/code/modules/gear_presets/survivors/trijent/preset_trijent.dm b/code/modules/gear_presets/survivors/trijent/preset_trijent.dm
index f62010539d77..405496d8f496 100644
--- a/code/modules/gear_presets/survivors/trijent/preset_trijent.dm
+++ b/code/modules/gear_presets/survivors/trijent/preset_trijent.dm
@@ -64,7 +64,7 @@
new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(new_human), WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(new_human), WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/eng(new_human), WEAR_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/soft/trucker(new_human), WEAR_HEAD)
new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/hugetank(new_human), WEAR_IN_BACK)
..()
diff --git a/code/modules/gear_presets/upp.dm b/code/modules/gear_presets/upp.dm
index c94d7d47843d..74bd9d8483fb 100644
--- a/code/modules/gear_presets/upp.dm
+++ b/code/modules/gear_presets/upp.dm
@@ -2590,7 +2590,7 @@
//*****************************************************************************************************/
/datum/equipment_preset/upp/synth
- name = "UPP Combat Synthetic"
+ name = "UPP Synthetic"
flags = EQUIPMENT_PRESET_EXTRA
languages = ALL_SYNTH_LANGUAGES_UPP
@@ -2637,6 +2637,9 @@
/datum/equipment_preset/upp/synth/load_race(mob/living/carbon/human/new_human)
new_human.set_species(SYNTH_GEN_THREE)
+/datum/equipment_preset/upp/synth/load_skills(mob/living/carbon/human/new_human)
+ new_human.allow_gun_usage = FALSE
+
/datum/equipment_preset/upp/synth/load_gear(mob/living/carbon/human/new_human)
//back
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/upp, WEAR_BACK)
@@ -2657,22 +2660,18 @@
new_human.equip_to_slot_or_del(new hat, WEAR_HEAD)
//body
var/obj/item/clothing/under/marine/veteran/UPP/medic/UPP = new()
- var/obj/item/clothing/accessory/storage/tool_webbing/equipped/W = new()
- UPP.attach_accessory(new_human, W)
+ var/obj/item/clothing/accessory/storage/tool_webbing/equipped/webbing = new()
+ UPP.attach_accessory(new_human, webbing)
new_human.equip_to_slot_or_del(UPP, WEAR_BODY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/support, WEAR_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/glass/bottle/tricordrazine, WEAR_IN_JACKET)
- new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/bizon/upp, WEAR_J_STORE)
//waist
new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/upp/full, WEAR_WAIST)
//limbs
new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/upp, WEAR_HANDS)
- //póckets
- var/obj/item/storage/pouch/magazine/large/ppouch = new()
- new_human.equip_to_slot_or_del(ppouch, WEAR_R_STORE)
- for(var/i = 1 to ppouch.storage_slots)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/bizon, WEAR_IN_R_STORE)
+ //pockets
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/medical/full/pills, WEAR_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/medical, WEAR_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/surgical_line, WEAR_IN_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft, WEAR_IN_L_STORE)
diff --git a/code/modules/gear_presets/uscm_ship.dm b/code/modules/gear_presets/uscm_ship.dm
index 578df21b67df..3651b83cc209 100644
--- a/code/modules/gear_presets/uscm_ship.dm
+++ b/code/modules/gear_presets/uscm_ship.dm
@@ -26,6 +26,7 @@
/datum/equipment_preset/uscm_ship/liaison
name = "USCM Corporate Liaison (CL)"
+ faction_group = FACTION_LIST_MARINE_WY
flags = EQUIPMENT_PRESET_START_OF_ROUND
idtype = /obj/item/card/id/silver/cl
@@ -128,18 +129,17 @@
minimap_background = MINIMAP_ICON_BACKGROUND_CIVILIAN
/datum/equipment_preset/uscm_ship/reporter/load_gear(mob/living/carbon/human/new_human)
- var/back_item = /obj/item/storage/backpack/satchel
-
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/reporter(new_human), WEAR_L_EAR)
new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/reporter(new_human), WEAR_BODY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/jacket/marine/reporter(new_human), WEAR_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(new_human), WEAR_FEET)
- new_human.equip_to_slot_or_del(new back_item(new_human), WEAR_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/camera(new_human), WEAR_L_HAND)
- new_human.equip_to_slot_or_del(new /obj/item/device/camera_film(new_human), WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/binoculars(new_human), WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/taperecorder(new_human), WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/notepad(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large(new_human), WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/device/camera(new_human), WEAR_WAIST)
+
+/datum/equipment_preset/uscm_ship/reporter/load_preset(mob/living/carbon/human/new_human, randomise, count_participant, client/mob_client, show_job_gear)
+ . = ..()
+ new_human.marine_buyable_categories[CIVILIAN_CAN_BUY_BACKPACK] = 1
+ new_human.marine_buyable_categories[CIVILIAN_CAN_BUY_UTILITY] = 1
/datum/equipment_preset/uscm_ship/reporter_uscm
name = "Combat Correspondent"
@@ -178,10 +178,6 @@
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/medium(new_human), WEAR_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/device/camera(new_human), WEAR_L_HAND)
- new_human.equip_to_slot_or_del(new /obj/item/device/camera_film(new_human), WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/binoculars(new_human), WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/taperecorder(new_human), WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/notepad(new_human), WEAR_IN_BACK)
//*****************************************************************************************************/
@@ -252,17 +248,9 @@
if (new_human.client && new_human.client.prefs && (new_human.client.prefs.backbag == 1))
back_item = /obj/item/storage/backpack/marine/tech
- new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/mt(new_human), WEAR_L_EAR)
new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/officer/engi(new_human), WEAR_BODY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine(new_human), WEAR_FEET)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow(new_human), WEAR_HANDS)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/head/welding(new_human), WEAR_HEAD)
- new_human.equip_to_slot_or_del(new /obj/item/storage/belt/utility/full(new_human), WEAR_WAIST)
new_human.equip_to_slot_or_del(new back_item(new_human), WEAR_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/medium(new_human), WEAR_R_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/device/demo_scanner(new_human), WEAR_L_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/storage/bag/trash(new_human), WEAR_L_HAND)
- new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/engineerpack/welder_chestrig, (new_human), WEAR_R_HAND)
/datum/equipment_preset/uscm_ship/maint/load_rank(mob/living/carbon/human/new_human)
if(new_human.client)
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/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index da17bf8a15f0..563d0f4107e9 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -541,7 +541,7 @@
if(med_hud.hudusers[passed_human])
return TRUE
if("squadleader")
- var/datum/mob_hud/faction_hud = GLOB.huds[MOB_HUD_FACTION_USCM]
+ var/datum/mob_hud/faction_hud = GLOB.huds[MOB_HUD_FACTION_MARINE]
if(passed_human.mind && passed_human.assigned_squad && passed_human.assigned_squad.squad_leader == passed_human && faction_hud.hudusers[passed_mob])
return TRUE
else
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 5cb439721ce6..1d56b7db2728 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -88,7 +88,7 @@
attack = attacking_mob.species.secondary_unarmed
return
- last_damage_data = create_cause_data("fisticuffs", src)
+ last_damage_data = create_cause_data("fisticuffs", attacking_mob)
attacking_mob.attack_log += text("\[[time_stamp()]\] [pick(attack.attack_verb)]ed [key_name(src)]")
attack_log += text("\[[time_stamp()]\] Has been [pick(attack.attack_verb)]ed by [key_name(attacking_mob)]")
msg_admin_attack("[key_name(attacking_mob)] [pick(attack.attack_verb)]ed [key_name(src)] in [get_area(src)] ([src.loc.x],[src.loc.y],[src.loc.z]).", src.loc.x, src.loc.y, src.loc.z)
diff --git a/code/modules/mob/living/carbon/human/species/zombie.dm b/code/modules/mob/living/carbon/human/species/zombie.dm
index f5db0c1b8728..4e8a0b5e98e2 100644
--- a/code/modules/mob/living/carbon/human/species/zombie.dm
+++ b/code/modules/mob/living/carbon/human/species/zombie.dm
@@ -62,7 +62,7 @@
var/datum/disease/black_goo/zombie_infection = locate() in zombie.viruses
if(!zombie_infection)
zombie_infection = zombie.AddDisease(new /datum/disease/black_goo())
- zombie_infection.stage = 3
+ zombie_infection.stage = 4
var/datum/mob_hud/Hu = GLOB.huds[MOB_HUD_MEDICAL_OBSERVER]
Hu.add_hud_to(zombie, zombie)
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/living/carbon/xenomorph/abilities/lesser_drone/lesser_drone_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/lesser_drone/lesser_drone_powers.dm
index 3c6b39f146be..0f72bf4d81c7 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/lesser_drone/lesser_drone_powers.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/lesser_drone/lesser_drone_powers.dm
@@ -1,6 +1,6 @@
/datum/action/xeno_action/onclick/plant_weeds/lesser/use_ability(atom/A)
if(!(locate(/obj/effect/alien/weeds/node) in orange(4, owner)))
- to_chat(owner, SPAN_XENONOTICE("We can only plant resin nodes near other resin nodes!"))
+ to_chat(owner, SPAN_XENONOTICE("We can only plant weed nodes near other weed nodes!"))
return
. = ..()
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm
index c2fbd6b9d8c4..199df345fb62 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm
@@ -129,7 +129,7 @@
// Config
var/max_distance = 7
- var/windup = 7 DECISECONDS
+ var/windup = 8 DECISECONDS
/datum/action/xeno_action/activable/oppressor_punch
name = "Dislocate"
diff --git a/code/modules/mob/living/carbon/xenomorph/resin_constructions.dm b/code/modules/mob/living/carbon/xenomorph/resin_constructions.dm
index 793ed45bcb13..9c94be96a65a 100644
--- a/code/modules/mob/living/carbon/xenomorph/resin_constructions.dm
+++ b/code/modules/mob/living/carbon/xenomorph/resin_constructions.dm
@@ -341,11 +341,11 @@ GLOBAL_VAR_INIT(resin_lz_allowed, FALSE)
construction_name = "thick resin membrane"
build_path = /obj/structure/alien/movable_wall/membrane/thick
-// Remote Resin Nodes for originally coded for Resin Whisperers
+// Remote Weed Nodes for originally coded for Resin Whisperers
/datum/resin_construction/resin_obj/resin_node
- name = "Resin Node"
+ name = "Weed Node"
desc = "Channel energy to spread our influence."
- construction_name = "resin node"
+ construction_name = "weed node"
cost = (XENO_RESIN_MEMBRANE_THICK_COST * 2) // 3x the cost of a thick membrane. At the time of coding that is 95*2 = 190
build_path = /obj/effect/alien/weeds/node
diff --git a/code/modules/mob/living/carbon/xenomorph/strains/castes/hivelord/resin_whisperer.dm b/code/modules/mob/living/carbon/xenomorph/strains/castes/hivelord/resin_whisperer.dm
index a6c493f3ada0..cf1cafde9267 100644
--- a/code/modules/mob/living/carbon/xenomorph/strains/castes/hivelord/resin_whisperer.dm
+++ b/code/modules/mob/living/carbon/xenomorph/strains/castes/hivelord/resin_whisperer.dm
@@ -1,6 +1,6 @@
/datum/xeno_strain/resin_whisperer
name = HIVELORD_RESIN_WHISPERER
- description = "You lose your corrosive acid, your ability to secrete thick resin, your ability to reinforce resin secretions, sacrifice your ability to plant resin nodes outside of weeds, and you sacrifice a fifth of your plasma reserves to enhance your vision and gain a stronger connection to the resin. You can now remotely place resin secretions including resin nodes up to a distance of twelve paces!"
+ description = "You lose your corrosive acid, your ability to secrete thick resin, your ability to reinforce resin secretions, sacrifice your ability to plant weed nodes outside of weeds, and you sacrifice a fifth of your plasma reserves to enhance your vision and gain a stronger connection to the resin. You can now remotely place resin secretions including weed nodes up to a distance of twelve paces!"
flavor_description = "Let the resin guide you. It whispers, so listen closely."
icon_state_prefix = "Resin Whisperer"
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index b47860806e5c..02c1baa48c28 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -145,7 +145,7 @@
H = GLOB.huds[MOB_HUD_SECURITY_ADVANCED]
HUD_nbr = 2
if("Squad HUD")
- H = GLOB.huds[MOB_HUD_FACTION_USCM]
+ H = GLOB.huds[MOB_HUD_FACTION_MARINE]
HUD_nbr = 3
else
return
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/nightmare/nmnodes/mapload.dm b/code/modules/nightmare/nmnodes/mapload.dm
index 4b9ae2a3014b..0687399a6612 100644
--- a/code/modules/nightmare/nmnodes/mapload.dm
+++ b/code/modules/nightmare/nmnodes/mapload.dm
@@ -94,7 +94,7 @@
. = ..()
if(!.) return
var/dir_path = context.get_file_path(filepath, "map")
- var/regex/matcher = new(@"^([0-9]+)([\.\+])([^_]+)(_.*)?\.dmm$", "i")
+ var/regex/matcher = new(@"^([0-9]+)([\.\+])(([^_]+)(_.*))?\.dmm$", "i")
var/list/dircontents = flist(dir_path)
for(var/filename in dircontents)
if(!matcher.Find(filename))
diff --git a/code/modules/nightmare/nmtasks/mapload.dm b/code/modules/nightmare/nmtasks/mapload.dm
index d53b5663197d..a49bbbabdde5 100644
--- a/code/modules/nightmare/nmtasks/mapload.dm
+++ b/code/modules/nightmare/nmtasks/mapload.dm
@@ -34,16 +34,13 @@
/datum/nmtask/mapload/proc/step_parse()
. = TRUE
if(!fexists(filepath))
- log_debug("Nightmare Mapload: File does not exist: [filepath]")
- return
+ CRASH("Nightmare Mapload: File does not exist: [filepath]")
if(!parsed)
parsed = new(file(filepath))
if(!parsed?.bounds)
- log_debug("Nightmare Mapload: File loading failed: [filepath]")
- return
+ CRASH("Nightmare Mapload: File loading failed: [filepath]")
if(isnull(parsed.bounds[1]))
- log_debug("Nightmare Mapload: Map parsing failed: [filepath]")
- return
+ CRASH("Nightmare Mapload: Map parsing failed: [filepath]")
return FALSE
/datum/nmtask/mapload/proc/step_loadmap(list/statsmap)
@@ -51,19 +48,21 @@
UNTIL(!Master.map_loading)
target_turf = GLOB.nightmare_landmarks[landmark]
if(!target_turf?.z)
- log_debug("Nightmare Mapload: Could not find landmark: [landmark]")
- return
+ if(landmark in GLOB.nightmare_landmark_tags_removed)
+ log_debug("Nightmare Mapload: Could not find landmark: [landmark] because it was deleted")
+ return
+ else
+ CRASH("Nightmare Mapload: Could not find landmark: [landmark]")
var/result = parsed.load(target_turf.x, target_turf.y, target_turf.z, crop_map = TRUE, no_changeturf = FALSE, place_on_top = FALSE, delete = replace)
if(!result || !parsed.bounds)
- log_debug("Nightmare Mapload: Map insertion failed unexpectedly for file: [filepath]")
- return
+ CRASH("Nightmare Mapload: Map insertion failed unexpectedly for file: [filepath]")
return FALSE
/datum/nmtask/mapload/proc/step_init(list/statsmap)
if(initialize_boundary_contents())
log_debug("Nightmare Mapload: Loaded '[filepath]' at '[landmark]' ([target_turf.x], [target_turf.y], [target_turf.z])")
return FALSE
- log_debug("Nightmare Mapload: Loaded map file but could not initialize: '[filepath]' at ([target_turf.x], [target_turf.y], [target_turf.z])")
+ stack_trace("Nightmare Mapload: Loaded map file but could not initialize: '[filepath]' at ([target_turf.x], [target_turf.y], [target_turf.z])")
return TRUE
/// Initialize atoms/areas in bounds - basically a Nightmare version of [/datum/map_template/initTemplateBounds]
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index f42030cce69d..69ce9ec4ce13 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -90,7 +90,7 @@
icon_state = "album"
item_state = "briefcase"
can_hold = list(/obj/item/photo,)
- storage_slots = 20
+ storage_slots = 28
/obj/item/storage/photo_album/MouseDrop(obj/over_object as obj)
@@ -122,9 +122,14 @@
/obj/item/device/camera
name = "camera"
icon = 'icons/obj/items/items.dmi'
- desc = "A polaroid camera. 10 photos left."
+ desc = "A polaroid camera."
icon_state = "camera"
- item_state = "electropack"
+ item_state = "camera"
+ item_icons = list(
+ WEAR_L_HAND = 'icons/mob/humans/onmob/items_lefthand_0.dmi',
+ WEAR_R_HAND = 'icons/mob/humans/onmob/items_righthand_0.dmi'
+ )
+ flags_item = TWOHANDED
w_class = SIZE_SMALL
flags_atom = FPRINT|CONDUCT
flags_equip_slot = SLOT_WAIST
@@ -132,10 +137,22 @@
black_market_value = 20
var/pictures_max = 10
var/pictures_left = 10
- var/on = 1
- var/icon_on = "camera"
- var/icon_off = "camera_off"
- var/size = 3
+ var/size = 7
+
+/obj/item/device/camera/get_examine_text(mob/user)
+ . = ..()
+ . += "It has [pictures_left] photos left."
+
+/obj/item/device/camera/attack_self(mob/user) //wielding capabilities
+ . = ..()
+ if(flags_item & WIELDED)
+ unwield(user)
+ else
+ wield(user)
+
+/obj/item/device/camera/dropped(mob/user)
+ ..()
+ unwield(user)
/obj/item/device/camera/verb/change_size()
set name = "Set Photo Focus"
@@ -149,24 +166,15 @@
/obj/item/device/camera/attack(mob/living/carbon/human/M, mob/user)
return
-/obj/item/device/camera/attack_self(mob/user)
- ..()
- on = !on
- if(on)
- src.icon_state = icon_on
- else
- src.icon_state = icon_off
- to_chat(user, "You switch the camera [on ? "on" : "off"].")
-
/obj/item/device/camera/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/device/camera_film))
- if(pictures_left)
- to_chat(user, SPAN_NOTICE("[src] still has some film in it!"))
+ if(pictures_left > (pictures_max - 10))
+ to_chat(user, SPAN_NOTICE("[src] cannot fit more film in it!"))
return
to_chat(user, SPAN_NOTICE("You insert [I] into [src]."))
if(user.temp_drop_inv_item(I))
qdel(I)
- pictures_left = pictures_max
+ pictures_left += 10
return
..()
@@ -270,24 +278,19 @@
return mob_detail
/obj/item/device/camera/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
- if(!on || !pictures_left || ismob(target.loc) || isstorage(target.loc))
+ if(pictures_left <= 0)
+ to_chat(user, SPAN_WARNING("There isn't enough film in the [src] to take a photo."))
return
- if(user.contains(target) || istype(target, /atom/movable/screen))
+ if(ismob(target.loc) || isstorage(target.loc) || user.contains(target) || istype(target, /atom/movable/screen))
+ return
+ if(!(flags_item & WIELDED))
+ to_chat(user, SPAN_WARNING("You need to wield the [src] with both hands to take a photo!"))
return
-
playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 15, 1)
-
pictures_left--
- desc = "A polaroid camera. It has [pictures_left] photos left."
to_chat(user, SPAN_NOTICE("[pictures_left] photos left."))
- captureimage(target, user, flag)
-
- icon_state = icon_off
- on = 0
- spawn(64)
- icon_state = icon_on
- on = 1
+ addtimer(CALLBACK(src, PROC_REF(captureimage), target, user, flag), 1 SECONDS)
/obj/item/device/camera/proc/captureimage(atom/target, mob/user, flag)
var/mob_descriptions = ""
@@ -343,10 +346,17 @@
name = "Old Camera"
desc = "An old, slightly beat-up digital camera, with a cheap photo printer taped on. It's a nice shade of blue."
icon_state = "oldcamera"
- icon_on = "oldcamera"
- icon_off = "oldcamera_off"
pictures_left = 30
+/obj/item/device/camera/broadcasting
+ name = "Broadcasting Camera"
+ desc = "Actively document everything you see, from the mundanity of shipside to the brutal battlefields below. Has a built-in printer for action shots."
+ icon_state = "broadcastingcamera"
+ item_state = "broadcastingcamera"
+ pictures_left = 20
+ pictures_max = 20
+ w_class = SIZE_HUGE
+ flags_equip_slot = NO_FLAGS //cannot be equiped
/obj/item/photo/proc/construct(datum/picture/P)
icon = P.fields["icon"]
diff --git a/code/modules/projectiles/gun_attachables.dm b/code/modules/projectiles/gun_attachables.dm
index 37094bb12775..f875af99bb43 100644
--- a/code/modules/projectiles/gun_attachables.dm
+++ b/code/modules/projectiles/gun_attachables.dm
@@ -1271,6 +1271,19 @@ Defined in conflicts.dm of the #defines folder.
QDEL_NULL(scope_element)
return ..()
+/obj/item/attachable/vulture_scope/select_gamemode_skin(expected_type, list/override_icon_state, list/override_protection)
+ . = ..()
+ var/new_attach_icon
+ switch(SSmapping.configs[GROUND_MAP].camouflage_type)
+ if("snow")
+ attach_icon = new_attach_icon ? new_attach_icon : "s_" + attach_icon
+ if("desert")
+ attach_icon = new_attach_icon ? new_attach_icon : "d_" + attach_icon
+ if("classic")
+ attach_icon = new_attach_icon ? new_attach_icon : "c_" + attach_icon
+ if("urban")
+ attach_icon = new_attach_icon ? new_attach_icon : "u_" + attach_icon
+
/obj/item/attachable/vulture_scope/tgui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
@@ -1814,6 +1827,7 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/stock/vulture
name = "\improper M707 heavy stock"
icon_state = "vulture_stock"
+ attach_icon = "vulture_stock"
hud_offset_mod = 3
/obj/item/attachable/stock/vulture/Initialize(mapload, ...)
@@ -1821,6 +1835,19 @@ Defined in conflicts.dm of the #defines folder.
select_gamemode_skin(type)
// Doesn't give any stat additions due to the gun already having really good ones, and this is unremovable from the gun itself
+/obj/item/attachable/stock/vulture/select_gamemode_skin(expected_type, list/override_icon_state, list/override_protection)
+ . = ..()
+ var/new_attach_icon
+ switch(SSmapping.configs[GROUND_MAP].camouflage_type)
+ if("snow")
+ attach_icon = new_attach_icon ? new_attach_icon : "s_" + attach_icon
+ if("desert")
+ attach_icon = new_attach_icon ? new_attach_icon : "d_" + attach_icon
+ if("classic")
+ attach_icon = new_attach_icon ? new_attach_icon : "c_" + attach_icon
+ if("urban")
+ attach_icon = new_attach_icon ? new_attach_icon : "u_" + attach_icon
+
/obj/item/attachable/stock/tactical
name = "\improper MK221 tactical stock"
desc = "A metal stock made for the MK221 tactical shotgun."
@@ -3199,7 +3226,7 @@ Defined in conflicts.dm of the #defines folder.
var/obj/projectile/P = new(src, create_cause_data(initial(name), user, src))
var/datum/ammo/flamethrower/ammo_datum = new projectile_type
- ammo_datum.flamer_reagent_type = flamer_reagent.type
+ ammo_datum.flamer_reagent_id = flamer_reagent.id
P.generate_bullet(ammo_datum)
P.icon_state = "naptha_ball"
P.color = flamer_reagent.color
@@ -3513,6 +3540,23 @@ Defined in conflicts.dm of the #defines folder.
attach_icon = "vulture_bipod"
heavy_bipod = TRUE
+/obj/item/attachable/bipod/vulture/Initialize(mapload, ...)
+ . = ..()
+ select_gamemode_skin(type)
+
+/obj/item/attachable/bipod/vulture/select_gamemode_skin(expected_type, list/override_icon_state, list/override_protection)
+ . = ..()
+ var/new_attach_icon
+ switch(SSmapping.configs[GROUND_MAP].camouflage_type)
+ if("snow")
+ attach_icon = new_attach_icon ? new_attach_icon : "s_" + attach_icon
+ if("desert")
+ attach_icon = new_attach_icon ? new_attach_icon : "d_" + attach_icon
+ if("classic")
+ attach_icon = new_attach_icon ? new_attach_icon : "c_" + attach_icon
+ if("urban")
+ attach_icon = new_attach_icon ? new_attach_icon : "u_" + attach_icon
+
/obj/item/attachable/burstfire_assembly
name = "burst fire assembly"
desc = "A small angled piece of fine machinery that increases the burst count on some weapons, and grants the ability to others. \nIncreases weapon scatter."
diff --git a/code/modules/reagents/chemistry_machinery/chem_simulator.dm b/code/modules/reagents/chemistry_machinery/chem_simulator.dm
index 8a95e3f3b07e..dd7f008e47d2 100644
--- a/code/modules/reagents/chemistry_machinery/chem_simulator.dm
+++ b/code/modules/reagents/chemistry_machinery/chem_simulator.dm
@@ -380,8 +380,7 @@
relate(C)
if(!C.original_id)
C.original_id = target.data.id
- C.id = encode_reagent(C)
- C.name = C.id
+ encode_reagent(C)
if(C.id in simulations)
//We've already simulated this before, so we don't need to continue
C = GLOB.chemical_reagents_list[C.id]
@@ -577,8 +576,8 @@
var/obj/item/paper/research_report/report = new /obj/item/paper/research_report/(loc)
var/datum/reagent/D = GLOB.chemical_reagents_list[id]
var/datum/asset/asset = get_asset_datum(/datum/asset/simple/paper)
- report.name = "Simulation result for [D.name]"
- report.info += "
Official Company Document Simulated Synthesis Report
Result for [D.name]
"
+ report.name = "Simulation result for [D.id]"
+ report.info += "
Official Company Document Simulated Synthesis Report