diff --git a/code/__DEFINES/mode.dm b/code/__DEFINES/mode.dm
index 218bfef5eb40..94428ba7d9b3 100644
--- a/code/__DEFINES/mode.dm
+++ b/code/__DEFINES/mode.dm
@@ -91,8 +91,8 @@
//=================================================
-//Number of marine players against which the Marine's gear scales
-#define MARINE_GEAR_SCALING_NORMAL 30
+/// Number of weighted marine players for 1 gear_scale. gear_scale is clamped to 1 minimum
+#define MARINE_GEAR_SCALING_NORMAL 50
#define RESOURCE_NODE_SCALE 95 //How many players minimum per extra set of resource nodes
#define RESOURCE_NODE_QUANTITY_PER_POP 11 //How many resources total per pop
diff --git a/code/__DEFINES/paygrade_defs/civilian.dm b/code/__DEFINES/paygrade_defs/civilian.dm
new file mode 100644
index 000000000000..ed99a363dedd
--- /dev/null
+++ b/code/__DEFINES/paygrade_defs/civilian.dm
@@ -0,0 +1,35 @@
+// Paygrade shorthand defines, to allow clearer designation.
+
+// Civilians
+/// CIV, Civilian
+#define PAY_SHORT_CIV "CIV"
+
+/// CNUR, Nurse
+#define PAY_SHORT_CNUR "CNUR"
+
+/// CDOC, Doctor
+#define PAY_SHORT_CDOC "CDOC"
+
+/// CCMO, Professor
+#define PAY_SHORT_CCMO "CCMO"
+
+/// CREP, Representative
+#define PAY_SHORT_CREP "CREP"
+
+/// SYN, Synthetic
+#define PAY_SHORT_SYN "SYN"
+
+/// OPR, Operative
+#define PAY_SHORT_OPR "OPR"
+
+/// CPO, Officer
+#define PAY_SHORT_CPO "CPO"
+
+/// CSPO, Senior Officer
+#define PAY_SHORT_CSPO "CSPO"
+
+/// REB, Rebel
+#define PAY_SHORT_REB "REB"
+
+/// REBC, Rebel Commander "REBC"
+#define PAY_SHORT_REBC "REBC"
diff --git a/code/__DEFINES/paygrade_defs/cmb.dm b/code/__DEFINES/paygrade_defs/cmb.dm
new file mode 100644
index 000000000000..8ebd7902dbf8
--- /dev/null
+++ b/code/__DEFINES/paygrade_defs/cmb.dm
@@ -0,0 +1,20 @@
+// Paygrade shorthand defines, to allow clearer designation.
+
+// Colonial Marshal Bureau
+/// IHRO, Interstellar Human Rights Observer
+#define PAY_SHORT_IHRO "IHRO"
+
+/// ICCL, Interstellar Commerce Commission Corporate Liaison
+#define PAY_SHORT_ICCL "ICCL"
+
+/// ICCA, Interstellar Commerce Commission Agent
+#define PAY_SHORT_ICCA "ICCA"
+
+/// CMBM, CMB Marshal
+#define PAY_SHORT_CMBM "CMBM"
+
+/// CMBD, CMB Deputy
+#define PAY_SHORT_CMBD "CMBD"
+
+/// CMBS, CMB Synthetic
+#define PAY_SHORT_CMBS "CMBS"
diff --git a/code/__DEFINES/paygrade_defs/dutch.dm b/code/__DEFINES/paygrade_defs/dutch.dm
new file mode 100644
index 000000000000..299096060f3f
--- /dev/null
+++ b/code/__DEFINES/paygrade_defs/dutch.dm
@@ -0,0 +1,17 @@
+// Paygrade shorthand defines, to allow clearer designation.
+
+// Dutches Dozen
+/// DTC, Dutch's Dozen Standard Mercenary
+#define PAY_SHORT_DTC "DTC"
+
+/// DTCM, Dutch's Dozen Medic
+#define PAY_SHORT_DTCM "DTCM"
+
+/// DTCF, Dutch's Dozen Flamethrower Specialist
+#define PAY_SHORT_DTCF "DTCF"
+
+/// DTCMG, Dutch's Dozen Machinegunner
+#define PAY_SHORT_DTCMG "DTCMG"
+
+/// DTCA, Arnold
+#define PAY_SHORT_DTCA "DTCA"
diff --git a/code/__DEFINES/paygrade_defs/marines.dm b/code/__DEFINES/paygrade_defs/marines.dm
new file mode 100644
index 000000000000..74b659630820
--- /dev/null
+++ b/code/__DEFINES/paygrade_defs/marines.dm
@@ -0,0 +1,80 @@
+// Paygrade shorthand defines, to allow clearer designation.
+
+// USCM MARINES
+/// ME1, Private
+#define PAY_SHORT_ME1 "ME1"
+
+/// ME2, Private First Class
+#define PAY_SHORT_ME2 "ME2"
+
+/// ME3, Lance Corporal
+#define PAY_SHORT_ME3 "ME3"
+
+/// ME4, Corporal
+#define PAY_SHORT_ME4 "ME4"
+
+/// ME5, Sergeant
+#define PAY_SHORT_ME5 "ME5"
+
+/// ME6, Staff Sergeant
+#define PAY_SHORT_ME6 "ME6"
+
+/// ME7, Gunnery Sergeant
+#define PAY_SHORT_ME7 "ME7"
+
+/// ME8, Master Sergeant
+#define PAY_SHORT_ME8 "ME8"
+
+/// ME8E, First Sergeant
+#define PAY_SHORT_ME8E "ME8E"
+
+/// ME9, Master Gunnery Sergeant
+#define PAY_SHORT_ME9 "ME9"
+
+/// ME9E, Sergeant Major
+#define PAY_SHORT_ME9E "ME9E"
+
+/// ME9C, Sergeant Major of the Colonial Marine Corps
+#define PAY_SHORT_ME9C "ME9C"
+
+/// MO1, Second Lieutenant
+#define PAY_SHORT_MO1 "MO1"
+
+/// MO2, First Lieutenant
+#define PAY_SHORT_MO2 "MO2"
+/// MO3, Captain
+
+#define PAY_SHORT_MO3 "MO3"
+/// MO4, Major
+
+#define PAY_SHORT_MO4 "MO4"
+/// MO5, Lieutenant Colonel
+
+#define PAY_SHORT_MO5 "MO5"
+/// MO6, Colonel
+
+#define PAY_SHORT_MO6 "MO6"
+/// MO6E, Senior Colonel
+
+#define PAY_SHORT_MO6E "MO6E"
+/// MO6C, Division Colonel
+
+#define PAY_SHORT_MO6C "MO6C"
+/// MO7, Brigadier General
+
+#define PAY_SHORT_MO7 "MO7"
+/// MO8, Major General
+
+#define PAY_SHORT_MO8 "MO8"
+/// MO9, Lieutenant General
+
+#define PAY_SHORT_MO9 "MO9"
+/// MO10, General
+
+#define PAY_SHORT_MO10 "MO10"
+
+/// MO10C, Assistant Commandant of the Marine Corps
+#define PAY_SHORT_MO10C "MO10C"
+
+/// MO10S, Commandant of the Marine Corps
+#define PAY_SHORT_MO10S "MO10S"
diff --git a/code/__DEFINES/paygrade_defs/navy.dm b/code/__DEFINES/paygrade_defs/navy.dm
new file mode 100644
index 000000000000..d51cccb8fe97
--- /dev/null
+++ b/code/__DEFINES/paygrade_defs/navy.dm
@@ -0,0 +1,74 @@
+// Paygrade shorthand defines, to allow clearer designation.
+
+// USCM NAVY
+/// NE1, Seaman Recruit
+#define PAY_SHORT_NE1 "NE1"
+
+/// NE2M, Seaman Apprentice
+#define PAY_SHORT_NE2 "NE2"
+
+/// NE3, Seaman
+#define PAY_SHORT_NE3 "NE3"
+
+/// NE4, Petty Officer 3rd Class
+#define PAY_SHORT_NE4 "NE4"
+
+/// NE5, Petty Officer 2nd Class
+#define PAY_SHORT_NE5 "NE5"
+
+/// NE6, Petty Officer 1st Class
+#define PAY_SHORT_NE6 "N36"
+
+/// NE7, Chief Petty Officer
+#define PAY_SHORT_NE7 "NE7"
+
+/// NE8, Senior Chief Petty Officer
+#define PAY_SHORT_NE8 "NE8"
+
+/// NE8C, Command Senior Chief Petty Officer
+#define PAY_SHORT_NE8C "NE8C"
+
+/// NE9, Master Chief Petty Officer
+#define PAY_SHORT_NE9 "NE9"
+
+/// NE9C, Command Master Chief Petty Officer
+#define PAY_SHORT_NE9C "NE9C"
+
+/// NO1, Ensign
+#define PAY_SHORT_NO1 "NO1"
+
+/// NO2, Lieutenant Junior Grade
+#define PAY_SHORT_NO2 "NO2"
+
+/// NO3, Lieutenant
+#define PAY_SHORT_NO3 "NO3"
+
+/// NO4, Lieutenant Commander
+#define PAY_SHORT_NO4 "NO4"
+
+/// NO5, Commander
+#define PAY_SHORT_NO5 "NO5"
+
+/// NO6, Captain
+#define PAY_SHORT_NO6 "NO6"
+
+/// NO6E, Commodore
+#define PAY_SHORT_NO6E "NO6E"
+
+/// NO6C, Senior Commodore
+#define PAY_SHORT_NO6C "NO6C"
+
+/// NO7, Rear Admiral (Lower Half)
+#define PAY_SHORT_NO7 "NO7"
+
+/// NO8, Rear Admiral (Upper Half)
+#define PAY_SHORT_NO8 "NO8"
+
+/// NO9, Vice Admiral
+#define PAY_SHORT_NO9 "NO9"
+
+/// NO10, Admiral
+#define PAY_SHORT_NO10 "NO10"
+
+/// NO10C, Chief of Naval Operations
+#define PAY_SHORT_NO10C "NO10C"
diff --git a/code/__DEFINES/paygrade_defs/provost.dm b/code/__DEFINES/paygrade_defs/provost.dm
new file mode 100644
index 000000000000..5b2121642d52
--- /dev/null
+++ b/code/__DEFINES/paygrade_defs/provost.dm
@@ -0,0 +1,14 @@
+// Paygrade shorthand defines, to allow clearer designation.
+
+// PROVOST OFFICE
+/// PvI, Provost Inspector
+#define PAY_SHORT_PVI "PvI"
+
+/// PvM, Provost Marshal
+#define PAY_SHORT_PVM "PvM"
+
+/// PvSM, Provost Sector Marshal
+#define PAY_SHORT_PVSM "PvSM"
+
+/// PvCM, Provost Chief Marshal
+#define PAY_SHORT_PVCM "PvCM"
diff --git a/code/__DEFINES/paygrade_defs/upp.dm b/code/__DEFINES/paygrade_defs/upp.dm
new file mode 100644
index 000000000000..40c0d8441b2e
--- /dev/null
+++ b/code/__DEFINES/paygrade_defs/upp.dm
@@ -0,0 +1,59 @@
+// Paygrade shorthand defines, to allow clearer designation.
+
+// Union of Progressive Peoples
+/// UE,
+#define PAY_SHORT_UEC "UEC"
+
+/// UE1, Private
+#define PAY_SHORT_UE1 "UE1"
+
+/// UE2, Private First Class
+#define PAY_SHORT_UE2 "UE2"
+
+/// UE3, Korporal
+#define PAY_SHORT_UE3 "UE3"
+
+/// UE4, unior Serzhant
+#define PAY_SHORT_UE4 "UE4"
+
+/// UE5, Serzhant
+#define PAY_SHORT_UE5 "UE5"
+
+/// UE6, Master Serzhant
+#define PAY_SHORT_UE6 "UE6"
+
+/// UC1, Junior Kommando
+#define PAY_SHORT_UC1 "UC1"
+
+/// UC2, 2nd Kommando
+#define PAY_SHORT_UC2 "UC2"
+
+/// UC3, 1st Kommando
+#define PAY_SHORT_UC3 "UC3"
+
+/// UO1, Leytenant
+#define PAY_SHORT_UO1 "UO1"
+
+/// UO2, Senior Leytenant
+#define PAY_SHORT_UO2 "UO2"
+
+/// UO3, Kapitan
+#define PAY_SHORT_UO3 "UO3"
+
+/// UO4, Mayjor
+#define PAY_SHORT_UO4 "UO4"
+
+/// UO5, Leytenant Kolonel
+#define PAY_SHORT_UO5 "UO5"
+
+/// UO6, Kolonel
+#define PAY_SHORT_UO6 "UO6"
+
+/// UO7, Mayjor General
+#define PAY_SHORT_UO7 "UO7"
+
+/// UO8, Leytenant General
+#define PAY_SHORT_UO8 "UO8"
+
+/// UO9, Army General
+#define PAY_SHORT_UO9 "UO9"
diff --git a/code/__DEFINES/paygrade_defs/weyland.dm b/code/__DEFINES/paygrade_defs/weyland.dm
new file mode 100644
index 000000000000..1b6c168e9b6e
--- /dev/null
+++ b/code/__DEFINES/paygrade_defs/weyland.dm
@@ -0,0 +1,32 @@
+// Paygrade shorthand defines, to allow clearer designation.
+
+// Weyland Yutani
+/// WYC1, Trainee
+#define PAY_SHORT_WYC1 "WYC1"
+
+/// WYC2, Junior Executive
+#define PAY_SHORT_WYC2 "WYC2"
+
+/// WYC3, Executive
+#define PAY_SHORT_WYC3 "WYC3"
+
+/// WYC4, Senior Executive
+#define PAY_SHORT_WYC4 "WYC4"
+
+/// WYC5, Executive Specialist
+#define PAY_SHORT_WYC5 "WYC5"
+
+/// WYC6, Executive Supervisor
+#define PAY_SHORT_WYC6 "WYC6"
+
+/// WYC7, Assistant Manager
+#define PAY_SHORT_WYC7 "WYC7"
+
+/// WYC8, Division Manager
+#define PAY_SHORT_WYC8 "WYC8"
+
+/// WYC9, Chief Executive
+#define PAY_SHORT_WYC9 "WYC9"
+
+/// WYC10, Director
+#define PAY_SHORT_WYC10 "WYC10"
diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm
index e2bd155fcb0d..cc1831501bad 100644
--- a/code/__DEFINES/radio.dm
+++ b/code/__DEFINES/radio.dm
@@ -61,6 +61,10 @@
#define RADIO_CHANNEL_PMC_CCT "PMC CCT"
#define RADIO_CHANNEL_WY_WO "SpecOps"
+//Listening Devices
+#define RADIO_CHANNEL_BUG_A "Listening Device A"
+#define RADIO_CHANNEL_BUG_B "Listening Device B"
+
//1-Channel ERTs
#define RADIO_CHANNEL_DUTCH_DOZEN "DD"
#define RADIO_CHANNEL_VAI "VAI"
diff --git a/code/__DEFINES/skills.dm b/code/__DEFINES/skills.dm
index 5dabb4545a32..d33e26c1c3f6 100644
--- a/code/__DEFINES/skills.dm
+++ b/code/__DEFINES/skills.dm
@@ -42,6 +42,8 @@
#define SKILL_SPEC_DEFAULT 0
/// Is trained to use specialist gear, but hasn't picked a kit.
#define SKILL_SPEC_TRAINED 1
+/// Is trained to use specialist gear & HAS picked a kit. (Functionally same as SPEC_ROCKET)
+#define SKILL_SPEC_KITTED 2
/// Can use RPG
#define SKILL_SPEC_ROCKET 2
/// Can use thermal cloaks and custom M4RA rifle
diff --git a/code/__DEFINES/supply.dm b/code/__DEFINES/supply.dm
new file mode 100644
index 000000000000..0369b271207c
--- /dev/null
+++ b/code/__DEFINES/supply.dm
@@ -0,0 +1,17 @@
+//We use the cost to determine the spawn chance this equals out the crates that spawn later in the round.
+#define ASRS_HIGHEST_WEIGHT 0 //warning this weight wont change.
+#define ASRS_VERY_HIGH_WEIGHT 5
+#define ASRS_HIGH_WEIGHT 15
+#define ASRS_MEDIUM_WEIGHT 25
+#define ASRS_LOW_WEIGHT 35
+#define ASRS_VERY_LOW_WEIGHT 50
+#define ASRS_LOWEST_WEIGHT 100
+
+// List of pools of supply packs, rolled individually by the ASRS system
+/// Main pool of ASRS supplies, dispensing military supplies such as ammo
+#define ASRS_POOL_MAIN "Main"
+/// Secondary ASRS pool dispening food related items for MessTech
+#define ASRS_POOL_FOOD "Food"
+
+/// Divider to the amount of xeno forces on the planet to ASRS provided crates. It is used as such sqrt(xenos/ASRS_XENO_CRATES_DIVIDER))
+#define ASRS_XENO_CRATES_DIVIDER 4
diff --git a/code/__DEFINES/vendors.dm b/code/__DEFINES/vendors.dm
index 04ee5ffef2b6..086b70a92428 100644
--- a/code/__DEFINES/vendors.dm
+++ b/code/__DEFINES/vendors.dm
@@ -67,3 +67,13 @@
//Whether or not to load ammo boxes depending on ammo loaded into the vendor
//Only relevant in big vendors, like Requisitions or Squad Prep
#define VEND_LOAD_AMMO_BOXES (1<<9)
+/// Vendors with this flag will fill retroactively based on latejoining players,
+/// and expect a scale multiplier instead of amount of items
+#define VEND_STOCK_DYNAMIC (1<<10)
+
+// Redemption Tokens
+#define VEND_TOKEN_ENGINEER "Engineer"
+#define VEND_TOKEN_SPEC "Specialist"
+#define VEND_TOKEN_SYNTH "Synthetic"
+/// Token invalid/unrecognised.
+#define VEND_TOKEN_VOID "Void"
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 36dcfed6cfea..967967790b28 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -30,6 +30,11 @@
text = replacetext(text, char, repl_chars[char])
return text
+///Helper for only alphanumeric characters plus common punctuation, spaces, underscore and hyphen _ -.
+/proc/replace_non_alphanumeric_plus(text)
+ var/regex/alphanumeric = regex(@{"[^a-z0-9 ,.?!\-_&]"}, "gi")
+ return alphanumeric.Replace(text, "")
+
/proc/readd_quotes(text)
var/list/repl_chars = list(""" = "\"", "'" = "'")
for(var/char in repl_chars)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index a7af9d7f6324..0782826a4dc9 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -281,9 +281,10 @@
//update the datacore records! This is goig to be a bit costly.
var/mob_ref = WEAKREF(src)
for(var/list/L in list(GLOB.data_core.general, GLOB.data_core.medical, GLOB.data_core.security, GLOB.data_core.locked))
- for(var/datum/data/record/R in L)
- if(R.fields["ref"] == mob_ref)
- R.fields["name"] = newname
+ for(var/datum/data/record/record_entry in L)
+ if(record_entry.fields["ref"] == mob_ref)
+ record_entry.fields["name"] = newname
+ record_entry.name = newname
break
//update our pda and id if we have them on our person
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index 541d1a05362d..d302191c67eb 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -467,6 +467,8 @@ DEFINE_BITFIELD(vend_flags, list(
"VEND_INSTANCED_CATEGORY" = VEND_INSTANCED_CATEGORY,
"VEND_FACTION_THEMES" = VEND_FACTION_THEMES,
"VEND_USE_VENDOR_FLAGS" = VEND_USE_VENDOR_FLAGS,
+ "VEND_LOAD_AMMO_BOXES" = VEND_LOAD_AMMO_BOXES,
+ "VEND_STOCK_DYNAMIC" = VEND_STOCK_DYNAMIC
))
DEFINE_BITFIELD(vehicle_flags, list(
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index 743f9be9fec0..741862b5d65d 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -127,3 +127,8 @@
min_val = 1
config_entry_value = 450
integer = TRUE
+
+/datum/config_entry/number/whiskey_required_players
+ min_val = 0
+ config_entry_value = 140
+ integer = TRUE
diff --git a/code/controllers/subsystem/communications.dm b/code/controllers/subsystem/communications.dm
index 95839b726151..b8b037c33381 100644
--- a/code/controllers/subsystem/communications.dm
+++ b/code/controllers/subsystem/communications.dm
@@ -71,9 +71,9 @@ Radiochat range: 1441 to 1489 (most devices refuse to be tune to other frequency
//Misc channels
#define YAUT_FREQ 1205
#define DUT_FREQ 1210
-#define CMB_FREQ 1220
#define VAI_FREQ 1215
#define RMC_FREQ 1216
+#define CMB_FREQ 1220
//WY Channels (1230-1249)
#define WY_FREQ 1231
@@ -99,6 +99,11 @@ Radiochat range: 1441 to 1489 (most devices refuse to be tune to other frequency
#define CLF_MED_FREQ 1274
#define CLF_CCT_FREQ 1275
+//Listening Bugs (1290-1291)
+#define BUG_A_FREQ 1290
+#define BUG_B_FREQ 1291
+
+//General Radio
#define MIN_FREQ 1460 // ------------------------------------------------------
#define PUB_FREQ 1461
#define MAX_FREQ 1468 // ------------------------------------------------------
@@ -191,6 +196,9 @@ GLOBAL_LIST_INIT(radiochannels, list(
RADIO_CHANNEL_CLF_ENGI = CLF_ENGI_FREQ,
RADIO_CHANNEL_CLF_MED = CLF_MED_FREQ,
RADIO_CHANNEL_CLF_CCT = CLF_CCT_FREQ,
+
+ RADIO_CHANNEL_BUG_A = BUG_A_FREQ,
+ RADIO_CHANNEL_BUG_B = BUG_B_FREQ,
))
// Response Teams
@@ -205,6 +213,9 @@ GLOBAL_LIST_INIT(radiochannels, list(
// PMC Frequencies
#define PMC_FREQS list(PMC_FREQ, PMC_CMD_FREQ, PMC_ENGI_FREQ, PMC_MED_FREQ, PMC_CCT_FREQ, WY_WO_FREQ, WY_FREQ)
+//Listening Device Frequencies
+#define BUG_FREQS list(BUG_A_FREQ, BUG_B_FREQ)
+
//Depts - used for colors in headset.dm, as well as deciding what the marine comms tower can listen into
#define DEPT_FREQS list(COMM_FREQ, MED_FREQ, ENG_FREQ, SEC_FREQ, SENTRY_FREQ, ALPHA_FREQ, BRAVO_FREQ, CHARLIE_FREQ, DELTA_FREQ, ECHO_FREQ, CRYO_FREQ, REQ_FREQ, JTAC_FREQ, INTEL_FREQ, WY_FREQ)
@@ -269,6 +280,8 @@ SUBSYSTEM_DEF(radio)
"[HC_FREQ]" = "hcradio",
"[PVST_FREQ]" = "pvstradio",
"[COLONY_FREQ]" = "deptradio",
+ "[BUG_A_FREQ]" = "airadio",
+ "[BUG_B_FREQ]" = "aiprivradio",
)
/datum/controller/subsystem/radio/proc/add_object(obj/device as obj, new_frequency as num, filter = null as text|null)
diff --git a/code/controllers/subsystem/nanoui.dm b/code/controllers/subsystem/nanoui.dm
index d89474dd50f1..85ad0d32aaf4 100644
--- a/code/controllers/subsystem/nanoui.dm
+++ b/code/controllers/subsystem/nanoui.dm
@@ -1,5 +1,6 @@
SUBSYSTEM_DEF(nano)
name = "Nano UI"
+ flags = SS_NO_INIT
wait = 2 SECONDS
priority = SS_PRIORITY_NANOUI
runlevels = RUNLEVELS_DEFAULT|RUNLEVEL_LOBBY
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 0153f03565f6..b7dd6123434a 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -254,7 +254,7 @@ SUBSYSTEM_DEF(ticker)
if(GLOB.round_statistics)
to_chat_spaced(world, html = FONT_SIZE_BIG(SPAN_ROLE_BODY("Welcome to [GLOB.round_statistics.round_name]")))
- GLOB.supply_controller.process() //Start the supply shuttle regenerating points -- TLE
+ GLOB.supply_controller.start_processing()
for(var/i in GLOB.closet_list) //Set up special equipment for lockers and vendors, depending on gamemode
var/obj/structure/closet/C = i
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index a56e10636a1e..79bd10c65736 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -276,7 +276,8 @@ SUBSYSTEM_DEF(vote)
var/datum/game_mode/M = mode_type
if(initial(M.config_tag))
var/vote_cycle_met = !initial(M.vote_cycle) || (text2num(SSperf_logging?.round?.id) % initial(M.vote_cycle) == 0)
- if(initial(M.votable) && vote_cycle_met)
+ var/min_players_met = length(GLOB.clients) >= M.required_players
+ if(initial(M.votable) && vote_cycle_met && min_players_met)
choices += initial(M.config_tag)
if("groundmap")
question = "Ground map vote"
diff --git a/code/datums/ASRS.dm b/code/datums/ASRS.dm
index 86a7363f07ea..57eff892fa58 100644
--- a/code/datums/ASRS.dm
+++ b/code/datums/ASRS.dm
@@ -2,133 +2,116 @@
//These are non orderable packs that get in automaticly though the ARSR system.
//Note these should never show up to buy and some will only show up later in the round.
//BIG NOTE: Don't add living things to crates, that's bad, it will break the shuttle.
-//We use the cost to determine the spawn chance this equals out the crates that spawn later in the round.
-#define ASRS_HIGHEST_WEIGHT 0 //warning this weight wont change.
-#define ASRS_VERY_HIGH_WEIGHT 5
-#define ASRS_HIGH_WEIGHT 15
-#define ASRS_MEDIUM_WEIGHT 25
-#define ASRS_LOW_WEIGHT 35
-#define ASRS_VERY_LOW_WEIGHT 50
-#define ASRS_LOWEST_WEIGHT 100
+
+
+/datum/supply_packs_asrs
+ /// How likely we are to select this pack over others
+ var/cost = ASRS_MEDIUM_WEIGHT
+ /// Which pool of ASRS automatically dispensed supplies this belongs to
+ var/pool = ASRS_POOL_MAIN
+ /// What supply pack would this dispense
+ var/datum/supply_packs/reference_package
//===================================
// Rounds
-/datum/supply_packs/ammo_rounds_box_rifle/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_rounds_box_rifle
+ reference_package = /datum/supply_packs/ammo_rounds_box_rifle
cost = ASRS_MEDIUM_WEIGHT
-/datum/supply_packs/ammo_rounds_box_rifle_ap/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_rounds_box_rifle_ap
+ reference_package = /datum/supply_packs/ammo_rounds_box_rifle_ap
cost = ASRS_LOW_WEIGHT
-/datum/supply_packs/ammo_rounds_box_xm88/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_rounds_box_xm88
+ reference_package = /datum/supply_packs/ammo_rounds_box_xm88
cost = ASRS_LOW_WEIGHT
//===================================
// Magazines
-/datum/supply_packs/gun/ammo_hpr/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/gun/ammo_hpr
+ reference_package = /datum/supply_packs/ammo_hpr
cost = ASRS_LOWEST_WEIGHT
-/datum/supply_packs/ammo_m4a3_mag_box/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_m4a3_mag_box
+ reference_package = /datum/supply_packs/ammo_m4a3_mag_box
cost = ASRS_LOW_WEIGHT
-/datum/supply_packs/ammo_m4a3_mag_box_ap/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_m4a3_mag_box_ap
+ reference_package = /datum/supply_packs/ammo_m4a3_mag_box_ap
cost = ASRS_VERY_LOW_WEIGHT
-/datum/supply_packs/ammo_mag_box/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_mag_box
+ reference_package = /datum/supply_packs/ammo_mag_box
cost = ASRS_VERY_LOW_WEIGHT
-/datum/supply_packs/ammo_mag_box_ap/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_mag_box_ap
+ reference_package = /datum/supply_packs/ammo_mag_box_ap
-/datum/supply_packs/ammo_m4ra_mag_box/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_m4ra_mag_box
+ reference_package = /datum/supply_packs/ammo_m4ra_mag_box
cost = ASRS_VERY_LOW_WEIGHT
-/datum/supply_packs/ammo_m4ra_mag_box_ap/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_m4ra_mag_box_ap
+ reference_package = /datum/supply_packs/ammo_m4ra_mag_box_ap
-/datum/supply_packs/ammo_shell_box/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_shell_box
+ reference_package = /datum/supply_packs/ammo_shell_box
cost = ASRS_VERY_LOW_WEIGHT
-/datum/supply_packs/ammo_shell_box_buck/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_shell_box_buck
+ reference_package = /datum/supply_packs/ammo_shell_box_buck
cost = ASRS_VERY_LOW_WEIGHT
-/datum/supply_packs/ammo_shell_box_flechette/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_shell_box_flechette
+ reference_package = /datum/supply_packs/ammo_shell_box_flechette
cost = ASRS_VERY_LOW_WEIGHT
-/datum/supply_packs/ammo_smartgun/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_smartgun
+ reference_package = /datum/supply_packs/ammo_smartgun
-/datum/supply_packs/ammo_napalm/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_napalm
+ reference_package = /datum/supply_packs/ammo_napalm
cost = ASRS_VERY_LOW_WEIGHT
-/datum/supply_packs/ammo_napalm_gel/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_napalm_gel
+ reference_package = /datum/supply_packs/ammo_napalm_gel
cost = ASRS_VERY_LOW_WEIGHT
-/datum/supply_packs/ammo_flamer_mixed/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_flamer_mixed
+ reference_package = /datum/supply_packs/ammo_flamer_mixed
cost = ASRS_VERY_LOW_WEIGHT
//===================================
// Mortar ammo
-/datum/supply_packs/ammo_mortar_he/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_mortar_he
+ reference_package = /datum/supply_packs/ammo_mortar_he
-/datum/supply_packs/ammo_mortar_incend/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_mortar_incend
+ reference_package = /datum/supply_packs/ammo_mortar_incend
-/datum/supply_packs/ammo_mortar_flare/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/ammo_mortar_flare
+ reference_package = /datum/supply_packs/ammo_mortar_flare
//===================================
// Misc supplies
-/datum/supply_packs/flares/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/flares
+ reference_package = /datum/supply_packs/flares
cost = ASRS_LOW_WEIGHT
-/datum/supply_packs/mre/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/mre
+ reference_package = /datum/supply_packs/mre
cost = ASRS_VERY_LOW_WEIGHT
-/datum/supply_packs/flashlights/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/flashlights
+ reference_package = /datum/supply_packs/flashlights
cost = ASRS_VERY_LOW_WEIGHT
-/datum/supply_packs/batteries/asrs
- buyable = 0
- group = "ASRS"
+/datum/supply_packs_asrs/batteries
+ reference_package = /datum/supply_packs/batteries
cost = ASRS_VERY_LOW_WEIGHT
+
+// ============================
+// FOOD POOL - for Mess Tech gradual supplies throughout the round
+/datum/supply_packs_asrs/ingredient
+ reference_package = /datum/supply_packs/ingredient
+ pool = ASRS_POOL_FOOD
diff --git a/code/datums/ammo/misc.dm b/code/datums/ammo/misc.dm
index 1d04692c0360..607a6e517a7c 100644
--- a/code/datums/ammo/misc.dm
+++ b/code/datums/ammo/misc.dm
@@ -191,7 +191,7 @@
for(var/obj/item/reagent_container/food/drinks/cans/souto/S in P.contents)
M.put_in_active_hand(S)
for(var/mob/O in viewers(GLOB.world_view_size, P)) //find all people in view.
- O.show_message(SPAN_DANGER("[M] catches the [S]!"), SHOW_MESSAGE_VISIBLE) //Tell them the can was caught.
+ O.show_message(SPAN_DANGER("[M] catches [S]!"), SHOW_MESSAGE_VISIBLE) //Tell them the can was caught.
return //Can was caught.
if(ishuman(M))
var/mob/living/carbon/human/H = M
diff --git a/code/datums/components/healing_reduction.dm b/code/datums/components/healing_reduction.dm
index b98d52cab251..54ea02dc6b73 100644
--- a/code/datums/components/healing_reduction.dm
+++ b/code/datums/components/healing_reduction.dm
@@ -21,33 +21,36 @@ Humans will take continuous damage instead.
src.healing_reduction_dissipation = healing_reduction_dissipation
src.max_buildup = max_buildup
-/datum/component/healing_reduction/InheritComponent(datum/component/healing_reduction/C, i_am_original, healing_reduction)
+/datum/component/healing_reduction/InheritComponent(datum/component/healing_reduction/inherit_component, i_am_original, healing_reduction)
. = ..()
- if(!C)
+ if(!inherit_component)
src.healing_reduction += healing_reduction
else
- src.healing_reduction += C.healing_reduction
+ src.healing_reduction += inherit_component.healing_reduction
src.healing_reduction = min(src.healing_reduction, max_buildup)
/datum/component/healing_reduction/process(delta_time)
if(!parent)
qdel(src)
- healing_reduction = max(healing_reduction - healing_reduction_dissipation * delta_time, 0)
+ return
- if(ishuman(parent)) //deals brute to humans
- var/mob/living/carbon/human/H = parent
- H.apply_damage(healing_reduction_dissipation * delta_time, BRUTE)
+ healing_reduction = max(healing_reduction - healing_reduction_dissipation * delta_time, 0)
if(healing_reduction <= 0)
qdel(src)
+ return
+
+ if(ishuman(parent)) //deals brute to humans
+ var/mob/living/carbon/human/human_parent = parent
+ human_parent.apply_damage(healing_reduction_dissipation * delta_time, BRUTE)
var/color = GLOW_COLOR
var/intensity = healing_reduction/max_buildup
color += num2text(MAX_ALPHA*intensity, 2, 16)
- var/atom/A = parent
- A.add_filter("healing_reduction", 2, list("type" = "outline", "color" = color, "size" = 1))
+ var/atom/parent_atom = parent
+ parent_atom.add_filter("healing_reduction", 2, list("type" = "outline", "color" = color, "size" = 1))
/datum/component/healing_reduction/RegisterWithParent()
START_PROCESSING(SSdcs, src)
@@ -64,14 +67,14 @@ Humans will take continuous damage instead.
COMSIG_XENO_ON_HEAL_WOUNDS,
COMSIG_XENO_APPEND_TO_STAT
))
- var/atom/A = parent
- A.remove_filter("healing_reduction")
+ var/atom/parent_atom = parent
+ parent_atom.remove_filter("healing_reduction")
-/datum/component/healing_reduction/proc/stat_append(mob/M, list/L)
+/datum/component/healing_reduction/proc/stat_append(mob/target_mob, list/stat_list)
SIGNAL_HANDLER
- L += "Healing Reduction: [healing_reduction]/[max_buildup]"
+ stat_list += "Healing Reduction: [healing_reduction]/[max_buildup]"
-/datum/component/healing_reduction/proc/apply_healing_reduction(mob/living/carbon/xenomorph/X, list/healing)
+/datum/component/healing_reduction/proc/apply_healing_reduction(mob/living/carbon/xenomorph/xeno, list/healing)
SIGNAL_HANDLER
healing["healing"] -= healing_reduction
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 02cbc5b2d019..933b547aa1f2 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -32,12 +32,12 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
)
departments += marines_by_squad
var/list/manifest_out = list()
- for(var/datum/data/record/t in GLOB.data_core.general)
- if(t.fields["mob_faction"] != FACTION_MARINE) //we process only USCM humans
+ for(var/datum/data/record/record_entry in GLOB.data_core.general)
+ if(record_entry.fields["mob_faction"] != FACTION_MARINE) //we process only USCM humans
continue
- var/name = t.fields["name"]
- var/rank = t.fields["rank"]
- var/squad = t.fields["squad"]
+ var/name = record_entry.fields["name"]
+ var/rank = record_entry.fields["rank"]
+ var/squad = record_entry.fields["squad"]
if(isnull(name) || isnull(rank))
continue
var/has_department = FALSE
@@ -85,14 +85,14 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
var/dept_flags = NO_FLAGS //Is there anybody in the department?.
var/list/squad_sublists = GLOB.ROLES_SQUAD_ALL.Copy() //Are there any marines in the squad?
- for(var/datum/data/record/t in GLOB.data_core.general)
- if(t.fields["mob_faction"] != FACTION_MARINE) //we process only USCM humans
+ for(var/datum/data/record/record_entry in GLOB.data_core.general)
+ if(record_entry.fields["mob_faction"] != FACTION_MARINE) //we process only USCM humans
continue
- var/name = t.fields["name"]
- var/rank = t.fields["rank"]
- var/real_rank = t.fields["real_rank"]
- var/squad_name = t.fields["squad"]
+ var/name = record_entry.fields["name"]
+ var/rank = record_entry.fields["rank"]
+ var/real_rank = record_entry.fields["real_rank"]
+ var/squad_name = record_entry.fields["squad"]
if(isnull(name) || isnull(rank) || isnull(real_rank))
continue
@@ -104,7 +104,7 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
break
isactive[name] = active ? "Active" : "Inactive"
else
- isactive[name] = t.fields["p_stat"]
+ isactive[name] = record_entry.fields["p_stat"]
//cael - to prevent multiple appearances of a player/job combination, add a continue after each line
if(real_rank in GLOB.ROLES_CIC)
@@ -216,14 +216,14 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
var/datum/data/record/foundrecord
var/use_name = isnull(ref)
- for(var/datum/data/record/t in GLOB.data_core.general)
+ for(var/datum/data/record/record_entry in GLOB.data_core.general)
if(use_name)
- if(t.fields["name"] == name)
- foundrecord = t
+ if(record_entry.fields["name"] == name)
+ foundrecord = record_entry
break
else
- if(t.fields["ref"] == ref)
- foundrecord = t
+ if(record_entry.fields["ref"] == ref)
+ foundrecord = record_entry
break
if(foundrecord)
@@ -239,102 +239,106 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
return TRUE
return FALSE
-/datum/datacore/proc/manifest_inject(mob/living/carbon/human/H)
+/datum/datacore/proc/manifest_inject(mob/living/carbon/human/target)
var/assignment
- if(H.job)
- assignment = H.job
+ if(target.job)
+ assignment = target.job
else
assignment = "Unassigned"
- var/id = add_zero(num2hex(H.gid), 6) //this was the best they could come up with? A large random number? *sigh*
+ var/id = add_zero(num2hex(target.gid), 6) //this was the best they could come up with? A large random number? *sigh*
//var/icon/front = new(get_id_photo(H), dir = SOUTH)
//var/icon/side = new(get_id_photo(H), dir = WEST)
//General Record
- var/datum/data/record/G = new()
- G.fields["id"] = id
- G.fields["name"] = H.real_name
- G.fields["real_rank"] = H.job
- G.fields["rank"] = assignment
- G.fields["squad"] = H.assigned_squad ? H.assigned_squad.name : null
- G.fields["age"] = H.age
- G.fields["p_stat"] = "Active"
- G.fields["m_stat"] = "Stable"
- G.fields["sex"] = H.gender
- G.fields["species"] = H.get_species()
- G.fields["origin"] = H.origin
- G.fields["faction"] = H.personal_faction
- G.fields["mob_faction"] = H.faction
- G.fields["religion"] = H.religion
- G.fields["ref"] = WEAKREF(H)
- //G.fields["photo_front"] = front
- //G.fields["photo_side"] = side
-
- if(H.gen_record && !jobban_isbanned(H, "Records"))
- G.fields["notes"] = H.gen_record
+ var/datum/data/record/record_general = new()
+ record_general.fields["id"] = id
+ record_general.fields["name"] = target.real_name
+ record_general.name = target.real_name
+ record_general.fields["real_rank"] = target.job
+ record_general.fields["rank"] = assignment
+ record_general.fields["squad"] = target.assigned_squad ? target.assigned_squad.name : null
+ record_general.fields["age"] = target.age
+ record_general.fields["p_stat"] = "Active"
+ record_general.fields["m_stat"] = "Stable"
+ record_general.fields["sex"] = target.gender
+ record_general.fields["species"] = target.get_species()
+ record_general.fields["origin"] = target.origin
+ record_general.fields["faction"] = target.personal_faction
+ record_general.fields["mob_faction"] = target.faction
+ record_general.fields["religion"] = target.religion
+ record_general.fields["ref"] = WEAKREF(target)
+ //record_general.fields["photo_front"] = front
+ //record_general.fields["photo_side"] = side
+
+ if(target.gen_record && !jobban_isbanned(target, "Records"))
+ record_general.fields["notes"] = target.gen_record
else
- G.fields["notes"] = "No notes found."
- general += G
+ record_general.fields["notes"] = "No notes found."
+ general += record_general
//Medical Record
- var/datum/data/record/M = new()
- M.fields["id"] = id
- M.fields["name"] = H.real_name
- M.fields["b_type"] = H.blood_type
- M.fields["mi_dis"] = "None"
- M.fields["mi_dis_d"] = "No minor disabilities have been declared."
- M.fields["ma_dis"] = "None"
- M.fields["ma_dis_d"] = "No major disabilities have been diagnosed."
- M.fields["alg"] = "None"
- M.fields["alg_d"] = "No allergies have been detected in this patient."
- M.fields["cdi"] = "None"
- M.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
- M.fields["last_scan_time"] = null
- M.fields["last_scan_result"] = "No scan data on record" // body scanner results
- M.fields["autodoc_data"] = list()
- M.fields["autodoc_manual"] = list()
- M.fields["ref"] = WEAKREF(H)
-
- if(H.med_record && !jobban_isbanned(H, "Records"))
- M.fields["notes"] = H.med_record
+ var/datum/data/record/record_medical = new()
+ record_medical.fields["id"] = id
+ record_medical.fields["name"] = target.real_name
+ record_medical.name = target.name
+ record_medical.fields["b_type"] = target.blood_type
+ record_medical.fields["mi_dis"] = "None"
+ record_medical.fields["mi_dis_d"] = "No minor disabilities have been declared."
+ record_medical.fields["ma_dis"] = "None"
+ record_medical.fields["ma_dis_d"] = "No major disabilities have been diagnosed."
+ record_medical.fields["alg"] = "None"
+ record_medical.fields["alg_d"] = "No allergies have been detected in this patient."
+ record_medical.fields["cdi"] = "None"
+ record_medical.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
+ record_medical.fields["last_scan_time"] = null
+ record_medical.fields["last_scan_result"] = "No scan data on record" // body scanner results
+ record_medical.fields["autodoc_data"] = list()
+ record_medical.fields["autodoc_manual"] = list()
+ record_medical.fields["ref"] = WEAKREF(target)
+
+ if(target.med_record && !jobban_isbanned(target, "Records"))
+ record_medical.fields["notes"] = target.med_record
else
- M.fields["notes"] = "No notes found."
- medical += M
+ record_medical.fields["notes"] = "No notes found."
+ medical += record_medical
//Security Record
- var/datum/data/record/S = new()
- S.fields["id"] = id
- S.fields["name"] = H.real_name
- S.fields["criminal"] = "None"
- S.fields["incident"] = ""
- S.fields["ref"] = WEAKREF(H)
+ var/datum/data/record/record_security = new()
+ record_security.fields["id"] = id
+ record_security.fields["name"] = target.real_name
+ record_security.name = target.real_name
+ record_security.fields["criminal"] = "None"
+ record_security.fields["incident"] = ""
+ record_security.fields["ref"] = WEAKREF(target)
- if(H.sec_record && !jobban_isbanned(H, "Records"))
- var/new_comment = list("entry" = H.sec_record, "created_by" = list("name" = "\[REDACTED\]", "rank" = "Military Police"), "deleted_by" = null, "deleted_at" = null, "created_at" = "Pre-Deployment")
- S.fields["comments"] = list("1" = new_comment)
- S.fields["notes"] = H.sec_record
- security += S
+ if(target.sec_record && !jobban_isbanned(target, "Records"))
+ var/new_comment = list("entry" = target.sec_record, "created_by" = list("name" = "\[REDACTED\]", "rank" = "Military Police"), "deleted_by" = null, "deleted_at" = null, "created_at" = "Pre-Deployment")
+ record_security.fields["comments"] = list("1" = new_comment)
+ record_security.fields["notes"] = target.sec_record
+ security += record_security
//Locked Record
- var/datum/data/record/L = new()
- L.fields["id"] = md5("[H.real_name][H.job]")
- L.fields["name"] = H.real_name
- L.fields["rank"] = H.job
- L.fields["age"] = H.age
- L.fields["sex"] = H.gender
- L.fields["b_type"] = H.b_type
- L.fields["species"] = H.get_species()
- L.fields["origin"] = H.origin
- L.fields["faction"] = H.personal_faction
- L.fields["religion"] = H.religion
- L.fields["ref"] = WEAKREF(H)
-
- if(H.exploit_record && !jobban_isbanned(H, "Records"))
- L.fields["exploit_record"] = H.exploit_record
+ var/datum/data/record/record_locked = new()
+ record_locked.fields["id"] = md5("[target.real_name][target.job]")
+ record_locked.fields["name"] = target.real_name
+ record_locked.name = target.real_name
+ record_locked.fields["rank"] = target.job
+ record_locked.fields["age"] = target.age
+ record_locked.fields["sex"] = target.gender
+ record_locked.fields["b_type"] = target.b_type
+ record_locked.fields["species"] = target.get_species()
+ record_locked.fields["origin"] = target.origin
+ record_locked.fields["faction"] = target.personal_faction
+ record_locked.fields["religion"] = target.religion
+ record_locked.fields["ref"] = WEAKREF(target)
+
+ if(target.exploit_record && !jobban_isbanned(target, "Records"))
+ record_locked.fields["exploit_record"] = target.exploit_record
else
- L.fields["exploit_record"] = "No additional information acquired."
- locked += L
+ record_locked.fields["exploit_record"] = "No additional information acquired."
+ locked += record_locked
/proc/get_id_photo(mob/living/carbon/human/H)
diff --git a/code/datums/emergency_calls/cryo_marines.dm b/code/datums/emergency_calls/cryo_marines.dm
index 4e997292f74d..fb8d4b8a5a69 100644
--- a/code/datums/emergency_calls/cryo_marines.dm
+++ b/code/datums/emergency_calls/cryo_marines.dm
@@ -50,34 +50,34 @@
human.client?.prefs.copy_all_to(human, JOB_SQUAD_LEADER, TRUE, TRUE)
arm_equipment(human, /datum/equipment_preset/uscm/leader/cryo, mind == null, TRUE)
to_chat(human, SPAN_ROLE_HEADER("You are a Squad Leader in the USCM"))
- to_chat(human, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
+ to_chat(human, SPAN_ROLE_BODY("You are here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))
else if (heavies < max_heavies && (!mind || (HAS_FLAG(human.client.prefs.toggles_ert, PLAY_HEAVY) && check_timelock(human.client, JOB_SQUAD_SPECIALIST, time_required_for_job))))
heavies++
human.client?.prefs.copy_all_to(human, JOB_SQUAD_SPECIALIST, TRUE, TRUE)
arm_equipment(human, /datum/equipment_preset/uscm/spec/cryo, mind == null, TRUE)
to_chat(human, SPAN_ROLE_HEADER("You are a Weapons Specialist in the USCM"))
- to_chat(human, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
+ to_chat(human, SPAN_ROLE_BODY("Your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))
else if (medics < max_medics && (!mind || (HAS_FLAG(human.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(human.client, JOB_SQUAD_MEDIC, time_required_for_job))))
medics++
human.client?.prefs.copy_all_to(human, JOB_SQUAD_MEDIC, TRUE, TRUE)
arm_equipment(human, /datum/equipment_preset/uscm/medic/cryo, mind == null, TRUE)
to_chat(human, SPAN_ROLE_HEADER("You are a Hospital Corpsman in the USCM"))
- to_chat(human, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
+ to_chat(human, SPAN_ROLE_BODY("You are here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))
else if (engineers < max_engineers && (!mind || (HAS_FLAG(human.client.prefs.toggles_ert, PLAY_ENGINEER) && check_timelock(human.client, JOB_SQUAD_ENGI, time_required_for_job))))
engineers++
human.client?.prefs.copy_all_to(human, JOB_SQUAD_ENGI, TRUE, TRUE)
arm_equipment(human, /datum/equipment_preset/uscm/engineer/cryo, mind == null, TRUE)
to_chat(human, SPAN_ROLE_HEADER("You are an Engineer in the USCM"))
- to_chat(human, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
+ to_chat(human, SPAN_ROLE_BODY("You are here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))
else
human.client?.prefs.copy_all_to(human, JOB_SQUAD_MARINE, TRUE, TRUE)
arm_equipment(human, /datum/equipment_preset/uscm/pfc/cryo, mind == null, TRUE)
to_chat(human, SPAN_ROLE_HEADER("You are a Rifleman in the USCM"))
- to_chat(human, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
+ to_chat(human, SPAN_ROLE_BODY("You are here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))
sleep(10)
diff --git a/code/datums/emergency_calls/cryo_marines_heavy.dm b/code/datums/emergency_calls/cryo_marines_heavy.dm
index 2081d9564c50..42f25a461254 100644
--- a/code/datums/emergency_calls/cryo_marines_heavy.dm
+++ b/code/datums/emergency_calls/cryo_marines_heavy.dm
@@ -41,31 +41,31 @@
leaders++
arm_equipment(H, /datum/equipment_preset/uscm/leader_equipped/cryo, TRUE, TRUE)
to_chat(H, SPAN_ROLE_HEADER("You are a Squad Leader in the USCM"))
- to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]."))
+ to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]."))
else if (heavies < max_heavies && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_HEAVY) && check_timelock(H.client, JOB_SQUAD_SPECIALIST, time_required_for_job))
heavies++
arm_equipment(H, /datum/equipment_preset/uscm/specialist_equipped/cryo, TRUE, TRUE)
to_chat(H, SPAN_ROLE_HEADER("You are a Weapons Specialist in the USCM"))
- to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]."))
+ to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]."))
else if(smartgunners < max_smartgunners && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(H.client, JOB_SQUAD_SMARTGUN, time_required_for_job))
smartgunners++
arm_equipment(H, /datum/equipment_preset/uscm/smartgunner_equipped/cryo, TRUE, TRUE)
to_chat(H, SPAN_ROLE_HEADER("You are a Smartgunner in the USCM"))
- to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]."))
+ to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]."))
else if(engineers < max_engineers && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_ENGINEER) && check_timelock(H.client, JOB_SQUAD_ENGI, time_required_for_job))
engineers++
arm_equipment(H, /datum/equipment_preset/uscm/engineer_equipped/cryo, TRUE, TRUE)
to_chat(H, SPAN_ROLE_HEADER("You are an Engineer in the USCM"))
- to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]."))
+ to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]."))
else if (medics < max_medics && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_MEDIC) && check_timelock(H.client, JOB_SQUAD_MEDIC, time_required_for_job))
medics++
arm_equipment(H, /datum/equipment_preset/uscm/medic_equipped/cryo, TRUE, TRUE)
to_chat(H, SPAN_ROLE_HEADER("You are a Hospital Corpsman in the USCM"))
- to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]."))
+ to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]."))
else
arm_equipment(H, /datum/equipment_preset/uscm/private_equipped/cryo, TRUE, TRUE)
to_chat(H, SPAN_ROLE_HEADER("You are a Rifleman in the USCM"))
- to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]."))
+ to_chat(H, SPAN_ROLE_BODY("Your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]."))
sleep(10)
to_chat(H, SPAN_BOLD("Objectives: [objectives]"))
diff --git a/code/datums/emergency_calls/cryo_spec.dm b/code/datums/emergency_calls/cryo_spec.dm
index 6cc7c905efbc..8d563b0693f8 100644
--- a/code/datums/emergency_calls/cryo_spec.dm
+++ b/code/datums/emergency_calls/cryo_spec.dm
@@ -34,7 +34,7 @@
human.client?.prefs.copy_all_to(human, JOB_SQUAD_SPECIALIST, TRUE, TRUE)
arm_equipment(human, /datum/equipment_preset/uscm/spec/cryo, mind == null, TRUE)
to_chat(human, SPAN_ROLE_HEADER("You are a Weapons Specialist in the USCM"))
- to_chat(human, SPAN_ROLE_BODY("Your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
+ to_chat(human, SPAN_ROLE_BODY("Your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(human, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))
sleep(10)
diff --git a/code/datums/emergency_calls/emergency_call.dm b/code/datums/emergency_calls/emergency_call.dm
index 9db46955a5ea..c6f71382b877 100644
--- a/code/datums/emergency_calls/emergency_call.dm
+++ b/code/datums/emergency_calls/emergency_call.dm
@@ -200,7 +200,7 @@
SSticker.mode.picked_calls += src
show_join_message() //Show our potential candidates the message to let them join.
- message_admins("Distress beacon: '[name]' activated [src.hostility? "[SPAN_WARNING("(THEY ARE HOSTILE)")]":"(they are friendly)"]. Looking for candidates.")
+ message_admins("Distress beacon: '[name]' activated [hostility? "[SPAN_WARNING("(THEY ARE HOSTILE)")]":"(they are friendly)"]. Looking for candidates.")
if(!quiet_launch)
marine_announcement("A distress beacon has been launched from the [MAIN_SHIP_NAME].", "Priority Alert", 'sound/AI/distressbeacon.ogg', logging = ARES_LOG_SECURITY)
diff --git a/code/datums/emergency_calls/tank_crew.dm b/code/datums/emergency_calls/tank_crew.dm
index fb437c179e48..f8d20051c244 100644
--- a/code/datums/emergency_calls/tank_crew.dm
+++ b/code/datums/emergency_calls/tank_crew.dm
@@ -24,11 +24,10 @@
sleep(5)
arm_equipment(H, /datum/equipment_preset/uscm/tank/full, TRUE, TRUE)
to_chat(H, SPAN_ROLE_HEADER("You are a Vehicle Crewman in the USCM"))
- to_chat(H, SPAN_ROLE_BODY("You are here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
+ to_chat(H, SPAN_ROLE_BODY("You are here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]. Listen to the chain of command."))
to_chat(H, SPAN_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced."))
sleep(10)
to_chat(H, SPAN_BOLD("Objectives: [objectives]"))
GLOB.data_core.manifest_inject(H) //Put people in crew manifest
-
diff --git a/code/datums/emergency_calls/whiskey_outpost.dm b/code/datums/emergency_calls/whiskey_outpost.dm
index 5c46ace04d6c..c6a7e4947756 100644
--- a/code/datums/emergency_calls/whiskey_outpost.dm
+++ b/code/datums/emergency_calls/whiskey_outpost.dm
@@ -28,23 +28,23 @@
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/dust_raider/leader, TRUE, TRUE)
- to_chat(mob, SPAN_BOLDNOTICE("You are a Squad Leader in the USCM, your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]."))
+ to_chat(mob, SPAN_BOLDNOTICE("You are a Squad Leader in the USCM, your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]."))
else if (heavies < max_heavies && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_HEAVY) && check_timelock(mob.client, JOB_SQUAD_SPECIALIST, time_required_for_job))
heavies++
arm_equipment(mob, /datum/equipment_preset/dust_raider/specialist, TRUE, TRUE)
- to_chat(mob, SPAN_BOLDNOTICE("You are a Specialist in the USCM, your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]."))
+ to_chat(mob, SPAN_BOLDNOTICE("You are a Specialist in the USCM, your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]."))
else if(smartgunners < max_smartgunners && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_SMARTGUNNER) && check_timelock(mob.client, JOB_SQUAD_SMARTGUN, time_required_for_job))
smartgunners++
arm_equipment(mob, /datum/equipment_preset/dust_raider/smartgunner, TRUE, TRUE)
- to_chat(mob, SPAN_BOLDNOTICE("You are a Smartgunner in the USCM, your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]."))
+ to_chat(mob, SPAN_BOLDNOTICE("You are a Smartgunner in the USCM, your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]."))
else if(engineers < max_engineers && HAS_FLAG(mob.client.prefs.toggles_ert, PLAY_ENGINEER) && check_timelock(mob.client, JOB_SQUAD_ENGI, time_required_for_job))
engineers++
arm_equipment(mob, /datum/equipment_preset/dust_raider/engineer, TRUE, TRUE)
- to_chat(mob, SPAN_BOLDNOTICE("You are an Engineer in the USCM, your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]."))
+ to_chat(mob, SPAN_BOLDNOTICE("You are an Engineer in the USCM, your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]."))
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/dust_raider/medic, TRUE, TRUE)
- to_chat(mob, SPAN_BOLDNOTICE("You are a Hospital Corpsman in the USCM, your squad is here to assist in the defence of the [SSmapping.configs[GROUND_MAP].map_name]."))
+ to_chat(mob, SPAN_BOLDNOTICE("You are a Hospital Corpsman in the USCM, your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]."))
else
arm_equipment(mob, /datum/equipment_preset/dust_raider/private, TRUE, TRUE)
to_chat(mob, SPAN_BOLDNOTICE("You are a Rifleman in the USCM, your squad is here to assist in the defence of [SSmapping.configs[GROUND_MAP].map_name]."))
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index a2932532e78e..b7d528380a42 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -48,6 +48,8 @@ GLOBAL_DATUM_INIT(revdata, /datum/getrev, new)
var/datum/tgs_revision_information/test_merge/tm = line
var/cm = tm.head_commit
var/details = ": '" + html_encode(tm.title) + "' by " + html_encode(tm.author) + " at commit " + html_encode(copytext_char(cm, 1, 11))
+ if(details && findtext(details, "\[s\]") && (!usr || !usr.client.admin_holder))
+ continue
. += "#[tm.number][details]
"
/client/verb/showrevinfo()
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index 16825ab8a7ba..207310ac34c5 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -166,15 +166,15 @@
/datum/teleport/instant/science/teleportChecks()
if(istype(teleatom, /obj/item/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite
- teleatom.visible_message(SPAN_DANGER("The [teleatom] bounces off of the portal!"))
+ teleatom.visible_message(SPAN_DANGER("[teleatom] bounces off of the portal!"))
return 0
if(length(teleatom.search_contents_for(/obj/item/disk/nuclear)))
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
- MM.visible_message(SPAN_DANGER("The [MM] bounces off of the portal!"),SPAN_DANGER("Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through."))
+ MM.visible_message(SPAN_DANGER("[MM] bounces off of the portal!"),SPAN_DANGER("Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through."))
else
- teleatom.visible_message(SPAN_DANGER("The [teleatom] bounces off of the portal!"))
+ teleatom.visible_message(SPAN_DANGER("[teleatom] bounces off of the portal!"))
return 0
if(is_admin_level(destination.z))
diff --git a/code/datums/paygrades/factions/civillian/civilian.dm b/code/datums/paygrades/factions/civillian/civilian.dm
deleted file mode 100644
index 2c2aa5feac1c..000000000000
--- a/code/datums/paygrades/factions/civillian/civilian.dm
+++ /dev/null
@@ -1,30 +0,0 @@
-/datum/paygrade/civilian
- name = "Civilian Paygrade"
- pay_multiplier = 0.5 // civvies are poor
-
-/datum/paygrade/civilian/civilian
- paygrade = "C"
- name = "Civilian"
-
-/datum/paygrade/civilian/nurse
- paygrade = "CN"
- name = "Nurse"
- prefix = "Nrs."
-
-/datum/paygrade/civilian/doctor
- paygrade = "CD"
- name = "Doctor"
- prefix = "Dr."
- pay_multiplier = 0.75
-
-/datum/paygrade/civilian/professor
- paygrade = "CCMO"
- name = "Professor"
- prefix = "Prof."
- pay_multiplier = 1
-
-/datum/paygrade/civillian/representative
- paygrade = "CR"
- name = "Representative"
- prefix = "Rep."
- pay_multiplier = 1
diff --git a/code/datums/paygrades/factions/other/civilian.dm b/code/datums/paygrades/factions/other/civilian.dm
new file mode 100644
index 000000000000..6587a82a54d6
--- /dev/null
+++ b/code/datums/paygrades/factions/other/civilian.dm
@@ -0,0 +1,52 @@
+/datum/paygrade/civilian
+ name = "Civilian Paygrade"
+ pay_multiplier = 0.5 // civvies are poor
+
+/datum/paygrade/civilian/civilian
+ paygrade = PAY_SHORT_CIV
+ name = "Civilian"
+ prefix = "C"
+
+/datum/paygrade/civilian/nurse
+ paygrade = PAY_SHORT_CNUR
+ name = "Nurse"
+ prefix = "Nrs."
+
+/datum/paygrade/civilian/doctor
+ paygrade = PAY_SHORT_CDOC
+ name = "Doctor"
+ prefix = "Dr."
+ pay_multiplier = 0.75
+
+/datum/paygrade/civilian/professor
+ paygrade = PAY_SHORT_CCMO
+ name = "Professor"
+ prefix = "Prof."
+ pay_multiplier = 1
+
+/datum/paygrade/civillian/representative
+ paygrade = PAY_SHORT_CREP
+ name = "Representative"
+ prefix = "Rep."
+ pay_multiplier = 1
+
+/datum/paygrade/civillian/officer
+ paygrade = PAY_SHORT_CPO
+ name = "Officer"
+ prefix = "Off."
+ pay_multiplier = 0.66
+
+/datum/paygrade/civillian/officer/senior
+ paygrade = PAY_SHORT_CSPO
+ name = "Senior Officer"
+ prefix = "Sr. Off."
+ pay_multiplier = 0.8
+
+/datum/paygrade/civilian/rebel
+ paygrade = PAY_SHORT_REB
+ name = "Rebel"
+
+/datum/paygrade/civilian/rebel/leader
+ paygrade = PAY_SHORT_REBC
+ name = "Rebel Commander"
+ prefix = "CMDR."
diff --git a/code/datums/paygrades/factions/other/cmb.dm b/code/datums/paygrades/factions/other/cmb.dm
index a4b656d8692d..eeeb061ea335 100644
--- a/code/datums/paygrades/factions/other/cmb.dm
+++ b/code/datums/paygrades/factions/other/cmb.dm
@@ -3,78 +3,29 @@
pay_multiplier = 1.4 // Government work. Nice benefits.
/datum/paygrade/cmb/standard
- paygrade = "GS-9"
+ paygrade = PAY_SHORT_CMBD
name = "CMB Deputy"
prefix = "Dep."
/datum/paygrade/cmb/leader
- paygrade = "GS-13"
+ paygrade = PAY_SHORT_CMBM
name = "CMB Marshal"
prefix = "Marshal"
/datum/paygrade/cmb/syn
- paygrade = "GS-C.9"
+ paygrade = PAY_SHORT_CMBS
name = "CMB Investigative Synthetic"
-/datum/paygrade/cmb/liaison
- paygrade = "GS-6"
+/datum/paygrade/cmb/icc
+ paygrade = PAY_SHORT_ICCA
+ name = "Interstellar Commerce Commission Agent"
+ prefix = "Agent"
+
+/datum/paygrade/cmb/icc/liaison
+ paygrade = PAY_SHORT_ICCL
name = "Interstellar Commerce Commission Corporate Liaison"
prefix = "Exec."
/datum/paygrade/cmb/observer
- paygrade = "GS-3"
+ paygrade = PAY_SHORT_IHRO
name = "Interstellar Human Rights Observer"
-/datum/paygrade/marine
- name = "Marine Paygrade"
- rank_pin = /obj/item/clothing/accessory/ranks/marine
- pay_multiplier = 1
-
-// ENLISTED PAYGRADES
-
-/datum/paygrade/marine/e1
- paygrade = "ME1"
- name = "Private"
- prefix = "PVT"
- rank_pin = /obj/item/clothing/accessory/ranks/marine/e1
- ranking = 0
- pay_multiplier = 0.8
-
-/datum/paygrade/marine/e2
- paygrade = "ME2"
- name = "Private First Class"
- prefix = "PFC"
- rank_pin = /obj/item/clothing/accessory/ranks/marine/e2
- ranking = 1
- pay_multiplier = 1 // the default.
-
-/datum/paygrade/marine/e3
- paygrade = "ME3"
- name = "Lance Corporal"
- prefix = "LCpl"
- rank_pin = /obj/item/clothing/accessory/ranks/marine/e3
- ranking = 2
- pay_multiplier = 1.4
-
-/datum/paygrade/marine/e4
- paygrade = "ME4"
- name = "Corporal"
- prefix = "Cpl"
- rank_pin = /obj/item/clothing/accessory/ranks/marine/e4
- ranking = 3
- pay_multiplier = 1.6
-
-/datum/paygrade/marine/e5
- paygrade = "ME5"
- name = "Sergeant"
- prefix = "Sgt"
- rank_pin = /obj/item/clothing/accessory/ranks/marine/e5
- ranking = 4
- pay_multiplier = 1.8
-
-/datum/paygrade/marine/e6
- paygrade = "ME6"
- name = "Staff Sergeant"
- prefix = "SSgt"
- rank_pin = /obj/item/clothing/accessory/ranks/marine/e6
- ranking = 5
- pay_multiplier = 2
diff --git a/code/datums/paygrades/factions/other/dutch_dozen.dm b/code/datums/paygrades/factions/other/dutch_dozen.dm
index 9b8bd7e4f8c4..8877bd11afbb 100644
--- a/code/datums/paygrades/factions/other/dutch_dozen.dm
+++ b/code/datums/paygrades/factions/other/dutch_dozen.dm
@@ -1,33 +1,33 @@
/datum/paygrade/dutch
name = "Dutch Paygrade"
pay_multiplier = 5
+ fprefix = "DTC."
/datum/paygrade/dutch/standard
- paygrade = "DTC"
+ paygrade = PAY_SHORT_DTC
name = "Dutch's Dozen Standard Mercenary"
- prefix = "DTC."
/datum/paygrade/dutch/medic
- paygrade = "DTCM"
+ paygrade = PAY_SHORT_DTCM
name = "Dutch's Dozen Medic"
- prefix = "DTC MED."
+ prefix = "MED."
pay_multiplier = 6
/datum/paygrade/dutch/specialist_flamer
- paygrade = "DTCF"
+ paygrade = PAY_SHORT_DTCF
name = "Dutch's Dozen Flamethrower Specialist"
- prefix = "DTC SPC."
+ prefix = "SPC."
pay_multiplier = 6
/datum/paygrade/dutch/specialist_minigunner
- paygrade = "DTCMG"
- name = "Dutch's Dozen Medic"
- prefix = "DTC SPC."
+ paygrade = PAY_SHORT_DTCMG
+ name = "Dutch's Dozen Machinegunner"
+ prefix = "SPC."
pay_multiplier = 6
/datum/paygrade/dutch/arnold
- paygrade = "ARN"
- name = "Arnold"
- prefix = "DTC LDR."
+ paygrade = PAY_SHORT_DTCA
+ name = "Major"
+ prefix = "LDR."
pay_multiplier = 9
diff --git a/code/datums/paygrades/factions/other/misc.dm b/code/datums/paygrades/factions/other/misc.dm
index 30865228d3af..04e522580b50 100644
--- a/code/datums/paygrades/factions/other/misc.dm
+++ b/code/datums/paygrades/factions/other/misc.dm
@@ -1,9 +1,9 @@
-/datum/paygrade/misc/operator
+/datum/paygrade/misc/operative
name = "Operative"
- paygrade = "O"
+ paygrade = PAY_SHORT_OPR
pay_multiplier = 1 //????
/datum/paygrade/misc/synth
name = "Synthetic"
- paygrade = "SYN"
+ paygrade = PAY_SHORT_SYN
pay_multiplier = 1
diff --git a/code/datums/paygrades/factions/upp/upp.dm b/code/datums/paygrades/factions/upp/upp.dm
index a1363383ad55..8670f99269dc 100644
--- a/code/datums/paygrades/factions/upp/upp.dm
+++ b/code/datums/paygrades/factions/upp/upp.dm
@@ -5,115 +5,115 @@
//UPP Enlisted
/datum/paygrade/upp/ue0
- paygrade = "UE0"
+ paygrade = PAY_SHORT_UEC
name = "Conscript"
pay_multiplier = 0.05
/datum/paygrade/upp/ue1
- paygrade = "UE1"
+ paygrade = PAY_SHORT_UE1
name = "Private"
prefix = "PVT."
/datum/paygrade/upp/ue2
- paygrade = "UE2"
+ paygrade = PAY_SHORT_UE2
name = "Private First Class"
prefix = "PFC."
pay_multiplier = 0.2
/datum/paygrade/upp/ue3
- paygrade = "UE3"
+ paygrade = PAY_SHORT_UE3
name = "Korporal"
prefix = "Kpl."
pay_multiplier = 0.3
/datum/paygrade/upp/ue4
- paygrade = "UE4"
+ paygrade = PAY_SHORT_UE4
name = "Junior Serzhant"
prefix = "JrSzh."
pay_multiplier = 0.5
/datum/paygrade/upp/ue5
- paygrade = "UE5"
+ paygrade = PAY_SHORT_UE5
name = "Serzhant"
prefix = "Szh."
pay_multiplier = 0.7
/datum/paygrade/upp/ue6
- paygrade = "UE6"
+ paygrade = PAY_SHORT_UE6
name = "Master Serzhant"
prefix = "MSzh."
pay_multiplier = 0.9
//UPP Commandos
/datum/paygrade/upp/uc1
- paygrade = "UC1"
+ paygrade = PAY_SHORT_UC1
name = "Junior Kommando"
prefix = "JKdo."
pay_multiplier = 1.5
/datum/paygrade/upp/uc2
- paygrade = "UC2"
+ paygrade = PAY_SHORT_UC2
name = "2nd Kommando"
prefix = "2ndKdo."
pay_multiplier = 2
/datum/paygrade/upp/uc3
- paygrade = "UC3"
+ paygrade = PAY_SHORT_UC3
name = "1st Kommando"
prefix = "1stKdo."
pay_multiplier = 2.5
//UPP Officers
/datum/paygrade/upp/uo1
- paygrade = "UO1"
+ paygrade = PAY_SHORT_UO1
name = "Leytenant"
prefix = "Lt."
pay_multiplier = 1.25
/datum/paygrade/upp/uo2
- paygrade = "UO2"
+ paygrade = PAY_SHORT_UO2
name = "Senior Leytenant"
prefix = "Sr. LT."
pay_multiplier = 1.5
/datum/paygrade/upp/uo3
- paygrade = "UO3"
+ paygrade = PAY_SHORT_UO3
name = "Kapitan"
prefix = "Kpt."
pay_multiplier = 2
/datum/paygrade/upp/uo4
- paygrade = "UO4"
- name = "Mayjor."
+ paygrade = PAY_SHORT_UO4
+ name = "Mayjor"
prefix = "May."
pay_multiplier = 2.5
/datum/paygrade/upp/uo5
- paygrade = "UO5"
+ paygrade = PAY_SHORT_UO5
name = "Leytenant Kolonel"
prefix = "Lt. Kol."
pay_multiplier = 3
/datum/paygrade/upp/uo6
- paygrade = "UO6"
+ paygrade = PAY_SHORT_UO6
name = "Kolonel"
prefix = "Kol."
pay_multiplier = 4
/datum/paygrade/upp/uo7
- paygrade = "UO7"
+ paygrade = PAY_SHORT_UO7
name = "Mayjor General"
prefix = "May. Gen."
pay_multiplier = 5
/datum/paygrade/upp/uo8
- paygrade = "UO8"
+ paygrade = PAY_SHORT_UO8
name = "Leytenant General"
prefix = "Lt. Gen."
pay_multiplier = 6
/datum/paygrade/upp/uo9
- paygrade = "UO9"
+ paygrade = PAY_SHORT_UO9
name = "Army General"
prefix = "Gen."
pay_multiplier = 7
diff --git a/code/datums/paygrades/factions/uscm/marine.dm b/code/datums/paygrades/factions/uscm/marine.dm
index e351311e65ee..7d315f364025 100644
--- a/code/datums/paygrades/factions/uscm/marine.dm
+++ b/code/datums/paygrades/factions/uscm/marine.dm
@@ -6,7 +6,7 @@
// ENLISTED PAYGRADES
/datum/paygrade/marine/e1
- paygrade = "ME1"
+ paygrade = PAY_SHORT_ME1
name = "Private"
prefix = "PVT"
rank_pin = /obj/item/clothing/accessory/ranks/marine/e1
@@ -14,7 +14,7 @@
pay_multiplier = 1.6
/datum/paygrade/marine/e2
- paygrade = "ME2"
+ paygrade = PAY_SHORT_ME2
name = "Private First Class"
prefix = "PFC"
rank_pin = /obj/item/clothing/accessory/ranks/marine/e2
@@ -22,7 +22,7 @@
pay_multiplier = 1.7
/datum/paygrade/marine/e3
- paygrade = "ME3"
+ paygrade = PAY_SHORT_ME3
name = "Lance Corporal"
prefix = "LCpl"
rank_pin = /obj/item/clothing/accessory/ranks/marine/e3
@@ -30,7 +30,7 @@
pay_multiplier = 1.9
/datum/paygrade/marine/e4
- paygrade = "ME4"
+ paygrade = PAY_SHORT_ME4
name = "Corporal"
prefix = "Cpl"
rank_pin = /obj/item/clothing/accessory/ranks/marine/e4
@@ -38,7 +38,7 @@
pay_multiplier = 2.1
/datum/paygrade/marine/e5
- paygrade = "ME5"
+ paygrade = PAY_SHORT_ME5
name = "Sergeant"
prefix = "Sgt"
rank_pin = /obj/item/clothing/accessory/ranks/marine/e5
@@ -46,7 +46,7 @@
pay_multiplier = 2.2
/datum/paygrade/marine/e6
- paygrade = "ME6"
+ paygrade = PAY_SHORT_ME6
name = "Staff Sergeant"
prefix = "SSgt"
rank_pin = /obj/item/clothing/accessory/ranks/marine/e6
@@ -54,7 +54,7 @@
pay_multiplier = 2.4
/datum/paygrade/marine/e7
- paygrade = "ME7"
+ paygrade = PAY_SHORT_ME7
name = "Gunnery Sergeant"
prefix = "GySgt"
rank_pin = /obj/item/clothing/accessory/ranks/marine/e7
@@ -62,7 +62,7 @@
pay_multiplier = 2.75
/datum/paygrade/marine/e8
- paygrade = "ME8"
+ paygrade = PAY_SHORT_ME8
name = "Master Sergeant"
prefix = "MSgt"
rank_pin = /obj/item/clothing/accessory/ranks/marine/e8
@@ -70,7 +70,7 @@
pay_multiplier = 2.75
/datum/paygrade/marine/e8e
- paygrade = "ME8E"
+ paygrade = PAY_SHORT_ME8E
name = "First Sergeant"
prefix = "1Sgt"
rank_pin = /obj/item/clothing/accessory/ranks/marine/e8e
@@ -78,7 +78,7 @@
pay_multiplier = 2.75
/datum/paygrade/marine/e9
- paygrade = "ME9"
+ paygrade = PAY_SHORT_ME9
name = "Master Gunnery Sergeant"
prefix = "MGySgt"
rank_pin = /obj/item/clothing/accessory/ranks/marine/e9
@@ -86,7 +86,7 @@
pay_multiplier = 3
/datum/paygrade/marine/e9e
- paygrade = "ME9E"
+ paygrade = PAY_SHORT_ME9E
name = "Sergeant Major"
prefix = "SgtMaj"
rank_pin = /obj/item/clothing/accessory/ranks/marine/e9e
@@ -94,7 +94,7 @@
pay_multiplier = 3
/datum/paygrade/marine/e9c
- paygrade = "ME9C"
+ paygrade = PAY_SHORT_ME9C
name = "Sergeant Major of the Colonial Marine Corps"
prefix = "SMCMC"
rank_pin = /obj/item/clothing/accessory/ranks/marine/e9c
@@ -104,7 +104,7 @@
// COMMISSIONED PAYGRADES
/datum/paygrade/marine/o1
- paygrade = "MO1"
+ paygrade = PAY_SHORT_MO1
name = "Second Lieutenant"
prefix = "2ndLt"
rank_pin = /obj/item/clothing/accessory/ranks/marine/o1
@@ -112,7 +112,7 @@
pay_multiplier = 3
/datum/paygrade/marine/o2
- paygrade = "MO2"
+ paygrade = PAY_SHORT_MO2
name = "First Lieutenant"
prefix = "1stLt"
rank_pin = /obj/item/clothing/accessory/ranks/marine/o2
@@ -120,7 +120,7 @@
pay_multiplier = 3.2
/datum/paygrade/marine/o3
- paygrade = "MO3"
+ paygrade = PAY_SHORT_MO3
name = "Captain"
prefix = "Capt"
rank_pin = /obj/item/clothing/accessory/ranks/marine/o3
@@ -128,7 +128,7 @@
pay_multiplier = 4
/datum/paygrade/marine/o4
- paygrade = "MO4"
+ paygrade = PAY_SHORT_MO4
name = "Major"
prefix = "Maj"
rank_pin = /obj/item/clothing/accessory/ranks/marine/o4
@@ -136,7 +136,7 @@
pay_multiplier = 4
/datum/paygrade/marine/o5
- paygrade = "MO5"
+ paygrade = PAY_SHORT_MO5
name = "Lieutenant Colonel"
prefix = "LtCol"
rank_pin = /obj/item/clothing/accessory/ranks/marine/o5
@@ -145,7 +145,7 @@
//Platoon Commander
/datum/paygrade/marine/o6
- paygrade = "MO6"
+ paygrade = PAY_SHORT_MO6
name = "Colonel"
prefix = "Col"
rank_pin = /obj/item/clothing/accessory/ranks/marine/o6
@@ -153,7 +153,7 @@
pay_multiplier = 4.4
/datum/paygrade/marine/o6e
- paygrade = "MO6E"
+ paygrade = PAY_SHORT_MO6E
name = "Senior Colonel"
prefix = "Snr Col."
rank_pin = /obj/item/clothing/accessory/ranks/marine/o6e
@@ -161,7 +161,7 @@
pay_multiplier = 4.6
/datum/paygrade/marine/o6c
- paygrade = "MO6C"
+ paygrade = PAY_SHORT_MO6C
name = "Division Colonel"
prefix = "Div Col."
rank_pin = /obj/item/clothing/accessory/ranks/marine/o6c
@@ -170,7 +170,7 @@
//High Command
/datum/paygrade/marine/o7
- paygrade = "MO7"
+ paygrade = PAY_SHORT_MO7
name = "Brigadier General"
prefix = "BGen"
rank_pin = /obj/item/clothing/accessory/ranks/marine/o7
@@ -178,7 +178,7 @@
pay_multiplier = 6
/datum/paygrade/marine/o8
- paygrade = "MO8"
+ paygrade = PAY_SHORT_MO8
name = "Major General"
prefix = "MajGen"
rank_pin = /obj/item/clothing/accessory/ranks/marine/o8
@@ -186,7 +186,7 @@
pay_multiplier = 6.2
/datum/paygrade/marine/o9
- paygrade = "MO9"
+ paygrade = PAY_SHORT_MO9
name = "Lieutenant General"
prefix = "LtGen"
rank_pin = /obj/item/clothing/accessory/ranks/marine/o9
@@ -194,7 +194,7 @@
pay_multiplier = 6.4
/datum/paygrade/marine/o10
- paygrade = "MO10"
+ paygrade = PAY_SHORT_MO10
name = "General"
prefix = "Gen"
rank_pin = /obj/item/clothing/accessory/ranks/marine/o10
@@ -202,7 +202,7 @@
pay_multiplier = 6.6
/datum/paygrade/marine/o10c
- paygrade = "MO10C"
+ paygrade = PAY_SHORT_MO10C
name = "Assistant Commandant of the Marine Corps"
prefix = "ACMC"
rank_pin = /obj/item/clothing/accessory/ranks/marine/o10c
@@ -210,7 +210,7 @@
pay_multiplier = 6.8
/datum/paygrade/marine/o10s
- paygrade = "MO10S"
+ paygrade = PAY_SHORT_MO10S
name = "Commandant of the Marine Corps"
prefix = "CMC"
rank_pin = /obj/item/clothing/accessory/ranks/marine/o10c
diff --git a/code/datums/paygrades/factions/uscm/navy.dm b/code/datums/paygrades/factions/uscm/navy.dm
index 7e648a75bac2..9e22c72fe566 100644
--- a/code/datums/paygrades/factions/uscm/navy.dm
+++ b/code/datums/paygrades/factions/uscm/navy.dm
@@ -6,77 +6,77 @@
// ENLISTED PAYGRADES
/datum/paygrade/navy/e1
- paygrade = "NE1"
+ paygrade = PAY_SHORT_NE1
name = "Seaman Recruit"
prefix = "SR."
rank_pin = /obj/item/clothing/accessory/ranks/navy/e1
ranking = 0
/datum/paygrade/navy/e2
- paygrade = "NE2"
+ paygrade = PAY_SHORT_NE2
name = "Seaman Apprentice"
prefix = "SA."
rank_pin = /obj/item/clothing/accessory/ranks/navy/e2
ranking = 1
/datum/paygrade/navy/e3
- paygrade = "NE3"
+ paygrade = PAY_SHORT_NE3
name = "Seaman"
prefix = "SN."
rank_pin = /obj/item/clothing/accessory/ranks/navy/e3
ranking = 2
/datum/paygrade/navy/e4
- paygrade = "NE4"
+ paygrade = PAY_SHORT_NE4
name = "Petty Officer 3rd Class"
prefix = "PO1."
rank_pin = /obj/item/clothing/accessory/ranks/navy/e4
ranking = 3
/datum/paygrade/navy/e5
- paygrade = "NE5"
+ paygrade = PAY_SHORT_NE5
name = "Petty Officer 2nd Class"
prefix = "PO2."
rank_pin = /obj/item/clothing/accessory/ranks/navy/e5
ranking = 4
/datum/paygrade/navy/e6
- paygrade = "NE6"
+ paygrade = PAY_SHORT_NE6
name = "Petty Officer 1st Class"
prefix = "PO1."
rank_pin = /obj/item/clothing/accessory/ranks/navy/e6
ranking = 5
/datum/paygrade/navy/e7
- paygrade = "NE7"
+ paygrade = PAY_SHORT_NE7
name = "Chief Petty Officer"
prefix = "CPO."
rank_pin = /obj/item/clothing/accessory/ranks/navy/e7
ranking = 6
/datum/paygrade/navy/e8
- paygrade = "NE8"
+ paygrade = PAY_SHORT_NE8
name = "Senior Chief Petty Officer"
prefix = "SCPO."
rank_pin = /obj/item/clothing/accessory/ranks/navy/e8
ranking = 7
/datum/paygrade/navy/e8c
- paygrade = "NE8C"
+ paygrade = PAY_SHORT_NE8C
name = "Command Senior Chief Petty Officer"
prefix = "CSCPO."
rank_pin = /obj/item/clothing/accessory/ranks/navy/e8c
ranking = 8
/datum/paygrade/navy/e9
- paygrade = "NE9"
+ paygrade = PAY_SHORT_NE9
name = "Master Chief Petty Officer"
prefix = "MCPO."
rank_pin = /obj/item/clothing/accessory/ranks/navy/e9
ranking = 9
/datum/paygrade/navy/e9c
- paygrade = "NE9C"
+ paygrade = PAY_SHORT_NE9C
name = "Command Master Chief Petty Officer"
prefix = "CMCPO."
rank_pin = /obj/item/clothing/accessory/ranks/navy/e9c
@@ -85,91 +85,91 @@
// COMMISSIONED PAYGRADES
/datum/paygrade/navy/o1
- paygrade = "NO1"
+ paygrade = PAY_SHORT_NO1
name = "Ensign"
prefix = "ENS."
rank_pin = /obj/item/clothing/accessory/ranks/navy/o1
ranking = 11
/datum/paygrade/navy/o2
- paygrade = "NO2"
+ paygrade = PAY_SHORT_NO2
name = "Lieutenant Junior Grade"
prefix = "LTJG."
rank_pin = /obj/item/clothing/accessory/ranks/navy/o2
ranking = 12
/datum/paygrade/navy/o3
- paygrade = "NO3"
+ paygrade = PAY_SHORT_NO3
name = "Lieutenant"
prefix = "LT."
rank_pin = /obj/item/clothing/accessory/ranks/navy/o3
ranking = 13
/datum/paygrade/navy/o4
- paygrade = "NO4"
+ paygrade = PAY_SHORT_NO4
name = "Lieutenant Commander"
prefix = "LCDR."
rank_pin = /obj/item/clothing/accessory/ranks/navy/o4
ranking = 14
/datum/paygrade/navy/o5
- paygrade = "NO5"
+ paygrade = PAY_SHORT_NO5
name = "Commander"
prefix = "CDR."
rank_pin = /obj/item/clothing/accessory/ranks/navy/o5
ranking = 15
/datum/paygrade/navy/o6
- paygrade = "NO6"
+ paygrade = PAY_SHORT_NO6
name = "Captain"
prefix = "CAPT."
rank_pin = /obj/item/clothing/accessory/ranks/navy/o6
ranking = 16
/datum/paygrade/navy/o6e
- paygrade = "NO6E"
+ paygrade = PAY_SHORT_NO6E
name = "Commodore"
prefix = "CDRE."
rank_pin = /obj/item/clothing/accessory/ranks/navy/o6e
ranking = 17
/datum/paygrade/navy/o6c
- paygrade = "NO6C"
+ paygrade = PAY_SHORT_NO6C
name = "Senior Commodore"
prefix = "Snr CDRE."
rank_pin = /obj/item/clothing/accessory/ranks/navy/o6e
ranking = 18
/datum/paygrade/navy/o7
- paygrade = "NO7"
+ paygrade = PAY_SHORT_NO7
name = "Rear Admiral (Lower Half)"
prefix = "RDML."
rank_pin = /obj/item/clothing/accessory/ranks/navy/o7
ranking = 19
/datum/paygrade/navy/o8
- paygrade = "NO8"
+ paygrade = PAY_SHORT_NO8
name = "Rear Admiral (Upper Half)"
prefix = "RADM."
rank_pin = /obj/item/clothing/accessory/ranks/navy/o8
ranking = 20
/datum/paygrade/navy/o9
- paygrade = "NO9"
+ paygrade = PAY_SHORT_NO9
name = "Vice Admiral"
prefix = "VADM."
rank_pin = /obj/item/clothing/accessory/ranks/navy/o9
ranking = 21
/datum/paygrade/navy/o10
- paygrade = "NO10"
+ paygrade = PAY_SHORT_NO10
name = "Admiral"
prefix = "ADM."
rank_pin = /obj/item/clothing/accessory/ranks/navy/o10
ranking = 22
/datum/paygrade/navy/o10c
- paygrade = "NO10C"
+ paygrade = PAY_SHORT_NO10C
name = "Chief of Naval Operations"
prefix = "CNO."
rank_pin = /obj/item/clothing/accessory/ranks/navy/o10c
diff --git a/code/datums/paygrades/factions/uscm/provost.dm b/code/datums/paygrades/factions/uscm/provost.dm
index b27c8f7f721f..e378bd7beb61 100644
--- a/code/datums/paygrades/factions/uscm/provost.dm
+++ b/code/datums/paygrades/factions/uscm/provost.dm
@@ -2,44 +2,23 @@
name = "Provost Paygrade"
pay_multiplier = 2
-/datum/paygrade/provost/officer
- paygrade = "PvE7"
- name = "Chief Petty Officer"
- prefix = "CPO."
- rank_pin = /obj/item/clothing/accessory/ranks/navy/e7/pvst
-
-/datum/paygrade/provost/enforcer
- paygrade = "PvE8"
- name = "Senior Chief Petty Officer"
- prefix = "SCPO."
- rank_pin = /obj/item/clothing/accessory/ranks/navy/e8/pvst
-
-/datum/paygrade/provost/tml
- paygrade = "PvE9"
- name = "Master Chief Petty Officer"
- prefix = "MCPO."
- rank_pin = /obj/item/clothing/accessory/ranks/navy/e9/pvst
-
/datum/paygrade/provost/inspector
- paygrade = "PvI"
- name = "Inspector"
+ paygrade = PAY_SHORT_PVI
+ name = "Provost Inspector"
prefix = "Insp."
rank_pin = /obj/item/clothing/accessory/ranks/special/insp
/datum/paygrade/provost/marshal
- paygrade = "PvO8"
- name = "Rear Admiral"
- prefix = "RADM."
- rank_pin = /obj/item/clothing/accessory/ranks/navy/o8/pvst
+ paygrade = PAY_SHORT_PVM
+ name = "Provost Marshal"
+ prefix = "Marshal"
/datum/paygrade/provost/sectormarshal
- paygrade = "PvO9"
- name = "Vice Admiral"
- prefix = "VADM."
- rank_pin = /obj/item/clothing/accessory/ranks/navy/o9/pvst
+ paygrade = PAY_SHORT_PVSM
+ name = "Provost Sector Marshal"
+ prefix = "S. Marshal"
/datum/paygrade/provost/chiefmarshal
- paygrade = "PvCM"
+ paygrade = PAY_SHORT_PVCM
name = "Provost Chief Marshal"
- prefix = "PCM."
- rank_pin = /obj/item/clothing/accessory/ranks/navy/o10c/pvst
+ prefix = "Chief Marshal"
diff --git a/code/datums/paygrades/factions/wy/goons.dm b/code/datums/paygrades/factions/wy/goons.dm
deleted file mode 100644
index 679bb42e7f76..000000000000
--- a/code/datums/paygrades/factions/wy/goons.dm
+++ /dev/null
@@ -1,15 +0,0 @@
-/datum/paygrade/goon
- name = "WY Goon Paygrade"
- pay_multiplier = 0.66 // better than colonists. barely.
-
-//Standard PMCs
-/datum/paygrade/goon/standard
- paygrade = "WEY-GOON"
- name = "Officer"
- prefix = "Off."
-
-/datum/paygrade/goon/lead
- paygrade = "WEY-GOON-L"
- name = "Senior Officer"
- prefix = "Sr. Off."
- pay_multiplier = 0.8
diff --git a/code/datums/paygrades/factions/wy/wy.dm b/code/datums/paygrades/factions/wy/wy.dm
index 03d54cbd3cda..58ec9eb3f197 100644
--- a/code/datums/paygrades/factions/wy/wy.dm
+++ b/code/datums/paygrades/factions/wy/wy.dm
@@ -3,69 +3,69 @@
pay_multiplier = 1
/datum/paygrade/wy_ranks/wyc1
- paygrade = "WYC1"
+ paygrade = PAY_SHORT_WYC1
name = "Trainee"
prefix = "Trn."
ranking = 0
/datum/paygrade/wy_ranks/wyc2
- paygrade = "WYC2"
+ paygrade = PAY_SHORT_WYC2
name = "Junior Executive"
prefix = "Jr. Exec."
ranking = 1
pay_multiplier = 2
/datum/paygrade/wy_ranks/wyc3
- paygrade = "WYC3"
+ paygrade = PAY_SHORT_WYC3
name = "Executive"
prefix = "Exec."
ranking = 2
pay_multiplier = 3
/datum/paygrade/wy_ranks/wyc4
- paygrade = "WYC4"
+ paygrade = PAY_SHORT_WYC4
name = "Senior Executive"
prefix = "Sr. Exec."
ranking = 3
pay_multiplier = 4
/datum/paygrade/wy_ranks/wyc5
- paygrade = "WYC5"
+ paygrade = PAY_SHORT_WYC5
name = "Executive Specialist"
prefix = "Exec. Spc."
ranking = 4
pay_multiplier = 5
/datum/paygrade/wy_ranks/wyc6
- paygrade = "WYC6"
+ paygrade = PAY_SHORT_WYC6
name = "Executive Supervisor"
prefix = "Exec. Suvp."
ranking = 5
pay_multiplier = 6
/datum/paygrade/wy_ranks/wyc7
- paygrade = "WYC7"
+ paygrade = PAY_SHORT_WYC7
name = "Assistant Manager"
prefix = "Assis. Mng."
ranking = 6
pay_multiplier = 7
/datum/paygrade/wy_ranks/wyc8
- paygrade = "WYC8"
+ paygrade = PAY_SHORT_WYC8
name = "Division Manager"
prefix = "Div. Mng."
ranking = 7
pay_multiplier = 8
/datum/paygrade/wy_ranks/wyc9
- paygrade = "WYC9"
+ paygrade = PAY_SHORT_WYC9
name = "Chief Executive"
prefix = "Chief. Exec."
ranking = 8
pay_multiplier = 9
/datum/paygrade/wy_ranks/wyc10
- paygrade = "WYC10"
+ paygrade = PAY_SHORT_WYC10
name = "Director"
prefix = "Director"
ranking = 9
diff --git a/code/datums/paygrades/paygrade.dm b/code/datums/paygrades/paygrade.dm
index bb0a3aa84bfa..cc336319278a 100644
--- a/code/datums/paygrades/paygrade.dm
+++ b/code/datums/paygrades/paygrade.dm
@@ -26,36 +26,36 @@ GLOBAL_LIST_INIT_TYPED(paygrades, /datum/paygrade, setup_paygrades())
GLOBAL_LIST_INIT(highcom_paygrades, list(
"PvI",
- "NO7",
- "MO7",
- "NO8",
- "MO8",
- "NO9",
- "MO9",
- "NO10",
- "MO10",
- "NO10C",
- "MO10C",
+ PAY_SHORT_NO7,
+ PAY_SHORT_MO7,
+ PAY_SHORT_NO8,
+ PAY_SHORT_MO8,
+ PAY_SHORT_NO9,
+ PAY_SHORT_MO9,
+ PAY_SHORT_NO10,
+ PAY_SHORT_MO10,
+ PAY_SHORT_NO10C,
+ PAY_SHORT_MO10C,
"PvO8",
"PvO9",
"PvCM"
))
GLOBAL_LIST_INIT(co_paygrades, list(
- "NO6",
- "NO6E",
- "NO6C",
- "NO5",
- "NO4",
- "MO6",
- "MO6E",
- "MO6C",
- "MO5",
- "MO4"
+ PAY_SHORT_NO6,
+ PAY_SHORT_NO6E,
+ PAY_SHORT_NO6C,
+ PAY_SHORT_NO5,
+ PAY_SHORT_NO4,
+ PAY_SHORT_MO6,
+ PAY_SHORT_MO6E,
+ PAY_SHORT_MO6C,
+ PAY_SHORT_MO5,
+ PAY_SHORT_MO4
))
GLOBAL_LIST_INIT(wy_paygrades, list(
- "WYC8",
- "WYC9",
- "WYC10"
+ PAY_SHORT_WYC8,
+ PAY_SHORT_WYC9,
+ PAY_SHORT_WYC10
))
diff --git a/code/datums/supply_packs/_supply_packs.dm b/code/datums/supply_packs/_supply_packs.dm
index 061779d9e5ce..5bcd6937f623 100644
--- a/code/datums/supply_packs/_supply_packs.dm
+++ b/code/datums/supply_packs/_supply_packs.dm
@@ -20,7 +20,6 @@
var/group = null
var/buyable = 1 ///Can this pack be bought? These packs don't show up at all - they have to be spawned externally (fe: DEFCON ASRS)
var/randomised_num_contained = 0 //Randomly picks X of items out of the contains list instead of using all.
- var/iteration_needed = 0
/// How many W-Y dollars are deducted from the supply controller. Only use for contraband.
var/dollar_cost = 0
/// How much "heat" this crate adds, too much heat will send an investigation. Only use for contraband.
diff --git a/code/datums/supply_packs/food.dm b/code/datums/supply_packs/food.dm
index 9e0527aed6cf..f74567c78a89 100644
--- a/code/datums/supply_packs/food.dm
+++ b/code/datums/supply_packs/food.dm
@@ -1,144 +1,47 @@
//Food.Regrouping all the ASRS crate related to food here.
-
-//All the ingredients that you can grown.
-
-/datum/supply_packs/potato
- name = "Potatoes(x20)"
- contains = list(
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- )
- cost = 10
- containertype = /obj/structure/closet/crate/freezer
- containername = "\improper Potato crate"
- group = "Food"
-
-/datum/supply_packs/tomato
- name = "tomato (x20)"
- contains = list(
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- )
- cost = 10
- containertype = /obj/structure/closet/crate/freezer
- containername = "\improper Tomato crate"
- group = "Food"
-
-/datum/supply_packs/wheat
- name = "wheat (x20)"
- contains = list(
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- /obj/item/reagent_container/food/snacks/grown/wheat,
- )
- cost = 10
- containertype = /obj/structure/closet/crate/freezer
- containername = "\improper Wheat crate"
- group = "Food"
-
-//All the meats
-
-/datum/supply_packs/meat
- name = "meat(x5)"
- contains = list(
- /obj/item/reagent_container/food/snacks/meat,
- /obj/item/reagent_container/food/snacks/meat,
- /obj/item/reagent_container/food/snacks/meat,
- /obj/item/reagent_container/food/snacks/meat,
- /obj/item/reagent_container/food/snacks/meat,
- )
- cost = 10
- containertype = /obj/structure/closet/crate/freezer
- containername = "\improper meat crate"
- group = "Food"
-
-/datum/supply_packs/carp_fillet
- name = "carp fillet (x5)"
- contains = list(
- /obj/item/reagent_container/food/snacks/carpmeat,
- /obj/item/reagent_container/food/snacks/carpmeat,
- /obj/item/reagent_container/food/snacks/carpmeat,
- /obj/item/reagent_container/food/snacks/carpmeat,
- /obj/item/reagent_container/food/snacks/carpmeat,
- )
- cost = 10
- containertype = /obj/structure/closet/crate/freezer
- containername = "\improper carp filet crate"
- group = "Food"
-
-//all the condiment type items
-
-/datum/supply_packs/condiment
- name = "crate of condiments"
+// crate of random ingredient that you can buy in vendor in kitchen
+/datum/supply_packs/ingredient
+ name = "surplus boxes of ingredients(x6 boxes)"
+ randomised_num_contained = 6
contains = list(
- /obj/item/reagent_container/food/condiment/enzyme,
- /obj/item/reagent_container/food/condiment/sugar,
- /obj/item/reagent_container/food/condiment/saltshaker,
- /obj/item/reagent_container/food/condiment/peppermill,
+ /obj/item/storage/fancy/egg_box,
+ /obj/item/storage/box/fish,
+ /obj/item/storage/box/meat,
+ /obj/item/storage/box/milk,
+ /obj/item/storage/box/soymilk,
+ /obj/item/storage/box/enzyme,
+ /obj/item/storage/box/flour,
+ /obj/item/storage/box/sugar,
+ /obj/item/storage/box/apple,
+ /obj/item/storage/box/banana,
+ /obj/item/storage/box/chanterelle,
+ /obj/item/storage/box/cherries,
+ /obj/item/storage/box/chili,
+ /obj/item/storage/box/cabbage,
+ /obj/item/storage/box/carrot,
+ /obj/item/storage/box/corn,
+ /obj/item/storage/box/eggplant,
+ /obj/item/storage/box/lemon,
+ /obj/item/storage/box/lime,
+ /obj/item/storage/box/orange,
+ /obj/item/storage/box/potato,
+ /obj/item/storage/box/tomato,
+ /obj/item/storage/box/whitebeet,
/obj/item/reagent_container/food/condiment/hotsauce/cholula,
/obj/item/reagent_container/food/condiment/hotsauce/franks,
/obj/item/reagent_container/food/condiment/hotsauce/sriracha,
/obj/item/reagent_container/food/condiment/hotsauce/tabasco,
+ /obj/item/reagent_container/food/drinks/bottle/whiskey,
+ /obj/item/reagent_container/food/drinks/bottle/tequila,
+ /obj/item/reagent_container/food/drinks/bottle/rum,
+ /obj/item/reagent_container/food/drinks/bottle/wine,
)
cost = 10
containertype = /obj/structure/closet/crate/freezer
- containername = "\improper crate of condiment"
+ containername = "\improper surplus of ingredients crate"
group = "Food"
- //all the finish snacks.
+//all the finish snacks.
/datum/supply_packs/donuts
name = "box of donuts (x5)"
@@ -165,47 +68,6 @@
containername = "\improper USCM MRE crate(x2)"
group = "Food"
-/datum/supply_packs/funfood
- name = "special ingredients crate (x6)"
- randomised_num_contained = 6
- contains = list(
- /obj/item/reagent_container/food/condiment/enzyme,
- /obj/item/reagent_container/food/condiment/saltshaker,
- /obj/item/reagent_container/food/condiment/saltshaker,
- /obj/item/reagent_container/food/condiment/saltshaker,
- /obj/item/reagent_container/food/condiment/peppermill,
- /obj/item/reagent_container/food/condiment/peppermill,
- /obj/item/reagent_container/food/condiment/peppermill,
- /obj/item/reagent_container/food/condiment/sugar,
- /obj/item/reagent_container/food/condiment/sugar,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/grown/potato,
- /obj/item/reagent_container/food/snacks/mint,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/tomato,
- /obj/item/reagent_container/food/snacks/grown/carrot,
- /obj/item/reagent_container/food/snacks/grown/carrot,
- /obj/item/reagent_container/food/snacks/grown/lemon,
- /obj/item/reagent_container/food/snacks/grown/lemon,
- /obj/item/reagent_container/food/snacks/grown/orange,
- /obj/item/reagent_container/food/snacks/grown/orange,
- /obj/item/reagent_container/food/snacks/grown/lime,
- /obj/item/reagent_container/food/snacks/grown/lime,
- /obj/item/reagent_container/food/drinks/bottle/whiskey,
- /obj/item/reagent_container/food/drinks/bottle/tequila,
- /obj/item/reagent_container/food/drinks/bottle/rum,
- /obj/item/reagent_container/food/drinks/bottle/wine,
- /obj/item/reagent_container/food/drinks/bottle/wine,
- /obj/item/reagent_container/food/drinks/bottle/wine,
- )
- cost = 10
- containertype = /obj/structure/closet/crate/freezer
- containername = "\improper Special ingredients crate"
- group = "Food"
-
/datum/supply_packs/pizzas
name = "pizza ready-to-eat (x3)"
contains = list(
diff --git a/code/datums/supply_packs/operations.dm b/code/datums/supply_packs/operations.dm
index 6d5e5d14756c..e5525504716a 100644
--- a/code/datums/supply_packs/operations.dm
+++ b/code/datums/supply_packs/operations.dm
@@ -24,7 +24,6 @@
containername = "OB Ammo Crate (Incendiary x2)"
buyable = 0
group = "Operations"
- iteration_needed = null
/datum/supply_packs/ob_explosive
contains = list(
@@ -48,7 +47,6 @@
containername = "OB Ammo Crate (HE x2)"
buyable = 0
group = "Operations"
- iteration_needed = null
/datum/supply_packs/ob_cluster
contains = list(
@@ -72,7 +70,6 @@
containername = "OB Ammo Crate (Cluster x2)"
buyable = 0
group = "Operations"
- iteration_needed = null
/datum/supply_packs/telecommsparts
name = "Replacement Telecommunications Parts"
@@ -99,7 +96,6 @@
containertype = /obj/structure/machinery/nuclearbomb
buyable = 0
group = "Operations"
- iteration_needed = null
/datum/supply_packs/technuclearbomb
name = "Encrypted Operational Nuke"
@@ -107,19 +103,17 @@
containertype = /obj/structure/machinery/nuclearbomb/tech
buyable = 0
group = "Operations"
- iteration_needed = null
/datum/supply_packs/spec_kits
name = "Weapons Specialist Kits"
contains = list(
- /obj/item/spec_kit/asrs,
- /obj/item/spec_kit/asrs,
- /obj/item/spec_kit/asrs,
- /obj/item/spec_kit/asrs,
+ /obj/item/spec_kit/rifleman,
+ /obj/item/spec_kit/rifleman,
+ /obj/item/spec_kit/rifleman,
+ /obj/item/spec_kit/rifleman,
)
cost = 0
containertype = /obj/structure/closet/crate/supply
containername = "weapons specialist kits crate"
buyable = 0
group = "Operations"
- iteration_needed = null
diff --git a/code/defines/procs/records.dm b/code/defines/procs/records.dm
index a1e2ade2b709..a9d40f993629 100644
--- a/code/defines/procs/records.dm
+++ b/code/defines/procs/records.dm
@@ -1,48 +1,50 @@
/proc/CreateGeneralRecord()
- var/datum/data/record/G = new /datum/data/record()
- G.fields["name"] = "New Record"
- G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
- G.fields["rank"] = "Unassigned"
- G.fields["real_rank"] = "Unassigned"
- G.fields["sex"] = "Male"
- G.fields["age"] = "Unknown"
- G.fields["ethnicity"] = "Unknown"
- G.fields["p_stat"] = "Active"
- G.fields["m_stat"] = "Stable"
- G.fields["species"] = "Human"
- G.fields["origin"] = "Unknown"
- G.fields["faction"] = "Unknown"
- G.fields["mob_faction"] = "Unknown"
- G.fields["religion"] = "Unknown"
- GLOB.data_core.general += G
- return G
+ var/datum/data/record/general_record = new /datum/data/record()
+ general_record.fields["name"] = "New Record"
+ general_record.name = "New Record"
+ general_record.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
+ general_record.fields["rank"] = "Unassigned"
+ general_record.fields["real_rank"] = "Unassigned"
+ general_record.fields["sex"] = "Male"
+ general_record.fields["age"] = "Unknown"
+ general_record.fields["ethnicity"] = "Unknown"
+ general_record.fields["p_stat"] = "Active"
+ general_record.fields["m_stat"] = "Stable"
+ general_record.fields["species"] = "Human"
+ general_record.fields["origin"] = "Unknown"
+ general_record.fields["faction"] = "Unknown"
+ general_record.fields["mob_faction"] = "Unknown"
+ general_record.fields["religion"] = "Unknown"
+ GLOB.data_core.general += general_record
+ return general_record
/proc/CreateSecurityRecord(name as text, id as text)
- var/datum/data/record/R = new /datum/data/record()
- R.fields["name"] = name
- R.fields["id"] = id
- R.name = text("Security Record #[id]")
- R.fields["incidents"] = "None"
- GLOB.data_core.security += R
- return R
+ var/datum/data/record/security_record = new /datum/data/record()
+ security_record.fields["name"] = name
+ security_record.fields["id"] = id
+ security_record.name = text("Security Record #[id]")
+ security_record.fields["incidents"] = "None"
+ GLOB.data_core.security += security_record
+ return security_record
-/proc/create_medical_record(mob/living/carbon/human/H)
- var/datum/data/record/M = new /datum/data/record()
- M.fields["id"] = null
- M.fields["name"] = H.real_name
- M.fields["b_type"] = H.b_type
- M.fields["mi_dis"] = "None"
- M.fields["mi_dis_d"] = "No minor disabilities have been declared."
- M.fields["ma_dis"] = "None"
- M.fields["ma_dis_d"] = "No major disabilities have been diagnosed."
- M.fields["alg"] = "None"
- M.fields["alg_d"] = "No allergies have been detected in this patient."
- M.fields["cdi"] = "None"
- M.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
- M.fields["last_scan_time"] = null
- M.fields["last_scan_result"] = "No scan data on record"
- M.fields["autodoc_data"] = list()
- M.fields["autodoc_manual"] = list()
- M.fields["ref"] = WEAKREF(H)
- GLOB.data_core.medical += M
- return M
+/proc/create_medical_record(mob/living/carbon/human/person)
+ var/datum/data/record/medical_record = new /datum/data/record()
+ medical_record.fields["id"] = null
+ medical_record.fields["name"] = person.real_name
+ medical_record.name = person.real_name
+ medical_record.fields["b_type"] = person.b_type
+ medical_record.fields["mi_dis"] = "None"
+ medical_record.fields["mi_dis_d"] = "No minor disabilities have been declared."
+ medical_record.fields["ma_dis"] = "None"
+ medical_record.fields["ma_dis_d"] = "No major disabilities have been diagnosed."
+ medical_record.fields["alg"] = "None"
+ medical_record.fields["alg_d"] = "No allergies have been detected in this patient."
+ medical_record.fields["cdi"] = "None"
+ medical_record.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
+ medical_record.fields["last_scan_time"] = null
+ medical_record.fields["last_scan_result"] = "No scan data on record"
+ medical_record.fields["autodoc_data"] = list()
+ medical_record.fields["autodoc_manual"] = list()
+ medical_record.fields["ref"] = WEAKREF(person)
+ GLOB.data_core.medical += medical_record
+ return medical_record
diff --git a/code/game/area/kutjevo.dm b/code/game/area/kutjevo.dm
index 422017c0a46b..a5a12cd5b999 100644
--- a/code/game/area/kutjevo.dm
+++ b/code/game/area/kutjevo.dm
@@ -67,6 +67,10 @@
name = "Kutjevo - Power Station River"
icon_state = "lz_river"
+/area/kutjevo/exterior/spring
+ name = "Kutjevo - Southern Spring"
+ icon_state = "lz_river"
+
/area/kutjevo/exterior/scrubland
name = "Kutjevo - Scrubland"
icon_state = "scrubland"
diff --git a/code/game/gamemodes/cm_initialize.dm b/code/game/gamemodes/cm_initialize.dm
index ffcfd37489af..55452972cc3f 100644
--- a/code/game/gamemodes/cm_initialize.dm
+++ b/code/game/gamemodes/cm_initialize.dm
@@ -75,6 +75,12 @@ Additional game mode variables.
var/list/monkey_types = list() //What type of monkeys do we spawn
var/latejoin_tally = 0 //How many people latejoined Marines
var/latejoin_larva_drop = LATEJOIN_MARINES_PER_LATEJOIN_LARVA //A larva will spawn in once the tally reaches this level. If set to 0, no latejoin larva drop
+ /// Amount of latejoin_tally already awarded as larvas
+ var/latejoin_larva_used = 0
+ /// Multiplier to the amount of marine gear, current value as calculated with modifiers
+ var/gear_scale = 1
+ /// Multiplier to the amount of marine gear, maximum reached value for
+ var/gear_scale_max = 1
//Role Authority set up.
/// List of role titles to override to different roles when starting game
@@ -914,23 +920,49 @@ Additional game mode variables.
//We do NOT want to initilialize the gear before everyone is properly spawned in
/datum/game_mode/proc/initialize_post_marine_gear_list()
- var/scale = get_scaling_value()
+ init_gear_scale()
//Set up attachment vendor contents related to Marine count
for(var/i in GLOB.cm_vending_vendors)
var/obj/structure/machinery/cm_vending/sorted/CVS = i
- CVS.populate_product_list_and_boxes(scale)
+ CVS.populate_product_list_and_boxes(gear_scale)
//Scale the amount of cargo points through a direct multiplier
- GLOB.supply_controller.points = round(GLOB.supply_controller.points * scale)
+ GLOB.supply_controller.points += round(GLOB.supply_controller.points_scale * gear_scale)
-/datum/game_mode/proc/get_scaling_value()
+///Returns a multiplier to the amount of gear that is to be distributed roundstart, stored in [/datum/game_mode/var/gear_scale]
+/datum/game_mode/proc/init_gear_scale()
//We take the number of marine players, deduced from other lists, and then get a scale multiplier from it, to be used in arbitrary manners to distribute equipment
- //This might count players who ready up but get kicked back to the lobby
- var/marine_pop_size = length(GLOB.alive_human_list)
+ var/marine_pop_size = 0
+ var/uscm_personnel_count = 0
+ for(var/mob/living/carbon/human/human as anything in GLOB.alive_human_list)
+ if(human.faction == FACTION_USCM)
+ uscm_personnel_count++
+ var/datum/job/job = GET_MAPPED_ROLE(human.job)
+ marine_pop_size += GLOB.RoleAuthority.calculate_role_weight(job)
//This gives a decimal value representing a scaling multiplier. Cannot go below 1
- return max(marine_pop_size / MARINE_GEAR_SCALING_NORMAL, 1)
+ gear_scale = max(marine_pop_size / MARINE_GEAR_SCALING_NORMAL, 1)
+ gear_scale_max = gear_scale
+ log_debug("SUPPLY: Game start detected [marine_pop_size] weighted marines (out of [uscm_personnel_count]/[length(GLOB.alive_human_list)] USCM humans), resulting in gear_scale = [gear_scale]")
+ return gear_scale
+
+///Updates the [/datum/game_mode/var/gear_scale] multiplier based on joining and cryoing marines
+/datum/game_mode/proc/update_gear_scale(delta)
+ // Magic inverse function that guarantees marines still get good supplies for latejoins within first ~30 minutes but stalls starting 2 hours or so
+ gear_scale += delta * (0.25 + 0.75 / (1 + ROUND_TIME / 20000)) / MARINE_GEAR_SCALING_NORMAL
+ var/gear_delta = gear_scale - gear_scale_max
+ if(gear_delta > 0)
+ gear_scale_max = gear_scale
+ for(var/obj/structure/machinery/cm_vending/sorted/vendor as anything in GLOB.cm_vending_vendors)
+ vendor.update_dynamic_stock(gear_scale_max)
+ GLOB.supply_controller.points += round(gear_delta * GLOB.supply_controller.points_scale)
+
+/// Updates [var/latejoin_tally] and [var/gear_scale] based on role weights of latejoiners/cryoers. Delta is the amount of role positions added/removed
+/datum/game_mode/proc/latejoin_update(role, delta = 1)
+ var/weight = GLOB.RoleAuthority.calculate_role_weight(role)
+ latejoin_tally += weight * delta
+ update_gear_scale(weight * delta)
// for the toolbox
/datum/game_mode/proc/end_round_message()
diff --git a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm
index 3bc56728a7b9..6ebda633a19b 100644
--- a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm
+++ b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm
@@ -9,7 +9,7 @@
/datum/game_mode/whiskey_outpost
name = GAMEMODE_WHISKEY_OUTPOST
config_tag = GAMEMODE_WHISKEY_OUTPOST
- required_players = 0
+ required_players = 140
xeno_bypass_timer = 1
flags_round_type = MODE_NEW_SPAWN
role_mappings = list(
@@ -76,10 +76,14 @@
hardcore = TRUE
votable = TRUE
- vote_cycle = 25 // approx. once every 5 days, if it wins the vote
+ vote_cycle = 75 // approx. once every 5 days, if it wins the vote
taskbar_icon = 'icons/taskbar/gml_wo.png'
+/datum/game_mode/whiskey_outpost/New()
+ . = ..()
+ required_players = CONFIG_GET(number/whiskey_required_players)
+
/datum/game_mode/whiskey_outpost/get_roles_list()
return GLOB.ROLES_WO
diff --git a/code/game/jobs/role_authority.dm b/code/game/jobs/role_authority.dm
index 8829bf983c25..37131451ca07 100644
--- a/code/game/jobs/role_authority.dm
+++ b/code/game/jobs/role_authority.dm
@@ -262,7 +262,7 @@ I hope it's easier to tell what the heck this proc is even doing, unlike previou
if(istype(CO_surv_job))
CO_surv_job.set_spawn_positions(GLOB.players_preassigned)
- if(SSnightmare.get_scenario_value("predator_round"))
+ if(SSnightmare.get_scenario_value("predator_round") && !Check_WO())
SSticker.mode.flags_round_type |= MODE_PREDATOR
// Set predators starting amount based on marines assigned
var/datum/job/PJ = temp_roles_for_mode[JOB_PREDATOR]
@@ -366,6 +366,8 @@ I hope it's easier to tell what the heck this proc is even doing, unlike previou
* survivors and the number of roundstart Squad Rifleman slots.
*/
/datum/authority/branch/role/proc/calculate_role_weight(datum/job/J)
+ if(!J)
+ return 0
if(GLOB.ROLES_MARINES.Find(J.title))
return 1
if(GLOB.ROLES_XENO.Find(J.title))
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 32cb026a0b25..d62d688fcfc5 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -98,7 +98,7 @@ update_flag
/obj/structure/machinery/portable_atmospherics/canister/attackby(obj/item/W as obj, mob/user as mob)
if(!HAS_TRAIT(W, TRAIT_TOOL_WRENCH) && !istype(W, /obj/item/tank) && !istype(W, /obj/item/device/analyzer))
- visible_message(SPAN_DANGER("[user] hits the [src] with a [W]!"))
+ visible_message(SPAN_DANGER("[user] hits [src] with [W]!"))
update_health(W.force)
src.add_fingerprint(user)
..()
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 715e9c2a86e5..55df45c70ccc 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -152,7 +152,7 @@
if(X.id == id)
X.score(side, 3)// 3 points for dunking a mob
// no break, to update multiple scoreboards
- visible_message(SPAN_DANGER("[user] dunks [M] into the [src]!"))
+ visible_message(SPAN_DANGER("[user] dunks [M] into [src]!"))
return
else if (istype(W, /obj/item) && get_dist(src,user)<2)
user.drop_inv_item_to_loc(W, loc)
@@ -160,7 +160,7 @@
if(X.id == id)
X.score(side)
// no break, to update multiple scoreboards
- visible_message(SPAN_NOTICE("[user] dunks [W] into the [src]!"))
+ visible_message(SPAN_NOTICE("[user] dunks [W] into [src]!"))
return
/obj/structure/holohoop/BlockedPassDirs(atom/movable/mover, target_dir)
diff --git a/code/game/machinery/computer/dropship_weapons.dm b/code/game/machinery/computer/dropship_weapons.dm
index fdab92ee4c13..d86b9fc28a28 100644
--- a/code/game/machinery/computer/dropship_weapons.dm
+++ b/code/game/machinery/computer/dropship_weapons.dm
@@ -64,7 +64,7 @@
power = MATRIX.power
else
- to_chat(user, SPAN_WARNING("matrix is not complete!"))
+ to_chat(user, SPAN_WARNING("Matrix is not complete!"))
/obj/structure/machinery/computer/dropship_weapons/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0)
var/data[0]
diff --git a/code/game/machinery/computer/research.dm b/code/game/machinery/computer/research.dm
index 2c8a5689b495..1ba696eeee9c 100644
--- a/code/game/machinery/computer/research.dm
+++ b/code/game/machinery/computer/research.dm
@@ -29,7 +29,7 @@
if(!N.grant)
return
GLOB.chemical_data.update_credits(N.grant)
- visible_message(SPAN_NOTICE("[user] scans the [N.name] on the [src], collecting the [N.grant] research credits."))
+ visible_message(SPAN_NOTICE("[user] scans the [N.name] on [src], collecting the [N.grant] research credits."))
N.grant = 0
qdel(N)
return
@@ -61,7 +61,7 @@
visible_message(SPAN_NOTICE("[user] swipes their ID card on \the [src], but it is refused."))
return
if(card.clearance_access <= GLOB.chemical_data.clearance_level || (card.clearance_access == 6 && GLOB.chemical_data.clearance_level >= 5 && GLOB.chemical_data.clearance_x_access))
- visible_message(SPAN_NOTICE("[user] swipes the clearance card on the [src], but nothing happens."))
+ visible_message(SPAN_NOTICE("[user] swipes the clearance card on [src], but nothing happens."))
return
if(user.real_name != card.registered_name)
visible_message(SPAN_WARNING("WARNING: ILLEGAL CLEARANCE USER DETECTED. CARD DATA HAS BEEN WIPED."))
@@ -220,4 +220,3 @@
GLOB.chemical_data.update_credits(purchase_cost * -1)
visible_message(SPAN_NOTICE("Clearance Level X Acquired."))
playsound(loc, pick('sound/machines/computer_typing1.ogg','sound/machines/computer_typing2.ogg','sound/machines/computer_typing3.ogg'), 5, 1)
-
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 58935702cb7b..53bf82c93925 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -321,13 +321,13 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li
dept_console += A
A.moveToNullspace()
+ var/datum/job/job = GET_MAPPED_ROLE(occupant.job)
if(ishuman(occupant))
var/mob/living/carbon/human/H = occupant
if(H.assigned_squad)
var/datum/squad/S = H.assigned_squad
S.forget_marine_in_squad(H)
- var/datum/job/J = GET_MAPPED_ROLE(H.job)
- if(istype(J, /datum/job/marine/specialist))
+ if(istype(job, /datum/job/marine/specialist))
//we make the set this specialist took if any available again
if(H.skills)
var/set_name
@@ -346,7 +346,8 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li
if(set_name && !GLOB.available_specialist_sets.Find(set_name))
GLOB.available_specialist_sets += set_name
- SSticker.mode.latejoin_tally-- //Cryoing someone out removes someone from the Marines, blocking further larva spawns until accounted for
+ //Cryoing someone out removes someone from the Marines, blocking further larva spawns until accounted for
+ SSticker.mode.latejoin_update(job, -1)
//Handle job slot/tater cleanup.
GLOB.RoleAuthority.free_role(GET_MAPPED_ROLE(occupant.job), TRUE)
diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm
index 030e732ea75f..545d4c35bb5a 100644
--- a/code/game/machinery/door_control.dm
+++ b/code/game/machinery/door_control.dm
@@ -234,3 +234,31 @@
desiredstate = !desiredstate
+/obj/structure/machinery/door_control/cl
+ req_access_txt = "200"
+// seperating quarter and office because we might want to allow more access to the office than quarter in the future.
+/obj/structure/machinery/door_control/cl/office
+/obj/structure/machinery/door_control/cl/office/door
+ name = "Office Door Shutter"
+ id = "cl_office_door"
+/obj/structure/machinery/door_control/cl/office/window
+ name = "Office Windows Shutters"
+ id = "cl_office_windows"
+/obj/structure/machinery/door_control/cl/office/divider
+ name = "Room Divider"
+ id = "RoomDivider"
+//special button that unlock the cl lock on is evac pod door bypassing general lockdown.
+/obj/structure/machinery/door_control/cl/office/evac
+ name = "Evac Pod Door Control"
+ id = "cl_evac"
+ normaldoorcontrol = 1
+/obj/structure/machinery/door_control/cl/quarter
+/obj/structure/machinery/door_control/cl/quarter/officedoor
+ name = "Quarter Door Shutter"
+ id = "cl_quarter_door"
+/obj/structure/machinery/door_control/cl/quarter/backdoor
+ name = "Maintenance Door Shutter"
+ id = "cl_quarter_maintenance"
+/obj/structure/machinery/door_control/cl/quarter/windows
+ name = "Quarter Windows Shutters"
+ id = "cl_quarter_windows"
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 4e362ef12fac..b03ba1e8e195 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -557,7 +557,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list(
if(istype(attacking_item, /obj/item/clothing/mask/cigarette))
if(isElectrified())
var/obj/item/clothing/mask/cigarette/L = attacking_item
- L.light(SPAN_NOTICE("[user] lights their [L] on an electrical arc from the [src]"))
+ L.light(SPAN_NOTICE("[user] lights their [L] on an electrical arc from [src]"))
return
if(!isRemoteControlling(user))
@@ -568,7 +568,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list(
add_fingerprint(user)
if(istype(attacking_item, /obj/item/weapon/zombie_claws) && (welded || locked))
- user.visible_message(SPAN_NOTICE("[user] starts tearing into the door on the [src]!"), \
+ user.visible_message(SPAN_NOTICE("[user] starts tearing into the door on [src]!"), \
SPAN_NOTICE("You start prying your hand into the gaps of the door with your fingers... This will take about 30 seconds."), \
SPAN_NOTICE("You hear tearing noises!"))
@@ -845,7 +845,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list(
for(var/i in resin_door_shmushereds)
if(istype(x,i)) //I would like to just use a if(locate() in ) here but Im not gonna add every child to GLOB.resin_door_shmushereds so it works
playsound(loc, "alien_resin_break", 25)
- visible_message(SPAN_WARNING("The [src.name] closes on the [x], shmushing it!"))
+ visible_message(SPAN_WARNING("The [src.name] closes on [x], shmushing it!"))
if(isturf(x))
var/turf/closed/wall/resin_wall_to_destroy = x
resin_wall_to_destroy.dismantle_wall()
diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm
index da904f255c40..2cc85ce53ac8 100644
--- a/code/game/machinery/doors/shutters.dm
+++ b/code/game/machinery/doors/shutters.dm
@@ -155,3 +155,23 @@
if(HAS_TRAIT(attacking_item, TRAIT_TOOL_CROWBAR))
return
..()
+
+//make a subtype for CL office so it as a proper name.
+/obj/structure/machinery/door/poddoor/shutters/almayer/cl
+ name = "\improper Corporate Liason Privacy Shutters"
+//adding a subtype for CL office to use to secure access to cl office.
+/obj/structure/machinery/door/poddoor/shutters/almayer/cl/office
+/obj/structure/machinery/door/poddoor/shutters/almayer/cl/office/door
+ id = "cl_office_door"
+/obj/structure/machinery/door/poddoor/shutters/almayer/cl/office/window
+ id = "cl_office_windows"
+//adding a subtype for CL quarter to use to secure access to cl quarter.(including seperation with the office)
+/obj/structure/machinery/door/poddoor/shutters/almayer/cl/quarter
+/obj/structure/machinery/door/poddoor/shutters/almayer/cl/quarter/backdoor
+ id = "cl_quarter_maintenance"
+ dir = 4
+/obj/structure/machinery/door/poddoor/shutters/almayer/cl/quarter/door
+ id = "cl_quarter_door"
+ dir = 4
+/obj/structure/machinery/door/poddoor/shutters/almayer/cl/quarter/window
+ id = "cl_quarter_windows"
diff --git a/code/game/machinery/fusion_engine.dm b/code/game/machinery/fusion_engine.dm
index 8e3097ef52d1..d7c7cc4c7d18 100644
--- a/code/game/machinery/fusion_engine.dm
+++ b/code/game/machinery/fusion_engine.dm
@@ -156,13 +156,13 @@
/obj/structure/machinery/power/fusion_engine/attackby(obj/item/O, mob/user)
if(istype(O, /obj/item/fuelCell))
if(is_on)
- to_chat(user, SPAN_WARNING("The [src] needs to be turned off first."))
+ to_chat(user, SPAN_WARNING("[src] needs to be turned off first."))
return TRUE
if(!fusion_cell)
if(user.drop_inv_item_to_loc(O, src))
fusion_cell = O
update_icon()
- to_chat(user, SPAN_NOTICE("You load the [src] with the [O]."))
+ to_chat(user, SPAN_NOTICE("You load [src] with [O]."))
return TRUE
else
to_chat(user, SPAN_WARNING("You need to remove the fuel cell from [src] first."))
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 4b863bec043d..e16d2cacf63b 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -101,7 +101,7 @@
for(var/datum/reagent/chem in beaker.reagents.reagent_list)
reagentnames += ";[chem.name]"
- log_admin("[key_name(user)] put a [beaker] into [src], containing [reagentnames] at ([src.loc.x],[src.loc.y],[src.loc.z]).")
+ log_admin("[key_name(user)] put \a [beaker] into [src], containing [reagentnames] at ([src.loc.x],[src.loc.y],[src.loc.z]).")
to_chat(user, "You attach \the [container] to \the [src].")
update_beam()
diff --git a/code/game/machinery/kitchen/processor.dm b/code/game/machinery/kitchen/processor.dm
index 0c4b8a973e83..a18f5db8af43 100644
--- a/code/game/machinery/kitchen/processor.dm
+++ b/code/game/machinery/kitchen/processor.dm
@@ -89,7 +89,7 @@
to_chat(user, SPAN_DANGER("That probably won't blend."))
return 1
user.visible_message("[user] put [what] into [src].", \
- "You put the [what] into [src].")
+ "You put [what] into [src].")
user.drop_held_item()
what.forceMove(src)
@@ -118,4 +118,3 @@
src.processing = 0
src.visible_message(SPAN_NOTICE("\the [src] finished processing."), \
"You hear the food processor stopping/")
-
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index 33e6e9749e48..a886b59f501f 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -620,8 +620,8 @@ Buildable meters
playsound(src.loc, 'sound/items/Ratchet.ogg', 25, 1)
user.visible_message( \
- "[user] fastens the [src].", \
- SPAN_NOTICE("You have fastened the [src]."), \
+ "[user] fastens [src].", \
+ SPAN_NOTICE("You have fastened [src]."), \
"You hear ratchet.")
qdel(src) // remove the pipe item
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index dd45ad597800..69b21964a4f4 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -66,7 +66,7 @@
return
else if(HAS_TRAIT(I, TRAIT_TOOL_SCREWDRIVER))
open = !open
- user.visible_message(SPAN_NOTICE("[user] [open ? "opens" : "closes"] the hatch on the [src]."), SPAN_NOTICE("You [open ? "open" : "close"] the hatch on the [src]."))
+ user.visible_message(SPAN_NOTICE("[user] [open ? "opens" : "closes"] the hatch on [src]."), SPAN_NOTICE("You [open ? "open" : "close"] the hatch on [src]."))
update_icon()
if(!open && user.interactee == src)
close_browser(user, "spaceheater")
@@ -107,7 +107,7 @@
start_processing()
else
stop_processing()
- user.visible_message(SPAN_NOTICE("[user] switches [on ? "on" : "off"] the [src]."),SPAN_NOTICE("You switch [on ? "on" : "off"] the [src]."))
+ user.visible_message(SPAN_NOTICE("[user] switches [on ? "on" : "off"] [src]."),SPAN_NOTICE("You switch [on ? "on" : "off"] [src]."))
update_icon()
return
@@ -186,4 +186,3 @@
name = "radiator"
desc = "It's a radiator. It heats the room through convection with hot water. This one has a red handle."
icon_state = "radiator-r"
-
diff --git a/code/game/machinery/vending/cm_vending.dm b/code/game/machinery/vending/cm_vending.dm
index 6205f24c8e05..02b602cc8e07 100644
--- a/code/game/machinery/vending/cm_vending.dm
+++ b/code/game/machinery/vending/cm_vending.dm
@@ -440,6 +440,27 @@ GLOBAL_LIST_EMPTY(vending_products)
user.set_interaction(src)
tgui_interact(user)
+/// Handles redeeming coin tokens.
+/obj/structure/machinery/cm_vending/proc/redeem_token(obj/item/coin/marine/token, mob/user)
+ var/reward_typepath
+ switch(token.token_type)
+ if(VEND_TOKEN_VOID)
+ to_chat(user, SPAN_WARNING("ERROR: TOKEN NOT RECOGNISED."))
+ return FALSE
+ if(VEND_TOKEN_SPEC)
+ reward_typepath = /obj/item/spec_kit/rifleman
+ else
+ to_chat(user, SPAN_WARNING("ERROR: INCORRECT TOKEN."))
+ return FALSE
+
+ if(reward_typepath && user.drop_inv_item_to_loc(token, src))
+ to_chat(user, SPAN_NOTICE("You insert \the [token] into \the [src]."))
+ var/obj/new_item = new reward_typepath(get_turf(src))
+ user.put_in_any_hand_if_possible(new_item)
+ return TRUE
+ return FALSE
+
+
//------------TGUI PROCS---------------
/obj/structure/machinery/cm_vending/ui_data(mob/user)
@@ -738,13 +759,20 @@ GLOBAL_LIST_EMPTY(vending_products)
hack_access(user)
return TRUE
+ ///If we want to redeem a token
+ else if(istype(W, /obj/item/coin/marine))
+ if(!can_access_to_vend(user, ignore_hack = TRUE))
+ return FALSE
+ . = redeem_token(W, user)
+ return
+
..()
/obj/structure/machinery/cm_vending/proc/get_listed_products(mob/user)
return listed_products
-/obj/structure/machinery/cm_vending/proc/can_access_to_vend(mob/user, display=TRUE)
- if(!hacked)
+/obj/structure/machinery/cm_vending/proc/can_access_to_vend(mob/user, display = TRUE, ignore_hack = FALSE)
+ if(!hacked || ignore_hack)
if(!allowed(user))
if(display)
to_chat(user, SPAN_WARNING("Access denied."))
@@ -847,8 +875,11 @@ GLOBAL_LIST_EMPTY(vending_products)
vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_TO_HAND
show_points = FALSE
- //this here is made to provide ability to restock vendors with different subtypes of same object, like handmade and manually filled ammo boxes.
+ ///this here is made to provide ability to restock vendors with different subtypes of same object, like handmade and manually filled ammo boxes.
var/list/corresponding_types_list
+ ///If using [VEND_STOCK_DYNAMIC], assoc list of product entry to list of (product multiplier, awarded objects) - as seen in [/obj/structure/machinery/cm_vending/sorted/proc/populate_product_list]
+ ///This allows us to backtrack and refill the stocks when new players latejoin
+ var/list/list/dynamic_stock_multipliers
/obj/structure/machinery/cm_vending/sorted/Initialize()
. = ..()
@@ -861,14 +892,44 @@ GLOBAL_LIST_EMPTY(vending_products)
GLOB.cm_vending_vendors -= src
return ..()
-//this proc, well, populates product list based on roundstart amount of players
+///this proc, well, populates product list based on roundstart amount of players
/obj/structure/machinery/cm_vending/sorted/proc/populate_product_list_and_boxes(scale)
- populate_product_list(scale)
+ if(vend_flags & VEND_STOCK_DYNAMIC)
+ populate_product_list(1.0)
+ dynamic_stock_multipliers = list()
+ for(var/list/vendspec in listed_products)
+ var/multiplier = vendspec[2]
+ if(multiplier > 0)
+ var/awarded = round(vendspec[2] * scale) // Starting amount
+ //Record the multiplier and how many have actually been given out
+ dynamic_stock_multipliers[vendspec] = list(vendspec[2], awarded)
+ vendspec[2] = awarded // Override starting amount
+ else
+ populate_product_list(scale)
+
if(vend_flags & VEND_LOAD_AMMO_BOXES)
populate_ammo_boxes()
return
-//this proc, well, populates product list based on roundstart amount of players
+///Updates the vendor stock when the [/datum/game_mode/var/marine_tally] has changed and we're using [VEND_STOCK_DYNAMIC]
+///Assumes the scale can only increase!!! Don't take their items away!
+/obj/structure/machinery/cm_vending/sorted/proc/update_dynamic_stock(new_scale)
+ if(!(vend_flags & VEND_STOCK_DYNAMIC))
+ return
+ for(var/list/vendspec in dynamic_stock_multipliers)
+ var/list/metadata = dynamic_stock_multipliers[vendspec]
+ var/multiplier = metadata[1] // How much do we multiply scales by
+ var/previous_max_amount = metadata[2] // How many we already handed out at old scale
+ var/projected_max_amount = round(new_scale * multiplier) // How much we would have had total now in total
+ var/amount_to_add = round(projected_max_amount - previous_max_amount) // Rounding just in case
+ if(amount_to_add > 0)
+ metadata[2] += amount_to_add
+ vendspec[2] += amount_to_add
+ update_derived_ammo_and_boxes_on_add(vendspec)
+
+///this proc, well, populates product list based on roundstart amount of players
+///do not rely on scale here if you use VEND_STOCK_DYNAMIC because it's already taken into account
+///this is here for historical reasons and should ONLY be called by populate_product_list_and_boxes if you want dynamic stocks and ammoboxes to work
/obj/structure/machinery/cm_vending/sorted/proc/populate_product_list(scale)
return
diff --git a/code/game/machinery/vending/vending.dm b/code/game/machinery/vending/vending.dm
index b6c4da03640c..8629ce2bb2be 100644
--- a/code/game/machinery/vending/vending.dm
+++ b/code/game/machinery/vending/vending.dm
@@ -208,23 +208,23 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending
update_icon()
return TRUE
else if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI))
- to_chat(user, SPAN_WARNING("You do not understand how to repair the broken [src]."))
+ to_chat(user, SPAN_WARNING("You do not understand how to repair the broken [src.name]."))
return FALSE
else if(stat & BROKEN)
- to_chat(user, SPAN_NOTICE("You start to unscrew the [src]'s broken panel."))
+ to_chat(user, SPAN_NOTICE("You start to unscrew [src]'s broken panel."))
if(!do_after(user, 3 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, numticks = 3))
- to_chat(user, SPAN_WARNING("You stop unscrewing the [src]'s broken panel."))
+ to_chat(user, SPAN_WARNING("You stop unscrewing [src]'s broken panel."))
return FALSE
- to_chat(user, SPAN_NOTICE("You unscrew the [src]'s broken panel and remove it, exposing many broken wires."))
+ to_chat(user, SPAN_NOTICE("You unscrew [src]'s broken panel and remove it, exposing many broken wires."))
stat &= ~BROKEN
stat |= REPAIR_STEP_ONE
return TRUE
else if(stat & REPAIR_STEP_FOUR)
- to_chat(user, SPAN_NOTICE("You start to fasten the [src]'s new panel."))
+ to_chat(user, SPAN_NOTICE("You start to fasten [src]'s new panel."))
if(!do_after(user, 3 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, numticks = 3))
- to_chat(user, SPAN_WARNING("You stop fastening the [src]'s new panel."))
+ to_chat(user, SPAN_WARNING("You stop fastening [src]'s new panel."))
return FALSE
- to_chat(user, SPAN_NOTICE("You fasten the [src]'s new panel, fully repairing the vendor."))
+ to_chat(user, SPAN_NOTICE("You fasten [src]'s new panel, fully repairing the vendor."))
stat &= ~REPAIR_STEP_FOUR
stat |= FULLY_REPAIRED
update_icon()
@@ -235,17 +235,17 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending
return FALSE
else if(HAS_TRAIT(item, TRAIT_TOOL_WIRECUTTERS))
if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI))
- to_chat(user, SPAN_WARNING("You do not understand how to repair the broken [src]."))
+ to_chat(user, SPAN_WARNING("You do not understand how to repair the broken [src.name]."))
return FALSE
else if(stat == WORKING && panel_open)
attack_hand(user)
return
else if(stat & REPAIR_STEP_ONE)
- to_chat(user, SPAN_NOTICE("You start to remove the [src]'s broken wires."))
+ to_chat(user, SPAN_NOTICE("You start to remove [src]'s broken wires."))
if(!do_after(user, 3 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, numticks = 3))
- to_chat(user, SPAN_WARNING("You stop removing the [src]'s broken wires."))
+ to_chat(user, SPAN_WARNING("You stop removing [src]'s broken wires."))
return FALSE
- to_chat(user, SPAN_NOTICE("You remove the [src]'s broken broken wires."))
+ to_chat(user, SPAN_NOTICE("You remove [src]'s broken broken wires."))
stat &= ~REPAIR_STEP_ONE
stat |= REPAIR_STEP_TWO
return TRUE
@@ -255,20 +255,20 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending
return FALSE
else if(istype(item, /obj/item/stack/cable_coil))
if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI))
- to_chat(user, SPAN_WARNING("You do not understand how to repair the broken [src]."))
+ to_chat(user, SPAN_WARNING("You do not understand how to repair the broken [src.name]."))
return FALSE
var/obj/item/stack/cable_coil/CC = item
if(stat & REPAIR_STEP_TWO)
if(CC.amount < 5)
to_chat(user, SPAN_WARNING("You need more cable coil to replace the removed wires."))
- to_chat(user, SPAN_NOTICE("You start to replace the [src]'s removed wires."))
+ to_chat(user, SPAN_NOTICE("You start to replace [src]'s removed wires."))
if(!do_after(user, 3 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, numticks = 3))
- to_chat(user, SPAN_WARNING("You stop replacing the [src]'s removed wires."))
+ to_chat(user, SPAN_WARNING("You stop replacing [src]'s removed wires."))
return FALSE
if(!CC || !CC.use(5))
to_chat(user, SPAN_WARNING("You need more cable coil to replace the removed wires."))
return FALSE
- to_chat(user, SPAN_NOTICE("You remove the [src]'s broken broken wires."))
+ to_chat(user, SPAN_NOTICE("You remove [src]'s broken broken wires."))
stat &= ~REPAIR_STEP_TWO
stat |= REPAIR_STEP_THREE
return TRUE
@@ -278,18 +278,18 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending
return
else if(istype(item, /obj/item/stack/sheet/metal))
if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI))
- to_chat(user, SPAN_WARNING("You do not understand how to repair the broken [src]."))
+ to_chat(user, SPAN_WARNING("You do not understand how to repair the broken [src.name]."))
return FALSE
var/obj/item/stack/sheet/metal/M = item
if(stat & REPAIR_STEP_THREE)
- to_chat(user, SPAN_NOTICE("You start to construct a new panel for the [src]."))
+ to_chat(user, SPAN_NOTICE("You start to construct a new panel for [src]."))
if(!do_after(user, 3 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, numticks = 3))
- to_chat(user, SPAN_WARNING("You stop constructing a new panel for the [src]."))
+ to_chat(user, SPAN_WARNING("You stop constructing a new panel for [src]."))
return FALSE
if(!M || !M.use(1))
to_chat(user, SPAN_WARNING("You a sheet of metal to construct a new panel."))
return FALSE
- to_chat(user, SPAN_NOTICE("You construct a new panel for the [src]."))
+ to_chat(user, SPAN_NOTICE("You construct a new panel for [src]."))
stat &= ~REPAIR_STEP_THREE
stat |= REPAIR_STEP_FOUR
return TRUE
@@ -306,9 +306,9 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending
switch (anchored)
if (0)
anchored = TRUE
- user.visible_message("[user] tightens the bolts securing the [src] to the floor.", "You tighten the bolts securing the [src] to the floor.")
+ user.visible_message("[user] tightens the bolts securing [src] to the floor.", "You tighten the bolts securing [src] to the floor.")
if (1)
- user.visible_message("[user] unfastens the bolts securing the [src] to the floor.", "You unfasten the bolts securing the [src] to the floor.")
+ user.visible_message("[user] unfastens the bolts securing [src] to the floor.", "You unfasten the bolts securing [src] to the floor.")
anchored = FALSE
return
else if(HAS_TRAIT(item, TRAIT_TOOL_MULTITOOL) || HAS_TRAIT(item, TRAIT_TOOL_WIRECUTTERS))
@@ -321,7 +321,7 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending
return
if(user.drop_inv_item_to_loc(item, src))
coin = item
- to_chat(user, SPAN_NOTICE(" You insert the [item] into the [src]"))
+ to_chat(user, SPAN_NOTICE("You insert [item] into [src]"))
tgui_interact(user)
return
else if(istype(item, /obj/item/spacecash))
@@ -422,9 +422,9 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending
if(is_tipped_over)
if(user.action_busy)
return
- user.visible_message(SPAN_NOTICE("[user] begins to heave the [src] back into place!"), SPAN_NOTICE("You start heaving the [src] back into place..."))
+ user.visible_message(SPAN_NOTICE("[user] begins to heave [src] back into place!"), SPAN_NOTICE("You start heaving [src] back into place..."))
if(do_after(user, 80, INTERRUPT_NO_NEEDHAND, BUSY_ICON_FRIENDLY))
- user.visible_message(SPAN_NOTICE("[user] rights the [src]!"), SPAN_NOTICE("You right the [src]!"))
+ user.visible_message(SPAN_NOTICE("[user] rights [src]!"), SPAN_NOTICE("You right [src]!"))
flip_back()
return
@@ -534,7 +534,7 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending
return
if(coin.string_attached)
if(prob(50))
- to_chat(user, SPAN_NOTICE("You successfully pull the coin out before the [src] could swallow it."))
+ to_chat(user, SPAN_NOTICE("You successfully pull the coin out before [src] could swallow it."))
user.put_in_hands(coin)
else
to_chat(user, SPAN_NOTICE("You weren't able to pull the coin out fast enough, the machine ate it, string and all."))
@@ -882,8 +882,8 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending
S.remove_from_storage(item_to_stock, user.loc)
qdel(item_to_stock)
- user.visible_message(SPAN_NOTICE("[user] stocks the [src] with \a [product.product_name]."),
- SPAN_NOTICE("You stock the [src] with \a [product.product_name]."))
+ user.visible_message(SPAN_NOTICE("[user] stocks [src] with \a [product.product_name]."),
+ SPAN_NOTICE("You stock [src] with \a [product.product_name]."))
product.amount++
return //We found our item, no reason to go on.
@@ -967,7 +967,7 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending
if (!throw_item)
return 0
INVOKE_ASYNC(throw_item, /atom/movable/proc/throw_atom, target, 16, SPEED_AVERAGE, src)
- visible_message(SPAN_WARNING("The [src] launches \the [throw_item] at [target]!"))
+ visible_message(SPAN_WARNING("[src] launches [throw_item] at [target]!"))
playsound(src, "sound/machines/vending.ogg", 40, TRUE)
return 1
@@ -988,14 +988,14 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending
switch(wire)
if(VENDING_WIRE_EXTEND)
extended_inventory = TRUE
- visible_message(SPAN_NOTICE("A weak yellow light turns off underneath the [src]."))
+ visible_message(SPAN_NOTICE("A weak yellow light turns off underneath [src]."))
if(VENDING_WIRE_SHOCK)
seconds_electrified = -1
- visible_message(SPAN_DANGER("Electric arcs shoot off from the [src]!"))
+ visible_message(SPAN_DANGER("Electric arcs shoot off from [src]!"))
if (VENDING_WIRE_SHOOT_INV)
if(!shoot_inventory)
shoot_inventory = TRUE
- visible_message(SPAN_WARNING("The [src] begins whirring noisily."))
+ visible_message(SPAN_WARNING("[src] begins whirring noisily."))
/obj/structure/machinery/vending/proc/mend(wire)
wires |= getWireFlag(wire)
@@ -1003,24 +1003,24 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending
switch(wire)
if(VENDING_WIRE_EXTEND)
extended_inventory = FALSE
- visible_message(SPAN_NOTICE("A weak yellow light turns on underneath the [src]."))
+ visible_message(SPAN_NOTICE("A weak yellow light turns on underneath [src]."))
if(VENDING_WIRE_SHOCK)
seconds_electrified = 0
if (VENDING_WIRE_SHOOT_INV)
shoot_inventory = FALSE
- visible_message(SPAN_NOTICE("The [src] stops whirring."))
+ visible_message(SPAN_NOTICE("[src] stops whirring."))
/obj/structure/machinery/vending/proc/pulse(wire)
switch(wire)
if(VENDING_WIRE_EXTEND)
extended_inventory = !extended_inventory
- visible_message(SPAN_NOTICE("A weak yellow light turns [extended_inventory ? "on" : "off"] underneath the [src]."))
+ visible_message(SPAN_NOTICE("A weak yellow light turns [extended_inventory ? "on" : "off"] underneath [src]."))
if (VENDING_WIRE_SHOCK)
seconds_electrified = 30
- visible_message(SPAN_DANGER("Electric arcs shoot off from the [src]!"))
+ visible_message(SPAN_DANGER("Electric arcs shoot off from [src]!"))
if (VENDING_WIRE_SHOOT_INV)
shoot_inventory = !shoot_inventory
if(shoot_inventory)
- visible_message(SPAN_WARNING("The [src] begins whirring noisily."))
+ visible_message(SPAN_WARNING("[src] begins whirring noisily."))
else
- visible_message(SPAN_NOTICE("The [src] stops whirring."))
+ visible_message(SPAN_NOTICE("[src] stops whirring."))
diff --git a/code/game/machinery/vending/vending_types.dm b/code/game/machinery/vending/vending_types.dm
index a57bbfe7d29f..36b0b6e44df6 100644
--- a/code/game/machinery/vending/vending_types.dm
+++ b/code/game/machinery/vending/vending_types.dm
@@ -447,3 +447,69 @@
/obj/item/tool/pen/fountain = 30,
)
product_type = VENDOR_PRODUCT_TYPE_RECREATIONAL
+
+//vendor of ingredients for kitchen
+/obj/structure/machinery/vending/ingredients
+ name = "\improper Galley Auxiliary Storage Requisition System"
+ desc = "A vending machine meant to be use for cooks."
+ product_ads = "If your out of ingredients i am here for you;all my organic produce are fresh;don't let my potatoes go stale time for you to cook some fries"
+ icon_state = "snack"
+ hacking_safety = TRUE
+ products = list(
+ /obj/item/storage/fancy/egg_box = 12,
+ /obj/item/storage/box/fish = 12,
+ /obj/item/storage/box/meat = 12,
+ /obj/item/storage/box/milk = 12,
+ /obj/item/storage/box/soymilk = 12,
+ /obj/item/storage/box/enzyme = 12,
+ /obj/item/storage/box/flour = 12,
+ /obj/item/storage/box/sugar = 12,
+ /obj/item/storage/box/saltshaker = 12,
+ /obj/item/storage/box/peppermill = 12,
+ /obj/item/storage/box/mint = 12,
+ /obj/item/storage/box/apple = 12,
+ /obj/item/storage/box/banana = 12,
+ /obj/item/storage/box/chanterelle = 12,
+ /obj/item/storage/box/cherries = 12,
+ /obj/item/storage/box/chili = 12,
+ /obj/item/storage/box/cabbage = 12,
+ /obj/item/storage/box/carrot = 12,
+ /obj/item/storage/box/corn = 12,
+ /obj/item/storage/box/eggplant = 12,
+ /obj/item/storage/box/lemon = 12,
+ /obj/item/storage/box/lime = 12,
+ /obj/item/storage/box/orange = 12,
+ /obj/item/storage/box/potato = 12,
+ /obj/item/storage/box/tomato = 12,
+ /obj/item/storage/box/whitebeet = 12,
+ )
+
+ prices = list(
+ /obj/item/storage/fancy/egg_box = 1,
+ /obj/item/storage/box/fish = 1,
+ /obj/item/storage/box/meat = 1,
+ /obj/item/storage/box/milk =1,
+ /obj/item/storage/box/soymilk = 1,
+ /obj/item/storage/box/enzyme = 1,
+ /obj/item/storage/box/flour = 1,
+ /obj/item/storage/box/sugar = 1,
+ /obj/item/storage/box/saltshaker = 1,
+ /obj/item/storage/box/peppermill = 1,
+ /obj/item/storage/box/mint = 1,
+ /obj/item/storage/box/apple = 1,
+ /obj/item/storage/box/banana = 2,
+ /obj/item/storage/box/chanterelle = 2,
+ /obj/item/storage/box/cherries = 2,
+ /obj/item/storage/box/chili = 2,
+ /obj/item/storage/box/cabbage = 2,
+ /obj/item/storage/box/carrot = 2,
+ /obj/item/storage/box/corn = 2,
+ /obj/item/storage/box/eggplant = 2,
+ /obj/item/storage/box/lemon = 2,
+ /obj/item/storage/box/lime = 2,
+ /obj/item/storage/box/orange = 2,
+ /obj/item/storage/box/potato = 2,
+ /obj/item/storage/box/tomato = 2,
+ /obj/item/storage/box/whitebeet = 2,
+ )
+ product_type = VENDOR_PRODUCT_TYPE_FOOD
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 56eeb2b8a6d8..d5b12a264665 100644
--- a/code/game/machinery/vending/vendor_types/crew/senior_officers.dm
+++ b/code/game/machinery/vending/vendor_types/crew/senior_officers.dm
@@ -336,10 +336,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_auxiliary_officer, list(
list("Insulated Gloves", 0, /obj/item/clothing/gloves/yellow, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY),
list("Officer Uniform", 0, /obj/item/clothing/under/marine/officer/bridge, 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("Patrol Cap", 0, /obj/item/clothing/head/cmcap, MARINE_CAN_BUY_MASK, VENDOR_ITEM_MANDATORY),
list("Auxiliary Support Officer Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/service/aso, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY),
+ list("BAG (CHOOSE 1)", 0, null, null, null),
+ list("USCM Technician Chestrig", 0, /obj/item/storage/backpack/marine/satchel/tech, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY),
+ list("Leather Satchel", 0, /obj/item/storage/backpack/satchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR),
+
list("PERSONAL SIDEARM (CHOOSE 1)", 0, null, null, null),
list("M4A3 Service Pistol", 0, /obj/item/storage/belt/gun/m4a3/full, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED),
list("Mod 88 Pistol", 0, /obj/item/storage/belt/gun/m4a3/mod88, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED),
@@ -351,16 +354,19 @@ GLOBAL_LIST_INIT(cm_vending_clothing_auxiliary_officer, list(
list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY),
list("POUCHES (CHOOSE 2)", 0, null, null, null),
+ list("Document Pouch", 0, /obj/item/storage/pouch/document, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_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("Large General Pouch", 0, /obj/item/storage/pouch/general/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("Tools Pouch (Empty)", 0, /obj/item/storage/pouch/tools, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("Construction Pouch", 0, /obj/item/storage/pouch/construction, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
+ list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR),
list("ACCESSORIES (CHOOSE 1)", 0, null, null, null),
list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED),
+ 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),
))
diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm
index b489dbab16a4..ecef3ed622d9 100644
--- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm
+++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm
@@ -335,13 +335,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list(
req_access = list(ACCESS_MARINE_SYNTH)
vendor_role = list(JOB_SYNTH)
-/obj/structure/machinery/cm_vending/own_points/experimental_tools/attackby(obj/item/W, mob/user)
- if(istype(W, /obj/item/coin/marine/synth))
- if(user.drop_inv_item_to_loc(W, src))
+/obj/structure/machinery/cm_vending/own_points/experimental_tools/redeem_token(obj/item/coin/marine/token, mob/user)
+ if(token.token_type == VEND_TOKEN_SYNTH)
+ if(user.drop_inv_item_to_loc(token, src))
available_points = 30
available_points_to_display = available_points
- to_chat(user, SPAN_NOTICE("You insert \the [W] into \the [src]."))
- return
+ to_chat(user, SPAN_NOTICE("You insert \the [token] into \the [src]."))
+ return TRUE
return ..()
/obj/structure/machinery/cm_vending/own_points/experimental_tools/get_listed_products(mob/user)
diff --git a/code/game/machinery/vending/vendor_types/intelligence_officer.dm b/code/game/machinery/vending/vendor_types/intelligence_officer.dm
index ad10037ccfe1..93d31fe13253 100644
--- a/code/game/machinery/vending/vendor_types/intelligence_officer.dm
+++ b/code/game/machinery/vending/vendor_types/intelligence_officer.dm
@@ -4,26 +4,11 @@ GLOBAL_LIST_INIT(cm_vending_gear_intelligence_officer, list(
list("INTELLIGENCE SET (MANDATORY)", 0, null, null, null),
list("Essential Intelligence Set", 0, /obj/effect/essentials_set/intelligence_officer, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY),
- list("SUPPLIES", 0, null, null, null),
+ list("ENGINEERING SUPPLIES", 0, null, null, null),
list("Power Control Module", 5, /obj/item/circuitboard/apc, null, VENDOR_ITEM_REGULAR),
- list("Binoculars", 5, /obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR),
- list("Night Vision Optic", 25, /obj/item/device/helmet_visor/night_vision, null, VENDOR_ITEM_RECOMMENDED),
- list("Data Detector", 5, /obj/item/device/motiondetector/intel, null, VENDOR_ITEM_REGULAR),
- list("Intel Radio Encryption Key", 5, /obj/item/device/encryptionkey/intel, null, VENDOR_ITEM_REGULAR),
- list("Fire Extinguisher (Portable)", 5, /obj/item/tool/extinguisher/mini, null, VENDOR_ITEM_REGULAR),
- list("Fulton Recovery Device", 10, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR),
- list("Motion Detector", 15, /obj/item/device/motiondetector, null, VENDOR_ITEM_RECOMMENDED),
list("Plastic Explosive", 10, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
- list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_REGULAR),
- list("Medical Helmet Optic", 5, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR),
list("Welding Goggles", 5, /obj/item/clothing/glasses/welding, null, VENDOR_ITEM_REGULAR),
- list("POUCHES", 0, null, null, null),
- list("Large Magazine Pouch", 10, /obj/item/storage/pouch/magazine/large, null, VENDOR_ITEM_REGULAR),
- list("Large Shotgun Shell Pouch", 10, /obj/item/storage/pouch/shotgun/large, null, VENDOR_ITEM_REGULAR),
- list("Autoinjector Pouch (Full)", 15, /obj/item/storage/pouch/autoinjector/full, null, VENDOR_ITEM_RECOMMENDED),
- list("Machete Pouch (Full)", 10, /obj/item/storage/pouch/machete/full, null, VENDOR_ITEM_REGULAR),
-
list("PRIMARY AMMUNITION", 0, null, null, null),
list("M4RA AP Magazine (10x24mm)", 10, /obj/item/ammo_magazine/rifle/m4ra/ap, null, VENDOR_ITEM_REGULAR),
list("M39 AP Magazine (10x20mm)", 10, /obj/item/ammo_magazine/smg/m39/ap , null, VENDOR_ITEM_REGULAR),
@@ -35,7 +20,30 @@ GLOBAL_LIST_INIT(cm_vending_gear_intelligence_officer, list(
list("M44 Heavy Speed Loader (.44)", 10, /obj/item/ammo_magazine/revolver/heavy, null, VENDOR_ITEM_REGULAR),
list("M4A3 HP Magazine", 5, /obj/item/ammo_magazine/pistol/hp, null, VENDOR_ITEM_REGULAR),
list("M4A3 AP Magazine", 5, /obj/item/ammo_magazine/pistol/ap, null, VENDOR_ITEM_REGULAR),
- list("VP78 Magazine", 5, /obj/item/ammo_magazine/pistol/vp78, null, VENDOR_ITEM_REGULAR)
+ list("VP78 Magazine", 5, /obj/item/ammo_magazine/pistol/vp78, null, VENDOR_ITEM_REGULAR),
+
+ list("POUCHES", 0, null, null, null),
+ list("Large Magazine Pouch", 10, /obj/item/storage/pouch/magazine/large, null, VENDOR_ITEM_REGULAR),
+ list("Large Shotgun Shell Pouch", 10, /obj/item/storage/pouch/shotgun/large, null, VENDOR_ITEM_REGULAR),
+ list("Autoinjector Pouch (Full)", 15, /obj/item/storage/pouch/autoinjector/full, null, VENDOR_ITEM_RECOMMENDED),
+ list("Machete Pouch (Full)", 10, /obj/item/storage/pouch/machete/full, null, VENDOR_ITEM_REGULAR),
+
+ list("UTILITIES", 0, null, null, null),
+ list("Fire Extinguisher (Portable)", 5, /obj/item/tool/extinguisher/mini, null, VENDOR_ITEM_REGULAR),
+ list("Fulton Device Stack", 10, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR),
+ list("Motion Detector", 15, /obj/item/device/motiondetector, null, VENDOR_ITEM_RECOMMENDED),
+ list("Data Detector", 5, /obj/item/device/motiondetector/intel, null, VENDOR_ITEM_REGULAR),
+
+ list("BINOCULARS", 0, null, null, null),
+ list("Binoculars", 5, /obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR),
+
+ list("HELMET OPTICS", 0, null, null, null),
+ list("Medical Helmet Optic", 5, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR),
+ list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_REGULAR),
+ list("Night Vision Optic", 25, /obj/item/device/helmet_visor/night_vision, null, VENDOR_ITEM_RECOMMENDED),
+
+ list("RADIO KEYS", 0, null, null, null),
+ list("Intel Radio Encryption Key", 5, /obj/item/device/encryptionkey/intel, null, VENDOR_ITEM_REGULAR),
))
/obj/structure/machinery/cm_vending/gear/intelligence_officer
diff --git a/code/game/machinery/vending/vendor_types/requisitions.dm b/code/game/machinery/vending/vendor_types/requisitions.dm
index 93680fb93d2c..b5ed2c19fb78 100644
--- a/code/game/machinery/vending/vendor_types/requisitions.dm
+++ b/code/game/machinery/vending/vendor_types/requisitions.dm
@@ -8,7 +8,7 @@
icon_state = "req_guns"
req_access = list(ACCESS_MARINE_CARGO)
vendor_theme = VENDOR_THEME_USCM
- vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_TO_HAND | VEND_LOAD_AMMO_BOXES
+ vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_TO_HAND | VEND_LOAD_AMMO_BOXES | VEND_STOCK_DYNAMIC
/obj/structure/machinery/cm_vending/sorted/cargo_guns/vend_fail()
return
@@ -35,7 +35,7 @@
list("SU-6 Smart Pistol", round(scale * 3), /obj/item/storage/box/guncase/smartpistol, VENDOR_ITEM_REGULAR),
list("MOU-53 Shotgun", round(scale * 2), /obj/item/storage/box/guncase/mou53, VENDOR_ITEM_REGULAR),
list("XM88 Heavy Rifle", round(scale * 3), /obj/item/storage/box/guncase/xm88, VENDOR_ITEM_REGULAR),
- list("M41AE2 Heavy Pulse Rifle", round(scale * 2.5), /obj/item/storage/box/guncase/lmg, VENDOR_ITEM_REGULAR),
+ list("M41AE2 Heavy Pulse Rifle", 2.5, /obj/item/storage/box/guncase/lmg, VENDOR_ITEM_REGULAR),
list("M41A Pulse Rifle MK1", round(scale * 3), /obj/item/storage/box/guncase/m41aMK1, VENDOR_ITEM_REGULAR),
list("M56D Heavy Machine Gun", round(scale * 2), /obj/item/storage/box/guncase/m56d, VENDOR_ITEM_REGULAR),
list("M2C Heavy Machine Gun", round(scale * 2), /obj/item/storage/box/guncase/m2c, VENDOR_ITEM_REGULAR),
@@ -103,7 +103,7 @@
list("Flare Pouch (Full)", round(scale * 5), /obj/item/storage/pouch/flare/full, VENDOR_ITEM_REGULAR),
list("Document Pouch", round(scale * 2), /obj/item/storage/pouch/document/small, VENDOR_ITEM_REGULAR),
list("Sling Pouch", round(scale * 2), /obj/item/storage/pouch/sling, VENDOR_ITEM_REGULAR),
- list("Machete Pouch (Full)", round(scale * 0.5), /obj/item/storage/pouch/machete/full, VENDOR_ITEM_REGULAR),
+ list("Machete Pouch (Full)", 1, /obj/item/storage/pouch/machete/full, VENDOR_ITEM_REGULAR),
list("Bayonet Pouch", round(scale * 2), /obj/item/storage/pouch/bayonet, VENDOR_ITEM_REGULAR),
list("Medium General Pouch", round(scale * 2), /obj/item/storage/pouch/general/medium, VENDOR_ITEM_REGULAR),
list("Magazine Pouch", round(scale * 5), /obj/item/storage/pouch/magazine, VENDOR_ITEM_REGULAR),
@@ -135,7 +135,7 @@
list("Sentry Gun Network Laptop", 4, /obj/item/device/sentry_computer, VENDOR_ITEM_REGULAR),
list("JTAC Pamphlet", round(scale * 1), /obj/item/pamphlet/skill/jtac, VENDOR_ITEM_REGULAR),
list("Engineering Pamphlet", round(scale * 1), /obj/item/pamphlet/skill/engineer, VENDOR_ITEM_REGULAR),
- list("Powerloader Certification", round(scale * 0.1) + 1, /obj/item/pamphlet/skill/powerloader, VENDOR_ITEM_REGULAR),
+ list("Powerloader Certification", 0.75, /obj/item/pamphlet/skill/powerloader, VENDOR_ITEM_REGULAR),
list("Spare PDT/L Battle Buddy Kit", round(scale * 4), /obj/item/storage/box/pdt_kit, VENDOR_ITEM_REGULAR),
list("W-Y brand rechargeable mini-battery", round(scale * 3), /obj/item/cell/crap, VENDOR_ITEM_REGULAR)
)
@@ -174,7 +174,7 @@
//Special cargo-specific vendor with vending offsets
/obj/structure/machinery/cm_vending/sorted/cargo_guns/cargo
- vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_LOAD_AMMO_BOXES //We want to vend to turf not hand, since we are in requisitions
+ vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_LOAD_AMMO_BOXES | VEND_STOCK_DYNAMIC //We want to vend to turf not hand, since we are in requisitions
vend_dir = WEST
vend_dir_whitelist = list(NORTH, SOUTH)
@@ -194,7 +194,7 @@
icon_state = "req_ammo"
req_access = list(ACCESS_MARINE_CARGO)
vendor_theme = VENDOR_THEME_USCM
- vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_TO_HAND | VEND_LOAD_AMMO_BOXES
+ vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_TO_HAND | VEND_LOAD_AMMO_BOXES | VEND_STOCK_DYNAMIC
vend_dir = WEST
vend_dir_whitelist = list(SOUTHWEST, NORTHWEST)
@@ -218,29 +218,29 @@
list("ARMOR-PIERCING AMMUNITION", -1, null, null),
list("88 Mod 4 AP Magazine (9mm)", round(scale * 50), /obj/item/ammo_magazine/pistol/mod88, VENDOR_ITEM_REGULAR),
- list("M4RA AP Magazine (10x24mm)", round(scale * 15.7), /obj/item/ammo_magazine/rifle/m4ra/ap, VENDOR_ITEM_REGULAR),
- list("M39 AP Magazine (10x20mm)", round(scale * 11.9), /obj/item/ammo_magazine/smg/m39/ap, VENDOR_ITEM_REGULAR),
- list("M41A MK2 AP Magazine (10x24mm)", round(scale * 10.5), /obj/item/ammo_magazine/rifle/ap, VENDOR_ITEM_REGULAR),
+ list("M4RA AP Magazine (10x24mm)", round(scale * 16), /obj/item/ammo_magazine/rifle/m4ra/ap, VENDOR_ITEM_REGULAR),
+ list("M39 AP Magazine (10x20mm)", round(scale * 12), /obj/item/ammo_magazine/smg/m39/ap, VENDOR_ITEM_REGULAR),
+ list("M41A MK2 AP Magazine (10x24mm)", round(scale * 10), /obj/item/ammo_magazine/rifle/ap, VENDOR_ITEM_REGULAR),
list("M4A3 AP Magazine (9mm)", round(scale * 2), /obj/item/ammo_magazine/pistol/ap, VENDOR_ITEM_REGULAR),
list("EXTENDED AMMUNITION", -1, null, null),
- list("M39 Extended Magazine (10x20mm)", round(scale * 9.5) + 3, /obj/item/ammo_magazine/smg/m39/extended, VENDOR_ITEM_REGULAR),
- list("M41A MK2 Extended Magazine (10x24mm)", round(scale * 8.1), /obj/item/ammo_magazine/rifle/extended, VENDOR_ITEM_REGULAR),
+ list("M39 Extended Magazine (10x20mm)", round(scale * 10), /obj/item/ammo_magazine/smg/m39/extended, VENDOR_ITEM_REGULAR),
+ list("M41A MK2 Extended Magazine (10x24mm)", round(scale * 8), /obj/item/ammo_magazine/rifle/extended, VENDOR_ITEM_REGULAR),
list("SPECIAL AMMUNITION", -1, null, null),
list("M56 Battery", 4, /obj/item/smartgun_battery, VENDOR_ITEM_REGULAR),
list("M56 Smartgun Drum", 4, /obj/item/ammo_magazine/smartgun, VENDOR_ITEM_REGULAR),
- list("M44 Heavy Speed Loader (.44)", round(scale * 10.5), /obj/item/ammo_magazine/revolver/heavy, VENDOR_ITEM_REGULAR),
- list("M44 Marksman Speed Loader (.44)", round(scale * 5.7), /obj/item/ammo_magazine/revolver/marksman, VENDOR_ITEM_REGULAR),
+ list("M44 Heavy Speed Loader (.44)", 10, /obj/item/ammo_magazine/revolver/heavy, VENDOR_ITEM_REGULAR),
+ list("M44 Marksman Speed Loader (.44)", 6, /obj/item/ammo_magazine/revolver/marksman, VENDOR_ITEM_REGULAR),
list("M4A3 HP Magazine (9mm)", round(scale * 2), /obj/item/ammo_magazine/pistol/hp, VENDOR_ITEM_REGULAR),
list("M41AE2 Holo Target Rounds (10x24mm)", round(scale * 2), /obj/item/ammo_magazine/rifle/lmg/holo_target, VENDOR_ITEM_REGULAR),
list("RESTRICTED FIREARM AMMUNITION", -1, null, null),
- list("VP78 Magazine", round(scale * 11.2), /obj/item/ammo_magazine/pistol/vp78, VENDOR_ITEM_REGULAR),
- list("SU-6 Smartpistol Magazine (.45)", round(scale * 12,8), /obj/item/ammo_magazine/pistol/smart, VENDOR_ITEM_REGULAR),
+ list("VP78 Magazine", 11, /obj/item/ammo_magazine/pistol/vp78, VENDOR_ITEM_REGULAR),
+ list("SU-6 Smartpistol Magazine (.45)", 13, /obj/item/ammo_magazine/pistol/smart, VENDOR_ITEM_REGULAR),
list("M240 Incinerator Tank", round(scale * 3), /obj/item/ammo_magazine/flamer_tank, VENDOR_ITEM_REGULAR),
list("M41AE2 Box Magazine (10x24mm)", round(scale * 3), /obj/item/ammo_magazine/rifle/lmg, VENDOR_ITEM_REGULAR),
- list("M41A MK1 Magazine (10x24mm)", round(scale * 4.5), /obj/item/ammo_magazine/rifle/m41aMK1, VENDOR_ITEM_REGULAR),
+ list("M41A MK1 Magazine (10x24mm)", 4.5, /obj/item/ammo_magazine/rifle/m41aMK1, VENDOR_ITEM_REGULAR),
list("M41A MK1 AP Magazine (10x24mm)", round(scale * 2), /obj/item/ammo_magazine/rifle/m41aMK1/ap, VENDOR_ITEM_REGULAR),
list("M56D Drum Magazine", round(scale * 2), /obj/item/ammo_magazine/m56d, VENDOR_ITEM_REGULAR),
list("M2C Box Magazine", round(scale * 2), /obj/item/ammo_magazine/m2c, VENDOR_ITEM_REGULAR),
@@ -293,7 +293,7 @@
//Special cargo-specific vendor with vending offsets
/obj/structure/machinery/cm_vending/sorted/cargo_ammo/cargo
- vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_LOAD_AMMO_BOXES //We want to vend to turf not hand, since we are in requisitions
+ vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_LOAD_AMMO_BOXES | VEND_STOCK_DYNAMIC //We want to vend to turf not hand, since we are in requisitions
//------------ATTACHMENTS VENDOR---------------
@@ -305,7 +305,7 @@
icon_state = "req_attach"
vend_dir = WEST
vend_dir_whitelist = list(SOUTHEAST, NORTHEAST)
- vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY //We want to vend to turf not hand, since we are in requisitions
+ vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_STOCK_DYNAMIC //We want to vend to turf not hand, since we are in requisitions
/obj/structure/machinery/cm_vending/sorted/attachments/vend_fail()
return
@@ -316,42 +316,42 @@
/obj/structure/machinery/cm_vending/sorted/attachments/populate_product_list(scale)
listed_products = list(
list("BARREL", -1, null, null),
- list("Extended Barrel", round(scale * 6.5), /obj/item/attachable/extended_barrel, VENDOR_ITEM_REGULAR),
- list("M5 Bayonet", round(scale * 10.5), /obj/item/attachable/bayonet, VENDOR_ITEM_REGULAR),
- list("Recoil Compensator", round(scale * 6.5), /obj/item/attachable/compensator, VENDOR_ITEM_REGULAR),
- list("Suppressor", round(scale * 6.5), /obj/item/attachable/suppressor, VENDOR_ITEM_REGULAR),
+ list("Extended Barrel", 6.5, /obj/item/attachable/extended_barrel, VENDOR_ITEM_REGULAR),
+ list("M5 Bayonet", 10.5, /obj/item/attachable/bayonet, VENDOR_ITEM_REGULAR),
+ list("Recoil Compensator", 6.5, /obj/item/attachable/compensator, VENDOR_ITEM_REGULAR),
+ list("Suppressor", 6.5, /obj/item/attachable/suppressor, VENDOR_ITEM_REGULAR),
list("RAIL", -1, null, null),
- list("B8 Smart-Scope", round(scale * 3.5), /obj/item/attachable/scope/mini_iff, VENDOR_ITEM_REGULAR),
- list("Magnetic Harness", round(scale * 8.5), /obj/item/attachable/magnetic_harness, VENDOR_ITEM_REGULAR),
- list("Rail Flashlight", round(scale * 10.5), /obj/item/attachable/flashlight, VENDOR_ITEM_REGULAR),
- list("S4 2x Telescopic Mini-Scope", round(scale * 4.5), /obj/item/attachable/scope/mini, VENDOR_ITEM_REGULAR),
- list("S5 Red-Dot Sight", round(scale * 9.5), /obj/item/attachable/reddot, VENDOR_ITEM_REGULAR),
- list("S6 Reflex Sight", round(scale * 9.5), /obj/item/attachable/reflex, VENDOR_ITEM_REGULAR),
- list("S8 4x Telescopic Scope", round(scale * 4.5), /obj/item/attachable/scope, VENDOR_ITEM_REGULAR),
+ list("B8 Smart-Scope", 3.5, /obj/item/attachable/scope/mini_iff, VENDOR_ITEM_REGULAR),
+ list("Magnetic Harness", 8.5, /obj/item/attachable/magnetic_harness, VENDOR_ITEM_REGULAR),
+ list("Rail Flashlight", 10.5, /obj/item/attachable/flashlight, VENDOR_ITEM_REGULAR),
+ list("S4 2x Telescopic Mini-Scope", 4.5, /obj/item/attachable/scope/mini, VENDOR_ITEM_REGULAR),
+ list("S5 Red-Dot Sight", 9.5, /obj/item/attachable/reddot, VENDOR_ITEM_REGULAR),
+ list("S6 Reflex Sight", 9.5, /obj/item/attachable/reflex, VENDOR_ITEM_REGULAR),
+ list("S8 4x Telescopic Scope", 4.5, /obj/item/attachable/scope, VENDOR_ITEM_REGULAR),
list("UNDERBARREL", -1, null, null),
- list("Angled Grip", round(scale * 6.5), /obj/item/attachable/angledgrip, VENDOR_ITEM_REGULAR),
- list("Bipod", round(scale * 6.5), /obj/item/attachable/bipod, VENDOR_ITEM_REGULAR),
- list("Burst Fire Assembly", round(scale * 4.5), /obj/item/attachable/burstfire_assembly, VENDOR_ITEM_REGULAR),
- list("Gyroscopic Stabilizer", round(scale * 4.5), /obj/item/attachable/gyro, VENDOR_ITEM_REGULAR),
- list("Laser Sight", round(scale * 9.5), /obj/item/attachable/lasersight, VENDOR_ITEM_REGULAR),
- list("Mini Flamethrower", round(scale * 4.5), /obj/item/attachable/attached_gun/flamer, VENDOR_ITEM_REGULAR),
- list("XM-VESG-1 Flamer Nozzle", round(scale * 4.5), /obj/item/attachable/attached_gun/flamer_nozzle, VENDOR_ITEM_REGULAR),
- list("U7 Underbarrel Shotgun", round(scale * 4.5), /obj/item/attachable/attached_gun/shotgun, VENDOR_ITEM_REGULAR),
- list("Underbarrel Extinguisher", round(scale * 4.5), /obj/item/attachable/attached_gun/extinguisher, VENDOR_ITEM_REGULAR),
- list("Underbarrel Flashlight Grip", round(scale * 9.5), /obj/item/attachable/flashlight/grip, VENDOR_ITEM_REGULAR),
- list("Underslung Grenade Launcher", round(scale * 9.5), /obj/item/attachable/attached_gun/grenade, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", round(scale * 9.5), /obj/item/attachable/verticalgrip, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 6.5, /obj/item/attachable/angledgrip, VENDOR_ITEM_REGULAR),
+ list("Bipod", 6.5, /obj/item/attachable/bipod, VENDOR_ITEM_REGULAR),
+ list("Burst Fire Assembly", 4.5, /obj/item/attachable/burstfire_assembly, VENDOR_ITEM_REGULAR),
+ list("Gyroscopic Stabilizer", 4.5, /obj/item/attachable/gyro, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 9.5, /obj/item/attachable/lasersight, VENDOR_ITEM_REGULAR),
+ list("Mini Flamethrower", 4.5, /obj/item/attachable/attached_gun/flamer, VENDOR_ITEM_REGULAR),
+ list("XM-VESG-1 Flamer Nozzle", 4.5, /obj/item/attachable/attached_gun/flamer_nozzle, VENDOR_ITEM_REGULAR),
+ list("U7 Underbarrel Shotgun", 4.5, /obj/item/attachable/attached_gun/shotgun, VENDOR_ITEM_REGULAR),
+ list("Underbarrel Extinguisher", 4.5, /obj/item/attachable/attached_gun/extinguisher, VENDOR_ITEM_REGULAR),
+ list("Underbarrel Flashlight Grip", 9.5, /obj/item/attachable/flashlight/grip, VENDOR_ITEM_REGULAR),
+ list("Underslung Grenade Launcher", 9.5, /obj/item/attachable/attached_gun/grenade, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 9.5, /obj/item/attachable/verticalgrip, VENDOR_ITEM_REGULAR),
list("STOCK", -1, null, null),
- list("M37 Wooden Stock", round(scale * 4.5), /obj/item/attachable/stock/shotgun, VENDOR_ITEM_REGULAR),
- list("M39 Arm Brace", round(scale * 4.5), /obj/item/attachable/stock/smg/collapsible/brace, VENDOR_ITEM_REGULAR),
- list("M39 Folding Stock", round(scale * 4.5), /obj/item/attachable/stock/smg/collapsible, VENDOR_ITEM_REGULAR),
- list("M39 Stock", round(scale * 4.5), /obj/item/attachable/stock/smg, VENDOR_ITEM_REGULAR),
- list("M41A Solid Stock", round(scale * 4.5), /obj/item/attachable/stock/rifle, VENDOR_ITEM_REGULAR),
- list("M41A Folding Stock", round(scale * 4.5), /obj/item/attachable/stock/rifle/collapsible, VENDOR_ITEM_REGULAR),
- list("M44 Magnum Sharpshooter Stock", round(scale * 4.5), /obj/item/attachable/stock/revolver, VENDOR_ITEM_REGULAR)
+ list("M37 Wooden Stock", 4.5, /obj/item/attachable/stock/shotgun, VENDOR_ITEM_REGULAR),
+ list("M39 Arm Brace", 4.5, /obj/item/attachable/stock/smg/collapsible/brace, VENDOR_ITEM_REGULAR),
+ list("M39 Folding Stock", 4.5, /obj/item/attachable/stock/smg/collapsible, VENDOR_ITEM_REGULAR),
+ list("M39 Stock", 4.5, /obj/item/attachable/stock/smg, VENDOR_ITEM_REGULAR),
+ list("M41A Solid Stock", 4.5, /obj/item/attachable/stock/rifle, VENDOR_ITEM_REGULAR),
+ list("M41A Folding Stock", 4.5, /obj/item/attachable/stock/rifle/collapsible, VENDOR_ITEM_REGULAR),
+ list("M44 Magnum Sharpshooter Stock", 4.5, /obj/item/attachable/stock/revolver, VENDOR_ITEM_REGULAR)
)
/obj/structure/machinery/cm_vending/sorted/attachments/blend
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm
index 52418fb8940c..299ef36ea7d2 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm
@@ -63,6 +63,7 @@
req_one_access = list()
listed_products = list()
hackable = TRUE
+ vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_TO_HAND | VEND_STOCK_DYNAMIC
/obj/structure/machinery/cm_vending/sorted/uniform_supply/squad_prep/ui_state(mob/user)
return GLOB.not_incapacitated_and_adjacent_strict_state
@@ -71,18 +72,20 @@
listed_products = list(
list("STANDARD EQUIPMENT", -1, null, null, null),
list("Marine Combat Boots", round(scale * 15), /obj/item/clothing/shoes/marine, VENDOR_ITEM_REGULAR),
+ list("Marine Brown Combat Boots", round(scale * 15), /obj/item/clothing/shoes/marine/brown, VENDOR_ITEM_REGULAR),
list("USCM Uniform", round(scale * 15), /obj/item/clothing/under/marine, VENDOR_ITEM_REGULAR),
list("Marine Combat Gloves", round(scale * 15), /obj/item/clothing/gloves/marine, VENDOR_ITEM_REGULAR),
+ list("Marine Brown Combat Gloves", round(scale * 15), /obj/item/clothing/gloves/marine/brown, VENDOR_ITEM_REGULAR),
list("Marine Black Combat Gloves", round(scale * 15), /obj/item/clothing/gloves/marine/black, VENDOR_ITEM_REGULAR),
list("Marine Radio Headset", round(scale * 15), /obj/item/device/radio/headset/almayer, VENDOR_ITEM_REGULAR),
list("M10 Pattern Marine Helmet", round(scale * 15), /obj/item/clothing/head/helmet/marine, VENDOR_ITEM_REGULAR),
list("WEBBINGS", -1, null, null),
- list("Brown Webbing Vest", round(scale * 1.25), /obj/item/clothing/accessory/storage/black_vest/brown_vest, VENDOR_ITEM_REGULAR),
- list("Black Webbing Vest", round(max(1,(scale * 0.5))), /obj/item/clothing/accessory/storage/black_vest, VENDOR_ITEM_REGULAR),
+ list("Brown Webbing Vest", 1, /obj/item/clothing/accessory/storage/black_vest/brown_vest, VENDOR_ITEM_REGULAR),
+ list("Black Webbing Vest", 1, /obj/item/clothing/accessory/storage/black_vest, VENDOR_ITEM_REGULAR),
list("Webbing", round(scale * 2), /obj/item/clothing/accessory/storage/webbing, VENDOR_ITEM_REGULAR),
- list("Drop Pouch", round(max(1,(scale * 0.5))), /obj/item/clothing/accessory/storage/droppouch, VENDOR_ITEM_REGULAR),
- list("Shoulder Holster", round(max(1,(scale * 0.5))), /obj/item/clothing/accessory/storage/holster, VENDOR_ITEM_REGULAR),
+ list("Drop Pouch", 0.75, /obj/item/clothing/accessory/storage/droppouch, VENDOR_ITEM_REGULAR),
+ list("Shoulder Holster", 0.75, /obj/item/clothing/accessory/storage/holster, VENDOR_ITEM_REGULAR),
list("ARMOR", -1, null, null),
list("M3 Pattern Carrier Marine Armor", round(scale * 15), /obj/item/clothing/suit/storage/marine/carrier, VENDOR_ITEM_REGULAR),
@@ -105,9 +108,9 @@
list("Shotgun Scabbard", round(scale * 5), /obj/item/storage/large_holster/m37, VENDOR_ITEM_REGULAR),
list("RESTRICTED BACKPACKS", -1, null, null),
- list("USCM Technician Welderpack", round(scale * 1.25), /obj/item/storage/backpack/marine/engineerpack, VENDOR_ITEM_REGULAR),
+ list("USCM Technician Welderpack", 1.25, /obj/item/storage/backpack/marine/engineerpack, VENDOR_ITEM_REGULAR),
list("Technician Welder-Satchel", round(scale * 2), /obj/item/storage/backpack/marine/engineerpack/satchel, VENDOR_ITEM_REGULAR),
- list("Radio Telephone Backpack", round(max(1,(scale * 0.5))), /obj/item/storage/backpack/marine/satchel/rto, VENDOR_ITEM_REGULAR),
+ list("Radio Telephone Backpack", 0.75, /obj/item/storage/backpack/marine/satchel/rto, VENDOR_ITEM_REGULAR),
list("BELTS", -1, null, null),
list("M276 Pattern Ammo Load Rig", round(scale * 15), /obj/item/storage/belt/marine, VENDOR_ITEM_REGULAR),
@@ -134,12 +137,12 @@
list("Pistol Pouch", round(scale * 15), /obj/item/storage/pouch/pistol, VENDOR_ITEM_REGULAR),
list("RESTRICTED POUCHES", -1, null, null, null),
- list("Construction Pouch", round(scale * 1.25), /obj/item/storage/pouch/construction, VENDOR_ITEM_REGULAR),
- list("Explosive Pouch", round(scale * 1.25), /obj/item/storage/pouch/explosive, VENDOR_ITEM_REGULAR),
- list("First Responder Pouch (Empty)", round(scale * 2.5), /obj/item/storage/pouch/first_responder, VENDOR_ITEM_REGULAR),
+ list("Construction Pouch", 1.25, /obj/item/storage/pouch/construction, VENDOR_ITEM_REGULAR),
+ list("Explosive Pouch", 1.25, /obj/item/storage/pouch/explosive, VENDOR_ITEM_REGULAR),
+ list("First Responder Pouch (Empty)", 2.5, /obj/item/storage/pouch/first_responder, VENDOR_ITEM_REGULAR),
list("Large Pistol Magazine Pouch", round(scale * 2), /obj/item/storage/pouch/magazine/pistol/large, VENDOR_ITEM_REGULAR),
- list("Tools Pouch", round(scale * 1.25), /obj/item/storage/pouch/tools, VENDOR_ITEM_REGULAR),
- list("Sling Pouch", round(scale * 1.25), /obj/item/storage/pouch/sling, VENDOR_ITEM_REGULAR),
+ list("Tools Pouch", 1.25, /obj/item/storage/pouch/tools, VENDOR_ITEM_REGULAR),
+ list("Sling Pouch", 1.25, /obj/item/storage/pouch/sling, VENDOR_ITEM_REGULAR),
list("MASK", -1, null, null, null),
list("Gas Mask", round(scale * 15), /obj/item/clothing/mask/gas, VENDOR_ITEM_REGULAR),
@@ -213,7 +216,7 @@
req_access = list(ACCESS_MARINE_ALPHA)
req_one_access = list(ACCESS_MARINE_LEADER, ACCESS_MARINE_SPECPREP, ACCESS_MARINE_RO)
hackable = TRUE
- vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_TO_HAND
+ vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_TO_HAND | VEND_STOCK_DYNAMIC
vend_x_offset = 2
@@ -224,13 +227,13 @@
/obj/structure/machinery/cm_vending/sorted/cargo_ammo/squad/populate_product_list(scale)
listed_products = list(
list("ARMOR-PIERCING AMMUNITION", -1, null, null),
- list("M4RA AP Magazine (10x24mm)", round(scale * 3.5), /obj/item/ammo_magazine/rifle/m4ra/ap, VENDOR_ITEM_REGULAR),
+ list("M4RA AP Magazine (10x24mm)", 3.5, /obj/item/ammo_magazine/rifle/m4ra/ap, VENDOR_ITEM_REGULAR),
list("M39 AP Magazine (10x20mm)", round(scale * 3), /obj/item/ammo_magazine/smg/m39/ap, VENDOR_ITEM_REGULAR),
list("M41A AP Magazine (10x24mm)", round(scale * 3), /obj/item/ammo_magazine/rifle/ap, VENDOR_ITEM_REGULAR),
list("EXTENDED AMMUNITION", -1, null, null),
- list("M39 Extended Magazine (10x20mm)", round(scale * 1.8), /obj/item/ammo_magazine/smg/m39/extended, VENDOR_ITEM_REGULAR),
- list("M41A Extended Magazine (10x24mm)", round(scale * 1.9), /obj/item/ammo_magazine/rifle/extended, VENDOR_ITEM_REGULAR),
+ list("M39 Extended Magazine (10x20mm)", 1.8, /obj/item/ammo_magazine/smg/m39/extended, VENDOR_ITEM_REGULAR),
+ list("M41A Extended Magazine (10x24mm)", 1.9, /obj/item/ammo_magazine/rifle/extended, VENDOR_ITEM_REGULAR),
list("SPECIAL AMMUNITION", -1, null, null),
list("M56 Smartgun Drum", 1, /obj/item/ammo_magazine/smartgun, VENDOR_ITEM_REGULAR),
@@ -259,7 +262,7 @@
vend_x_offset = 2
vend_y_offset = 1
- vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_TO_HAND
+ vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_TO_HAND | VEND_STOCK_DYNAMIC
/obj/structure/machinery/cm_vending/sorted/cargo_guns/squad/ui_state(mob/user)
return GLOB.not_incapacitated_and_adjacent_strict_state
@@ -307,7 +310,7 @@
req_access = list(ACCESS_MARINE_ALPHA)
req_one_access = list(ACCESS_MARINE_LEADER, ACCESS_MARINE_SPECPREP, ACCESS_MARINE_RO)
hackable = TRUE
- vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_TO_HAND
+ vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_TO_HAND | VEND_STOCK_DYNAMIC
vend_y_offset = 1
@@ -317,36 +320,36 @@
/obj/structure/machinery/cm_vending/sorted/attachments/squad/populate_product_list(scale)
listed_products = list(
list("BARREL", -1, null, null),
- list("Extended Barrel", round(scale * 2.5), /obj/item/attachable/extended_barrel, VENDOR_ITEM_REGULAR),
- list("Recoil Compensator", round(scale * 2.5), /obj/item/attachable/compensator, VENDOR_ITEM_REGULAR),
- list("Suppressor", round(scale * 2.5), /obj/item/attachable/suppressor, VENDOR_ITEM_REGULAR),
+ list("Extended Barrel", 2.5, /obj/item/attachable/extended_barrel, VENDOR_ITEM_REGULAR),
+ list("Recoil Compensator", 2.5, /obj/item/attachable/compensator, VENDOR_ITEM_REGULAR),
+ list("Suppressor", 2.5, /obj/item/attachable/suppressor, VENDOR_ITEM_REGULAR),
list("RAIL", -1, null, null),
- list("B8 Smart-Scope", round(scale * 1.5), /obj/item/attachable/scope/mini_iff, VENDOR_ITEM_REGULAR),
- list("Magnetic Harness", round(scale * 4), /obj/item/attachable/magnetic_harness, VENDOR_ITEM_REGULAR),
- list("S4 2x Telescopic Mini-Scope", round(scale * 2), /obj/item/attachable/scope/mini, VENDOR_ITEM_REGULAR),
- list("S5 Red-Dot Sight", round(scale * 3), /obj/item/attachable/reddot, VENDOR_ITEM_REGULAR),
- list("S6 Reflex Sight", round(scale * 3), /obj/item/attachable/reflex, VENDOR_ITEM_REGULAR),
- list("S8 4x Telescopic Scope", round(scale * 2), /obj/item/attachable/scope, VENDOR_ITEM_REGULAR),
+ list("B8 Smart-Scope", 1.5, /obj/item/attachable/scope/mini_iff, VENDOR_ITEM_REGULAR),
+ list("Magnetic Harness", 4, /obj/item/attachable/magnetic_harness, VENDOR_ITEM_REGULAR),
+ list("S4 2x Telescopic Mini-Scope", 2, /obj/item/attachable/scope/mini, VENDOR_ITEM_REGULAR),
+ list("S5 Red-Dot Sight", 3, /obj/item/attachable/reddot, VENDOR_ITEM_REGULAR),
+ list("S6 Reflex Sight", 3, /obj/item/attachable/reflex, VENDOR_ITEM_REGULAR),
+ list("S8 4x Telescopic Scope", 2, /obj/item/attachable/scope, VENDOR_ITEM_REGULAR),
list("UNDERBARREL", -1, null, null),
- list("Angled Grip", round(scale * 2.5), /obj/item/attachable/angledgrip, VENDOR_ITEM_REGULAR),
- list("Bipod", round(scale * 2.5), /obj/item/attachable/bipod, VENDOR_ITEM_REGULAR),
- list("Burst Fire Assembly", round(scale * 1.5), /obj/item/attachable/burstfire_assembly, VENDOR_ITEM_REGULAR),
- list("Gyroscopic Stabilizer", round(scale * 1.5), /obj/item/attachable/gyro, VENDOR_ITEM_REGULAR),
- list("Laser Sight", round(scale * 3), /obj/item/attachable/lasersight, VENDOR_ITEM_REGULAR),
- list("Mini Flamethrower", round(scale * 1.5), /obj/item/attachable/attached_gun/flamer, VENDOR_ITEM_REGULAR),
- list("XM-VESG-1 Flamer Nozzle", round(scale * 1.5), /obj/item/attachable/attached_gun/flamer_nozzle, VENDOR_ITEM_REGULAR),
- list("U7 Underbarrel Shotgun", round(scale * 1.5), /obj/item/attachable/attached_gun/shotgun, VENDOR_ITEM_REGULAR),
- list("Underbarrel Extinguisher", round(scale * 1.5), /obj/item/attachable/attached_gun/extinguisher, VENDOR_ITEM_REGULAR),
- list("Vertical Grip", round(scale * 3), /obj/item/attachable/verticalgrip, VENDOR_ITEM_REGULAR),
+ list("Angled Grip", 2.5, /obj/item/attachable/angledgrip, VENDOR_ITEM_REGULAR),
+ list("Bipod", 2.5, /obj/item/attachable/bipod, VENDOR_ITEM_REGULAR),
+ list("Burst Fire Assembly", 1.5, /obj/item/attachable/burstfire_assembly, VENDOR_ITEM_REGULAR),
+ list("Gyroscopic Stabilizer", 1.5, /obj/item/attachable/gyro, VENDOR_ITEM_REGULAR),
+ list("Laser Sight", 3, /obj/item/attachable/lasersight, VENDOR_ITEM_REGULAR),
+ list("Mini Flamethrower", 1.5, /obj/item/attachable/attached_gun/flamer, VENDOR_ITEM_REGULAR),
+ list("XM-VESG-1 Flamer Nozzle", 1.5, /obj/item/attachable/attached_gun/flamer_nozzle, VENDOR_ITEM_REGULAR),
+ list("U7 Underbarrel Shotgun", 1.5, /obj/item/attachable/attached_gun/shotgun, VENDOR_ITEM_REGULAR),
+ list("Underbarrel Extinguisher", 1.5, /obj/item/attachable/attached_gun/extinguisher, VENDOR_ITEM_REGULAR),
+ list("Vertical Grip", 3, /obj/item/attachable/verticalgrip, VENDOR_ITEM_REGULAR),
list("STOCK", -1, null, null),
- list("M37 Wooden Stock", round(scale * 1.5), /obj/item/attachable/stock/shotgun, VENDOR_ITEM_REGULAR),
- list("M39 Arm Brace", round(scale * 1.5), /obj/item/attachable/stock/smg/collapsible/brace, VENDOR_ITEM_REGULAR),
- list("M39 Stock", round(scale * 1.5), /obj/item/attachable/stock/smg, VENDOR_ITEM_REGULAR),
- list("M41A Solid Stock", round(scale * 1.5), /obj/item/attachable/stock/rifle, VENDOR_ITEM_REGULAR),
- list("M44 Magnum Sharpshooter Stock", round(scale * 1.5), /obj/item/attachable/stock/revolver, VENDOR_ITEM_REGULAR)
+ list("M37 Wooden Stock", 1.5, /obj/item/attachable/stock/shotgun, VENDOR_ITEM_REGULAR),
+ list("M39 Arm Brace", 1.5, /obj/item/attachable/stock/smg/collapsible/brace, VENDOR_ITEM_REGULAR),
+ list("M39 Stock", 1.5, /obj/item/attachable/stock/smg, VENDOR_ITEM_REGULAR),
+ list("M41A Solid Stock", 1.5, /obj/item/attachable/stock/rifle, VENDOR_ITEM_REGULAR),
+ list("M44 Magnum Sharpshooter Stock", 1.5, /obj/item/attachable/stock/revolver, VENDOR_ITEM_REGULAR)
)
//------------ESSENTIAL SETS---------------
diff --git a/code/game/machinery/vending/vendor_types/wo_vendors.dm b/code/game/machinery/vending/vendor_types/wo_vendors.dm
index 557933754f07..46299ef19f4c 100644
--- a/code/game/machinery/vending/vendor_types/wo_vendors.dm
+++ b/code/game/machinery/vending/vendor_types/wo_vendors.dm
@@ -66,7 +66,7 @@
/obj/structure/machinery/cm_vending/sorted/cargo_guns/squad_prep/wo
req_access = list()
req_one_access = list()
- vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_TO_HAND | VEND_LOAD_AMMO_BOXES
+ vend_flags = VEND_CLUTTER_PROTECTION | VEND_LIMITED_INVENTORY | VEND_TO_HAND | VEND_LOAD_AMMO_BOXES | VEND_STOCK_DYNAMIC
/obj/structure/machinery/cm_vending/sorted/cargo_guns/squad_prep/wo/populate_product_list(scale)
listed_products = list(
diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index f9b5ddb42f68..69eababfe000 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -21,7 +21,7 @@
return
/obj/effect/spider/attackby(obj/item/W, mob/user)
- if(W.attack_verb.len)
+ if(LAZYLEN(W.attack_verb))
visible_message(SPAN_DANGER("\The [src] have been [pick(W.attack_verb)] with \the [W][(user ? "by [user]." : ".")]"))
else
visible_message(SPAN_DANGER("\The [src] have been attacked with \the [W][(user ? "by [user]." : ".")]"))
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index f6af3c0ca237..ac5136b07a4a 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -80,7 +80,7 @@
/// actual job
var/rank = null
/// Marine's paygrade
- var/paygrade = "ME1"
+ var/paygrade = PAY_SHORT_CIV
/// For medics and engineers to 'claim' a locker
var/claimedgear = 1
diff --git a/code/game/objects/items/circuitboards/computer.dm b/code/game/objects/items/circuitboards/computer.dm
index 40c66bc0fa6a..08dcfc6964a6 100644
--- a/code/game/objects/items/circuitboards/computer.dm
+++ b/code/game/objects/items/circuitboards/computer.dm
@@ -287,14 +287,12 @@
/obj/item/circuitboard/computer/rdconsole/attackby(obj/item/I as obj, mob/user as mob)
if(HAS_TRAIT(I, TRAIT_TOOL_SCREWDRIVER))
- user.visible_message(SPAN_NOTICE("\the [user] adjusts the jumper on the [src]'s access protocol pins."), SPAN_NOTICE("You adjust the jumper on the access protocol pins."))
+ user.visible_message(SPAN_NOTICE("[user] adjusts the jumper on [src]'s access protocol pins."), SPAN_NOTICE("You adjust the jumper on the access protocol pins."))
if(src.build_path == /obj/structure/machinery/computer/rdconsole/core)
src.name = "Circuit Board (RD Console - Robotics)"
src.build_path = /obj/structure/machinery/computer/rdconsole/robotics
- to_chat(user, SPAN_NOTICE(" Access protocols set to robotics."))
+ to_chat(user, SPAN_NOTICE("Access protocols set to robotics."))
else
src.name = "Circuit Board (RD Console)"
src.build_path = /obj/structure/machinery/computer/rdconsole/core
- to_chat(user, SPAN_NOTICE(" Access protocols set to default."))
-
-
+ to_chat(user, SPAN_NOTICE("Access protocols set to default."))
diff --git a/code/game/objects/items/circuitboards/machine.dm b/code/game/objects/items/circuitboards/machine.dm
index ad4c31cb11e9..248d0d5c8885 100644
--- a/code/game/objects/items/circuitboards/machine.dm
+++ b/code/game/objects/items/circuitboards/machine.dm
@@ -141,7 +141,7 @@ to destroy them and players will be able to make replacements.
if(HAS_TRAIT(I, TRAIT_TOOL_SCREWDRIVER))
machine_dir = turn(machine_dir, 90)
init_dirs = machine_dir
- user.visible_message(SPAN_NOTICE("\The [user] adjusts the jumper on the [src]'s port configuration pins."), SPAN_NOTICE("You adjust the jumper on the port configuration pins. Now set to [dir2text(machine_dir)]."))
+ user.visible_message(SPAN_NOTICE("[user] adjusts the jumper on [src]'s port configuration pins."), SPAN_NOTICE("You adjust the jumper on the port configuration pins. Now set to [dir2text(machine_dir)]."))
return
/obj/item/circuitboard/machine/unary_atmos/get_examine_text(mob/user)
@@ -300,5 +300,3 @@ to destroy them and players will be able to make replacements.
// Board itself is high tech. Coils have to be ordered from cargo or salvaged from existing SMESs.
frame_desc = "Requires 1 superconducting magnetic coil and 30 wires."
req_components = list(/obj/item/stock_parts/smes_coil = 1, /obj/item/stack/cable_coil = 30)
-
-
diff --git a/code/game/objects/items/devices/cloaking.dm b/code/game/objects/items/devices/cloaking.dm
index 05e7786744e2..b0c5ed799977 100644
--- a/code/game/objects/items/devices/cloaking.dm
+++ b/code/game/objects/items/devices/cloaking.dm
@@ -47,12 +47,12 @@
src.add_fingerprint(user)
if(chameleon_on)
user.alpha = 25
- to_chat(user, SPAN_NOTICE("You activate the [src]."))
+ to_chat(user, SPAN_NOTICE("You activate [src]."))
spark_system.start()
src.icon_state = "shield1"
else
user.alpha = initial(user.alpha)
- to_chat(user, SPAN_NOTICE("You deactivate the [src]."))
+ to_chat(user, SPAN_NOTICE("You deactivate [src]."))
src.icon_state = "shield0"
spark_system.start()
diff --git a/code/game/objects/items/devices/coins.dm b/code/game/objects/items/devices/coins.dm
index 139ea1cbac8c..6c00364642da 100644
--- a/code/game/objects/items/devices/coins.dm
+++ b/code/game/objects/items/devices/coins.dm
@@ -67,12 +67,6 @@
icon_state = "coin_platinum"
black_market_value = 35
-/obj/item/coin/marine/synth
- name = "synthetic experimental tool redemption token"
- desc = "Insert this into a synthetic experimental tools vendor in order to access a variety of experimental support tools."
- icon_state = "coin_synth"
- black_market_value = 0
-
/obj/item/coin/chitin
name = "chitin coin"
desc = "Durable alien chitin pressed into a coin. There are much better uses for chitin..."
@@ -121,3 +115,33 @@
comment = "heads"
user.visible_message(SPAN_NOTICE("[user] has thrown \the [src]. It lands on [comment]! "), \
SPAN_NOTICE("You throw \the [src]. It lands on [comment]! "))
+
+
+/obj/item/coin/marine
+ name = "marine equipment token"
+ desc = "I wonder what it does?"
+ icon_state = "coin_copper"
+ black_market_value = 0
+ /// What is the token for?
+ var/token_type = VEND_TOKEN_VOID
+
+/obj/item/coin/marine/attackby(obj/item/W as obj, mob/user as mob) //To remove attaching a string functionality
+ return
+
+/obj/item/coin/marine/engineer
+ name = "marine engineer support token"
+ desc = "Insert this into an engineer vendor in order to access a support weapon."
+ icon_state = "coin_gold"
+ token_type = VEND_TOKEN_ENGINEER
+
+/obj/item/coin/marine/specialist
+ name = "marine specialist weapon token"
+ desc = "Insert this into a USCM equipment vendor in order to access a single highly dangerous weapon."
+ icon_state = "coin_diamond"
+ token_type = VEND_TOKEN_SPEC
+
+/obj/item/coin/marine/synth
+ name = "synthetic experimental tool redemption token"
+ desc = "Insert this into a synthetic experimental tools vendor in order to access a variety of experimental support tools."
+ icon_state = "coin_synth"
+ token_type = VEND_TOKEN_SYNTH
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index 40ef8792aedb..3f285b358fb2 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -121,7 +121,7 @@
if(target.status != LIGHT_OK)
if(CanUse(U))
if(!Use(U)) return
- to_chat(U, SPAN_NOTICE("You replace the [target.fitting] with the [src]."))
+ to_chat(U, SPAN_NOTICE("You replace the [target.fitting] with [src]."))
if(target.status != LIGHT_EMPTY)
diff --git a/code/game/objects/items/devices/radio/listening_bugs.dm b/code/game/objects/items/devices/radio/listening_bugs.dm
new file mode 100644
index 000000000000..4a84df071c60
--- /dev/null
+++ b/code/game/objects/items/devices/radio/listening_bugs.dm
@@ -0,0 +1,276 @@
+#define DISGUISE_REMOVE "remove disguise"
+#define DISGUISE_RADIO "radio"
+#define DISGUISE_PEN "pen"
+#define DISGUISE_FOUNTAIN_PEN "fountain pen"
+#define DISGUISE_ACCESS_TUNER "access tuner"
+#define DISGUISE_WHISTLE "whistle"
+#define DISGUISE_MASS_SPEC "mass-spectrometer"
+#define DISGUISE_CAMERA "camera"
+#define DISGUISE_ZIPPO "zippo lighter"
+#define DISGUISE_TAPE_RECORDER "tape recorder"
+
+/obj/item/device/radio/listening_bug
+ name = "listening device"
+ desc = "A small, and disguisable, listening device."
+
+ icon = 'icons/obj/items/devices.dmi'
+ icon_state = "voice0"
+ item_state = "analyzer"
+
+ w_class = SIZE_TINY
+ volume = RADIO_VOLUME_RAISED
+
+ broadcasting = FALSE
+ listening = FALSE
+ frequency = BUG_A_FREQ
+ canhear_range = 2
+ freqlock = TRUE
+ /// If the bug is disguised or not.
+ var/ready_to_disguise = FALSE
+ var/disguised = FALSE
+ /// Whether or not the bug can be used to listen to its own channel.
+ var/prevent_snooping = FALSE
+ /// The ID tag of the device, for identification.
+ var/nametag = "Device"
+
+/obj/item/device/radio/listening_bug/ui_data(mob/user)
+ var/list/data = list()
+
+ data["broadcasting"] = broadcasting
+ data["listening"] = listening
+ data["frequency"] = frequency
+ data["freqlock"] = freqlock
+
+ var/list/radio_channels = list()
+
+ for(var/channel in channels)
+ var/channel_key = channel_to_prefix(channel)
+ radio_channels += list(list(
+ "name" = channel,
+ "status" = channels[channel] & FREQ_LISTENING,
+ "hotkey" = channel_key))
+
+ data["channels"] = radio_channels
+
+ data["command"] = volume
+ data["useCommand"] = use_volume
+ data["subspace"] = subspace_transmission
+ data["subspaceSwitchable"] = subspace_switchable
+ data["headset"] = FALSE
+
+ return data
+
+/obj/item/device/radio/listening_bug/ui_act(action, params, datum/tgui/ui, datum/ui_state/state)
+ switch(action)
+ if("listen")
+ if(prevent_snooping)
+ to_chat(usr, SPAN_WARNING("This device cannot receive transmissions!"))
+ return
+ listening = !listening
+ return
+ if("subspace")
+ if(!ishuman(usr))
+ return
+ var/mob/living/carbon/human/user = usr
+ if(!check_access(user.wear_id) && !check_access(user.get_active_hand()))
+ to_chat(user, SPAN_WARNING("You need an authenticated ID card to change this function!"))
+ return
+ if(subspace_switchable)
+ subspace_transmission = !subspace_transmission
+ var/initial_prevent = initial(prevent_snooping)
+ if(initial_prevent)
+ prevent_snooping = TRUE
+ if(!subspace_transmission)
+ prevent_snooping = FALSE
+ channels = list()
+ return
+ ..()
+
+/obj/item/device/radio/listening_bug/hear_talk(mob/M as mob, msg, verb = "says", datum/language/speaking = null)
+ var/processed_verb = "[SPAN_RED("\[LSTN [nametag]\]")] [verb]"
+ if(broadcasting)
+ if(get_dist(src, M) <= 7)
+ talk_into(M, msg,null,processed_verb,speaking)
+
+/obj/item/device/radio/listening_bug/afterattack(atom/target_atom, mob/user as mob, proximity)
+ if(!ready_to_disguise)
+ return ..()
+
+ var/obj/item/target_item = target_atom
+ if(!istype(target_item) || target_item.anchored || target_item.w_class >= SIZE_LARGE)
+ to_chat(user, SPAN_WARNING("You cannot disguise the listening device as this object."))
+ return FALSE
+
+ var/confirm = tgui_alert(user, "Are you sure you wish to disguise the listening device as '[target_item]'?", "Confirm Choice", list("Yes","No"), 20 SECONDS)
+ if(confirm != "Yes")
+ return FALSE
+
+ icon = target_item.icon
+ name = target_item.name
+ desc = target_item.desc
+ icon_state = target_item.icon_state
+ item_state = target_item.item_state
+ flags_equip_slot = target_item.flags_equip_slot
+ w_class = target_item.w_class
+ ready_to_disguise = FALSE
+ disguised = TRUE
+
+/obj/item/device/radio/listening_bug/get_examine_text(mob/user)
+ if(disguised)
+ . = list()
+ var/size
+ switch(w_class)
+ if(SIZE_TINY)
+ size = "tiny"
+ if(SIZE_SMALL)
+ size = "small"
+ if(SIZE_MEDIUM)
+ size = "normal-sized"
+ . += "This is a [blood_color ? blood_color != "#030303" ? "bloody " : "oil-stained " : ""][icon2html(src, user)][src.name]. It is a [size] item."
+ if(desc)
+ . += desc
+ if(desc_lore)
+ . += SPAN_NOTICE("This has an extended lore description.")
+ else
+ . = ..()
+ . += SPAN_INFO("[src] is set to frequency [get_bug_letter()].")
+ if(nametag != initial(nametag))
+ . += SPAN_INFO("[src]'s nametag is set to '[nametag]'")
+
+/obj/item/device/radio/listening_bug/verb/change_disguise()
+ set name = "Change Disguise"
+ set category = "Object"
+ set src in usr
+
+ if(usr.is_mob_incapacitated())
+ to_chat(usr, SPAN_WARNING("You cannot do this while incapacitated!"))
+ return FALSE
+
+ var/check = tgui_alert(usr, "Do you wish to change the disguise of this listening bug?", "Change Disguise?", list("Yes", "No"))
+ if(check != "Yes")
+ return FALSE
+ if(disguised)
+ var/remove_check = tgui_alert(usr, "Do you wish to remove the current disguise?", "Remove Disguise?", list("Yes","No"))
+ if(remove_check == "Yes")
+ icon = initial(icon)
+ name = initial(name)
+ desc = initial(desc)
+ icon_state = initial(icon_state)
+ item_state = initial(item_state)
+ flags_equip_slot = initial(flags_equip_slot)
+ w_class = initial(w_class)
+ disguised = FALSE
+ return TRUE
+
+ to_chat(usr, SPAN_HELPFUL("You can now change the disguise of the device by selecting a normal, or smaller, sized object."))
+ ready_to_disguise = TRUE
+ return TRUE
+
+/obj/item/device/radio/listening_bug/proc/get_bug_letter()
+ switch(frequency)
+ if(BUG_A_FREQ)
+ return "A"
+ if(BUG_B_FREQ)
+ return "B"
+ if(SEC_FREQ)
+ return "MP"
+ if(PVST_FREQ)
+ return "PVST"
+ if(HC_FREQ)
+ return "HC"
+ if(WY_FREQ, PMC_CCT_FREQ)
+ return "WY"
+ if(PMC_CMD_FREQ)
+ return "WYC"
+ if(UPP_CCT_FREQ, UPP_KDO_FREQ)
+ return "UPP"
+ else
+ return "X"
+
+#define OPTION_REMOVE "Remove Tag"
+#define OPTION_NEW "New Tag"
+
+/obj/item/device/radio/listening_bug/verb/set_nametag()
+ set name = "Set Nametag"
+ set category = "Object"
+ set src in usr
+
+ if(usr.is_mob_incapacitated())
+ to_chat(usr, SPAN_WARNING("You cannot do this while incapacitated!"))
+ return FALSE
+
+ var/check = tgui_alert(usr, "Do you wish to change the name tag of this listening bug?", "Change Name tag?", list("Yes", "No"))
+ if(check != "Yes")
+ return FALSE
+
+
+ var/new_nametag
+ var/remove
+ if(nametag != initial(nametag))
+ remove = tgui_alert(usr, "Do you wish to remove the current nametag?", "Remove Nametag", list("Yes", "No"))
+ if(remove == "Yes")
+ new_nametag = initial(nametag)
+ else
+ new_nametag = tgui_input_text(usr, "What new name tag do you wish to use?", "New Name", initial(nametag), 6)
+
+ if(!new_nametag || (new_nametag == nametag))
+ return FALSE
+
+ nametag = new_nametag
+ log_game("[key_name(usr)] set a listening device nametag to [new_nametag].")
+ return TRUE
+
+#undef OPTION_REMOVE
+#undef OPTION_NEW
+
+/obj/item/device/radio/listening_bug/freq_a
+ frequency = BUG_A_FREQ
+
+/obj/item/device/radio/listening_bug/freq_b
+ frequency = BUG_B_FREQ
+
+/obj/item/device/radio/listening_bug/radio_linked
+ prevent_snooping = TRUE
+ subspace_transmission = TRUE
+ subspace_switchable = TRUE
+
+/obj/item/device/radio/listening_bug/radio_linked/mp
+ frequency = SEC_FREQ
+ req_one_access = list(ACCESS_MARINE_BRIG)
+
+/obj/item/device/radio/listening_bug/radio_linked/hc
+ frequency = HC_FREQ
+ req_one_access = list(ACCESS_MARINE_CO)
+/obj/item/device/radio/listening_bug/radio_linked/hc/pvst
+ frequency = PVST_FREQ
+
+/obj/item/device/radio/listening_bug/radio_linked/wy
+ frequency = WY_FREQ
+ req_one_access = list(ACCESS_WY_EXEC, ACCESS_WY_SECURITY)
+
+/obj/item/device/radio/listening_bug/radio_linked/wy/pmc
+ frequency = PMC_CCT_FREQ
+ req_one_access = list(ACCESS_WY_EXEC, ACCESS_WY_SECURITY)
+
+/obj/item/device/radio/listening_bug/radio_linked/upp
+ frequency = UPP_CCT_FREQ
+ req_one_access = list(ACCESS_UPP_COMMANDO, ACCESS_UPP_SECURITY)
+
+/obj/item/device/radio/listening_bug/radio_linked/upp/commando
+ frequency = UPP_KDO_FREQ
+ req_one_access = list(ACCESS_UPP_COMMANDO)
+
+
+// ENCRYPTION KEYS FOR LISTENING IN!
+//REQURIES SUBSPACE ACTIVATION ON THE BUGS FIRST!
+/obj/item/device/encryptionkey/listening_bug
+ desc = "A small encryption key for listening to a secret broadcasting device! Unlikely to work if the device is not using subspace communications!"
+ icon_state = "stripped_key"
+
+/obj/item/device/encryptionkey/listening_bug/freq_a
+ name = "Listening Bug Encryption Key (A)"
+ channels = list(RADIO_CHANNEL_BUG_A = TRUE)
+
+/obj/item/device/encryptionkey/listening_bug/freq_b
+ name = "Listening Bug Encryption Key (B)"
+ channels = list(RADIO_CHANNEL_BUG_B = TRUE)
diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm
index d388e06b9fa7..e0f65a4b31ec 100644
--- a/code/game/objects/items/devices/suit_cooling.dm
+++ b/code/game/objects/items/devices/suit_cooling.dm
@@ -110,7 +110,7 @@
cell.add_fingerprint(user)
cell.update_icon()
- to_chat(user, "You remove the [src.cell].")
+ to_chat(user, "You remove [cell].")
src.cell = null
updateicon()
return
@@ -121,7 +121,7 @@
else
turn_on()
if (on)
- to_chat(user, "You switch on the [src].")
+ to_chat(user, "You switch on [src].")
/obj/item/device/suit_cooling_unit/attackby(obj/item/W as obj, mob/user as mob)
if (HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER))
@@ -137,12 +137,12 @@
if (istype(W, /obj/item/cell))
if(cover_open)
if(cell)
- to_chat(user, "There is a [cell] already installed here.")
+ to_chat(user, "There is \a [cell] already installed here.")
else
if(user.drop_held_item())
W.forceMove(src)
cell = W
- to_chat(user, "You insert the [cell].")
+ to_chat(user, "You insert [cell].")
updateicon()
return
@@ -169,7 +169,7 @@
if (cover_open)
if(cell)
- . += "The panel is open, exposing the [cell]."
+ . += "The panel is open, exposing [cell]."
else
. += "The panel is open."
diff --git a/code/game/objects/items/devices/teleportation.dm b/code/game/objects/items/devices/teleportation.dm
index c65286969786..793f399ecdf0 100644
--- a/code/game/objects/items/devices/teleportation.dm
+++ b/code/game/objects/items/devices/teleportation.dm
@@ -49,7 +49,7 @@
return
var/turf/current_location = get_turf(usr)//What turf is the user on?
if(!current_location || is_admin_level(current_location.z))//If turf was not found or they're on z level 2.
- to_chat(usr, "The [src] is malfunctioning.")
+ to_chat(usr, "[src] is malfunctioning.")
return
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
usr.set_interaction(src)
@@ -177,4 +177,3 @@
P.creator = src
src.add_fingerprint(user)
return
-
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index b3d433727946..6fc526936809 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -47,7 +47,7 @@
user.temp_drop_inv_item(A)
attached_device = A
A.forceMove(src)
- to_chat(user, SPAN_NOTICE("You attach the [item] to the valve controls and secure it."))
+ to_chat(user, SPAN_NOTICE("You attach [item] to the valve controls and secure it."))
A.holder = src
A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb).
diff --git a/code/game/objects/items/explosives/explosive.dm b/code/game/objects/items/explosives/explosive.dm
index 0c482e8db9e7..4483372c9b85 100644
--- a/code/game/objects/items/explosives/explosive.dm
+++ b/code/game/objects/items/explosives/explosive.dm
@@ -262,8 +262,8 @@
if(falloff_mode == EXPLOSION_FALLOFF_SHAPE_LINEAR)
falloff_mode = EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL
- to_chat(usr, SPAN_NOTICE("You enable the [src]'s blast wave dampener, limiting the blast radius."))
+ to_chat(usr, SPAN_NOTICE("You enable [src]'s blast wave dampener, limiting the blast radius."))
else
falloff_mode = EXPLOSION_FALLOFF_SHAPE_LINEAR
- to_chat(usr, SPAN_NOTICE("You disable the [src]'s blast wave dampener, restoring the blast radius to full."))
+ to_chat(usr, SPAN_NOTICE("You disable [src]'s blast wave dampener, restoring the blast radius to full."))
playsound(loc, 'sound/items/Screwdriver2.ogg', 25, 0, 6)
diff --git a/code/game/objects/items/explosives/grenades/chem_grenade.dm b/code/game/objects/items/explosives/grenades/chem_grenade.dm
index e975603d45d8..48430aacecc9 100644
--- a/code/game/objects/items/explosives/grenades/chem_grenade.dm
+++ b/code/game/objects/items/explosives/grenades/chem_grenade.dm
@@ -1,5 +1,5 @@
/obj/item/explosive/grenade/custom
- name = "Custom grenade"
+ name = "custom grenade"
icon_state = "grenade_custom"
desc = "A custom chemical grenade with an M40 casing. This one is made to fit into underslung grenade launchers, but can also be thrown by hand."
w_class = SIZE_SMALL
@@ -17,7 +17,7 @@
..()
/obj/item/explosive/grenade/custom/large
- name = "Large Custom Grenade"
+ name = "large custom grenade"
desc = "A custom chemical grenade with an M15 casing. This casing has a higher explosive capacity than the M40 variant."
icon_state = "large_grenade_custom"
allowed_containers = list(/obj/item/reagent_container/glass)
@@ -33,7 +33,7 @@
/obj/item/explosive/grenade/custom/metal_foam
- name = "Metal-Foam Grenade"
+ name = "metal-foam grenade"
desc = "Used for emergency sealing of air breaches."
assembly_stage = ASSEMBLY_LOCKED
harmful = FALSE
@@ -56,7 +56,7 @@
update_icon()
/obj/item/explosive/grenade/custom/incendiary
- name = "Incendiary Grenade"
+ name = "incendiary grenade"
desc = "Used for clearing rooms of living things."
assembly_stage = ASSEMBLY_LOCKED
has_blast_wave_dampener = FALSE
@@ -79,7 +79,7 @@
update_icon()
/obj/item/explosive/grenade/custom/flare
- name = "M40-F flare grenade"
+ name = "\improper M40-F flare grenade"
desc = "Chemical flare in a grenade form, designed for compatibility with most standard issue launchers."
assembly_stage = ASSEMBLY_LOCKED
has_blast_wave_dampener = FALSE
@@ -103,7 +103,7 @@
update_icon()
/obj/item/explosive/grenade/custom/large/flare
- name = "M15-F flare grenade"
+ name = "\improper M15-F flare grenade"
desc = "Chemical flare in a grenade form, expanded variant. The casing is too large to fit most launchers."
assembly_stage = ASSEMBLY_LOCKED
has_blast_wave_dampener = FALSE
diff --git a/code/game/objects/items/explosives/mine.dm b/code/game/objects/items/explosives/mine.dm
index 45478f2828f4..768a32c003fa 100644
--- a/code/game/objects/items/explosives/mine.dm
+++ b/code/game/objects/items/explosives/mine.dm
@@ -309,7 +309,7 @@
map_deployed = TRUE
/obj/item/explosive/mine/custom
- name = "Custom mine"
+ name = "custom mine"
desc = "A custom chemical mine built from an M20 casing."
icon_state = "m20_custom"
customizable = TRUE
diff --git a/code/game/objects/items/explosives/plastic.dm b/code/game/objects/items/explosives/plastic.dm
index ac0a2263cd5c..071ff3458a91 100644
--- a/code/game/objects/items/explosives/plastic.dm
+++ b/code/game/objects/items/explosives/plastic.dm
@@ -184,7 +184,7 @@
//vehicle interior stuff checks
if(SSinterior.in_interior(target))
- to_chat(user, SPAN_WARNING("It's too cramped in here to deploy \the [src]."))
+ to_chat(user, SPAN_WARNING("It's too cramped in here to deploy [src]."))
return FALSE
if(istype(target, /obj/effect) || istype(target, /obj/structure/machinery))
@@ -195,7 +195,7 @@
if(istype(target, /turf/closed/wall))
var/turf/closed/wall/W = target
if(W.hull)
- to_chat(user, SPAN_WARNING("You are unable to stick \the [src] to the [W]!"))
+ to_chat(user, SPAN_WARNING("You are unable to stick [src] to [W]!"))
return FALSE
if(istype(target, /obj/structure/window))
@@ -301,7 +301,7 @@
prime(TRUE)
/obj/item/explosive/plastic/custom
- name = "Custom plastic explosive"
+ name = "custom plastic explosive"
desc = "A custom plastic explosive."
icon_state = "custom_plastic_explosive"
overlay_image = "custom_plastic_explosive_sensing"
diff --git a/code/game/objects/items/frames/camera.dm b/code/game/objects/items/frames/camera.dm
index 59bc2844868e..efe697c3944b 100644
--- a/code/game/objects/items/frames/camera.dm
+++ b/code/game/objects/items/frames/camera.dm
@@ -167,7 +167,7 @@
to_chat(user, SPAN_WARNING("\The [WT] needs to be on!"))
return 0
- to_chat(user, SPAN_NOTICE("You start to weld the [src].."))
+ to_chat(user, SPAN_NOTICE("You start to weld [src].."))
playsound(src.loc, 'sound/items/Welder.ogg', 25, 1)
WT.eyecheck(user)
if(do_after(user, 20, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD))
diff --git a/code/game/objects/items/lightstick.dm b/code/game/objects/items/lightstick.dm
index 70418049994b..89ce2c00762e 100644
--- a/code/game/objects/items/lightstick.dm
+++ b/code/game/objects/items/lightstick.dm
@@ -22,7 +22,7 @@
/obj/item/lightstick/Crossed(mob/living/O)
if(anchored && prob(trample_chance) && can_trample)
if(!istype(O,/mob/living/carbon/xenomorph/larva))
- visible_message(SPAN_DANGER("[O] tramples the [src]!"))
+ visible_message(SPAN_DANGER("[O] tramples [src]!"))
playsound(src, 'sound/weapons/Genhit.ogg', 25, 1)
if(istype(O,/mob/living/carbon/xenomorph))
if(prob(40))
@@ -46,17 +46,17 @@
if(!anchored)//If planted
return
- to_chat(user, "You start pulling out \the [src].")
- if(!do_after(user,20, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD))
+ to_chat(user, "You start pulling out [src].")
+ if(!do_after(user, 2 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD))
return
anchored = FALSE
- user.visible_message("[user.name] removes \the [src] from the ground.","You remove the [src] from the ground.")
+ user.visible_message("[user.name] removes [src] from the ground.", "You remove [src] from the ground.")
icon_state = "lightstick_[s_color][anchored]"
set_light(0)
pixel_x = 0
pixel_y = 0
- playsound(user, 'sound/weapons/Genhit.ogg', 25, 1)
+ playsound(user, 'sound/weapons/Genhit.ogg', 25, TRUE)
//Red
/obj/item/lightstick/planted
diff --git a/code/game/objects/items/misc.dm b/code/game/objects/items/misc.dm
index 50c5cd75551b..1699cb24ef39 100644
--- a/code/game/objects/items/misc.dm
+++ b/code/game/objects/items/misc.dm
@@ -134,7 +134,7 @@
return
stored_item = object
mobber.drop_inv_item_to_loc(object, src)
- to_chat(mobber, SPAN_NOTICE("You slide the [object] into [src]."))
+ to_chat(mobber, SPAN_NOTICE("You slide [object] into [src]."))
playsound(mobber, 'sound/weapons/gun_shotgun_shell_insert.ogg', 15, TRUE)
update_icon()
break
diff --git a/code/game/objects/items/props/helmetgarb.dm b/code/game/objects/items/props/helmetgarb.dm
index 7860236d5d51..d8e65f1a3cd3 100644
--- a/code/game/objects/items/props/helmetgarb.dm
+++ b/code/game/objects/items/props/helmetgarb.dm
@@ -204,7 +204,7 @@
to_chat(user, SPAN_WARNING("Nothing to fix."))
else if(shape == NVG_SHAPE_COSMETIC)
- to_chat(user, SPAN_WARNING("it's nothing but a husk of what it used to be."))
+ to_chat(user, SPAN_WARNING("It's nothing but a husk of what it used to be."))
else
to_chat(user, "You begin to repair \the [src].")
@@ -496,6 +496,30 @@
desc = "The USCM had its funding pulled for these when it became apparent that not every deployed enlisted was wearing a helmet 24/7; much to the bafflement of UA High Command."
icon_state = "helmet_gasmask"
+/obj/item/prop/helmetgarb/helmet_gasmask/on_enter_storage(obj/item/storage/internal/helmet_internal_inventory)
+ ..()
+ if(!istype(helmet_internal_inventory))
+ return
+ var/obj/item/clothing/head/helmet/helmet_item = helmet_internal_inventory.master_object
+
+ if(!istype(helmet_item))
+ return
+
+ helmet_item.flags_inventory |= BLOCKGASEFFECT
+ helmet_item.flags_inv_hide |= HIDEFACE
+
+/obj/item/prop/helmetgarb/helmet_gasmask/on_exit_storage(obj/item/storage/internal/helmet_internal_inventory)
+ ..()
+ if(!istype(helmet_internal_inventory))
+ return
+ var/obj/item/clothing/head/helmet/helmet_item = helmet_internal_inventory.master_object
+
+ if(!istype(helmet_item))
+ return
+
+ helmet_item.flags_inventory &= ~(BLOCKGASEFFECT)
+ helmet_item.flags_inv_hide &= ~(HIDEFACE)
+
/obj/item/prop/helmetgarb/trimmed_wire
name = "trimmed barbed wire"
desc = "It is a length of barbed wire that's had most of the sharp points filed down so that it is safe to handle."
diff --git a/code/game/objects/items/reagent_containers/food/condiment.dm b/code/game/objects/items/reagent_containers/food/condiment.dm
index a13489f0af1e..35944e4422c4 100644
--- a/code/game/objects/items/reagent_containers/food/condiment.dm
+++ b/code/game/objects/items/reagent_containers/food/condiment.dm
@@ -23,7 +23,7 @@
return FALSE
if(M == user)
- to_chat(M, SPAN_NOTICE(" You swallow some of contents of the [src]."))
+ to_chat(M, SPAN_NOTICE("You swallow some of contents of [src]."))
else if(istype(M, /mob/living/carbon/human))
user.affected_message(M,
@@ -80,7 +80,7 @@
to_chat(user, SPAN_DANGER("[src] is empty."))
return
if(target.reagents.total_volume >= target.reagents.maximum_volume)
- to_chat(user, SPAN_DANGER("you can't add anymore to [target]."))
+ to_chat(user, SPAN_DANGER("You can't add any more to [target]."))
return
var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
to_chat(user, SPAN_NOTICE(" You transfer [trans] units of the condiment to [target]."))
@@ -202,7 +202,7 @@
/obj/item/reagent_container/food/condiment/hotsauce/franks
name = "\improper Frank's Red Hot bottle"
desc = "A bottle of Weyland-Yutani brand Frank's Red Hot hot sauce."
- desc_lore = "Supposedly designed as a middle-ground flavor between ketchup and cayenne, this brand of spicy goodness achieved critical acclaim throughout UA space within both colonies and vessels alike. The sudden and widespread adoption was curiously timed with the near-simultaneous shelving of the original Frank's 'ULTRA' hot sauce."
+ desc_lore = "Supposedly designed as a middle-ground flavor between ketchup and cayenne, this brand of spicy goodness achieved critical acclaim throughout UA space within both colonies and vessels alike. The sudden and widespread adoption was curiously timed with the near-simultaneous shelving of the original Frank's 'ULTRA' hot sauce."
icon_state = "hotsauce_franks"
item_state = "hotsauce_franks"
diff --git a/code/game/objects/items/reagent_containers/food/fortunecookie.dm b/code/game/objects/items/reagent_containers/food/fortunecookie.dm
index 270bd4d7c44a..6077541acd84 100644
--- a/code/game/objects/items/reagent_containers/food/fortunecookie.dm
+++ b/code/game/objects/items/reagent_containers/food/fortunecookie.dm
@@ -75,7 +75,7 @@
to_chat(user,SPAN_WARNING("[src] is cracked open! How are you gonna slip something in that?"))
else
if(!cookiefortune)
- to_chat(user, SPAN_NOTICE("You slip the paper into the [src]."))
+ to_chat(user, SPAN_NOTICE("You slip the paper into [src]."))
cookiefortune = W
user.drop_inv_item_to_loc(W, src)
else
diff --git a/code/game/objects/items/reagent_containers/food/sandwich.dm b/code/game/objects/items/reagent_containers/food/sandwich.dm
index 1b7d61eaddad..511c0c042be1 100644
--- a/code/game/objects/items/reagent_containers/food/sandwich.dm
+++ b/code/game/objects/items/reagent_containers/food/sandwich.dm
@@ -18,7 +18,7 @@
/obj/item/reagent_container/food/snacks/csandwich/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/reagent_container/food/snacks/csandwich))
//No sandwitch inception, it causes some bugs...
- to_chat(user, SPAN_NOTICE(" You can't put a [W] in the [src]."))
+ to_chat(user, SPAN_NOTICE("You can't put \a [W] in [src]."))
return
var/sandwich_limit = 4
diff --git a/code/game/objects/items/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm
index 2892eb1113e7..eb33ca6b1d0f 100644
--- a/code/game/objects/items/reagent_containers/food/snacks.dm
+++ b/code/game/objects/items/reagent_containers/food/snacks.dm
@@ -217,10 +217,10 @@
if(isanimal(M))
if(iscorgi(M))
if(bitecount == 0 || prob(50))
- M.emote("nibbles away at the [src]")
+ M.emote("nibbles away at [src]")
bitecount++
if(bitecount >= 5)
- var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where the [src] was")
+ var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where [src] was")
if(sattisfaction_text)
M.emote("[sattisfaction_text]")
qdel(src)
@@ -2801,7 +2801,7 @@
if( open && pizza )
user.put_in_hands( pizza )
- to_chat(user, SPAN_DANGER("You take the [src.pizza] out of the [src]."))
+ to_chat(user, SPAN_DANGER("You take the [src.pizza] out of [src]."))
src.pizza = null
update_icon()
return
@@ -2852,11 +2852,11 @@
box.update_icon()
update_icon()
- to_chat(user, SPAN_DANGER("You put the [box] ontop of the [src]!"))
+ to_chat(user, SPAN_DANGER("You put [box] ontop of [src]!"))
else
to_chat(user, SPAN_DANGER("The stack is too high!"))
else
- to_chat(user, SPAN_DANGER("Close the [box] first!"))
+ to_chat(user, SPAN_DANGER("Close [box] first!"))
return
@@ -2868,9 +2868,9 @@
update_icon()
- to_chat(user, SPAN_DANGER("You put the [I] in the [src]!"))
+ to_chat(user, SPAN_DANGER("You put [I] in [src]!"))
else
- to_chat(user, SPAN_DANGER("You try to push the [I] through the lid but it doesn't work!"))
+ to_chat(user, SPAN_DANGER("You try to push [I] through the lid but it doesn't work!"))
return
if( istype(I, /obj/item/tool/pen/) )
diff --git a/code/game/objects/items/reagent_containers/glass.dm b/code/game/objects/items/reagent_containers/glass.dm
index e2a9ba537b0d..2a7bde748fba 100644
--- a/code/game/objects/items/reagent_containers/glass.dm
+++ b/code/game/objects/items/reagent_containers/glass.dm
@@ -237,7 +237,7 @@
overlays += lid
/obj/item/reagent_container/glass/minitank
- name = "MS-11 Smart Refill Tank"
+ name = "\improper MS-11 Smart Refill Tank"
desc = "A robust little tank capable of refilling autoinjectors that previously required a nanomed system to refill. Using the wonders of microchips, it automatically sorts the correct chemicals into most single reagent autoinjectors. It is unable to partially fill them however. A valve exists on the top to transfer reagents to another container or to flush it entirely."
icon = 'icons/obj/items/tank.dmi'
icon_state = "mini_reagent_tank"
@@ -277,7 +277,7 @@
if(istype(W, /obj/item/reagent_container/hypospray/autoinjector))
var/obj/item/reagent_container/hypospray/autoinjector/A = W
if(A.mixed_chem)
- to_chat(user, SPAN_WARNING("The autoinjector doesn't fit into the [src]'s valve. It's probably not compatible."))
+ to_chat(user, SPAN_WARNING("The autoinjector doesn't fit into [src]'s valve. It's probably not compatible."))
return
if(reagents.has_reagent(A.chemname, A.volume))
reagents.trans_id_to(A, A.chemname, A.volume)
@@ -285,10 +285,10 @@
A.update_icon()
playsound(src.loc, 'sound/effects/refill.ogg', 25, 1, 3)
else
- to_chat(user, SPAN_WARNING("A small LED on \the [src] blinks. The tank can't refill \the [A] - it's either incompatible or out of chemicals to fill it with!"))
+ to_chat(user, SPAN_WARNING("A small LED on [src] blinks. The tank can't refill [A] - it's either incompatible or out of chemicals to fill it with!"))
. = ..()
return
- to_chat(user,SPAN_INFO("You successfully refill \the [W.name] with \the [src]!"))
+ to_chat(user, SPAN_INFO("You successfully refill [A] with [src]!"))
/obj/item/reagent_container/glass/minitank/verb/flush_tank(mob/user)
set category = "Object"
@@ -299,7 +299,7 @@
to_chat(user, SPAN_WARNING("It's already empty!"))
return
playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1, 3)
- to_chat(user, SPAN_WARNING("You work the flush valve and successfully flush \the [src]'s contents!"))
+ to_chat(user, SPAN_WARNING("You work the flush valve and successfully flush [src]'s contents!"))
reagents.clear_reagents()
update_icon() // just to be sure
return
@@ -672,5 +672,5 @@
if(istype(AM) && (src in user))
user.visible_message("[user] starts to wipe down [AM] with [src]!")
if(do_after(user,30, INTERRUPT_ALL, BUSY_ICON_GENERIC))
- user.visible_message("[user] finishes wiping off the [AM]!")
+ user.visible_message("[user] finishes wiping off [AM]!")
AM.clean_blood()
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 34debd7c60cf..de2daa9a3009 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -12,7 +12,7 @@
/obj/item/robot/upgrade/proc/action(mob/living/silicon/robot/R)
if(R.stat == DEAD)
- to_chat(usr, SPAN_DANGER("The [src] will not function on a deceased robot."))
+ to_chat(usr, SPAN_DANGER("[src] will not function on a deceased robot."))
return 1
return 0
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 2f4dd0f532ca..a0814290ca40 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -223,11 +223,13 @@ GLOBAL_LIST_INIT_TYPED(cardboard_recipes, /datum/stack_recipe, list ( \
null, \
new/datum/stack_recipe_list("empty ammo boxes",list( \
new/datum/stack_recipe("empty magazine box (88 Mod 4 AP)", /obj/item/ammo_box/magazine/mod88/empty), \
+ new/datum/stack_recipe("empty magazine box (SU-6)", /obj/item/ammo_box/magazine/su6/empty), \
+ new/datum/stack_recipe("empty magazine box (VP78)", /obj/item/ammo_box/magazine/vp78/empty), \
+ null, \
new/datum/stack_recipe("empty magazine box (M4A3)", /obj/item/ammo_box/magazine/m4a3/empty), \
new/datum/stack_recipe("empty magazine box (M4A3 AP)", /obj/item/ammo_box/magazine/m4a3/ap/empty), \
new/datum/stack_recipe("empty magazine box (M4A3 HP)", /obj/item/ammo_box/magazine/m4a3/hp/empty), \
- new/datum/stack_recipe("empty magazine box (SU-6)", /obj/item/ammo_box/magazine/su6/empty), \
- new/datum/stack_recipe("empty magazine box (VP78)", /obj/item/ammo_box/magazine/vp78/empty), \
+ new/datum/stack_recipe("empty magazine box (M4A3 Incen)", /obj/item/ammo_box/magazine/m4a3/incen/empty), \
null, \
new/datum/stack_recipe("empty speed loader box (M44)", /obj/item/ammo_box/magazine/m44/empty), \
new/datum/stack_recipe("empty speed loader box (M44 Heavy)", /obj/item/ammo_box/magazine/m44/heavy/empty), \
@@ -256,10 +258,27 @@ GLOBAL_LIST_INIT_TYPED(cardboard_recipes, /datum/stack_recipe, list ( \
new/datum/stack_recipe("empty magazine box (M41A Incen)", /obj/item/ammo_box/magazine/incen/empty), \
new/datum/stack_recipe("empty magazine box (M41A LE)", /obj/item/ammo_box/magazine/le/empty), \
null, \
+ new/datum/stack_recipe("empty magazine box (M41A MK1)", /obj/item/ammo_box/magazine/mk1/empty), \
+ new/datum/stack_recipe("empty magazine box (M41A MK1 AP)", /obj/item/ammo_box/magazine/mk1/ap/empty), \
+ null, \
+ new/datum/stack_recipe("empty drum box (M56B)", /obj/item/ammo_box/magazine/m56b/empty), \
+ new/datum/stack_recipe("empty drum box (M56B Irradiated)", /obj/item/ammo_box/magazine/m56b/dirty/empty), \
+ new/datum/stack_recipe("empty drum box (M56D)", /obj/item/ammo_box/magazine/m56d/empty), \
+ null, \
+ new/datum/stack_recipe("empty drum box (M2C)", /obj/item/ammo_box/magazine/m2c/empty), \
+ null, \
+ new/datum/stack_recipe("empty magazine box (M41AE2)", /obj/item/ammo_box/magazine/m41ae2/empty), \
+ new/datum/stack_recipe("empty magazine box (M41AE2 Holo-Target)", /obj/item/ammo_box/magazine/m41ae2/holo/empty), \
+ new/datum/stack_recipe("empty magazine box (M41AE2 HEAP)", /obj/item/ammo_box/magazine/m41ae2/heap/empty), \
+ null, \
+ new/datum/stack_recipe("empty flamer tank box (UT-Napthal)", /obj/item/ammo_box/magazine/flamer/empty), \
+ new/datum/stack_recipe("empty flamer tank box (Napalm B-Gel)", /obj/item/ammo_box/magazine/flamer/bgel/empty), \
+ null, \
new/datum/stack_recipe("empty shotgun shell box (Beanbag)", /obj/item/ammo_box/magazine/shotgun/beanbag/empty), \
new/datum/stack_recipe("empty shotgun shell box (Buckshot)", /obj/item/ammo_box/magazine/shotgun/buckshot/empty), \
new/datum/stack_recipe("empty shotgun shell box (Flechette)", /obj/item/ammo_box/magazine/shotgun/flechette/empty), \
new/datum/stack_recipe("empty shotgun shell box (Incendiary)", /obj/item/ammo_box/magazine/shotgun/incendiary/empty), \
+ new/datum/stack_recipe("empty shotgun shell box (Incendiary Buckshot)", /obj/item/ammo_box/magazine/shotgun/incendiarybuck/empty), \
new/datum/stack_recipe("empty shotgun shell box (Slugs)", /obj/item/ammo_box/magazine/shotgun/empty), \
null, \
new/datum/stack_recipe("empty 45-70 bullets box", /obj/item/ammo_box/magazine/lever_action/empty), \
@@ -279,17 +298,42 @@ GLOBAL_LIST_INIT_TYPED(cardboard_recipes, /datum/stack_recipe, list ( \
new/datum/stack_recipe("empty rifle ammo box (10x24mm Incen)", /obj/item/ammo_box/rounds/incen/empty), \
new/datum/stack_recipe("empty rifle ammo box (10x24mm LE)", /obj/item/ammo_box/rounds/le/empty), \
null, \
+ new/datum/stack_recipe("empty rifle ammo box (9mm)", /obj/item/ammo_box/rounds/pistol/empty), \
+ new/datum/stack_recipe("empty rifle ammo box (9mm AP)", /obj/item/ammo_box/rounds/pistol/ap/empty), \
+ new/datum/stack_recipe("empty rifle ammo box (9mm HP)", /obj/item/ammo_box/rounds/pistol/hp/empty), \
+ new/datum/stack_recipe("empty rifle ammo box (9mm Incen)", /obj/item/ammo_box/rounds/pistol/incen/empty), \
+ null, \
new/datum/stack_recipe("empty box of MREs", /obj/item/ammo_box/magazine/misc/mre/empty), \
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 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), \
+ new/datum/stack_recipe("empty magazine box (Desert Eagle Heavy)", /obj/item/ammo_box/magazine/deagle/super/empty), \
+ new/datum/stack_recipe("empty magazine box (Desert Eagle High-Impact)", /obj/item/ammo_box/magazine/deagle/super/highimpact/empty), \
+ new/datum/stack_recipe("empty magazine box (Desert Eagle AP)", /obj/item/ammo_box/magazine/deagle/super/highimpact/ap/empty), \
+ null, \
+ new/datum/stack_recipe("empty magazine box (Spearhead HP)", /obj/item/ammo_box/magazine/spearhead/empty), \
+ new/datum/stack_recipe("empty magazine box (Spearhead)", /obj/item/ammo_box/magazine/spearhead/normalpoint/empty), \
+ null, \
new/datum/stack_recipe("empty magazine box (M16)", /obj/item/ammo_box/magazine/M16/empty), \
new/datum/stack_recipe("empty magazine box (M16 AP)", /obj/item/ammo_box/magazine/M16/ap/empty), \
null, \
+ new/datum/stack_recipe("empty magazine box (AR10)", /obj/item/ammo_box/magazine/ar10/empty), \
+ null, \
+ new/datum/stack_recipe("empty magazine box (MP5)", /obj/item/ammo_box/magazine/mp5/empty), \
+ null, \
+ new/datum/stack_recipe("empty magazine box (NSG 23)", /obj/item/ammo_box/magazine/nsg23/empty), \
+ new/datum/stack_recipe("empty magazine box (NSG 23 AP)", /obj/item/ammo_box/magazine/nsg23/ap/empty), \
+ new/datum/stack_recipe("empty magazine box (NSG 23 EX)", /obj/item/ammo_box/magazine/nsg23/ex/empty), \
+ null, \
new/datum/stack_recipe("empty magazine box (Type71)", /obj/item/ammo_box/magazine/type71/empty), \
new/datum/stack_recipe("empty magazine box (Type71 AP)", /obj/item/ammo_box/magazine/type71/ap/empty), \
null, \
+ new/datum/stack_recipe("empty magazine box (Type73)", /obj/item/ammo_box/magazine/type73/empty), \
+ new/datum/stack_recipe("empty magazine box (Type73 High-Impact)", /obj/item/ammo_box/magazine/type73/impact/empty), \
+ null, \
new/datum/stack_recipe("empty rifle ammo box (5.45x39mm)", /obj/item/ammo_box/rounds/type71/empty), \
new/datum/stack_recipe("empty rifle ammo box (5.45x39mm AP)", /obj/item/ammo_box/rounds/type71/ap/empty), \
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index 4a3afa00f368..8e4ffb90d2bd 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -761,3 +761,211 @@
else if(!isopened)
isopened = 1
icon_state = "mealpackopened"
+
+//food boxes for storage in bulk
+
+//meat
+/obj/item/storage/box/meat
+ name = "box of meat"
+
+/obj/item/storage/box/meat/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/meat/monkey(src)
+
+//fish
+/obj/item/storage/box/fish
+ name = "box of fish"
+
+/obj/item/storage/box/fish/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/carpmeat(src)
+
+//grocery
+
+//milk
+/obj/item/storage/box/milk
+ name = "box of milk"
+
+/obj/item/storage/box/milk/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/drinks/milk(src)
+
+//soymilk
+/obj/item/storage/box/soymilk
+ name = "box of soymilk"
+
+/obj/item/storage/box/soymilk/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/drinks/soymilk(src)
+
+//enzyme
+/obj/item/storage/box/enzyme
+ name = "box of enzyme"
+
+/obj/item/storage/box/enzyme/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/condiment/enzyme(src)
+
+//dry storage
+
+//flour
+/obj/item/storage/box/flour
+ name = "box of flour"
+
+/obj/item/storage/box/flour/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/flour(src)
+
+//sugar
+/obj/item/storage/box/sugar
+ name = "box of sugar"
+
+/obj/item/storage/box/sugar/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/condiment/sugar(src)
+
+//saltshaker
+/obj/item/storage/box/saltshaker
+ name = "box of saltshakers"
+
+/obj/item/storage/box/saltshaker/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/condiment/saltshaker(src)
+
+//peppermill
+/obj/item/storage/box/peppermill
+ name = "box of peppermills"
+
+/obj/item/storage/box/peppermill/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/condiment/peppermill(src)
+
+//mint
+/obj/item/storage/box/mint
+ name = "box of mints"
+
+/obj/item/storage/box/mint/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/mint(src)
+
+// ORGANICS
+
+//apple
+/obj/item/storage/box/apple
+ name = "box of apples"
+
+/obj/item/storage/box/apple/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/grown/apple(src)
+
+//banana
+/obj/item/storage/box/banana
+ name = "box of bananas"
+
+/obj/item/storage/box/banana/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/grown/banana(src)
+
+//chanterelle
+/obj/item/storage/box/chanterelles
+ name = "box of chanterelle"
+
+/obj/item/storage/box/chanterelle/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/grown/mushroom/chanterelle(src)
+
+//cherries
+/obj/item/storage/box/cherries
+ name = "box of cherries"
+
+/obj/item/storage/box/cherries/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/grown/cherries(src)
+
+//chili
+/obj/item/storage/box/chili
+ name = "box of chili"
+
+/obj/item/storage/box/chili/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/grown/chili(src)
+
+//cabbage
+/obj/item/storage/box/cabbage
+ name = "box of cabbages"
+
+/obj/item/storage/box/cabbage/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/grown/cabbage(src)
+
+//carrot
+/obj/item/storage/box/carrot
+ name = "box of carrots"
+
+/obj/item/storage/box/carrot/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/grown/carrot(src)
+
+//corn
+/obj/item/storage/box/corn
+ name = "box of corn"
+
+/obj/item/storage/box/corn/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/grown/corn(src)
+
+//eggplant
+/obj/item/storage/box/eggplant
+ name = "box of eggplants"
+
+/obj/item/storage/box/eggplant/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/grown/eggplant(src)
+
+//lemon
+/obj/item/storage/box/lemon
+ name = "box of lemons"
+
+/obj/item/storage/box/lemon/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/grown/lemon(src)
+
+//lime
+/obj/item/storage/box/lime
+ name = "box of limes"
+
+/obj/item/storage/box/lime/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/grown/lime(src)
+
+//orange
+/obj/item/storage/box/orange
+ name = "box of oranges"
+
+/obj/item/storage/box/orange/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/grown/orange(src)
+
+//potato
+/obj/item/storage/box/potato
+ name = "box of potatoes"
+
+/obj/item/storage/box/potato/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/grown/potato(src)
+
+//tomato
+/obj/item/storage/box/tomato
+ name = "box of tomatoes"
+
+/obj/item/storage/box/tomato/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/grown/tomato(src)
+
+//whitebeet
+/obj/item/storage/box/whitebeet
+ name = "box of whitebeet"
+
+/obj/item/storage/box/whitebeet/fill_preset_inventory()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_container/food/snacks/grown/whitebeet(src)
diff --git a/code/game/objects/items/storage/large_holster.dm b/code/game/objects/items/storage/large_holster.dm
index 76f98c423974..b02dff1bdbcc 100644
--- a/code/game/objects/items/storage/large_holster.dm
+++ b/code/game/objects/items/storage/large_holster.dm
@@ -250,12 +250,12 @@
return FALSE
if(user.back != src)
- to_chat(user, "The [src] must be equipped before you can switch types")
+ to_chat(user, SPAN_WARNING("[src] must be equipped before you can switch types."))
return
var/obj/item/weapon/gun/flamer/M240T/flamer = user.get_active_hand()
if(!istype(flamer))
- to_chat(user, "You must be holding the M240-T incinerator unit to use [src]")
+ to_chat(user, SPAN_WARNING("You must be holding [flamer] to use [src]."))
return
if(!active_fuel)
diff --git a/code/game/objects/items/tools/flame_tools.dm b/code/game/objects/items/tools/flame_tools.dm
index 7681e74a1d88..82870f7ed8d1 100644
--- a/code/game/objects/items/tools/flame_tools.dm
+++ b/code/game/objects/items/tools/flame_tools.dm
@@ -233,12 +233,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM
light(SPAN_NOTICE("[user] fiddles with [W], and manages to light their [name]."))
else if(istype(W, /obj/item/attachable/attached_gun/flamer))
- light(SPAN_NOTICE("[user] lights their [src] with the [W]."))
+ light(SPAN_NOTICE("[user] lights their [name] with [W]."))
else if(istype(W, /obj/item/weapon/gun/flamer))
var/obj/item/weapon/gun/flamer/F = W
if(!(F.flags_gun_features & GUN_TRIGGER_SAFETY))
- light(SPAN_NOTICE("[user] lights their [src] with the pilot light of the [F]."))
+ light(SPAN_NOTICE("[user] lights their [name] with the pilot light of [F]."))
else
to_chat(user, SPAN_WARNING("Turn on the pilot light first!"))
@@ -246,20 +246,20 @@ CIGARETTE PACKETS ARE IN FANCY.DM
var/obj/item/weapon/gun/G = W
for(var/slot in G.attachments)
if(istype(G.attachments[slot], /obj/item/attachable/attached_gun/flamer))
- light(SPAN_NOTICE("[user] lights their [src] with [G.attachments[slot]]."))
+ light(SPAN_NOTICE("[user] lights their [name] with [G.attachments[slot]]."))
break
else if(istype(W, /obj/item/tool/surgery/cautery))
- light(SPAN_NOTICE("[user] lights their [src] with the [W]."))
+ light(SPAN_NOTICE("[user] lights their [name] with [W]."))
else if(istype(W, /obj/item/clothing/mask/cigarette))
var/obj/item/clothing/mask/cigarette/C = W
if(C.item_state == icon_on)
- light(SPAN_NOTICE("[user] lights their [src] with the [C] after a few attempts."))
+ light(SPAN_NOTICE("[user] lights their [name] with [C] after a few attempts."))
else if(istype(W, /obj/item/tool/candle))
if(W.heat_source > 200)
- light(SPAN_NOTICE("[user] lights their [src] with the [W] after a few attempts."))
+ light(SPAN_NOTICE("[user] lights their [name] with [W] after a few attempts."))
return
@@ -529,12 +529,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM
light(SPAN_NOTICE("[user] fiddles with [W], and manages to light their [name] with the power of science."))
else if(istype(W, /obj/item/attachable/attached_gun/flamer))
- light(SPAN_NOTICE("[user] lights their [src] with the [W], bet that would have looked cooler if it was attached to something first!"))
+ light(SPAN_NOTICE("[user] lights their [name] with [W], bet that would have looked cooler if it was attached to something first!"))
else if(istype(W, /obj/item/weapon/gun/flamer))
var/obj/item/weapon/gun/flamer/F = W
if(!(F.flags_gun_features & GUN_TRIGGER_SAFETY))
- light(SPAN_NOTICE("[user] lights their [src] with the pilot light of the [F], the glint of pyromania in their eye."))
+ light(SPAN_NOTICE("[user] lights their [name] with the pilot light of [F], the glint of pyromania in their eye."))
else
to_chat(user, SPAN_WARNING("Turn on the pilot light first!"))
@@ -546,16 +546,16 @@ CIGARETTE PACKETS ARE IN FANCY.DM
break
else if(istype(W, /obj/item/tool/surgery/cautery))
- light(SPAN_NOTICE("[user] lights their [src] with the [W], that can't be sterile!"))
+ light(SPAN_NOTICE("[user] lights their [name] with [W], that can't be sterile!"))
else if(istype(W, /obj/item/clothing/mask/cigarette))
var/obj/item/clothing/mask/cigarette/C = W
if(C.item_state == icon_on)
- light(SPAN_NOTICE("[user] lights their [src] with the [C] after a few attempts."))
+ light(SPAN_NOTICE("[user] lights their [name] with [C] after a few attempts."))
else if(istype(W, /obj/item/tool/candle))
if(W.heat_source > 200)
- light(SPAN_NOTICE("[user] lights their [src] with the [W] after a few attempts."))
+ light(SPAN_NOTICE("[user] lights their [name] with [W] after a few attempts."))
/////////////////
//SMOKING PIPES//
@@ -751,7 +751,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else
playsound(src.loc,"lighter",10, 1, 3)
if(prob(95))
- user.visible_message(SPAN_NOTICE("After a few attempts, [user] manages to light the [src]."))
+ user.visible_message(SPAN_NOTICE("After a few attempts, [user] manages to light [src]."))
else
to_chat(user, SPAN_WARNING("You burn yourself while lighting the lighter."))
@@ -759,7 +759,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
user.apply_damage(2,BURN,"l_hand")
else
user.apply_damage(2,BURN,"r_hand")
- user.visible_message(SPAN_NOTICE("After a few attempts, [user] manages to light the [src], they however burn their finger in the process."))
+ user.visible_message(SPAN_NOTICE("After a few attempts, [user] manages to light [src], they however burn their finger in the process."))
set_light_range(2)
set_light_on(TRUE)
@@ -777,10 +777,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
item_state = icon_off
if(!silent)
if(istype(src, /obj/item/tool/lighter/zippo) )
- bearer.visible_message("You hear a quiet click, as [bearer] shuts off [src] without even looking at what they're doing.")
+ bearer.visible_message(SPAN_ROSE("You hear a quiet click, as [bearer] shuts off [src] without even looking at what they're doing."))
playsound(src.loc,"zippo_close",10, 1, 3)
else
- bearer.visible_message(SPAN_NOTICE("[bearer] quietly shuts off the [src]."))
+ bearer.visible_message(SPAN_NOTICE("[bearer] quietly shuts off [src]."))
set_light_on(FALSE)
STOP_PROCESSING(SSobj, src)
@@ -805,4 +805,3 @@ CIGARETTE PACKETS ARE IN FANCY.DM
cig.light(SPAN_NOTICE("[user] holds the [name] out for [M], and lights the [cig.name]."))
else
..()
-
diff --git a/code/game/objects/items/tools/kitchen_tools.dm b/code/game/objects/items/tools/kitchen_tools.dm
index bb763ada9911..2cff941be8d6 100644
--- a/code/game/objects/items/tools/kitchen_tools.dm
+++ b/code/game/objects/items/tools/kitchen_tools.dm
@@ -218,7 +218,7 @@
var/cooldown = 0
/obj/item/tool/kitchen/tray/attack(mob/living/carbon/M, mob/living/carbon/user)
- to_chat(user, SPAN_WARNING("You accidentally slam yourself with the [src]!"))
+ to_chat(user, SPAN_WARNING("You accidentally slam yourself with [src]!"))
user.apply_effect(1, WEAKEN)
user.take_limb_damage(2)
diff --git a/code/game/objects/items/tools/maintenance_tools.dm b/code/game/objects/items/tools/maintenance_tools.dm
index a326808bf491..a02536800f15 100644
--- a/code/game/objects/items/tools/maintenance_tools.dm
+++ b/code/game/objects/items/tools/maintenance_tools.dm
@@ -96,8 +96,8 @@
if(E)
var/safety = H.get_eye_protection()
if(!safety)
- to_chat(user, SPAN_DANGER("You stab [H] in the eyes with the [src]!"))
- visible_message(SPAN_DANGER("[user] stabs [H] in the eyes with the [src]!"))
+ user.visible_message(SPAN_DANGER("[user] stabs [H] in the eyes with [src]!"),
+ SPAN_DANGER("You stab [H] in the eyes with [src]!"))
E.take_damage(rand(8,20))
return ..()
/obj/item/tool/screwdriver/tactical
diff --git a/code/game/objects/items/tools/misc_tools.dm b/code/game/objects/items/tools/misc_tools.dm
index f70f93497021..44aaab771db8 100644
--- a/code/game/objects/items/tools/misc_tools.dm
+++ b/code/game/objects/items/tools/misc_tools.dm
@@ -132,7 +132,7 @@
qdel(I) //delete the paper item
labels_left = initial(labels_left)
else
- to_chat(user, SPAN_NOTICE("The [src] is already full."))
+ to_chat(user, SPAN_NOTICE("[src] is already full."))
/*
Instead of updating labels_left to user every label used,
diff --git a/code/game/objects/items/tools/shovel_tools.dm b/code/game/objects/items/tools/shovel_tools.dm
index 008b37705fe3..ad74dca54e88 100644
--- a/code/game/objects/items/tools/shovel_tools.dm
+++ b/code/game/objects/items/tools/shovel_tools.dm
@@ -151,7 +151,7 @@
/obj/item/tool/shovel/proc/dump_shovel(atom/target, mob/user)
var/turf/T = target
- to_chat(user, SPAN_NOTICE("you dump the [dirt_type_to_name(dirt_type)]!"))
+ to_chat(user, SPAN_NOTICE("You dump the [dirt_type_to_name(dirt_type)]!"))
playsound(user.loc, "rustle", 30, 1, 6)
if(dirt_type == DIRT_TYPE_SNOW)
var/obj/item/stack/snow/S = locate() in T
diff --git a/code/game/objects/items/toys/toys.dm b/code/game/objects/items/toys/toys.dm
index 88946f5fa446..65234c59b89b 100644
--- a/code/game/objects/items/toys/toys.dm
+++ b/code/game/objects/items/toys/toys.dm
@@ -44,7 +44,7 @@
if(!proximity) return
if (istype(A, /obj/structure/reagent_dispensers/watertank) && get_dist(src,A) <= 1)
A.reagents.trans_to(src, 10)
- to_chat(user, SPAN_NOTICE(" You fill the balloon with the contents of [A]."))
+ to_chat(user, SPAN_NOTICE("You fill the balloon with the contents of [A]."))
src.desc = "A translucent balloon with some form of liquid sloshing around in it."
src.update_icon()
return
@@ -53,22 +53,22 @@
if(istype(O, /obj/item/reagent_container/glass))
if(O.reagents)
if(O.reagents.total_volume < 1)
- to_chat(user, "The [O] is empty.")
+ to_chat(user, SPAN_WARNING("[O] is empty."))
else if(O.reagents.total_volume >= 1)
if(O.reagents.has_reagent("pacid", 1))
- to_chat(user, "The acid chews through the balloon!")
+ to_chat(user, SPAN_WARNING("The acid chews through the balloon!"))
O.reagents.reaction(user)
qdel(src)
else
src.desc = "A translucent balloon with some form of liquid sloshing around in it."
- to_chat(user, SPAN_NOTICE(" You fill the balloon with the contents of [O]."))
+ to_chat(user, SPAN_NOTICE("You fill the balloon with the contents of [O]."))
O.reagents.trans_to(src, 10)
src.update_icon()
return
/obj/item/toy/balloon/launch_impact(atom/hit_atom)
if(src.reagents.total_volume >= 1)
- src.visible_message(SPAN_DANGER("The [src] bursts!"),"You hear a pop and a splash.")
+ src.visible_message(SPAN_DANGER("[src] bursts!"),"You hear a pop and a splash.")
src.reagents.reaction(get_turf(hit_atom))
for(var/atom/A in get_turf(hit_atom))
src.reagents.reaction(A)
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 82fdf30f0fc4..310c53dd5d0f 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -106,7 +106,7 @@
bcell.update_icon()
bcell.forceMove(get_turf(src.loc))
bcell = null
- to_chat(user, SPAN_NOTICE("You remove the cell from the [src]."))
+ to_chat(user, SPAN_NOTICE("You remove the cell from [src]."))
status = 0
update_icon()
return
@@ -183,10 +183,10 @@
// Logging
if(user == L)
- user.attack_log += "\[[time_stamp()]\] [key_name(user)] stunned themselves with the [src] in [get_area(user)]"
+ user.attack_log += "\[[time_stamp()]\] [key_name(user)] stunned themselves with [src] in [get_area(user)]"
else
- msg_admin_attack("[key_name(user)] stunned [key_name(L)] with the [src] in [get_area(user)] ([user.loc.x],[user.loc.y],[user.loc.z]).", user.loc.x, user.loc.y, user.loc.z)
- var/logentry = "\[[time_stamp()]\] [key_name(user)] stunned [key_name(L)] with the [src] in [get_area(user)]"
+ msg_admin_attack("[key_name(user)] stunned [key_name(L)] with [src] in [get_area(user)] ([user.loc.x],[user.loc.y],[user.loc.z]).", user.loc.x, user.loc.y, user.loc.z)
+ var/logentry = "\[[time_stamp()]\] [key_name(user)] stunned [key_name(L)] with [src] in [get_area(user)]"
L.attack_log += logentry
user.attack_log += logentry
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 0baa83f8e791..f3c76bcff638 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -113,7 +113,7 @@
w_class = SIZE_MEDIUM
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
else
- to_chat(user, SPAN_NOTICE("The [src] can now be concealed."))
+ to_chat(user, SPAN_NOTICE("[src] can now be concealed."))
force = initial(force)
edge = 0
sharp = 0
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 95998d5de79a..2519ed2940d5 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -209,7 +209,7 @@
/obj/structure/proc/toggle_anchored(obj/item/W, mob/user)
if(!wrenchable)
- to_chat(user, SPAN_WARNING("The [src] cannot be [anchored ? "un" : ""]anchored."))
+ to_chat(user, SPAN_WARNING("[src] cannot be [anchored ? "un" : ""]anchored."))
return FALSE
else
// Wrenching is faster if we are better at engineering
diff --git a/code/game/objects/structures/barricade/metal.dm b/code/game/objects/structures/barricade/metal.dm
index 4056ac9021f8..4f250eed50e9 100644
--- a/code/game/objects/structures/barricade/metal.dm
+++ b/code/game/objects/structures/barricade/metal.dm
@@ -110,7 +110,7 @@
to_chat(user, SPAN_NOTICE("You lack the required metal."))
return
if((usr.get_active_hand()) != metal)
- to_chat(user, SPAN_WARNING("You must be holding the [metal] to upgrade \the [src]!"))
+ to_chat(user, SPAN_WARNING("You must be holding [metal] to upgrade [src]!"))
return
switch(choice)
@@ -150,7 +150,7 @@
to_chat(user, SPAN_NOTICE("You lack the required metal."))
return
if((usr.get_active_hand()) != metal)
- to_chat(user, SPAN_WARNING("You must be holding the [metal] to upgrade \the [src]!"))
+ to_chat(user, SPAN_WARNING("You must be holding [metal] to upgrade [src]!"))
return
switch(choice)
diff --git a/code/game/objects/structures/barricade/plasteel.dm b/code/game/objects/structures/barricade/plasteel.dm
index 85057f9a0596..dd95aa3f1baf 100644
--- a/code/game/objects/structures/barricade/plasteel.dm
+++ b/code/game/objects/structures/barricade/plasteel.dm
@@ -125,7 +125,7 @@
user.visible_message(SPAN_NOTICE("[user] sets up [src] for linking."),
SPAN_NOTICE("You set up [src] for linking."))
else
- to_chat(user, SPAN_WARNING("The [src] has no linking points..."))
+ to_chat(user, SPAN_WARNING("[src] has no linking points..."))
return
linked = !linked
for(var/direction in GLOB.cardinals)
@@ -210,7 +210,7 @@
if(closed)
if(recentlyflipped)
- to_chat(user, SPAN_NOTICE("The [src] has been flipped too recently!"))
+ to_chat(user, SPAN_NOTICE("[src] has been flipped too recently!"))
return
user.visible_message(SPAN_NOTICE("[user] flips [src] open."),
SPAN_NOTICE("You flip [src] open."))
@@ -222,7 +222,7 @@
else
if(recentlyflipped)
- to_chat(user, SPAN_NOTICE("The [src] has been flipped too recently!"))
+ to_chat(user, SPAN_NOTICE("[src] has been flipped too recently!"))
return
user.visible_message(SPAN_NOTICE("[user] flips [src] closed."),
SPAN_NOTICE("You flip [src] closed."))
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index d6148b23b7f0..fa87cd6b2b71 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -158,10 +158,15 @@
/obj/structure/closet/proc/take_damage(damage)
+ if(health <= 0)
+ return
+
health = max(health - damage, 0)
if(health <= 0)
- for(var/atom/movable/A as anything in src)
- A.forceMove(src.loc)
+ for(var/atom/movable/movable as anything in src)
+ if(!loc)
+ break
+ movable.forceMove(loc)
playsound(loc, 'sound/effects/meteorimpact.ogg', 25, 1)
qdel(src)
@@ -195,7 +200,7 @@
/obj/structure/closet/attack_animal(mob/living/user)
if(user.wall_smash)
- visible_message(SPAN_DANGER("[user] destroys the [src]. "))
+ visible_message(SPAN_DANGER("[user] destroys [src]."))
for(var/atom/movable/A as mob|obj in src)
A.forceMove(src.loc)
qdel(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/kitchen.dm b/code/game/objects/structures/crates_lockers/closets/secure/kitchen.dm
new file mode 100644
index 000000000000..d8b0c984d4b1
--- /dev/null
+++ b/code/game/objects/structures/crates_lockers/closets/secure/kitchen.dm
@@ -0,0 +1,143 @@
+//standart fridge
+
+/obj/structure/closet/secure_closet/fridge
+ name = "Refrigerator"
+ icon = 'icons/obj/structures/machinery/kitchen.dmi'
+ icon_state = "fridge1"
+ icon_closed = "fridge"
+ icon_locked = "fridge1"
+ icon_opened = "fridgeopen"
+ icon_broken = "fridgebroken"
+ icon_off = "fridge1"
+ storage_capacity = 60 //give extra storage capacity so that everything can fit.
+
+/obj/structure/closet/secure_closet/fridge/update_icon()
+ if(broken)
+ icon_state = icon_broken
+ else
+ if(!opened)
+ if(locked)
+ icon_state = icon_locked
+ else
+ icon_state = icon_closed
+ else
+ icon_state = icon_opened
+
+// for almayer.
+
+// Kitchen preparation room small quantity out of boxes...
+
+//standart organic storage.
+
+/obj/structure/closet/secure_closet/fridge/organic
+ name = "Organic"
+
+/obj/structure/closet/secure_closet/fridge/organic/Initialize()
+ . = ..()
+ for(var/i in 1 to 2)
+ new /obj/item/reagent_container/food/snacks/grown/apple(src)
+ new /obj/item/reagent_container/food/snacks/grown/cabbage(src)
+ new /obj/item/reagent_container/food/snacks/grown/carrot(src)
+ new /obj/item/reagent_container/food/snacks/grown/mushroom/chanterelle(src)
+ new /obj/item/reagent_container/food/snacks/grown/chili(src)
+ new /obj/item/reagent_container/food/snacks/grown/corn(src)
+ new /obj/item/reagent_container/food/snacks/grown/eggplant(src)
+ new /obj/item/reagent_container/food/snacks/grown/potato(src)
+ new /obj/item/reagent_container/food/snacks/grown/tomato(src)
+ new /obj/item/reagent_container/food/snacks/grown/whitebeet(src)
+ new /obj/item/reagent_container/food/snacks/grown/cherries(src)
+ new /obj/item/reagent_container/food/snacks/grown/lime(src)
+ new /obj/item/reagent_container/food/snacks/grown/lemon(src)
+ new /obj/item/reagent_container/food/snacks/grown/orange(src)
+ new /obj/item/reagent_container/food/snacks/grown/banana(src)
+
+//DRy
+
+/obj/structure/closet/secure_closet/fridge/dry
+ name = "dry"
+
+/obj/structure/closet/secure_closet/fridge/dry/Initialize()
+ . = ..()
+ for(var/i in 1 to 6)
+ new /obj/item/reagent_container/food/snacks/flour(src)
+ for(var/i in 1 to 2)
+ new /obj/item/reagent_container/food/condiment/sugar(src)
+
+//grocery
+
+/obj/structure/closet/secure_closet/fridge/groceries
+ name = "Groceries"
+
+/obj/structure/closet/secure_closet/fridge/groceries/Initialize()
+ . = ..()
+ for(var/i in 1 to 2)
+ new /obj/item/reagent_container/food/drinks/milk(src)
+ new /obj/item/reagent_container/food/drinks/soymilk(src)
+ new /obj/item/storage/fancy/egg_box(src)
+ new /obj/item/reagent_container/food/condiment/enzyme(src)
+
+// Kitchen Reserve big quantity stored in boxes
+
+//meat surplus
+/obj/structure/closet/secure_closet/fridge/meat/stock
+ name = "meat"
+
+/obj/structure/closet/secure_closet/fridge/meat/stock/Initialize()
+ . = ..()
+ for(var/i in 1 to 2)
+ new /obj/item/storage/box/meat(src)
+
+//fish surplus
+/obj/structure/closet/secure_closet/fridge/fish/stock
+ name = "fish"
+
+/obj/structure/closet/secure_closet/fridge/fish/stock/Initialize()
+ . = ..()
+ for(var/i in 1 to 2)
+ new /obj/item/storage/box/fish(src)
+
+//groceries to hold milk in bulk
+/obj/structure/closet/secure_closet/fridge/groceries/stock
+ name = "Groceries"
+
+/obj/structure/closet/secure_closet/fridge/groceries/stock/Initialize()
+ . = ..()
+ for(var/i in 1 to 2)
+ new /obj/item/storage/box/milk(src)
+ new /obj/item/storage/box/soymilk(src)
+ for(var/i in 1 to 7)
+ new /obj/item/storage/fancy/egg_box(src)
+ new /obj/item/storage/box/enzyme(src)
+
+//dry storage for dry food only... not a fridge
+/obj/structure/closet/secure_closet/fridge/dry/stock
+ name = "dry"
+
+/obj/structure/closet/secure_closet/fridge/dry/stock/Initialize()
+ . = ..()
+ for(var/i in 1 to 4)
+ new /obj/item/storage/box/flour(src)
+ new /obj/item/storage/box/sugar(src)
+
+// organic storage in bulk
+
+/obj/structure/closet/secure_closet/fridge/organic/stock
+ name = "Organic"
+
+/obj/structure/closet/secure_closet/fridge/organic/stock/Initialize()
+ . = ..()
+ new /obj/item/storage/box/apple(src)
+ new /obj/item/storage/box/banana(src)
+ new /obj/item/storage/box/chanterelle(src)
+ new /obj/item/storage/box/cherries(src)
+ new /obj/item/storage/box/chili(src)
+ new /obj/item/storage/box/cabbage(src)
+ new /obj/item/storage/box/carrot(src)
+ new /obj/item/storage/box/corn(src)
+ new /obj/item/storage/box/eggplant(src)
+ new /obj/item/storage/box/lemon(src)
+ new /obj/item/storage/box/lime(src)
+ new /obj/item/storage/box/orange(src)
+ new /obj/item/storage/box/potato(src)
+ new /obj/item/storage/box/tomato(src)
+ new /obj/item/storage/box/whitebeet(src)
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index f1c9daa514c1..0e4a20cf989a 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -725,7 +725,7 @@ ICEY GRASS. IT LOOKS LIKE IT'S MADE OF ICE.
//this bush marks the edge of the map, you can't destroy it
to_chat(user, SPAN_DANGER("You flail away at the undergrowth, but it's too thick here."))
else
- user.visible_message(SPAN_DANGER("[user] flails away at the [src] with [I]."),SPAN_DANGER("You flail away at the [src] with [I]."))
+ user.visible_message(SPAN_DANGER("[user] flails away at [src] with [I]."), SPAN_DANGER("You flail away at [src] with [I]."))
playsound(src.loc, 'sound/effects/vegetation_hit.ogg', 25, 1)
health -= damage
if(health < 0)
@@ -758,4 +758,3 @@ ICEY GRASS. IT LOOKS LIKE IT'S MADE OF ICE.
desc = "Looks like some of that fruit might be edible."
icon_tag = "plant"
variations = 7
-
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 0f864ee2f116..063f6a337290 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -166,7 +166,7 @@
if (ST.use(1))
var/obj/structure/window/WD = new wtype(loc)
WD.set_constructed_window(dir_to_set)
- to_chat(user, SPAN_NOTICE("You place the [WD] on [src]."))
+ to_chat(user, SPAN_NOTICE("You place [WD] on [src]."))
return
//window placing end
diff --git a/code/game/objects/structures/props.dm b/code/game/objects/structures/props.dm
index 6e6f6d5f8247..e14eee13b1dd 100644
--- a/code/game/objects/structures/props.dm
+++ b/code/game/objects/structures/props.dm
@@ -1187,7 +1187,7 @@
var/obj/item/dogtag/dog = W
if(!tagged)
tagged = TRUE
- user.visible_message(SPAN_NOTICE("[user] drapes the [W] around the [src]."))
+ user.visible_message(SPAN_NOTICE("[user] drapes [W] around [src]."))
dogtag_name = popleft(dog.fallen_names)
dogtag_assign = popleft(dog.fallen_assgns)
dogtag_blood = popleft(dog.fallen_blood_types)
@@ -1198,7 +1198,7 @@
else
return
else
- to_chat(user, SPAN_WARNING("There's already a dog tag on the [src]!"))
+ to_chat(user, SPAN_WARNING("There's already a dog tag on [src]!"))
balloon_alert(user, "already a tag here!")
if(istype(W, /obj/item/clothing/head))
@@ -1372,4 +1372,3 @@
if(initial(emote.sound))
playsound(loc, initial(emote.sound), 50, FALSE)
return TRUE
-
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 60c37fcdc607..daf4a47a8ef6 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -151,7 +151,7 @@
GM.apply_damage(5, OXY)
swirlie = null
else
- user.visible_message(SPAN_DANGER("[user] slams [GM.name] into the [src]!"), SPAN_NOTICE("You slam [GM.name] into the [src]!"))
+ user.visible_message(SPAN_DANGER("[user] slams [GM.name] into [src]!"), SPAN_NOTICE("You slam [GM.name] into [src]!"))
GM.apply_damage(8, BRUTE)
else
to_chat(user, SPAN_NOTICE("You need a tighter grip."))
@@ -189,7 +189,7 @@
if(!GM.loc == get_turf(src))
to_chat(user, SPAN_NOTICE("[GM.name] needs to be on the urinal."))
return
- user.visible_message(SPAN_DANGER("[user] slams [GM.name] into the [src]!"), SPAN_NOTICE("You slam [GM.name] into the [src]!"))
+ user.visible_message(SPAN_DANGER("[user] slams [GM.name] into [src]!"), SPAN_NOTICE("You slam [GM.name] into [src]!"))
GM.apply_damage(8, BRUTE)
else
to_chat(user, SPAN_NOTICE("You need a tighter grip."))
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index e4e4923173bf..b689f7b33df3 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -9,6 +9,8 @@
#define KILL_MENDOZA -1
GLOBAL_LIST_EMPTY_TYPED(asrs_empty_space_tiles_list, /turf/open/floor/almayer/empty)
+GLOBAL_SUBTYPE_PATHS_LIST_INDEXED(supply_packs_types, /datum/supply_packs, name)
+GLOBAL_REFERENCE_LIST_INDEXED_SORTED(supply_packs_datums, /datum/supply_packs, type)
GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new())
@@ -367,10 +369,12 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new())
/datum/controller/supply
var/processing = 1
- var/processing_interval = 300
+ var/processing_interval = 30 SECONDS
var/iteration = 0
- //supply points
- var/points = 120
+ /// Current supply points
+ var/points = 0
+ /// Multiplier to the amount of points awarded based on marine scale
+ var/points_scale = 120
var/points_per_process = 1.5
var/points_per_slip = 1
var/points_per_crate = 2
@@ -389,15 +393,18 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new())
/// If the players killed him by sending a live hostile below.. this goes false and they can't order any more contraband.
var/mendoza_status = TRUE
- var/base_random_crate_interval = 10 //Every how many processing intervals do we get a random crates.
+ /// How many processing intervals do we get random crates for each pool. Currently only [ASRS_POOL_MAIN] gets scaled amount of crates.
+ var/list/base_random_crate_intervals = list(ASRS_POOL_MAIN = 10, ASRS_POOL_FOOD = 60)
+ /// How many partial crates are stored in ASRS per pool to smooth amount given out
+ var/list/random_crates_carry = list()
+ /// Pools mapped to list of random ASRS packs that belong to it
+ var/list/asrs_supply_packs_by_pool
var/crate_iteration = 0
//control
var/ordernum
var/list/shoppinglist = list()
var/list/requestlist = list()
- var/list/supply_packs = list()
- var/list/random_supply_packs = list()
//shuttle movement
var/datum/shuttle/ferry/supply/shuttle
@@ -436,72 +443,91 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new())
var/tank_points = 0
/datum/controller/supply/New()
+ . = ..()
ordernum = rand(1,9000)
LAZYINITLIST(black_market_sold_items)
+ asrs_supply_packs_by_pool = list()
+ for(var/subtype in subtypesof(/datum/supply_packs_asrs))
+ var/datum/supply_packs_asrs/initial_datum = subtype
+ var/pool = initial(initial_datum.pool)
+ if(!pool)
+ continue
+ LAZYADD(asrs_supply_packs_by_pool[pool], new subtype())
+ random_crates_carry = list()
+ for(var/pool in base_random_crate_intervals)
+ random_crates_carry[pool] = 0
+
+/datum/controller/supply/proc/start_processing()
+ START_PROCESSING(SSslowobj, src)
//Supply shuttle ticker - handles supply point regenertion and shuttle travelling between centcomm and the station
-/datum/controller/supply/process()
- for(var/typepath in subtypesof(/datum/supply_packs))
- var/datum/supply_packs/supply_pack = new typepath()
- if(supply_pack.group == "ASRS")
- random_supply_packs += supply_pack
- else
- supply_packs[supply_pack.name] = supply_pack
- spawn(0)
- set background = 1
- while(1)
- if(processing)
- iteration++
- points += points_per_process
- if(iteration >= 20 && iteration % base_random_crate_interval == 0 && GLOB.supply_controller.shoppinglist.len <= 20)
- add_random_crates()
- crate_iteration++
- sleep(processing_interval)
+/datum/controller/supply/process(delta_time)
+ iteration++
+ points += points_per_process
+ if(iteration < 20)
+ return
+ for(var/pool in base_random_crate_intervals)
+ var/interval = base_random_crate_intervals[pool]
+ if(interval && iteration % interval == 0 && shoppinglist.len <= 20)
+ add_random_crates(pool)
+ crate_iteration++
//This adds function adds the amount of crates that calculate_crate_amount returns
-/datum/controller/supply/proc/add_random_crates()
- for(var/I=0, I= 1)
+ var/additional_crates = round(total_carry)
+ random_crates_carry[pool] -= additional_crates
+ unit_crate_amount += additional_crates
+
+ return unit_crate_amount
//Here we pick what crate type to send to the marines.
//This is a weighted pick based upon their cost.
//Their cost will go up if the crate is picked
-/datum/controller/supply/proc/add_random_crate()
- var/datum/supply_packs/C = GLOB.supply_controller.pick_weighted_crate(random_supply_packs)
- if(C == null)
+/datum/controller/supply/proc/add_random_crate(pool)
+ if(!asrs_supply_packs_by_pool[pool])
+ return
+ var/datum/supply_packs_asrs/supply_info = pick_weighted_crate(asrs_supply_packs_by_pool[pool])
+ if(!GLOB.supply_packs_datums[supply_info.reference_package])
return
- C.cost = round(C.cost * ASRS_COST_MULTIPLIER) //We still do this to raise the weight
+
+ supply_info.cost = round(supply_info.cost * ASRS_COST_MULTIPLIER) //We still do this to raise the weight
//We have to create a supply order to make the system spawn it. Here we transform a crate into an order.
var/datum/supply_order/supply_order = new /datum/supply_order()
- supply_order.ordernum = GLOB.supply_controller.ordernum
- supply_order.object = C
+ supply_order.ordernum = ordernum++
+ supply_order.object = GLOB.supply_packs_datums[supply_info.reference_package]
supply_order.orderedby = "ASRS"
supply_order.approvedby = "ASRS"
//We add the order to the shopping list
- GLOB.supply_controller.shoppinglist += supply_order
+ shoppinglist += supply_order
//Here we weigh the crate based upon it's cost
-/datum/controller/supply/proc/pick_weighted_crate(list/cratelist)
- var/weighted_crate_list[]
- for(var/datum/supply_packs/crate in cratelist)
- var/crate_to_add[0]
+/datum/controller/supply/proc/pick_weighted_crate(list/datum/supply_packs_asrs/cratelist)
+ var/list/datum/supply_packs_asrs/weighted_crate_list = list()
+ for(var/datum/supply_packs_asrs/crate in cratelist)
var/weight = (round(10000/crate.cost))
- if(iteration > crate.iteration_needed)
- crate_to_add[crate] = weight
- weighted_crate_list += crate_to_add
+ weighted_crate_list[crate] = weight
return pickweight(weighted_crate_list)
//To stop things being sent to centcomm which should not be sent to centcomm. Recursively checks for these types.
@@ -590,8 +616,8 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new())
if(order.object.contraband == TRUE && prob(5))
// Mendoza loaded the wrong order in. What a dunce!
var/list/contraband_list
- for(var/supply_name in GLOB.supply_controller.supply_packs)
- var/datum/supply_packs/supply_pack = GLOB.supply_controller.supply_packs[supply_name]
+ for(var/supply_type in GLOB.supply_packs_datums)
+ var/datum/supply_packs/supply_pack = GLOB.supply_packs_datums[supply_type]
if(supply_pack.contraband == FALSE)
continue
LAZYADD(contraband_list, supply_pack)
@@ -745,10 +771,11 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new())
temp = "Supply budget: $[GLOB.supply_controller.points * SUPPLY_TO_MONEY_MUPLTIPLIER]
"
temp += "Back to all categories
"
temp += "Request from: [last_viewed_group]
"
- for(var/supply_name in GLOB.supply_controller.supply_packs )
- var/datum/supply_packs/N = GLOB.supply_controller.supply_packs[supply_name]
- if(N.contraband || N.group != last_viewed_group || !N.buyable) continue //Have to send the type instead of a reference to
- temp += "[supply_name] Cost: $[round(N.cost) * SUPPLY_TO_MONEY_MUPLTIPLIER]
" //the obj because it would get caught by the garbage
+ for(var/supply_type in GLOB.supply_packs_datums)
+ var/datum/supply_packs/supply_pack = GLOB.supply_packs_datums[supply_type]
+ if(supply_pack.contraband || supply_pack.group != last_viewed_group || !supply_pack.buyable)
+ continue //Have to send the type instead of a reference to
+ temp += "[supply_pack.name] Cost: $[round(supply_pack.cost) * SUPPLY_TO_MONEY_MUPLTIPLIER]
" //the obj because it would get caught by the garbage
else if (href_list["doorder"])
if(world.time < reqtime)
@@ -757,8 +784,10 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new())
return
//Find the correct supply_pack datum
- var/datum/supply_packs/supply_pack = GLOB.supply_controller.supply_packs[href_list["doorder"]]
- if(!istype(supply_pack)) return
+ var/supply_pack_type = GLOB.supply_packs_types[href_list["doorder"]]
+ if(!supply_pack_type)
+ return
+ var/datum/supply_packs/supply_pack = GLOB.supply_packs_datums[supply_pack_type]
if(supply_pack.contraband || !supply_pack.buyable)
return
@@ -944,11 +973,11 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new())
temp = "Supply budget: $[GLOB.supply_controller.points * SUPPLY_TO_MONEY_MUPLTIPLIER]
"
temp += "Back to all categories
"
temp += "Request from: [last_viewed_group]
"
- for(var/supply_name in GLOB.supply_controller.supply_packs )
- var/datum/supply_packs/supply_pack = GLOB.supply_controller.supply_packs[supply_name]
+ for(var/supply_type in GLOB.supply_packs_datums)
+ var/datum/supply_packs/supply_pack = GLOB.supply_packs_datums[supply_type]
if(!is_buyable(supply_pack))
continue
- temp += "[supply_name] Cost: $[round(supply_pack.cost) * SUPPLY_TO_MONEY_MUPLTIPLIER]
" //the obj because it would get caught by the garbage
+ temp += "[supply_pack.name] Cost: $[round(supply_pack.cost) * SUPPLY_TO_MONEY_MUPLTIPLIER]
" //the obj because it would get caught by the garbage
else if (href_list["doorder"])
if(world.time < reqtime)
@@ -957,7 +986,8 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new())
return
//Find the correct supply_pack datum
- var/datum/supply_packs/supply_pack = GLOB.supply_controller.supply_packs[href_list["doorder"]]
+ var/supply_pack_type = GLOB.supply_packs_types[href_list["doorder"]]
+ var/datum/supply_packs/supply_pack = GLOB.supply_packs_datums[supply_pack_type]
if(!istype(supply_pack))
return
@@ -1123,11 +1153,11 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new())
temp = "W-Y Dollars: $[GLOB.supply_controller.black_market_points]
"
temp += "Back to black market categories
"
temp += "Purchase from: [last_viewed_group]
"
- for(var/supply_name in GLOB.supply_controller.supply_packs )
- var/datum/supply_packs/supply_pack = GLOB.supply_controller.supply_packs[supply_name]
+ for(var/supply_type in GLOB.supply_packs_datums)
+ var/datum/supply_packs/supply_pack = GLOB.supply_packs_datums[supply_type]
if(!is_buyable(supply_pack))
continue
- temp += "[supply_name] Cost: $[round(supply_pack.dollar_cost)]
"
+ temp += "[supply_pack.name] Cost: $[round(supply_pack.dollar_cost)]
"
/obj/structure/machinery/computer/supplycomp/proc/handle_mendoza_dialogue()
diff --git a/code/game/turfs/auto_turf.dm b/code/game/turfs/auto_turf.dm
index 75501a1a7ecd..e07f7324bcc2 100644
--- a/code/game/turfs/auto_turf.dm
+++ b/code/game/turfs/auto_turf.dm
@@ -169,7 +169,7 @@
if(istype(I, /obj/item/lightstick))
var/obj/item/lightstick/L = I
if(locate(/obj/item/lightstick) in get_turf(src))
- to_chat(user, "There's already a [L] at this position!")
+ to_chat(user, "There's already \a [L] at this position!")
return
to_chat(user, "Now planting \the [L].")
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index 72624aff99c8..7d9dd6303c64 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -292,7 +292,7 @@
if(istype(I, /obj/item/lightstick))
var/obj/item/lightstick/L = I
if(locate(/obj/item/lightstick) in get_turf(src))
- to_chat(user, "There's already a [L] at this position!")
+ to_chat(user, "There's already \a [L] at this position!")
return
to_chat(user, "Now planting \the [L].")
@@ -787,7 +787,7 @@
if(istype(I, /obj/item/lightstick))
var/obj/item/lightstick/L = I
if(locate(/obj/item/lightstick) in get_turf(src))
- to_chat(user, "There's already a [L] at this position!")
+ to_chat(user, "There's already \a [L] at this position!")
return
to_chat(user, "Now planting \the [L].")
diff --git a/code/game/turfs/snow.dm b/code/game/turfs/snow.dm
index 42cc9bd544c5..f7fb746cfbbc 100644
--- a/code/game/turfs/snow.dm
+++ b/code/game/turfs/snow.dm
@@ -16,7 +16,7 @@
if(istype(I, /obj/item/lightstick))
var/obj/item/lightstick/L = I
if(locate(/obj/item/lightstick) in get_turf(src))
- to_chat(user, "There's already a [L] at this position!")
+ to_chat(user, "There's already \a [L] at this position!")
return
to_chat(user, "Now planting \the [L].")
@@ -148,6 +148,3 @@
/turf/open/snow/layer3
icon_state = "snow_3"
bleed_layer = 3
-
-
-
diff --git a/code/game/turfs/walls/walls.dm b/code/game/turfs/walls/walls.dm
index 437f203c5fbb..6ef0ffbdfec8 100644
--- a/code/game/turfs/walls/walls.dm
+++ b/code/game/turfs/walls/walls.dm
@@ -88,7 +88,7 @@
if(istype(found_object, /obj/structure/sign/poster))
var/obj/structure/sign/poster/found_poster = found_object
found_poster.roll_and_drop(src)
- if(istype(found_object, /obj/effect/alien/weeds))
+ if(istype(found_object, /obj/effect/alien/weeds/weedwall))
qdel(found_object)
var/list/turf/cardinal_neighbors = list(get_step(src, NORTH), get_step(src, SOUTH), get_step(src, EAST), get_step(src, WEST))
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index 45590c3fa006..9cad56cdabe8 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -182,7 +182,7 @@
for(var/category in listings)
dat += "
Current [category] ([length(listings[category])]):
\n"
for(var/client/entry in listings[category])
- dat += "\t[entry.key] is a [entry.admin_holder.rank]"
+ dat += "\t[entry.key] is \a [entry.admin_holder.rank]"
if(entry.admin_holder.extra_titles?.len)
for(var/srank in entry.admin_holder.extra_titles)
dat += " & [srank]"
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 9833505ee346..07d7d4e89623 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -36,6 +36,7 @@ GLOBAL_LIST_INIT(admin_verbs_default, list(
/client/proc/togglenichelogs,
/datum/admins/proc/display_tags,
/datum/admins/proc/player_notes_show,
+ /datum/admins/proc/check_ckey,
/datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/
/datum/admins/proc/togglelooc, /*toggles ooc on/off for everyone*/
/datum/admins/proc/toggledsay, /*toggles dsay on/off for everyone*/
diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm
index 9ac4c5f807ea..910bafd50a9b 100644
--- a/code/modules/admin/create_mob.dm
+++ b/code/modules/admin/create_mob.dm
@@ -8,4 +8,4 @@
create_mob_html = replacetext(create_mob_html, "null /* object types */", "\"[mobjs]\"")
create_mob_html = replacetext(create_mob_html, "/* href token */", RawHrefToken(forceGlobal = TRUE))
- show_browser(user, replacetext(create_mob_html, "/* ref src */", "\ref[src]"), "Create Mob", "create_mob", "size=425x475")
+ show_browser(user, replacetext(create_mob_html, "/* ref src */", "\ref[src]"), "Create Mob", "create_mob", "size=450x525")
diff --git a/code/modules/admin/create_object.dm b/code/modules/admin/create_object.dm
index 3b1f978dd50a..054fc20aef5e 100644
--- a/code/modules/admin/create_object.dm
+++ b/code/modules/admin/create_object.dm
@@ -8,7 +8,7 @@
create_object_html = replacetext(create_object_html, "null /* object types */", "\"[objectjs]\"")
create_object_html = replacetext(create_object_html, "/* href token */", RawHrefToken(forceGlobal = TRUE))
- show_browser(user, replacetext(create_object_html, "/* ref src */", "\ref[src]"), "Create Object", "create_object", "size=425x475")
+ show_browser(user, replacetext(create_object_html, "/* ref src */", "\ref[src]"), "Create Object", "create_object", "size=450x525")
/datum/admins/proc/quick_create_object(mob/user)
@@ -46,4 +46,4 @@
quick_create_object_html = replacetext(quick_create_object_html, "null /* object types */", "\"[objectjs]\"")
quick_create_object_html = replacetext(quick_create_object_html, "/* href token */", RawHrefToken(forceGlobal = TRUE))
- show_browser(user, replacetext(quick_create_object_html, "/* ref src */", "\ref[src]"), "Quick Create Object", "quick_create_object", "size=425x475")
+ show_browser(user, replacetext(quick_create_object_html, "/* ref src */", "\ref[src]"), "Quick Create Object", "quick_create_object", "size=450x525")
diff --git a/code/modules/admin/create_turf.dm b/code/modules/admin/create_turf.dm
index 1535c303bcd9..cc8bd1a5ec77 100644
--- a/code/modules/admin/create_turf.dm
+++ b/code/modules/admin/create_turf.dm
@@ -8,4 +8,4 @@
create_turf_html = replacetext(create_turf_html, "null /* object types */", "\"[turfjs]\"")
create_turf_html = replacetext(create_turf_html, "/* href token */", RawHrefToken(forceGlobal = TRUE))
- show_browser(usr, replacetext(create_turf_html, "/* ref src */", "\ref[src]"), "Create Turf", "create_turf", "size=425x475")
+ show_browser(usr, replacetext(create_turf_html, "/* ref src */", "\ref[src]"), "Create Turf", "create_turf", "size=450x525")
diff --git a/code/modules/admin/player_panel/actions/physical.dm b/code/modules/admin/player_panel/actions/physical.dm
index eb43fe5d2aa8..21e6fed4f825 100644
--- a/code/modules/admin/player_panel/actions/physical.dm
+++ b/code/modules/admin/player_panel/actions/physical.dm
@@ -70,6 +70,7 @@
/datum/player_action/cryo_human/act(client/user, mob/target, list/params)
+ var/datum/job/job = GET_MAPPED_ROLE(target.job)
if(ishuman(target))
var/mob/living/carbon/human/H = target
if(H.assigned_squad)
@@ -95,7 +96,8 @@
S.forget_marine_in_squad(H)
message_admins("[key_name_admin(user)] sent [key_name_admin(target)] ([H.job]) to cryogenics.")
- SSticker.mode.latejoin_tally-- //Cryoing someone out removes someone from the Marines, blocking further larva spawns until accounted for
+ //Cryoing someone out removes someone from the Marines, blocking further larva spawns until accounted for
+ SSticker.mode.latejoin_update(job, -1)
//Handle job slot/tater cleanup.
GLOB.RoleAuthority.free_role(GLOB.RoleAuthority.roles_for_mode[target.job], TRUE)
diff --git a/code/modules/admin/tabs/admin_tab.dm b/code/modules/admin/tabs/admin_tab.dm
index cc927a62d3b0..8dce41ac8235 100644
--- a/code/modules/admin/tabs/admin_tab.dm
+++ b/code/modules/admin/tabs/admin_tab.dm
@@ -185,6 +185,29 @@
dat += "