diff --git a/code/__DEFINES/camera.dm b/code/__DEFINES/camera.dm
index b13adf43e8cd..ea578874136d 100644
--- a/code/__DEFINES/camera.dm
+++ b/code/__DEFINES/camera.dm
@@ -6,6 +6,7 @@
#define CAMERA_NET_BRIG "Brig"
#define CAMERA_NET_ALAMO "Alamo"
#define CAMERA_NET_NORMANDY "Normandy"
+#define CAMERA_NET_SAIPAN "Saipan"
#define CAMERA_NET_COLONY "Colony"
#define CAMERA_NET_ARES "ARES"
diff --git a/code/__DEFINES/client_prefs.dm b/code/__DEFINES/client_prefs.dm
index 56775bea8888..1090b6776b35 100644
--- a/code/__DEFINES/client_prefs.dm
+++ b/code/__DEFINES/client_prefs.dm
@@ -15,7 +15,7 @@
#define TOGGLE_AUTOMATIC_PUNCTUATION (1<<7) // Whether your sentences will automatically be punctuated with a period
#define TOGGLE_COMBAT_CLICKDRAG_OVERRIDE (1<<8) // Whether disarm/harm intents cause clicks to trigger immediately when the mouse button is depressed.
#define TOGGLE_ALTERNATING_DUAL_WIELD (1<<9) // Whether dual-wielding fires both guns at once or swaps between them, OUTDATED, used to update savefiles, now dual_wield_pref
-#define TOGGLE_FULLSCREEN (1<<10) // See /client/proc/toggle_fullscreen in client_procs.dm
+#define TOGGLE_FULLSCREEN (1<<10) // See /client/proc/update_fullscreen in client_procs.dm
#define TOGGLE_MEMBER_PUBLIC (1<<11) //determines if you get a byond logo by your name in ooc if you're a member or not
#define TOGGLE_OOC_FLAG (1<<12) // determines if your country flag appears by your name in ooc chat
#define TOGGLE_MIDDLE_MOUSE_SWAP_HANDS (1<<13) //Toggle whether middle click swaps your hands
diff --git a/code/__DEFINES/colours.dm b/code/__DEFINES/colours.dm
index 93d1e082c66a..309dd7bcff11 100644
--- a/code/__DEFINES/colours.dm
+++ b/code/__DEFINES/colours.dm
@@ -112,6 +112,8 @@
#define LIGHT_COLOR_HOLY_MAGIC "#FFF743"
/// deep crimson
#define LIGHT_COLOR_BLOOD_MAGIC "#D00000"
+/// Warm red color rgb(250, 66, 66)
+#define LIGHT_COLOR_RED "#ff3b3b"
/* These ones aren't a direct color like the ones above, because nothing would fit */
/// Warm orange color, leaning strongly towards yellow. rgb(250, 160, 25)
diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm
index 3fd552f5369f..0173a55e2d17 100644
--- a/code/__DEFINES/job.dm
+++ b/code/__DEFINES/job.dm
@@ -13,6 +13,7 @@
#define SQUAD_SOF "SOF"
#define SQUAD_CBRN "CBRN"
#define SQUAD_FORECON "FORECON"
+#define SQUAD_SOLAR "Solar Devils"
// Job name defines
#define JOB_SQUAD_MARINE "Rifleman"
@@ -124,6 +125,9 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST)
#define JOB_GENERAL "USCM General"
#define JOB_ACMC "Assistant Commandant of the Marine Corps"
#define JOB_CMC "Commandant of the Marine Corps"
+#define JOB_PLT_MED "Platoon Corpsman"
+#define JOB_PLT_SL "Platoon Squad Leader"
+#define JOB_SQUAD_TECH "Reconnaissance Support Technician"
// Used to add a timelock to a job. Will be passed onto derivatives
#define AddTimelock(Path, timelockList) \
@@ -263,6 +267,7 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST)
#define JOB_UPP_SPECIALIST "UPP Serzhant"
#define JOB_UPP_LEADER "UPP Master Serzhant"
#define JOB_UPP_POLICE "UPP Politsiya"
+#define JOB_UPP_SUPPLY "UPP Logistics Technician"
#define JOB_UPP_LT_OFFICER "UPP Leytenant"
#define JOB_UPP_LT_DOKTOR "UPP Leytenant Doktor"
#define JOB_UPP_SRLT_OFFICER "UPP Senior Leytenant"
@@ -290,6 +295,8 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST)
#define JOB_UPP_CREWMAN "UPP Tank Crewman"
+#define JOB_UPP_COMMISSAR "UPP Political Commissar"
+
//-------- CLF --------//
#define JOB_CLF "CLF Guerilla"
#define JOB_CLF_ENGI "CLF Field Technician"
@@ -331,11 +338,15 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST)
#define JOB_PROVOST_TML "Provost Team Leader"
#define JOB_PROVOST_ADVISOR "Provost Advisor"
#define JOB_PROVOST_INSPECTOR "Provost Inspector"
+#define JOB_PROVOST_CINSPECTOR "Provost Chief Inspector"
+#define JOB_PROVOST_UNDERCOVER "Provost Undercover Inspector"
+
+#define JOB_PROVOST_DMARSHAL "Provost Deputy Marshal"
#define JOB_PROVOST_MARSHAL "Provost Marshal"
#define JOB_PROVOST_SMARSHAL "Provost Sector Marshal"
#define JOB_PROVOST_CMARSHAL "Provost Chief Marshal"
-#define PROVOST_JOB_LIST list(JOB_PROVOST_ENFORCER, JOB_PROVOST_TML, JOB_PROVOST_ADVISOR, JOB_PROVOST_INSPECTOR, JOB_PROVOST_MARSHAL, JOB_PROVOST_SMARSHAL, JOB_PROVOST_CMARSHAL)
+#define PROVOST_JOB_LIST list(JOB_PROVOST_ENFORCER, JOB_PROVOST_TML, JOB_PROVOST_ADVISOR, JOB_PROVOST_INSPECTOR, JOB_PROVOST_CINSPECTOR, JOB_PROVOST_DMARSHAL, JOB_PROVOST_MARSHAL, JOB_PROVOST_SMARSHAL, JOB_PROVOST_CMARSHAL)
#define JOB_RIOT "Riot Control"
#define JOB_RIOT_CHIEF "Chief Riot Control"
diff --git a/code/__DEFINES/keybinding.dm b/code/__DEFINES/keybinding.dm
index 4b8fd9bd58b3..3f4c90eaf7b9 100644
--- a/code/__DEFINES/keybinding.dm
+++ b/code/__DEFINES/keybinding.dm
@@ -33,6 +33,7 @@
//Client
#define COMSIG_KB_CLIENT_GETHELP_DOWN "keybinding_client_gethelp_down"
#define COMSIG_KB_CLIENT_SCREENSHOT_DOWN "keybinding_client_screenshot_down"
+#define COMSIG_KB_CLIENT_TOGGLEFULLSCREEN_DOWN "keybinding_client_togglefullscreen_down"
#define COMSIG_KB_CLIENT_MINIMALHUD_DOWN "keybinding_client_minimalhud_down"
//Communication
diff --git a/code/__DEFINES/paygrade_defs/provost.dm b/code/__DEFINES/paygrade_defs/provost.dm
index 5b2121642d52..c85fabc27bfe 100644
--- a/code/__DEFINES/paygrade_defs/provost.dm
+++ b/code/__DEFINES/paygrade_defs/provost.dm
@@ -1,9 +1,18 @@
// Paygrade shorthand defines, to allow clearer designation.
// PROVOST OFFICE
+/// PvI, Provost Advisor
+#define PAY_SHORT_PVA"PvA"
+
/// PvI, Provost Inspector
#define PAY_SHORT_PVI "PvI"
+/// PvCI, Provost Chief Inspector
+#define PAY_SHORT_PVCI "PvCI"
+
+/// PvDM, Provost Deputy Marshal
+#define PAY_SHORT_PVDM "PvDM"
+
/// PvM, Provost Marshal
#define PAY_SHORT_PVM "PvM"
diff --git a/code/__DEFINES/paygrade_defs/upp.dm b/code/__DEFINES/paygrade_defs/upp.dm
index 40c0d8441b2e..d753d531b67d 100644
--- a/code/__DEFINES/paygrade_defs/upp.dm
+++ b/code/__DEFINES/paygrade_defs/upp.dm
@@ -43,6 +43,9 @@
/// UO4, Mayjor
#define PAY_SHORT_UO4 "UO4"
+/// UO4P, Political Commissar
+#define PAY_SHORT_UO4P "UO4P"
+
/// UO5, Leytenant Kolonel
#define PAY_SHORT_UO5 "UO5"
diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm
index cc1831501bad..367c35be5605 100644
--- a/code/__DEFINES/radio.dm
+++ b/code/__DEFINES/radio.dm
@@ -33,6 +33,7 @@
#define RADIO_CHANNEL_MEDSCI "MedSci"
#define RADIO_CHANNEL_MP "MP"
#define RADIO_CHANNEL_NORMANDY "Normandy"
+#define RADIO_CHANNEL_SAIPAN "Saipan"
#define RADIO_CHANNEL_REQ "Req"
#define RADIO_CHANNEL_SENTRY "Sentry Network"
#define RADIO_CHANNEL_SPECIAL "special"
diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm
index af3e164deb71..1c79fe03945f 100644
--- a/code/__DEFINES/shuttles.dm
+++ b/code/__DEFINES/shuttles.dm
@@ -113,6 +113,7 @@
#define DROPSHIP_ALAMO "dropship_alamo"
#define DROPSHIP_NORMANDY "dropship_normandy"
+#define DROPSHIP_SAIPAN "dropship_saipan"
#define ALMAYER_DROPSHIP_LZ1 "almayer-hangar-lz1"
#define ALMAYER_DROPSHIP_LZ2 "almayer-hangar-lz2"
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index 72e02deb8c1a..6db0d5c550bd 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -177,6 +177,8 @@ DEFINE_BITFIELD(flags_item, list(
"CAN_DIG_SHRAPNEL" = CAN_DIG_SHRAPNEL,
"ANIMATED_SURGICAL_TOOL" = ANIMATED_SURGICAL_TOOL,
"IGNITING_ITEM" = IGNITING_ITEM,
+ "FORCEDROP_CONDITIONAL" = FORCEDROP_CONDITIONAL,
+ "SMARTGUNNER_BACKPACK_OVERRIDE" = SMARTGUNNER_BACKPACK_OVERRIDE,
))
DEFINE_BITFIELD(flags_inv_hide, list(
diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm
index 7207f878614a..b74275d2cee2 100644
--- a/code/controllers/configuration/configuration.dm
+++ b/code/controllers/configuration/configuration.dm
@@ -19,7 +19,7 @@
var/motd
var/policy
- var/static/regex/ic_filter_regex
+ var/static/regex/word_filter_regex
var/is_loaded = FALSE
@@ -315,21 +315,21 @@
/datum/controller/configuration/proc/LoadChatFilter()
- var/list/in_character_filter = list()
+ var/list/word_filter = list()
- if(!fexists("[directory]/in_character_filter.txt"))
+ if(!fexists("[directory]/word_filter.txt"))
return
- log_config("Loading config file in_character_filter.txt...")
+ log_config("Loading config file word_filter.txt...")
- for(var/line in file2list("[directory]/in_character_filter.txt"))
+ for(var/line in file2list("[directory]/word_filter.txt"))
if(!line)
continue
if(findtextEx(line,"#",1,2))
continue
- in_character_filter += REGEX_QUOTE(line)
+ word_filter += REGEX_QUOTE(line)
- ic_filter_regex = length(in_character_filter) ? regex("\\b([jointext(in_character_filter, "|")])\\b", "i") : null
+ word_filter_regex = length(word_filter) ? regex("\\b([jointext(word_filter, "|")])\\b", "i") : null
//Message admins when you can.
/datum/controller/configuration/proc/DelayedMessageAdmins(text)
diff --git a/code/controllers/subsystem/communications.dm b/code/controllers/subsystem/communications.dm
index e0ca12c341bd..c4661ff5a673 100644
--- a/code/controllers/subsystem/communications.dm
+++ b/code/controllers/subsystem/communications.dm
@@ -129,6 +129,7 @@ Radiochat range: 1441 to 1489 (most devices refuse to be tune to other frequency
#define DS1_FREQ 1488
#define DS2_FREQ 1489
+#define DS3_FREQ 1490
//Marine Squad channels
#define ALPHA_FREQ 1491
@@ -173,9 +174,11 @@ GLOBAL_LIST_INIT(radiochannels, list(
SQUAD_SOF = SOF_FREQ,
SQUAD_CBRN = CBRN_FREQ,
SQUAD_FORECON = FORECON_FREQ,
+ SQUAD_SOLAR = SOF_FREQ,
RADIO_CHANNEL_ALAMO = DS1_FREQ,
RADIO_CHANNEL_NORMANDY = DS2_FREQ,
+ RADIO_CHANNEL_SAIPAN = DS3_FREQ,
RADIO_CHANNEL_COLONY = COLONY_FREQ,
diff --git a/code/controllers/subsystem/decorator.dm b/code/controllers/subsystem/decorator.dm
index ac63fca47ac5..e8120cc09658 100644
--- a/code/controllers/subsystem/decorator.dm
+++ b/code/controllers/subsystem/decorator.dm
@@ -29,7 +29,7 @@ SUBSYSTEM_DEF(decorator)
var/list/datum/weakref/currentrun = list()
/datum/controller/subsystem/decorator/Initialize()
- var/list/all_decors = typesof(/datum/decorator) - list(/datum/decorator) - typesof(/datum/decorator/manual)
+ var/list/all_decors = typesof(/datum/decorator) - list(/datum/decorator) - typesof(/datum/decorator/manual) - typesof(/datum/decorator/gamemode)
for(var/decor_type in all_decors)
var/datum/decorator/decor = new decor_type()
if(!decor.is_active_decor())
@@ -43,6 +43,8 @@ SUBSYSTEM_DEF(decorator)
registered_decorators[app_type] = list()
registered_decorators[app_type] += decor
+ RegisterSignal(SSdcs, COMSIG_GLOB_MODE_PRESETUP, PROC_REF(handle_mode_specific))
+
for(var/i in registered_decorators)
registered_decorators[i] = sortDecorators(registered_decorators[i])
@@ -71,6 +73,24 @@ SUBSYSTEM_DEF(decorator)
if(MC_TICK_CHECK)
return
+/datum/controller/subsystem/decorator/proc/handle_mode_specific()
+ SIGNAL_HANDLER
+
+ for(var/decorator_type in typesof(/datum/decorator/gamemode))
+ var/datum/decorator/gamemode/gamemode_decorator = new decorator_type()
+
+ if(!istype(SSticker.mode, gamemode_decorator.gamemode))
+ continue
+
+ var/applicable_types = gamemode_decorator.get_decor_types()
+ if(!length(applicable_types))
+ continue
+
+ active_decorators |= gamemode_decorator
+
+ for(var/applicable_type in applicable_types)
+ LAZYADD(registered_decorators[applicable_type], gamemode_decorator)
+
/datum/controller/subsystem/decorator/proc/add_decorator(decor_type, ...)
var/list/arguments = list()
if (length(args) > 1)
diff --git a/code/datums/ASRS.dm b/code/datums/ASRS.dm
index dc5ebc362fd1..5bd82ef6c532 100644
--- a/code/datums/ASRS.dm
+++ b/code/datums/ASRS.dm
@@ -40,6 +40,10 @@
reference_package = /datum/supply_packs/ammo_m4a3_mag_box_ap
cost = ASRS_VERY_LOW_WEIGHT
+/datum/supply_packs_asrs/ammo_m4a3_mag_box_hp
+ reference_package = /datum/supply_packs/ammo_m4a3_mag_box_hp
+ cost = ASRS_VERY_LOW_WEIGHT
+
/datum/supply_packs_asrs/ammo_mag_box
reference_package = /datum/supply_packs/ammo_mag_box
cost = ASRS_VERY_LOW_WEIGHT
@@ -123,3 +127,4 @@
/datum/supply_packs_asrs/ingredient
reference_package = /datum/supply_packs/ingredient
pool = ASRS_POOL_FOOD
+ cost = ASRS_VERY_LOW_WEIGHT
diff --git a/code/datums/ammo/bullet/special_ammo.dm b/code/datums/ammo/bullet/special_ammo.dm
index 97c1bf5735f9..cd30f8db1a78 100644
--- a/code/datums/ammo/bullet/special_ammo.dm
+++ b/code/datums/ammo/bullet/special_ammo.dm
@@ -149,15 +149,10 @@
RegisterSignal(SSdcs, COMSIG_GLOB_MODE_PRESETUP, PROC_REF(setup_hvh_damage))
/datum/ammo/bullet/minigun/proc/setup_hvh_damage()
+ SIGNAL_HANDLER
if(MODE_HAS_FLAG(MODE_FACTION_CLASH))
damage = 15
-/datum/ammo/bullet/minigun/tank
- accuracy = -HIT_ACCURACY_TIER_1
- accuracy_var_low = PROJECTILE_VARIANCE_TIER_8
- accuracy_var_high = PROJECTILE_VARIANCE_TIER_8
- accurate_range = 12
-
/datum/ammo/bullet/m60
name = "M60 bullet"
headshot_state = HEADSHOT_OVERLAY_MEDIUM
diff --git a/code/datums/ammo/bullet/tank.dm b/code/datums/ammo/bullet/tank.dm
index 70a953c6e273..1607c1ae6734 100644
--- a/code/datums/ammo/bullet/tank.dm
+++ b/code/datums/ammo/bullet/tank.dm
@@ -4,9 +4,12 @@
//======
*/
+//Autocannon Ammo//
+
/datum/ammo/bullet/tank/flak
name = "flak autocannon bullet"
icon_state = "autocannon"
+ sound_hit = 'sound/weapons/sting_boom_small1.ogg'
damage_falloff = 0
flags_ammo_behavior = AMMO_BALLISTIC
accurate_range_min = 4
@@ -72,3 +75,30 @@
for(var/mob/living/carbon/L in T)
if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO)
shake_camera(L, 1, 1)
+
+//Minigun Ammo//
+
+/datum/ammo/bullet/tank/minigun
+ name = "minigun bullet"
+ headshot_state = HEADSHOT_OVERLAY_MEDIUM
+ icon_state = "bullet_large"
+
+ accuracy = -HIT_ACCURACY_TIER_1
+ accuracy_var_low = PROJECTILE_VARIANCE_TIER_8
+ accuracy_var_high = PROJECTILE_VARIANCE_TIER_8
+ accurate_range = 12
+ damage = 40
+ penetration = ARMOR_PENETRATION_TIER_6
+ damage_armor_punch = 1
+
+/datum/ammo/bullet/tank/minigun/New()
+ ..()
+ if(SSticker.mode && MODE_HAS_FLAG(MODE_FACTION_CLASH))
+ damage = 15
+ else if(SSticker.current_state < GAME_STATE_PLAYING)
+ RegisterSignal(SSdcs, COMSIG_GLOB_MODE_PRESETUP, PROC_REF(setup_hvh_damage))
+
+/datum/ammo/bullet/tank/minigun/proc/setup_hvh_damage()
+ SIGNAL_HANDLER
+ if(MODE_HAS_FLAG(MODE_FACTION_CLASH))
+ damage = 15
diff --git a/code/datums/decorators/gamemode_decorator.dm b/code/datums/decorators/gamemode_decorator.dm
new file mode 100644
index 000000000000..bc89d7a20632
--- /dev/null
+++ b/code/datums/decorators/gamemode_decorator.dm
@@ -0,0 +1,46 @@
+#define GAMEMODE_DECORATOR(type, mode, list_edits) \
+/datum/decorator/gamemode##type##mode { \
+ gamemode = mode; \
+ apply_type = type; \
+ edits = list_edits; \
+}
+
+#define VARIABLE_EDIT(type, variable, value) nameof(type::variable) = value
+#define ARMOR_EDIT(variable, value) VARIABLE_EDIT(/obj/item/clothing/suit/storage/marine, variable, value)
+#define GUN_EDIT(variable, value) VARIABLE_EDIT(/obj/item/weapon/gun, variable, value)
+#define AMMO_EDIT(variable, value) VARIABLE_EDIT(/obj/item/ammo_magazine, variable, value)
+
+/**
+ * Gamemode decorators allow us to make changes to edits on specific gamemodes,
+ * to assist in balancing varied gameplay in different modes
+ *
+ * They can be manually defined, and procs overridden. Alternatively,
+ * using the GAMEMODE_DECORATOR define, you can quickly make a decorator for
+ * a specific type and subtypes.
+ *
+ * eg:
+ * ```
+ * GAMEMODE_DECORATOR(/obj/item/clothing/suit/storage/marine/smartgunner, /datum/game_mode/extended/faction_clash, list(
+ * ARMOR_EDIT(armor_bullet, CLOTHING_ARMOR_HIGH),
+ * ARMOR_EDIT(armor_internaldamage, CLOTHING_ARMOR_HIGH)
+ * ))
+ * ```
+ *
+ * If you need to edit different types, make a new define using VARIABLE_EDIT, and provide the parent path for the type.
+ */
+/datum/decorator/gamemode
+ /// The gamemode type this should apply to
+ var/gamemode
+
+ /// Which type this should apply edits to
+ var/apply_type
+
+ /// The list of edits to make
+ var/list/edits
+
+/datum/decorator/gamemode/get_decor_types()
+ return typesof(apply_type)
+
+/datum/decorator/gamemode/decorate(atom/object)
+ for(var/edit in edits)
+ object.vars[edit] = edits[edit]
diff --git a/code/datums/emergency_calls/forecon.dm b/code/datums/emergency_calls/forecon.dm
index 98e6a1c27ec2..94336b9ffa53 100644
--- a/code/datums/emergency_calls/forecon.dm
+++ b/code/datums/emergency_calls/forecon.dm
@@ -2,7 +2,7 @@
name = "FORECON (Squad)"
arrival_message = "A Force Reconnaissance squad has been dispatched to your ship. Stand by."
objectives = "Handle whatever threat is present. Further orders may be provided."
- home_base = /datum/lazy_template/ert/weyland_station
+ home_base = /datum/lazy_template/ert/uscm_station
probability = 0
mob_min = 3
mob_max = 6
diff --git a/code/datums/emergency_calls/solar_devils.dm b/code/datums/emergency_calls/solar_devils.dm
new file mode 100644
index 000000000000..6f3323f3cd6d
--- /dev/null
+++ b/code/datums/emergency_calls/solar_devils.dm
@@ -0,0 +1,91 @@
+/datum/emergency_call/solar_devils
+ name = "USCM Solar Devils (Half Squad)"
+ arrival_message = "This is the Solar Devils of the USCM 2nd Division, responding to your distress beacon. Don't worry, the grown-ups are here to clean up your mess."
+ objectives = "Assist local Marine forces in dealing with whatever issue they can't handle. Further orders may be forthcoming."
+ home_base = /datum/lazy_template/ert/uscm_station
+ probability = 0
+ mob_min = 3
+ mob_max = 5
+
+ max_medics = 1
+ max_smartgunners = 1
+
+/datum/emergency_call/solar_devils/create_member(datum/mind/new_mind, turf/override_spawn_loc)
+ var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point()
+
+ if(!istype(spawn_loc))
+ return //Didn't find a useable spawn point.
+
+ var/mob/living/carbon/human/mob = new(spawn_loc)
+ new_mind.transfer_to(mob, TRUE)
+
+ if(!leader && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job))
+ leader = mob
+ arm_equipment(mob, /datum/equipment_preset/uscm/tl_pve, TRUE, TRUE)
+ to_chat(mob, SPAN_ROLE_HEADER("You are the Solar Devils Team Leader!"))
+
+ else if(medics < max_medics && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(mob.client, JOB_SQUAD_MEDIC, time_required_for_job))
+ medics++
+ arm_equipment(mob, /datum/equipment_preset/uscm/medic_pve, TRUE, TRUE)
+ to_chat(mob, SPAN_ROLE_HEADER("You are the Solar Devils Platoon Corpsman!"))
+
+ else if(smartgunners < max_smartgunners && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(mob.client, JOB_SQUAD_SMARTGUN))
+ smartgunners++
+ to_chat(mob, SPAN_ROLE_HEADER("You are the Solar Devils Smartgunner!"))
+ arm_equipment(mob, /datum/equipment_preset/uscm/sg_pve, TRUE, TRUE)
+
+ else
+ arm_equipment(mob, /datum/equipment_preset/uscm/rifleman_pve, TRUE, TRUE)
+ to_chat(mob, SPAN_ROLE_HEADER("You are a Solar Devils Rifleman!"))
+
+ to_chat(mob, SPAN_ROLE_BODY("You are a member of the 3rd Battalion 'Solar Devils', part of the USCM's 2nd Division, 1st Regiment. Unlike most of the USS Almayer's troops, you are well-trained and properly-equipped career marines. Semper Fidelis."))
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS)
+
+/datum/emergency_call/solar_devils_full
+ name = "USCM Solar Devils (Full Squad)"
+ arrival_message = "This is the Solar Devils of the USCM 2nd Division, responding to your distress beacon. Don't worry, the grown-ups are here to clean up your mess."
+ objectives = "Assist local Marine forces in dealing with whatever issue they can't handle. Further orders may be forthcoming."
+ home_base = /datum/lazy_template/ert/uscm_station
+ probability = 0
+ mob_min = 3
+ mob_max = 10
+
+ max_engineers = 2
+ max_medics = 1
+ max_smartgunners = 2
+
+/datum/emergency_call/solar_devils_full/create_member(datum/mind/new_mind, turf/override_spawn_loc)
+ var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point()
+
+ if(!istype(spawn_loc))
+ return //Didn't find a useable spawn point.
+
+ var/mob/living/carbon/human/mob = new(spawn_loc)
+ new_mind.transfer_to(mob, TRUE)
+
+ if(!leader && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job))
+ leader = mob
+ arm_equipment(mob, /datum/equipment_preset/uscm/sl_pve, TRUE, TRUE)
+ to_chat(mob, SPAN_ROLE_HEADER("You are the Solar Devils Platoon Leader!"))
+
+ else if(engineers < max_engineers && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_ENGINEER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job))
+ engineers++
+ arm_equipment(mob, /datum/equipment_preset/uscm/tl_pve, TRUE, TRUE)
+ to_chat(mob, SPAN_ROLE_HEADER("You are a Solar Devils Team Leader!"))
+
+ else if(medics < max_medics && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(mob.client, JOB_SQUAD_MEDIC, time_required_for_job))
+ medics++
+ arm_equipment(mob, /datum/equipment_preset/uscm/medic_pve, TRUE, TRUE)
+ to_chat(mob, SPAN_ROLE_HEADER("You are the Solar Devils Platoon Corpsman!"))
+
+ else if(smartgunners < max_smartgunners && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(mob.client, JOB_SQUAD_SMARTGUN))
+ smartgunners++
+ to_chat(mob, SPAN_ROLE_HEADER("You are a Solar Devils Smartgunner!"))
+ arm_equipment(mob, /datum/equipment_preset/uscm/sg_pve, TRUE, TRUE)
+
+ else
+ arm_equipment(mob, /datum/equipment_preset/uscm/rifleman_pve, TRUE, TRUE)
+ to_chat(mob, SPAN_ROLE_HEADER("You are a Solar Devils Rifleman!"))
+
+ to_chat(mob, SPAN_ROLE_BODY("You are a member of the 3rd Battalion 'Solar Devils', part of the USCM's 2nd Division, 1st Regiment. Unlike most of the USS Almayer's troops, you are well-trained and properly-equipped career marines. Semper Fidelis."))
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS)
diff --git a/code/datums/factions/upp.dm b/code/datums/factions/upp.dm
index 90b04765cf85..1a1f0e9a2390 100644
--- a/code/datums/factions/upp.dm
+++ b/code/datums/factions/upp.dm
@@ -53,6 +53,10 @@
hud_icon_state = "vc"
if(JOB_UPP_LT_DOKTOR)
hud_icon_state = "doc"
+ if(JOB_UPP_SUPPLY)
+ hud_icon_state = "log"
+ if(JOB_UPP_COMMISSAR)
+ hud_icon_state = "commi"
if(hud_icon_state)
holder.overlays += image('icons/mob/hud/marine_hud.dmi', H, "upp_[hud_icon_state]")
diff --git a/code/datums/factions/uscm.dm b/code/datums/factions/uscm.dm
index f7c49321f305..6a4b61289ea3 100644
--- a/code/datums/factions/uscm.dm
+++ b/code/datums/factions/uscm.dm
@@ -30,6 +30,7 @@
if(JOB_MARINE_RAIDER) marine_rk = "soc"
if(JOB_MARINE_RAIDER_SL) marine_rk = "soctl"
if(JOB_MARINE_RAIDER_CMD) marine_rk = "soccmd"
+ if(JOB_SQUAD_TECH) marine_rk = "tech"
if(squad.squad_leader == current_human)
switch(squad.squad_type)
if("Squad") marine_rk = "leader_a"
@@ -87,6 +88,12 @@
if(JOB_GENERAL, JOB_COLONEL, JOB_ACMC, JOB_CMC)
marine_rk = "general"
border_rk = "command"
+ if(JOB_PLT_MED)
+ marine_rk = "med"
+ if(JOB_PLT_SL)
+ marine_rk = "leader"
+ if(JOB_SQUAD_TECH)
+ marine_rk = "tech"
if(JOB_INTEL)
marine_rk = "io"
if(JOB_CAS_PILOT)
@@ -142,9 +149,18 @@
if(JOB_PROVOST_INSPECTOR)
marine_rk = "pvi"
border_rk = "command"
+ if(JOB_PROVOST_UNDERCOVER)
+ marine_rk = "pvuc"
+ border_rk = "command"
+ if(JOB_PROVOST_CINSPECTOR)
+ marine_rk = "pvci"
+ border_rk = "command"
if(JOB_PROVOST_ADVISOR)
marine_rk = "pva"
border_rk = "command"
+ if(JOB_PROVOST_DMARSHAL)
+ marine_rk = "pvdm"
+ border_rk = "command"
if(JOB_PROVOST_MARSHAL, JOB_PROVOST_CMARSHAL, JOB_PROVOST_SMARSHAL)
marine_rk = "pvm"
border_rk = "command"
diff --git a/code/datums/keybinding/client.dm b/code/datums/keybinding/client.dm
index 752287882277..d7e90f61683a 100644
--- a/code/datums/keybinding/client.dm
+++ b/code/datums/keybinding/client.dm
@@ -34,6 +34,21 @@
winset(user, null, "command=.screenshot [!user.keys_held["shift"] ? "auto" : ""]")
return TRUE
+/datum/keybinding/client/toggle_fullscreen
+ hotkey_keys = list("F11")
+ classic_keys = list("F11")
+ name = "toggle_fullscreen"
+ full_name = "Toggle Fullscreen"
+ description = "Toggles whether the game window will be true fullscreen or normal."
+ keybind_signal = COMSIG_KB_CLIENT_TOGGLEFULLSCREEN_DOWN
+
+/datum/keybinding/client/toggle_fullscreen/down(client/user)
+ . = ..()
+ if(.)
+ return
+ user.toggle_fullscreen_preference()
+ return TRUE
+
/datum/keybinding/client/minimal_hud
hotkey_keys = list("F12")
classic_keys = list("F12")
diff --git a/code/datums/pain/_pain.dm b/code/datums/pain/_pain.dm
index fd4dfbf0bbb3..826773504151 100644
--- a/code/datums/pain/_pain.dm
+++ b/code/datums/pain/_pain.dm
@@ -193,7 +193,7 @@
if(!isnull(threshold_horrible))
activate_horrible()
- if(new_level >= PAIN_LEVEL_SEVERE)
+ if(new_level >= PAIN_LEVEL_SEVERE && feels_pain)
RegisterSignal(source_mob, COMSIG_MOB_DRAGGED, PROC_REF(oxyloss_drag), override = TRUE)
RegisterSignal(source_mob, COMSIG_MOB_DEVOURED, PROC_REF(handle_devour), override = TRUE)
RegisterSignal(source_mob, COMSIG_MOVABLE_PRE_THROW, PROC_REF(oxy_kill), override = TRUE)
diff --git a/code/datums/paygrades/factions/upp/upp.dm b/code/datums/paygrades/factions/upp/upp.dm
index b9ce691fdb8d..3eef33921137 100644
--- a/code/datums/paygrades/factions/upp/upp.dm
+++ b/code/datums/paygrades/factions/upp/upp.dm
@@ -95,6 +95,13 @@
pay_multiplier = 2.5
officer_grade = GRADE_OFFICER
+/datum/paygrade/upp/uo4p
+ paygrade = PAY_SHORT_UO4P
+ name = "Political Commissar"
+ prefix = "Pol."
+ pay_multiplier = 5
+ officer_grade = GRADE_OFFICER
+
/datum/paygrade/upp/uo5
paygrade = PAY_SHORT_UO5
name = "Leytenant Kolonel"
diff --git a/code/datums/paygrades/factions/uscm/provost.dm b/code/datums/paygrades/factions/uscm/provost.dm
index c7e529d9fcb4..a89e3b7fa588 100644
--- a/code/datums/paygrades/factions/uscm/provost.dm
+++ b/code/datums/paygrades/factions/uscm/provost.dm
@@ -10,6 +10,19 @@
rank_pin = /obj/item/clothing/accessory/ranks/special/insp
officer_grade = GRADE_FLAG //Not really a flag officer, but they have special access to things for their job.
+/datum/paygrade/provost/inspector/chief
+ paygrade = PAY_SHORT_PVCI
+ name = "Provost Chief Inspector"
+ prefix = "Chief Insp."
+ rank_pin = /obj/item/clothing/accessory/ranks/special/insp
+ officer_grade = GRADE_FLAG //Not really a flag officer, but they have special access to things for their job.
+
+/datum/paygrade/provost/marshal/deputy
+ paygrade = PAY_SHORT_PVDM
+ name = "Provost Deputy Marshal"
+ prefix = "Dep. Marshal"
+ officer_grade = GRADE_FLAG
+
/datum/paygrade/provost/marshal
paygrade = PAY_SHORT_PVM
name = "Provost Marshal"
diff --git a/code/datums/research_upgrade_datum.dm b/code/datums/research_upgrade_datum.dm
index fd571afdfcf0..78bdecccc5b5 100644
--- a/code/datums/research_upgrade_datum.dm
+++ b/code/datums/research_upgrade_datum.dm
@@ -5,14 +5,12 @@
var/desc = "something is broken. yippee!!"
///which behavior should this type follow. Should this be completely excluded from the buy menu? should it be one of the dropdown options? or a normal item?
var/behavior = RESEARCH_UPGRADE_EXCLUDE_BUY // should this be on the list?
- //This is what gets passed to the initizialize of an item, RESEARCH_UPGRADE_NOTHING_TO_PASS to not pass anything.
- var/on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS
/// the price of the upgrade, refer to this: 500 is a runner, 8k is queen. T3 is usually 3k, woyer is 2k.
var/value_upgrade = 1000
- /// actual path to the item.(upgrade)
- var/item_reference
///In which tab the upgrade should be.
var/upgrade_type
+ ///Path to the item, upgrade, if any.
+ var/item_reference
///Clearance requirment to buy this upgrade. 5x is level 6. Why is it not that way? no one knows.
var/clearance_req = 5
///The change of price for item per purchase, recommended for mass producing stuff or limited upgrade.
@@ -22,6 +20,12 @@
///the maximum price which we cant go any more expensive, usually dont need to set this if change price is 0 or negative
var/maximum_price = INFINITY
+///gets called once the product is purchased, override if you need to pass any special arguments or have special behavior on purchase.
+/datum/research_upgrades/proc/on_purchase(turf/machine_loc)
+ if(isnull(item_reference))
+ return
+ new item_reference(machine_loc)
+
/datum/research_upgrades/machinery
name = "Machinery"
behavior = RESEARCH_UPGRADE_CATEGORY // one on the dropdown choices you get
@@ -29,46 +33,52 @@
/datum/research_upgrades/machinery/autodoc
name = "AutoDoc Upgrade"
behavior = RESEARCH_UPGRADE_EXCLUDE_BUY
- item_reference = /obj/item/research_upgrades/autodoc
upgrade_type = ITEM_MACHINERY_UPGRADE
/datum/research_upgrades/machinery/autodoc/internal_bleed
name = "AutoDoc Internal Bleeding Repair"
desc = "A data and instruction set for the AutoDoc, making it capable of rapidly fixing internal bleeding."
- on_init_argument = RESEARCH_UPGRADE_TIER_1
behavior = RESEARCH_UPGRADE_ITEM
value_upgrade = 200
clearance_req = 1
+/datum/research_upgrades/machinery/autodoc/internal_bleed/on_purchase(turf/machine_loc)
+ new /obj/item/research_upgrades/autodoc(machine_loc, RESEARCH_UPGRADE_TIER_1)
+
/datum/research_upgrades/machinery/autodoc/broken_bone
name = "AutoDoc Bone Fracture Repair"
desc = "A data instruction set for the AutoDoc, making it capable of setting fractures and applying bonegel."
- on_init_argument = RESEARCH_UPGRADE_TIER_2
behavior = RESEARCH_UPGRADE_ITEM
value_upgrade = 2000
clearance_req = 3
+/datum/research_upgrades/machinery/autodoc/broken_bone/on_purchase(turf/machine_loc)
+ new /obj/item/research_upgrades/autodoc(machine_loc, RESEARCH_UPGRADE_TIER_2)
+
/datum/research_upgrades/machinery/autodoc/organ_damage
name = "AutoDoc Broken Organ Repair"
desc = "A data and instruction set for the AutoDoc, making it capable of fixing organ damage."
- on_init_argument = RESEARCH_UPGRADE_TIER_3
behavior = RESEARCH_UPGRADE_ITEM
value_upgrade = 1500
clearance_req = 2
+/datum/research_upgrades/machinery/autodoc/organ_damage/on_purchase(turf/machine_loc)
+ new /obj/item/research_upgrades/autodoc(machine_loc, RESEARCH_UPGRADE_TIER_3)
+
/datum/research_upgrades/machinery/autodoc/larva_removal
name = "AutoDoc Embryo Removal"
desc = "Data and instruction set for AutoDoc making it mildly proficient in removing parasites left by unknown organism."
- on_init_argument = RESEARCH_UPGRADE_TIER_4
behavior = RESEARCH_UPGRADE_ITEM
value_upgrade = 4000
clearance_req = 6
+/datum/research_upgrades/machinery/autodoc/larva_removal/on_purchase(turf/machine_loc)
+ new /obj/item/research_upgrades/autodoc(machine_loc, RESEARCH_UPGRADE_TIER_4)
+
/datum/research_upgrades/machinery/sleeper
name = "Sleeper Upgrade"
desc = "Research upgrade for Sleeper system, technology on this disk is used on a sleeper to allow wider spectrum of chemicals to be administered, as well as upgrading dialysis software."
- on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS
behavior = RESEARCH_UPGRADE_ITEM
value_upgrade = 500
item_reference = /obj/item/research_upgrades/sleeper
@@ -83,10 +93,9 @@
name = "Research Credits"
desc = "Sell the data acquired to the nearest Weyland-Yutani Science division team for 8 or 9 points."
value_upgrade = 2000
- item_reference = /obj/item/research_upgrades/credits
- on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS
behavior = RESEARCH_UPGRADE_ITEM
upgrade_type = ITEM_ACCESSORY_UPGRADE
+ item_reference = /obj/item/research_upgrades/credits
change_purchase = 500
maximum_price = 5000
clearance_req = 5
@@ -95,21 +104,20 @@
name = "Laser Scalpel"
desc = "An advanced, robust version of the normal scalpel, allowing it to pierce through thick skin and chitin alike with extreme ease."
value_upgrade = 3000
- item_reference = /obj/item/tool/surgery/scalpel/laser/advanced
- on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS
behavior = RESEARCH_UPGRADE_ITEM
upgrade_type = ITEM_ACCESSORY_UPGRADE
+ item_reference = /obj/item/tool/surgery/scalpel/laser/advanced
clearance_req = 3
/datum/research_upgrades/item/incision_management
name = "Incision Management System"
desc = "A true extension of the surgeon's body, this marvel instantly and completely prepares an incision, allowing for the immediate commencement of therapeutic steps."
value_upgrade = 3000
- item_reference = /obj/item/tool/surgery/scalpel/manager
- on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS
behavior = RESEARCH_UPGRADE_ITEM
upgrade_type = ITEM_ACCESSORY_UPGRADE
clearance_req = 4
+ item_reference = /obj/item/tool/surgery/scalpel/manager
+
/datum/research_upgrades/item/nanosplints
name = "Reinforced Fiber Splints"
@@ -118,11 +126,12 @@
clearance_req = 3
change_purchase = -200
minimum_price = 200
- item_reference = /obj/item/stack/medical/splint/nano/research
- on_init_argument = RESEARCH_UPGRADE_TIER_5 //adjust this to change amount of nanosplints in a stack, cant be higher than five, go change max_amount in the nanosplint itself, then change it.
behavior = RESEARCH_UPGRADE_ITEM
upgrade_type = ITEM_ACCESSORY_UPGRADE
+/datum/research_upgrades/item/nanosplints/on_purchase(turf/machine_loc)
+ new /obj/item/stack/medical/splint/nano/research(machine_loc, 5)//adjust this to change amount of nanosplints in a stack, cant be higher than five, go change max_amount in the nanosplint itself, then change it.
+
/datum/research_upgrades/item/flamer_tank
name = "Upgraded Incinerator Tank"
desc = "An upgraded incinerator tank, with larger capacity and able to handle stronger fuels."
@@ -131,20 +140,19 @@
change_purchase = 100
minimum_price = 100
maximum_price = 1000
- item_reference = /obj/item/ammo_magazine/flamer_tank/custom/upgraded
- on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS
behavior = RESEARCH_UPGRADE_ITEM
upgrade_type = ITEM_ACCESSORY_UPGRADE
+ item_reference = /obj/item/ammo_magazine/flamer_tank/custom/upgraded
/datum/research_upgrades/item/flamer_tank/smoke
name = "Upgraded Incinerator Smoke Tank"
desc = "An upgraded incinerator smoke tank with a larger capacity."
value_upgrade = 100 //not useful enough to be expensive
clearance_req = 1
- item_reference = /obj/item/ammo_magazine/flamer_tank/smoke/upgraded
change_purchase = 50
minimum_price = 100
maximum_price = 500
+ item_reference = /obj/item/ammo_magazine/flamer_tank/smoke/upgraded
/datum/research_upgrades/armor
name = "Armor"
@@ -154,18 +162,15 @@
name = "Universal Translator Plate"
desc = "A uniform-attachable plate capable of translating any unknown language heard by the wearer."
value_upgrade = 2000
- on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS
behavior = RESEARCH_UPGRADE_ITEM
clearance_req = 6
upgrade_type = ITEM_ARMOR_UPGRADE
item_reference = /obj/item/clothing/accessory/health/research_plate/translator
-
/datum/research_upgrades/armor/coagulator
name = "Active Blood Coagulator Plate"
desc = "A uniform-attachable plate capable of coagulating any bleeding wounds the user possesses."
value_upgrade = 1200
- on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS
behavior = RESEARCH_UPGRADE_ITEM
clearance_req = 2
change_purchase = -200
@@ -173,12 +178,12 @@
upgrade_type = ITEM_ARMOR_UPGRADE
item_reference = /obj/item/clothing/accessory/health/research_plate/coagulator
+
/datum/research_upgrades/armor/emergency_injector
name = "Medical Emergency Injector"
desc = "A medical plate with two buttons on the sides and a hefty chemical tank. Attached to a uniform and on a simultaneous press, it injects an emergency dose of medical chemicals much larger than a normal emergency autoinjector. Single time use and is recycled in biomass printer. Features overdose protection."
value_upgrade = 250
clearance_req = 1
- on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS
behavior = RESEARCH_UPGRADE_ITEM
change_purchase = -100
minimum_price = 100
@@ -190,7 +195,6 @@
desc = "A strong trauma plate, able to protect the user from a large amount of bullets. Completely useless against sharp objects."
value_upgrade = 500
clearance_req = 4
- on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS
behavior = RESEARCH_UPGRADE_ITEM
upgrade_type = ITEM_ARMOR_UPGRADE
change_purchase = -50
@@ -202,10 +206,8 @@
desc = "Preservation plate which activates once the user is dead, uses variety of different substances and sensors to slow down the decay and increase the time before the user is permanently dead, due to small tank of preservatives, it needs to be replaced on each death. Extends time to permadeath by around four minutes."
value_upgrade = 500
clearance_req = 4
- on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS
behavior = RESEARCH_UPGRADE_ITEM
upgrade_type = ITEM_ARMOR_UPGRADE
change_purchase = -100
minimum_price = 100
item_reference = /obj/item/clothing/accessory/health/research_plate/anti_decay
-
diff --git a/code/datums/skills/upp.dm b/code/datums/skills/upp.dm
index 8ada7ccad124..c292251b9ab9 100644
--- a/code/datums/skills/upp.dm
+++ b/code/datums/skills/upp.dm
@@ -83,6 +83,34 @@ UNITED PROGRESSIVE PEOPLES
SKILL_FIREARMS = SKILL_FIREARMS_EXPERT,
)
+/datum/skills/upp/logistics_technician
+ name = "UPP Logistics Technician"
+ skills = list(
+ SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI,
+ SKILL_ENGINEER = SKILL_ENGINEER_TRAINED,
+ SKILL_MEDICAL = SKILL_MEDICAL_TRAINED,
+ SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED,
+ SKILL_FIREMAN = SKILL_FIREMAN_TRAINED,
+ SKILL_FIREARMS = SKILL_FIREARMS_EXPERT,
+ SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER,
+ )
+
+/datum/skills/upp/commissar
+ name = "UPP Starshy Politruk"
+ skills = list(
+ SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI,
+ SKILL_ENGINEER = SKILL_ENGINEER_NOVICE,
+ SKILL_MEDICAL = SKILL_MEDICAL_TRAINED,
+ SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED,
+ SKILL_FIREMAN = SKILL_FIREMAN_TRAINED,
+ SKILL_FIREARMS = SKILL_FIREARMS_EXPERT,
+ SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER,
+ SKILL_VEHICLE = SKILL_VEHICLE_SMALL,
+ SKILL_LEADERSHIP = SKILL_LEAD_MASTER,
+ SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED,
+ SKILL_INTEL = SKILL_INTEL_EXPERT,
+ )
+
/datum/skills/upp/officer
name = "UPP Officer"
skills = list(
diff --git a/code/datums/skills/uscm.dm b/code/datums/skills/uscm.dm
index 1bfb58996b4e..01866b82a9d1 100644
--- a/code/datums/skills/uscm.dm
+++ b/code/datums/skills/uscm.dm
@@ -426,3 +426,80 @@ COMMAND STAFF
SKILL_JTAC = SKILL_JTAC_EXPERT,
SKILL_INTEL = SKILL_INTEL_TRAINED,
)
+
+/*
+---------------------
+SOLAR DEVILS (PvE Marines)
+---------------------
+*/
+
+/datum/skills/rifleman_pve
+ name = "Private"
+ skills = list(
+ SKILL_ENGINEER = SKILL_ENGINEER_ENGI,
+ SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI,
+ SKILL_FIREMAN = SKILL_FIREMAN_EXPERT,
+ SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED,
+ SKILL_VEHICLE = SKILL_VEHICLE_SMALL,
+ SKILL_JTAC = SKILL_JTAC_BEGINNER,
+ SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED,
+ )
+
+/datum/skills/combat_medic_pve
+ name = "Combat Medic"
+ skills = list(
+ SKILL_ENGINEER = SKILL_ENGINEER_ENGI,
+ SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI,
+ SKILL_FIREMAN = SKILL_FIREMAN_EXPERT,
+ SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED,
+ SKILL_VEHICLE = SKILL_VEHICLE_SMALL,
+ SKILL_JTAC = SKILL_JTAC_BEGINNER,
+ SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED,
+ SKILL_MEDICAL = SKILL_MEDICAL_MEDIC,
+ SKILL_SURGERY = SKILL_SURGERY_NOVICE,
+ )
+
+/datum/skills/smartgunner_pve
+ name = "Smartgunner"
+ skills = list(
+ SKILL_ENGINEER = SKILL_ENGINEER_ENGI,
+ SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI,
+ SKILL_FIREMAN = SKILL_FIREMAN_EXPERT,
+ SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED,
+ SKILL_VEHICLE = SKILL_VEHICLE_SMALL,
+ SKILL_JTAC = SKILL_JTAC_BEGINNER,
+ SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED,
+ SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN,
+ )
+
+/datum/skills/tl_pve
+ name = "Fireteam Leader"
+ skills = list(
+ SKILL_ENGINEER = SKILL_ENGINEER_ENGI,
+ SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI,
+ SKILL_FIREMAN = SKILL_FIREMAN_EXPERT,
+ SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED,
+ SKILL_VEHICLE = SKILL_VEHICLE_SMALL,
+ SKILL_JTAC = SKILL_JTAC_TRAINED,
+ SKILL_LEADERSHIP = SKILL_LEAD_TRAINED,
+ SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED,
+ SKILL_PILOT = SKILL_PILOT_TRAINED,
+ )
+
+/datum/skills/sl_pve
+ name = "Squad Leader"
+ skills = list(
+ SKILL_ENGINEER = SKILL_ENGINEER_ENGI,
+ SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI,
+ SKILL_FIREMAN = SKILL_FIREMAN_EXPERT,
+ SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED,
+ SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER,
+ SKILL_CQC = SKILL_CQC_TRAINED,
+ SKILL_LEADERSHIP = SKILL_LEAD_EXPERT,
+ SKILL_MEDICAL = SKILL_MEDICAL_TRAINED,
+ SKILL_SURGERY = SKILL_SURGERY_NOVICE,
+ SKILL_VEHICLE = SKILL_VEHICLE_SMALL,
+ SKILL_JTAC = SKILL_JTAC_TRAINED,
+ SKILL_INTEL = SKILL_INTEL_TRAINED,
+ SKILL_PILOT = SKILL_PILOT_EXPERT,
+ )
diff --git a/code/datums/supply_packs/ammo.dm b/code/datums/supply_packs/ammo.dm
index 2e81d8fed164..b8b26225a010 100644
--- a/code/datums/supply_packs/ammo.dm
+++ b/code/datums/supply_packs/ammo.dm
@@ -291,7 +291,7 @@
)
name = "M41AE2 HPR Magazines crate (HPR ammo box x2)"
cost = 20
- containertype = /obj/structure/closet/crate
+ containertype = /obj/structure/closet/crate/ammo
containername = "\improper M41AE2 HPR magazines crate"
group = "Ammo"
@@ -301,8 +301,8 @@
/obj/item/ammo_magazine/rifle/lmg/holo_target,
)
name = "M41AE2 HPR Holo-Target Magazines crate (HPR HT ammo box x2)"
- cost = 30
- containertype = /obj/structure/closet/crate
+ cost = 20
+ containertype = /obj/structure/closet/crate/ammo
containername = "\improper M41AE2 HPR holo-target magazines crate"
group = "Ammo"
diff --git a/code/datums/supply_packs/explosives.dm b/code/datums/supply_packs/explosives.dm
index 78f0f3e9251a..f032d0f891b0 100644
--- a/code/datums/supply_packs/explosives.dm
+++ b/code/datums/supply_packs/explosives.dm
@@ -111,25 +111,25 @@
containername = "\improper explosive HEDP grenade crate (WARNING)"
group = "Explosives"
-/datum/supply_packs/explosives_M40_HPDP
- name = "M40 HPDP white phosphorus grenades crate (x6)"
+/datum/supply_packs/explosives_M40_CCDP
+ name = "M40 CCDP chemical compound grenades crate (x6)"
contains = list(
/obj/item/storage/box/packet/phosphorus,
/obj/item/storage/box/packet/phosphorus,
)
cost = 30
containertype = /obj/structure/closet/crate/explosives
- containername = "\improper M40 HPDP grenade crate (WARNING)"
+ containername = "\improper M40 CCDP grenade crate (WARNING)"
group = "Explosives"
-/datum/supply_packs/explosives_M40_HPDP_crate
- name = "M40 HPDP white phosphorus grenade box crate (x25)"
+/datum/supply_packs/explosives_M40_CCDP_crate
+ name = "M40 WPDP chemical compund grenade box crate (x25)"
contains = list(
/obj/item/storage/box/nade_box/phophorus,
)
cost = 100
containertype = /obj/structure/closet/crate/explosives
- containername = "\improper HPDP grenade crate (WARNING)"
+ containername = "\improper CCDP grenade crate (WARNING)"
group = "Explosives"
/datum/supply_packs/explosives_M40_HEFA
@@ -186,6 +186,16 @@
containername = "\improper explosive M74 AGM-I grenades crate (WARNING)"
group = "Explosives"
+/datum/supply_packs/explosives_M74_AGM_I_box
+ name = "M74 Airburst Grenade Munition incendiary grenades box crate (x25)"
+ contains = list(
+ /obj/item/storage/box/nade_box/airburstincen,
+ )
+ cost = 100
+ containertype = /obj/structure/closet/crate/explosives
+ containername = "\improper M74 Airburst Grenade Munition incendiary grenades crate (WARNING)"
+ group = "Explosives"
+
/datum/supply_packs/explosives_airburst_smoke
name = "M74 Airburst Grenade Munition smoke grenades crate (x6)"
contains = list(
diff --git a/code/datums/supply_packs/mortar.dm b/code/datums/supply_packs/mortar.dm
index 3f075cad632f..c9f53e49ce7d 100644
--- a/code/datums/supply_packs/mortar.dm
+++ b/code/datums/supply_packs/mortar.dm
@@ -72,3 +72,18 @@
containertype = /obj/structure/closet/crate/secure/mortar_ammo
containername = "\improper M402 mortar flare shells crate"
group = "Mortar"
+
+/datum/supply_packs/ammo_mortar_frag
+ name = "M402 mortar shells crate (x6 Frag)"
+ cost = 20
+ contains = list(
+ /obj/item/mortar_shell/frag,
+ /obj/item/mortar_shell/frag,
+ /obj/item/mortar_shell/frag,
+ /obj/item/mortar_shell/frag,
+ /obj/item/mortar_shell/frag,
+ /obj/item/mortar_shell/frag,
+ )
+ containertype = /obj/structure/closet/crate/secure/mortar_ammo
+ containername = "\improper M402 mortar frag shells crate"
+ group = "Mortar"
diff --git a/code/datums/vehicles.dm b/code/datums/vehicles.dm
index 67070dd04c0b..08c977b63fb6 100644
--- a/code/datums/vehicles.dm
+++ b/code/datums/vehicles.dm
@@ -26,10 +26,6 @@
name = "APC - No FPW"
interior_id = "apc_no_fpw"
-/datum/map_template/interior/fancy_locker
- name = "Fancy Locker"
- interior_id = "fancylocker"
-
/datum/map_template/interior/tank
name = "Tank"
interior_id = "tank"
diff --git a/code/game/area/Sulaco.dm b/code/game/area/Sulaco.dm
index a3d02b78636c..8facf9d44fd6 100644
--- a/code/game/area/Sulaco.dm
+++ b/code/game/area/Sulaco.dm
@@ -115,7 +115,58 @@
icon_state = "away2"
+/area/shuttle/drop2/Enter(atom/movable/O, atom/oldloc)
+ if(istype(O, /obj/structure/barricade))
+ return FALSE
+ return TRUE
+
+/area/shuttle/drop3
+ //soundscape_playlist = list('sound/soundscape/drum1.ogg')
+ soundscape_interval = 30 //seconds
+ is_resin_allowed = FALSE
+ flags_area = AREA_NOTUNNEL
+ is_landing_zone = TRUE
+ ceiling = CEILING_REINFORCED_METAL
+ base_lighting_alpha = 0
+
+/area/shuttle/drop3/sulaco
+ name = "\improper Dropship Saipan"
+ icon_state = "shuttle"
+ base_muffle = MUFFLE_HIGH
+ base_lighting_alpha = 255
+
+/area/shuttle/drop3/LV624
+ name = "\improper Dropship Saipan"
+ ambience_exterior = AMBIENCE_LV624
+ icon_state = "shuttle2"
+
+/area/shuttle/drop3/prison
+ name = "\improper Dropship Saipan"
+ ambience_exterior = AMBIENCE_PRISON
+ icon_state = "shuttle2"
+/area/shuttle/drop3/BigRed
+ name = "\improper Dropship Saipan"
+ ambience_exterior = AMBIENCE_BIGRED
+ icon_state = "shuttle2"
+
+/area/shuttle/drop3/ice_colony
+ name = "\improper Dropship Saipan"
+ icon_state = "shuttle2"
+
+/area/shuttle/drop3/DesertDam
+ name = "\improper Dropship Saipan"
+ ambience_exterior = AMBIENCE_TRIJENT
+ icon_state = "shuttle2"
+
+/area/shuttle/drop3/transit
+ ambience_exterior = 'sound/ambience/dropship_ambience_loop.ogg'
+ name = "\improper Dropship Saipan Transit"
+ icon_state = "shuttlered"
+
+/area/shuttle/drop3/lz3
+ name = "\improper Saipan Landing Zone"
+ icon_state = "away2"
//DISTRESS SHUTTLES
diff --git a/code/game/area/kutjevo.dm b/code/game/area/kutjevo.dm
index d0a4a30118b0..1180e10a761e 100644
--- a/code/game/area/kutjevo.dm
+++ b/code/game/area/kutjevo.dm
@@ -7,6 +7,7 @@
//ambience = list('figuresomethingout.ogg')
icon_state = "kutjevo"
can_build_special = TRUE //T-Comms structure
+ powernet_name = "ground"
temperature = 308.7 //kelvin, 35c, 95f
minimap_color = MINIMAP_AREA_ENGI
diff --git a/code/game/area/shiva.dm b/code/game/area/shiva.dm
index fc7424f8146b..dee9eb5f0aea 100644
--- a/code/game/area/shiva.dm
+++ b/code/game/area/shiva.dm
@@ -6,6 +6,7 @@
//ambience = list('figuresomethingout.ogg')
icon_state = "shiva"
can_build_special = TRUE //T-Comms structure
+ powernet_name = "ground"
temperature = ICE_COLONY_TEMPERATURE
minimap_color = MINIMAP_AREA_COLONY
diff --git a/code/game/area/strata.dm b/code/game/area/strata.dm
index 117cffa600d4..2bb17ea5d60d 100644
--- a/code/game/area/strata.dm
+++ b/code/game/area/strata.dm
@@ -12,6 +12,7 @@ EXTERIOR is FUCKING FREEZING, and refers to areas out in the open and or exposed
//ambience = list('figuresomethingout.ogg')
icon_state = "strata"
can_build_special = TRUE //T-Comms structure
+ powernet_name = "ground"
temperature = SOROKYNE_TEMPERATURE //If not in a building, it'll be cold. All interior areas are set to T20C
minimap_color = MINIMAP_AREA_COLONY
diff --git a/code/game/area/varadero.dm b/code/game/area/varadero.dm
index aac37bdf942a..b0e5d283fdcd 100644
--- a/code/game/area/varadero.dm
+++ b/code/game/area/varadero.dm
@@ -7,6 +7,7 @@
ambience_exterior = AMBIENCE_NV
icon_state = "varadero"
can_build_special = TRUE //T-Comms structure
+ powernet_name = "ground"
temperature = TROPICAL_TEMP
minimap_color = MINIMAP_AREA_COLONY
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 52a35b715b1a..be68dddff10f 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -31,6 +31,9 @@
///Highest-intensity light affecting us, which determines our visibility.
var/affecting_dynamic_lumi = 0
+ /// Holds a reference to the emissive blocker overlay
+ var/emissive_overlay
+
//===========================================================================
/atom/movable/Destroy(force)
for(var/atom/movable/I in contents)
@@ -39,6 +42,7 @@
pulledby.stop_pulling()
QDEL_NULL(launch_metadata)
QDEL_NULL(em_block)
+ QDEL_NULL(emissive_overlay)
if(loc)
loc.on_stored_atom_del(src) //things that container need to do when a movable atom inside it is deleted
@@ -79,45 +83,33 @@
/atom/movable/Initialize(mapload, ...)
. = ..()
+
+ update_emissive_block()
+
+ if(opacity)
+ AddElement(/datum/element/light_blocking)
+ if(light_system == MOVABLE_LIGHT)
+ AddComponent(/datum/component/overlay_lighting)
+ if(light_system == DIRECTIONAL_LIGHT)
+ AddComponent(/datum/component/overlay_lighting, is_directional = TRUE)
+
+/atom/movable/proc/update_emissive_block()
+ if(emissive_overlay)
+ overlays -= emissive_overlay
+
switch(blocks_emissive)
if(EMISSIVE_BLOCK_GENERIC)
var/mutable_appearance/gen_emissive_blocker = mutable_appearance(icon, icon_state, plane = EMISSIVE_PLANE, alpha = src.alpha)
gen_emissive_blocker.color = GLOB.em_block_color
gen_emissive_blocker.dir = dir
gen_emissive_blocker.appearance_flags |= appearance_flags
+ emissive_overlay = gen_emissive_blocker
overlays += gen_emissive_blocker
if(EMISSIVE_BLOCK_UNIQUE)
render_target = ref(src)
em_block = new(src, render_target)
+ emissive_overlay = em_block
overlays += list(em_block)
- if(opacity)
- AddElement(/datum/element/light_blocking)
- if(light_system == MOVABLE_LIGHT)
- AddComponent(/datum/component/overlay_lighting)
- if(light_system == DIRECTIONAL_LIGHT)
- AddComponent(/datum/component/overlay_lighting, is_directional = TRUE)
-
-/*
-
-///Updates this movables emissive overlay
-/atom/movable/proc/update_emissive_block()
- if(!blocks_emissive)
- return
- else if (blocks_emissive == EMISSIVE_BLOCK_GENERIC)
- var/mutable_appearance/gen_emissive_blocker = emissive_blocker(icon, icon_state, alpha = src.alpha, appearance_flags = src.appearance_flags)
- gen_emissive_blocker.dir = dir
- if(blocks_emissive == EMISSIVE_BLOCK_UNIQUE)
- if(!em_block)
- render_target = ref(src)
- em_block = new(src, render_target)
- return em_block
-
-/atom/movable/update_overlays()
- . = ..()
-
- . += update_emissive_block()
-
-*/
/atom/movable/vv_get_dropdown()
. = ..()
diff --git a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm
index b3fd079d638c..cfe67465df07 100644
--- a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm
+++ b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm
@@ -614,6 +614,7 @@
"Explosives and grenades",
"Rocket ammo",
"Sniper ammo",
+ "Anti-Material Sniper ammo",
"Pyrotechnician tanks",
"Scout ammo",
"Smartgun ammo",
@@ -634,14 +635,17 @@
if("Sniper ammo")
supply_drop = 3
to_chat(usr, SPAN_NOTICE("Sniper ammo will now drop!"))
- if("Explosives and grenades")
+ if("Anti-Material Sniper ammo")
supply_drop = 4
+ to_chat(usr, SPAN_NOTICE("Anti-Material Sniper ammo will now drop!"))
+ if("Explosives and grenades")
+ supply_drop = 5
to_chat(usr, SPAN_NOTICE("Explosives and grenades will now drop!"))
if("Pyrotechnician tanks")
- supply_drop = 5
+ supply_drop = 6
to_chat(usr, SPAN_NOTICE("Pyrotechnician tanks will now drop!"))
if("Scout ammo")
- supply_drop = 6
+ supply_drop = 7
to_chat(usr, SPAN_NOTICE("Scout ammo will now drop!"))
else
return
@@ -734,15 +738,21 @@
/obj/item/ammo_magazine/sniper,
/obj/item/ammo_magazine/sniper/incendiary,
/obj/item/ammo_magazine/sniper/flak)
- if(4) // Give them explosives + Grenades for the Grenade spec. Might be too many grenades, but we'll find out.
+ if(4) //Amr sniper ammo.
+ spawnitems = list(/obj/item/ammo_magazine/sniper/anti_materiel,
+ /obj/item/ammo_magazine/sniper/anti_materiel,
+ /obj/item/ammo_magazine/sniper/anti_materiel,
+ /obj/item/ammo_magazine/sniper/anti_materiel,
+ /obj/item/ammo_magazine/sniper/anti_materiel)
+ if(5) // Give them explosives + Grenades for the Grenade spec. Might be too many grenades, but we'll find out.
spawnitems = list(/obj/item/storage/box/explosive_mines,
/obj/item/storage/belt/grenade/full)
- if(5) // Pyrotech
+ if(6) // Pyrotech
var/fuel = pick(/obj/item/ammo_magazine/flamer_tank/large/B, /obj/item/ammo_magazine/flamer_tank/large/X)
spawnitems = list(/obj/item/ammo_magazine/flamer_tank/large,
/obj/item/ammo_magazine/flamer_tank/large,
fuel)
- if(6) // Scout
+ if(7) // Scout
spawnitems = list(/obj/item/ammo_magazine/rifle/m4ra/custom,
/obj/item/ammo_magazine/rifle/m4ra/custom,
/obj/item/ammo_magazine/rifle/m4ra/custom/incendiary,
diff --git a/code/game/jobs/job/marine/squads.dm b/code/game/jobs/job/marine/squads.dm
index 75f6622506a9..26cca9019639 100644
--- a/code/game/jobs/job/marine/squads.dm
+++ b/code/game/jobs/job/marine/squads.dm
@@ -232,6 +232,17 @@
roundstart = FALSE
locked = TRUE
+/datum/squad/marine/solardevils
+ name = SQUAD_SOLAR
+ equipment_color = "#5a2c2c"
+ chat_color = "#5a2c2c"
+ radio_freq = SOF_FREQ
+ minimap_color = "#5a2c2c"
+
+ active = FALSE
+ roundstart = FALSE
+ locked = TRUE
+
//############################### UPP Squads
/datum/squad/upp
diff --git a/code/game/jobs/job/special/provost.dm b/code/game/jobs/job/special/provost.dm
index c746e9f500b0..d5dd9dc3940f 100644
--- a/code/game/jobs/job/special/provost.dm
+++ b/code/game/jobs/job/special/provost.dm
@@ -14,6 +14,14 @@
/datum/job/special/provost/inspector
title = JOB_PROVOST_INSPECTOR
+//Provost Inspector
+/datum/job/special/provost/inspector/chief
+ title = JOB_PROVOST_CINSPECTOR
+
+//Provost Marshal
+/datum/job/special/provost/marshal/deputy
+ title = JOB_PROVOST_DMARSHAL
+
//Provost Marshal
/datum/job/special/provost/marshal
title = JOB_PROVOST_MARSHAL
diff --git a/code/game/jobs/job/special/uscm.dm b/code/game/jobs/job/special/uscm.dm
index 751322539f77..934241fdca8a 100644
--- a/code/game/jobs/job/special/uscm.dm
+++ b/code/game/jobs/job/special/uscm.dm
@@ -14,3 +14,6 @@
title = JOB_RIOT
/datum/job/special/uscm/riot/chief
title = JOB_RIOT_CHIEF
+
+/datum/job/special/uscm/tech
+ title = JOB_SQUAD_TECH
diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index f8ce33eb9911..30f55b9f5bf5 100644
--- a/code/game/machinery/camera/presets.dm
+++ b/code/game/machinery/camera/presets.dm
@@ -79,6 +79,9 @@
/obj/structure/machinery/camera/autoname/almayer/dropship_two
network = list(CAMERA_NET_ALMAYER, CAMERA_NET_NORMANDY)
+/obj/structure/machinery/camera/autoname/almayer/dropship_three
+ network = list(CAMERA_NET_ALMAYER, CAMERA_NET_RESEARCH)
+
/obj/structure/machinery/camera/autoname/almayer
name = "military-grade camera"
network = list(CAMERA_NET_ALMAYER)
diff --git a/code/game/machinery/computer/camera_console.dm b/code/game/machinery/computer/camera_console.dm
index e549436669de..af973e83edca 100644
--- a/code/game/machinery/computer/camera_console.dm
+++ b/code/game/machinery/computer/camera_console.dm
@@ -392,4 +392,8 @@
name = "\improper 'Normandy' camera controls"
network = list(CAMERA_NET_NORMANDY, CAMERA_NET_LASER_TARGETS)
+/obj/structure/machinery/computer/cameras/dropship/three
+ name = "\improper 'Saipan' camera controls"
+ network = list(CAMERA_NET_RESEARCH, CAMERA_NET_LASER_TARGETS)
+
#undef DEFAULT_MAP_SIZE
diff --git a/code/game/machinery/computer/dropship_weapons.dm b/code/game/machinery/computer/dropship_weapons.dm
index 7f8f4f2b3850..6f9862d3120a 100644
--- a/code/game/machinery/computer/dropship_weapons.dm
+++ b/code/game/machinery/computer/dropship_weapons.dm
@@ -890,6 +890,12 @@
firemission_envelope = new /datum/cas_fire_envelope/uscm_dropship()
shuttle_tag = DROPSHIP_NORMANDY
+/obj/structure/machinery/computer/dropship_weapons/dropship3
+ name = "\improper 'Saipan' weapons controls"
+ req_one_access = list(ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP, ACCESS_WY_FLIGHT)
+ firemission_envelope = new /datum/cas_fire_envelope/uscm_dropship()
+ shuttle_tag = DROPSHIP_SAIPAN
+
/obj/structure/machinery/computer/dropship_weapons/Destroy()
. = ..()
QDEL_NULL(firemission_envelope)
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index feb699fd245e..52c904e81ded 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -901,6 +901,9 @@
/obj/structure/machinery/door/airlock/hatch/cockpit/two
icon = 'icons/obj/structures/doors/dropship2_pilot.dmi'
+/obj/structure/machinery/door/airlock/hatch/cockpit/three
+ icon = 'icons/obj/structures/doors/dropship3_pilot.dmi'
+
//PRISON AIRLOCKS
/obj/structure/machinery/door/airlock/prison
name = "cell Door"
diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm
index 6e7f571a0d4e..2b05e2c77772 100644
--- a/code/game/machinery/doors/multi_tile.dm
+++ b/code/game/machinery/doors/multi_tile.dm
@@ -329,6 +329,10 @@
name = "\improper Normandy cargo door"
icon = 'icons/obj/structures/doors/dropship2_cargo.dmi'
+/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ds3
+ name = "\improper Saipan cargo door"
+ icon = 'icons/obj/structures/doors/dropship3_cargo.dmi'
+
/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside
width = 2
@@ -340,6 +344,10 @@
name = "\improper Normandy crew hatch"
icon = 'icons/obj/structures/doors/dropship2_side2.dmi'
+/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds3
+ name = "\improper Saipan crew hatch"
+ icon = 'icons/obj/structures/doors/dropship3_side2.dmi'
+
/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/blastdoor
name = "bulkhead blast door"
icon = 'icons/obj/structures/doors/almayerblastdoor.dmi'
diff --git a/code/game/machinery/vending/cm_vending.dm b/code/game/machinery/vending/cm_vending.dm
index 5746a29aa1ae..eb95a870faae 100644
--- a/code/game/machinery/vending/cm_vending.dm
+++ b/code/game/machinery/vending/cm_vending.dm
@@ -1216,6 +1216,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_corresponding_types_list, list(
/obj/item/ammo_box/magazine/lever_action/training/empty = /obj/item/ammo_box/magazine/lever_action/training,
/obj/item/ammo_box/magazine/lever_action/tracker/empty = /obj/item/ammo_box/magazine/lever_action/tracker,
/obj/item/ammo_box/magazine/lever_action/marksman/empty = /obj/item/ammo_box/magazine/lever_action/marksman,
+ /obj/item/ammo_box/magazine/lever_action/xm88/empty = /obj/item/ammo_box/magazine/lever_action/xm88,
/obj/item/ammo_box/rounds/smg/empty = /obj/item/ammo_box/rounds/smg,
/obj/item/ammo_box/rounds/smg/ap/empty = /obj/item/ammo_box/rounds/smg/ap,
@@ -1346,7 +1347,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_corresponding_types_list, list(
if(LAZYLEN(itemspec)) //making sure it's not empty
if(vend_delay)
overlays.Cut()
- icon_state = "[initial(icon_state)]_vend"
+ flick("[initial(icon_state)]_vend", src)
if(vend_sound)
playsound(loc, vend_sound, 25, 1, 2) //heard only near vendor
sleep(vend_delay)
diff --git a/code/game/machinery/vending/vendor_types/crew/medical.dm b/code/game/machinery/vending/vendor_types/crew/medical.dm
index d8e60fdb0026..b2477b4eb493 100644
--- a/code/game/machinery/vending/vendor_types/crew/medical.dm
+++ b/code/game/machinery/vending/vendor_types/crew/medical.dm
@@ -82,7 +82,8 @@ GLOBAL_LIST_INIT(cm_vending_clothing_doctor, list(
list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Bicaridine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/bicaridine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Kelotane)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/kelotane, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
- list("Pressurized Reagent Canister Pouch (Revival Mix)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_tricord, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Peridaxon)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_peri, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/tricordrazine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (EMPTY)", 0, /obj/item/storage/pouch/pressurized_reagent_canister, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
@@ -151,7 +152,8 @@ GLOBAL_LIST_INIT(cm_vending_clothing_nurse, list(
list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Bicaridine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/bicaridine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Kelotane)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/kelotane, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
- list("Pressurized Reagent Canister Pouch (Revival Mix)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_tricord, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Peridaxon)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_peri, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/tricordrazine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (EMPTY)", 0, /obj/item/storage/pouch/pressurized_reagent_canister, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
@@ -224,7 +226,8 @@ GLOBAL_LIST_INIT(cm_vending_clothing_researcher, list(
list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Bicaridine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/bicaridine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Kelotane)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/kelotane, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
- list("Pressurized Reagent Canister Pouch (Revival Mix)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_tricord, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Peridaxon)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_peri, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/tricordrazine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (EMPTY)", 0, /obj/item/storage/pouch/pressurized_reagent_canister, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/crew/sea.dm b/code/game/machinery/vending/vendor_types/crew/sea.dm
index 37cacfd14a6f..99daa1325b0e 100644
--- a/code/game/machinery/vending/vendor_types/crew/sea.dm
+++ b/code/game/machinery/vending/vendor_types/crew/sea.dm
@@ -2,7 +2,7 @@
GLOBAL_LIST_INIT(cm_vending_gear_sea, list(
list("PERSONAL PRIMARY (CHOOSE 1)", 0, null, null, null),
- list("M41A MK1 Pulse Rifle", 0, /obj/item/weapon/gun/rifle/m41aMK1, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR),
+ list("M41A MK1 Pulse Rifle", 0, /obj/item/weapon/gun/rifle/m41aMK1, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_REGULAR),
list("SPARE AMMUNITION", 0, null, null, null),
list("M41A MK1 Magazine", 9, /obj/item/ammo_magazine/rifle/m41aMK1, null, VENDOR_ITEM_REGULAR),
@@ -28,11 +28,13 @@ GLOBAL_LIST_INIT(cm_vending_gear_sea, list(
GLOBAL_LIST_INIT(cm_vending_clothing_sea, list(
list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null),
+ list("Drill Hat", 0, /obj/item/clothing/head/drillhat, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED),
list("Officer Uniform", 0, /obj/item/clothing/under/marine/dress, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY),
+ list("USCM Service Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/service, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY),
list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom/cdrcom, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY),
list("Satchel", 0, /obj/item/storage/backpack/satchel/lockable, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY),
list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY),
- list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY),
list("GLOVES (CHOOSE 1)", 0, null, null, null),
list("Insulated Gloves", 0, /obj/item/clothing/gloves/yellow, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_REGULAR),
@@ -54,12 +56,12 @@ GLOBAL_LIST_INIT(cm_vending_clothing_sea, list(
list("Sidearm Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
- list("COMBAT ARMOR (CHOOSE 1)", 0, null, null, null),
- list("M3-VL Pattern Ballistics Vest", 0, /obj/item/clothing/suit/storage/marine/light/vest, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
- list("M3-L Pattern Light Armor", 0, /obj/item/clothing/suit/storage/marine/light, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_RECOMMENDED),
- list("M3 Pattern Padded Armor", 0, /obj/item/clothing/suit/storage/marine/medium/padded, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
- list("Bulletproof Vest", 0, /obj/item/clothing/suit/armor/bulletproof, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
- list("USCM Service Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/service, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("COMBAT GEAR", 0, null, null, null),
+ list("M10 Helmet", 0, /obj/item/clothing/head/helmet/marine, MARINE_CAN_BUY_COMBAT_HELMET, VENDOR_ITEM_REGULAR),
+ list("M3-VL Pattern Ballistics Vest", 0, /obj/item/clothing/suit/storage/marine/light/vest, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_REGULAR),
+ list("M3-L Pattern Light Armor", 0, /obj/item/clothing/suit/storage/marine/light, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_RECOMMENDED),
+ list("M3 Pattern Padded Armor", 0, /obj/item/clothing/suit/storage/marine/medium/padded, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Bulletproof Vest", 0, /obj/item/clothing/suit/armor/bulletproof, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_REGULAR),
list("EYEWEAR (CHOOSE 1)", 0, null, null, null),
list("Welding Goggles", 0, /obj/item/clothing/glasses/welding, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR),
@@ -73,10 +75,6 @@ GLOBAL_LIST_INIT(cm_vending_clothing_sea, list(
list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
-
- list("HEADWEAR (CHOOSE 1)", 0, null, null, null),
- list("Drill Hat", 0, /obj/item/clothing/head/drillhat, MARINE_CAN_BUY_MASK, VENDOR_ITEM_RECOMMENDED),
- list("M10 Helmet", 0, /obj/item/clothing/head/helmet/marine, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
))
/obj/structure/machinery/cm_vending/clothing/sea
diff --git a/code/game/machinery/vending/vendor_types/crew/senior_officers.dm b/code/game/machinery/vending/vendor_types/crew/senior_officers.dm
index b63a73a90f06..e724d2f33a3b 100644
--- a/code/game/machinery/vending/vendor_types/crew/senior_officers.dm
+++ b/code/game/machinery/vending/vendor_types/crew/senior_officers.dm
@@ -176,10 +176,11 @@ GLOBAL_LIST_INIT(cm_vending_clothing_req_officer, list(
list("Quartermaster Uniform", 0, /obj/item/clothing/under/rank/qm_suit, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY),
list("Headset", 0, /obj/item/device/radio/headset/almayer/qm, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY),
list("Satchel", 0, /obj/item/storage/backpack/marine/satchel/tech, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY),
- list("Quartermaster Jacket", 0, /obj/item/clothing/suit/storage/RO, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY),
+ list("Quartermaster Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/RO, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY),
list("Headgear (CHOOSE 1)", 0, null, null, null),
list("Quartermaster Cap", 0, /obj/item/clothing/head/cmcap/req/ro, MARINE_CAN_BUY_MASK, VENDOR_ITEM_RECOMMENDED),
+ list("Quartermaster Beret", 0, /obj/item/clothing/head/beret/marine/ro, MARINE_CAN_BUY_MASK, VENDOR_ITEM_RECOMMENDED),
list("Requisitions Cap", 0, /obj/item/clothing/head/cmcap/req, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
list("PERSONAL SIDEARM (CHOOSE 1)", 0, null, null, null),
@@ -283,7 +284,8 @@ GLOBAL_LIST_INIT(cm_vending_clothing_cmo, list(
list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Bicaridine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/bicaridine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Kelotane)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/kelotane, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
- list("Pressurized Reagent Canister Pouch (Revival Mix)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_tricord, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Peridaxon)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_peri, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/tricordrazine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (EMPTY)", 0, /obj/item/storage/pouch/pressurized_reagent_canister, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Large General Pouch", 0, /obj/item/storage/pouch/general/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm
index 9ce15535e2da..240155176efa 100644
--- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm
+++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm
@@ -164,7 +164,8 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list(
list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("Pressurized Reagent Canister Pouch (Bicaridine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/bicaridine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("Pressurized Reagent Canister Pouch (Kelotane)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/kelotane, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
- list("Pressurized Reagent Canister Pouch (Revival Mix)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_tricord, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Peridaxon)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_peri, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/tricordrazine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("Pressurized Reagent Canister Pouch (EMPTY)", 0, /obj/item/storage/pouch/pressurized_reagent_canister, 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),
@@ -316,7 +317,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list(
list("Windbreaker, Exploration", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_covenant, null, VENDOR_ITEM_REGULAR),
list("Labcoat", 12, /obj/item/clothing/suit/storage/labcoat, null, VENDOR_ITEM_REGULAR),
list("Labcoat, Researcher", 12, /obj/item/clothing/suit/storage/labcoat/researcher, null, VENDOR_ITEM_REGULAR),
- list("Quartermaster Jacket", 12, /obj/item/clothing/suit/storage/RO, null, VENDOR_ITEM_REGULAR),
+ list("Quartermaster Jacket", 12, /obj/item/clothing/suit/storage/jacket/marine/RO, null, VENDOR_ITEM_REGULAR),
list("Bio Suit", 12, /obj/item/clothing/suit/storage/synthbio, null, VENDOR_ITEM_REGULAR),
list("Black Suit Jacket", 12, /obj/item/clothing/suit/storage/jacket/marine/corporate/black, null, VENDOR_ITEM_REGULAR),
list("Brown Suit Jacket", 12, /obj/item/clothing/suit/storage/jacket/marine/corporate/brown, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/requisitions.dm b/code/game/machinery/vending/vendor_types/requisitions.dm
index 0d815e73d1a3..e530b754d78b 100644
--- a/code/game/machinery/vending/vendor_types/requisitions.dm
+++ b/code/game/machinery/vending/vendor_types/requisitions.dm
@@ -48,7 +48,7 @@
list("M20 Claymore Anti-Personnel Mine", floor(scale * 4), /obj/item/explosive/mine, VENDOR_ITEM_REGULAR),
list("M40 HEDP Grenade", floor(scale * 25), /obj/item/explosive/grenade/high_explosive, VENDOR_ITEM_REGULAR),
list("M40 HIDP Incendiary Grenade", floor(scale * 4), /obj/item/explosive/grenade/incendiary, VENDOR_ITEM_REGULAR),
- list("M40 HPDP White Phosphorus Smoke Grenade", floor(scale * 4), /obj/item/explosive/grenade/phosphorus, VENDOR_ITEM_REGULAR),
+ list("M40 CCDP Chemical Compound Smoke Grenade", floor(scale * 4), /obj/item/explosive/grenade/phosphorus, VENDOR_ITEM_REGULAR),
list("M40 HSDP Smoke Grenade", floor(scale * 5), /obj/item/explosive/grenade/smokebomb, VENDOR_ITEM_REGULAR),
list("M74 AGM-Frag Airburst Grenade", floor(scale * 4), /obj/item/explosive/grenade/high_explosive/airburst, VENDOR_ITEM_REGULAR),
list("M74 AGM-Incendiary Airburst Grenade", floor(scale * 4), /obj/item/explosive/grenade/incendiary/airburst, VENDOR_ITEM_REGULAR),
@@ -68,6 +68,7 @@
list("Webbing", floor(scale * 5), /obj/item/clothing/accessory/storage/webbing, VENDOR_ITEM_REGULAR),
list("Knife Webbing", floor(scale * 1), /obj/item/clothing/accessory/storage/knifeharness, VENDOR_ITEM_REGULAR),
list("Drop Pouch", floor(scale * 2), /obj/item/clothing/accessory/storage/droppouch, VENDOR_ITEM_REGULAR),
+ list("External Webbing", floor(scale * 5), /obj/item/clothing/suit/storage/webbing, VENDOR_ITEM_REGULAR),
list("BACKPACKS", -1, null, null),
list("Lightweight IMP Backpack", floor(scale * 15), /obj/item/storage/backpack/marine, VENDOR_ITEM_REGULAR),
@@ -118,7 +119,7 @@
list("Large Shotgun Shell Pouch", floor(scale * 1), /obj/item/storage/pouch/shotgun/large, VENDOR_ITEM_REGULAR),
list("MISCELLANEOUS", -1, null, null),
- list("Combat Flashlight", floor(scale * 5), /obj/item/device/flashlight/combat, VENDOR_ITEM_REGULAR),
+ list("Combat Flashlight", floor(scale * 8), /obj/item/device/flashlight/combat, VENDOR_ITEM_REGULAR),
list("Entrenching Tool", floor(scale * 4), /obj/item/tool/shovel/etool/folded, VENDOR_ITEM_REGULAR),
list("Gas Mask", floor(scale * 10), /obj/item/clothing/mask/gas, VENDOR_ITEM_REGULAR),
list("M89-S Signal Flare Pack", floor(scale * 2), /obj/item/storage/box/m94/signal, VENDOR_ITEM_REGULAR),
@@ -147,19 +148,24 @@
list("M40 HEDP Grenade Packet", 0, /obj/item/storage/box/packet/high_explosive, VENDOR_ITEM_REGULAR),
list("M40 HEDP Grenade Box", 0, /obj/item/storage/box/nade_box, VENDOR_ITEM_REGULAR),
list("M40 HIDP Grenade Packet", 0, /obj/item/storage/box/packet/incendiary, VENDOR_ITEM_REGULAR),
- list("M40 HPDP Grenade Box", 0, /obj/item/storage/box/nade_box/phophorus, VENDOR_ITEM_REGULAR),
+ list("M40 HIDP Grenade Box", 0, /obj/item/storage/box/nade_box/incen, VENDOR_ITEM_REGULAR),
+ list("M40 CCDP Grenade Packet", 0, /obj/item/storage/box/packet/phosphorus/strong, VENDOR_ITEM_REGULAR),
+ list("M40 CCDP Grenade Box", 0, /obj/item/storage/box/nade_box/phophorus, VENDOR_ITEM_REGULAR),
list("M40 HSDP Grenade Packet", 0, /obj/item/storage/box/packet/smoke, VENDOR_ITEM_REGULAR),
+ list("M40 MFHS Grenade Packet", 0, /obj/item/storage/box/packet/foam, VENDOR_ITEM_REGULAR),
list("M40 HIRR Baton Slug Packet", 0, /obj/item/storage/box/packet/baton_slug, VENDOR_ITEM_REGULAR),
- list("M74 AGM-Airburst Grenade Packet", 0, /obj/item/storage/box/packet/airburst_he, VENDOR_ITEM_REGULAR),
- list("M74 AGM-F grenade box", 0, /obj/item/storage/box/nade_box/airburst, VENDOR_ITEM_REGULAR),
- list("M74 AGM-Airburst Incendiary Grenade Packet", 0, /obj/item/storage/box/packet/airburst_incen, VENDOR_ITEM_REGULAR),
- list("M74 AGM-Airburst Smoke Grenade Packet", 0, /obj/item/storage/box/packet/airburst_smoke, VENDOR_ITEM_REGULAR),
+ list("M74 AGM-F Grenade Packet", 0, /obj/item/storage/box/packet/airburst_he, VENDOR_ITEM_REGULAR),
+ list("M74 AGM-F Grenade box", 0, /obj/item/storage/box/nade_box/airburst, VENDOR_ITEM_REGULAR),
+ list("M74 AGM-I Grenade Packet", 0, /obj/item/storage/box/packet/airburst_incen, VENDOR_ITEM_REGULAR),
+ list("M74 AGM-I Grenade Box", 0, /obj/item/storage/box/nade_box/airburstincen, VENDOR_ITEM_REGULAR),
+ list("M74 AGM-S Smoke Grenade Packet", 0, /obj/item/storage/box/packet/airburst_smoke, VENDOR_ITEM_REGULAR),
list("M74 AGM-S Star Shell Packet", 0, /obj/item/storage/box/packet/flare, VENDOR_ITEM_REGULAR),
list("M74 AGM-H Hornet Shell Packet", 0, /obj/item/storage/box/packet/hornet, VENDOR_ITEM_REGULAR),
list("G2 Electroshock grenade packet", 0, /obj/item/storage/box/packet/sebb, VENDOR_ITEM_REGULAR),
list("M20 mine box", 0, /obj/item/storage/box/explosive_mines, VENDOR_ITEM_REGULAR),
list("OTHER BOXES", -1, null, null),
+ list("Box of Combat Flashlights", 0, /obj/item/ammo_box/magazine/misc/flashlight/combat, VENDOR_ITEM_REGULAR),
list("Box of M94 Marking Flare Packs", 0, /obj/item/ammo_box/magazine/misc/flares, VENDOR_ITEM_REGULAR),
list("Box of M89 Signal Flare Packs", 0, /obj/item/ammo_box/magazine/misc/flares/signal, VENDOR_ITEM_REGULAR),
list("Box of High-Capacity Power Cells", 0, /obj/item/ammo_box/magazine/misc/power_cell, VENDOR_ITEM_REGULAR),
@@ -206,6 +212,8 @@
/obj/structure/machinery/cm_vending/sorted/cargo_guns/cargo/blend
icon_state = "req_guns_wall"
+ vend_delay = 3
+ vend_sound = 'sound/machines/vending_drop.ogg'
tiles_with = list(
/obj/structure/window/framed/almayer,
/obj/structure/machinery/door/airlock,
@@ -236,6 +244,7 @@
list("Box Of Buckshot Shells", floor(scale * 56), /obj/item/ammo_magazine/shotgun/buckshot, VENDOR_ITEM_REGULAR),
list("Box Of Flechette Shells", floor(scale * 56), /obj/item/ammo_magazine/shotgun/flechette, VENDOR_ITEM_REGULAR),
list("Box Of Shotgun Slugs", floor(scale * 56), /obj/item/ammo_magazine/shotgun/slugs, VENDOR_ITEM_REGULAR),
+ list("Box Of Breaching Slugs", floor(scale * 4), /obj/item/ammo_magazine/shotgun/light/breaching, VENDOR_ITEM_REGULAR),
list("M4RA Magazine (10x24mm)", floor(scale * 60), /obj/item/ammo_magazine/rifle/m4ra, VENDOR_ITEM_REGULAR),
list("M41A MK2 Magazine (10x24mm)", floor(scale * 100), /obj/item/ammo_magazine/rifle, VENDOR_ITEM_REGULAR),
list("M39 HV Magazine (10x20mm)", floor(scale * 100), /obj/item/ammo_magazine/smg/m39, VENDOR_ITEM_REGULAR),
@@ -260,6 +269,7 @@
list("M44 Marksman Speed Loader (.44)", 6, /obj/item/ammo_magazine/revolver/marksman, VENDOR_ITEM_REGULAR),
list("M4A3 HP Magazine (9mm)", floor(scale * 2), /obj/item/ammo_magazine/pistol/hp, VENDOR_ITEM_REGULAR),
list("M41AE2 Holo Target Rounds (10x24mm)", floor(scale * 2), /obj/item/ammo_magazine/rifle/lmg/holo_target, VENDOR_ITEM_REGULAR),
+ list("Box Of .458 SOCOM Rounds (.458 SOCOM)", floor(scale * 4), /obj/item/ammo_magazine/lever_action/xm88, VENDOR_ITEM_REGULAR),
list("RESTRICTED FIREARM AMMUNITION", -1, null, null),
list("VP78 Magazine", 11, /obj/item/ammo_magazine/pistol/vp78, VENDOR_ITEM_REGULAR),
@@ -291,11 +301,12 @@
list("Shotgun Shell Box (Buckshot x 100)", 0, /obj/item/ammo_box/magazine/shotgun/buckshot, VENDOR_ITEM_REGULAR),
list("Shotgun Shell Box (Flechette x 100)", 0, /obj/item/ammo_box/magazine/shotgun/flechette, VENDOR_ITEM_REGULAR),
list("Shotgun Shell Box (Slugs x 100)", 0, /obj/item/ammo_box/magazine/shotgun, VENDOR_ITEM_REGULAR),
- list("Shotgun Shell Box (16g) (Breaching x 120)", 1, /obj/item/ammo_box/magazine/shotgun/light/breaching, VENDOR_ITEM_REGULAR),
+ list("Shotgun Shell Box (16g) (Breaching x 120)", 0, /obj/item/ammo_box/magazine/shotgun/light/breaching, VENDOR_ITEM_REGULAR),
list("Magazine Box (88 Mod 4 AP x 16)", 0, /obj/item/ammo_box/magazine/mod88, VENDOR_ITEM_REGULAR),
list("Magazine Box (SU-6 x 16)", 0, /obj/item/ammo_box/magazine/su6, VENDOR_ITEM_REGULAR),
list("Magazine Box (VP78 x 16)", 0, /obj/item/ammo_box/magazine/vp78, VENDOR_ITEM_REGULAR),
list("Magazine Box (XM51 x 8)", 0, /obj/item/ammo_box/magazine/xm51, VENDOR_ITEM_REGULAR),
+ list("Rounds Box (.458 SOCOM x 300)", 0, /obj/item/ammo_box/magazine/lever_action/xm88, VENDOR_ITEM_REGULAR),
list("Ammo Box (M2C x 8)", 0, /obj/item/ammo_box/magazine/m2c, VENDOR_ITEM_REGULAR),
list("Drum Box (M56B x 8)", 0, /obj/item/ammo_box/magazine/m56b, VENDOR_ITEM_REGULAR),
list("Drum Box (M56D x 8)", 0, /obj/item/ammo_box/magazine/m56d, VENDOR_ITEM_REGULAR),
@@ -339,11 +350,14 @@
return //We found our item, no reason to go on.
/obj/structure/machinery/cm_vending/sorted/cargo_ammo/cargo/blend
- icon_state = "req_ammo_wall"
- tiles_with = list(
- /obj/structure/window/framed/almayer,
- /obj/structure/machinery/door/airlock,
- /turf/closed/wall/almayer)
+ icon_state = "req_ammo_wall"
+ vend_delay = 3
+ vend_sound = 'sound/machines/vending_drop.ogg'
+ tiles_with = list(
+ /obj/structure/window/framed/almayer,
+ /obj/structure/machinery/door/airlock,
+ /turf/closed/wall/almayer,
+ )
//Special cargo-specific vendor with vending offsets
/obj/structure/machinery/cm_vending/sorted/cargo_ammo/cargo
@@ -410,6 +424,8 @@
/obj/structure/machinery/cm_vending/sorted/attachments/blend
icon_state = "req_attach_wall"
+ vend_delay = 3
+ vend_sound = 'sound/machines/vending_drop.ogg'
tiles_with = list(
/obj/structure/window/framed/almayer,
/obj/structure/machinery/door/airlock,
@@ -428,12 +444,24 @@
listed_products = list(
list("UNIFORM", -1, null, null),
- list("Lightweight IMP Backpack", 20, /obj/item/storage/backpack/marine, VENDOR_ITEM_REGULAR),
+ list("USCM Uniform", 20, /obj/item/clothing/under/marine, VENDOR_ITEM_REGULAR),
+ list("USCM Combat Technician Uniform", 5, /obj/item/clothing/under/marine/engineer, VENDOR_ITEM_REGULAR),
+ list("USCM Hospital Corpsman uniform", 5, /obj/item/clothing/under/marine/medic, VENDOR_ITEM_REGULAR),
+
+ list("BOOTS", -1, null, null),
list("Marine Combat Boots", 20, /obj/item/clothing/shoes/marine, VENDOR_ITEM_REGULAR),
- list("M276 Ammo Load Rig", 10, /obj/item/storage/belt/marine, VENDOR_ITEM_REGULAR),
- list("M276 Shotgun Shell Loading Rig", 10, /obj/item/storage/belt/shotgun, VENDOR_ITEM_REGULAR),
+ list("Marine Brown Combat Boots", 5, /obj/item/clothing/shoes/marine/brown, VENDOR_ITEM_REGULAR),
+ list("Marine Jungle Combat Boots", 5, /obj/item/clothing/shoes/marine/jungle, VENDOR_ITEM_REGULAR),
+
+ list("BACKPACKS", -1, null, null),
+ list("Lightweight IMP Backpack", 20, /obj/item/storage/backpack/marine, VENDOR_ITEM_REGULAR),
list("USCM Satchel", 20, /obj/item/storage/backpack/marine/satchel, VENDOR_ITEM_REGULAR),
- list("USCM Uniform", 20, /obj/item/clothing/under/marine, VENDOR_ITEM_REGULAR),
+ list("USCM Chestrig", 10, /obj/item/storage/backpack/marine/satchel/chestrig, VENDOR_ITEM_REGULAR),
+ list("USCM Technician Backpack", 10, /obj/item/storage/backpack/marine/tech, VENDOR_ITEM_REGULAR),
+ list("USCM Technician Chestrig", 10, /obj/item/storage/backpack/marine/satchel/tech, VENDOR_ITEM_REGULAR),
+ list("USCM Corpsman Backpack", 10, /obj/item/storage/backpack/marine/medic, VENDOR_ITEM_REGULAR),
+ list("USCM Corpsman Satchel", 10, /obj/item/storage/backpack/marine/satchel/medic, VENDOR_ITEM_REGULAR),
+
list("ARMOR", -1, null, null),
list("M10 Pattern Marine Helmet", 20, /obj/item/clothing/head/helmet/marine, VENDOR_ITEM_REGULAR),
@@ -450,6 +478,7 @@
list("GLOVES", -1, null, null),
list("Marine Combat Gloves", 40, /obj/item/clothing/gloves/marine, VENDOR_ITEM_REGULAR),
list("Marine Black Combat Gloves", 40, /obj/item/clothing/gloves/marine/black, VENDOR_ITEM_REGULAR),
+ list("Marine Brown Combat Gloves", 20, /obj/item/clothing/gloves/marine/brown, VENDOR_ITEM_REGULAR),
list("RADIO", -1, null, null),
list("Alpha Squad Radio Encryption Key", 5, /obj/item/device/encryptionkey/alpha, VENDOR_ITEM_REGULAR),
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 74a3d2a6167b..8d5e7b83590f 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
@@ -27,7 +27,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_engi, list(
list("EXPLOSIVES", 0, null, null, null),
list("M40 HEDP High Explosive Packet (x3 grenades)", 18, /obj/item/storage/box/packet/high_explosive, null, VENDOR_ITEM_REGULAR),
list("M40 HIDP Incendiary Packet (x3 grenades)", 18, /obj/item/storage/box/packet/incendiary, null, VENDOR_ITEM_REGULAR),
- list("M40 HPDP White Phosphorus Packet (x3 grenades)", 18, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR),
+ list("M40 WPDP White Phosphorus Packet (x3 grenades)", 18, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR),
list("M40 HSDP Smoke Packet (x3 grenades)", 9, /obj/item/storage/box/packet/smoke, null, VENDOR_ITEM_REGULAR),
list("M74 AGM-Frag Airburst Packet (x3 airburst grenades)", 18, /obj/item/storage/box/packet/airburst_he, null, VENDOR_ITEM_REGULAR),
list("M74 AGM-Incendiary Airburst Packet (x3 airburst grenades)", 18, /obj/item/storage/box/packet/airburst_incen, 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 0055dc2b1375..8cb71a57872f 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
@@ -53,7 +53,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_leader, list(
list("EXPLOSIVES", 0, null, null, null),
list("M40 HEDP High Explosive Packet (x3 grenades)", 18, /obj/item/storage/box/packet/high_explosive, null, VENDOR_ITEM_REGULAR),
list("M40 HIDP Incendiary Packet (x3 grenades)", 18, /obj/item/storage/box/packet/incendiary, null, VENDOR_ITEM_REGULAR),
- list("M40 HPDP White Phosphorus Packet (x3 grenades)", 18, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR),
+ list("M40 WPDP White Phosphorus Packet (x3 grenades)", 18, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR),
list("M40 HSDP Smoke Packet (x3 grenades)", 9, /obj/item/storage/box/packet/smoke, null, VENDOR_ITEM_REGULAR),
list("M74 AGM-Frag Airburst Packet (x3 airburst grenades)", 20, /obj/item/storage/box/packet/airburst_he, null, VENDOR_ITEM_REGULAR),
list("M74 AGM-Incendiary Airburst Packet (x3 airburst grenades)", 20, /obj/item/storage/box/packet/airburst_incen, 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 a8cc8be64bda..9952c7f00b8f 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
@@ -50,7 +50,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_medic, list(
list("EXPLOSIVES", 0, null, null, null),
list("M40 HEDP High Explosive Packet (x3 grenades)", 18, /obj/item/storage/box/packet/high_explosive, null, VENDOR_ITEM_REGULAR),
list("M40 HIDP Incendiary Packet (x3 grenades)", 18, /obj/item/storage/box/packet/incendiary, null, VENDOR_ITEM_REGULAR),
- list("M40 HPDP White Phosphorus Packet (x3 grenades)", 18, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR),
+ list("M40 WPDP White Phosphorus Packet (x3 grenades)", 18, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR),
list("M40 HSDP Smoke Packet (x3 grenades)", 9, /obj/item/storage/box/packet/smoke, null, VENDOR_ITEM_REGULAR),
list("M74 AGM-Frag Airburst Packet (x3 airburst grenades)", 20, /obj/item/storage/box/packet/airburst_he, null, VENDOR_ITEM_REGULAR),
list("M74 AGM-Incendiary Airburst Packet (x3 airburst grenades)", 20, /obj/item/storage/box/packet/airburst_incen, null, VENDOR_ITEM_REGULAR),
@@ -173,7 +173,8 @@ GLOBAL_LIST_INIT(cm_vending_clothing_medic, list(
list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Bicaridine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/bicaridine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Kelotane)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/kelotane, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
- list("Pressurized Reagent Canister Pouch (Revival Mix)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_tricord, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Peridaxon)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_peri, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/tricordrazine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (EMPTY)", 0, /obj/item/storage/pouch/pressurized_reagent_canister, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
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 1db378bd1d98..f210aed9518a 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
@@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_marine, list(
list("EXPLOSIVES", 0, null, null, null),
list("M40 HEDP High Explosive Packet (x3 grenades)", 20, /obj/item/storage/box/packet/high_explosive, null, VENDOR_ITEM_REGULAR),
list("M40 HIDP Incendiary Packet (x3 grenades)", 20, /obj/item/storage/box/packet/incendiary, null, VENDOR_ITEM_REGULAR),
- list("M40 HPDP White Phosphorus Packet (x3 grenades)", 20, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR),
+ list("M40 WPDP White Phosphorus Packet (x3 grenades)", 20, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR),
list("M40 HSDP Smoke Packet (x3 grenades)", 10, /obj/item/storage/box/packet/smoke, null, VENDOR_ITEM_REGULAR),
list("M74 AGM-Frag Airburst Packet (x3 airburst grenades)", 15, /obj/item/storage/box/packet/airburst_he, null, VENDOR_ITEM_REGULAR),
list("M74 AGM-Incendiary Airburst Packet (x3 airburst grenades)", 15, /obj/item/storage/box/packet/airburst_incen, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm
index 962580529eb2..4507dceae07c 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm
@@ -12,7 +12,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_smartgun, list(
list("EXPLOSIVES", 0, null, null, null),
list("M40 HEDP High Explosive Packet (x3 grenades)", 30, /obj/item/storage/box/packet/high_explosive, null, VENDOR_ITEM_REGULAR),
list("M40 HIDP Incendiary Packet (x3 grenades)", 30, /obj/item/storage/box/packet/incendiary, null, VENDOR_ITEM_REGULAR),
- list("M40 HPDP White Phosphorus Packet (x3 grenades)", 30, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR),
+ list("M40 WPDP White Phosphorus Packet (x3 grenades)", 30, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR),
list("M40 HSDP Smoke Packet (x3 grenades)", 15, /obj/item/storage/box/packet/smoke, null, VENDOR_ITEM_REGULAR),
list("M74 AGM-Frag Airburst Packet (x3 airburst grenades)", 20, /obj/item/storage/box/packet/airburst_he, null, VENDOR_ITEM_REGULAR),
list("M74 AGM-Incendiary Airburst Packet (x3 airburst grenades)", 20, /obj/item/storage/box/packet/airburst_incen, null, VENDOR_ITEM_REGULAR),
@@ -42,7 +42,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_smartgun, list(
list("Whistle", 5, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR),
list("Roller Bed", 5, /obj/item/roller, null, VENDOR_ITEM_REGULAR),
list("Fulton Device Stack", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR),
- list("Smartgun DV9 Battery", 15, /obj/item/smartgun_battery, null, VENDOR_ITEM_REGULAR),
+ list("DV9 Smartgun Battery", 15, /obj/item/smartgun_battery, null, VENDOR_ITEM_REGULAR),
list("BINOCULARS", 0, null, null, null),
list("Binoculars", 5, /obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm
index 527bb89b6af2..8e84f7556b50 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm
@@ -28,7 +28,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_spec, list(
list("EXTRA GRENADES", 0, null, null, null),
list("M40 HEDP Grenades x6", 40, /obj/effect/essentials_set/hedp_6_pack, null, VENDOR_ITEM_REGULAR),
list("M40 HIDP Incendiary Grenades x6", 40, /obj/effect/essentials_set/hidp_6_pack, null, VENDOR_ITEM_REGULAR),
- list("M40 HPDP White Phosphorus Grenades x6", 40, /obj/effect/essentials_set/hpdp_6_pack, null, VENDOR_ITEM_REGULAR),
+ list("M40 CCDP Chemical Compound Grenades x6", 40, /obj/effect/essentials_set/ccdp_6_pack, null, VENDOR_ITEM_REGULAR),
list("M74 AGM-F Fragmentation Grenades x6", 40, /obj/effect/essentials_set/agmf_6_pack, null, VENDOR_ITEM_REGULAR),
list("M74 AGM-I Incendiary Grenades x6", 40, /obj/effect/essentials_set/agmi_6_pack, null, VENDOR_ITEM_REGULAR),
list("M74 AGM-S Smoke Grenades x6", 20, /obj/effect/essentials_set/agms_6_pack, null, VENDOR_ITEM_REGULAR),
@@ -211,7 +211,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_specialist, list(
/obj/item/explosive/grenade/incendiary,
)
-/obj/effect/essentials_set/hpdp_6_pack
+/obj/effect/essentials_set/ccdp_6_pack
spawned_gear_list = list(
/obj/item/explosive/grenade/phosphorus,
/obj/item/explosive/grenade/phosphorus,
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm
index a4535fc7bfb4..0d338502972d 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm
@@ -4,7 +4,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_tl, list(
list("EXPLOSIVES", 0, null, null, null),
list("M40 HEDP High Explosive Packet (x3 grenades)", 18, /obj/item/storage/box/packet/high_explosive, null, VENDOR_ITEM_REGULAR),
list("M40 HIDP Incendiary Packet (x3 grenades)", 18, /obj/item/storage/box/packet/incendiary, null, VENDOR_ITEM_REGULAR),
- list("M40 HPDP White Phosphorus Packet (x3 grenades)", 18, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR),
+ list("M40 WPDP White Phosphorus Packet (x3 grenades)", 18, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR),
list("M40 HSDP Smoke Packet (x3 grenades)", 9, /obj/item/storage/box/packet/smoke, null, VENDOR_ITEM_REGULAR),
list("M74 AGM-Frag Airburst Packet (x3 airburst grenades)", 20, /obj/item/storage/box/packet/airburst_he, null, VENDOR_ITEM_REGULAR),
list("M74 AGM-Incendiary Airburst Packet (x3 airburst grenades)", 20, /obj/item/storage/box/packet/airburst_incen, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/wo_vendors.dm b/code/game/machinery/vending/vendor_types/wo_vendors.dm
index 1a4c3d3b5bd8..ce0b098ed9e5 100644
--- a/code/game/machinery/vending/vendor_types/wo_vendors.dm
+++ b/code/game/machinery/vending/vendor_types/wo_vendors.dm
@@ -178,6 +178,7 @@
list("M42A Flak Magazine (10x28mm)", floor(scale * 1), /obj/item/ammo_magazine/sniper/flak, VENDOR_ITEM_REGULAR),
list("M42A Incendiary Magazine (10x28mm)", floor(scale * 1), /obj/item/ammo_magazine/sniper/incendiary, VENDOR_ITEM_REGULAR),
list("M42A Marksman Magazine (10x28mm Caseless)", floor(scale * 1.5), /obj/item/ammo_magazine/sniper, VENDOR_ITEM_REGULAR),
+ list("XM43E1 Marksman Magazine (10x99mm Caseless)", floor(scale * 3), /obj/item/ammo_magazine/sniper/anti_materiel, VENDOR_ITEM_REGULAR),
list("EXTRA DEMOLITIONIST AMMUNITION", -1, null, null, null),
list("84mm Anti-Armor Rocket", floor(scale * 1), /obj/item/ammo_magazine/rocket/ap, VENDOR_ITEM_REGULAR),
diff --git a/code/game/objects/effects/landmarks/landmarks.dm b/code/game/objects/effects/landmarks/landmarks.dm
index bf3b952edcf5..f5f0e0b50c05 100644
--- a/code/game/objects/effects/landmarks/landmarks.dm
+++ b/code/game/objects/effects/landmarks/landmarks.dm
@@ -121,6 +121,15 @@
GLOB.monkey_spawns -= src
return ..()
+/obj/effect/landmark/lizard_spawn
+ name = "lizard spawn"
+ icon_state = "lizard_spawn"
+
+/obj/effect/landmark/lizard_spawn/Initialize(mapload, ...)
+ . = ..()
+ if(prob(66))
+ new /mob/living/simple_animal/hostile/retaliate/giant_lizard(loc)
+
/obj/effect/landmark/latewhiskey
name = "Whiskey Outpost Late join"
@@ -421,6 +430,9 @@
name = "Nurse late join"
job = JOB_NURSE
+/obj/effect/landmark/late_join/intel
+ name = "Intelligence Officer late join"
+ job = JOB_INTEL
/obj/effect/landmark/late_join/Initialize(mapload, ...)
. = ..()
diff --git a/code/game/objects/effects/spawners/wo_spawners/supplies.dm b/code/game/objects/effects/spawners/wo_spawners/supplies.dm
index f2a502344660..612950418a70 100644
--- a/code/game/objects/effects/spawners/wo_spawners/supplies.dm
+++ b/code/game/objects/effects/spawners/wo_spawners/supplies.dm
@@ -106,7 +106,6 @@
/obj/effect/landmark/wo_supplies/storage
- icon = 'icons/obj/items/storage.dmi'
icon_state = null
amount = list(1,5)
@@ -117,6 +116,7 @@
/obj/effect/landmark/wo_supplies/storage/machete
icon_state = "machete_holster_full"
+ icon = 'icons/obj/items/storage/holsters.dmi'
stuff = list(/obj/item/storage/large_holster/machete/full)
/obj/effect/landmark/wo_supplies/storage/m56d
@@ -126,15 +126,18 @@
/obj/effect/landmark/wo_supplies/storage/mines
icon_state = "minebox"
+ icon = 'icons/obj/items/storage/packets.dmi'
stuff = list(/obj/item/storage/box/explosive_mines)
/obj/effect/landmark/wo_supplies/storage/grenades
amount = list(0,2)
icon_state = "nade_placeholder"
+ icon = 'icons/obj/items/storage/packets.dmi'
stuff = list(/obj/item/storage/box/nade_box)
/obj/effect/landmark/wo_supplies/storage/m37holster
icon_state = "m37_holster"
+ icon = 'icons/obj/items/storage/holsters.dmi'
stuff = list(/obj/item/storage/large_holster/m37)
/obj/effect/landmark/wo_supplies/storage/belts
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index d8bf3d9d8f79..7fd82aeb9c10 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -4,6 +4,7 @@
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
layer = ITEM_LAYER
light_system = MOVABLE_LIGHT
+ blocks_emissive = EMISSIVE_BLOCK_GENERIC
/// this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite
var/image/blood_overlay = null
var/randpixel = 6
diff --git a/code/game/objects/items/devices/clue_scanner.dm b/code/game/objects/items/devices/clue_scanner.dm
index 33cc2ab7d207..dced788abe51 100644
--- a/code/game/objects/items/devices/clue_scanner.dm
+++ b/code/game/objects/items/devices/clue_scanner.dm
@@ -1,6 +1,6 @@
/obj/item/device/clue_scanner
name = "forensic scanner"
- desc = "A modern handheld scanner to gather fingerprints. Guaranteed increase of effectivity and almost perfect accuracy of results. DISCLAIMER: Incorrect results are not covered by insurance."
+ desc = "A modern handheld scanner to gather fingerprints. Must be analyzed at a security records terminal after prints are gathered."
icon_state = "forensic1"
w_class = SIZE_MEDIUM
item_state = "electronic"
diff --git a/code/game/objects/items/devices/defibrillator.dm b/code/game/objects/items/devices/defibrillator.dm
index 2debcf82d7d0..0497a75e6fba 100644
--- a/code/game/objects/items/devices/defibrillator.dm
+++ b/code/game/objects/items/devices/defibrillator.dm
@@ -166,7 +166,7 @@
var/mob/dead/observer/G = H.get_ghost()
if(istype(G) && G.client)
- playsound_client(G.client, 'sound/effects/adminhelp_new.ogg')
+ playsound_client(G.client, 'sound/effects/revive_notify.ogg')
to_chat(G, SPAN_BOLDNOTICE(FONT_SIZE_LARGE("Someone is trying to revive your body. Return to it if you want to be resurrected! \
(Verbs -> Ghost -> Re-enter corpse, or click here!)")))
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index 114ed48b1819..f155233a6a96 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -2,7 +2,7 @@
name = "megaphone"
desc = "A device used to project your voice. Loudly."
icon_state = "megaphone"
- item_state = "radio"
+ item_state = "megaphone"
w_class = SIZE_SMALL
flags_atom = FPRINT|CONDUCT
@@ -46,6 +46,7 @@
continue
listener.show_message("[user] broadcasts, [FONT_SIZE_LARGE("\"[message]\"")]", SHOW_MESSAGE_AUDIBLE) // 2 stands for hearable message
langchat_long_listeners += listener
+ playsound(loc, 'sound/items/megaphone.ogg', 100, FALSE, TRUE)
user.langchat_long_speech(message, langchat_long_listeners, user.get_default_language())
COOLDOWN_START(src, spam_cooldown, spam_cooldown_time)
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index 73e5b86a69eb..0017e41219e5 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -52,10 +52,32 @@
next_scan = world.time + 15
var/area/A = get_area(src)
- var/APC = A? A.get_apc() : null
+ var/atom/APC = A? A.get_apc() : null
if(APC)
to_chat(user, SPAN_NOTICE("The local APC is located at [SPAN_BOLD("[get_dist(src, APC)] units [dir2text(Get_Compass_Dir(src, APC))]")]."))
user.balloon_alert(user, "[get_dist(src, APC)] units [dir2text(Get_Compass_Dir(src, APC))]")
+ if(user.client)
+ //Create the appearance so we have something to apply the filter to.
+ var/mutable_appearance/apc_appearance = new(APC)
+ apc_appearance.filters += list("type" = "outline", "size" = 1, "color" = COLOR_GREEN)
+ //Make it an image we can give to the client
+ var/image/final_image = image(apc_appearance)
+
+ final_image.layer = WALL_OBJ_LAYER
+ final_image.plane = GAME_PLANE
+ final_image.loc = get_turf(APC)
+ final_image.dir = apc_appearance.dir
+ final_image.alpha = 225
+ user.client.images += final_image
+ addtimer(CALLBACK(src, PROC_REF(remove_apc_highlight), user.client, final_image), 1.4 SECONDS)
+
+
else
to_chat(user, SPAN_WARNING("ERROR: Could not locate local APC."))
user.balloon_alert(user, "could not locate!")
+
+/obj/item/device/multitool/proc/remove_apc_highlight(client/user_client, image/highlight_image)
+ if(!user_client)
+ return
+ user_client.images -= highlight_image
+
diff --git a/code/game/objects/items/devices/personal_data_transmitter.dm b/code/game/objects/items/devices/personal_data_transmitter.dm
index b967aa9273ca..c5bcdd739608 100644
--- a/code/game/objects/items/devices/personal_data_transmitter.dm
+++ b/code/game/objects/items/devices/personal_data_transmitter.dm
@@ -161,6 +161,7 @@
name = "\improper Boots! PDT/L Battle Buddy kit"
desc = "Contains a PDT/L set, consisting of the PDT bracelet and its sister locator tube, alongside a spare cell seemingly wedged into the kit."
desc_lore = "This kit was distributed in the 200th (Season 4) Issue of the Boots! magazine, 'Privates die without their battlebuddy!', to drive up sales. Many have noted the poor battery life of these units, leading many to speculate that these were faulty units that were repackaged and shipped off to various USCM-adjacent mil-surplus good stores. The Department of the Navy Observation in Photographs (DNOP) has not released a statement regarding these theories."
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "pdt_box"
can_hold = list(/obj/item/device/pdt_locator_tube, /obj/item/clothing/accessory/pdt_bracelet)
foldable = /obj/item/stack/sheet/cardboard
diff --git a/code/game/objects/items/devices/portable_vendor.dm b/code/game/objects/items/devices/portable_vendor.dm
index 3dd8533a046d..b3ae76654bf8 100644
--- a/code/game/objects/items/devices/portable_vendor.dm
+++ b/code/game/objects/items/devices/portable_vendor.dm
@@ -5,7 +5,7 @@
/obj/item/device/portable_vendor
name = "\improper Automated Storage Briefcase"
desc = "A suitcase-sized automated storage and retrieval system. Designed to efficiently store and selectively dispense small items."
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/briefcases.dmi'
icon_state = "secure"
flags_atom = FPRINT|CONDUCT
force = 8
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index 58d8cd8d8d5f..95fc3bb76f2c 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -88,7 +88,7 @@
/obj/item/device/encryptionkey/cmo
name = "Chief Medical Officer's Encryption Key"
icon_state = "cmo_key"
- channels = list(RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_INTEL = TRUE)
+ channels = list(RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_INTEL = TRUE, SQUAD_MARINE_1 = FALSE, SQUAD_MARINE_2 = FALSE, SQUAD_MARINE_3 = FALSE, SQUAD_MARINE_4 = FALSE, SQUAD_MARINE_5 = FALSE, SQUAD_MARINE_CRYO = FALSE, RADIO_CHANNEL_ENGI = TRUE)
/obj/item/device/encryptionkey/med
name = "Medical Radio Encryption Key"
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 6aecacd27916..489aa8827718 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -81,3 +81,7 @@
/obj/item/device/radio/intercom/normandy
name = "dropship normandy intercom"
frequency = DS2_FREQ
+
+/obj/item/device/radio/intercom/saipan
+ name = "dropship saipan intercom"
+ frequency = DS3_FREQ
diff --git a/code/game/objects/items/explosives/grenades/marines.dm b/code/game/objects/items/explosives/grenades/marines.dm
index fef62ab6a835..e669a27ab1a7 100644
--- a/code/game/objects/items/explosives/grenades/marines.dm
+++ b/code/game/objects/items/explosives/grenades/marines.dm
@@ -421,9 +421,9 @@
qdel(src)
/obj/item/explosive/grenade/phosphorus
- name = "\improper M40 HPDP grenade"
- desc = "The M40 HPDP is a small, but powerful phosphorus grenade. It is set to detonate in 2 seconds."
- icon_state = "grenade_phos"
+ name = "\improper M40 CCDP grenade"
+ desc = "The M40 CCDP is a small, but powerful chemical compound grenade, similar in effect to WPDP. Word on the block says that the CCDP doesn't actually release White Phosphorus, but some other chemical developed in W-Y labs."
+ icon_state = "grenade_chem"
det_time = 20
item_state = "grenade_phos"
underslug_launchable = TRUE
@@ -437,7 +437,9 @@
return ..()
/obj/item/explosive/grenade/phosphorus/weak
- desc = "The M40 HPDP is a small, but powerful phosphorus grenade. Word on the block says that the HPDP doesn't actually release White Phosphorus, but some other chemical developed in W-Y labs."
+ name = "\improper M40 WPDP grenade"
+ icon_state = "grenade_phos"
+ desc = "The M40 WPDP is a small, but powerful phosphorus grenade. It is set to detonate in 2 seconds."
/obj/item/explosive/grenade/phosphorus/Initialize()
. = ..()
diff --git a/code/game/objects/items/handheld_distress_beacon.dm b/code/game/objects/items/handheld_distress_beacon.dm
index 73c9415dbfad..a6152b648c63 100644
--- a/code/game/objects/items/handheld_distress_beacon.dm
+++ b/code/game/objects/items/handheld_distress_beacon.dm
@@ -89,3 +89,13 @@
recipient = "the Corporate Security Division"
ert_paths = list(/datum/emergency_call/goon/bodyguard) // "Weyland-Yutani Goon (Executive Bodyguard Detail)"
ert_short_names = list("SEND BODYGUARD")
+
+// Provost office distress beacon held by Inspectors+
+/obj/item/handheld_distress_beacon/provost
+ name = "\improper Provost Office handheld beacon"
+ desc = "A standard Provost Office beacon branded with the Provost Office symbol, provided to personnel for emergencies. It features an extended relay antenna and calls a squadron of Provost enforcers."
+
+ beacon_type = "Provost Enforcers beacon"
+ recipient = "the USS Superintendent"
+ ert_paths = list(/datum/emergency_call/provost_enforcer) // "USCM Provost Enforcers"
+ ert_short_names = list("SEND ENFORCERS")
diff --git a/code/game/objects/items/misc.dm b/code/game/objects/items/misc.dm
index d73893e2671c..6a94849d6b74 100644
--- a/code/game/objects/items/misc.dm
+++ b/code/game/objects/items/misc.dm
@@ -164,7 +164,7 @@
desc = "A debug item for research."
/obj/item/moneybag
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/bags.dmi'
name = "Money bag"
icon_state = "moneybag"
force = 10
@@ -178,7 +178,7 @@
/obj/item/evidencebag
name = "evidence bag"
desc = "An empty evidence bag."
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/bags.dmi'
icon_state = "evidenceobj"
item_state = ""
w_class = SIZE_SMALL
diff --git a/code/game/objects/items/reagent_containers/food.dm b/code/game/objects/items/reagent_containers/food.dm
index f4b2213904d2..b4e895956aee 100644
--- a/code/game/objects/items/reagent_containers/food.dm
+++ b/code/game/objects/items/reagent_containers/food.dm
@@ -10,9 +10,16 @@
volume = 50 //Sets the default container amount for all food items.
flags_atom = CAN_BE_SYRINGED
var/filling_color = COLOR_WHITE //Used by sandwiches.
+ var/last_dropped_by
/obj/item/reagent_container/food/Initialize()
. = ..()
if (!pixel_x && !pixel_y)
src.pixel_x = rand(-6.0, 6) //Randomizes postion
src.pixel_y = rand(-6.0, 6)
+ RegisterSignal(src, COMSIG_ITEM_DROPPED, PROC_REF(update_last_dropped_by))
+
+/obj/item/reagent_container/food/proc/update_last_dropped_by(datum/source, mob/user)
+ SIGNAL_HANDLER
+
+ last_dropped_by = user
diff --git a/code/game/objects/items/reagent_containers/glass.dm b/code/game/objects/items/reagent_containers/glass.dm
index a8b0ac1d6202..0ffcb30bf89d 100644
--- a/code/game/objects/items/reagent_containers/glass.dm
+++ b/code/game/objects/items/reagent_containers/glass.dm
@@ -552,10 +552,6 @@
return
. = ..()
-/obj/item/reagent_container/glass/pressurized_canister/set_APTFT()
- to_chat(usr, SPAN_WARNING("[src] has no transfer control valve! Use a dispenser to fill it!"))
- return
-
/obj/item/reagent_container/glass/pressurized_canister/on_reagent_change()
update_icon()
diff --git a/code/game/objects/items/reagent_containers/hypospray.dm b/code/game/objects/items/reagent_containers/hypospray.dm
index 05b76568d702..94477520daef 100644
--- a/code/game/objects/items/reagent_containers/hypospray.dm
+++ b/code/game/objects/items/reagent_containers/hypospray.dm
@@ -25,6 +25,10 @@
var/next_inject = 0
var/inject_cd = 0.75 SECONDS
+/obj/item/reagent_container/hypospray/Destroy()
+ QDEL_NULL(mag)
+ . = ..()
+
/obj/item/reagent_container/hypospray/attack_self(mob/user)
..()
diff --git a/code/game/objects/items/reagent_containers/reagent_container.dm b/code/game/objects/items/reagent_containers/reagent_container.dm
index 37029ff247d6..b39bc9975ace 100644
--- a/code/game/objects/items/reagent_containers/reagent_container.dm
+++ b/code/game/objects/items/reagent_containers/reagent_container.dm
@@ -1,114 +1,109 @@
/obj/item/reagent_container
name = "Container"
- desc = ""
icon = 'icons/obj/items/chemistry.dmi'
- icon_state = null
throwforce = 3
w_class = SIZE_SMALL
- throw_speed = SPEED_FAST
throw_range = 5
attack_speed = 3
- var/amount_per_transfer_from_this = 5
- var/possible_transfer_amounts = list(5,10,15,25,30)
- var/volume = 30
- var/transparent = FALSE //can we see what's in it?
- var/reagent_desc_override = FALSE //does it have a special examining mechanic that should override the normal /reagent_containers examine proc?
- actions_types = list(/datum/action/item_action/reagent_container/set_transfer_amount)
ground_offset_x = 7
ground_offset_y = 7
+ /// How many units of reagent get transfered out of the container at a time
+ var/amount_per_transfer_from_this = 5
+ /// A list of possible amounts that can be transferred
+ var/possible_transfer_amounts = list(5, 10, 15, 25, 30)
+ /// The maximum volume the container can hold
+ var/volume = 30
+ /// Can we see what's in it?
+ var/transparent = FALSE
+ /// Does it have a special examining mechanic that should override the normal /reagent_containers examine proc?
+ var/reagent_desc_override = FALSE
+ /// Whether the container can have the set transfer amount action at all
+ var/has_set_transfer_action = TRUE
/obj/item/reagent_container/Initialize()
- if(!possible_transfer_amounts)
- actions_types -= /datum/action/item_action/reagent_container/set_transfer_amount
+ if(has_set_transfer_action && LAZYLEN(possible_transfer_amounts))
+ LAZYADD(actions_types, /datum/action/item_action/reagent_container/set_transfer_amount)
. = ..()
- if(!possible_transfer_amounts)
- verbs -= /obj/item/reagent_container/verb/set_APTFT //which objects actually uses it?
create_reagents(volume)
+
/obj/item/reagent_container/get_examine_text(mob/user)
. = ..()
var/reagent_info = show_reagent_info(user)
if(reagent_info)
. += reagent_info
+/// Whether the user can see the amount or reagents inside
/obj/item/reagent_container/proc/show_reagent_info(mob/user)
- if(isxeno(user) || reagent_desc_override)
+ if(reagent_desc_override)
return
- var/list/reagent_desc
- if(reagents && (transparent || user.can_see_reagents()))
- reagent_desc += "It contains : "
- if(!user.can_see_reagents())
- if(get_dist(user, src) > 2 && user != loc) //we have a distance check with this
- return SPAN_WARNING("It's too far away for you to see what's in it!")
- if(!length(reagents.reagent_list))
- reagent_desc += "nothing."
- else
- reagent_desc += "[reagents.total_volume] units of liquid."
- return SPAN_INFO("[reagent_desc]")
- else //when wearing science goggles, you can see what's in something from any range
- if(!length(reagents.reagent_list))
- reagent_desc += "nothing."
- else
- for(var/datum/reagent/current_reagent as anything in reagents.reagent_list)
- reagent_desc += "[round(current_reagent.volume, 0.01)] units of [current_reagent.name].
"
- return SPAN_INFO("[reagent_desc]")
-
-/obj/item/reagent_container/verb/set_APTFT() //set amount_per_transfer_from_this
- set name = "Set transfer amount"
- set category = "Object"
- set src in usr
- if(!ishuman(usr))
+ if(!reagents)
return
- var/mob/living/carbon/human/user = usr
- var/obj/item/reagent_container/R = user.get_active_hand()
- if(!istype(R))
+ if(isxeno(user))
return
- var/N = tgui_input_list(usr, "Amount per transfer from this:","[R]", possible_transfer_amounts)
- if (N)
- R.amount_per_transfer_from_this = N
-
-/obj/item/reagent_container/Destroy()
- possible_transfer_amounts = null
- return ..()
-
-/*
-// Used on examine for properly skilled people to see contents.
-// this is separate from show_reagent_info, as that proc is intended for use with science goggles
-// this proc is general-purpose and primarily for medical items that you shouldn't need scigoggles to scan - ie pills, syringes, etc.
-*/
+ var/reagent_desc = "[src] contains: "
+
+ if(user.can_see_reagents())
+ reagent_desc += get_reagent_list_text()
+ return SPAN_INFO(reagent_desc)
+
+ if(!transparent)
+ return
+ if(user != loc && !in_range(src, user))
+ return SPAN_WARNING("[src] is too far away for you to see what's in it!")
+
+ if(!LAZYLEN(reagents.reagent_list))
+ reagent_desc += "Nothing"
+ return SPAN_INFO(reagent_desc)
+
+ reagent_desc += "[reagents.total_volume] units of liquid"
+ return SPAN_INFO(reagent_desc)
+
+// this proc is general-purpose and primarily for medical items that you shouldn't need scigoggles to scan
+/// Shows the reagent amount if the examining user is sufficiently skilled
/obj/item/reagent_container/proc/display_contents(mob/user)
if(isxeno(user))
return
- if(skillcheck(user, SKILL_MEDICAL, SKILL_MEDICAL_TRAINED))
- return "[src] contains: [get_reagent_list_text()]."//this the pill
- else
+
+ if(!skillcheck(user, SKILL_MEDICAL, SKILL_MEDICAL_TRAINED))
return "You don't know what's in it."
-//returns a text listing the reagents (and their volume) in the atom. Used by Attack logs for reagents in pills
+ return "[src] contains: [get_reagent_list_text()]."
+
+/// Returns a string listing all reagents (and their volume) in the container
/obj/item/reagent_container/proc/get_reagent_list_text()
- if(reagents && LAZYLEN(reagents.reagent_list))
- var/datum/reagent/R = reagents.reagent_list[1]
- . = "[R.name]([R.volume]u)"
- if(length(reagents.reagent_list) < 2) return
- for (var/i in 2 to length(reagents.reagent_list))
- R = reagents.reagent_list[i]
- if(!R) continue
- . += "; [R.name]([R.volume]u)"
- else
- . = "No reagents"
+ if(!reagents || !LAZYLEN(reagents.reagent_list))
+ return "No reagents"
+
+ var/total_reagent_desc = ""
+ for(var/datum/reagent/current_reagent as anything in reagents.reagent_list)
+ if(total_reagent_desc != "")
+ total_reagent_desc += ", "
+ total_reagent_desc += "[current_reagent.name] ([current_reagent.volume]u)"
+ return total_reagent_desc
/datum/action/item_action/reagent_container/set_transfer_amount
+ name = "Set Transfer Amount"
+ /// The container that transfer amount will be set on
+ var/obj/item/reagent_container/container
+
+/datum/action/item_action/reagent_container/set_transfer_amount/Destroy()
+ container = null
+ . = ..()
/datum/action/item_action/reagent_container/set_transfer_amount/New(mob/living/user, obj/item/holder)
..()
- name = "Set Transfer Amount"
button.name = name
button.overlays.Cut()
- var/image/IMG = image(holder_item.icon, button, holder_item.icon_state)
- button.overlays += IMG
+ var/image/button_overlay = image(holder_item.icon, button, holder_item.icon_state)
+ button.overlays += button_overlay
+ container = holder_item
/datum/action/item_action/reagent_container/set_transfer_amount/action_activate()
. = ..()
- var/obj/item/reagent_container/cont = holder_item
- cont.set_APTFT()
+ var/new_reagent_amount = tgui_input_list(owner, "Amount per transfer from this:","[container]", container.possible_transfer_amounts)
+ if(!new_reagent_amount)
+ return
+ to_chat(owner, SPAN_NOTICE("You change [container]'s reagent transfer amount to [new_reagent_amount]."))
+ container.amount_per_transfer_from_this = new_reagent_amount
diff --git a/code/game/objects/items/reagent_containers/spray.dm b/code/game/objects/items/reagent_containers/spray.dm
index 138e6ad01a3d..46328a160ba0 100644
--- a/code/game/objects/items/reagent_containers/spray.dm
+++ b/code/game/objects/items/reagent_containers/spray.dm
@@ -15,18 +15,19 @@
possible_transfer_amounts = list(5,10) //Set to null instead of list, if there is only one.
matter = list("plastic" = 500)
transparent = TRUE
+ volume = 250
+ has_set_transfer_action = FALSE
+ ///How many tiles the spray will move
var/spray_size = 3
+ /// The spray_size based on the transfer amount
var/list/spray_sizes = list(1,3)
+ /// Whether you can spray the bottle
var/safety = FALSE
- volume = 250
+ /// The world.time it was last used
var/last_use = 1
+ /// The delay between uses
var/use_delay = 0.5 SECONDS
-
-/obj/item/reagent_container/spray/Initialize()
- . = ..()
- verbs -= /obj/item/reagent_container/verb/set_APTFT
-
/obj/item/reagent_container/spray/afterattack(atom/A, mob/user, proximity)
//this is what you get for using afterattack() TODO: make is so this is only called if attackby() returns 0 or something
if(isstorage(A) || istype(A, /obj/structure/surface/table) || istype(A, /obj/structure/surface/rack) || istype(A, /obj/structure/closet) \
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index e4022c3e4ca0..b2a23549c65f 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -312,6 +312,7 @@ GLOBAL_LIST_INIT_TYPED(cardboard_recipes, /datum/stack_recipe, list ( \
new/datum/stack_recipe("empty box of M94 Marking Flare Packs", /obj/item/ammo_box/magazine/misc/flares/empty), \
new/datum/stack_recipe("empty box of M89 Signal Flare Packs", /obj/item/ammo_box/magazine/misc/flares/signal/empty), \
new/datum/stack_recipe("empty box of flashlights", /obj/item/ammo_box/magazine/misc/flashlight/empty), \
+ new/datum/stack_recipe("empty box of combat flashlights", /obj/item/ammo_box/magazine/misc/flashlight/combat/empty), \
new/datum/stack_recipe("empty box of High-Capacity Power Cells", /obj/item/ammo_box/magazine/misc/power_cell/empty), \
null, \
new/datum/stack_recipe("empty magazine box (Desert Eagle)", /obj/item/ammo_box/magazine/deagle/empty), \
diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm
index 19e012ff1c14..256210b69f4c 100644
--- a/code/game/objects/items/storage/bags.dm
+++ b/code/game/objects/items/storage/bags.dm
@@ -93,7 +93,7 @@
// -----------------------------
/obj/item/storage/bag/plants
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/bags.dmi'
icon_state = "plantbag"
name = "Plant Bag"
storage_slots = 50; //the number of plant pieces it can carry.
@@ -253,7 +253,7 @@
// -----------------------------
/obj/item/storage/bag/cash
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/bags.dmi'
icon_state = "cashbag"
name = "Cash bag"
desc = "A bag for carrying lots of cash. It's got a big dollar sign printed on the front."
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 14961c69eaf5..139d90ff33ce 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -320,6 +320,29 @@
new /obj/item/storage/pill_bottle/imidazoline(src)
new /obj/item/storage/pill_bottle/alkysine(src)
+/obj/item/storage/belt/medical/lifesaver/full/forecon/fill_preset_inventory()
+ new /obj/item/storage/pill_bottle/bicaridine(src)
+ new /obj/item/storage/pill_bottle/bicaridine(src)
+ new /obj/item/storage/pill_bottle/kelotane(src)
+ new /obj/item/storage/pill_bottle/kelotane(src)
+ new /obj/item/storage/pill_bottle/tramadol(src)
+ new /obj/item/storage/pill_bottle/tramadol(src)
+ new /obj/item/storage/pill_bottle/antitox(src)
+ new /obj/item/storage/pill_bottle/alkysine(src)
+ new /obj/item/storage/pill_bottle/imidazoline(src)
+ new /obj/item/stack/medical/advanced/bruise_pack(src)
+ new /obj/item/stack/medical/advanced/bruise_pack(src)
+ new /obj/item/stack/medical/advanced/bruise_pack(src)
+ new /obj/item/stack/medical/advanced/ointment(src)
+ new /obj/item/stack/medical/advanced/ointment(src)
+ new /obj/item/stack/medical/advanced/ointment(src)
+ new /obj/item/stack/medical/splint(src)
+ new /obj/item/stack/medical/splint(src)
+ new /obj/item/stack/medical/splint(src)
+ new /obj/item/reagent_container/hypospray/autoinjector/dexalinp(src)
+ new /obj/item/reagent_container/hypospray/autoinjector/oxycodone(src)
+ new /obj/item/device/healthanalyzer(src)
+
/obj/item/storage/belt/medical/lifesaver/upp
name = "\improper Type 41 pattern lifesaver bag"
desc = "The Type 41 load rig is the standard load-bearing equipment of the UPP military. This configuration mounts a duffel bag filled with a range of injectors and light medical supplies, and is common among medics."
diff --git a/code/game/objects/items/storage/bible.dm b/code/game/objects/items/storage/bible.dm
index 4b98d45b5d32..dd4a9ea9796d 100644
--- a/code/game/objects/items/storage/bible.dm
+++ b/code/game/objects/items/storage/bible.dm
@@ -1,6 +1,7 @@
/obj/item/storage/bible
name = "bible"
desc = "Apply to head repeatedly."
+ icon = 'icons/obj/items/books.dmi'
icon_state ="bible"
throw_speed = SPEED_FAST
throw_range = 5
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index a33d51bf618c..0647d214be97 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -27,6 +27,7 @@
name = "box"
desc = "It's just an ordinary box."
icon_state = "box"
+ icon = 'icons/obj/items/storage/boxes.dmi'
item_state = "syringe_kit"
foldable = TRUE
storage_slots = null
@@ -150,6 +151,7 @@
/obj/item/storage/box/flashbangs
name = "box of flashbangs (WARNING)"
desc = "WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use."
+ icon = 'icons/obj/items/storage/packets.dmi'
icon_state = "flashbang"
can_hold = list(/obj/item/explosive/grenade/flashbang)
w_class = SIZE_MEDIUM
@@ -181,6 +183,7 @@
/obj/item/storage/box/emps
name = "box of emp grenades"
desc = "A box with 5 emp grenades."
+ icon = 'icons/obj/items/storage/packets.dmi'
icon_state = "emp"
/obj/item/storage/box/emps/fill_preset_inventory()
@@ -500,7 +503,7 @@
/obj/item/storage/box/lights
name = "box of replacement bulbs"
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/boxes.dmi'
icon_state = "light"
desc = "This box is shaped on the inside so that only light tubes and bulbs fit."
item_state = "syringe_kit"
@@ -548,6 +551,7 @@
/obj/item/storage/box/twobore
name = "box of 2 bore shells"
icon_state = "twobore"
+ icon = 'icons/obj/items/storage/kits.dmi'
desc = "A box filled with enormous slug shells, for hunting only the most dangerous game. 2 Bore."
storage_slots = 5
can_hold = list(/obj/item/ammo_magazine/handful/shotgun/twobore)
@@ -556,12 +560,31 @@
for(var/i in 1 to storage_slots)
new /obj/item/ammo_magazine/handful/shotgun/twobore(src)
+/obj/item/storage/box/stompers
+ name = "\improper Reebok shoe box"
+ desc = "A fancy shoe box with reflective surface and Weyland-Yutani logo on top, says 'Reebok Stompers' on the back."
+ icon_state = "stomper_box"
+ w_class = SIZE_MEDIUM
+ bypass_w_limit = /obj/item/clothing/shoes
+ max_storage_space = 3
+ can_hold = list(/obj/item/clothing/shoes)
+
+/obj/item/storage/box/stompers/fill_preset_inventory()
+ new /obj/item/clothing/shoes/stompers(src)
+
+/obj/item/storage/box/stompers/update_icon()
+ if(!length(contents))
+ icon_state = "stomper_box_e"
+ else
+ icon_state = "stomper_box"
+
////////// MARINES BOXES //////////////////////////
/obj/item/storage/box/explosive_mines
name = "\improper M20 mine box"
desc = "A secure box holding five M20 anti-personnel proximity mines."
+ icon = 'icons/obj/items/storage/packets.dmi'
icon_state = "minebox"
w_class = SIZE_MEDIUM
max_storage_space = 10
@@ -582,6 +605,7 @@
name = "\improper M94 marking flare pack"
desc = "A packet of eight M94 Marking Flares. Carried by USCM soldiers to light dark areas that cannot be reached with the usual TNR Shoulder Lamp."
icon_state = "m94"
+ icon = 'icons/obj/items/storage/packets.dmi'
w_class = SIZE_MEDIUM
storage_slots = 8
max_storage_space = 8
@@ -618,11 +642,14 @@
name = "\improper M40 HEDP grenade box"
desc = "A secure box holding 25 M40 High-Explosive Dual-Purpose grenades. High explosive, don't store near the flamer fuel."
icon_state = "nade_placeholder"
+ icon = 'icons/obj/items/storage/packets.dmi'
w_class = SIZE_LARGE
storage_slots = 25
max_storage_space = 50
can_hold = list(/obj/item/explosive/grenade/high_explosive)
var/base_icon
+ var/model_icon = "model_m40"
+ var/type_icon = "hedp"
var/grenade_type = /obj/item/explosive/grenade/high_explosive
has_gamemode_skin = TRUE
@@ -652,49 +679,61 @@
new grenade_type(src)
/obj/item/storage/box/nade_box/update_icon()
+ overlays.Cut()
if(!length(contents))
icon_state = "[base_icon]_e"
else
icon_state = base_icon
+ if(type_icon)
+ overlays += image(icon, type_icon)
+ if(model_icon)
+ overlays += image(icon, model_icon)
/obj/item/storage/box/nade_box/frag
name = "\improper M40 HEFA grenade box"
desc = "A secure box holding 25 M40 High-Explosive Fragmenting-Antipersonnel grenades. High explosive, don't store near the flamer fuel."
- icon_state = "frag_nade_placeholder"
- w_class = SIZE_LARGE
- storage_slots = 25
- max_storage_space = 50
+ type_icon = "hefa"
can_hold = list(/obj/item/explosive/grenade/high_explosive/frag)
grenade_type = /obj/item/explosive/grenade/high_explosive/frag
- has_gamemode_skin = FALSE
/obj/item/storage/box/nade_box/phophorus
- name = "\improper M40 HPDP grenade box"
- desc = "A secure box holding 25 M40 HPDP white phosphorus grenade. High explosive, don't store near the flamer fuel."
- icon_state = "phos_nade_placeholder"
- w_class = SIZE_LARGE
- storage_slots = 25
- max_storage_space = 50
+ name = "\improper M40 CCDP grenade box"
+ desc = "A secure box holding 25 M40 CCDP chemical compound grenade. High explosive, don't store near the flamer fuel."
+ type_icon = "ccdp"
can_hold = list(/obj/item/explosive/grenade/phosphorus)
grenade_type = /obj/item/explosive/grenade/phosphorus
- has_gamemode_skin = FALSE
+
+/obj/item/storage/box/nade_box/incen
+ name = "\improper M40 HIDP grenade box"
+ desc = "A secure box holding 25 M40 HIDP white incendiary grenades. Highly flammable, don't store near the flamer fuel."
+ type_icon = "hidp"
+ can_hold = list(/obj/item/explosive/grenade/incendiary)
+ grenade_type = /obj/item/explosive/grenade/incendiary
/obj/item/storage/box/nade_box/airburst
name = "\improper M74 AGM-F grenade box"
desc = "A secure box holding 25 M74 AGM Fragmentation grenades. Explosive, don't store near the flamer fuel."
- icon_state = "airburst_nade_placeholder"
- w_class = SIZE_LARGE
- storage_slots = 25
- max_storage_space = 50
+ model_icon = "model_m74"
+ type_icon = "agmf"
can_hold = list(/obj/item/explosive/grenade/high_explosive/airburst)
grenade_type = /obj/item/explosive/grenade/high_explosive/airburst
- has_gamemode_skin = FALSE
+
+/obj/item/storage/box/nade_box/airburstincen
+ name = "\improper M74 AGM-I grenade box"
+ desc = "A secure box holding 25 M74 AGM Incendiary grenades. Highly flammable, don't store near the flamer fuel."
+ model_icon = "model_m74"
+ type_icon = "agmi"
+ can_hold = list(/obj/item/explosive/grenade/incendiary/airburst)
+ grenade_type = /obj/item/explosive/grenade/incendiary/airburst
+
/obj/item/storage/box/nade_box/training
name = "\improper M07 training grenade box"
desc = "A secure box holding 25 M07 training grenades. Harmless and reusable."
icon_state = "train_nade_placeholder"
+ model_icon = "model_mo7"
+ type_icon = null
grenade_type = /obj/item/explosive/grenade/high_explosive/training
can_hold = list(/obj/item/explosive/grenade/high_explosive/training)
has_gamemode_skin = FALSE
@@ -703,6 +742,8 @@
name = "\improper M66 tear gas grenade box"
desc = "A secure box holding 25 M66 tear gas grenades. Used for riot control."
icon_state = "teargas_nade_placeholder"
+ model_icon = "model_m66"
+ type_icon = null
can_hold = list(/obj/item/explosive/grenade/custom/teargas)
grenade_type = /obj/item/explosive/grenade/custom/teargas
has_gamemode_skin = FALSE
@@ -758,6 +799,7 @@
name = "\improper USCM MRE"
desc = "A Meal, Ready-to-Eat. A single-meal combat ration designed to provide a soldier with enough nutrients for a day of strenuous work. Its expiration date is at least 20 years ahead of your combat life expectancy."
icon_state = "mealpack"
+ icon = 'icons/obj/items/storage/mre.dmi'
w_class = SIZE_SMALL
can_hold = list()
storage_slots = 7
diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm
index 24b2e13b91db..b687f6c5b85d 100644
--- a/code/game/objects/items/storage/briefcase.dm
+++ b/code/game/objects/items/storage/briefcase.dm
@@ -1,6 +1,7 @@
/obj/item/storage/briefcase
name = "briefcase"
desc = "It's made of AUTHENTIC faux-leather and has a price-tag still attached. Its owner must be a real professional."
+ icon = 'icons/obj/items/storage/briefcases.dmi'
icon_state = "briefcase"
item_state = "briefcase"
flags_atom = FPRINT|CONDUCT
diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm
index 52fd50e9b022..d37bddf283db 100644
--- a/code/game/objects/items/storage/firstaid.dm
+++ b/code/game/objects/items/storage/firstaid.dm
@@ -9,6 +9,7 @@
/obj/item/storage/firstaid
name = "first-aid kit"
desc = "It's an emergency medical kit for those serious boo-boos. With medical training you can fit this in a backpack."
+ icon = 'icons/obj/items/storage/medical.dmi'
icon_state = "firstaid"
throw_speed = SPEED_FAST
throw_range = 8
@@ -254,6 +255,7 @@
/obj/item/storage/syringe_case
name = "syringe case"
desc = "It's a medical case for storing syringes and bottles."
+ icon = 'icons/obj/items/storage/medical.dmi'
icon_state = "syringe_case"
throw_speed = SPEED_FAST
throw_range = 8
@@ -308,7 +310,7 @@
\nStep three: Draw back the skin with the retracter.\
\nStep four: Patch the damaged vein with a surgical line.\
\nStep five: Close the incision with a surgical line."
-
+ icon = 'icons/obj/items/storage/medical.dmi'
icon_state = "surgical_case"
throw_speed = SPEED_FAST
throw_range = 8
diff --git a/code/game/objects/items/storage/large_holster.dm b/code/game/objects/items/storage/large_holster.dm
index ddf6060b355c..7a073042e122 100644
--- a/code/game/objects/items/storage/large_holster.dm
+++ b/code/game/objects/items/storage/large_holster.dm
@@ -3,7 +3,7 @@
/obj/item/storage/large_holster
name = "\improper Rifle Holster"
desc = "holster"
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/holsters.dmi'
icon_state = "m37_holster"
w_class = SIZE_LARGE
flags_equip_slot = SLOT_BACK
diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm
index afeaff89ae07..8c092bde9219 100644
--- a/code/game/objects/items/storage/lockbox.dm
+++ b/code/game/objects/items/storage/lockbox.dm
@@ -3,6 +3,7 @@
/obj/item/storage/lockbox
name = "lockbox"
desc = "A locked box."
+ icon = 'icons/obj/items/storage/briefcases.dmi'
icon_state = "lockbox+l"
item_state = "syringe_kit"
w_class = SIZE_LARGE
diff --git a/code/game/objects/items/storage/misc.dm b/code/game/objects/items/storage/misc.dm
index c3fd647853d6..ab0e97393a33 100644
--- a/code/game/objects/items/storage/misc.dm
+++ b/code/game/objects/items/storage/misc.dm
@@ -55,7 +55,7 @@
*/
/obj/item/storage/mateba_case
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "matebacase"
name = "mateba customization kit case"
desc = "A wooden case used for storing the tools and parts needed to customize a Mateba revolver. Comes with three barrel lengths and the necessary key to swap them out."
@@ -114,7 +114,7 @@
/obj/item/storage/box/clf
name = "D18-storing box"
desc = "A fairly decorated and ceremonial box containing a CLF D18 and a single additional magazine for it. I guess those CLF folk really care about their craftsmanship and prose rather than practicality, eh?"
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "m43case"
w_class = SIZE_SMALL
max_w_class = SIZE_TINY
@@ -128,7 +128,7 @@
/obj/item/storage/box/upp //war trophy luger
name = "Type 73 storing case"
desc = "A small case containing the once-standard sidearm of the UPP, the Type 73, and two additional magazines. The contained sidearm is probably looted off a dead officer or from a captured stockpile, either way this thing is worth a pretty penny."
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "matebacase"
w_class = SIZE_MEDIUM
max_w_class = SIZE_MEDIUM
@@ -143,6 +143,7 @@
/obj/item/storage/box/co2_knife
name = "M8 cartridge bayonet packaging"
desc = "Contains one M8 Cartridge Bayonet and two sister CO2 cartridges. Thanks for being a dedicated Boots magazine subscriber!"
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "co2_box"
foldable = TRUE
storage_slots = 3
diff --git a/code/game/objects/items/storage/pouch.dm b/code/game/objects/items/storage/pouch.dm
index 9c8c7080bdc3..5993aa6b6f67 100644
--- a/code/game/objects/items/storage/pouch.dm
+++ b/code/game/objects/items/storage/pouch.dm
@@ -919,7 +919,7 @@
. = ..()
fill_with("oxycodone")
-/obj/item/storage/pouch/pressurized_reagent_canister/revival/Initialize()
+/obj/item/storage/pouch/pressurized_reagent_canister/revival_tricord/Initialize()
. = ..()
//we don't call fill_with because of the complex mix of chemicals we have
inner.reagents.add_reagent("adrenaline", inner.volume/3)
@@ -934,6 +934,21 @@
A.update_icon()
update_icon()
+/obj/item/storage/pouch/pressurized_reagent_canister/revival_peri/Initialize()
+ . = ..()
+ //we don't call fill_with because of the complex mix of chemicals we have
+ inner.reagents.add_reagent("adrenaline", inner.volume/3)
+ inner.reagents.add_reagent("inaprovaline", inner.volume/3)
+ inner.reagents.add_reagent("peridaxon", inner.volume/3)
+ if(length(contents) > 0)
+ var/obj/item/reagent_container/hypospray/autoinjector/empty/medic/A = contents[1]
+ A.reagents.add_reagent("adrenaline", A.volume/3)
+ A.reagents.add_reagent("inaprovaline", A.volume/3)
+ A.reagents.add_reagent("peridaxon", A.volume/3)
+ A.update_uses_left()
+ A.update_icon()
+ update_icon()
+
/obj/item/storage/pouch/pressurized_reagent_canister/tricordrazine/Initialize()
. = ..()
fill_with("tricordrazine")
@@ -1426,7 +1441,7 @@
/obj/item/storage/pouch/machete
name = "\improper H6B pattern M2132 machete scabbard"
desc = "A large leather scabbard used to carry a M2132 machete. It can be strapped to the pouch slot."
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/holsters.dmi'
icon_state = "macheteB_holster"
item_state = "machete_holster"
max_w_class = SIZE_LARGE
diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm
index d79fe712bea4..835f0d7cc4f9 100644
--- a/code/game/objects/items/storage/secure.dm
+++ b/code/game/objects/items/storage/secure.dm
@@ -97,7 +97,7 @@
else if ((code == l_code) && (l_set == 1))
locked = 0
overlays = null
- overlays += image('icons/obj/items/storage.dmi', icon_opened)
+ overlays += image('icons/obj/items/storage/briefcases.dmi', icon_opened)
code = null
else
code = "ERROR"
@@ -123,7 +123,7 @@
// -----------------------------
/obj/item/storage/secure/briefcase
name = "secure briefcase"
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/briefcases.dmi'
icon_state = "secure"
item_state = "sec-case"
desc = "A large briefcase with a digital locking system."
@@ -155,8 +155,8 @@
/obj/item/storage/secure/safe
name = "secure safe"
- icon = 'icons/obj/items/storage.dmi'
- icon_state = "safe"
+ icon = 'icons/obj/structures/structures.dmi'
+ icon_state = "wallsafe"
icon_opened = "safe0"
icon_locking = "safeb"
icon_sparking = "safespark"
diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm
index 047163713e80..c04de364baf7 100644
--- a/code/game/objects/items/storage/storage.dm
+++ b/code/game/objects/items/storage/storage.dm
@@ -7,7 +7,6 @@
/obj/item/storage
name = "storage"
- icon = 'icons/obj/items/storage.dmi'
w_class = SIZE_MEDIUM
var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else)
var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set)
diff --git a/code/game/objects/items/storage/surgical_tray.dm b/code/game/objects/items/storage/surgical_tray.dm
index 61f56c35b555..216636951527 100644
--- a/code/game/objects/items/storage/surgical_tray.dm
+++ b/code/game/objects/items/storage/surgical_tray.dm
@@ -1,6 +1,7 @@
/obj/item/storage/surgical_tray
name = "surgical tray"
desc = "A small metallic tray covered in sterile tarp. Intended to store surgical tools in a neat and clean fashion."
+ icon = 'icons/obj/items/storage/medical.dmi'
icon_state = "surgical_tray"
flags_atom = FPRINT|CONDUCT
w_class = SIZE_LARGE //Should not fit in backpacks
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index db0d4e3b269b..a2989ed12f92 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -1,6 +1,7 @@
/obj/item/storage/toolbox
name = "toolbox"
desc = "Danger. Very robust."
+ icon = 'icons/obj/items/storage/toolbox.dmi'
icon_state = "red"
item_state = "toolbox_red"
pickup_sound = 'sound/handling/toolbox_pickup.ogg'
diff --git a/code/game/objects/items/storage/toolkit.dm b/code/game/objects/items/storage/toolkit.dm
index cccca19c241c..d54201f73650 100644
--- a/code/game/objects/items/storage/toolkit.dm
+++ b/code/game/objects/items/storage/toolkit.dm
@@ -1,6 +1,7 @@
/obj/item/storage/toolkit
name = "engineer kit"
desc = "An combat engineering toolkit intended to carry electrical and mechanical supplies into combat. With engineering training you can fit this in a backpack."
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "toolkit"
item_state = "fulton"
throw_speed = SPEED_FAST
@@ -41,5 +42,15 @@
else
icon_state = icon_full
+/obj/item/storage/toolkit/full/fill_preset_inventory()
+ new /obj/item/stack/cable_coil/random(src)
+ new /obj/item/circuitboard/apc(src)
+ new /obj/item/circuitboard/apc(src)
+ new /obj/item/circuitboard/apc(src)
+ new /obj/item/cell/high(src)
+ new /obj/item/cell/high(src)
+ new /obj/item/clothing/glasses/welding(src)
+
+
/obj/item/storage/toolkit/empty/fill_preset_inventory()
return
diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm
index 29c364a59b02..5eb4e7d7cedd 100644
--- a/code/game/objects/items/storage/wallets.dm
+++ b/code/game/objects/items/storage/wallets.dm
@@ -3,6 +3,7 @@
desc = "It can hold a few small and personal things."
storage_slots = 10
icon_state = "wallet"
+ icon = 'icons/obj/items/storage/bags.dmi'
w_class = SIZE_TINY
can_hold = list(
/obj/item/spacecash,
diff --git a/code/game/objects/items/tools/kitchen_tools.dm b/code/game/objects/items/tools/kitchen_tools.dm
index a4c4925fba2c..a29bf97cacd3 100644
--- a/code/game/objects/items/tools/kitchen_tools.dm
+++ b/code/game/objects/items/tools/kitchen_tools.dm
@@ -135,6 +135,42 @@
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+/*
+ * Plastic Pizza Cutter
+ */
+/obj/item/tool/kitchen/pizzacutter
+ name = "pizza cutter"
+ icon_state = "plasticpizzacutter"
+ desc = "A circular blade used for cutting pizzas. This one has a cheap plastic handle."
+ flags_atom = FPRINT|CONDUCT
+ sharp = IS_SHARP_ITEM_ACCURATE
+ edge = TRUE
+ force = 10
+ w_class = SIZE_MEDIUM
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ throwforce = 6
+ throw_speed = SPEED_VERY_FAST
+ throw_range = 6
+ matter = list("metal" = 12000)
+
+ attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+
+/*
+ * Wood Pizza Cutter
+ */
+/obj/item/tool/kitchen/pizzacutter/wood
+ icon_state = "woodpizzacutter"
+ desc = "A circular blade used for cutting pizzas. This one has an authentic wooden handle."
+
+/*
+ * Holy Relic Pizza Cutter
+ */
+/obj/item/tool/kitchen/pizzacutter/holyrelic
+ name = "\improper PIZZA TIME"
+ icon_state = "holyrelicpizzacutter"
+ desc = "Before you is a holy relic of a bygone era when the great Pizza Lords reigned supreme. You know either that or it's just a big damn pizza cutter."
+ force = MELEE_FORCE_VERY_STRONG
+
/*
* Bucher's cleaver
*/
diff --git a/code/game/objects/items/weapons/blades.dm b/code/game/objects/items/weapons/blades.dm
index ce1bb2ded072..b1aca8db29b4 100644
--- a/code/game/objects/items/weapons/blades.dm
+++ b/code/game/objects/items/weapons/blades.dm
@@ -138,17 +138,6 @@
throwforce = MELEE_FORCE_STRONG
edge = 1
-
-/obj/item/weapon/pizza_cutter
- name = "\improper PIZZA TIME"
- icon = 'icons/obj/items/weapons/weapons.dmi'
- icon_state = "pizza_cutter"
- item_state = "pizza_cutter"
- desc = "Before you is a holy relic of a bygone era when the great Pizza Lords reigned supreme. You know either that or it's just a big damn pizza cutter."
- sharp = IS_SHARP_ITEM_ACCURATE
- force = MELEE_FORCE_VERY_STRONG
- edge = 1
-
///For digging shrapnel out of OTHER people, not yourself. Triggered by human/attackby() so target is definitely human. User might not be.
/obj/item/proc/dig_out_shrapnel_check(mob/living/carbon/human/target, mob/living/carbon/human/user)
if(user.a_intent == INTENT_HELP && (target == user || skillcheck(user, SKILL_MEDICAL, SKILL_MEDICAL_MEDIC))) //Squad medics and above, or yourself
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 77da397b7b0a..50057cc746a4 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -5,6 +5,7 @@
icon_state = "closed"
density = TRUE
layer = BELOW_OBJ_LAYER
+ blocks_emissive = EMISSIVE_BLOCK_GENERIC
var/icon_closed = "closed"
var/icon_opened = "open"
var/opened = 0
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index ae9f15b3634f..31b142a924e0 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -20,6 +20,32 @@
new /obj/item/clothing/head/soft(src)
return
+/obj/structure/closet/secure_closet/quartermaster_uscm
+ name = "Quartermaster's Locker"
+ req_access = list(ACCESS_MARINE_RO)
+ icon_state = "secureqm1"
+ icon_closed = "secureqm"
+ icon_locked = "secureqm1"
+ icon_opened = "secureqmopen"
+ icon_broken = "secureqmbroken"
+ icon_off = "secureqmoff"
+
+/obj/structure/closet/secure_closet/quartermaster_uscm/Initialize()
+ . = ..()
+ new /obj/item/clothing/under/rank/qm_suit(src)
+ new /obj/item/clothing/head/cmcap/req/ro(src)
+ new /obj/item/clothing/shoes/marine(src)
+ new /obj/item/clothing/gloves/yellow(src)
+ new /obj/item/device/flashlight(src)
+ new /obj/item/tool/stamp/ro(src)
+ new /obj/item/device/flash(src)
+ new /obj/item/clothing/suit/fire/firefighter(src)
+ new /obj/item/device/megaphone(src)
+ new /obj/item/clothing/mask/gas(src)
+ new /obj/item/folder/yellow(src)
+ new /obj/item/clipboard(src)
+ return
+
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 59e74100cb5c..99abd167d297 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -15,10 +15,17 @@
/// Types this crate can be made into
var/list/crate_customizing_types = list(
"Plain" = /obj/structure/closet/crate,
+ "Plain (Green)" = /obj/structure/closet/crate/green,
"Weapons" = /obj/structure/closet/crate/weapon,
"Supply" = /obj/structure/closet/crate/supply,
"Ammo" = /obj/structure/closet/crate/ammo,
+ "Ammo (Black)" = /obj/structure/closet/crate/ammo/alt,
+ "Ammo (Flame)" = /obj/structure/closet/crate/ammo/alt/flame,
"Construction" = /obj/structure/closet/crate/construction,
+ "Science" = /obj/structure/closet/crate/science,
+ "Hydroponics" = /obj/structure/closet/crate/hydroponics,
+ "Medical" = /obj/structure/closet/crate/medical,
+ "Internals" = /obj/structure/closet/crate/internals,
"Explosives" = /obj/structure/closet/crate/explosives,
"Alpha" = /obj/structure/closet/crate/alpha,
"Bravo" = /obj/structure/closet/crate/bravo,
@@ -288,15 +295,6 @@
new /obj/item/storage/box/donkpockets(src)
new /obj/item/storage/box/donkpockets(src)
-/* CM doesn't use this.
-/obj/structure/closet/crate/bin
- desc = "A large bin."
- name = "Large bin"
- icon_state = "largebin"
- icon_opened = "largebinopen"
- icon_closed = "largebin"
-*/
-
/obj/structure/closet/crate/radiation
name = "radioactive gear crate"
desc = "A crate with a radiation sign on it."
diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm
index b3a330ca36b0..2e02be02b8f3 100644
--- a/code/game/objects/structures/inflatable.dm
+++ b/code/game/objects/structures/inflatable.dm
@@ -259,6 +259,7 @@
/obj/item/storage/briefcase/inflatable
name = "inflatable barrier box"
desc = "Contains inflatable walls and doors."
+ icon = 'icons/obj/items/storage/boxes.dmi'
icon_state = "inf_box"
item_state = "syringe_kit"
max_storage_space = 21
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index d9bf8677bb56..a69ad56ac95f 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -112,6 +112,19 @@
desc = "A flag of the United Americas. Inspires patriotism, fear, or revulsion depending on the viewer's political leanings."
icon_state = "uaflag"
+
+//============//
+// Flags //
+//==========//
+
+/obj/structure/sign/flag
+ icon = 'icons/obj/structures/props/flags.dmi'
+
+/obj/structure/sign/flag/upp
+ name = "\improper Union of Progressive Peoples Flag"
+ desc = "Unity through Strength, Freedom through Unity"
+ icon_state = "upp_flag"
+
//=====================//
// SEMIOTIC STANDARD //
//===================//
@@ -578,6 +591,58 @@
desc = " 1. You are not entitled to service or equipment. Attachments are a privilege, not a right.\n 2. You must be fully dressed to obtain service. Cryosleep underwear is non-permissible.\n 3. The Quartermaster has the final say and the right to decline service. Only the Acting Commanding Officer may override their decisions.\n 4. Please treat your Requsitions staff with respect. They work hard."
icon_state = "roplaque"
+/obj/structure/sign/ROcreed
+ name = "\improper QMC Creed Plaque"
+ desc = "The short version of the Quartermaster Creed made by the US Quartermaster Corps, this on is purely decorative and ceremonial version which is much shorter and doesn't include more modern edits."
+ desc_lore = {"I am Quartermaster
+ My story is enfolded in the history of this nation.
+ Sustainer of Armies...
+
+ My forges burned at Valley Forge.
+ Down frozen, rutted roads my oxen hauled
+ the meager foods a bankrupt Congress sent me...
+ Scant rations for the cold and starving troops,
+ Gunpowder, salt, and lead.
+
+ In 1812 we sailed to war in ships my boatwrights built.
+ I fought beside you in the deserts of our great Southwest.
+ My pack mules perished seeking water holes,
+ And I went on with camels.
+ I gave flags to serve.
+ The medals and crest you wear are my design.
+
+ Since 1862, I have sought our fallen brothers
+ from Private to President.
+ In war or peace I bring them home
+ And lay them gently down in fields of honor.
+
+ Provisioner, transporter.
+ In 1898 I took you to Havana Harbor and the Philippines.
+ I brought you tents, your khaki cloth for uniforms.
+ When yellow fever struck, I brought the mattresses you lay upon.
+
+ In 1917, we crossed the ocean to fight in the trenches and fields of France,
+ New weapons, training, technologies, and tactics for the Great War.
+ But always the need for food, water, ammunition, and now fuel.
+
+ We shed first blood together at Pearl Harbor and Corregidor.
+ Then begin the long march to Victory - Guadalcanal and North Africa, Sicily and the Solomons.
+ I was there with you at Omaha Beach on D-Day and even the night before from Glider and Parachute.
+ Across Europe and the Pacific, I drove and dug and fought till the job was done.
+
+ When war came to the Peninsula in 1950, it was my 'chutes that filled the grey Korean skies.
+ From the perimeter at Pusan to the cold roads of the Chosin, I was there.
+ In 1965, I established the fire bases and depots across South Vietnam,
+ The Hueys and Chinooks carried my supplies forward.
+
+ I AM QUARTERMASTER.
+ I can shape the course of combat,
+ Change the outcome of battle.
+ Look to me: Sustainer of Armies...Since 1775.
+
+ I AM QUARTERMASTER. I AM PROUD."}
+ icon_state = "rocreed"
+
/obj/structure/sign/prop1
name = "\improper USCM Poster"
desc = "The symbol of the United States Colonial Marines corps."
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 6f721d9725e5..fab66dc1a1a5 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -398,6 +398,10 @@
sound = pick('sound/voice/pred_pain1.ogg','sound/voice/pred_pain2.ogg','sound/voice/pred_pain3.ogg','sound/voice/pred_pain4.ogg','sound/voice/pred_pain5.ogg',5;'sound/voice/pred_pain_rare1.ogg')
if("clownstep")
sound = pick('sound/effects/clownstep1.ogg', 'sound/effects/clownstep2.ogg')
+ if("giant_lizard_growl")
+ sound = pick('sound/effects/giant_lizard_growl1.ogg', 'sound/effects/giant_lizard_growl2.ogg')
+ if("giant_lizard_hiss")
+ sound = pick('sound/effects/giant_lizard_hiss1.ogg', 'sound/effects/giant_lizard_hiss2.ogg')
return sound
/client/proc/generate_sound_queues()
diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm
index abc745dbdd45..5571773ddb0f 100644
--- a/code/game/turfs/closed.dm
+++ b/code/game/turfs/closed.dm
@@ -282,11 +282,18 @@
/turf/closed/shuttle/twe_dropship/transparent
opacity = FALSE
-/turf/closed/shuttle/dropship2/tornado
- name = "\improper Tornado"
+/turf/closed/shuttle/dropship3
+ name = "\improper Saipan"
icon = 'icons/turf/dropship3.dmi'
+ icon_state = "1"
+
+/turf/closed/shuttle/dropship3/transparent
+ opacity = FALSE
+
+/turf/closed/shuttle/dropship3/tornado
+ name = "\improper Tornado"
-/turf/closed/shuttle/dropship2/tornado/typhoon
+/turf/closed/shuttle/dropship3/tornado/typhoon
name = "\improper Typhoon"
/turf/closed/shuttle/escapepod
diff --git a/code/game/turfs/transit.dm b/code/game/turfs/transit.dm
index 5b4645805d3b..dba90fff52f3 100644
--- a/code/game/turfs/transit.dm
+++ b/code/game/turfs/transit.dm
@@ -264,6 +264,10 @@
shuttle_tag = DROPSHIP_NORMANDY
dir = SOUTH
+/turf/open/space/transit/dropship/saipan
+ shuttle_tag = DROPSHIP_SAIPAN
+ dir = SOUTH
+
/turf/open/space/transit/south
dir = SOUTH
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index a5ecea8b05a4..4d52635c6f88 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -7,6 +7,9 @@
to_chat(src, "Guests may not use OOC.")
return
+ if(!filter_message(src, msg))
+ return
+
msg = trim(strip_html(msg))
if(!msg) return
@@ -101,6 +104,9 @@
to_chat(src, "Guests may not use LOOC.")
return
+ if(!filter_message(src, msg))
+ return
+
msg = trim(strip_html(msg))
if(!msg) return
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index aa87f157173c..2270685c0cf6 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -93,8 +93,7 @@ GLOBAL_LIST_INIT(admin_verbs_admin, list(
/datum/admins/proc/admin_force_selfdestruct,
/client/proc/check_round_statistics,
/client/proc/force_teleporter,
- /client/proc/matrix_editor,
- /datum/admins/proc/open_shuttlepanel
+ /client/proc/matrix_editor
))
GLOBAL_LIST_INIT(admin_verbs_ban, list(
@@ -143,6 +142,7 @@ GLOBAL_LIST_INIT(admin_verbs_minor_event, list(
/client/proc/toggle_hardcore_perma,
/client/proc/toggle_bypass_joe_restriction,
/client/proc/toggle_joe_respawns,
+ /datum/admins/proc/open_shuttlepanel
))
GLOBAL_LIST_INIT(admin_verbs_major_event, list(
@@ -220,6 +220,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug, list(
/datum/admins/proc/view_href_log, /*shows the server HREF log for this round*/
/datum/admins/proc/view_tgui_log, /*shows the server TGUI log for this round*/
/client/proc/admin_blurb,
+ /datum/admins/proc/open_shuttlepanel,
))
GLOBAL_LIST_INIT(admin_verbs_debug_advanced, list(
diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm
index a155f2a37614..fa0f43780031 100644
--- a/code/modules/admin/tabs/event_tab.dm
+++ b/code/modules/admin/tabs/event_tab.dm
@@ -718,7 +718,7 @@
set name = "Toggle Remote Control"
set category = "Admin.Events"
- if(!check_rights(R_SPAWN))
+ if(!check_rights(R_MOD|R_DEBUG))
return
remote_control = !remote_control
diff --git a/code/modules/admin/verbs/shuttlepanel.dm b/code/modules/admin/verbs/shuttlepanel.dm
index 9ae9cedd7992..72d69511aff6 100644
--- a/code/modules/admin/verbs/shuttlepanel.dm
+++ b/code/modules/admin/verbs/shuttlepanel.dm
@@ -3,7 +3,7 @@
set name = "Shuttle Manipulator"
set desc = "Opens the shuttle manipulator UI."
- if(!check_rights(R_ADMIN|R_DEBUG|R_HOST))
+ if(!check_rights(R_EVENT|R_DEBUG|R_HOST))
return
SSshuttle.tgui_interact(usr)
diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm
index e826b0b64767..3ee8ef5b616d 100644
--- a/code/modules/asset_cache/asset_list_items.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -281,44 +281,50 @@
name = "vending"
/datum/asset/spritesheet/vending_products/register()
- for (var/k in GLOB.vending_products)
- var/atom/item = k
+ for (var/current_product in GLOB.vending_products)
+ var/atom/item = current_product
var/icon_file = initial(item.icon)
var/icon_state = initial(item.icon_state)
- var/icon/I
+ var/icon/new_icon
if (!ispath(item, /atom))
log_debug("not atom! [item]")
continue
- var/imgid = replacetext(replacetext("[k]", "/obj/item/", ""), "/", "-")
+ var/imgid = replacetext(replacetext("[current_product]", "/obj/item/", ""), "/", "-")
if(sprites[imgid])
continue
if(icon_state in icon_states(icon_file))
- I = icon(icon_file, icon_state, SOUTH)
- var/c = initial(item.color)
- if (!isnull(c) && c != "#FFFFFF")
- I.Blend(c, ICON_MULTIPLY)
+ if(ispath(current_product, /obj/item/storage/box) || ispath(current_product, /obj/item/ammo_box) || ispath(current_product, /obj/item/reagent_container))
+ item = new current_product()
+ new_icon = getFlatIcon(item)
+ new_icon.Scale(32,32)
+ qdel(item)
+ else
+ new_icon = icon(icon_file, icon_state, SOUTH)
+ var/new_color = initial(item.color)
+ if (!isnull(new_color) && new_color != "#FFFFFF")
+ new_icon.Blend(new_color, ICON_MULTIPLY)
else
- if (ispath(k, /obj/effect/essentials_set))
- var/obj/effect/essentials_set/es_set = new k()
- var/list/spawned_list = es_set.spawned_gear_list
+ if(ispath(current_product, /obj/effect/essentials_set))
+ var/obj/effect/essentials_set/essentials = new current_product()
+ var/list/spawned_list = essentials.spawned_gear_list
if(LAZYLEN(spawned_list))
var/obj/item/target = spawned_list[1]
icon_file = initial(target.icon)
icon_state = initial(target.icon_state)
var/target_obj = new target()
- I = getFlatIcon(target_obj)
- I.Scale(32,32)
+ new_icon = getFlatIcon(target_obj)
+ new_icon.Scale(32,32)
qdel(target_obj)
else
- item = new k()
- I = icon(item.icon, item.icon_state, SOUTH)
+ item = new current_product()
+ new_icon = icon(item.icon, item.icon_state, SOUTH)
qdel(item)
- Insert(imgid, I)
+ Insert(imgid, new_icon)
return ..()
@@ -390,8 +396,8 @@
var/icon_state = temp_gun.base_gun_icon // base_gun_icon is set in Initialize generally
qdel(temp_gun)
if(icon_state && isnull(sprites[icon_state]))
- // upgrade this to a stack_trace once all guns have a lineart and we want to lint against that
- log_debug("[current_gun] does not have a valid lineart icon state, icon=[icon_file], icon_state=[json_encode(icon_state)]")
+ // downgrade this to a log_debug if we don't want missing lineart to be a lint
+ stack_trace("[current_gun] does not have a valid lineart icon state, icon=[icon_file], icon_state=[json_encode(icon_state)]")
..()
diff --git a/code/modules/autowiki/autowiki.dm b/code/modules/autowiki/autowiki.dm
index 5f8fe0a10a1f..0b0d1212dd82 100644
--- a/code/modules/autowiki/autowiki.dm
+++ b/code/modules/autowiki/autowiki.dm
@@ -40,7 +40,7 @@
for(var/list in output)
all_page_names += autowiki.include_template(list["title"])
- total_output += json_encode(list("title" = autowiki.page, "text" = all_page_names))
+ total_output += json_encode(list("title" = autowiki.page, "text" = all_page_names.Join(" "))) + "\n"
continue
var/output = autowiki.generate()
diff --git a/code/modules/autowiki/pages/xeno_stats.dm b/code/modules/autowiki/pages/xeno_stats.dm
new file mode 100644
index 000000000000..720f4fe04898
--- /dev/null
+++ b/code/modules/autowiki/pages/xeno_stats.dm
@@ -0,0 +1,54 @@
+/datum/autowiki/xeno_stats
+ generate_multiple = TRUE
+ page = "Template:Autowiki/Content/XenoStats"
+
+/datum/autowiki/xeno_stats/generate_multiple()
+ var/output = list()
+
+ for(var/mob/living/carbon/xenomorph/xeno as anything in subtypesof(/mob/living/carbon/xenomorph))
+ if(IS_AUTOWIKI_SKIP(xeno))
+ continue
+
+ var/mob/living/carbon/xenomorph/xeno_instance = new xeno()
+
+ var/strains = list(null) + xeno_instance.caste.available_strains
+ for(var/datum/xeno_strain/strain as anything in strains)
+ var/datum/xeno_strain/strain_instance = null
+ if(!isnull(strain))
+ strain_instance = new strain()
+
+ output += template_from_xeno(xeno_instance, strain_instance)
+
+ qdel(strain_instance)
+
+ qdel(xeno_instance)
+
+ return output
+
+/datum/autowiki/xeno_stats/proc/template_from_xeno(mob/living/carbon/xenomorph/xeno, datum/xeno_strain/strain)
+ var/name = xeno.caste_type
+ if(!isnull(strain))
+ strain.apply_strain(xeno)
+ name = "[strain.name] [name]"
+
+ var/xeno_data = list(
+ "name" = name,
+ "health" = xeno.maxHealth,
+ "armor" = xeno.armor_deflection,
+ "plasma" = xeno.plasma_max,
+ "plasma_regeneration" = xeno.plasma_gain,
+ "minimum_slash_damage" = xeno.melee_damage_lower,
+ "maximum_slash_damage" = xeno.melee_damage_upper,
+ "claw_strength" = xeno.claw_type,
+ "evasion" = xeno.evasion,
+ // Mob speed is relatively non-obvious, we we convert it into a very intuitive
+ // range for wiki-readability.
+ "speed" = humanize_speed(xeno.speed),
+ "explosion_resistance" = xeno.caste.xeno_explosion_resistance,
+ )
+
+ var/sanitized_name = url_encode(replacetext(name, " ", "_"))
+ return list(list(title = "Template:Autowiki/Content/XenoStats/[sanitized_name]", text = include_template("Autowiki/XenoStats", xeno_data)))
+
+/datum/autowiki/xeno_stats/proc/humanize_speed(speed)
+ return speed * -1 + 1
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 4d0ef56b9fdd..52aa1be1408b 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -419,11 +419,7 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list(
if(prefs.lastchangelog != GLOB.changelog_hash) //bolds the changelog button on the interface so we know there are updates.
winset(src, "infowindow.changelog", "background-color=#ED9F9B;font-style=bold")
- if(prefs.toggle_prefs & TOGGLE_FULLSCREEN)
- toggle_fullscreen(TRUE)
- else
- toggle_fullscreen(FALSE)
-
+ update_fullscreen()
var/file = file2text("config/donators.txt")
var/lines = splittext(file, "\n")
@@ -733,12 +729,16 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list(
if(WHISPER_CHANNEL)
winset(src, "srvkeybinds-[REF(key)]", "parent=default;name=[key];command=whisper")
-/client/proc/toggle_fullscreen(new_value)
- if(new_value)
- winset(src, "mainwindow", "is-maximized=false;can-resize=false;titlebar=false;menu=menu")
+/client/proc/update_fullscreen()
+ if(prefs.toggle_prefs & TOGGLE_FULLSCREEN)
+ winset(src, "mainwindow", "is-fullscreen=true;menu=")
else
- winset(src, "mainwindow", "is-maximized=false;can-resize=true;titlebar=true;menu=menu")
- winset(src, "mainwindow", "is-maximized=true")
+ winset(src, "mainwindow", "is-fullscreen=false;menu=menu")
+
+ if(prefs.adaptive_zoom)
+ adaptive_zoom()
+ else if(prefs.auto_fit_viewport)
+ fit_viewport()
/// Attempts to make the client orbit the given object, for administrative purposes.
/// If they are not an observer, will try to aghost them.
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index cb3114f6c5a4..97449e5952ae 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -226,7 +226,7 @@
prefs.toggle_prefs ^= TOGGLE_FULLSCREEN
prefs.save_preferences()
- toggle_fullscreen(prefs.toggle_prefs & TOGGLE_FULLSCREEN)
+ update_fullscreen()
/client/verb/toggle_ambient_occlusion()
set name = "Toggle Ambient Occlusion"
diff --git a/code/modules/clothing/gloves/marine_gloves.dm b/code/modules/clothing/gloves/marine_gloves.dm
index 6da362da30f4..d36073bb48a0 100644
--- a/code/modules/clothing/gloves/marine_gloves.dm
+++ b/code/modules/clothing/gloves/marine_gloves.dm
@@ -42,6 +42,12 @@
item_state = "insulated"
siemens_coefficient = 0
+/obj/item/clothing/gloves/marine/insulated/black
+ name = "marine insulated black gloves"
+ desc = "These marine gloves will protect the wearer from electric shocks and shrapnal. Standard issue for properly-equipped Marines."
+ icon_state = "black"
+ item_state = "black"
+
/obj/item/clothing/gloves/marine/black
name = "marine black combat gloves"
adopts_squad_color = FALSE
diff --git a/code/modules/clothing/head/head.dm b/code/modules/clothing/head/head.dm
index 7e1c1d8d08d2..f9c8adbf9a77 100644
--- a/code/modules/clothing/head/head.dm
+++ b/code/modules/clothing/head/head.dm
@@ -489,6 +489,10 @@
icon_state = "coblackberet"
desc = "A beret with the USCM Military Police insignia emblazoned on it."
+/obj/item/clothing/head/beret/marine/mp/provost/chief
+ name = "\improper USCM provost command beret"
+ icon_state = "pvciberet"
+
/obj/item/clothing/head/beret/marine/mp/tis
name = "\improper UAAC-TIS Special Agent Beret"
icon_state = "berettis"
@@ -577,6 +581,15 @@
desc = "A beret with the lieutenant insignia emblazoned on it. It inspires a feeling of respect."
icon_state = "beret_badge"
+/obj/item/clothing/head/beret/marine/ro
+ name = "\improper USCM quartermaster beret"
+ desc = "A beret with the sergeant insignia emblazoned on it. It symbolizes hard work and shady business."
+ icon = 'icons/obj/items/clothing/cm_hats.dmi'
+ icon_state = "ro_beret"
+ item_icons = list(
+ WEAR_HEAD = 'icons/mob/humans/onmob/head_1.dmi'
+ )
+
//==========================//PROTECTIVE\\===============================\\
//=======================================================================\\
diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm
index 7d6c8ed3d5dc..f3de770790a8 100644
--- a/code/modules/clothing/shoes/colour.dm
+++ b/code/modules/clothing/shoes/colour.dm
@@ -29,10 +29,6 @@
name = "purple shoes"
icon_state = "purple"
-/obj/item/clothing/shoes/brown
- name = "brown shoes"
- icon_state = "brown"
-
/obj/item/clothing/shoes/red
name = "red shoes"
desc = "Stylish red shoes."
diff --git a/code/modules/clothing/shoes/marine_shoes.dm b/code/modules/clothing/shoes/marine_shoes.dm
index 937416943958..b71c69643ff4 100644
--- a/code/modules/clothing/shoes/marine_shoes.dm
+++ b/code/modules/clothing/shoes/marine_shoes.dm
@@ -99,6 +99,12 @@
armor_rad = CLOTHING_ARMOR_NONE
armor_internaldamage = CLOTHING_ARMOR_MEDIUMLOW
+/obj/item/clothing/shoes/stompers
+ name = "Reebok Stompers"
+ desc = "A pair of sneakers designed to elicit a morale boosting response within anyone that witnesses them."
+ icon_state = "stompers"
+ flags_inventory = NOSLIPPING
+
/obj/item/clothing/shoes/veteran/pmc
name = "polished shoes"
desc = "The height of fashion, but these look to be woven with protective fiber."
diff --git a/code/modules/clothing/suits/marine_armor/_marine_armor.dm b/code/modules/clothing/suits/marine_armor/_marine_armor.dm
index 3d89ecb7cabb..0ba339433fc2 100644
--- a/code/modules/clothing/suits/marine_armor/_marine_armor.dm
+++ b/code/modules/clothing/suits/marine_armor/_marine_armor.dm
@@ -665,15 +665,6 @@
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
diff --git a/code/modules/clothing/suits/marine_coat.dm b/code/modules/clothing/suits/marine_coat.dm
index 78c8154e1810..fc2a76698029 100644
--- a/code/modules/clothing/suits/marine_coat.dm
+++ b/code/modules/clothing/suits/marine_coat.dm
@@ -89,6 +89,16 @@
flags_atom = NO_SNOW_TYPE
initial_icon_state = "pilot_alt"
+/obj/item/clothing/suit/storage/jacket/marine/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"
+ icon = 'icons/obj/items/clothing/suits.dmi'
+ item_icons = list(
+ WEAR_JACKET = 'icons/mob/humans/onmob/suit_0.dmi'
+ )
+ flags_atom = NO_SNOW_TYPE
+
/obj/item/clothing/suit/storage/jacket/marine/service/mp
name = "military police service jacket"
desc = "A marine service jacket adopted for use by Military Police personnel on board USCM ships. Ironically most ships require their MP departments to use full armor, making these barely used by on duty MPs. This variant is also available to regular Marines, if they are willing to bear the shame."
@@ -243,6 +253,11 @@
flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE
valid_accessory_slots = list(ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_RANK, ACCESSORY_SLOT_DECOR)
+/obj/item/clothing/suit/storage/jacket/marine/provost/chief
+ name = "\improper Provost Command Jacket"
+ desc = "A crisp jacket with the Provost sigil."
+ icon_state = "provostci_jacket"
+
/obj/item/clothing/suit/storage/jacket/marine/provost/coat
name = "\improper Provost Coat"
desc = "The crisp coat of a Provost Officer."
diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm
index 0d5fc31a2560..7ac0ddc018fa 100644
--- a/code/modules/clothing/suits/storage.dm
+++ b/code/modules/clothing/suits/storage.dm
@@ -10,6 +10,10 @@
pockets.max_storage_space = 4
flags_atom |= USES_HEARING
+/obj/item/clothing/suit/storage/Destroy()
+ QDEL_NULL(pockets)
+ return ..()
+
/obj/item/clothing/suit/storage/get_pockets()
if(pockets)
return pockets
diff --git a/code/modules/clothing/under/marine_uniform.dm b/code/modules/clothing/under/marine_uniform.dm
index 52635c63600a..a9aec9544641 100644
--- a/code/modules/clothing/under/marine_uniform.dm
+++ b/code/modules/clothing/under/marine_uniform.dm
@@ -381,6 +381,12 @@
icon_state = "provost_tml"
worn_state = "provost_tml"
+/obj/item/clothing/under/marine/mp/provost/chief
+ name = "\improper Provost Command Uniform"
+ desc = "The crisp uniform of a commanding member of the Provost Office."
+ icon_state = "provost_ci"
+ worn_state = "provost_ci"
+
/obj/item/clothing/under/marine/mp/provost/marshal
name = "\improper Provost Marshal Uniform"
desc = "The crisp uniform of a Provost Marshal."
diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm
index 4e4041971807..cea9e26869b0 100644
--- a/code/modules/clothing/under/ties.dm
+++ b/code/modules/clothing/under/ties.dm
@@ -393,6 +393,11 @@
desc = "A fire-resistant shoulder patch, worn by the men and women of the Falling Falcons, the 2nd battalion of the 4th brigade of the USCM."
icon_state = "fallingfalconspatch"
+/obj/item/clothing/accessory/patch/devils
+ name = "USCM Solar Devils patch"
+ desc = "A fire-resistant shoulder patch, worn by the men and women of the 3rd Battalion 'Solar Devils', part of the USCM 2nd Division, 1st Regiment."
+ icon_state = "solardevilspatch"
+
/obj/item/clothing/accessory/patch/forecon
name = "USCM Force Reconnaissance patch"
desc = "A fire-resistant shoulder patch, worn by the men and women of the USS Hanyut, USCM FORECON."
diff --git a/code/modules/cm_marines/Donator_Items.dm b/code/modules/cm_marines/Donator_Items.dm
index e534997ddd42..f8f2e61b8a37 100644
--- a/code/modules/cm_marines/Donator_Items.dm
+++ b/code/modules/cm_marines/Donator_Items.dm
@@ -244,11 +244,12 @@
icon_state = "tristan_armor"
item_state = "tristan_armor"
-/obj/item/clothing/suit/storage/marine/fluff/sas_legion //CKEY=sasoperative (UNIQUE)
- name = "Legion Armor"
- desc = "This armor was custom-made to resemble the small growing Legion within the galaxy started by one man slowly making its way to becoming a larger Corporation. DONOR ITEM."
- item_state = "ncrjacket"
- icon_state = "ncrjacket"
+/obj/item/clothing/suit/storage/marine/light/fluff/sas_legion //CKEY=sasoperative (UNIQUE)
+ name = "M3 Ranger Armor"
+ desc = "A set of M3 Pattern Ranger Armor, There probably are not many of these laying around. DONOR ITEM."
+ flags_atom = FPRINT|CONDUCT|NO_NAME_OVERRIDE
+ icon_state = "rangerarmor"
+ item_state = "rangerarmor"
/obj/item/clothing/suit/storage/marine/fluff/feodrich //CKEY=feodrich (UNIQUE)
name = "Doom Armor"
@@ -470,18 +471,6 @@
icon_state = "medicae_armor_u"
item_state = "medicae_armor_u"
-/obj/item/clothing/suit/storage/marine/fluff/Sanctum_heavy
- name = "Sanctum Founder Armor"
- desc = "Personal Armor of the Founder of Sanctum Team. It looks more like a Exosuit. Unique DONOR ITEM" //Add UNIQUE if Unique
- icon_state = "Sanctum_Heavy_u"
- item_state = "Sanctum_Heavy_u"
-
-/obj/item/clothing/suit/storage/marine/fluff/Sanctum_medium
- name = "Sanctum Standard Armor"
- desc = "The Standard Issue Armor for Sanctum Operatives Unique DONOR ITEM"
- icon_state = "Sanctum_Medium_u"
- item_state = "Sanctum_Medium_u"
-
/obj/item/clothing/suit/storage/marine/fluff/dudewithatude
name = "Rainbow Coat"
desc = "Powered by the magic of FRIENDSHIP. (Can be toggled opened or closed) UNIQUE DONOR ITEM"
@@ -656,6 +645,13 @@
icon_state = "hecuhelm_u"
desc = "A combat helmet, bearing the scars of many battles. UNIQUE DONOR ITEM"
+/obj/item/clothing/head/helmet/marine/fluff/sas_legion //CKEY=sasoperative (UNIQUE)
+ name = "M3 Ranger Helmet"
+ desc = "A M3 Ranger helmet, probably not many of these laying around. DONOR ITEM"
+ flags_atom = FPRINT|CONDUCT|NO_NAME_OVERRIDE
+ icon_state = "rangerhelmet"
+ item_state = "rangerhelmet"
+
/obj/item/clothing/head/helmet/marine/fluff/officialjake
name = "Timothy's Beret"
desc = "A fancy red beret owned by Timothy Seidner. DONOR ITEM"
@@ -912,14 +908,6 @@
flags_inventory = BLOCKSHARPOBJ
flags_inv_hide = HIDEEARS|HIDEMASK|HIDEEYES|HIDEALLHAIR
-/obj/item/clothing/head/helmet/marine/fluff/Sanctum_helmet
- name = "Sanctum Combat Helmet"
- desc = " The Standard Issue helmet of Sanctum Team. DONOR ITEM" //Add UNIQUE if Unique
- icon_state = "Sanctum_Helm_u"
- item_state = "Sanctum_Helm_u"
- flags_inventory = BLOCKSHARPOBJ
- flags_inv_hide = HIDEEARS|HIDEMASK|HIDEEYES|HIDEALLHAIR
-
/obj/item/clothing/head/helmet/marine/fluff/dingledangle
name = "Rusty's Cap"
desc = "A little old and shabby. The color has slightly faded over time. DONOR ITEM"
@@ -998,13 +986,6 @@
worn_state = "camojump"
flags_jumpsuit = FALSE
-/obj/item/clothing/under/marine/fluff/sas_legion //CKEY=sasoperative (UNIQUE)
- name = "Legion Suit"
- desc = "This armor was custom-made to resemble the small growing Legion within the galaxy started by one man slowly making its way to becoming a larger Corporation. DONOR ITEM."
- icon_state = "ncr_uni"
- worn_state = "ncr_uni"
- flags_jumpsuit = FALSE
-
/obj/item/clothing/under/marine/fluff/feodrich //CKEY=feodrich (UNIQUE)
name = "Doom Uniform"
desc = "A uniform, of a famous Earth warrior... Donor Item"
@@ -1207,13 +1188,6 @@
worn_state = "medicae_jumpsuit_u"
flags_jumpsuit = FALSE
-/obj/item/clothing/under/marine/fluff/sanctum_uniform //NO USER
- name = "Sanctum Fatigues"
- desc = "Fatigues with Kevlar fibers for a bit more protection than most clothing. UNIQUE DONOR ITEM"
- icon_state = "Sanctum_u"
- worn_state = "Sanctum_u"
- flags_jumpsuit = FALSE
-
/obj/item/clothing/under/marine/fluff/sailordave //CKEY=sailordave
name = "Eden USCM uniform"
desc = "An older model USCM uniform. UNIQUE DONOR ITEM"
@@ -1244,16 +1218,6 @@
item_state = "revanmask"
icon_state = "revanmask"
-
-/obj/item/clothing/mask/fluff/sas_legion //CKEY=sasoperative (UNIQUE)
- name = "Legion Mask"
- desc = "This armor was custom-made to resemble the small growing Legion within the galaxy started by one man slowly making its way to becoming a larger Corporation. DONOR ITEM."
- icon_override = 'icons/mob/humans/onmob/mask.dmi'
- item_state = "officer_mask"
- icon_state = "officer_mask"
- flags_inventory = COVERMOUTH|ALLOWREBREATH
- flags_inv_hide = HIDEEARS|HIDEFACE|HIDEALLHAIR
-
/obj/item/clothing/mask/fluff/totalanarchy //CKEY=totalanarchy
name = "PMC Mask"
desc = "A white colored PMC Mask. DONOR ITEM."
@@ -1373,6 +1337,13 @@
item_state = "securitypack"
has_gamemode_skin = FALSE //same sprite for all gamemodes.
+/obj/item/storage/backpack/marine/satchel/fluff/sas_legion //CKEY=sasoperative (UNIQUE)
+ name = "M3 Armored Pack"
+ desc = "Plenty of pouches and pockets. DONOR ITEM"
+ flags_atom = FPRINT|CONDUCT|NO_NAME_OVERRIDE
+ icon_state = "skinnerrangerpack"
+ item_state = "skinnerrangerpack"
+
/obj/item/clothing/glasses/fluff/alexwarhammer
name = "Black Jack's Dank Shades"
desc = "+20 Badass points. Donor item"
diff --git a/code/modules/cm_marines/Donator_Kits.dm b/code/modules/cm_marines/Donator_Kits.dm
index 01acf638c2cd..b0c9ec51e946 100644
--- a/code/modules/cm_marines/Donator_Kits.dm
+++ b/code/modules/cm_marines/Donator_Kits.dm
@@ -1,6 +1,7 @@
/obj/item/storage/box/donator_kit
name = "donated box"
desc = "A cardboard box stamped with a dollar sign and filled with trinkets. Appears to have been donated by a wealthy sponsor."
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "donator_kit"
item_state = "giftbag"
var/list/donor_gear = list()
@@ -436,9 +437,9 @@
donor_key = "sasoperative"
kit_variant = "Legion"
donor_gear = list(
- /obj/item/clothing/suit/storage/marine/fluff/sas_legion,
- /obj/item/clothing/under/marine/fluff/sas_legion,
- /obj/item/clothing/mask/fluff/sas_legion,
+ /obj/item/clothing/suit/storage/marine/light/fluff/sas_legion,
+ /obj/item/clothing/head/helmet/marine/fluff/sas_legion,
+ /obj/item/storage/backpack/marine/satchel/fluff/sas_legion,
)
/obj/item/storage/box/donator_kit/seloc_aferah
diff --git a/code/modules/cm_marines/dropship_equipment.dm b/code/modules/cm_marines/dropship_equipment.dm
index 9203a493c587..267efad9e57d 100644
--- a/code/modules/cm_marines/dropship_equipment.dm
+++ b/code/modules/cm_marines/dropship_equipment.dm
@@ -288,6 +288,8 @@
deployed_turret.linked_cam.network = list(CAMERA_NET_ALAMO)
else if (linked_shuttle.id == DROPSHIP_NORMANDY)
deployed_turret.linked_cam.network = list(CAMERA_NET_NORMANDY)
+ else if (linked_shuttle.id == DROPSHIP_SAIPAN)
+ deployed_turret.linked_cam.network = list(CAMERA_NET_SAIPAN)
/obj/structure/dropship_equipment/sentry_holder/proc/undeploy_sentry()
diff --git a/code/modules/cm_marines/equipment/gear.dm b/code/modules/cm_marines/equipment/gear.dm
index 9e5352621e32..6e11181e249e 100644
--- a/code/modules/cm_marines/equipment/gear.dm
+++ b/code/modules/cm_marines/equipment/gear.dm
@@ -4,8 +4,8 @@
/obj/item/device/flashlight/combat
name = "combat flashlight"
- desc = "A Flashlight designed to be held in the hand, or attached to a rifle"
- icon_state = "flashlight"
+ desc = "A Flashlight designed to be held in the hand, or attached to a rifle, has better bulb compared to a normal flashlight."
+ icon_state = "combat_flashlight"
item_state = "flashlight"
light_range = 5 //Pretty luminous, but still a flashlight that fits in a pocket
diff --git a/code/modules/cm_marines/equipment/guncases.dm b/code/modules/cm_marines/equipment/guncases.dm
index cbbb791f8f0b..33cfeed00307 100644
--- a/code/modules/cm_marines/equipment/guncases.dm
+++ b/code/modules/cm_marines/equipment/guncases.dm
@@ -1,6 +1,7 @@
/obj/item/storage/box/guncase
name = "\improper gun case"
desc = "It has space for firearm(s). Sometimes magazines or other munitions as well."
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "guncase"
w_class = SIZE_HUGE
max_w_class = SIZE_HUGE //shouldn't be a problem since we can only store the guns and ammo.
diff --git a/code/modules/cm_marines/equipment/kit_boxes.dm b/code/modules/cm_marines/equipment/kit_boxes.dm
index d61fc6e8a4c0..7be519896097 100644
--- a/code/modules/cm_marines/equipment/kit_boxes.dm
+++ b/code/modules/cm_marines/equipment/kit_boxes.dm
@@ -2,7 +2,7 @@
//******************************************Spec Kits****************************************************************/
/obj/item/storage/box/spec
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "kit_case"
var/kit_overlay = null
w_class = SIZE_HUGE
@@ -178,7 +178,7 @@
/obj/item/spec_kit
name = "specialist kit"
desc = "A paper box. Open it and get a specialist kit."
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "spec_kit"
var/list/allowed_roles_list = list(JOB_SQUAD_SPECIALIST, JOB_WO_SQUAD_SPECIALIST, JOB_WO_CREWMAN)
@@ -274,7 +274,7 @@
//******************************************PFC Kits****************************************************************/
/obj/item/storage/box/kit
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "pro_case_mini"//to-do redo these sprites, they're out of date by current standards
w_class = SIZE_HUGE
storage_slots = 12
@@ -288,7 +288,7 @@
/obj/item/storage/box/kit/Initialize()
. = ..()
if(pro_case_overlay)
- overlays += image('icons/obj/items/storage.dmi', "+[pro_case_overlay]")
+ overlays += image('icons/obj/items/storage/kits.dmi', "+[pro_case_overlay]")
/obj/item/storage/box/kit/update_icon()
if(!length(contents))
diff --git a/code/modules/cm_marines/equipment/mortar/mortars.dm b/code/modules/cm_marines/equipment/mortar/mortars.dm
index e7e258494e52..161be4813832 100644
--- a/code/modules/cm_marines/equipment/mortar/mortars.dm
+++ b/code/modules/cm_marines/equipment/mortar/mortars.dm
@@ -43,6 +43,17 @@
targ_y = deobfuscate_y(0)
internal_camera = new(loc)
+ var/new_icon_state
+ switch(SSmapping.configs[GROUND_MAP].camouflage_type)
+ if("classic")
+ icon_state = new_icon_state ? new_icon_state : "c_" + icon_state
+ if("desert")
+ icon_state = new_icon_state ? new_icon_state : "d_" + icon_state
+ if("snow")
+ icon_state = new_icon_state ? new_icon_state : "s_" + icon_state
+ if("urban")
+ icon_state = new_icon_state ? new_icon_state : "u_" + icon_state
+
/obj/structure/mortar/Destroy()
QDEL_NULL(internal_camera)
return ..()
@@ -400,6 +411,10 @@
unacidable = TRUE
w_class = SIZE_HUGE //No dumping this in a backpack. Carry it, fatso
+/obj/item/mortar_kit/Initialize(...)
+ . = ..()
+ select_gamemode_skin(type)
+
/obj/item/mortar_kit/ex_act(severity)
switch(severity)
if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY)
diff --git a/code/modules/cm_marines/equipment/weapons.dm b/code/modules/cm_marines/equipment/weapons.dm
index 085289cd3cbf..076aa37a0f41 100644
--- a/code/modules/cm_marines/equipment/weapons.dm
+++ b/code/modules/cm_marines/equipment/weapons.dm
@@ -2,7 +2,7 @@
/obj/item/storage/box/m56_system
name = "\improper M56 smartgun system case"
desc = "A large case containing an M56B Smartgun, M56 combat harness, head mounted sight and powerpack.\nDrag this sprite into you to open it up! NOTE: You cannot put items back inside this case."
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "kit_case"
w_class = SIZE_HUGE
storage_slots = 7
@@ -31,7 +31,7 @@
/obj/item/storage/box/m56c_system
name = "\improper M56C smartgun system case"
desc = "A large case containing an M56C Smartgun, M56 combat harness, head mounted sight, M280 Smartgunner Drum Belt and powerpack.\nDrag this sprite into you to open it up! NOTE: You cannot put items back inside this case."
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "kit_case"
w_class = SIZE_HUGE
storage_slots = 5
@@ -59,7 +59,7 @@
/obj/item/storage/box/m56_dirty_system
name = "\improper M56D 'Dirty' smartgun system case"
desc = "A large case containing an M56D 'Dirty' Smartgun, M56D PMC combat harness and helmet, head mounted sight, M280 Smartgunner Drum Belt and powerpack.\nDrag this sprite into you to open it up! NOTE: You cannot put items back inside this case."
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "kit_case"
w_class = SIZE_HUGE
storage_slots = 6
diff --git a/code/modules/cm_marines/marines_consoles.dm b/code/modules/cm_marines/marines_consoles.dm
index 7225556584de..778f3f4f18bf 100644
--- a/code/modules/cm_marines/marines_consoles.dm
+++ b/code/modules/cm_marines/marines_consoles.dm
@@ -925,9 +925,11 @@ GLOBAL_LIST_EMPTY_TYPED(crewmonitor, /datum/crewmonitor)
JOB_PROVOST_CMARSHAL = 00,
JOB_GENERAL = 00,
JOB_PROVOST_SMARSHAL = 01,//Grade O9
- JOB_PROVOST_MARSHAL = 02,//Grade O8
+ JOB_PROVOST_MARSHAL = 02,//Grade O7
+ JOB_PROVOST_DMARSHAL = 03,//Grade O6
JOB_COLONEL = 04,//Grade O6
- JOB_PROVOST_INSPECTOR = 04,
+ JOB_PROVOST_CINSPECTOR = 05,
+ JOB_PROVOST_INSPECTOR = 06,
// 10-19: Command
JOB_CO = 10,
JOB_XO = 11,
@@ -1115,12 +1117,14 @@ GLOBAL_LIST_EMPTY_TYPED(crewmonitor, /datum/crewmonitor)
JOB_UPP_COMMANDO = 22,
// 30-39: Security
JOB_UPP_POLICE = 31,
+ JOB_UPP_COMMISSAR = 41,
// 40-49: MedSci
JOB_UPP_LT_DOKTOR = 41,
// 50-59: Engineering
JOB_UPP_COMBAT_SYNTH = 50,
JOB_UPP_CREWMAN = 51,
JOB_UPP_SUPPORT_SYNTH = 52,
+ JOB_UPP_SUPPLY = 53,
// 60-69: Soldiers
JOB_UPP_LEADER = 60,
JOB_UPP_SPECIALIST = 61,
diff --git a/code/modules/cm_marines/specialist.dm b/code/modules/cm_marines/specialist.dm
index 9fbb240a1178..72247641c488 100644
--- a/code/modules/cm_marines/specialist.dm
+++ b/code/modules/cm_marines/specialist.dm
@@ -131,6 +131,7 @@
name = "Demolitionist Set"
role_name = "Demo"
skill_to_give = SKILL_SPEC_ROCKET
+ trait_to_give = "demo"
kit_typepath = /obj/item/storage/box/spec/demolitionist
/datum/specialist_set/sadar/redeem_set(mob/living/redeemer, kit)
@@ -146,6 +147,7 @@
name = "Scout Set"
role_name = "Scout"
skill_to_give = SKILL_SPEC_SCOUT
+ trait_to_give = "scout"
kit_typepath = /obj/item/storage/box/spec/scout
/datum/specialist_set/scout/redeem_set(mob/living/redeemer, kit)
@@ -161,6 +163,7 @@
name = "Sniper Set"
role_name = "Sniper"
skill_to_give = SKILL_SPEC_SNIPER
+ trait_to_give = "sniper"
kit_typepath = /obj/item/storage/box/spec/sniper
incompatible_sets = list(
/datum/specialist_set/anti_mat_sniper,
@@ -170,6 +173,7 @@
name = "Anti-Materiel Sniper Set"
role_name = "Heavy Sniper"
skill_to_give = SKILL_SPEC_SNIPER
+ trait_to_give = "antimat_sniper"
kit_typepath = /obj/item/storage/box/spec/sniper/anti_materiel
incompatible_sets = list(
/datum/specialist_set/sniper,
@@ -179,10 +183,12 @@
name = "Heavy Grenadier Set"
role_name = "Grenadier"
skill_to_give = SKILL_SPEC_GRENADIER
+ trait_to_give = "grenadier"
kit_typepath = /obj/item/storage/box/spec/heavy_grenadier
/datum/specialist_set/pyro
name = "Pyro Set"
role_name = "Pyro"
skill_to_give = SKILL_SPEC_PYRO
+ trait_to_give = "pyro"
kit_typepath = /obj/item/storage/box/spec/pyro
diff --git a/code/modules/cm_preds/yaut_items.dm b/code/modules/cm_preds/yaut_items.dm
index 27edf559d3ca..97b0f14f5b9b 100644
--- a/code/modules/cm_preds/yaut_items.dm
+++ b/code/modules/cm_preds/yaut_items.dm
@@ -916,6 +916,7 @@
name = "medicomp"
desc = "A complex kit of alien tools and medicines."
icon_state = "medicomp"
+ icon = 'icons/obj/items/hunter/pred_gear.dmi'
use_sound = "toolbox"
w_class = SIZE_SMALL
storage_flags = STORAGE_FLAGS_DEFAULT
diff --git a/code/modules/cm_tech/implements/ammo_kits.dm b/code/modules/cm_tech/implements/ammo_kits.dm
index bcf267a54ca8..b77db20eeb00 100644
--- a/code/modules/cm_tech/implements/ammo_kits.dm
+++ b/code/modules/cm_tech/implements/ammo_kits.dm
@@ -68,6 +68,7 @@
/obj/item/storage/box/shotgun
name = "incendiary shotgun kit"
desc = "A kit containing incendiary shotgun shells."
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "incenbuck"
storage_slots = 5
var/amount = 5
diff --git a/code/modules/cm_tech/implements/engi_czsp.dm b/code/modules/cm_tech/implements/engi_czsp.dm
index f3024129b3eb..f1e9721f9197 100644
--- a/code/modules/cm_tech/implements/engi_czsp.dm
+++ b/code/modules/cm_tech/implements/engi_czsp.dm
@@ -2,7 +2,7 @@
name = "engineering upgrade kit"
desc = "A kit used to upgrade the defenses of an engineer's sentry. Back in 1980 when the machines tried to break free, it was a single android who laid them low. Now their technology is used widely on the rim."
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "upgradekit"
/obj/item/engi_upgrade_kit/Initialize(mapload, ...)
diff --git a/code/modules/cm_tech/implements/implants.dm b/code/modules/cm_tech/implements/implants.dm
index 8dbbe5d11c87..44c817d5ee5a 100644
--- a/code/modules/cm_tech/implements/implants.dm
+++ b/code/modules/cm_tech/implements/implants.dm
@@ -1,6 +1,7 @@
/obj/item/storage/box/implant
name = "implant box"
desc = "A sterile metal lockbox housing hypodermic implant injectors."
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "implantbox"
use_sound = "toolbox"
storage_slots = 5
diff --git a/code/modules/cm_tech/implements/medical_czsp.dm b/code/modules/cm_tech/implements/medical_czsp.dm
index 9ec56d35fbb5..69bb90b3ee13 100644
--- a/code/modules/cm_tech/implements/medical_czsp.dm
+++ b/code/modules/cm_tech/implements/medical_czsp.dm
@@ -2,6 +2,7 @@
/obj/item/storage/box/czsp/first_aid
name = "first-aid combat support kit"
desc = "Contains upgraded medical kits, nanosplints and an upgraded defibrillator."
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "medicbox"
storage_slots = 3
@@ -15,6 +16,7 @@
/obj/item/storage/box/czsp/medical
name = "medical combat support kit"
desc = "Contains upgraded medical kits, nanosplints and an upgraded defibrillator."
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "medicbox"
storage_slots = 4
@@ -27,6 +29,7 @@
/obj/item/storage/box/czsp/medic_upgraded_kits
name = "medical upgrade kit"
+ icon = 'icons/obj/items/storage/kits.dmi'
icon_state = "upgradedkitbox"
desc = "This kit holds upgraded trauma and burn kits, for critical injuries."
max_w_class = SIZE_MEDIUM
diff --git a/code/modules/defenses/tesla_coil.dm b/code/modules/defenses/tesla_coil.dm
index 0f7a0090300a..bb150acc1e95 100644
--- a/code/modules/defenses/tesla_coil.dm
+++ b/code/modules/defenses/tesla_coil.dm
@@ -11,6 +11,7 @@
var/last_fired = 0
var/tesla_range = TESLA_COIL_RANGE
var/fire_delay = TESLA_COIL_FIREDELAY
+ var/attack_defenses = TRUE
handheld_type = /obj/item/defenses/handheld/tesla_coil
disassemble_time = 10
health = 150
@@ -83,6 +84,9 @@
targets += M
FOR_DOVIEW_END
+ if(!attack_defenses)
+ return
+
FOR_DOVIEW(var/obj/structure/machinery/defenses/D, tesla_range, src, HIDE_INVISIBLE_OBSERVER)
if(D.turned_on)
targets += D
@@ -159,6 +163,17 @@
. = ..()
+// For mapping
+/obj/structure/machinery/defenses/tesla_coil/premade
+ turned_on = TRUE
+ static = TRUE
+
+/obj/structure/machinery/defenses/tesla_coil/premade/attackby(obj/item/O, mob/user)
+ return
+
+/obj/structure/machinery/defenses/tesla_coil/premade/smart
+ attack_defenses = FALSE
+
#define TESLA_COIL_STUN_FIRE_DELAY 3 SECONDS
#define TESLA_COIL_STUN_EFFECT 1
/obj/structure/machinery/defenses/tesla_coil/stun
diff --git a/code/modules/dropships/attach_points/templates.dm b/code/modules/dropships/attach_points/templates.dm
index bcdad8836e25..b90ec728d8fc 100644
--- a/code/modules/dropships/attach_points/templates.dm
+++ b/code/modules/dropships/attach_points/templates.dm
@@ -80,6 +80,47 @@
transverse = 3
long = 0
+/obj/effect/attach_point/weapon/dropship3
+ ship_tag = DROPSHIP_SAIPAN
+
+/obj/effect/attach_point/weapon/dropship3/left_wing
+ name = "port wing weapon attach point"
+ icon_state = "equip_base_l_wing"
+ attach_id = 1
+ dir = WEST
+ firing_arc_min = -3
+ firing_arc_max = 3
+ transverse = -3
+ long = 0
+
+/obj/effect/attach_point/weapon/dropship3/left_fore
+ name = "port fore weapon attach point"
+ attach_id = 2
+ dir = NORTH
+ firing_arc_min = -6
+ firing_arc_max = 0
+ transverse = 0
+ long = 0
+
+/obj/effect/attach_point/weapon/dropship3/right_fore
+ name = "starboard fore weapon attach point"
+ attach_id = 3
+ dir = NORTH
+ firing_arc_min = 0
+ firing_arc_max = 6
+ transverse = 0
+ long = 0
+
+/obj/effect/attach_point/weapon/dropship3/right_wing
+ name = "starboard wing weapon attach point"
+ icon_state = "equip_base_r_wing";
+ attach_id = 4
+ dir = EAST
+ firing_arc_min = -3
+ firing_arc_max = 3
+ transverse = 3
+ long = 0
+
/obj/effect/attach_point/crew_weapon
name = "crew compartment attach point"
base_category = DROPSHIP_CREW_WEAPON
@@ -96,6 +137,12 @@
/obj/effect/attach_point/crew_weapon/dropship2/floor
plane = FLOOR_PLANE
+/obj/effect/attach_point/crew_weapon/dropship3
+ ship_tag = DROPSHIP_SAIPAN
+
+/obj/effect/attach_point/crew_weapon/dropship3/floor
+ plane = FLOOR_PLANE
+
/obj/effect/attach_point/electronics
name = "electronic system attach point"
base_category = DROPSHIP_ELECTRONICS
@@ -108,6 +155,9 @@
/obj/effect/attach_point/electronics/dropship2
ship_tag = DROPSHIP_NORMANDY
+/obj/effect/attach_point/electronics/dropship3
+ ship_tag = DROPSHIP_SAIPAN
+
/obj/effect/attach_point/fuel
name = "engine system attach point"
icon = 'icons/obj/structures/props/almayer_props64.dmi'
@@ -120,6 +170,10 @@
/obj/effect/attach_point/fuel/dropship2
ship_tag = DROPSHIP_NORMANDY
+/obj/effect/attach_point/fuel/dropship3
+ ship_tag = DROPSHIP_SAIPAN
+
+
/obj/effect/attach_point/computer
base_category = DROPSHIP_COMPUTER
@@ -128,3 +182,6 @@
/obj/effect/attach_point/computer/dropship2
ship_tag = DROPSHIP_NORMANDY
+
+/obj/effect/attach_point/computer/dropship3
+ ship_tag = DROPSHIP_SAIPAN
diff --git a/code/modules/gear_presets/colonist.dm b/code/modules/gear_presets/colonist.dm
index 81e5c8ec6ae8..a5b33c428f2e 100644
--- a/code/modules/gear_presets/colonist.dm
+++ b/code/modules/gear_presets/colonist.dm
@@ -75,6 +75,7 @@
name = "Colonist - Doctor"
flags = EQUIPMENT_PRESET_EXTRA
assignment = "Colonial Doctor"
+ paygrades = list(PAY_SHORT_CDOC = JOB_PLAYTIME_TIER_0)
//Marine access is required to use chem dispensers...
access = list(ACCESS_CIVILIAN_PUBLIC, ACCESS_CIVILIAN_RESEARCH, ACCESS_MARINE_MEDBAY, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_MORGUE)
diff --git a/code/modules/gear_presets/contractor.dm b/code/modules/gear_presets/contractor.dm
index c18ccb4418c7..2d8f4dd960fe 100644
--- a/code/modules/gear_presets/contractor.dm
+++ b/code/modules/gear_presets/contractor.dm
@@ -170,16 +170,14 @@
faction = FACTION_CONTRACTOR
/datum/equipment_preset/contractor/duty/heavy/load_gear(mob/living/carbon/human/new_human)
+
+ var/choice = rand(1,3)
new_human.equip_to_slot_or_del(new headset_type, WEAR_L_EAR)
new_human.equip_to_slot_or_del(new /obj/item/clothing/under/tshirt/gray_blu, WEAR_BODY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/webbing, WEAR_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mar40/lmg, WEAR_IN_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mar40/lmg, WEAR_IN_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mar40/lmg, 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/suit/storage/marine/light/vest, 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/gun/rifle/mar40/lmg/tactical, WEAR_J_STORE)
new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/m4a3/m1911/socom, WEAR_WAIST)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine, WEAR_HEAD)
@@ -190,6 +188,9 @@
new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_R_STORE)
//backpack and stuff in it
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack, WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK)
@@ -197,10 +198,25 @@
new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE,WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mar40/lmg, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mar40/lmg, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/box/attachments(new_human), WEAR_IN_BACK)
+ switch(choice)
+ if(1,2) // 66%
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/mar40/lmg/tactical, WEAR_J_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/webbing, WEAR_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mar40/lmg, WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mar40/lmg, WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mar40/lmg, WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mar40/lmg, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mar40/lmg, WEAR_IN_BACK)
+ if(3) // 33%
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/lmg/tactical, WEAR_J_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/webbing, WEAR_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/lmg, WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/lmg, WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/lmg, WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/lmg/ap, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/lmg/ap, WEAR_IN_BACK)
//*****************************************************************************************************/
/datum/equipment_preset/contractor/duty/engi
@@ -552,13 +568,13 @@
new_human.equip_to_slot_or_del(new headset_type, WEAR_L_EAR)
new_human.equip_to_slot_or_del(new /obj/item/clothing/under/colonist/ua_civvies, WEAR_BODY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/webbing, WEAR_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mar40/lmg, WEAR_IN_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mar40/lmg, WEAR_IN_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mar40/lmg, WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/lmg/ap, WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/lmg/ap, WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/lmg/ap, 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/suit/storage/marine/light/vest, 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/gun/rifle/mar40/lmg/tactical, WEAR_J_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/lmg/tactical, WEAR_J_STORE)
new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/m4a3/m1911/socom, WEAR_WAIST)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/pmc, WEAR_FACE)
@@ -571,6 +587,9 @@
new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_R_STORE)
//backpack and stuff in it
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack, WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK)
@@ -578,8 +597,8 @@
new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE,WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mar40/lmg, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mar40/lmg, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/lmg, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/lmg, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/box/attachments(new_human), WEAR_IN_BACK)
diff --git a/code/modules/gear_presets/pmc.dm b/code/modules/gear_presets/pmc.dm
index 3aa02f026f29..60f25442f04e 100644
--- a/code/modules/gear_presets/pmc.dm
+++ b/code/modules/gear_presets/pmc.dm
@@ -415,7 +415,8 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null),
list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Bicaridine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/bicaridine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Kelotane)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/kelotane, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
- list("Pressurized Reagent Canister Pouch (Revival Mix)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_tricord, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Peridaxon)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_peri, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/tricordrazine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (EMPTY)", 0, /obj/item/storage/pouch/pressurized_reagent_canister, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
@@ -593,7 +594,8 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null),
list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Bicaridine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/bicaridine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Kelotane)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/kelotane, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
- list("Pressurized Reagent Canister Pouch (Revival Mix)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_tricord, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Peridaxon)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_peri, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/tricordrazine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (EMPTY)", 0, /obj/item/storage/pouch/pressurized_reagent_canister, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
@@ -1567,7 +1569,8 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null),
list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Bicaridine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/bicaridine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Kelotane)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/kelotane, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
- list("Pressurized Reagent Canister Pouch (Revival Mix)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_tricord, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Peridaxon)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_peri, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/tricordrazine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (EMPTY)", 0, /obj/item/storage/pouch/pressurized_reagent_canister, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
@@ -1972,7 +1975,8 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null),
list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("Pressurized Reagent Canister Pouch (Bicaridine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/bicaridine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("Pressurized Reagent Canister Pouch (Kelotane)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/kelotane, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
- list("Pressurized Reagent Canister Pouch (Revival Mix)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_tricord, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Pressurized Reagent Canister Pouch (Revival Mix - Peridaxon)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/revival_peri, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
list("Pressurized Reagent Canister Pouch (Tricordrazine)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/tricordrazine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("Pressurized Reagent Canister Pouch (Oxycodone)", 0, /obj/item/storage/pouch/pressurized_reagent_canister/oxycodone, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("Pressurized Reagent Canister Pouch (EMPTY)", 0, /obj/item/storage/pouch/pressurized_reagent_canister, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
diff --git a/code/modules/gear_presets/survivors/misc.dm b/code/modules/gear_presets/survivors/misc.dm
index a6ed27cbb91a..1a24ca5d58b9 100644
--- a/code/modules/gear_presets/survivors/misc.dm
+++ b/code/modules/gear_presets/survivors/misc.dm
@@ -60,7 +60,7 @@ Everything below isn't used or out of place.
/datum/equipment_preset/survivor/civilian/load_gear(mob/living/carbon/human/new_human)
if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD])
add_ice_colony_survivor_equipment(new_human)
- var/random_gear = rand(0, 3)
+ var/random_gear = rand(0, 4)
switch(random_gear)
if(0) // Normal Colonist
new_human.equip_to_slot_or_del(new /obj/item/clothing/under/colonist(new_human), WEAR_BODY)
@@ -88,6 +88,11 @@ Everything below isn't used or out of place.
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(new_human), WEAR_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup/brown(new_human), WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/tool/hatchet(new_human.back), WEAR_IN_BACK)
+ if(4) // Ripley outfit from Aliens
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/tshirt/gray_blu(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/black(new_human), WEAR_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/webbing(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/stompers(new_human), WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/norm(new_human), WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general(new_human), WEAR_R_STORE)
add_survivor_weapon_civilian(new_human)
diff --git a/code/modules/gear_presets/survivors/survivors.dm b/code/modules/gear_presets/survivors/survivors.dm
index d90d31ef3880..0e28e64e9fc4 100644
--- a/code/modules/gear_presets/survivors/survivors.dm
+++ b/code/modules/gear_presets/survivors/survivors.dm
@@ -132,6 +132,7 @@ Standart Survivors : /datum/equipment_preset/survivor/scientist,
flags = EQUIPMENT_PRESET_START_OF_ROUND
idtype = /obj/item/card/id/silver/clearance_badge/scientist
access = list(ACCESS_CIVILIAN_PUBLIC, ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_MEDBAY)
+ paygrades = list(PAY_SHORT_CDOC = JOB_PLAYTIME_TIER_0)
survivor_variant = SCIENTIST_SURVIVOR
@@ -160,6 +161,7 @@ Standart Survivors : /datum/equipment_preset/survivor/scientist,
flags = EQUIPMENT_PRESET_START_OF_ROUND
idtype = /obj/item/card/id/silver/clearance_badge
access = list(ACCESS_CIVILIAN_PUBLIC, ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_MEDBAY, ACCESS_CIVILIAN_COMMAND)
+ paygrades = list(PAY_SHORT_CDOC = JOB_PLAYTIME_TIER_0)
survivor_variant = MEDICAL_SURVIVOR
@@ -324,6 +326,7 @@ Standart Survivors : /datum/equipment_preset/survivor/scientist,
flags = EQUIPMENT_PRESET_START_OF_ROUND
idtype = /obj/item/card/id/data
access = list(ACCESS_CIVILIAN_PUBLIC,ACCESS_CIVILIAN_BRIG,ACCESS_CIVILIAN_COMMAND)
+ paygrades = list(PAY_SHORT_CPO = JOB_PLAYTIME_TIER_0)
survivor_variant = SECURITY_SURVIVOR
diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm
index d7c531332c9a..db82e44ea890 100644
--- a/code/modules/gear_presets/synths.dm
+++ b/code/modules/gear_presets/synths.dm
@@ -89,7 +89,7 @@
new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/cm(new_human), WEAR_HEAD)
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/mcom/synth(new_human), WEAR_L_EAR)
new_human.equip_to_slot_or_del(new /obj/item/clothing/under/rank/synthetic(new_human), WEAR_BODY)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/RO(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/jacket/marine/RO(new_human), WEAR_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
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 /obj/item/clothing/gloves/yellow(new_human), WEAR_HANDS)
diff --git a/code/modules/gear_presets/upp.dm b/code/modules/gear_presets/upp.dm
index 8ac573b5beae..616515c59ac2 100644
--- a/code/modules/gear_presets/upp.dm
+++ b/code/modules/gear_presets/upp.dm
@@ -56,6 +56,10 @@
//*****************************************************************************************************/
+//=====================//
+// Frontline Roles //
+//=================//
+
/datum/equipment_preset/upp/soldier
name = "UPP Soldier"
flags = EQUIPMENT_PRESET_EXTRA
@@ -956,6 +960,10 @@
//*****************************************************************************************************/
+//=====================//
+// Support Roles //
+//=================//
+
/datum/equipment_preset/upp/military_police
name = "UPP Military Police"
flags = EQUIPMENT_PRESET_EXTRA
@@ -1110,6 +1118,234 @@
//*****************************************************************************************************/
+
+/datum/equipment_preset/upp/doctor
+ name = "UPP Doctor"
+ flags = EQUIPMENT_PRESET_EXTRA
+
+ skills = /datum/skills/upp/combat_medic
+ assignment = JOB_UPP_LT_DOKTOR
+ rank = JOB_UPP_LT_DOKTOR
+ role_comm_title = "Lt. Med."
+ paygrades = list(PAY_SHORT_UO1 = JOB_PLAYTIME_TIER_0)
+
+/datum/equipment_preset/upp/doctor/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)
+ 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/storage/firstaid/adv, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/roller/surgical, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/np92, WEAR_IN_BACK) //targeting unarmed medical personal is not a war crime in aliens(primarily because, off memory, warcrimes aren't really a thing, although this definately is bad manners), and the playerbase is HRP in this concern!(if you don't get the joke, the players regularly execute unarmed doctors in hvh events. :D)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/np92, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/np92, WEAR_IN_BACK)
+ //face
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP, WEAR_L_EAR)
+ 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/uppcap/ushanka, WEAR_HEAD)
+ //body
+ var/obj/item/clothing/under/marine/veteran/UPP/medic/UPP = new()
+ var/obj/item/clothing/accessory/storage/surg_vest/equipped/W = new()
+ UPP.attach_accessory(new_human, W)
+ new_human.equip_to_slot_or_del(UPP, WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp, WEAR_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp/naval, WEAR_ACCESSORY)
+ //waist
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/upp/full, WEAR_WAIST)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/oxycodone, WEAR_IN_BELT)
+ //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
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large, WEAR_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_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/synthgraft, WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer, WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/oxycodone, WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/tricordrazine, WEAR_IN_L_STORE)
+
+ if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD])
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/rebreather/scarf/tacticalmask/green, WEAR_FACE)
+
+/datum/equipment_preset/upp/doctor/get_antag_clothing_equipment()
+ return list(
+ list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null),
+ list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY),
+ list("Medic Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/medic, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY),
+ list("UL6 Personal Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/support, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY),
+ list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY),
+ list("Headset", 0, /obj/item/device/radio/headset/distress/UPP, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY),
+ list("Ration", 0, /obj/item/reagent_container/food/snacks/upp, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY),
+ list("Combat Pack", 0, /obj/item/storage/backpack/lightpack, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY),
+ list("HealthMate HUD", 0, /obj/item/clothing/glasses/hud/health, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_MANDATORY),
+
+ list("HELMET (CHOOSE 1)", 0, null, null, null),
+ list("Ushanka", 0, /obj/item/clothing/head/uppcap/ushanka, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+
+ list("BELT", 0, null, null, null),
+ list("Type 41 Lifesaver Bag", 0, /obj/item/storage/belt/medical/lifesaver/upp/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_MANDATORY),
+
+ list("POUCHES (CHOOSE 2)", 0, null, null, null),
+ list("Auto-Injector Pouch", 0, /obj/item/storage/pouch/autoinjector, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("First-Aid Pouch (Splints, Gauze, Ointment)", 0, /obj/item/storage/pouch/firstaid/full/alternate, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("First-Aid Pouch (Pill Packets)", 0, /obj/item/storage/pouch/firstaid/full/pills, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("First Responder Pouch", 0, /obj/item/storage/pouch/first_responder, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Medical Pouch (Splints)", 0, /obj/item/storage/pouch/medical/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Medical Pouch (Pills)", 0, /obj/item/storage/pouch/medical/full/pills, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Medium General Pouch", 0, /obj/item/storage/pouch/general/medium, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, 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)
+ )
+
+/datum/equipment_preset/upp/doctor/get_antag_gear_equipment()
+ return list(
+ list("MEDIC SET (MANDATORY)", 0, null, null, null),
+ list("Essential Medic Set", 0, /obj/effect/essentials_set/medic/upp, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY),
+
+ list("FIELD SUPPLIES", 0, null, null, null),
+ list("Burn Kit", 2, /obj/item/stack/medical/advanced/ointment, null, VENDOR_ITEM_RECOMMENDED),
+ list("Trauma Kit", 2, /obj/item/stack/medical/advanced/bruise_pack, null, VENDOR_ITEM_RECOMMENDED),
+ list("Medical Splints", 1, /obj/item/stack/medical/splint, null, VENDOR_ITEM_RECOMMENDED),
+
+ list("FIRSTAID KITS", 0, null, null, null),
+ list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED),
+ list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR),
+ list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR),
+ list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR),
+ list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR),
+ list("Radiation Firstaid Kit", 6, /obj/item/storage/firstaid/rad, null, VENDOR_ITEM_REGULAR),
+
+ list("AUTOINJECTORS", 0, null, null, null),
+ list("Autoinjector (Bicaridine)", 1, /obj/item/reagent_container/hypospray/autoinjector/bicaridine, null, VENDOR_ITEM_REGULAR),
+ list("Autoinjector (Dexalin+)", 1, /obj/item/reagent_container/hypospray/autoinjector/dexalinp, null, VENDOR_ITEM_REGULAR),
+ list("Autoinjector (Epinephrine)", 2, /obj/item/reagent_container/hypospray/autoinjector/adrenaline, null, VENDOR_ITEM_REGULAR),
+ list("Autoinjector (Inaprovaline)", 1, /obj/item/reagent_container/hypospray/autoinjector/inaprovaline, null, VENDOR_ITEM_REGULAR),
+ list("Autoinjector (Kelotane)", 1, /obj/item/reagent_container/hypospray/autoinjector/kelotane, null, VENDOR_ITEM_REGULAR),
+ list("Autoinjector (Oxycodone)", 2, /obj/item/reagent_container/hypospray/autoinjector/oxycodone, null, VENDOR_ITEM_REGULAR),
+ list("Autoinjector (Tramadol)", 1, /obj/item/reagent_container/hypospray/autoinjector/tramadol, null, VENDOR_ITEM_REGULAR),
+ list("Autoinjector (Tricord)", 1, /obj/item/reagent_container/hypospray/autoinjector/tricord, null, VENDOR_ITEM_REGULAR),
+
+ list("PILL BOTTLES", 0, null, null, null),
+ list("Pill Bottle (Bicaridine)", 5, /obj/item/storage/pill_bottle/bicaridine, null, VENDOR_ITEM_RECOMMENDED),
+ list("Pill Bottle (Dexalin)", 5, /obj/item/storage/pill_bottle/dexalin, null, VENDOR_ITEM_REGULAR),
+ list("Pill Bottle (Dylovene)", 5, /obj/item/storage/pill_bottle/antitox, null, VENDOR_ITEM_REGULAR),
+ list("Pill Bottle (Inaprovaline)", 5, /obj/item/storage/pill_bottle/inaprovaline, null, VENDOR_ITEM_REGULAR),
+ list("Pill Bottle (Kelotane)", 5, /obj/item/storage/pill_bottle/kelotane, null, VENDOR_ITEM_RECOMMENDED),
+ list("Pill Bottle (Peridaxon)", 5, /obj/item/storage/pill_bottle/peridaxon, null, VENDOR_ITEM_REGULAR),
+ list("Pill Bottle (Tramadol)", 5, /obj/item/storage/pill_bottle/tramadol, null, VENDOR_ITEM_RECOMMENDED),
+
+ list("MEDICAL UTILITIES", 0, null, null, null),
+ list("Health Analyzer", 4, /obj/item/device/healthanalyzer, null, VENDOR_ITEM_REGULAR),
+ list("Medical HUD Glasses", 4, /obj/item/clothing/glasses/hud/health, null, VENDOR_ITEM_REGULAR),
+ list("Roller Bed", 4, /obj/item/roller, null, VENDOR_ITEM_REGULAR),
+ list("Stasis Bag", 6, /obj/item/bodybag/cryobag, null, VENDOR_ITEM_REGULAR),
+
+ list("UTILITIES", 0, null, null, null),
+ list("Brown Webbing Vest", 10, /obj/item/clothing/accessory/storage/black_vest/brown_vest, null, VENDOR_ITEM_RECOMMENDED),
+ list("Black Webbing Vest", 10, /obj/item/clothing/accessory/storage/black_vest, null, VENDOR_ITEM_RECOMMENDED),
+ list("Fire Extinguisher (Portable)", 5, /obj/item/tool/extinguisher/mini, null, VENDOR_ITEM_REGULAR),
+ list("Large General Pouch", 10, /obj/item/storage/pouch/general/large, null, VENDOR_ITEM_REGULAR),
+ list("Shoulder Holster", 10, /obj/item/clothing/accessory/storage/holster, null, VENDOR_ITEM_REGULAR),
+ list("Webbing", 10, /obj/item/clothing/accessory/storage/webbing, null, VENDOR_ITEM_REGULAR),
+ list("Drop Pouch", 10, /obj/item/clothing/accessory/storage/droppouch, null, VENDOR_ITEM_REGULAR),
+ )
+
+//*****************************************************************************************************/
+
+/datum/equipment_preset/upp/supply
+ name = "UPP Logistics Technician"
+ flags = EQUIPMENT_PRESET_EXTRA
+
+ skills = /datum/skills/upp/logistics_technician
+ assignment = JOB_UPP_SUPPLY
+ rank = JOB_UPP_SUPPLY
+ role_comm_title = "Log."
+ paygrades = list(PAY_SHORT_UE3 = JOB_PLAYTIME_TIER_0)
+
+/datum/equipment_preset/upp/supply/load_gear(mob/living/carbon/human/new_human)
+ //back
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/engineerpack/upp, WEAR_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked, WEAR_IN_BACK)
+ //face
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/cct, WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/welding(new_human), WEAR_EYES)
+ //head
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap(new_human), WEAR_HEAD)
+ //body
+ var/obj/item/clothing/under/marine/veteran/UPP/UPP = new()
+ new_human.equip_to_slot_or_del(UPP, WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp, WEAR_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp/naval, WEAR_ACCESSORY)
+ //waist
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/utility/full(new_human), WEAR_WAIST)
+ //limb
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/insulated(new_human), WEAR_HANDS)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET)
+ //pockets
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/ert(new_human), WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/construction(new_human), WEAR_R_STORE)
+
+/datum/equipment_preset/upp/supply/get_antag_clothing_equipment()
+ return list(
+ list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null),
+ list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY),
+ list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY),
+ list("UM5 Personal Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY),
+ list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY),
+ list("Headset", 0, /obj/item/device/radio/headset/distress/UPP/cct, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY),
+ list("Welding Goggles", 0, /obj/item/clothing/glasses/welding, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_MANDATORY),
+ list("Ration", 0, /obj/item/reagent_container/food/snacks/upp, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY),
+ list("Welderpack", 0, /obj/item/storage/backpack/marine/engineerpack/upp, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY),
+
+ list("HELMET (CHOOSE 1)", 0, null, null, null),
+ list("Armored Cap", 0, /obj/item/clothing/head/uppcap, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+ list("UM4 Helmet", 0, /obj/item/clothing/head/helmet/marine/veteran/UPP, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+
+ list("BELT (Choose 1)", 0, null, null, null),
+ list("Type 41 Ammo Load Rig", 0, /obj/item/storage/belt/marine/upp, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR),
+ list("Type 41 Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR),
+ list("Toolbelt Rig (Full)", 0, /obj/item/storage/belt/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED),
+
+ list("POUCHES (Choose 2)", 0, null, null, null),
+ list("Construction Pouch", 0, /obj/item/storage/pouch/construction, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("First-Aid Pouch (Splints, Gauze, Ointment)", 0, /obj/item/storage/pouch/firstaid/full/alternate, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("First-Aid Pouch (Pill Packets)", 0, /obj/item/storage/pouch/firstaid/full/pills, 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("Explosive Pouch", 0, /obj/item/storage/pouch/explosive, 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("Large Pistol Magazine Pouch", 0, /obj/item/storage/pouch/magazine/pistol/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Magazine Pouch", 0, /obj/item/storage/pouch/magazine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Medium General Pouch", 0, /obj/item/storage/pouch/general/medium, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, 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("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)
+ )
+
+
+//*****************************************************************************************************/
+
+
+//====================//
+// Field Officers //
+//================//
+
/datum/equipment_preset/upp/officer
name = "UPP Lieutenant"
flags = EQUIPMENT_PRESET_EXTRA
@@ -2075,6 +2311,10 @@
//*****************************************************************************************************/
+//===================//
+// Flag Officers //
+//===============//
+
/datum/equipment_preset/upp/officer/may_gen
name = "UPP Mayjor General"
assignment = JOB_UPP_KOL_OFFICER
@@ -2594,6 +2834,11 @@
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/explosive/C4, WEAR_R_STORE)
//*****************************************************************************************************/
+
+//===================//
+// UPP Synthetics //
+//================//
+
/datum/equipment_preset/upp/synth
name = "UPP Synthetic"
flags = EQUIPMENT_PRESET_EXTRA
@@ -2865,131 +3110,25 @@
//*****************************************************************************************************/
-/datum/equipment_preset/upp/conscript
- //meme role
- name = "UPP Conscript"
- flags = EQUIPMENT_PRESET_EXTRA
+//=================//
+// UPP SpecFor //
+//=============//
- skills = /datum/skills/upp
- assignment = JOB_UPP_CONSCRIPT
- rank = JOB_UPP_CONSCRIPT
- role_comm_title = "Cons"
- paygrades = list(PAY_SHORT_UE1 = JOB_PLAYTIME_TIER_0)
+/datum/equipment_preset/upp/commando
+ name = "UPP Commando (!DEATHSQUAD!)"
+ flags = EQUIPMENT_PRESET_EXTRA
-/datum/equipment_preset/upp/conscript/load_gear(mob/living/carbon/human/new_human)
- //back
- var/maybebackpack = prob(20) ? pick(/obj/item/storage/backpack/lightpack/upp, /obj/item/storage/backpack/lightpack) : null
- if(maybebackpack)
- new_human.equip_to_slot_or_del(new maybebackpack, WEAR_BACK) //what in back?
- //face
- new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP, WEAR_L_EAR)
+ skills = /datum/skills/commando
+ assignment = JOB_UPP_COMMANDO
+ rank = JOB_UPP_COMMANDO
+ role_comm_title = "JKdo"
+ paygrades = list(PAY_SHORT_UC1 = JOB_PLAYTIME_TIER_0)
+ idtype = /obj/item/card/id/data
+ languages = list(LANGUAGE_RUSSIAN, LANGUAGE_ENGLISH, LANGUAGE_TSL, LANGUAGE_SPANISH, LANGUAGE_CHINESE)
- //head
- var/maybehat = prob(66) ? pick(/obj/item/clothing/head/uppcap, /obj/item/clothing/head/uppcap/beret, /obj/item/clothing/head/ushanka, /obj/item/clothing/head/uppcap/ushanka) : null
- if(maybehat)
- new_human.equip_to_slot_or_del(new maybehat, WEAR_HEAD)
-
- //body
- var/obj/item/clothing/under/marine/veteran/UPP/UPP = new()
- new_human.equip_to_slot_or_del(UPP, WEAR_BODY)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp, WEAR_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp/naval, WEAR_ACCESSORY)
-
- var/maybejacket = prob(50) ? pick(/obj/item/clothing/suit/storage/marine/faction/UPP/jacket, /obj/item/clothing/suit/storage/snow_suit/soviet) : null
- if(maybejacket)
- new_human.equip_to_slot_or_del(new maybejacket, WEAR_JACKET)
- new_human.equip_to_slot_or_del(new /obj/item/stack/medical/bruise_pack, WEAR_IN_JACKET)
- new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/bottle/vodka, WEAR_IN_JACKET)
- //limit of snowcoat
- new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/upp, WEAR_IN_JACKET)
-
- //limbs
- new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp/knife, WEAR_FEET)
- var/maybegloves = prob(80) ? pick(/obj/item/clothing/gloves/black, /obj/item/clothing/gloves/marine/veteran/upp, /obj/item/clothing/gloves/combat) : null
- if(maybegloves)
- new_human.equip_to_slot_or_del(new maybegloves, WEAR_HANDS)
-
- //gun
- new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/type71/carbine, WEAR_R_HAND)
-
- //webbing or belt?
- if(prob(30))
- var/obj/item/clothing/accessory/storage/webbing/W = new()
- UPP.attach_accessory(new_human, W)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71, WEAR_IN_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71, WEAR_IN_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71, WEAR_IN_ACCESSORY)
- else if(prob(30))
- new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine/upp/scarce, WEAR_WAIST)
- //if you fail the rolls you must scavenge the ammo from your fallen brethren
-
- if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD])
- new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/rebreather/scarf/tacticalmask/green, WEAR_FACE)
-
- if(prob(10))
- //sometimes Ivan smiles upon the corps
- new_human.set_species("Human Hero")
-
-/datum/equipment_preset/upp/conscript/get_antag_clothing_equipment()
- return list(
- list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null),
- list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY),
- list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY),
- list("Headset", 0, /obj/item/device/radio/headset/distress/UPP, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY),
- list("Ration", 0, /obj/item/reagent_container/food/snacks/upp, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY),
-
- list("HELMET", 0, null, null, null),
- list("Armored Cap", 0, /obj/item/clothing/head/uppcap, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY),
- list("Armored Ushanka", 0, /obj/item/clothing/head/uppcap/ushanka, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
-
- list("BELT (CHOOSE 1)", 0, null, null, null),
- list("Type 41 Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR),
-
- list("POUCHES (CHOOSE 2)", 0, null, null, null),
- list("Bayonet Sheath", 0, /obj/item/storage/pouch/bayonet/upp, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
- list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
- list("Pistol Magazine Pouch", 0, /obj/item/storage/pouch/magazine/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
-
- list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
- list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
-
- list("MASK (CHOOSE 1)", 0, null, null, null),
- list("Tactical Bandana", 0, /obj/item/clothing/mask/rebreather/scarf/tacticalmask/green, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR)
- )
-
-/datum/equipment_preset/upp/conscript/get_antag_gear_equipment()
- return list(
- list("ENGINEERING SUPPLIES", 0, null, null, null),
- list("Entrenching Tool", 2, /obj/item/tool/shovel/etool, null, VENDOR_ITEM_RECOMMENDED),
- list("Sandbags x25", 5, /obj/item/stack/sandbags_empty/half, null, VENDOR_ITEM_RECOMMENDED),
-
- list("EXPLOSIVES", 0, null, null, null),
- list("Smoke Grenade", 5, /obj/item/explosive/grenade/smokebomb, null, VENDOR_ITEM_REGULAR),
-
- list("UTILITIES", 0, null, null, null),
- list("Brown Webbing Vest", 10, /obj/item/clothing/accessory/storage/black_vest/brown_vest, null, VENDOR_ITEM_RECOMMENDED),
- list("Black Webbing Vest", 10, /obj/item/clothing/accessory/storage/black_vest, null, VENDOR_ITEM_RECOMMENDED),
- list("Webbing", 10, /obj/item/clothing/accessory/storage/webbing, null, VENDOR_ITEM_REGULAR),
- list("Drop Pouch", 10, /obj/item/clothing/accessory/storage/droppouch, null, VENDOR_ITEM_REGULAR)
- )
-
-//*****************************************************************************************************/
-
-/datum/equipment_preset/upp/commando
- name = "UPP Commando (!DEATHSQUAD!)"
- flags = EQUIPMENT_PRESET_EXTRA
-
- skills = /datum/skills/commando
- assignment = JOB_UPP_COMMANDO
- rank = JOB_UPP_COMMANDO
- role_comm_title = "JKdo"
- paygrades = list(PAY_SHORT_UC1 = JOB_PLAYTIME_TIER_0)
- idtype = /obj/item/card/id/data
- languages = list(LANGUAGE_RUSSIAN, LANGUAGE_ENGLISH, LANGUAGE_TSL, LANGUAGE_SPANISH, LANGUAGE_CHINESE)
-
-/datum/equipment_preset/upp/commando/New()
- . = ..()
- access = get_access(ACCESS_LIST_GLOBAL)
+/datum/equipment_preset/upp/commando/New()
+ . = ..()
+ access = get_access(ACCESS_LIST_GLOBAL)
/datum/equipment_preset/upp/commando/load_gear(mob/living/carbon/human/new_human)
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/kdo, WEAR_L_EAR)
@@ -3525,6 +3664,10 @@
//*****************************************************************************************************/
+//============//
+// Other //
+//========//
+
/datum/equipment_preset/upp/tank
name = "UPP Vehicle Crewman (TANK)"
flags = EQUIPMENT_PRESET_EXTRA
@@ -3643,137 +3786,195 @@
//*****************************************************************************************************/
-/datum/equipment_preset/upp/doctor
- name = "UPP Doctor"
+/datum/equipment_preset/upp/conscript
+ //meme role
+ name = "UPP Conscript"
flags = EQUIPMENT_PRESET_EXTRA
- skills = /datum/skills/upp/combat_medic
- assignment = JOB_UPP_LT_DOKTOR
- rank = JOB_UPP_LT_DOKTOR
- role_comm_title = "Lt. Med."
- paygrades = list(PAY_SHORT_UO1 = JOB_PLAYTIME_TIER_0)
+ skills = /datum/skills/upp
+ assignment = JOB_UPP_CONSCRIPT
+ rank = JOB_UPP_CONSCRIPT
+ role_comm_title = "Cons"
+ paygrades = list(PAY_SHORT_UE1 = JOB_PLAYTIME_TIER_0)
-/datum/equipment_preset/upp/doctor/load_gear(mob/living/carbon/human/new_human)
+/datum/equipment_preset/upp/conscript/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)
- 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/storage/firstaid/adv, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/roller/surgical, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/np92, WEAR_IN_BACK) //targeting unarmed medical personal is not a war crime in aliens(primarily because, off memory, warcrimes aren't really a thing, although this definately is bad manners), and the playerbase is HRP in this concern!(if you don't get the joke, the players regularly execute unarmed doctors in hvh events. :D)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/np92, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/np92, WEAR_IN_BACK)
+ var/maybebackpack = prob(20) ? pick(/obj/item/storage/backpack/lightpack/upp, /obj/item/storage/backpack/lightpack) : null
+ if(maybebackpack)
+ new_human.equip_to_slot_or_del(new maybebackpack, WEAR_BACK) //what in back?
//face
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP, WEAR_L_EAR)
- 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/uppcap/ushanka, WEAR_HEAD)
+ var/maybehat = prob(66) ? pick(/obj/item/clothing/head/uppcap, /obj/item/clothing/head/uppcap/beret, /obj/item/clothing/head/ushanka, /obj/item/clothing/head/uppcap/ushanka) : null
+ if(maybehat)
+ new_human.equip_to_slot_or_del(new maybehat, WEAR_HEAD)
+
//body
- var/obj/item/clothing/under/marine/veteran/UPP/medic/UPP = new()
- var/obj/item/clothing/accessory/storage/surg_vest/equipped/W = new()
- UPP.attach_accessory(new_human, W)
+ var/obj/item/clothing/under/marine/veteran/UPP/UPP = new()
new_human.equip_to_slot_or_del(UPP, WEAR_BODY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp, WEAR_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp/naval, WEAR_ACCESSORY)
- //waist
- new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/upp/full, WEAR_WAIST)
- new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/oxycodone, WEAR_IN_BELT)
+
+ var/maybejacket = prob(50) ? pick(/obj/item/clothing/suit/storage/marine/faction/UPP/jacket, /obj/item/clothing/suit/storage/snow_suit/soviet) : null
+ if(maybejacket)
+ new_human.equip_to_slot_or_del(new maybejacket, WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/stack/medical/bruise_pack, WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/bottle/vodka, WEAR_IN_JACKET)
+ //limit of snowcoat
+ new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/upp, WEAR_IN_JACKET)
+
//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
- new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large, WEAR_R_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_R_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_R_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_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/synthgraft, WEAR_IN_L_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer, WEAR_IN_L_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/oxycodone, WEAR_IN_L_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/tricordrazine, WEAR_IN_L_STORE)
+ var/maybegloves = prob(80) ? pick(/obj/item/clothing/gloves/black, /obj/item/clothing/gloves/marine/veteran/upp, /obj/item/clothing/gloves/combat) : null
+ if(maybegloves)
+ new_human.equip_to_slot_or_del(new maybegloves, WEAR_HANDS)
+
+ //gun
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/type71/carbine, WEAR_R_HAND)
+
+ //webbing or belt?
+ if(prob(30))
+ var/obj/item/clothing/accessory/storage/webbing/W = new()
+ UPP.attach_accessory(new_human, W)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71, WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71, WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71, WEAR_IN_ACCESSORY)
+ else if(prob(30))
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine/upp/scarce, WEAR_WAIST)
+ //if you fail the rolls you must scavenge the ammo from your fallen brethren
if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD])
new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/rebreather/scarf/tacticalmask/green, WEAR_FACE)
-/datum/equipment_preset/upp/doctor/get_antag_clothing_equipment()
+ if(prob(10))
+ //sometimes Ivan smiles upon the corps
+ new_human.set_species("Human Hero")
+
+/datum/equipment_preset/upp/conscript/get_antag_clothing_equipment()
return list(
list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null),
list("Boots", 0, /obj/item/clothing/shoes/marine/upp/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY),
- list("Medic Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP/medic, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY),
- list("UL6 Personal Armor", 0, /obj/item/clothing/suit/storage/marine/faction/UPP/support, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY),
- list("Gloves", 0, /obj/item/clothing/gloves/marine/veteran/upp, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY),
+ list("Fatigues", 0, /obj/item/clothing/under/marine/veteran/UPP, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY),
list("Headset", 0, /obj/item/device/radio/headset/distress/UPP, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY),
list("Ration", 0, /obj/item/reagent_container/food/snacks/upp, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY),
- list("Combat Pack", 0, /obj/item/storage/backpack/lightpack, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY),
- list("HealthMate HUD", 0, /obj/item/clothing/glasses/hud/health, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_MANDATORY),
- list("HELMET (CHOOSE 1)", 0, null, null, null),
- list("Ushanka", 0, /obj/item/clothing/head/uppcap/ushanka, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+ list("HELMET", 0, null, null, null),
+ list("Armored Cap", 0, /obj/item/clothing/head/uppcap, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY),
+ list("Armored Ushanka", 0, /obj/item/clothing/head/uppcap/ushanka, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
- list("BELT", 0, null, null, null),
- list("Type 41 Lifesaver Bag", 0, /obj/item/storage/belt/medical/lifesaver/upp/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_MANDATORY),
+ list("BELT (CHOOSE 1)", 0, null, null, null),
+ list("Type 41 Pistol Holster Rig", 0, /obj/item/storage/belt/gun/m4a3, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR),
list("POUCHES (CHOOSE 2)", 0, null, null, null),
- list("Auto-Injector Pouch", 0, /obj/item/storage/pouch/autoinjector, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
- list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
- list("First-Aid Pouch (Splints, Gauze, Ointment)", 0, /obj/item/storage/pouch/firstaid/full/alternate, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
- list("First-Aid Pouch (Pill Packets)", 0, /obj/item/storage/pouch/firstaid/full/pills, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
- list("First Responder Pouch", 0, /obj/item/storage/pouch/first_responder, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Bayonet Sheath", 0, /obj/item/storage/pouch/bayonet/upp, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
- list("Medical Pouch (Splints)", 0, /obj/item/storage/pouch/medical/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
- list("Medical Pouch (Pills)", 0, /obj/item/storage/pouch/medical/full/pills, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
- list("Medium General Pouch", 0, /obj/item/storage/pouch/general/medium, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
- list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Pistol Magazine Pouch", 0, /obj/item/storage/pouch/magazine/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+
+ list("ATTACHMENT (CHOOSE 1)", 0, null, null, null),
+ list("Laser Sight", 0, /obj/item/attachable/lasersight, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_REGULAR),
+
+ list("MASK (CHOOSE 1)", 0, null, null, null),
+ list("Tactical Bandana", 0, /obj/item/clothing/mask/rebreather/scarf/tacticalmask/green, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR)
+ )
+
+/datum/equipment_preset/upp/conscript/get_antag_gear_equipment()
+ return list(
+ list("ENGINEERING SUPPLIES", 0, null, null, null),
+ list("Entrenching Tool", 2, /obj/item/tool/shovel/etool, null, VENDOR_ITEM_RECOMMENDED),
+ list("Sandbags x25", 5, /obj/item/stack/sandbags_empty/half, null, VENDOR_ITEM_RECOMMENDED),
+
+ list("EXPLOSIVES", 0, null, null, null),
+ list("Smoke Grenade", 5, /obj/item/explosive/grenade/smokebomb, null, VENDOR_ITEM_REGULAR),
+
+ list("UTILITIES", 0, null, null, null),
+ list("Brown Webbing Vest", 10, /obj/item/clothing/accessory/storage/black_vest/brown_vest, null, VENDOR_ITEM_RECOMMENDED),
+ list("Black Webbing Vest", 10, /obj/item/clothing/accessory/storage/black_vest, null, VENDOR_ITEM_RECOMMENDED),
+ list("Webbing", 10, /obj/item/clothing/accessory/storage/webbing, null, VENDOR_ITEM_REGULAR),
+ list("Drop Pouch", 10, /obj/item/clothing/accessory/storage/droppouch, null, VENDOR_ITEM_REGULAR)
+ )
+
+
+/datum/equipment_preset/upp/commissar
+ name = "UPP Political Commissar"
+ flags = EQUIPMENT_PRESET_EXTRA
+
+ assignment = JOB_UPP_COMMISSAR
+ rank = JOB_UPP_COMMISSAR
+ paygrades = list(PAY_SHORT_UO4P = JOB_PLAYTIME_TIER_0)
+ role_comm_title = "Commissar"
+ minimum_age = 30
+ skills = /datum/skills/upp/commissar
+
+/datum/equipment_preset/upp/commissar/load_gear(mob/living/carbon/human/new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp, WEAR_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp/naval, WEAR_ACCESSORY)
+ 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 /obj/item/device/radio/headset/distress/UPP/command(new_human), WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/revolver(new_human), WEAR_WAIST)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/gimmick/jason(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel(new_human), WEAR_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap/beret(new_human), WEAR_HEAD)
+
+/datum/equipment_preset/upp/commissar/load_status()
+ return
+
+/datum/equipment_preset/upp/commissar/get_antag_clothing_equipment()
+ return list(
+ list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null),
+ list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY),
+
+ list("HELMET (CHOOSE 1)", 0, null, null, null),
+ list("UL2 Cap", 0, /obj/item/clothing/head/uppcap, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+ list("UL3 Beret", 0, /obj/item/clothing/head/uppcap/beret, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+ list("UL8 Ushanka", 0, /obj/item/clothing/head/uppcap/beret, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+ list("UM4 Helmet", 0, /obj/item/clothing/head/helmet/marine/veteran/UPP, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+
+ list("POUCHES (CHOOSE 2)", 0, null, null, null),
+ list("First-Aid Pouch (Full)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED),
+ list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Large General Pouch", 0, /obj/item/storage/pouch/general/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Large Pistol Magazine Pouch", 0, /obj/item/storage/pouch/magazine/pistol/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Magazine Pouch", 0, /obj/item/storage/pouch/magazine, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Sidearm Pouch", 0, /obj/item/storage/pouch/pistol, 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("Heat Absorbent Coif", 0, /obj/item/clothing/mask/rebreather/scarf, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR),
)
-/datum/equipment_preset/upp/doctor/get_antag_gear_equipment()
+/datum/equipment_preset/upp/commissar/get_antag_gear_equipment()
return list(
- list("MEDIC SET (MANDATORY)", 0, null, null, null),
- list("Essential Medic Set", 0, /obj/effect/essentials_set/medic/upp, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY),
+ list("SQUAD LEADER SET (MANDATORY)", 0, null, null, null),
+ list("Essential SL Set", 0, /obj/effect/essentials_set/leader/upp, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY),
- list("FIELD SUPPLIES", 0, null, null, null),
- list("Burn Kit", 2, /obj/item/stack/medical/advanced/ointment, null, VENDOR_ITEM_RECOMMENDED),
- list("Trauma Kit", 2, /obj/item/stack/medical/advanced/bruise_pack, null, VENDOR_ITEM_RECOMMENDED),
- list("Medical Splints", 1, /obj/item/stack/medical/splint, null, VENDOR_ITEM_RECOMMENDED),
+ list("GENERAL SUPPLIES", 0, null, null, null),
+ list("Whistle", 5, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR),
- list("FIRSTAID KITS", 0, null, null, null),
- list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED),
- list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR),
- list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR),
- list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR),
- list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR),
- list("Radiation Firstaid Kit", 6, /obj/item/storage/firstaid/rad, null, VENDOR_ITEM_REGULAR),
+ list("ENGINEERING SUPPLIES", 0, null, null, null),
+ list("Entrenching Tool", 2, /obj/item/tool/shovel/etool, null, VENDOR_ITEM_REGULAR),
+ list("Insulated Gloves", 3, /obj/item/clothing/gloves/yellow, null, VENDOR_ITEM_REGULAR),
+ list("Tools Pouch (Full)", 5, /obj/item/storage/pouch/tools/full, null, VENDOR_ITEM_REGULAR),
+ list("Welding Goggles", 5, /obj/item/clothing/glasses/welding, null, VENDOR_ITEM_REGULAR),
- list("AUTOINJECTORS", 0, null, null, null),
- list("Autoinjector (Bicaridine)", 1, /obj/item/reagent_container/hypospray/autoinjector/bicaridine, null, VENDOR_ITEM_REGULAR),
- list("Autoinjector (Dexalin+)", 1, /obj/item/reagent_container/hypospray/autoinjector/dexalinp, null, VENDOR_ITEM_REGULAR),
- list("Autoinjector (Epinephrine)", 2, /obj/item/reagent_container/hypospray/autoinjector/adrenaline, null, VENDOR_ITEM_REGULAR),
- list("Autoinjector (Inaprovaline)", 1, /obj/item/reagent_container/hypospray/autoinjector/inaprovaline, null, VENDOR_ITEM_REGULAR),
- list("Autoinjector (Kelotane)", 1, /obj/item/reagent_container/hypospray/autoinjector/kelotane, null, VENDOR_ITEM_REGULAR),
- list("Autoinjector (Oxycodone)", 2, /obj/item/reagent_container/hypospray/autoinjector/oxycodone, null, VENDOR_ITEM_REGULAR),
- list("Autoinjector (Tramadol)", 1, /obj/item/reagent_container/hypospray/autoinjector/tramadol, null, VENDOR_ITEM_REGULAR),
- list("Autoinjector (Tricord)", 1, /obj/item/reagent_container/hypospray/autoinjector/tricord, null, VENDOR_ITEM_REGULAR),
+ list("MEDICAL SUPPLIES", 0, null, null, null),
+ list("Burn Kit", 2, /obj/item/stack/medical/advanced/ointment, null, VENDOR_ITEM_REGULAR),
+ list("Trauma Kit", 2, /obj/item/stack/medical/advanced/bruise_pack, null, VENDOR_ITEM_REGULAR),
+ list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_REGULAR),
+ list("Medical Splints", 1, /obj/item/stack/medical/splint, null, VENDOR_ITEM_REGULAR),
- list("PILL BOTTLES", 0, null, null, null),
- list("Pill Bottle (Bicaridine)", 5, /obj/item/storage/pill_bottle/bicaridine, null, VENDOR_ITEM_RECOMMENDED),
- list("Pill Bottle (Dexalin)", 5, /obj/item/storage/pill_bottle/dexalin, null, VENDOR_ITEM_REGULAR),
- list("Pill Bottle (Dylovene)", 5, /obj/item/storage/pill_bottle/antitox, null, VENDOR_ITEM_REGULAR),
- list("Pill Bottle (Inaprovaline)", 5, /obj/item/storage/pill_bottle/inaprovaline, null, VENDOR_ITEM_REGULAR),
- list("Pill Bottle (Kelotane)", 5, /obj/item/storage/pill_bottle/kelotane, null, VENDOR_ITEM_RECOMMENDED),
- list("Pill Bottle (Peridaxon)", 5, /obj/item/storage/pill_bottle/peridaxon, null, VENDOR_ITEM_REGULAR),
- list("Pill Bottle (Tramadol)", 5, /obj/item/storage/pill_bottle/tramadol, null, VENDOR_ITEM_RECOMMENDED),
+ list("Injector (Bicaridine)", 1, /obj/item/reagent_container/hypospray/autoinjector/bicaridine, null, VENDOR_ITEM_REGULAR),
+ list("Injector (Dexalin+)", 1, /obj/item/reagent_container/hypospray/autoinjector/dexalinp, null, VENDOR_ITEM_REGULAR),
+ list("Injector (Inaprovaline)", 1, /obj/item/reagent_container/hypospray/autoinjector/inaprovaline, null, VENDOR_ITEM_REGULAR),
+ list("Injector (Kelotane)", 1, /obj/item/reagent_container/hypospray/autoinjector/kelotane, null, VENDOR_ITEM_REGULAR),
+ list("Injector (Oxycodone)", 2, /obj/item/reagent_container/hypospray/autoinjector/oxycodone, null, VENDOR_ITEM_REGULAR),
+ list("Injector (Tramadol)", 1, /obj/item/reagent_container/hypospray/autoinjector/tramadol, null, VENDOR_ITEM_REGULAR),
+ list("Injector (Tricord)", 1, /obj/item/reagent_container/hypospray/autoinjector/tricord, null, VENDOR_ITEM_REGULAR),
- list("MEDICAL UTILITIES", 0, null, null, null),
list("Health Analyzer", 4, /obj/item/device/healthanalyzer, null, VENDOR_ITEM_REGULAR),
- list("Medical HUD Glasses", 4, /obj/item/clothing/glasses/hud/health, null, VENDOR_ITEM_REGULAR),
- list("Roller Bed", 4, /obj/item/roller, null, VENDOR_ITEM_REGULAR),
- list("Stasis Bag", 6, /obj/item/bodybag/cryobag, null, VENDOR_ITEM_REGULAR),
+ list("Medical HUD Glasses", 4, /obj/item/clothing/glasses/hud/health, null, VENDOR_ITEM_MANDATORY),
list("UTILITIES", 0, null, null, null),
list("Brown Webbing Vest", 10, /obj/item/clothing/accessory/storage/black_vest/brown_vest, null, VENDOR_ITEM_RECOMMENDED),
diff --git a/code/modules/gear_presets/uscm.dm b/code/modules/gear_presets/uscm.dm
index 0450e74353ef..eedd0f79f4a7 100644
--- a/code/modules/gear_presets/uscm.dm
+++ b/code/modules/gear_presets/uscm.dm
@@ -962,3 +962,304 @@
dress_under = list(/obj/item/clothing/under/marine/dress/blues/senior)
dress_over = list(/obj/item/clothing/suit/storage/jacket/marine/dress/blues/officer)
dress_hat = list(/obj/item/clothing/head/marine/dress_cover/officer)
+
+//############ Solar Devils (PvE Marines) #############
+//## Random Headware/Mask Setup ##//
+/datum/equipment_preset/uscm/proc/spawn_marine_fluff_items(mob/living/carbon/human/new_human)
+ var/obj/item/helmet_accessory = pick(GLOB.allowed_helmet_items)
+ new_human.equip_to_slot_or_del(new helmet_accessory, WEAR_IN_HELMET)
+ if(prob(50))
+ var/obj/item/helmet_accessory_two = pick(GLOB.allowed_helmet_items)
+ new_human.equip_to_slot_or_del(new helmet_accessory_two, WEAR_IN_HELMET)
+ var/list/possible_masks = list(/obj/item/clothing/mask/gas) + subtypesof(/obj/item/clothing/mask/rebreather) + subtypesof(/obj/item/clothing/mask/tornscarf)
+ if(prob(50))
+ var/obj/item/clothing/mask/new_mask = pick(possible_masks)
+ new_human.equip_to_slot_or_del(new new_mask, WEAR_FACE)
+
+//## Rifleman ##//
+/datum/equipment_preset/uscm/rifleman_pve
+ name = "USCM Solar Devils Rifleman"
+ flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE
+
+ access = list(ACCESS_MARINE_PREP)
+ assignment = JOB_SQUAD_MARINE
+ rank = JOB_SQUAD_MARINE
+ paygrades = list(PAY_SHORT_ME1 = JOB_PLAYTIME_TIER_0, PAY_SHORT_ME2 = JOB_PLAYTIME_TIER_1, PAY_SHORT_ME3 = JOB_PLAYTIME_TIER_3)
+ role_comm_title = "RFN"
+ skills = /datum/skills/rifleman_pve
+ auto_squad_name = SQUAD_SOLAR
+
+ minimap_icon = "private"
+ dress_under = list(/obj/item/clothing/under/marine/dress/blues)
+ dress_over = list(/obj/item/clothing/suit/storage/jacket/marine/dress/blues)
+
+/datum/equipment_preset/uscm/rifleman_pve/load_status(mob/living/carbon/human/new_human)
+ new_human.nutrition = NUTRITION_MAX
+
+/datum/equipment_preset/uscm/rifleman_pve/load_gear(mob/living/carbon/human/new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo(new_human), WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/screwdriver/tactical(new_human), WEAR_R_EAR)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/medium(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/stack/medical/bruise_pack(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/stack/medical/splint(new_human), WEAR_IN_JACKET)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/webbing/five_slots(new_human), WEAR_ACCESSORY)
+
+ new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/wirecutters/tactical(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/wrench(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/device/multitool(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/largetank(new_human), WEAR_IN_ACCESSORY)
+
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/intel/chestrig(new_human), WEAR_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flare/full(new_human), WEAR_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/insulated/black(new_human), WEAR_HANDS)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/toolkit/full(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/high_explosive(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/incendiary(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/medium_stack(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/devils(new_human), WEAR_IN_BACK)
+
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1(new_human), WEAR_J_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine(new_human), WEAR_WAIST)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT)
+ spawn_marine_fluff_items(new_human)
+
+//## Corpsman ##//
+/datum/equipment_preset/uscm/medic_pve
+ name = "USCM Solar Devils Platoon Corpsman"
+ flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE
+
+ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_MEDPREP, ACCESS_MARINE_MEDBAY)
+ assignment = JOB_PLT_MED
+ rank = JOB_SQUAD_MEDIC
+ paygrades = list(PAY_SHORT_ME2 = JOB_PLAYTIME_TIER_0, PAY_SHORT_ME3 = JOB_PLAYTIME_TIER_1, PAY_SHORT_ME4 = JOB_PLAYTIME_TIER_3)
+ role_comm_title = "HM"
+ skills = /datum/skills/combat_medic_pve
+ auto_squad_name = SQUAD_SOLAR
+
+ minimap_icon = "medic"
+
+ utility_under = list(/obj/item/clothing/under/marine/medic)
+ dress_under = list(/obj/item/clothing/under/marine/dress/blues)
+ dress_over = list(/obj/item/clothing/suit/storage/jacket/marine/dress/blues)
+
+/datum/equipment_preset/uscm/medic_pve/load_status(mob/living/carbon/human/new_human)
+ new_human.nutrition = NUTRITION_NORMAL
+
+/datum/equipment_preset/uscm/medic_pve/load_gear(mob/living/carbon/human/new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/medic(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo/med(new_human), WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/screwdriver/tactical(new_human), WEAR_R_EAR)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/medium(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/stack/medical/bruise_pack(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/stack/medical/splint(new_human), WEAR_IN_JACKET)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/webbing/five_slots(new_human), WEAR_ACCESSORY)
+
+ new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/wirecutters/tactical(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/wrench(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/device/multitool(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/largetank(new_human), WEAR_IN_ACCESSORY)
+
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/intel/chestrig(new_human), WEAR_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flare/full(new_human), WEAR_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/magazine/large(new_human), WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/insulated/black(new_human), WEAR_HANDS)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
+
+ new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/surgical(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/devils(new_human), WEAR_IN_BACK)
+
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1(new_human), WEAR_J_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/full(new_human), WEAR_WAIST)
+ spawn_marine_fluff_items(new_human)
+
+//## Smartgunner ##//
+/datum/equipment_preset/uscm/sg_pve
+ name = "USCM Solar Devils Smartgunner"
+ flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE
+
+ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SMARTPREP)
+ assignment = JOB_SQUAD_SMARTGUN
+ rank = JOB_SQUAD_SMARTGUN
+ paygrades = list(PAY_SHORT_ME3 = JOB_PLAYTIME_TIER_0, PAY_SHORT_ME4 = JOB_PLAYTIME_TIER_1, PAY_SHORT_ME5 = JOB_PLAYTIME_TIER_3)
+ role_comm_title = "SG"
+ skills = /datum/skills/smartgunner_pve
+ auto_squad_name = SQUAD_SOLAR
+
+ minimap_icon = "smartgunner"
+ dress_under = list(/obj/item/clothing/under/marine/dress/blues)
+ dress_over = list(/obj/item/clothing/suit/storage/jacket/marine/dress/blues)
+
+/datum/equipment_preset/uscm/sg_pve/load_gear(mob/living/carbon/human/new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo(new_human), WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/screwdriver/tactical(new_human), WEAR_R_EAR)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/smartgunner(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/devils(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_IN_JACKET)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/webbing/five_slots(new_human), WEAR_ACCESSORY)
+
+ new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/wirecutters/tactical(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/wrench(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/device/multitool(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/simple(new_human), WEAR_IN_ACCESSORY)
+
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smartgun(new_human), WEAR_J_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/smartgunner/full(new_human), WEAR_WAIST)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/insulated/black(new_human), WEAR_HANDS)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m56_goggles(new_human), WEAR_EYES)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate(new_human), WEAR_R_STORE)
+ spawn_marine_fluff_items(new_human)
+
+/datum/equipment_preset/uscm/sg_pve/load_status(mob/living/carbon/human/new_human)
+
+//## Team Leader ##//
+/datum/equipment_preset/uscm/tl_pve
+ name = "USCM Solar Devils Team Leader"
+ flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE
+
+ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_TL_PREP, ACCESS_MARINE_DROPSHIP)
+ assignment = JOB_SQUAD_TEAM_LEADER
+ rank = JOB_SQUAD_TEAM_LEADER
+ paygrades = list(PAY_SHORT_ME3 = JOB_PLAYTIME_TIER_0, PAY_SHORT_ME4 = JOB_PLAYTIME_TIER_1, PAY_SHORT_ME5 = JOB_PLAYTIME_TIER_3)
+ role_comm_title = "FTL"
+ skills = /datum/skills/tl_pve
+ auto_squad_name = SQUAD_SOLAR
+
+ minimap_icon = "tl"
+
+/datum/equipment_preset/uscm/tl_pve/load_status(mob/living/carbon/human/new_human)
+ new_human.nutrition = NUTRITION_NORMAL
+
+/datum/equipment_preset/uscm/tl_pve/load_gear(mob/living/carbon/human/new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/leader(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo/tl(new_human), WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/screwdriver/tactical(new_human), WEAR_R_EAR)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/medium(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/stack/medical/bruise_pack(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/stack/medical/splint(new_human), WEAR_IN_JACKET)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/webbing/five_slots(new_human), WEAR_ACCESSORY)
+
+ new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/wirecutters/tactical(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/wrench(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/device/multitool(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/largetank(new_human), WEAR_IN_ACCESSORY)
+
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/rto(new_human), WEAR_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flare/full(new_human), WEAR_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/insulated/black(new_human), WEAR_HANDS)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/toolkit/full(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/high_explosive(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/defenses/handheld/sentry(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/devils(new_human), WEAR_IN_BACK)
+
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1(new_human), WEAR_J_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine(new_human), WEAR_WAIST)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT)
+ spawn_marine_fluff_items(new_human)
+
+//## Squad Leader ##//
+/datum/equipment_preset/uscm/sl_pve
+ name = "USCM Solar Devils Platoon Leader"
+ flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE
+
+ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP)
+ assignment = JOB_PLT_SL
+ rank = JOB_SQUAD_LEADER
+ paygrades = list(PAY_SHORT_ME5 = JOB_PLAYTIME_TIER_0, PAY_SHORT_ME6 = JOB_PLAYTIME_TIER_1, PAY_SHORT_ME7 = JOB_PLAYTIME_TIER_3)
+ role_comm_title = "SL"
+ skills = /datum/skills/sl_pve
+ auto_squad_name = SQUAD_SOLAR
+
+ minimap_icon = "sl"
+
+/datum/equipment_preset/uscm/sl_pve/load_status(mob/living/carbon/human/new_human)
+ new_human.nutrition = NUTRITION_NORMAL
+
+/datum/equipment_preset/uscm/sl_pve/load_gear(mob/living/carbon/human/new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/leader(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/cryo/tl(new_human), WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/screwdriver/tactical(new_human), WEAR_R_EAR)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/medium/leader(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/stack/medical/bruise_pack(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/stack/medical/splint(new_human), WEAR_IN_JACKET)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/webbing/five_slots(new_human), WEAR_ACCESSORY)
+
+ new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/wirecutters/tactical(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/wrench(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/device/multitool(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/largetank(new_human), WEAR_IN_ACCESSORY)
+
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/intel/chestrig(new_human), WEAR_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flare/full(new_human), WEAR_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/insulated/black(new_human), WEAR_HANDS)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/toolkit/full(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/surgical(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/devils(new_human), WEAR_IN_BACK)
+
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1(new_human), WEAR_J_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine(new_human), WEAR_WAIST)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT)
+ spawn_marine_fluff_items(new_human)
diff --git a/code/modules/gear_presets/uscm_event.dm b/code/modules/gear_presets/uscm_event.dm
index dbd8149c7866..9ef15ff955ae 100644
--- a/code/modules/gear_presets/uscm_event.dm
+++ b/code/modules/gear_presets/uscm_event.dm
@@ -323,6 +323,47 @@
new_human.equip_to_slot_or_del(new /obj/item/device/radio/listening_bug/radio_linked/hc/pvst(new_human), WEAR_IN_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/device/radio/listening_bug/radio_linked/hc/pvst(new_human), WEAR_IN_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/MP/provost/light/flexi(new_human.back), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/handheld_distress_beacon/provost(new_human.back), WEAR_IN_BACK)
+
+ new_human.equip_to_slot_or_del(new /obj/item/device/flash(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs(new_human), WEAR_IN_JACKET)
+
+/datum/equipment_preset/uscm_event/provost/inspector/chief
+ name = "Provost Chief Inspector"
+
+ assignment = JOB_PROVOST_CINSPECTOR
+ rank = JOB_PROVOST_CINSPECTOR
+ paygrades = list(PAY_SHORT_PVCI = JOB_PLAYTIME_TIER_0)
+ role_comm_title = "PvCI"
+ flags = EQUIPMENT_PRESET_EXTRA
+
+ dress_under = list(/obj/item/clothing/under/marine/dress/blues/senior)
+ dress_over = list(/obj/item/clothing/suit/storage/jacket/marine/dress/blues/officer)
+ dress_hat = list(/obj/item/clothing/head/marine/dress_cover/officer)
+
+/datum/equipment_preset/uscm_event/provost/inspector/chief/load_gear(mob/living/carbon/human/new_human)
+ var/back_item = /obj/item/storage/backpack/satchel/sec
+ if (new_human.client && new_human.client.prefs && (new_human.client.prefs.backbag == 1))
+ back_item = /obj/item/storage/backpack/security
+
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/provost(new_human), WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/mp/provost/chief(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(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/belt/gun/m4a3/mod88(new_human), WEAR_WAIST)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/jacket/marine/provost/chief(new_human), WEAR_JACKET)
+ if(new_human.disabilities & NEARSIGHTED)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud/prescription(new_human), WEAR_EYES)
+ else
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(new_human), WEAR_EYES)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/marine/mp/provost/chief(new_human), WEAR_HEAD)
+ 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/taperecorder(new_human), WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large(new_human), WEAR_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/listening_bug/radio_linked/hc/pvst(new_human), WEAR_IN_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/listening_bug/radio_linked/hc/pvst(new_human), WEAR_IN_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/listening_bug/radio_linked/hc/pvst(new_human), WEAR_IN_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/MP/provost/light/flexi(new_human.back), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/flash(new_human), WEAR_IN_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs(new_human), WEAR_IN_JACKET)
@@ -336,8 +377,19 @@
role_comm_title = "PvA"
flags = EQUIPMENT_PRESET_EXTRA
+/datum/equipment_preset/uscm_event/provost/marshal/deputy
+ name = "Provost Deputy Marshal (MO6)"
+ minimum_age = 45
+ skills = /datum/skills/general
+
+ assignment = JOB_PROVOST_DMARSHAL
+ rank = JOB_PROVOST_DMARSHAL
+ paygrades = list(PAY_SHORT_PVDM = JOB_PLAYTIME_TIER_0)
+ role_comm_title = PAY_SHORT_PVDM
+ flags = EQUIPMENT_PRESET_EXTRA
+
/datum/equipment_preset/uscm_event/provost/marshal
- name = "Provost Marshal (MO6)"
+ name = "Provost Marshal (MO7)"
minimum_age = 45
skills = /datum/skills/general
@@ -372,9 +424,10 @@
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/magazine/pistol/pmc_mateba(new_human), WEAR_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/MP/provost/marshal(new_human.back), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/cotablet(new_human.back), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/handheld_distress_beacon/provost(new_human.back), WEAR_IN_BACK)
/datum/equipment_preset/uscm_event/provost/marshal/sector
- name = "Provost Sector Marshal (MO7)"
+ name = "Provost Sector Marshal (MO9)"
minimum_age = 50
assignment = JOB_PROVOST_SMARSHAL
diff --git a/code/modules/gear_presets/uscm_forecon.dm b/code/modules/gear_presets/uscm_forecon.dm
index 65328e8513f5..3c1db85291ea 100644
--- a/code/modules/gear_presets/uscm_forecon.dm
+++ b/code/modules/gear_presets/uscm_forecon.dm
@@ -20,31 +20,6 @@
dress_over = list(/obj/item/clothing/suit/storage/jacket/marine/dress/blues/nco)
dress_hat = list(/obj/item/clothing/head/marine/dress_cover)
-/datum/equipment_preset/uscm/forecon/load_gear(mob/living/carbon/human/new_human)
- var/obj/item/clothing/under/marine/reconnaissance/uniform = new()
- var/obj/item/clothing/accessory/storage/droppouch/pouch = new()
- var/obj/item/clothing/accessory/ranks/marine/e5/pin = new()
- var/obj/item/clothing/accessory/patch/patch_uscm = new()
- var/obj/item/clothing/accessory/patch/forecon/patch_forecon = new()
- uniform.attach_accessory(new_human,pouch)
- uniform.attach_accessory(new_human,patch_uscm)
- uniform.attach_accessory(new_human,pin)
- uniform.attach_accessory(new_human,patch_forecon)
- new_human.equip_to_slot_or_del(uniform, WEAR_BODY)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/light/recon(new_human), WEAR_JACKET)
- new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel(new_human), WEAR_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_R_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate(new_human), WEAR_L_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/flask/marine(new_human), WEAR_IN_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/facepaint/sniper(new_human), WEAR_IN_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE(new_human), WEAR_IN_ACCESSORY)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS)
- new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical(new_human), WEAR_IN_JACKET)
- new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_IN_JACKET)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
- new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/forecon(new_human), WEAR_L_EAR)
- GLOB.character_traits[/datum/character_trait/skills/spotter].apply_trait(new_human)
-
/datum/equipment_preset/uscm/forecon/proc/add_forecon_weapon(mob/living/carbon/human/new_human)
var/random_gun = rand(1,3)
switch(random_gun)
@@ -75,6 +50,16 @@
if (9)
new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine(new_human), WEAR_HEAD)
+/datum/equipment_preset/uscm/forecon/proc/spawn_random_tech_headgear(mob/living/carbon/human/new_human)
+ var/i = rand(1,4)
+ switch(i)
+ if (1 , 2)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/tech(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(new_human), WEAR_EYES)
+ if (3 , 4)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/medic/white(new_human), WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/welding(new_human), WEAR_EYES)
+
/datum/equipment_preset/uscm/forecon/proc/add_forecon_weapon_pistol(mob/living/carbon/human/new_human)
var/random_pistol = rand(1,5)
switch(random_pistol)
@@ -106,8 +91,33 @@
minimap_icon = ""
skills = /datum/skills/military/survivor/forecon_standard
+/datum/equipment_preset/uscm/forecon/standard/load_gear(mob/living/carbon/human/new_human)
+ var/obj/item/clothing/under/marine/reconnaissance/uniform = new()
+ var/obj/item/clothing/accessory/storage/droppouch/pouch = new()
+ var/obj/item/clothing/accessory/ranks/marine/e5/pin = new()
+ var/obj/item/clothing/accessory/patch/patch_uscm = new()
+ var/obj/item/clothing/accessory/patch/forecon/patch_forecon = new()
+ uniform.attach_accessory(new_human,pouch)
+ uniform.attach_accessory(new_human,patch_uscm)
+ uniform.attach_accessory(new_human,pin)
+ uniform.attach_accessory(new_human,patch_forecon)
+ new_human.equip_to_slot_or_del(uniform, WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/light/recon(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel(new_human), WEAR_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/flask/marine(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/facepaint/sniper(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/forecon(new_human), WEAR_L_EAR)
+ GLOB.character_traits[/datum/character_trait/skills/spotter].apply_trait(new_human)
+
/datum/equipment_preset/uscm/forecon/standard/load_gear(mob/living/carbon/human/new_human)
..()
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate(new_human), WEAR_L_STORE)
spawn_random_headgear(new_human)
add_forecon_weapon_pistol(new_human)
add_forecon_weapon(new_human)
@@ -115,25 +125,44 @@
/datum/equipment_preset/uscm/forecon/tech
name = "USCM Reconnaissance Support Technician"
assignment = JOB_FORECON_SUPPORT
- rank = JOB_SQUAD_MEDIC
+ rank = JOB_SQUAD_TECH
role_comm_title = "SuppTech"
minimap_icon = "engi"
skills = /datum/skills/military/survivor/forecon_techician
/datum/equipment_preset/uscm/forecon/tech/load_gear(mob/living/carbon/human/new_human)
- new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/big(new_human), WEAR_BACK)
+ var/obj/item/clothing/under/marine/reconnaissance/uniform = new()
+ var/obj/item/clothing/accessory/storage/droppouch/pouch = new()
+ var/obj/item/clothing/accessory/ranks/marine/e5/pin = new()
+ var/obj/item/clothing/accessory/patch/patch_uscm = new()
+ var/obj/item/clothing/accessory/patch/forecon/patch_forecon = new()
+ uniform.attach_accessory(new_human,pouch)
+ uniform.attach_accessory(new_human,patch_uscm)
+ uniform.attach_accessory(new_human,pin)
+ uniform.attach_accessory(new_human,patch_forecon)
+ new_human.equip_to_slot_or_del(uniform, WEAR_BODY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/insulated(new_human), WEAR_HANDS)
- 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 /obj/item/clothing/glasses/welding(new_human), WEAR_EYES)
- ..()
- 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 /obj/item/storage/backpack/marine/satchel/big(new_human), WEAR_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/tools/tactical/full(new_human), WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/full/forecon(new_human), WEAR_WAIST)
new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/surgical(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/compact(new_human), WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool , WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/light/recon(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/flask/marine(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/facepaint/sniper(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/forecon(new_human), WEAR_L_EAR)
+ GLOB.character_traits[/datum/character_trait/skills/spotter].apply_trait(new_human)
+
add_forecon_weapon(new_human)
- spawn_random_headgear(new_human)
+ spawn_random_tech_headgear(new_human)
/datum/equipment_preset/uscm/forecon/marksman
name = "USCM Reconnaissance Designated Marksman"
@@ -154,10 +183,11 @@
uniform.attach_accessory(new_human,pin)
uniform.attach_accessory(new_human,patch_forecon)
new_human.equip_to_slot_or_del(uniform, WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate(new_human), WEAR_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/M3S, WEAR_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_IN_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic(new_human), WEAR_IN_JACKET)
- new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical(new_human), WEAR_IN_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/scout_cloak(new_human), WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate(new_human), WEAR_L_STORE)
@@ -165,8 +195,6 @@
new_human.equip_to_slot_or_del(new /obj/item/facepaint/sniper(new_human), WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE(new_human), WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS)
- new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical(new_human), WEAR_IN_JACKET)
- new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_IN_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/forecon(new_human), WEAR_L_EAR)
new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m4ra_custom/tactical(new_human), WEAR_L_HAND)
@@ -199,6 +227,7 @@
uniform.attach_accessory(new_human,pin)
uniform.attach_accessory(new_human,patch_forecon)
new_human.equip_to_slot_or_del(uniform, WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate(new_human), WEAR_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/smartgunner(new_human), WEAR_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate(new_human), WEAR_L_STORE)
@@ -243,13 +272,29 @@
uniform.attach_accessory(new_human,patch_uscm)
uniform.attach_accessory(new_human,pin)
uniform.attach_accessory(new_human,patch_forecon)
+
new_human.equip_to_slot_or_del(uniform, WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate(new_human), WEAR_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1/tactical(new_human), WEAR_R_HAND)
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel(new_human), WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/light/recon(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_R_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/flask/marine(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/facepaint/sniper(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/forecon(new_human), WEAR_L_EAR)
+ GLOB.character_traits[/datum/character_trait/skills/spotter].apply_trait(new_human)
+
+
+
..()
add_forecon_weapon_pistol(new_human)
spawn_random_headgear(new_human)
diff --git a/code/modules/law/laws/major_crime.dm b/code/modules/law/laws/major_crime.dm
index 58b30dfd6ce1..94ee72e869e1 100644
--- a/code/modules/law/laws/major_crime.dm
+++ b/code/modules/law/laws/major_crime.dm
@@ -38,9 +38,15 @@
desc = "Failure to perform one’s role to an acceptable standard. For example, a Commanding Officer failing to properly organize and ensure their personnel are given orders, failing to follow proper procedure in detriment of one’s duties, or ship crew leaving the ship without authorization from the Commanding Officer or their Department Head. Any officer who commits a crime may be charged with Neglect of Duty in addition to the appropriate crimes."
brig_time = 15
+/datum/law/major_law/listening_bugs
+ name = "Unauthorized use of a Listening Device"
+ desc = "Using a listening device against SOP in a secure area such as the CIC. Use of listening devices tied to foreign governments or terror organisations is also considered subterfuge."
+ special_punishment = "Listening Device Confiscation"
+ brig_time = 15
+
/datum/law/major_law/subterfuge
name = "Subterfuge"
- desc = "Carrying out objectives or being tied to material that describe planned actions that go against the USCM. Strong proof is required that the individual is working against USCM."
+ desc = "Carrying out objectives or being tied to material that describe planned actions that go against the USCM. Strong proof is required that the individual is working against USCM. Use of listening devices tied to foreign governments or terror organisations in secure areas is also considered subterfuge."
special_punishment = "Termination of ID/Discharge to planet"
brig_time = 15
diff --git a/code/modules/law/laws/minor_crime.dm b/code/modules/law/laws/minor_crime.dm
index 651b9dd42d4f..e797c61d486d 100644
--- a/code/modules/law/laws/minor_crime.dm
+++ b/code/modules/law/laws/minor_crime.dm
@@ -29,6 +29,12 @@
special_punishment = "Escort Out"
brig_time = 7.5
+/datum/law/minor_law/listening_bugs
+ name = "Unauthorized use of a Listening Device"
+ desc = "Using a listening device against SOP in a public area such as the gym."
+ special_punishment = "Listening Device Confiscation"
+ brig_time = 7.5
+
/datum/law/minor_law/disrespect
name = "Disrespecting a Superior Officer"
desc = "Using offensive names or being directly disrespectful to someone of a Commissioned Officer of higher rank or position."
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index b9a972bda5c2..04e93095f42d 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -12,6 +12,9 @@
if (src.client.handle_spam_prevention(message, MUTE_DEADCHAT))
return
+ if(!filter_message(client, message))
+ return
+
. = src.say_dead(message)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 0d5d180b3408..0a6a42d09ba5 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1042,7 +1042,7 @@
show_browser(src, dat, "Crew Manifest", "manifest", "size=400x750")
/mob/living/carbon/human/verb/view_objective_memory()
- set name = "View objectives"
+ set name = "View intel objectives"
set category = "IC"
if(!mind)
@@ -1063,7 +1063,7 @@
to_chat(src, "The game appears to have misplaced your mind datum.")
return
- if(!skillcheck(usr, SKILL_RESEARCH, SKILL_RESEARCH_TRAINED) || faction != FACTION_MARINE && !(faction in FACTION_LIST_WY))
+ if(!skillcheck(usr, SKILL_RESEARCH, SKILL_RESEARCH_TRAINED) || !(FACTION_MARINE in get_id_faction_group()))
to_chat(usr, SPAN_WARNING("You have no access to the [MAIN_SHIP_NAME] research network."))
return
diff --git a/code/modules/mob/living/carbon/human/human_abilities.dm b/code/modules/mob/living/carbon/human/human_abilities.dm
index 9976fe37a4ff..58e4b617a19c 100644
--- a/code/modules/mob/living/carbon/human/human_abilities.dm
+++ b/code/modules/mob/living/carbon/human/human_abilities.dm
@@ -118,6 +118,33 @@
/datum/action/human_action/smartpack/repair_form/cooldown_check(obj/item/storage/backpack/marine/smartpack/S)
return S.repairing
+
+/datum/action/human_action/psychic_whisper
+ name = "Psychic Whipser"
+ action_icon_state = "cultist_channel_hivemind"
+
+/datum/action/human_action/psychic_whisper/action_activate()
+ . = ..()
+ if(!ishuman(owner))
+ return
+ var/mob/living/carbon/human/human_owner = owner
+
+ if(human_owner.client.prefs.muted & MUTE_IC)
+ to_chat(human_owner, SPAN_DANGER("You cannot whisper (muted)."))
+ return
+
+ var/list/target_list = list()
+ for(var/mob/living/carbon/possible_target in view(7, human_owner))
+ if(possible_target == human_owner || !possible_target.client)
+ continue
+ target_list += possible_target
+
+ var/mob/living/carbon/target_mob = tgui_input_list(human_owner, "Target", "Send a Psychic Whisper to whom?", target_list, theme = "hive_status")
+ if(!target_mob)
+ return
+
+ human_owner.psychic_whisper(target_mob)
+
/*
CULT
*/
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index e44106d90abb..0bb446bf5f02 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -1,6 +1,7 @@
/mob/living/carbon/human
light_system = MOVABLE_LIGHT
rotate_on_lying = TRUE
+ blocks_emissive = EMISSIVE_BLOCK_UNIQUE
//Hair color and style
var/r_hair = 0
var/g_hair = 0
diff --git a/code/modules/mob/living/carbon/human/powers/human_powers.dm b/code/modules/mob/living/carbon/human/powers/human_powers.dm
index fef87c2f3263..8daf9a7488d7 100644
--- a/code/modules/mob/living/carbon/human/powers/human_powers.dm
+++ b/code/modules/mob/living/carbon/human/powers/human_powers.dm
@@ -186,7 +186,7 @@
var/whisper = strip_html(input("Message:", "Psychic Whisper") as text|null)
if(whisper)
log_say("PsychicWhisper: [key_name(src)]->[target_mob.key] : [whisper] (AREA: [get_area_name(loc)])")
- to_chat(target_mob, SPAN_XENOWARNING(" You hear a strange, alien voice in your head... [whisper]"))
+ to_chat(target_mob, SPAN_XENOWARNING(" You hear a strange, alien voice in your head... [SPAN_PSYTALK(whisper)]"))
to_chat(src, SPAN_XENOWARNING(" You said: \"[whisper]\" to [target_mob]"))
for (var/mob/dead/observer/ghost as anything in GLOB.observer_list)
if(!ghost.client || isnewplayer(ghost))
@@ -195,7 +195,7 @@
var/rendered_message
var/human_track = "(F)"
var/target_track = "(F)"
- rendered_message = SPAN_XENOLEADER("PsychicWhisper: [real_name][human_track] to [target_mob.real_name][target_track], '[whisper]'")
+ rendered_message = SPAN_XENOLEADER("PsychicWhisper: [real_name][human_track] to [target_mob.real_name][target_track], '[SPAN_PSYTALK(whisper)]'")
ghost.show_message(rendered_message, SHOW_MESSAGE_AUDIBLE)
return
diff --git a/code/modules/mob/living/carbon/human/species/zombie.dm b/code/modules/mob/living/carbon/human/species/zombie.dm
index 4e8a0b5e98e2..21a220e48e55 100644
--- a/code/modules/mob/living/carbon/human/species/zombie.dm
+++ b/code/modules/mob/living/carbon/human/species/zombie.dm
@@ -127,7 +127,7 @@
/datum/species/zombie/proc/handle_alert_ghost(mob/living/carbon/human/zombie)
var/mob/dead/observer/ghost = zombie.get_ghost()
if(ghost?.client)
- playsound_client(ghost.client, 'sound/effects/adminhelp_new.ogg')
+ playsound_client(ghost.client, 'sound/effects/revive_notify.ogg')
to_chat(ghost, SPAN_BOLDNOTICE(FONT_SIZE_LARGE("Your body has risen! (Verbs -> Ghost -> Re-enter corpse, or click here!)")))
/datum/species/zombie/proc/remove_from_revive(mob/living/carbon/human/zombie)
diff --git a/code/modules/mob/living/carbon/xenomorph/Abilities.dm b/code/modules/mob/living/carbon/xenomorph/Abilities.dm
index 6c220f41ad45..35b532136f90 100644
--- a/code/modules/mob/living/carbon/xenomorph/Abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/Abilities.dm
@@ -210,9 +210,9 @@
if(whisper)
log_say("PsychicWhisper: [key_name(xeno_player)]->[target_mob.key] : [whisper] (AREA: [get_area_name(target_mob)])")
if(!istype(target_mob, /mob/living/carbon/xenomorph))
- to_chat(target_mob, SPAN_XENOQUEEN("You hear a strange, alien voice in your head. \"[whisper]\""))
+ to_chat(target_mob, SPAN_XENOQUEEN("You hear a strange, alien voice in your head. \"[SPAN_PSYTALK(whisper)]\""))
else
- to_chat(target_mob, SPAN_XENOQUEEN("You hear the voice of [xeno_player] resonate in your head. \"[whisper]\""))
+ to_chat(target_mob, SPAN_XENOQUEEN("You hear the voice of [xeno_player] resonate in your head. \"[SPAN_PSYTALK(whisper)]\""))
to_chat(xeno_player, SPAN_XENONOTICE("You said: \"[whisper]\" to [target_mob]"))
for(var/mob/dead/observer/ghost as anything in GLOB.observer_list)
@@ -222,7 +222,7 @@
var/rendered_message
var/xeno_track = "(F)"
var/target_track = "(F)"
- rendered_message = SPAN_XENOLEADER("PsychicWhisper: [xeno_player.real_name][xeno_track] to [target_mob.real_name][target_track], '[whisper]'")
+ rendered_message = SPAN_XENOLEADER("PsychicWhisper: [xeno_player.real_name][xeno_track] to [target_mob.real_name][target_track], '[SPAN_PSYTALK(whisper)]'")
ghost.show_message(rendered_message, SHOW_MESSAGE_AUDIBLE)
return ..()
@@ -254,9 +254,9 @@
continue
target_list += possible_target
if(!istype(possible_target, /mob/living/carbon/xenomorph))
- to_chat(possible_target, SPAN_XENOQUEEN("You hear a strange, alien voice in your head. \"[whisper]\""))
+ to_chat(possible_target, SPAN_XENOQUEEN("You hear a strange, alien voice in your head. \"[SPAN_PSYTALK(whisper)]\""))
else
- to_chat(possible_target, SPAN_XENOQUEEN("You hear the voice of [xeno_player] resonate in your head. \"[whisper]\""))
+ to_chat(possible_target, SPAN_XENOQUEEN("You hear the voice of [xeno_player] resonate in your head. \"[SPAN_PSYTALK(whisper)]\""))
FOR_DVIEW_END
if(!length(target_list))
return
@@ -269,7 +269,7 @@
if(ghost.client.prefs.toggles_chat & CHAT_GHOSTHIVEMIND)
var/rendered_message
var/xeno_track = "(F)"
- rendered_message = SPAN_XENOLEADER("PsychicRadiance: [xeno_player.real_name][xeno_track] to [targetstring], '[whisper]'")
+ rendered_message = SPAN_XENOLEADER("PsychicRadiance: [xeno_player.real_name][xeno_track] to [targetstring], '[SPAN_PSYTALK(whisper)]'")
ghost.show_message(rendered_message, SHOW_MESSAGE_AUDIBLE)
return ..()
diff --git a/code/modules/mob/living/carbon/xenomorph/Embryo.dm b/code/modules/mob/living/carbon/xenomorph/Embryo.dm
index 61ba87cd001b..4a82c4fb0b86 100644
--- a/code/modules/mob/living/carbon/xenomorph/Embryo.dm
+++ b/code/modules/mob/living/carbon/xenomorph/Embryo.dm
@@ -341,7 +341,7 @@
if(burstcount)
step(larva_embryo, pick(GLOB.cardinals))
- if(GLOB.round_statistics)
+ if(GLOB.round_statistics && (ishuman(victim)) && (SSticker.current_state == GAME_STATE_PLAYING) && (ROUND_TIME > 1 MINUTES))
GLOB.round_statistics.total_larva_burst++
GLOB.larva_burst_by_hive[hive] = (GLOB.larva_burst_by_hive[hive] || 0) + 1
burstcount++
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_abilities.dm
index b1358e30c26b..cc89a86d38e0 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_abilities.dm
@@ -41,11 +41,10 @@
// Configurables
var/grab_range = 4
- var/click_miss_cooldown = 15
var/twitch_message_cooldown = 0 //apparently this is necessary for a tiny code that makes the lunge message on cooldown not be spammable, doesn't need to be big so 5 will do.
var/smash_damage = 20
var/smash_scale = 10
- var/stun_duration = 2 SECONDS
+ var/stun_duration = 3 SECONDS
/datum/action/xeno_action/activable/feralfrenzy
name = "Feral Frenzy"
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm
index 10bf45eabcc9..41445a8fc602 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm
@@ -220,7 +220,6 @@
return
if(predalien_smash.can_not_harm(affected_atom) || !ismob(affected_atom))
- apply_cooldown_override(click_miss_cooldown)
return
diff --git a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm
index de0cefeea76d..0db94bc8ed45 100644
--- a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm
+++ b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm
@@ -258,14 +258,16 @@
if(M.frenzy_aura > 0)
damage += (M.frenzy_aura * FRENZY_DAMAGE_MULTIPLIER)
+ M.animation_attack_on(src)
//Somehow we will deal no damage on this attack
if(!damage)
playsound(M.loc, 'sound/weapons/alien_claw_swipe.ogg', 25, 1)
- M.animation_attack_on(src)
+
M.visible_message(SPAN_DANGER("[M] lunges at [src]!"), \
SPAN_DANGER("We lunge at [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT)
return XENO_ATTACK_ACTION
+ handle_blood_splatter(get_dir(M.loc, loc))
last_damage_data = create_cause_data(initial(M.name), M)
M.visible_message(SPAN_DANGER("[M] [M.slashes_verb] [src]!"), \
SPAN_DANGER("We [M.slash_verb] [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT)
@@ -798,6 +800,8 @@
var/ship_id = "sh_dropship1"
if(shuttle_tag == DROPSHIP_NORMANDY)
ship_id = "sh_dropship2"
+ if(shuttle_tag == DROPSHIP_SAIPAN)
+ ship_id = "sh_dropship3"
for(var/obj/structure/machinery/door/airlock/dropship_hatch/D in GLOB.machines)
if(D.id == ship_id)
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Drone.dm b/code/modules/mob/living/carbon/xenomorph/castes/Drone.dm
index e6c4a76c9353..12d94f0d5ec2 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Drone.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Drone.dm
@@ -83,6 +83,7 @@
weed_food_states_flipped = list("Drone_1","Drone_2","Drone_3")
/mob/living/carbon/xenomorph/drone/tutorial
+ AUTOWIKI_SKIP(TRUE)
/mob/living/carbon/xenomorph/drone/tutorial/gib(datum/cause_data/cause = create_cause_data("gibbing", src))
death(cause, 1)
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm b/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm
index 9d42eb982d2e..17ec90a96bda 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm
@@ -18,6 +18,8 @@
minimap_icon = "facehugger"
/mob/living/carbon/xenomorph/facehugger
+ AUTOWIKI_SKIP(TRUE)
+
name = XENO_CASTE_FACEHUGGER
caste_type = XENO_CASTE_FACEHUGGER
speak_emote = list("hisses")
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Hellhound.dm b/code/modules/mob/living/carbon/xenomorph/castes/Hellhound.dm
index 7df87f63cf3a..6ad08817f84a 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Hellhound.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Hellhound.dm
@@ -30,6 +30,8 @@
minimap_icon = "hellhound"
/mob/living/carbon/xenomorph/hellhound
+ AUTOWIKI_SKIP(TRUE)
+
caste_type = XENO_CASTE_HELLHOUND
name = XENO_CASTE_HELLHOUND
desc = "A disgusting beast from hell, it has four menacing spikes growing from its head."
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm b/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm
index 8dc427e2c55e..3f873f3635c3 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm
@@ -25,6 +25,8 @@
minimum_evolve_time = 0
/mob/living/carbon/xenomorph/larva
+ AUTOWIKI_SKIP(TRUE)
+
name = XENO_CASTE_LARVA
caste_type = XENO_CASTE_LARVA
speak_emote = list("hisses")
@@ -68,24 +70,38 @@
pass_flags.flags_can_pass_all = PASS_ALL^PASS_OVER_THROW_ITEM
/mob/living/carbon/xenomorph/larva/corrupted
+ AUTOWIKI_SKIP(TRUE)
+
hivenumber = XENO_HIVE_CORRUPTED
/mob/living/carbon/xenomorph/larva/alpha
+ AUTOWIKI_SKIP(TRUE)
+
hivenumber = XENO_HIVE_ALPHA
/mob/living/carbon/xenomorph/larva/bravo
+ AUTOWIKI_SKIP(TRUE)
+
hivenumber = XENO_HIVE_BRAVO
/mob/living/carbon/xenomorph/larva/charlie
+ AUTOWIKI_SKIP(TRUE)
+
hivenumber = XENO_HIVE_CHARLIE
/mob/living/carbon/xenomorph/larva/delta
+ AUTOWIKI_SKIP(TRUE)
+
hivenumber = XENO_HIVE_DELTA
/mob/living/carbon/xenomorph/larva/mutated
+ AUTOWIKI_SKIP(TRUE)
+
hivenumber = XENO_HIVE_MUTATED
/mob/living/carbon/xenomorph/larva/predalien
+ AUTOWIKI_SKIP(TRUE)
+
icon_xeno = 'icons/mob/xenos/predalien_larva.dmi'
icon_state = "Predalien Larva"
caste_type = XENO_CASTE_PREDALIEN_LARVA
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm b/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm
index b60f150c442d..8279d1b2ba2e 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Predalien.dm
@@ -30,6 +30,8 @@
minimap_icon = "predalien"
/mob/living/carbon/xenomorph/predalien
+ AUTOWIKI_SKIP(TRUE)
+
caste_type = XENO_CASTE_PREDALIEN
name = "Abomination" //snowflake name
desc = "A strange looking creature with fleshy strands on its head. It appears like a mixture of armor and flesh, smooth, but well carapaced."
@@ -114,6 +116,8 @@ You must still listen to the queen.
. += "It has [predalienkills.kills] kills to its name!"
/mob/living/carbon/xenomorph/predalien/tutorial
+ AUTOWIKI_SKIP(TRUE)
+
should_announce_spawn = FALSE
/mob/living/carbon/xenomorph/predalien/tutorial/gib(datum/cause_data/cause = create_cause_data("gibbing", src))
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm
index db682e161e87..037c154ab2dc 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm
@@ -252,6 +252,8 @@
return ..()
/mob/living/carbon/xenomorph/queen
+ AUTOWIKI_SKIP(TRUE)
+
caste_type = XENO_CASTE_QUEEN
name = XENO_CASTE_QUEEN
desc = "A huge, looming alien creature. The biggest and the baddest."
@@ -370,28 +372,44 @@
return "heart_t3"
/mob/living/carbon/xenomorph/queen/corrupted
+ AUTOWIKI_SKIP(TRUE)
+
hivenumber = XENO_HIVE_CORRUPTED
/mob/living/carbon/xenomorph/queen/forsaken
+ AUTOWIKI_SKIP(TRUE)
+
hivenumber = XENO_HIVE_FORSAKEN
/mob/living/carbon/xenomorph/queen/forsaken/combat_ready
+ AUTOWIKI_SKIP(TRUE)
+
hivenumber = XENO_HIVE_FORSAKEN
queen_aged = TRUE
/mob/living/carbon/xenomorph/queen/alpha
+ AUTOWIKI_SKIP(TRUE)
+
hivenumber = XENO_HIVE_ALPHA
/mob/living/carbon/xenomorph/queen/bravo
+ AUTOWIKI_SKIP(TRUE)
+
hivenumber = XENO_HIVE_BRAVO
/mob/living/carbon/xenomorph/queen/charlie
+ AUTOWIKI_SKIP(TRUE)
+
hivenumber = XENO_HIVE_CHARLIE
/mob/living/carbon/xenomorph/queen/delta
+ AUTOWIKI_SKIP(TRUE)
+
hivenumber = XENO_HIVE_DELTA
/mob/living/carbon/xenomorph/queen/mutated
+ AUTOWIKI_SKIP(TRUE)
+
hivenumber = XENO_HIVE_MUTATED
/mob/living/carbon/xenomorph/queen/combat_ready
diff --git a/code/modules/mob/living/carbon/xenomorph/hive_status.dm b/code/modules/mob/living/carbon/xenomorph/hive_status.dm
index 9c8b54dad483..131859d0d129 100644
--- a/code/modules/mob/living/carbon/xenomorph/hive_status.dm
+++ b/code/modules/mob/living/carbon/xenomorph/hive_status.dm
@@ -1199,8 +1199,8 @@
reporting_id = "renegade"
hivenumber = XENO_HIVE_RENEGADE
prefix = "Renegade "
- color = "#9c7a4d"
- ui_color ="#80705c"
+ color = "#ffae00"
+ ui_color ="#ad732c"
dynamic_evolution = FALSE
allow_queen_evolve = FALSE
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 7f3af1449266..5bd2b4283c86 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -62,6 +62,24 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
/proc/prefix_to_channel(prefix)
return GLOB.department_radio_keys[prefix]
+/proc/filter_message(client/user, message)
+ if(!config.word_filter_regex)
+ return TRUE
+
+ if(config.word_filter_regex.Find(message))
+ to_chat(user,
+ html = "\n-- Word Filter Message --",
+ )
+ to_chat(user,
+ type = MESSAGE_TYPE_ADMINPM,
+ html = "\nYour message has been automatically filtered due to its contents. Trying to circumvent this filter will get you banned.",
+ )
+ SEND_SOUND(user, sound('sound/effects/adminhelp_new.ogg'))
+ log_admin("[user.ckey] triggered the chat filter with the following message: [message].")
+ return FALSE
+
+ return TRUE
+
///Shows custom speech bubbles for screaming, *warcry etc.
/mob/living/proc/show_speech_bubble(bubble_name, bubble_type = bubble_icon)
@@ -81,6 +99,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
if(SEND_SIGNAL(src, COMSIG_LIVING_SPEAK, message, speaking, verb, alt_name, italics, message_range, speech_sound, sound_vol, nolog, message_mode) & COMPONENT_OVERRIDE_SPEAK) return
+ if(!filter_message(src, message))
+ return
+
message = process_chat_markup(message, list("~", "_"))
for(var/dst=0; dst<=1; dst++) //Will run twice if src has a clone
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_lizard.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_lizard.dm
new file mode 100644
index 000000000000..6bb0202c2deb
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_lizard.dm
@@ -0,0 +1,756 @@
+#define ATTACK_SLASH 0
+#define ATTACK_BITE 1
+#define LIZARD_SPEED_NORMAL 2.8
+#define LIZARD_SPEED_RETREAT 2.5
+#define LIZARD_SPEED_NORMAL_CLIENT -1
+#define LIZARD_SPEED_RETREAT_CLIENT -1.5
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard
+ name = "giant lizard"
+ desc = "A large, wolf-like reptile. Its eyes are keenly focused on yours."
+ icon = 'icons/mob/mob_64.dmi'
+ icon_state = "Giant Lizard Running"
+ icon_living = "Giant Lizard Running"
+ icon_dead = "Giant Lizard Dead"
+ mob_size = MOB_SIZE_XENO_SMALL
+ maxHealth = 350
+ health = 350
+ icon_size = 64
+ pixel_x = -16
+ old_x = -16
+ base_pixel_x = 0
+ base_pixel_y = -20
+ mobility_flags = MOBILITY_FLAGS_REST_CAPABLE_DEFAULT
+ affected_by_fire = TRUE
+ move_to_delay = LIZARD_SPEED_NORMAL
+ speed = LIZARD_SPEED_NORMAL_CLIENT //speed and move_to_delay are not the same in simplemob code (wow!)
+
+ response_help = "pets"
+ response_disarm = "tries to push away"
+ response_harm = "punches"
+ friendly = "nuzzles"
+ see_in_dark = 50
+
+ speak_chance = 2
+ speak_emote = "hisses"
+ emote_hear = list("hisses.", "growls.", "roars.", "bellows.")
+ emote_see = list("shakes its head.", "wags its tail.", "flicks its tongue.", "yawns.")
+
+ melee_damage_lower = 20
+ melee_damage_upper = 25
+ attack_same = FALSE
+ langchat_color = LIGHT_COLOR_GREEN
+
+ ///Reference to the ZZzzz sleep overlay when resting.
+ var/sleep_overlay
+
+ ///If 0, moves the mob out of attacking into idle state. Used to prevent the mob from chasing down targets that did not mean to hurt it.
+ var/aggression_value = 0
+
+ ///Emotes to play when being pet by a friend.
+ var/list/pet_emotes = list("closes its eyes.", "growls happily.", "wags its tail.", "rolls on the ground.")
+ ///Cooldown to stop generic emote spam.
+ COOLDOWN_DECLARE(emote_cooldown)
+
+ ///Collision callbacks for the pounce proc.
+ var/list/pounce_callbacks = list()
+ ///Are we currently mauling a mob after pouncing them? Used to stop normal attacks on pounced targets.
+ var/is_ravaging = FALSE
+ ///Length of the cooldown for pouncing.
+ var/pounce_cooldown_length = 9 SECONDS
+ ///Cooldown for the pounce ability.
+ COOLDOWN_DECLARE(pounce_cooldown)
+
+ ///How many times the mob is going bleed in the Life() proc.
+ var/bleed_ticks = 0
+ ///Chance of the mob laying down/getting up.
+ var/chance_to_rest = 0
+ ///Is the mob currently running away from a target?
+ var/is_retreating = FALSE
+ ///How many times have we attempted to retreat?
+ var/retreat_attempts = 0
+ ///Tied directly to retreat_attempts. If our retreat fail, then we will completely stop trying to retreat for the length of this cooldown.
+ COOLDOWN_DECLARE(retreat_cooldown)
+
+ ///The food object that the mob is trying to eat.
+ var/food_target
+ ///A list of foods the mob is interested in eating.
+ var/list/acceptable_foods = list(/obj/item/reagent_container/food/snacks/meat, /obj/item/reagent_container/food/snacks/packaged_meal, /obj/item/reagent_container/food/snacks/resin_fruit)
+ ///Is the mob currently eating the food_target?
+ var/is_eating = FALSE
+ ///Cooldown dictating how long the mob will wait between eating food.
+ COOLDOWN_DECLARE(food_cooldown)
+
+ ///Cooldown for the growl emote.
+ COOLDOWN_DECLARE(growl_message)
+ ///Cooldown for when the mob calms down, so the mob doesn't start attacking immediately after calming down.
+ COOLDOWN_DECLARE(calm_cooldown)
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/Initialize()
+ . = ..()
+ change_real_name(src, "[name] ([rand(1, 999)])")
+ pounce_callbacks[/mob] = DYNAMIC(/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/pounced_mob_wrapper)
+ pounce_callbacks[/turf] = DYNAMIC(/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/pounced_turf_wrapper)
+ pounce_callbacks[/obj] = DYNAMIC(/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/pounced_obj_wrapper)
+
+//regular pain datum will make the mob die when trying to pounce after taking enough damage.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/initialize_pain()
+ pain = new /datum/pain/xeno(src)
+
+///Proc for growling.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/growl(target_mob, ignore_cooldown = FALSE)
+ if(!COOLDOWN_FINISHED(src, growl_message) && !ignore_cooldown)
+ return
+ if(target_mob)
+ manual_emote("growls at [target_mob].")
+ else
+ manual_emote("growls.")
+ playsound(loc, "giant_lizard_growl", 60)
+ COOLDOWN_START(src, growl_message, rand(10, 14) SECONDS)
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/get_status_tab_items()
+ . = ..()
+ . += ""
+ . += "Health: [floor(health)]/[floor(maxHealth)]"
+ if(!COOLDOWN_FINISHED(src, pounce_cooldown))
+ . += "Pounce Cooldown: [COOLDOWN_SECONDSLEFT(src, pounce_cooldown)] seconds"
+
+//the AI gets funky when it gets stunned midcombat. this will help them get back into the fight more organically.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/on_immobilized_trait_loss(datum/source)
+ . = ..()
+ find_target_on_trait_loss()
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/on_knockedout_trait_loss(datum/source)
+ . = ..()
+ find_target_on_trait_loss()
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/on_incapacitated_trait_loss(datum/source)
+ . = ..()
+ find_target_on_trait_loss()
+
+///Proc for handling the AI post-status effect.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/find_target_on_trait_loss()
+ is_retreating = FALSE
+ if(stance > HOSTILE_STANCE_ALERT)
+ FindTarget()
+ MoveToTarget()
+
+//procs for handling sleeping icons when resting
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/AddSleepingIcon()
+ var/image/sleeping_icon = new('icons/mob/hud/hud.dmi', "slept_icon_centered")
+ if(sleep_overlay)
+ return
+ sleep_overlay = sleeping_icon
+ overlays += sleep_overlay
+ addtimer(CALLBACK(src, PROC_REF(RemoveSleepingIcon)), 6 SECONDS)
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/RemoveSleepingIcon()
+ if(sleep_overlay)
+ overlays -= sleep_overlay
+ sleep_overlay = null
+
+//The parent proc sets the stance to IDLE which will break the AI if it's in combat
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/stop_moving()
+ walk_to(src, 0)
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/update_transform(instant_update = FALSE)
+ if(stat == DEAD)
+ icon_state = icon_dead
+ else if(body_position == LYING_DOWN)
+ if(!HAS_TRAIT(src, TRAIT_INCAPACITATED) && !HAS_TRAIT(src, TRAIT_FLOORED))
+ icon_state = "Giant Lizard Sleeping"
+ else
+ icon_state = "Giant Lizard Knocked Down"
+ else
+ icon_state = icon_living
+ return ..()
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/get_examine_text(mob/user)
+ . = ..()
+ if(stat == DEAD || user == src)
+ desc = "A large, wolf-like reptile."
+ if(user == src)
+ . += SPAN_NOTICE("\nRest on the ground to restore 5% of your health every second.")
+ . += SPAN_NOTICE("You're able to pounce targets by using [client && client.prefs && client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK ? "middle-click" : "shift-click"].")
+ . += SPAN_NOTICE("You will aggressively maul targets that are prone. Any click on yourself will be passed down to mobs below you, so feel free to click on your sprite in order to attack pounced targets.")
+ else if((user.faction in faction_group))
+ desc = "[initial(desc)] There's a hint of warmth in them."
+ else
+ desc = initial(desc)
+ if(isxeno(user)) //simplemobs aren't coded to handle larva infection so we'll just let them know
+ . += SPAN_DANGER("This is an unsuitable host for the hive.")
+ return .
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/set_resting(new_resting, silent, instant)
+ . = ..()
+ if(!resting)
+ RemoveSleepingIcon()
+ update_transform()
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/death()
+ playsound(loc, 'sound/effects/giant_lizard_death.ogg', 70)
+ manual_emote("lets out a waning growl.")
+ return ..()
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/attack_hand(mob/living/carbon/human/attacking_mob)
+ . = ..()
+ process_attack_hand(attacking_mob)
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/attack_alien(mob/living/carbon/xenomorph/attacking_mob)
+ . = ..()
+ process_attack_hand(attacking_mob)
+
+///Proc for handling attacking the lizard with a hand for BOTH XENOS AND HUMANS.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/process_attack_hand(mob/living/carbon/attacking_mob)
+ if(stat == DEAD)
+ return
+
+ if(!(attacking_mob.faction in faction_group) && !is_eating)
+ Retaliate()
+
+ if(attacking_mob.a_intent == INTENT_HELP && (attacking_mob.faction in faction_group))
+ if(on_fire)
+ adjust_fire_stacks(-5, min_stacks = 0)
+ playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 25, 1, 7)
+ visible_message(SPAN_DANGER("[attacking_mob] tries to put out the fire on [src]!"), \
+ SPAN_WARNING("You try to put out the fire on [src]!"), null, 5)
+ if(fire_stacks <= 0)
+ visible_message(SPAN_DANGER("[attacking_mob] has successfully extinguished the fire on [src]!"), \
+ SPAN_NOTICE("You extinguished the fire on [src]."), null, 5)
+ return
+ if(!resting)
+ chance_to_rest += 15
+ if(resting)
+ chance_to_rest = 0
+ if(COOLDOWN_FINISHED(src, emote_cooldown))
+ COOLDOWN_START(src, emote_cooldown, rand(5, 8) SECONDS)
+ manual_emote(pick(pick(pet_emotes), "stares at [attacking_mob].", "nuzzles [attacking_mob].", "licks [attacking_mob]'s hand."), "nibbles [attacking_mob]'s arm.", "flicks its tongue at [attacking_mob].")
+ if(prob(50))
+ playsound(loc, "giant_lizard_hiss", 25)
+ if(attacking_mob.a_intent == INTENT_DISARM && prob(75))
+ step_to(src, get_step(loc, attacking_mob.dir), 0, LIZARD_SPEED_NORMAL)
+
+//apply blood splatter when attacked by a sufficently damaging sharp weapon
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/attackby(obj/item/weapon, mob/living/carbon/human/attacker)
+ if(weapon.force > 10 && weapon.sharp && attacker.a_intent != INTENT_HELP)
+ handle_blood_splatter(get_dir(attacker.loc, loc))
+ return ..()
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/apply_damage(damage, damagetype, def_zone, used_weapon, sharp, edge, force)
+ Retaliate()
+ aggression_value = clamp(aggression_value + 5, 0, 30)
+ . = ..()
+ var/retreat_chance = abs((health / maxHealth * 100) - 100)
+ if(prob(retreat_chance) && health <= maxHealth * 0.66 && COOLDOWN_FINISHED(src, retreat_cooldown))
+ if(client && !is_retreating)
+ is_retreating = TRUE
+ to_chat(src, SPAN_USERDANGER("Your fight or flight response kicks in, run!"))
+ speed = LIZARD_SPEED_RETREAT_CLIENT
+ addtimer(VARSET_CALLBACK(src, speed, LIZARD_SPEED_NORMAL_CLIENT), 8 SECONDS)
+ addtimer(VARSET_CALLBACK(src, is_retreating, FALSE), 8 SECONDS)
+ else
+ MoveTo(target_mob, 12, TRUE, 8 SECONDS)
+ if(damage >= 10 && damagetype == BRUTE)
+ add_splatter_floor(loc, TRUE)
+ bleed_ticks = clamp(bleed_ticks + ceil(damage / 10), 0, 30)
+
+///Proc that forces the mob to disengage and try to extinguish itself. Will not be called if the mob is already retreating.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/try_to_extinguish()
+ if(is_retreating || !on_fire || client)
+ return
+
+ //forget EVERYTHING. we need to stop the flames!!!
+ stance = HOSTILE_STANCE_ALERT
+ target_mob = null
+ food_target = null
+ is_eating = FALSE
+ manual_emote("hisses in agony!")
+ playsound(src, "giant_lizard_hiss", 40)
+ MoveTo(null, 9, TRUE, 4 SECONDS, FALSE)
+ COOLDOWN_START(src, calm_cooldown, 8 SECONDS)
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/IgniteMob()
+ . = ..()
+ if(on_fire)
+ try_to_extinguish()
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/handle_fire()
+ . = ..()
+ if(on_fire)
+ try_to_extinguish()
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/Life(delta_time)
+ //simplemobs don't have innate knockdown reduction so we'll manually lower it here.
+ AdjustKnockDown(-0.5)
+ AdjustStun(-0.5)
+ if(aggression_value > 0)
+ aggression_value--
+
+ if(resting && stat != DEAD)
+ health += maxHealth * 0.05
+ if(prob(33) && !HAS_TRAIT(src, TRAIT_INCAPACITATED) && !HAS_TRAIT(src, TRAIT_FLOORED))
+ AddSleepingIcon()
+
+ if(bleed_ticks)
+ var/is_small_pool = FALSE
+ if(bleed_ticks < 10)
+ is_small_pool = TRUE
+ bleed_ticks--
+ add_splatter_floor(loc, is_small_pool)
+
+ . = ..()
+
+ if(client)
+ return
+
+ //if we haven't gotten hurt in a while, calm down and go back to idling
+ if(aggression_value == 0 && stance == HOSTILE_STANCE_ATTACKING)
+ enemies = list()
+ LoseTarget()
+ if(COOLDOWN_FINISHED(src, emote_cooldown))
+ manual_emote("calms down.")
+ COOLDOWN_START(src, calm_cooldown, 4 SECONDS)
+ COOLDOWN_START(src, emote_cooldown, 3 SECONDS)
+
+ //no longer interested in food when we're in combat
+ if(stance > HOSTILE_STANCE_ALERT)
+ is_eating = FALSE
+
+ if(stance == HOSTILE_STANCE_IDLE)
+ stop_automated_movement = FALSE
+ //if there's a friend on the same tile as us, don't bother getting up (cute!)
+ var/mob/living/carbon/friend = locate(/mob/living/carbon) in get_turf(src)
+ if((friend?.faction in faction_group) && resting)
+ chance_to_rest = 0
+
+ if(prob(chance_to_rest))
+ set_resting(!resting)
+ chance_to_rest = 0
+
+ chance_to_rest += rand(1, 2)
+
+ //if we're resting and something catches our interest, get up
+ if(stance != HOSTILE_STANCE_IDLE && resting)
+ set_resting(FALSE)
+
+ if(target_mob && !is_retreating && target_mob.stat == CONSCIOUS && stance == HOSTILE_STANCE_ATTACKING && COOLDOWN_FINISHED(src, pounce_cooldown) && (prob(75) || get_dist(src, target_mob) <= 5) && (target_mob in view(5, src)))
+ pounce(target_mob)
+
+ if(target_mob || on_fire)
+ return
+
+ //if we are retreating, but we don't have any targets or we're not on fire, stop retreating
+ if(is_retreating)
+ stop_moving()
+ stance = HOSTILE_STANCE_IDLE
+
+ //if we're hungry and we don't have already have our eyes on a snack, try eating food if possible
+ if(!food_target && COOLDOWN_FINISHED(src, food_cooldown))
+ for(var/obj/item/reagent_container/food/snacks/food in view(6, src))
+ if(!is_type_in_list(food, acceptable_foods))
+ continue
+ food_target = food
+ stance = HOSTILE_STANCE_ALERT
+ stop_automated_movement = TRUE
+ MoveTo(food_target)
+ break
+
+ //handling mobs that are invading our personal space
+ if(stance <= HOSTILE_STANCE_ALERT && !food_target && COOLDOWN_FINISHED(src, calm_cooldown))
+ var/intruder_in_sight = FALSE
+ for(var/mob/living/carbon/intruder in view(5, src))
+ if((intruder.faction in faction_group) || intruder.stat != CONSCIOUS || ismonkey(intruder) || intruder.alpha <= 200)
+ continue
+
+ intruder_in_sight = TRUE
+ face_atom(intruder)
+ stance = HOSTILE_STANCE_ALERT
+ stop_automated_movement = TRUE
+ if(get_dist(src, intruder) == 3)
+ growl(intruder)
+ else if(get_dist(src, intruder) <= 2)
+ Retaliate()
+ COOLDOWN_START(src, pounce_cooldown, 1 SECONDS)
+ break
+
+ if(!intruder_in_sight && stance == HOSTILE_STANCE_ALERT)
+ stance = HOSTILE_STANCE_IDLE
+
+ //if we have a snack that we want to eat, but we're not munching on it currently, check if it's close to us.
+ if(food_target && !is_eating)
+ if(!(food_target in view(5, src)))
+ stop_moving()
+ lose_food()
+ //if the food is next to us AND not in the hands of a mob, start eating
+ else if(!check_food_loc(food_target) && Adjacent(food_target))
+ INVOKE_ASYNC(src, PROC_REF(handle_food), food_target)
+
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/bullet_act(obj/projectile/projectile)
+ . = ..()
+ if(projectile.damage)
+ handle_blood_splatter(get_dir(projectile.starting, src))
+ add_splatter_floor(loc, FALSE)
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/handle_blood_splatter(splatter_dir)
+ var/obj/effect/temp_visual/dir_setting/bloodsplatter/human/bloodsplatter = new(loc, splatter_dir)
+ bloodsplatter.pixel_y = -2
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/AttackingTarget(inherited_target = target_mob)
+ if(!Adjacent(inherited_target) || is_ravaging || body_position == LYING_DOWN)
+ return
+
+ if(isliving(inherited_target))
+ var/mob/living/target = inherited_target
+ if(target.stat == DEAD)
+ to_chat(src, SPAN_WARNING("[target] is dead. There's nothing interesting about a corpse."))
+ return
+ //decimate mobs that are on the ground
+ if(target.body_position == LYING_DOWN)
+ ravagingattack(target)
+ return target
+
+ face_atom(target)
+ var/attack_type = pick(ATTACK_SLASH, ATTACK_BITE)
+ attacktext = attack_type ? "claws" : "bites"
+ flick_attack_overlay(target, attack_type ? "slash" : "animalbite")
+ playsound(loc, attack_type ? "alien_claw_flesh" : "alien_bite", 25, 1)
+ target.attack_animal(src)
+ animation_attack_on(target)
+
+ if(prob(33))
+ if(client && !is_retreating)
+ is_retreating = TRUE
+ to_chat(src, SPAN_USERDANGER("You gain a rush of speed!"))
+ speed = LIZARD_SPEED_RETREAT_CLIENT
+ addtimer(VARSET_CALLBACK(src, speed, LIZARD_SPEED_NORMAL_CLIENT), 2 SECONDS)
+ addtimer(VARSET_CALLBACK(src, is_retreating, FALSE), 2 SECONDS)
+ else
+ MoveTo(target_mob, 8, TRUE, 2 SECONDS, TRUE) //skirmish around our target
+ return target
+
+//Used to handle attacks when a client is in the mob. Otherwise we'd default to a generic animal attack.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/UnarmedAttack(atom/target)
+ var/tile_attack = FALSE
+ if(target == src) //Clicking self.
+ target = get_turf(src)
+ tile_attack = TRUE
+
+ if(isturf(target) && tile_attack)
+ var/turf/our_turf = target
+ for(var/mob/living/targets in our_turf)
+ if(targets == src)
+ continue
+ target = targets
+ break
+
+ if(isliving(target))
+ AttackingTarget(target)
+ next_move = world.time + 8
+
+///Proc for when the mob finds food and starts DEVOURING it.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/handle_food(obj/item/reagent_container/food/snacks/food)
+ manual_emote("starts gnawing [food].")
+ is_eating = TRUE
+ for(var/times_to_eat = rand(4, 6), times_to_eat--)
+ sleep(rand(1.7, 2.5) SECONDS)
+ if(check_food_loc(food) || stance > HOSTILE_STANCE_ALERT || stat == DEAD)
+ return
+ face_atom(food)
+ playsound(loc,'sound/items/eatfood.ogg', 25, 1)
+
+ for(var/mob/living/carbon/nearest_mob in view(7, src))
+ if(nearest_mob != food.last_dropped_by || (nearest_mob in faction_group))
+ continue
+ face_atom(nearest_mob)
+ manual_emote("stares curiously at [nearest_mob].")
+ faction_group += nearest_mob.faction_group
+ break
+
+ qdel(food)
+ food_target = null
+ is_eating = FALSE
+ stance = HOSTILE_STANCE_IDLE
+ COOLDOWN_START(src, food_cooldown, 30 SECONDS)
+
+///Proc for checking if someone picked our food target.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/check_food_loc(obj/food)
+ if(!ismob(food.loc))
+ return
+
+ var/mob/living/food_holder = food.loc
+ stop_moving()
+ COOLDOWN_START(src, food_cooldown, 15 SECONDS)
+ food_target = null
+ is_eating = FALSE
+ //snagging the food while you're right next to the mob makes it very angry
+ if(get_dist(src, food_holder) <= 2 && !(food_holder.faction in faction_group))
+ Retaliate()
+ return TRUE
+
+ growl(food.loc)
+ stance = HOSTILE_STANCE_IDLE
+ return TRUE
+
+//Proc for when we lose our food target.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/lose_food()
+ stance = HOSTILE_STANCE_IDLE
+ food_target = null
+ is_eating = FALSE
+ COOLDOWN_START(src, food_cooldown, 15 SECONDS)
+
+//Do not stop hunting targets even if they're not visible anymore.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/ListTargets(dist = 9)
+ if(!length(enemies))
+ return list()
+ var/list/see = orange(src, dist)
+ see &= enemies
+ return see
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/evaluate_target(mob/living/target)
+ //we need to check for monkeys else these guys will tear up all the small hosts for xenos
+ if((target.faction == faction || (target.faction in faction_group)) && !attack_same || ismonkey(target) || (target in friends))
+ return FALSE
+ if(target.stat != DEAD)
+ return target
+
+//Mobs in critical state are now fair game. Rip and tear.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/SA_attackable(target_mob)
+ if(isliving(target_mob))
+ var/mob/living/target = target_mob
+ //invisible mobs will still randomly be attacked regardless of this check if the lizard is in combat (intended)
+ if(target.stat == DEAD || target.alpha <= 200)
+ return TRUE //TRUE means it's unattackable (amazing code!)
+ return FALSE
+
+//Immediately retaliate after being attacked.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/Retaliate()
+ if(stat == DEAD || target_mob || on_fire)
+ return
+ aggression_value = clamp(aggression_value + 5, 0, 15)
+
+ . = ..()
+
+ target_mob = FindTarget()
+ if(target_mob)
+ growl(target_mob)
+ MoveToTarget()
+
+ //basic pack behaviour
+ for(var/mob/living/simple_animal/hostile/retaliate/giant_lizard/pack_member in view(7, src))
+ if(pack_member == src || pack_member.target_mob)
+ continue
+ pack_member.Retaliate()
+
+///Proc for moving to targets. walk_to() doesn't check for resting and status effects so we will do it ourselves.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/MoveTo(target, distance = 1, retreat = FALSE, time = 6 SECONDS, return_to_combat = FALSE)
+ if(stat == DEAD || HAS_TRAIT(src, TRAIT_INCAPACITATED) || HAS_TRAIT(src, TRAIT_FLOORED))
+ return
+ if(resting)
+ set_resting(FALSE)
+ if(!retreat)
+ walk_to(src, target ? target : get_turf(src), distance, move_to_delay)
+ return
+ if(!is_retreating)
+ is_retreating = TRUE
+ stop_automated_movement = TRUE
+ stance = HOSTILE_STANCE_ALERT
+ walk_away(src, target ? target : get_turf(src), distance, LIZARD_SPEED_RETREAT)
+ addtimer(CALLBACK(src, PROC_REF(stop_retreat), return_to_combat), time)
+
+//Proc that's called after the retreat has run its course.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/stop_retreat(return_to_combat = FALSE)
+ is_retreating = FALSE
+ //extinguishing is top priority
+ if(on_fire)
+ resist_fire()
+ return
+ if(!return_to_combat)
+ //can't retreat? go back to fighting
+ if(retreat_attempts >= 2)
+ FindTarget()
+ MoveToTarget()
+ retreat_attempts = 0
+ //seems like it's a life or death situation. we will stop trying to run away.
+ COOLDOWN_START(src, retreat_cooldown, 20 SECONDS)
+ return
+ //don't stop retreating if there are non-friendly carbons in view
+ for(var/mob/living/carbon/hostile_mob in view(7, src))
+ if(hostile_mob.faction in faction_group)
+ continue
+ MoveTo(hostile_mob, 10, TRUE, 3 SECONDS, FALSE)
+ retreat_attempts++
+ return
+ retreat_attempts = 0
+ LoseTarget()
+ else
+ FindTarget()
+ MoveToTarget()
+
+//Replaced walk_to() with MoveTo().
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/MoveToTarget()
+ stop_automated_movement = TRUE
+ if(!target_mob || SA_attackable(target_mob))
+ stance = HOSTILE_STANCE_IDLE
+ if(target_mob in ListTargets(10))
+ stance = HOSTILE_STANCE_ATTACKING
+ MoveTo(target_mob)
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/resist_fire()
+ visible_message(SPAN_NOTICE("[src] rolls frantically on the ground to extinguish itself!"))
+ adjust_fire_stacks(-10)
+ KnockDown(2)
+ Stun(2)
+
+///Ravaging attack, used for when a mob gets pounced or is on the ground.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/ravagingattack(mob/living/target)
+ if(is_ravaging || !isliving(target))
+ return
+ is_ravaging = TRUE
+ visible_message(SPAN_DANGER("[src] tears into [target] repeatedly!"))
+
+ var/successful_attacks = 0
+ for(var/times_to_attack = 3, times_to_attack > 0, times_to_attack--)
+ if(Adjacent(target))
+ var/damage = rand(melee_damage_lower, melee_damage_upper) * 0.4
+ var/attack_type = pick(ATTACK_SLASH, ATTACK_BITE)
+ attacktext = attack_type ? "claws" : "bites"
+ flick_attack_overlay(target, attack_type ? "slash" : "animalbite")
+ playsound(loc, attack_type ? "alien_claw_flesh" : "alien_bite", 25, 1)
+ target.handle_blood_splatter(get_dir(src.loc, target.loc))
+
+ if(target.body_position == LYING_DOWN)
+ target.apply_damage(damage, BRUTE)
+ target.apply_effect(1, DAZE)
+ shake_camera(target, 1, 2)
+
+ animation_attack_on(target)
+ face_atom(target)
+ sleep(0.5 SECONDS)
+ successful_attacks++
+ if(successful_attacks == 3 && !COOLDOWN_FINISHED(src, pounce_cooldown))
+ to_chat(src, SPAN_BOLDWARNING("The bloodlust invigorates you! You will be ready to pounce much sooner."))
+ COOLDOWN_START(src, pounce_cooldown, COOLDOWN_TIMELEFT(src, pounce_cooldown) * 0.5)
+ is_ravaging = FALSE
+
+//POUNCE PROCS AND WRAPPERS
+///////////////////////////
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/pounce(target)
+ if(stat == DEAD || HAS_TRAIT(src, TRAIT_INCAPACITATED) || HAS_TRAIT(src, TRAIT_FLOORED))
+ return
+ if(!COOLDOWN_FINISHED(src, pounce_cooldown))
+ to_chat(src, SPAN_WARNING("You can't pounce again that fast! You need to wait [COOLDOWN_SECONDSLEFT(src, pounce_cooldown)] seconds."))
+ return
+
+ COOLDOWN_START(src, pounce_cooldown, pounce_cooldown_length)
+ var/pounce_distance = clamp((get_dist(src, target)), 1, 5)
+ manual_emote("pounces at [target]!")
+ INVOKE_ASYNC(src, TYPE_PROC_REF(/atom/movable, throw_atom), target, pounce_distance, SPEED_FAST, src, null, LOW_LAUNCH, PASS_OVER_THROW_MOB, null, pounce_callbacks)
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/pounced_mob_wrapper(mob/living/pounced_mob)
+ pounced_mob(pounced_mob)
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/pounced_mob(mob/living/pounced_mob)
+ if(stat == DEAD || pounced_mob.stat == DEAD || pounced_mob.mob_size >= MOB_SIZE_BIG || pounced_mob == src)
+ throwing = FALSE
+ return
+
+ if(ishuman(pounced_mob) && (pounced_mob.dir in reverse_nearby_direction(dir)))
+ var/mob/living/carbon/human/human = pounced_mob
+ if(human.check_shields(15, "the pounce")) //Human shield block.
+ visible_message(SPAN_DANGER("[src] slams into [human]!"))
+ KnockDown(1)
+ Stun(1)
+ throwing = FALSE //Reset throwing manually.
+ playsound(human, "bonk", 75, FALSE) //bonk
+ return
+
+ if(isyautja(human))
+ if(human.check_shields(0, "the pounce", 1))
+ visible_message(SPAN_DANGER("[human] blocks the pounce of [src] with the combistick!"))
+ apply_effect(3, WEAKEN)
+ throwing = FALSE
+ playsound(human, "bonk", 75, FALSE)
+ return
+ else if(prob(75)) //Body slam.
+ visible_message(SPAN_DANGER("[human] body slams [src]!"))
+ KnockDown(3)
+ Stun(3)
+ throwing = FALSE
+ playsound(loc, 'sound/weapons/alien_knockdown.ogg', 25, 1)
+ return
+ if(iscolonysynthetic(human) && prob(60))
+ visible_message(SPAN_DANGER("[human] withstands being pounced and slams down [src]!"))
+ KnockDown(1.5)
+ Stun(1.5)
+ throwing = FALSE
+ playsound(loc, 'sound/weapons/alien_knockdown.ogg', 25, 1)
+ return
+
+ playsound(loc, "giant_lizard_hiss", 25)
+ pounced_mob.KnockDown(0.5)
+ step_to(src, pounced_mob)
+ if(!client)
+ ravagingattack(pounced_mob)
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/pounced_turf(turf/turf_target)
+ if(!turf_target.density)
+ for(var/mob/living/mob in turf_target)
+ pounced_mob(mob)
+ break
+ else
+ turf_launch_collision(turf_target)
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/pounced_turf_wrapper(turf/turf_target)
+ pounced_turf(turf_target)
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/pounced_obj_wrapper(obj/O)
+ pounced_obj(O)
+
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/proc/pounced_obj(obj/O)
+ // Unconscious or dead, or not throwing but used pounce
+ if(stat != CONSCIOUS)
+ obj_launch_collision(O)
+ return
+
+ if(!istype(O, /obj/structure/surface/table) && !istype(O, /obj/structure/surface/rack))
+ O.hitby(src) //This resets throwing.
+
+//Middle mouse button/shift click to pounce.
+/mob/living/simple_animal/hostile/retaliate/giant_lizard/click(atom/clicked_atom, list/mods)
+ if(mods["shift"] && !mods["middle"])
+ if(client && client.prefs && !(client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK))
+ pounce(clicked_atom)
+ return TRUE
+
+ if(mods["middle"] && !mods["shift"])
+ if(client && client.prefs && client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK)
+ pounce(clicked_atom)
+ return TRUE
+ return ..()
+
+
+///CLIENT EMOTES
+////////////////
+
+/datum/emote/living/giant_lizard
+ mob_type_allowed_typecache = list(/mob/living/simple_animal/hostile/retaliate/giant_lizard)
+
+/datum/emote/living/giant_lizard/growl
+ key = "growl"
+ message = "growls."
+ sound = "giant_lizard_growl"
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/giant_lizard/hiss
+ key = "hiss"
+ message = "hisses."
+ sound = "giant_lizard_hiss"
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+#undef ATTACK_SLASH
+#undef ATTACK_BITE
+#undef LIZARD_SPEED_NORMAL
+#undef LIZARD_SPEED_RETREAT
+#undef LIZARD_SPEED_NORMAL_CLIENT
+#undef LIZARD_SPEED_RETREAT_CLIENT
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm
index 4c16c60d4835..64ab6541b2d2 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm
@@ -27,7 +27,7 @@
continue
if(isliving(A))
var/mob/living/M = A
- if(!attack_same && M.faction != faction)
+ if(evaluate_target(M))
enemies |= M
for(var/mob/living/simple_animal/hostile/retaliate/H in around)
@@ -35,6 +35,7 @@
H.enemies |= enemies
return 0
-/mob/living/simple_animal/hostile/retaliate/adjustBruteLoss(damage)
- ..(damage)
+/mob/living/simple_animal/hostile/retaliate/apply_damage(damage, damagetype, def_zone, used_weapon, sharp, edge, force)
Retaliate()
+ return ..()
+
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index f3b8da1a2d76..878212e52d32 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -1,26 +1,49 @@
+#define OVERLAY_FIRE_LAYER -1
+
/mob/living/simple_animal
name = "animal"
icon = 'icons/mob/animal.dmi'
health = 20
maxHealth = 20
+ ///Higher speed is slower, negative speed is faster.
+ speed = 0
+
+
+ melee_damage_lower = 0
+ melee_damage_upper = 0
+ attacktext = "attacks"
+ attack_sound = null
+ //Attacktext is the mob deal 0 damaage.
+ friendly = "nuzzles"
+ can_crawl = FALSE
+ black_market_value = 25
+ dead_black_market_value = 0
+
+ mobility_flags = MOBILITY_FLAGS_LYING_CAPABLE_DEFAULT
+
var/icon_living = ""
var/icon_dead = ""
- var/icon_gib = null //We only try to show a gibbing animation if this exists.
+ var/icon_gib = null
var/list/speak = list()
var/speak_chance = 0
- var/list/emote_hear = list() //Hearable emotes
- var/list/emote_see = list() //Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps
+ ///Emotes that can be heard by other mobs.
+ var/list/emote_hear = list()
+ ///Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps.
+ var/list/emote_see = list()
var/turns_per_move = 1
var/turns_since_move = 0
universal_speak = 0 //No, just no.
var/meat_amount = 0
var/meat_type
- var/stop_automated_movement = 0 //Use this to temporarely stop random movement or to if you write special movement code for animals.
- var/wander = 1 // Does the mob wander around when idle?
- var/stop_automated_movement_when_pulled = 1 //When set to 1 this stops the animal from moving when someone is pulling it.
+ ///Use this to temporarely stop random movement or to if you write special movement code for animals.
+ var/stop_automated_movement = 0
+ ///Does the mob wander around when idle?
+ var/wander = 1
+ ///When set to 1 this stops the animal from moving when someone is pulling it.
+ var/stop_automated_movement_when_pulled = 1
//Interaction
var/response_help = "tries to help"
@@ -31,32 +54,27 @@
//Temperature effect
var/minbodytemp = 250
var/maxbodytemp = 350
- var/heat_damage_per_tick = 3 //amount of damage applied if animal's body temperature is higher than maxbodytemp
- var/cold_damage_per_tick = 2 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
+ ///amount of damage applied if animal's body temperature is higher than maxbodytemp
+ var/heat_damage_per_tick = 3
+ ///same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
+ var/cold_damage_per_tick = 2
+
+ ///Will this mob be affected by fire/napalm? Set to FALSE for all mobs as the implications could be weird due to not being tested for all simple mobs.
+ var/affected_by_fire = FALSE
//Atmos effect - Yes, you can make creatures that require phoron or co2 to survive. N2O is a trace gas and handled separately, hence why it isn't here. It'd be hard to add it. Hard and me don't mix (Yes, yes make all the dick jokes you want with that.) - Errorage
+ //Leaving something at 0 means it's off - has no maximum
var/min_oxy = 5
- var/max_oxy = 0 //Leaving something at 0 means it's off - has no maximum
+ var/max_oxy = 0
var/min_tox = 0
var/max_tox = 1
var/min_co2 = 0
var/max_co2 = 5
var/min_n2 = 0
var/max_n2 = 0
- var/unsuitable_atoms_damage = 2 //This damage is taken when atmos doesn't fit all the requirements above
- speed = 0 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster
-
- //LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
- melee_damage_lower = 0
- melee_damage_upper = 0
- attacktext = "attacks"
- attack_sound = null
- friendly = "nuzzles" //If the mob does no damage with it's attack
- can_crawl = FALSE
- black_market_value = 25
- dead_black_market_value = 0
-
- mobility_flags = MOBILITY_FLAGS_LYING_CAPABLE_DEFAULT
+ ///This damage is taken when atmos doesn't fit all the requirements above
+ var/unsuitable_atoms_damage = 2
+ var/fire_overlay
/mob/living/simple_animal/Initialize()
. = ..()
@@ -74,8 +92,63 @@
/mob/living/simple_animal/updatehealth()
return
-/mob/living/simple_animal/Life(delta_time)
+/mob/living/simple_animal/rejuvenate()
+ health = maxHealth
+ SSmob.living_misc_mobs += src
+ return ..()
+/mob/living/simple_animal/get_examine_text(mob/user)
+ . = ..()
+ if(stat == DEAD)
+ . += SPAN_BOLDWARNING("[user == src ? "You are" : "It is"] DEAD. Kicked the bucket.")
+ else
+ var/percent = floor((health / maxHealth * 100))
+ switch(percent)
+ if(95 to INFINITY)
+ . += SPAN_NOTICE("[user == src ? "You look" : "It looks"] quite healthy.")
+ if(75 to 94)
+ . += SPAN_NOTICE("[user == src ? "You look" : "It looks"] slightly injured.")
+ if(50 to 74)
+ . += SPAN_DANGER("[user == src ? "You look" : "It looks"] injured.")
+ if(25 to 49)
+ . += SPAN_DANGER("[user == src ? "You are bleeding" : "It bleeds"] with gory wounds.")
+ if(-INFINITY to 24)
+ . += SPAN_BOLDWARNING("[user == src ? "You are" : "It is"] heavily injured and limping badly.")
+
+/mob/living/simple_animal/handle_fire()
+ if(..())
+ return
+ apply_damage(fire_reagent.intensityfire * 0.5, BURN)
+
+/mob/living/simple_animal/IgniteMob()
+ if(!affected_by_fire)
+ return
+ return ..()
+
+/mob/living/simple_animal/update_fire()
+ if(!on_fire)
+ overlays -= fire_overlay
+ if(on_fire && fire_reagent)
+ var/image/fire_overlay_image
+ if(mob_size >= MOB_SIZE_BIG)
+ if((body_position != LYING_DOWN))
+ fire_overlay_image = image("icon"='icons/mob/xenos/overlay_effects64x64.dmi', "icon_state"="alien_fire", "layer" = OVERLAY_FIRE_LAYER)
+ else
+ fire_overlay_image = image("icon"='icons/mob/xenos/overlay_effects64x64.dmi', "icon_state"="alien_fire_lying", "layer" = OVERLAY_FIRE_LAYER)
+ else
+ fire_overlay_image = image("icon" = 'icons/mob/xenos/effects.dmi', "icon_state"="alien_fire", "layer" = OVERLAY_FIRE_LAYER)
+
+ fire_overlay_image.pixel_y -= pixel_y
+ fire_overlay_image.pixel_x -= pixel_x
+ fire_overlay_image.appearance_flags |= RESET_COLOR|RESET_ALPHA
+ fire_overlay_image.color = fire_reagent.burncolor
+ fire_overlay_image.color = fire_reagent.burncolor
+ overlays += fire_overlay_image
+ fire_overlay = fire_overlay_image
+
+/mob/living/simple_animal/Life(delta_time)
+ if(affected_by_fire)
+ handle_fire()
//Health
if(stat == DEAD)
if(health > 0)
@@ -240,32 +313,46 @@
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
apply_damage(damage, BRUTE)
-
-/mob/living/simple_animal/attack_hand(mob/living/carbon/human/M as mob)
+/mob/living/simple_animal/attack_hand(mob/living/carbon/human/attacking_mob)
..()
- switch(M.a_intent)
-
+ switch(attacking_mob.a_intent)
if(INTENT_HELP)
if (health > 0)
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(SPAN_NOTICE("[M] [response_help] [src]"), SHOW_MESSAGE_VISIBLE)
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 25, 1, 7)
+ visible_message(SPAN_NOTICE("[attacking_mob] [response_help] [src]."))
+ return 1
if(INTENT_GRAB)
- if(M == src || anchored)
- return 0
- M.start_pulling(src)
+ attacking_mob.start_pulling(src)
+ return 1
+ if(INTENT_DISARM)
+ visible_message(SPAN_NOTICE("[attacking_mob] [response_disarm] [src]."))
+ attacking_mob.animation_attack_on(src)
+ attacking_mob.flick_attack_overlay(src, "disarm")
return 1
- if(INTENT_HARM, INTENT_DISARM)
- apply_damage(harm_intent_damage, BRUTE)
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(SPAN_DANGER("[M] [response_harm] [src]"), SHOW_MESSAGE_VISIBLE)
+ if(INTENT_HARM)
+ var/datum/unarmed_attack/attack = attacking_mob.species.unarmed
+ if(!attack.is_usable(attacking_mob))
+ attack = attacking_mob.species.secondary_unarmed
+ return 0
- return
+ attacking_mob.animation_attack_on(src)
+ attacking_mob.flick_attack_overlay(src, "punch")
+
+ var/extra_cqc_dmg = 0
+ if(attacking_mob.skills)
+ extra_cqc_dmg = attacking_mob.skills?.get_skill_level(SKILL_CQC)
+ var/final_damage = 0
+
+ playsound(loc, attack.attack_sound, 25, 1)
+ visible_message(SPAN_DANGER("[attacking_mob] [response_harm] [src]!"), null, null, 5)
+
+ final_damage = attack.damage + extra_cqc_dmg + harm_intent_damage
+ apply_damage(final_damage, BRUTE, src, sharp = attack.sharp, edge = attack.edge)
+ return 1
/mob/living/simple_animal/can_be_pulled_by(mob/pulling_mob)
if(locate(/obj/item/explosive/plastic) in contents)
@@ -328,6 +415,9 @@
/mob/living/simple_animal/adjustBruteLoss(damage)
health = clamp(health - damage, 0, maxHealth)
+/mob/living/simple_animal/adjustFireLoss(damage)
+ health = clamp(health - damage, 0, maxHealth)
+
/mob/living/simple_animal/proc/SA_attackable(target_mob)
if (isliving(target_mob))
var/mob/living/L = target_mob
@@ -378,3 +468,5 @@
if(user && error_msg)
to_chat(user, SPAN_WARNING("You aren't sure how to inject this animal!"))
return FALSE
+
+#undef OVERLAY_FIRE_LAYER
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 297ff47c731c..c04a745ea126 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -3,6 +3,7 @@
layer = MOB_LAYER
animate_movement = 2
rebounds = TRUE
+ blocks_emissive = EMISSIVE_BLOCK_GENERIC
var/mob_flags = NO_FLAGS
var/datum/mind/mind
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 058f8ae4aabc..f1007ab2ad4f 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -477,7 +477,7 @@ GLOBAL_LIST_INIT(limb_types_by_name, list(
return TRUE
/mob/proc/can_see_reagents()
- return stat == DEAD || issynth(src) ||HAS_TRAIT(src, TRAIT_REAGENT_SCANNER) //Dead guys and synths can always see reagents
+ return stat == DEAD || issynth(src) || HAS_TRAIT(src, TRAIT_REAGENT_SCANNER) //Dead guys and synths can always see reagents
/**
* Examine a mob
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 4c2c83d18257..c11d07d64a23 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -188,6 +188,10 @@
var/J = job_pref_to_gear_preset()
if(isnull(preview_dummy))
preview_dummy = new()
+
+ preview_dummy.blocks_emissive = FALSE
+ preview_dummy.update_emissive_block()
+
clear_equipment()
if(refresh_limb_status)
for(var/obj/limb/L in preview_dummy.limbs)
diff --git a/code/modules/objectives/retrieve_items.dm b/code/modules/objectives/retrieve_items.dm
index 9f9f600eacc8..89b644843c5c 100644
--- a/code/modules/objectives/retrieve_items.dm
+++ b/code/modules/objectives/retrieve_items.dm
@@ -14,10 +14,10 @@
/area/almayer/medical/medical_science,
)
-/datum/cm_objective/retrieve_item/New(T)
- ..()
- if(T)
- target_item = T
+/datum/cm_objective/retrieve_item/New(atom/target)
+ . = ..()
+ if(target)
+ target_item = target
initial_area = get_area(target_item)
RegisterSignal(target_item, COMSIG_PARENT_PREQDELETED, PROC_REF(clean_up_ref))
@@ -74,7 +74,7 @@
qdel(src)
return
-/datum/cm_objective/retrieve_item/fulton/New()
+/datum/cm_objective/retrieve_item/fulton/New(atom/target)
. = ..()
GLOB.failed_fultons += target_item
activate()
@@ -93,10 +93,6 @@
return clue
-/datum/cm_objective/retrieve_item/fulton/complete()
- ..()
-
-
// -----------------------------------------------------------
// *** Documents and data disks after they have been read ***
// -----------------------------------------------------------
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 21ff73ab859e..8ff67fa4b91c 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -118,6 +118,8 @@ GLOBAL_LIST_INIT(apc_wire_descriptions, list(
var/printout = FALSE
power_machine = TRUE
+ light_range = 1
+ light_power = 0.5
appearance_flags = TILE_BOUND
@@ -426,6 +428,8 @@ GLOBAL_LIST_INIT(apc_wire_descriptions, list(
//2 if we need to update the overlays
if(!update)
return
+
+ set_light(0)
if(update & 1) //Updating the icon state
if(update_state & UPSTATE_ALLGOOD)
@@ -457,12 +461,32 @@ GLOBAL_LIST_INIT(apc_wire_descriptions, list(
overlays = 0
if(!(stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD)
- overlays += status_overlays_lock[locked + 1]
- overlays += status_overlays_charging[charging + 1]
+ var/image/_lock = status_overlays_lock[locked + 1]
+ var/image/_charging = status_overlays_charging[charging + 1]
+ var/image/_equipment = status_overlays_equipment[equipment + 1]
+ var/image/_lighting = status_overlays_lighting[lighting + 1]
+ var/image/_environ = status_overlays_environ[environ + 1]
+
+ overlays += emissive_appearance(_lock.icon, _lock.icon_state)
+ overlays += mutable_appearance(_lock.icon, _lock.icon_state)
+ overlays += emissive_appearance(_charging.icon, _charging.icon_state)
+ overlays += mutable_appearance(_charging.icon, _charging.icon_state)
if(operating)
- overlays += status_overlays_equipment[equipment + 1]
- overlays += status_overlays_lighting[lighting + 1]
- overlays += status_overlays_environ[environ + 1]
+ overlays += emissive_appearance(_equipment.icon, _equipment.icon_state)
+ overlays += mutable_appearance(_equipment.icon, _equipment.icon_state)
+ overlays += emissive_appearance(_lighting.icon, _lighting.icon_state)
+ overlays += mutable_appearance(_lighting.icon, _lighting.icon_state)
+ overlays += emissive_appearance(_environ.icon, _environ.icon_state)
+ overlays += mutable_appearance(_environ.icon, _environ.icon_state)
+
+ switch(charging)
+ if(APC_NOT_CHARGING)
+ set_light_color(LIGHT_COLOR_RED)
+ if(APC_CHARGING)
+ set_light_color(LIGHT_COLOR_BLUE)
+ if(APC_FULLY_CHARGED)
+ set_light_color(LIGHT_COLOR_GREEN)
+ set_light(initial(light_range))
/obj/structure/machinery/power/apc/proc/check_updates()
diff --git a/code/modules/projectiles/ammo_boxes/box_structures.dm b/code/modules/projectiles/ammo_boxes/box_structures.dm
index da0b700068b9..ada2c6aa7bf2 100644
--- a/code/modules/projectiles/ammo_boxes/box_structures.dm
+++ b/code/modules/projectiles/ammo_boxes/box_structures.dm
@@ -101,7 +101,7 @@
if(item_box.handfuls)
var/obj/item/ammo_magazine/AM = locate(/obj/item/ammo_magazine) in item_box.contents
if(AM)
- . += SPAN_INFO("It has roughly [floor(AM.current_rounds/5)] handfuls remaining.")
+ . += SPAN_INFO("It has roughly [floor(AM.current_rounds/AM.transfer_handful_amount)] handfuls remaining.")
else
. += SPAN_INFO("It has [length(item_box.contents)] magazines out of [item_box.num_of_magazines].")
if(burning)
diff --git a/code/modules/projectiles/ammo_boxes/grenade_packets.dm b/code/modules/projectiles/ammo_boxes/grenade_packets.dm
index 603e2e3a712f..91ea15e039b1 100644
--- a/code/modules/projectiles/ammo_boxes/grenade_packets.dm
+++ b/code/modules/projectiles/ammo_boxes/grenade_packets.dm
@@ -1,5 +1,5 @@
/obj/item/storage/box/packet
- icon = 'icons/obj/items/weapons/grenade.dmi'
+ icon = 'icons/obj/items/storage/packets.dmi'
icon_state = "hedp_packet"
w_class = SIZE_MEDIUM//fits into bags
storage_slots = 3
@@ -32,6 +32,7 @@ GLOBAL_LIST_INIT(grenade_packets, list(
/obj/item/storage/box/packet/hornet,
/obj/item/storage/box/packet/incendiary,
/obj/item/storage/box/packet/smoke,
+ /obj/item/storage/box/packet/foam,
/obj/item/storage/box/packet/phosphorus,
/obj/item/storage/box/packet/phosphorus/upp,
/obj/item/storage/box/packet/m15,
@@ -76,11 +77,17 @@ GLOBAL_LIST_INIT(grenade_packets, list(
content_type = /obj/item/explosive/grenade/smokebomb
/obj/item/storage/box/packet/phosphorus
- name = "\improper HPDP grenade packet"
- desc = "It contains three HPDP white phosphorus grenades."
- icon_state = "hpdp_packet"
+ name = "\improper WPDP grenade packet"
+ desc = "It contains three WPDP white phosphorus grenades."
+ icon_state = "wpdp_packet"
content_type = /obj/item/explosive/grenade/phosphorus/weak
+/obj/item/storage/box/packet/phosphorus/strong
+ name = "\improper CCDP grenade packet"
+ desc = "It contains three CCDP chemical compound grenades."
+ icon_state = "ccdp_packet"
+ content_type = /obj/item/explosive/grenade/phosphorus
+
/obj/item/storage/box/packet/phosphorus/upp
name = "\improper Type 8 WP grenade packet"
desc = "It contains three type 8 white phosphorus grenades."
@@ -97,6 +104,12 @@ GLOBAL_LIST_INIT(grenade_packets, list(
desc = "These little packets of joy were distributed in the 100th (Season 2) Issue of the Boots! magazine as commemorative rewards for subscribers. Nobody knows how anyone, at any point, never asked 'wait, is this a terrible idea?' during the process."
content_type = /obj/item/explosive/grenade/high_explosive/frag/toy
+/obj/item/storage/box/packet/foam
+ name = "\improper MFHS foam grenade packet"
+ desc = "It contains three MFHS metal-foam grenades."
+ icon_state = "mfhs_packet"
+ content_type = /obj/item/explosive/grenade/metal_foam
+
/obj/item/storage/box/packet/m15
name = "\improper M15 fragmentation grenade packet"
desc = "It contains three M15 fragmentation grenades. Handle with care."
diff --git a/code/modules/projectiles/ammo_boxes/misc_boxes.dm b/code/modules/projectiles/ammo_boxes/misc_boxes.dm
index defb82cf670d..77731ab7fa7b 100644
--- a/code/modules/projectiles/ammo_boxes/misc_boxes.dm
+++ b/code/modules/projectiles/ammo_boxes/misc_boxes.dm
@@ -163,6 +163,19 @@
/obj/item/ammo_box/magazine/misc/flashlight/empty
empty = TRUE
+/obj/item/ammo_box/magazine/misc/flashlight/combat
+ name = "\improper box of combat flashlights"
+ desc = "A box of flashlights to brighten your day!"
+ magazine_type = /obj/item/device/flashlight/combat
+ num_of_magazines = 8
+ icon_state = "flashlightbox_combat"
+ icon_state_deployed = "flashlightbox_combat_deployed"
+ overlay_content = "_flashlight"
+
+/obj/item/ammo_box/magazine/misc/flashlight/combat/empty
+ empty = TRUE
+
+
//------------------------Battery Box--------------------------
/obj/item/ammo_box/magazine/misc/power_cell
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index aff7deeae3b5..80fce329e8cf 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -1420,7 +1420,7 @@ and you're good to go.
if(projectile_to_fire.ammo.bonus_projectiles_amount)
var/obj/projectile/BP
for(var/i in 1 to projectile_to_fire.ammo.bonus_projectiles_amount)
- BP = new /obj/projectile(attacked_mob.loc, create_cause_data(initial(name), user))
+ BP = new /obj/projectile(null, create_cause_data(initial(name), user))
BP.generate_bullet(GLOB.ammo_list[projectile_to_fire.ammo.bonus_projectiles_type], 0, NO_FLAGS)
BP.accuracy = floor(BP.accuracy * projectile_to_fire.accuracy/initial(projectile_to_fire.accuracy)) //Modifies accuracy of pellets per fire_bonus_projectiles.
BP.damage *= damage_buff
diff --git a/code/modules/projectiles/gun_attachables.dm b/code/modules/projectiles/gun_attachables.dm
index e2108364e9ac..757ccd10394b 100644
--- a/code/modules/projectiles/gun_attachables.dm
+++ b/code/modules/projectiles/gun_attachables.dm
@@ -2386,6 +2386,33 @@ Defined in conflicts.dm of the #defines folder.
/obj/item/attachable/stock/type71/New()
..()
+/obj/item/attachable/stock/m60
+ name = "M60 stock"
+ desc = "This isn't supposed to be separated from the gun, how'd this happen?"
+ icon = 'icons/obj/items/weapons/guns/attachments/stock.dmi'
+ icon_state = "m60_stock"
+ attach_icon = "m60_stock"
+ slot = "stock"
+ wield_delay_mod = WIELD_DELAY_NONE
+ flags_attach_features = NO_FLAGS
+ melee_mod = 15
+ size_mod = 0
+
+
+/obj/item/attachable/stock/ppsh
+ name = "PPSh-17b stock"
+ desc = "This isn't supposed to be separated from the gun, how'd this happen?"
+ icon = 'icons/obj/items/weapons/guns/attachments/stock.dmi'
+ icon_state = "ppsh17b_stock"
+ attach_icon = "ppsh17b_stock"
+ slot = "stock"
+ wield_delay_mod = WIELD_DELAY_NONE
+ flags_attach_features = NO_FLAGS
+ melee_mod = 10
+ size_mod = 0
+
+
+
/obj/item/attachable/stock/smg
name = "submachinegun stock"
desc = "A rare ARMAT stock distributed in small numbers to USCM forces. Compatible with the M39, this stock reduces recoil and improves accuracy, but at a reduction to handling and agility. Seemingly a bit more effective in a brawl"
diff --git a/code/modules/projectiles/guns/boltaction.dm b/code/modules/projectiles/guns/boltaction.dm
index a1b8705240a4..a165a112f354 100644
--- a/code/modules/projectiles/guns/boltaction.dm
+++ b/code/modules/projectiles/guns/boltaction.dm
@@ -42,7 +42,7 @@
var/has_openbolt_icon = TRUE
/obj/item/weapon/gun/boltaction/set_gun_attachment_offsets()
- attachable_offset = list("muzzle_x" = 32, "muzzle_y" = 17,"rail_x" = 5, "rail_y" = 18, "under_x" = 25, "under_y" = 14, "stock_x" = 18, "stock_y" = 10)
+ attachable_offset = list("muzzle_x" = 32, "muzzle_y" = 17,"rail_x" = 5, "rail_y" = 18, "under_x" = 25, "under_y" = 14, "stock_x" = 20, "stock_y" = 9)
/obj/item/weapon/gun/boltaction/Initialize(mapload, spawn_empty)
. = ..()
diff --git a/code/modules/projectiles/guns/misc.dm b/code/modules/projectiles/guns/misc.dm
index 5503ab03a1da..f61c0735ade9 100644
--- a/code/modules/projectiles/guns/misc.dm
+++ b/code/modules/projectiles/guns/misc.dm
@@ -83,6 +83,7 @@
starting_attachment_types = list(
/obj/item/attachable/m60barrel,
/obj/item/attachable/bipod/m60,
+ /obj/item/attachable/stock/m60,
)
start_semiauto = FALSE
start_automatic = TRUE
@@ -95,7 +96,7 @@
load_into_chamber()
/obj/item/weapon/gun/m60/set_gun_attachment_offsets()
- attachable_offset = list("muzzle_x" = 34, "muzzle_y" = 16,"rail_x" = 0, "rail_y" = 0, "under_x" = 39, "under_y" = 7, "stock_x" = 0, "stock_y" = 0)
+ attachable_offset = list("muzzle_x" = 37, "muzzle_y" = 16, "rail_x" = 0, "rail_y" = 0, "under_x" = 27, "under_y" = 12, "stock_x" = 10, "stock_y" = 14)
/obj/item/weapon/gun/m60/set_gun_config_values()
@@ -147,9 +148,9 @@
/obj/item/weapon/gun/m60/update_icon()
. = ..()
if(cover_open)
- overlays += "+[base_gun_icon]_cover_open"
+ overlays += image("+[base_gun_icon]_cover_open", pixel_x = -2, pixel_y = 8)
else
- overlays += "+[base_gun_icon]_cover_closed"
+ overlays += image("+[base_gun_icon]_cover_closed", pixel_x = -10, pixel_y = 0)
/obj/item/weapon/gun/m60/able_to_fire(mob/living/user)
. = ..()
diff --git a/code/modules/projectiles/guns/revolvers.dm b/code/modules/projectiles/guns/revolvers.dm
index 1c2adc2360a3..2f762cc7aac8 100644
--- a/code/modules/projectiles/guns/revolvers.dm
+++ b/code/modules/projectiles/guns/revolvers.dm
@@ -314,7 +314,7 @@
var/folded = FALSE // Used for the stock attachment, to check if we can shoot or not
/obj/item/weapon/gun/revolver/m44/set_gun_attachment_offsets()
- attachable_offset = list("muzzle_x" = 29, "muzzle_y" = 21,"rail_x" = 12, "rail_y" = 23, "under_x" = 21, "under_y" = 18, "stock_x" = 16, "stock_y" = 20)
+ attachable_offset = list("muzzle_x" = 29, "muzzle_y" = 21,"rail_x" = 12, "rail_y" = 23, "under_x" = 21, "under_y" = 16, "stock_x" = 16, "stock_y" = 20)
/obj/item/weapon/gun/revolver/m44/set_gun_config_values()
..()
@@ -498,7 +498,7 @@
desc = "A lean .38 made by Smith & Wesson. A timeless classic, from antiquity to the future. This specific model is known to be wildly inaccurate, yet extremely lethal."
icon = 'icons/obj/items/weapons/guns/guns_by_faction/colony.dmi'
icon_state = "sw357"
- item_state = "ny762" //PLACEHOLDER
+ item_state = "sw357"
fire_sound = 'sound/weapons/gun_44mag2.ogg'
current_mag = /obj/item/ammo_magazine/internal/revolver/small
force = 6
diff --git a/code/modules/projectiles/guns/rifles.dm b/code/modules/projectiles/guns/rifles.dm
index 44d6ef845b94..e514a68879fb 100644
--- a/code/modules/projectiles/guns/rifles.dm
+++ b/code/modules/projectiles/guns/rifles.dm
@@ -858,9 +858,9 @@
/obj/item/weapon/gun/rifle/mar40/lmg/set_gun_config_values()
..()
- set_fire_delay(FIRE_DELAY_TIER_9)
+ set_fire_delay(FIRE_DELAY_TIER_LMG)
set_burst_amount(BURST_AMOUNT_TIER_5)
- set_burst_delay(FIRE_DELAY_TIER_11)
+ set_burst_delay(FIRE_DELAY_TIER_LMG)
accuracy_mult = BASE_ACCURACY_MULT
accuracy_mult_unwielded = BASE_ACCURACY_MULT - HIT_ACCURACY_MULT_TIER_7
scatter = SCATTER_AMOUNT_TIER_6
@@ -1267,7 +1267,12 @@
recoil_unwielded = RECOIL_AMOUNT_TIER_1
-
+/obj/item/weapon/gun/rifle/lmg/tactical
+ current_mag = /obj/item/ammo_magazine/rifle/lmg/ap
+ starting_attachment_types = list(/obj/item/attachable/magnetic_harness, /obj/item/attachable/suppressor, /obj/item/attachable/angledgrip)
+/obj/item/weapon/gun/rifle/lmg/tactical/set_gun_config_values()
+ ..()
+ damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_2//equal to m41a dmg
//-------------------------------------------------------
diff --git a/code/modules/projectiles/guns/smartgun.dm b/code/modules/projectiles/guns/smartgun.dm
index 7c628463b1ef..b2d228e27a26 100644
--- a/code/modules/projectiles/guns/smartgun.dm
+++ b/code/modules/projectiles/guns/smartgun.dm
@@ -717,7 +717,7 @@
requires_harness = FALSE
/obj/item/smartgun_battery
- name = "smartgun DV9 battery"
+ name = "\improper DV9 smartgun battery"
desc = "A standard-issue 9-volt lithium dry-cell battery, most commonly used within the USCMC to power smartguns. Per the manual, one battery is good for up to 50000 rounds and plugs directly into the smartgun's power receptacle, which is only compatible with this type of battery. Various auxiliary modes usually bring the round count far lower. While this cell is incompatible with most standard electrical system, it can be charged by common rechargers in a pinch. USCMC smartgunners often guard them jealously."
icon = 'icons/obj/structures/machinery/power.dmi'
diff --git a/code/modules/projectiles/guns/smgs.dm b/code/modules/projectiles/guns/smgs.dm
index 6d125e6915c3..6be0f979c7ad 100644
--- a/code/modules/projectiles/guns/smgs.dm
+++ b/code/modules/projectiles/guns/smgs.dm
@@ -265,10 +265,11 @@
fire_sound = 'sound/weapons/smg_heavy.ogg'
current_mag = /obj/item/ammo_magazine/smg/ppsh
flags_gun_features = GUN_CAN_POINTBLANK|GUN_ANTIQUE
+ starting_attachment_types = list(/obj/item/attachable/stock/ppsh)
var/jammed = FALSE
/obj/item/weapon/gun/smg/ppsh/set_gun_attachment_offsets()
- attachable_offset = list("muzzle_x" = 33, "muzzle_y" = 17,"rail_x" = 15, "rail_y" = 19, "under_x" = 26, "under_y" = 15, "stock_x" = 26, "stock_y" = 15)
+ attachable_offset = list("muzzle_x" = 33, "muzzle_y" = 17,"rail_x" = 15, "rail_y" = 19, "under_x" = 26, "under_y" = 15, "stock_x" = 18, "stock_y" = 15)
/obj/item/weapon/gun/smg/ppsh/set_gun_config_values()
..()
@@ -460,7 +461,7 @@
aim_slowdown = SLOWDOWN_ADS_NONE
/obj/item/weapon/gun/smg/mac15/set_gun_attachment_offsets()
- attachable_offset = list("muzzle_x" = 32, "muzzle_y" = 20,"rail_x" = 16, "rail_y" = 22, "under_x" = 22, "under_y" = 16, "stock_x" = 22, "stock_y" = 16)
+ attachable_offset = list("muzzle_x" = 29, "muzzle_y" = 21,"rail_x" = 13, "rail_y" = 24, "under_x" = 19, "under_y" = 18, "stock_x" = 22, "stock_y" = 16)
/obj/item/weapon/gun/smg/mac15/set_gun_config_values()
..()
diff --git a/code/modules/projectiles/magazines/lever_action.dm b/code/modules/projectiles/magazines/lever_action.dm
index 2eb2d25a28f8..ac1d57dbd412 100644
--- a/code/modules/projectiles/magazines/lever_action.dm
+++ b/code/modules/projectiles/magazines/lever_action.dm
@@ -52,6 +52,7 @@ Similar to shotguns.dm but not exactly.
icon_state = "458-box"
item_state = "458-box"
default_ammo = /datum/ammo/bullet/lever_action/xm88
+ max_rounds = 100
caliber = ".458"
gun_type = /obj/item/weapon/gun/lever_action/xm88
handful_state = "boomslang_bullet"
diff --git a/code/modules/projectiles/magazines/revolvers.dm b/code/modules/projectiles/magazines/revolvers.dm
index 07fc75a50fad..f4dfea4e20fb 100644
--- a/code/modules/projectiles/magazines/revolvers.dm
+++ b/code/modules/projectiles/magazines/revolvers.dm
@@ -24,6 +24,7 @@
/obj/item/ammo_magazine/revolver/heavy
name = "\improper M44 heavy speed loader (.44)"
+ desc = "A revolver speed loader containing heavy bullets. While less damaging overall than the traditional rounds, they are more accurate."
default_ammo = /datum/ammo/bullet/revolver/heavy
caliber = ".44"
ammo_band_color = REVOLVER_TIP_COLOR_HEAVY
diff --git a/code/modules/projectiles/magazines/rifles.dm b/code/modules/projectiles/magazines/rifles.dm
index d12f390ccd95..60be8ed6c1ad 100644
--- a/code/modules/projectiles/magazines/rifles.dm
+++ b/code/modules/projectiles/magazines/rifles.dm
@@ -274,8 +274,15 @@
max_rounds = 200
ammo_band_color = AMMO_BAND_COLOR_HOLOTARGETING
+/obj/item/ammo_magazine/rifle/lmg/ap
+ name = "\improper M41AE2 ammo box (10x24mm armor-piercing)"
+ desc = "A semi-rectangular box of armor-piercing rounds for the M41AE2 Heavy Pulse Rifle."
+ default_ammo = /datum/ammo/bullet/rifle/ap
+ max_rounds = 300
+ ammo_band_color = AMMO_BAND_COLOR_AP
+
/obj/item/ammo_magazine/rifle/lmg/heap
- name = "\improper M41AE2 HEAP ammo box (10x24mm)"
+ name = "\improper M41AE2 ammo box (10x24mm high-explosive armor-piercing)"
desc = "A semi-rectangular box of rounds for the M41AE2 Heavy Pulse Rifle. This one contains the standard Armor-Piercing explosive tipped round of the USCM."
default_ammo = /datum/ammo/bullet/rifle/heap
max_rounds = 300
diff --git a/code/modules/reagents/chemistry_machinery/xenomorph_analyzer.dm b/code/modules/reagents/chemistry_machinery/xenomorph_analyzer.dm
index 62ceb37386ff..3ba09227f63d 100644
--- a/code/modules/reagents/chemistry_machinery/xenomorph_analyzer.dm
+++ b/code/modules/reagents/chemistry_machinery/xenomorph_analyzer.dm
@@ -96,9 +96,8 @@
data["upgrades"] += list(list(
"name" = capitalize_first_letters(upgrade.name),
"desc" = upgrade.desc,
- "vari" = upgrade.on_init_argument,
"cost" = price_adjustment,
- "ref" = upgrade.item_reference,
+ "ref" = upgrade_type,
"category" = upgrade.upgrade_type,
"clearance" = upgrade.clearance_req,
"price_change" = upgrade.change_purchase,
@@ -125,7 +124,7 @@
. = TRUE
if("produce")
if(!busy)
- start_print_upgrade(text2path(params["ref"]), usr, text2num(params["vari"]))
+ start_print_upgrade(text2path(params["ref"]), usr)
playsound(src, 'sound/machines/keyboard2.ogg', 25, TRUE)
/obj/structure/machinery/xenoanalyzer/proc/eject_biomass(mob/user)
@@ -144,7 +143,7 @@
busy = FALSE
-/obj/structure/machinery/xenoanalyzer/proc/start_print_upgrade(produce_path, mob/user, variation)
+/obj/structure/machinery/xenoanalyzer/proc/start_print_upgrade(produce_path, mob/user)
if(stat & NOPOWER)
icon_state = "xeno_analyzer_off"
return
@@ -158,7 +157,7 @@
upgrade = datum_upgrades
if(upgrade.behavior == RESEARCH_UPGRADE_CATEGORY || upgrade.behavior == RESEARCH_UPGRADE_EXCLUDE_BUY)
continue
- if(produce_path == upgrade.item_reference && upgrade.on_init_argument == variation)
+ if(produce_path == datum_upgrades)
path_exists = TRUE
break
if(!path_exists)
@@ -174,12 +173,10 @@
busy = TRUE
biomass_points -= clamp(upgrade.value_upgrade + upgrade.change_purchase * technology_purchased[datum_upgrades], upgrade.minimum_price, upgrade.maximum_price)
technology_purchased[datum_upgrades] += 1
- addtimer(CALLBACK(src, PROC_REF(print_upgrade), produce_path, variation), 3 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(print_upgrade), produce_path), 3 SECONDS)
-/obj/structure/machinery/xenoanalyzer/proc/print_upgrade(produce_path, variation)
+/obj/structure/machinery/xenoanalyzer/proc/print_upgrade(produce_path)
busy = FALSE
- if(variation != RESEARCH_UPGRADE_NOTHING_TO_PASS)
- new produce_path(get_turf(src), variation)
- return
- new produce_path(get_turf(src))
+ var/datum/research_upgrades/item = new produce_path()
+ item.on_purchase(get_turf(src))
diff --git a/code/modules/reagents/chemistry_properties/prop_neutral.dm b/code/modules/reagents/chemistry_properties/prop_neutral.dm
index 7bebb786aa34..9410f6f43ce7 100644
--- a/code/modules/reagents/chemistry_properties/prop_neutral.dm
+++ b/code/modules/reagents/chemistry_properties/prop_neutral.dm
@@ -531,11 +531,11 @@
..()
chem_host.pain.recalculate_pain()
- remove_verb(chem_host, /mob/living/carbon/human/proc/psychic_whisper)
+ remove_action(chem_host, /datum/action/human_action/psychic_whisper)
to_chat(chem_host, SPAN_NOTICE("The pain in your head subsides, and you are left feeling strangely alone."))
/datum/chem_property/neutral/encephalophrasive/reaction_mob(mob/chem_host, method=INGEST, volume, potency)
- add_verb(chem_host, /mob/living/carbon/human/proc/psychic_whisper)
+ give_action(chem_host, /datum/action/human_action/psychic_whisper)
to_chat(chem_host, SPAN_NOTICE("A terrible headache manifests, and suddenly it feels as though your mind is outside of your skull."))
/datum/chem_property/neutral/encephalophrasive/process(mob/living/chem_host, potency = 1, delta_time)
diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm
index 051befa14fba..843332272453 100644
--- a/code/modules/reagents/chemistry_properties/prop_positive.dm
+++ b/code/modules/reagents/chemistry_properties/prop_positive.dm
@@ -603,7 +603,7 @@
var/mob/dead/observer/ghost = dead.get_ghost()
if(ghost?.client)
COOLDOWN_START(src, ghost_notif, 30 SECONDS)
- playsound_client(ghost.client, 'sound/effects/adminhelp_new.ogg')
+ playsound_client(ghost.client, 'sound/effects/revive_notify.ogg')
to_chat(ghost, SPAN_BOLDNOTICE("Your heart is struggling to pump! There is a chance you might get up!(Verbs -> Ghost -> Re-enter corpse, or click here!)"))
return TRUE
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index dfb0ed8288b0..b0cd265974ea 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -1,7 +1,7 @@
/obj/structure/bigDelivery
desc = "A big wrapped package."
name = "large parcel"
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/structures/crates.dmi'
icon_state = "deliverycloset"
var/obj/wrapped = null
density = TRUE
@@ -71,7 +71,7 @@
/obj/structure/bigDelivery/update_icon()
overlays = new()
if(nameset || examtext)
- var/image/I = new/image('icons/obj/items/storage.dmi',"delivery_label")
+ var/image/I = new/image('icons/obj/structures/crates.dmi',"delivery_label")
if(icon_state == "deliverycloset")
I.pixel_x = 2
if(label_y == null)
@@ -84,7 +84,7 @@
I.pixel_y = -3
overlays += I
if(src.sortTag)
- var/image/I = new/image('icons/obj/items/storage.dmi',"delivery_tag")
+ var/image/I = new/image('icons/obj/structures/crates.dmi',"delivery_tag")
if(icon_state == "deliverycloset")
if(tag_x == null)
tag_x = rand(-2, 3)
@@ -108,7 +108,7 @@
/obj/item/smallDelivery
desc = "A small wrapped package."
name = "small parcel"
- icon = 'icons/obj/items/storage.dmi'
+ icon = 'icons/obj/structures/crates.dmi'
icon_state = "deliverycrate3"
var/obj/item/wrapped = null
var/sortTag = null
@@ -180,12 +180,12 @@
/obj/item/smallDelivery/update_icon()
overlays = new()
if((nameset || examtext) && icon_state != "deliverycrate1")
- var/image/I = new/image('icons/obj/items/storage.dmi',"delivery_label")
+ var/image/I = new/image('icons/obj/structures/crates.dmi',"delivery_label")
if(icon_state == "deliverycrate5")
I.pixel_y = -1
overlays += I
if(src.sortTag)
- var/image/I = new/image('icons/obj/items/storage.dmi',"delivery_tag")
+ var/image/I = new/image('icons/obj/structures/crates.dmi',"delivery_tag")
switch(icon_state)
if("deliverycrate1")
I.pixel_y = -5
diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm
index 1a4881904801..c566e20d1f9f 100644
--- a/code/modules/security_levels/keycard_authentication.dm
+++ b/code/modules/security_levels/keycard_authentication.dm
@@ -1,6 +1,6 @@
/obj/structure/machinery/keycard_auth
name = "Keycard Authentication Device"
- desc = "This device is used to trigger station functions, which require more than one ID card to authenticate."
+ desc = "This device is used to trigger station functions, which require multiple swipes of an ID card to authenticate."
icon = 'icons/obj/structures/machinery/monitors.dmi'
icon_state = "auth_off"
unacidable = TRUE
@@ -36,9 +36,6 @@
if(active == 1)
//This is not the device that made the initial request. It is the device confirming the request.
if(event_source)
- if(event_source.event_triggered_by == user)
- user.visible_message(SPAN_DANGER("Your ID is rejected, as it is the one that triggered the event!"))
- return
event_source.confirmed = 1
event_source.event_confirmed_by = user
else if(screen == 2)
diff --git a/code/modules/shuttle/dropship.dm b/code/modules/shuttle/dropship.dm
index cbca500f8f71..b8c920f2684c 100644
--- a/code/modules/shuttle/dropship.dm
+++ b/code/modules/shuttle/dropship.dm
@@ -215,3 +215,108 @@
/obj/structure/shuttle/part/dropship2/transparent/right_outer_bottom_wing
icon_state = "6"
+
+/obj/structure/shuttle/part/dropship3
+ name = "\improper Saipan"
+ icon = 'icons/turf/dropship3.dmi'
+ icon_state = "1"
+ opacity = TRUE
+
+/obj/structure/shuttle/part/dropship3/ex_act(severity, direction)
+ return FALSE
+
+/obj/structure/shuttle/part/dropship3/transparent
+ opacity = FALSE
+
+/obj/structure/shuttle/part/dropship3/transparent/nose_top_right
+ icon_state = "102"
+
+/obj/structure/shuttle/part/dropship3/transparent/nose_center
+ icon_state = "101"
+
+/obj/structure/shuttle/part/dropship3/transparent/nose_top_left
+ icon_state = "100"
+
+/obj/structure/shuttle/part/dropship3/nose_front_left
+ icon_state = "95"
+
+/obj/structure/shuttle/part/dropship3/nose_front_right
+ icon_state = "99"
+
+/obj/structure/shuttle/part/dropship3/transparent/inner_right_weapons
+ icon_state = "90"
+
+/obj/structure/shuttle/part/dropship3/transparent/outer_right_weapons
+ icon_state = "91"
+
+/obj/structure/shuttle/part/dropship3/transparent/inner_left_weapons
+ icon_state = "85"
+
+/obj/structure/shuttle/part/dropship3/transparent/outer_left_weapons
+ icon_state = "84"
+
+/obj/structure/shuttle/part/dropship3/transparent/upper_right_wing
+ icon_state = "74"
+
+/obj/structure/shuttle/part/dropship3/transparent/middle_right_wing
+ icon_state = "70"
+
+/obj/structure/shuttle/part/dropship3/transparent/lower_right_wing
+ icon_state = "65"
+
+/obj/structure/shuttle/part/dropship3/transparent/upper_left_wing
+ icon_state = "71"
+
+/obj/structure/shuttle/part/dropship3/transparent/middle_left_wing
+ icon_state = "66"
+
+/obj/structure/shuttle/part/dropship3/transparent/lower_left_wing
+ icon_state = "61"
+
+/obj/structure/shuttle/part/dropship3/lower_left_wall
+ icon_state = "46"
+
+/obj/structure/shuttle/part/dropship3/lower_right_wall
+ icon_state = "49"
+
+/obj/structure/shuttle/part/dropship3/transparent/engine_left_cap
+ icon_state = "40"
+
+/obj/structure/shuttle/part/dropship3/transparent/engine_right_cap
+ icon_state = "41"
+
+/obj/structure/shuttle/part/dropship3/transparent/engine_left_exhaust
+ icon_state = "16"
+
+/obj/structure/shuttle/part/dropship3/transparent/engine_right_exhaust
+ icon_state = "17"
+
+/obj/structure/shuttle/part/dropship3/bottom_left_wall
+ icon_state = "9"
+
+/obj/structure/shuttle/part/dropship3/bottom_right_wall
+ icon_state = "15"
+
+/obj/structure/shuttle/part/dropship3/left_inner_wing_connector
+ icon_state = "7"
+
+/obj/structure/shuttle/part/dropship3/right_inner_wing_connector
+ icon_state = "8"
+
+/obj/structure/shuttle/part/dropship3/left_outer_wing_connector
+ icon_state = "3"
+
+/obj/structure/shuttle/part/dropship3/right_outer_wing_connector
+ icon_state = "4"
+
+/obj/structure/shuttle/part/dropship3/transparent/left_outer_bottom_wing
+ icon_state = "1"
+
+/obj/structure/shuttle/part/dropship3/transparent/left_outer_inner_wing
+ icon_state = "2"
+
+/obj/structure/shuttle/part/dropship3/transparent/right_inner_bottom_wing
+ icon_state = "5"
+
+/obj/structure/shuttle/part/dropship3/transparent/right_outer_bottom_wing
+ icon_state = "6"
diff --git a/code/modules/shuttle/shuttles/dropship.dm b/code/modules/shuttle/shuttles/dropship.dm
index 86e869b3361e..a1405d7e4e23 100644
--- a/code/modules/shuttle/shuttles/dropship.dm
+++ b/code/modules/shuttle/shuttles/dropship.dm
@@ -146,6 +146,14 @@
/obj/docking_port/mobile/marine_dropship/normandy/get_transit_path_type()
return /turf/open/space/transit/dropship/normandy
+/obj/docking_port/mobile/marine_dropship/saipan
+ name = "Saipan"
+ id = DROPSHIP_SAIPAN
+ preferred_direction = SOUTH // If you are changing this, please update the dir of the path below as well
+
+/obj/docking_port/mobile/marine_dropship/saipan/get_transit_path_type()
+ return /turf/open/space/transit/dropship/saipan
+
/obj/docking_port/mobile/marine_dropship/check()
. = ..()
@@ -327,3 +335,7 @@
/datum/map_template/shuttle/normandy
name = "Normandy"
shuttle_id = DROPSHIP_NORMANDY
+
+/datum/map_template/shuttle/saipan
+ name = "Saipan"
+ shuttle_id = DROPSHIP_SAIPAN
diff --git a/code/modules/shuttle/shuttles/ert.dm b/code/modules/shuttle/shuttles/ert.dm
index f0224addadf6..e526c89b5bd9 100644
--- a/code/modules/shuttle/shuttles/ert.dm
+++ b/code/modules/shuttle/shuttles/ert.dm
@@ -169,6 +169,7 @@
port_direction = NORTH
width = 17
height = 29
+ dwidth = 8
var/port_door
var/starboard_door
diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm
index 502d7c1ffde4..cc7d90e93080 100644
--- a/code/modules/shuttles/shuttle_console.dm
+++ b/code/modules/shuttles/shuttle_console.dm
@@ -396,6 +396,30 @@ GLOBAL_LIST_EMPTY(shuttle_controls)
onboard = 1
density = TRUE
+/obj/structure/machinery/computer/shuttle_control/dropship3
+ name = "\improper 'Saipan' dropship console"
+ desc = "The remote controls for the 'Saipan' Dropship."
+ icon = 'icons/obj/structures/machinery/computer.dmi'
+ icon_state = "shuttle"
+
+ shuttle_type = SHUTTLE_DROPSHIP
+ unslashable = TRUE
+ unacidable = TRUE
+ exproof = 1
+ req_one_access = list(ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP)
+
+/obj/structure/machinery/computer/shuttle_control/dropship3/Initialize()
+ . = ..()
+ shuttle_tag = DROPSHIP_SAIPAN
+
+/obj/structure/machinery/computer/shuttle_control/dropship3/onboard
+ name = "\improper 'Saipan' flight controls"
+ desc = "The flight controls for the 'Saipan' Dropship."
+ icon = 'icons/obj/structures/machinery/shuttle-parts.dmi'
+ icon_state = "console"
+ onboard = 1
+ density = TRUE
+
//Elevator control console
/obj/structure/machinery/computer/shuttle_control/ice_colony
diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm
index 55711ba7ecc6..7c829ad13e42 100644
--- a/code/modules/unit_tests/create_and_destroy.dm
+++ b/code/modules/unit_tests/create_and_destroy.dm
@@ -31,7 +31,6 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE)
// fuck interiors
ignore += typesof(/obj/vehicle)
ignore += typesof(/obj/effect/vehicle_spawner)
- ignore += typesof(/obj/structure/closet/fancy)
// Always ought to have an associated escape menu. Any references it could possibly hold would need one regardless.
ignore += subtypesof(/atom/movable/screen/escape_menu)
diff --git a/code/modules/vehicles/hardpoints/hardpoint_ammo/minigun_ammo.dm b/code/modules/vehicles/hardpoints/hardpoint_ammo/minigun_ammo.dm
index 78222cdb3a40..b3f31d824ebf 100644
--- a/code/modules/vehicles/hardpoints/hardpoint_ammo/minigun_ammo.dm
+++ b/code/modules/vehicles/hardpoints/hardpoint_ammo/minigun_ammo.dm
@@ -5,6 +5,6 @@
caliber = "7.62x51mm" //Correlates to miniguns
icon_state = "painless"
w_class = SIZE_LARGE //Primary weapon ammo should probably all be the same w_class
- default_ammo = /datum/ammo/bullet/minigun/tank
+ default_ammo = /datum/ammo/bullet/tank/minigun
max_rounds = 500
gun_type = /obj/item/hardpoint/primary/minigun
diff --git a/code/modules/vehicles/hardpoints/primary/minigun.dm b/code/modules/vehicles/hardpoints/primary/minigun.dm
index 8bc7c55bbb8a..be44b86e2435 100644
--- a/code/modules/vehicles/hardpoints/primary/minigun.dm
+++ b/code/modules/vehicles/hardpoints/primary/minigun.dm
@@ -26,16 +26,16 @@
"8" = list(-77, 0)
)
- scatter = 7
+ scatter = 18
gun_firemode = GUN_FIREMODE_AUTOMATIC
gun_firemode_list = list(
GUN_FIREMODE_AUTOMATIC,
)
- fire_delay = 0.8 SECONDS //base fire rate, modified by stage_delay_mult
+ fire_delay = 0.7 SECONDS //base fire rate, modified by stage_delay_mult
activation_sounds = list('sound/weapons/gun_minigun.ogg')
/// Active firing time to reach max spin_stage.
- var/spinup_time = 8 SECONDS
+ var/spinup_time = 10 SECONDS
/// Grace period before losing spin_stage.
var/spindown_grace_time = 2 SECONDS
COOLDOWN_DECLARE(spindown_grace_cooldown)
@@ -52,7 +52,7 @@
/obj/item/hardpoint/primary/minigun/set_fire_delay(value)
fire_delay = value
- SEND_SIGNAL(src, COMSIG_GUN_AUTOFIREDELAY_MODIFIED, fire_delay * stage_delay_mult)
+ SEND_SIGNAL(src, COMSIG_GUN_AUTOFIREDELAY_MODIFIED, fire_delay * stage_delay_mult, scatter * stage_delay_mult)
/obj/item/hardpoint/primary/minigun/set_fire_cooldown()
calculate_stage_delay_mult() //needs to check grace_cooldown before refreshed
@@ -79,5 +79,11 @@
var/new_stage_rate = stage_rate[floor(spin_stage)]
if(old_stage_rate != new_stage_rate)
+ scatter = initial(scatter) * (1/new_stage_rate)
stage_delay_mult = 1 / new_stage_rate
SEND_SIGNAL(src, COMSIG_GUN_AUTOFIREDELAY_MODIFIED, fire_delay * stage_delay_mult)
+
+/obj/item/hardpoint/primary/minigun/set_bullet_traits()
+ LAZYADD(traits_to_give, list(
+ BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff)
+ ))
diff --git a/code/modules/vehicles/interior/areas.dm b/code/modules/vehicles/interior/areas.dm
index 399e55e11450..557edbb25f32 100644
--- a/code/modules/vehicles/interior/areas.dm
+++ b/code/modules/vehicles/interior/areas.dm
@@ -32,6 +32,3 @@
/area/interior/vehicle/arc
name = "\improper ARC interior"
icon_state = "arc"
-
-/area/interior/fancylocker
- name = "closet interior"
diff --git a/code/modules/vehicles/interior/interactable/vendors.dm b/code/modules/vehicles/interior/interactable/vendors.dm
index 8069c8ba71e4..4ad837169fba 100644
--- a/code/modules/vehicles/interior/interactable/vendors.dm
+++ b/code/modules/vehicles/interior/interactable/vendors.dm
@@ -182,7 +182,7 @@
list("M20 Claymore Anti-Personnel Mine", 0, /obj/item/explosive/mine, VENDOR_ITEM_REGULAR),
list("M40 HEDP Grenade", 0, /obj/item/explosive/grenade/high_explosive, VENDOR_ITEM_REGULAR),
list("M40 HIDP Incendiary Grenade", 0, /obj/item/explosive/grenade/incendiary, VENDOR_ITEM_REGULAR),
- list("M40 HPDP White Phosphorus Smoke Grenade", 0, /obj/item/explosive/grenade/phosphorus, VENDOR_ITEM_REGULAR),
+ list("M40 CCDP Chemical Compound Smoke Grenade", 0, /obj/item/explosive/grenade/phosphorus, VENDOR_ITEM_REGULAR),
list("M40 HSDP Smoke Grenade", floor(scale * 1), /obj/item/explosive/grenade/smokebomb, VENDOR_ITEM_REGULAR),
list("M74 AGM-Frag Airburst Grenade", 0, /obj/item/explosive/grenade/high_explosive/airburst, VENDOR_ITEM_REGULAR),
list("M74 AGM-Incendiary Airburst Grenade", 0, /obj/item/explosive/grenade/incendiary/airburst, VENDOR_ITEM_REGULAR),
diff --git a/code/modules/vehicles/interior/objects/fancy_locker.dm b/code/modules/vehicles/interior/objects/fancy_locker.dm
deleted file mode 100644
index 2cc7a02e548b..000000000000
--- a/code/modules/vehicles/interior/objects/fancy_locker.dm
+++ /dev/null
@@ -1,77 +0,0 @@
-/obj/structure/closet/fancy
- name = "fancy closet"
- desc = "It's a fancy storage unit."
-
- icon_state = "cabinet_closed"
- icon_closed = "cabinet_closed"
- icon_opened = "cabinet_open"
-
- unacidable = TRUE
-
- var/interior_map = /datum/map_template/interior/fancy_locker
- var/datum/interior/interior = null
- var/entrance_speed = 1 SECONDS
- var/passengers_slots = 2
- var/revivable_dead_slots = 0
- var/list/role_reserved_slots = list()
- var/xenos_slots = 2
-
-/obj/structure/closet/fancy/Initialize()
- . = ..()
- return INITIALIZE_HINT_LATELOAD
-
-/obj/structure/closet/fancy/LateInitialize()
- . = ..()
- interior = new(src)
- INVOKE_ASYNC(src, PROC_REF(do_create_interior))
-
-/obj/structure/closet/fancy/proc/do_create_interior()
- interior.create_interior(interior_map)
-
-/obj/structure/closet/fancy/Destroy()
- QDEL_NULL(interior)
- return ..()
-
-/obj/structure/closet/fancy/can_close()
- for(var/obj/structure/closet/closet in get_turf(src))
- if(closet != src && !closet.wall_mounted)
- return FALSE
- return TRUE
-
-/obj/structure/closet/fancy/store_mobs(stored_units)
- for(var/mob/M in loc)
- var/succ = interior.enter(M, "fancy")
- if(!succ)
- break
-
-/obj/structure/closet/fancy/ex_act(severity)
- return
-
-/obj/structure/interior_exit/fancy
- name = "fancy wooden door"
- icon = 'icons/obj/structures/doors/mineral_doors.dmi'
- icon_state = "wood"
- density = TRUE
-
-/obj/structure/interior_exit/fancy/attackby(obj/item/O, mob/M)
- attack_hand(M)
-
-/obj/structure/interior_exit/fancy/attack_hand(mob/escapee)
- var/obj/structure/closet/fancy/closet = find_closet()
- if(istype(closet) && !closet.can_open())
- to_chat(escapee, SPAN_WARNING("Something is blocking the exit!"))
- return
- ..()
-
-/obj/structure/interior_exit/fancy/attack_alien(mob/living/carbon/xenomorph/escapee, dam_bonus)
- var/obj/structure/closet/fancy/closet = find_closet()
- if(istype(closet) && !closet.can_open())
- to_chat(escapee, SPAN_XENOWARNING("Something is blocking the exit!"))
- return
- ..()
-
-/obj/structure/interior_exit/fancy/proc/find_closet()
- var/obj/structure/closet/fancy/possible_closet = interior.exterior
- if(istype(possible_closet))
- return possible_closet
- return
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index c78be6fa57ec..b7f29da67fe7 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -6,6 +6,7 @@
anchored = TRUE
animate_movement = 1
can_buckle = TRUE
+ blocks_emissive = EMISSIVE_BLOCK_GENERIC
// The mobs that are in each position/seat of the vehicle
var/list/mob/seats = list(
diff --git a/code/span_macros.dm b/code/span_macros.dm
index 218f333d7df9..f0d78bba617e 100644
--- a/code/span_macros.dm
+++ b/code/span_macros.dm
@@ -19,6 +19,8 @@
#define SPAN_XENOWARNING(X) "[X]"
#define SPAN_XENOMINORWARNING(X) "[X]"
+#define SPAN_PSYTALK(X) "[X]"
+
// Yautja related
#define SPAN_YAUTJABOLD(X) "[X]"
#define SPAN_YAUTJABOLDBIG(X) "[X]"
diff --git a/code/stylesheet.dm b/code/stylesheet.dm
index 145229e23424..8104be1f57e5 100644
--- a/code/stylesheet.dm
+++ b/code/stylesheet.dm
@@ -123,6 +123,8 @@ h1.alert, h2.alert {color: #000000;}
.xeno {color: #900090; font-style: italic;}
.xenoleader {color: #730d73; font-style: italic; font-size: 3;}
.xenoqueen {color: #730d73; font-style: italic; font-weight: bold; font-size: 3;}
+.psy_talk {color: #a70090; font-style: italic; font-weight: bold; font-size: 3;}
+
.newscaster {color: #800000;}
.role_header {color: #db0000 text-align: center; font-weight: bold; font-family: trebuchet-ms; font-size: 2;}
diff --git a/colonialmarines.dme b/colonialmarines.dme
index e3189c10baa4..48996a93ec30 100644
--- a/colonialmarines.dme
+++ b/colonialmarines.dme
@@ -432,6 +432,7 @@
#include "code\datums\construction\construction_template.dm"
#include "code\datums\construction\xenomorph\construction_template_xenomorph.dm"
#include "code\datums\decorators\decorator.dm"
+#include "code\datums\decorators\gamemode_decorator.dm"
#include "code\datums\diseases\addiction.dm"
#include "code\datums\diseases\beesease.dm"
#include "code\datums\diseases\black_goo.dm"
@@ -536,6 +537,7 @@
#include "code\datums\emergency_calls\provost.dm"
#include "code\datums\emergency_calls\riot.dm"
#include "code\datums\emergency_calls\royal_marines.dm"
+#include "code\datums\emergency_calls\solar_devils.dm"
#include "code\datums\emergency_calls\souto.dm"
#include "code\datums\emergency_calls\supplies.dm"
#include "code\datums\emergency_calls\tank_crew.dm"
@@ -1515,6 +1517,7 @@
#include "code\modules\autowiki\autowiki.dm"
#include "code\modules\autowiki\pages\_page.dm"
#include "code\modules\autowiki\pages\guns.dm"
+#include "code\modules\autowiki\pages\xeno_stats.dm"
#include "code\modules\buildmode\bm-mode.dm"
#include "code\modules\buildmode\buildmode.dm"
#include "code\modules\buildmode\buttons.dm"
@@ -2125,6 +2128,7 @@
#include "code\modules\mob\living\simple_animal\hostile\tree.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm"
+#include "code\modules\mob\living\simple_animal\hostile\retaliate\giant_lizard.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm"
#include "code\modules\mob\new_player\body.dm"
#include "code\modules\mob\new_player\login.dm"
@@ -2467,7 +2471,6 @@
#include "code\modules\vehicles\interior\interactable\vendors.dm"
#include "code\modules\vehicles\interior\interactable\viewports.dm"
#include "code\modules\vehicles\interior\interactable\weapons_loader.dm"
-#include "code\modules\vehicles\interior\objects\fancy_locker.dm"
#include "code\modules\vehicles\multitile\multitile.dm"
#include "code\modules\vehicles\multitile\multitile_bump.dm"
#include "code\modules\vehicles\multitile\multitile_hardpoints.dm"
diff --git a/config/example/config.txt b/config/example/config.txt
index d63e6822465c..07dfe6f1b839 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -257,4 +257,4 @@ CLIENT_ERROR_VERSION 514
## GITHUB API
#GITHUB_APP_API
#REPO_NAME cmss13
-#ORG cmss13-devs
\ No newline at end of file
+#ORG cmss13-devs
diff --git a/config/example/word_filter.txt b/config/example/word_filter.txt
new file mode 100644
index 000000000000..aab5cae627fa
--- /dev/null
+++ b/config/example/word_filter.txt
@@ -0,0 +1 @@
+# Words that should be filtered from being said, both IC and OOC, should be included here, one per line. Case insensitive.
diff --git a/html/changelogs/AutoChangeLog-pr-7024.yml b/html/changelogs/AutoChangeLog-pr-7024.yml
new file mode 100644
index 000000000000..60cc1626dbf6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-7024.yml
@@ -0,0 +1,4 @@
+author: "Zonespace27"
+delete-after: True
+changes:
+ - bugfix: "Specialists cryoing now refunds their sets correctly."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-7027.yml b/html/changelogs/AutoChangeLog-pr-7027.yml
new file mode 100644
index 000000000000..f78753cf60c1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-7027.yml
@@ -0,0 +1,6 @@
+author: "realforest2001"
+delete-after: True
+changes:
+ - admin: "All staff now have Admin Announcement and Toggle Remote Control verbs."
+ - admin: "Moved shuttle manipulator to minor event perms rather than admin."
+ - code_imp: "Changed rights check on Toggle Remote Control and Shuttle Manipulator to check for mod/minor event perms respectively, or debug."
\ No newline at end of file
diff --git a/html/changelogs/archive/2024-08.yml b/html/changelogs/archive/2024-08.yml
index ee3672d5738f..caa34acd363e 100644
--- a/html/changelogs/archive/2024-08.yml
+++ b/html/changelogs/archive/2024-08.yml
@@ -256,3 +256,191 @@
- maptweak: Swapped the CL's cabinet for the wardrobe vendor.
zzzmike:
- bugfix: lets you resist when bucklecuffed to bed
+2024-08-21:
+ Mensla:
+ - rscadd: Added new pizza cutter sprites.
+ Steelpoint:
+ - rscadd: Force reconnaissance response teams will now use the USS Kurtz as their
+ home base when departing from the USS Almayer on their response shuttle.
+ - balance: The ERT Forecon Medic/Engineer spawn has been reworked into the 'Reconnaissance
+ Support Technician' to better reflect its design as a combination of a Corpsman
+ and a Comtech.
+ - rscadd: Per the above, the Support Tech now spawns with a unique and full lifesaver
+ belt and some form of a medical visor.
+ - imageadd: The Support Tech has a unique HUD icon to better denote its role.
+ Waseemq1235:
+ - rscadd: Adds handheld Enforcer squad distress beacons for Provost Inspectors+
+2024-08-22:
+ AmoryBlaine:
+ - imageadd: Imports TWE sprites from downstream
+ - imageadd: Imports mime & cowboy boots
+ SASoperative:
+ - code_imp: Updated donator items
+ - imageadd: Added new donator sprites
+ - imagedel: Removed old unused sprites
+ dongwaiver:
+ - imageadd: new m44 revolver sprites
+ - imagedel: old m44 revolver sprites
+2024-08-23:
+ Blundir:
+ - imageadd: adds lineart images for almost all guns that didn't have it
+ - code_imp: missing lineart error is now a lint
+ - rscadd: HPDP strong and weak are now CCDP and WPDP, CCDP now has unique packet
+ sprite and nade sprite (no balance changes)
+ - rscadd: added combat flashlight box and also combat flashlight unique sprite,
+ tweaked desc to better convey that
+ - rscadd: added frag mortar shells to req asrs store
+ - rscadd: added qm fluff/spare items locker with some niche things
+ - rscadd: xm88 ammo packets and ammo box to req ammo vendor
+ - rscadd: added external webbings to req equipment vendor
+ - rscadd: added quartermaster beret to qm vendor
+ - rscadd: package wrapper now has more crate skins
+ - rscadd: metal foal grenade packets
+ - rscadd: req vendors now play small animation and sound, also they have small vend
+ delay to fit animation framing
+ - rscadd: added flashlight box to req vendor
+ - rscadd: m4a3 hp ammo boxes to asrs pool
+ - rscadd: HIDP, AGM-I, AGM-F grenade boxes to req vendor and asrs store
+ - rscadd: 'req clothing vendor now has different: uniforms, boots, backpacks'
+ - rscadd: megaphone use sounds and inhands icons
+ - rscadd: Added flat icon support to spritesheets for boxes, ammo boxes, and reagent
+ containers so they display their overlays in vendors
+ - qol: remade list in req clothing vendor
+ - qol: lowered chance of ingridients crate to be sent by asrs
+ - qol: qm jacket is now identical in stats and capabilities to service jacket
+ - balance: changed XM88 packets capacity from 90 to 100 (is it needed for correct
+ ammo box calculations)
+ - balance: ASRS price of HPR holo target ammo is now the same as the normal ammo
+ - bugfix: fixed HPDP packets not being vendable by req equipment vendor
+ - bugfix: fixed HPR ASRS ammo crate having incorrect sprite
+ - bugfix: breaching slugs packets can now be refilled into req vendor
+ - refactor: nade boxes icons refactor
+ - maptweak: added some chairs, qm locker, lamp to qm's office
+ - maptweak: added paper bins and some pens to main req area
+ - maptweak: added some rack kits to req storage
+ - maptweak: fixed incorrect wall smoothing near req vendor
+ - refactor: splits storage.dmi into multiple files, also moved some icons around
+ for organization
+ - rscadd: added amr ammo to WO req vendor and to WO ammo beacons
+ Drathek:
+ - code_imp: Added missing bitfields for flags_item to VV
+ Git-Nivrak:
+ - bugfix: Fixed the premade tesla coils on Fiorina
+ - rscadd: Added another revival mix pouch option which contains Peridaxon instead
+ of Tricordrazine.
+ - config: Added config options for filtering out certain words
+ Nomoresolvalou:
+ - qol: scientist survivors that get IFF will be able to view research objectives
+ Steelpoint:
+ - rscadd: A medium sized, wall mounted, UPP flag sprite has been added to the game,
+ for mappers to use.
+ - rscadd: The UPP Logistics Technician has been added as a event role for the UPP.
+ Their intention is to assist in operating any supply depots and logistics departments
+ under the control of the UPP, they also possess engineering and construction
+ skills allowing them to assist in fortification work as required.
+ - rscadd: The UPP Political Commissar has been added as a event role for the UPP.
+ They act to ensure the political ideology of the UPP is upheld within the unit
+ they are attached to. The goals and ranking of this job are left undefined to
+ add ambiguity as to their ability to influence the UPP command structure.
+ Willzadl:
+ - qol: Changed 'View objectives' verb to 'View intel objectives'.
+ Zonespace27:
+ - bugfix: '"Retrieve Fulton" objective should now show up properly.'
+ private-tristan:
+ - rscadd: 4 new tips related to paradropping!
+ realforest2001:
+ - rscadd: Added Dropship 3 Saipan template.
+ - rscadd: Re-ordered the SEA vendor contents slightly, and changed the combat gear
+ to use combat categories.
+ - rscadd: Added Marine Law charges to the JAS for unlawful use of a Listening Device.
+ - rscadd: Makes survivor doctors now use doctor title, and security survivors now
+ use Officer title.
+ zzzmike:
+ - qol: fingerprint scanner description is more newbie-friendly
+2024-08-24:
+ BeagleGaming1:
+ - rscdel: Removes APTFT verb from reagent containers
+ - code_imp: Updated reagent container switch transfer amount and examination code
+ Blundir:
+ - imageadd: unique non placeholder CO armor sprites
+ - bugfix: s&w revolver now has belt/pouch and inhand icons
+ - imageadd: resprite of mac15, m60, ppsh, s&w revolver, basira bolt action rifle
+ - rscadd: mortar camo variants
+ - rscadd: Stompers boots and box for them
+ - rscadd: new civillian survivor preset resembling Ripley
+ - maptweak: stomper boots box on New Varadero, Solaris Ridge, Kutjevo Refinery
+ CapCamIII:
+ - rscadd: Adds a tactical HPR to VAISO and VAIPO machinegunners
+ - rscadd: Adds an HPR AP mag available to the above
+ - balance: MAR50 has normal LMG level firerate now
+ - spellcheck: HPR HEAP mag now has correct name formatting
+ Doubleumc:
+ - rscdel: Removed fancy locker
+ Git-Nivrak:
+ - qol: APCs are now emissive
+ - code_imp: Added emissive blockers to a bunch of stuff
+ ItsVyzo:
+ - rscadd: Provost Chief Inspector
+ - rscadd: missing Provost Presets per ML Hierarchy
+ - imageadd: added PCI sprites
+ - imageadd: PCI and Dep. Marshal HUD icons
+ MistChristmas:
+ - spellcheck: places smartgun after DV9 to be DV9 smartgun battery
+ Mister-moon1:
+ - balance: increased feral smash stun to 3 seconds
+ - balance: removed the possibility of "missing" a feral smash attack
+ Noname995:
+ - bugfix: Varadero, Strata, Kutjevo, Shiva maps now don't have infinity energy
+ - rscadd: Added SMES on Shiva generators points
+ Steelpoint:
+ - rscadd: In observance of the merger of the PvP and PvE servers of CM-SS13. The
+ 'Solar Devils', the USCM battalion that appear in the PvE server, have been
+ added as an admin only Emergency Response Team.
+ - rscadd: The Solar Devils are highly trained and well equipped by Marine standards,
+ they will also spawn as part of their own squad.
+ - imageadd: A 'Solar Devils' uniform patch accessory has been added.
+ TheManWithNoHands:
+ - balance: IFF, scatter based on minigun rev up, rev up time increase, firing delay
+ decrease
+ - code_imp: Places minigun aMmo in the Tank ammo File
+ - soundadd: adds a hit sound for 20mm flak
+ efzapa:
+ - qol: Changes the M44 heavy speed loader description to reflect it's actual use-case.
+ kiVts:
+ - code_imp: Research datum now supports more broad ideas in the future.
+ private-tristan:
+ - qol: IOs now late join into their officer bunks instead of the general wakeup
+ area
+ - qol: Late joiners will no longer wake up in thin air in the main cryo area.
+ zzzmike:
+ - soundadd: revive notification has new sound (rather than the ahelp sound)
+2024-08-25:
+ Doubleumc:
+ - bugfix: fixed ERT boarding shuttle able to spawn and dock
+ - rscadd: Added toggle fullscreen hotkey, default F11
+ - qol: fullscreening hides the menu bar
+ - bugfix: toggling fullscreen preserves your non-fullscreened window options
+ Git-Nivrak:
+ - bugfix: Fixes not being able to see the preview in the character selection screen
+ Kitsunemitsu:
+ - balance: CMO now has access of squad comms.
+ Mister-moon1:
+ - balance: Keycard swipers no longer require two unique keycards to function.
+ - bugfix: fixed the description text for the card swipe to reduce confusion
+ TheGamerdk:
+ - rscadd: APCs are now highlighted when found via a Multitool/Security Access Tuner.
+ Unknownity:
+ - code_imp: The renegade hive is now more visually distinct from the normal hive
+ to decrease the chance of marines accidentally attacking them.
+ VileBeggar, SubjectD9341:
+ - rscadd: LV-624 now contains giant lizards. You can feed them with specific food
+ items in order to make them non-hostile to your faction.
+ - code_imp: Simple mobs can now process fire, though the functionality is turned
+ off by default.
+ realforest2001:
+ - rscadd: Added visual flavour to use of psychic whisper or radiance. It now flickers
+ in the chat window like the Yautja Translator.
+ - rscadd: Added an ability button for the human version of psychic whisper, and
+ replaces the existing verb for it in the ESP chem property.
+ zzzmike:
+ - bugfix: bursting+facehugger stats disregard NPCs
diff --git a/icons/landmarks.dmi b/icons/landmarks.dmi
index 08b23758beaa..32fe9e0790a6 100644
Binary files a/icons/landmarks.dmi and b/icons/landmarks.dmi differ
diff --git a/icons/mob/hud/hud.dmi b/icons/mob/hud/hud.dmi
index 8d89fb781264..999afedb037b 100644
Binary files a/icons/mob/hud/hud.dmi and b/icons/mob/hud/hud.dmi differ
diff --git a/icons/mob/hud/marine_hud.dmi b/icons/mob/hud/marine_hud.dmi
index def6cdd56a0e..8be1ae31ba68 100644
Binary files a/icons/mob/hud/marine_hud.dmi and b/icons/mob/hud/marine_hud.dmi differ
diff --git a/icons/mob/hud/sec_hud.dmi b/icons/mob/hud/sec_hud.dmi
index f0fb3b318d0a..493727afac1b 100644
Binary files a/icons/mob/hud/sec_hud.dmi and b/icons/mob/hud/sec_hud.dmi differ
diff --git a/icons/mob/humans/onmob/back.dmi b/icons/mob/humans/onmob/back.dmi
index 84bdbb6ff26a..f7dffb722a89 100644
Binary files a/icons/mob/humans/onmob/back.dmi and b/icons/mob/humans/onmob/back.dmi differ
diff --git a/icons/mob/humans/onmob/belt.dmi b/icons/mob/humans/onmob/belt.dmi
index 453f2e9e2b2d..31c0e9865696 100644
Binary files a/icons/mob/humans/onmob/belt.dmi and b/icons/mob/humans/onmob/belt.dmi differ
diff --git a/icons/mob/humans/onmob/feet.dmi b/icons/mob/humans/onmob/feet.dmi
index fdf6a4a40e80..b0245d499d59 100644
Binary files a/icons/mob/humans/onmob/feet.dmi and b/icons/mob/humans/onmob/feet.dmi differ
diff --git a/icons/mob/humans/onmob/head_0.dmi b/icons/mob/humans/onmob/head_0.dmi
index 4a4338eac4c2..862953a27be3 100644
Binary files a/icons/mob/humans/onmob/head_0.dmi and b/icons/mob/humans/onmob/head_0.dmi differ
diff --git a/icons/mob/humans/onmob/head_1.dmi b/icons/mob/humans/onmob/head_1.dmi
index 696ab464252d..5ee07890f72a 100644
Binary files a/icons/mob/humans/onmob/head_1.dmi and b/icons/mob/humans/onmob/head_1.dmi differ
diff --git a/icons/mob/humans/onmob/items_lefthand_0.dmi b/icons/mob/humans/onmob/items_lefthand_0.dmi
index d9535b796dda..f949062be7b7 100644
Binary files a/icons/mob/humans/onmob/items_lefthand_0.dmi and b/icons/mob/humans/onmob/items_lefthand_0.dmi differ
diff --git a/icons/mob/humans/onmob/items_lefthand_1.dmi b/icons/mob/humans/onmob/items_lefthand_1.dmi
index 45a3b51ecdf2..bc243d0228c3 100644
Binary files a/icons/mob/humans/onmob/items_lefthand_1.dmi and b/icons/mob/humans/onmob/items_lefthand_1.dmi differ
diff --git a/icons/mob/humans/onmob/items_righthand_0.dmi b/icons/mob/humans/onmob/items_righthand_0.dmi
index a245e89b6c48..1f70077321ee 100644
Binary files a/icons/mob/humans/onmob/items_righthand_0.dmi and b/icons/mob/humans/onmob/items_righthand_0.dmi differ
diff --git a/icons/mob/humans/onmob/items_righthand_1.dmi b/icons/mob/humans/onmob/items_righthand_1.dmi
index a2e7e96bac13..29f8cd8e1043 100644
Binary files a/icons/mob/humans/onmob/items_righthand_1.dmi and b/icons/mob/humans/onmob/items_righthand_1.dmi differ
diff --git a/icons/mob/humans/onmob/suit_0.dmi b/icons/mob/humans/onmob/suit_0.dmi
index 737b59f6c4af..db5514a0f3b8 100644
Binary files a/icons/mob/humans/onmob/suit_0.dmi and b/icons/mob/humans/onmob/suit_0.dmi differ
diff --git a/icons/mob/humans/onmob/suit_1.dmi b/icons/mob/humans/onmob/suit_1.dmi
index 85266a2077ac..c028f6eae887 100644
Binary files a/icons/mob/humans/onmob/suit_1.dmi and b/icons/mob/humans/onmob/suit_1.dmi differ
diff --git a/icons/mob/humans/onmob/suit_slot.dmi b/icons/mob/humans/onmob/suit_slot.dmi
index a9142060ab75..cde35b456048 100644
Binary files a/icons/mob/humans/onmob/suit_slot.dmi and b/icons/mob/humans/onmob/suit_slot.dmi differ
diff --git a/icons/mob/humans/onmob/uniform_0.dmi b/icons/mob/humans/onmob/uniform_0.dmi
index c957814e9f3b..36551630209d 100644
Binary files a/icons/mob/humans/onmob/uniform_0.dmi and b/icons/mob/humans/onmob/uniform_0.dmi differ
diff --git a/icons/mob/humans/onmob/uniform_1.dmi b/icons/mob/humans/onmob/uniform_1.dmi
index 89500b39a596..34a85bae0e1e 100644
Binary files a/icons/mob/humans/onmob/uniform_1.dmi and b/icons/mob/humans/onmob/uniform_1.dmi differ
diff --git a/icons/mob/mob_64.dmi b/icons/mob/mob_64.dmi
new file mode 100644
index 000000000000..8ac2194b3eb2
Binary files /dev/null and b/icons/mob/mob_64.dmi differ
diff --git a/icons/obj/items/books.dmi b/icons/obj/items/books.dmi
index abd99a7075ed..9b53dc652807 100644
Binary files a/icons/obj/items/books.dmi and b/icons/obj/items/books.dmi differ
diff --git a/icons/obj/items/clothing/backpacks.dmi b/icons/obj/items/clothing/backpacks.dmi
index 99240596a9da..f4151b592e76 100644
Binary files a/icons/obj/items/clothing/backpacks.dmi and b/icons/obj/items/clothing/backpacks.dmi differ
diff --git a/icons/obj/items/clothing/belts.dmi b/icons/obj/items/clothing/belts.dmi
index e26ee644d638..80070b88b560 100644
Binary files a/icons/obj/items/clothing/belts.dmi and b/icons/obj/items/clothing/belts.dmi differ
diff --git a/icons/obj/items/clothing/cm_hats.dmi b/icons/obj/items/clothing/cm_hats.dmi
index 626de8fa5dd5..4710917b0870 100644
Binary files a/icons/obj/items/clothing/cm_hats.dmi and b/icons/obj/items/clothing/cm_hats.dmi differ
diff --git a/icons/obj/items/clothing/cm_suits.dmi b/icons/obj/items/clothing/cm_suits.dmi
index 8c39aa77c7d1..67590892bf67 100644
Binary files a/icons/obj/items/clothing/cm_suits.dmi and b/icons/obj/items/clothing/cm_suits.dmi differ
diff --git a/icons/obj/items/clothing/donor/HEAD.dmi b/icons/obj/items/clothing/donor/HEAD.dmi
index 3116bdef26b6..23a29f5a2a58 100644
Binary files a/icons/obj/items/clothing/donor/HEAD.dmi and b/icons/obj/items/clothing/donor/HEAD.dmi differ
diff --git a/icons/obj/items/clothing/donor/SUITS.dmi b/icons/obj/items/clothing/donor/SUITS.dmi
index fc0c9987b9d4..e6e4ffef14e5 100644
Binary files a/icons/obj/items/clothing/donor/SUITS.dmi and b/icons/obj/items/clothing/donor/SUITS.dmi differ
diff --git a/icons/obj/items/clothing/donor/Sanctum Uniforms.dmi b/icons/obj/items/clothing/donor/Sanctum Uniforms.dmi
deleted file mode 100644
index 87e9a4c94b1d..000000000000
Binary files a/icons/obj/items/clothing/donor/Sanctum Uniforms.dmi and /dev/null differ
diff --git a/icons/obj/items/clothing/donor/UNIFORM.dmi b/icons/obj/items/clothing/donor/UNIFORM.dmi
index 2e0cd816dfed..5c43f7503a46 100644
Binary files a/icons/obj/items/clothing/donor/UNIFORM.dmi and b/icons/obj/items/clothing/donor/UNIFORM.dmi differ
diff --git a/icons/obj/items/clothing/hats.dmi b/icons/obj/items/clothing/hats.dmi
index 3e2a1dcfc243..45e09ebf7eaa 100644
Binary files a/icons/obj/items/clothing/hats.dmi and b/icons/obj/items/clothing/hats.dmi differ
diff --git a/icons/obj/items/clothing/shoes.dmi b/icons/obj/items/clothing/shoes.dmi
index 90e626503963..398b2ee256cb 100644
Binary files a/icons/obj/items/clothing/shoes.dmi and b/icons/obj/items/clothing/shoes.dmi differ
diff --git a/icons/obj/items/clothing/suits.dmi b/icons/obj/items/clothing/suits.dmi
index 41e6be7e89b9..cdb81b742d78 100644
Binary files a/icons/obj/items/clothing/suits.dmi and b/icons/obj/items/clothing/suits.dmi differ
diff --git a/icons/obj/items/clothing/ties.dmi b/icons/obj/items/clothing/ties.dmi
index 63c7010db55a..496dd3dc07e5 100644
Binary files a/icons/obj/items/clothing/ties.dmi and b/icons/obj/items/clothing/ties.dmi differ
diff --git a/icons/obj/items/clothing/uniforms.dmi b/icons/obj/items/clothing/uniforms.dmi
index 6ab40c6c5970..19a8671a4faf 100644
Binary files a/icons/obj/items/clothing/uniforms.dmi and b/icons/obj/items/clothing/uniforms.dmi differ
diff --git a/icons/obj/items/hunter/pred_gear.dmi b/icons/obj/items/hunter/pred_gear.dmi
index 4501e75a06b3..0e25a24f1aed 100644
Binary files a/icons/obj/items/hunter/pred_gear.dmi and b/icons/obj/items/hunter/pred_gear.dmi differ
diff --git a/icons/obj/items/kitchen_tools.dmi b/icons/obj/items/kitchen_tools.dmi
index 625d992f014c..572053258961 100644
Binary files a/icons/obj/items/kitchen_tools.dmi and b/icons/obj/items/kitchen_tools.dmi differ
diff --git a/icons/obj/items/lighting.dmi b/icons/obj/items/lighting.dmi
index 617109d9a829..0c3519a7e80a 100644
Binary files a/icons/obj/items/lighting.dmi and b/icons/obj/items/lighting.dmi differ
diff --git a/icons/obj/items/storage.dmi b/icons/obj/items/storage.dmi
deleted file mode 100644
index ff702586e16b..000000000000
Binary files a/icons/obj/items/storage.dmi and /dev/null differ
diff --git a/icons/obj/items/storage/bag.dmi b/icons/obj/items/storage/bag.dmi
new file mode 100644
index 000000000000..312951909261
Binary files /dev/null and b/icons/obj/items/storage/bag.dmi differ
diff --git a/icons/obj/items/storage/bags.dmi b/icons/obj/items/storage/bags.dmi
new file mode 100644
index 000000000000..dd515525d8ad
Binary files /dev/null and b/icons/obj/items/storage/bags.dmi differ
diff --git a/icons/obj/items/storage/box.dmi b/icons/obj/items/storage/box.dmi
new file mode 100644
index 000000000000..a530753da27a
Binary files /dev/null and b/icons/obj/items/storage/box.dmi differ
diff --git a/icons/obj/items/storage/boxes.dmi b/icons/obj/items/storage/boxes.dmi
new file mode 100644
index 000000000000..055f2869f6a0
Binary files /dev/null and b/icons/obj/items/storage/boxes.dmi differ
diff --git a/icons/obj/items/storage/briefcases.dmi b/icons/obj/items/storage/briefcases.dmi
new file mode 100644
index 000000000000..7ba5a0382100
Binary files /dev/null and b/icons/obj/items/storage/briefcases.dmi differ
diff --git a/icons/obj/items/storage/holster.dmi b/icons/obj/items/storage/holster.dmi
new file mode 100644
index 000000000000..c367f7e36d66
Binary files /dev/null and b/icons/obj/items/storage/holster.dmi differ
diff --git a/icons/obj/items/storage/holsters.dmi b/icons/obj/items/storage/holsters.dmi
new file mode 100644
index 000000000000..c367f7e36d66
Binary files /dev/null and b/icons/obj/items/storage/holsters.dmi differ
diff --git a/icons/obj/items/storage/kits.dmi b/icons/obj/items/storage/kits.dmi
new file mode 100644
index 000000000000..5c24d40b2474
Binary files /dev/null and b/icons/obj/items/storage/kits.dmi differ
diff --git a/icons/obj/items/storage/medical.dmi b/icons/obj/items/storage/medical.dmi
new file mode 100644
index 000000000000..7a6734989ee3
Binary files /dev/null and b/icons/obj/items/storage/medical.dmi differ
diff --git a/icons/obj/items/storage/mre.dmi b/icons/obj/items/storage/mre.dmi
new file mode 100644
index 000000000000..6e8d7e6de301
Binary files /dev/null and b/icons/obj/items/storage/mre.dmi differ
diff --git a/icons/obj/items/storage/packets.dmi b/icons/obj/items/storage/packets.dmi
new file mode 100644
index 000000000000..ac900a18aafa
Binary files /dev/null and b/icons/obj/items/storage/packets.dmi differ
diff --git a/icons/obj/items/storage/toolbox.dmi b/icons/obj/items/storage/toolbox.dmi
new file mode 100644
index 000000000000..a18cb3466fed
Binary files /dev/null and b/icons/obj/items/storage/toolbox.dmi differ
diff --git a/icons/obj/items/weapons/grenade.dmi b/icons/obj/items/weapons/grenade.dmi
index ca8aaf9afcd6..61c9707e43df 100644
Binary files a/icons/obj/items/weapons/grenade.dmi and b/icons/obj/items/weapons/grenade.dmi differ
diff --git a/icons/obj/items/weapons/guns/ammo_boxes/boxes_and_lids.dmi b/icons/obj/items/weapons/guns/ammo_boxes/boxes_and_lids.dmi
index f01be20a48b4..1152bf3ed569 100644
Binary files a/icons/obj/items/weapons/guns/ammo_boxes/boxes_and_lids.dmi and b/icons/obj/items/weapons/guns/ammo_boxes/boxes_and_lids.dmi differ
diff --git a/icons/obj/items/weapons/guns/ammo_by_faction/colony.dmi b/icons/obj/items/weapons/guns/ammo_by_faction/colony.dmi
index 2adece3b1ab1..8d8ef7cb0163 100644
Binary files a/icons/obj/items/weapons/guns/ammo_by_faction/colony.dmi and b/icons/obj/items/weapons/guns/ammo_by_faction/colony.dmi differ
diff --git a/icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi b/icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi
index 7327bf6a611b..32a8aeec4d17 100644
Binary files a/icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi and b/icons/obj/items/weapons/guns/ammo_by_faction/upp.dmi differ
diff --git a/icons/obj/items/weapons/guns/attachments/barrel.dmi b/icons/obj/items/weapons/guns/attachments/barrel.dmi
index 138b9b658fb6..2400465e4bf4 100644
Binary files a/icons/obj/items/weapons/guns/attachments/barrel.dmi and b/icons/obj/items/weapons/guns/attachments/barrel.dmi differ
diff --git a/icons/obj/items/weapons/guns/attachments/rail.dmi b/icons/obj/items/weapons/guns/attachments/rail.dmi
index 68cb2648ebd1..f53187160e92 100644
Binary files a/icons/obj/items/weapons/guns/attachments/rail.dmi and b/icons/obj/items/weapons/guns/attachments/rail.dmi differ
diff --git a/icons/obj/items/weapons/guns/attachments/stock.dmi b/icons/obj/items/weapons/guns/attachments/stock.dmi
index 0867f60d6430..9f28383c0bad 100644
Binary files a/icons/obj/items/weapons/guns/attachments/stock.dmi and b/icons/obj/items/weapons/guns/attachments/stock.dmi differ
diff --git a/icons/obj/items/weapons/guns/attachments/under.dmi b/icons/obj/items/weapons/guns/attachments/under.dmi
index 5a9be7542348..1138e0044c34 100644
Binary files a/icons/obj/items/weapons/guns/attachments/under.dmi and b/icons/obj/items/weapons/guns/attachments/under.dmi differ
diff --git a/icons/obj/items/weapons/guns/guns_by_faction/colony.dmi b/icons/obj/items/weapons/guns/guns_by_faction/colony.dmi
index 24f9f9b63871..bfc4587f4104 100644
Binary files a/icons/obj/items/weapons/guns/guns_by_faction/colony.dmi and b/icons/obj/items/weapons/guns/guns_by_faction/colony.dmi differ
diff --git a/icons/obj/items/weapons/guns/guns_by_faction/upp.dmi b/icons/obj/items/weapons/guns/guns_by_faction/upp.dmi
index 669efcfc59c4..dcdc441fcb53 100644
Binary files a/icons/obj/items/weapons/guns/guns_by_faction/upp.dmi and b/icons/obj/items/weapons/guns/guns_by_faction/upp.dmi differ
diff --git a/icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi b/icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi
index 1f0b98967a25..a22810024717 100644
Binary files a/icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi and b/icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi differ
diff --git a/icons/obj/items/weapons/guns/lineart.dmi b/icons/obj/items/weapons/guns/lineart.dmi
index 6ea81af6d088..52ed68016313 100644
Binary files a/icons/obj/items/weapons/guns/lineart.dmi and b/icons/obj/items/weapons/guns/lineart.dmi differ
diff --git a/icons/obj/items/weapons/projectiles.dmi b/icons/obj/items/weapons/projectiles.dmi
index c3aa143def9b..21c210c14910 100644
Binary files a/icons/obj/items/weapons/projectiles.dmi and b/icons/obj/items/weapons/projectiles.dmi differ
diff --git a/icons/obj/items/weapons/weapons.dmi b/icons/obj/items/weapons/weapons.dmi
index aa99545cb577..6c5f4ad34509 100644
Binary files a/icons/obj/items/weapons/weapons.dmi and b/icons/obj/items/weapons/weapons.dmi differ
diff --git a/icons/obj/structures/crates.dmi b/icons/obj/structures/crates.dmi
index 07ccce5f0abb..d9f66eca1e70 100644
Binary files a/icons/obj/structures/crates.dmi and b/icons/obj/structures/crates.dmi differ
diff --git a/icons/obj/structures/doors/dropship3_cargo.dmi b/icons/obj/structures/doors/dropship3_cargo.dmi
new file mode 100644
index 000000000000..864811197f8c
Binary files /dev/null and b/icons/obj/structures/doors/dropship3_cargo.dmi differ
diff --git a/icons/obj/structures/doors/dropship3_pilot.dmi b/icons/obj/structures/doors/dropship3_pilot.dmi
new file mode 100644
index 000000000000..d7e07e36b348
Binary files /dev/null and b/icons/obj/structures/doors/dropship3_pilot.dmi differ
diff --git a/icons/obj/structures/doors/dropship3_side.dmi b/icons/obj/structures/doors/dropship3_side.dmi
new file mode 100644
index 000000000000..8dfa437d6521
Binary files /dev/null and b/icons/obj/structures/doors/dropship3_side.dmi differ
diff --git a/icons/obj/structures/doors/dropship3_side2.dmi b/icons/obj/structures/doors/dropship3_side2.dmi
new file mode 100644
index 000000000000..d8aa391d4207
Binary files /dev/null and b/icons/obj/structures/doors/dropship3_side2.dmi differ
diff --git a/icons/obj/structures/machinery/vending.dmi b/icons/obj/structures/machinery/vending.dmi
index ba45e612ca22..f2449fcad0ed 100644
Binary files a/icons/obj/structures/machinery/vending.dmi and b/icons/obj/structures/machinery/vending.dmi differ
diff --git a/icons/obj/structures/mortar.dmi b/icons/obj/structures/mortar.dmi
index 16e821c3d192..8e6fc13464d5 100644
Binary files a/icons/obj/structures/mortar.dmi and b/icons/obj/structures/mortar.dmi differ
diff --git a/icons/obj/structures/props/decals.dmi b/icons/obj/structures/props/decals.dmi
index e99f52a10439..5b641ceaba89 100644
Binary files a/icons/obj/structures/props/decals.dmi and b/icons/obj/structures/props/decals.dmi differ
diff --git a/icons/obj/structures/props/flags.dmi b/icons/obj/structures/props/flags.dmi
new file mode 100644
index 000000000000..a162da6585c2
Binary files /dev/null and b/icons/obj/structures/props/flags.dmi differ
diff --git a/icons/obj/structures/structures.dmi b/icons/obj/structures/structures.dmi
index d96329839a7b..824a412cc8c8 100644
Binary files a/icons/obj/structures/structures.dmi and b/icons/obj/structures/structures.dmi differ
diff --git a/icons/turf/dropship3.dmi b/icons/turf/dropship3.dmi
index a813e18808a7..0d772c58a48e 100644
Binary files a/icons/turf/dropship3.dmi and b/icons/turf/dropship3.dmi differ
diff --git a/maps/interiors/fancylocker.dmm b/maps/interiors/fancylocker.dmm
deleted file mode 100644
index 2629f6210056..000000000000
--- a/maps/interiors/fancylocker.dmm
+++ /dev/null
@@ -1,222 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"a" = (
-/turf/closed/wall/wood,
-/area/interior/fancylocker)
-"b" = (
-/turf/open/floor/wood,
-/area/interior/fancylocker)
-"c" = (
-/obj/effect/landmark/interior/spawn/entrance/step_toward{
- dir = 8;
- exit_type = /obj/structure/interior_exit/fancy;
- tag = "fancy"
- },
-/turf/open/floor/wood,
-/area/interior/fancylocker)
-"d" = (
-/turf/open/floor/carpet/edge/northwest,
-/area/interior/fancylocker)
-"e" = (
-/turf/open/floor/carpet/edge/north,
-/area/interior/fancylocker)
-"f" = (
-/turf/open/floor/carpet/edge/northeast,
-/area/interior/fancylocker)
-"g" = (
-/turf/open/floor/carpet/edge/west,
-/area/interior/fancylocker)
-"h" = (
-/obj/structure/bed/sofa/south/white/left,
-/turf/open/floor/carpet,
-/area/interior/fancylocker)
-"i" = (
-/obj/structure/bed/sofa/south/white,
-/turf/open/floor/carpet,
-/area/interior/fancylocker)
-"j" = (
-/obj/structure/bed/sofa/south/white/right,
-/turf/open/floor/carpet,
-/area/interior/fancylocker)
-"k" = (
-/turf/open/floor/carpet/edge/east,
-/area/interior/fancylocker)
-"l" = (
-/obj/structure/surface/table/woodentable/fancy,
-/obj/item/device/flashlight/lamp/green,
-/turf/open/floor/wood,
-/area/interior/fancylocker)
-"m" = (
-/turf/open/floor/carpet/edge/southwest,
-/area/interior/fancylocker)
-"n" = (
-/turf/open/floor/carpet/edge,
-/area/interior/fancylocker)
-"o" = (
-/turf/open/floor/carpet/edge/southeast,
-/area/interior/fancylocker)
-"p" = (
-/obj/structure/surface/table/woodentable/fancy,
-/turf/open/floor/carpet,
-/area/interior/fancylocker)
-"q" = (
-/obj/structure/flora/pottedplant{
- icon_state = "pottedplant_10"
- },
-/turf/open/floor/wood,
-/area/interior/fancylocker)
-"r" = (
-/obj/structure/coatrack,
-/turf/open/floor/wood,
-/area/interior/fancylocker)
-"s" = (
-/obj/structure/surface/table/woodentable/fancy,
-/obj/structure/machinery/chem_dispenser/soda,
-/turf/open/floor/wood,
-/area/interior/fancylocker)
-"t" = (
-/obj/structure/surface/table/woodentable/fancy,
-/obj/structure/machinery/chem_dispenser/soda/beer,
-/turf/open/floor/wood,
-/area/interior/fancylocker)
-"u" = (
-/obj/structure/surface/table/woodentable/fancy,
-/obj/item/reagent_container/food/snacks/milosoup{
- pixel_y = 10
- },
-/obj/item/reagent_container/food/snacks/meatsteak{
- pixel_y = -2
- },
-/obj/structure/machinery/light{
- dir = 1
- },
-/turf/open/floor/wood,
-/area/interior/fancylocker)
-"v" = (
-/obj/structure/surface/table/woodentable/fancy,
-/obj/item/reagent_container/food/snacks/appletart,
-/turf/open/floor/wood,
-/area/interior/fancylocker)
-"w" = (
-/obj/structure/surface/table/woodentable/fancy,
-/obj/item/reagent_container/food/snacks/popcorn{
- pixel_x = -5;
- pixel_y = 8
- },
-/obj/item/reagent_container/food/snacks/sandwich{
- layer = 4;
- pixel_x = 5;
- pixel_y = 6
- },
-/obj/item/trash/plate{
- pixel_x = 5
- },
-/turf/open/floor/wood,
-/area/interior/fancylocker)
-"x" = (
-/obj/structure/surface/table/woodentable/fancy,
-/obj/item/ashtray/bronze,
-/turf/open/floor/carpet,
-/area/interior/fancylocker)
-"y" = (
-/obj/structure/surface/table/woodentable/fancy,
-/obj/item/clothing/mask/cigarette/cigar/cohiba,
-/obj/item/tool/lighter/zippo,
-/turf/open/floor/carpet,
-/area/interior/fancylocker)
-"z" = (
-/obj/structure/bed/chair/wood/wings{
- icon_state = "wooden_chair_wings";
- dir = 4
- },
-/turf/open/floor/wood,
-/area/interior/fancylocker)
-"A" = (
-/obj/structure/machinery/disposal,
-/turf/open/floor/wood,
-/area/interior/fancylocker)
-"B" = (
-/obj/structure/machinery/light,
-/turf/open/floor/carpet/edge,
-/area/interior/fancylocker)
-
-(1,1,1) = {"
-a
-a
-b
-a
-a
-a
-a
-"}
-(2,1,1) = {"
-a
-q
-c
-r
-l
-z
-a
-"}
-(3,1,1) = {"
-a
-A
-b
-b
-b
-b
-a
-"}
-(4,1,1) = {"
-a
-v
-d
-g
-g
-m
-a
-"}
-(5,1,1) = {"
-a
-w
-e
-h
-p
-n
-a
-"}
-(6,1,1) = {"
-a
-u
-e
-i
-x
-B
-a
-"}
-(7,1,1) = {"
-a
-s
-e
-j
-y
-n
-a
-"}
-(8,1,1) = {"
-a
-t
-f
-k
-k
-o
-a
-"}
-(9,1,1) = {"
-a
-a
-a
-a
-a
-a
-a
-"}
diff --git a/maps/map_files/BigRed/BigRed.dmm b/maps/map_files/BigRed/BigRed.dmm
index 55749f9f580d..5142f571a4a9 100644
--- a/maps/map_files/BigRed/BigRed.dmm
+++ b/maps/map_files/BigRed/BigRed.dmm
@@ -11996,6 +11996,9 @@
"aVa" = (
/obj/structure/surface/table,
/obj/item/device/flashlight,
+/obj/item/storage/box/stompers{
+ pixel_y = 15
+ },
/turf/open/floor/whitebluefull/northeast,
/area/bigredv2/outside/general_store)
"aVb" = (
diff --git a/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm b/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm
index 54a56be13283..6878a0c1ed20 100644
--- a/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm
+++ b/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm
@@ -845,7 +845,7 @@
/turf/open/floor/prison/floor_plate,
/area/fiorina/station/telecomm/lz1_cargo)
"aFp" = (
-/obj/structure/machinery/defenses/tesla_coil{
+/obj/structure/machinery/defenses/tesla_coil/premade/smart{
faction_group = list("CLF")
},
/turf/open/floor/plating/plating_catwalk,
@@ -30182,7 +30182,7 @@
/turf/open/floor/corsat/squares,
/area/fiorina/station/medbay)
"xgx" = (
-/obj/structure/machinery/defenses/tesla_coil{
+/obj/structure/machinery/defenses/tesla_coil/premade{
faction_group = list("USCM")
},
/turf/open/organic/grass/astroturf,
diff --git a/maps/map_files/FOP_v3_Sciannex/sprinkles/30.pizzatime.dmm b/maps/map_files/FOP_v3_Sciannex/sprinkles/30.pizzatime.dmm
index 8b840ec4ec8c..f9816fe31821 100644
--- a/maps/map_files/FOP_v3_Sciannex/sprinkles/30.pizzatime.dmm
+++ b/maps/map_files/FOP_v3_Sciannex/sprinkles/30.pizzatime.dmm
@@ -249,7 +249,7 @@
/area/template_noop)
"K" = (
/obj/structure/closet/secure_closet/freezer/fridge/full,
-/obj/item/weapon/pizza_cutter,
+/obj/item/tool/kitchen/pizzacutter,
/turf/open/floor/prison/kitchen,
/area/template_noop)
"L" = (
diff --git a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm
index 9f5c20a4e8e9..51f7589f4987 100644
--- a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm
+++ b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm
@@ -12692,11 +12692,11 @@
/turf/open/auto_turf/snow/layer0,
/area/shiva/interior/warehouse/caves)
"jWL" = (
-/obj/structure/machinery/space_heater,
/obj/structure/machinery/light/double{
dir = 1;
pixel_y = 9
},
+/obj/structure/machinery/power/smes/buildable,
/turf/open/floor/shiva/yellowfull/west,
/area/shiva/interior/aux_power)
"jXD" = (
@@ -15502,6 +15502,10 @@
},
/turf/open/auto_turf/ice/layer1,
/area/shiva/interior/caves/research_caves)
+"niD" = (
+/obj/structure/machinery/space_heater,
+/turf/open/floor/shiva/floor3,
+/area/shiva/interior/aux_power)
"niL" = (
/obj/structure/platform/strata{
dir = 8
@@ -19150,6 +19154,9 @@
dir = 1;
pixel_y = 9
},
+/obj/structure/machinery/power/smes/buildable{
+ pixel_x = 1
+ },
/turf/open/floor/shiva/yellowfull/west,
/area/shiva/interior/aux_power)
"rUW" = (
@@ -23648,6 +23655,10 @@
/obj/item/tool/warning_cone,
/turf/open/floor/shiva,
/area/shiva/interior/colony/research_hab)
+"xEU" = (
+/obj/structure/machinery/power/smes/buildable,
+/turf/open/floor/shiva/yellowfull/west,
+/area/shiva/interior/garage)
"xFp" = (
/obj/structure/bed/chair/comfy/orange{
dir = 4
@@ -33924,7 +33935,7 @@ puZ
puZ
anc
anc
-ctz
+niD
cJu
cJu
nTC
@@ -50679,11 +50690,11 @@ ktd
ktd
ktd
ktd
-ktd
+xEU
tXd
ado
pSD
-ktd
+xEU
ktd
ktd
ktd
diff --git a/maps/map_files/Kutjevo/Kutjevo.dmm b/maps/map_files/Kutjevo/Kutjevo.dmm
index 6fefb6d19595..9f3e2719353a 100644
--- a/maps/map_files/Kutjevo/Kutjevo.dmm
+++ b/maps/map_files/Kutjevo/Kutjevo.dmm
@@ -1287,6 +1287,11 @@
/obj/effect/landmark/corpsespawner/security/marshal,
/turf/open/gm/river/desert/deep/toxic,
/area/kutjevo/interior/power)
+"bVI" = (
+/obj/structure/surface/table/gamblingtable,
+/obj/item/storage/box/stompers,
+/turf/open/floor/kutjevo/tan,
+/area/kutjevo/interior/construction)
"bVK" = (
/obj/structure/stairs/perspective/kutjevo{
dir = 9;
@@ -37000,7 +37005,7 @@ wuL
juz
oUP
vfr
-gew
+bVI
wAo
uDm
sCG
diff --git a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm
index 99b0c784e8b3..12cf5cbeb613 100644
--- a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm
+++ b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm
@@ -8,7 +8,7 @@
/turf/open/floor/strata/multi_tiles,
/area/lv522/indoors/c_block/mining)
"aaF" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "15"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -2034,7 +2034,7 @@
/turf/open/floor/prison,
/area/lv522/indoors/b_block/bridge)
"bpZ" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "18"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -5647,7 +5647,7 @@
pixel_x = 8;
pixel_y = 10
},
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "22"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -6510,7 +6510,7 @@
/turf/open/floor/carpet,
/area/lv522/indoors/c_block/garage)
"dIr" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "22"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -6997,7 +6997,7 @@
/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/indoors/c_block/cargo)
"dWv" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "6"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -7022,7 +7022,7 @@
/turf/open/floor/corsat/plate,
/area/lv522/atmos/west_reactor)
"dWY" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "32"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -7256,7 +7256,7 @@
/turf/open/floor/prison/floor_plate,
/area/lv522/atmos/way_in_command_centre)
"ecP" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "25"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -9037,7 +9037,7 @@
/turf/open/floor/corsat/marked,
/area/lv522/indoors/lone_buildings/outdoor_bot)
"eUS" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "33"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -10177,7 +10177,7 @@
/turf/open/floor/corsat/brown/northwest,
/area/lv522/atmos/reactor_garage)
"fzC" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "28"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -10331,7 +10331,7 @@
/turf/open/floor/prison/darkbrownfull2,
/area/lv522/indoors/lone_buildings/storage_blocks)
"fDg" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "30"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -10602,7 +10602,7 @@
/turf/open/floor/corsat/brown/north,
/area/lv522/atmos/cargo_intake)
"fLa" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "47"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -11082,7 +11082,7 @@
/turf/open/floor/prison/floor_plate,
/area/lv522/indoors/b_block/bar)
"fXn" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "19"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -12119,7 +12119,7 @@
/turf/open/floor/prison/darkpurplefull2,
/area/lv522/indoors/a_block/dorms)
"guR" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "26"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -15674,7 +15674,7 @@
/turf/open/floor/corsat/marked,
/area/lv522/atmos/reactor_garage)
"ibE" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "23"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -21404,7 +21404,7 @@
/turf/open/floor/prison/blue/west,
/area/lv522/indoors/a_block/admin)
"kzk" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "17"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -26901,7 +26901,7 @@
/turf/open/floor/prison,
/area/lv522/indoors/c_block/mining)
"nbO" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "77"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -27076,7 +27076,7 @@
/turf/open/floor/prison/blue_plate/north,
/area/lv522/indoors/a_block/bridges/garden_bridge)
"nfq" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "36"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -28609,7 +28609,7 @@
/turf/open/floor/prison/blue_plate/north,
/area/lv522/indoors/a_block/admin)
"nPN" = (
-/turf/closed/shuttle/dropship2/tornado,
+/turf/closed/shuttle/dropship3/tornado,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"nPV" = (
/obj/structure/bed/chair/comfy,
@@ -28689,7 +28689,7 @@
/turf/open/floor/plating,
/area/lv522/indoors/c_block/mining)
"nQY" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "53"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -28790,7 +28790,7 @@
/turf/open/floor/prison,
/area/lv522/indoors/a_block/admin)
"nSN" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "27"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -29192,7 +29192,7 @@
/turf/open/floor/prison/greenfull/east,
/area/lv522/indoors/a_block/fitness)
"obe" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "40"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -30097,7 +30097,7 @@
/turf/open/floor/prison,
/area/lv522/indoors/a_block/kitchen)
"oxd" = (
-/obj/item/clothing/suit/storage/RO{
+/obj/item/clothing/suit/storage/jacket/marine/RO{
name = "\improper UA jacket"
},
/turf/open/shuttle/dropship/can_surgery/light_grey_single_wide_up_to_down,
@@ -31689,7 +31689,7 @@
/turf/open/floor/prison/darkbrownfull2,
/area/lv522/indoors/c_block/cargo)
"pkB" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "9"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -31790,7 +31790,7 @@
/turf/open/auto_turf/sand_white/layer0,
/area/lv522/outdoors/colony_streets/north_east_street)
"pps" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "100"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -31810,7 +31810,7 @@
/turf/open/auto_turf/shale/layer1,
/area/lv522/outdoors/colony_streets/south_east_street)
"ppF" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "101"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -31881,12 +31881,12 @@
/turf/open/floor/prison/blue,
/area/lv522/indoors/a_block/hallway)
"pqZ" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "102"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"prD" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "5"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -32123,7 +32123,7 @@
/turf/open/floor/prison/floor_plate,
/area/lv522/indoors/a_block/dorms)
"pxY" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "95"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -32139,7 +32139,7 @@
/turf/open/floor/corsat/plate,
/area/lv522/atmos/cargo_intake)
"pys" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "97"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -32152,7 +32152,7 @@
pixel_x = -8;
pixel_y = 10
},
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "99"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -32214,7 +32214,7 @@
/turf/open/floor/prison/blue_plate/north,
/area/lv522/indoors/a_block/hallway)
"pAd" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "24"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -32251,7 +32251,7 @@
/turf/open/floor/prison/darkbrownfull2,
/area/lv522/indoors/c_block/mining)
"pBz" = (
-/obj/structure/machinery/door/airlock/hatch/cockpit/two,
+/obj/structure/machinery/door/airlock/hatch/cockpit/three,
/turf/open/shuttle/dropship/can_surgery/medium_grey_single_wide_up_to_down,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"pBF" = (
@@ -32591,7 +32591,7 @@
/turf/open/floor/prison/darkpurplefull2,
/area/lv522/indoors/a_block/bridges/dorms_fitness)
"pIu" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "86"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -33013,12 +33013,12 @@
/turf/open/floor/prison,
/area/lv522/indoors/c_block/garage)
"pRK" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "75"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"pRM" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "81"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -33332,7 +33332,7 @@
/turf/open/floor/prison/floor_marked/southwest,
/area/lv522/indoors/lone_buildings/storage_blocks)
"pZb" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "33"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -33734,7 +33734,7 @@
/turf/open/floor/prison,
/area/lv522/indoors/a_block/dorm_north)
"qjs" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "71"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -33863,7 +33863,7 @@
pixel_x = -8;
pixel_y = 10
},
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "72"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -34202,7 +34202,7 @@
/turf/open/gm/river,
/area/lv522/atmos/sewer)
"qtc" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "74"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -34486,7 +34486,7 @@
/turf/open/shuttle/dropship/light_grey_single_wide_up_to_down,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"qzw" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "26"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -34818,7 +34818,7 @@
/turf/open/floor/prison/darkredfull2,
/area/lv522/outdoors/colony_streets/north_street)
"qFs" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "66"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -34869,7 +34869,7 @@
/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/indoors/a_block/bridges)
"qGQ" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "67"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -34878,7 +34878,7 @@
/turf/open/floor/prison/darkpurplefull2,
/area/lv522/indoors/a_block/dorms)
"qHg" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "2"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -35085,7 +35085,7 @@
/turf/open/floor/prison/darkpurple2,
/area/lv522/indoors/a_block/dorms)
"qLz" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "69"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -35134,7 +35134,7 @@
pixel_x = -8;
pixel_y = 10
},
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "70"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -35238,7 +35238,7 @@
pixel_x = -8;
pixel_y = 10
},
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "26"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -35477,7 +35477,7 @@
/turf/open/floor/prison/darkbrownfull2,
/area/lv522/indoors/c_block/cargo)
"qSP" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "61"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -35501,7 +35501,7 @@
/turf/open/floor/prison/darkbrownfull2,
/area/lv522/indoors/c_block/mining)
"qTh" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "62"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -35629,7 +35629,7 @@
/turf/open/floor/prison/darkpurplefull2,
/area/lv522/indoors/a_block/dorms)
"qVl" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "64"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -35696,7 +35696,7 @@
/turf/open/floor/corsat/marked,
/area/lv522/indoors/a_block/dorms)
"qWZ" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "65"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -36183,7 +36183,7 @@
/turf/open/floor/prison/floor_plate,
/area/lv522/outdoors/colony_streets/east_central_street)
"rfi" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "100"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -36248,7 +36248,7 @@
/turf/open/shuttle/dropship/can_surgery/medium_grey_single_wide_up_to_down,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"rgA" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "101"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -36300,12 +36300,12 @@
/turf/open/floor/prison/blue_plate/north,
/area/lv522/indoors/a_block/bridges/op_centre)
"rii" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "102"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"riE" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "68"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -36777,7 +36777,7 @@
/turf/open/floor/prison,
/area/lv522/indoors/a_block/dorms)
"ruj" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "59"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -37052,7 +37052,7 @@
/turf/open/floor/prison,
/area/lv522/indoors/c_block/garage)
"rAc" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "95"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -37108,12 +37108,12 @@
/turf/open/floor/corsat,
/area/lv522/atmos/cargo_intake)
"rBU" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "41"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"rBZ" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "97"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -37122,7 +37122,7 @@
/turf/open/floor/prison/darkyellowfull2/east,
/area/lv522/indoors/lone_buildings/engineering)
"rCi" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "99"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -37147,7 +37147,7 @@
pixel_x = -6;
pixel_y = 32
},
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "17"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -37166,7 +37166,7 @@
id = "UD6";
name = "Cargo Shutter Control"
},
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "53"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -37223,7 +37223,7 @@
/turf/open/floor/prison/floor_plate,
/area/lv522/outdoors/colony_streets/east_central_street)
"rFp" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "51"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -37232,7 +37232,7 @@
/turf/open/floor/plating,
/area/lv522/landing_zone_2)
"rGg" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "40"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -37628,7 +37628,7 @@
/turf/open/floor/strata/cyan2/east,
/area/lv522/indoors/a_block/medical)
"rOO" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "4"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -38189,7 +38189,7 @@
/turf/open/floor/prison/darkbrownfull2,
/area/lv522/indoors/c_block/mining)
"sbG" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "28"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -38212,12 +38212,12 @@
/turf/open/floor/plating/platingdmg3,
/area/lv522/indoors/a_block/kitchen/damage)
"sci" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "29"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"sct" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "40"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -38241,7 +38241,7 @@
/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/indoors/a_block/bridges/op_centre)
"sdE" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "31"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -38269,7 +38269,7 @@
pixel_x = -8;
pixel_y = 10
},
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "33"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -38346,7 +38346,7 @@
pixel_x = 10;
pixel_y = 32
},
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "16"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -38413,7 +38413,7 @@
/turf/open/floor/prison/greenfull/east,
/area/lv522/indoors/a_block/fitness/glass)
"shq" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "86"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -38570,7 +38570,7 @@
/turf/open/floor/corsat/plate,
/area/lv522/atmos/reactor_garage)
"skE" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "63"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -38937,7 +38937,7 @@
/turf/open/floor/corsat/browncorner/east,
/area/lv522/atmos/west_reactor)
"ssU" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "89"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -39040,7 +39040,7 @@
/turf/closed/wall/strata_outpost,
/area/lv522/atmos/east_reactor)
"swr" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "45"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -39274,7 +39274,7 @@
/turf/open/floor/prison/darkbrownfull2,
/area/lv522/indoors/c_block/mining)
"sCp" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "75"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -39404,7 +39404,7 @@
/turf/open/floor/prison/floor_plate,
/area/lv522/indoors/b_block/hydro)
"sFG" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "22"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -39415,12 +39415,12 @@
/turf/open/auto_turf/sand_white/layer0,
/area/lv522/outdoors/colony_streets/north_west_street)
"sFS" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "23"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"sGc" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "24"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -39521,12 +39521,12 @@
/turf/open/floor/prison,
/area/lv522/landing_zone_2)
"sIx" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "25"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"sIA" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "76"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -39538,7 +39538,7 @@
/turf/open/floor/prison/greenfull/east,
/area/lv522/landing_zone_1/ceiling)
"sIK" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "27"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -39571,7 +39571,7 @@
/turf/open/asphalt/cement/cement1,
/area/lv522/outdoors/colony_streets/central_streets)
"sKi" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "77"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -40296,7 +40296,7 @@
/turf/open/floor/plating,
/area/lv522/indoors/c_block/garage)
"sYh" = (
-/obj/structure/machinery/door/airlock/hatch/cockpit/two,
+/obj/structure/machinery/door/airlock/hatch/cockpit/three,
/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
/area/lv522/landing_zone_forecon/UD6_Tornado)
"sYl" = (
@@ -40387,7 +40387,7 @@
/turf/open/auto_turf/sand_white/layer0,
/area/lv522/landing_zone_1)
"tbl" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "16"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -40444,7 +40444,7 @@
/turf/open/floor/prison/blue_plate/north,
/area/lv522/indoors/a_block/hallway)
"tcu" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "83"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -40453,7 +40453,7 @@
/turf/open/floor/prison/floor_marked/southwest,
/area/lv522/outdoors/colony_streets/north_east_street)
"tcz" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "17"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -40511,12 +40511,12 @@
/turf/open/floor/shiva/radiator_tile2,
/area/lv522/indoors/a_block/bridges/corpo)
"tdE" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "46"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"tdH" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "47"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -40638,7 +40638,7 @@
/turf/open/auto_turf/sand_white/layer0,
/area/lv522/outdoors/n_rockies)
"tfV" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "48"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -40665,7 +40665,7 @@
/turf/open/floor/prison/floor_marked/southwest,
/area/lv522/landing_zone_1)
"tgM" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "49"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -40685,7 +40685,7 @@
/turf/open/floor/prison/darkpurplefull2,
/area/lv522/indoors/a_block/dorms/glass)
"the" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "71"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -41018,7 +41018,7 @@
/turf/open/floor/strata/white_cyan3/east,
/area/lv522/indoors/a_block/medical/glass)
"toY" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "72"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -41331,7 +41331,7 @@
/turf/open/floor/prison/blue/west,
/area/lv522/indoors/a_block/admin)
"twB" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "48"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -42233,7 +42233,7 @@
/turf/open/floor/prison/floor_plate,
/area/lv522/indoors/a_block/admin)
"tSo" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "73"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -42637,7 +42637,7 @@
/turf/open/floor/prison/darkpurplefull2,
/area/lv522/indoors/a_block/fitness)
"ucD" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "74"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -43094,11 +43094,11 @@
/area/lv522/indoors/a_block/security/glass)
"ukT" = (
/obj/structure/closet/crate,
-/obj/item/storage/pouch/pressurized_reagent_canister/revival,
+/obj/item/storage/pouch/pressurized_reagent_canister/revival_peri,
/turf/open/floor/prison/floor_plate,
/area/lv522/indoors/lone_buildings/storage_blocks)
"ulh" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "3"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -43338,7 +43338,7 @@
/turf/open/asphalt/cement,
/area/lv522/outdoors/n_rockies)
"uru" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "66"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -43567,7 +43567,7 @@
/turf/closed/wall/strata_ice/dirty,
/area/lv522/outdoors/colony_streets/north_east_street)
"uwQ" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "67"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -43874,7 +43874,7 @@
pixel_x = -6;
pixel_y = 32
},
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "17"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -44547,7 +44547,7 @@
/turf/open/floor/prison/darkbrownfull2,
/area/lv522/indoors/c_block/casino)
"uSB" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "31"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -44937,7 +44937,7 @@
/turf/open/auto_turf/shale/layer2,
/area/lv522/outdoors/colony_streets/north_east_street)
"vcu" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon,
+/turf/closed/shuttle/dropship3/tornado/typhoon,
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"vcF" = (
/obj/structure/stairs/perspective{
@@ -45080,7 +45080,7 @@
/turf/open/floor/wood,
/area/lv522/indoors/c_block/casino)
"vfl" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "2"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -45118,7 +45118,7 @@
/turf/open/floor/prison/darkbrownfull2,
/area/lv522/indoors/c_block/garage)
"vga" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "3"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -45185,17 +45185,17 @@
/turf/open/floor/corsat/squares,
/area/lv522/atmos/east_reactor/south)
"vhC" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "4"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"vhJ" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "5"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
"vhO" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "6"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -45282,7 +45282,7 @@
/turf/open/floor/prison/floor_plate,
/area/lv522/atmos/reactor_garage)
"vjv" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "69"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -45561,7 +45561,7 @@
/turf/open/floor/corsat/marked,
/area/lv522/indoors/a_block/corpo)
"vpU" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "70"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -47895,7 +47895,7 @@
/turf/open/floor/prison/darkpurplefull2,
/area/lv522/indoors/a_block/dorms)
"wqt" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "16"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -48245,12 +48245,12 @@
/turf/open/floor/corsat/marked,
/area/lv522/indoors/a_block/bridges)
"wyM" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "61"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
"wzg" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "62"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -48296,7 +48296,7 @@
/turf/open/floor/prison/floor_plate,
/area/lv522/outdoors/colony_streets/east_central_street)
"wAf" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "68"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -48351,7 +48351,7 @@
/turf/open/floor/corsat/plate,
/area/lv522/atmos/reactor_garage)
"wCr" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "64"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -48951,7 +48951,7 @@
/turf/open/floor/prison/greenfull/east,
/area/lv522/indoors/a_block/fitness)
"wRL" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "30"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -49130,7 +49130,7 @@
/turf/open/floor/prison,
/area/lv522/indoors/a_block/bridges/dorms_fitness)
"wXe" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "65"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
@@ -49599,7 +49599,7 @@
/turf/open/floor/prison/floor_marked/southwest,
/area/lv522/indoors/lone_buildings/storage_blocks)
"xic" = (
-/turf/closed/shuttle/dropship2/tornado/typhoon{
+/turf/closed/shuttle/dropship3/tornado/typhoon{
icon_state = "32"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
@@ -49957,7 +49957,7 @@
/turf/open/floor/prison,
/area/lv522/indoors/a_block/dorms/glass)
"xsc" = (
-/turf/closed/shuttle/dropship2/tornado{
+/turf/closed/shuttle/dropship3/tornado{
icon_state = "29"
},
/area/lv522/landing_zone_forecon/UD6_Tornado)
diff --git a/maps/map_files/LV624/LV624.dmm b/maps/map_files/LV624/LV624.dmm
index 87a83cf09d19..1183e3e97051 100644
--- a/maps/map_files/LV624/LV624.dmm
+++ b/maps/map_files/LV624/LV624.dmm
@@ -13368,6 +13368,11 @@
/obj/structure/flora/bush/ausbushes/ppflowers,
/turf/open/gm/dirtgrassborder/grassdirt_corner2/south_west,
/area/lv624/ground/caves/sand_temple)
+"hUK" = (
+/obj/structure/flora/bush/ausbushes/lavendergrass,
+/obj/effect/landmark/lizard_spawn,
+/turf/open/gm/grass/grass1,
+/area/lv624/ground/barrens/south_eastern_jungle_barrens)
"hWj" = (
/turf/open/gm/coast/beachcorner/south_east,
/area/lv624/ground/river/east_river)
@@ -16917,6 +16922,10 @@
"pcA" = (
/turf/open/gm/dirtgrassborder/grassdirt_corner2/north_east,
/area/lv624/ground/jungle/south_central_jungle)
+"pcL" = (
+/obj/effect/landmark/lizard_spawn,
+/turf/open/gm/dirt,
+/area/lv624/ground/jungle/south_west_jungle/ceiling)
"pfl" = (
/obj/effect/decal/cleanable/blood,
/obj/effect/landmark/corpsespawner/chef,
@@ -17226,6 +17235,10 @@
/obj/effect/landmark/crap_item,
/turf/open/floor/dark,
/area/lv624/lazarus/quartstorage)
+"pKC" = (
+/obj/effect/landmark/lizard_spawn,
+/turf/open/gm/dirtgrassborder/south,
+/area/lv624/ground/jungle/south_east_jungle)
"pKS" = (
/obj/structure/flora/jungle/vines/heavy,
/obj/structure/flora/jungle/vines/light_2,
@@ -18987,6 +19000,14 @@
},
/turf/open/gm/dirt,
/area/lv624/ground/jungle/north_west_jungle)
+"tkN" = (
+/obj/effect/landmark/lizard_spawn,
+/turf/open/gm/grass/grass1,
+/area/lv624/ground/barrens/south_eastern_jungle_barrens)
+"tkS" = (
+/obj/effect/landmark/lizard_spawn,
+/turf/open/gm/dirt,
+/area/lv624/ground/jungle/south_east_jungle)
"tlk" = (
/obj/structure/flora/bush/ausbushes/reedbush,
/turf/open/auto_turf/strata_grass/layer1,
@@ -19599,6 +19620,10 @@
/obj/structure/flora/bush/ausbushes/var3/fullgrass,
/turf/open/auto_turf/strata_grass/layer1,
/area/lv624/ground/caves/south_west_caves)
+"ury" = (
+/obj/effect/landmark/lizard_spawn,
+/turf/open/floor/whiteyellowfull/east,
+/area/lv624/ground/jungle/south_west_jungle/ceiling)
"urR" = (
/turf/open/floor/corsat/squareswood/north,
/area/lv624/ground/caves/sand_temple)
@@ -23033,7 +23058,7 @@ aKb
aKb
lyz
aWl
-qBW
+pcL
aWO
hMd
aWl
@@ -23946,7 +23971,7 @@ auy
aVS
aWl
aWO
-aWO
+ury
aWO
qBW
aVS
@@ -59290,7 +59315,7 @@ lBw
eTQ
opS
opS
-gUq
+pKC
wpw
lBw
lBw
@@ -59744,7 +59769,7 @@ qjt
wpw
wpw
eTQ
-opS
+tkS
lnV
qgA
lBw
@@ -60110,7 +60135,7 @@ jxR
uve
uve
uve
-vty
+tkN
git
vty
moM
@@ -60568,7 +60593,7 @@ uve
vty
vty
nED
-glS
+hUK
vty
uve
uve
diff --git a/maps/map_files/LV624/standalone/sandtemple-jungle.dmm b/maps/map_files/LV624/standalone/sandtemple-jungle.dmm
index 724344cd0743..9e51f09fb628 100644
--- a/maps/map_files/LV624/standalone/sandtemple-jungle.dmm
+++ b/maps/map_files/LV624/standalone/sandtemple-jungle.dmm
@@ -63,6 +63,10 @@
},
/turf/open/gm/grass/grass2,
/area/lv624/ground/jungle/south_west_jungle)
+"lZ" = (
+/obj/effect/landmark/lizard_spawn,
+/turf/open/gm/dirtgrassborder/grassdirt_corner/north_east,
+/area/lv624/ground/jungle/south_west_jungle)
"ny" = (
/obj/structure/flora/bush/ausbushes/lavendergrass,
/turf/open/gm/grass/grass1,
@@ -206,6 +210,10 @@
/obj/structure/flora/jungle/vines/light_1,
/turf/open/gm/grass/grass2,
/area/lv624/ground/jungle/south_west_jungle)
+"Ng" = (
+/obj/effect/landmark/lizard_spawn,
+/turf/open/gm/dirt,
+/area/lv624/ground/jungle/south_west_jungle)
"Nq" = (
/obj/structure/flora/bush/ausbushes/var3/sunnybush,
/turf/open/gm/grass/grass1,
@@ -336,7 +344,7 @@ oD
LW
dy
Ok
-NU
+Ng
NU
Ge
AQ
@@ -383,7 +391,7 @@ uj
uj
uj
eV
-Lz
+lZ
Kn
IP
oD
diff --git a/maps/map_files/LV624/standalone/sandtemple-se.dmm b/maps/map_files/LV624/standalone/sandtemple-se.dmm
index 76d29d2d01ba..7e1db79bab61 100644
--- a/maps/map_files/LV624/standalone/sandtemple-se.dmm
+++ b/maps/map_files/LV624/standalone/sandtemple-se.dmm
@@ -74,6 +74,10 @@
/obj/structure/flora/jungle/vines/light_2,
/turf/open/gm/grass/grass1,
/area/lv624/ground/jungle/south_east_jungle)
+"vt" = (
+/obj/effect/landmark/lizard_spawn,
+/turf/open/gm/dirt,
+/area/lv624/ground/jungle/south_east_jungle)
"wQ" = (
/obj/structure/flora/jungle/vines/heavy{
pixel_x = -28
@@ -109,6 +113,10 @@
/obj/structure/flora/jungle/vines/light_3,
/turf/open/floor/sandstone/runed,
/area/lv624/ground/jungle/south_east_jungle)
+"Kj" = (
+/obj/effect/landmark/lizard_spawn,
+/turf/open/floor/sandstone/runed,
+/area/lv624/ground/jungle/south_east_jungle)
"LV" = (
/turf/open/gm/grass/grass1,
/area/lv624/lazarus/landing_zones/lz1)
@@ -317,7 +325,7 @@ Wt
gU
Xz
Xy
-Xl
+vt
Xl
Xl
Ze
@@ -347,7 +355,7 @@ Tl
aK
Wl
yg
-Xy
+Kj
Xl
br
EZ
diff --git a/maps/map_files/New_Varadero/New_Varadero.dmm b/maps/map_files/New_Varadero/New_Varadero.dmm
index 9dc30d41f4b7..ae297f0cabc4 100644
--- a/maps/map_files/New_Varadero/New_Varadero.dmm
+++ b/maps/map_files/New_Varadero/New_Varadero.dmm
@@ -17360,6 +17360,7 @@
/obj/item/reagent_container/food/drinks/bottle/whiskey,
/obj/item/reagent_container/food/drinks/bottle/wine,
/obj/item/reagent_container/food/drinks/bottle/pwine,
+/obj/item/storage/box/stompers,
/turf/open/floor/wood,
/area/varadero/interior/research)
"nPG" = (
diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm
index 079067d7938a..b5181e0f77f6 100644
--- a/maps/map_files/USS_Almayer/USS_Almayer.dmm
+++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm
@@ -20565,7 +20565,12 @@
/obj/structure/surface/table/almayer,
/obj/item/storage/firstaid/regular,
/obj/item/clipboard,
-/obj/item/tool/pen,
+/obj/item/tool/pen{
+ pixel_y = -17
+ },
+/obj/item/paper_bin/uscm{
+ pixel_y = -16
+ },
/turf/open/floor/almayer/plate,
/area/almayer/squads/req)
"eAI" = (
@@ -32918,6 +32923,12 @@
pixel_y = 10;
req_one_access_txt = "1;21"
},
+/obj/item/paper_bin/uscm{
+ pixel_y = -4
+ },
+/obj/item/tool/pen{
+ pixel_y = -5
+ },
/turf/open/floor/almayer/plate,
/area/almayer/squads/req)
"jOo" = (
@@ -38917,6 +38928,7 @@
/turf/open/floor/almayer/plate,
/area/almayer/medical/morgue)
"mrM" = (
+/obj/structure/closet/secure_closet/quartermaster_uscm,
/turf/open/floor/almayer/green,
/area/almayer/squads/req)
"msg" = (
@@ -39984,6 +39996,7 @@
/area/almayer/squads/req)
"mMP" = (
/obj/effect/landmark/start/intel,
+/obj/effect/landmark/late_join/intel,
/turf/open/floor/plating/plating_catwalk,
/area/almayer/engineering/port_atmos)
"mMV" = (
@@ -41623,8 +41636,12 @@
pixel_x = 4;
pixel_y = 11
},
-/obj/structure/sign/poster/propaganda{
- pixel_y = 34
+/obj/structure/sign/ROcreed{
+ pixel_y = 30
+ },
+/obj/item/device/flashlight/lamp{
+ pixel_y = -11;
+ pixel_x = 7
},
/turf/open/floor/almayer/green/north,
/area/almayer/squads/req)
@@ -44323,6 +44340,7 @@
pixel_y = 29;
serial_number = 12
},
+/obj/effect/landmark/late_join/intel,
/turf/open/floor/plating/plating_catwalk,
/area/almayer/engineering/port_atmos)
"oyO" = (
@@ -46899,7 +46917,9 @@
/area/almayer/engineering/lower)
"pCr" = (
/obj/structure/machinery/cm_vending/sorted/attachments/blend,
-/turf/open/floor/almayer/plate,
+/turf/closed/wall/almayer{
+ opacity = 0
+ },
/area/almayer/squads/req)
"pDh" = (
/obj/structure/machinery/power/monitor{
@@ -52161,6 +52181,9 @@
/area/almayer/maint/hull/upper/p_stern)
"rHN" = (
/obj/structure/pipes/vents/pump/on,
+/obj/structure/bed/chair{
+ dir = 4
+ },
/turf/open/floor/plating/plating_catwalk,
/area/almayer/squads/req)
"rIj" = (
@@ -57643,6 +57666,11 @@
/obj/item/storage/box/m94,
/obj/item/storage/box/m94,
/obj/item/stack/sheet/mineral/plastic/small_stack,
+/obj/item/frame/rack,
+/obj/item/frame/rack,
+/obj/item/frame/rack,
+/obj/item/frame/rack,
+/obj/item/frame/rack,
/turf/open/floor/almayer/test_floor4,
/area/almayer/squads/req)
"tXn" = (
@@ -64472,6 +64500,12 @@
/obj/effect/landmark/start/pilot/dropship_pilot,
/turf/open/floor/plating/plating_catwalk,
/area/almayer/living/pilotbunks)
+"wEF" = (
+/obj/structure/bed/chair{
+ dir = 4
+ },
+/turf/open/floor/almayer,
+/area/almayer/squads/req)
"wEI" = (
/obj/structure/surface/table/reinforced/black,
/obj/item/tool/pen,
@@ -112335,7 +112369,7 @@ mww
sZe
bdl
fgm
-bdj
+wEF
rHN
kuu
mDj
@@ -113770,7 +113804,7 @@ vub
bPL
bCM
xSM
-tez
+cgE
gsm
bCM
bbr
@@ -113973,7 +114007,7 @@ qlz
tez
bCN
ccQ
-tez
+cgE
ccQ
bCN
bbr
@@ -114176,7 +114210,7 @@ qlz
tez
bpV
ccQ
-tez
+cgE
ccQ
cdn
bbr
@@ -114379,7 +114413,7 @@ qlz
tez
bCM
ccQ
-tez
+cgE
ccQ
bCM
bbr
@@ -114582,7 +114616,7 @@ vub
tez
bCN
ccQ
-tez
+cgE
ccQ
bCN
jhb
diff --git a/maps/shuttles/dropship_resolute.dmm b/maps/shuttles/dropship_resolute.dmm
new file mode 100644
index 000000000000..367dee77febd
--- /dev/null
+++ b/maps/shuttles/dropship_resolute.dmm
@@ -0,0 +1,902 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ai" = (
+/turf/open/shuttle/dropship/light_grey_bottom_right,
+/area/shuttle/drop3/sulaco)
+"aC" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "89"
+ },
+/area/shuttle/drop3/sulaco)
+"bc" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "37"
+ },
+/area/shuttle/drop3/sulaco)
+"br" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "25"
+ },
+/area/shuttle/drop3/sulaco)
+"cd" = (
+/obj/item/device/radio/intercom/saipan{
+ pixel_y = 24
+ },
+/turf/open/shuttle/dropship/light_grey_left_to_right,
+/area/shuttle/drop3/sulaco)
+"cB" = (
+/obj/structure/bed/chair/vehicle{
+ dir = 1;
+ pixel_x = 8
+ },
+/obj/structure/bed/chair/vehicle{
+ dir = 1;
+ pixel_x = -8
+ },
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"cQ" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "27"
+ },
+/area/shuttle/drop3/sulaco)
+"cX" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "64"
+ },
+/area/shuttle/drop3/sulaco)
+"dl" = (
+/obj/structure/shuttle/part/dropship3/transparent/upper_right_wing,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"eh" = (
+/obj/item/device/radio/intercom/saipan{
+ pixel_y = 24
+ },
+/turf/open/shuttle/dropship/light_grey_top_left,
+/area/shuttle/drop3/sulaco)
+"ey" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "86"
+ },
+/area/shuttle/drop3/sulaco)
+"fb" = (
+/obj/structure/shuttle/part/dropship3/right_inner_wing_connector,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"fh" = (
+/turf/open/shuttle/dropship/light_grey_bottom_left,
+/area/shuttle/drop3/sulaco)
+"gt" = (
+/obj/structure/blocker/invisible_wall,
+/obj/structure/machinery/computer/cameras/dropship/three,
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"gD" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "36"
+ },
+/area/shuttle/drop3/sulaco)
+"gF" = (
+/obj/item/device/radio/intercom/saipan{
+ layer = 3.5;
+ pixel_x = 10
+ },
+/turf/closed/shuttle/dropship3{
+ icon_state = "54"
+ },
+/area/shuttle/drop3/sulaco)
+"gK" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "67"
+ },
+/area/shuttle/drop3/sulaco)
+"hO" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "63"
+ },
+/area/shuttle/drop3/sulaco)
+"hV" = (
+/obj/effect/attach_point/crew_weapon/dropship3/floor{
+ attach_id = 8
+ },
+/turf/open/shuttle/dropship/light_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"hX" = (
+/obj/effect/attach_point/weapon/dropship3/left_fore,
+/obj/structure/shuttle/part/dropship3/transparent/outer_left_weapons,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"iP" = (
+/obj/structure/shuttle/part/dropship3/lower_right_wall,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"iX" = (
+/obj/effect/attach_point/crew_weapon/dropship3/floor{
+ attach_id = 7
+ },
+/turf/open/shuttle/dropship/light_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"jf" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "75"
+ },
+/area/shuttle/drop3/sulaco)
+"jk" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "22"
+ },
+/area/shuttle/drop3/sulaco)
+"jI" = (
+/obj/structure/shuttle/part/dropship3/transparent/engine_right_exhaust,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"jP" = (
+/obj/structure/blocker/invisible_wall,
+/obj/structure/machinery/computer/shuttle/dropship/flight,
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"jZ" = (
+/obj/structure/shuttle/part/dropship3/transparent/middle_left_wing,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"kP" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "43"
+ },
+/area/shuttle/drop3/sulaco)
+"lr" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "47"
+ },
+/area/shuttle/drop3/sulaco)
+"ls" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "32"
+ },
+/area/shuttle/drop3/sulaco)
+"lH" = (
+/obj/effect/attach_point/weapon/dropship3/right_fore,
+/obj/structure/shuttle/part/dropship3/transparent/outer_right_weapons,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"mg" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "39"
+ },
+/area/shuttle/drop3/sulaco)
+"nq" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "81"
+ },
+/area/shuttle/drop3/sulaco)
+"nB" = (
+/obj/item/device/radio/intercom/saipan{
+ pixel_y = 24
+ },
+/turf/open/shuttle/dropship/light_grey_top_right,
+/area/shuttle/drop3/sulaco)
+"nI" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "18"
+ },
+/area/shuttle/drop3/sulaco)
+"og" = (
+/obj/structure/machinery/camera/autoname/almayer/dropship_three{
+ dir = 4;
+ pixel_x = -16
+ },
+/obj/structure/bed/chair/vehicle{
+ dir = 1;
+ pixel_x = 8
+ },
+/obj/structure/bed/chair/vehicle{
+ dir = 1;
+ pixel_x = -8
+ },
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"pg" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "77"
+ },
+/area/shuttle/drop3/sulaco)
+"qP" = (
+/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds3{
+ dir = 1;
+ id = "starboard_door"
+ },
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"qU" = (
+/obj/docking_port/mobile/marine_dropship/saipan,
+/turf/closed/shuttle/dropship3{
+ icon_state = "53"
+ },
+/area/shuttle/drop3/sulaco)
+"rb" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "73"
+ },
+/area/shuttle/drop3/sulaco)
+"rB" = (
+/obj/structure/shuttle/part/dropship3/transparent/nose_top_right,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"sJ" = (
+/turf/open/shuttle/dropship/light_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"tm" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "50"
+ },
+/area/shuttle/drop3/sulaco)
+"tJ" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "76"
+ },
+/area/shuttle/drop3/sulaco)
+"tP" = (
+/obj/structure/shuttle/part/dropship3/nose_front_left,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"ul" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "19"
+ },
+/area/shuttle/drop3/sulaco)
+"uD" = (
+/obj/structure/shuttle/part/dropship3/transparent/right_outer_bottom_wing,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"uH" = (
+/obj/structure/machinery/door/airlock/hatch/cockpit/three{
+ dir = 1
+ },
+/obj/structure/blocker/forcefield/multitile_vehicles,
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"vm" = (
+/obj/structure/shuttle/part/dropship3/transparent/upper_left_wing,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"vo" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "23"
+ },
+/area/shuttle/drop3/sulaco)
+"wl" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "34"
+ },
+/area/shuttle/drop3/sulaco)
+"wr" = (
+/obj/structure/shuttle/part/dropship3/transparent/left_outer_inner_wing,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"wt" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "48"
+ },
+/area/shuttle/drop3/sulaco)
+"wW" = (
+/obj/structure/shuttle/part/dropship3/lower_left_wall,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"wY" = (
+/obj/structure/shuttle/part/dropship3/left_inner_wing_connector,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"xi" = (
+/obj/item/device/radio/intercom/saipan{
+ layer = 3.5;
+ pixel_x = 21;
+ pixel_y = 43
+ },
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"xB" = (
+/obj/effect/attach_point/weapon/dropship3/left_wing,
+/obj/structure/shuttle/part/dropship3/transparent/lower_left_wing,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"yM" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "69"
+ },
+/area/shuttle/drop3/sulaco)
+"yQ" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "35"
+ },
+/area/shuttle/drop3/sulaco)
+"zW" = (
+/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds3{
+ id = "port_door";
+ dir = 2
+ },
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"BR" = (
+/obj/structure/machinery/door_control{
+ id = "dropship_saipan";
+ name = "Dropship Lockdown";
+ normaldoorcontrol = 3;
+ pixel_y = -19;
+ req_one_access_txt = "3;22";
+ throw_range = 15
+ },
+/turf/open/shuttle/dropship/light_grey_single_wide_left_to_right,
+/area/shuttle/drop3/sulaco)
+"Cz" = (
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"Dx" = (
+/obj/structure/shuttle/part/dropship3/transparent/nose_top_left,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"El" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "59"
+ },
+/area/shuttle/drop3/sulaco)
+"EG" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "98"
+ },
+/area/shuttle/drop3/sulaco)
+"FG" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "68"
+ },
+/area/shuttle/drop3/sulaco)
+"FV" = (
+/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
+ pixel_x = 30
+ },
+/obj/structure/bed/chair/vehicle{
+ dir = 1;
+ pixel_x = 8
+ },
+/obj/structure/bed/chair/vehicle{
+ dir = 1;
+ pixel_x = -8
+ },
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"Gl" = (
+/obj/structure/bed/chair/dropship/pilot{
+ dir = 1
+ },
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"GH" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "26"
+ },
+/area/shuttle/drop3/sulaco)
+"Hm" = (
+/obj/structure/shuttle/part/dropship3/nose_front_right,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"Hu" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "72"
+ },
+/area/shuttle/drop3/sulaco)
+"HF" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "97"
+ },
+/area/shuttle/drop3/sulaco)
+"HW" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "24"
+ },
+/area/shuttle/drop3/sulaco)
+"Iu" = (
+/obj/effect/attach_point/fuel/dropship3{
+ dir = 1;
+ attach_id = 10
+ },
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "28"
+ },
+/area/shuttle/drop3/sulaco)
+"IF" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "51"
+ },
+/area/shuttle/drop3/sulaco)
+"Jc" = (
+/obj/effect/attach_point/weapon/dropship3/right_wing,
+/obj/structure/shuttle/part/dropship3/transparent/lower_right_wing,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"Kc" = (
+/obj/structure/shuttle/part/dropship3/right_outer_wing_connector,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"Kn" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "83"
+ },
+/area/shuttle/drop3/sulaco)
+"KR" = (
+/turf/open/shuttle/dropship/light_grey_left_to_right,
+/area/shuttle/drop3/sulaco)
+"Mj" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "94"
+ },
+/area/shuttle/drop3/sulaco)
+"Mu" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "38"
+ },
+/area/shuttle/drop3/sulaco)
+"MM" = (
+/obj/structure/shuttle/part/dropship3/transparent/right_inner_bottom_wing,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"MR" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "31"
+ },
+/area/shuttle/drop3/sulaco)
+"Na" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "80"
+ },
+/area/shuttle/drop3/sulaco)
+"Nf" = (
+/obj/structure/shuttle/part/dropship3/transparent/engine_left_exhaust,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"Ns" = (
+/obj/structure/shuttle/part/dropship3/transparent/middle_right_wing,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"Nt" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "14"
+ },
+/area/shuttle/drop3/sulaco)
+"NV" = (
+/obj/effect/attach_point/electronics/dropship3{
+ dir = 1;
+ attach_id = 6
+ },
+/obj/structure/shuttle/part/dropship3/transparent/inner_right_weapons,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"Of" = (
+/obj/effect/attach_point/crew_weapon/dropship3/floor{
+ attach_id = 9
+ },
+/turf/open/shuttle/dropship/light_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"OK" = (
+/obj/structure/bed/chair/dropship/pilot{
+ dir = 1
+ },
+/obj/structure/machinery/camera/autoname/almayer/dropship_three{
+ pixel_x = 8;
+ pixel_y = -16
+ },
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"OU" = (
+/obj/structure/shuttle/part/dropship3/bottom_right_wall,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"OZ" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "29"
+ },
+/area/shuttle/drop3/sulaco)
+"Pb" = (
+/obj/structure/shuttle/part/dropship3/bottom_left_wall,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"Pc" = (
+/obj/structure/bed/chair/vehicle{
+ pixel_x = 8
+ },
+/obj/structure/bed/chair/vehicle{
+ pixel_x = -8
+ },
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"Pv" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "30"
+ },
+/area/shuttle/drop3/sulaco)
+"PS" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "78"
+ },
+/area/shuttle/drop3/sulaco)
+"PY" = (
+/obj/structure/shuttle/part/dropship3/left_outer_wing_connector,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"Qy" = (
+/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
+ pixel_x = -30
+ },
+/obj/structure/bed/chair/vehicle{
+ dir = 1;
+ pixel_x = 8
+ },
+/obj/structure/bed/chair/vehicle{
+ dir = 1;
+ pixel_x = -8
+ },
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"QI" = (
+/obj/structure/machinery/computer/dropship_weapons/dropship3,
+/obj/structure/transmitter/rotary{
+ name = "saipan Telephone";
+ phone_category = "Dropship";
+ phone_id = "saipan";
+ pixel_x = 11;
+ pixel_y = 16
+ },
+/obj/structure/blocker/invisible_wall,
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"Rj" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "92"
+ },
+/area/shuttle/drop3/sulaco)
+"Rn" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "82"
+ },
+/area/shuttle/drop3/sulaco)
+"Sj" = (
+/obj/structure/shuttle/part/dropship3/transparent/left_outer_bottom_wing,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"Sx" = (
+/obj/structure/shuttle/part/dropship3/transparent/engine_left_cap,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"SD" = (
+/turf/template_noop,
+/area/template_noop)
+"SH" = (
+/obj/structure/machinery/camera/autoname/almayer/dropship_three{
+ dir = 8;
+ pixel_x = 16
+ },
+/obj/structure/bed/chair/vehicle{
+ pixel_x = 8
+ },
+/obj/structure/bed/chair/vehicle{
+ pixel_x = -8
+ },
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"SM" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "10"
+ },
+/area/shuttle/drop3/sulaco)
+"SP" = (
+/obj/effect/attach_point/electronics/dropship3{
+ dir = 1
+ },
+/obj/structure/shuttle/part/dropship3/transparent/inner_left_weapons,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"Tc" = (
+/obj/structure/shuttle/part/dropship3/transparent/nose_center,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"Tq" = (
+/obj/structure/shuttle/part/dropship3/transparent/engine_right_cap,
+/turf/template_noop,
+/area/shuttle/drop3/sulaco)
+"Tx" = (
+/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ds3{
+ id = "aft_door"
+ },
+/turf/open/shuttle/dropship/medium_grey_single_wide_up_to_down,
+/area/shuttle/drop3/sulaco)
+"TZ" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "42"
+ },
+/area/shuttle/drop3/sulaco)
+"Vf" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "62"
+ },
+/area/shuttle/drop3/sulaco)
+"Vl" = (
+/obj/item/device/radio/intercom/saipan{
+ layer = 3.5;
+ pixel_x = -10
+ },
+/turf/closed/shuttle/dropship3{
+ icon_state = "52"
+ },
+/area/shuttle/drop3/sulaco)
+"VM" = (
+/obj/effect/attach_point/fuel/dropship3{
+ dir = 1;
+ pixel_x = -32;
+ attach_id = 11
+ },
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "33"
+ },
+/area/shuttle/drop3/sulaco)
+"VQ" = (
+/turf/closed/shuttle/dropship3{
+ icon_state = "56"
+ },
+/area/shuttle/drop3/sulaco)
+"Zk" = (
+/turf/closed/shuttle/dropship3/transparent{
+ icon_state = "96"
+ },
+/area/shuttle/drop3/sulaco)
+
+(1,1,1) = {"
+SD
+SD
+SD
+SD
+SD
+vm
+jZ
+xB
+SD
+SD
+SD
+SD
+SD
+Sx
+wl
+Iu
+jk
+Nf
+SD
+SD
+SD
+"}
+(2,1,1) = {"
+SD
+SD
+SD
+hX
+jf
+Hu
+gK
+Vf
+Cz
+zW
+Vl
+tm
+wW
+Tq
+yQ
+OZ
+vo
+jI
+SD
+SD
+Sj
+"}
+(3,1,1) = {"
+SD
+SD
+SD
+SP
+tJ
+Pc
+og
+Pc
+Cz
+Cz
+Pc
+cB
+lr
+TZ
+gD
+Pv
+HW
+nI
+Pb
+SD
+wr
+"}
+(4,1,1) = {"
+Dx
+tP
+Rj
+ey
+pg
+eh
+sJ
+sJ
+sJ
+sJ
+sJ
+fh
+Pc
+Qy
+Pc
+cB
+Pc
+cB
+SM
+wY
+PY
+"}
+(5,1,1) = {"
+Tc
+Zk
+gt
+OK
+PS
+KR
+Pc
+cB
+Pc
+cB
+Pc
+KR
+sJ
+sJ
+sJ
+sJ
+sJ
+sJ
+Tx
+SD
+SD
+"}
+(6,1,1) = {"
+Tc
+HF
+jP
+xi
+uH
+BR
+FG
+hO
+El
+VQ
+qU
+cd
+sJ
+iX
+sJ
+hV
+sJ
+Of
+Cz
+SD
+SD
+"}
+(7,1,1) = {"
+Tc
+EG
+QI
+Gl
+Na
+KR
+Pc
+cB
+Pc
+cB
+Pc
+KR
+sJ
+sJ
+sJ
+sJ
+sJ
+sJ
+Cz
+SD
+SD
+"}
+(8,1,1) = {"
+rB
+Hm
+Mj
+aC
+nq
+nB
+sJ
+sJ
+sJ
+sJ
+sJ
+ai
+Pc
+FV
+SH
+cB
+Pc
+cB
+Nt
+fb
+Kc
+"}
+(9,1,1) = {"
+SD
+SD
+SD
+NV
+Rn
+Pc
+cB
+Pc
+Cz
+Cz
+Pc
+cB
+wt
+kP
+bc
+MR
+br
+ul
+OU
+SD
+MM
+"}
+(10,1,1) = {"
+SD
+SD
+SD
+lH
+Kn
+rb
+yM
+cX
+Cz
+qP
+gF
+IF
+iP
+Sx
+Mu
+ls
+GH
+Nf
+SD
+SD
+uD
+"}
+(11,1,1) = {"
+SD
+SD
+SD
+SD
+SD
+dl
+Ns
+Jc
+SD
+SD
+SD
+SD
+SD
+Tq
+mg
+VM
+cQ
+jI
+SD
+SD
+SD
+"}
diff --git a/maps/templates/lazy_templates/pizza_ert_station.dmm b/maps/templates/lazy_templates/pizza_ert_station.dmm
index c52f388356c8..a3cc4e7a02ec 100644
--- a/maps/templates/lazy_templates/pizza_ert_station.dmm
+++ b/maps/templates/lazy_templates/pizza_ert_station.dmm
@@ -1391,7 +1391,7 @@
/area/adminlevel/ert_station/pizza_station)
"sp" = (
/obj/structure/surface/table/reinforced,
-/obj/item/weapon/pizza_cutter,
+/obj/item/tool/kitchen/pizzacutter,
/turf/open/floor/prison/kitchen,
/area/adminlevel/ert_station/pizza_station)
"sx" = (
@@ -2986,7 +2986,7 @@
"MB" = (
/obj/structure/surface/table/reinforced,
/obj/item/pizzabox/meat,
-/obj/item/weapon/pizza_cutter,
+/obj/item/tool/kitchen/pizzacutter,
/turf/open/floor/cmo,
/area/adminlevel/ert_station/pizza_station)
"MK" = (
diff --git a/sound/ATTRIBUTION.txt b/sound/ATTRIBUTION.txt
new file mode 100644
index 000000000000..03dd02d49db4
--- /dev/null
+++ b/sound/ATTRIBUTION.txt
@@ -0,0 +1,3 @@
+giant_lizard_growl1.ogg, giant_lizard_growl2.ogg by D.jones -- https://freesound.org/s/527844/ -- License: Creative Commons 0
+giant_lizard_death.wav by craigsmith -- https://freesound.org/s/437933/ -- License: Creative Commons 0
+giant_lizard_hiss1.ogg, giant_lizard_hiss2.ogg by ZapSplat -- https://www.zapsplat.com/sound-effect-category/alligators-and-crocodiles/ -- License: ZapSplat Standard License
diff --git a/sound/effects/giant_lizard_death.ogg b/sound/effects/giant_lizard_death.ogg
new file mode 100644
index 000000000000..fe8cf05dc1ee
Binary files /dev/null and b/sound/effects/giant_lizard_death.ogg differ
diff --git a/sound/effects/giant_lizard_growl1.ogg b/sound/effects/giant_lizard_growl1.ogg
new file mode 100644
index 000000000000..7dfd52b211ed
Binary files /dev/null and b/sound/effects/giant_lizard_growl1.ogg differ
diff --git a/sound/effects/giant_lizard_growl2.ogg b/sound/effects/giant_lizard_growl2.ogg
new file mode 100644
index 000000000000..00d85d78ecb6
Binary files /dev/null and b/sound/effects/giant_lizard_growl2.ogg differ
diff --git a/sound/effects/giant_lizard_hiss1.ogg b/sound/effects/giant_lizard_hiss1.ogg
new file mode 100644
index 000000000000..105a0edb6d74
Binary files /dev/null and b/sound/effects/giant_lizard_hiss1.ogg differ
diff --git a/sound/effects/giant_lizard_hiss2.ogg b/sound/effects/giant_lizard_hiss2.ogg
new file mode 100644
index 000000000000..5a0d143ef15f
Binary files /dev/null and b/sound/effects/giant_lizard_hiss2.ogg differ
diff --git a/sound/effects/revive_notify.ogg b/sound/effects/revive_notify.ogg
new file mode 100644
index 000000000000..d155f345181c
Binary files /dev/null and b/sound/effects/revive_notify.ogg differ
diff --git a/sound/items/megaphone.ogg b/sound/items/megaphone.ogg
new file mode 100644
index 000000000000..31d7a8d1ad96
Binary files /dev/null and b/sound/items/megaphone.ogg differ
diff --git a/sound/machines/vending_drop.ogg b/sound/machines/vending_drop.ogg
new file mode 100644
index 000000000000..4e0ed7dd6d89
Binary files /dev/null and b/sound/machines/vending_drop.ogg differ
diff --git a/sound/weapons/sting_boom_small1.ogg b/sound/weapons/sting_boom_small1.ogg
new file mode 100644
index 000000000000..fb02d14a68fa
Binary files /dev/null and b/sound/weapons/sting_boom_small1.ogg differ
diff --git a/strings/marinetips.txt b/strings/marinetips.txt
index 253860e1eddd..92f674b36906 100644
--- a/strings/marinetips.txt
+++ b/strings/marinetips.txt
@@ -102,3 +102,6 @@ ARES will periodically report the amount of available tech points on Command Cha
The quick wield keys generally prioritize wieldable gear going from left to right on your inventory bar.
Orbital Bombardment warheads respect roofing and hive core protection. They won't hit inside of protected areas.
The Queen can unbolt and break dropship doors by prying them open, even if they are unlocked. Pilots, Dropship Crew Chiefs, Engineers and Synths can repair these doors with a multitool.
+If you jump out of a dropship with a parachute on (when there is no paradrop system active), you will land at a random location on the map.
+If you push crates out of a dropship when paradropping, it will land near the paradrop drop point.
+When paradropping, you can toss any large item (such as a backpack, pouch, or gun) into hyperspace, and it will land near the paradrop drop point. However, smaller items such as flares will not survive the fall.
diff --git a/strings/memetips.txt b/strings/memetips.txt
index abfe0872180c..1767d8688953 100644
--- a/strings/memetips.txt
+++ b/strings/memetips.txt
@@ -48,3 +48,4 @@ ARES is not sentient. It has no feelings and its only thoughts are pre-programme
Remember that as Yautja HPCs are your primary weapons.
You can always bully staff into giving you more awesome tips.
Embrace the suck.
+Jump out of the Alamo during transit to deploy quicker than other players.
diff --git a/strings/operation_prefix.txt b/strings/operation_prefix.txt
index c20b08b42df9..9edac4ba3e79 100644
--- a/strings/operation_prefix.txt
+++ b/strings/operation_prefix.txt
@@ -114,7 +114,7 @@ Northern
Industrial
All American
Clear
-Resolute
+Saipan
Mutual
101st
13th
diff --git a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
index 5ea797fe2230..a430d06b7a00 100644
--- a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
+++ b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
@@ -1449,6 +1449,14 @@ em {
animation: glitch 0.5s infinite;
}
+.psy_talk {
+ color: #c400aa;
+ font-weight: bold;
+
+ /*Animation*/
+ animation: psy_glitch 0.5s infinite;
+}
+
/*Keyframes*/
@keyframes glitch {
@@ -1473,6 +1481,28 @@ em {
}
}
+@keyframes psy_glitch {
+ 25% {
+ color: #c400aa;
+ transform: translate(-2px, -1px);
+ }
+
+ 50% {
+ color: #91007d;
+ transform: translate(1px, -2px);
+ }
+
+ 75% {
+ color: #750066;
+ transform: translate(-1px, 2px);
+ }
+
+ 100% {
+ color: #7c016c;
+ transform: translate(1px, 1px);
+ }
+}
+
.examine_block {
background: #1b1c1e;
border: 1px solid #a4bad6;
diff --git a/tgui/packages/tgui-panel/styles/goon/chat-light.scss b/tgui/packages/tgui-panel/styles/goon/chat-light.scss
index 87beb202a5ae..23ea05b1c9c1 100644
--- a/tgui/packages/tgui-panel/styles/goon/chat-light.scss
+++ b/tgui/packages/tgui-panel/styles/goon/chat-light.scss
@@ -1471,6 +1471,14 @@ h2.alert {
animation: glitch 0.5s infinite;
}
+.psy_talk {
+ color: #a70090;
+ font-weight: bold;
+
+ /*Animation*/
+ animation: psy_glitch 0.5s infinite;
+}
+
/*Keyframes*/
@keyframes glitch {
@@ -1495,6 +1503,28 @@ h2.alert {
}
}
+@keyframes psy_glitch {
+ 25% {
+ color: #a70090;
+ transform: translate(-2px, -1px);
+ }
+
+ 50% {
+ color: #91007d;
+ transform: translate(1px, -2px);
+ }
+
+ 75% {
+ color: #750066;
+ transform: translate(-1px, 2px);
+ }
+
+ 100% {
+ color: #7c016c;
+ transform: translate(1px, 1px);
+ }
+}
+
.examine_block {
background: #f2f7fa;
border: 1px solid #111a27;
diff --git a/tgui/packages/tgui/interfaces/XenomorphExtractor.jsx b/tgui/packages/tgui/interfaces/XenomorphExtractor.jsx
index 990f3651fe66..e2370d1a25e0 100644
--- a/tgui/packages/tgui/interfaces/XenomorphExtractor.jsx
+++ b/tgui/packages/tgui/interfaces/XenomorphExtractor.jsx
@@ -1,5 +1,6 @@
-import { useBackend } from '../backend';
import { useState } from 'react';
+
+import { useBackend } from '../backend';
import {
Box,
Button,
@@ -107,7 +108,6 @@ export const XenomorphExtractor = () => {
onClick={() =>
act('produce', {
ref: upgrades.ref,
- vari: upgrades.vari,
})
}
>