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/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/chat.dm b/code/__HELPERS/chat.dm index f7382e151854..20d1a45b31cc 100644 --- a/code/__HELPERS/chat.dm +++ b/code/__HELPERS/chat.dm @@ -1,11 +1,12 @@ /** - * Sends a message to TGS chat channels. + * Asynchronously sends a message to TGS chat channels. * - * message - The message to send. + * message - The [/datum/tgs_message_content] to send. * channel_tag - Required. If "", the message with be sent to all connected (Game-type for TGS3) channels. Otherwise, it will be sent to TGS4 channels with that tag (Delimited by ','s). * admin_only - Determines if this communication can only be sent to admin only channels. */ -/proc/send2chat(message, channel_tag, admin_only = FALSE) +/proc/send2chat(datum/tgs_message_content/message, channel_tag, admin_only = FALSE) + set waitfor = FALSE if(channel_tag == null || !world.TgsAvailable()) return 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/interior.dm b/code/controllers/subsystem/interior.dm index 8fb7ffbfeee7..8abc3179f191 100644 --- a/code/controllers/subsystem/interior.dm +++ b/code/controllers/subsystem/interior.dm @@ -51,10 +51,16 @@ SUBSYSTEM_DEF(interior) if(!isturf(loc)) loc = get_turf(loc) - var/datum/weakref/reservation = SSmapping.used_turfs[loc] + var/datum/weakref/reservation_weakref = SSmapping.used_turfs[loc] + + if(!reservation_weakref) + return + + var/datum/turf_reservation/interior/reservation = reservation_weakref.resolve() if(!istype(reservation)) return FALSE + return TRUE #undef INTERIOR_BORDER_SIZE diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 913e5dcd50d3..0f4a63ff65e8 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -61,6 +61,11 @@ SUBSYSTEM_DEF(mapping) if(MC.perf_mode) GLOB.perf_flags |= MC.perf_mode + if(configs[GROUND_MAP]) + send2chat(new /datum/tgs_message_content("<@&[CONFIG_GET(string/new_round_alert_role_id)]> Round restarted! Map is [configs[GROUND_MAP].map_name]"), CONFIG_GET(string/new_round_alert_channel)) + else + send2chat(new /datum/tgs_message_content("<@&[CONFIG_GET(string/new_round_alert_role_id)]> Round started!"), CONFIG_GET(string/new_round_alert_channel)) + return SS_INIT_SUCCESS /datum/controller/subsystem/mapping/proc/wipe_reservations(wipe_safety_delay = 100) 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..4b4468c08429 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -99,7 +99,7 @@ SUBSYSTEM_DEF(ticker) current_state = GAME_STATE_FINISHED GLOB.ooc_allowed = TRUE mode.declare_completion(force_ending) - REDIS_PUBLISH("byond.round", "type" = "round-complete") + REDIS_PUBLISH("byond.round", "type" = "round-complete", "round_name" = GLOB.round_statistics.round_name) flash_clients() addtimer(CALLBACK( SSvote, @@ -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 73b0f4e1c6a9..57eff892fa58 100644 --- a/code/datums/ASRS.dm +++ b/code/datums/ASRS.dm @@ -2,138 +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 -/datum/supply_packs/ingredient/asrs - buyable = 0 - group = "ASRS" - cost = ASRS_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/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/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 8deadbeba32e..37131451ca07 100644 --- a/code/game/jobs/role_authority.dm +++ b/code/game/jobs/role_authority.dm @@ -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 c8a11711cb9a..2abdf971d724 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -176,3 +176,23 @@ if(!density) return open() + +//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..0e5f8142c2be 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.")) @@ -356,6 +356,11 @@ else . += SPAN_INFO("There is no fuel cell in the receptacle.") +/obj/structure/machinery/power/fusion_engine/ex_act(severity) + if(overloaded && severity >= EXPLOSION_THRESHOLD_MLOW) + set_overloading(FALSE) + return + /obj/structure/machinery/power/fusion_engine/update_icon() switch(buildstate) if(0) 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/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 505ef81a1277..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 @@ -80,11 +81,11 @@ 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), @@ -107,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), @@ -136,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), @@ -215,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 @@ -226,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), @@ -261,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 @@ -309,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 @@ -319,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/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/backpack.dm b/code/game/objects/items/storage/backpack.dm index 5b77b9149a53..412dcf164cd4 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -17,6 +17,7 @@ /obj/item/storage/firstaid = list(SKILL_MEDICAL, SKILL_MEDICAL_MEDIC), /obj/item/storage/toolkit = list(SKILL_ENGINEER, SKILL_ENGINEER_ENGI), ) + drop_sound = "armorequip" var/worn_accessible = FALSE //whether you can access its content while worn on the back var/obj/item/card/id/locking_id = null var/is_id_lockable = FALSE 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 2efd8e4e81e9..fa87cd6b2b71 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -200,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/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/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index df6bb5c69ecc..736427606683 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -276,8 +276,8 @@ if(user.grab_level > GRAB_AGGRESSIVE) if (prob(15)) M.apply_effect(5, WEAKEN) M.apply_damage(8, def_zone = "head") - user.visible_message(SPAN_DANGER("[user] slams [M]'s face against [src]!"), - SPAN_DANGER("You slam [M]'s face against [src]!")) + user.visible_message(SPAN_DANGER("[user] slams [M]'s face against [src]!"), + SPAN_DANGER("You slam [M]'s face against [src]!")) playsound(src.loc, 'sound/weapons/tablehit1.ogg', 25, 1) else to_chat(user, SPAN_WARNING("You need a better grip to do that!")) @@ -285,8 +285,9 @@ else if(user.grab_level >= GRAB_AGGRESSIVE) M.forceMove(loc) M.apply_effect(5, WEAKEN) - user.visible_message(SPAN_DANGER("[user] throws [M] on [src]."), - SPAN_DANGER("You throw [M] on [src].")) + playsound(loc, 'sound/weapons/thudswoosh.ogg', 25, 1, 7) + user.visible_message(SPAN_DANGER("[user] throws [M] on [src], stunning them!"), + SPAN_DANGER("You throw [M] on [src], stunning them!")) return if(HAS_TRAIT(W, TRAIT_TOOL_WRENCH) && !(user.a_intent == INTENT_HELP)) 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..77143384e7e7 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)) @@ -170,6 +170,9 @@ if (acided_hole) . += SPAN_WARNING("There's a large hole in the wall that could've been caused by some sort of acid.") + if(flags_turf & TURF_ORGANIC) + return // Skip the part below. 'Organic' walls aren't deconstructable with tools. + switch(d_state) if(WALL_STATE_WELD) . += SPAN_INFO("The outer plating is intact. A blowtorch should slice it open.") 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/game/world.dm b/code/game/world.dm index d8156547ef76..f68263412715 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -247,16 +247,13 @@ GLOBAL_LIST_INIT(reboot_sfx, file2list("config/reboot_sfx.txt")) shutdown() /world/proc/send_tgs_restart() - if(CONFIG_GET(string/new_round_alert_channel) && CONFIG_GET(string/new_round_alert_role_id)) - if(GLOB.round_statistics) - send2chat("[GLOB.round_statistics.round_name][GLOB.round_id ? " (Round [GLOB.round_id])" : ""] completed!", CONFIG_GET(string/new_round_alert_channel)) - if(SSmapping.next_map_configs) - var/datum/map_config/next_map = SSmapping.next_map_configs[GROUND_MAP] - if(next_map) - send2chat("<@&[CONFIG_GET(string/new_round_alert_role_id)]> Restarting! Next map is [next_map.map_name]", CONFIG_GET(string/new_round_alert_channel)) - else - send2chat("<@&[CONFIG_GET(string/new_round_alert_role_id)]> Restarting!", CONFIG_GET(string/new_round_alert_channel)) - return + if(!CONFIG_GET(string/new_round_alert_channel)) + return + + if(!GLOB.round_statistics) + return + + send2chat(new /datum/tgs_message_content("[GLOB.round_statistics.round_name][GLOB.round_id ? " (Round [GLOB.round_id])" : ""] completed!"), CONFIG_GET(string/new_round_alert_channel)) /world/proc/send_reboot_sound() var/reboot_sound = SAFEPICK(GLOB.reboot_sfx) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 9833505ee346..71491cd7d6f9 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*/ @@ -234,7 +235,6 @@ GLOBAL_LIST_INIT(debug_verbs, list( /client/proc/view_power_update_stats_area, /client/proc/view_power_update_stats_machines, /client/proc/toggle_power_update_profiling, - /client/proc/nanomapgen_DumpImage, )) GLOBAL_LIST_INIT(admin_verbs_possess, list( diff --git a/code/modules/admin/chat_commands.dm b/code/modules/admin/chat_commands.dm index 37ffcd114e91..c5036e7ca1f7 100644 --- a/code/modules/admin/chat_commands.dm +++ b/code/modules/admin/chat_commands.dm @@ -8,7 +8,7 @@ /datum/tgs_chat_command/sdql/Run(datum/tgs_chat_user/sender, params) var/list/results = HandleUserlessSDQL(sender.friendly_name, params) if(!results) - return "Query produced no output" + return new /datum/tgs_message_content("Query produced no output") var/list/text_res = results.Copy(1, 3) var/list/refs = length(results) > 3 ? results.Copy(4) : null - return "[text_res.Join("\n")][refs ? "\nRefs: [refs.Join(" ")]" : ""]" + return new /datum/tgs_message_content("[text_res.Join("\n")][refs ? "\nRefs: [refs.Join(" ")]" : ""]") 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 += "" show_browser(usr, dat, "Admin record for [key]", "adminplayerinfo", "size=480x480") +/datum/admins/proc/check_ckey(target_key as text) + set name = "Check CKey" + set category = "Admin" + + var/mob/user = usr + if (!istype(src, /datum/admins)) + src = user.client.admin_holder + if (!istype(src, /datum/admins) || !(rights & R_MOD)) + to_chat(user, "Error: you are not an admin!") + return + target_key = ckey(target_key) + if(!target_key) + to_chat(user, "Error: No key detected!") + return + to_chat(user, SPAN_WARNING("Checking Ckey: [target_key]")) + var/list/keys = analyze_ckey(target_key) + if(!keys) + to_chat(user, SPAN_WARNING("No results for [target_key].")) + return + to_chat(user, SPAN_WARNING("Check CKey Results: [keys.Join(", ")]")) + + log_admin("[key_name(user)] analyzed ckey '[target_key]'") + /datum/admins/proc/sleepall() set name = "Sleep All" set category = "Admin.InView" diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm index 7a6359ccf090..830717ef91b9 100644 --- a/code/modules/admin/tabs/event_tab.dm +++ b/code/modules/admin/tabs/event_tab.dm @@ -217,18 +217,15 @@ if(!istype(chosen_ert)) return - - var/launch_broadcast = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) - if(launch_broadcast == "Yes") - launch_broadcast = TRUE - else - launch_broadcast = FALSE - - var/announce_receipt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) - if(announce_receipt == "Yes") + var/quiet_launch = TRUE + var/ql_prompt = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) + if(ql_prompt == "Yes") + quiet_launch = FALSE + + var/announce_receipt = FALSE + var/ar_prompt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) + if(ar_prompt == "Yes") announce_receipt = TRUE - else - announce_receipt = FALSE var/turf/override_spawn_loc var/prompt = tgui_alert(usr, "Spawn at their assigned spawn, or at your location?", "Spawnpoint Selection", list("Spawn", "Current Location"), 0) @@ -238,7 +235,7 @@ if(prompt == "Current Location") override_spawn_loc = get_turf(usr) - chosen_ert.activate(quiet_launch = launch_broadcast, announce_incoming = announce_receipt, override_spawn_loc = override_spawn_loc) + chosen_ert.activate(quiet_launch, announce_receipt, override_spawn_loc) message_admins("[key_name_admin(usr)] admin-called a [choice == "Randomize" ? "randomized ":""]distress beacon: [chosen_ert.name]") @@ -424,25 +421,26 @@ /client/proc/give_nuke() if(!check_rights(R_ADMIN)) return - var/nuketype = "Decrypted Operational Nuke" + var/nukename = "Decrypted Operational Nuke" var/encrypt = tgui_alert(src, "Do you want the nuke to be already decrypted?", "Nuke Type", list("Encrypted", "Decrypted"), 20 SECONDS) if(encrypt == "Encrypted") - nuketype = "Encrypted Operational Nuke" + nukename = "Encrypted Operational Nuke" var/prompt = tgui_alert(src, "THIS CAN BE USED TO END THE ROUND. Are you sure you want to spawn a nuke? The nuke will be put onto the ASRS Lift.", "DEFCON 1", list("No", "Yes"), 30 SECONDS) if(prompt != "Yes") return + var/nuketype = GLOB.supply_packs_types[nukename] + var/datum/supply_order/new_order = new() - new_order.ordernum = GLOB.supply_controller.ordernum - GLOB.supply_controller.ordernum++ - new_order.object = GLOB.supply_controller.supply_packs[nuketype] + new_order.ordernum = GLOB.supply_controller.ordernum++ + new_order.object = GLOB.supply_packs_datums[nuketype] new_order.orderedby = MAIN_AI_SYSTEM new_order.approvedby = MAIN_AI_SYSTEM GLOB.supply_controller.shoppinglist += new_order marine_announcement("A nuclear device has been supplied and will be delivered to requisitions via ASRS.", "NUCLEAR ARSENAL ACQUIRED", 'sound/misc/notice2.ogg') - message_admins("[key_name_admin(usr)] admin-spawned a [encrypt] nuke.") - log_game("[key_name_admin(usr)] admin-spawned a [encrypt] nuke.") + message_admins("[key_name_admin(usr)] admin-spawned \a [encrypt] nuke.") + log_game("[key_name_admin(usr)] admin-spawned \a [encrypt] nuke.") /client/proc/turn_everyone_into_primitives() var/random_names = FALSE @@ -524,7 +522,7 @@ else marine_announcement(input, customname, 'sound/AI/commandreport.ogg', faction) - message_admins("[key_name_admin(src)] has created a [faction] command report") + message_admins("[key_name_admin(src)] has created \a [faction] command report") log_admin("[key_name_admin(src)] [faction] command report: [input]") /client/proc/cmd_admin_xeno_report() diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index a0e9e8b787aa..fa814ca16b7c 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -590,7 +590,7 @@ var/mob/M = locate(href_list["forcespeech"]) if(!ismob(M)) - to_chat(usr, "this can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob") return var/speech = input("What will [key_name(M)] say?.", "Force speech", "")// Don't need to sanitize, since it does that in say(), we also trust our admins. @@ -603,7 +603,7 @@ if(!check_rights(R_ADMIN)) return var/mob/living/carbon/human/H = locate(href_list["zombieinfect"]) if(!istype(H)) - to_chat(usr, "this can only be used on instances of type /human") + to_chat(usr, "This can only be used on instances of type /human") return if(alert(usr, "Are you sure you want to infect them with a ZOMBIE VIRUS? This can trigger a major event!", "Message", "Yes", "No") != "Yes") @@ -622,7 +622,7 @@ if(!check_rights(R_ADMIN)) return var/mob/living/carbon/human/H = locate(href_list["larvainfect"]) if(!istype(H)) - to_chat(usr, "this can only be used on instances of type /human") + to_chat(usr, "This can only be used on instances of type /human") return if(alert(usr, "Are you sure you want to infect them with a xeno larva?", "Message", "Yes", "No") != "Yes") @@ -704,7 +704,7 @@ var/mob/M = locate(href_list["forceemote"]) if(!ismob(M)) - to_chat(usr, "this can only be used on instances of type /mob") + to_chat(usr, "This can only be used on instances of type /mob") var/speech = input("What will [key_name(M)] emote?.", "Force emote", "")// Don't need to sanitize, since it does that in say(), we also trust our admins. if(!speech) return @@ -1782,19 +1782,19 @@ var/mob/ref_person = locate(href_list["nukeapprove"]) if(!istype(ref_person)) return FALSE - var/nuketype = "Encrypted Operational Nuke" + var/nukename = "Encrypted Operational Nuke" var/prompt = tgui_alert(usr, "Do you want the nuke to be Encrypted?", "Nuke Type", list("Encrypted", "Decrypted"), 20 SECONDS) if(prompt == "Decrypted") - nuketype = "Decrypted Operational Nuke" - prompt = tgui_alert(usr, "Are you sure you want to authorize a [nuketype] to the marines? This will greatly affect the round!", "DEFCON 1", list("No", "Yes")) + nukename = "Decrypted Operational Nuke" + prompt = tgui_alert(usr, "Are you sure you want to authorize '[nukename]' to the marines? This will greatly affect the round!", "DEFCON 1", list("No", "Yes")) if(prompt != "Yes") return + var/nuketype = GLOB.supply_packs_types[nukename] //make ASRS order for nuke var/datum/supply_order/new_order = new() - new_order.ordernum = GLOB.supply_controller.ordernum - GLOB.supply_controller.ordernum++ - new_order.object = GLOB.supply_controller.supply_packs[nuketype] + new_order.ordernum = GLOB.supply_controller.ordernum++ + new_order.object = GLOB.supply_packs_datums[nuketype] new_order.orderedby = ref_person new_order.approvedby = "USCM High Command" GLOB.supply_controller.shoppinglist += new_order @@ -1803,8 +1803,8 @@ GLOB.ares_datacore.nuke_available = FALSE marine_announcement("A nuclear device has been authorized by High Command and will be delivered to requisitions via ASRS.", "NUCLEAR ORDNANCE AUTHORIZED", 'sound/misc/notice2.ogg', logging = ARES_LOG_MAIN) - log_game("[key_name_admin(usr)] has authorized a [nuketype], requested by [key_name_admin(ref_person)]") - message_admins("[key_name_admin(usr)] has authorized a [nuketype], requested by [key_name_admin(ref_person)]") + log_game("[key_name_admin(usr)] has authorized \a [nuketype], requested by [key_name_admin(ref_person)]") + message_admins("[key_name_admin(usr)] has authorized \a [nuketype], requested by [key_name_admin(ref_person)]") if(href_list["nukedeny"]) var/mob/ref_person = locate(href_list["nukedeny"]) diff --git a/code/modules/admin/topic/topic_events.dm b/code/modules/admin/topic/topic_events.dm index 5e59ba4835f5..0c37e81f2641 100644 --- a/code/modules/admin/topic/topic_events.dm +++ b/code/modules/admin/topic/topic_events.dm @@ -205,20 +205,17 @@ em_call.mob_max = humans.len em_call.players_to_offer = humans em_call.owner = owner - - var/launch_broadcast = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) - if(launch_broadcast == "Yes") - launch_broadcast = TRUE - else - launch_broadcast = FALSE - - var/announce_receipt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) - if(announce_receipt == "Yes") + var/quiet_launch = TRUE + var/ql_prompt = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) + if(ql_prompt == "Yes") + quiet_launch = FALSE + + var/announce_receipt = FALSE + var/ar_prompt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) + if(ar_prompt == "Yes") announce_receipt = TRUE - else - announce_receipt = FALSE - - em_call.activate(launch_broadcast, announce_receipt) + log_debug("ERT DEBUG (CUSTOM SET): [quiet_launch] - [announce_receipt]") + em_call.activate(quiet_launch, announce_receipt) message_admins("[key_name_admin(usr)] created [humans_to_spawn] humans as [job_name] at [get_area(initial_spot)]") diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index e0210e4577a0..66ed690a0e80 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -17,13 +17,14 @@ liaison = 1 if(liaison) - msg = SPAN_STAFF_IC("LIAISON: [key_name(src, 1)] [CC_MARK(src)] [ADMIN_PP(src)] [ADMIN_VV(src)] [ADMIN_SM(src)] [ADMIN_JMP_USER(src)] [ADMIN_SC(src)]: [msg]") + msg = "[SPAN_STAFF_IC("LIAISON:")][key_name(src, 1)] [CC_MARK(src)] [ADMIN_PP(src)] [ADMIN_VV(src)] [ADMIN_SM(src)] [ADMIN_JMP_USER(src)] [ADMIN_SC(src)]: [msg]" else - msg = SPAN_STAFF_IC("PRAY: [key_name(src, 1)] [CC_MARK(src)] [ADMIN_PP(src)] [ADMIN_VV(src)] [ADMIN_SM(src)] [ADMIN_JMP_USER(src)] [ADMIN_SC(src)]: [msg]") + msg = "[SPAN_STAFF_IC("PRAY: ")][key_name(src, 1)] [CC_MARK(src)] [ADMIN_PP(src)] [ADMIN_VV(src)] [ADMIN_SM(src)] [ADMIN_JMP_USER(src)] [ADMIN_SC(src)]: [msg]" log_admin(msg) for(var/client/C in GLOB.admins) if(AHOLD_IS_MOD(C.admin_holder) && C.prefs.toggles_chat & CHAT_PRAYER) to_chat(C, msg) + C << 'sound/machines/terminal_alert.ogg' if(liaison) to_chat(usr, "Your corporate overlords at Weyland-Yutani have received your message.") else @@ -31,7 +32,7 @@ /proc/high_command_announce(text , mob/Sender , iamessage) var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN) - msg = "[SPAN_STAFF_IC("USCM[iamessage ? "IA" : ""]:")][key_name(Sender, 1)] [CC_MARK(Sender)] [ADMIN_PP(Sender)] [ADMIN_VV(Sender)] [ADMIN_SM(Sender)] [ADMIN_JMP_USER(Sender)] [CC_REPLY(Sender)]: [msg]" + msg = "[SPAN_STAFF_IC("USCM[iamessage ? "IA" : ""]:")][key_name(Sender, 1)] [CC_MARK(Sender)] [ADMIN_PP(Sender)] [ADMIN_VV(Sender)] [ADMIN_SM(Sender)] [ADMIN_JMP_USER(Sender)] [CC_REPLY(Sender)]: [msg]" log_admin(msg) for(var/client/C in GLOB.admins) if((R_ADMIN|R_MOD) & C.admin_holder.rights) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index e1dbd1f026c1..171cade3ed4e 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -795,3 +795,50 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( xeno_prefix = "XX" if(!xeno_postfix || xeno_name_ban) xeno_postfix = "" + +/// playtime for all castes +/client/proc/get_total_xeno_playtime(skip_cache = FALSE) + if(cached_xeno_playtime && !skip_cache) + return cached_xeno_playtime + + var/total_xeno_playtime = 0 + + for(var/caste in GLOB.RoleAuthority.castes_by_name) + total_xeno_playtime += get_job_playtime(src, caste) + + total_xeno_playtime += get_job_playtime(src, JOB_XENOMORPH) + + if(player_entity) + var/past_xeno_playtime = player_entity.get_playtime(STATISTIC_XENO) + if(past_xeno_playtime) + total_xeno_playtime += past_xeno_playtime + + + cached_xeno_playtime = total_xeno_playtime + + return total_xeno_playtime + +/// playtime for drone and drone evolution castes +/client/proc/get_total_drone_playtime() + var/total_drone_playtime = 0 + + var/list/drone_evo_castes = list(XENO_CASTE_DRONE, XENO_CASTE_CARRIER, XENO_CASTE_BURROWER, XENO_CASTE_HIVELORD, XENO_CASTE_QUEEN) + + for(var/caste in GLOB.RoleAuthority.castes_by_name) + if(!(caste in drone_evo_castes)) + continue + total_drone_playtime += get_job_playtime(src, caste) + + return total_drone_playtime + +/// playtime for t3 castes and queen +/client/proc/get_total_t3_playtime() + var/total_t3_playtime = 0 + var/datum/caste_datum/caste + for(var/caste_name in GLOB.RoleAuthority.castes_by_name) + caste = GLOB.RoleAuthority.castes_by_name[caste_name] + if(caste.tier < 3) + continue + total_t3_playtime += get_job_playtime(src, caste_name) + + return total_t3_playtime diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 8a46e60956db..a71f7dbcb3e9 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -161,14 +161,14 @@ GLOBAL_LIST_EMPTY(gear_datums_by_name) display_name = "USCM balaclava, tan" path = /obj/item/clothing/mask/rebreather/scarf/tan -/datum/gear/skull_balaclava_blue - display_name = "Blue Skull Balaclava" +/datum/gear/mask/uscm/skull_balaclava_blue + display_name = "USCM balaclava, blue skull" path = /obj/item/clothing/mask/rebreather/skull cost = 4 //same as skull facepaint slot = WEAR_FACE -/datum/gear/skull_balaclava_black - display_name = "Black Skull Balaclava" +/datum/gear/mask/uscm/skull_balaclava_black + display_name = "USCM balaclava, black skull" path = /obj/item/clothing/mask/rebreather/skull/black cost = 4 slot = WEAR_FACE @@ -888,8 +888,8 @@ GLOBAL_LIST_EMPTY(gear_datums_by_name) display_name = "Facepaint, black" path = /obj/item/facepaint/black -/datum/gear/skullfacepaint - display_name = "Skull Facepaint" +/datum/gear/misc/facepaint_skull + display_name = "Facepaint, skull" path = /obj/item/facepaint/skull cost = 3 diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index e80e5bd8c5ba..c67effe90eb1 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -188,11 +188,6 @@ S["co_affiliation"] >> affiliation S["yautja_status"] >> yautja_status S["synth_status"] >> synth_status - S["key_bindings"] >> key_bindings - check_keybindings() - - var/list/remembered_key_bindings - S["remembered_key_bindings"] >> remembered_key_bindings S["lang_chat_disabled"] >> lang_chat_disabled S["show_permission_errors"] >> show_permission_errors @@ -206,6 +201,10 @@ S["autofit_viewport"] >> auto_fit_viewport S["adaptive_zoom"] >> adaptive_zoom S["tooltips"] >> tooltips + S["key_bindings"] >> key_bindings + + var/list/remembered_key_bindings + S["remembered_key_bindings"] >> remembered_key_bindings //Sanitize ooccolor = sanitize_hexcolor(ooccolor, CONFIG_GET(string/ooc_color_default)) @@ -274,6 +273,9 @@ pref_job_slots = sanitize_islist(pref_job_slots, list()) vars["fps"] = fps + check_keybindings() + S["key_bindings"] << key_bindings + if(remembered_key_bindings) for(var/i in GLOB.keybindings_by_name) if(!(i in remembered_key_bindings)) @@ -651,7 +653,7 @@ addedbind = TRUE if(!addedbind) notadded += kb - save_preferences() + if(length(notadded)) addtimer(CALLBACK(src, PROC_REF(announce_conflict), notadded), 5 SECONDS) diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index afc8e0a7cbba..edc4a81b364a 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -54,14 +54,14 @@ flags_inv_hide |= HIDEEARS|HIDEEYES|HIDEFACE icon_state = initial(icon_state) eye_protection = initial(eye_protection) - to_chat(usr, "You flip the [src] down to protect your eyes.") + to_chat(usr, SPAN_NOTICE("You flip [src] down to protect your eyes.")) else vision_impair = VISION_IMPAIR_NONE flags_inventory &= ~(COVEREYES|COVERMOUTH|BLOCKSHARPOBJ) flags_inv_hide &= ~(HIDEEARS|HIDEEYES|HIDEFACE) icon_state = "[initial(icon_state)]up" eye_protection = EYE_PROTECTION_NONE - to_chat(usr, "You push the [src] up out of your face.") + to_chat(usr, SPAN_NOTICE("You push [src] up out of your face.")) up = !up if(ishuman(loc)) diff --git a/code/modules/clothing/shoes/marine_shoes.dm b/code/modules/clothing/shoes/marine_shoes.dm index edd988090d64..c7eb4ba53982 100644 --- a/code/modules/clothing/shoes/marine_shoes.dm +++ b/code/modules/clothing/shoes/marine_shoes.dm @@ -21,6 +21,7 @@ var/armor_stage = 0 items_allowed = list(/obj/item/attachable/bayonet, /obj/item/weapon/throwing_knife, /obj/item/weapon/gun/pistol/holdout, /obj/item/weapon/gun/pistol/clfpistol, /obj/item/tool/screwdriver, /obj/item/tool/surgery/scalpel, /obj/item/weapon/straight_razor) var/knife_type + drop_sound = "armorequip" /obj/item/clothing/shoes/marine/Initialize(mapload, ...) . = ..() diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 1c2fb2a9f29d..54e9d91576f1 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -299,3 +299,21 @@ name = "liaison's winter coat" desc = "A Weyland-Yutani winter coat. Only the best comfort for the liaison in a cold environment." icon_state = "snowsuit_liaison" + +/obj/item/clothing/suit/storage/snow_suit/liaison/modified + name = "modified liaison's winter coat" + desc = "A Weyland-Yutani winter coat. This one has been modified to holster guns and other objects. Only the best comfort and utility for the liaison surviving in a cold, hostile environment." + allowed = list( + /obj/item/weapon/gun, + /obj/item/tank/emergency_oxygen, + /obj/item/device/flashlight, + /obj/item/ammo_magazine, + /obj/item/explosive/grenade, + /obj/item/device/binoculars, + /obj/item/attachable/bayonet, + /obj/item/storage/large_holster/machete, + /obj/item/weapon/baseballbat, + /obj/item/weapon/baseballbat/metal, + /obj/item/device/motiondetector, + /obj/item/device/walkman, + ) diff --git a/code/modules/clothing/under/marine_uniform.dm b/code/modules/clothing/under/marine_uniform.dm index a950b4de3d94..6e92d0bd1343 100644 --- a/code/modules/clothing/under/marine_uniform.dm +++ b/code/modules/clothing/under/marine_uniform.dm @@ -17,6 +17,7 @@ armor_rad = CLOTHING_ARMOR_NONE armor_internaldamage = CLOTHING_ARMOR_LOW flags_jumpsuit = UNIFORM_SLEEVE_ROLLABLE + drop_sound = "armorequip" ///Makes it so that we can see the right name in the vendor. var/specialty = "USCM" ///List of map variants that use sleeve rolling on something else, like snow uniforms rolling the collar, and therefore shouldn't hide patches etc when rolled. diff --git a/code/modules/clothing/under/rank_pins.dm b/code/modules/clothing/under/rank_pins.dm index bcadaec52090..894ff6d879b7 100644 --- a/code/modules/clothing/under/rank_pins.dm +++ b/code/modules/clothing/under/rank_pins.dm @@ -5,7 +5,7 @@ desc = "A set of rank pins, used to denote the paygrade of someone within the military." icon_state = "ranks_enlisted" var/rank = "Private" - var/rank_short = "ME1" + var/rank_short = PAY_SHORT_ME1 slot = ACCESSORY_SLOT_RANK high_visibility = TRUE gender = PLURAL @@ -23,116 +23,116 @@ /obj/item/clothing/accessory/ranks/marine/e1 /obj/item/clothing/accessory/ranks/marine/e2 - rank_short = "ME2" + rank_short = PAY_SHORT_ME2 /obj/item/clothing/accessory/ranks/marine/e3 - rank_short = "ME3" + rank_short = PAY_SHORT_ME3 /obj/item/clothing/accessory/ranks/marine/e4 - rank_short = "ME4" + rank_short = PAY_SHORT_ME4 icon_state = "ranks_nco" /obj/item/clothing/accessory/ranks/marine/e5 - rank_short = "ME5" + rank_short = PAY_SHORT_ME5 icon_state = "ranks_nco" /obj/item/clothing/accessory/ranks/marine/e6 - rank_short = "ME6" + rank_short = PAY_SHORT_ME6 icon_state = "ranks_snco" /obj/item/clothing/accessory/ranks/marine/e7 - rank_short = "ME7" + rank_short = PAY_SHORT_ME7 icon_state = "ranks_snco" /obj/item/clothing/accessory/ranks/marine/e8 - rank_short = "ME8" + rank_short = PAY_SHORT_ME8 icon_state = "ranks_snco" /obj/item/clothing/accessory/ranks/marine/e8e - rank_short = "ME8E" + rank_short = PAY_SHORT_ME8E icon_state = "ranks_snco" /obj/item/clothing/accessory/ranks/marine/e9 - rank_short = "ME9" + rank_short = PAY_SHORT_ME9 icon_state = "ranks_snco" /obj/item/clothing/accessory/ranks/marine/e9e - rank_short = "ME9E" + rank_short = PAY_SHORT_ME9E icon_state = "ranks_snco" /obj/item/clothing/accessory/ranks/marine/e9c - rank_short = "ME9C" + rank_short = PAY_SHORT_ME9C icon_state = "ranks_snco" //OFFICERS /obj/item/clothing/accessory/ranks/marine/o1 name = "rank boards" - rank_short = "MO1" + rank_short = PAY_SHORT_MO1 icon_state = "ranks_officer" /obj/item/clothing/accessory/ranks/marine/o2 name = "rank boards" - rank_short = "MO2" + rank_short = PAY_SHORT_MO2 icon_state = "ranks_officer" /obj/item/clothing/accessory/ranks/marine/o3 name = "rank boards" - rank_short = "MO3" + rank_short = PAY_SHORT_MO3 icon_state = "ranks_officer" /obj/item/clothing/accessory/ranks/marine/o4 name = "rank boards" - rank_short = "MO4" + rank_short = PAY_SHORT_MO4 icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/marine/o5 name = "rank boards" - rank_short = "MO5" + rank_short = PAY_SHORT_MO5 icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/marine/o6 name = "rank boards" - rank_short = "MO6" + rank_short = PAY_SHORT_MO6 icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/marine/o6e name = "rank boards" - rank_short = "MO6E" + rank_short = PAY_SHORT_MO6E icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/marine/o6c name = "rank boards" - rank_short = "MO6C" + rank_short = PAY_SHORT_MO6C icon_state = "ranks_flagofficer" /obj/item/clothing/accessory/ranks/marine/o7 name = "rank boards" - rank_short = "MO7" + rank_short = PAY_SHORT_MO7 icon_state = "ranks_flagofficer" /obj/item/clothing/accessory/ranks/marine/o8 name = "rank boards" - rank_short = "MO8" + rank_short = PAY_SHORT_MO8 icon_state = "ranks_flagofficer" /obj/item/clothing/accessory/ranks/marine/o9 name = "rank boards" - rank_short = "MO9" + rank_short = PAY_SHORT_MO9 icon_state = "ranks_flagofficer" /obj/item/clothing/accessory/ranks/marine/o10 name = "rank boards" - rank_short = "MO10" + rank_short = PAY_SHORT_MO10 icon_state = "ranks_flagofficer" /obj/item/clothing/accessory/ranks/marine/o10c name = "rank boards" - rank_short = "MO10C" + rank_short = PAY_SHORT_MO10C icon_state = "ranks_flagofficer" /obj/item/clothing/accessory/ranks/marine/o10s name = "rank boards" - rank_short = "MO10S" + rank_short = PAY_SHORT_MO10S icon_state = "ranks_flagofficer" /*################################################ @@ -140,134 +140,112 @@ ################################################*/ //ENLISTED /obj/item/clothing/accessory/ranks/navy/e1 - rank_short = "NE1" + rank_short = PAY_SHORT_NE1 /obj/item/clothing/accessory/ranks/navy/e2 - rank_short = "NE2" + rank_short = PAY_SHORT_NE2 /obj/item/clothing/accessory/ranks/navy/e3 - rank_short = "NE3" + rank_short = PAY_SHORT_NE3 /obj/item/clothing/accessory/ranks/navy/e4 - rank_short = "NE4" + rank_short = PAY_SHORT_NE4 icon_state = "ranks_nco" /obj/item/clothing/accessory/ranks/navy/e5 - rank_short = "NE5" + rank_short = PAY_SHORT_NE5 icon_state = "ranks_nco" /obj/item/clothing/accessory/ranks/navy/e6 - rank_short = "NE6" + rank_short = PAY_SHORT_NE6 icon_state = "ranks_nco" /obj/item/clothing/accessory/ranks/navy/e7 - rank_short = "NE7" + rank_short = PAY_SHORT_NE7 icon_state = "ranks_snco" -/obj/item/clothing/accessory/ranks/navy/e7/pvst - icon_state = "ranks_pvst" - /obj/item/clothing/accessory/ranks/navy/e8 - rank_short = "NE8" + rank_short = PAY_SHORT_NE8 icon_state = "ranks_snco" -/obj/item/clothing/accessory/ranks/navy/e8/pvst - icon_state = "ranks_pvst" - /obj/item/clothing/accessory/ranks/navy/e8c - rank_short = "NE8C" + rank_short = PAY_SHORT_NE8C icon_state = "ranks_snco" /obj/item/clothing/accessory/ranks/navy/e9 - rank_short = "NE9" + rank_short = PAY_SHORT_NE9 icon_state = "ranks_snco" -/obj/item/clothing/accessory/ranks/navy/e9/pvst - icon_state = "ranks_pvst" - /obj/item/clothing/accessory/ranks/navy/e9c - rank_short = "NE9C" + rank_short = PAY_SHORT_NE9C icon_state = "ranks_snco" //OFFICERS /obj/item/clothing/accessory/ranks/navy/o1 name = "rank boards" - rank_short = "NO1" + rank_short = PAY_SHORT_NO1 icon_state = "ranks_officer" /obj/item/clothing/accessory/ranks/navy/o2 name = "rank boards" - rank_short = "NO2" + rank_short = PAY_SHORT_NO2 icon_state = "ranks_officer" /obj/item/clothing/accessory/ranks/navy/o3 name = "rank boards" - rank_short = "NO3" + rank_short = PAY_SHORT_NO3 icon_state = "ranks_officer" /obj/item/clothing/accessory/ranks/navy/o4 name = "rank boards" - rank_short = "NO4" + rank_short = PAY_SHORT_NO4 icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/navy/o5 name = "rank boards" - rank_short = "NO5" + rank_short = PAY_SHORT_NO5 icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/navy/o6 name = "rank boards" - rank_short = "NO6" + rank_short = PAY_SHORT_NO6 icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/navy/o6e name = "rank boards" - rank_short = "NO6E" + rank_short = PAY_SHORT_NO6E icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/navy/o6c name = "rank boards" - rank_short = "NO6C" + rank_short = PAY_SHORT_NO6C icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/navy/o7 name = "rank boards" - rank_short = "NO7" + rank_short = PAY_SHORT_NO7 icon_state = "ranks_flagofficer" /obj/item/clothing/accessory/ranks/navy/o8 name = "rank boards" - rank_short = "NO8" + rank_short = PAY_SHORT_NO8 icon_state = "ranks_flagofficer" -/obj/item/clothing/accessory/ranks/navy/o8/pvst - icon_state = "ranks_pvstofficer" - /obj/item/clothing/accessory/ranks/navy/o9 name = "rank boards" - rank_short = "NO9" + rank_short = PAY_SHORT_NO9 icon_state = "ranks_flagofficer" -/obj/item/clothing/accessory/ranks/navy/o9/pvst - icon_state = "ranks_pvstofficer" - /obj/item/clothing/accessory/ranks/navy/o10 name = "rank boards" - rank_short = "NO10" + rank_short = PAY_SHORT_NO10 icon_state = "ranks_flagofficer" -/obj/item/clothing/accessory/ranks/navy/o10/pvst - icon_state = "ranks_pvstofficer" - /obj/item/clothing/accessory/ranks/navy/o10c name = "rank boards" - rank_short = "NO10C" + rank_short = PAY_SHORT_NO10C icon_state = "ranks_flagofficer" -/obj/item/clothing/accessory/ranks/navy/o10c/pvst - rank_short = "PvCM" - icon_state = "ranks_pvstofficer" - /*################################################ ################# SPECIAL ################# ################################################*/ diff --git a/code/modules/clothing/under/under.dm b/code/modules/clothing/under/under.dm index ebfac5216330..a48967d88538 100644 --- a/code/modules/clothing/under/under.dm +++ b/code/modules/clothing/under/under.dm @@ -326,7 +326,7 @@ return update_rollsuit_status() //we need the _d version of the sprite anyways. In the future we might need to make a different version of the sprite to accomodate for rolling sleeves and hoods. if(user.head && !istype(user.head, hood_state)) - to_chat(user, SPAN_WARNING("You can't wear a hood while also wearing the [user.head]!")) + to_chat(user, SPAN_WARNING("You can't wear a hood while also wearing [user.head]!")) return if(!HAS_TRAIT(src, TRAIT_CLOTHING_HOOD)) diff --git a/code/modules/cm_aliens/XenoStructures.dm b/code/modules/cm_aliens/XenoStructures.dm index 340fabdf1973..81978bb01ba0 100644 --- a/code/modules/cm_aliens/XenoStructures.dm +++ b/code/modules/cm_aliens/XenoStructures.dm @@ -781,7 +781,7 @@ /obj/effect/alien/resin/resin_pillar/proc/brittle() //playsound(granite cracking) - visible_message(SPAN_DANGER("You hear cracking sounds from the [src] as splinters start falling off from the structure! It seems brittle now.")) + visible_message(SPAN_DANGER("You hear cracking sounds from [src] as splinters start falling off from the structure! It seems brittle now.")) health = vulnerable_health for(var/i in walls) var/turf/closed/wall/T = i @@ -814,7 +814,7 @@ /obj/effect/alien/resin/resin_pillar/hitby(atom/movable/AM) if(!brittle) - visible_message(SPAN_DANGER("[AM] harmlessly bounces off the [src]!")) + visible_message(SPAN_DANGER("[AM] harmlessly bounces off [src]!")) return return ..() diff --git a/code/modules/cm_aliens/structures/egg.dm b/code/modules/cm_aliens/structures/egg.dm index ce0be7c0c8a1..edb86c204558 100644 --- a/code/modules/cm_aliens/structures/egg.dm +++ b/code/modules/cm_aliens/structures/egg.dm @@ -8,7 +8,7 @@ icon_state = "Egg Growing" density = FALSE anchored = TRUE - layer = LYING_BETWEEN_MOB_LAYER //to stop hiding eggs under corpses + layer = LYING_BETWEEN_MOB_LAYER health = 80 plane = GAME_PLANE var/list/egg_triggers = list() @@ -355,4 +355,8 @@ SPECIAL EGG USED BY EGG CARRIER /obj/effect/alien/egg/carrier_egg/Burst(kill, instant_trigger, mob/living/carbon/xenomorph/X, is_hugger_player_controlled) . = ..() - owner = null + if(owner) + var/datum/behavior_delegate/carrier_eggsac/behavior = owner.behavior_delegate + behavior.remove_egg_owner(src) + if(life_timer) + deltimer(life_timer) diff --git a/code/modules/cm_marines/NonLethalRestraints.dm b/code/modules/cm_marines/NonLethalRestraints.dm index a7f0277c8aaa..3b2439a22a82 100644 --- a/code/modules/cm_marines/NonLethalRestraints.dm +++ b/code/modules/cm_marines/NonLethalRestraints.dm @@ -45,7 +45,7 @@ if(status) M.apply_effect(6, WEAKEN) charges -= 2 - M.visible_message(SPAN_DANGER("[M] has been prodded with the [src] by [user]!")) + M.visible_message(SPAN_DANGER("[M] has been prodded with [src] by [user]!")) user.attack_log += "\[[time_stamp()]\] Stunned [key_name(M)] with [src.name]" M.attack_log += "\[[time_stamp()]\] Stunned by [key_name(user)] with [src.name]" diff --git a/code/modules/cm_marines/equipment/gear.dm b/code/modules/cm_marines/equipment/gear.dm index b3ec6c800c68..00f956fdd4ed 100644 --- a/code/modules/cm_marines/equipment/gear.dm +++ b/code/modules/cm_marines/equipment/gear.dm @@ -149,15 +149,6 @@ return FALSE . = ..() handle_cloaking() - -/obj/item/coin/marine - name = "marine specialist weapon token" - desc = "Insert this into a specialist vendor in order to access a single highly dangerous weapon." - icon_state = "coin_platinum" - -/obj/item/coin/marine/attackby(obj/item/W as obj, mob/user as mob) //To remove attaching a string functionality - return - /obj/structure/broken_apc name = "\improper M577 armored personnel carrier" desc = "A large, armored behemoth capable of ferrying marines around. \nThis one is sitting nonfunctional." diff --git a/code/modules/cm_marines/equipment/kit_boxes.dm b/code/modules/cm_marines/equipment/kit_boxes.dm index 342f9a775718..d99da8f59f2c 100644 --- a/code/modules/cm_marines/equipment/kit_boxes.dm +++ b/code/modules/cm_marines/equipment/kit_boxes.dm @@ -165,9 +165,13 @@ var/squad_assignment_update = TRUE //this one is delivered via ASRS as a reward for DEFCON/techwebs/whatever else we will have -/obj/item/spec_kit/asrs +/obj/item/spec_kit/rifleman + squad_assignment_update = FALSE allowed_roles_list = list(JOB_SQUAD_MARINE, JOB_WO_SQUAD_MARINE) +/obj/item/spec_kit/rifleman/jobless + allowed_roles_list = list() + /obj/item/spec_kit/cryo squad_assignment_update = FALSE @@ -212,6 +216,17 @@ return FALSE return TRUE +/obj/item/spec_kit/rifleman/can_use(mob/living/carbon/human/user) + if(!length(allowed_roles_list)) + return TRUE + + for(var/allowed_role in allowed_roles_list) + if(user.job == allowed_role)//Alternate check to normal kit as this is distributed to people without SKILL_SPEC_TRAINED. + if(skillcheck(user, SKILL_SPEC_WEAPONS, SKILL_SPEC_KITTED) && !skillcheckexplicit(user, SKILL_SPEC_WEAPONS, SKILL_SPEC_ALL)) + to_chat(user, SPAN_WARNING("You already have specialization, give this kit to someone else!")) + return FALSE + return TRUE + /obj/item/spec_kit/proc/select_and_spawn(mob/living/carbon/human/user) var/selection = tgui_input_list(user, "Pick your specialist equipment type.", "Specialist Kit Selection", GLOB.available_specialist_kit_boxes) if(!selection || QDELETED(src)) diff --git a/code/modules/cm_marines/orbital_cannon.dm b/code/modules/cm_marines/orbital_cannon.dm index c9ec4190ce90..b003237f68ee 100644 --- a/code/modules/cm_marines/orbital_cannon.dm +++ b/code/modules/cm_marines/orbital_cannon.dm @@ -82,15 +82,15 @@ GLOBAL_LIST(ob_type_fuel_requirements) if(!tray.warhead) if(user) - to_chat(user, "no warhead in the tray, loading operation cancelled.") + to_chat(user, SPAN_WARNING("No warhead in the tray, loading operation cancelled.")) return if(tray.fuel_amt < 1) - to_chat(user, "no solid fuel in the tray, loading operation cancelled.") + to_chat(user, SPAN_WARNING("No solid fuel in the tray, loading operation cancelled.")) return if(loaded_tray) - to_chat(user, "Tray is already loaded.") + to_chat(user, SPAN_WARNING("Tray is already loaded.")) return tray.forceMove(src) @@ -685,4 +685,3 @@ GLOBAL_LIST_EMPTY(orbital_cannon_cancellation) return TRUE tgui_interact(user) - diff --git a/code/modules/cm_marines/smartgun_mount.dm b/code/modules/cm_marines/smartgun_mount.dm index 8b6dde5527e2..01183ebceca5 100644 --- a/code/modules/cm_marines/smartgun_mount.dm +++ b/code/modules/cm_marines/smartgun_mount.dm @@ -1,12 +1,6 @@ ////////////////////////////////////////////////////////////// //Mounted MG, Replacment for the current jury rig code. -//Adds a coin for engi vendors -/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_platinum" - // First thing we need is the ammo drum for this thing. /obj/item/ammo_magazine/m56d name = "M56D drum magazine (10x28mm Caseless)" diff --git a/code/modules/cm_preds/yaut_bracers.dm b/code/modules/cm_preds/yaut_bracers.dm index 111a95d1089c..df8ab136ea18 100644 --- a/code/modules/cm_preds/yaut_bracers.dm +++ b/code/modules/cm_preds/yaut_bracers.dm @@ -928,7 +928,7 @@ addtimer(VARSET_CALLBACK(src, disc_timer, FALSE), 10 SECONDS) for(var/mob/living/simple_animal/hostile/smartdisc/S in range(7)) - to_chat(caller, SPAN_WARNING("The [S] skips back towards you!")) + to_chat(caller, SPAN_WARNING("[S] skips back towards you!")) new /obj/item/explosive/grenade/spawnergrenade/smartdisc(S.loc) qdel(S) diff --git a/code/modules/cm_tech/implements/engi_czsp.dm b/code/modules/cm_tech/implements/engi_czsp.dm index 8e1ab8248c19..f3024129b3eb 100644 --- a/code/modules/cm_tech/implements/engi_czsp.dm +++ b/code/modules/cm_tech/implements/engi_czsp.dm @@ -35,7 +35,7 @@ return if((user.get_active_hand()) != src) - to_chat(user, SPAN_WARNING("You must be holding the [src] to upgrade \the [D]!")) + to_chat(user, SPAN_WARNING("You must be holding [src] to upgrade [D]!")) return var/type_to_change_to = D.upgrade_string_to_type(chosen_upgrade) diff --git a/code/modules/cm_tech/techs/marine/tier2/orbital_ammo.dm b/code/modules/cm_tech/techs/marine/tier2/orbital_ammo.dm index d4f2ce6fc0ef..303ea6121734 100644 --- a/code/modules/cm_tech/techs/marine/tier2/orbital_ammo.dm +++ b/code/modules/cm_tech/techs/marine/tier2/orbital_ammo.dm @@ -17,9 +17,9 @@ return var/datum/supply_order/O = new /datum/supply_order() - O.ordernum = GLOB.supply_controller.ordernum - GLOB.supply_controller.ordernum++ - O.object = GLOB.supply_controller.supply_packs[type_to_give] + O.ordernum = GLOB.supply_controller.ordernum++ + var/actual_type = GLOB.supply_packs_types[type_to_give] + O.object = GLOB.supply_packs_datums[actual_type] O.orderedby = MAIN_AI_SYSTEM GLOB.supply_controller.shoppinglist += O diff --git a/code/modules/cm_tech/techs/marine/tier4/nuke.dm b/code/modules/cm_tech/techs/marine/tier4/nuke.dm index 46ffb4a94193..139fefef570c 100644 --- a/code/modules/cm_tech/techs/marine/tier4/nuke.dm +++ b/code/modules/cm_tech/techs/marine/tier4/nuke.dm @@ -21,9 +21,9 @@ . = ..() var/datum/supply_order/new_order = new() - new_order.ordernum = GLOB.supply_controller.ordernum - GLOB.supply_controller.ordernum++ - new_order.object = GLOB.supply_controller.supply_packs["Encrypted Operational Nuke"] + new_order.ordernum = GLOB.supply_controller.ordernum++ + var/actual_type = GLOB.supply_packs_types["Encrypted Operational Nuke"] + new_order.object = GLOB.supply_packs_datums[actual_type] new_order.orderedby = MAIN_AI_SYSTEM new_order.approvedby = MAIN_AI_SYSTEM diff --git a/code/modules/defenses/defenses.dm b/code/modules/defenses/defenses.dm index 633b51801e27..fefd3c640c65 100644 --- a/code/modules/defenses/defenses.dm +++ b/code/modules/defenses/defenses.dm @@ -366,7 +366,7 @@ if(locked) to_chat(user, SPAN_WARNING("The control panel on [src] is locked to non-engineers.")) return - user.visible_message(SPAN_NOTICE("[user] begins switching the [src] [turned_on? "off" : "on"]."), SPAN_NOTICE("You begin switching the [src] [turned_on? "off" : "on"].")) + user.visible_message(SPAN_NOTICE("[user] begins switching [src] [turned_on? "off" : "on"]."), SPAN_NOTICE("You begin switching [src] [turned_on? "off" : "on"].")) if(!(do_after(user, 20, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_FRIENDLY, src))) return @@ -374,7 +374,7 @@ if(!can_be_near_defense) for(var/obj/structure/machinery/defenses/def in urange(defense_check_range, loc)) if(def != src && def.turned_on && !def.can_be_near_defense) - to_chat(user, SPAN_WARNING("This is too close to a [def]!")) + to_chat(user, SPAN_WARNING("This is too close to \a [def]!")) return power_on() @@ -451,7 +451,7 @@ /obj/structure/machinery/defenses/bullet_act(obj/projectile/P) bullet_ping(P) - visible_message(SPAN_WARNING("[src] is hit by the [P]!")) + visible_message(SPAN_WARNING("[src] is hit by [P]!")) var/ammo_flags = P.ammo.flags_ammo_behavior | P.projectile_override_flags if(ammo_flags & AMMO_ACIDIC) //Fix for xenomorph spit doing baby damage. update_health(round(P.damage/3)) diff --git a/code/modules/gear_presets/agents.dm b/code/modules/gear_presets/agents.dm index b51e623a198c..c7449883b87f 100644 --- a/code/modules/gear_presets/agents.dm +++ b/code/modules/gear_presets/agents.dm @@ -69,7 +69,7 @@ ) assignment = JOB_UPP_REPRESENTATIVE rank = JOB_UPP_REPRESENTATIVE - paygrade = "CR" + paygrade = PAY_SHORT_CREP role_comm_title = "UPP Rep." skills = /datum/skills/civilian/survivor @@ -105,7 +105,7 @@ ) assignment = JOB_TWE_REPRESENTATIVE rank = JOB_TWE_REPRESENTATIVE - paygrade = "CR" + paygrade = PAY_SHORT_CREP role_comm_title = "TWE Rep." skills = /datum/skills/civilian/survivor diff --git a/code/modules/gear_presets/cbrn.dm b/code/modules/gear_presets/cbrn.dm index 00934bc94fc7..e59f276fe486 100644 --- a/code/modules/gear_presets/cbrn.dm +++ b/code/modules/gear_presets/cbrn.dm @@ -2,7 +2,7 @@ name = "Generic CBRN" //Parent type for easier gear assignment = JOB_SQUAD_MARINE rank = JOB_SQUAD_MARINE - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "CBRN" flags = EQUIPMENT_PRESET_EXTRA auto_squad_name = SQUAD_CBRN @@ -67,7 +67,7 @@ /datum/equipment_preset/uscm/cbrn/engineer name = "CBRN Combat Technician" - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 assignment = JOB_SQUAD_ENGI rank = JOB_SQUAD_ENGI role_comm_title = "ComTech" @@ -111,7 +111,7 @@ /datum/equipment_preset/uscm/cbrn/medic name = "CBRN Hospital Corpsman" - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 assignment = JOB_SQUAD_MEDIC rank = JOB_SQUAD_MEDIC role_comm_title = "HM" @@ -154,7 +154,7 @@ /datum/equipment_preset/uscm/cbrn/leader name = "CBRN Fireteam Leader" - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 assignment = JOB_SQUAD_TEAM_LEADER rank = JOB_SQUAD_TEAM_LEADER role_comm_title = "TL" @@ -189,7 +189,7 @@ /datum/equipment_preset/uscm/cbrn/specialist name = "CBRN Specialist" - paygrade = "O" + paygrade = PAY_SHORT_OPR assignment = JOB_SQUAD_SPECIALIST rank = JOB_SQUAD_SPECIALIST role_comm_title = "Spc" diff --git a/code/modules/gear_presets/clf.dm b/code/modules/gear_presets/clf.dm index 62cbeb9edd29..d89e349a62c1 100644 --- a/code/modules/gear_presets/clf.dm +++ b/code/modules/gear_presets/clf.dm @@ -3,6 +3,7 @@ languages = list(LANGUAGE_JAPANESE, LANGUAGE_ENGLISH) assignment = JOB_CLF rank = FACTION_CLF + paygrade = PAY_SHORT_REB faction = FACTION_CLF origin_override = ORIGIN_CIVILIAN idtype = /obj/item/card/id/data @@ -281,6 +282,7 @@ assignment = JOB_CLF_MEDIC rank = JOB_CLF_MEDIC role_comm_title = "MED" + paygrade = PAY_SHORT_CDOC skills = /datum/skills/clf/combat_medic /datum/equipment_preset/clf/medic/load_gear(mob/living/carbon/human/new_human) @@ -709,6 +711,7 @@ skills = /datum/skills/colonial_synthetic assignment = JOB_CLF_SYNTH rank = JOB_CLF_SYNTH + paygrade = PAY_SHORT_SYN role_comm_title = "Syn" /datum/equipment_preset/clf/synth/New() @@ -897,6 +900,7 @@ flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_CLF_COMMANDER rank = JOB_CLF_COMMANDER + paygrade = PAY_SHORT_REBC role_comm_title = "CMDR" skills = /datum/skills/clf/commander diff --git a/code/modules/gear_presets/cmb.dm b/code/modules/gear_presets/cmb.dm index 2dd2c531d787..aa2c7438ba75 100644 --- a/code/modules/gear_presets/cmb.dm +++ b/code/modules/gear_presets/cmb.dm @@ -58,7 +58,7 @@ /datum/equipment_preset/cmb/standard name = "CMB - Colonial Marshal Deputy" - paygrade = "GS-9" + paygrade = PAY_SHORT_CMBD role_comm_title = "CMB DEP" flags = EQUIPMENT_PRESET_EXTRA assignment = "CMB Deputy" @@ -141,7 +141,7 @@ /datum/equipment_preset/cmb/leader name = "CMB - The Colonial Marshal" - paygrade = "GS-13" + paygrade = PAY_SHORT_CMBM idtype = /obj/item/card/id/marshal role_comm_title = "CMB MAR" flags = EQUIPMENT_PRESET_EXTRA @@ -195,7 +195,7 @@ //*****************************************************************************************************/ /datum/equipment_preset/cmb/synth name = "CMB - Colonial Marshal Investigative Synthetic" - paygrade = "GS-C.9" + paygrade = PAY_SHORT_CMBS idtype = /obj/item/card/id/deputy role_comm_title = "CMB Syn" flags = EQUIPMENT_PRESET_EXTRA @@ -298,7 +298,7 @@ /datum/equipment_preset/cmb/liaison name = "CMB - ICC Liaison" - paygrade = "GS-6" + paygrade = PAY_SHORT_ICCL idtype = /obj/item/card/id/silver/cl role_comm_title = "ICC Rep." flags = EQUIPMENT_PRESET_EXTRA @@ -357,7 +357,7 @@ /datum/equipment_preset/cmb/observer name = "CMB - Interstellar Human Rights Observer" - paygrade = "GS-3" + paygrade = PAY_SHORT_IHRO idtype = /obj/item/card/id/lanyard role_comm_title = "OBS" flags = EQUIPMENT_PRESET_EXTRA @@ -416,7 +416,7 @@ assignment = "Anchorpoint Station Marine Rifleman" rank = JOB_SQUAD_MARINE - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "A-RFN" skills = /datum/skills/pfc/crafty faction = FACTION_MARSHAL @@ -466,7 +466,7 @@ assignment = "Anchorpoint Station Marine Team Leader" rank = JOB_SQUAD_LEADER - paygrade = "ME6" + paygrade = PAY_SHORT_ME6 role_comm_title = "A-TL" minimum_age = 25 skills = /datum/skills/SL @@ -511,7 +511,7 @@ assignment = "Anchorpoint Station Marine Technical Specialist" rank = JOB_SQUAD_TEAM_LEADER - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 role_comm_title = "A-TS" skills = /datum/skills/tl @@ -556,7 +556,7 @@ assignment = "Anchorpoint Station Hospital Corpsman" rank = JOB_SQUAD_MEDIC - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "A-HM" skills = /datum/skills/combat_medic @@ -617,7 +617,7 @@ assignment = "Anchorpoint Station Marine Smartgunner" rank = JOB_SQUAD_SMARTGUN - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "A-SG" skills = /datum/skills/smartgunner diff --git a/code/modules/gear_presets/corpses.dm b/code/modules/gear_presets/corpses.dm index de24f1f84ff3..ca2b2e2ab52d 100644 --- a/code/modules/gear_presets/corpses.dm +++ b/code/modules/gear_presets/corpses.dm @@ -338,7 +338,7 @@ name = "Corpse - Corporate Liaison" assignment = "Corporate Liaison" xenovictim = TRUE - paygrade = "WYC2" + paygrade = PAY_SHORT_WYC2 access = list( ACCESS_CIVILIAN_PUBLIC, ACCESS_CIVILIAN_LOGISTICS, @@ -430,7 +430,7 @@ idtype = /obj/item/card/id/general assignment = "Bridge Officer" uses_special_name = TRUE - paygrade = "WYC2" + paygrade = PAY_SHORT_WYC2 access = list( ACCESS_CIVILIAN_PUBLIC, ACCESS_CIVILIAN_LOGISTICS, @@ -637,7 +637,7 @@ /datum/equipment_preset/corpse/wy/manager name = "Corpse - Corporate Supervisor" flags = EQUIPMENT_PRESET_EXTRA - paygrade = "WYC7" + paygrade = PAY_SHORT_WYC6 assignment = "Colony Supervisor" role_comm_title = "Supervisor" rank = FACTION_WY @@ -800,7 +800,7 @@ languages = list(LANGUAGE_ENGLISH) assignment = JOB_WY_GOON rank = JOB_WY_GOON - paygrade = "WEY-GOON" + paygrade = PAY_SHORT_CPO skills = /datum/skills/MP /datum/equipment_preset/corpse/pmc/goon/load_gear(mob/living/carbon/human/new_human) @@ -822,7 +822,7 @@ flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_WY_GOON_LEAD rank = JOB_WY_GOON_LEAD - paygrade = "WEY-GOON-L" + paygrade = PAY_SHORT_CSPO /datum/equipment_preset/corpse/pmc/goon/lead/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress, WEAR_L_EAR) @@ -985,7 +985,7 @@ name = "Corpse - USCM Reconnaissance Spotter" assignment = "Reconnaissance Spotter" xenovictim = FALSE - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 idtype = /obj/item/card/id/dogtag role_comm_title = "FORECON" faction_group = list(FACTION_USCM, FACTION_SURVIVOR) diff --git a/code/modules/gear_presets/dust_raider.dm b/code/modules/gear_presets/dust_raider.dm index 1d979ed66a5f..27a3ce086c85 100644 --- a/code/modules/gear_presets/dust_raider.dm +++ b/code/modules/gear_presets/dust_raider.dm @@ -24,7 +24,7 @@ access = list(ACCESS_MARINE_PREP) assignment = JOB_SQUAD_MARINE rank = JOB_SQUAD_MARINE - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "RFN" skills = /datum/skills/pfc/crafty @@ -46,7 +46,7 @@ access = list(ACCESS_MARINE_PREP) assignment = JOB_SQUAD_LEADER rank = JOB_SQUAD_LEADER - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "SL" skills = /datum/skills/SL @@ -75,7 +75,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SMARTPREP) assignment = JOB_SQUAD_SMARTGUN rank = JOB_SQUAD_SMARTGUN - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "SG" skills = /datum/skills/smartgunner @@ -100,7 +100,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_ENGPREP, ACCESS_CIVILIAN_ENGINEERING) assignment = JOB_SQUAD_ENGI rank = JOB_SQUAD_ENGI - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "Eng" skills = /datum/skills/combat_engineer @@ -129,7 +129,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_MEDPREP, ACCESS_MARINE_MEDBAY) assignment = JOB_SQUAD_MEDIC rank = JOB_SQUAD_MEDIC - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "HM" skills = /datum/skills/combat_medic @@ -164,7 +164,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SPECPREP) assignment = JOB_SQUAD_SPECIALIST rank = JOB_SQUAD_SPECIALIST - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "Spc" skills = /datum/skills/specialist diff --git a/code/modules/gear_presets/dutch.dm b/code/modules/gear_presets/dutch.dm index 2844eef68a96..66a7254494b2 100644 --- a/code/modules/gear_presets/dutch.dm +++ b/code/modules/gear_presets/dutch.dm @@ -2,7 +2,7 @@ /datum/equipment_preset/dutch name = JOB_DUTCH_RIFLEMAN - paygrade = "DTC" + paygrade = PAY_SHORT_DTC assignment = JOB_DUTCH_RIFLEMAN flags = EQUIPMENT_PRESET_EXTRA faction = FACTION_DUTCH @@ -83,7 +83,7 @@ /datum/equipment_preset/dutch/minigun name = JOB_DUTCH_MINIGUNNER - paygrade = "DTCMG" + paygrade = PAY_SHORT_DTCMG assignment = JOB_DUTCH_MINIGUNNER flags = EQUIPMENT_PRESET_EXTRA @@ -116,7 +116,7 @@ /datum/equipment_preset/dutch/flamer name = JOB_DUTCH_FLAMETHROWER - paygrade = "DTCF" + paygrade = PAY_SHORT_DTCF assignment = JOB_DUTCH_FLAMETHROWER flags = EQUIPMENT_PRESET_EXTRA @@ -150,7 +150,7 @@ /datum/equipment_preset/dutch/medic name = JOB_DUTCH_MEDIC - paygrade = "DTCM" + paygrade = PAY_SHORT_DTCM assignment = JOB_DUTCH_MEDIC flags = EQUIPMENT_PRESET_EXTRA @@ -193,7 +193,7 @@ /datum/equipment_preset/dutch/arnie name = "Dutch's Dozen - Arnold" - paygrade = "ARN" + paygrade = PAY_SHORT_DTCA assignment = JOB_DUTCH_ARNOLD flags = EQUIPMENT_PRESET_EXTRA diff --git a/code/modules/gear_presets/fun.dm b/code/modules/gear_presets/fun.dm index 8bbe686b5cea..68253afbf90a 100644 --- a/code/modules/gear_presets/fun.dm +++ b/code/modules/gear_presets/fun.dm @@ -240,7 +240,7 @@ /datum/equipment_preset/fun/santa name = "Fun - Santa" - paygrade = "C" + paygrade = PAY_SHORT_CIV flags = EQUIPMENT_PRESET_EXTRA skills = /datum/skills/everything faction = FACTION_MARINE @@ -338,7 +338,7 @@ /datum/equipment_preset/fun/van_bandolier name = "Fun - Big Game Hunter" - paygrade = "CCMO" + paygrade = PAY_SHORT_CCMO uses_special_name = TRUE flags = EQUIPMENT_PRESET_EXTRA skills = /datum/skills/everything @@ -440,7 +440,7 @@ assignment = "Monkey Marine" rank = "Monkey Marine" - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 /datum/equipment_preset/fun/monkey/marine/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine(new_human), WEAR_BODY) @@ -457,7 +457,7 @@ assignment = "Monkey Soldier" rank = "Monkey Soldier" - paygrade = "UE1" + paygrade = PAY_SHORT_UE1 /datum/equipment_preset/fun/monkey/soldier/get_random_name(mob/living/carbon/human/new_human) return new_human.gender == MALE ? pick(GLOB.first_names_male_upp) : pick(GLOB.first_names_female_upp) diff --git a/code/modules/gear_presets/survivors/lv_522/forcon_survivors.dm b/code/modules/gear_presets/survivors/lv_522/forcon_survivors.dm index 825228f29735..34cbc8e0ab9c 100644 --- a/code/modules/gear_presets/survivors/lv_522/forcon_survivors.dm +++ b/code/modules/gear_presets/survivors/lv_522/forcon_survivors.dm @@ -1,7 +1,7 @@ ///*****************************LV-522 Force Recon Survivors*******************************************************/ //Nanu told me to put them here so they dont clutter up survivors.dm /datum/equipment_preset/survivor/forecon - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 idtype = /obj/item/card/id/dogtag role_comm_title = "FORECON" rank = JOB_SURVIVOR @@ -208,7 +208,7 @@ name = "Survivor - USCM Reconnaissance Squad Leader" assignment = JOB_FORECON_SL skills = /datum/skills/military/survivor/forecon_squad_leader - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 /datum/equipment_preset/survivor/forecon/squad_leader/load_gear(mob/living/carbon/human/new_human) var/obj/item/clothing/under/marine/reconnaissance/uniform = new() @@ -234,7 +234,7 @@ name = "Survivor - USCM Reconnaissance Major" assignment = JOB_FORECON_CO skills = /datum/skills/commander - paygrade = "MO4" + paygrade = PAY_SHORT_MO4 idtype = /obj/item/card/id/gold role_comm_title = "FORECON CO" diff --git a/code/modules/gear_presets/survivors/misc.dm b/code/modules/gear_presets/survivors/misc.dm index 3beba6a31b06..15eae8dfe5d4 100644 --- a/code/modules/gear_presets/survivors/misc.dm +++ b/code/modules/gear_presets/survivors/misc.dm @@ -178,7 +178,7 @@ everything bellow isn't used or out of place. name = "Survivor - Corporate Security Goon" flags = EQUIPMENT_PRESET_START_OF_ROUND assignment = JOB_WY_GOON - paygrade = "WEY-GOON" + paygrade = PAY_SHORT_CPO idtype = /obj/item/card/id/silver/cl skills = /datum/skills/civilian/survivor/goon languages = list(LANGUAGE_ENGLISH, LANGUAGE_JAPANESE) @@ -257,7 +257,7 @@ everything bellow isn't used or out of place. name = "Survivor - USASF Commander" assignment = "USASF Commander" skills = /datum/skills/commander - paygrade = "NO5" + paygrade = PAY_SHORT_NO5 idtype = /obj/item/card/id/gold role_comm_title = "USASF CDR" flags = EQUIPMENT_PRESET_START_OF_ROUND diff --git a/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm b/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm index 35a9b8e5eaba..cbc777ad6852 100644 --- a/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm +++ b/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm @@ -82,7 +82,7 @@ /datum/equipment_preset/survivor/wy/manager name = "Survivor - Corporate Supervisor" flags = EQUIPMENT_PRESET_EXTRA - paygrade = "WYC7" + paygrade = PAY_SHORT_WYC6 skills = /datum/skills/civilian/survivor/manager assignment = "Colony Supervisor" role_comm_title = "Supervisor" diff --git a/code/modules/gear_presets/survivors/sorokyne_strata/preset_sorokyne_strata.dm b/code/modules/gear_presets/survivors/sorokyne_strata/preset_sorokyne_strata.dm index 532b422a13a9..f53f25326b69 100644 --- a/code/modules/gear_presets/survivors/sorokyne_strata/preset_sorokyne_strata.dm +++ b/code/modules/gear_presets/survivors/sorokyne_strata/preset_sorokyne_strata.dm @@ -1,6 +1,6 @@ /datum/equipment_preset/survivor/engineer/soro - name = "Survivor - Sorokyne Strata Political Prisioner" - assignment = "Sorokyne Strata Political Prisioner" + name = "Survivor - Sorokyne Strata Political Prisoner" + assignment = "Sorokyne Strata Political Prisoner" /datum/equipment_preset/survivor/engineer/soro/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP(new_human), WEAR_BODY) @@ -58,3 +58,17 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/snow_suit/survivor(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(new_human), WEAR_HEAD) ..() + +/datum/equipment_preset/survivor/corporate/soro + name = "Survivor - Sorokyne Strata Corporate Liaison" + assignment = "Sorokyne Strata Corporate Liaison" + +/datum/equipment_preset/survivor/corporate/soro/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/liaison_suit/charcoal(new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(new_human), WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/rebreather/scarf(new_human), WEAR_FACE) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/snow_suit/liaison/modified(new_human), WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/lockable/liaison, WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET) + ..() + diff --git a/code/modules/gear_presets/survivors/survivors.dm b/code/modules/gear_presets/survivors/survivors.dm index 7a346fe1edd6..ae26fc40938b 100644 --- a/code/modules/gear_presets/survivors/survivors.dm +++ b/code/modules/gear_presets/survivors/survivors.dm @@ -5,7 +5,7 @@ skills = /datum/skills/civilian/survivor languages = list(LANGUAGE_ENGLISH) - paygrade = "C" + paygrade = PAY_SHORT_CIV idtype = /obj/item/card/id/lanyard faction = FACTION_SURVIVOR faction_group = list(FACTION_SURVIVOR) @@ -195,7 +195,7 @@ Standart Survivors : /datum/equipment_preset/survivor/scientist, /datum/equipment_preset/survivor/colonial_marshal name = "Survivor - Colonial Marshal Deputy" assignment = "CMB Deputy" - paygrade = "GS-9" + paygrade = PAY_SHORT_CMBD skills = /datum/skills/civilian/survivor/marshal flags = EQUIPMENT_PRESET_START_OF_ROUND idtype = /obj/item/card/id/deputy @@ -293,7 +293,7 @@ Everything bellow is a parent used as a base for one or multiple maps. assignment = "Corporate Liaison" skills = /datum/skills/civilian/survivor flags = EQUIPMENT_PRESET_START_OF_ROUND - paygrade = "WYC2" + paygrade = PAY_SHORT_WYC2 idtype = /obj/item/card/id/silver/clearance_badge/cl access = list( ACCESS_CIVILIAN_PUBLIC, @@ -325,11 +325,11 @@ Everything bellow is a parent used as a base for one or multiple maps. var/playtime = get_job_playtime(new_human.client, JOB_CORPORATE_LIAISON) if(new_human.client.prefs.playtime_perks) if(playtime > JOB_PLAYTIME_TIER_4) - return "WYC5" + return PAY_SHORT_WYC5 else if(playtime > JOB_PLAYTIME_TIER_3) - return "WYC4" + return PAY_SHORT_WYC4 else if(playtime > JOB_PLAYTIME_TIER_2) - return "WYC3" + return PAY_SHORT_WYC3 else return paygrade return paygrade @@ -411,7 +411,7 @@ and is used as a base for all of the maps. assignment = "Interstellar Commerce Commission Corporate Liaison" skills = /datum/skills/civilian/survivor idtype = /obj/item/card/id/silver/cl - paygrade = "WYC2" + paygrade = PAY_SHORT_ICCL role_comm_title = "ICC Rep." flags = EQUIPMENT_PRESET_START_OF_ROUND diff --git a/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm b/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm index c1ca81683c4b..324cfbe3bf7a 100644 --- a/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm +++ b/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm @@ -2,7 +2,7 @@ //crashlanding-upp-bar.dmm map. /datum/equipment_preset/survivor/upp name = "Survivor - UPP" - paygrade = "UE1" + paygrade = PAY_SHORT_UE1 origin_override = ORIGIN_UPP rank = JOB_SURVIVOR skills = /datum/skills/military/survivor/upp_private @@ -39,7 +39,7 @@ //crashlanding-upp-bar.dmm /datum/equipment_preset/survivor/upp/soldier name = "Survivor - UPP Soldier" - paygrade = "UE2" + paygrade = PAY_SHORT_UE2 assignment = JOB_UPP rank = JOB_UPP skills = /datum/skills/military/survivor/upp_private @@ -60,11 +60,18 @@ spawn_random_upp_belt(new_human) ..() + +/datum/equipment_preset/survivor/upp/soldier/load_rank(mob/living/carbon/human/new_human) + if(new_human.client) + if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) + return PAY_SHORT_UE1 + return paygrade + // /obj/effect/landmark/survivor_spawner/upp_sapper //crashlanding-upp-bar.dmm /datum/equipment_preset/survivor/upp/sapper name = "Survivor - UPP Sapper" - paygrade = "UE3" + paygrade = PAY_SHORT_UE3 assignment = JOB_UPP_ENGI rank = JOB_UPP_ENGI skills = /datum/skills/military/survivor/upp_sapper @@ -92,7 +99,7 @@ //crashlanding-upp-bar.dmm /datum/equipment_preset/survivor/upp/medic name = "Survivor - UPP Medic" - paygrade = "UE3" + paygrade = PAY_SHORT_UE3 assignment = JOB_UPP_MEDIC rank = JOB_UPP_MEDIC skills = /datum/skills/military/survivor/upp_medic @@ -124,7 +131,7 @@ name = "Survivor - UPP Specialist" assignment = JOB_UPP_SPECIALIST rank = JOB_UPP_SPECIALIST - paygrade = "UE4" + paygrade = PAY_SHORT_UE4 skills = /datum/skills/military/survivor/upp_spec /datum/equipment_preset/survivor/upp/specialist/load_gear(mob/living/carbon/human/new_human) @@ -143,7 +150,7 @@ // /obj/effect/landmark/survivor_spawner/squad_leader /datum/equipment_preset/survivor/upp/squad_leader name = "Survivor - UPP Squad Leader" - paygrade = "UE5" + paygrade = PAY_SHORT_UE5 assignment = JOB_UPP_LEADER rank = JOB_UPP_LEADER languages = list(LANGUAGE_RUSSIAN, LANGUAGE_ENGLISH, LANGUAGE_GERMAN, LANGUAGE_CHINESE) @@ -171,7 +178,7 @@ faction = FACTION_UPP faction_group = list(FACTION_UPP, FACTION_SURVIVOR) skills = /datum/skills/colonial_synthetic - paygrade = "SYN" + paygrade = PAY_SHORT_SYN idtype = /obj/item/card/id/dogtag role_comm_title = "173/RECON Syn" diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm index 651a324003bc..3b2efd8c22be 100644 --- a/code/modules/gear_presets/synths.dm +++ b/code/modules/gear_presets/synths.dm @@ -3,7 +3,7 @@ uses_special_name = TRUE languages = ALL_SYNTH_LANGUAGES skills = /datum/skills/synthetic - paygrade = "SYN" + paygrade = PAY_SHORT_SYN minimap_icon = "synth" @@ -41,7 +41,7 @@ idtype = /obj/item/card/id/gold assignment = JOB_SYNTH rank = "Synthetic" - paygrade = "SYN" + paygrade = PAY_SHORT_SYN role_comm_title = "Syn" /datum/equipment_preset/synth/uscm/load_gear(mob/living/carbon/human/new_human) @@ -65,7 +65,7 @@ idtype = /obj/item/card/id/gold assignment = JOB_SYNTH rank = "Synthetic" - paygrade = "SYN" + paygrade = PAY_SHORT_SYN role_comm_title = "Syn" /datum/equipment_preset/synth/uscm/councillor/load_gear(mob/living/carbon/human/new_human) @@ -654,7 +654,7 @@ rank = JOB_COLONIST skills = /datum/skills/infiltrator_synthetic idtype = /obj/item/card/id/lanyard - paygrade = "C" + paygrade = PAY_SHORT_CIV /datum/equipment_preset/synth/infiltrator/New() . = ..() diff --git a/code/modules/gear_presets/upp.dm b/code/modules/gear_presets/upp.dm index 5a2c09b63b85..dc79f87c5135 100644 --- a/code/modules/gear_presets/upp.dm +++ b/code/modules/gear_presets/upp.dm @@ -64,7 +64,7 @@ assignment = JOB_UPP rank = JOB_UPP role_comm_title = "Sol" - paygrade = "UE2" + paygrade = PAY_SHORT_UE2 /datum/equipment_preset/upp/soldier/load_gear(mob/living/carbon/human/new_human) //TODO: add backpacks and satchels @@ -86,6 +86,12 @@ load_upp_soldier(new_human, UPP) +/datum/equipment_preset/upp/soldier/load_rank(mob/living/carbon/human/new_human) + if(new_human.client) + if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) + return PAY_SHORT_UE1 + return paygrade + /datum/equipment_preset/upp/soldier/proc/load_upp_soldier(mob/living/carbon/human/new_human, obj/item/clothing/under/marine/veteran/UPP/UPP) var/percentage = rand(1, 100) switch(percentage) @@ -230,7 +236,7 @@ assignment = JOB_UPP_MEDIC rank = JOB_UPP_MEDIC role_comm_title = "Med" - paygrade = "UE3" + paygrade = PAY_SHORT_UE3 /datum/equipment_preset/upp/medic/load_gear(mob/living/carbon/human/new_human) //back @@ -399,7 +405,7 @@ assignment = JOB_UPP_ENGI rank = JOB_UPP_ENGI role_comm_title = "Sap" - paygrade = "UE3" + paygrade = PAY_SHORT_UE3 /datum/equipment_preset/upp/sapper/load_gear(mob/living/carbon/human/new_human) //Sappers should have lots of gear and whatnot that helps them attack or siege marines @@ -533,7 +539,7 @@ assignment = JOB_UPP_SPECIALIST rank = JOB_UPP_SPECIALIST role_comm_title = "Spc" - paygrade = "UE5" + paygrade = PAY_SHORT_UE5 /datum/equipment_preset/upp/specialist/load_gear(mob/living/carbon/human/new_human) //back @@ -660,7 +666,7 @@ assignment = JOB_UPP_SPECIALIST rank = JOB_UPP_SPECIALIST role_comm_title = "Spc" - paygrade = "UE5" + paygrade = PAY_SHORT_UE5 /datum/equipment_preset/upp/machinegunner/load_gear(mob/living/carbon/human/new_human) //back @@ -785,7 +791,7 @@ assignment = JOB_UPP_LEADER rank = JOB_UPP_LEADER role_comm_title = "SL" - paygrade = "UE6" + paygrade = PAY_SHORT_UE6 /datum/equipment_preset/upp/leader/load_gear(mob/living/carbon/human/new_human) var/UPPleadsidearm = rand(1,4) @@ -953,7 +959,7 @@ assignment = JOB_UPP_POLICE rank = JOB_UPP_POLICE role_comm_title = "MP" - paygrade = "UE6" + paygrade = PAY_SHORT_UE6 /datum/equipment_preset/upp/military_police/load_gear(mob/living/carbon/human/new_human) //back @@ -1105,7 +1111,7 @@ assignment = JOB_UPP_LT_OFFICER rank = JOB_UPP_LT_OFFICER role_comm_title = "Lt." - paygrade = "UO1" + paygrade = PAY_SHORT_UO1 /datum/equipment_preset/upp/officer/load_gear(mob/living/carbon/human/new_human) //back @@ -1265,7 +1271,7 @@ assignment = JOB_UPP_SRLT_OFFICER rank = JOB_UPP_SRLT_OFFICER role_comm_title = "Sr-Lt." - paygrade = "UO2" + paygrade = PAY_SHORT_UO2 /datum/equipment_preset/upp/officer/senior/load_gear(mob/living/carbon/human/new_human) //back @@ -1425,7 +1431,7 @@ assignment = JOB_UPP_KPT_OFFICER rank = JOB_UPP_KPT_OFFICER role_comm_title = "May." - paygrade = "UO3" + paygrade = PAY_SHORT_UO3 skills = /datum/skills/upp/kapitan /datum/equipment_preset/upp/officer/kapitan/load_gear(mob/living/carbon/human/new_human) @@ -1586,7 +1592,7 @@ assignment = JOB_UPP_MAY_OFFICER rank = JOB_UPP_MAY_OFFICER role_comm_title = "May." - paygrade = "UO4" + paygrade = PAY_SHORT_UO4 skills = /datum/skills/upp/commander /datum/equipment_preset/upp/officer/major/load_gear(mob/living/carbon/human/new_human) @@ -1747,7 +1753,7 @@ assignment = JOB_UPP_LTKOL_OFFICER rank = JOB_UPP_LTKOL_OFFICER role_comm_title = "Lt. Kol." - paygrade = "UO5" + paygrade = PAY_SHORT_UO5 skills = /datum/skills/upp/commander /datum/equipment_preset/upp/officer/lt_kolonel/load_gear(mob/living/carbon/human/new_human) @@ -1908,7 +1914,7 @@ assignment = JOB_UPP_KOL_OFFICER rank = JOB_UPP_KOL_OFFICER role_comm_title = "Kol." - paygrade = "UO6" + paygrade = PAY_SHORT_UO6 skills = /datum/skills/upp/commander /datum/equipment_preset/upp/officer/kolonel/load_gear(mob/living/carbon/human/new_human) @@ -2069,7 +2075,7 @@ assignment = JOB_UPP_KOL_OFFICER rank = JOB_UPP_KOL_OFFICER role_comm_title = "May. Gen." - paygrade = "UO7" + paygrade = PAY_SHORT_UO7 skills = /datum/skills/upp/commander /datum/equipment_preset/upp/officer/may_gen/load_gear(mob/living/carbon/human/new_human) @@ -2230,7 +2236,7 @@ assignment = JOB_UPP_KOL_OFFICER rank = JOB_UPP_KOL_OFFICER role_comm_title = "Lt. Gen." - paygrade = "UO8" + paygrade = PAY_SHORT_UO8 skills = /datum/skills/upp/commander /datum/equipment_preset/upp/officer/ley_gen/load_gear(mob/living/carbon/human/new_human) @@ -2391,7 +2397,7 @@ assignment = JOB_UPP_KOL_OFFICER rank = JOB_UPP_KOL_OFFICER role_comm_title = "Gen." - paygrade = "UO9" + paygrade = PAY_SHORT_UO9 skills = /datum/skills/upp/commander /datum/equipment_preset/upp/officer/gen/load_gear(mob/living/carbon/human/new_human) @@ -2592,7 +2598,7 @@ skills = /datum/skills/synthetic assignment = JOB_UPP_COMBAT_SYNTH rank = JOB_UPP_COMBAT_SYNTH - paygrade = "SYN" + paygrade = PAY_SHORT_SYN idtype = /obj/item/card/id/gold /datum/equipment_preset/upp/synth/load_name(mob/living/carbon/human/new_human, randomise) @@ -2801,7 +2807,7 @@ assignment = JOB_UPP_CONSCRIPT rank = JOB_UPP_CONSCRIPT role_comm_title = "Cons" - paygrade = "UE1" + paygrade = PAY_SHORT_UE1 /datum/equipment_preset/upp/conscript/load_gear(mob/living/carbon/human/new_human) //TODO: add backpacks and satchels @@ -2909,7 +2915,7 @@ assignment = JOB_UPP_COMMANDO rank = JOB_UPP_COMMANDO role_comm_title = "JKdo" - paygrade = "UC1" + paygrade = PAY_SHORT_UC1 idtype = /obj/item/card/id/data languages = list(LANGUAGE_RUSSIAN, LANGUAGE_ENGLISH, LANGUAGE_TSL, LANGUAGE_SPANISH, LANGUAGE_CHINESE) @@ -3038,7 +3044,7 @@ assignment = JOB_UPP_COMMANDO_MEDIC rank = JOB_UPP_COMMANDO_MEDIC role_comm_title = "2ndKdo" - paygrade = "UC2" + paygrade = PAY_SHORT_UC2 /datum/equipment_preset/upp/commando/medic/load_gear(mob/living/carbon/human/new_human) //TODO: add backpacks and satchels @@ -3207,7 +3213,7 @@ assignment = JOB_UPP_COMMANDO_LEADER rank = JOB_UPP_COMMANDO_LEADER role_comm_title = "1stKdo" - paygrade = "UC3" + paygrade = PAY_SHORT_UC3 idtype = /obj/item/card/id/silver /datum/equipment_preset/upp/commando/leader/load_gear(mob/living/carbon/human/new_human) @@ -3459,7 +3465,7 @@ assignment = JOB_UPP_CREWMAN rank = JOB_UPP_CREWMAN - paygrade = "UE5" + paygrade = PAY_SHORT_UE5 role_comm_title = "TANK" minimum_age = 30 skills = /datum/skills/tank_crew @@ -3577,7 +3583,7 @@ assignment = JOB_UPP_LT_DOKTOR rank = JOB_UPP_LT_DOKTOR role_comm_title = "Lt. Med." - paygrade = "UO1" + paygrade = PAY_SHORT_UO1 /datum/equipment_preset/upp/doctor/load_gear(mob/living/carbon/human/new_human) //back diff --git a/code/modules/gear_presets/uscm.dm b/code/modules/gear_presets/uscm.dm index bb3cf26e2dee..8677b372159b 100644 --- a/code/modules/gear_presets/uscm.dm +++ b/code/modules/gear_presets/uscm.dm @@ -67,7 +67,7 @@ access = list(ACCESS_MARINE_PREP) assignment = JOB_SQUAD_MARINE rank = JOB_SQUAD_MARINE - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "RFN" skills = /datum/skills/pfc @@ -83,7 +83,7 @@ /datum/equipment_preset/uscm/pfc/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) - return "ME1" + return PAY_SHORT_ME1 return paygrade /datum/equipment_preset/uscm/pfc/cryo @@ -103,7 +103,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SMARTPREP) assignment = JOB_SQUAD_SMARTGUN rank = JOB_SQUAD_SMARTGUN - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "SG" skills = /datum/skills/smartgunner @@ -159,7 +159,7 @@ ) assignment = JOB_CREWMAN rank = JOB_CREWMAN - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 role_comm_title = "CRMN" minimum_age = 30 skills = /datum/skills/tank_crew @@ -220,7 +220,7 @@ ) assignment = JOB_INTEL rank = JOB_INTEL - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 role_comm_title = "IO" skills = /datum/skills/intel @@ -276,7 +276,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SPECPREP) assignment = JOB_SQUAD_SPECIALIST rank = JOB_SQUAD_SPECIALIST - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "Spc" skills = /datum/skills/specialist @@ -333,7 +333,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_MEDPREP, ACCESS_MARINE_MEDBAY) assignment = JOB_SQUAD_MEDIC rank = JOB_SQUAD_MEDIC - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "HM" skills = /datum/skills/combat_medic @@ -365,7 +365,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_TL_PREP) assignment = JOB_SQUAD_TEAM_LEADER rank = JOB_SQUAD_TEAM_LEADER - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 role_comm_title = "FTL" skills = /datum/skills/tl @@ -395,7 +395,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_ENGPREP, ACCESS_CIVILIAN_ENGINEERING) assignment = JOB_SQUAD_ENGI rank = JOB_SQUAD_ENGI - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "ComTech" skills = /datum/skills/combat_engineer @@ -427,7 +427,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP) assignment = JOB_SQUAD_LEADER rank = JOB_SQUAD_LEADER - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "SL" minimum_age = 27 skills = /datum/skills/SL @@ -460,7 +460,7 @@ access = list(ACCESS_MARINE_PREP) assignment = JOB_SQUAD_MARINE rank = JOB_SQUAD_MARINE - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "RFN" skills = /datum/skills/pfc/crafty @@ -472,7 +472,7 @@ /datum/equipment_preset/uscm/private_equipped/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) - return "ME1" + return PAY_SHORT_ME1 return paygrade /datum/equipment_preset/uscm/private_equipped/load_gear(mob/living/carbon/human/new_human) @@ -508,7 +508,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP) assignment = JOB_SQUAD_LEADER rank = JOB_SQUAD_LEADER - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "SL" minimum_age = 27 skills = /datum/skills/SL @@ -550,7 +550,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SMARTPREP) assignment = JOB_SQUAD_SMARTGUN rank = JOB_SQUAD_SMARTGUN - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "SG" skills = /datum/skills/smartgunner @@ -587,7 +587,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_ENGPREP, ACCESS_CIVILIAN_ENGINEERING) assignment = JOB_SQUAD_ENGI rank = JOB_SQUAD_ENGI - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "ComTech" skills = /datum/skills/combat_engineer @@ -633,7 +633,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_MEDPREP, ACCESS_MARINE_MEDBAY) assignment = JOB_SQUAD_MEDIC rank = JOB_SQUAD_MEDIC - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "HM" skills = /datum/skills/combat_medic @@ -687,7 +687,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SPECPREP) assignment = JOB_SQUAD_SPECIALIST rank = JOB_SQUAD_SPECIALIST - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "Spc" skills = /datum/skills/specialist @@ -757,7 +757,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_TL_PREP) assignment = JOB_SQUAD_TEAM_LEADER rank = JOB_SQUAD_TEAM_LEADER - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 role_comm_title = "TL" skills = /datum/skills/tl @@ -798,7 +798,7 @@ skills = /datum/skills/commando/deathsquad auto_squad_name = SQUAD_SOF ert_squad = TRUE - paygrade = "ME6" + paygrade = PAY_SHORT_ME6 minimap_icon = "private" @@ -851,7 +851,7 @@ /datum/equipment_preset/uscm/marsoc/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) > JOB_PLAYTIME_TIER_2) - return "ME7" + return PAY_SHORT_ME7 return paygrade //Covert Raiders @@ -871,7 +871,7 @@ assignment = JOB_MARINE_RAIDER_SL rank = JOB_MARINE_RAIDER_SL role_comm_title = "TL." - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 skills = /datum/skills/commando/deathsquad/leader minimap_icon = "leader" @@ -879,7 +879,7 @@ /datum/equipment_preset/uscm/marsoc/sl/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) > JOB_PLAYTIME_TIER_2) - return "MO2" + return PAY_SHORT_MO2 return paygrade //Codenamed Team Leader @@ -898,13 +898,13 @@ assignment = JOB_MARINE_RAIDER_CMD rank = JOB_MARINE_RAIDER_CMD role_comm_title = "CMD." - paygrade = "MO3" + paygrade = PAY_SHORT_MO3 skills = /datum/skills/commando/deathsquad/officer /datum/equipment_preset/uscm/marsoc/cmd/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) > JOB_PLAYTIME_TIER_3) - return "MO4" + return PAY_SHORT_MO4 return paygrade /datum/equipment_preset/uscm/marsoc/low_threat @@ -954,7 +954,7 @@ assignment = JOB_MARINE_RAIDER_SL rank = JOB_MARINE_RAIDER_SL role_comm_title = "TL." - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 skills = /datum/skills/commando/deathsquad/leader minimap_icon = "leader" @@ -962,5 +962,5 @@ /datum/equipment_preset/uscm/marsoc/sl/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) > JOB_PLAYTIME_TIER_2) - return "MO2" + return PAY_SHORT_MO2 return paygrade diff --git a/code/modules/gear_presets/uscm_dress.dm b/code/modules/gear_presets/uscm_dress.dm index 393cc5b41a66..080ed18d7c40 100644 --- a/code/modules/gear_presets/uscm_dress.dm +++ b/code/modules/gear_presets/uscm_dress.dm @@ -5,7 +5,7 @@ rank = JOB_MARINE access = list(ACCESS_MARINE_PREP) minimum_age = 18 - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "Mar" skills = /datum/skills/pfc @@ -25,13 +25,13 @@ /datum/equipment_preset/uscm_event/dress/lcpl name = "Dress Blues - (E-3) Lance Corporal" - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 //NCOs/SNCOs// /datum/equipment_preset/uscm_event/dress/nco name = "Dress Blues - (E-4) Corporal" - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 skills = /datum/skills/SL dress_under = list(/obj/item/clothing/under/marine/dress/blues/senior) @@ -44,11 +44,11 @@ /datum/equipment_preset/uscm_event/dress/nco/sgt name = "Dress Blues - (E-5) Sergeant" - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 /datum/equipment_preset/uscm_event/dress/nco/snco name = "Dress Blues - (E-6) Staff Sergeant" - paygrade = "ME6" + paygrade = PAY_SHORT_ME6 skills = /datum/skills/SEA access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP) @@ -58,29 +58,29 @@ /datum/equipment_preset/uscm_event/dress/nco/snco/gysgt name = "Dress Blues - (E-7) Gunnery Sergeant" - paygrade = "ME7" + paygrade = PAY_SHORT_ME7 /datum/equipment_preset/uscm_event/dress/nco/snco/msgt name = "Dress Blues - (E-8) Master Sergeant" - paygrade = "ME8" + paygrade = PAY_SHORT_ME8 /datum/equipment_preset/uscm_event/dress/nco/snco/firstsgt name = "Dress Blues - (E-8E) First Sergeant" - paygrade = "ME8E" + paygrade = PAY_SHORT_ME8E /datum/equipment_preset/uscm_event/dress/nco/snco/mgysgt name = "Dress Blues - (E-9) Master Gunnery Sergeant" - paygrade = "ME9" + paygrade = PAY_SHORT_ME9 /datum/equipment_preset/uscm_event/dress/nco/snco/sgtmaj name = "Dress Blues - (E-9E) Sergeant Major" - paygrade = "ME9E" + paygrade = PAY_SHORT_ME9E //FIELD OFFICERS// /datum/equipment_preset/uscm_event/dress/officer name = "Dress Blues - (O-1) 2nd Lieutenant" - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 idtype = /obj/item/card/id/silver skills = /datum/skills/SO access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_MEDBAY) @@ -100,11 +100,11 @@ /datum/equipment_preset/uscm_event/dress/officer/firstlt name = "Dress Blues - (O-2) 1st Lieutenant" - paygrade = "MO2" + paygrade = PAY_SHORT_MO2 /datum/equipment_preset/uscm_event/dress/officer/capt name = "Dress Blues - (O-3) Captain" - paygrade = "MO3" + paygrade = PAY_SHORT_MO3 idtype = /obj/item/card/id/gold skills = /datum/skills/XO @@ -115,7 +115,7 @@ /datum/equipment_preset/uscm_event/dress/officer/co name = "Dress Blues - (O-4) Major" - paygrade = "MO4" + paygrade = PAY_SHORT_MO4 idtype = /obj/item/card/id/gold skills = /datum/skills/commander @@ -125,19 +125,19 @@ /datum/equipment_preset/uscm_event/dress/officer/co/ltcol name = "Dress Blues - (O-5) Lieutenant Colonel" - paygrade = "MO5" + paygrade = PAY_SHORT_MO5 idtype = /obj/item/card/id/gold/council /datum/equipment_preset/uscm_event/dress/officer/co/col name = "Dress Blues - (O-6) Colonel" - paygrade = "MO6" + paygrade = PAY_SHORT_MO6 idtype = /obj/item/card/id/general //GENERAL OFFICERS// /datum/equipment_preset/uscm_event/dress/officer/general name = "Dress Blues - (O-8) Major General" - paygrade = "MO8" + paygrade = PAY_SHORT_MO8 idtype = /obj/item/card/id/general skills = /datum/skills/general @@ -155,8 +155,8 @@ /datum/equipment_preset/uscm_event/dress/officer/general/ltgen name = "Dress Blues - (O-9) Lieutenant General" - paygrade = "MO9" + paygrade = PAY_SHORT_MO9 /datum/equipment_preset/uscm_event/dress/officer/general/gen name = "Dress Blues - (O-10) General" - paygrade = "MO10" + paygrade = PAY_SHORT_MO10 diff --git a/code/modules/gear_presets/uscm_event.dm b/code/modules/gear_presets/uscm_event.dm index 12db6323ac40..ce36f1fd807f 100644 --- a/code/modules/gear_presets/uscm_event.dm +++ b/code/modules/gear_presets/uscm_event.dm @@ -16,7 +16,7 @@ access = list(ACCESS_MARINE_MEDBAY, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_MORGUE) assignment = JOB_COLONEL rank = JOB_COLONEL - paygrade = "MO6" + paygrade = PAY_SHORT_MO6 role_comm_title = "COL" minimum_age = 40 skills = /datum/skills/general @@ -61,7 +61,7 @@ access = list(ACCESS_MARINE_MEDBAY, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_MORGUE) assignment = JOB_GENERAL rank = JOB_GENERAL - paygrade = "MO7" + paygrade = PAY_SHORT_MO7 role_comm_title = "GEN" minimum_age = 50 skills = /datum/skills/general @@ -102,30 +102,30 @@ /datum/equipment_preset/uscm_event/general/o7 name = "USCM O-7 - Brigadier General (High Command)" - paygrade = "MO7" + paygrade = PAY_SHORT_MO7 /datum/equipment_preset/uscm_event/general/o8 name = "USCM O-8 - Major General (High Command)" - paygrade = "MO8" + paygrade = PAY_SHORT_MO8 /datum/equipment_preset/uscm_event/general/o9 name = "USCM O-9 - Lieutenant General (High Command)" - paygrade = "MO9" + paygrade = PAY_SHORT_MO9 /datum/equipment_preset/uscm_event/general/o10 name = "USCM O-10 - General (High Command)" - paygrade = "MO10" + paygrade = PAY_SHORT_MO10 /datum/equipment_preset/uscm_event/general/o10c name = "USCM O-10C - Assistant Commandant of the Marine Corps (High Command)" - paygrade = "MO10C" + paygrade = PAY_SHORT_MO10C assignment = JOB_ACMC rank = JOB_ACMC role_comm_title = "ACMC" /datum/equipment_preset/uscm_event/general/o10s name = "USCM O-10S - Commandant of the Marine Corps (High Command)" - paygrade = "MO10S" + paygrade = PAY_SHORT_MO10S assignment = JOB_CMC rank = JOB_CMC role_comm_title = "CMC" @@ -145,7 +145,7 @@ ) assignment = JOB_ORDNANCE_TECH rank = "UPP" - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "OT" skills = /datum/skills/spy @@ -192,11 +192,11 @@ access = get_access(ACCESS_LIST_MARINE_ALL) /datum/equipment_preset/uscm_event/provost/enforcer - name = "Provost Enforcer (ME5)" + name = "Provost Enforcer" assignment = JOB_PROVOST_ENFORCER rank = "Provost Enforcer" - paygrade = "ME5" + paygrade = PAY_SHORT_CPO role_comm_title = "PvE" flags = EQUIPMENT_PRESET_EXTRA @@ -233,12 +233,12 @@ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/combat(new_human), WEAR_J_STORE) /datum/equipment_preset/uscm_event/provost/tml - name = "Provost Team Leader (ME6)" + name = "Provost Team Leader" skills = /datum/skills/CMP assignment = JOB_PROVOST_TML rank = "Provost Team Leader" - paygrade = "ME6" + paygrade = PAY_SHORT_CSPO role_comm_title = "PvTML" flags = EQUIPMENT_PRESET_EXTRA @@ -276,11 +276,11 @@ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/combat(new_human), WEAR_J_STORE) /datum/equipment_preset/uscm_event/provost/inspector - name = "Provost Inspector (PvI)" + name = "Provost Inspector" assignment = JOB_PROVOST_INSPECTOR rank = "Provost Inspector" - paygrade = "PvI" + paygrade = PAY_SHORT_PVI role_comm_title = "PvI" flags = EQUIPMENT_PRESET_EXTRA @@ -312,11 +312,11 @@ new_human.equip_to_slot_or_del(new /obj/item/handcuffs(new_human), WEAR_IN_JACKET) /datum/equipment_preset/uscm_event/provost/inspector/advisor - name = "Provost Advisor (ME6)" + name = "Provost Advisor" assignment = JOB_PROVOST_ADVISOR rank = "Provost Advisor" - paygrade = "ME6" + paygrade = PAY_SHORT_CSPO role_comm_title = "PvA" flags = EQUIPMENT_PRESET_EXTRA @@ -327,8 +327,8 @@ assignment = JOB_PROVOST_MARSHAL rank = "Provost Marshal" - paygrade = "MO6" - role_comm_title = "PvM" + paygrade = PAY_SHORT_PVM + role_comm_title = PAY_SHORT_PVM flags = EQUIPMENT_PRESET_EXTRA /datum/equipment_preset/uscm_event/provost/marshal/load_gear(mob/living/carbon/human/new_human) @@ -358,8 +358,8 @@ assignment = JOB_PROVOST_SMARSHAL rank = "Provost Sector Marshal" - paygrade = "MO7" - role_comm_title = "PvSM" + paygrade = PAY_SHORT_PVSM + role_comm_title = PAY_SHORT_PVSM /datum/equipment_preset/uscm_event/provost/marshal/chief name = "Provost Chief Marshal (PvCM)" @@ -367,8 +367,8 @@ assignment = JOB_PROVOST_CMARSHAL rank = "Provost Chief Marshal" - paygrade = "PvCM" - role_comm_title = "PvCM" + paygrade = PAY_SHORT_PVCM + role_comm_title = PAY_SHORT_PVCM /*****************************************************************************************************/ @@ -389,7 +389,7 @@ assignment = JOB_TIS_IO rank = "UAAC-TIS Intelligence Officer" - paygrade = "NO2" + paygrade = PAY_SHORT_NO2 role_comm_title = "TIS-IO" flags = EQUIPMENT_PRESET_EXTRA @@ -416,7 +416,7 @@ assignment = JOB_TIS_SA rank = "UAAC-TIS Special Agent" - paygrade = "NO5" + paygrade = PAY_SHORT_NO5 role_comm_title = "TIS-SA" flags = EQUIPMENT_PRESET_EXTRA diff --git a/code/modules/gear_presets/uscm_medical.dm b/code/modules/gear_presets/uscm_medical.dm index 47d5ee19c9b4..be599755bacf 100644 --- a/code/modules/gear_presets/uscm_medical.dm +++ b/code/modules/gear_presets/uscm_medical.dm @@ -36,7 +36,7 @@ ) assignment = JOB_CMO rank = JOB_CMO - paygrade = "MO2" + paygrade = PAY_SHORT_MO2 role_comm_title = "CMO" skills = /datum/skills/CMO @@ -80,7 +80,7 @@ assignment = JOB_DOCTOR rank = JOB_DOCTOR - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 role_comm_title = "Doc" skills = /datum/skills/doctor @@ -114,7 +114,7 @@ assignment = JOB_NURSE rank = JOB_NURSE - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "Nurse" skills = /datum/skills/nurse @@ -139,7 +139,7 @@ /datum/equipment_preset/uscm_ship/uscm_medical/nurse/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) - return "ME3" + return PAY_SHORT_ME3 return paygrade //*****************************************************************************************************/ @@ -149,7 +149,7 @@ access = list(ACCESS_MARINE_MEDBAY, ACCESS_MARINE_RESEARCH, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_MORGUE) assignment = JOB_RESEARCHER rank = JOB_RESEARCHER - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 role_comm_title = "Rsr" skills = /datum/skills/researcher diff --git a/code/modules/gear_presets/uscm_police.dm b/code/modules/gear_presets/uscm_police.dm index 0ead4f713c23..14e35d990348 100644 --- a/code/modules/gear_presets/uscm_police.dm +++ b/code/modules/gear_presets/uscm_police.dm @@ -27,7 +27,7 @@ ) assignment = JOB_POLICE rank = JOB_POLICE - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "MP" skills = /datum/skills/MP @@ -61,7 +61,7 @@ /datum/equipment_preset/uscm_ship/uscm_police/mp/load_rank(mob/living/carbon/human/human) if(human.client && get_job_playtime(human.client, rank) < JOB_PLAYTIME_TIER_1) - return "ME3" + return PAY_SHORT_ME3 return paygrade //*****************************************************************************************************/ @@ -90,7 +90,7 @@ ) assignment = JOB_WARDEN rank = JOB_WARDEN - paygrade = "ME6" + paygrade = PAY_SHORT_ME6 role_comm_title = "MW" skills = /datum/skills/MW @@ -151,7 +151,7 @@ ) assignment = JOB_CHIEF_POLICE rank = JOB_CHIEF_POLICE - paygrade = "MO2" + paygrade = PAY_SHORT_MO2 role_comm_title = "CMP" skills = /datum/skills/CMP @@ -195,7 +195,7 @@ access = list() assignment = JOB_RIOT rank = JOB_RIOT - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "RMP" skills = /datum/skills/CMP @@ -243,6 +243,6 @@ assignment = JOB_RIOT_CHIEF rank = JOB_RIOT_CHIEF - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 role_comm_title = "CRMP" skills = /datum/skills/CMP diff --git a/code/modules/gear_presets/uscm_ship.dm b/code/modules/gear_presets/uscm_ship.dm index d34137a1c36b..b5ef13f35b2b 100644 --- a/code/modules/gear_presets/uscm_ship.dm +++ b/code/modules/gear_presets/uscm_ship.dm @@ -45,7 +45,7 @@ ) assignment = JOB_CORPORATE_LIAISON rank = JOB_CORPORATE_LIAISON - paygrade = "WYC2" + paygrade = PAY_SHORT_WYC2 role_comm_title = "CL" skills = /datum/skills/civilian @@ -89,11 +89,11 @@ var/playtime = get_job_playtime(new_human.client, rank) if(new_human.client.prefs.playtime_perks) if(playtime > JOB_PLAYTIME_TIER_4) - return "WYC5" + return PAY_SHORT_WYC5 else if(playtime > JOB_PLAYTIME_TIER_3) - return "WYC4" + return PAY_SHORT_WYC4 else if(playtime > JOB_PLAYTIME_TIER_2) - return "WYC3" + return PAY_SHORT_WYC3 else return paygrade return paygrade @@ -119,7 +119,7 @@ ) assignment = JOB_COMBAT_REPORTER rank = JOB_COMBAT_REPORTER - paygrade = "C" + paygrade = PAY_SHORT_CIV role_comm_title = "PRESS" skills = /datum/skills/civilian idtype = /obj/item/card/id/silver/cl @@ -151,7 +151,7 @@ ) assignment = JOB_COMBAT_REPORTER rank = JOB_COMBAT_REPORTER - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 role_comm_title = "CC" skills = /datum/skills/pfc idtype = /obj/item/card/id/dogtag @@ -203,7 +203,7 @@ ) assignment = JOB_CHIEF_ENGINEER rank = JOB_CHIEF_ENGINEER - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 role_comm_title = "CE" minimum_age = 27 skills = /datum/skills/CE @@ -239,7 +239,7 @@ ) assignment = JOB_MAINT_TECH rank = JOB_MAINT_TECH - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "MT" skills = /datum/skills/MT @@ -267,7 +267,7 @@ /datum/equipment_preset/uscm_ship/maint/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) - return "ME1" + return PAY_SHORT_ME1 return paygrade //*****************************************************************************************************/ @@ -285,7 +285,7 @@ ) assignment = JOB_ORDNANCE_TECH rank = JOB_ORDNANCE_TECH - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "OT" skills = /datum/skills/OT @@ -326,7 +326,7 @@ ) assignment = JOB_CHIEF_REQUISITION rank = JOB_CHIEF_REQUISITION - paygrade = "ME7" + paygrade = PAY_SHORT_ME7 role_comm_title = "QM" minimum_age = 27 skills = /datum/skills/RO @@ -359,7 +359,7 @@ access = list(ACCESS_MARINE_CARGO, ACCESS_MARINE_PREP) assignment = JOB_CARGO_TECH rank = JOB_CARGO_TECH - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "CT" skills = /datum/skills/CT @@ -384,7 +384,7 @@ /datum/equipment_preset/uscm_ship/cargo/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) - return "ME1" + return PAY_SHORT_ME1 return paygrade //*****************************************************************************************************/ @@ -396,7 +396,7 @@ idtype = /obj/item/card/id/gold assignment = JOB_CO rank = JOB_CO - paygrade = "MO4" + paygrade = PAY_SHORT_MO4 role_comm_title = "CO" minimum_age = 30 skills = /datum/skills/commander @@ -469,7 +469,7 @@ idtype = /obj/item/card/id/gold/council rank = JOB_CO - paygrade = "MO5" + paygrade = PAY_SHORT_MO5 role_comm_title = "CO" minimum_age = 35 @@ -488,7 +488,7 @@ /datum/equipment_preset/uscm_ship/commander/council/plus name = "USCM Commanding Officer (CO++)" idtype = /obj/item/card/id/general - paygrade = "MO6" + paygrade = PAY_SHORT_MO6 /datum/equipment_preset/uscm_ship/commander/council/plus/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/marine/commander/councilchief(new_human), WEAR_HEAD) @@ -503,7 +503,7 @@ idtype = /obj/item/card/id/silver assignment = JOB_XO rank = JOB_XO - paygrade = "MO3" + paygrade = PAY_SHORT_MO3 role_comm_title = "XO" minimum_age = 35 skills = /datum/skills/XO @@ -542,7 +542,7 @@ access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_MEDBAY) assignment = JOB_SO rank = JOB_SO - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 role_comm_title = "SO" minimum_age = 25 skills = /datum/skills/SO @@ -575,7 +575,7 @@ access assignment = JOB_SEA rank = JOB_SEA - paygrade = "ME7" + paygrade = PAY_SHORT_ME7 role_comm_title = "SEA" minimum_age = 40 skills = /datum/skills/SEA @@ -619,7 +619,7 @@ idtype = /obj/item/card/id/silver assignment = JOB_AUXILIARY_OFFICER rank = JOB_AUXILIARY_OFFICER - paygrade = "MO2" + paygrade = PAY_SHORT_MO2 role_comm_title = "ASO" minimum_age = 27 skills = /datum/skills/auxiliary_officer @@ -678,7 +678,7 @@ access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_PILOT) assignment = JOB_PILOT rank = JOB_PILOT - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 role_comm_title = "DP" skills = /datum/skills/pilot @@ -728,7 +728,7 @@ access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_PILOT) assignment = JOB_DROPSHIP_CREW_CHIEF rank = JOB_DROPSHIP_CREW_CHIEF - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "DCC" skills = /datum/skills/crew_chief @@ -778,7 +778,7 @@ access = list(ACCESS_MARINE_MEDBAY, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_MORGUE) assignment = "USCM Officer" rank = "USCM Officer" - paygrade = "MO3" + paygrade = PAY_SHORT_MO3 role_comm_title = "Cpt" minimum_age = 40 skills = /datum/skills/commander @@ -818,7 +818,7 @@ access = list(ACCESS_MARINE_KITCHEN) assignment = JOB_MESS_SERGEANT rank = JOB_MESS_SERGEANT - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "MST" skills = /datum/skills/mess_technician @@ -844,5 +844,5 @@ /datum/equipment_preset/uscm_ship/chef/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) - return "ME1" + return PAY_SHORT_ME1 return paygrade diff --git a/code/modules/gear_presets/whiteout.dm b/code/modules/gear_presets/whiteout.dm index 0f367b57e9e2..62b6d5db8008 100644 --- a/code/modules/gear_presets/whiteout.dm +++ b/code/modules/gear_presets/whiteout.dm @@ -9,7 +9,7 @@ languages = list(LANGUAGE_ENGLISH, LANGUAGE_JAPANESE, LANGUAGE_CHINESE, LANGUAGE_RUSSIAN, LANGUAGE_GERMAN, LANGUAGE_SPANISH, LANGUAGE_YAUTJA, LANGUAGE_XENOMORPH, LANGUAGE_TSL) //Synths after all. skills = /datum/skills/everything //They are Synths, programmed for Everything. idtype = /obj/item/card/id/pmc/ds - paygrade = "O" + paygrade = PAY_SHORT_OPR /datum/equipment_preset/pmc/w_y_whiteout/New() . = ..() diff --git a/code/modules/gear_presets/wo.dm b/code/modules/gear_presets/wo.dm index acc795dc6882..884b865bce11 100644 --- a/code/modules/gear_presets/wo.dm +++ b/code/modules/gear_presets/wo.dm @@ -17,7 +17,7 @@ assignment = JOB_WO_CO rank = JOB_WO_CO - paygrade = "MO2" + paygrade = PAY_SHORT_MO2 role_comm_title = "CDR" skills = /datum/skills/commander idtype = /obj/item/card/id/gold @@ -96,7 +96,7 @@ assignment = JOB_WO_XO rank = JOB_WO_XO - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 role_comm_title = "LCDR" skills = /datum/skills/XO idtype = /obj/item/card/id/silver @@ -140,7 +140,7 @@ access = list(ACCESS_MARINE_BRIG, ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_PREP, ACCESS_MARINE_CMP, ACCESS_MARINE_MEDBAY) assignment = JOB_WO_CHIEF_POLICE rank = JOB_WO_CHIEF_POLICE - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "HGSL" skills = /datum/skills/honor_guard/lead idtype = /obj/item/card/id/silver @@ -176,7 +176,7 @@ access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_BRIG, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_DATABASE) assignment = JOB_WO_SO rank = JOB_WO_SO - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 role_comm_title = "VHG" skills = /datum/skills/honor_guard/vet idtype = /obj/item/card/id/silver @@ -218,7 +218,7 @@ access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_DATABASE) assignment = JOB_WO_CREWMAN rank = JOB_WO_CREWMAN - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "HGS" skills = /datum/skills/honor_guard/spec idtype = /obj/item/card/id/gold @@ -258,7 +258,7 @@ access = list(ACCESS_MARINE_BRIG, ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_PREP, ACCESS_MARINE_MEDBAY) assignment = JOB_WO_POLICE rank = JOB_WO_POLICE - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "HG" skills = /datum/skills/honor_guard @@ -292,7 +292,7 @@ access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_PILOT) assignment = JOB_WO_PILOT rank = JOB_WO_PILOT - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "MC" skills = /datum/skills/mortar_crew @@ -327,7 +327,7 @@ access = list(ACCESS_MARINE_CARGO, ACCESS_MARINE_RO, ACCESS_MARINE_COMMAND) assignment = JOB_WO_CHIEF_REQUISITION rank = JOB_WO_CHIEF_REQUISITION - paygrade = "ME8" + paygrade = PAY_SHORT_ME8 role_comm_title = "QM" skills = /datum/skills/RO idtype = /obj/item/card/id/silver @@ -357,7 +357,7 @@ access = list(ACCESS_MARINE_ENGINEERING, ACCESS_CIVILIAN_ENGINEERING, ACCESS_MARINE_CARGO) assignment = JOB_WO_REQUISITION rank = JOB_WO_REQUISITION - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 role_comm_title = "BCL" skills = /datum/skills/CE idtype = /obj/item/card/id @@ -389,7 +389,7 @@ access = list(ACCESS_MARINE_CMO, ACCESS_MARINE_MEDBAY, ACCESS_MARINE_RESEARCH, ACCESS_MARINE_COMMAND, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_MORGUE) assignment = JOB_WO_CMO rank = JOB_WO_CMO - paygrade = "CCMO" + paygrade = PAY_SHORT_CCMO role_comm_title = "HS" skills = /datum/skills/CMO idtype = /obj/item/card/id/silver @@ -432,7 +432,7 @@ access = list(ACCESS_MARINE_MEDBAY, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_MORGUE) assignment = JOB_WO_DOCTOR rank = JOB_WO_DOCTOR - paygrade = "CD" + paygrade = PAY_SHORT_CDOC role_comm_title = "Doc" skills = /datum/skills/doctor idtype = /obj/item/card/id @@ -472,7 +472,7 @@ access = list(ACCESS_MARINE_MEDBAY, ACCESS_MARINE_RESEARCH, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_MORGUE) assignment = JOB_WO_RESEARCHER rank = JOB_WO_RESEARCHER - paygrade = "CD" + paygrade = PAY_SHORT_CDOC role_comm_title = "Chem" skills = /datum/skills/researcher idtype = /obj/item/card/id @@ -512,7 +512,7 @@ access = list(ACCESS_MARINE_CE, ACCESS_MARINE_ENGINEERING, ACCESS_MARINE_COMMAND, ACCESS_CIVILIAN_ENGINEERING, ACCESS_MARINE_DATABASE) assignment = JOB_WO_CHIEF_ENGINEER rank = JOB_WO_CHIEF_ENGINEER - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "BCM" skills = /datum/skills/CE idtype = /obj/item/card/id/silver @@ -546,7 +546,7 @@ access = list(ACCESS_MARINE_CE, ACCESS_MARINE_ENGINEERING, ACCESS_MARINE_COMMAND, ACCESS_CIVILIAN_ENGINEERING) assignment = JOB_WO_ORDNANCE_TECH rank = JOB_WO_ORDNANCE_TECH - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 role_comm_title = "BC" skills = /datum/skills/OT idtype = /obj/item/card/id @@ -579,7 +579,7 @@ assignment = JOB_WO_CORPORATE_LIAISON rank = JOB_WO_CORPORATE_LIAISON - paygrade = "WYC2" + paygrade = PAY_SHORT_WYC2 role_comm_title = "PRESS" skills = /datum/skills/civilian idtype = /obj/item/card/id/silver/cl @@ -623,7 +623,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP) assignment = JOB_SQUAD_LEADER rank = JOB_SQUAD_LEADER - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "SL" skills = /datum/skills/SL @@ -658,7 +658,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SPECPREP) assignment = JOB_SQUAD_SPECIALIST rank = JOB_SQUAD_SPECIALIST - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "Spc" skills = /datum/skills/specialist @@ -693,7 +693,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SMARTPREP) assignment = JOB_SQUAD_SMARTGUN rank = JOB_SQUAD_SMARTGUN - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "SG" skills = /datum/skills/smartgunner @@ -717,7 +717,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_ENGPREP, ACCESS_CIVILIAN_ENGINEERING) assignment = JOB_SQUAD_ENGI rank = JOB_SQUAD_ENGI - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "ComTech" skills = /datum/skills/combat_engineer @@ -751,7 +751,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_MEDPREP, ACCESS_MARINE_MEDBAY) assignment = JOB_SQUAD_MEDIC rank = JOB_SQUAD_MEDIC - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "HM" skills = /datum/skills/combat_medic @@ -789,7 +789,7 @@ access = list(ACCESS_MARINE_PREP) assignment = JOB_SQUAD_MARINE rank = JOB_SQUAD_MARINE - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "RFN" skills = /datum/skills/pfc diff --git a/code/modules/gear_presets/wy.dm b/code/modules/gear_presets/wy.dm index d5b5194401bd..0b63c76b59d0 100644 --- a/code/modules/gear_presets/wy.dm +++ b/code/modules/gear_presets/wy.dm @@ -1,6 +1,6 @@ /datum/equipment_preset/wy name = "WY" - paygrade = "WYC1" + paygrade = PAY_SHORT_WYC1 faction = FACTION_WY rank = FACTION_WY @@ -29,7 +29,7 @@ flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_TRAINEE rank = JOB_TRAINEE - paygrade = "WYC1" + paygrade = PAY_SHORT_WYC1 /datum/equipment_preset/wy/trainee/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/trainee(new_human), WEAR_BODY) @@ -40,35 +40,35 @@ flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_JUNIOR_EXECUTIVE rank = JOB_JUNIOR_EXECUTIVE - paygrade = "WYC2" + paygrade = PAY_SHORT_WYC2 /datum/equipment_preset/wy/exec name = "Corporate - C - Executive" flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_EXECUTIVE rank = JOB_EXECUTIVE - paygrade = "WYC3" + paygrade = PAY_SHORT_WYC3 /datum/equipment_preset/wy/senior_exec name = "Corporate - D - Senior Executive" flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_SENIOR_EXECUTIVE rank = JOB_SENIOR_EXECUTIVE - paygrade = "WYC4" + paygrade = PAY_SHORT_WYC4 /datum/equipment_preset/wy/exec_spec name = "Corporate - E - Executive Specialist" flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_EXECUTIVE_SPECIALIST rank = JOB_EXECUTIVE_SPECIALIST - paygrade = "WYC5" + paygrade = PAY_SHORT_WYC5 /datum/equipment_preset/wy/exec_supervisor name = "Corporate - F - Executive Supervisor" flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_EXECUTIVE_SUPERVISOR rank = JOB_EXECUTIVE_SUPERVISOR - paygrade = "WYC6" + paygrade = PAY_SHORT_WYC6 /datum/equipment_preset/wy/manager skills = /datum/skills/civilian/manager @@ -91,21 +91,21 @@ flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_ASSISTANT_MANAGER rank = JOB_ASSISTANT_MANAGER - paygrade = "WYC7" + paygrade = PAY_SHORT_WYC7 /datum/equipment_preset/wy/manager/division_manager name = "Corporate - H - Division Manager" flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_DIVISION_MANAGER rank = JOB_DIVISION_MANAGER - paygrade = "WYC8" + paygrade = PAY_SHORT_WYC8 /datum/equipment_preset/wy/manager/chief_executive name = "Corporate - I - Chief Executive" flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_CHIEF_EXECUTIVE rank = JOB_CHIEF_EXECUTIVE - paygrade = "WYC9" + paygrade = PAY_SHORT_WYC9 /datum/equipment_preset/wy/manager/chief_executive/New() . = ..() @@ -116,7 +116,7 @@ flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_DIRECTOR rank = JOB_DIRECTOR - paygrade = "WYC10" + paygrade = PAY_SHORT_WYC10 skills = /datum/skills/civilian/manager/director headset_type = /obj/item/device/radio/headset/distress/pmc/command/director diff --git a/code/modules/gear_presets/wy_goons.dm b/code/modules/gear_presets/wy_goons.dm index 1be8cb990255..a7c0dad679ee 100644 --- a/code/modules/gear_presets/wy_goons.dm +++ b/code/modules/gear_presets/wy_goons.dm @@ -61,7 +61,7 @@ assignment = JOB_WY_GOON rank = JOB_WY_GOON - paygrade = "WEY-GOON" + paygrade = PAY_SHORT_CPO skills = /datum/skills/MP /datum/equipment_preset/goon/standard/load_gear(mob/living/carbon/human/new_human) @@ -94,7 +94,7 @@ assignment = JOB_WY_GOON_LEAD rank = JOB_WY_GOON_LEAD - paygrade = "WEY-GOON-L" + paygrade = PAY_SHORT_CSPO skills = /datum/skills/MP /datum/equipment_preset/goon/lead/New() @@ -130,7 +130,7 @@ assignment = JOB_WY_GOON_RESEARCHER rank = JOB_WY_GOON_RESEARCHER - paygrade = "CCMO" + paygrade = PAY_SHORT_CCMO skills = /datum/skills/researcher /datum/equipment_preset/goon/researcher/load_gear(mob/living/carbon/human/new_human) diff --git a/code/modules/hydroponics/hydro_tray.dm b/code/modules/hydroponics/hydro_tray.dm index d3a086d96e04..75bfaa5c31a8 100644 --- a/code/modules/hydroponics/hydro_tray.dm +++ b/code/modules/hydroponics/hydro_tray.dm @@ -359,7 +359,7 @@ if(!user || !dead) return if(closed_system) - to_chat(user, "You can't remove the dead plant while the lid is shut.") + to_chat(user, SPAN_WARNING("You can't remove the dead plant while the lid is shut.")) return seed = null @@ -369,10 +369,9 @@ yield_mod = 0 mutation_mod = 0 - to_chat(user, "You remove the dead plant from the [src].") + to_chat(user, SPAN_NOTICE("You remove the dead plant from [src].")) check_level_sanity() update_icon() - return //Refreshes the icon and sets the luminosity /obj/structure/machinery/portable_atmospherics/hydroponics/update_icon() @@ -593,7 +592,7 @@ else if (istype(O, /obj/item/tool/minihoe)) // The minihoe if(weedlevel > 0) - user.visible_message(SPAN_DANGER("[user] starts uprooting the weeds."), SPAN_DANGER("You remove the weeds from the [src].")) + user.visible_message(SPAN_DANGER("[user] starts uprooting the weeds."), SPAN_DANGER("You remove the weeds from [src].")) weedlevel = 0 update_icon() else diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 887313eb4db9..430f959a7718 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -758,12 +758,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!tx || !ty || !tz) return following = null - spawn(0) - // To stop the ghost flickering. - x = tx - y = ty - z = tz - sleep(15) + forceMove(locate(tx, ty, tz)) /mob/dead/observer/verb/dead_teleport_mob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak set category = "Ghost" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index b63ce0174a22..a5ef1231a140 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -192,7 +192,7 @@ playsound(loc, "sparks", 25, 1) if(shock_damage > 10) src.visible_message( - SPAN_DANGER("[src] was shocked by the [source]!"), \ + SPAN_DANGER("[src] was shocked by [source]!"), \ SPAN_DANGER("You feel a powerful shock course through your body!"), \ SPAN_DANGER("You hear a heavy electrical crack.") \ ) @@ -207,7 +207,7 @@ else src.visible_message( - SPAN_DANGER("[src] was mildly shocked by the [source]."), \ + SPAN_DANGER("[src] was mildly shocked by [source]."), \ SPAN_DANGER("You feel a mild shock course through your body."), \ SPAN_DANGER("You hear a light zapping.") \ ) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 2bb113d67739..dfbc2c971a8c 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -155,7 +155,7 @@ return held_weapon.afterattack(target,src) var/disarm_chance = rand(1, 100) - var/attacker_skill_level = skills && attacking_mob.skills ? skills.get_skill_level(SKILL_CQC) : SKILL_CQC_MAX // No skills, so assume max + var/attacker_skill_level = attacking_mob.skills ? attacking_mob.skills.get_skill_level(SKILL_CQC) : SKILL_CQC_MAX // No skills, so assume max var/defender_skill_level = skills ? skills.get_skill_level(SKILL_CQC) : SKILL_CQC_MAX // No skills, so assume max disarm_chance -= 5 * attacker_skill_level disarm_chance += 5 * defender_skill_level @@ -175,7 +175,7 @@ else drop_held_item() visible_message(SPAN_DANGER("[attacking_mob] has disarmed [src]!"), null, null, 5) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 25, 1, 7) + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, 7) return playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, 7) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 4e4d65e485ef..42df439c5b55 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -335,10 +335,10 @@ Contains most of the procs that are called when a mob is attacked by something if (M.faction == faction) M.track_friendly_fire(initial(O.name)) if (assailant) - src.attack_log += text("\[[time_stamp()]\] Has been hit with a [O], thrown by [key_name(M)]") + src.attack_log += text("\[[time_stamp()]\] Has been hit with \a [O], thrown by [key_name(M)]") M.attack_log += text("\[[time_stamp()]\] Hit [key_name(src)] with a thrown [O]") if(!istype(src,/mob/living/simple_animal/mouse)) - msg_admin_attack("[key_name(src)] was hit by a [O], thrown by [key_name(M)] in [get_area(src)] ([src.loc.x],[src.loc.y],[src.loc.z]).", src.loc.x, src.loc.y, src.loc.z) + msg_admin_attack("[key_name(src)] was hit by \a [O], thrown by [key_name(M)] in [get_area(src)] ([src.loc.x],[src.loc.y],[src.loc.z]).", src.loc.x, src.loc.y, src.loc.z) if(last_damage_source) last_damage_data = create_cause_data(last_damage_source, last_damage_mob) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index b86a6a625f57..b54f03e2ce7d 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -550,6 +550,7 @@ to_chat(src, SPAN_WARNING("You can't put \the [interact_item.name] on [target_mob]!")) return visible_message(SPAN_NOTICE("[src] tries to put \the [interact_item.name] on [target_mob]."), null, null, 5) + log_interact(src, target_mob, "[key_name(src)] attempted to put [interact_item.name] on [key_name(target_mob)]'s ([slot_to_process]).") if(do_after(src, get_strip_delay(src, target_mob), INTERRUPT_ALL, BUSY_ICON_GENERIC, target_mob, INTERRUPT_MOVED, BUSY_ICON_GENERIC)) if(interact_item == get_active_hand() && !target_mob.get_item_by_slot(slot_to_process) && Adjacent(target_mob)) if(interact_item.flags_item & WIELDED) //to prevent re-wielding it during the do_after @@ -558,6 +559,7 @@ drop_inv_item_on_ground(interact_item) if(interact_item && !QDELETED(interact_item)) //Might be self-deleted? target_mob.equip_to_slot_if_possible(interact_item, slot_to_process, 1, 0, 1, 1) + log_interact(src, target_mob, "[key_name(src)] put [interact_item.name] on [key_name(target_mob)]'s ([slot_to_process]) successfully.") if(ishuman(target_mob) && target_mob.stat == DEAD) var/mob/living/carbon/human/human_target = target_mob human_target.disable_lights() // take that powergamers -spookydonut diff --git a/code/modules/mob/living/carbon/xenomorph/Evolution.dm b/code/modules/mob/living/carbon/xenomorph/Evolution.dm index 63aa7b09a633..49d73e71a241 100644 --- a/code/modules/mob/living/carbon/xenomorph/Evolution.dm +++ b/code/modules/mob/living/carbon/xenomorph/Evolution.dm @@ -26,8 +26,15 @@ if(!length(castes_available)) to_chat(src, SPAN_WARNING("The Hive is not capable of supporting any castes you can evolve to yet.")) return + var/castepick + if((client.prefs && client.prefs.no_radials_preference) || !hive.evolution_menu_images) + castepick = tgui_input_list(usr, "You are growing into a beautiful alien! It is time to choose a caste.", "Evolve", castes_available, theme="hive_status") + else + var/list/fancy_caste_list = list() + for(var/caste in castes_available) + fancy_caste_list[caste] = hive.evolution_menu_images[caste] - var/castepick = tgui_input_list(usr, "You are growing into a beautiful alien! It is time to choose a caste.", "Evolve", castes_available, theme="hive_status") + castepick = show_radial_menu(src, src.client?.eye, fancy_caste_list) if(!castepick) //Changed my mind return @@ -98,8 +105,8 @@ evolving = TRUE var/level_to_switch_to = get_vision_level() - if(!do_after(src, 2.5 SECONDS, INTERRUPT_INCAPACITATED, BUSY_ICON_HOSTILE)) // Can evolve while moving - to_chat(src, SPAN_WARNING("You quiver, but nothing happens. Hold still while evolving.")) + if(!do_after(src, 2.5 SECONDS, INTERRUPT_INCAPACITATED|INTERRUPT_CHANGED_LYING, BUSY_ICON_HOSTILE)) // Can evolve while moving, resist or rest to cancel it. + to_chat(src, SPAN_WARNING("You quiver, but nothing happens. Your evolution has ceased for now...")) evolving = FALSE return diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index 84eceb028349..b5848786c698 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -412,12 +412,12 @@ if(check_blockers && istype(O, /obj/effect/build_blocker)) var/obj/effect/build_blocker/bb = O if(!silent) - to_chat(src, SPAN_WARNING("This is too close to a [bb.linked_structure]!")) + to_chat(src, SPAN_WARNING("This is too close to \a [bb.linked_structure]!")) return if(check_doors) if(istype(O, /obj/structure/machinery/door)) if(!silent) - to_chat(src, SPAN_WARNING("\The [O] is blocking the resin! There's not enough space to build that here.")) + to_chat(src, SPAN_WARNING("[O] is blocking the resin! There's not enough space to build that here.")) return if(istype(O, /obj/item/clothing/mask/facehugger)) if(!silent) @@ -622,7 +622,7 @@ target.xenos_tracking |= src tracked_marker = target to_chat(src, SPAN_XENONOTICE("You start tracking the [target.mark_meaning.name] resin mark.")) - to_chat(src, SPAN_INFO("shift click the compass to watch the mark, alt click to stop tracking")) + to_chat(src, SPAN_INFO("Shift click the compass to watch the mark, alt click to stop tracking")) /mob/living/carbon/xenomorph/proc/stop_tracking_resin_mark(destroyed, silent = FALSE) //tracked_marker shouldnt be nulled outside this PROC!! >:C if(QDELETED(src)) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_powers.dm index 0fcdbf47a695..e77d22350463 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_powers.dm @@ -278,7 +278,7 @@ if(!affected_atom || affected_atom.layer >= FLY_LAYER || !isturf(xeno.loc) || !xeno.check_state()) return - xeno.visible_message(SPAN_XENOWARNING("The [xeno] fires a blast of acid at [affected_atom]!"), SPAN_XENOWARNING("You fire a blast of acid at [affected_atom]!")) + xeno.visible_message(SPAN_XENOWARNING("[xeno] fires a blast of acid at [affected_atom]!"), SPAN_XENOWARNING("You fire a blast of acid at [affected_atom]!")) var/turf/target_turf = locate(affected_atom.x, affected_atom.y, affected_atom.z) var/obj/projectile/proj = new(xeno.loc, create_cause_data("acid shotgun", xeno)) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm index d3865872f0ab..f876c2c50669 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm @@ -124,12 +124,12 @@ macro_path = /datum/action/xeno_action/verb/verb_prae_abduct ability_primacy = XENO_PRIMARY_ACTION_1 action_type = XENO_ACTION_CLICK - xeno_cooldown = 180 + xeno_cooldown = 15 SECONDS plasma_cost = 180 // Config var/max_distance = 7 - var/windup = 8 + var/windup = 7 DECISECONDS /datum/action/xeno_action/activable/oppressor_punch name = "Dislocate" @@ -169,7 +169,7 @@ // Config var/fling_dist = 3 - var/windup = 2 + var/windup = 2 DECISECONDS ////////// Dancer Abilities diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm index 85a9ee8f054b..1a0205862480 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm @@ -386,7 +386,7 @@ var/obj/limb/target_limb = target_carbon.get_limb(check_zone(oppressor_user.zone_selected)) if (ishuman(target_carbon) && (!target_limb || (target_limb.status & LIMB_DESTROYED))) - return + target_limb = target_carbon.get_limb("chest") if (!check_and_use_plasma_owner()) return @@ -412,19 +412,18 @@ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(unroot_human), target_carbon, TRAIT_SOURCE_ABILITY("Oppressor Punch")), get_xeno_stun_duration(target_carbon, 1.2 SECONDS)) to_chat(target_carbon, SPAN_XENOHIGHDANGER("[oppressor_user] has pinned you to the ground! You cannot move!")) - - var/datum/action/xeno_action/activable/prae_abduct/abduct_action = get_xeno_action_by_type(oppressor_user, /datum/action/xeno_action/activable/prae_abduct) - var/datum/action/xeno_action/activable/tail_lash/tail_lash_action = get_xeno_action_by_type(oppressor_user, /datum/action/xeno_action/activable/tail_lash) - if(abduct_action && abduct_action.action_cooldown_check()) - abduct_action.reduce_cooldown(5 SECONDS) - if(tail_lash_action && tail_lash_action.action_cooldown_check()) - tail_lash_action.reduce_cooldown(5 SECONDS) else target_carbon.apply_armoured_damage(get_xeno_damage_slash(target_carbon, damage), ARMOR_MELEE, BRUTE, target_limb? target_limb.name : "chest") step_away(target_carbon, oppressor_user, 2) shake_camera(target_carbon, 2, 1) + var/datum/action/xeno_action/activable/prae_abduct/abduct_action = get_xeno_action_by_type(oppressor_user, /datum/action/xeno_action/activable/prae_abduct) + var/datum/action/xeno_action/activable/tail_lash/tail_lash_action = get_xeno_action_by_type(oppressor_user, /datum/action/xeno_action/activable/tail_lash) + if(abduct_action && !abduct_action.action_cooldown_check()) + abduct_action.reduce_cooldown(5 SECONDS) + if(tail_lash_action && !tail_lash_action.action_cooldown_check()) + tail_lash_action.reduce_cooldown(5 SECONDS) apply_cooldown() return ..() diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm index 22f119faf234..457b1defc1db 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm @@ -127,7 +127,7 @@ var/datum/behavior_delegate/ravager_base/behavior = xeno.behavior_delegate if(behavior.empower_targets < behavior.super_empower_threshold) return - xeno.visible_message(SPAN_XENODANGER("The [xeno] uses its shield to bash [human] as it charges at them!"), SPAN_XENODANGER("You use your shield to bash [human] as you charge at them!")) + xeno.visible_message(SPAN_XENODANGER("[xeno] uses its shield to bash [human] as it charges at them!"), SPAN_XENODANGER("You use your shield to bash [human] as you charge at them!")) human.apply_effect(behavior.knockdown_amount, WEAKEN) human.attack_alien(xeno, rand(xeno.melee_damage_lower, xeno.melee_damage_upper)) @@ -517,7 +517,7 @@ return behavior.use_shards(shard_cost) - xeno.visible_message(SPAN_XENOWARNING("The [xeno] fires their spikes at [affected_atom]!"), SPAN_XENOWARNING("You fire your spikes at [affected_atom]!")) + xeno.visible_message(SPAN_XENOWARNING("[xeno] fires their spikes at [affected_atom]!"), SPAN_XENOWARNING("You fire your spikes at [affected_atom]!")) var/turf/target = locate(affected_atom.x, affected_atom.y, affected_atom.z) var/obj/projectile/projectile = new /obj/projectile(xeno.loc, create_cause_data(initial(xeno.caste_type), xeno)) @@ -564,7 +564,7 @@ behavior.use_shards(shard_cost) behavior.lock_shards() - xeno.visible_message(SPAN_XENOWARNING("The [xeno] sheds their spikes, firing them in all directions!"), SPAN_XENOWARNING("You shed your spikes, firing them in all directions!!")) + xeno.visible_message(SPAN_XENOWARNING("[xeno] sheds their spikes, firing them in all directions!"), SPAN_XENOWARNING("You shed your spikes, firing them in all directions!!")) xeno.spin_circle() create_shrapnel(get_turf(xeno), shrapnel_amount, null, null, ammo_type, create_cause_data(initial(xeno.caste_type), owner), TRUE) playsound(xeno, 'sound/effects/spike_spray.ogg', 25, 1) diff --git a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm index 0ad84fc49e42..f9474472e620 100644 --- a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm +++ b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm @@ -110,7 +110,7 @@ knock_chance += min(round(damage * 0.25), 10) //Maximum of 15% chance. if(prob(knock_chance)) playsound(loc, "alien_claw_metal", 25, 1) - M.visible_message(SPAN_DANGER("The [M] smashes off [src]'s [wear_mask.name]!"), \ + M.visible_message(SPAN_DANGER("[M] smashes off [src]'s [wear_mask.name]!"), \ SPAN_DANGER("You smash off [src]'s [wear_mask.name]!"), null, 5) drop_inv_item_on_ground(wear_mask) if(isyautja(src)) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Warrior.dm b/code/modules/mob/living/carbon/xenomorph/castes/Warrior.dm index d3d34af98908..2e7ca294dc86 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Warrior.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Warrior.dm @@ -96,7 +96,8 @@ if(should_neckgrab && living_mob.mob_size < MOB_SIZE_BIG) living_mob.drop_held_items() living_mob.apply_effect(get_xeno_stun_duration(living_mob, 2), WEAKEN) - living_mob.pulledby = src + if(living_mob.pulledby != src) + return // Grab was broken, probably as Stun side effect (eg. target getting knocked away from a manned M56D) visible_message(SPAN_XENOWARNING("[src] grabs [living_mob] by the throat!"), \ SPAN_XENOWARNING("You grab [living_mob] by the throat!")) lunging = TRUE diff --git a/code/modules/mob/living/carbon/xenomorph/castes/caste_datum.dm b/code/modules/mob/living/carbon/xenomorph/castes/caste_datum.dm new file mode 100644 index 000000000000..63d6146afb14 --- /dev/null +++ b/code/modules/mob/living/carbon/xenomorph/castes/caste_datum.dm @@ -0,0 +1,185 @@ +// Actual caste datum basedef +/datum/caste_datum + var/caste_type = "" + var/display_name = "" + var/tier = 0 + var/dead_icon = "Drone Dead" + var/language = LANGUAGE_XENOMORPH + var/melee_damage_lower = 10 + var/melee_damage_upper = 20 + ///allows fine tuning melee damage to vehicles per caste. + var/melee_vehicle_damage = 10 + var/evasion = XENO_EVASION_NONE + + var/speed = XENO_SPEED_TIER_10 + + var/plasma_max = 10 + var/plasma_gain = 5 + + var/crystal_max = 0 + + var/max_health = XENO_UNIVERSAL_HPMULT * 100 + ///Are they allowed to evolve (and have their evolution progress group) + var/evolution_allowed = 1 + ///Threshold to next evolution + var/evolution_threshold = 0 + /// whether they can get evo points without needing an ovi queen + var/evolve_without_queen = FALSE + ///This is where you add castes to evolve into. "Separated", "by", "commas" + var/list/evolves_to = list() + /// what caste or castes to de-evolve to. + var/list/deevolves_to = list() + ///If they can use consoles, etc. Set on Queen + var/is_intelligent = 0 + var/caste_desc = null + + // Tackles + var/tackle_min = 2 + var/tackle_max = 6 + var/tackle_chance = 35 + var/tacklestrength_min = 2 + var/tacklestrength_max = 3 + + ///Chance of deflecting projectiles. + var/armor_deflection = 0 + var/fire_immunity = FIRE_IMMUNITY_NONE + var/fire_intensity_resistance = 0 + + ///Delay timer for spitting + var/spit_delay = 60 + + /// Windup for spits + var/spit_windup = FALSE + + ///The strength of our aura. Zero means we can't emit one + var/aura_strength = 0 + + ///"Evolving" removed for the time being + var/aura_allowed = list("frenzy", "warding", "recovery") + + ///Adjust pixel size. 0.x is smaller, 1.x is bigger, percentage based. + var/adjust_size_x = 1 + var/adjust_size_y = 1 + + ///list of datum projectile types the xeno can use. + var/list/spit_types + + var/attack_delay = 0 //Bonus or pen to time in between attacks. + makes slashes slower. + + var/agility_speed_increase = 0 // this opens up possibilities for balancing + + // The type of mutator delegate to instantiate on the base caste. Will + // be replaced when the Xeno chooses a strain. + var/behavior_delegate_type = /datum/behavior_delegate + + // Resin building-related vars + /// Default build time and build distance + var/build_time_mult = BUILD_TIME_MULT_XENO + var/max_build_dist = 0 + + // Carrier vars // + + /// if a hugger is held in hand, won't attempt to leap and kill itself + var/hugger_nurturing = FALSE + var/huggers_max = 0 + var/throwspeed = 0 + var/hugger_delay = 0 + var/eggs_max = 0 + var/egg_cooldown = 30 + ///Armor but for explosions + var/xeno_explosion_resistance = 0 + + //Queen vars + var/can_hold_facehuggers = 0 + var/can_hold_eggs = CANNOT_HOLD_EGGS + + var/can_be_queen_healed = TRUE + var/can_be_revived = TRUE + + var/can_vent_crawl = 1 + + var/caste_luminosity = 0 + + /// if fire_immunity is set to be vulnerable, how much will fire damage be multiplied. Defines in xeno.dm + var/fire_vulnerability_mult = 0 + + var/burrow_cooldown = 5 SECONDS + var/tunnel_cooldown = 100 + var/widen_cooldown = 10 SECONDS + ///Big strong ability, big cooldown. + var/tremor_cooldown = 30 SECONDS + ///whether the xeno heals even outside weeds. + var/innate_healing = FALSE + + var/acid_level = 0 + var/weed_level = WEED_LEVEL_STANDARD + ///Time it takes between acid splash retaliate procs. Variable per caste, for if we want future castes that are acid bombs + var/acid_splash_cooldown = 3 SECONDS + + // regen vars + + var/heal_delay_time = 0 SECONDS + var/heal_resting = 1 + var/heal_standing = 0.4 + var/heal_knocked_out = 0.33 + + var/list/resin_build_order + var/minimum_xeno_playtime = 0 + +// cannot evolve to this caste until the round has been going on for this amount of time + // IMPORTANT: this is ROUND_TIME, not world.time + var/minimum_evolve_time = 1 MINUTES + /// Iconstate for the xeno on the minimap + var/minimap_icon = "xeno" + ///The iconstate for leadered xenos on the minimap, added as overlay + var/minimap_leadered_overlay = "xenoleader" + + var/royal_caste = FALSE + + +/datum/caste_datum/can_vv_modify() + return FALSE + +/datum/caste_datum/New() + . = ..() + + //Initialise evolution and upgrade thresholds in one place, once and for all + evolution_threshold = 0 + if(evolution_allowed) + switch(tier) + if(0) + evolution_threshold = 60 + if(1) + evolution_threshold = 200 + if(2) + evolution_threshold = 500 + //Other tiers (T3, Queen, etc.) can't evolve anyway + + resin_build_order = GLOB.resin_build_order_drone + +/client/var/cached_xeno_playtime + +/datum/caste_datum/proc/can_play_caste(client/client) + if(!CONFIG_GET(flag/use_timelocks)) + return TRUE + + var/total_xeno_playtime = client.get_total_xeno_playtime() + + if(minimum_xeno_playtime && total_xeno_playtime < minimum_xeno_playtime) + return FALSE + + return TRUE + +/datum/caste_datum/proc/get_caste_requirement(client/client) + return minimum_xeno_playtime - client.get_total_xeno_playtime() + +/datum/caste_datum/proc/get_minimap_icon() + var/image/background = mutable_appearance('icons/ui_icons/map_blips.dmi', "background") + background.color = MINIMAP_ICON_BACKGROUND_XENO + + var/iconstate = minimap_icon ? minimap_icon : "unknown" + var/mutable_appearance/icon = image('icons/ui_icons/map_blips.dmi', icon_state = iconstate) + icon.appearance_flags = RESET_COLOR + background.overlays += icon + + return background diff --git a/code/modules/mob/living/carbon/xenomorph/egg_item.dm b/code/modules/mob/living/carbon/xenomorph/egg_item.dm index b9304b33b15a..e4cc7bd39fe0 100644 --- a/code/modules/mob/living/carbon/xenomorph/egg_item.dm +++ b/code/modules/mob/living/carbon/xenomorph/egg_item.dm @@ -102,6 +102,16 @@ to_chat(user, SPAN_XENOWARNING("[src] can only be planted on [lowertext(hive.prefix)]hive weeds.")) return + if(istype(get_area(T), /area/vehicle)) + to_chat(user, SPAN_XENOWARNING("[src] cannot be planted inside a vehicle.")) + return + + for(var/obj/object in T.contents) + var/obj/effect/alien/egg/xeno_egg = /obj/effect/alien/egg + if(object.layer > initial(xeno_egg.layer)) + to_chat(user, SPAN_XENOWARNING("[src] cannot be planted below objects that would obscure it.")) + return + user.visible_message(SPAN_XENONOTICE("[user] starts planting [src]."), SPAN_XENONOTICE("You start planting [src]."), null, 5) var/plant_time = 35 diff --git a/code/modules/mob/living/carbon/xenomorph/hive_status.dm b/code/modules/mob/living/carbon/xenomorph/hive_status.dm index 4fe1be51bfff..67f19c8d07cb 100644 --- a/code/modules/mob/living/carbon/xenomorph/hive_status.dm +++ b/code/modules/mob/living/carbon/xenomorph/hive_status.dm @@ -1,216 +1,1356 @@ -/datum/hive_status_ui - var/name = "Hive Status" +/datum/hive_status + var/name = "Normal Hive" - // Data to pass when rendering the UI (not static) - var/total_xenos - var/list/xeno_counts - var/list/tier_slots - var/list/xeno_vitals - var/list/xeno_keys - var/list/xeno_info - var/hive_location - var/burrowed_larva - var/evilution_level + // Used for the faction of the xenomorph. Not recommended to modify. + var/internal_faction - var/data_initialized = FALSE + /// Short Hive ID as string used in stats reporting + var/reporting_id = "normal" - var/datum/hive_status/assoc_hive = null + var/hivenumber = XENO_HIVE_NORMAL + var/mob/living/carbon/xenomorph/queen/living_xeno_queen + var/egg_planting_range = 15 + var/slashing_allowed = XENO_SLASH_ALLOWED //This initial var allows the queen to turn on or off slashing. Slashing off means harm intent does much less damage. + var/construction_allowed = NORMAL_XENO //Who can place construction nodes for special structures + var/destruction_allowed = XENO_LEADER //Who can destroy special structures + var/unnesting_allowed = TRUE + var/hive_orders = "" //What orders should the hive have + var/color = null + var/ui_color = null // Color for hive status collapsible buttons and xeno count list + var/prefix = "" + var/queen_leader_limit = 2 + var/list/open_xeno_leader_positions = list(1, 2) // Ordered list of xeno leader positions (indexes in xeno_leader_list) that are not occupied + var/list/xeno_leader_list[2] // Ordered list (i.e. index n holds the nth xeno leader) + var/stored_larva = 0 -/datum/hive_status_ui/New(datum/hive_status/hive) - assoc_hive = hive - update_all_data() - START_PROCESSING(SShive_status, src) + ///used by /datum/hive_status/proc/increase_larva_after_burst() to support non-integer increases to larva + var/partial_larva = 0 + /// Assoc list of free slots available to specific castes + var/list/free_slots = list( + /datum/caste_datum/burrower = 1, + /datum/caste_datum/hivelord = 1, + /datum/caste_datum/carrier = 1 + ) + /// Assoc list of slots currently used by specific castes (for calculating free_slot usage) + var/list/used_slots = list() + /// list of living tier2 xenos + var/list/tier_2_xenos = list() + /// list of living tier3 xenos + var/list/tier_3_xenos = list() + /// list of living xenos + var/list/totalXenos = list() + /// list of previously living xenos (hardrefs currently) + var/list/total_dead_xenos = list() + var/xeno_queen_timer + var/isSlotOpen = TRUE //Set true for starting alerts only after the hive has reached its full potential + var/allowed_nest_distance = 15 //How far away do we allow nests from an ovied Queen. Default 15 tiles. + var/obj/effect/alien/resin/special/pylon/core/hive_location = null //Set to ref every time a core is built, for defining the hive location + var/crystal_stored = 0 //How much stockpiled material is stored for the hive to use. -/datum/hive_status_ui/process() - update_xeno_vitals() - update_xeno_info(FALSE) - SStgui.update_uis(src) + var/datum/mutator_set/hive_mutators/mutators = new + var/tier_slot_multiplier = 1 + var/larva_gestation_multiplier = 1 + var/bonus_larva_spawn_chance = 1 + var/hijack_burrowed_surge = FALSE //at hijack, start spawning lots of burrowed + /// how many burrowed is going to spawn during larva surge + var/hijack_burrowed_left = 0 -// Updates the list tracking how many xenos there are in each tier, and how many there are in total -/datum/hive_status_ui/proc/update_xeno_counts(send_update = TRUE) - xeno_counts = assoc_hive.get_xeno_counts() + var/ignore_slots = FALSE + var/dynamic_evolution = TRUE + var/evolution_rate = 3 // Only has use if dynamic_evolution is false + var/evolution_bonus = 0 - total_xenos = 0 - for(var/counts in xeno_counts) - for(var/caste in counts) - total_xenos += counts[caste] + var/allow_no_queen_actions = FALSE + var/allow_no_queen_evo = FALSE + var/evolution_without_ovipositor = TRUE //Temporary for the roundstart. + /// Set to false if you want to prevent evolutions into Queens + var/allow_queen_evolve = TRUE + /// Set to true if you want to prevent bursts and spawns of new xenos. Will also prevent healing if the queen no longer exists + var/hardcore = FALSE + /// Set to false if you want to prevent getting burrowed larva from latejoin marines + var/latejoin_burrowed = TRUE - if(send_update) - SStgui.update_uis(src) + var/list/hive_inherant_traits - xeno_counts[1] -= "Queen" // don't show queen in the amount of xenos + // Cultist Info + var/mob/living/carbon/leading_cult_sl - // Also update the amount of T2/T3 slots - tier_slots = assoc_hive.get_tier_slots() + //List of how many maximum of each special structure you can have + var/list/hive_structures_limit = list( + XENO_STRUCTURE_CORE = 1, + XENO_STRUCTURE_CLUSTER = 8, + XENO_STRUCTURE_POOL = 1, + XENO_STRUCTURE_EGGMORPH = 6, + XENO_STRUCTURE_EVOPOD = 2, + XENO_STRUCTURE_RECOVERY = 6, + XENO_STRUCTURE_PYLON = 2, + ) -// Updates the hive location using the area name of the defined hive location turf -/datum/hive_status_ui/proc/update_hive_location(send_update = TRUE) - if(!assoc_hive.hive_location) + var/global/list/hive_structure_types = list( + XENO_STRUCTURE_CORE = /datum/construction_template/xenomorph/core, + XENO_STRUCTURE_CLUSTER = /datum/construction_template/xenomorph/cluster, + XENO_STRUCTURE_EGGMORPH = /datum/construction_template/xenomorph/eggmorph, + XENO_STRUCTURE_RECOVERY = /datum/construction_template/xenomorph/recovery + ) + + var/list/list/hive_structures = list() //Stringref list of structures that have been built + var/list/list/hive_constructions = list() //Stringref list of structures that are being built + + var/datum/hive_status_ui/hive_ui + var/datum/mark_menu_ui/mark_ui + var/datum/hive_faction_ui/faction_ui + + var/list/tunnels = list() + + var/list/allies = list() + + var/list/resin_marks = list() + + var/list/banished_ckeys = list() + + var/hivecore_cooldown = FALSE + + var/need_round_end_check = FALSE + + //Joining as Facehugger vars + /// When can huggers join the round + var/hugger_timelock = 15 MINUTES + /// How many huggers can the hive support + var/playable_hugger_limit = 0 + /// Minimum number of huggers available at any hive size + var/playable_hugger_minimum = 2 + /// This number divides the total xenos counted for slots to give the max number of facehuggers + var/playable_hugger_max_divisor = 4 + + /// How many lesser drones the hive can support + var/lesser_drone_limit = 0 + /// Slots available for lesser drones will never go below this number + var/lesser_drone_minimum = 2 + /// This number divides the total xenos counted for slots to give the max number of lesser drones + var/playable_lesser_drones_max_divisor = 3 + + var/datum/tacmap/drawing/xeno/tacmap + var/minimap_type = MINIMAP_FLAG_XENO + + var/list/available_nicknumbers = list() + + /*Stores the image()'s for the xeno evolution radial menu + To add an image for your caste - add an icon to icons/mob/xenos/radial_xenos.dmi + Icon size should be 32x32, to make them fit within the radial menu border size your icon 22x22 and leave 10px transparent border. + The name of the icon should be the same as the XENO_CASTE_ define for that caste eg. #define XENO_CASTE_DRONE "Drone" + */ + var/static/list/evolution_menu_images + +/datum/hive_status/New() + mutators.hive = src + hive_ui = new(src) + mark_ui = new(src) + faction_ui = new(src) + minimap_type = get_minimap_flag_for_faction(hivenumber) + tacmap = new(src, minimap_type) + if(!internal_faction) + internal_faction = name + for(var/number in 1 to 999) + available_nicknumbers += number + if(hivenumber != XENO_HIVE_NORMAL) return - hive_location = strip_improper(get_area_name(assoc_hive.hive_location)) + if(!evolution_menu_images) + evolution_menu_images = list() + generate_evo_menu_images() + + RegisterSignal(SSdcs, COMSIG_GLOB_POST_SETUP, PROC_REF(post_setup)) - if(send_update) - SStgui.update_uis(src) +///Generate the image()'s requried for the evolution radial menu. +/datum/hive_status/proc/generate_evo_menu_images() + for(var/datum/caste_datum/caste as anything in subtypesof(/datum/caste_datum)) + evolution_menu_images[initial(caste.caste_type)] = image('icons/mob/xenos/radial_xenos.dmi', initial(caste.caste_type)) -// Updates the sorted list of all xenos that we use as a key for all other information -/datum/hive_status_ui/proc/update_xeno_keys(send_update = TRUE) - xeno_keys = assoc_hive.get_xeno_keys() +/datum/hive_status/proc/post_setup() + SIGNAL_HANDLER - if(send_update) - SStgui.update_uis(src) + setup_evolution_announcements() + setup_pylon_limits() -// Mildly related to the above, but only for when xenos are removed from the hive -// If a xeno dies, we don't have to regenerate all xeno info and sort it again, just remove them from the data list -/datum/hive_status_ui/proc/xeno_removed(mob/living/carbon/xenomorph/X) - if(!xeno_keys) +/datum/hive_status/proc/setup_evolution_announcements() + for(var/time in GLOB.xeno_evolve_times) + if(time == "0") + continue + + addtimer(CALLBACK(src, PROC_REF(announce_evolve_available), GLOB.xeno_evolve_times[time]), text2num(time)) + +/// Sets up limits on pylons in New() for potential futureproofing with more static comms +/datum/hive_status/proc/setup_pylon_limits() + hive_structures_limit[XENO_STRUCTURE_PYLON] = length(GLOB.all_static_telecomms_towers) || 2 + +/datum/hive_status/proc/announce_evolve_available(list/datum/caste_datum/available_castes) + + var/list/castes_available = list() + for(var/datum/caste_datum/current_caste as anything in available_castes) + castes_available += initial(current_caste.caste_type) + + var/castes = castes_available.Join(", ") + xeno_message(SPAN_XENOANNOUNCE("The Hive is now strong enough to support: [castes]")) + xeno_maptext("The Hive can now support: [castes]", "Hive Strengthening") + + +// Adds a xeno to this hive +/datum/hive_status/proc/add_xeno(mob/living/carbon/xenomorph/X) + if(!X || !istype(X)) return - for(var/index in 1 to length(xeno_keys)) - var/list/info = xeno_keys[index] - if(info["nicknumber"] == X.nicknumber) + // If the xeno is part of another hive, they should be removed from that one first + if(X.hive && X.hive != src) + X.hive.remove_xeno(X, TRUE) - // tried Remove(), didn't work. *shrug* - xeno_keys[index] = null - xeno_keys -= null - return + // Already in the hive + if(X in totalXenos) + return + + // Can only have one queen. + if(isqueen(X)) + if(!living_xeno_queen && !is_admin_level(X.z)) // Don't consider xenos in admin level + set_living_xeno_queen(X) + + X.hivenumber = hivenumber + X.hive = src + + X.set_faction(internal_faction) + + if(X.hud_list) + X.hud_update() + + var/area/A = get_area(X) + if(!is_admin_level(X.z) || (A.flags_atom & AREA_ALLOW_XENO_JOIN)) + totalXenos += X + if(X.tier == 2) + tier_2_xenos += X + else if(X.tier == 3) + tier_3_xenos += X + + // Xenos are a fuckfest of cross-dependencies of different datums that are initialized at different times + // So don't even bother trying updating UI here without large refactors + +// Removes the xeno from the hive +/datum/hive_status/proc/remove_xeno(mob/living/carbon/xenomorph/xeno, hard = FALSE, light_mode = FALSE) + if(!xeno || !istype(xeno)) + return + + // Make sure the xeno was in the hive in the first place + if(!(xeno in totalXenos)) + return + + // This might be a redundant check now that Queen/Destroy() checks, but doesn't hurt to double check + if(living_xeno_queen == xeno) + var/mob/living/carbon/xenomorph/queen/next_queen = null + for(var/mob/living/carbon/xenomorph/queen/queen in totalXenos) + if(!is_admin_level(queen.z) && queen != src && !QDELETED(queen)) + next_queen = queen + break + + set_living_xeno_queen(next_queen) // either null or a queen + + // We allow "soft" removals from the hive (the xeno still retains information about the hive) + // This is so that xenos can add themselves back to the hive if they should die or otherwise go "on leave" from the hive + if(hard) + xeno.hivenumber = 0 + xeno.hive = null +#ifndef UNIT_TESTS // Since this is a hard ref, we shouldn't confuse create_and_destroy + else + total_dead_xenos += xeno +#endif + + totalXenos -= xeno + if(xeno.tier == 2) + tier_2_xenos -= xeno + else if(xeno.tier == 3) + tier_3_xenos -= xeno + + // Only handle free slots if the xeno is not in tdome + if(!is_admin_level(xeno.z)) + var/selected_caste = GLOB.xeno_datum_list[xeno.caste_type]?.type + if(used_slots[selected_caste]) + used_slots[selected_caste]-- + + if(!light_mode) + hive_ui.update_xeno_counts() + hive_ui.xeno_removed(xeno) + +/datum/hive_status/proc/set_living_xeno_queen(mob/living/carbon/xenomorph/queen/queen) + if(!queen) + mutators.reset_mutators() + SStracking.delete_leader("hive_[hivenumber]") + SStracking.stop_tracking("hive_[hivenumber]", living_xeno_queen) + SShive_status.wait = 10 SECONDS + else + SStracking.set_leader("hive_[hivenumber]", queen) + SShive_status.wait = 2 SECONDS + + SEND_SIGNAL(src, COMSIG_HIVE_NEW_QUEEN, queen) + living_xeno_queen = queen + + recalculate_hive() + +/datum/hive_status/proc/recalculate_hive() + if (!living_xeno_queen) + queen_leader_limit = 0 //No leaders for a Hive without a Queen! + else + queen_leader_limit = 4 + mutators.leader_count_boost + + if (xeno_leader_list.len > queen_leader_limit) + var/diff = 0 + for (var/i in queen_leader_limit + 1 to xeno_leader_list.len) + if(!open_xeno_leader_positions.Remove(i)) + remove_hive_leader(xeno_leader_list[i]) + diff++ + xeno_leader_list.len -= diff // Changing the size of xeno_leader_list needs to go at the end or else it won't iterate through the list properly + else if (xeno_leader_list.len < queen_leader_limit) + for (var/i in xeno_leader_list.len + 1 to queen_leader_limit) + open_xeno_leader_positions += i + xeno_leader_list.len++ + + + tier_slot_multiplier = mutators.tier_slot_multiplier + larva_gestation_multiplier = mutators.larva_gestation_multiplier + bonus_larva_spawn_chance = mutators.bonus_larva_spawn_chance + + hive_ui.update_all_data() + +/datum/hive_status/proc/add_hive_leader(mob/living/carbon/xenomorph/xeno) + if(!xeno) + return FALSE //How did this even happen? + if(!open_xeno_leader_positions.len) + return FALSE //Too many leaders already (no available xeno leader positions) + if(xeno.hive_pos != NORMAL_XENO) + return FALSE //Already on the list + var/leader_num = open_xeno_leader_positions[1] + xeno_leader_list[leader_num] = xeno + xeno.hive_pos = XENO_LEADER_HIVE_POS(leader_num) + xeno.handle_xeno_leader_pheromones() + xeno.hud_update() // To add leader star + open_xeno_leader_positions -= leader_num + + xeno.update_minimap_icon() + + give_action(xeno, /datum/action/xeno_action/activable/info_marker) + + hive_ui.update_xeno_keys() + return TRUE + +/datum/hive_status/proc/remove_hive_leader(mob/living/carbon/xenomorph/xeno, light_mode = FALSE) + if(!istype(xeno) || !IS_XENO_LEADER(xeno)) + return FALSE + + var/leader_num = GET_XENO_LEADER_NUM(xeno) + + xeno_leader_list[leader_num] = null + + if(!light_mode) // Don't run side effects during deletions. Better yet, replace all this by signals someday + xeno.hive_pos = NORMAL_XENO + xeno.handle_xeno_leader_pheromones() + xeno.hud_update() // To remove leader star + + // Need to maintain ascending order of open_xeno_leader_positions + for (var/i in 1 to queen_leader_limit) + if (i > open_xeno_leader_positions.len || open_xeno_leader_positions[i] > leader_num) + open_xeno_leader_positions.Insert(i, leader_num) + break + + if(!light_mode) + hive_ui.update_xeno_keys() + + for(var/obj/effect/alien/resin/marker/leaderless_mark in resin_marks) //no resin_mark limit abuse + if(leaderless_mark.createdby == xeno.nicknumber) + qdel(leaderless_mark) + + xeno.update_minimap_icon() + + remove_action(xeno, /datum/action/xeno_action/activable/info_marker) + + return TRUE + +/datum/hive_status/proc/replace_hive_leader(mob/living/carbon/xenomorph/original, mob/living/carbon/xenomorph/replacement) + if(!replacement || replacement.hive_pos != NORMAL_XENO) + return remove_hive_leader(original) + + var/leader_num = GET_XENO_LEADER_NUM(original) + + xeno_leader_list[leader_num] = replacement + + original.hive_pos = NORMAL_XENO + original.handle_xeno_leader_pheromones() + original.hud_update() // To remove leader star + remove_action(original, /datum/action/xeno_action/activable/info_marker) + + replacement.hive_pos = XENO_LEADER_HIVE_POS(leader_num) + replacement.handle_xeno_leader_pheromones() + replacement.hud_update() // To add leader star + give_action(replacement, /datum/action/xeno_action/activable/info_marker) + + hive_ui.update_xeno_keys() + +/datum/hive_status/proc/handle_xeno_leader_pheromones() + for(var/mob/living/carbon/xenomorph/L in xeno_leader_list) + L.handle_xeno_leader_pheromones() + +/* + * Helper procs for the Hive Status UI + * These are all called by the hive status UI manager to update its data + */ + +// Returns a list of how many of each caste of xeno there are, sorted by tier +/datum/hive_status/proc/get_xeno_counts() + // Every caste is manually defined here so you get + var/list/xeno_counts = list( + // Yes, Queen is technically considered to be tier 0 + list(XENO_CASTE_LARVA = 0, "Queen" = 0), + list(XENO_CASTE_DRONE = 0, XENO_CASTE_RUNNER = 0, XENO_CASTE_SENTINEL = 0, XENO_CASTE_DEFENDER = 0), + list(XENO_CASTE_HIVELORD = 0, XENO_CASTE_BURROWER = 0, XENO_CASTE_CARRIER = 0, XENO_CASTE_LURKER = 0, XENO_CASTE_SPITTER = 0, XENO_CASTE_WARRIOR = 0), + list(XENO_CASTE_BOILER = 0, XENO_CASTE_CRUSHER = 0, XENO_CASTE_PRAETORIAN = 0, XENO_CASTE_RAVAGER = 0) + ) + + for(var/mob/living/carbon/xenomorph/X in totalXenos) + //don't show xenos in the thunderdome when admins test stuff. + if(is_admin_level(X.z)) + var/area/A = get_area(X) + if(!(A.flags_atom & AREA_ALLOW_XENO_JOIN)) + continue + + if(X.caste && X.counts_for_slots) + xeno_counts[X.caste.tier+1][X.caste.caste_type]++ + + return xeno_counts + +// Returns a sorted list of some basic info (stuff that's needed for sorting) about all the xenos in the hive +// The idea is that we sort this list, and use it as a "key" for all the other information (especially the nicknumber) +// in the hive status UI. That way we can minimize the amount of sorts performed by only calling this when xenos are created/disposed +/datum/hive_status/proc/get_xeno_keys() + var/list/xenos[totalXenos.len] + + var/index = 1 + var/useless_slots = 0 + for(var/mob/living/carbon/xenomorph/X in totalXenos) + if(is_admin_level(X.z)) + var/area/A = get_area(X) + if(!(A.flags_atom & AREA_ALLOW_XENO_JOIN)) + useless_slots++ + continue + + // Insert without doing list merging + xenos[index++] = list( + "nicknumber" = X.nicknumber, + "tier" = X.tier, // This one is only important for sorting + "is_leader" = (IS_XENO_LEADER(X)), + "is_queen" = istype(X.caste, /datum/caste_datum/queen), + "caste_type" = X.caste_type + ) + + // Clear nulls from the xenos list + xenos.len -= useless_slots + + // Make it all nice and fancy by sorting the list before returning it + var/list/sorted_keys = sort_xeno_keys(xenos) + if(length(sorted_keys)) + return sorted_keys + return xenos + +// This sorts the xeno info list by multiple criteria. Prioritized in order: +// 1. Queen +// 2. Leaders +// 3. Tier +// It uses a slightly modified insertion sort to accomplish this +/datum/hive_status/proc/sort_xeno_keys(list/xenos) + if(!length(xenos)) + return + + var/list/sorted_list = xenos.Copy() + + if(!length(sorted_list)) + return + + for(var/index in 2 to length(sorted_list)) + var/j = index + + while(j > 1) + var/current = sorted_list[j] + var/prev = sorted_list[j-1] + + // Queen comes first, always + if(current["is_queen"]) + sorted_list.Swap(j-1, j) + j-- + continue + + // don't muck up queen's slot + if(prev["is_queen"]) + j-- + continue + + // Leaders before normal xenos + if(!prev["is_leader"] && current["is_leader"]) + sorted_list.Swap(j-1, j) + j-- + continue + + // Make sure we're only comparing leaders to leaders and non-leaders to non-leaders when sorting + // This means we get leaders sorted first, then non-leaders sorted + // Sort by tier first, higher tiers over lower tiers, and then by name alphabetically + + // Could not think of an elegant way to write this + if(!(current["is_leader"]^prev["is_leader"])\ + && (prev["tier"] < current["tier"]\ + || prev["tier"] == current["tier"] && prev["caste_type"] > current["caste_type"]\ + )) + sorted_list.Swap(j-1, j) + + j-- + + return sorted_list + +// Returns a list with some more info about all xenos in the hive +/datum/hive_status/proc/get_xeno_info() + var/list/xenos = list() + + for(var/mob/living/carbon/xenomorph/X in totalXenos) + if(is_admin_level(X.z)) + var/area/A = get_area(X) + if(!(A.flags_atom & AREA_ALLOW_XENO_JOIN)) + continue + + var/xeno_name = X.name + // goddamn fucking larvas with their weird ass maturing system + // its name updates with its icon, unlike other castes which only update the mature/elder, etc. prefix on evolve + if(istype(X, /mob/living/carbon/xenomorph/larva)) + xeno_name = "Larva ([X.nicknumber])" + xenos["[X.nicknumber]"] = list( + "name" = xeno_name, + "strain" = X.mutation_type, + "ref" = "\ref[X]" + ) + + return xenos + +/datum/hive_status/proc/set_hive_location(obj/effect/alien/resin/special/pylon/core/C) + if(!C || C == hive_location) + return + var/area/A = get_area(C) + xeno_message(SPAN_XENOANNOUNCE("The Queen has set the hive location as \the [A]."), 3, hivenumber) + hive_location = C + hive_ui.update_hive_location() + +// Returns a list of xeno healths and locations +/datum/hive_status/proc/get_xeno_vitals() + var/list/xenos = list() + + for(var/mob/living/carbon/xenomorph/X in totalXenos) + if(is_admin_level(X.z)) + var/area/A = get_area(X) + if(!(A.flags_atom & AREA_ALLOW_XENO_JOIN)) + continue + + if(!(X in GLOB.living_xeno_list)) + continue + + var/area/A = get_area(X) + var/area_name = "Unknown" + if(A) + area_name = A.name + + xenos["[X.nicknumber]"] = list( + "health" = round((X.health / X.maxHealth) * 100, 1), + "area" = area_name, + "is_ssd" = (!X.client) + ) + + return xenos + +#define TIER_3 "3" +#define TIER_2 "2" +#define OPEN_SLOTS "open_slots" +#define GUARANTEED_SLOTS "guaranteed_slots" + +// Returns an assoc list of open slots and guaranteed slots left +/datum/hive_status/proc/get_tier_slots() + var/list/slots = list( + TIER_3 = list( + OPEN_SLOTS = 0, + GUARANTEED_SLOTS = list(), + ), + TIER_2 = list( + OPEN_SLOTS = 0, + GUARANTEED_SLOTS = list(), + ), + ) + + var/used_tier_2_slots = length(tier_2_xenos) + var/used_tier_3_slots = length(tier_3_xenos) + + for(var/caste_path in free_slots) + var/slots_free = free_slots[caste_path] + var/slots_used = used_slots[caste_path] + var/datum/caste_datum/current_caste = caste_path + if(slots_used) + // Don't count any free slots in use + switch(initial(current_caste.tier)) + if(2) + used_tier_2_slots -= min(slots_used, slots_free) + if(3) + used_tier_3_slots -= min(slots_used, slots_free) + if(slots_free <= slots_used) + continue + // Display any free slots available + switch(initial(current_caste.tier)) + if(2) + slots[TIER_2][GUARANTEED_SLOTS][initial(current_caste.caste_type)] = slots_free - slots_used + if(3) + slots[TIER_3][GUARANTEED_SLOTS][initial(current_caste.caste_type)] = slots_free - slots_used + + var/burrowed_factor = min(stored_larva, sqrt(4*stored_larva)) + var/effective_total = round(burrowed_factor) + for(var/mob/living/carbon/xenomorph/xeno as anything in totalXenos) + if(xeno.counts_for_slots) + effective_total++ - SStgui.update_uis(src) + // Tier 3 slots are always 20% of the total xenos in the hive + slots[TIER_3][OPEN_SLOTS] = max(0, Ceiling(0.20*effective_total/tier_slot_multiplier) - used_tier_3_slots) + // Tier 2 slots are between 30% and 50% of the hive, depending + // on how many T3s there are. + slots[TIER_2][OPEN_SLOTS] = max(0, Ceiling(0.5*effective_total/tier_slot_multiplier) - used_tier_2_slots - used_tier_3_slots) -// Updates the list of xeno names, strains and references -/datum/hive_status_ui/proc/update_xeno_info(send_update = TRUE) - xeno_info = assoc_hive.get_xeno_info() + return slots - if(send_update) - SStgui.update_uis(src) +#undef TIER_3 +#undef TIER_2 +#undef OPEN_SLOTS +#undef GUARANTEED_SLOTS -// Updates vital information about xenos such as health and location. Only info that should be updated regularly -/datum/hive_status_ui/proc/update_xeno_vitals() - xeno_vitals = assoc_hive.get_xeno_vitals() +/datum/hive_status/proc/can_build_structure(structure_name) + if(!structure_name || !hive_structures_limit[structure_name]) + return FALSE + var/total_count = 0 + if(hive_structures[structure_name]) + total_count += hive_structures[structure_name].len + if(hive_constructions[structure_name]) + total_count += hive_constructions[structure_name].len + if(total_count >= hive_structures_limit[structure_name]) + return FALSE + return TRUE -// Updates how many buried larva there are -/datum/hive_status_ui/proc/update_burrowed_larva(send_update = TRUE) - burrowed_larva = assoc_hive.stored_larva - if(SSxevolution) - evilution_level = SSxevolution.get_evolution_boost_power(assoc_hive.hivenumber) +/datum/hive_status/proc/has_structure(structure_name) + if(!structure_name) + return FALSE + if(hive_structures[structure_name] && hive_structures[structure_name].len) + return TRUE + return FALSE + +/datum/hive_status/proc/add_construction(obj/effect/alien/resin/construction/S) + if(!S || !S.template) + return FALSE + var/name_ref = initial(S.template.name) + if(!hive_constructions[name_ref]) + hive_constructions[name_ref] = list() + if(hive_constructions[name_ref].len >= hive_structures_limit[name_ref]) + return FALSE + hive_constructions[name_ref] += src + return TRUE + +/datum/hive_status/proc/remove_construction(obj/effect/alien/resin/construction/S) + if(!S || !S.template) + return FALSE + var/name_ref = initial(S.template.name) + hive_constructions[name_ref] -= src + return TRUE + +/datum/hive_status/proc/add_special_structure(obj/effect/alien/resin/special/S) + if(!S) + return FALSE + var/name_ref = initial(S.name) + if(!hive_structures[name_ref]) + hive_structures[name_ref] = list() + if(hive_structures[name_ref].len >= hive_structures_limit[name_ref]) + return FALSE + hive_structures[name_ref] += S + return TRUE + +/datum/hive_status/proc/remove_special_structure(obj/effect/alien/resin/special/S) + if(!S) + return FALSE + var/name_ref = initial(S.name) + hive_structures[name_ref] -= S + return TRUE + +/datum/hive_status/proc/has_special_structure(name_ref) + if(!name_ref || !hive_structures[name_ref] || !hive_structures[name_ref].len) + return 0 + return hive_structures[name_ref].len + +/datum/hive_status/proc/abandon_on_hijack() + var/area/hijacked_dropship = get_area(living_xeno_queen) + var/shipside_humans_weighted_count = 0 + var/xenos_count = 0 + for(var/name_ref in hive_structures) + for(var/obj/effect/alien/resin/special/S in hive_structures[name_ref]) + if(get_area(S) == hijacked_dropship) + continue + S.hijack_delete = TRUE + hive_structures[name_ref] -= S + qdel(S) + for(var/mob/living/carbon/xenomorph/xeno as anything in totalXenos) + if(get_area(xeno) != hijacked_dropship && xeno.loc && is_ground_level(xeno.loc.z)) + if(isfacehugger(xeno) || islesserdrone(xeno)) + to_chat(xeno, SPAN_XENOANNOUNCE("The Queen has left without you, you quickly find a hiding place to enter hibernation as you lose touch with the hive mind.")) + if(xeno.stomach_contents.len) + xeno.devour_timer = 0 + xeno.handle_stomach_contents() + qdel(xeno) + continue + if(xeno.hunter_data.hunted && !isqueen(xeno)) + to_chat(xeno, SPAN_XENOANNOUNCE("The Queen has left without you, seperating you from her hive! You must defend yourself from the headhunter before you can enter hibernation...")) + xeno.set_hive_and_update(XENO_HIVE_FORSAKEN) + else + to_chat(xeno, SPAN_XENOANNOUNCE("The Queen has left without you, you quickly find a hiding place to enter hibernation as you lose touch with the hive mind.")) + if(xeno.stomach_contents.len) + xeno.devour_timer = 0 + xeno.handle_stomach_contents() + qdel(xeno) + stored_larva++ + continue + if(xeno.tier >= 1) + xenos_count++ + for(var/i in GLOB.alive_mob_list) + var/mob/living/potential_host = i + if(!(potential_host.status_flags & XENO_HOST)) + continue + if(!is_ground_level(potential_host.z) || get_area(potential_host) == hijacked_dropship) + continue + var/obj/item/alien_embryo/A = locate() in potential_host + if(A && A.hivenumber != hivenumber) + continue + for(var/obj/item/alien_embryo/embryo in potential_host) + embryo.hivenumber = XENO_HIVE_FORSAKEN + potential_host.update_med_icon() + for(var/mob/living/carbon/human/current_human as anything in GLOB.alive_human_list) + if(!(isspecieshuman(current_human) || isspeciessynth(current_human))) + continue + var/datum/job/job = GLOB.RoleAuthority.roles_for_mode[current_human.job] + if(!job) + continue + var/turf/turf = get_turf(current_human) + if(is_mainship_level(turf?.z)) + shipside_humans_weighted_count += GLOB.RoleAuthority.calculate_role_weight(job) + hijack_burrowed_surge = TRUE + hijack_burrowed_left = max(n_ceil(shipside_humans_weighted_count * 0.5) - xenos_count, 5) + hivecore_cooldown = FALSE + xeno_message(SPAN_XENOBOLDNOTICE("The weeds have recovered! A new hive core can be built!"),3,hivenumber) + +/datum/hive_status/proc/free_respawn(client/C) + stored_larva++ + if(!hive_location || !hive_location.spawn_burrowed_larva(C.mob)) + stored_larva-- else - evilution_level = 1 - if(send_update) - SStgui.update_uis(src) - -// Updates all data except burrowed larva -/datum/hive_status_ui/proc/update_all_xeno_data(send_update = TRUE) - update_xeno_counts(FALSE) - update_xeno_vitals() - update_xeno_keys(FALSE) - update_xeno_info(FALSE) - - if(send_update) - SStgui.update_uis(src) - -// Updates all data, including burrowed larva -/datum/hive_status_ui/proc/update_all_data() - data_initialized = TRUE - update_all_xeno_data(FALSE) - update_burrowed_larva(FALSE) - SStgui.update_uis(src) - -/datum/hive_status_ui/ui_state(mob/user) - return GLOB.hive_state[assoc_hive.internal_faction] - -/datum/hive_status_ui/ui_status(mob/user, datum/ui_state/state) + hive_ui.update_burrowed_larva() + +/datum/hive_status/proc/respawn_on_turf(client/xeno_client, turf/spawning_turf) + var/mob/living/carbon/xenomorph/larva/new_xeno = spawn_hivenumber_larva(spawning_turf, hivenumber) + if(isnull(new_xeno)) + return FALSE + + if(!SSticker.mode.transfer_xeno(xeno_client.mob, new_xeno)) + qdel(new_xeno) + return FALSE + + new_xeno.visible_message(SPAN_XENODANGER("A larva suddenly emerges from a dead husk!"), + SPAN_XENOANNOUNCE("The hive has no core! You manage to emerge from your old husk as a larva!")) + msg_admin_niche("[key_name(new_xeno)] respawned at \a [spawning_turf]. [ADMIN_JMP(spawning_turf)]") + playsound(new_xeno, 'sound/effects/xeno_newlarva.ogg', 50, 1) + if(new_xeno.client?.prefs?.toggles_flashing & FLASH_POOLSPAWN) + window_flash(new_xeno.client) + + hive_ui.update_burrowed_larva() + +/datum/hive_status/proc/do_buried_larva_spawn(mob/xeno_candidate) + var/spawning_area + if(hive_location) + spawning_area = hive_location + else if(living_xeno_queen) + spawning_area = living_xeno_queen + else for(var/mob/living/carbon/xenomorpheus as anything in totalXenos) + if(islarva(xenomorpheus) || isxeno_builder(xenomorpheus)) //next to xenos that should be in a safe spot + spawning_area = xenomorpheus + if(!spawning_area) + spawning_area = pick(totalXenos) // FUCK IT JUST GO ANYWHERE + var/list/turf_list + for(var/turf/open/open_turf in orange(3, spawning_area)) + LAZYADD(turf_list, open_turf) + var/turf/open/spawning_turf = pick(turf_list) + + var/mob/living/carbon/xenomorph/larva/new_xeno = spawn_hivenumber_larva(spawning_turf, hivenumber) + if(isnull(new_xeno)) + return FALSE + + if(!SSticker.mode.transfer_xeno(xeno_candidate, new_xeno)) + qdel(new_xeno) + return FALSE + new_xeno.visible_message(SPAN_XENODANGER("A larva suddenly burrows out of \the [spawning_turf]!"), + SPAN_XENODANGER("You burrow out of \the [spawning_turf] and awaken from your slumber. For the Hive!")) + msg_admin_niche("[key_name(new_xeno)] burrowed out from \a [spawning_turf]. [ADMIN_JMP(spawning_turf)]") + playsound(new_xeno, 'sound/effects/xeno_newlarva.ogg', 50, 1) + to_chat(new_xeno, SPAN_XENOANNOUNCE("You are a xenomorph larva awakened from slumber!")) + if(new_xeno.client) + if(new_xeno.client?.prefs?.toggles_flashing & FLASH_POOLSPAWN) + window_flash(new_xeno.client) + + stored_larva-- + hive_ui.update_burrowed_larva() + +/mob/living/proc/ally_of_hivenumber(hivenumber) + var/datum/hive_status/indexed_hive = GLOB.hive_datum[hivenumber] + if(!indexed_hive) + return FALSE + + return indexed_hive.is_ally(src) + +/datum/hive_status/proc/is_ally(mob/living/living_mob) + if(isxeno(living_mob)) + var/mob/living/carbon/xenomorph/zenomorf = living_mob + if(zenomorf.hivenumber == hivenumber) + return !zenomorf.banished + + if(!living_mob.faction) + return FALSE + + return faction_is_ally(living_mob.faction) + +/datum/hive_status/proc/faction_is_ally(faction, ignore_queen_check = FALSE) + if(faction == internal_faction) + return TRUE + if(!ignore_queen_check && !living_xeno_queen) + return FALSE + + return allies[faction] + +/datum/hive_status/proc/can_delay_round_end(mob/living/carbon/xenomorph/xeno) + if(HAS_TRAIT(src, TRAIT_NO_HIVE_DELAY)) + return FALSE + return TRUE + +/datum/hive_status/proc/update_hugger_limit() + var/countable_xeno_iterator = 0 + for(var/mob/living/carbon/xenomorph/cycled_xeno as anything in totalXenos) + if(cycled_xeno.counts_for_slots) + countable_xeno_iterator++ + + playable_hugger_limit = max(Floor(countable_xeno_iterator / playable_hugger_max_divisor), playable_hugger_minimum) + +/datum/hive_status/proc/can_spawn_as_hugger(mob/dead/observer/user) + if(!GLOB.hive_datum || ! GLOB.hive_datum[hivenumber]) + return FALSE + if(jobban_isbanned(user, JOB_XENOMORPH)) // User is jobbanned + to_chat(user, SPAN_WARNING("You are banned from playing aliens and cannot spawn as a xenomorph.")) + return FALSE + if(world.time < hugger_timelock) + to_chat(user, SPAN_WARNING("The hive cannot support facehuggers yet...")) + return FALSE + if(world.time - user.timeofdeath < JOIN_AS_FACEHUGGER_DELAY) + var/time_left = round((user.timeofdeath + JOIN_AS_FACEHUGGER_DELAY - world.time) / 10) + to_chat(user, SPAN_WARNING("You ghosted too recently. You cannot become a facehugger until 3 minutes have passed ([time_left] seconds remaining).")) + return FALSE + if(totalXenos.len <= 0) + //This is to prevent people from joining as Forsaken Huggers on the pred ship + to_chat(user, SPAN_WARNING("The hive has fallen, you can't join it!")) + return FALSE + for(var/mob_name in banished_ckeys) + if(banished_ckeys[mob_name] == user.ckey) + to_chat(user, SPAN_WARNING("You are banished from the [name], you may not rejoin unless the Queen re-admits you or dies.")) + return FALSE + + update_hugger_limit() + + var/current_hugger_count = 0 + for(var/mob/mob as anything in totalXenos) + if(isfacehugger(mob)) + current_hugger_count++ + if(playable_hugger_limit <= current_hugger_count) + to_chat(user, SPAN_WARNING("\The [GLOB.hive_datum[hivenumber]] cannot support more facehuggers! Limit: [current_hugger_count]/[playable_hugger_limit]")) + return FALSE + + if(tgui_alert(user, "Are you sure you want to become a facehugger?", "Confirmation", list("Yes", "No")) != "Yes") + return FALSE + + if(!user.client) + return FALSE + + return TRUE + +/datum/hive_status/proc/spawn_as_hugger(mob/dead/observer/user, atom/A) + var/mob/living/carbon/xenomorph/facehugger/hugger = new /mob/living/carbon/xenomorph/facehugger(A.loc, null, hivenumber) + user.mind.transfer_to(hugger, TRUE) + hugger.visible_message(SPAN_XENODANGER("A facehugger suddenly emerges out of \the [A]!"), SPAN_XENODANGER("You emerge out of \the [A] and awaken from your slumber. For the Hive!")) + playsound(hugger, 'sound/effects/xeno_newlarva.ogg', 25, TRUE) + hugger.generate_name() + hugger.timeofdeath = user.timeofdeath // Keep old death time + +/datum/hive_status/proc/update_lesser_drone_limit() + var/countable_xeno_iterator = 0 + for(var/mob/living/carbon/xenomorph/cycled_xeno as anything in totalXenos) + if(cycled_xeno.counts_for_slots) + countable_xeno_iterator++ + + lesser_drone_limit = max(Floor(countable_xeno_iterator / playable_lesser_drones_max_divisor), lesser_drone_minimum) + +/datum/hive_status/proc/can_spawn_as_lesser_drone(mob/dead/observer/user, obj/effect/alien/resin/special/pylon/spawning_pylon) + if(!GLOB.hive_datum || ! GLOB.hive_datum[hivenumber]) + return FALSE + + if(jobban_isbanned(user, JOB_XENOMORPH)) // User is jobbanned + to_chat(user, SPAN_WARNING("You are banned from playing aliens and cannot spawn as a xenomorph.")) + return FALSE + + if(world.time - user.timeofdeath < JOIN_AS_LESSER_DRONE_DELAY) + var/time_left = round((user.timeofdeath + JOIN_AS_LESSER_DRONE_DELAY - world.time) / 10) + to_chat(user, SPAN_WARNING("You ghosted too recently. You cannot become a lesser drone until 30 seconds have passed ([time_left] seconds remaining).")) + return FALSE + + if(totalXenos.len <= 0) + to_chat(user, SPAN_WARNING("The hive has fallen, you can't join it!")) + return FALSE + + if(!living_xeno_queen) + to_chat(user, SPAN_WARNING("The selected hive does not have a Queen!")) + return FALSE + + if(spawning_pylon.lesser_drone_spawns < 1) + to_chat(user, SPAN_WARNING("The selected core or pylon does not have enough power for a lesser drone!")) + return FALSE + + update_lesser_drone_limit() + + var/current_lesser_drone_count = 0 + for(var/mob/mob as anything in totalXenos) + if(islesserdrone(mob)) + current_lesser_drone_count++ + + if(lesser_drone_limit <= current_lesser_drone_count) + to_chat(user, SPAN_WARNING("[GLOB.hive_datum[hivenumber]] cannot support more lesser drones! Limit: [current_lesser_drone_count]/[lesser_drone_limit]")) + return FALSE + + if(!user.client) + return FALSE + + return TRUE + +///Called by /obj/item/alien_embryo when a host is bursting to determine extra larva per burst +/datum/hive_status/proc/increase_larva_after_burst() + var/extra_per_burst = CONFIG_GET(number/extra_larva_per_burst) + partial_larva += extra_per_burst + convert_partial_larva_to_full_larva() + +///Called after times when partial larva are added to process them to stored larva +/datum/hive_status/proc/convert_partial_larva_to_full_larva() + for(var/i = 1 to partial_larva) + partial_larva-- + stored_larva++ + +/datum/hive_status/corrupted + name = "Corrupted Hive" + reporting_id = "corrupted" + hivenumber = XENO_HIVE_CORRUPTED + prefix = "Corrupted " + color = "#80ff80" + ui_color ="#4d994d" + latejoin_burrowed = FALSE + + need_round_end_check = TRUE + + var/list/defectors = list() + +/datum/hive_status/corrupted/add_xeno(mob/living/carbon/xenomorph/xeno) + . = ..() + xeno.add_language(LANGUAGE_ENGLISH) + +/datum/hive_status/corrupted/remove_xeno(mob/living/carbon/xenomorph/xeno, hard) . = ..() - if(isobserver(user)) - return UI_INTERACTIVE + xeno.remove_language(LANGUAGE_ENGLISH) + +/datum/hive_status/corrupted/can_delay_round_end(mob/living/carbon/xenomorph/xeno) + if(!faction_is_ally(FACTION_MARINE, TRUE)) + return TRUE + return FALSE + +/datum/hive_status/alpha + name = "Alpha Hive" + reporting_id = "alpha" + hivenumber = XENO_HIVE_ALPHA + prefix = "Alpha " + color = "#ff4040" + ui_color = "#992626" + latejoin_burrowed = FALSE + + dynamic_evolution = FALSE + +/datum/hive_status/bravo + name = "Bravo Hive" + reporting_id = "bravo" + hivenumber = XENO_HIVE_BRAVO + prefix = "Bravo " + color = "#ffff80" + ui_color = "#99994d" + latejoin_burrowed = FALSE -/datum/hive_status_ui/ui_data(mob/user) - . = list() - .["total_xenos"] = total_xenos - .["xeno_counts"] = xeno_counts - .["tier_slots"] = tier_slots - .["xeno_keys"] = xeno_keys - .["xeno_info"] = xeno_info - .["xeno_vitals"] = xeno_vitals - .["queen_location"] = get_area_name(assoc_hive.living_xeno_queen) - .["hive_location"] = hive_location - .["burrowed_larva"] = burrowed_larva - .["evilution_level"] = evilution_level + dynamic_evolution = FALSE - var/mob/living/carbon/xenomorph/queen/Q = user - .["is_in_ovi"] = istype(Q) && Q.ovipositor +/datum/hive_status/charlie + name = "Charlie Hive" + reporting_id = "charlie" + hivenumber = XENO_HIVE_CHARLIE + prefix = "Charlie " + color = "#bb40ff" + ui_color = "#702699" + latejoin_burrowed = FALSE -/datum/hive_status_ui/ui_static_data(mob/user) - . = list() - .["user_ref"] = REF(user) - .["hive_color"] = assoc_hive.ui_color - .["hive_name"] = assoc_hive.name + dynamic_evolution = FALSE -/datum/hive_status_ui/proc/open_hive_status(mob/user) - if(!user) +/datum/hive_status/delta + name = "Delta Hive" + reporting_id = "delta" + hivenumber = XENO_HIVE_DELTA + prefix = "Delta " + color = "#8080ff" + ui_color = "#4d4d99" + latejoin_burrowed = FALSE + + dynamic_evolution = FALSE + +/datum/hive_status/feral + name = "Feral Hive" + reporting_id = "feral" + hivenumber = XENO_HIVE_FERAL + prefix = "Feral " + color = "#828296" + ui_color = "#828296" + + construction_allowed = XENO_NOBODY + destruction_allowed = XENO_NOBODY + dynamic_evolution = FALSE + allow_no_queen_actions = TRUE + allow_no_queen_evo = TRUE + allow_queen_evolve = FALSE + ignore_slots = TRUE + latejoin_burrowed = FALSE + +/datum/hive_status/forsaken + name = "Forsaken Hive" + reporting_id = "forsaken" + hivenumber = XENO_HIVE_FORSAKEN + prefix = "Forsaken " + color = "#cc8ec4" + ui_color = "#cc8ec4" + + dynamic_evolution = FALSE + allow_no_queen_actions = TRUE + allow_no_queen_evo = TRUE + allow_queen_evolve = FALSE + ignore_slots = TRUE + latejoin_burrowed = FALSE + + need_round_end_check = TRUE + +/datum/hive_status/forsaken/can_delay_round_end(mob/living/carbon/xenomorph/xeno) + return FALSE + +/datum/hive_status/yautja + name = "Hellhound Pack" + reporting_id = "hellhounds" + hivenumber = XENO_HIVE_YAUTJA + internal_faction = FACTION_YAUTJA + + dynamic_evolution = FALSE + allow_no_queen_actions = TRUE + allow_no_queen_evo = TRUE + allow_queen_evolve = FALSE + ignore_slots = TRUE + latejoin_burrowed = FALSE + + need_round_end_check = TRUE + +/datum/hive_status/yautja/can_delay_round_end(mob/living/carbon/xenomorph/xeno) + return FALSE + +/datum/hive_status/mutated + name = "Mutated Hive" + reporting_id = "mutated" + hivenumber = XENO_HIVE_MUTATED + prefix = "Mutated " + color = "#6abd99" + ui_color = "#6abd99" + + hive_inherant_traits = list(TRAIT_XENONID, TRAIT_NO_COLOR) + latejoin_burrowed = FALSE + +/datum/hive_status/corrupted/tamed + name = "Tamed Hive" + reporting_id = "tamed" + hivenumber = XENO_HIVE_TAMED + prefix = "Tamed " + color = "#80ff80" + + dynamic_evolution = FALSE + allow_no_queen_actions = TRUE + allow_no_queen_evo = TRUE + allow_queen_evolve = FALSE + ignore_slots = TRUE + latejoin_burrowed = FALSE + + var/mob/living/carbon/human/leader + var/list/allied_factions + +/datum/hive_status/corrupted/tamed/New() + . = ..() + hive_structures_limit[XENO_STRUCTURE_EGGMORPH] = 0 + hive_structures_limit[XENO_STRUCTURE_EVOPOD] = 0 + +/datum/hive_status/corrupted/tamed/proc/make_leader(mob/living/carbon/human/H) + if(!istype(H)) + return + + if(leader) + UnregisterSignal(leader, COMSIG_PARENT_QDELETING) + + leader = H + RegisterSignal(leader, COMSIG_PARENT_QDELETING, PROC_REF(handle_qdelete)) + +/datum/hive_status/corrupted/tamed/proc/handle_qdelete(mob/living/carbon/human/H) + SIGNAL_HANDLER + + if(H == leader) + leader = null + + var/list/faction_groups = H.faction_group + if(faction_groups) + allied_factions = faction_groups.Copy() + if(!(H.faction in allied_factions)) + allied_factions += H.faction + +/datum/hive_status/corrupted/tamed/add_xeno(mob/living/carbon/xenomorph/X) + . = ..() + X.faction_group = allied_factions + +/datum/hive_status/corrupted/tamed/remove_xeno(mob/living/carbon/xenomorph/X, hard) + . = ..() + X.faction_group = list(X.faction) + +/datum/hive_status/corrupted/tamed/is_ally(mob/living/carbon/C) + if(leader) + if(C.faction in leader.faction_group) + return TRUE + + if(C.faction == leader.faction) + return TRUE + else + if(C.faction in allied_factions) + return TRUE + + return ..() + +/datum/hive_status/corrupted/renegade + name = "Renegade Hive" + reporting_id = "renegade" + hivenumber = XENO_HIVE_RENEGADE + prefix = "Renegade " + color = "#9c7a4d" + ui_color ="#80705c" + + dynamic_evolution = FALSE + allow_queen_evolve = FALSE + allow_no_queen_evo = TRUE + latejoin_burrowed = FALSE + +/datum/hive_status/corrupted/renegade/New() + . = ..() + hive_structures_limit[XENO_STRUCTURE_EGGMORPH] = 0 + hive_structures_limit[XENO_STRUCTURE_EVOPOD] = 0 + for(var/faction in FACTION_LIST_HUMANOID) //renegades allied to all humanoids, but it mostly affects structures. Their ability to attack humanoids and other xenos (including of the same hive) depends on iff settings + allies[faction] = TRUE + +/datum/hive_status/corrupted/renegade/can_spawn_as_hugger(mob/dead/observer/user) + to_chat(user, SPAN_WARNING("The [name] cannot support facehuggers.")) + return FALSE + +/datum/hive_status/corrupted/renegade/proc/iff_protection_check(mob/living/carbon/xenomorph/xeno, mob/living/carbon/attempt_harm_mob) + if(xeno == attempt_harm_mob) + return TRUE //you cannot hurt yourself... + if(!xeno.iff_tag) + return FALSE //can attack anyone if you don't have iff tag + if(isxeno(attempt_harm_mob)) + var/mob/living/carbon/xenomorph/target_xeno = attempt_harm_mob + if(!target_xeno.iff_tag) + return FALSE //can attack any xeno who don't have iff tag + for(var/faction in xeno.iff_tag.faction_groups) + if(faction in target_xeno.iff_tag.faction_groups) + return TRUE //cannot attack xenos with same iff setting + return FALSE + for(var/faction in xeno.iff_tag.faction_groups) + if(faction in attempt_harm_mob.faction_group) + return TRUE //cannot attack mob if iff is set to at least one of its factions + return FALSE + +/datum/hive_status/corrupted/renegade/faction_is_ally(faction, ignore_queen_check = TRUE) + return ..() + +/datum/hive_status/proc/on_queen_death() //break alliances on queen's death + if(allow_no_queen_actions || living_xeno_queen) return + var/broken_alliances = FALSE + for(var/faction in allies) + if(!allies[faction]) + continue + change_stance(faction, FALSE) + broken_alliances = TRUE - // Update absolutely all data - if(!data_initialized) - update_all_data() - tgui_interact(user) + if(broken_alliances) + xeno_message(SPAN_XENOANNOUNCE("With the death of the Queen, all alliances have been broken."), 3, hivenumber) -/datum/hive_status_ui/tgui_interact(mob/user, datum/tgui/ui) - if(!assoc_hive) +/datum/hive_status/proc/change_stance(faction, should_ally) + if(faction == name) + return + if(allies[faction] == should_ally) return + allies[faction] = should_ally - ui = SStgui.try_update_ui(user, src, ui) - if (!ui) - ui = new(user, src, "HiveStatus", "[assoc_hive.name] Status") - ui.open() - ui.set_autoupdate(FALSE) + if(living_xeno_queen) + if(allies[faction]) + xeno_message(SPAN_XENOANNOUNCE("Your Queen set up an alliance with [faction]!"), 3, hivenumber) + else + xeno_message(SPAN_XENOANNOUNCE("Your Queen broke the alliance with [faction]!"), 3, hivenumber) -/datum/hive_status_ui/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + for(var/number in GLOB.hive_datum) + var/datum/hive_status/target_hive = GLOB.hive_datum[number] + if(target_hive.name != faction) + continue + if(!target_hive.living_xeno_queen && !target_hive.allow_no_queen_actions) + return + if(allies[faction]) + xeno_message(SPAN_XENOANNOUNCE("You sense that [name] [living_xeno_queen ? "Queen " : ""]set up an alliance with us!"), 3, target_hive.hivenumber) + return + + xeno_message(SPAN_XENOANNOUNCE("You sense that [name] [living_xeno_queen ? "Queen " : ""]broke the alliance with us!"), 3, target_hive.hivenumber) + if(target_hive.allies[name]) //autobreak alliance on betrayal + target_hive.change_stance(name, FALSE) + + +/datum/hive_status/corrupted/change_stance(faction, should_ally) . = ..() - if(.) + if(allies[faction]) + return + if(!(faction in FACTION_LIST_HUMANOID)) + return + + for(var/mob/living/carbon/xenomorph/xeno in totalXenos) // handle defecting xenos on betrayal + if(!xeno.iff_tag) + continue + if(!(faction in xeno.iff_tag.faction_groups)) + continue + if(xeno in defectors) + continue + if(xeno.caste_type == XENO_CASTE_QUEEN) + continue + INVOKE_ASYNC(src, PROC_REF(give_defection_choice), xeno, faction) + addtimer(CALLBACK(src, PROC_REF(handle_defectors), faction), 11 SECONDS) + +/datum/hive_status/corrupted/proc/give_defection_choice(mob/living/carbon/xenomorph/xeno, faction) + if(tgui_alert(xeno, "Your Queen has broken the alliance with the [faction]. The device inside your carapace begins to suppress your connection with the Hive. Do you remove it and stay loyal to her?", "Alliance broken!", list("Stay loyal", "Obey the talls"), 10 SECONDS) == "Obey the talls") + if(!xeno.iff_tag) + to_chat(xeno, SPAN_XENOWARNING("It's too late now. The device is gone and your service to the Queen continues.")) + return + defectors += xeno + xeno.set_hive_and_update(XENO_HIVE_RENEGADE) + to_chat(xeno, SPAN_XENOANNOUNCE("You lost the connection with your Hive. Now you have no Queen, only your masters.")) + to_chat(xeno, SPAN_NOTICE("Your instincts have changed, you seem compelled to protect [english_list(xeno.iff_tag.faction_groups, "no one")].")) return + xeno.visible_message(SPAN_XENOWARNING("[xeno] rips out [xeno.iff_tag]!"), SPAN_XENOWARNING("You rip out [xeno.iff_tag]! For the Hive!")) + xeno.adjustBruteLoss(50) + xeno.iff_tag.forceMove(get_turf(xeno)) + xeno.iff_tag = null + +/datum/hive_status/corrupted/proc/handle_defectors(faction) + for(var/mob/living/carbon/xenomorph/xeno in totalXenos) + if(!xeno.iff_tag) + continue + if(xeno in defectors) + continue + if(!(faction in xeno.iff_tag.faction_groups)) + continue + xeno.visible_message(SPAN_XENOWARNING("[xeno] rips out [xeno.iff_tag]!"), SPAN_XENOWARNING("You rip out [xeno.iff_tag]! For the hive!")) + xeno.adjustBruteLoss(50) + xeno.iff_tag.forceMove(get_turf(xeno)) + xeno.iff_tag = null + if(!length(defectors)) + return + + xeno_message(SPAN_XENOANNOUNCE("You sense that [english_list(defectors)] turned their backs against their sisters and the Queen in favor of their slavemasters!"), 3, hivenumber) + defectors.Cut() + +//Xeno Resin Mark Shit, the very best place for it too :0) +//Defines at the bottom of this list here will show up at the top in the mark menu +/datum/xeno_mark_define + var/name = "xeno_declare" + var/icon_state = "empty" + var/desc = "Xenos make psychic markers with this meaning as positional lasting communication to eachother" - switch(action) - if("give_plasma") - var/mob/living/carbon/xenomorph/xenoTarget = locate(params["target_ref"]) in GLOB.living_xeno_list - var/mob/living/carbon/xenomorph/xenoSrc = ui.user +/datum/xeno_mark_define/fortify + name = "Fortify" + desc = "Fortify this area!" + icon_state = "fortify" - if(QDELETED(xenoTarget) || xenoTarget.stat == DEAD || is_admin_level(xenoTarget.z)) - return +/datum/xeno_mark_define/weeds + name = "Need Weeds" + desc = "Need weeds here!" + icon_state = "weed" - if(xenoSrc.stat == DEAD) - return +/datum/xeno_mark_define/nest + name = "Nest" + desc = "Nest enemies here!" + icon_state = "nest" - var/datum/action/xeno_action/A = get_xeno_action_by_type(xenoSrc, /datum/action/xeno_action/activable/queen_give_plasma) - A?.use_ability_wrapper(xenoTarget) +/datum/xeno_mark_define/hosts + name = "Hosts" + desc = "Hosts here!" + icon_state = "hosts" - if("heal") - var/mob/living/carbon/xenomorph/xenoTarget = locate(params["target_ref"]) in GLOB.living_xeno_list - var/mob/living/carbon/xenomorph/xenoSrc = ui.user +/datum/xeno_mark_define/aide + name = "Aide" + desc = "Aide here!" + icon_state = "aide" - if(QDELETED(xenoTarget) || xenoTarget.stat == DEAD || is_admin_level(xenoTarget.z)) - return +/datum/xeno_mark_define/defend + name = "Defend" + desc = "Defend the hive here!" + icon_state = "defend" - if(xenoSrc.stat == DEAD) - return +/datum/xeno_mark_define/danger + name = "Danger Warning" + desc = "Caution, danger here!" + icon_state = "danger" - var/datum/action/xeno_action/A = get_xeno_action_by_type(xenoSrc, /datum/action/xeno_action/activable/queen_heal) - A?.use_ability_wrapper(xenoTarget, TRUE) +/datum/xeno_mark_define/rally + name = "Rally" + desc = "Group up here!" + icon_state = "rally" - if("overwatch") - var/mob/living/carbon/xenomorph/xenoTarget = locate(params["target_ref"]) in GLOB.living_xeno_list - var/mob/living/carbon/xenomorph/xenoSrc = ui.user +/datum/xeno_mark_define/hold + name = "Hold" + desc = "Hold this area!" + icon_state = "hold" - if(QDELETED(xenoTarget) || xenoTarget.stat == DEAD || is_admin_level(xenoTarget.z)) - return +/datum/xeno_mark_define/ambush + name = "Ambush" + desc = "Ambush the enemy here!" + icon_state = "ambush" +/datum/xeno_mark_define/attack + name = "Attack" + desc = "Attack the enemy here!" + icon_state = "attack" - if(xenoSrc.stat == DEAD) - if(isobserver(xenoSrc)) - var/mob/dead/observer/O = xenoSrc - O.ManualFollow(xenoTarget) - return - if(!xenoSrc.check_state(TRUE)) - return - xenoSrc.overwatch(xenoTarget) diff --git a/code/modules/mob/living/carbon/xenomorph/hive_status_ui.dm b/code/modules/mob/living/carbon/xenomorph/hive_status_ui.dm new file mode 100644 index 000000000000..4fe1be51bfff --- /dev/null +++ b/code/modules/mob/living/carbon/xenomorph/hive_status_ui.dm @@ -0,0 +1,216 @@ +/datum/hive_status_ui + var/name = "Hive Status" + + // Data to pass when rendering the UI (not static) + var/total_xenos + var/list/xeno_counts + var/list/tier_slots + var/list/xeno_vitals + var/list/xeno_keys + var/list/xeno_info + var/hive_location + var/burrowed_larva + var/evilution_level + + var/data_initialized = FALSE + + var/datum/hive_status/assoc_hive = null + +/datum/hive_status_ui/New(datum/hive_status/hive) + assoc_hive = hive + update_all_data() + START_PROCESSING(SShive_status, src) + +/datum/hive_status_ui/process() + update_xeno_vitals() + update_xeno_info(FALSE) + SStgui.update_uis(src) + +// Updates the list tracking how many xenos there are in each tier, and how many there are in total +/datum/hive_status_ui/proc/update_xeno_counts(send_update = TRUE) + xeno_counts = assoc_hive.get_xeno_counts() + + total_xenos = 0 + for(var/counts in xeno_counts) + for(var/caste in counts) + total_xenos += counts[caste] + + if(send_update) + SStgui.update_uis(src) + + xeno_counts[1] -= "Queen" // don't show queen in the amount of xenos + + // Also update the amount of T2/T3 slots + tier_slots = assoc_hive.get_tier_slots() + +// Updates the hive location using the area name of the defined hive location turf +/datum/hive_status_ui/proc/update_hive_location(send_update = TRUE) + if(!assoc_hive.hive_location) + return + + hive_location = strip_improper(get_area_name(assoc_hive.hive_location)) + + if(send_update) + SStgui.update_uis(src) + +// Updates the sorted list of all xenos that we use as a key for all other information +/datum/hive_status_ui/proc/update_xeno_keys(send_update = TRUE) + xeno_keys = assoc_hive.get_xeno_keys() + + if(send_update) + SStgui.update_uis(src) + +// Mildly related to the above, but only for when xenos are removed from the hive +// If a xeno dies, we don't have to regenerate all xeno info and sort it again, just remove them from the data list +/datum/hive_status_ui/proc/xeno_removed(mob/living/carbon/xenomorph/X) + if(!xeno_keys) + return + + for(var/index in 1 to length(xeno_keys)) + var/list/info = xeno_keys[index] + if(info["nicknumber"] == X.nicknumber) + + // tried Remove(), didn't work. *shrug* + xeno_keys[index] = null + xeno_keys -= null + return + + SStgui.update_uis(src) + +// Updates the list of xeno names, strains and references +/datum/hive_status_ui/proc/update_xeno_info(send_update = TRUE) + xeno_info = assoc_hive.get_xeno_info() + + if(send_update) + SStgui.update_uis(src) + +// Updates vital information about xenos such as health and location. Only info that should be updated regularly +/datum/hive_status_ui/proc/update_xeno_vitals() + xeno_vitals = assoc_hive.get_xeno_vitals() + +// Updates how many buried larva there are +/datum/hive_status_ui/proc/update_burrowed_larva(send_update = TRUE) + burrowed_larva = assoc_hive.stored_larva + if(SSxevolution) + evilution_level = SSxevolution.get_evolution_boost_power(assoc_hive.hivenumber) + else + evilution_level = 1 + if(send_update) + SStgui.update_uis(src) + +// Updates all data except burrowed larva +/datum/hive_status_ui/proc/update_all_xeno_data(send_update = TRUE) + update_xeno_counts(FALSE) + update_xeno_vitals() + update_xeno_keys(FALSE) + update_xeno_info(FALSE) + + if(send_update) + SStgui.update_uis(src) + +// Updates all data, including burrowed larva +/datum/hive_status_ui/proc/update_all_data() + data_initialized = TRUE + update_all_xeno_data(FALSE) + update_burrowed_larva(FALSE) + SStgui.update_uis(src) + +/datum/hive_status_ui/ui_state(mob/user) + return GLOB.hive_state[assoc_hive.internal_faction] + +/datum/hive_status_ui/ui_status(mob/user, datum/ui_state/state) + . = ..() + if(isobserver(user)) + return UI_INTERACTIVE + +/datum/hive_status_ui/ui_data(mob/user) + . = list() + .["total_xenos"] = total_xenos + .["xeno_counts"] = xeno_counts + .["tier_slots"] = tier_slots + .["xeno_keys"] = xeno_keys + .["xeno_info"] = xeno_info + .["xeno_vitals"] = xeno_vitals + .["queen_location"] = get_area_name(assoc_hive.living_xeno_queen) + .["hive_location"] = hive_location + .["burrowed_larva"] = burrowed_larva + .["evilution_level"] = evilution_level + + var/mob/living/carbon/xenomorph/queen/Q = user + .["is_in_ovi"] = istype(Q) && Q.ovipositor + +/datum/hive_status_ui/ui_static_data(mob/user) + . = list() + .["user_ref"] = REF(user) + .["hive_color"] = assoc_hive.ui_color + .["hive_name"] = assoc_hive.name + +/datum/hive_status_ui/proc/open_hive_status(mob/user) + if(!user) + return + + // Update absolutely all data + if(!data_initialized) + update_all_data() + + tgui_interact(user) + +/datum/hive_status_ui/tgui_interact(mob/user, datum/tgui/ui) + if(!assoc_hive) + return + + ui = SStgui.try_update_ui(user, src, ui) + if (!ui) + ui = new(user, src, "HiveStatus", "[assoc_hive.name] Status") + ui.open() + ui.set_autoupdate(FALSE) + +/datum/hive_status_ui/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + switch(action) + if("give_plasma") + var/mob/living/carbon/xenomorph/xenoTarget = locate(params["target_ref"]) in GLOB.living_xeno_list + var/mob/living/carbon/xenomorph/xenoSrc = ui.user + + if(QDELETED(xenoTarget) || xenoTarget.stat == DEAD || is_admin_level(xenoTarget.z)) + return + + if(xenoSrc.stat == DEAD) + return + + var/datum/action/xeno_action/A = get_xeno_action_by_type(xenoSrc, /datum/action/xeno_action/activable/queen_give_plasma) + A?.use_ability_wrapper(xenoTarget) + + if("heal") + var/mob/living/carbon/xenomorph/xenoTarget = locate(params["target_ref"]) in GLOB.living_xeno_list + var/mob/living/carbon/xenomorph/xenoSrc = ui.user + + if(QDELETED(xenoTarget) || xenoTarget.stat == DEAD || is_admin_level(xenoTarget.z)) + return + + if(xenoSrc.stat == DEAD) + return + + var/datum/action/xeno_action/A = get_xeno_action_by_type(xenoSrc, /datum/action/xeno_action/activable/queen_heal) + A?.use_ability_wrapper(xenoTarget, TRUE) + + if("overwatch") + var/mob/living/carbon/xenomorph/xenoTarget = locate(params["target_ref"]) in GLOB.living_xeno_list + var/mob/living/carbon/xenomorph/xenoSrc = ui.user + + if(QDELETED(xenoTarget) || xenoTarget.stat == DEAD || is_admin_level(xenoTarget.z)) + return + + if(xenoSrc.stat == DEAD) + if(isobserver(xenoSrc)) + var/mob/dead/observer/O = xenoSrc + O.ManualFollow(xenoTarget) + return + + if(!xenoSrc.check_state(TRUE)) + return + + xenoSrc.overwatch(xenoTarget) diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm index 3d032da2fe36..3b321ca259c9 100644 --- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm +++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm @@ -63,9 +63,10 @@ /datum/behavior_delegate/carrier_eggsac/on_life() if(length(eggs_sustained) > egg_sustain_cap) var/obj/effect/alien/egg/carrier_egg/my_egg = eggs_sustained[1] - remove_egg_owner(my_egg) - my_egg.start_unstoppable_decay() - to_chat(bound_xeno, SPAN_XENOWARNING("You can only sustain [egg_sustain_cap] eggs off hive weeds! Your oldest placed egg is decaying rapidly.")) + if(my_egg) + remove_egg_owner(my_egg) + my_egg.start_unstoppable_decay() + to_chat(bound_xeno, SPAN_XENOWARNING("You can only sustain [egg_sustain_cap] eggs off hive weeds! Your oldest placed egg is decaying rapidly.")) for(var/obj/effect/alien/egg/carrier_egg/my_egg as anything in eggs_sustained) //Get the distance from us to our sustained egg diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm b/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm deleted file mode 100644 index 99f9c46b5b65..000000000000 --- a/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm +++ /dev/null @@ -1,1574 +0,0 @@ -// Actual caste datum basedef -/datum/caste_datum - var/caste_type = "" - var/display_name = "" - var/tier = 0 - var/dead_icon = "Drone Dead" - var/language = LANGUAGE_XENOMORPH - var/melee_damage_lower = 10 - var/melee_damage_upper = 20 - ///allows fine tuning melee damage to vehicles per caste. - var/melee_vehicle_damage = 10 - var/evasion = XENO_EVASION_NONE - - var/speed = XENO_SPEED_TIER_10 - - var/plasma_max = 10 - var/plasma_gain = 5 - - var/crystal_max = 0 - - var/max_health = XENO_UNIVERSAL_HPMULT * 100 - ///Are they allowed to evolve (and have their evolution progress group) - var/evolution_allowed = 1 - ///Threshold to next evolution - var/evolution_threshold = 0 - /// whether they can get evo points without needing an ovi queen - var/evolve_without_queen = FALSE - ///This is where you add castes to evolve into. "Separated", "by", "commas" - var/list/evolves_to = list() - /// what caste or castes to de-evolve to. - var/list/deevolves_to = list() - ///If they can use consoles, etc. Set on Queen - var/is_intelligent = 0 - var/caste_desc = null - - // Tackles - var/tackle_min = 2 - var/tackle_max = 6 - var/tackle_chance = 35 - var/tacklestrength_min = 2 - var/tacklestrength_max = 3 - - ///Chance of deflecting projectiles. - var/armor_deflection = 0 - var/fire_immunity = FIRE_IMMUNITY_NONE - var/fire_intensity_resistance = 0 - - ///Delay timer for spitting - var/spit_delay = 60 - - /// Windup for spits - var/spit_windup = FALSE - - ///The strength of our aura. Zero means we can't emit one - var/aura_strength = 0 - - ///"Evolving" removed for the time being - var/aura_allowed = list("frenzy", "warding", "recovery") - - ///Adjust pixel size. 0.x is smaller, 1.x is bigger, percentage based. - var/adjust_size_x = 1 - var/adjust_size_y = 1 - - ///list of datum projectile types the xeno can use. - var/list/spit_types - - var/attack_delay = 0 //Bonus or pen to time in between attacks. + makes slashes slower. - - var/agility_speed_increase = 0 // this opens up possibilities for balancing - - // The type of mutator delegate to instantiate on the base caste. Will - // be replaced when the Xeno chooses a strain. - var/behavior_delegate_type = /datum/behavior_delegate - - // Resin building-related vars - /// Default build time and build distance - var/build_time_mult = BUILD_TIME_MULT_XENO - var/max_build_dist = 0 - - // Carrier vars // - - /// if a hugger is held in hand, won't attempt to leap and kill itself - var/hugger_nurturing = FALSE - var/huggers_max = 0 - var/throwspeed = 0 - var/hugger_delay = 0 - var/eggs_max = 0 - var/egg_cooldown = 30 - ///Armor but for explosions - var/xeno_explosion_resistance = 0 - - //Queen vars - var/can_hold_facehuggers = 0 - var/can_hold_eggs = CANNOT_HOLD_EGGS - - var/can_be_queen_healed = TRUE - var/can_be_revived = TRUE - - var/can_vent_crawl = 1 - - var/caste_luminosity = 0 - - /// if fire_immunity is set to be vulnerable, how much will fire damage be multiplied. Defines in xeno.dm - var/fire_vulnerability_mult = 0 - - var/burrow_cooldown = 5 SECONDS - var/tunnel_cooldown = 100 - var/widen_cooldown = 10 SECONDS - ///Big strong ability, big cooldown. - var/tremor_cooldown = 30 SECONDS - ///whether the xeno heals even outside weeds. - var/innate_healing = FALSE - - var/acid_level = 0 - var/weed_level = WEED_LEVEL_STANDARD - ///Time it takes between acid splash retaliate procs. Variable per caste, for if we want future castes that are acid bombs - var/acid_splash_cooldown = 3 SECONDS - - // regen vars - - var/heal_delay_time = 0 SECONDS - var/heal_resting = 1 - var/heal_standing = 0.4 - var/heal_knocked_out = 0.33 - - var/list/resin_build_order - var/minimum_xeno_playtime = 0 - -// cannot evolve to this caste until the round has been going on for this amount of time - // IMPORTANT: this is ROUND_TIME, not world.time - var/minimum_evolve_time = 1 MINUTES - /// Iconstate for the xeno on the minimap - var/minimap_icon = "xeno" - ///The iconstate for leadered xenos on the minimap, added as overlay - var/minimap_leadered_overlay = "xenoleader" - - var/royal_caste = FALSE - - -/datum/caste_datum/can_vv_modify() - return FALSE - -/datum/caste_datum/New() - . = ..() - - //Initialise evolution and upgrade thresholds in one place, once and for all - evolution_threshold = 0 - if(evolution_allowed) - switch(tier) - if(0) - evolution_threshold = 60 - if(1) - evolution_threshold = 200 - if(2) - evolution_threshold = 500 - //Other tiers (T3, Queen, etc.) can't evolve anyway - - resin_build_order = GLOB.resin_build_order_drone - -/client/var/cached_xeno_playtime - -/// playtime for all castes -/client/proc/get_total_xeno_playtime(skip_cache = FALSE) - if(cached_xeno_playtime && !skip_cache) - return cached_xeno_playtime - - var/total_xeno_playtime = 0 - - for(var/caste in GLOB.RoleAuthority.castes_by_name) - total_xeno_playtime += get_job_playtime(src, caste) - - total_xeno_playtime += get_job_playtime(src, JOB_XENOMORPH) - - if(player_entity) - var/past_xeno_playtime = player_entity.get_playtime(STATISTIC_XENO) - if(past_xeno_playtime) - total_xeno_playtime += past_xeno_playtime - - - cached_xeno_playtime = total_xeno_playtime - - return total_xeno_playtime - -/// playtime for drone and drone evolution castes -/client/proc/get_total_drone_playtime() - var/total_drone_playtime = 0 - - var/list/drone_evo_castes = list(XENO_CASTE_DRONE, XENO_CASTE_CARRIER, XENO_CASTE_BURROWER, XENO_CASTE_HIVELORD, XENO_CASTE_QUEEN) - - for(var/caste in GLOB.RoleAuthority.castes_by_name) - if(!(caste in drone_evo_castes)) - continue - total_drone_playtime += get_job_playtime(src, caste) - - return total_drone_playtime - -/// playtime for t3 castes and queen -/client/proc/get_total_t3_playtime() - var/total_t3_playtime = 0 - var/datum/caste_datum/caste - for(var/caste_name in GLOB.RoleAuthority.castes_by_name) - caste = GLOB.RoleAuthority.castes_by_name[caste_name] - if(caste.tier < 3) - continue - total_t3_playtime += get_job_playtime(src, caste_name) - - return total_t3_playtime - -/datum/caste_datum/proc/can_play_caste(client/client) - if(!CONFIG_GET(flag/use_timelocks)) - return TRUE - - var/total_xeno_playtime = client.get_total_xeno_playtime() - - if(minimum_xeno_playtime && total_xeno_playtime < minimum_xeno_playtime) - return FALSE - - return TRUE - -/datum/caste_datum/proc/get_caste_requirement(client/client) - return minimum_xeno_playtime - client.get_total_xeno_playtime() - -/datum/caste_datum/proc/get_minimap_icon() - var/image/background = mutable_appearance('icons/ui_icons/map_blips.dmi', "background") - background.color = MINIMAP_ICON_BACKGROUND_XENO - - var/iconstate = minimap_icon ? minimap_icon : "unknown" - var/mutable_appearance/icon = image('icons/ui_icons/map_blips.dmi', icon_state = iconstate) - icon.appearance_flags = RESET_COLOR - background.overlays += icon - - return background - -/datum/hive_status - var/name = "Normal Hive" - - // Used for the faction of the xenomorph. Not recommended to modify. - var/internal_faction - - /// Short Hive ID as string used in stats reporting - var/reporting_id = "normal" - - var/hivenumber = XENO_HIVE_NORMAL - var/mob/living/carbon/xenomorph/queen/living_xeno_queen - var/egg_planting_range = 15 - var/slashing_allowed = XENO_SLASH_ALLOWED //This initial var allows the queen to turn on or off slashing. Slashing off means harm intent does much less damage. - var/construction_allowed = NORMAL_XENO //Who can place construction nodes for special structures - var/destruction_allowed = XENO_LEADER //Who can destroy special structures - var/unnesting_allowed = TRUE - var/hive_orders = "" //What orders should the hive have - var/color = null - var/ui_color = null // Color for hive status collapsible buttons and xeno count list - var/prefix = "" - var/queen_leader_limit = 2 - var/list/open_xeno_leader_positions = list(1, 2) // Ordered list of xeno leader positions (indexes in xeno_leader_list) that are not occupied - var/list/xeno_leader_list[2] // Ordered list (i.e. index n holds the nth xeno leader) - var/stored_larva = 0 - - ///used by /datum/hive_status/proc/increase_larva_after_burst() to support non-integer increases to larva - var/partial_larva = 0 - /// Assoc list of free slots available to specific castes - var/list/free_slots = list( - /datum/caste_datum/burrower = 1, - /datum/caste_datum/hivelord = 1, - /datum/caste_datum/carrier = 1 - ) - /// Assoc list of slots currently used by specific castes (for calculating free_slot usage) - var/list/used_slots = list() - /// list of living tier2 xenos - var/list/tier_2_xenos = list() - /// list of living tier3 xenos - var/list/tier_3_xenos = list() - /// list of living xenos - var/list/totalXenos = list() - /// list of previously living xenos (hardrefs currently) - var/list/total_dead_xenos = list() - var/xeno_queen_timer - var/isSlotOpen = TRUE //Set true for starting alerts only after the hive has reached its full potential - var/allowed_nest_distance = 15 //How far away do we allow nests from an ovied Queen. Default 15 tiles. - var/obj/effect/alien/resin/special/pylon/core/hive_location = null //Set to ref every time a core is built, for defining the hive location - var/crystal_stored = 0 //How much stockpiled material is stored for the hive to use. - - var/datum/mutator_set/hive_mutators/mutators = new - var/tier_slot_multiplier = 1 - var/larva_gestation_multiplier = 1 - var/bonus_larva_spawn_chance = 1 - var/hijack_burrowed_surge = FALSE //at hijack, start spawning lots of burrowed - /// how many burrowed is going to spawn during larva surge - var/hijack_burrowed_left = 0 - - var/ignore_slots = FALSE - var/dynamic_evolution = TRUE - var/evolution_rate = 3 // Only has use if dynamic_evolution is false - var/evolution_bonus = 0 - - var/allow_no_queen_actions = FALSE - var/allow_no_queen_evo = FALSE - var/evolution_without_ovipositor = TRUE //Temporary for the roundstart. - /// Set to false if you want to prevent evolutions into Queens - var/allow_queen_evolve = TRUE - /// Set to true if you want to prevent bursts and spawns of new xenos. Will also prevent healing if the queen no longer exists - var/hardcore = FALSE - /// Set to false if you want to prevent getting burrowed larva from latejoin marines - var/latejoin_burrowed = TRUE - - var/list/hive_inherant_traits - - // Cultist Info - var/mob/living/carbon/leading_cult_sl - - //List of how many maximum of each special structure you can have - var/list/hive_structures_limit = list( - XENO_STRUCTURE_CORE = 1, - XENO_STRUCTURE_CLUSTER = 8, - XENO_STRUCTURE_POOL = 1, - XENO_STRUCTURE_EGGMORPH = 6, - XENO_STRUCTURE_EVOPOD = 2, - XENO_STRUCTURE_RECOVERY = 6, - XENO_STRUCTURE_PYLON = 2, - ) - - var/global/list/hive_structure_types = list( - XENO_STRUCTURE_CORE = /datum/construction_template/xenomorph/core, - XENO_STRUCTURE_CLUSTER = /datum/construction_template/xenomorph/cluster, - XENO_STRUCTURE_EGGMORPH = /datum/construction_template/xenomorph/eggmorph, - XENO_STRUCTURE_RECOVERY = /datum/construction_template/xenomorph/recovery - ) - - var/list/list/hive_structures = list() //Stringref list of structures that have been built - var/list/list/hive_constructions = list() //Stringref list of structures that are being built - - var/datum/hive_status_ui/hive_ui - var/datum/mark_menu_ui/mark_ui - var/datum/hive_faction_ui/faction_ui - - var/list/tunnels = list() - - var/list/allies = list() - - var/list/resin_marks = list() - - var/list/banished_ckeys = list() - - var/hivecore_cooldown = FALSE - - var/need_round_end_check = FALSE - - //Joining as Facehugger vars - /// When can huggers join the round - var/hugger_timelock = 15 MINUTES - /// How many huggers can the hive support - var/playable_hugger_limit = 0 - /// Minimum number of huggers available at any hive size - var/playable_hugger_minimum = 2 - /// This number divides the total xenos counted for slots to give the max number of facehuggers - var/playable_hugger_max_divisor = 4 - - /// How many lesser drones the hive can support - var/lesser_drone_limit = 0 - /// Slots available for lesser drones will never go below this number - var/lesser_drone_minimum = 2 - /// This number divides the total xenos counted for slots to give the max number of lesser drones - var/playable_lesser_drones_max_divisor = 3 - - var/datum/tacmap/drawing/xeno/tacmap - var/minimap_type = MINIMAP_FLAG_XENO - - var/list/available_nicknumbers = list() - -/datum/hive_status/New() - mutators.hive = src - hive_ui = new(src) - mark_ui = new(src) - faction_ui = new(src) - minimap_type = get_minimap_flag_for_faction(hivenumber) - tacmap = new(src, minimap_type) - if(!internal_faction) - internal_faction = name - if(hivenumber != XENO_HIVE_NORMAL) - return - - for(var/number in 1 to 999) - available_nicknumbers += number - - RegisterSignal(SSdcs, COMSIG_GLOB_POST_SETUP, PROC_REF(post_setup)) - -/datum/hive_status/proc/post_setup() - SIGNAL_HANDLER - - setup_evolution_announcements() - setup_pylon_limits() - -/datum/hive_status/proc/setup_evolution_announcements() - for(var/time in GLOB.xeno_evolve_times) - if(time == "0") - continue - - addtimer(CALLBACK(src, PROC_REF(announce_evolve_available), GLOB.xeno_evolve_times[time]), text2num(time)) - -/// Sets up limits on pylons in New() for potential futureproofing with more static comms -/datum/hive_status/proc/setup_pylon_limits() - hive_structures_limit[XENO_STRUCTURE_PYLON] = length(GLOB.all_static_telecomms_towers) || 2 - -/datum/hive_status/proc/announce_evolve_available(list/datum/caste_datum/available_castes) - - var/list/castes_available = list() - for(var/datum/caste_datum/current_caste as anything in available_castes) - castes_available += initial(current_caste.caste_type) - - var/castes = castes_available.Join(", ") - xeno_message(SPAN_XENOANNOUNCE("The Hive is now strong enough to support: [castes]")) - xeno_maptext("The Hive can now support: [castes]", "Hive Strengthening") - - -// Adds a xeno to this hive -/datum/hive_status/proc/add_xeno(mob/living/carbon/xenomorph/X) - if(!X || !istype(X)) - return - - // If the xeno is part of another hive, they should be removed from that one first - if(X.hive && X.hive != src) - X.hive.remove_xeno(X, TRUE) - - // Already in the hive - if(X in totalXenos) - return - - // Can only have one queen. - if(isqueen(X)) - if(!living_xeno_queen && !is_admin_level(X.z)) // Don't consider xenos in admin level - set_living_xeno_queen(X) - - X.hivenumber = hivenumber - X.hive = src - - X.set_faction(internal_faction) - - if(X.hud_list) - X.hud_update() - - var/area/A = get_area(X) - if(!is_admin_level(X.z) || (A.flags_atom & AREA_ALLOW_XENO_JOIN)) - totalXenos += X - if(X.tier == 2) - tier_2_xenos += X - else if(X.tier == 3) - tier_3_xenos += X - - // Xenos are a fuckfest of cross-dependencies of different datums that are initialized at different times - // So don't even bother trying updating UI here without large refactors - -// Removes the xeno from the hive -/datum/hive_status/proc/remove_xeno(mob/living/carbon/xenomorph/xeno, hard = FALSE, light_mode = FALSE) - if(!xeno || !istype(xeno)) - return - - // Make sure the xeno was in the hive in the first place - if(!(xeno in totalXenos)) - return - - // This might be a redundant check now that Queen/Destroy() checks, but doesn't hurt to double check - if(living_xeno_queen == xeno) - var/mob/living/carbon/xenomorph/queen/next_queen = null - for(var/mob/living/carbon/xenomorph/queen/queen in totalXenos) - if(!is_admin_level(queen.z) && queen != src && !QDELETED(queen)) - next_queen = queen - break - - set_living_xeno_queen(next_queen) // either null or a queen - - // We allow "soft" removals from the hive (the xeno still retains information about the hive) - // This is so that xenos can add themselves back to the hive if they should die or otherwise go "on leave" from the hive - if(hard) - xeno.hivenumber = 0 - xeno.hive = null -#ifndef UNIT_TESTS // Since this is a hard ref, we shouldn't confuse create_and_destroy - else - total_dead_xenos += xeno -#endif - - totalXenos -= xeno - if(xeno.tier == 2) - tier_2_xenos -= xeno - else if(xeno.tier == 3) - tier_3_xenos -= xeno - - // Only handle free slots if the xeno is not in tdome - if(!is_admin_level(xeno.z)) - var/selected_caste = GLOB.xeno_datum_list[xeno.caste_type]?.type - if(used_slots[selected_caste]) - used_slots[selected_caste]-- - - if(!light_mode) - hive_ui.update_xeno_counts() - hive_ui.xeno_removed(xeno) - -/datum/hive_status/proc/set_living_xeno_queen(mob/living/carbon/xenomorph/queen/queen) - if(!queen) - mutators.reset_mutators() - SStracking.delete_leader("hive_[hivenumber]") - SStracking.stop_tracking("hive_[hivenumber]", living_xeno_queen) - SShive_status.wait = 10 SECONDS - else - SStracking.set_leader("hive_[hivenumber]", queen) - SShive_status.wait = 2 SECONDS - - SEND_SIGNAL(src, COMSIG_HIVE_NEW_QUEEN, queen) - living_xeno_queen = queen - - recalculate_hive() - -/datum/hive_status/proc/recalculate_hive() - if (!living_xeno_queen) - queen_leader_limit = 0 //No leaders for a Hive without a Queen! - else - queen_leader_limit = 4 + mutators.leader_count_boost - - if (xeno_leader_list.len > queen_leader_limit) - var/diff = 0 - for (var/i in queen_leader_limit + 1 to xeno_leader_list.len) - if(!open_xeno_leader_positions.Remove(i)) - remove_hive_leader(xeno_leader_list[i]) - diff++ - xeno_leader_list.len -= diff // Changing the size of xeno_leader_list needs to go at the end or else it won't iterate through the list properly - else if (xeno_leader_list.len < queen_leader_limit) - for (var/i in xeno_leader_list.len + 1 to queen_leader_limit) - open_xeno_leader_positions += i - xeno_leader_list.len++ - - - tier_slot_multiplier = mutators.tier_slot_multiplier - larva_gestation_multiplier = mutators.larva_gestation_multiplier - bonus_larva_spawn_chance = mutators.bonus_larva_spawn_chance - - hive_ui.update_all_data() - -/datum/hive_status/proc/add_hive_leader(mob/living/carbon/xenomorph/xeno) - if(!xeno) - return FALSE //How did this even happen? - if(!open_xeno_leader_positions.len) - return FALSE //Too many leaders already (no available xeno leader positions) - if(xeno.hive_pos != NORMAL_XENO) - return FALSE //Already on the list - var/leader_num = open_xeno_leader_positions[1] - xeno_leader_list[leader_num] = xeno - xeno.hive_pos = XENO_LEADER_HIVE_POS(leader_num) - xeno.handle_xeno_leader_pheromones() - xeno.hud_update() // To add leader star - open_xeno_leader_positions -= leader_num - - xeno.update_minimap_icon() - - give_action(xeno, /datum/action/xeno_action/activable/info_marker) - - hive_ui.update_xeno_keys() - return TRUE - -/datum/hive_status/proc/remove_hive_leader(mob/living/carbon/xenomorph/xeno, light_mode = FALSE) - if(!istype(xeno) || !IS_XENO_LEADER(xeno)) - return FALSE - - var/leader_num = GET_XENO_LEADER_NUM(xeno) - - xeno_leader_list[leader_num] = null - - if(!light_mode) // Don't run side effects during deletions. Better yet, replace all this by signals someday - xeno.hive_pos = NORMAL_XENO - xeno.handle_xeno_leader_pheromones() - xeno.hud_update() // To remove leader star - - // Need to maintain ascending order of open_xeno_leader_positions - for (var/i in 1 to queen_leader_limit) - if (i > open_xeno_leader_positions.len || open_xeno_leader_positions[i] > leader_num) - open_xeno_leader_positions.Insert(i, leader_num) - break - - if(!light_mode) - hive_ui.update_xeno_keys() - - for(var/obj/effect/alien/resin/marker/leaderless_mark in resin_marks) //no resin_mark limit abuse - if(leaderless_mark.createdby == xeno.nicknumber) - qdel(leaderless_mark) - - xeno.update_minimap_icon() - - remove_action(xeno, /datum/action/xeno_action/activable/info_marker) - - return TRUE - -/datum/hive_status/proc/replace_hive_leader(mob/living/carbon/xenomorph/original, mob/living/carbon/xenomorph/replacement) - if(!replacement || replacement.hive_pos != NORMAL_XENO) - return remove_hive_leader(original) - - var/leader_num = GET_XENO_LEADER_NUM(original) - - xeno_leader_list[leader_num] = replacement - - original.hive_pos = NORMAL_XENO - original.handle_xeno_leader_pheromones() - original.hud_update() // To remove leader star - remove_action(original, /datum/action/xeno_action/activable/info_marker) - - replacement.hive_pos = XENO_LEADER_HIVE_POS(leader_num) - replacement.handle_xeno_leader_pheromones() - replacement.hud_update() // To add leader star - give_action(replacement, /datum/action/xeno_action/activable/info_marker) - - hive_ui.update_xeno_keys() - -/datum/hive_status/proc/handle_xeno_leader_pheromones() - for(var/mob/living/carbon/xenomorph/L in xeno_leader_list) - L.handle_xeno_leader_pheromones() - -/* - * Helper procs for the Hive Status UI - * These are all called by the hive status UI manager to update its data - */ - -// Returns a list of how many of each caste of xeno there are, sorted by tier -/datum/hive_status/proc/get_xeno_counts() - // Every caste is manually defined here so you get - var/list/xeno_counts = list( - // Yes, Queen is technically considered to be tier 0 - list(XENO_CASTE_LARVA = 0, "Queen" = 0), - list(XENO_CASTE_DRONE = 0, XENO_CASTE_RUNNER = 0, XENO_CASTE_SENTINEL = 0, XENO_CASTE_DEFENDER = 0), - list(XENO_CASTE_HIVELORD = 0, XENO_CASTE_BURROWER = 0, XENO_CASTE_CARRIER = 0, XENO_CASTE_LURKER = 0, XENO_CASTE_SPITTER = 0, XENO_CASTE_WARRIOR = 0), - list(XENO_CASTE_BOILER = 0, XENO_CASTE_CRUSHER = 0, XENO_CASTE_PRAETORIAN = 0, XENO_CASTE_RAVAGER = 0) - ) - - for(var/mob/living/carbon/xenomorph/X in totalXenos) - //don't show xenos in the thunderdome when admins test stuff. - if(is_admin_level(X.z)) - var/area/A = get_area(X) - if(!(A.flags_atom & AREA_ALLOW_XENO_JOIN)) - continue - - if(X.caste && X.counts_for_slots) - xeno_counts[X.caste.tier+1][X.caste.caste_type]++ - - return xeno_counts - -// Returns a sorted list of some basic info (stuff that's needed for sorting) about all the xenos in the hive -// The idea is that we sort this list, and use it as a "key" for all the other information (especially the nicknumber) -// in the hive status UI. That way we can minimize the amount of sorts performed by only calling this when xenos are created/disposed -/datum/hive_status/proc/get_xeno_keys() - var/list/xenos[totalXenos.len] - - var/index = 1 - var/useless_slots = 0 - for(var/mob/living/carbon/xenomorph/X in totalXenos) - if(is_admin_level(X.z)) - var/area/A = get_area(X) - if(!(A.flags_atom & AREA_ALLOW_XENO_JOIN)) - useless_slots++ - continue - - // Insert without doing list merging - xenos[index++] = list( - "nicknumber" = X.nicknumber, - "tier" = X.tier, // This one is only important for sorting - "is_leader" = (IS_XENO_LEADER(X)), - "is_queen" = istype(X.caste, /datum/caste_datum/queen), - "caste_type" = X.caste_type - ) - - // Clear nulls from the xenos list - xenos.len -= useless_slots - - // Make it all nice and fancy by sorting the list before returning it - var/list/sorted_keys = sort_xeno_keys(xenos) - if(length(sorted_keys)) - return sorted_keys - return xenos - -// This sorts the xeno info list by multiple criteria. Prioritized in order: -// 1. Queen -// 2. Leaders -// 3. Tier -// It uses a slightly modified insertion sort to accomplish this -/datum/hive_status/proc/sort_xeno_keys(list/xenos) - if(!length(xenos)) - return - - var/list/sorted_list = xenos.Copy() - - if(!length(sorted_list)) - return - - for(var/index in 2 to length(sorted_list)) - var/j = index - - while(j > 1) - var/current = sorted_list[j] - var/prev = sorted_list[j-1] - - // Queen comes first, always - if(current["is_queen"]) - sorted_list.Swap(j-1, j) - j-- - continue - - // don't muck up queen's slot - if(prev["is_queen"]) - j-- - continue - - // Leaders before normal xenos - if(!prev["is_leader"] && current["is_leader"]) - sorted_list.Swap(j-1, j) - j-- - continue - - // Make sure we're only comparing leaders to leaders and non-leaders to non-leaders when sorting - // This means we get leaders sorted first, then non-leaders sorted - // Sort by tier first, higher tiers over lower tiers, and then by name alphabetically - - // Could not think of an elegant way to write this - if(!(current["is_leader"]^prev["is_leader"])\ - && (prev["tier"] < current["tier"]\ - || prev["tier"] == current["tier"] && prev["caste_type"] > current["caste_type"]\ - )) - sorted_list.Swap(j-1, j) - - j-- - - return sorted_list - -// Returns a list with some more info about all xenos in the hive -/datum/hive_status/proc/get_xeno_info() - var/list/xenos = list() - - for(var/mob/living/carbon/xenomorph/X in totalXenos) - if(is_admin_level(X.z)) - var/area/A = get_area(X) - if(!(A.flags_atom & AREA_ALLOW_XENO_JOIN)) - continue - - var/xeno_name = X.name - // goddamn fucking larvas with their weird ass maturing system - // its name updates with its icon, unlike other castes which only update the mature/elder, etc. prefix on evolve - if(istype(X, /mob/living/carbon/xenomorph/larva)) - xeno_name = "Larva ([X.nicknumber])" - xenos["[X.nicknumber]"] = list( - "name" = xeno_name, - "strain" = X.mutation_type, - "ref" = "\ref[X]" - ) - - return xenos - -/datum/hive_status/proc/set_hive_location(obj/effect/alien/resin/special/pylon/core/C) - if(!C || C == hive_location) - return - var/area/A = get_area(C) - xeno_message(SPAN_XENOANNOUNCE("The Queen has set the hive location as \the [A]."), 3, hivenumber) - hive_location = C - hive_ui.update_hive_location() - -// Returns a list of xeno healths and locations -/datum/hive_status/proc/get_xeno_vitals() - var/list/xenos = list() - - for(var/mob/living/carbon/xenomorph/X in totalXenos) - if(is_admin_level(X.z)) - var/area/A = get_area(X) - if(!(A.flags_atom & AREA_ALLOW_XENO_JOIN)) - continue - - if(!(X in GLOB.living_xeno_list)) - continue - - var/area/A = get_area(X) - var/area_name = "Unknown" - if(A) - area_name = A.name - - xenos["[X.nicknumber]"] = list( - "health" = round((X.health / X.maxHealth) * 100, 1), - "area" = area_name, - "is_ssd" = (!X.client) - ) - - return xenos - -#define TIER_3 "3" -#define TIER_2 "2" -#define OPEN_SLOTS "open_slots" -#define GUARANTEED_SLOTS "guaranteed_slots" - -// Returns an assoc list of open slots and guaranteed slots left -/datum/hive_status/proc/get_tier_slots() - var/list/slots = list( - TIER_3 = list( - OPEN_SLOTS = 0, - GUARANTEED_SLOTS = list(), - ), - TIER_2 = list( - OPEN_SLOTS = 0, - GUARANTEED_SLOTS = list(), - ), - ) - - var/used_tier_2_slots = length(tier_2_xenos) - var/used_tier_3_slots = length(tier_3_xenos) - - for(var/caste_path in free_slots) - var/slots_free = free_slots[caste_path] - var/slots_used = used_slots[caste_path] - var/datum/caste_datum/current_caste = caste_path - if(slots_used) - // Don't count any free slots in use - switch(initial(current_caste.tier)) - if(2) - used_tier_2_slots -= min(slots_used, slots_free) - if(3) - used_tier_3_slots -= min(slots_used, slots_free) - if(slots_free <= slots_used) - continue - // Display any free slots available - switch(initial(current_caste.tier)) - if(2) - slots[TIER_2][GUARANTEED_SLOTS][initial(current_caste.caste_type)] = slots_free - slots_used - if(3) - slots[TIER_3][GUARANTEED_SLOTS][initial(current_caste.caste_type)] = slots_free - slots_used - - var/burrowed_factor = min(stored_larva, sqrt(4*stored_larva)) - var/effective_total = round(burrowed_factor) - for(var/mob/living/carbon/xenomorph/xeno as anything in totalXenos) - if(xeno.counts_for_slots) - effective_total++ - - // Tier 3 slots are always 20% of the total xenos in the hive - slots[TIER_3][OPEN_SLOTS] = max(0, Ceiling(0.20*effective_total/tier_slot_multiplier) - used_tier_3_slots) - // Tier 2 slots are between 30% and 50% of the hive, depending - // on how many T3s there are. - slots[TIER_2][OPEN_SLOTS] = max(0, Ceiling(0.5*effective_total/tier_slot_multiplier) - used_tier_2_slots - used_tier_3_slots) - - return slots - -#undef TIER_3 -#undef TIER_2 -#undef OPEN_SLOTS -#undef GUARANTEED_SLOTS - -/datum/hive_status/proc/can_build_structure(structure_name) - if(!structure_name || !hive_structures_limit[structure_name]) - return FALSE - var/total_count = 0 - if(hive_structures[structure_name]) - total_count += hive_structures[structure_name].len - if(hive_constructions[structure_name]) - total_count += hive_constructions[structure_name].len - if(total_count >= hive_structures_limit[structure_name]) - return FALSE - return TRUE - -/datum/hive_status/proc/has_structure(structure_name) - if(!structure_name) - return FALSE - if(hive_structures[structure_name] && hive_structures[structure_name].len) - return TRUE - return FALSE - -/datum/hive_status/proc/add_construction(obj/effect/alien/resin/construction/S) - if(!S || !S.template) - return FALSE - var/name_ref = initial(S.template.name) - if(!hive_constructions[name_ref]) - hive_constructions[name_ref] = list() - if(hive_constructions[name_ref].len >= hive_structures_limit[name_ref]) - return FALSE - hive_constructions[name_ref] += src - return TRUE - -/datum/hive_status/proc/remove_construction(obj/effect/alien/resin/construction/S) - if(!S || !S.template) - return FALSE - var/name_ref = initial(S.template.name) - hive_constructions[name_ref] -= src - return TRUE - -/datum/hive_status/proc/add_special_structure(obj/effect/alien/resin/special/S) - if(!S) - return FALSE - var/name_ref = initial(S.name) - if(!hive_structures[name_ref]) - hive_structures[name_ref] = list() - if(hive_structures[name_ref].len >= hive_structures_limit[name_ref]) - return FALSE - hive_structures[name_ref] += S - return TRUE - -/datum/hive_status/proc/remove_special_structure(obj/effect/alien/resin/special/S) - if(!S) - return FALSE - var/name_ref = initial(S.name) - hive_structures[name_ref] -= S - return TRUE - -/datum/hive_status/proc/has_special_structure(name_ref) - if(!name_ref || !hive_structures[name_ref] || !hive_structures[name_ref].len) - return 0 - return hive_structures[name_ref].len - -/datum/hive_status/proc/abandon_on_hijack() - var/area/hijacked_dropship = get_area(living_xeno_queen) - var/shipside_humans_weighted_count = 0 - var/xenos_count = 0 - for(var/name_ref in hive_structures) - for(var/obj/effect/alien/resin/special/S in hive_structures[name_ref]) - if(get_area(S) == hijacked_dropship) - continue - S.hijack_delete = TRUE - hive_structures[name_ref] -= S - qdel(S) - for(var/mob/living/carbon/xenomorph/xeno as anything in totalXenos) - if(get_area(xeno) != hijacked_dropship && xeno.loc && is_ground_level(xeno.loc.z)) - if(isfacehugger(xeno) || islesserdrone(xeno)) - to_chat(xeno, SPAN_XENOANNOUNCE("The Queen has left without you, you quickly find a hiding place to enter hibernation as you lose touch with the hive mind.")) - if(xeno.stomach_contents.len) - xeno.devour_timer = 0 - xeno.handle_stomach_contents() - qdel(xeno) - continue - if(xeno.hunter_data.hunted && !isqueen(xeno)) - to_chat(xeno, SPAN_XENOANNOUNCE("The Queen has left without you, seperating you from her hive! You must defend yourself from the headhunter before you can enter hibernation...")) - xeno.set_hive_and_update(XENO_HIVE_FORSAKEN) - else - to_chat(xeno, SPAN_XENOANNOUNCE("The Queen has left without you, you quickly find a hiding place to enter hibernation as you lose touch with the hive mind.")) - if(xeno.stomach_contents.len) - xeno.devour_timer = 0 - xeno.handle_stomach_contents() - qdel(xeno) - stored_larva++ - continue - if(xeno.tier >= 1) - xenos_count++ - for(var/i in GLOB.alive_mob_list) - var/mob/living/potential_host = i - if(!(potential_host.status_flags & XENO_HOST)) - continue - if(!is_ground_level(potential_host.z) || get_area(potential_host) == hijacked_dropship) - continue - var/obj/item/alien_embryo/A = locate() in potential_host - if(A && A.hivenumber != hivenumber) - continue - for(var/obj/item/alien_embryo/embryo in potential_host) - embryo.hivenumber = XENO_HIVE_FORSAKEN - potential_host.update_med_icon() - for(var/mob/living/carbon/human/current_human as anything in GLOB.alive_human_list) - if(!(isspecieshuman(current_human) || isspeciessynth(current_human))) - continue - var/datum/job/job = GLOB.RoleAuthority.roles_for_mode[current_human.job] - if(!job) - continue - var/turf/turf = get_turf(current_human) - if(is_mainship_level(turf?.z)) - shipside_humans_weighted_count += GLOB.RoleAuthority.calculate_role_weight(job) - hijack_burrowed_surge = TRUE - hijack_burrowed_left = max(n_ceil(shipside_humans_weighted_count * 0.5) - xenos_count, 5) - hivecore_cooldown = FALSE - xeno_message(SPAN_XENOBOLDNOTICE("The weeds have recovered! A new hive core can be built!"),3,hivenumber) - -/datum/hive_status/proc/free_respawn(client/C) - stored_larva++ - if(!hive_location || !hive_location.spawn_burrowed_larva(C.mob)) - stored_larva-- - else - hive_ui.update_burrowed_larva() - -/datum/hive_status/proc/respawn_on_turf(client/xeno_client, turf/spawning_turf) - var/mob/living/carbon/xenomorph/larva/new_xeno = spawn_hivenumber_larva(spawning_turf, hivenumber) - if(isnull(new_xeno)) - return FALSE - - if(!SSticker.mode.transfer_xeno(xeno_client.mob, new_xeno)) - qdel(new_xeno) - return FALSE - - new_xeno.visible_message(SPAN_XENODANGER("A larva suddenly emerges from a dead husk!"), - SPAN_XENOANNOUNCE("The hive has no core! You manage to emerge from your old husk as a larva!")) - msg_admin_niche("[key_name(new_xeno)] respawned at \a [spawning_turf]. [ADMIN_JMP(spawning_turf)]") - playsound(new_xeno, 'sound/effects/xeno_newlarva.ogg', 50, 1) - if(new_xeno.client?.prefs?.toggles_flashing & FLASH_POOLSPAWN) - window_flash(new_xeno.client) - - hive_ui.update_burrowed_larva() - -/datum/hive_status/proc/do_buried_larva_spawn(mob/xeno_candidate) - var/spawning_area - if(hive_location) - spawning_area = hive_location - else if(living_xeno_queen) - spawning_area = living_xeno_queen - else for(var/mob/living/carbon/xenomorpheus as anything in totalXenos) - if(islarva(xenomorpheus) || isxeno_builder(xenomorpheus)) //next to xenos that should be in a safe spot - spawning_area = xenomorpheus - if(!spawning_area) - spawning_area = pick(totalXenos) // FUCK IT JUST GO ANYWHERE - var/list/turf_list - for(var/turf/open/open_turf in orange(3, spawning_area)) - LAZYADD(turf_list, open_turf) - var/turf/open/spawning_turf = pick(turf_list) - - var/mob/living/carbon/xenomorph/larva/new_xeno = spawn_hivenumber_larva(spawning_turf, hivenumber) - if(isnull(new_xeno)) - return FALSE - - if(!SSticker.mode.transfer_xeno(xeno_candidate, new_xeno)) - qdel(new_xeno) - return FALSE - new_xeno.visible_message(SPAN_XENODANGER("A larva suddenly burrows out of \the [spawning_turf]!"), - SPAN_XENODANGER("You burrow out of \the [spawning_turf] and awaken from your slumber. For the Hive!")) - msg_admin_niche("[key_name(new_xeno)] burrowed out from \a [spawning_turf]. [ADMIN_JMP(spawning_turf)]") - playsound(new_xeno, 'sound/effects/xeno_newlarva.ogg', 50, 1) - to_chat(new_xeno, SPAN_XENOANNOUNCE("You are a xenomorph larva awakened from slumber!")) - if(new_xeno.client) - if(new_xeno.client?.prefs?.toggles_flashing & FLASH_POOLSPAWN) - window_flash(new_xeno.client) - - stored_larva-- - hive_ui.update_burrowed_larva() - -/mob/living/proc/ally_of_hivenumber(hivenumber) - var/datum/hive_status/indexed_hive = GLOB.hive_datum[hivenumber] - if(!indexed_hive) - return FALSE - - return indexed_hive.is_ally(src) - -/datum/hive_status/proc/is_ally(mob/living/living_mob) - if(isxeno(living_mob)) - var/mob/living/carbon/xenomorph/zenomorf = living_mob - if(zenomorf.hivenumber == hivenumber) - return !zenomorf.banished - - if(!living_mob.faction) - return FALSE - - return faction_is_ally(living_mob.faction) - -/datum/hive_status/proc/faction_is_ally(faction, ignore_queen_check = FALSE) - if(faction == internal_faction) - return TRUE - if(!ignore_queen_check && !living_xeno_queen) - return FALSE - - return allies[faction] - -/datum/hive_status/proc/can_delay_round_end(mob/living/carbon/xenomorph/xeno) - if(HAS_TRAIT(src, TRAIT_NO_HIVE_DELAY)) - return FALSE - return TRUE - -/datum/hive_status/proc/update_hugger_limit() - var/countable_xeno_iterator = 0 - for(var/mob/living/carbon/xenomorph/cycled_xeno as anything in totalXenos) - if(cycled_xeno.counts_for_slots) - countable_xeno_iterator++ - - playable_hugger_limit = max(Floor(countable_xeno_iterator / playable_hugger_max_divisor), playable_hugger_minimum) - -/datum/hive_status/proc/can_spawn_as_hugger(mob/dead/observer/user) - if(!GLOB.hive_datum || ! GLOB.hive_datum[hivenumber]) - return FALSE - if(jobban_isbanned(user, JOB_XENOMORPH)) // User is jobbanned - to_chat(user, SPAN_WARNING("You are banned from playing aliens and cannot spawn as a xenomorph.")) - return FALSE - if(world.time < hugger_timelock) - to_chat(user, SPAN_WARNING("The hive cannot support facehuggers yet...")) - return FALSE - if(world.time - user.timeofdeath < JOIN_AS_FACEHUGGER_DELAY) - var/time_left = round((user.timeofdeath + JOIN_AS_FACEHUGGER_DELAY - world.time) / 10) - to_chat(user, SPAN_WARNING("You ghosted too recently. You cannot become a facehugger until 3 minutes have passed ([time_left] seconds remaining).")) - return FALSE - if(totalXenos.len <= 0) - //This is to prevent people from joining as Forsaken Huggers on the pred ship - to_chat(user, SPAN_WARNING("The hive has fallen, you can't join it!")) - return FALSE - for(var/mob_name in banished_ckeys) - if(banished_ckeys[mob_name] == user.ckey) - to_chat(user, SPAN_WARNING("You are banished from the [name], you may not rejoin unless the Queen re-admits you or dies.")) - return FALSE - - update_hugger_limit() - - var/current_hugger_count = 0 - for(var/mob/mob as anything in totalXenos) - if(isfacehugger(mob)) - current_hugger_count++ - if(playable_hugger_limit <= current_hugger_count) - to_chat(user, SPAN_WARNING("\The [GLOB.hive_datum[hivenumber]] cannot support more facehuggers! Limit: [current_hugger_count]/[playable_hugger_limit]")) - return FALSE - - if(tgui_alert(user, "Are you sure you want to become a facehugger?", "Confirmation", list("Yes", "No")) != "Yes") - return FALSE - - if(!user.client) - return FALSE - - return TRUE - -/datum/hive_status/proc/spawn_as_hugger(mob/dead/observer/user, atom/A) - var/mob/living/carbon/xenomorph/facehugger/hugger = new /mob/living/carbon/xenomorph/facehugger(A.loc, null, hivenumber) - user.mind.transfer_to(hugger, TRUE) - hugger.visible_message(SPAN_XENODANGER("A facehugger suddenly emerges out of \the [A]!"), SPAN_XENODANGER("You emerge out of \the [A] and awaken from your slumber. For the Hive!")) - playsound(hugger, 'sound/effects/xeno_newlarva.ogg', 25, TRUE) - hugger.generate_name() - hugger.timeofdeath = user.timeofdeath // Keep old death time - -/datum/hive_status/proc/update_lesser_drone_limit() - var/countable_xeno_iterator = 0 - for(var/mob/living/carbon/xenomorph/cycled_xeno as anything in totalXenos) - if(cycled_xeno.counts_for_slots) - countable_xeno_iterator++ - - lesser_drone_limit = max(Floor(countable_xeno_iterator / playable_lesser_drones_max_divisor), lesser_drone_minimum) - -/datum/hive_status/proc/can_spawn_as_lesser_drone(mob/dead/observer/user, obj/effect/alien/resin/special/pylon/spawning_pylon) - if(!GLOB.hive_datum || ! GLOB.hive_datum[hivenumber]) - return FALSE - - if(jobban_isbanned(user, JOB_XENOMORPH)) // User is jobbanned - to_chat(user, SPAN_WARNING("You are banned from playing aliens and cannot spawn as a xenomorph.")) - return FALSE - - if(world.time - user.timeofdeath < JOIN_AS_LESSER_DRONE_DELAY) - var/time_left = round((user.timeofdeath + JOIN_AS_LESSER_DRONE_DELAY - world.time) / 10) - to_chat(user, SPAN_WARNING("You ghosted too recently. You cannot become a lesser drone until 30 seconds have passed ([time_left] seconds remaining).")) - return FALSE - - if(totalXenos.len <= 0) - to_chat(user, SPAN_WARNING("The hive has fallen, you can't join it!")) - return FALSE - - if(!living_xeno_queen) - to_chat(user, SPAN_WARNING("The selected hive does not have a Queen!")) - return FALSE - - if(spawning_pylon.lesser_drone_spawns < 1) - to_chat(user, SPAN_WARNING("The selected core or pylon does not have enough power for a lesser drone!")) - return FALSE - - update_lesser_drone_limit() - - var/current_lesser_drone_count = 0 - for(var/mob/mob as anything in totalXenos) - if(islesserdrone(mob)) - current_lesser_drone_count++ - - if(lesser_drone_limit <= current_lesser_drone_count) - to_chat(user, SPAN_WARNING("[GLOB.hive_datum[hivenumber]] cannot support more lesser drones! Limit: [current_lesser_drone_count]/[lesser_drone_limit]")) - return FALSE - - if(!user.client) - return FALSE - - return TRUE - -///Called by /obj/item/alien_embryo when a host is bursting to determine extra larva per burst -/datum/hive_status/proc/increase_larva_after_burst() - var/extra_per_burst = CONFIG_GET(number/extra_larva_per_burst) - partial_larva += extra_per_burst - convert_partial_larva_to_full_larva() - -///Called after times when partial larva are added to process them to stored larva -/datum/hive_status/proc/convert_partial_larva_to_full_larva() - for(var/i = 1 to partial_larva) - partial_larva-- - stored_larva++ - -/datum/hive_status/corrupted - name = "Corrupted Hive" - reporting_id = "corrupted" - hivenumber = XENO_HIVE_CORRUPTED - prefix = "Corrupted " - color = "#80ff80" - ui_color ="#4d994d" - latejoin_burrowed = FALSE - - need_round_end_check = TRUE - - var/list/defectors = list() - -/datum/hive_status/corrupted/add_xeno(mob/living/carbon/xenomorph/xeno) - . = ..() - xeno.add_language(LANGUAGE_ENGLISH) - -/datum/hive_status/corrupted/remove_xeno(mob/living/carbon/xenomorph/xeno, hard) - . = ..() - xeno.remove_language(LANGUAGE_ENGLISH) - -/datum/hive_status/corrupted/can_delay_round_end(mob/living/carbon/xenomorph/xeno) - if(!faction_is_ally(FACTION_MARINE, TRUE)) - return TRUE - return FALSE - -/datum/hive_status/alpha - name = "Alpha Hive" - reporting_id = "alpha" - hivenumber = XENO_HIVE_ALPHA - prefix = "Alpha " - color = "#ff4040" - ui_color = "#992626" - latejoin_burrowed = FALSE - - dynamic_evolution = FALSE - -/datum/hive_status/bravo - name = "Bravo Hive" - reporting_id = "bravo" - hivenumber = XENO_HIVE_BRAVO - prefix = "Bravo " - color = "#ffff80" - ui_color = "#99994d" - latejoin_burrowed = FALSE - - dynamic_evolution = FALSE - -/datum/hive_status/charlie - name = "Charlie Hive" - reporting_id = "charlie" - hivenumber = XENO_HIVE_CHARLIE - prefix = "Charlie " - color = "#bb40ff" - ui_color = "#702699" - latejoin_burrowed = FALSE - - dynamic_evolution = FALSE - -/datum/hive_status/delta - name = "Delta Hive" - reporting_id = "delta" - hivenumber = XENO_HIVE_DELTA - prefix = "Delta " - color = "#8080ff" - ui_color = "#4d4d99" - latejoin_burrowed = FALSE - - dynamic_evolution = FALSE - -/datum/hive_status/feral - name = "Feral Hive" - reporting_id = "feral" - hivenumber = XENO_HIVE_FERAL - prefix = "Feral " - color = "#828296" - ui_color = "#828296" - - construction_allowed = XENO_NOBODY - destruction_allowed = XENO_NOBODY - dynamic_evolution = FALSE - allow_no_queen_actions = TRUE - allow_no_queen_evo = TRUE - allow_queen_evolve = FALSE - ignore_slots = TRUE - latejoin_burrowed = FALSE - -/datum/hive_status/forsaken - name = "Forsaken Hive" - reporting_id = "forsaken" - hivenumber = XENO_HIVE_FORSAKEN - prefix = "Forsaken " - color = "#cc8ec4" - ui_color = "#cc8ec4" - - dynamic_evolution = FALSE - allow_no_queen_actions = TRUE - allow_no_queen_evo = TRUE - allow_queen_evolve = FALSE - ignore_slots = TRUE - latejoin_burrowed = FALSE - - need_round_end_check = TRUE - -/datum/hive_status/forsaken/can_delay_round_end(mob/living/carbon/xenomorph/xeno) - return FALSE - -/datum/hive_status/yautja - name = "Hellhound Pack" - reporting_id = "hellhounds" - hivenumber = XENO_HIVE_YAUTJA - internal_faction = FACTION_YAUTJA - - dynamic_evolution = FALSE - allow_no_queen_actions = TRUE - allow_no_queen_evo = TRUE - allow_queen_evolve = FALSE - ignore_slots = TRUE - latejoin_burrowed = FALSE - - need_round_end_check = TRUE - -/datum/hive_status/yautja/can_delay_round_end(mob/living/carbon/xenomorph/xeno) - return FALSE - -/datum/hive_status/mutated - name = "Mutated Hive" - reporting_id = "mutated" - hivenumber = XENO_HIVE_MUTATED - prefix = "Mutated " - color = "#6abd99" - ui_color = "#6abd99" - - hive_inherant_traits = list(TRAIT_XENONID, TRAIT_NO_COLOR) - latejoin_burrowed = FALSE - -/datum/hive_status/corrupted/tamed - name = "Tamed Hive" - reporting_id = "tamed" - hivenumber = XENO_HIVE_TAMED - prefix = "Tamed " - color = "#80ff80" - - dynamic_evolution = FALSE - allow_no_queen_actions = TRUE - allow_no_queen_evo = TRUE - allow_queen_evolve = FALSE - ignore_slots = TRUE - latejoin_burrowed = FALSE - - var/mob/living/carbon/human/leader - var/list/allied_factions - -/datum/hive_status/corrupted/tamed/New() - . = ..() - hive_structures_limit[XENO_STRUCTURE_EGGMORPH] = 0 - hive_structures_limit[XENO_STRUCTURE_EVOPOD] = 0 - -/datum/hive_status/corrupted/tamed/proc/make_leader(mob/living/carbon/human/H) - if(!istype(H)) - return - - if(leader) - UnregisterSignal(leader, COMSIG_PARENT_QDELETING) - - leader = H - RegisterSignal(leader, COMSIG_PARENT_QDELETING, PROC_REF(handle_qdelete)) - -/datum/hive_status/corrupted/tamed/proc/handle_qdelete(mob/living/carbon/human/H) - SIGNAL_HANDLER - - if(H == leader) - leader = null - - var/list/faction_groups = H.faction_group - if(faction_groups) - allied_factions = faction_groups.Copy() - if(!(H.faction in allied_factions)) - allied_factions += H.faction - -/datum/hive_status/corrupted/tamed/add_xeno(mob/living/carbon/xenomorph/X) - . = ..() - X.faction_group = allied_factions - -/datum/hive_status/corrupted/tamed/remove_xeno(mob/living/carbon/xenomorph/X, hard) - . = ..() - X.faction_group = list(X.faction) - -/datum/hive_status/corrupted/tamed/is_ally(mob/living/carbon/C) - if(leader) - if(C.faction in leader.faction_group) - return TRUE - - if(C.faction == leader.faction) - return TRUE - else - if(C.faction in allied_factions) - return TRUE - - return ..() - -/datum/hive_status/corrupted/renegade - name = "Renegade Hive" - reporting_id = "renegade" - hivenumber = XENO_HIVE_RENEGADE - prefix = "Renegade " - color = "#9c7a4d" - ui_color ="#80705c" - - dynamic_evolution = FALSE - allow_queen_evolve = FALSE - allow_no_queen_evo = TRUE - latejoin_burrowed = FALSE - -/datum/hive_status/corrupted/renegade/New() - . = ..() - hive_structures_limit[XENO_STRUCTURE_EGGMORPH] = 0 - hive_structures_limit[XENO_STRUCTURE_EVOPOD] = 0 - for(var/faction in FACTION_LIST_HUMANOID) //renegades allied to all humanoids, but it mostly affects structures. Their ability to attack humanoids and other xenos (including of the same hive) depends on iff settings - allies[faction] = TRUE - -/datum/hive_status/corrupted/renegade/can_spawn_as_hugger(mob/dead/observer/user) - to_chat(user, SPAN_WARNING("The [name] cannot support facehuggers.")) - return FALSE - -/datum/hive_status/corrupted/renegade/proc/iff_protection_check(mob/living/carbon/xenomorph/xeno, mob/living/carbon/attempt_harm_mob) - if(xeno == attempt_harm_mob) - return TRUE //you cannot hurt yourself... - if(!xeno.iff_tag) - return FALSE //can attack anyone if you don't have iff tag - if(isxeno(attempt_harm_mob)) - var/mob/living/carbon/xenomorph/target_xeno = attempt_harm_mob - if(!target_xeno.iff_tag) - return FALSE //can attack any xeno who don't have iff tag - for(var/faction in xeno.iff_tag.faction_groups) - if(faction in target_xeno.iff_tag.faction_groups) - return TRUE //cannot attack xenos with same iff setting - return FALSE - for(var/faction in xeno.iff_tag.faction_groups) - if(faction in attempt_harm_mob.faction_group) - return TRUE //cannot attack mob if iff is set to at least one of its factions - return FALSE - -/datum/hive_status/corrupted/renegade/faction_is_ally(faction, ignore_queen_check = TRUE) - return ..() - -/datum/hive_status/proc/on_queen_death() //break alliances on queen's death - if(allow_no_queen_actions || living_xeno_queen) - return - var/broken_alliances = FALSE - for(var/faction in allies) - if(!allies[faction]) - continue - change_stance(faction, FALSE) - broken_alliances = TRUE - - - if(broken_alliances) - xeno_message(SPAN_XENOANNOUNCE("With the death of the Queen, all alliances have been broken."), 3, hivenumber) - -/datum/hive_status/proc/change_stance(faction, should_ally) - if(faction == name) - return - if(allies[faction] == should_ally) - return - allies[faction] = should_ally - - if(living_xeno_queen) - if(allies[faction]) - xeno_message(SPAN_XENOANNOUNCE("Your Queen set up an alliance with [faction]!"), 3, hivenumber) - else - xeno_message(SPAN_XENOANNOUNCE("Your Queen broke the alliance with [faction]!"), 3, hivenumber) - - for(var/number in GLOB.hive_datum) - var/datum/hive_status/target_hive = GLOB.hive_datum[number] - if(target_hive.name != faction) - continue - if(!target_hive.living_xeno_queen && !target_hive.allow_no_queen_actions) - return - if(allies[faction]) - xeno_message(SPAN_XENOANNOUNCE("You sense that [name] [living_xeno_queen ? "Queen " : ""]set up an alliance with us!"), 3, target_hive.hivenumber) - return - - xeno_message(SPAN_XENOANNOUNCE("You sense that [name] [living_xeno_queen ? "Queen " : ""]broke the alliance with us!"), 3, target_hive.hivenumber) - if(target_hive.allies[name]) //autobreak alliance on betrayal - target_hive.change_stance(name, FALSE) - - -/datum/hive_status/corrupted/change_stance(faction, should_ally) - . = ..() - if(allies[faction]) - return - if(!(faction in FACTION_LIST_HUMANOID)) - return - - for(var/mob/living/carbon/xenomorph/xeno in totalXenos) // handle defecting xenos on betrayal - if(!xeno.iff_tag) - continue - if(!(faction in xeno.iff_tag.faction_groups)) - continue - if(xeno in defectors) - continue - if(xeno.caste_type == XENO_CASTE_QUEEN) - continue - INVOKE_ASYNC(src, PROC_REF(give_defection_choice), xeno, faction) - addtimer(CALLBACK(src, PROC_REF(handle_defectors), faction), 11 SECONDS) - -/datum/hive_status/corrupted/proc/give_defection_choice(mob/living/carbon/xenomorph/xeno, faction) - if(tgui_alert(xeno, "Your Queen has broken the alliance with the [faction]. The device inside your carapace begins to suppress your connection with the Hive. Do you remove it and stay loyal to her?", "Alliance broken!", list("Stay loyal", "Obey the talls"), 10 SECONDS) == "Obey the talls") - if(!xeno.iff_tag) - to_chat(xeno, SPAN_XENOWARNING("It's too late now. The device is gone and your service to the Queen continues.")) - return - defectors += xeno - xeno.set_hive_and_update(XENO_HIVE_RENEGADE) - to_chat(xeno, SPAN_XENOANNOUNCE("You lost the connection with your Hive. Now you have no Queen, only your masters.")) - to_chat(xeno, SPAN_NOTICE("Your instincts have changed, you seem compelled to protect [english_list(xeno.iff_tag.faction_groups, "no one")].")) - return - xeno.visible_message(SPAN_XENOWARNING("[xeno] rips out [xeno.iff_tag]!"), SPAN_XENOWARNING("You rip out [xeno.iff_tag]! For the Hive!")) - xeno.adjustBruteLoss(50) - xeno.iff_tag.forceMove(get_turf(xeno)) - xeno.iff_tag = null - -/datum/hive_status/corrupted/proc/handle_defectors(faction) - for(var/mob/living/carbon/xenomorph/xeno in totalXenos) - if(!xeno.iff_tag) - continue - if(xeno in defectors) - continue - if(!(faction in xeno.iff_tag.faction_groups)) - continue - xeno.visible_message(SPAN_XENOWARNING("[xeno] rips out [xeno.iff_tag]!"), SPAN_XENOWARNING("You rip out [xeno.iff_tag]! For the hive!")) - xeno.adjustBruteLoss(50) - xeno.iff_tag.forceMove(get_turf(xeno)) - xeno.iff_tag = null - if(!length(defectors)) - return - - xeno_message(SPAN_XENOANNOUNCE("You sense that [english_list(defectors)] turned their backs against their sisters and the Queen in favor of their slavemasters!"), 3, hivenumber) - defectors.Cut() - -//Xeno Resin Mark Shit, the very best place for it too :0) -//Defines at the bottom of this list here will show up at the top in the mark menu -/datum/xeno_mark_define - var/name = "xeno_declare" - var/icon_state = "empty" - var/desc = "Xenos make psychic markers with this meaning as positional lasting communication to eachother" - -/datum/xeno_mark_define/fortify - name = "Fortify" - desc = "Fortify this area!" - icon_state = "fortify" - -/datum/xeno_mark_define/weeds - name = "Need Weeds" - desc = "Need weeds here!" - icon_state = "weed" - -/datum/xeno_mark_define/nest - name = "Nest" - desc = "Nest enemies here!" - icon_state = "nest" - -/datum/xeno_mark_define/hosts - name = "Hosts" - desc = "Hosts here!" - icon_state = "hosts" - -/datum/xeno_mark_define/aide - name = "Aide" - desc = "Aide here!" - icon_state = "aide" - -/datum/xeno_mark_define/defend - name = "Defend" - desc = "Defend the hive here!" - icon_state = "defend" - -/datum/xeno_mark_define/danger - name = "Danger Warning" - desc = "Caution, danger here!" - icon_state = "danger" - -/datum/xeno_mark_define/rally - name = "Rally" - desc = "Group up here!" - icon_state = "rally" - -/datum/xeno_mark_define/hold - name = "Hold" - desc = "Hold this area!" - icon_state = "hold" - -/datum/xeno_mark_define/ambush - name = "Ambush" - desc = "Ambush the enemy here!" - icon_state = "ambush" -/datum/xeno_mark_define/attack - name = "Attack" - desc = "Attack the enemy here!" - icon_state = "attack" - - - diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 375594574ab8..4061f26f7bb1 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -73,13 +73,13 @@ M.track_friendly_fire(initial(O.name)) var/client/assailant = M.client if(assailant) - src.attack_log += text("\[[time_stamp()]\] Has been hit with a [O], thrown by [key_name(M)]") + src.attack_log += text("\[[time_stamp()]\] Has been hit with \a [O], thrown by [key_name(M)]") M.attack_log += text("\[[time_stamp()]\] Hit [key_name(src)] with a thrown [O]") if(!istype(src,/mob/living/simple_animal/mouse)) if(src.loc) - msg_admin_attack("[key_name(src)] was hit by a [O], thrown by [key_name(M)] in [get_area(src)] ([src.loc.x],[src.loc.y],[src.loc.z]).", src.loc.x, src.loc.y, src.loc.z) + msg_admin_attack("[key_name(src)] was hit by \a [O], thrown by [key_name(M)] in [get_area(src)] ([src.loc.x],[src.loc.y],[src.loc.z]).", src.loc.x, src.loc.y, src.loc.z) else - msg_admin_attack("[key_name(src)] was hit by a [O], thrown by [key_name(M)] in [get_area(M)] ([M.loc.x],[M.loc.y],[M.loc.z]).", M.loc.x, M.loc.y, M.loc.z) + msg_admin_attack("[key_name(src)] was hit by \a [O], thrown by [key_name(M)] in [get_area(M)] ([M.loc.x],[M.loc.y],[M.loc.z]).", M.loc.x, M.loc.y, M.loc.z) if(last_damage_source) last_damage_data = create_cause_data(last_damage_source, M) diff --git a/code/modules/mob/living/living_verbs.dm b/code/modules/mob/living/living_verbs.dm index 45f5a25fce2c..88167feda3c0 100644 --- a/code/modules/mob/living/living_verbs.dm +++ b/code/modules/mob/living/living_verbs.dm @@ -114,9 +114,9 @@ //okay, so the closet is either welded or locked... resist!!! next_move = world.time + 100 last_special = world.time + 100 - to_chat(src, SPAN_DANGER("You lean on the back of \the [C] and start pushing the door open. (this will take about [breakout_time] minutes)")) + to_chat(src, SPAN_DANGER("You lean on the back of [C] and start pushing the door open. (this will take about [breakout_time] minutes)")) for(var/mob/O in viewers(loc)) - O.show_message(SPAN_DANGER("The [loc] begins to shake violently!"), SHOW_MESSAGE_VISIBLE) + O.show_message(SPAN_DANGER("[loc] begins to shake violently!"), SHOW_MESSAGE_VISIBLE) if(!do_after(src, (breakout_time*1 MINUTES), INTERRUPT_NO_NEEDHAND^INTERRUPT_RESIST)) return diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 3e33df1411a6..8edc7116628e 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -81,7 +81,7 @@ movement_target.attack_animal(src) else if(ishuman(movement_target.loc) ) if(prob(20)) - INVOKE_ASYNC(src, PROC_REF(emote), "stares at the [movement_target] that [movement_target.loc] has with a sad puppy-face") + INVOKE_ASYNC(src, PROC_REF(emote), "stares at [movement_target] that [movement_target.loc] has with a sad puppy-face") if(prob(1)) INVOKE_ASYNC(src, PROC_REF(emote), pick("dances around","chases its tail")) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 268825288198..b85f188558b1 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -83,7 +83,7 @@ user.visible_message(SPAN_NOTICE("[user] milks [src] using \the [O].")) var/transfered = udder.trans_id_to(G, "milk", rand(5,10)) if(G.reagents.total_volume >= G.volume) - to_chat(user, SPAN_DANGER("The [O] is full.")) + to_chat(user, SPAN_DANGER("[O] is full.")) if(!transfered) to_chat(user, SPAN_DANGER("The udder is dry. Wait a bit longer...")) else diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index d1b140305d60..41f539d85aab 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -413,7 +413,7 @@ if(!parrot_perch || parrot_interest.loc != parrot_perch.loc) held_item = parrot_interest parrot_interest.forceMove(src) - visible_message("[src] grabs the [held_item]!", SPAN_NOTICE("You grab the [held_item]!"), "You hear the sounds of wings flapping furiously.") + visible_message("[src] grabs [held_item]!", SPAN_NOTICE("You grab [held_item]!"), "You hear the sounds of wings flapping furiously.") parrot_interest = null parrot_state = PARROT_SWOOP|PARROT_RETURN @@ -577,7 +577,7 @@ return -1 if(held_item) - to_chat(src, SPAN_DANGER("You are already holding the [held_item]")) + to_chat(src, SPAN_DANGER("You are already holding [held_item]")) return 1 for(var/obj/item/I in view(1,src)) @@ -590,7 +590,7 @@ held_item = I I.forceMove(src) - visible_message("[src] grabs the [held_item]!", SPAN_NOTICE("You grab the [held_item]!"), "You hear the sounds of wings flapping furiously.") + visible_message("[src] grabs [held_item]!", SPAN_NOTICE("You grab [held_item]!"), "You hear the sounds of wings flapping furiously.") return held_item to_chat(src, SPAN_DANGER("There is nothing of interest to take.")) @@ -605,7 +605,7 @@ return -1 if(held_item) - to_chat(src, SPAN_DANGER("You are already holding the [held_item]")) + to_chat(src, SPAN_DANGER("You are already holding [held_item]")) return 1 var/obj/item/stolen_item = null @@ -620,7 +620,7 @@ if(stolen_item) if(C.drop_inv_item_to_loc(stolen_item, src)) held_item = stolen_item - visible_message("[src] grabs the [held_item] out of [C]'s hand!", SPAN_NOTICE("You snag the [held_item] out of [C]'s hand!"), "You hear the sounds of wings flapping furiously.") + visible_message("[src] grabs [held_item] out of [C]'s hand!", SPAN_NOTICE("You snag [held_item] out of [C]'s hand!"), "You hear the sounds of wings flapping furiously.") return held_item to_chat(src, SPAN_DANGER("There is nothing of interest to take.")) @@ -655,11 +655,11 @@ var/obj/item/explosive/grenade/G = held_item G.forceMove(src.loc) G.prime() - to_chat(src, "You let go of the [held_item]!") + to_chat(src, "You let go of [held_item]!") held_item = null return 1 - to_chat(src, "You drop the [held_item].") + to_chat(src, "You drop [held_item].") held_item.forceMove(src.loc) held_item = null diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 3d3a4b491950..13d7c6d9b2ca 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -285,7 +285,7 @@ MED.use(1) for(var/mob/M as anything in viewers(src, null)) if ((M.client && !( M.blinded ))) - M.show_message(SPAN_NOTICE("[user] applies the [MED] on [src]"), SHOW_MESSAGE_VISIBLE) + M.show_message(SPAN_NOTICE("[user] applies [MED] on [src]"), SHOW_MESSAGE_VISIBLE) return else to_chat(user, SPAN_NOTICE(" this [src] is dead, medical items won't bring it back to life.")) diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index 92e46454cc5e..cd76618f3243 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -4,7 +4,7 @@ //Note that this proc does NOT do MMI related stuff! /mob/proc/change_mob_type(new_type = null, turf/location = null, new_name = null as text, delete_old_mob = 0 as num, subspecies) if(istype(src,/mob/new_player)) - to_chat(usr, SPAN_DANGER("cannot convert players who have not entered yet.")) + to_chat(usr, SPAN_DANGER("Cannot convert players who have not entered yet.")) return if(!new_type) @@ -18,7 +18,7 @@ return if( new_type == /mob/new_player ) - to_chat(usr, SPAN_DANGER("cannot convert into a new_player mob type.")) + to_chat(usr, SPAN_DANGER("Cannot convert into a new_player mob type.")) return var/mob/M diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 2034202144b2..5e997db240c0 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -63,7 +63,7 @@ output += "" if (refresh) close_browser(src, "playersetup") - show_browser(src, output, null, "playersetup", "size=240x[round_start ? 330 : 460];can_close=0;can_minimize=0") + show_browser(src, output, null, "playersetup", "size=240x[round_start ? 360 : 460];can_close=0;can_minimize=0") return /mob/new_player/Topic(href, href_list[]) @@ -254,15 +254,16 @@ GLOB.data_core.manifest_inject(character) SSticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn - SSticker.mode.latejoin_tally += GLOB.RoleAuthority.calculate_role_weight(player_rank) + SSticker.mode.latejoin_update(player_rank) + SSticker.mode.update_gear_scale() for(var/datum/squad/sq in GLOB.RoleAuthority.squads) if(sq) sq.max_engineers = engi_slot_formula(GLOB.clients.len) sq.max_medics = medic_slot_formula(GLOB.clients.len) - if(SSticker.mode.latejoin_larva_drop && SSticker.mode.latejoin_tally >= SSticker.mode.latejoin_larva_drop) - SSticker.mode.latejoin_tally -= SSticker.mode.latejoin_larva_drop + if(SSticker.mode.latejoin_larva_drop && SSticker.mode.latejoin_tally - SSticker.mode.latejoin_larva_used >= SSticker.mode.latejoin_larva_drop) + SSticker.mode.latejoin_larva_used += SSticker.mode.latejoin_larva_drop var/datum/hive_status/hive for(var/hivenumber in GLOB.hive_datum) hive = GLOB.hive_datum[hivenumber] diff --git a/code/modules/nano/nanomapgen.dm b/code/modules/nano/nanomapgen.dm deleted file mode 100644 index 749a07feb311..000000000000 --- a/code/modules/nano/nanomapgen.dm +++ /dev/null @@ -1,90 +0,0 @@ -// This file is a modified version of https://raw2.github.com/Baystation12/OldCode-BS12/master/code/TakePicture.dm - -#define NANOMAP_ICON_SIZE 4 -#define NANOMAP_MAX_ICON_DIMENSION 1024 - -#define NANOMAP_TILES_PER_IMAGE (NANOMAP_MAX_ICON_DIMENSION / NANOMAP_ICON_SIZE) - -#define NANOMAP_TERMINALERR 5 -#define NANOMAP_INPROGRESS 2 -#define NANOMAP_BADOUTPUT 2 -#define NANOMAP_SUCCESS 1 -#define NANOMAP_WATCHDOGSUCCESS 4 -#define NANOMAP_WATCHDOGTERMINATE 3 - - -//Call these procs to dump your world to a series of image files (!!) -//NOTE: Does not explicitly support non 32x32 icons or stuff with large pixel_* values, so don't blame me if it doesn't work perfectly - -/client/proc/nanomapgen_DumpImage() - set name = "Generate NanoUI Map" - set category = "Debug" - - if(admin_holder) - nanomapgen_DumpTile(1, 1, text2num(input(usr,"Enter the Z level to generate"))) - -/client/proc/nanomapgen_DumpTile(startX = 1, startY = 1, currentZ = 1, endX = -1, endY = -1) - - if (endX < 0 || endX > world.maxx) - endX = world.maxx - - if (endY < 0 || endY > world.maxy) - endY = world.maxy - - if (currentZ < 0 || currentZ > world.maxz) - to_chat(usr, "NanoMapGen: ERROR: currentZ ([currentZ]) must be between 1 and [world.maxz]") - - sleep(3) - return NANOMAP_TERMINALERR - - if (startX > endX) - to_chat(usr, "NanoMapGen: ERROR: startX ([startX]) cannot be greater than endX ([endX])") - - sleep(3) - return NANOMAP_TERMINALERR - - if (startY > endX) - to_chat(usr, "NanoMapGen: ERROR: startY ([startY]) cannot be greater than endY ([endY])") - sleep(3) - return NANOMAP_TERMINALERR - - var/icon/Tile = icon(file("nano/mapbase1024.png")) - if (Tile.Width() != NANOMAP_MAX_ICON_DIMENSION || Tile.Height() != NANOMAP_MAX_ICON_DIMENSION) - world.log << "NanoMapGen: ERROR: BASE IMAGE DIMENSIONS ARE NOT [NANOMAP_MAX_ICON_DIMENSION]x[NANOMAP_MAX_ICON_DIMENSION]" - sleep(3) - return NANOMAP_TERMINALERR - - world.log << "NanoMapGen: GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])" - to_chat(usr, "NanoMapGen: GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])") - - var/count = 0; - for(var/WorldX = startX, WorldX <= endX, WorldX++) - for(var/WorldY = startY, WorldY <= endY, WorldY++) - - var/atom/Turf = locate(WorldX, WorldY, currentZ) - - var/icon/TurfIcon = new(Turf.icon, Turf.icon_state) - TurfIcon.Scale(NANOMAP_ICON_SIZE, NANOMAP_ICON_SIZE) - - Tile.Blend(TurfIcon, ICON_OVERLAY, ((WorldX - 1) * NANOMAP_ICON_SIZE), ((WorldY - 1) * NANOMAP_ICON_SIZE)) - - count++ - - if (count % 8000 == 0) - world.log << "NanoMapGen: [count] tiles done" - sleep(1) - - var/mapFilename = "nanomap_z[currentZ]-new.png" - - world.log << "NanoMapGen: sending [mapFilename] to client" - - usr << browse(Tile, "window=picture;file=[mapFilename];display=0") - - world.log << "NanoMapGen: Done." - - to_chat(usr, "NanoMapGen: Done. File [mapFilename] uploaded to your cache.") - - if (Tile.Width() != NANOMAP_MAX_ICON_DIMENSION || Tile.Height() != NANOMAP_MAX_ICON_DIMENSION) - return NANOMAP_BADOUTPUT - - return NANOMAP_SUCCESS diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index f38f4505796f..9f00aa3a659a 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -50,7 +50,7 @@ W.forceMove(src) if(istype(W, /obj/item/paper)) toppaper = W - to_chat(user, SPAN_NOTICE("You clip the [W] onto \the [src].")) + to_chat(user, SPAN_NOTICE("You clip [W] onto [src].")) update_icon() else if(istype(toppaper) && HAS_TRAIT(W, TRAIT_TOOL_PEN)) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 478dcc0a8e04..ad9da68a591d 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -48,7 +48,7 @@ /obj/item/folder/attackby(obj/item/W as obj, mob/user as mob) if(istype(W, /obj/item/paper) || istype(W, /obj/item/photo) || istype(W, /obj/item/paper_bundle)) if(user.drop_inv_item_to_loc(W, src)) - to_chat(user, SPAN_NOTICE("You put the [W] into \the [src].")) + to_chat(user, SPAN_NOTICE("You put [W] into [src].")) update_icon() else if(HAS_TRAIT(W, TRAIT_TOOL_PEN)) var/n_name = strip_html(input(usr, "What would you like to label the folder?", "Folder Labelling", null) as text) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 258132a112e1..b572b5d9e87b 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -569,6 +569,10 @@ name = "crumpled note" info = "there is cotten candy in the walls" +/obj/item/paper/bigred/lambda + name = "ripped diary entry" + info = "Director Smith's Diary\nEntry Date: 15 December 2181\nToday, I've felt true progress! The XX-121 reproduction program is in full effect, and Administrator Cooper have given us the all clear to continue producing specimens. To think that all this is coming from just that first specimen, a single 'Queen' form... It's grown to almost 5 meters tall and shows no signs of ceasing egg production! These creatures will be the next Synthetic of our time, we'll show those Seegson bastards." + /obj/item/paper/bigred/union name = "Shaft miners union" info = "Today we have had enough of being underpaid and treated like shit for not reaching the higher up's unreasonable quotas of ore. They say this place has a \"sea of valuable ores,\" yet we have been mining for years and are yet to find a single diamond. We have had it, enough is enough. They think they can control everything we do, they thought wrong! We, the oppressed workers, shall rise up against the capitalist dogs in a mutiny and take back our pay by force. \n If they send their dogs here to bust us, we will kill each and every single one of them." diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index eafbb3c12c8a..c094c8f32569 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -56,7 +56,7 @@ P.forceMove(user.loc) user.put_in_hands(P) - to_chat(user, SPAN_NOTICE("You take [P] out of the [src].")) + to_chat(user, SPAN_NOTICE("You take [P] out of [src].")) else to_chat(user, SPAN_NOTICE("[src] is empty!")) diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 98208069c8dd..1eb249b5ecfa 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -85,7 +85,7 @@ if (user_protected && prob(80)) to_chat(h_user, "Small electrical arc almost burns your hand. Luckily you had your gloves on!") else - to_chat(h_user, "Small electrical arc sparks and burns your hand as you touch the [src]!") + to_chat(h_user, "Small electrical arc sparks and burns your hand as you touch [src]!") h_user.apply_damage(rand(5,10), BURN) h_user.apply_effect(2, PARALYZE) charge = 0 @@ -98,7 +98,7 @@ if (user_protected && prob(25)) to_chat(h_user, "Medium electrical arc sparks and almost burns your hand. Luckily you had your gloves on!") else - to_chat(h_user, "Medium electrical sparks as you touch the [src], severely burning your hand!") + to_chat(h_user, "Medium electrical sparks as you touch [src], severely burning your hand!") h_user.apply_damage(rand(10,25), BURN) h_user.apply_effect(5, PARALYZE) spawn(0) @@ -182,7 +182,7 @@ /obj/structure/machinery/power/smes/buildable/attackby(obj/item/W as obj, mob/user as mob) // No more disassembling of overloaded SMESs. You broke it, now enjoy the consequences. if (failing) - to_chat(user, SPAN_WARNING("The [src]'s screen is flashing with alerts. It seems to be overloaded! Touching it now is probably not a good idea.")) + to_chat(user, SPAN_WARNING("[src]'s screen is flashing with alerts. It seems to be overloaded! Touching it now is probably not a good idea.")) return // If parent returned 1: // - Hatch is open, so we can modify the SMES @@ -195,7 +195,7 @@ return if (outputting || input_attempt) - to_chat(user, SPAN_WARNING("Turn off the [src] first!")) + to_chat(user, SPAN_WARNING("Turn off [src] first!")) return // Probability of failure if safety circuit is disabled (in %) @@ -212,7 +212,7 @@ return playsound(get_turf(src), 'sound/items/Crowbar.ogg', 25, 1) - to_chat(user, SPAN_WARNING("You begin to disassemble the [src]!")) + to_chat(user, SPAN_WARNING("You begin to disassemble [src]!")) if (do_after(usr, 100 * cur_coils * user.get_skill_duration_multiplier(SKILL_ENGINEER), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) // More coils = takes longer to disassemble. It's complex so largest one with 5 coils will take 50s if (failure_probability && prob(failure_probability)) diff --git a/code/modules/projectiles/ammo_boxes/box_structures.dm b/code/modules/projectiles/ammo_boxes/box_structures.dm index cb119e1a2190..b34c0543bb2c 100644 --- a/code/modules/projectiles/ammo_boxes/box_structures.dm +++ b/code/modules/projectiles/ammo_boxes/box_structures.dm @@ -134,7 +134,7 @@ if(istype(W, /obj/item/storage/box/m94)) var/obj/item/storage/box/m94/flare_pack = W if(flare_pack.contents.len < flare_pack.max_storage_space) - to_chat(user, SPAN_WARNING("\The [W] is not full.")) + to_chat(user, SPAN_WARNING("[W] is not full.")) return var/flare_type if(istype(W, /obj/item/storage/box/m94/signal)) @@ -143,28 +143,28 @@ flare_type = /obj/item/device/flashlight/flare for(var/obj/item/device/flashlight/flare/F in flare_pack.contents) if(F.fuel < 1) - to_chat(user, SPAN_WARNING("Some flares in \the [F] are used.")) + to_chat(user, SPAN_WARNING("Some flares in [F] are used.")) return if(F.type != flare_type) - to_chat(user, SPAN_WARNING("Some flares in \the [W] are not of the correct type.")) + to_chat(user, SPAN_WARNING("Some flares in [W] are not of the correct type.")) return else if(istype(W, /obj/item/storage/box/MRE)) var/obj/item/storage/box/MRE/mre_pack = W if(mre_pack.isopened) - to_chat(user, SPAN_WARNING("\The [W] was already opened and isn't suitable for storing in \the [src].")) + to_chat(user, SPAN_WARNING("[W] was already opened and isn't suitable for storing in [src].")) return else if(istype(W, /obj/item/cell/high)) var/obj/item/cell/high/cell = W if(cell.charge != cell.maxcharge) - to_chat(user, SPAN_WARNING("\The [W] needs to be fully charged before it can be stored in \the [src].")) + to_chat(user, SPAN_WARNING("[W] needs to be fully charged before it can be stored in [src].")) return if(item_box.contents.len < item_box.num_of_magazines) user.drop_inv_item_to_loc(W, src) item_box.contents += W - to_chat(user, SPAN_NOTICE("You put a [W] in to \the [src]")) + to_chat(user, SPAN_NOTICE("You put \a [W] into [src]")) update_icon() else - to_chat(user, SPAN_WARNING("\The [src] is full.")) + to_chat(user, SPAN_WARNING("[src] is full.")) else to_chat(user, SPAN_WARNING("You don't want to mix different magazines in one box.")) else @@ -175,10 +175,10 @@ return if(O.default_ammo == AM.default_ammo) if(O.current_rounds <= 0) - to_chat(user, SPAN_WARNING("\The [O] is empty.")) + to_chat(user, SPAN_WARNING("[O] is empty.")) return if(AM.current_rounds >= AM.max_rounds) - to_chat(user, SPAN_WARNING("\The [src] is full.")) + to_chat(user, SPAN_WARNING("[src] is full.")) return else if(!do_after(user, 15, INTERRUPT_ALL, BUSY_ICON_FRIENDLY)) @@ -187,7 +187,7 @@ var/S = min(O.current_rounds, AM.max_rounds - AM.current_rounds) AM.current_rounds += S O.current_rounds -= S - to_chat(user, SPAN_NOTICE("You transfer shells from [O] into \the [src]")) + to_chat(user, SPAN_NOTICE("You transfer shells from [O] into [src]")) update_icon() O.update_icon() else diff --git a/code/modules/projectiles/ammo_boxes/handful_boxes.dm b/code/modules/projectiles/ammo_boxes/handful_boxes.dm index 28eab8463011..9ac2aeea8870 100644 --- a/code/modules/projectiles/ammo_boxes/handful_boxes.dm +++ b/code/modules/projectiles/ammo_boxes/handful_boxes.dm @@ -48,6 +48,15 @@ /obj/item/ammo_box/magazine/shotgun/incendiary/empty empty = TRUE +/obj/item/ammo_box/magazine/shotgun/incendiarybuck + name = "\improper shotgun shell box (Incendiary buckshot x 100)" + icon_state = "base_incbuck" + overlay_content = "_incenbuck" + magazine_type = /obj/item/ammo_magazine/shotgun/incendiarybuck + +/obj/item/ammo_box/magazine/shotgun/incendiarybuck/empty + empty = TRUE + /obj/item/ammo_box/magazine/shotgun/beanbag name = "\improper shotgun shell box (Beanbag x 100)" icon_state = "base_bean" diff --git a/code/modules/projectiles/ammo_boxes/magazine_boxes.dm b/code/modules/projectiles/ammo_boxes/magazine_boxes.dm index ff90a6659fb2..6d20dcc75949 100644 --- a/code/modules/projectiles/ammo_boxes/magazine_boxes.dm +++ b/code/modules/projectiles/ammo_boxes/magazine_boxes.dm @@ -286,6 +286,15 @@ /obj/item/ammo_box/magazine/m4a3/hp/empty empty = TRUE +/obj/item/ammo_box/magazine/m4a3/incen + name = "\improper magazine box (Incen M4A3 x 16)" + overlay_ammo_type = "_incen" + overlay_content = "_incen" + magazine_type = /obj/item/ammo_magazine/pistol/incendiary + +/obj/item/ammo_box/magazine/m4a3/incen/empty + empty = TRUE + //-----------------------M44 Revolver Speed Loaders Box----------------------- /obj/item/ammo_box/magazine/m44 @@ -410,3 +419,306 @@ /obj/item/ammo_box/magazine/nailgun/empty empty = TRUE + +//-----------------------M56B Drum Box----------------------- + +/obj/item/ammo_box/magazine/m56b + name = "\improper drum box (M56B x 8)" + icon_state = "base_m56b" + overlay_ammo_type = "_reg_heavy" + overlay_gun_type = "_sg" + overlay_content = "_sg" + magazine_type = /obj/item/ammo_magazine/smartgun + num_of_magazines = 8 + +/obj/item/ammo_box/magazine/m56b/empty + empty = TRUE + +/obj/item/ammo_box/magazine/m56b/dirty + name = "\improper drum box (M56B 'Dirty' x 8)" + overlay_ammo_type = "_red_heavy" + overlay_content = "_sgdirty" + magazine_type = /obj/item/ammo_magazine/smartgun/dirty + +/obj/item/ammo_box/magazine/m56b/dirty/empty + empty = TRUE + +//-----------------------M56D Drum Box----------------------- + +/obj/item/ammo_box/magazine/m56d + name = "\improper drum box (M56D x 8)" + icon_state = "base_m56d" + overlay_ammo_type = "" + overlay_gun_type = "_m56d" + overlay_content = "_m56d" + magazine_type = /obj/item/ammo_magazine/m56d + num_of_magazines = 8 + +/obj/item/ammo_box/magazine/m56d/update_icon() + if(overlays) + overlays.Cut() + overlays += image(icon, icon_state = "[icon_state]_lid") //adding lid + overlays += image(text_markings_icon, icon_state = "text[overlay_gun_type]") //adding text + +/obj/item/ammo_box/magazine/m56d/empty + empty = TRUE + + +//-----------------------M2C Ammo Box----------------------- + +/obj/item/ammo_box/magazine/m2c + name = "\improper ammo box (M2C x 8)" + icon_state = "base_m2c" + overlay_ammo_type = "" + overlay_gun_type = "_m2c" + overlay_content = "_m2c" + magazine_type = /obj/item/ammo_magazine/m2c + num_of_magazines = 8 + +/obj/item/ammo_box/magazine/m2c/update_icon() + if(overlays) + overlays.Cut() + overlays += image(icon, icon_state = "[icon_state]_lid") //adding lid + overlays += image(text_markings_icon, icon_state = "text[overlay_gun_type]") //adding text + +/obj/item/ammo_box/magazine/m2c/empty + empty = TRUE + +//-----------------------M41AE2 Ammo Box----------------------- + +/obj/item/ammo_box/magazine/m41ae2 + name = "\improper magazine (M41AE2 x 8)" + icon_state = "base_m41ae2" + overlay_ammo_type = "_reg_heavy" + overlay_gun_type = "_m41ae2" + overlay_content = "_m41ae2" + magazine_type = /obj/item/ammo_magazine/rifle/lmg + num_of_magazines = 8 + +/obj/item/ammo_box/magazine/m41ae2/empty + empty = TRUE + +/obj/item/ammo_box/magazine/m41ae2/holo + name = "\improper magazine box (M41AE2 Holo-Target x 8)" + overlay_ammo_type = "_holo_heavy" + overlay_content = "_m41ae2_holo" + magazine_type = /obj/item/ammo_magazine/rifle/lmg/holo_target + +/obj/item/ammo_box/magazine/m41ae2/holo/empty + empty = TRUE + +/obj/item/ammo_box/magazine/m41ae2/heap + name = "\improper magazine box (M41AE2 HEAP x 8)" + overlay_ammo_type = "_heap_heavy" + overlay_content = "_m41ae2_heap" + magazine_type = /obj/item/ammo_magazine/rifle/lmg/heap + +/obj/item/ammo_box/magazine/m41ae2/heap/empty + empty = TRUE + +//-----------------------Flamer Fuel Tank Box----------------------- + +/obj/item/ammo_box/magazine/flamer + name = "\improper flamer tank box (UT-Napthal Fuel x 8)" + icon_state = "base_flamer" + overlay_ammo_type = "_flamer" + overlay_gun_type = "_blank" + overlay_content = "_flamer" + magazine_type = /obj/item/ammo_magazine/flamer_tank + num_of_magazines = 8 + +/obj/item/ammo_box/magazine/flamer/empty + empty = TRUE + +/obj/item/ammo_box/magazine/flamer/bgel + name = "\improper flamer fuel box (Napalm B-Gel x 8)" + overlay_ammo_type = "_flamer_bgel" + overlay_content = "_flamer_bgel" + magazine_type = /obj/item/ammo_magazine/flamer_tank/gellied + +/obj/item/ammo_box/magazine/flamer/bgel/empty + empty = TRUE + +//-----------------------M41A MK1 Rifle Mag Boxes----------------------- + +/obj/item/ammo_box/magazine/mk1 + name = "\improper magazine box (M41A MK1 x 8)" + overlay_ammo_type = "_reg_mk1" + overlay_gun_type = "_mk1" + overlay_content = "_reg" + magazine_type = /obj/item/ammo_magazine/rifle/m41aMK1 + num_of_magazines = 8 + +/obj/item/ammo_box/magazine/mk1/empty + empty = TRUE + +/obj/item/ammo_box/magazine/mk1/ap + name = "\improper magazine box (M41A MK1 AP x 8)" + flags_equip_slot = SLOT_BACK + overlay_ammo_type = "_ap_mk1" + overlay_content = "_ap" + magazine_type = /obj/item/ammo_magazine/rifle/m41aMK1/ap + +/obj/item/ammo_box/magazine/mk1/ap/empty + empty = TRUE + +//-----------------------NSG 23 Rifle Mag Boxes----------------------- + +/obj/item/ammo_box/magazine/nsg23 + name = "\improper magazine box (NSG 23 x 16)" + icon_state = "base_nsg23" + overlay_gun_type = "_nsg23" + overlay_content = "_reg" + magazine_type = /obj/item/ammo_magazine/rifle/nsg23 + num_of_magazines = 16 + +/obj/item/ammo_box/magazine/nsg23/empty + empty = TRUE + +/obj/item/ammo_box/magazine/nsg23/ap + name = "\improper magazine box (NSG 23 AP x 12)" + overlay_ammo_type = "_ap" + overlay_content = "_ap" + magazine_type = /obj/item/ammo_magazine/rifle/nsg23/ap + num_of_magazines = 12 + +/obj/item/ammo_box/magazine/nsg23/ap/empty + empty = TRUE + +/obj/item/ammo_box/magazine/nsg23/ex + name = "\improper magazine box (NSG 23 Extended x 8)" + overlay_ammo_type = "_ext" + magazine_type = /obj/item/ammo_magazine/rifle/nsg23/extended + num_of_magazines = 8 + +/obj/item/ammo_box/magazine/nsg23/ex/empty + empty = TRUE + +/obj/item/ammo_box/magazine/nsg23/heap + name = "\improper magazine box (NSG 23 HEAP x 16)" + overlay_ammo_type = "_heap" + overlay_content = "_heap" + magazine_type = /obj/item/ammo_magazine/rifle/nsg23/heap + +/obj/item/ammo_box/magazine/nsg23/heap/empty + empty = TRUE + +//-----------------------Spearhead Autorevolver Speed Loaders Box----------------------- + +/obj/item/ammo_box/magazine/spearhead + name = "\improper speed loaders box (Spearhead HP x 12)" + icon_state = "base_cmb" + overlay_ammo_type = "_357_hp" + overlay_gun_type = "_357" + overlay_content = "_speed" + num_of_magazines = 12 + magazine_type = /obj/item/ammo_magazine/revolver/cmb + +/obj/item/ammo_box/magazine/spearhead/empty + empty = TRUE + +/obj/item/ammo_box/magazine/spearhead/normalpoint + name = "\improper speed loaders box (Spearhead x 12)" + overlay_ammo_type = "_357_reg" + magazine_type = /obj/item/ammo_magazine/revolver/cmb/normalpoint + +/obj/item/ammo_box/magazine/spearhead/normalpoint/empty + empty = TRUE + +//-----------------------Type 73 Pistol Mag Box----------------------- + +/obj/item/ammo_box/magazine/type73 + name = "\improper magazine box (Type 73 x 16)" + icon_state = "base_type73" + flags_equip_slot = SLOT_BACK + overlay_ammo_type = "_type71_reg" + overlay_gun_type = "_type73" + overlay_content = "_type71_reg" + num_of_magazines = 16 + magazine_type = /obj/item/ammo_magazine/pistol/t73 + +/obj/item/ammo_box/magazine/type73/empty + empty = TRUE + +/obj/item/ammo_box/magazine/type73/impact + name = "\improper magazine box (Type 73 High-Impact x 10)" + overlay_ammo_type = "_type73_impact" + overlay_content = "_type73_impact" + num_of_magazines = 10 + magazine_type = /obj/item/ammo_magazine/pistol/t73_impact + +/obj/item/ammo_box/magazine/type73/impact/empty + empty = TRUE + + +//-----------------------AR10 Rifle Mag Box----------------------- + +/obj/item/ammo_box/magazine/ar10 + name = "\improper magazine box (AR10 x 12)" + icon_state = "base_ar10" + flags_equip_slot = SLOT_BACK + overlay_gun_type = "_ar10" + overlay_content = "_reg" + num_of_magazines = 12 + magazine_type = /obj/item/ammo_magazine/rifle/ar10 + +/obj/item/ammo_box/magazine/ar10/empty + empty = TRUE + +//-----------------------MP5 Smg Mag Box----------------------- + +/obj/item/ammo_box/magazine/mp5 + name = "\improper magazine box (MP5 x 12)" + icon_state = "base_m16" + flags_equip_slot = SLOT_BACK + overlay_gun_type = "_mp5" + overlay_content = "_reg" + num_of_magazines = 12 + magazine_type = /obj/item/ammo_magazine/smg/mp5 + +/obj/item/ammo_box/magazine/mp5/empty + empty = TRUE + + +//-----------------------Desert Eagle Pistol Mag Box----------------------- + +/obj/item/ammo_box/magazine/deagle + name = "\improper magazine box (Desert Eagle x 12)" + icon_state = "base_deagle" + flags_equip_slot = SLOT_BACK + overlay_ammo_type = "_reg" + overlay_gun_type = "_deagle" + overlay_content = "_reg" + num_of_magazines = 16 + magazine_type = /obj/item/ammo_magazine/pistol/heavy + +/obj/item/ammo_box/magazine/deagle/empty + empty = TRUE + +/obj/item/ammo_box/magazine/deagle/super + name = "\improper magazine box (Heavy Desert Eagle x 8)" + overlay_ammo_type = "_hp" + overlay_content = "_hp" + num_of_magazines = 8 + magazine_type = /obj/item/ammo_magazine/pistol/heavy/super + +/obj/item/ammo_box/magazine/deagle/super/empty + empty = TRUE + +/obj/item/ammo_box/magazine/deagle/super/highimpact + name = "\improper magazine box (High Impact Desert Eagle x 8)" + overlay_ammo_type = "_impact" + overlay_content = "_impact" + magazine_type = /obj/item/ammo_magazine/pistol/heavy/super/highimpact + +/obj/item/ammo_box/magazine/deagle/super/highimpact/empty + empty = TRUE + +/obj/item/ammo_box/magazine/deagle/super/highimpact/ap + name = "\improper magazine box (High Impact Armor-Piercing Desert Eagle x 8)" + overlay_ammo_type = "_ap" + overlay_content = "_ap" + magazine_type = /obj/item/ammo_magazine/pistol/heavy/super/highimpact/ap + +/obj/item/ammo_box/magazine/deagle/super/highimpact/ap/empty + empty = TRUE diff --git a/code/modules/projectiles/ammo_boxes/misc_boxes.dm b/code/modules/projectiles/ammo_boxes/misc_boxes.dm index d09a69e5bb50..7b19555f4de5 100644 --- a/code/modules/projectiles/ammo_boxes/misc_boxes.dm +++ b/code/modules/projectiles/ammo_boxes/misc_boxes.dm @@ -75,6 +75,15 @@ overlay_gun_type = "_m94" overlay_content = "_flares" +//------------------------M89 Signal Flare Packs Box-------------------------- + +/obj/item/ammo_box/magazine/misc/flares/signal + name = "\improper box of M89 signal flare packs" + desc = "A box of M89 signal flare packs, to mark up the way." + magazine_type = /obj/item/storage/box/m94/signal + overlay_gun_type = "_m89" + overlay_content = "_flares_signal" + //---------------------FIRE HANDLING PROCS //flare box has unique stuff @@ -139,6 +148,9 @@ /obj/item/ammo_box/magazine/misc/flares/empty empty = TRUE +/obj/item/ammo_box/magazine/misc/flares/signal/empty + empty = TRUE + //------------------------Flashlight Box-------------------------- /obj/item/ammo_box/magazine/misc/flashlight diff --git a/code/modules/projectiles/ammo_boxes/round_boxes.dm b/code/modules/projectiles/ammo_boxes/round_boxes.dm index 95115b76df43..ab1d1667c15f 100644 --- a/code/modules/projectiles/ammo_boxes/round_boxes.dm +++ b/code/modules/projectiles/ammo_boxes/round_boxes.dm @@ -130,3 +130,43 @@ /obj/item/ammo_box/rounds/type71/heap/empty empty = TRUE + +//----------------9mm Pistol Ammunition Boxes (for mod88, M4A3 pistols)------------------ + +/obj/item/ammo_box/rounds/pistol + name = "\improper pistol ammunition box (9mm)" + desc = "A 9mm ammunition box. Used to refill M4A3 magazines. It comes with a leather strap allowing to wear it on the back." + caliber = "9mm" + icon_state = "base_m4a3" + overlay_content = "_reg" + default_ammo = /datum/ammo/bullet/pistol + +/obj/item/ammo_box/rounds/pistol/empty + empty = TRUE + +/obj/item/ammo_box/rounds/pistol/ap + name = "\improper pistol ammunition box (9mm AP)" + desc = "A 9mm armor-piercing ammunition box. Used to refill mod88 and M4A3 magazines. It comes with a leather strap allowing to wear it on the back." + overlay_content = "_ap" + default_ammo = /datum/ammo/bullet/pistol/ap + +/obj/item/ammo_box/rounds/pistol/ap/empty + empty = TRUE + +/obj/item/ammo_box/rounds/pistol/hp + name = "\improper pistol ammunition box (9mm HP)" + desc = "A 9mm hollow-point ammunition box. Used to refill M4A3 magazines. It comes with a leather strap allowing to wear it on the back." + overlay_content = "_hp" + default_ammo = /datum/ammo/bullet/pistol/hollow + +/obj/item/ammo_box/rounds/pistol/hp/empty + empty = TRUE + +/obj/item/ammo_box/rounds/pistol/incen + name = "\improper pistol ammunition box (9mm Incendiary)" + desc = "A 9mm incendiary ammunition box. Used to refill M4A3 magazines. It comes with a leather strap allowing to wear it on the back." + overlay_content = "_incen" + default_ammo = /datum/ammo/bullet/pistol/incendiary + +/obj/item/ammo_box/rounds/pistol/incen/empty + empty = TRUE diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 8d7ab1532ade..c41a57f53527 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -1538,6 +1538,7 @@ not all weapons use normal magazines etc. load_into_chamber() itself is designed if(flags_gun_features & GUN_TRIGGER_SAFETY) to_chat(user, SPAN_WARNING("The safety is on!")) + gun_user.balloon_alert(gun_user, "safety on") return if(active_attachable) if(active_attachable.flags_attach_features & ATTACH_PROJECTILE) @@ -1933,8 +1934,8 @@ not all weapons use normal magazines etc. load_into_chamber() itself is designed if(gun_user.client?.prefs?.toggle_prefs & TOGGLE_HELP_INTENT_SAFETY && (gun_user.a_intent == INTENT_HELP)) if(world.time % 3) // Limits how often this message pops up, saw this somewhere else and thought it was clever - //Absolutely SCREAM this at people so they don't get killed by it - to_chat(gun_user, SPAN_HIGHDANGER("Help intent safety is on! Switch to another intent to fire your weapon.")) + to_chat(gun_user, SPAN_DANGER("Help intent safety is on! Switch to another intent to fire your weapon.")) + gun_user.balloon_alert(gun_user, "help intent safety") click_empty(gun_user) return FALSE diff --git a/code/modules/projectiles/gun_attachables.dm b/code/modules/projectiles/gun_attachables.dm index 9f0ddd04fc11..33d28527c8a1 100644 --- a/code/modules/projectiles/gun_attachables.dm +++ b/code/modules/projectiles/gun_attachables.dm @@ -350,16 +350,16 @@ Defined in conflicts.dm of the #defines folder. if(istype(W, /obj/item/co2_cartridge)) if(!filled) filled = TRUE - user.visible_message(SPAN_NOTICE("[user] slots a CO2 cartridge into [src]. A second later, \he apparently looks dismayed."), SPAN_WARNING("You slot a fresh CO2 cartridge into [src] and snap the slot cover into place. Only then do you realize \the [W]'s valve broke inside \the [src]. Fuck.")) + user.visible_message(SPAN_NOTICE("[user] slots a CO2 cartridge into [src]. A second later, \he apparently looks dismayed."), SPAN_WARNING("You slot a fresh CO2 cartridge into [src] and snap the slot cover into place. Only then do you realize [W]'s valve broke inside [src]. Fuck.")) playsound(src, 'sound/machines/click.ogg') qdel(W) update_icon() return else - user.visible_message(SPAN_WARNING("[user] fiddles with \the [src]. \He looks frustrated."), SPAN_NOTICE("No way man! You can't seem to pry the existing container out of \the [src]... try a screwdriver?")) + user.visible_message(SPAN_WARNING("[user] fiddles with [src]. \He looks frustrated."), SPAN_NOTICE("No way man! You can't seem to pry the existing container out of [src]... try a screwdriver?")) return if(HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER) && do_after(user, 2 SECONDS, INTERRUPT_ALL, BUSY_ICON_BUILD)) - user.visible_message(SPAN_WARNING("[user] screws with \the [src], using \a [W]. \He looks very frustrated."), SPAN_NOTICE("You try to pry the cartridge out of the [src], but it's stuck damn deep. Piece of junk...")) + user.visible_message(SPAN_WARNING("[user] screws with [src], using \a [W]. \He looks very frustrated."), SPAN_NOTICE("You try to pry the cartridge out of [src], but it's stuck damn deep. Piece of junk...")) return ..() @@ -3447,4 +3447,3 @@ Defined in conflicts.dm of the #defines folder. accuracy_mod = HIT_ACCURACY_MULT_TIER_5 accuracy_unwielded_mod = HIT_ACCURACY_MULT_TIER_5 damage_mod -= BULLET_DAMAGE_MULT_TIER_4 - diff --git a/code/modules/projectiles/guns/lever_action.dm b/code/modules/projectiles/guns/lever_action.dm index d93796fbb15f..849844f4f044 100644 --- a/code/modules/projectiles/guns/lever_action.dm +++ b/code/modules/projectiles/guns/lever_action.dm @@ -373,6 +373,7 @@ their unique feature is that a direct hit will buff your damage and firerate hit_buff_reset_cooldown = 2 SECONDS //how much time after a direct hit until streaks reset var/floating_penetration = FLOATING_PENETRATION_TIER_0 //holder var var/floating_penetration_upper_limit = FLOATING_PENETRATION_TIER_4 + var/direct_hit_sound = 'sound/weapons/gun_xm88_directhit_low.ogg' attachable_allowed = list( /obj/item/attachable/bayonet/upp, // Barrel /obj/item/attachable/bayonet, @@ -499,12 +500,16 @@ their unique feature is that a direct hit will buff your damage and firerate switch(floating_penetration) if(FLOATING_PENETRATION_TIER_1) P.ammo = GLOB.ammo_list[/datum/ammo/bullet/lever_action/xm88/pen20] + direct_hit_sound = "sound/weapons/gun_xm88_directhit_low.ogg" if(FLOATING_PENETRATION_TIER_2) P.ammo = GLOB.ammo_list[/datum/ammo/bullet/lever_action/xm88/pen30] + direct_hit_sound = "sound/weapons/gun_xm88_directhit_medium.ogg" if(FLOATING_PENETRATION_TIER_3) P.ammo = GLOB.ammo_list[/datum/ammo/bullet/lever_action/xm88/pen40] + direct_hit_sound = "sound/weapons/gun_xm88_directhit_medium.ogg" if(FLOATING_PENETRATION_TIER_4) P.ammo = GLOB.ammo_list[/datum/ammo/bullet/lever_action/xm88/pen50] + direct_hit_sound = "sound/weapons/gun_xm88_directhit_high.ogg" return ..() /obj/item/weapon/gun/lever_action/xm88/unload(mob/user) @@ -524,6 +529,7 @@ their unique feature is that a direct hit will buff your damage and firerate lever_message = initial(lever_message) wield_delay = initial(wield_delay) cur_onehand_chance = initial(cur_onehand_chance) + direct_hit_sound = "sound/weapons/gun_xm88_directhit_low.ogg" if(in_chamber) var/obj/projectile/P = in_chamber P.ammo = GLOB.ammo_list[/datum/ammo/bullet/lever_action/xm88] @@ -536,6 +542,10 @@ their unique feature is that a direct hit will buff your damage and firerate if(one_hand_lever) addtimer(VARSET_CALLBACK(src, cur_onehand_chance, reset_onehand_chance), 4 SECONDS, TIMER_OVERRIDE|TIMER_UNIQUE) +/obj/item/weapon/gun/lever_action/xm88/direct_hit_buff(mob/user, mob/target, one_hand_lever = FALSE) + . = ..() + playsound(target, direct_hit_sound, 75) + #undef FLOATING_PENETRATION_TIER_0 #undef FLOATING_PENETRATION_TIER_1 #undef FLOATING_PENETRATION_TIER_2 diff --git a/code/modules/projectiles/guns/smartgun.dm b/code/modules/projectiles/guns/smartgun.dm index 22f10cafb35b..8ac629310132 100644 --- a/code/modules/projectiles/guns/smartgun.dm +++ b/code/modules/projectiles/guns/smartgun.dm @@ -144,7 +144,8 @@ /obj/item/weapon/gun/smartgun/attackby(obj/item/attacking_object, mob/user) if(istype(attacking_object, /obj/item/smartgun_battery)) var/obj/item/smartgun_battery/new_cell = attacking_object - visible_message("[user] swaps out the power cell in the [src].","You swap out the power cell in the [src] and drop the old one.") + visible_message(SPAN_NOTICE("[user] swaps out the power cell in [src]."), + SPAN_NOTICE("You swap out the power cell in [src] and drop the old one.")) to_chat(user, SPAN_NOTICE("The new cell contains: [new_cell.power_cell.charge] power.")) battery.update_icon() battery.forceMove(get_turf(user)) diff --git a/code/modules/projectiles/guns/souto.dm b/code/modules/projectiles/guns/souto.dm index 6f45f57e1d61..1e9669dd0b7b 100644 --- a/code/modules/projectiles/guns/souto.dm +++ b/code/modules/projectiles/guns/souto.dm @@ -39,11 +39,11 @@ return ..() /obj/item/weapon/gun/souto/reload(mob/user, obj/item/ammo_magazine/magazine) - to_chat(user, SPAN_WARNING("The [src] feed system cannot be reloaded manually.")) + to_chat(user, SPAN_WARNING("[src]'s feed system cannot be reloaded manually.")) return /obj/item/weapon/gun/souto/unload(mob/user, reload_override = 0, drop_override = 0, loc_override = 0) - to_chat(user, SPAN_WARNING("You cannot unload the [src].")) + to_chat(user, SPAN_WARNING("You cannot unload [src].")) return /obj/item/weapon/gun/souto/able_to_fire(mob/user) diff --git a/code/modules/projectiles/magazines/shotguns.dm b/code/modules/projectiles/magazines/shotguns.dm index 9f137b1c2316..6c103aaa9677 100644 --- a/code/modules/projectiles/magazines/shotguns.dm +++ b/code/modules/projectiles/magazines/shotguns.dm @@ -46,6 +46,14 @@ GLOBAL_LIST_INIT(shotgun_boxes_12g, list( default_ammo = /datum/ammo/bullet/shotgun/incendiary handful_state = "incendiary_slug" +/obj/item/ammo_magazine/shotgun/incendiarybuck + name = "box of incendiary buckshots" + desc = "A box filled with self-detonating buckshot incendiary shotgun rounds. 12 Gauge." + icon_state = "incendiarybuck" + item_state = "incendiarybuck" + default_ammo = /datum/ammo/bullet/shotgun/buckshot/incendiary + handful_state = "incen_buckshot" + /obj/item/ammo_magazine/shotgun/buckshot name = "box of buckshot shells" desc = "A box filled with buckshot spread shotgun shells. 12 Gauge." diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 7de8f12fc546..ef265e0b8095 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -13,8 +13,9 @@ anchored = TRUE //You will not have me, space wind! flags_atom = NOINTERACT //No real need for this, but whatever. Maybe this flag will do something useful in the future. mouse_opacity = MOUSE_OPACITY_TRANSPARENT - invisibility = 100 // We want this thing to be invisible when it drops on a turf because it will be on the user's turf. We then want to make it visible as it travels. + alpha = 0 // We want this thing to be transparent when it drops on a turf because it will be on the user's turf. We then want to make it opaque as it travels. layer = FLY_LAYER + animate_movement = NO_STEPS //disables gliding because it fights against what animate() is doing var/datum/ammo/ammo //The ammo data which holds most of the actual info. @@ -48,6 +49,13 @@ var/vis_travelled = 0 /// Origin point for tracing and visual updates var/turf/vis_source + var/vis_source_pixel_x = 0 + var/vis_source_pixel_y = 0 + + /// Starting point of projectile before each flight. + var/turf/process_start_turf + var/process_start_pixel_x = 0 + var/process_start_pixel_y = 0 var/damage = 0 var/accuracy = 85 //Base projectile accuracy. Can maybe be later taken from the mob if desired. @@ -229,9 +237,11 @@ p_x = Clamp(p_x, -16, 16) p_y = Clamp(p_y, -16, 16) - if(source_turf != vis_source) + if(process_start_turf != vis_source) vis_travelled = 0 - vis_source = source_turf + vis_source = process_start_turf || source_turf + vis_source_pixel_x = process_start_pixel_x + vis_source_pixel_y = process_start_pixel_y angle = 0 // Stolen from Get_Angle() basically var/dx = p_x + aim_turf.x * 32 - source_turf.x * 32 // todo account for firer offsets @@ -248,13 +258,14 @@ else if(dx < 0) angle += 360 - var/matrix/rotate = matrix() //Change the bullet angle. - rotate.Turn(angle) - apply_transform(rotate) - /obj/projectile/process(delta_time) . = PROC_RETURN_SLEEP + var/process_start_delta_time = delta_time //easier to take it unaltered than to recalculate it later + process_start_turf = get_turf(src) //obj-level vars so update_angle() can use it without passing it through a ton of procs + process_start_pixel_x = pixel_x + process_start_pixel_y = pixel_y + // Keep going as long as we got speed and time while(speed > 0 && (speed * ((delta_time + time_carry)/10) >= 1)) time_carry -= 1/speed*10 @@ -266,8 +277,72 @@ return PROCESS_KILL time_carry += delta_time + + animate_flight(process_start_turf, process_start_pixel_x, process_start_pixel_y, process_start_delta_time) + return FALSE +//#define LERP(a, b, t) (a + (b - a) * CLAMP01(t)) +#define LERP_UNCLAMPED(a, b, t) (a + (b - a) * t) + +/// Animates the projectile across the process'ed flight. +/obj/projectile/proc/animate_flight(turf/start_turf, start_pixel_x, start_pixel_y, delta_time) + //Get pixelspace coordinates of start and end of visual path + + var/pixel_x_source = vis_source.x * world.icon_size + vis_source_pixel_x + var/pixel_y_source = vis_source.y * world.icon_size + vis_source_pixel_y + + var/turf/vis_target = path[path.len] + var/pixel_x_target = vis_target.x * world.icon_size + p_x + var/pixel_y_target = vis_target.y * world.icon_size + p_y + + //Change the bullet angle to its visual path + + var/vis_angle = get_pixel_angle(x = pixel_x_target - pixel_x_source, y = pixel_y_target - pixel_y_source) //naming vars because the proc takes y then x and that's WEIRD + var/matrix/rotate = matrix() + rotate.Turn(vis_angle) + apply_transform(rotate) + + //Determine apparent position along visual path, then lerp between start and end positions + + var/vis_length = vis_travelled + path.len + var/vis_current = vis_travelled + speed * (time_carry * 0.1) //speed * (time_carry * 0.1) for remainder time movement, visually "catching up" to where it should be + var/vis_interpolant = vis_current / vis_length + + var/pixel_x_lerped = LERP_UNCLAMPED(pixel_x_source, pixel_x_target, vis_interpolant) + var/pixel_y_lerped = LERP_UNCLAMPED(pixel_y_source, pixel_y_target, vis_interpolant) + + //Convert pixelspace to pixel offset relative to current loc + + var/turf/current_turf = get_turf(src) + var/pixel_x_rel_new = pixel_x_lerped - current_turf.x * world.icon_size + var/pixel_y_rel_new = pixel_y_lerped - current_turf.y * world.icon_size + + //Set pixel offset as from current loc to old position, so it appears to start in the old position + + pixel_x = (start_turf.x - current_turf.x) * world.icon_size + start_pixel_x + pixel_y = (start_turf.y - current_turf.y) * world.icon_size + start_pixel_y + + //Determine apparent distance travelled, then lerp for projectile fade-in + + var/dist_current = distance_travelled + speed * (time_carry * 0.1) //speed * (time_carry * 0.1) for remainder time fade-in + var/alpha_interpolant = dist_current - 1 //-1 so it transitions from transparent to opaque between dist 1-2 + var/alpha_new = LERP_UNCLAMPED(0, 255, alpha_interpolant) + + //Animate the visuals from starting position to new position + + if(projectile_flags & PROJECTILE_SHRAPNEL) //there can be a LOT of shrapnel especially from a cluster OB, not important enough for the expense of an animate() + alpha = alpha_new + pixel_x = pixel_x_rel_new + pixel_y = pixel_y_rel_new + return + + var/anim_time = delta_time * 0.1 + animate(src, pixel_x = pixel_x_rel_new, pixel_y = pixel_y_rel_new, alpha = alpha_new, time = anim_time, flags = ANIMATION_END_NOW) + +//#undef LERP +#undef LERP_UNCLAMPED + /// Flies the projectile forward one single turf /obj/projectile/proc/fly() SHOULD_NOT_SLEEP(TRUE) @@ -294,8 +369,6 @@ forceMove(next_turf) distance_travelled++ vis_travelled++ - if(distance_travelled > 1) - invisibility = 0 // Check we're still flying - in the highly unlikely but apparently possible case // we hit something through forceMove callbacks that we didn't pick up in scan_a_turf @@ -320,20 +393,6 @@ p_y *= 2 retarget(aim_turf, keep_angle = TRUE) - // Nowe we update visual offset by tracing the bullet predicted location against real one - // - // Travelled real distance so far - var/dist = vis_travelled * 32 + speed * (time_carry*10) - // Compute where we should be - var/vis_x = vis_source.x * 32 + sin(angle) * dist - var/vis_y = vis_source.y * 32 + cos(angle) * dist - // Get the difference with where we actually are - var/dx = vis_x - loc.x * 32 - var/dy = vis_y - loc.y * 32 - // Clamp and set this as pixel offsets - pixel_x = Clamp(dx, -16, 16) - pixel_y = Clamp(dy, -16, 16) - /obj/projectile/proc/retarget(atom/new_target, keep_angle = FALSE) var/turf/current_turf = get_turf(src) path = getline2(current_turf, new_target) @@ -1203,7 +1262,7 @@ return attack_log += "\[[time_stamp()]\] SOMETHING?? shot [key_name(src)] with a [P]" - msg_admin_attack("SOMETHING?? shot [key_name(src)] with a [P] in [get_area(src)] ([loc.x],[loc.y],[loc.z]).", loc.x, loc.y, loc.z) + msg_admin_attack("SOMETHING?? shot [key_name(src)] with \a [P] in [get_area(src)] ([loc.x],[loc.y],[loc.z]).", loc.x, loc.y, loc.z) //Abby -- Just check if they're 1 tile horizontal or vertical, no diagonals /proc/get_adj_simple(atom/Loc1,atom/Loc2) diff --git a/code/modules/reagents/chemistry_machinery/centrifuge.dm b/code/modules/reagents/chemistry_machinery/centrifuge.dm index b21c52112d0f..6143313377a0 100644 --- a/code/modules/reagents/chemistry_machinery/centrifuge.dm +++ b/code/modules/reagents/chemistry_machinery/centrifuge.dm @@ -89,7 +89,7 @@ tgui_interact(user) return if(output_container) - to_chat(user, SPAN_NOTICE("You remove the [output_container] from the [src].")) + to_chat(user, SPAN_NOTICE("You remove [output_container] from the [src].")) user.put_in_active_hand(output_container) output_container = null if(input_container) @@ -97,7 +97,7 @@ else icon_state = "centrifuge_empty_open" else if(input_container) - to_chat(user, SPAN_NOTICE("You remove the [input_container] from the [src].")) + to_chat(user, SPAN_NOTICE("You remove [input_container] from the [src].")) user.put_in_active_hand(input_container) input_container = null icon_state = "centrifuge_empty_open" diff --git a/code/modules/reagents/chemistry_machinery/chem_simulator.dm b/code/modules/reagents/chemistry_machinery/chem_simulator.dm index 1debbc56b495..8dc34f208549 100644 --- a/code/modules/reagents/chemistry_machinery/chem_simulator.dm +++ b/code/modules/reagents/chemistry_machinery/chem_simulator.dm @@ -13,7 +13,7 @@ #define SIMULATION_STAGE_BEGIN 6 /obj/structure/machinery/chem_simulator - name = "Synthesis Simulator" + name = "synthesis simulator" desc = "This computer uses advanced algorithms to perform simulations of reagent properties, for the purpose of calculating the synthesis required to make a new variant." icon = 'icons/obj/structures/machinery/science_machines_64x32.dmi' icon_state = "modifier" @@ -87,10 +87,10 @@ to_chat(user, SPAN_WARNING("Chemical data already inserted.")) return else - to_chat(user, SPAN_WARNING("The [src] refuses the [B].")) + to_chat(user, SPAN_WARNING("[src] refuses [B].")) return user.drop_inv_item_to_loc(B, src) - to_chat(user, SPAN_NOTICE("You insert [B] into the [src].")) + to_chat(user, SPAN_NOTICE("You insert [B] into [src].")) flick("[icon_state]_reading",src) update_costs() SSnano.nanomanager.update_uis(src) // update all UIs attached to src diff --git a/code/modules/reagents/chemistry_machinery/reagent_analyzer.dm b/code/modules/reagents/chemistry_machinery/reagent_analyzer.dm index de059de46436..e0d0a80cadc2 100644 --- a/code/modules/reagents/chemistry_machinery/reagent_analyzer.dm +++ b/code/modules/reagents/chemistry_machinery/reagent_analyzer.dm @@ -13,19 +13,19 @@ /obj/structure/machinery/reagent_analyzer/attackby(obj/item/B, mob/living/user) if(processing) - to_chat(user, SPAN_WARNING("The [src] is still processing!")) + to_chat(user, SPAN_WARNING("[src] is still processing!")) return if(!skillcheck(usr, SKILL_RESEARCH, SKILL_RESEARCH_TRAINED)) to_chat(user, SPAN_WARNING("You have no idea how to use this.")) return if(istype(B, /obj/item/reagent_container/glass/beaker/vial)) if(sample || status) - to_chat(user, SPAN_WARNING("Something is already loaded into the [src].")) + to_chat(user, SPAN_WARNING("Something is already loaded into [src].")) return if(user.drop_inv_item_to_loc(B, src)) sample = B icon_state = "reagent_analyzer_sample" - to_chat(user, SPAN_NOTICE("You insert [B] and start configuring the [src].")) + to_chat(user, SPAN_NOTICE("You insert [B] and start configuring [src].")) updateUsrDialog() if(!do_after(user, 1 SECONDS, INTERRUPT_ALL, BUSY_ICON_GENERIC)) return @@ -72,12 +72,12 @@ /obj/structure/machinery/reagent_analyzer/attack_hand(mob/user as mob) if(processing) - to_chat(user, SPAN_WARNING("The [src] is still processing!")) + to_chat(user, SPAN_WARNING("[src] is still processing!")) return if(!sample) - to_chat(user, SPAN_WARNING("The [src] is empty.")) + to_chat(user, SPAN_WARNING("[src] is empty.")) return - to_chat(user, SPAN_NOTICE("You remove the [sample] from the [src].")) + to_chat(user, SPAN_NOTICE("You remove [sample] from [src].")) user.put_in_active_hand(sample) sample = null icon_state = "reagent_analyzer" diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 1522f0100c4e..88efcf7a37ba 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -195,7 +195,7 @@ return FALSE //Need a firm grip to put someone else in there. if(!istype(target) || target.anchored || target.buckled || get_dist(user, src) > 1 || user.is_mob_incapacitated(TRUE) || isRemoteControlling(user) || target.mob_size >= MOB_SIZE_BIG) - to_chat(user, SPAN_WARNING("You cannot get into the [src]!")) + to_chat(user, SPAN_WARNING("You cannot get into [src]!")) return FALSE add_fingerprint(user) var/target_loc = target.loc diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm index 3d0c8fca142d..79377d9c0849 100644 --- a/code/modules/shuttle/computer.dm +++ b/code/modules/shuttle/computer.dm @@ -281,6 +281,8 @@ icon_state = "terminal" req_access = list() breakable = FALSE + ///If true, the lifeboat is in the process of launching, and so the code will not allow another launch. + var/launch_initiated = FALSE /obj/structure/machinery/computer/shuttle/lifeboat/attack_hand(mob/user) . = ..() @@ -293,23 +295,43 @@ switch(lifeboat.mode) if(SHUTTLE_IDLE) if(!istype(user, /mob/living/carbon/human)) - to_chat(user, SPAN_NOTICE("[src]'s screen says \"Awaiting confirmation of the evacuation order\".")) + to_chat(user, SPAN_NOTICE("[src]'s screen says \"Unauthorized access. Please inform your supervisor\".")) return var/mob/living/carbon/human/human_user = user - if(!(ACCESS_MARINE_COMMAND in human_user.wear_id?.access)) - to_chat(user, SPAN_NOTICE("[src]'s screen says \"Awaiting confirmation of the evacuation order\".")) + if(!(ACCESS_MARINE_SENIOR in human_user.wear_id?.access) && !(ACCESS_MARINE_DROPSHIP in human_user.wear_id?.access)) + to_chat(user, SPAN_NOTICE("[src]'s screen says \"Unauthorized access. Please inform your supervisor\".")) return if(SShijack.current_progress < SShijack.early_launch_required_progress) to_chat(user, SPAN_NOTICE("[src]'s screen says \"Unable to launch, fuel insufficient\".")) return - if(tgui_alert(user, "Early launch the lifeboat?", "Confirm", list("Yes", "No"), 10 SECONDS) == "Yes") - to_chat(user, SPAN_NOTICE("[src]'s screen blinks and says \"Early launch accepted\".")) - lifeboat.evac_launch() + if(launch_initiated) + to_chat(user, SPAN_NOTICE("[src]'s screen blinks and says \"Launch sequence already initiated\".")) return + var/response = tgui_alert(user, "Launch the lifeboat?", "Confirm", list("Yes", "No", "Emergency Launch"), 10 SECONDS) + if(launch_initiated) + to_chat(user, SPAN_NOTICE("[src]'s screen blinks and says \"Launch sequence already initiated\".")) + return + switch(response) + if ("Yes") + launch_initiated = TRUE + to_chat(user, "[src]'s screen blinks and says \"Launch command accepted\".") + shipwide_ai_announcement("Launch command received. [lifeboat.id == MOBILE_SHUTTLE_LIFEBOAT_PORT ? "Port" : "Starboard"] Lifeboat doors will close in 10 seconds.") + addtimer(CALLBACK(lifeboat, TYPE_PROC_REF(/obj/docking_port/mobile/crashable/lifeboat, evac_launch)), 10 SECONDS) + lifeboat.alarm_sound_loop.start() + lifeboat.playing_launch_announcement_alarm = TRUE + return + + if ("Emergency Launch") + launch_initiated = TRUE + to_chat(user, "[src]'s screen blinks and says \"Emergency Launch command accepted\".") + lifeboat.evac_launch() + shipwide_ai_announcement("Emergency Launch command received. Launching [lifeboat.id == MOBILE_SHUTTLE_LIFEBOAT_PORT ? "Port" : "Starboard"] Lifeboat.") + return + if(SHUTTLE_IGNITING) to_chat(user, SPAN_NOTICE("[src]'s screen says \"Engines firing\".")) if(SHUTTLE_CALL) @@ -321,14 +343,23 @@ if(lifeboat.status == LIFEBOAT_LOCKED) to_chat(xeno, SPAN_WARNING("We already wrested away control of this metal bird.")) return XENO_NO_DELAY_ACTION + if(lifeboat.mode == SHUTTLE_CALL) + to_chat(xeno, SPAN_WARNING("Too late, you cannot stop the metal bird mid-flight.")) + return XENO_NO_DELAY_ACTION xeno_attack_delay(xeno) if(do_after(usr, 5 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE)) - if(lifeboat.status != LIFEBOAT_LOCKED) - lifeboat.status = LIFEBOAT_LOCKED - lifeboat.available = FALSE - lifeboat.set_mode(SHUTTLE_IDLE) - xeno_message(SPAN_XENOANNOUNCE("We have wrested away control of one of the metal birds! They shall not escape!"), 3, xeno.hivenumber) + if(lifeboat.status == LIFEBOAT_LOCKED) + return XENO_NO_DELAY_ACTION + if(lifeboat.mode == SHUTTLE_CALL) + to_chat(xeno, SPAN_WARNING("Too late, you cannot stop the metal bird mid-flight.")) + return XENO_NO_DELAY_ACTION + lifeboat.status = LIFEBOAT_LOCKED + lifeboat.available = FALSE + lifeboat.set_mode(SHUTTLE_IDLE) + var/obj/docking_port/stationary/lifeboat_dock/lifeboat_dock = lifeboat.get_docked() + lifeboat_dock.open_dock() + xeno_message(SPAN_XENOANNOUNCE("We have wrested away control of one of the metal birds! They shall not escape!"), 3, xeno.hivenumber) return XENO_NO_DELAY_ACTION else return ..() diff --git a/code/modules/shuttle/computers/dropship_computer.dm b/code/modules/shuttle/computers/dropship_computer.dm index 6774d81e590d..67d3a20d969e 100644 --- a/code/modules/shuttle/computers/dropship_computer.dm +++ b/code/modules/shuttle/computers/dropship_computer.dm @@ -7,6 +7,7 @@ unacidable = TRUE exproof = TRUE needs_power = FALSE + var/override_being_removed = FALSE // Admin disabled var/disabled = FALSE @@ -143,15 +144,31 @@ to_chat(user, SPAN_NOTICE("\The [src] is not responsive")) return - if(dropship_control_lost && skillcheck(user, SKILL_PILOT, SKILL_PILOT_EXPERT)) + if(dropship_control_lost) var/remaining_time = timeleft(door_control_cooldown) / 10 - if(remaining_time > 60) - to_chat(user, SPAN_WARNING("The shuttle is not responding, try again in [remaining_time] seconds.")) + to_chat(user, SPAN_WARNING("The shuttle is not responding due to an unauthorized access attempt. In large text it says the lockout will be automatically removed in [remaining_time] seconds.")) + if(!skillcheck(user, SKILL_PILOT, SKILL_PILOT_EXPERT)) return - to_chat(user, SPAN_NOTICE("You start to remove the Queens override.")) - if(!do_after(user, 3 MINUTES, INTERRUPT_ALL, BUSY_ICON_HOSTILE)) - to_chat(user, SPAN_WARNING("You fail to remove the Queens override")) + if(user.action_busy || override_being_removed) return + to_chat(user, SPAN_NOTICE("You start to remove the lockout.")) + override_being_removed = TRUE + while(remaining_time > 20) + if(!do_after(user, 20 SECONDS, INTERRUPT_ALL|INTERRUPT_CHANGED_LYING, BUSY_ICON_HOSTILE, numticks = 20)) + to_chat(user, SPAN_WARNING("You fail to remove the lockout!")) + override_being_removed = FALSE + return + if(!dropship_control_lost) + to_chat(user, SPAN_NOTICE("The lockout is already removed.")) + break + remaining_time = timeleft(door_control_cooldown) / 10 - 20 + if(remaining_time > 0) + to_chat(user, SPAN_NOTICE("You partially bypass the lockout, only [remaining_time] seconds left.")) + door_control_cooldown = addtimer(CALLBACK(src, PROC_REF(remove_door_lock)), remaining_time SECONDS, TIMER_STOPPABLE|TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_NO_HASH_WAIT) + override_being_removed = FALSE + if(dropship_control_lost) + remove_door_lock() + to_chat(user, SPAN_NOTICE("You succesfully removed the lockout!")) playsound(loc, 'sound/machines/terminal_success.ogg', KEYBOARD_SOUND_VOLUME, 1) if(!shuttle.is_hijacked) @@ -216,7 +233,7 @@ if(!dropship_control_lost) dropship.control_doors("unlock", "all", TRUE) dropship_control_lost = TRUE - door_control_cooldown = addtimer(CALLBACK(src, PROC_REF(remove_door_lock)), SHUTTLE_LOCK_COOLDOWN, TIMER_STOPPABLE) + door_control_cooldown = addtimer(CALLBACK(src, PROC_REF(remove_door_lock)), SHUTTLE_LOCK_COOLDOWN, TIMER_STOPPABLE|TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_NO_HASH_WAIT) if(GLOB.almayer_orbital_cannon) GLOB.almayer_orbital_cannon.is_disabled = TRUE addtimer(CALLBACK(GLOB.almayer_orbital_cannon, TYPE_PROC_REF(/obj/structure/orbital_cannon, enable)), 10 MINUTES, TIMER_UNIQUE) @@ -299,6 +316,7 @@ playsound(loc, 'sound/machines/terminal_success.ogg', KEYBOARD_SOUND_VOLUME, 1) dropship_control_lost = FALSE if(door_control_cooldown) + deltimer(door_control_cooldown) door_control_cooldown = null /obj/structure/machinery/computer/shuttle/dropship/flight/ui_data(mob/user) diff --git a/code/modules/shuttle/shuttles/crashable/lifeboats.dm b/code/modules/shuttle/shuttles/crashable/lifeboats.dm index 11b376563d64..415a628be6e5 100644 --- a/code/modules/shuttle/shuttles/crashable/lifeboats.dm +++ b/code/modules/shuttle/shuttles/crashable/lifeboats.dm @@ -47,6 +47,8 @@ set_mode(SHUTTLE_IGNITING) on_ignition() setTimer(ignitionTime) + alarm_sound_loop.stop() + playing_launch_announcement_alarm = FALSE /obj/docking_port/mobile/crashable/lifeboat/crash_check() . = ..() @@ -100,6 +102,8 @@ /obj/docking_port/stationary/lifeboat_dock/proc/close_dock() var/obj/docking_port/mobile/crashable/lifeboat/docked_shuttle = get_docked() + if(docked_shuttle.status == LIFEBOAT_LOCKED) + return if(docked_shuttle) for(var/obj/structure/machinery/door/airlock/multi_tile/door in docked_shuttle.doors) INVOKE_ASYNC(door, TYPE_PROC_REF(/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat, close_and_lock)) diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 96cc72970f3b..7fe9d04c91b2 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -79,15 +79,15 @@ GLOBAL_LIST_EMPTY(shuttle_controls) if(!isxeno(user) && (onboard || is_ground_level(z)) && !shuttle.iselevator) if(shuttle.queen_locked) if(onboard && skillcheck(user, SKILL_PILOT, SKILL_PILOT_TRAINED)) - user.visible_message(SPAN_NOTICE("[user] starts to type on the [src]."), - SPAN_NOTICE("You try to take back the control over the shuttle. It will take around 3 minutes.")) + user.visible_message(SPAN_NOTICE("[user] starts to type on [src]."), + SPAN_NOTICE("You try to take back the control over the shuttle. It will take around 3 minutes.")) if(do_after(user, 3 MINUTES, INTERRUPT_ALL, BUSY_ICON_FRIENDLY)) shuttle.last_locked = world.time shuttle.queen_locked = 0 shuttle.last_door_override = world.time shuttle.door_override = 0 - user.visible_message(SPAN_NOTICE("The [src] blinks with blue lights."), - SPAN_NOTICE("You have successfully taken back the control over the dropship.")) + user.visible_message(SPAN_NOTICE("[src] blinks with blue lights."), + SPAN_NOTICE("You have successfully taken back the control over the dropship.")) ui_interact(user) return else @@ -106,13 +106,13 @@ GLOBAL_LIST_EMPTY(shuttle_controls) shuttle.door_override = 0 if(link && !shuttle.linked) - user.visible_message(SPAN_NOTICE("The [src] blinks with blue lights."), - SPAN_NOTICE("Transport link activated.")) + user.visible_message(SPAN_NOTICE("[src] blinks with blue lights."), + SPAN_NOTICE("Transport link activated.")) shuttle.linked = TRUE if(shuttle.require_link && !shuttle.linked) - user.visible_message(SPAN_NOTICE("The [src] blinks with red lights."), - SPAN_WARNING("Transport terminal unlinked. Manual activation required.")) + user.visible_message(SPAN_NOTICE("[src] blinks with red lights."), + SPAN_WARNING("Transport terminal unlinked. Manual activation required.")) return ui_interact(user) @@ -329,7 +329,7 @@ GLOBAL_LIST_EMPTY(shuttle_controls) shuttle.launch(src) if(onboard && !shuttle.iselevator) M.count_niche_stat(STATISTICS_NICHE_FLIGHT) - msg_admin_niche("[M] ([M.key]) launched a [shuttle.iselevator? "elevator" : "shuttle"] using [src].") + msg_admin_niche("[M] ([M.key]) launched \a [shuttle.iselevator? "elevator" : "shuttle"] using [src].") ui_interact(usr) diff --git a/code/modules/tents/deployed_tents.dm b/code/modules/tents/deployed_tents.dm index 9ea06e357d9e..5f74337f9973 100644 --- a/code/modules/tents/deployed_tents.dm +++ b/code/modules/tents/deployed_tents.dm @@ -93,7 +93,7 @@ SPAN_DANGER("You [M.slash_verb] [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT) if(health <= 0) - visible_message(SPAN_BOLDWARNING("The [src] collapses!")) + visible_message(SPAN_BOLDWARNING("[src] collapses!")) qdel(src) return XENO_ATTACK_ACTION @@ -102,13 +102,13 @@ var/obj/item/tool/shovel/shovel = item if(!istype(shovel) || shovel.folded || user.action_busy) return - visible_message(SPAN_HIGHDANGER("[user] is trying to tear down the [src]")) + visible_message(SPAN_HIGHDANGER("[user] is trying to tear down [src]")) playsound(src, 'sound/items/paper_ripped.ogg', 25, 1) if(!do_after(user, 150, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE, src) || QDELETED(src)) return - visible_message(SPAN_HIGHDANGER("[user] tears down the [src]")) + visible_message(SPAN_HIGHDANGER("[user] tears down [src]")) playsound(src, 'sound/items/paper_ripped.ogg', 25, 1) qdel(src) diff --git a/code/modules/tents/folded_tents.dm b/code/modules/tents/folded_tents.dm index 2bed879a0a99..fe1a748b750d 100644 --- a/code/modules/tents/folded_tents.dm +++ b/code/modules/tents/folded_tents.dm @@ -1,5 +1,5 @@ /obj/item/folded_tent - name = "Folded Abstract Tent" + name = "folded abstract tent" icon = 'icons/obj/structures/tents_folded.dmi' icon_state = "tent" w_class = SIZE_LARGE @@ -48,14 +48,14 @@ return FALSE if(turf.density) if(message_receiver) - to_chat(message_receiver, SPAN_WARNING("You cannot deploy the [src] here, something ([turf]) is in the way.")) + to_chat(message_receiver, SPAN_WARNING("You cannot deploy [src] here, something ([turf]) is in the way.")) if(display_error) new /obj/effect/overlay/temp/tent_deployment_area/error(turf) return FALSE for(var/atom/movable/atom as anything in turf) if(isliving(atom) || (atom.density && atom.can_block_movement) || istype(atom, /obj/structure/tent)) if(message_receiver) - to_chat(message_receiver, SPAN_WARNING("You cannot deploy the [src] here, something ([atom.name]) is in the way.")) + to_chat(message_receiver, SPAN_WARNING("You cannot deploy [src] here, something ([atom.name]) is in the way.")) if(display_error) new /obj/effect/overlay/temp/tent_deployment_area/error(turf) return FALSE @@ -108,8 +108,8 @@ for(var/turf/turf in deployment_area) turf_overlay += new /obj/effect/overlay/temp/tent_deployment_area/casting(turf) - user.visible_message(SPAN_INFO("[user] starts deploying the [src]..."), \ - SPAN_WARNING("You start assembling the [src]... Stand still, it might take a bit to figure it out...")) + user.visible_message(SPAN_INFO("[user] starts deploying [src]..."), \ + SPAN_WARNING("You start assembling [src]... Stand still, it might take a bit to figure it out...")) if(!do_after(user, 6 SECONDS, INTERRUPT_ALL, BUSY_ICON_BUILD)) to_chat(user, SPAN_WARNING("You were interrupted!")) for(var/gfx in turf_overlay) @@ -122,7 +122,7 @@ return unfold(user, deploy_turf) - user.visible_message(SPAN_INFO("[user] finishes deploying the [src]!"), SPAN_INFO("You finish deploying the [src]!")) + user.visible_message(SPAN_INFO("[user] finishes deploying [src]!"), SPAN_INFO("You finish deploying [src]!")) for(var/gfx in turf_overlay) qdel(gfx) qdel(src) // Success! diff --git a/code/modules/vehicles/hardpoints/hardpoint.dm b/code/modules/vehicles/hardpoints/hardpoint.dm index 5963b0b4e36b..acdefca18fd2 100644 --- a/code/modules/vehicles/hardpoints/hardpoint.dm +++ b/code/modules/vehicles/hardpoints/hardpoint.dm @@ -1,22 +1,20 @@ -/* - Hardpoints are any items that attach to a base vehicle, such as wheels/treads, support systems and guns -*/ - +/** + * Hardpoints are any items that attach to a base vehicle, such as wheels/treads, support systems and guns + */ /obj/item/hardpoint //------MAIN VARS---------- - // Which slot is this hardpoint in - // Purely to check for conflicting hardpoints + /// Which slot is this hardpoint in. Purely to check for conflicting hardpoints. var/slot - // The vehicle this hardpoint is installed on + /// The vehicle this hardpoint is installed on. var/obj/vehicle/multitile/owner health = 100 w_class = SIZE_LARGE - // Determines how much of any incoming damage is actually taken + /// Determines how much of any incoming damage is actually taken. var/damage_multiplier = 1 - // Origin coords of the hardpoint relative to the vehicle + /// Origin coords of the hardpoint relative to the vehicle. var/list/origins = list(0, 0) var/list/buff_multipliers @@ -32,13 +30,13 @@ var/disp_icon //This also differentiates tank vs apc vs other var/disp_icon_state - // List of pixel offsets for each direction + /// List of pixel offsets for each direction. var/list/px_offsets - //visual layer of hardpoint when on vehicle + /// Visual layer of hardpoint when on vehicle. var/hdpt_layer = HDPT_LAYER_WHEELS - // List of offsets for where to place the muzzle flash for each direction + /// List of offsets for where to place the muzzle flash for each direction. var/list/muzzle_flash_pos = list( "1" = list(0, 0), "2" = list(0, 0), @@ -54,33 +52,23 @@ var/const_mz_offset_y = 0 //------SOUNDS VARS---------- - // Sounds to play when the module activated/fired + /// Sounds to play when the module activated/fired. var/list/activation_sounds //------INTERACTION VARS---------- - //which seat can use this module + /// Which seat can use this module. var/allowed_seat = VEHICLE_GUNNER - //Cooldown on use of the hardpoint - var/cooldown = 100 - var/next_use = 0 - - //whether hardpoint has activatable ability like shooting or zooming + /// Whether hardpoint has activatable ability like shooting or zooming. var/activatable = 0 - //used to prevent welder click spam + /// Used to prevent welder click spam. var/being_repaired = FALSE - //current user. We can have only one user at a time. Better never change that - var/user - - //Accuracy of the hardpoint. (which is, in fact, a scatter. Need to change this system) - var/accuracy = 1 - - // The firing arc of this hardpoint + /// The firing arc of this hardpoint. var/firing_arc = 0 //in degrees. 0 skips whole arc of fire check // Muzzleflash @@ -91,17 +79,53 @@ //------AMMUNITION VARS---------- - //Currently loaded ammo that we shoot from + /// Currently loaded ammo that we shoot from. var/obj/item/ammo_magazine/hardpoint/ammo - //spare magazines that we can reload from + /// Spare magazines that we can reload from. var/list/backup_clips - //maximum amount of spare mags + /// Maximum amount of spare mags. var/max_clips = 0 /// An assoc list in the format list(/datum/element/bullet_trait_to_give = list(...args)) - /// that will be given to a projectile fired from the hardpoint + /// that will be given to a projectile fired from the hardpoint. var/list/list/traits_to_give + /// How much the bullet scatters when fired, in degrees. + var/scatter = 0 + /// How many bullets the gun fired while burst firing/auto firing. + var/shots_fired = 0 + /// Delay before a new firing sequence can start. + COOLDOWN_DECLARE(fire_cooldown) + + // Firemodes. + /// Current selected firemode of the gun. + var/gun_firemode = GUN_FIREMODE_SEMIAUTO + /// List of allowed firemodes. + var/list/gun_firemode_list = list( + GUN_FIREMODE_SEMIAUTO, + ) + + // Semi-auto and full-auto. + /// For regular shots, how long to wait before firing again. Use modify_fire_delay and set_fire_delay instead of modifying this on the fly + var/fire_delay = 0 + /// The multiplier for how much slower this should fire in automatic mode. 1 is normal, 1.2 is 20% slower, 2 is 100% slower, etc. Protected due to it never needing to be edited. + var/autofire_slow_mult = 1 + /// If the gun is currently auto firing. + var/auto_firing = FALSE + + // Burst fire. + /// How many shots can the weapon shoot in burst? Anything less than 2 and you cannot toggle burst. Use modify_burst_amount and set_burst_amount instead of modifying this + var/burst_amount = 1 + /// The delay in between shots. Lower = less delay = faster. Use modify_burst_delay and set_burst_delay instead of modifying this + var/burst_delay = 1 + /// When burst-firing, this number is extra time before the weapon can fire again. + var/extra_delay = 0 + /// If the gun is currently burst firing. + var/burst_firing = FALSE + + /// Currently selected target to fire at. Set with set_target(). + var/atom/target + //----------------------------- //------GENERAL PROCS---------- //----------------------------- @@ -109,6 +133,7 @@ /obj/item/hardpoint/Initialize() . = ..() set_bullet_traits() + AddComponent(/datum/component/automatedfire/autofire, fire_delay, burst_delay, burst_amount, gun_firemode, autofire_slow_mult, CALLBACK(src, PROC_REF(set_burst_firing)), CALLBACK(src, PROC_REF(reset_fire)), CALLBACK(src, PROC_REF(fire_wrapper)), callback_set_firing = CALLBACK(src, PROC_REF(set_auto_firing))) /obj/item/hardpoint/Destroy() if(owner) @@ -117,7 +142,7 @@ owner = null QDEL_NULL_LIST(backup_clips) QDEL_NULL(ammo) - + set_target(null) return ..() /obj/item/hardpoint/ex_act(severity) @@ -166,37 +191,64 @@ /obj/item/hardpoint/proc/get_integrity_percent() return 100.0*health/initial(health) -/obj/item/hardpoint/proc/on_install(obj/vehicle/multitile/V) - apply_buff(V) - return +/// Apply hardpoint effects to vehicle and self. +/obj/item/hardpoint/proc/on_install(obj/vehicle/multitile/vehicle) + if(!vehicle) //in loose holder + return + RegisterSignal(vehicle, COMSIG_GUN_RECALCULATE_ATTACHMENT_BONUSES, PROC_REF(recalculate_hardpoint_bonuses)) + apply_buff(vehicle) -/obj/item/hardpoint/proc/on_uninstall(obj/vehicle/multitile/V) - remove_buff(V) - return +/// Remove hardpoint effects from vehicle and self. +/obj/item/hardpoint/proc/on_uninstall(obj/vehicle/multitile/vehicle) + if(!vehicle) //in loose holder + return + UnregisterSignal(vehicle, COMSIG_GUN_RECALCULATE_ATTACHMENT_BONUSES) + remove_buff(vehicle) + //resetting values like set_gun_config_values() would be tidy, but unnecessary as it gets recalc'd on install anyway -//applying passive buffs like damage type resistance, speed, accuracy, cooldowns -/obj/item/hardpoint/proc/apply_buff(obj/vehicle/multitile/V) +/// Applying passive buffs like damage type resistance, speed, accuracy, cooldowns. +/obj/item/hardpoint/proc/apply_buff(obj/vehicle/multitile/vehicle) if(buff_applied) return if(LAZYLEN(type_multipliers)) for(var/type in type_multipliers) - V.dmg_multipliers[type] *= LAZYACCESS(type_multipliers, type) + vehicle.dmg_multipliers[type] *= LAZYACCESS(type_multipliers, type) if(LAZYLEN(buff_multipliers)) for(var/type in buff_multipliers) - V.misc_multipliers[type] *= LAZYACCESS(buff_multipliers, type) + vehicle.misc_multipliers[type] *= LAZYACCESS(buff_multipliers, type) buff_applied = TRUE + SEND_SIGNAL(vehicle, COMSIG_GUN_RECALCULATE_ATTACHMENT_BONUSES) -//removing buffs -/obj/item/hardpoint/proc/remove_buff(obj/vehicle/multitile/V) +/// Removing passive buffs like damage type resistance, speed, accuracy, cooldowns. +/obj/item/hardpoint/proc/remove_buff(obj/vehicle/multitile/vehicle) if(!buff_applied) return if(LAZYLEN(type_multipliers)) for(var/type in type_multipliers) - V.dmg_multipliers[type] *= 1 / LAZYACCESS(type_multipliers, type) + vehicle.dmg_multipliers[type] *= 1 / LAZYACCESS(type_multipliers, type) if(LAZYLEN(buff_multipliers)) for(var/type in buff_multipliers) - V.misc_multipliers[type] *= 1 / LAZYACCESS(buff_multipliers, type) + vehicle.misc_multipliers[type] *= 1 / LAZYACCESS(buff_multipliers, type) buff_applied = FALSE + SEND_SIGNAL(vehicle, COMSIG_GUN_RECALCULATE_ATTACHMENT_BONUSES) + +/// Recalculates hardpoint values based on vehicle modifiers. +/obj/item/hardpoint/proc/recalculate_hardpoint_bonuses() + scatter = initial(scatter) / owner.misc_multipliers["accuracy"] + var/cooldown_mult = owner.misc_multipliers["cooldown"] + set_fire_delay(initial(fire_delay) * cooldown_mult) + set_burst_delay(initial(burst_delay) * cooldown_mult) + extra_delay = initial(extra_delay) * cooldown_mult + +/// Setter for fire_delay. +/obj/item/hardpoint/proc/set_fire_delay(value) + fire_delay = value + SEND_SIGNAL(src, COMSIG_GUN_AUTOFIREDELAY_MODIFIED, fire_delay) + +/// Setter for burst_delay. +/obj/item/hardpoint/proc/set_burst_delay(value) + burst_delay = value + SEND_SIGNAL(src, COMSIG_GUN_BURST_SHOT_DELAY_MODIFIED, burst_delay) //this proc called on each move of vehicle /obj/item/hardpoint/proc/on_move(turf/old, turf/new_turf, move_dir) @@ -253,13 +305,12 @@ return data -// Traces backwards from the gun origin to the vehicle to check for obstacles between the vehicle and the muzzle -/obj/item/hardpoint/proc/clear_los(atom/A) - +/// Traces backwards from the gun origin to the vehicle to check for obstacles between the vehicle and the muzzle. +/obj/item/hardpoint/proc/clear_los() if(origins[1] == 0 && origins[2] == 0) //skipping check for modules we don't need this return TRUE - var/turf/muzzle_turf = locate(owner.x + origins[1], owner.y + origins[2], owner.z) + var/turf/muzzle_turf = get_origin_turf() var/turf/checking_turf = muzzle_turf while(!(owner in checking_turf)) @@ -268,24 +319,24 @@ return FALSE // Ensure that we can pass over all objects in the turf - for(var/obj/O in checking_turf) + for(var/obj/object in checking_turf) // Since vehicles are multitile the - if(O == owner) + if(object == owner) continue // Non-dense objects are irrelevant - if(!O.density) + if(!object.density) continue // Make sure we can pass object from all directions - if(!(O.pass_flags.flags_can_pass_all & PASS_OVER_THROW_ITEM)) - if(!(O.flags_atom & ON_BORDER)) + if(!HAS_FLAG(object.pass_flags.flags_can_pass_all, PASS_OVER_THROW_ITEM)) + if(!HAS_FLAG(object.flags_atom, ON_BORDER)) return FALSE //If we're behind the object, check the behind pass flags - else if(dir == O.dir && !(O.pass_flags.flags_can_pass_behind & PASS_OVER_THROW_ITEM)) + else if(dir == object.dir && !HAS_FLAG(object.pass_flags.flags_can_pass_behind, PASS_OVER_THROW_ITEM)) return FALSE //If we're in front, check front pass flags - else if(dir == turn(O.dir, 180) && !(O.pass_flags.flags_can_pass_front & PASS_OVER_THROW_ITEM)) + else if(dir == turn(object.dir, 180) && !HAS_FLAG(object.pass_flags.flags_can_pass_front, PASS_OVER_THROW_ITEM)) return FALSE // Trace back towards the vehicle @@ -297,47 +348,6 @@ //------INTERACTION PROCS---------- //----------------------------- -//If the hardpoint can be activated by current user -/obj/item/hardpoint/proc/can_activate(mob/user, atom/A) - if(!owner) - return - - var/seat = owner.get_mob_seat(user) - if(!seat) - return - - if(seat != allowed_seat) - to_chat(user, SPAN_WARNING("Only [allowed_seat] can use [name].")) - return - - if(health <= 0) - to_chat(user, SPAN_WARNING("\The [name] is broken!")) - return FALSE - - if(world.time < next_use) - if(cooldown >= 20) //filter out guns with high firerate to prevent message spam. - to_chat(user, SPAN_WARNING("You need to wait [SPAN_HELPFUL((next_use - world.time) / 10)] seconds before [name] can be used again.")) - return FALSE - - if(ammo && ammo.current_rounds <= 0) - to_chat(user, SPAN_WARNING("\The [name] is out of ammo! Magazines: [SPAN_HELPFUL(LAZYLEN(backup_clips))]/[SPAN_HELPFUL(max_clips)]")) - return FALSE - - if(!in_firing_arc(A)) - to_chat(user, SPAN_WARNING("The target is not within your firing arc!")) - return FALSE - - if(!clear_los(A)) - to_chat(user, SPAN_WARNING("You don't have a clear line of sight to the target!")) - return FALSE - - return TRUE - -//Called when you want to activate the hardpoint, by default firing a gun -//This can also be used for some type of temporary buff or toggling mode, up to you -/obj/item/hardpoint/proc/activate(mob/user, atom/A) - fire(user, A) - /obj/item/hardpoint/proc/deactivate() return @@ -490,76 +500,201 @@ user.visible_message(SPAN_NOTICE("[user] stops repairing \the [name]."), SPAN_NOTICE("You stop repairing \the [name]. The integrity of the module is at [SPAN_HELPFUL(round(get_integrity_percent()))]%.")) return -//determines whether something is in firing arc of a hardpoint -/obj/item/hardpoint/proc/in_firing_arc(atom/A) - if(!owner) - return FALSE +/// Setter proc for the automatic firing flag. +/obj/item/hardpoint/proc/set_auto_firing(auto = FALSE) + if(auto_firing != auto) + auto_firing = auto + if(!auto_firing) //end-of-fire, show changed ammo + display_ammo() + +/// Setter proc for the burst firing flag. +/obj/item/hardpoint/proc/set_burst_firing(burst = FALSE) + if(burst_firing != burst) + burst_firing = burst + if(!burst_firing) //end-of-fire, show changed ammo + display_ammo() + +/// Clean all firing references. +/obj/item/hardpoint/proc/reset_fire() + shots_fired = 0 + set_target(null) + set_auto_firing(FALSE) //on abnormal exits automatic fire doesn't call set_auto_firing() + +/// Set the target and take care of hard delete. +/obj/item/hardpoint/proc/set_target(atom/object) + if(object == target || object == loc) + return + if(target) + UnregisterSignal(target, COMSIG_PARENT_QDELETING) + target = object + if(target) + RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(clean_target)) + +/// Set the target to its turf, so we keep shooting even when it was qdeled. +/obj/item/hardpoint/proc/clean_target() + SIGNAL_HANDLER + target = get_turf(target) + +/// Print how much ammo is left to chat. +/obj/item/hardpoint/proc/display_ammo(mob/user) + if(!user) + user = owner.get_seat_mob(allowed_seat) + if(!user) + return - if(!firing_arc) - return TRUE + if(ammo) + to_chat(user, SPAN_WARNING("[name] Ammo: [SPAN_HELPFUL(ammo ? ammo.current_rounds : 0)]/[SPAN_HELPFUL(ammo ? ammo.max_rounds : 0)] | Mags: [SPAN_HELPFUL(LAZYLEN(backup_clips))]/[SPAN_HELPFUL(max_clips)]")) - var/turf/T = get_turf(A) - if(!T) - return FALSE +/// Reset variables used in firing and remove the gun from the autofire system. +/obj/item/hardpoint/proc/stop_fire(datum/source, atom/object, turf/location, control, params) + SEND_SIGNAL(src, COMSIG_GUN_STOP_FIRE) + if(auto_firing) + reset_fire() //automatic fire doesn't reset itself from COMSIG_GUN_STOP_FIRE - var/dx = T.x - (owner.x + origins[1]/2) - var/dy = T.y - (owner.y + origins[2]/2) - - var/deg = 0 - switch(dir) - if(EAST) - deg = 0 - if(NORTH) - deg = -90 - if(WEST) - deg = 180 - if(SOUTH) - deg = 90 - - var/nx = dx * cos(deg) - dy * sin(deg) - var/ny = dx * sin(deg) + dy * cos(deg) - if(nx == 0) - return firing_arc >= 90 - - var/angle = arctan(ny/nx) - if(nx < 0) - angle += 180 - - return abs(angle) <= (firing_arc/2) - -//doing last preparation before actually firing gun -/obj/item/hardpoint/proc/fire(mob/user, atom/A) - if(!ammo) //Prevents a runtime +/// Update the target if you dragged your mouse. +/obj/item/hardpoint/proc/change_target(datum/source, atom/src_object, atom/over_object, turf/src_location, turf/over_location, src_control, over_control, params) + set_target(get_turf_on_clickcatcher(over_object, source, params)) + +/// Check if the gun can fire and add it to bucket autofire system if needed, or just fire the gun if not. +/obj/item/hardpoint/proc/start_fire(datum/source, atom/object, turf/location, control, params) + if(istype(object, /atom/movable/screen)) return - if(ammo.current_rounds <= 0) + + if(QDELETED(object)) return - next_use = world.time + cooldown * owner.misc_multipliers["cooldown"] - if(!prob((accuracy * 100) / owner.misc_multipliers["accuracy"])) - A = get_step(get_turf(A), pick(GLOB.cardinals)) + if(!auto_firing && !burst_firing && !COOLDOWN_FINISHED(src, fire_cooldown)) + if(max(fire_delay, burst_delay + extra_delay) >= 2.0 SECONDS) //filter out guns with high firerate to prevent message spam. + to_chat(source, SPAN_WARNING("You need to wait [SPAN_HELPFUL(COOLDOWN_SECONDSLEFT(src, fire_cooldown))] seconds before [name] can be used again.")) + return - if(LAZYLEN(activation_sounds)) - playsound(get_turf(src), pick(activation_sounds), 60, 1) + set_target(get_turf_on_clickcatcher(object, source, params)) - fire_projectile(user, A) + if(gun_firemode == GUN_FIREMODE_SEMIAUTO) + var/fire_return = try_fire(object, source, params) + //end-of-fire, show ammo (if changed) + if(fire_return == AUTOFIRE_CONTINUE) + reset_fire() + display_ammo(source) + else + SEND_SIGNAL(src, COMSIG_GUN_FIRE) + +/// Wrapper proc for the autofire system to ensure the important args aren't null. +/obj/item/hardpoint/proc/fire_wrapper(atom/target, mob/living/user, params) + SHOULD_NOT_OVERRIDE(TRUE) + if(!target) + target = src.target + if(!user) + user = owner.get_seat_mob(allowed_seat) + if(!target || !user) + return NONE + + return try_fire(target, user, params) + +/// Tests if firing should be interrupted, otherwise fires. +/obj/item/hardpoint/proc/try_fire(atom/target, mob/living/user, params) + if(health <= 0) + to_chat(user, SPAN_WARNING("\The [name] is broken!")) + return NONE - to_chat(user, SPAN_WARNING("[name] Ammo: [SPAN_HELPFUL(ammo ? ammo.current_rounds : 0)]/[SPAN_HELPFUL(ammo ? ammo.max_rounds : 0)] | Mags: [SPAN_HELPFUL(LAZYLEN(backup_clips))]/[SPAN_HELPFUL(max_clips)]")) + if(ammo && ammo.current_rounds <= 0) + click_empty(user) + return NONE -//finally firing the gun -/obj/item/hardpoint/proc/fire_projectile(mob/user, atom/A) - set waitfor = 0 + if(!in_firing_arc(target)) + to_chat(user, SPAN_WARNING("The target is not within your firing arc!")) + return NONE - var/turf/origin_turf = get_turf(src) - origin_turf = locate(origin_turf.x + origins[1], origin_turf.y + origins[2], origin_turf.z) + if(!clear_los()) + to_chat(user, SPAN_WARNING("The muzzle is obstructed!")) + return NONE - var/obj/projectile/P = generate_bullet(user, origin_turf) - SEND_SIGNAL(P, COMSIG_BULLET_USER_EFFECTS, user) - P.fire_at(A, user, src, P.ammo.max_range, P.ammo.shell_speed) + return handle_fire(target, user, params) - if(use_muzzle_flash) - muzzle_flash(Get_Angle(origin_turf, A)) +/// Actually fires the gun, sets up the projectile and fires it. +/obj/item/hardpoint/proc/handle_fire(atom/target, mob/living/user, params) + var/turf/origin_turf = get_origin_turf() + var/obj/projectile/projectile_to_fire = generate_bullet(user, origin_turf) ammo.current_rounds-- + SEND_SIGNAL(projectile_to_fire, COMSIG_BULLET_USER_EFFECTS, user) + + // turf-targeted projectiles are fired without scatter, because proc would raytrace them further away + var/ammo_flags = projectile_to_fire.ammo.flags_ammo_behavior | projectile_to_fire.projectile_override_flags + if(!HAS_FLAG(ammo_flags, AMMO_HITS_TARGET_TURF) && !HAS_FLAG(ammo_flags, AMMO_EXPLOSIVE)) //AMMO_EXPLOSIVE is also a turf-targeted projectile + projectile_to_fire.scatter = scatter + target = simulate_scatter(projectile_to_fire, target, origin_turf, get_turf(target), user) + + INVOKE_ASYNC(projectile_to_fire, TYPE_PROC_REF(/obj/projectile, fire_at), target, user, src, projectile_to_fire.ammo.max_range, projectile_to_fire.ammo.shell_speed) + projectile_to_fire = null + + shots_fired++ + play_firing_sounds() + if(use_muzzle_flash) + muzzle_flash(Get_Angle(origin_turf, target)) + + set_fire_cooldown(gun_firemode) + + return AUTOFIRE_CONTINUE + +/// Start cooldown to respect delay of firemode. +/obj/item/hardpoint/proc/set_fire_cooldown(firemode) + var/cooldown_time = 0 + switch(firemode) + if(GUN_FIREMODE_SEMIAUTO) + cooldown_time = fire_delay + if(GUN_FIREMODE_BURSTFIRE) + cooldown_time = burst_delay + extra_delay + if(GUN_FIREMODE_AUTOMATIC) + cooldown_time = fire_delay + COOLDOWN_START(src, fire_cooldown, cooldown_time) + +/// Adjust target based on random scatter angle. +/obj/item/hardpoint/proc/simulate_scatter(obj/projectile/projectile_to_fire, atom/target, turf/curloc, turf/targloc) + var/fire_angle = Get_Angle(curloc, targloc) + var/total_scatter_angle = projectile_to_fire.scatter + + //Not if the gun doesn't scatter at all, or negative scatter. + if(total_scatter_angle > 0) + fire_angle += rand(-total_scatter_angle, total_scatter_angle) + target = get_angle_target_turf(curloc, fire_angle, 30) + + return target + +/// Get turf at hardpoint origin offset, used as the muzzle. +/obj/item/hardpoint/proc/get_origin_turf() + return get_offset_target_turf(get_turf(src), origins[1], origins[2]) + +/// Plays 'click' noise and announced to chat. Usually called when weapon empty. +/obj/item/hardpoint/proc/click_empty(mob/user) + playsound(src, 'sound/weapons/gun_empty.ogg', 25, 1, 5) + if(user) + to_chat(user, SPAN_WARNING("*click*")) + +/// Selects and plays a firing sound from the list. +/obj/item/hardpoint/proc/play_firing_sounds() + if(LAZYLEN(activation_sounds)) + playsound(get_turf(src), pick(activation_sounds), 60, 1) + +/// Determines whether something is in firing arc of a hardpoint. +/obj/item/hardpoint/proc/in_firing_arc(atom/target) + if(!firing_arc || !ISINRANGE_EX(firing_arc, 0, 360)) + return TRUE + + var/turf/muzzle_turf = get_origin_turf() + var/turf/target_turf = get_turf(target) + + //same tile angle returns EAST, returning FALSE to ensure consistency + if(muzzle_turf == target_turf) + return FALSE + + var/angle_diff = SIMPLIFY_DEGREES(dir2angle(dir) - get_angle(muzzle_turf, target_turf)) + if(angle_diff < -180) + angle_diff += 360 + else if(angle_diff > 180) + angle_diff -= 360 + + return abs(angle_diff) <= (firing_arc * 0.5) //----------------------------- //------ICON PROCS---------- diff --git a/code/modules/vehicles/hardpoints/holder/holder.dm b/code/modules/vehicles/hardpoints/holder/holder.dm index b14e078a3997..df91cbc51b65 100644 --- a/code/modules/vehicles/hardpoints/holder/holder.dm +++ b/code/modules/vehicles/hardpoints/holder/holder.dm @@ -26,7 +26,7 @@ else if(isobserver(user) || (ishuman(user) && (skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED) || skillcheck(user, SKILL_VEHICLE, SKILL_VEHICLE_CREWMAN)))) . += "It's at [round(get_integrity_percent(), 1)]% integrity!" for(var/obj/item/hardpoint/H in hardpoints) - . += "There is a [H] module installed on \the [src]." + . += "There is \a [H] module installed on [src]." . += H.get_examine_text(user, TRUE) /obj/item/hardpoint/holder/get_tgui_info() @@ -43,10 +43,21 @@ for(var/obj/item/hardpoint/H in hardpoints) H.take_damage(damage) -/obj/item/hardpoint/holder/on_install(obj/vehicle/multitile/V) - for(var/obj/item/hardpoint/HP in hardpoints) - HP.owner = V - return +/obj/item/hardpoint/holder/on_install(obj/vehicle/multitile/vehicle) + ..() + if(!vehicle) //in loose holder + return + for(var/obj/item/hardpoint/hardpoint in hardpoints) + hardpoint.owner = vehicle + hardpoint.on_install(vehicle) + +/obj/item/hardpoint/holder/on_uninstall(obj/vehicle/multitile/vehicle) + if(!vehicle) //in loose holder + return + for(var/obj/item/hardpoint/hardpoint in hardpoints) + hardpoint.on_uninstall(vehicle) + hardpoint.owner = null + ..() /obj/item/hardpoint/holder/proc/can_install(obj/item/hardpoint/H) // Can only have 1 hardpoint of each slot type @@ -121,16 +132,17 @@ H.forceMove(src) LAZYADD(hardpoints, H) + H.on_install(owner) H.rotate(turning_angle(H.dir, dir)) /obj/item/hardpoint/holder/proc/remove_hardpoint(obj/item/hardpoint/H, turf/uninstall_to) if(!hardpoints) return - hardpoints -= H H.forceMove(uninstall_to ? uninstall_to : get_turf(src)) + H.on_uninstall(owner) H.reset_rotation() - + hardpoints -= H H.owner = null if(H.health <= 0) diff --git a/code/modules/vehicles/hardpoints/holder/tank_turret.dm b/code/modules/vehicles/hardpoints/holder/tank_turret.dm index 27ab6c95404c..896628e609bb 100644 --- a/code/modules/vehicles/hardpoints/holder/tank_turret.dm +++ b/code/modules/vehicles/hardpoints/holder/tank_turret.dm @@ -13,8 +13,6 @@ density = TRUE //come on, it's huge activatable = TRUE - cooldown = 150 - accuracy = 0.8 ammo = new /obj/item/ammo_magazine/hardpoint/turret_smoke max_clips = 2 @@ -60,6 +58,15 @@ // Used during the windup var/rotating = FALSE + scatter = 4 + gun_firemode = GUN_FIREMODE_BURSTFIRE + gun_firemode_list = list( + GUN_FIREMODE_BURSTFIRE, + ) + burst_amount = 2 + burst_delay = 1.0 SECONDS + extra_delay = 13.0 SECONDS + /obj/item/hardpoint/holder/tank_turret/update_icon() var/broken = (health <= 0) icon_state = "tank_turret_[broken]" @@ -182,12 +189,7 @@ user.client.pixel_x = -1 * AM.view_tile_offset * 32 user.client.pixel_y = 0 -/obj/item/hardpoint/holder/tank_turret/fire(mob/user, atom/A) - if(ammo.current_rounds <= 0) - return - - next_use = world.time + cooldown - +/obj/item/hardpoint/holder/tank_turret/try_fire(atom/target, mob/living/user, params) var/turf/L var/turf/R switch(owner.dir) @@ -204,26 +206,14 @@ L = locate(owner.x - 4, owner.y + 2, owner.z) R = locate(owner.x - 4, owner.y - 2, owner.z) - if(LAZYLEN(activation_sounds)) - playsound(get_turf(src), pick(activation_sounds), 60, 1) - fire_projectile(user, L) + if(shots_fired) + target = R + else + target = L - sleep(10) + return ..() - if(LAZYLEN(activation_sounds)) - playsound(get_turf(src), pick(activation_sounds), 60, 1) - fire_projectile(user, R) - - to_chat(user, SPAN_WARNING("Smoke Screen uses left: [SPAN_HELPFUL(ammo ? ammo.current_rounds / 2 : 0)]/[SPAN_HELPFUL(ammo ? ammo.max_rounds / 2 : 0)] | Mags: [SPAN_HELPFUL(LAZYLEN(backup_clips))]/[SPAN_HELPFUL(max_clips)]")) - -/obj/item/hardpoint/holder/tank_turret/fire_projectile(mob/user, atom/A) - set waitfor = 0 - - var/turf/origin_turf = get_turf(src) - origin_turf = locate(origin_turf.x + origins[1], origin_turf.y + origins[2], origin_turf.z) +/obj/item/hardpoint/holder/tank_turret/get_origin_turf() + var/origin_turf = ..() origin_turf = get_step(get_step(origin_turf, owner.dir), owner.dir) //this should get us tile in front of tank to prevent grenade being stuck under us. - - var/obj/projectile/P = generate_bullet(user, origin_turf) - SEND_SIGNAL(P, COMSIG_BULLET_USER_EFFECTS, owner.seats[VEHICLE_GUNNER]) - P.fire_at(A, owner.seats[VEHICLE_GUNNER], src, get_dist(origin_turf, A) + 1, P.ammo.shell_speed) - ammo.current_rounds-- + return origin_turf diff --git a/code/modules/vehicles/hardpoints/primary/autocannon.dm b/code/modules/vehicles/hardpoints/primary/autocannon.dm index df9224011b32..b6dc2cedc674 100644 --- a/code/modules/vehicles/hardpoints/primary/autocannon.dm +++ b/code/modules/vehicles/hardpoints/primary/autocannon.dm @@ -8,8 +8,6 @@ activation_sounds = list('sound/weapons/vehicles/autocannon_fire.ogg') health = 500 - cooldown = 7 - accuracy = 0.98 firing_arc = 60 origins = list(0, -3) @@ -23,3 +21,10 @@ "4" = list(32, 0), "8" = list(-32, 0) ) + + scatter = 1 + gun_firemode = GUN_FIREMODE_AUTOMATIC + gun_firemode_list = list( + GUN_FIREMODE_AUTOMATIC, + ) + fire_delay = 0.7 SECONDS diff --git a/code/modules/vehicles/hardpoints/primary/dual_cannon.dm b/code/modules/vehicles/hardpoints/primary/dual_cannon.dm index ad57e20e8456..4033a4bffb2a 100644 --- a/code/modules/vehicles/hardpoints/primary/dual_cannon.dm +++ b/code/modules/vehicles/hardpoints/primary/dual_cannon.dm @@ -12,10 +12,7 @@ damage_multiplier = 0.2 health = 500 - cooldown = 7 - accuracy = 0.98 firing_arc = 60 - var/burst_amount = 2 origins = list(0, -2) @@ -33,27 +30,15 @@ "8" = list(14, 9) ) + scatter = 1 + gun_firemode = GUN_FIREMODE_AUTOMATIC + gun_firemode_list = list( + GUN_FIREMODE_AUTOMATIC, + ) + fire_delay = 0.3 SECONDS + /obj/item/hardpoint/primary/dualcannon/set_bullet_traits() ..() LAZYADD(traits_to_give, list( BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) )) - -/obj/item/hardpoint/primary/dualcannon/fire(mob/user, atom/A) - if(ammo.current_rounds <= 0) - return - - next_use = world.time + cooldown * owner.misc_multipliers["cooldown"] - - for(var/bullets_fired = 1, bullets_fired <= burst_amount, bullets_fired++) - var/atom/T = A - if(!prob((accuracy * 100) / owner.misc_multipliers["accuracy"])) - T = get_step(get_turf(A), pick(GLOB.cardinals)) - if(LAZYLEN(activation_sounds)) - playsound(get_turf(src), pick(activation_sounds), 60, 1) - fire_projectile(user, T) - if(ammo.current_rounds <= 0) - break - if(bullets_fired < burst_amount) //we need to sleep only if there are more bullets to shoot in the burst - sleep(3) - to_chat(user, SPAN_WARNING("[src] Ammo: [SPAN_HELPFUL(ammo ? ammo.current_rounds : 0)]/[SPAN_HELPFUL(ammo ? ammo.max_rounds : 0)] | Mags: [SPAN_HELPFUL(LAZYLEN(backup_clips))]/[SPAN_HELPFUL(max_clips)]")) diff --git a/code/modules/vehicles/hardpoints/primary/flamer.dm b/code/modules/vehicles/hardpoints/primary/flamer.dm index 929842df2307..13beee9dd2c2 100644 --- a/code/modules/vehicles/hardpoints/primary/flamer.dm +++ b/code/modules/vehicles/hardpoints/primary/flamer.dm @@ -8,8 +8,6 @@ activation_sounds = list('sound/weapons/vehicles/flamethrower.ogg') health = 400 - cooldown = 20 - accuracy = 0.75 firing_arc = 90 origins = list(0, -3) @@ -26,36 +24,19 @@ use_muzzle_flash = FALSE + scatter = 5 + fire_delay = 2.0 SECONDS + /obj/item/hardpoint/primary/flamer/set_bullet_traits() ..() LAZYADD(traits_to_give, list( BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) )) -/obj/item/hardpoint/primary/flamer/can_activate(mob/user, atom/A) - if(!..()) - return FALSE - - var/turf/origin_turf = get_turf(src) - origin_turf = locate(origin_turf.x + origins[1], origin_turf.y + origins[2], origin_turf.z) - if(origin_turf == get_turf(A)) - return FALSE - - return TRUE - -/obj/item/hardpoint/primary/flamer/fire_projectile(mob/user, atom/A) - set waitfor = 0 - - var/turf/origin_turf = get_turf(src) - origin_turf = locate(origin_turf.x + origins[1], origin_turf.y + origins[2], origin_turf.z) - - var/range = get_dist(origin_turf, A) + 1 - - var/obj/projectile/P = generate_bullet(user, origin_turf) - SEND_SIGNAL(P, COMSIG_BULLET_USER_EFFECTS, owner.seats[VEHICLE_GUNNER]) - P.fire_at(A, owner.seats[VEHICLE_GUNNER], src, range < P.ammo.max_range ? range : P.ammo.max_range, P.ammo.shell_speed) - - if(use_muzzle_flash) - muzzle_flash(Get_Angle(owner, A)) +/obj/item/hardpoint/primary/flamer/try_fire(target, user, params) + var/turf/origin_turf = get_origin_turf() + if(origin_turf == get_turf(target)) + to_chat(user, SPAN_WARNING("The target is too close.")) + return NONE - ammo.current_rounds-- + return ..() diff --git a/code/modules/vehicles/hardpoints/primary/ltb.dm b/code/modules/vehicles/hardpoints/primary/ltb.dm index 7c663dc27fbc..19b5c7e7b9b4 100644 --- a/code/modules/vehicles/hardpoints/primary/ltb.dm +++ b/code/modules/vehicles/hardpoints/primary/ltb.dm @@ -8,8 +8,6 @@ activation_sounds = list('sound/weapons/vehicles/cannon_fire1.ogg', 'sound/weapons/vehicles/cannon_fire2.ogg') health = 500 - cooldown = 200 - accuracy = 0.97 firing_arc = 60 origins = list(0, -3) @@ -30,3 +28,6 @@ "4" = list(89, -4), "8" = list(-89, -4) ) + + scatter = 2 + fire_delay = 20.0 SECONDS diff --git a/code/modules/vehicles/hardpoints/primary/minigun.dm b/code/modules/vehicles/hardpoints/primary/minigun.dm index a6e44d2dbf2c..3acf37eec268 100644 --- a/code/modules/vehicles/hardpoints/primary/minigun.dm +++ b/code/modules/vehicles/hardpoints/primary/minigun.dm @@ -7,8 +7,6 @@ disp_icon_state = "ltaaap_minigun" health = 350 - cooldown = 8 - accuracy = 0.6 firing_arc = 90 origins = list(0, -3) @@ -30,46 +28,58 @@ "8" = list(-77, 0) ) - //changed minigun mechanic so instead of having lowered cooldown with each shot it now has increased burst size. - //While it's still spammy, user doesn't have to click as fast as possible anymore and has margin of 2 seconds before minigun will start slowing down - - var/chained_shots = 1 //how many quick succession shots we've fired, 1 by default - var/last_shot_time = 0 //when was last shot fired, after 3 seconds we stop barrel - var/list/chain_bursts = list(1, 1, 2, 2, 3, 3, 3, 4, 4, 4) //how many shots per click we do + scatter = 7 + gun_firemode = GUN_FIREMODE_AUTOMATIC + gun_firemode_list = list( + GUN_FIREMODE_AUTOMATIC, + ) + fire_delay = 0.8 SECONDS //base fire rate, modified by stage_delay_mult + activation_sounds = list('sound/weapons/gun_minigun.ogg') + /// Active firing time to reach max spin_stage. + var/spinup_time = 8 SECONDS + /// Grace period before losing spin_stage. + var/spindown_grace_time = 2 SECONDS + COOLDOWN_DECLARE(spindown_grace_cooldown) + /// Cooldown time to reach min spin_stage. + var/spindown_time = 3 SECONDS + /// Index of stage_rate. + var/spin_stage = 1 + /// Shots fired per fire_delay at a particular spin_stage. + var/list/stage_rate = list(1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 5) + /// Fire delay multiplier for current spin_stage. + var/stage_delay_mult = 1 + /// When it was last fired, related to world.time. + var/last_fired = 0 -/obj/item/hardpoint/primary/minigun/fire(mob/user, atom/A) +/obj/item/hardpoint/primary/minigun/set_fire_delay(value) + fire_delay = value + SEND_SIGNAL(src, COMSIG_GUN_AUTOFIREDELAY_MODIFIED, fire_delay * stage_delay_mult) - var/S = 'sound/weapons/vehicles/minigun_stop.ogg' - //check how much time since last shot. 2 seconds are grace period before minigun starts to lose rotation momentum - var/t = world.time - last_shot_time - 2 SECONDS - t = round(t / 10) - if(t > 0) - chained_shots = max(chained_shots - t * 3, 1) //we lose 3 chained_shots per second - else - if(chained_shots < 11) - chained_shots++ - S = 'sound/weapons/vehicles/minigun_loop.ogg' +/obj/item/hardpoint/primary/minigun/set_fire_cooldown() + calculate_stage_delay_mult() //needs to check grace_cooldown before refreshed + last_fired = world.time + COOLDOWN_START(src, spindown_grace_cooldown, spindown_grace_time) + COOLDOWN_START(src, fire_cooldown, fire_delay * stage_delay_mult) - if(chained_shots == 1) - playsound(get_turf(src), 'sound/weapons/vehicles/minigun_start.ogg', 40, 1) +/obj/item/hardpoint/primary/minigun/proc/calculate_stage_delay_mult() + var/stage_rate_len = stage_rate.len + var/delta_time = world.time - last_fired - next_use = world.time + cooldown * owner.misc_multipliers["cooldown"] - - //how many rounds we will shoot in this burst - if(chained_shots > LAZYLEN(chain_bursts)) //5 shots at maximum rotation - t = 5 + var/old_spin_stage = spin_stage + if(auto_firing || burst_firing) //spinup if continuing fire + var/delta_stage = delta_time * (stage_rate_len - 1) + spin_stage += delta_stage / spinup_time + else if(COOLDOWN_FINISHED(src, spindown_grace_cooldown)) //spindown if initiating fire after grace + var/delta_stage = (delta_time - spindown_grace_time) * (stage_rate_len - 1) + spin_stage -= delta_stage / spindown_time else - t = LAZYACCESS(chain_bursts, chained_shots) - for(var/i = 1; i <= t; i++) - var/atom/T = A - if(!prob((accuracy * 100) / owner.misc_multipliers["accuracy"])) - T = get_step(get_turf(T), pick(GLOB.cardinals)) - fire_projectile(user, T) - if(ammo.current_rounds <= 0) - break - sleep(2) - to_chat(user, SPAN_WARNING("[src] Ammo: [SPAN_HELPFUL(ammo ? ammo.current_rounds : 0)]/[SPAN_HELPFUL(ammo ? ammo.max_rounds : 0)] | Mags: [SPAN_HELPFUL(LAZYLEN(backup_clips))]/[SPAN_HELPFUL(max_clips)]")) + return + spin_stage = Clamp(spin_stage, 1, stage_rate_len) + + var/old_stage_rate = stage_rate[Floor(old_spin_stage)] + var/new_stage_rate = stage_rate[Floor(spin_stage)] - playsound(get_turf(src), S, 40, 1) - last_shot_time = world.time + if(old_stage_rate != new_stage_rate) + stage_delay_mult = 1 / new_stage_rate + SEND_SIGNAL(src, COMSIG_GUN_AUTOFIREDELAY_MODIFIED, fire_delay * stage_delay_mult) diff --git a/code/modules/vehicles/hardpoints/secondary/cupola.dm b/code/modules/vehicles/hardpoints/secondary/cupola.dm index 3c329e135855..f259d6ea2623 100644 --- a/code/modules/vehicles/hardpoints/secondary/cupola.dm +++ b/code/modules/vehicles/hardpoints/secondary/cupola.dm @@ -8,10 +8,7 @@ activation_sounds = list('sound/weapons/gun_smartgun1.ogg', 'sound/weapons/gun_smartgun2.ogg', 'sound/weapons/gun_smartgun3.ogg', 'sound/weapons/gun_smartgun4.ogg') health = 350 - cooldown = 15 - accuracy = 0.9 firing_arc = 120 - var/burst_amount = 3 origins = list(0, -2) @@ -25,27 +22,17 @@ "8" = list(-5, 7) ) + scatter = 3 + gun_firemode = GUN_FIREMODE_BURSTFIRE + gun_firemode_list = list( + GUN_FIREMODE_BURSTFIRE, + ) + burst_amount = 3 + burst_delay = 0.3 SECONDS + extra_delay = 0.6 SECONDS + /obj/item/hardpoint/secondary/m56cupola/set_bullet_traits() ..() LAZYADD(traits_to_give, list( BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) )) - -/obj/item/hardpoint/secondary/m56cupola/fire(mob/user, atom/A) - if(ammo.current_rounds <= 0) - return - - next_use = world.time + cooldown * owner.misc_multipliers["cooldown"] - - for(var/bullets_fired = 1, bullets_fired <= burst_amount, bullets_fired++) - var/atom/T = A - if(!prob((accuracy * 100) / owner.misc_multipliers["accuracy"])) - T = get_step(get_turf(A), pick(GLOB.cardinals)) - if(LAZYLEN(activation_sounds)) - playsound(get_turf(src), pick(activation_sounds), 60, 1) - fire_projectile(user, T) - if(ammo.current_rounds <= 0) - break - if(bullets_fired < burst_amount) //we need to sleep only if there are more bullets to shoot in the burst - sleep(3) - to_chat(user, SPAN_WARNING("[src] Ammo: [SPAN_HELPFUL(ammo ? ammo.current_rounds : 0)]/[SPAN_HELPFUL(ammo ? ammo.max_rounds : 0)] | Mags: [SPAN_HELPFUL(LAZYLEN(backup_clips))]/[SPAN_HELPFUL(max_clips)]")) diff --git a/code/modules/vehicles/hardpoints/secondary/flamer.dm b/code/modules/vehicles/hardpoints/secondary/flamer.dm index 10f7453d8c95..5557cfb24e17 100644 --- a/code/modules/vehicles/hardpoints/secondary/flamer.dm +++ b/code/modules/vehicles/hardpoints/secondary/flamer.dm @@ -8,8 +8,6 @@ activation_sounds = list('sound/weapons/vehicles/flamethrower.ogg') health = 300 - cooldown = 30 - accuracy = 0.68 firing_arc = 120 origins = list(0, -2) @@ -28,31 +26,20 @@ "8" = list(-3, 18) ) -/obj/item/hardpoint/secondary/small_flamer/fire_projectile(mob/user, atom/A) - set waitfor = 0 - - var/turf/origin_turf = get_turf(src) - origin_turf = locate(origin_turf.x + origins[1], origin_turf.y + origins[2], origin_turf.z) - var/list/turf/turfs = getline2(origin_turf, A) - var/distance = 0 - var/turf/prev_T - - for(var/turf/T in turfs) - if(T == loc) - prev_T = T - continue - if(!ammo.current_rounds) break - if(distance >= max_range) break - if(prev_T && LinkBlocked(prev_T, T)) - break - ammo.current_rounds-- - flame_turf(T, user) - distance++ - prev_T = T - sleep(1) - -/obj/item/hardpoint/secondary/small_flamer/proc/flame_turf(turf/T, mob/user) - if(!istype(T)) return - - if(!locate(/obj/flamer_fire) in T) // No stacking flames! - new/obj/flamer_fire(T, create_cause_data(initial(name), user)) + scatter = 6 + fire_delay = 3.0 SECONDS + +/obj/item/hardpoint/secondary/small_flamer/handle_fire(atom/target, mob/living/user, params) + var/turf/origin_turf = get_origin_turf() + + var/distance = get_dist(origin_turf, get_turf(target)) + var/fire_amount = min(ammo.current_rounds, distance+1, max_range) + ammo.current_rounds -= fire_amount + + new /obj/flamer_fire(origin_turf, create_cause_data(initial(name), user), null, fire_amount, null, FLAMESHAPE_LINE, target, CALLBACK(src, PROC_REF(display_ammo), user)) + + play_firing_sounds() + + COOLDOWN_START(src, fire_cooldown, fire_delay) + + return AUTOFIRE_CONTINUE diff --git a/code/modules/vehicles/hardpoints/secondary/frontal_cannon.dm b/code/modules/vehicles/hardpoints/secondary/frontal_cannon.dm index a4d7370935fe..536b5742cfcd 100644 --- a/code/modules/vehicles/hardpoints/secondary/frontal_cannon.dm +++ b/code/modules/vehicles/hardpoints/secondary/frontal_cannon.dm @@ -11,10 +11,7 @@ damage_multiplier = 0.11 health = 350 - cooldown = 16 - accuracy = 0.8 firing_arc = 120 - var/burst_amount = 4 origins = list(0, -2) @@ -32,27 +29,15 @@ "8" = list(-62, -26) ) + scatter = 4 + gun_firemode = GUN_FIREMODE_AUTOMATIC + gun_firemode_list = list( + GUN_FIREMODE_AUTOMATIC, + ) + fire_delay = 0.3 SECONDS + /obj/item/hardpoint/secondary/frontalcannon/set_bullet_traits() ..() LAZYADD(traits_to_give, list( BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) )) - -/obj/item/hardpoint/secondary/frontalcannon/fire(mob/user, atom/A) - if(ammo.current_rounds <= 0) - return - - next_use = world.time + cooldown * owner.misc_multipliers["cooldown"] - - for(var/bullets_fired = 1, bullets_fired <= burst_amount, bullets_fired++) - var/atom/T = A - if(!prob((accuracy * 100) / owner.misc_multipliers["accuracy"])) - T = get_step(get_turf(A), pick(GLOB.cardinals)) - if(LAZYLEN(activation_sounds)) - playsound(get_turf(src), pick(activation_sounds), 60, 1) - fire_projectile(user, T) - if(ammo.current_rounds <= 0) - break - if(bullets_fired < burst_amount) //we need to sleep only if there are more bullets to shoot in the burst - sleep(3) - to_chat(user, SPAN_WARNING("[src] Ammo: [SPAN_HELPFUL(ammo ? ammo.current_rounds : 0)]/[SPAN_HELPFUL(ammo ? ammo.max_rounds : 0)] | Mags: [SPAN_HELPFUL(LAZYLEN(backup_clips))]/[SPAN_HELPFUL(max_clips)]")) diff --git a/code/modules/vehicles/hardpoints/secondary/grenade_launcher.dm b/code/modules/vehicles/hardpoints/secondary/grenade_launcher.dm index 8151a1ee50c1..efd151e93cb3 100644 --- a/code/modules/vehicles/hardpoints/secondary/grenade_launcher.dm +++ b/code/modules/vehicles/hardpoints/secondary/grenade_launcher.dm @@ -8,8 +8,6 @@ activation_sounds = list('sound/weapons/gun_m92_attachable.ogg') health = 500 - cooldown = 30 - accuracy = 0.4 firing_arc = 90 var/max_range = 7 @@ -27,40 +25,19 @@ "8" = list(-6, 17) ) + scatter = 10 + fire_delay = 3.0 SECONDS + /obj/item/hardpoint/secondary/grenade_launcher/set_bullet_traits() ..() LAZYADD(traits_to_give, list( BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) )) -/obj/item/hardpoint/secondary/grenade_launcher/can_activate(mob/user, atom/A) - if(!..()) - return FALSE - - var/turf/origin_turf = get_turf(src) - origin_turf = locate(origin_turf.x + origins[1], origin_turf.y + origins[2], origin_turf.z) - if(get_dist(origin_turf, A) < 1) - to_chat(usr, SPAN_WARNING("The target is too close.")) - return FALSE - - return TRUE - -/obj/item/hardpoint/secondary/grenade_launcher/fire_projectile(mob/user, atom/A) - set waitfor = 0 - - var/turf/origin_turf = get_turf(src) - origin_turf = locate(origin_turf.x + origins[1], origin_turf.y + origins[2], origin_turf.z) - - //getting distance between supposed target and tank center. - var/range = get_dist(origin_turf, A) + 1 //otherwise nade falls one tile shorter - if(range > max_range) - range = max_range - - var/obj/projectile/P = generate_bullet(user, origin_turf) - SEND_SIGNAL(P, COMSIG_BULLET_USER_EFFECTS, owner.seats[VEHICLE_GUNNER]) - P.fire_at(A, owner.seats[VEHICLE_GUNNER], src, P.ammo.max_range, P.ammo.shell_speed) - - if(use_muzzle_flash) - muzzle_flash(Get_Angle(owner, A)) +/obj/item/hardpoint/secondary/grenade_launcher/try_fire(mob/user, atom/A) + var/turf/origin_turf = get_origin_turf() + if(origin_turf == get_turf(A)) + to_chat(user, SPAN_WARNING("The target is too close.")) + return NONE - ammo.current_rounds-- + return ..() diff --git a/code/modules/vehicles/hardpoints/secondary/tow.dm b/code/modules/vehicles/hardpoints/secondary/tow.dm index 4bdbc6f417fb..7c58f7970c7b 100644 --- a/code/modules/vehicles/hardpoints/secondary/tow.dm +++ b/code/modules/vehicles/hardpoints/secondary/tow.dm @@ -7,8 +7,6 @@ disp_icon_state = "towlauncher" health = 500 - cooldown = 150 - accuracy = 0.8 firing_arc = 60 origins = list(0, -2) @@ -29,3 +27,7 @@ "4" = list(5, -8), "8" = list(-5, 10) ) + + scatter = 4 + fire_delay = 15.0 SECONDS + diff --git a/code/modules/vehicles/hardpoints/special/firing_port_weapon.dm b/code/modules/vehicles/hardpoints/special/firing_port_weapon.dm index b6f3daed9f4e..780c195f00be 100644 --- a/code/modules/vehicles/hardpoints/special/firing_port_weapon.dm +++ b/code/modules/vehicles/hardpoints/special/firing_port_weapon.dm @@ -10,10 +10,7 @@ activation_sounds = list('sound/weapons/gun_smartgun1.ogg', 'sound/weapons/gun_smartgun2.ogg', 'sound/weapons/gun_smartgun3.ogg', 'sound/weapons/gun_smartgun4.ogg') health = 100 - cooldown = 10 - accuracy = 0.9 firing_arc = 120 - var/burst_amount = 3 //FPWs reload automatically var/reloading = FALSE var/reload_time = 10 SECONDS @@ -30,6 +27,13 @@ underlayer_north_muzzleflash = TRUE + scatter = 3 + gun_firemode = GUN_FIREMODE_AUTOMATIC + gun_firemode_list = list( + GUN_FIREMODE_AUTOMATIC, + ) + fire_delay = 0.3 SECONDS + /obj/item/hardpoint/special/firing_port_weapon/set_bullet_traits() ..() LAZYADD(traits_to_give, list( @@ -49,46 +53,6 @@ return data - -/obj/item/hardpoint/special/firing_port_weapon/can_activate(mob/user, atom/A) - if(!owner) - return FALSE - - var/seat = owner.get_mob_seat(user) - if(!seat) - return FALSE - - if(seat != allowed_seat) - to_chat(user, SPAN_WARNING("Only [allowed_seat] can use [name].")) - return FALSE - - //FPW stop working at 50% hull - if(owner.health < initial(owner.health) * 0.5) - to_chat(user, SPAN_WARNING("\The [owner]'s hull is too damaged!")) - return FALSE - - if(world.time < next_use) - if(cooldown >= 20) //filter out guns with high firerate to prevent message spam. - to_chat(user, SPAN_WARNING("You need to wait [SPAN_HELPFUL((next_use - world.time) / 10)] seconds before [name] can be used again.")) - return FALSE - - if(reloading) - to_chat(user, SPAN_NOTICE("\The [name] is reloading. Wait [SPAN_HELPFUL("[((reload_time_started + reload_time - world.time) / 10)]")] seconds.")) - return FALSE - - if(ammo && ammo.current_rounds <= 0) - if(reloading) - to_chat(user, SPAN_WARNING("\The [name] is out of ammo! You have to wait [(reload_time_started + reload_time - world.time) / 10] seconds before it reloads!")) - else - start_auto_reload(user) - return FALSE - - if(!in_firing_arc(A)) - to_chat(user, SPAN_WARNING("The target is not within your firing arc!")) - return FALSE - - return TRUE - /obj/item/hardpoint/special/firing_port_weapon/reload(mob/user) if(!ammo) ammo = new /obj/item/ammo_magazine/hardpoint/firing_port_weapon @@ -116,27 +80,32 @@ to_chat(user, SPAN_NOTICE("\The [name] reloads automatically.")) return FALSE +/obj/item/hardpoint/special/firing_port_weapon/try_fire(atom/target, mob/living/user, params) + if(!owner) + return NONE + + //FPW stop working at 50% hull + if(owner.health < initial(owner.health) * 0.5) + to_chat(user, SPAN_WARNING("\The [owner]'s hull is too damaged!")) + return NONE -/obj/item/hardpoint/special/firing_port_weapon/fire(mob/user, atom/A) if(user.get_active_hand()) to_chat(user, SPAN_WARNING("You need a free hand to use \the [name].")) - return + return NONE - if(ammo.current_rounds <= 0) - start_auto_reload(user) - return + if(reloading) + to_chat(user, SPAN_NOTICE("\The [name] is reloading. Wait [SPAN_HELPFUL("[((reload_time_started + reload_time - world.time) / 10)]")] seconds.")) + return NONE + + if(ammo && ammo.current_rounds <= 0) + if(reloading) + to_chat(user, SPAN_WARNING("\The [name] is out of ammo! You have to wait [(reload_time_started + reload_time - world.time) / 10] seconds before it reloads!")) + else + start_auto_reload(user) + return NONE + + if(!in_firing_arc(target)) + to_chat(user, SPAN_WARNING("The target is not within your firing arc!")) + return NONE - next_use = world.time + cooldown * owner.misc_multipliers["cooldown"] - - for(var/bullets_fired = 1, bullets_fired <= burst_amount, bullets_fired++) - var/atom/T = A - if(!prob((accuracy * 100) / owner.misc_multipliers["accuracy"])) - T = get_step(get_turf(A), pick(GLOB.cardinals)) - if(LAZYLEN(activation_sounds)) - playsound(get_turf(src), pick(activation_sounds), 60, 1) - fire_projectile(user, T) - if(ammo.current_rounds <= 0) - break - if(bullets_fired < burst_amount) //we need to sleep only if there are more bullets to shoot in the burst - sleep(3) - to_chat(user, SPAN_WARNING("[src] Ammo: [SPAN_HELPFUL(ammo ? ammo.current_rounds : 0)]/[SPAN_HELPFUL(ammo ? ammo.max_rounds : 0)]")) + return handle_fire(target, user, params) diff --git a/code/modules/vehicles/hardpoints/support/artillery.dm b/code/modules/vehicles/hardpoints/support/artillery.dm index aacb83fcf383..dfcdcaf73f74 100644 --- a/code/modules/vehicles/hardpoints/support/artillery.dm +++ b/code/modules/vehicles/hardpoints/support/artillery.dm @@ -14,7 +14,7 @@ var/view_buff = 10 //This way you can VV for more or less fun var/view_tile_offset = 7 -/obj/item/hardpoint/support/artillery_module/activate(mob/user, atom/A) +/obj/item/hardpoint/support/artillery_module/handle_fire(atom/target, mob/living/user, params) if(!user.client) return @@ -62,8 +62,9 @@ user.client.pixel_y = 0 is_active = FALSE -/obj/item/hardpoint/support/artillery_module/can_activate() +/obj/item/hardpoint/support/artillery_module/try_fire(target, user, params) if(health <= 0) to_chat(usr, SPAN_WARNING("\The [src] is broken!")) - return FALSE - return TRUE + return NONE + + return handle_fire(target, user, params) diff --git a/code/modules/vehicles/hardpoints/support/flare.dm b/code/modules/vehicles/hardpoints/support/flare.dm index 00dcd3ac1886..432c9636dadd 100644 --- a/code/modules/vehicles/hardpoints/support/flare.dm +++ b/code/modules/vehicles/hardpoints/support/flare.dm @@ -13,8 +13,6 @@ activatable = TRUE health = 500 - cooldown = 30 - accuracy = 0.7 firing_arc = 120 origins = list(0, -2) @@ -33,6 +31,9 @@ "8" = list(14, -6) ) + scatter = 6 + fire_delay = 3.0 SECONDS + /obj/item/hardpoint/support/flare_launcher/set_bullet_traits() ..() LAZYADD(traits_to_give, list( diff --git a/code/modules/vehicles/interior/interactable/seats.dm b/code/modules/vehicles/interior/interactable/seats.dm index ea961bc72593..253b4a066b4f 100644 --- a/code/modules/vehicles/interior/interactable/seats.dm +++ b/code/modules/vehicles/interior/interactable/seats.dm @@ -40,8 +40,8 @@ return if(QDELETED(buckled_mob)) - vehicle.set_seated_mob(seat, null) M.unset_interaction() + vehicle.set_seated_mob(seat, null) if(M.client) M.client.change_view(GLOB.world_view_size, vehicle) M.client.pixel_x = 0 @@ -174,8 +174,8 @@ return if(QDELETED(buckled_mob)) - vehicle.set_seated_mob(seat, null) M.unset_interaction() + vehicle.set_seated_mob(seat, null) if(M.client) M.client.change_view(GLOB.world_view_size, vehicle) M.client.pixel_x = 0 @@ -252,8 +252,8 @@ return if(QDELETED(buckled_mob)) - vehicle.set_seated_mob(seat, null) M.unset_interaction() + vehicle.set_seated_mob(seat, null) if(M.client) M.client.change_view(GLOB.world_view_size, vehicle) M.client.pixel_x = 0 diff --git a/code/modules/vehicles/multitile/multitile.dm b/code/modules/vehicles/multitile/multitile.dm index c8138c5b8f86..f3b7be510b08 100644 --- a/code/modules/vehicles/multitile/multitile.dm +++ b/code/modules/vehicles/multitile/multitile.dm @@ -340,15 +340,24 @@ M.reset_view(src) give_action(M, /datum/action/human_action/vehicle_unbuckle) +/// Get crewmember of seat. /obj/vehicle/multitile/proc/get_seat_mob(seat) return seats[seat] +/// Get seat of crewmember. /obj/vehicle/multitile/proc/get_mob_seat(mob/M) for(var/seat in seats) if(seats[seat] == M) return seat return null +/// Get active hardpoint of crewmember. +/obj/vehicle/multitile/proc/get_mob_hp(mob/crew) + var/seat = get_mob_seat(crew) + if(seat) + return active_hp[seat] + return null + /obj/vehicle/multitile/proc/get_passengers() if(interior) return interior.get_passengers() diff --git a/code/modules/vehicles/multitile/multitile_hardpoints.dm b/code/modules/vehicles/multitile/multitile_hardpoints.dm index 2c5a343b802a..a6014c6cf2cd 100644 --- a/code/modules/vehicles/multitile/multitile_hardpoints.dm +++ b/code/modules/vehicles/multitile/multitile_hardpoints.dm @@ -230,47 +230,3 @@ qdel(old) update_icon() - -//proc that fires non selected weaponry -/obj/vehicle/multitile/proc/shoot_other_weapon(mob/living/carbon/human/M, seat, atom/A) - - if(!istype(M)) - return - - var/list/usable_hps = get_hardpoints_with_ammo(seat) - for(var/obj/item/hardpoint/HP in usable_hps) - if(HP == active_hp[seat] || HP.slot != HDPT_PRIMARY && HP.slot != HDPT_SECONDARY) - usable_hps.Remove(HP) - - if(!LAZYLEN(usable_hps)) - to_chat(M, SPAN_WARNING("No other working weapons detected.")) - return - - for(var/obj/item/hardpoint/HP in usable_hps) - if(!HP.can_activate(M, A)) - return - HP.activate(M, A) - break - return - -//proc that activates support module if it can be activated and you meet requirements -/obj/vehicle/multitile/proc/activate_support_module(mob/living/carbon/human/M, seat, atom/A) - - if(!istype(M)) - return - - var/list/usable_hps = get_activatable_hardpoints(seat) - for(var/obj/item/hardpoint/HP in usable_hps) - if(HP.slot != HDPT_SUPPORT) - usable_hps.Remove(HP) - - if(!LAZYLEN(usable_hps)) - to_chat(M, SPAN_WARNING("No activatable support modules detected.")) - return - - for(var/obj/item/hardpoint/HP in usable_hps) - if(!HP.can_activate(M, A)) - return - HP.activate(M, A) - break - return diff --git a/code/modules/vehicles/multitile/multitile_interaction.dm b/code/modules/vehicles/multitile/multitile_interaction.dm index 42b141327bd8..aa2025d151b5 100644 --- a/code/modules/vehicles/multitile/multitile_interaction.dm +++ b/code/modules/vehicles/multitile/multitile_interaction.dm @@ -330,80 +330,61 @@ healthcheck() -/obj/vehicle/multitile/handle_click(mob/living/user, atom/A, list/mods) - - var/seat - for(var/vehicle_seat in seats) - if(seats[vehicle_seat] == user) - seat = vehicle_seat - break - - if(istype(A, /atom/movable/screen) || !seat) +/obj/vehicle/multitile/on_set_interaction(mob/user) + RegisterSignal(user, COMSIG_MOB_MOUSEDOWN, PROC_REF(crew_mousedown)) + RegisterSignal(user, COMSIG_MOB_MOUSEDRAG, PROC_REF(crew_mousedrag)) + RegisterSignal(user, COMSIG_MOB_MOUSEUP, PROC_REF(crew_mouseup)) + +/obj/vehicle/multitile/on_unset_interaction(mob/user) + UnregisterSignal(user, list(COMSIG_MOB_MOUSEUP, COMSIG_MOB_MOUSEDOWN, COMSIG_MOB_MOUSEDRAG)) + + var/obj/item/hardpoint/hardpoint = get_mob_hp(user) + if(hardpoint) + SEND_SIGNAL(hardpoint, COMSIG_GUN_INTERRUPT_FIRE) //abort fire when crew leaves + +/// Relays crew mouse release to active hardpoint. +/obj/vehicle/multitile/proc/crew_mouseup(datum/source, atom/object, turf/location, control, params) + SIGNAL_HANDLER + var/obj/item/hardpoint/hardpoint = get_mob_hp(source) + if(!hardpoint) return - if(seat == VEHICLE_DRIVER) - if(mods["shift"] && !mods["alt"]) - A.examine(user) - return - - if(mods["ctrl"] && !mods["alt"]) - activate_horn() - return - - var/obj/item/hardpoint/HP = active_hp[seat] - if(!HP) - to_chat(user, SPAN_WARNING("Please select an active hardpoint first.")) - return - - if(!HP.can_activate(user, A)) - return - - HP.activate(user, A) - - if(seat == VEHICLE_GUNNER) - if(mods["shift"] && !mods["middle"]) - if(vehicle_flags & VEHICLE_TOGGLE_SHIFT_CLICK_GUNNER) - shoot_other_weapon(user, seat, A) - else - A.examine(user) - return - if(mods["middle"] && !mods["shift"]) - if(!(vehicle_flags & VEHICLE_TOGGLE_SHIFT_CLICK_GUNNER)) - shoot_other_weapon(user, seat, A) - return - if(mods["alt"]) - toggle_gyrostabilizer() - return - if(mods["ctrl"]) - activate_support_module(user, seat, A) - return + hardpoint.stop_fire(source, object, location, control, params) - var/obj/item/hardpoint/HP = active_hp[seat] - if(!HP) - to_chat(user, SPAN_WARNING("Please select an active hardpoint first.")) - return +/// Relays crew mouse movement to active hardpoint. +/obj/vehicle/multitile/proc/crew_mousedrag(datum/source, atom/src_object, atom/over_object, turf/src_location, turf/over_location, src_control, over_control, params) + SIGNAL_HANDLER + var/obj/item/hardpoint/hardpoint = get_mob_hp(source) + if(!hardpoint) + return - if(!HP.can_activate(user, A)) - return + hardpoint.change_target(source, src_object, over_object, src_location, over_location, src_control, over_control, params) - HP.activate(user, A) +/// Checks for special control keybinds, else relays crew mouse press to active hardpoint. +/obj/vehicle/multitile/proc/crew_mousedown(datum/source, atom/object, turf/location, control, params) + SIGNAL_HANDLER - if(seat == VEHICLE_SUPPORT_GUNNER_ONE || seat == VEHICLE_SUPPORT_GUNNER_TWO) - if(mods["shift"]) - A.examine(user) - return - if(mods["middle"] || mods["alt"] || mods["ctrl"]) - return + var/list/modifiers = params2list(params) + if(modifiers[SHIFT_CLICK] || modifiers[MIDDLE_CLICK] || modifiers[RIGHT_CLICK]) //don't step on examine, point, etc + return - var/obj/item/hardpoint/HP = active_hp[seat] - if(!HP) - to_chat(user, SPAN_WARNING("Please select an active hardpoint first.")) - return + var/seat = get_mob_seat(source) + switch(seat) + if(VEHICLE_DRIVER) + if(modifiers[LEFT_CLICK] && modifiers[CTRL_CLICK]) + activate_horn() + return + if(VEHICLE_GUNNER) + if(modifiers[LEFT_CLICK] && modifiers[ALT_CLICK]) + toggle_gyrostabilizer() + return - if(!HP.can_activate(user, A)) - return + var/obj/item/hardpoint/hardpoint = get_mob_hp(source) + if(!hardpoint) + to_chat(source, SPAN_WARNING("Please select an active hardpoint first.")) + return - HP.activate(user, A) + hardpoint.start_fire(source, object, location, control, params) /obj/vehicle/multitile/proc/handle_player_entrance(mob/M) if(!M || M.client == null) return diff --git a/code/modules/vehicles/multitile/multitile_verbs.dm b/code/modules/vehicles/multitile/multitile_verbs.dm index c7dd29bbf0a9..3801cd2e176c 100644 --- a/code/modules/vehicles/multitile/multitile_verbs.dm +++ b/code/modules/vehicles/multitile/multitile_verbs.dm @@ -30,6 +30,10 @@ if(!HP) return + var/obj/item/hardpoint/old_HP = V.active_hp[seat] + if(old_HP) + SEND_SIGNAL(old_HP, COMSIG_GUN_INTERRUPT_FIRE) //stop fire when switching away from HP + V.active_hp[seat] = HP var/msg = "You select \the [HP]." if(HP.ammo) @@ -66,6 +70,10 @@ if(!HP) return + var/obj/item/hardpoint/old_HP = V.active_hp[seat] + if(old_HP) + SEND_SIGNAL(old_HP, COMSIG_GUN_INTERRUPT_FIRE) //stop fire when switching away from HP + V.active_hp[seat] = HP var/msg = "You select \the [HP]." if(HP.ammo) @@ -225,10 +233,7 @@ 3. \"G: Toggle Turret Gyrostabilizer\" - toggles Turret Gyrostabilizer allowing it to keep current direction ignoring hull turning. (Exists only on vehicles with rotating turret, e.g. M34A2 Longstreet Light Tank)
\ Support Gunner verbs:
1. \"Reload Firing Port Weapon\" - initiates automated reloading process for M56 FPW. Requires a confirmation.
\ Driver shortcuts:
1. \"CTRL + Click\" - activates vehicle horn.
\ - Gunner shortcuts:
1. \"ALT + Click\" - toggles Turret Gyrostabilizer. (Exists only on vehicles with rotating turret, e.g. M34A2 Longstreet Light Tank)
\ - 2. \"CTRL + Click\" - activates not destroyed activatable support module.
\ - 3. \"Middle Mouse Button Click (MMB)\" - default shortcut to shoot currently not selected weapon if possible. Won't work if SHIFT + Click firing is toggled ON.
\ - 4. \"SHIFT + Click\" - examines target as usual, unless \"G: Toggle Middle/Shift Clicking\" verb was used to toggle SHIFT + Click firing ON. In this case, it will fire currently not selected weapon if possible.
" + Gunner shortcuts:
1. \"ALT + Click\" - toggles Turret Gyrostabilizer. (Exists only on vehicles with rotating turret, e.g. M34A2 Longstreet Light Tank)
" show_browser(user, dat, "Vehicle Controls Guide", "vehicle_help", "size=900x500") onclose(user, "vehicle_help") diff --git a/colonialmarines.dme b/colonialmarines.dme index 16b54d55aa98..5bb8d0eaa535 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -100,6 +100,7 @@ #include "code\__DEFINES\stats.dm" #include "code\__DEFINES\STUI.dm" #include "code\__DEFINES\subsystems.dm" +#include "code\__DEFINES\supply.dm" #include "code\__DEFINES\surgery.dm" #include "code\__DEFINES\techtree.dm" #include "code\__DEFINES\text.dm" @@ -134,6 +135,14 @@ #include "code\__DEFINES\dcs\signals\atom\mob\living\signals_human.dm" #include "code\__DEFINES\dcs\signals\atom\mob\living\signals_living.dm" #include "code\__DEFINES\dcs\signals\atom\mob\living\signals_xeno.dm" +#include "code\__DEFINES\paygrade_defs\civilian.dm" +#include "code\__DEFINES\paygrade_defs\cmb.dm" +#include "code\__DEFINES\paygrade_defs\dutch.dm" +#include "code\__DEFINES\paygrade_defs\marines.dm" +#include "code\__DEFINES\paygrade_defs\navy.dm" +#include "code\__DEFINES\paygrade_defs\provost.dm" +#include "code\__DEFINES\paygrade_defs\upp.dm" +#include "code\__DEFINES\paygrade_defs\weyland.dm" #include "code\__DEFINES\typecheck\assemblers.dm" #include "code\__DEFINES\typecheck\datums.dm" #include "code\__DEFINES\typecheck\generic_types.dm" @@ -571,7 +580,7 @@ #include "code\datums\pain\pain_zombie.dm" #include "code\datums\paygrades\helper.dm" #include "code\datums\paygrades\paygrade.dm" -#include "code\datums\paygrades\factions\civillian\civilian.dm" +#include "code\datums\paygrades\factions\other\civilian.dm" #include "code\datums\paygrades\factions\other\cmb.dm" #include "code\datums\paygrades\factions\other\contractors.dm" #include "code\datums\paygrades\factions\other\dutch_dozen.dm" @@ -582,7 +591,6 @@ #include "code\datums\paygrades\factions\uscm\marine.dm" #include "code\datums\paygrades\factions\uscm\navy.dm" #include "code\datums\paygrades\factions\uscm\provost.dm" -#include "code\datums\paygrades\factions\wy\goons.dm" #include "code\datums\paygrades\factions\wy\pmc.dm" #include "code\datums\paygrades\factions\wy\wy.dm" #include "code\datums\redis\redis_message.dm" @@ -1919,6 +1927,7 @@ #include "code\modules\mob\living\carbon\xenomorph\Facehuggers.dm" #include "code\modules\mob\living\carbon\xenomorph\hive_faction.dm" #include "code\modules\mob\living\carbon\xenomorph\hive_status.dm" +#include "code\modules\mob\living\carbon\xenomorph\hive_status_ui.dm" #include "code\modules\mob\living\carbon\xenomorph\life.dm" #include "code\modules\mob\living\carbon\xenomorph\login.dm" #include "code\modules\mob\living\carbon\xenomorph\mark_menu.dm" @@ -1926,7 +1935,6 @@ #include "code\modules\mob\living\carbon\xenomorph\resin_constructions.dm" #include "code\modules\mob\living\carbon\xenomorph\say.dm" #include "code\modules\mob\living\carbon\xenomorph\update_icons.dm" -#include "code\modules\mob\living\carbon\xenomorph\xeno_defines.dm" #include "code\modules\mob\living\carbon\xenomorph\xeno_helpers.dm" #include "code\modules\mob\living\carbon\xenomorph\xeno_tackle_counter.dm" #include "code\modules\mob\living\carbon\xenomorph\xeno_verbs.dm" @@ -1993,6 +2001,7 @@ #include "code\modules\mob\living\carbon\xenomorph\castes\Boiler.dm" #include "code\modules\mob\living\carbon\xenomorph\castes\Burrower.dm" #include "code\modules\mob\living\carbon\xenomorph\castes\Carrier.dm" +#include "code\modules\mob\living\carbon\xenomorph\castes\caste_datum.dm" #include "code\modules\mob\living\carbon\xenomorph\castes\Crusher.dm" #include "code\modules\mob\living\carbon\xenomorph\castes\Defender.dm" #include "code\modules\mob\living\carbon\xenomorph\castes\Drone.dm" @@ -2109,7 +2118,6 @@ #include "code\modules\movement\launching\launching.dm" #include "code\modules\nano\nanoexternal.dm" #include "code\modules\nano\nanomanager.dm" -#include "code\modules\nano\nanomapgen.dm" #include "code\modules\nano\nanoui.dm" #include "code\modules\nightmare\nmcontext.dm" #include "code\modules\nightmare\nmnodes\components.dm" diff --git a/html/changelogs/AutoChangeLog-pr-4866.yml b/html/changelogs/AutoChangeLog-pr-4866.yml deleted file mode 100644 index e9370f9725e7..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4866.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - rscadd: "Added disguisable listening bugs/devices. MPs have two outside CMP office, the CL has two in their bedroom." - - bugfix: "Fixes incorrect frequencies being used to display channel names on radios." - - bugfix: "Radios and tape recorders placed on tables or placed inside webbing can now hear speech again." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4911.yml b/html/changelogs/AutoChangeLog-pr-4911.yml deleted file mode 100644 index 2ee16d930caf..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4911.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Birdtalon" -delete-after: True -changes: - - bugfix: "Restricts burrower tunnels to alphanumeric characters as some other characters break the tunnel.\ncode; Adds new proc to replace non alphanumeric or space characters." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4962.yml b/html/changelogs/AutoChangeLog-pr-4962.yml deleted file mode 100644 index b7ed6f2cfe7f..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4962.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Morrow" -delete-after: True -changes: - - code_imp: "Corrected a check to avoid repeat work in /datum/asset/spritesheet/vending_products/register()" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4992.yml b/html/changelogs/AutoChangeLog-pr-4992.yml deleted file mode 100644 index f1d98d0f0db0..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4992.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Birdtalon" -delete-after: True -changes: - - rscadd: "\"Infernal\" name prefix for xeno who rolls number 666" - - code_imp: "Refactors xeno name generation. Larva name generation and removes some istype(src)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4996.yml b/html/changelogs/AutoChangeLog-pr-4996.yml deleted file mode 100644 index 1580ba0ea317..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4996.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "567Turtle" -delete-after: True -changes: - - rscadd: "Brown boots and gloves are now vendable from the surplus vendors." \ No newline at end of file diff --git a/html/changelogs/archive/2023-12.yml b/html/changelogs/archive/2023-12.yml index bae8bf190384..058edaa8a731 100644 --- a/html/changelogs/archive/2023-12.yml +++ b/html/changelogs/archive/2023-12.yml @@ -5,3 +5,207 @@ - rscdel: Removed flame particles. Possibly increases performance for some players. Zonespace27: - bugfix: Resin holes can no longer be planted below stairs +2023-12-02: + 567Turtle: + - rscadd: Brown boots and gloves are now vendable from the surplus vendors. + Birdtalon: + - rscadd: '"Infernal" name prefix for xeno who rolls number 666' + - code_imp: Refactors xeno name generation. Larva name generation and removes some + istype(src) + - bugfix: 'Restricts burrower tunnels to alphanumeric characters as some other characters + break the tunnel. + + code; Adds new proc to replace non alphanumeric or space characters.' + Morrow: + - code_imp: Corrected a check to avoid repeat work in /datum/asset/spritesheet/vending_products/register() + realforest2001: + - rscadd: Added disguisable listening bugs/devices. MPs have two outside CMP office, + the CL has two in their bedroom. + - bugfix: Fixes incorrect frequencies being used to display channel names on radios. + - bugfix: Radios and tape recorders placed on tables or placed inside webbing can + now hear speech again. +2023-12-03: + BadAtThisGame302: + - rscadd: Added a flavor diary entry from the Director of Lambda + - mapadd: added back the old vault nightmare insert on Solaris which was removed + due to the creation of static comms where it spawned + - maptweak: tweaked the Lambda Director's Office + - maptweak: tweaked the Lambda Administration Office + - maptweak: tweaked the Lambda Relaxation Room + SpartanBobby: + - maptweak: Redetails Almayer Squad briefing rooms + blackdragonTOW: + - maptweak: Standardized the names of LZs to include the name of the LZ. + stalkerino: + - bugfix: fixes the skull facepaint, black mask, blue mask +2023-12-04: + Birdtalon: + - bugfix: "Upgraded resin walls can now nest hosts.\n/\U0001F191" + - rscadd: Radial Menu for xeno Evolve + IowaPotatoFarmer: + - rscadd: Added a Corporate Liaison survivor to Sorokyne. + - rscadd: Added a modified version of the liaison's winter coat that allows it to + holster guns and a few other things. Only available to the Sorokyne Strata Corporate + Liaison for now. + - spellcheck: Fixed a typo in the Sorokyne Strata Political Prisoner's ID tag. + MrDas: + - bugfix: Observer minimap should no longer occasionally show wrong / no map. + SabreML: + - ui: Removed the scrollbar from the 'Player setup' menu. + cuberound: + - bugfix: fixed a runtime in /datum/component/healing_reduction/process(delta_time) + ihatethisengine: + - rscadd: Whiskey outpost is voteable less often and requires 140 players. + realforest2001: + - bugfix: Fixes /spec_kit/asrs (now /spec_kit/rifleman) not allowing use. + - code_imp: Adds back-end functionality for token redeeming on cm_vending vendors, + and moves synth experimental tools token to use it. + - rscadd: Spec tokens are real. +2023-12-05: + Birdtalon: + - bugfix: "Fixes a runtime in vendors\n/\U0001F191" + Huffie56: + - rscadd: added new sections(Binoculars, Utilities, Helmet Optics, Radio keys, and + fill them with items already in the vendor. + - qol: move the section called pouches just above utilities section. + - qol: changed the section called "Supplies" to "engineering supplies" and fill + it with C4 and APC circuit board . + SabreML: + - spellcheck: Fixed instances of "The the" and "A the" in chat messages so that + they're just "The" instead. (Part 1) + Tsurupeta: + - bugfix: fixed saving of certain preferences. + silencer_pl: + - admin: Recieving prayers now makes a sound + - admin: Prayers and USCM emergency messages are now better highlighted for mods/admins +2023-12-06: + Birdtalon: + - bugfix: "Fixes runtime in spiders.dm\n/\U0001F191" + Blundir: + - rscadd: added new ammo boxes for various weapons and ammo +2023-12-07: + Doubleumc: + - refactor: vehicle weapons can fire full-auto + - rscdel: no more controls for firing vehicle non-selected weapons + Drathek: + - bugfix: Fix some errors regarding the nano subystem + - code_imp: Reduced most preference re-saving when preferences are initially loaded + Ediblebomb: + - rscadd: M5 Helmet Gasmask now functions as a gasmask when in a marine helmet (and + yes, gasmasks do still have some functionality) + SabreML: + - admin: Fixed a freeze when opening the the 'Create Object' interface. + - admin: Adjusted the size and positioning of the 'Create Object/Mob/Turf' panels + so that everything fits into the window. + - spellcheck: Fixed instances of "The the" and "A the" in chat messages so that + they're just "The" instead. (Part 2) + VileBeggar: + - soundadd: The XM88 now has a scaling hit sound for every direct hit you manage + to land with it. + realforest2001: + - admin: Added a Check Ckey verb to analyze for multikey. We're watching you Wazowski. + Always watching. + - code_imp: Cleaned up 1 letter vars in the global datacore. Also made the entry + names reflect the real name of who they relate to, for VV purposes. + - code_imp: Paygrade shorthands now use defines. + - bugfix: CLF and Survivors are no longer privates. + - bugfix: Civillian Mr/Ms/Mx prefix now works correctly, and is the default for + new ID cards. + - bugfix: Fixes custom sent ERTs broadcasting when they shouldn't. + - bugfix: Fixes UPP friendly ERT telling staff it's hostile. + zzzmike: + - bugfix: disarm chance wasn't calculating properly + zzzmike, drathek, ihatethisengine2: + - rscadd: Lifeboat launch now has an ARES announcement followed by a 10 second delay + before doors close. The current launch functionality is preserved as Emergency + Launch. +2023-12-08: + Birdtalon: + - bugfix: Wall weeds now destroyed when closed wall turfs are changed. + - code_imp: Reorganises some xeno code from xeno_defines.dm + Doubleumc: + - code_imp: projectiles smoothly animate their movement + Firartix, Birdtalon: + - bugfix: Fixed a logic error in Warrior code causing lunging some M2C/M56D users + to semi-permanently brick lunge. + Huffie56: + - maptweak: added a button inside the CL office to open the shutter for the door + and rearranged other buttons. + - maptweak: separated shutter for cl office door and for the windows. + - maptweak: add three lights in CL office and quarter. + - balance: add document and sling pouch to ASO vendor. + - balance: add shoulder webbing to ASO vendor. + - balance: add a bag section to ASO vendor and add leather satchel to it. + SabreML: + - spellcheck: Fixed instances of "The the" and "A the" in chat messages so that + they're just "The" instead. (Part 3) + alexguinea atticus-rezzer: + - rscadd: Adds alarm sound for lifeboats when launching + fira: + - bugfix: Cryoing someone now properly takes into account role weights for the purpose + of latejoin larvas. This should very slightly increase larvas amount. + - bugfix: Roundstart distributed amount of gear and ASRS points now takes shipside + role weights into account. This should moderately decrease budget and starting + gear. + - bugfix: Roundstart distributed amount of gear and ASRS points does not count Survivors + and Monkeys anymore. This should moderatly decrease budget and starting gear. + - rscadd: Main marine vendors and ASRS now get matching supply for every additional + marine latejoining, similar to larvas. This should be a substantial increase + over the course of a round. Supplies given are 60% of what a roundstart marine + would give. + - balance: Amount of gear in main marine vendors and ASRS supplies have been decreased + by 40% to help counteract added supplies the marines will get in latejoining. + Hopefully this also keeps reqs active to dispatch new supplies. + - bugfix: Altered a few items vendor stock scalings to be linear for use with the + new system, such as RTO pack, Drop Pouch and Machete Pouch. + - rscadd: Introduced ASRS supply pools. As proof of concept, ASRS now spawns a crate + of food ingredients every 30 minutes, in addition to regular gear. + - balance: ASRS now keeps track of partial crates awarded. This means if you should + receive 2.5 then 2.5 crates, you now get 2 then 3, rather than 2 and 2. This + is intended to result in smoother, more reliable transitions and scaling with + varying amount of Xenos on map. + - balance: Amount of ASRS crates awarded was reduced by about 15.5% to make up for + crates carrying over. Overall this should result in an about 5-10% reduction + in highpop crates, and ~10% increase in lowpop. Pop being based on xeno count. + - code_imp: Refactored part of ASRS supply code to be less of a painful, antique + artifact. + - bugfix: Fixed incorrect weighting in the ASRS supply code, effects on crate distributions + are unknown. + - bugfix: Fixed HPR ammo ASRS packs failing to spawn and ending up as MK1s instead. + - bugfix: Fixed ASRS order numbers not increasing the order IDs... This whole time.. + ihatethisengine: + - balance: PO can remove queens dropship override again. + private-tristan: + - qol: Gun safety messages now use balloon alerts. +2023-12-09: + InsaneRed: + - balance: Oppressor tail abduct changed to 15 seconds and lowers the windup to + 7 deciseconds + - balance: ' Changes around the punch effect so that instead of having to meet demonic + standards, you only need to punch to lower your tail/hook on oppressor.' + - bugfix: You will now automatically punch chest if the target you are aiming at + is delimbed instead of doing nothing + harryob: + - rscdel: removes a nanoui debug verb that no one has ever used, ever + zzzmike: + - spellcheck: tablestun text is more clear that it stuns + - soundadd: unequip noise added to uniform, backpack, shoes. + - soundadd: sound added to tablestun + - sounddel: for disarms, whoosh only triggers on stun. otherwise, the miss sound + plays +2023-12-10: + Birdtalon: + - bugfix: Resting once again cancels xenomorph evolve. + SabreML: + - bugfix: Fixed resin walls/membranes showing a welder deconstruction hint. + Zonespace27: + - balance: You cannot plant eggs inside vehicles. + - balance: Eggs can no longer be planted on tiles with objects that would obscure + them. + harryob: + - bugfix: xenos can construct in dropships during transport again + ihatethisengine: + - rscadd: locking lifeboats open the docks +2023-12-11: + ihatethisengine: + - bugfix: fusion reactors cannot be destroyed with explosions diff --git a/html/create_object.html b/html/create_object.html index a4c3085a9ac6..8e67b99aebca 100644 --- a/html/create_object.html +++ b/html/create_object.html @@ -9,16 +9,17 @@
- Type
- Offset: + Offset: A R
Number: Dir: - Name:
+ Name:
+ Where:

+
@@ -37,13 +39,11 @@ var objects = object_paths == null ? new Array() : object_paths.split(";"); document.spawner.filter.focus(); - populateList(objects); function populateList(from_list) { object_list.options.length = 0; - var i; - for (i in from_list) { + for (var i in from_list) { var new_option = document.createElement("option"); new_option.value = from_list[i]; new_option.text = from_list[i]; @@ -71,6 +71,7 @@ return false; } + // Carriage return if (event.keyCode == 13 || event.which == 13) { object_list.options[0].selected = 'true'; } diff --git a/icons/mob/xenos/radial_xenos.dmi b/icons/mob/xenos/radial_xenos.dmi new file mode 100644 index 000000000000..2832f42fda33 Binary files /dev/null and b/icons/mob/xenos/radial_xenos.dmi differ diff --git a/icons/obj/items/food.dmi b/icons/obj/items/food.dmi index 3c2e963e3804..54de858ffc9c 100644 Binary files a/icons/obj/items/food.dmi and b/icons/obj/items/food.dmi differ diff --git a/icons/obj/items/food_ingredients.dmi b/icons/obj/items/food_ingredients.dmi index 3e30f51153c0..c0a0213e6db4 100644 Binary files a/icons/obj/items/food_ingredients.dmi and b/icons/obj/items/food_ingredients.dmi differ diff --git a/icons/obj/items/weapons/guns/ammo_boxes/boxes_and_lids.dmi b/icons/obj/items/weapons/guns/ammo_boxes/boxes_and_lids.dmi index 6c5d741ef9b8..42e7c54bbd2b 100644 Binary files a/icons/obj/items/weapons/guns/ammo_boxes/boxes_and_lids.dmi and b/icons/obj/items/weapons/guns/ammo_boxes/boxes_and_lids.dmi differ diff --git a/icons/obj/items/weapons/guns/ammo_boxes/handfuls.dmi b/icons/obj/items/weapons/guns/ammo_boxes/handfuls.dmi index 3355358f72f9..eeef3f91412d 100644 Binary files a/icons/obj/items/weapons/guns/ammo_boxes/handfuls.dmi and b/icons/obj/items/weapons/guns/ammo_boxes/handfuls.dmi differ diff --git a/icons/obj/items/weapons/guns/ammo_boxes/magazines.dmi b/icons/obj/items/weapons/guns/ammo_boxes/magazines.dmi index c56cb4deea9c..ff0c6d60d4ac 100644 Binary files a/icons/obj/items/weapons/guns/ammo_boxes/magazines.dmi and b/icons/obj/items/weapons/guns/ammo_boxes/magazines.dmi differ diff --git a/icons/obj/items/weapons/guns/ammo_boxes/text.dmi b/icons/obj/items/weapons/guns/ammo_boxes/text.dmi index dd08bf7e69b1..911b727ba5f6 100644 Binary files a/icons/obj/items/weapons/guns/ammo_boxes/text.dmi and b/icons/obj/items/weapons/guns/ammo_boxes/text.dmi differ diff --git a/icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi b/icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi index 51bc441aefaa..f6bddae9b090 100644 Binary files a/icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi and b/icons/obj/items/weapons/guns/ammo_by_faction/uscm.dmi differ diff --git a/icons/rebase_icons.dmi b/icons/rebase_icons.dmi index 6b0a25a1f7e6..14c19d8b27e6 100644 Binary files a/icons/rebase_icons.dmi and b/icons/rebase_icons.dmi differ diff --git a/maps/map_files/BigRed/BigRed.dmm b/maps/map_files/BigRed/BigRed.dmm index 2cdf06d411c7..6a90f35e4de3 100644 --- a/maps/map_files/BigRed/BigRed.dmm +++ b/maps/map_files/BigRed/BigRed.dmm @@ -119,7 +119,7 @@ /area/bigredv2/outside/space_port) "aau" = ( /obj/docking_port/stationary/marine_dropship/lz1{ - name = "Communications Landing Zone" + name = "LZ1: Communications Landing Zone" }, /turf/open/floor/plating, /area/bigredv2/outside/space_port) @@ -2548,7 +2548,8 @@ "ahv" = ( /obj/structure/surface/table/holotable/wood, /obj/item/paper_bin, -/turf/open/floor/wood, +/obj/item/tool/pen/clicky, +/turf/open/floor/carpet, /area/bigredv2/caves/lambda/breakroom) "ahw" = ( /obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node, @@ -3147,6 +3148,15 @@ /area/bigredv2/outside/marshal_office) "ajd" = ( /obj/structure/surface/table/holotable/wood, +/obj/structure/transmitter/colony_net/rotary{ + phone_category = "Lambda Labs"; + phone_color = "blue"; + phone_id = "Administration" + }, +/obj/item/clothing/mask/cigarette{ + pixel_x = 5; + pixel_y = 6 + }, /turf/open/floor/carpet, /area/bigredv2/caves/lambda/breakroom) "aje" = ( @@ -3198,7 +3208,8 @@ /area/bigredv2/outside/dorms) "ajm" = ( /obj/structure/filingcabinet, -/obj/effect/landmark/objective_landmark/science, +/obj/effect/landmark/objective_landmark/close, +/obj/effect/landmark/objective_landmark/medium, /turf/open/floor/wood, /area/bigredv2/caves/lambda/breakroom) "ajn" = ( @@ -3410,8 +3421,8 @@ /turf/open/floor, /area/bigredv2/outside/marshal_office) "ajO" = ( -/obj/structure/surface/table/holotable/wood, -/obj/item/tool/pen, +/obj/structure/machinery/prop/almayer/computer/PC, +/obj/structure/surface/table/woodentable/fancy, /turf/open/floor/carpet, /area/bigredv2/caves/lambda/breakroom) "ajP" = ( @@ -3501,8 +3512,8 @@ }, /area/bigredv2/outside/nw) "aka" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/landmark/objective_landmark/close, +/obj/structure/machinery/faxmachine, +/obj/structure/surface/table/woodentable/fancy, /turf/open/floor/wood, /area/bigredv2/caves/lambda/breakroom) "akc" = ( @@ -4484,16 +4495,14 @@ /turf/open/floor/plating, /area/bigredv2/outside/dorms) "amW" = ( -/obj/structure/machinery/door_control{ - id = "safe_room"; - layer = 4; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -5; - req_access_txt = "7"; - specialfunctions = 4 +/obj/structure/machinery/light{ + dir = 1 + }, +/obj/structure/closet/crate/freezer/rations, +/turf/open/floor{ + dir = 1; + icon_state = "elevatorshaft" }, -/turf/closed/wall/solaris/reinforced, /area/bigredv2/caves/lambda/breakroom) "amX" = ( /obj/structure/window/framed/solaris/reinforced, @@ -5896,9 +5905,13 @@ }, /area/bigredv2/outside/general_offices) "aqX" = ( -/obj/structure/closet/crate/freezer/rations, /obj/item/storage/toolbox/mechanical, /obj/item/device/multitool, +/obj/structure/window/reinforced{ + dir = 4; + health = 80 + }, +/obj/structure/surface/rack, /turf/open/floor{ dir = 1; icon_state = "elevatorshaft" @@ -5914,8 +5927,15 @@ }, /area/bigredv2/caves/lambda/breakroom) "aqZ" = ( -/obj/structure/closet/fireaxecabinet{ - pixel_y = 32 +/obj/structure/noticeboard{ + dir = 1; + pixel_y = 30; + desc = "A board for pinning important items upon."; + name = "trophy board" + }, +/obj/item/XenoBio/Chitin{ + pixel_y = 27; + anchored = 1 }, /turf/open/floor{ dir = 1; @@ -5923,8 +5943,11 @@ }, /area/bigredv2/caves/lambda/breakroom) "ara" = ( -/obj/structure/surface/table/holotable/wood, -/obj/item/device/flashlight/lamp, +/obj/structure/surface/table/woodentable/fancy, +/obj/item/device/flashlight/lamp{ + pixel_y = 15 + }, +/obj/item/paper/bigred/lambda, /turf/open/floor{ dir = 1; icon_state = "elevatorshaft" @@ -6141,9 +6164,7 @@ /obj/item/ammo_magazine/shotgun/incendiary, /obj/item/ammo_magazine/shotgun/incendiary, /obj/item/weapon/gun/shotgun/combat, -/obj/structure/window/reinforced{ - dir = 1 - }, +/obj/structure/machinery/door/window/eastleft, /turf/open/floor{ dir = 1; icon_state = "elevatorshaft" @@ -6157,7 +6178,7 @@ /area/bigredv2/caves/lambda/breakroom) "arG" = ( /obj/structure/bed, -/obj/item/bedsheet/captain, +/obj/item/bedsheet/rd, /turf/open/floor{ dir = 1; icon_state = "elevatorshaft" @@ -6387,8 +6408,9 @@ /area/bigredv2/outside/ne) "asn" = ( /obj/structure/surface/rack, -/obj/structure/window/reinforced, /obj/item/clothing/suit/armor/vest, +/obj/structure/machinery/door/window/eastright, +/obj/structure/window/reinforced, /turf/open/floor{ dir = 1; icon_state = "elevatorshaft" @@ -6405,9 +6427,7 @@ }, /area/bigredv2/caves/lambda/breakroom) "asp" = ( -/obj/structure/bed/chair/office/light{ - dir = 4 - }, +/obj/structure/bed/chair/comfy/black, /turf/open/floor/wood, /area/bigredv2/caves/lambda/breakroom) "asq" = ( @@ -6417,7 +6437,7 @@ }, /area/bigredv2/outside/medical) "asr" = ( -/obj/structure/bed/chair{ +/obj/structure/bed/chair/comfy{ dir = 8 }, /turf/open/floor/carpet, @@ -6690,9 +6710,12 @@ /area/bigredv2/outside/chapel) "ate" = ( /obj/structure/machinery/door_control{ - id = "safe_blast"; - name = "Blast Door"; - pixel_y = -25 + id = "safe_room"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -28; + req_access_txt = "106"; + specialfunctions = 4 }, /turf/open/floor{ dir = 1; @@ -6700,12 +6723,8 @@ }, /area/bigredv2/caves/lambda/breakroom) "atf" = ( -/obj/structure/closet/crate/medical, -/obj/item/storage/firstaid/adv, -/obj/item/storage/firstaid/o2, -/obj/item/storage/firstaid/toxin, -/obj/item/storage/firstaid/rad, -/obj/effect/landmark/objective_landmark/medium, +/obj/structure/closet/secure_closet/RD, +/obj/effect/landmark/objective_landmark/science, /turf/open/floor{ dir = 1; icon_state = "elevatorshaft" @@ -6918,7 +6937,7 @@ dir = 1; icon_state = "door_locked"; id = "safe_room"; - name = "\improper Lambda Lab Secure Storage" + name = "\improper Lambda Lab Director's Safe Room" }, /turf/open/floor{ icon_state = "delivery" @@ -7145,7 +7164,7 @@ /area/bigredv2/outside/office_complex) "aum" = ( /obj/structure/machinery/door/airlock/almayer/research/glass/colony{ - name = "\improper Lambda Lab Administration Office" + name = "\improper Lambda Lab Director's Office" }, /turf/open/floor{ icon_state = "delivery" @@ -7718,7 +7737,6 @@ /turf/open/floor/wood, /area/bigredv2/caves/lambda/breakroom) "avN" = ( -/obj/structure/bed/chair, /obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node, /turf/open/floor/carpet, /area/bigredv2/caves/lambda/breakroom) @@ -7982,8 +8000,19 @@ /turf/open/mars, /area/bigredv2/outside/ne) "awz" = ( -/obj/structure/surface/table/holotable/wood, -/obj/item/XenoBio/Chitin, +/obj/item/ashtray/bronze{ + pixel_x = -7 + }, +/obj/item/trash/cigbutt, +/obj/item/trash/cigbutt{ + pixel_x = 7; + pixel_y = 7 + }, +/obj/item/trash/cigbutt{ + pixel_x = -10; + pixel_y = 14 + }, +/obj/structure/surface/table/woodentable/fancy, /turf/open/floor/carpet, /area/bigredv2/caves/lambda/breakroom) "awA" = ( @@ -7998,13 +8027,12 @@ }, /area/bigredv2/caves/lambda/research) "awB" = ( -/obj/structure/surface/table/holotable/wood, -/obj/item/reagent_container/food/drinks/coffee, /obj/structure/transmitter/colony_net/rotary{ phone_category = "Lambda Labs"; phone_color = "blue"; - phone_id = "Administration" + phone_id = "Director" }, +/obj/structure/surface/table/woodentable/fancy, /turf/open/floor/carpet, /area/bigredv2/caves/lambda/breakroom) "awC" = ( @@ -8253,10 +8281,10 @@ }, /area/bigredv2/caves/lambda/virology) "axo" = ( -/obj/structure/bed/chair/office/light{ +/obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node, +/obj/structure/bed/chair/comfy/black{ dir = 8 }, -/obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node, /turf/open/floor/wood, /area/bigredv2/caves/lambda/breakroom) "axp" = ( @@ -8711,6 +8739,12 @@ /area/bigredv2/caves/lambda/breakroom) "ayB" = ( /obj/structure/machinery/light, +/obj/structure/surface/table/woodentable, +/obj/item/storage/fancy/cigarettes/wypacket{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/tool/lighter/zippo, /turf/open/floor/carpet, /area/bigredv2/caves/lambda/breakroom) "ayC" = ( @@ -10831,8 +10865,10 @@ }, /area/bigredv2/caves/lambda/research) "aEs" = ( -/obj/structure/surface/table/holotable/wood, -/turf/open/floor/wood, +/obj/structure/bed/chair/comfy/lime{ + dir = 8 + }, +/turf/open/floor/carpet, /area/bigredv2/caves/lambda/breakroom) "aEt" = ( /obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node, @@ -11491,9 +11527,7 @@ }, /area/bigredv2/caves/lambda/research) "aGh" = ( -/obj/structure/bed/chair/office/light{ - dir = 1 - }, +/obj/structure/filingcabinet/filingcabinet, /turf/open/floor/wood, /area/bigredv2/caves/lambda/breakroom) "aGi" = ( @@ -19537,7 +19571,7 @@ /turf/open/floor, /area/bigredv2/outside/cargo) "bcy" = ( -/obj/structure/machinery/vending/cigarette, +/obj/structure/machinery/vending/cigarette/colony, /turf/open/floor, /area/bigredv2/outside/cargo) "bcz" = ( @@ -21454,7 +21488,7 @@ /area/bigredv2/outside/space_port_lz2) "biI" = ( /obj/docking_port/stationary/marine_dropship/lz2{ - name = "Engineering Landing Zone" + name = "LZ2: Engineering Landing Zone" }, /turf/open/floor/plating, /area/bigredv2/outside/space_port_lz2) @@ -29670,6 +29704,10 @@ icon_state = "darkyellowcorners2" }, /area/bigredv2/caves/eta/living) +"fnv" = ( +/obj/structure/bed/chair/comfy, +/turf/open/floor/carpet, +/area/bigredv2/caves/lambda/breakroom) "fnO" = ( /turf/open/mars_cave{ icon_state = "mars_cave_13" @@ -30300,7 +30338,7 @@ do_not_disturb = 1; phone_category = "Lambda Labs"; phone_color = "red"; - phone_id = "Secure Storage"; + phone_id = "Director's Safe Room"; pixel_x = -18 }, /turf/open/floor{ @@ -30986,7 +31024,7 @@ }, /area/bigredv2/outside/lambda_cave_cas) "hSP" = ( -/obj/structure/machinery/vending/cigarette, +/obj/structure/machinery/vending/cigarette/colony, /turf/open/mars_cave{ icon_state = "mars_dirt_6" }, @@ -32672,6 +32710,12 @@ icon_state = "wood" }, /area/bigredv2/outside/admin_building) +"kIF" = ( +/obj/structure/bed/chair/comfy/orange{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/bigredv2/caves/lambda/breakroom) "kIW" = ( /obj/structure/fence, /turf/open/floor{ @@ -33067,6 +33111,12 @@ /obj/structure/blocker/forcefield/multitile_vehicles, /turf/closed/wall/solaris/reinforced, /area/bigredv2/caves) +"lAF" = ( +/obj/item/paper_bin, +/obj/item/tool/pen, +/obj/structure/surface/table/woodentable/fancy, +/turf/open/floor/wood, +/area/bigredv2/caves/lambda/breakroom) "lAK" = ( /obj/effect/landmark/static_comms/net_two, /turf/open/floor{ @@ -34629,6 +34679,10 @@ icon_state = "dark" }, /area/bigredv2/caves/eta/research) +"orT" = ( +/obj/structure/machinery/vending/coffee, +/turf/open/floor/carpet, +/area/bigredv2/caves/lambda/breakroom) "orZ" = ( /obj/structure/closet/secure_closet/atmos_personal, /obj/effect/landmark/objective_landmark/medium, @@ -36192,6 +36246,12 @@ icon_state = "mars_cave_13" }, /area/bigredv2/caves/mining) +"reL" = ( +/obj/effect/landmark/nightmare{ + insert_tag = "vault_v2" + }, +/turf/closed/wall/solaris/rock, +/area/bigredv2/caves) "rfe" = ( /obj/structure/platform/kutjevo/rock{ dir = 8 @@ -36653,6 +36713,17 @@ }, /turf/open/floor/plating, /area/bigredv2/caves/mining) +"rUs" = ( +/obj/structure/machinery/door_control{ + id = "safe_room"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_y = 28; + req_access_txt = "106"; + specialfunctions = 4 + }, +/turf/open/floor/wood, +/area/bigredv2/caves/lambda/breakroom) "rUN" = ( /obj/structure/platform{ dir = 4 @@ -37316,6 +37387,10 @@ icon_state = "mars_cave_19" }, /area/bigredv2/outside/lz2_south_cas) +"sUQ" = ( +/obj/structure/machinery/photocopier, +/turf/open/floor/wood, +/area/bigredv2/caves/lambda/breakroom) "sWa" = ( /obj/item/ore{ pixel_x = 12; @@ -39478,6 +39553,10 @@ icon_state = "mars_dirt_4" }, /area/bigredv2/caves/mining) +"wCs" = ( +/obj/structure/machinery/vending/cigarette/colony, +/turf/open/floor/carpet, +/area/bigredv2/caves/lambda/breakroom) "wDa" = ( /obj/effect/decal/cleanable/blood/drip{ pixel_x = 6 @@ -76696,9 +76775,9 @@ asn gvI amk ajm -aqc +sUQ avM -aqc +lAF aka amk tQw @@ -76914,9 +76993,9 @@ atc amk auj auY -auY +fnv awz -ahv +aqc amk aao tQw @@ -77341,14 +77420,14 @@ adZ afd afd adZ -aqY +amW arF arF ate -amW -aqc -auY +amk +rUs auY +fnv awB aqc amk @@ -78001,7 +78080,7 @@ agd agd amX awC -axp +kIF axp ayA amk @@ -78220,7 +78299,7 @@ avO auY aqc axT -auY +wCs amk anI aAM @@ -78437,7 +78516,7 @@ auy auY aqc aqc -auY +orT amk anI aAN @@ -78652,8 +78731,8 @@ agd agd amX awD -auY -auY +aEs +aEs ayB amk anI @@ -78859,8 +78938,8 @@ adZ anQ amK adZ -aEs -aGh +sUQ +aqc aqc asp aqc @@ -79077,7 +79156,7 @@ anR amM adZ adZ -aqc +aGh ahv ajd aqc @@ -79295,7 +79374,7 @@ anS apv adZ adZ -aqc +auY asr aqc amX @@ -82127,7 +82206,7 @@ aao aao jgW aig -aao +reL aao anI anI diff --git a/maps/map_files/BigRed/sprinkles/25.vault_v2.dmm b/maps/map_files/BigRed/sprinkles/25.vault_v2.dmm index 566f892d6fdd..f62f085e7ea2 100644 --- a/maps/map_files/BigRed/sprinkles/25.vault_v2.dmm +++ b/maps/map_files/BigRed/sprinkles/25.vault_v2.dmm @@ -1,508 +1,652 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( -/turf/open/mars, -/area/bigredv2/outside/c) +/obj/structure/inflatable/popped/door, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = -11; + pixel_y = 10 + }, +/turf/open/floor{ + icon_state = "darkpurplecorners2" + }, +/area/bigredv2/caves/lambda/breakroom) "ab" = ( -/turf/open/mars{ - icon_state = "mars_dirt_8" +/obj/effect/decal/cleanable/blood/drip{ + pixel_y = 6 }, -/area/bigredv2/outside/c) +/turf/open/floor{ + dir = 4; + icon_state = "darkpurplecorners2" + }, +/area/bigredv2/caves/lambda/breakroom) "ac" = ( +/obj/item/tool/pickaxe/drill, +/obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node, /turf/open/mars_cave{ - icon_state = "mars_dirt_4" + icon_state = "mars_cave_2" }, -/area/bigredv2/outside/c) +/area/bigredv2/caves_lambda) "ad" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/mars_cave{ - icon_state = "mars_dirt_4" - }, -/area/bigredv2/outside/c) +/obj/effect/glowshroom, +/turf/open/mars_cave, +/area/bigredv2/caves_lambda) "ae" = ( -/turf/open/mars{ - icon_state = "mars_dirt_3" +/obj/effect/glowshroom, +/turf/open/mars_cave{ + icon_state = "mars_cave_7" }, -/area/bigredv2/outside/c) +/area/bigredv2/caves_lambda) "af" = ( -/obj/effect/landmark/crap_item, -/turf/open/mars, -/area/bigredv2/outside/c) +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/mars_cave{ + icon_state = "mars_cave_7" + }, +/area/bigredv2/caves_lambda) "ag" = ( -/turf/open/mars{ - icon_state = "mars_dirt_9" +/obj/structure/barricade/wooden, +/turf/open/floor{ + dir = 4; + icon_state = "darkpurplecorners2" }, -/area/bigredv2/outside/c) +/area/bigredv2/caves/lambda/breakroom) "ah" = ( -/turf/open/mars{ - icon_state = "mars_dirt_13" +/obj/effect/glowshroom, +/turf/open/mars_cave{ + icon_state = "mars_cave_10" }, -/area/bigredv2/outside/c) +/area/bigredv2/caves_lambda) "ai" = ( -/turf/open/mars{ - icon_state = "mars_dirt_10" +/turf/open/mars_cave{ + icon_state = "mars_cave_6" }, -/area/bigredv2/outside/c) +/area/bigredv2/caves_lambda) "aj" = ( -/turf/open/mars{ - icon_state = "mars_dirt_14" +/obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node, +/turf/open/mars_cave{ + icon_state = "mars_cave_11" }, -/area/bigredv2/outside/c) +/area/bigredv2/caves_lambda) "ak" = ( +/turf/closed/wall/solaris/rock, +/area/bigredv2/caves) +"al" = ( +/obj/structure/sign/safety/restrictedarea{ + pixel_x = 8; + pixel_y = -32 + }, +/obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node, /turf/open/floor{ - dir = 1; - icon_state = "asteroidwarning" + dir = 4; + icon_state = "darkpurplecorners2" }, -/area/bigredv2/outside/c) -"al" = ( -/turf/closed/wall/solaris/reinforced, -/area/bigredv2/outside/storage) +/area/bigredv2/caves/lambda/breakroom) "am" = ( -/obj/structure/largecrate/hunter_games_guns/mediocre, -/turf/open/floor, -/area/bigredv2/outside/storage) +/obj/structure/machinery/door_control{ + id = "sci_br"; + name = "Observation Shutters"; + pixel_y = 28 + }, +/obj/effect/decal/cleanable/blood/gibs/xeno, +/turf/open/floor{ + icon_state = "darkpurplecorners2" + }, +/area/bigredv2/caves/lambda/breakroom) "an" = ( -/obj/structure/largecrate/supply/floodlights, -/turf/open/floor, -/area/bigredv2/outside/storage) +/obj/effect/decal/cleanable/mucus, +/obj/structure/machinery/door_control{ + id = "sci_br"; + name = "Observation Shutters"; + pixel_y = 28 + }, +/obj/effect/landmark/corpsespawner/pmc, +/obj/effect/decal/cleanable/vomit, +/turf/open/floor{ + icon_state = "darkpurplecorners2" + }, +/area/bigredv2/caves/lambda/breakroom) "ao" = ( -/turf/open/floor, -/area/bigredv2/outside/storage) +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = -8; + pixel_y = 6 + }, +/turf/open/floor{ + icon_state = "darkpurplecorners2" + }, +/area/bigredv2/caves/lambda/breakroom) "ap" = ( -/obj/structure/surface/table, -/obj/effect/spawner/random/technology_scanner, -/turf/open/floor, -/area/bigredv2/outside/storage) +/obj/structure/sign/safety/bulkhead_door, +/turf/closed/wall/solaris/reinforced, +/area/bigredv2/caves/lambda/breakroom) "aq" = ( -/obj/structure/surface/table, -/obj/structure/machinery/power/apc{ - dir = 1 +/turf/open/floor/almayer{ + dir = 1; + icon_state = "w-y0" }, -/obj/effect/spawner/random/powercell, -/obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot, -/turf/open/floor, -/area/bigredv2/outside/storage) +/area/bigredv2/caves/lambda/breakroom) "ar" = ( -/obj/structure/surface/table, -/obj/structure/machinery/light{ - dir = 1 +/obj/structure/filingcabinet{ + density = 0; + layer = 3.1; + pixel_x = 8; + pixel_y = 18 + }, +/obj/structure/filingcabinet{ + density = 0; + pixel_x = -8; + pixel_y = 20 + }, +/turf/open/floor/strata{ + dir = 4; + icon_state = "white_cyan1" }, -/obj/effect/spawner/random/tech_supply, -/obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot, -/turf/open/floor, -/area/bigredv2/outside/storage) +/area/bigredv2/caves/lambda/breakroom) "as" = ( -/obj/structure/surface/table, -/obj/effect/spawner/random/tool, -/turf/open/floor, -/area/bigredv2/outside/storage) +/obj/structure/filingcabinet{ + pixel_x = 7 + }, +/obj/structure/filingcabinet{ + density = 0; + pixel_x = -7; + pixel_y = 19 + }, +/obj/structure/filingcabinet{ + pixel_x = -9 + }, +/turf/open/floor/strata{ + dir = 4; + icon_state = "white_cyan1" + }, +/area/bigredv2/caves/lambda/breakroom) "at" = ( -/obj/structure/surface/table, -/obj/effect/spawner/random/tech_supply, -/turf/open/floor, -/area/bigredv2/outside/storage) +/turf/open/floor/plating/almayer, +/area/bigredv2/caves/lambda/breakroom) "au" = ( -/obj/structure/surface/table, -/obj/effect/spawner/random/toolbox, -/turf/open/floor, -/area/bigredv2/outside/storage) +/turf/open/floor/strata{ + dir = 4; + icon_state = "white_cyan1" + }, +/area/bigredv2/caves/lambda/breakroom) "av" = ( -/obj/structure/surface/table, -/obj/item/tool/extinguisher, -/turf/open/floor, -/area/bigredv2/outside/storage) +/obj/structure/filingcabinet{ + density = 0; + pixel_x = 8; + pixel_y = 20 + }, +/obj/structure/filingcabinet{ + density = 0; + pixel_x = -8; + pixel_y = 16 + }, +/turf/open/floor/strata{ + dir = 4; + icon_state = "white_cyan1" + }, +/area/bigredv2/caves/lambda/breakroom) "aw" = ( -/obj/structure/largecrate/supply/generator, -/turf/open/floor, -/area/bigredv2/outside/storage) +/obj/structure/inflatable/popped/door, +/turf/open/floor{ + icon_state = "darkpurplecorners2" + }, +/area/bigredv2/caves/lambda/breakroom) "ax" = ( -/obj/structure/largecrate/random/secure, -/turf/open/floor, -/area/bigredv2/outside/storage) -"aA" = ( -/obj/structure/pipes/standard/simple/hidden/green{ - dir = 6 +/obj/structure/machinery/light{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood, +/turf/open/floor{ + icon_state = "darkpurplecorners2" }, -/turf/open/floor, -/area/bigredv2/outside/storage) +/area/bigredv2/caves/lambda/breakroom) +"aA" = ( +/turf/template_noop, +/area/template_noop) "aB" = ( -/obj/structure/pipes/standard/simple/hidden/green{ - dir = 4; - layer = 2.4 +/turf/open/floor/almayer{ + dir = 1; + icon_state = "w-y1" }, -/turf/open/floor, -/area/bigredv2/outside/storage) +/area/bigredv2/caves/lambda/breakroom) "aC" = ( -/obj/structure/pipes/standard/simple/hidden/green{ +/obj/structure/machinery/light, +/turf/open/floor{ dir = 4; - layer = 2.4 - }, -/obj/structure/machinery/door/airlock/almayer/secure/colony{ - icon_state = "door_locked"; - locked = 0; - name = "\improper Emergency Vault" + icon_state = "darkpurplecorners2" }, -/turf/open/floor, -/area/bigredv2/outside/storage) +/area/bigredv2/caves/lambda/breakroom) "aD" = ( -/obj/structure/largecrate/supply/supplies/water, -/turf/open/floor, -/area/bigredv2/outside/storage) +/obj/structure/inflatable/popped/door, +/turf/open/floor{ + dir = 4; + icon_state = "darkpurplecorners2" + }, +/area/bigredv2/caves/lambda/breakroom) "aE" = ( -/obj/structure/largecrate/random, -/turf/open/floor, -/area/bigredv2/outside/storage) +/turf/open/floor{ + dir = 4; + icon_state = "darkpurplecorners2" + }, +/area/bigredv2/caves/lambda/breakroom) "aF" = ( -/obj/structure/pipes/standard/simple/hidden/green, -/turf/open/floor, -/area/bigredv2/outside/storage) +/obj/structure/machinery/light{ + dir = 1 + }, +/obj/structure/surface/table/reinforced/prison, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/machinery/door/window/brigdoor/southright, +/obj/item/clothing/accessory/medal/gold{ + pixel_x = 7; + pixel_y = 10 + }, +/obj/item/clothing/accessory/medal/bronze/science{ + pixel_x = -5 + }, +/turf/open/floor/strata{ + dir = 4; + icon_state = "white_cyan1" + }, +/area/bigredv2/caves/lambda/breakroom) "aG" = ( -/obj/structure/largecrate/supply/medicine/medkits, -/turf/open/floor, -/area/bigredv2/outside/storage) +/obj/structure/window/framed/solaris/reinforced, +/obj/structure/machinery/door/poddoor/almayer{ + id = "sci_br"; + name = "\improper Lambda Observation Shutters" + }, +/turf/open/floor/plating, +/area/bigredv2/caves/lambda/breakroom) "aH" = ( -/obj/structure/largecrate/supply/medicine/blood, -/turf/open/floor, -/area/bigredv2/outside/storage) +/obj/structure/barricade/wooden{ + dir = 1; + pixel_y = 7 + }, +/turf/open/floor{ + icon_state = "darkpurplecorners2" + }, +/area/bigredv2/caves/lambda/breakroom) "aI" = ( -/obj/structure/largecrate/supply/medicine/iv, -/turf/open/floor, -/area/bigredv2/outside/storage) +/turf/closed/wall/solaris/reinforced, +/area/bigredv2/caves/lambda/breakroom) "aJ" = ( /obj/structure/machinery/light, -/turf/open/floor, -/area/bigredv2/outside/storage) -"aK" = ( -/obj/structure/pipes/vents/pump{ - dir = 1 - }, -/obj/structure/surface/table, -/obj/effect/spawner/random/toolbox, -/turf/open/floor, -/area/bigredv2/outside/storage) -"aL" = ( -/obj/structure/surface/table, -/obj/structure/machinery/light, -/obj/effect/spawner/random/powercell, -/turf/open/floor, -/area/bigredv2/outside/storage) -"aM" = ( -/obj/structure/pipes/standard/simple/hidden/green{ +/turf/open/floor/strata{ dir = 4; - layer = 2.4 + icon_state = "white_cyan1" }, -/turf/open/floor{ - icon_state = "asteroidwarning" +/area/bigredv2/caves/lambda/breakroom) +"aK" = ( +/obj/structure/surface/table/reinforced/prison, +/obj/structure/machinery/door_control{ + id = "vault"; + name = "Vault Lockdown" }, -/area/bigredv2/outside/s) -"aN" = ( -/obj/structure/pipes/standard/simple/hidden/green{ +/turf/open/floor/strata{ dir = 4; - layer = 2.4 - }, -/turf/open/floor{ - dir = 1; - icon_state = "asteroidfloor" + icon_state = "white_cyan1" }, -/area/bigredv2/outside/s) -"aO" = ( -/obj/structure/pipes/standard/manifold/hidden/green{ - dir = 1 +/area/bigredv2/caves/lambda/breakroom) +"aL" = ( +/obj/structure/surface/table/reinforced/prison, +/obj/item/spacecash/c1000, +/obj/item/spacecash/c1000, +/obj/item/spacecash/c1000, +/obj/item/spacecash/c1000, +/turf/open/floor/strata{ + dir = 4; + icon_state = "white_cyan1" }, -/turf/open/floor{ +/area/bigredv2/caves/lambda/breakroom) +"aM" = ( +/turf/open/floor/almayer{ dir = 1; - icon_state = "asteroidfloor" + icon_state = "w-y2" }, -/area/bigredv2/outside/s) +/area/bigredv2/caves/lambda/breakroom) +"aN" = ( +/turf/open/mars_cave, +/area/bigredv2/caves_lambda) "aP" = ( -/turf/open/mars{ - icon_state = "mars_dirt_3" +/turf/open/mars_cave{ + icon_state = "mars_cave_7" }, -/area/bigredv2/outside/s) +/area/bigredv2/caves_lambda) "aQ" = ( /turf/open/mars_cave{ - icon_state = "mars_dirt_4" + icon_state = "mars_cave_18" }, -/area/bigredv2/outside/s) +/area/bigredv2/caves_lambda) "aR" = ( -/turf/open/floor{ - dir = 8; - icon_state = "asteroidwarning" +/obj/structure/filingcabinet{ + density = 0; + pixel_x = 8; + pixel_y = 19 }, -/area/bigredv2/outside/s) -"aS" = ( -/obj/structure/pipes/standard/simple/hidden/green, -/turf/open/floor{ +/obj/structure/filingcabinet{ + density = 0; + pixel_x = -9; + pixel_y = 20 + }, +/turf/open/floor/strata{ dir = 4; - icon_state = "asteroidwarning" + icon_state = "white_cyan1" + }, +/area/bigredv2/caves/lambda/breakroom) +"aS" = ( +/obj/effect/glowshroom, +/turf/open/mars_cave{ + icon_state = "mars_cave_2" }, -/area/bigredv2/outside/s) +/area/bigredv2/caves_lambda) "aT" = ( -/turf/open/mars, -/area/bigredv2/outside/s) -"aU" = ( -/turf/open/mars{ - icon_state = "mars_dirt_11" +/turf/open/mars_cave{ + icon_state = "mars_cave_4" }, -/area/bigredv2/outside/s) +/area/bigredv2/caves_lambda) "aV" = ( -/turf/open/mars{ - icon_state = "mars_dirt_9" +/obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node, +/turf/open/mars_cave{ + icon_state = "mars_cave_2" }, -/area/bigredv2/outside/s) +/area/bigredv2/caves_lambda) "aW" = ( -/turf/open/mars{ - icon_state = "mars_dirt_8" +/obj/structure/machinery/door/airlock/almayer/secure/reinforced/colony{ + icon_state = "door_locked" }, -/area/bigredv2/outside/s) +/obj/structure/machinery/door/poddoor/almayer/closed{ + dir = 4; + id = "vault"; + name = "Vault Lockdown" + }, +/turf/open/floor{ + icon_state = "delivery" + }, +/area/bigredv2/caves/lambda/breakroom) "aX" = ( -/turf/open/mars{ - icon_state = "mars_dirt_10" +/turf/open/mars_cave{ + icon_state = "mars_cave_8" }, -/area/bigredv2/outside/s) +/area/bigredv2/caves_lambda) "aY" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor{ - dir = 8; - icon_state = "asteroidwarning" +/turf/open/mars_cave{ + icon_state = "mars_cave_10" }, -/area/bigredv2/outside/s) +/area/bigredv2/caves_lambda) "aZ" = ( -/turf/open/mars{ - icon_state = "mars_dirt_12" +/turf/open/mars_cave{ + icon_state = "mars_cave_5" }, -/area/bigredv2/outside/s) +/area/bigredv2/caves_lambda) "ba" = ( -/obj/effect/landmark/crap_item, -/turf/open/mars, -/area/bigredv2/outside/s) +/turf/open/mars_cave{ + icon_state = "mars_cave_2" + }, +/area/bigredv2/caves_lambda) +"vm" = ( +/obj/item/shard{ + icon_state = "small" + }, +/turf/open/mars_cave{ + icon_state = "mars_cave_18" + }, +/area/bigredv2/caves_lambda) "zP" = ( -/obj/structure/surface/table, -/obj/effect/spawner/random/technology_scanner, -/obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot, -/turf/open/floor, -/area/bigredv2/outside/storage) +/obj/effect/glowshroom, +/turf/open/mars_cave{ + icon_state = "mars_cave_5" + }, +/area/bigredv2/caves_lambda) +"EW" = ( +/obj/structure/machinery/door/poddoor/almayer{ + id = "sci_br"; + name = "\improper Lambda Observation Shutters" + }, +/obj/item/shard{ + icon_state = "medium" + }, +/obj/structure/window_frame/solaris/reinforced, +/turf/open/floor/plating, +/area/bigredv2/caves/lambda/breakroom) +"Gv" = ( +/obj/structure/machinery/door/poddoor/almayer{ + id = "sci_br"; + name = "\improper Lambda Observation Shutters" + }, +/obj/item/shard, +/obj/structure/window_frame/solaris/reinforced, +/turf/open/floor/plating, +/area/bigredv2/caves/lambda/breakroom) +"RW" = ( +/obj/item/shard{ + icon_state = "medium" + }, +/turf/open/mars_cave{ + icon_state = "mars_cave_6" + }, +/area/bigredv2/caves_lambda) (1,1,1) = {" -aa -aa -aa -ak -al -al -al -al -al +aA +aA +aA +aA +aA +aI +am al -aM -aP +aI +aA +aA +aY aT -aX +ak "} (2,1,1) = {" -aa -aa -aa -ak -al -am +aA +aA +aA +aA +zP +aG aw aD aG -al -aM -aP -aT +ai +ai +aZ +ba aX "} (3,1,1) = {" -aa -aa +aA +aA ah -ak -al -an -ax -aE +ai +ai +aG aH -al -aM +aE +aG aP -aT -aX +ba +aP +ai +aZ "} (4,1,1) = {" -aa -aa -ai -ak -al -ao +aA +ae +aP +ba +aZ +aI ax -ao +aC aI -al -aM -aP -aT -aX +ae +RW +ac +ba +aZ "} (5,1,1) = {" -aa -aa ai -ak -al -ao -ao +ai +aj +ad +aZ +aG ao -aJ -al -aM -aQ -aU -aQ +ag +EW +af +ba +ba +ba +aZ "} (6,1,1) = {" -aa -aa +aY ai -ak -al -zP -ao -ao -as -al +ai +ba +ba +aG +aa +aD +Gv +vm aN -aR -aR -aY +aS +ba +aZ "} (7,1,1) = {" -aa -aa -aj +ba +ba ak -al -aq -ao -ao +ak +ak +aI +an +ab ap -al -aO -aS -aS +aA +aA +aP aS +aZ "} (8,1,1) = {" -aa -aa -aa +ba ak -al -ar -ao -ao -as -al -aM -aQ -aQ -aQ +ak +aI +aI +aI +aI +aW +aI +aI +aA +ba +aP +aZ "} (9,1,1) = {" -aa -aa -aa +aZ ak -al +ak +aI +aR as -aA -aF +au +au aK -al -aM -aQ -aQ -aQ +aI +aA +aY +ba +aZ "} (10,1,1) = {" -aa -af -aa ak -al -as -aB -ao +aA +aA +aI au -al -aM -aQ -aQ +at +aq +at +au +aI +aA +aP +ba aZ "} (11,1,1) = {" -ab -aa -aa ak -al +aA +aA +aI +aF at aB -ao -as -al -aM -aQ -aQ -aT +at +aJ +aI +aA +aP +ba +aZ "} (12,1,1) = {" -ac -ab -aa -ak -al +aA +aA +aA +aI au -aB -ao -aL -al +at aM +at +aL +aI +aA aQ aV -aT +ba "} (13,1,1) = {" -ad -ag -aa -ak -al +aA +aA +aA +aI +ar av -aB -ao -at -al -aM -aP -aT +aL +aL +aL +aI +aA +ba +ba ba "} (14,1,1) = {" -ae -aa -aa -ak -al -al -aC -al -al -al -aM -aQ -aW -aT +aA +aA +aA +aI +aI +aI +aI +aI +aI +aI +aA +ba +ba +ba "} diff --git a/maps/map_files/CORSAT/Corsat.dmm b/maps/map_files/CORSAT/Corsat.dmm index b00a12dc86bd..7029d71a6076 100644 --- a/maps/map_files/CORSAT/Corsat.dmm +++ b/maps/map_files/CORSAT/Corsat.dmm @@ -37445,7 +37445,7 @@ /area/corsat/gamma/biodome/virology) "drp" = ( /obj/docking_port/stationary/marine_dropship/lz1{ - name = "Gamma Landing Zone" + name = "LZ1: Gamma Landing Zone" }, /turf/open/floor/plating, /area/corsat/gamma/hangar) @@ -38222,7 +38222,7 @@ /area/corsat/omega/complex) "dUj" = ( /obj/docking_port/stationary/marine_dropship/lz2{ - name = "Sigma Landing Zone" + name = "LZ2: Sigma Landing Zone" }, /turf/open/floor/plating, /area/corsat/sigma/hangar) diff --git a/maps/map_files/FOP_v2_Cellblocks/Prison_Station_FOP.dmm b/maps/map_files/FOP_v2_Cellblocks/Prison_Station_FOP.dmm index 5da17a318887..ba9986948eed 100644 --- a/maps/map_files/FOP_v2_Cellblocks/Prison_Station_FOP.dmm +++ b/maps/map_files/FOP_v2_Cellblocks/Prison_Station_FOP.dmm @@ -5305,7 +5305,7 @@ /area/prison/hanger/research) "aoj" = ( /obj/docking_port/stationary/marine_dropship/lz2{ - name = "Research Landing Zone" + name = "LZ2: Research Landing Zone" }, /turf/open/floor/plating, /area/prison/hanger/research) @@ -19201,7 +19201,7 @@ /area/prison/hanger/main) "bcF" = ( /obj/docking_port/stationary/marine_dropship/lz1{ - name = "Hangar Landing Zone" + name = "LZ1: Hangar Landing Zone" }, /turf/open/floor/plating, /area/prison/hanger/main) diff --git a/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm b/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm index 7238b5ab66cb..bffe3f990722 100644 --- a/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm +++ b/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm @@ -6510,7 +6510,7 @@ /area/fiorina/station/disco) "dYp" = ( /obj/docking_port/stationary/marine_dropship/lz1{ - name = "Hangar Landing Zone" + name = "LZ1: Hangar Landing Zone" }, /turf/open/floor/plating/prison, /area/fiorina/lz/near_lzI) diff --git a/maps/map_files/Ice_Colony_v2/Ice_Colony_v2.dmm b/maps/map_files/Ice_Colony_v2/Ice_Colony_v2.dmm index 73bac536752f..485760ebc2af 100644 --- a/maps/map_files/Ice_Colony_v2/Ice_Colony_v2.dmm +++ b/maps/map_files/Ice_Colony_v2/Ice_Colony_v2.dmm @@ -34904,7 +34904,7 @@ /area/ice_colony/surface/hangar/alpha) "sto" = ( /obj/docking_port/stationary/marine_dropship/lz1{ - name = "Hangar Landing Zone" + name = "LZ1: Hangar Landing Zone" }, /turf/open/floor/plating, /area/ice_colony/exterior/surface/landing_pad) diff --git a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm index f5e2f597ef24..60847e12bae1 100644 --- a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm +++ b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm @@ -17375,7 +17375,7 @@ /area/shiva/interior/caves/s_lz2) "mlX" = ( /obj/docking_port/stationary/marine_dropship/lz2{ - name = "Research Landing Zone" + name = "LZ2: Research Landing Zone" }, /turf/open/floor/plating, /area/shiva/exterior/lz2_fortress) diff --git a/maps/map_files/Kutjevo/Kutjevo.dmm b/maps/map_files/Kutjevo/Kutjevo.dmm index 4eb4d6fd77e9..2e1ebb3ea204 100644 --- a/maps/map_files/Kutjevo/Kutjevo.dmm +++ b/maps/map_files/Kutjevo/Kutjevo.dmm @@ -576,6 +576,10 @@ }, /turf/open/auto_turf/sand/layer0, /area/kutjevo/exterior/scrubland) +"aKg" = ( +/obj/structure/tunnel, +/turf/open/auto_turf/sand/layer0, +/area/kutjevo/interior/colony_South) "aKl" = ( /obj/structure/machinery/landinglight/ds1{ dir = 1 @@ -984,7 +988,7 @@ "bsq" = ( /obj/structure/tunnel, /turf/open/auto_turf/sand/layer0, -/area/kutjevo/interior/colony_central) +/area/kutjevo/interior/colony_north) "bsw" = ( /obj/structure/platform/kutjevo/smooth{ dir = 8 @@ -4883,7 +4887,7 @@ /area/kutjevo/interior/oob) "gnj" = ( /obj/docking_port/stationary/marine_dropship/lz1{ - name = "Dunes Landing Zone" + name = "LZ1: Dunes Landing Zone" }, /turf/open/floor/plating/kutjevo, /area/shuttle/drop1/kutjevo) @@ -8316,7 +8320,7 @@ /area/kutjevo/interior/power/comms) "lkY" = ( /obj/docking_port/stationary/marine_dropship/lz2{ - name = "NW Colony Landing Zone" + name = "LZ2: NW Colony Landing Zone" }, /turf/open/floor/plating/kutjevo, /area/shuttle/drop2/kutjevo) @@ -8853,11 +8857,9 @@ /turf/open/floor/almayer/research/containment/floor2, /area/kutjevo/interior/complex/med/auto_doc) "lZT" = ( -/obj/structure/tunnel{ - id = "hole1" - }, -/turf/open/auto_turf/sand/layer2, -/area/kutjevo/interior/colony_north) +/obj/structure/tunnel, +/turf/open/auto_turf/sand/layer1, +/area/kutjevo/exterior/construction) "lZZ" = ( /obj/structure/platform_decoration/kutjevo{ dir = 4 @@ -9796,11 +9798,9 @@ /turf/open/desert/desert_shore/shore_corner2, /area/kutjevo/exterior/runoff_river) "niP" = ( -/obj/structure/tunnel{ - id = "hole3" - }, +/obj/structure/tunnel, /turf/open/auto_turf/sand/layer0, -/area/kutjevo/exterior/complex_border/botany_medical_cave) +/area/kutjevo/exterior/runoff_river) "niT" = ( /obj/structure/flora/grass/tallgrass/desert/corner{ dir = 1 @@ -11982,6 +11982,10 @@ }, /turf/open/floor/kutjevo/colors/cyan/inner_corner, /area/kutjevo/interior/complex/med/triage) +"pVH" = ( +/obj/structure/tunnel, +/turf/open/auto_turf/sand/layer2, +/area/kutjevo/exterior/runoff_river) "pWe" = ( /obj/structure/platform_decoration/kutjevo/rock{ dir = 1 @@ -12502,11 +12506,9 @@ }, /area/kutjevo/interior/oob) "qLV" = ( -/obj/structure/tunnel{ - id = "hole2" - }, -/turf/open/auto_turf/sand/layer1, -/area/kutjevo/exterior/stonyfields) +/obj/structure/tunnel, +/turf/open/auto_turf/sand/layer0, +/area/kutjevo/interior/colony_S_East) "qMC" = ( /obj/structure/machinery/light{ dir = 4 @@ -16058,11 +16060,9 @@ /turf/open/floor/kutjevo/multi_tiles, /area/kutjevo/exterior/runoff_bridge) "vzy" = ( -/obj/structure/tunnel{ - id = "hole4" - }, -/turf/open/auto_turf/sand/layer0, -/area/kutjevo/exterior/scrubland) +/obj/structure/tunnel, +/turf/open/gm/dirtgrassborder2, +/area/kutjevo/exterior/complex_border/med_park) "vzC" = ( /obj/structure/platform/kutjevo{ dir = 1 @@ -28074,7 +28074,7 @@ sYd bXl bXl bXl -vzy +bXl sYd bXl sYd @@ -31570,7 +31570,7 @@ bEp bEp bEp bEp -tKY +niP dic dic dic @@ -33635,7 +33635,7 @@ xJg xJg xJg xJg -qLV +xJg jfQ jfQ xJg @@ -34919,7 +34919,7 @@ jhS jhS jhS wff -niP +wff wff wff jhS @@ -35547,7 +35547,7 @@ dxF mxB mxB mxB -quy +vzy tUm wYp bGV @@ -37793,7 +37793,7 @@ nKh nKh nKh wtH -sbX +pVH mtS fPH dTM @@ -42736,7 +42736,7 @@ bkR wTt bkR bEH -lZT +bEH hUk hUk hUk @@ -43083,7 +43083,7 @@ hUk hUk hUk hUk -xWK +lZT nlA xWK xWK @@ -46807,7 +46807,7 @@ wXd wXd wXd wXd -mMH +aKg bpj npL bpj @@ -48730,7 +48730,7 @@ bkR bkR bkR wTt -wTt +bsq hUk hUk hUk @@ -50104,7 +50104,7 @@ kZz feg feg feg -bsq +uiK mnT mnT mnT @@ -54310,7 +54310,7 @@ ptY ebB ebB bOc -ptY +qLV dxF dxF dxF diff --git a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm index 50240fcd8d55..5a4fa0fbdf91 100644 --- a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm +++ b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm @@ -1030,7 +1030,7 @@ /area/lv522/outdoors/colony_streets/north_east_street) "aDE" = ( /obj/docking_port/stationary/marine_dropship/lz2{ - name = "Southeast Landing Zone" + name = "LZ2: Southeast Landing Zone" }, /turf/open/floor/plating, /area/shuttle/drop2/lv522) @@ -7115,7 +7115,7 @@ /area/lv522/indoors/a_block/dorms) "dos" = ( /obj/docking_port/stationary/marine_dropship/lz1{ - name = "Southwest Landing Zone" + name = "LZ1: Southwest Landing Zone" }, /turf/open/floor/plating, /area/shuttle/drop1/lv522) diff --git a/maps/map_files/LV624/LV624.dmm b/maps/map_files/LV624/LV624.dmm index af507ab907fd..9c84577bbbdd 100644 --- a/maps/map_files/LV624/LV624.dmm +++ b/maps/map_files/LV624/LV624.dmm @@ -5862,7 +5862,7 @@ /area/lv624/ground/river/west_river) "aBo" = ( /obj/docking_port/stationary/marine_dropship/lz2{ - name = "Robotics Landing Zone" + name = "LZ2: Robotics Landing Zone" }, /turf/open/floor/plating, /area/lv624/lazarus/landing_zones/lz2) @@ -8590,7 +8590,7 @@ /area/lv624/ground/jungle/south_west_jungle) "aLz" = ( /obj/docking_port/stationary/marine_dropship/lz1{ - name = "Nexus Landing Zone" + name = "LZ1: Nexus Landing Zone" }, /turf/open/floor/plating, /area/lv624/lazarus/landing_zones/lz1) diff --git a/maps/map_files/New_Varadero/New_Varadero.dmm b/maps/map_files/New_Varadero/New_Varadero.dmm index aeddb1aa1021..656c4a7f48b1 100644 --- a/maps/map_files/New_Varadero/New_Varadero.dmm +++ b/maps/map_files/New_Varadero/New_Varadero.dmm @@ -788,7 +788,7 @@ /area/varadero/exterior/pool) "aAX" = ( /obj/docking_port/stationary/marine_dropship/lz2{ - name = "LZ2 - Palm Airfield" + name = "LZ2: Palm Airfield" }, /turf/open/gm/dirt, /area/varadero/exterior/lz2_near) @@ -23224,7 +23224,7 @@ /area/varadero/interior/security) "oXw" = ( /obj/docking_port/stationary/marine_dropship/lz1{ - name = "LZ1 - Pontoon Dock" + name = "LZ1: Pontoon Dock" }, /turf/open/floor/plating/icefloor, /area/varadero/exterior/lz1_near) diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index 77a960d33705..213d4ee73d1e 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -8660,12 +8660,8 @@ }, /area/almayer/medical/medical_science) "aCv" = ( -/obj/structure/machinery/door/poddoor/shutters/almayer{ - dir = 2; - id = "cl_shutters 2"; - name = "\improper Privacy Shutters" - }, /obj/structure/window/framed/almayer, +/obj/structure/machinery/door/poddoor/shutters/almayer/cl/quarter/window, /turf/open/floor/plating, /area/almayer/command/corporateliason) "aCw" = ( @@ -10706,6 +10702,15 @@ icon_state = "dark_sterile" }, /area/almayer/living/numbertwobunks) +"aLA" = ( +/obj/item/trash/uscm_mre, +/obj/structure/bed/chair/comfy/charlie{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "aLB" = ( /turf/closed/wall/almayer, /area/almayer/hallways/starboard_hallway) @@ -12029,12 +12034,25 @@ }, /area/almayer/medical/upper_medical) "aSh" = ( -/obj/structure/bed/chair/comfy/alpha{ - dir = 1 +/obj/structure/surface/table/almayer, +/obj/item/device/flashlight/lamp{ + layer = 3.3; + pixel_x = 15 + }, +/obj/item/paper_bin/uscm{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/tool/pen{ + pixel_x = -11; + pixel_y = 5 + }, +/obj/item/tool/pen{ + pixel_x = -10; + pixel_y = -2 }, -/obj/item/prop/helmetgarb/helmet_nvg/cosmetic, /turf/open/floor/almayer{ - icon_state = "redfull" + icon_state = "plate" }, /area/almayer/living/briefing) "aSl" = ( @@ -13234,10 +13252,7 @@ /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 }, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - id = "cl_shutters"; - name = "\improper Privacy Shutters" - }, +/obj/structure/machinery/door/poddoor/shutters/almayer/cl/office/window, /turf/open/floor/plating, /area/almayer/command/corporateliason) "aYq" = ( @@ -16637,12 +16652,6 @@ /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/wood/ship, /area/almayer/command/corporateliason) -"bqy" = ( -/obj/structure/sign/poster/hero/voteno{ - pixel_y = 32 - }, -/turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) "bqF" = ( /obj/structure/dropship_equipment/fuel/fuel_enhancer, /turf/open/floor/almayer{ @@ -17636,12 +17645,9 @@ }, /area/almayer/hallways/starboard_umbilical) "bvY" = ( -/obj/structure/machinery/door_control{ - id = "cl_shutters 2"; - name = "Quarters Shutters"; +/obj/structure/machinery/door_control/cl/quarter/backdoor{ pixel_x = -25; - pixel_y = 23; - req_access_txt = "200" + pixel_y = 23 }, /turf/open/floor/almayer{ icon_state = "plate" @@ -20179,6 +20185,28 @@ "bHP" = ( /turf/open/floor/plating/almayer, /area/almayer/shipboard/weapon_room) +"bHS" = ( +/obj/structure/surface/table/almayer, +/obj/item/trash/USCMtray{ + pixel_y = 4 + }, +/obj/item/trash/USCMtray{ + pixel_y = 6 + }, +/obj/item/trash/USCMtray{ + pixel_y = 8 + }, +/obj/item/trash/USCMtray{ + pixel_y = 10 + }, +/obj/item/device/flashlight/lamp{ + layer = 3.3; + pixel_x = 15 + }, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "bHT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -23393,12 +23421,9 @@ dir = 2; name = "\improper Weyland-Yutani Office" }, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - id = "cl_shutters"; - name = "\improper Privacy Shutters" - }, /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/disposalpipe/segment, +/obj/structure/machinery/door/poddoor/shutters/almayer/cl/office/door, /turf/open/floor/almayer{ icon_state = "test_floor4" }, @@ -23686,18 +23711,10 @@ /area/almayer/engineering/engineering_workshop) "bXc" = ( /obj/structure/surface/table/almayer, -/obj/item/reagent_container/food/snacks/mre_pack/xmas2{ - pixel_x = 5; +/obj/structure/machinery/microwave{ pixel_y = 9 }, -/obj/effect/landmark/map_item{ - layer = 3.03; - pixel_x = -7; - pixel_y = 4 - }, -/obj/item/reagent_container/food/snacks/mre_pack/xmas3{ - pixel_x = 5 - }, +/obj/item/reagent_container/food/snacks/packaged_burger, /turf/open/floor/almayer{ icon_state = "plate" }, @@ -23810,11 +23827,8 @@ icon_state = "pottedplant_18"; pixel_y = 7 }, -/obj/structure/machinery/door_control{ - id = "cl_shutters 3"; - name = "Quarters Shutters"; - pixel_x = -25; - req_access_txt = "200" +/obj/structure/machinery/door_control/cl/quarter/officedoor{ + pixel_x = -25 }, /turf/open/floor/wood/ship, /area/almayer/command/corporateliason) @@ -23906,11 +23920,8 @@ }, /area/almayer/engineering/engine_core) "bXW" = ( -/obj/structure/machinery/door_control{ - id = "cl_shutters 3"; - name = "Quarters Shutters"; - pixel_x = 25; - req_access_txt = "200" +/obj/structure/machinery/door_control/cl/quarter/officedoor{ + pixel_x = 25 }, /turf/open/floor/wood/ship, /area/almayer/command/corporateliason) @@ -25035,14 +25046,14 @@ }, /area/almayer/engineering/lower_engineering) "ccF" = ( -/obj/structure/bed/chair/comfy/alpha{ - dir = 1 - }, /obj/structure/machinery/light{ dir = 8 }, +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, /turf/open/floor/almayer{ - icon_state = "redfull" + icon_state = "plate" }, /area/almayer/living/briefing) "ccG" = ( @@ -25645,15 +25656,27 @@ /turf/open/floor/almayer, /area/almayer/squads/charlie) "cgz" = ( -/obj/structure/bed/chair/comfy/charlie, /obj/structure/sign/poster{ desc = "Eat an EAT bar! ...Aren't they called MEAT bars?"; icon_state = "poster7"; name = "EAT - poster"; pixel_x = 27 }, +/obj/structure/surface/table/almayer, +/obj/item/paper_bin/uscm{ + pixel_x = 9; + pixel_y = 6 + }, +/obj/item/tool/pen{ + pixel_x = 9; + pixel_y = 9 + }, +/obj/item/tool/pen{ + pixel_x = 9; + pixel_y = 2 + }, /turf/open/floor/almayer{ - icon_state = "emeraldfull" + icon_state = "plate" }, /area/almayer/living/briefing) "cgA" = ( @@ -27334,10 +27357,8 @@ }, /area/almayer/squads/req) "crK" = ( -/obj/structure/bed/chair/comfy/alpha{ - dir = 1 - }, /obj/structure/pipes/vents/pump, +/obj/structure/surface/table/almayer, /turf/open/floor/almayer{ icon_state = "redfull" }, @@ -27367,8 +27388,15 @@ }, /area/almayer/hull/upper_hull/u_m_p) "csG" = ( -/obj/structure/bed/chair/comfy/delta, -/obj/item/trash/popcorn, +/obj/structure/surface/table/almayer, +/obj/item/device/flashlight/lamp{ + pixel_x = 15 + }, +/obj/item/paper, +/obj/item/reagent_container/food/drinks/cans/waterbottle{ + pixel_x = -10; + pixel_y = 4 + }, /turf/open/floor/almayer{ icon_state = "bluefull" }, @@ -27462,6 +27490,15 @@ icon_state = "test_floor4" }, /area/almayer/shipboard/brig/cryo) +"cum" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/bed/chair/comfy/charlie{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "cus" = ( /obj/docking_port/stationary/lifeboat_dock/starboard, /turf/open/floor/almayer_hull{ @@ -27607,6 +27644,13 @@ icon_state = "test_floor4" }, /area/almayer/shipboard/brig/main_office) +"cxZ" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "cyo" = ( /obj/structure/machinery/vending/cigarette, /turf/open/floor/almayer{ @@ -27974,7 +28018,9 @@ pixel_x = -27 }, /obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer, +/turf/open/floor/almayer{ + icon_state = "plate" + }, /area/almayer/living/briefing) "cEO" = ( /obj/structure/largecrate/supply/floodlights, @@ -28131,6 +28177,13 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_f_s) +"cIl" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "cIr" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -28276,11 +28329,17 @@ }, /area/almayer/engineering/upper_engineering/port) "cKX" = ( -/obj/structure/platform, /obj/structure/pipes/vents/scrubber{ dir = 4 }, -/turf/open/floor/almayer, +/obj/structure/surface/table/almayer, +/obj/structure/machinery/computer/emails{ + pixel_x = 2; + pixel_y = 5 + }, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, /area/almayer/living/briefing) "cKY" = ( /obj/structure/machinery/light, @@ -29372,12 +29431,13 @@ }, /area/almayer/hallways/starboard_umbilical) "diw" = ( -/obj/structure/bed/chair/comfy/delta, /obj/structure/machinery/light{ dir = 8 }, +/obj/structure/bed/chair/comfy/delta, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/almayer{ - icon_state = "bluefull" + icon_state = "plate" }, /area/almayer/living/briefing) "diz" = ( @@ -29562,10 +29622,10 @@ }, /area/almayer/living/briefing) "dkH" = ( -/obj/structure/bed/chair/comfy/delta, /obj/structure/pipes/standard/simple/hidden/supply{ dir = 6 }, +/obj/structure/bed/chair/comfy/delta, /turf/open/floor/almayer{ icon_state = "bluefull" }, @@ -29964,12 +30024,12 @@ "drp" = ( /obj/structure/toilet{ dir = 8; - pixel_y = 8; - layer = 2.9 + layer = 2.9; + pixel_y = 8 }, /obj/structure/window{ - pixel_y = -2; - layer = 2.95 + layer = 2.95; + pixel_y = -2 }, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/commandbunks) @@ -30340,16 +30400,13 @@ /obj/structure/pipes/vents/pump{ dir = 8 }, -/obj/structure/machinery/door_control{ - id = "cl_shutters 2"; - name = "Quarters Shutters"; - pixel_x = 25; - req_access_txt = "200" - }, /obj/structure/sign/safety/bathunisex{ pixel_x = 8; pixel_y = -32 }, +/obj/structure/machinery/door_control/cl/quarter/backdoor{ + pixel_x = 25 + }, /turf/open/floor/wood/ship, /area/almayer/command/corporateliason) "dyK" = ( @@ -30406,7 +30463,9 @@ dir = 8 }, /obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer, +/turf/open/floor/almayer{ + icon_state = "plate" + }, /area/almayer/living/briefing) "dAX" = ( /obj/structure/machinery/camera/autoname/almayer{ @@ -31441,12 +31500,9 @@ /obj/structure/bed/chair/office/dark{ dir = 8 }, -/obj/structure/machinery/door_control{ - id = "cl_shutters 2"; - name = "Quarters Shutters"; +/obj/structure/machinery/door_control/cl/quarter/windows{ pixel_x = 11; - pixel_y = 37; - req_access_txt = "200" + pixel_y = 37 }, /turf/open/floor/wood/ship, /area/almayer/command/corporateliason) @@ -31521,6 +31577,17 @@ }, /turf/open/floor/almayer, /area/almayer/living/chapel) +"dYH" = ( +/obj/structure/machinery/light{ + dir = 1 + }, +/obj/structure/bed/chair/comfy/alpha{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "dYK" = ( /obj/item/folder/red{ desc = "A red folder. The previous contents are a mystery, though the number 28 has been written on the inside of each flap numerous times. Smells faintly of cough syrup."; @@ -32271,6 +32338,22 @@ dir = 1 }, /area/almayer/medical/containment/cell) +"elX" = ( +/obj/structure/surface/table/almayer, +/obj/item/trash/uscm_mre, +/obj/effect/decal/cleanable/dirt, +/obj/item/device/flashlight/lamp{ + layer = 3.3; + pixel_x = 15 + }, +/obj/item/reagent_container/food/drinks/cans/souto/diet/grape{ + pixel_x = -7; + pixel_y = 10 + }, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "eme" = ( /obj/structure/pipes/vents/pump{ dir = 4 @@ -32413,10 +32496,6 @@ }, /area/almayer/hallways/aft_hallway) "epq" = ( -/obj/structure/stairs/perspective{ - dir = 1; - icon_state = "p_stair_full" - }, /obj/structure/sign/poster{ desc = "One of those hot, tanned babes back the beaches of good ol' Earth."; icon_state = "poster12"; @@ -32424,7 +32503,13 @@ pixel_x = 27; serial_number = 12 }, -/turf/open/floor/almayer, +/obj/structure/bed/chair/comfy/delta{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, /area/almayer/living/briefing) "epu" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, @@ -32737,27 +32822,27 @@ "euM" = ( /obj/structure/surface/table/woodentable/fancy, /obj/item/paper_bin/uscm{ - pixel_y = 7; - pixel_x = -17 + pixel_x = -17; + pixel_y = 7 }, /obj/item/tool/pen/clicky{ pixel_x = -13; pixel_y = -1 }, /obj/item/tool/pen/clicky{ - pixel_y = 5; - pixel_x = -13 + pixel_x = -13; + pixel_y = 5 }, /obj/structure/machinery/door_control{ id = "CO-Office"; name = "Door Control"; normaldoorcontrol = 1; - req_access_txt = "31"; - pixel_y = 7 + pixel_y = 7; + req_access_txt = "31" }, /obj/item/ashtray/bronze{ - pixel_y = 1; - pixel_x = 12 + pixel_x = 12; + pixel_y = 1 }, /turf/open/floor/carpet, /area/almayer/living/commandbunks) @@ -33155,8 +33240,6 @@ }, /area/almayer/lifeboat_pumps/south2) "eCS" = ( -/obj/structure/bed/chair/comfy/delta, -/obj/item/trash/popcorn, /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 }, @@ -34434,6 +34517,17 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/operating_room_two) +"ffl" = ( +/obj/structure/surface/table/almayer, +/obj/effect/landmark/map_item, +/obj/item/paper_bin/uscm{ + pixel_x = -7; + pixel_y = 6 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "ffE" = ( /turf/open/floor/almayer/no_build{ icon_state = "plating" @@ -34574,17 +34668,17 @@ "fiP" = ( /obj/structure/surface/table/woodentable/fancy, /obj/item/storage/fancy/cigar{ - pixel_y = 2; layer = 3.04; - pixel_x = -2 + pixel_x = -2; + pixel_y = 2 }, /obj/item/reagent_container/food/drinks/bottle/sake{ pixel_x = -11; pixel_y = 16 }, /obj/item/reagent_container/food/drinks/bottle/sake{ - pixel_y = 16; - pixel_x = -2 + pixel_x = -2; + pixel_y = 16 }, /obj/item/reagent_container/food/drinks/bottle/sake{ pixel_x = 7; @@ -34867,6 +34961,9 @@ pixel_x = -5; pixel_y = 5 }, +/obj/structure/machinery/light{ + dir = 8 + }, /turf/open/floor/wood/ship, /area/almayer/command/corporateliason) "fqg" = ( @@ -35082,16 +35179,16 @@ /area/almayer/hull/upper_hull/u_f_s) "fuR" = ( /obj/structure/bed/bedroll{ - name = "cat bed"; desc = "A bed of cotton fabric, purposely made for a cat to comfortably sleep on."; + name = "cat bed"; pixel_y = 0 }, /mob/living/simple_animal/cat/Jones{ dir = 8 }, /obj/structure/machinery/firealarm{ - pixel_y = 28; - pixel_x = -1 + pixel_x = -1; + pixel_y = 28 }, /turf/open/floor/wood/ship, /area/almayer/living/commandbunks) @@ -35406,6 +35503,15 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/command/lifeboat) +"fCt" = ( +/obj/structure/bed/chair/comfy/delta{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "fCL" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -35655,6 +35761,17 @@ }, /turf/open/floor/plating, /area/almayer/hull/lower_hull/l_f_p) +"fHe" = ( +/obj/structure/surface/table/almayer, +/obj/item/device/flashlight/lamp{ + layer = 3.3; + pixel_x = 15 + }, +/obj/item/prop/helmetgarb/helmet_nvg/cosmetic, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "fHh" = ( /obj/structure/disposalpipe/segment{ dir = 8; @@ -35985,6 +36102,17 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/hangar) +"fNu" = ( +/obj/structure/surface/table/almayer, +/obj/item/paper, +/obj/item/tool/pen{ + pixel_x = -5; + pixel_y = 2 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "fNA" = ( /obj/structure/closet/fireaxecabinet{ pixel_y = 32 @@ -36525,6 +36653,12 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_f_p) +"gcw" = ( +/obj/structure/bed/chair/comfy/bravo, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "gcK" = ( /obj/structure/machinery/light/small{ dir = 1 @@ -36928,7 +37062,10 @@ /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 8 }, -/turf/open/floor/almayer, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, /area/almayer/living/briefing) "gkK" = ( /obj/structure/pipes/standard/simple/hidden/supply, @@ -37008,6 +37145,16 @@ icon_state = "plate" }, /area/almayer/shipboard/starboard_point_defense) +"gmp" = ( +/obj/structure/surface/table/almayer, +/obj/item/device/flashlight/lamp{ + layer = 3.3; + pixel_x = 15 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "gms" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer{ @@ -37863,28 +38010,14 @@ pixel_x = 5; pixel_y = 3 }, -/obj/structure/machinery/door_control{ - id = "cl_shutters"; - name = "Privacy Shutters"; - pixel_x = -5; - pixel_y = 8; - req_access_txt = "200" - }, -/obj/structure/machinery/door_control{ - id = "RoomDivider"; - name = "Room Divider"; +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/door_control/cl/office/evac{ pixel_x = -5; - pixel_y = -4; - req_access_txt = "200" + pixel_y = 4 }, -/obj/structure/surface/table/woodentable/fancy, -/obj/structure/machinery/door_control{ - id = "cl_evac"; - name = "Evac Pod Door Control"; - normaldoorcontrol = 1; +/obj/structure/machinery/door_control/cl/office/divider{ pixel_x = -5; - pixel_y = 2; - req_access_txt = "200" + pixel_y = -3 }, /turf/open/floor/carpet, /area/almayer/command/corporateliason) @@ -37944,17 +38077,24 @@ /area/almayer/command/combat_correspondent) "gGo" = ( /obj/structure/surface/table/almayer, -/obj/effect/landmark/map_item{ - pixel_x = -8 +/obj/structure/machinery/firealarm{ + pixel_y = 28 }, -/obj/item/toy/plush/therapy/red{ - desc = "A USCM approved plush doll. It's not soft and hardly comforting!"; - force = 15; - layer = 4.1; - name = "Sergeant Huggs"; - pixel_x = 7; - pixel_y = -1; - throwforce = 15 +/obj/structure/prop/holidays/string_lights{ + dir = 8; + pixel_x = 29 + }, +/obj/item/reagent_container/food/condiment/hotsauce/cholula{ + pixel_x = 10; + pixel_y = 14 + }, +/obj/item/trash/USCMtray{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/reagent_container/food/snacks/hotdog{ + pixel_x = -7; + pixel_y = 5 }, /turf/open/floor/almayer{ icon_state = "plate" @@ -38127,10 +38267,10 @@ }, /area/almayer/shipboard/port_missiles) "gKH" = ( -/obj/structure/bed/chair/comfy/charlie, /obj/item/trash/uscm_mre, +/obj/structure/bed/chair/comfy/charlie, /turf/open/floor/almayer{ - icon_state = "emeraldfull" + icon_state = "plate" }, /area/almayer/living/briefing) "gKJ" = ( @@ -38310,7 +38450,6 @@ }, /area/almayer/engineering/engine_core) "gNi" = ( -/obj/structure/bed/chair/comfy/delta, /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, @@ -38343,6 +38482,18 @@ /obj/effect/spawner/random/tool, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_m_p) +"gOm" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 6 + }, +/obj/structure/bed/chair/comfy/bravo{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "gOs" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -38620,6 +38771,18 @@ /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/plating/plating_catwalk, /area/almayer/lifeboat_pumps/north2) +"gVm" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/arcturianstopsign{ + pixel_y = 32 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "gVq" = ( /obj/structure/machinery/light, /obj/effect/decal/warning_stripes{ @@ -39359,6 +39522,13 @@ icon_state = "test_floor4" }, /area/almayer/living/grunt_rnr) +"hjT" = ( +/obj/structure/bed/chair/comfy/alpha, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "hki" = ( /obj/structure/machinery/cm_vending/sorted/tech/electronics_storage, /turf/open/floor/almayer{ @@ -39409,6 +39579,12 @@ icon_state = "silver" }, /area/almayer/command/cic) +"hlq" = ( +/obj/structure/machinery/door_control/cl/office/door{ + pixel_y = 25 + }, +/turf/open/floor/wood/ship, +/area/almayer/command/corporateliason) "hlw" = ( /obj/structure/platform_decoration{ dir = 4 @@ -39531,6 +39707,17 @@ icon_state = "sterile_green" }, /area/almayer/medical/hydroponics) +"hnH" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/obj/item/prop/magazine/boots/n117{ + pixel_x = 2; + pixel_y = 5 + }, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "hnV" = ( /obj/structure/machinery/light, /turf/open/floor/almayer, @@ -40166,19 +40353,19 @@ "hBW" = ( /obj/structure/surface/table/woodentable/fancy, /obj/item/device/flashlight/lamp/green{ - pixel_y = 20; - pixel_x = -7 + pixel_x = -7; + pixel_y = 20 }, /obj/item/ashtray/bronze{ - pixel_y = 19; - pixel_x = 4 + pixel_x = 4; + pixel_y = 19 }, /obj/structure/machinery/light{ dir = 8 }, /obj/effect/landmark/map_item{ - pixel_y = 3; - pixel_x = -1 + pixel_x = -1; + pixel_y = 3 }, /turf/open/floor/wood/ship, /area/almayer/living/commandbunks) @@ -40320,6 +40507,15 @@ /obj/structure/largecrate/random/barrel/red, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_p) +"hFX" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/bed/chair/comfy/bravo{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "hGa" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -40414,6 +40610,23 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_a_p) +"hIt" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/obj/item/tool/kitchen/tray{ + pixel_y = 9 + }, +/obj/item/device/flashlight/lamp{ + pixel_x = 15 + }, +/obj/item/reagent_container/food/snacks/meatpizzaslice{ + pixel_x = -5; + pixel_y = 7 + }, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "hII" = ( /obj/structure/machinery/cm_vending/gear/tl{ density = 0; @@ -40429,16 +40642,12 @@ }, /area/almayer/squads/delta) "hIL" = ( -/obj/structure/machinery/door/poddoor/shutters/almayer{ - dir = 4; - id = "cl_shutters 2"; - name = "\improper Privacy Shutters" - }, /obj/structure/machinery/door/airlock/almayer/maint{ access_modified = 1; req_access_txt = "200"; req_one_access = null }, +/obj/structure/machinery/door/poddoor/shutters/almayer/cl/quarter/backdoor, /turf/open/floor/almayer{ icon_state = "test_floor4" }, @@ -40589,6 +40798,14 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_f_s) +"hMJ" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "hMN" = ( /obj/structure/machinery/power/apc/almayer, /turf/open/floor/almayer{ @@ -41371,6 +41588,22 @@ icon_state = "kitchen" }, /area/almayer/living/grunt_rnr) +"idJ" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/obj/item/device/flashlight/lamp{ + layer = 3.3; + pixel_x = 15 + }, +/obj/item/paper, +/obj/item/tool/pen{ + pixel_x = -5; + pixel_y = 2 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "idX" = ( /obj/structure/pipes/vents/pump, /turf/open/floor/prison{ @@ -42474,14 +42707,14 @@ }, /area/almayer/living/offices) "izr" = ( -/obj/structure/bed/chair/comfy/alpha{ - dir = 1 - }, /obj/structure/sign/poster/propaganda{ pixel_x = -27 }, +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, /turf/open/floor/almayer{ - icon_state = "redfull" + icon_state = "plate" }, /area/almayer/living/briefing) "izx" = ( @@ -42747,6 +42980,21 @@ }, /turf/open/floor/wood/ship, /area/almayer/shipboard/sea_office) +"iFG" = ( +/obj/structure/machinery/light{ + dir = 1 + }, +/obj/structure/bed/chair/comfy/bravo{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/barricade/deployable{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "iFH" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 9 @@ -42838,8 +43086,8 @@ /area/almayer/living/grunt_rnr) "iIm" = ( /obj/structure/machinery/door/airlock/almayer/generic{ - name = "\improper Bathroom"; - dir = 2 + dir = 2; + name = "\improper Bathroom" }, /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 1 @@ -43473,13 +43721,18 @@ /turf/open/floor/almayer, /area/almayer/hallways/hangar) "iWE" = ( -/obj/structure/platform{ - dir = 1 - }, /obj/structure/pipes/vents/pump{ dir = 4 }, -/turf/open/floor/almayer, +/obj/structure/bed/chair/comfy/bravo{ + dir = 4 + }, +/obj/structure/barricade/deployable{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, /area/almayer/living/briefing) "iWL" = ( /obj/structure/pipes/standard/simple/hidden/supply, @@ -43508,6 +43761,11 @@ icon_state = "bluefull" }, /area/almayer/living/briefing) +"iXd" = ( +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "iXt" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer{ @@ -43515,6 +43773,15 @@ icon_state = "red" }, /area/almayer/shipboard/brig/processing) +"iXR" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "iXT" = ( /obj/item/trash/uscm_mre, /turf/open/floor/almayer, @@ -45106,6 +45373,15 @@ }, /turf/open/floor/plating, /area/almayer/hull/lower_hull/l_f_p) +"jEI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/computer/cameras/wooden_tv/prop{ + pixel_y = 29 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "jEX" = ( /obj/structure/surface/table/woodentable/fancy, /obj/item/folder/black{ @@ -45113,8 +45389,8 @@ }, /obj/item/folder/yellow, /obj/item/device/flashlight/lamp/green{ - pixel_y = 8; - pixel_x = -16 + pixel_x = -16; + pixel_y = 8 }, /turf/open/floor/carpet, /area/almayer/living/commandbunks) @@ -45261,6 +45537,15 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/medical/morgue) +"jIG" = ( +/obj/structure/bed/chair/comfy/charlie{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "jIV" = ( /obj/structure/surface/rack, /obj/item/book/manual/marine_law{ @@ -45842,9 +46127,6 @@ /turf/open/floor/almayer, /area/almayer/engineering/engineering_workshop/hangar) "jUo" = ( -/obj/structure/bed/chair/comfy/bravo{ - dir = 1 - }, /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/almayer{ icon_state = "orangefull" @@ -46075,6 +46357,16 @@ }, /turf/open/floor/almayer, /area/almayer/shipboard/brig/processing) +"jZr" = ( +/obj/structure/surface/table/almayer, +/obj/structure/machinery/computer/emails{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "jZs" = ( /obj/structure/machinery/light/containment{ dir = 4 @@ -46383,6 +46675,16 @@ icon_state = "silver" }, /area/almayer/shipboard/brig/cic_hallway) +"kfG" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/obj/item/device/flashlight/lamp{ + pixel_x = 15 + }, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "kfN" = ( /obj/structure/closet/secure_closet/brig, /turf/open/floor/almayer{ @@ -46773,11 +47075,8 @@ /turf/open/floor/plating, /area/almayer/command/airoom) "kpl" = ( -/obj/structure/machinery/door_control{ - id = "cl_shutters"; - name = "Privacy Shutters"; - pixel_y = -20; - req_access_txt = "200" +/obj/structure/machinery/door_control/cl/office/door{ + pixel_y = -20 }, /turf/open/floor/almayer{ icon_state = "plate" @@ -47162,6 +47461,13 @@ icon_state = "dark_sterile" }, /area/almayer/engineering/laundry) +"kxF" = ( +/obj/structure/bed/chair/comfy/charlie, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "kxL" = ( /obj/structure/closet/coffin/woodencrate, /obj/structure/largecrate/random/mini/wooden{ @@ -47781,11 +48087,20 @@ }, /area/almayer/hull/lower_hull/l_f_s) "kKL" = ( -/obj/structure/stairs/perspective{ - dir = 4; - icon_state = "p_stair_sn_full_cap" +/obj/structure/bed/chair/comfy/bravo{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster{ + desc = "YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE."; + icon_state = "poster11"; + name = "YOU ALWAYS KNOW A WORKING JOE."; + pixel_x = -27; + serial_number = 11 + }, +/turf/open/floor/almayer{ + icon_state = "plate" }, -/turf/open/floor/almayer, /area/almayer/living/briefing) "kKR" = ( /obj/structure/pipes/vents/pump{ @@ -48105,11 +48420,13 @@ /obj/structure/bed/chair/comfy/bravo{ dir = 1 }, -/obj/structure/machinery/light{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/obj/structure/prop/holidays/string_lights{ + dir = 8; + pixel_x = 29 }, /turf/open/floor/almayer{ - icon_state = "orangefull" + icon_state = "plate" }, /area/almayer/living/briefing) "kRd" = ( @@ -48217,14 +48534,16 @@ }, /area/almayer/command/telecomms) "kTx" = ( -/obj/structure/stairs/perspective{ - dir = 1; - icon_state = "p_stair_full" - }, /obj/structure/pipes/standard/simple/hidden/supply{ dir = 5 }, -/turf/open/floor/almayer, +/obj/structure/bed/chair/comfy/charlie{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, /area/almayer/living/briefing) "kTM" = ( /obj/item/frame/rack{ @@ -48415,6 +48734,13 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/medical_science) +"kXH" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "kXJ" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/structure/machinery/computer/secure_data{ @@ -48520,6 +48846,23 @@ icon_state = "mono" }, /area/almayer/medical/hydroponics) +"lad" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/obj/item/device/flashlight/lamp{ + layer = 3.3; + pixel_x = 15 + }, +/obj/item/tool/kitchen/tray{ + pixel_y = 9 + }, +/obj/item/reagent_container/food/snacks/sliceable/pizza/vegetablepizza{ + pixel_y = 8 + }, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "lah" = ( /turf/open/floor/almayer{ dir = 6; @@ -48550,8 +48893,8 @@ /obj/structure/safe/co_office, /obj/item/weapon/pole/fancy_cane, /obj/item/tool/lighter/zippo/gold{ - pixel_y = 3; - layer = 3.05 + layer = 3.05; + pixel_y = 3 }, /turf/open/floor/wood/ship, /area/almayer/living/commandbunks) @@ -48673,8 +49016,9 @@ /area/almayer/shipboard/brig/chief_mp_office) "ldj" = ( /obj/structure/pipes/vents/pump, -/obj/structure/platform, -/turf/open/floor/almayer, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, /area/almayer/living/briefing) "ldl" = ( /obj/structure/sign/safety/maint{ @@ -49004,6 +49348,15 @@ /obj/effect/landmark/late_join/bravo, /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/bravo) +"ljz" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/bed/chair/comfy/delta{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "ljG" = ( /obj/structure/closet/crate/freezer, /obj/item/reagent_container/food/condiment/coldsauce, @@ -51322,6 +51675,19 @@ icon_state = "cargo_arrow" }, /area/almayer/squads/charlie_delta_shared) +"mgR" = ( +/obj/structure/surface/table/almayer, +/obj/item/prop/magazine/dirty{ + pixel_y = 5 + }, +/obj/item/tool/pen{ + pixel_x = 4; + pixel_y = 6 + }, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "mha" = ( /obj/effect/decal/warning_stripes{ icon_state = "SE-out"; @@ -51487,12 +51853,6 @@ }, /area/almayer/shipboard/brig/lobby) "mkx" = ( -/obj/structure/machinery/door_control{ - id = "cl_shutters 2"; - name = "Quarters Shutters"; - pixel_x = -25; - req_access_txt = "200" - }, /obj/effect/decal/warning_stripes{ icon_state = "NE-out"; pixel_x = 1; @@ -52047,6 +52407,11 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/lower_medical_lobby) +"mwz" = ( +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "mwA" = ( /obj/structure/disposalpipe/segment{ dir = 8; @@ -52768,18 +53133,22 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/port_hallway) "mLb" = ( -/obj/structure/platform{ - dir = 1 +/obj/structure/surface/table/almayer, +/obj/item/toy/deck{ + pixel_x = -6; + pixel_y = -2 }, /obj/item/toy/deck/uno{ pixel_x = 6; pixel_y = -1 }, -/obj/item/toy/deck{ - pixel_x = -6; - pixel_y = -2 +/obj/structure/prop/holidays/string_lights{ + dir = 8; + pixel_x = 29 + }, +/turf/open/floor/almayer{ + icon_state = "plate" }, -/turf/open/floor/almayer, /area/almayer/living/briefing) "mLu" = ( /obj/effect/decal/warning_stripes{ @@ -53290,7 +53659,13 @@ pixel_x = -27 }, /obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer, +/obj/structure/bed/chair/comfy/charlie{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, /area/almayer/living/briefing) "mWe" = ( /obj/structure/machinery/camera/autoname/almayer{ @@ -53468,14 +53843,10 @@ /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - dir = 4; - id = "cl_shutters 3"; - name = "\improper Privacy Shutters" - }, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/machinery/door/poddoor/shutters/almayer/cl/quarter/door, /turf/open/floor/almayer{ icon_state = "test_floor4" }, @@ -54259,6 +54630,20 @@ }, /turf/open/floor/wood/ship, /area/almayer/living/commandbunks) +"npS" = ( +/obj/structure/surface/table/almayer, +/obj/item/device/flashlight/lamp{ + layer = 3.3; + pixel_x = 15 + }, +/obj/structure/prop/server_equipment/laptop{ + pixel_x = -2; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "nqx" = ( /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/plating/plating_catwalk, @@ -54717,11 +55102,12 @@ /turf/open/floor/almayer, /area/almayer/squads/charlie_delta_shared) "nza" = ( -/obj/structure/bed/chair/comfy/charlie, /obj/structure/pipes/vents/scrubber{ dir = 4 }, -/obj/item/trash/uscm_mre, +/obj/structure/bed/chair/comfy/charlie{ + dir = 4 + }, /turf/open/floor/almayer{ icon_state = "emeraldfull" }, @@ -55171,12 +55557,12 @@ /turf/open/floor/almayer, /area/almayer/living/basketball) "nIW" = ( -/obj/structure/bed/chair/comfy/bravo{ - dir = 1 - }, /obj/structure/pipes/standard/simple/hidden/supply{ dir = 9 }, +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, /turf/open/floor/almayer{ icon_state = "orangefull" }, @@ -55224,13 +55610,19 @@ /area/almayer/command/lifeboat) "nKs" = ( /obj/structure/machinery/cm_vending/clothing/dress{ - req_access = list(1); - pixel_y = 0 + pixel_y = 0; + req_access = list(1) }, /turf/open/floor/almayer{ icon_state = "cargo" }, /area/almayer/living/commandbunks) +"nKJ" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood/ship, +/area/almayer/command/corporateliason) "nLa" = ( /obj/structure/bed/chair{ dir = 4 @@ -56094,9 +56486,9 @@ dir = 8 }, /obj/item/prop/magazine/boots/n160{ - pixel_y = -8; + layer = 2.8; pixel_x = 4; - layer = 2.8 + pixel_y = -8 }, /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -56440,9 +56832,6 @@ }, /area/almayer/engineering/engine_core) "okB" = ( -/obj/structure/bed/chair/comfy/alpha{ - dir = 1 - }, /obj/structure/pipes/vents/scrubber{ dir = 4 }, @@ -56749,6 +57138,14 @@ }, /turf/open/floor/plating, /area/almayer/hull/lower_hull/l_f_p) +"oqP" = ( +/obj/structure/bed/chair/comfy/delta{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "oqS" = ( /obj/structure/toilet{ dir = 1 @@ -56990,13 +57387,13 @@ }, /obj/item/reagent_container/food/snacks/carpmeat{ layer = 3.3; - pixel_y = 11; - pixel_x = 8 + pixel_x = 8; + pixel_y = 11 }, /obj/item/reagent_container/food/snacks/carpmeat{ layer = 3.3; - pixel_y = 11; - pixel_x = 8 + pixel_x = 8; + pixel_y = 11 }, /turf/open/floor/carpet, /area/almayer/living/commandbunks) @@ -57321,12 +57718,12 @@ pixel_y = 9 }, /obj/item/prop/helmetgarb/rosary{ - pixel_y = 5; - pixel_x = -4 + pixel_x = -4; + pixel_y = 5 }, /obj/item/device/flashlight/lamp{ - pixel_y = 1; - pixel_x = 3 + pixel_x = 3; + pixel_y = 1 }, /turf/open/floor/wood/ship, /area/almayer/living/commandbunks) @@ -57827,6 +58224,13 @@ icon_state = "rasputin3" }, /area/almayer/powered/agent) +"oMC" = ( +/obj/structure/machinery/light, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "oMH" = ( /obj/structure/bed/chair{ dir = 4 @@ -58565,6 +58969,7 @@ /obj/item/facepaint/black{ pixel_x = -10 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/almayer{ icon_state = "plate" }, @@ -59238,8 +59643,8 @@ icon_state = "pipe-c" }, /obj/structure/coatrack{ - pixel_y = 1; - pixel_x = -5 + pixel_x = -5; + pixel_y = 1 }, /obj/structure/pipes/standard/simple/hidden/supply{ dir = 5 @@ -61005,10 +61410,13 @@ }, /area/almayer/living/starboard_garden) "qgw" = ( -/obj/structure/stairs/perspective{ - icon_state = "p_stair_sn_full_cap" +/obj/structure/bed/chair/comfy/alpha{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" }, -/turf/open/floor/almayer, /area/almayer/living/briefing) "qgG" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ @@ -61137,7 +61545,9 @@ pixel_x = 27 }, /obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer, +/turf/open/floor/almayer{ + icon_state = "plate" + }, /area/almayer/living/briefing) "qit" = ( /obj/structure/surface/table/reinforced/almayer_B, @@ -61334,6 +61744,18 @@ icon_state = "sterile_green_corner" }, /area/almayer/medical/medical_science) +"qmB" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/structure/prop/holidays/string_lights{ + dir = 8; + pixel_x = 29 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "qmC" = ( /obj/structure/machinery/door/poddoor/almayer/open{ dir = 4; @@ -61604,6 +62026,15 @@ icon_state = "silver" }, /area/almayer/command/computerlab) +"qsa" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "qsd" = ( /obj/structure/largecrate/random, /turf/open/floor/almayer{ @@ -62958,6 +63389,12 @@ icon_state = "plate" }, /area/almayer/squads/delta) +"qWy" = ( +/obj/structure/bed/chair/comfy/delta, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "qWI" = ( /obj/structure/machinery/status_display{ pixel_y = -30 @@ -63287,6 +63724,29 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_m_s) +"rdb" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper_bin/uscm{ + pixel_x = 9; + pixel_y = 6 + }, +/obj/item/tool/pen{ + pixel_x = 9; + pixel_y = 2 + }, +/obj/item/tool/pen{ + pixel_x = 9; + pixel_y = 9 + }, +/obj/structure/prop/holidays/string_lights{ + dir = 8; + pixel_x = 29 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "rde" = ( /obj/structure/sign/prop1, /turf/closed/wall/almayer, @@ -63406,8 +63866,8 @@ /obj/structure/surface/table/woodentable/fancy, /obj/structure/machinery/faxmachine/uscm/command/capt{ name = "Commanding Officer's Fax Machine"; - pixel_y = 3; - pixel_x = -4 + pixel_x = -4; + pixel_y = 3 }, /obj/structure/machinery/light{ dir = 1 @@ -63461,14 +63921,6 @@ "rgJ" = ( /obj/structure/machinery/light, /obj/structure/machinery/disposal, -/obj/item/bananapeel{ - desc = "An experimental B8 Smart-Scope. Based on the technologies used in the Smart Gun by ARMAT, this sight has integrated IFF systems. It can only attach to the L42A Battle Rifle, M44 Combat Revolver, and M46C Pulse Rifle. This one appears to be covered in gun oil"; - icon = 'icons/obj/items/weapons/guns/attachments.dmi'; - icon_state = "iffbarrel"; - name = "Broken B8 Smart-Scope"; - pixel_x = -1; - pixel_y = 11 - }, /obj/structure/disposalpipe/trunk{ dir = 1 }, @@ -63981,8 +64433,8 @@ name = "Commanding Officer's Office"; phone_category = "Offices"; phone_id = "Commanding Officer's Office"; - pixel_y = 8; - pixel_x = 16 + pixel_x = 16; + pixel_y = 8 }, /turf/open/floor/carpet, /area/almayer/living/commandbunks) @@ -64608,14 +65060,22 @@ /area/almayer/living/briefing) "rEm" = ( /obj/structure/surface/table/woodentable/fancy, +/obj/item/ashtray/bronze{ + pixel_x = 2; + pixel_y = 9 + }, +/obj/structure/machinery/door_control/cl/office/window{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/structure/machinery/door_control/cl/office/door{ + pixel_x = 6; + pixel_y = -3 + }, /obj/item/spacecash/c500{ - pixel_x = 4; + pixel_x = -10; pixel_y = 8 }, -/obj/item/ashtray/bronze{ - pixel_x = -13; - pixel_y = -4 - }, /turf/open/floor/carpet, /area/almayer/command/corporateliason) "rEn" = ( @@ -64659,8 +65119,8 @@ "rEJ" = ( /obj/structure/machinery/light, /obj/structure/flora/pottedplant{ - pixel_y = 3; - pixel_x = -1 + pixel_x = -1; + pixel_y = 3 }, /turf/open/floor/wood/ship, /area/almayer/living/commandbunks) @@ -64726,6 +65186,29 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/lower_medical_medbay) +"rFV" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/obj/item/device/flashlight/lamp{ + layer = 3.3; + pixel_x = 15 + }, +/obj/item/paper_bin/uscm{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/tool/pen{ + pixel_x = -10; + pixel_y = 6 + }, +/obj/item/tool/pen{ + pixel_x = -10; + pixel_y = -2 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "rFY" = ( /turf/open/floor/almayer{ dir = 5; @@ -65845,6 +66328,17 @@ icon_state = "plating" }, /area/almayer/hull/lower_hull/l_f_s) +"sgE" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/reagent_dispensers/water_cooler{ + density = 0; + pixel_x = 12; + pixel_y = 6 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "sgM" = ( /obj/structure/closet/toolcloset, /turf/open/floor/almayer{ @@ -66721,6 +67215,18 @@ icon_state = "orange" }, /area/almayer/engineering/ce_room) +"sBs" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper, +/obj/item/tool/pen{ + pixel_x = -5; + pixel_y = 2 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "sBH" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 10 @@ -66992,6 +67498,17 @@ /obj/structure/mirror, /turf/closed/wall/almayer, /area/almayer/living/gym) +"sGX" = ( +/obj/structure/machinery/firealarm{ + pixel_y = -28 + }, +/obj/structure/bed/chair/comfy/charlie{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "sGZ" = ( /obj/structure/closet/firecloset, /turf/open/floor/almayer{ @@ -67332,6 +67849,9 @@ /obj/structure/disposalpipe/trunk{ dir = 8 }, +/obj/structure/machinery/light{ + dir = 4 + }, /turf/open/floor/wood/ship, /area/almayer/command/corporateliason) "sQO" = ( @@ -68111,6 +68631,11 @@ icon_state = "plating" }, /area/almayer/shipboard/brig/armory) +"tgE" = ( +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "tgK" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -68158,6 +68683,15 @@ icon_state = "cargo_arrow" }, /area/almayer/squads/alpha_bravo_shared) +"thE" = ( +/obj/structure/bed/chair/comfy/charlie{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "thL" = ( /turf/open/floor/wood/ship, /area/almayer/shipboard/brig/cells) @@ -69641,6 +70175,17 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_a_s) +"tMc" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 10 + }, +/obj/structure/bed/chair/comfy/alpha{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "tMf" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -69884,6 +70429,28 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_a_p) +"tSv" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/obj/item/device/flashlight/lamp{ + pixel_x = 15 + }, +/obj/item/paper_bin/uscm{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/tool/pen{ + pixel_x = -9; + pixel_y = 3 + }, +/obj/item/tool/pen{ + pixel_x = 4; + pixel_y = -4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "tSw" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer{ @@ -70457,6 +71024,10 @@ /obj/structure/machinery/firealarm{ pixel_y = -28 }, +/obj/structure/bed/chair/comfy/delta{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/almayer{ icon_state = "plate" }, @@ -70767,11 +71338,13 @@ /turf/open/floor/plating, /area/almayer/engineering/engineering_workshop/hangar) "ukA" = ( -/obj/structure/platform, /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, -/turf/open/floor/almayer, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, /area/almayer/living/briefing) "ukS" = ( /obj/structure/disposalpipe/segment{ @@ -71560,6 +72133,25 @@ icon_state = "dark_sterile" }, /area/almayer/medical/chemistry) +"uzb" = ( +/obj/structure/surface/table/almayer, +/obj/item/device/flashlight/lamp{ + layer = 3.3; + pixel_x = 15 + }, +/obj/item/tool/screwdriver, +/obj/item/bananapeel{ + desc = "An experimental B8 Smart-Scope. Based on the technologies used in the Smart Gun by ARMAT, this sight has integrated IFF systems. It can only attach to the L42A Battle Rifle, M44 Combat Revolver, and M46C Pulse Rifle. This one appears to be covered in gun oil"; + icon = 'icons/obj/items/weapons/guns/attachments.dmi'; + icon_state = "iffbarrel"; + name = "Broken B8 Smart-Scope"; + pixel_x = -3; + pixel_y = 7 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "uzg" = ( /obj/structure/sign/safety/water{ pixel_x = 8; @@ -72133,6 +72725,14 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/engineering/upper_engineering/starboard) +"uLe" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "uLn" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, @@ -72782,6 +73382,17 @@ /obj/structure/window/framed/almayer, /turf/open/floor/plating, /area/almayer/hallways/repair_bay) +"uZX" = ( +/obj/structure/surface/table/almayer, +/obj/item/paper{ + pixel_x = -4; + pixel_y = 5 + }, +/obj/item/tool/pen, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "uZZ" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ name = "\improper Basketball Court" @@ -73330,13 +73941,12 @@ /obj/structure/flora/pottedplant{ icon_state = "pottedplant_21" }, -/obj/structure/sign/poster/io{ - pixel_y = 32; - name = "propaganda poster" - }, /obj/structure/sign/safety/escapepod{ pixel_x = -17 }, +/obj/structure/sign/poster/hero/voteno{ + pixel_y = 32 + }, /turf/open/floor/wood/ship, /area/almayer/command/corporateliason) "vjx" = ( @@ -73433,6 +74043,15 @@ icon_state = "test_floor4" }, /area/almayer/shipboard/brig/general_equipment) +"vkN" = ( +/obj/structure/bed/chair/comfy/charlie{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "vkR" = ( /obj/structure/machinery/power/apc/almayer{ dir = 1 @@ -73481,7 +74100,9 @@ dir = 4 }, /obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer, +/turf/open/floor/almayer{ + icon_state = "plate" + }, /area/almayer/living/briefing) "vlX" = ( /obj/structure/machinery/cm_vending/sorted/cargo_guns/squad_prep, @@ -73596,19 +74217,25 @@ }, /area/almayer/lifeboat_pumps/south1) "vpt" = ( -/obj/structure/bed/chair/comfy/bravo{ - dir = 1 +/obj/structure/surface/table/almayer, +/obj/item/paper_bin/uscm{ + pixel_x = 9; + pixel_y = 6 }, -/obj/structure/sign/poster{ - desc = "YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE."; - icon_state = "poster11"; - name = "YOU ALWAYS KNOW A WORKING JOE."; - pixel_x = 27; - serial_number = 11 +/obj/item/tool/pen{ + pixel_x = 9; + pixel_y = 2 + }, +/obj/item/tool/pen{ + pixel_x = 9; + pixel_y = 9 + }, +/obj/structure/prop/holidays/string_lights{ + dir = 8; + pixel_x = 29 }, -/obj/item/stack/folding_barricade, /turf/open/floor/almayer{ - icon_state = "orangefull" + icon_state = "plate" }, /area/almayer/living/briefing) "vpI" = ( @@ -74152,12 +74779,15 @@ /turf/open/floor/almayer, /area/almayer/engineering/upper_engineering/port) "vyU" = ( -/obj/structure/bed/chair/comfy/charlie, /obj/structure/machinery/light{ dir = 4 }, +/obj/structure/bed/chair/comfy/charlie{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/almayer{ - icon_state = "emeraldfull" + icon_state = "plate" }, /area/almayer/living/briefing) "vzl" = ( @@ -74373,11 +75003,15 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/living/synthcloset) "vEn" = ( -/obj/structure/bed/chair/comfy/bravo{ - dir = 1 +/obj/structure/surface/table/almayer, +/obj/item/device/flashlight/lamp{ + layer = 3.3; + pixel_x = 15 }, -/obj/item/stack/sheet/mineral/uranium{ - layer = 2.99 +/obj/item/paper, +/obj/item/tool/pen{ + pixel_x = -5; + pixel_y = 2 }, /turf/open/floor/almayer{ icon_state = "orangefull" @@ -75165,6 +75799,7 @@ /obj/structure/machinery/firealarm{ pixel_y = 28 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/almayer{ icon_state = "plate" }, @@ -75597,18 +76232,15 @@ /area/almayer/hallways/aft_hallway) "wbe" = ( /obj/structure/surface/table/almayer, -/obj/effect/landmark/map_item{ - layer = 3.03; - pixel_x = 7; - pixel_y = 4 - }, -/obj/item/prop/helmetgarb/spacejam_tickets{ +/obj/item/reagent_container/food/drinks/coffeecup{ pixel_x = -8; - pixel_y = 5 + pixel_y = -1 }, -/obj/item/prop/helmetgarb/spacejam_tickets{ - pixel_x = -8; - pixel_y = -3 +/obj/item/reagent_container/food/drinks/coffee{ + pixel_y = 9 + }, +/obj/item/tool/pen{ + pixel_x = 5 }, /turf/open/floor/almayer{ icon_state = "plate" @@ -75650,31 +76282,31 @@ dir = 8 }, /obj/item/clothing/mask/cigarette/pipe{ - pixel_y = -7; - layer = 2.8 + layer = 2.8; + pixel_y = -7 }, /obj/item/reagent_container/spray/cleaner{ + layer = 3.04; pixel_x = -4; - pixel_y = 7; - layer = 3.04 + pixel_y = 7 }, /obj/structure/machinery/door_control/brbutton{ - pixel_y = 26; - pixel_x = -12; id = "Brig Lockdown Shutters"; - name = "Brig Lockdown" + name = "Brig Lockdown"; + pixel_x = -12; + pixel_y = 26 }, /obj/structure/machinery/door_control/brbutton{ - pixel_y = 26; id = "ARES StairsLock"; name = "ARES Exterior Lockdown Override"; - pixel_x = -2 + pixel_x = -2; + pixel_y = 26 }, /obj/structure/machinery/door_control/brbutton{ - pixel_y = 26; - pixel_x = 8; + id = "ARES Emergency"; name = "ARES Emergency Lockdown Override"; - id = "ARES Emergency" + pixel_x = 8; + pixel_y = 26 }, /turf/open/floor/wood/ship, /area/almayer/living/commandbunks) @@ -75908,8 +76540,8 @@ pixel_y = 9 }, /obj/item/paper_bin/uscm{ - pixel_y = 6; - pixel_x = 7 + pixel_x = 7; + pixel_y = 6 }, /obj/item/tool/pen/red/clicky{ pixel_x = -6; @@ -76077,8 +76709,8 @@ anchored = 0 }, /obj/structure/sign/poster/io{ - pixel_y = 32; - name = "propaganda poster" + name = "propaganda poster"; + pixel_y = 32 }, /turf/open/floor/wood/ship, /area/almayer/command/corporateliason) @@ -76304,6 +76936,16 @@ }, /turf/open/floor/almayer, /area/almayer/lifeboat_pumps/south2) +"wlH" = ( +/obj/structure/surface/table/almayer, +/obj/structure/machinery/computer/emails{ + pixel_x = 2; + pixel_y = 5 + }, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "wlK" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -76581,29 +77223,31 @@ /turf/open/floor/almayer, /area/almayer/shipboard/brig/cic_hallway) "wsP" = ( -/obj/structure/platform{ - dir = 1 - }, /obj/item/prop/helmetgarb/gunoil{ layer = 4.2; pixel_x = -3; - pixel_y = 1 + pixel_y = 6 }, /obj/item/prop/helmetgarb/gunoil{ layer = 4.2; pixel_x = -10; - pixel_y = 1 + pixel_y = 10 }, /obj/item/prop/helmetgarb/gunoil{ layer = 4.2; pixel_x = 4; - pixel_y = 1 + pixel_y = 9 }, /obj/item/weapon/broken_bottle{ - pixel_x = 11; - pixel_y = -2 + layer = 4.51; + pixel_x = 9; + pixel_y = 1 + }, +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" }, -/turf/open/floor/almayer, /area/almayer/living/briefing) "wsR" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, @@ -76738,13 +77382,8 @@ }, /area/almayer/living/synthcloset) "wwk" = ( -/obj/structure/bed/chair/comfy/bravo{ - dir = 1 - }, -/obj/item/stack/folding_barricade, -/obj/item/stack/sheet/mineral/uranium{ - layer = 2.99 - }, +/obj/structure/surface/table/almayer, +/obj/effect/landmark/map_item, /turf/open/floor/almayer{ icon_state = "orangefull" }, @@ -76948,12 +77587,32 @@ }, /area/almayer/hallways/port_hallway) "wAU" = ( -/obj/structure/bed/chair/comfy/delta, /obj/structure/sign/poster/music{ pixel_x = -27 }, +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/obj/item/device/flashlight/lamp{ + pixel_x = 15 + }, +/obj/item/paper_bin/uscm{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/tool/pen{ + pixel_x = -10; + pixel_y = -1 + }, +/obj/item/tool/pen{ + pixel_x = 3; + pixel_y = -4 + }, +/obj/item/tool/pen{ + pixel_x = -11; + pixel_y = 5 + }, /turf/open/floor/almayer{ - icon_state = "bluefull" + icon_state = "plate" }, /area/almayer/living/briefing) "wBY" = ( @@ -77339,6 +77998,11 @@ "wJH" = ( /turf/closed/wall/almayer/research/containment/wall/east, /area/almayer/medical/containment/cell/cl) +"wJL" = ( +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "wKn" = ( /obj/structure/surface/rack, /obj/item/facepaint/sniper, @@ -77477,9 +78141,13 @@ }, /area/almayer/medical/containment) "wLV" = ( -/obj/structure/bed/chair/comfy/charlie, +/obj/structure/machinery/vending/cola{ + density = 0; + pixel_y = 16 + }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/almayer{ - icon_state = "emeraldfull" + icon_state = "plate" }, /area/almayer/living/briefing) "wMm" = ( @@ -78514,9 +79182,6 @@ desc = "A supply crate containing everything you need to stop a CLF uprising."; name = "\improper USCM crate 'FOB supplies'" }, -/obj/structure/sign/arcturianstopsign{ - pixel_y = 32 - }, /obj/item/folded_tent/big{ pixel_x = -6; pixel_y = 10 @@ -78694,6 +79359,14 @@ icon_state = "emerald" }, /area/almayer/hallways/port_hallway) +"xkY" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "xlk" = ( /obj/structure/surface/table/almayer, /turf/open/floor/almayer, @@ -78967,9 +79640,13 @@ /turf/closed/wall/almayer, /area/almayer/command/securestorage) "xqM" = ( -/obj/structure/platform, /obj/structure/pipes/vents/pump, -/turf/open/floor/almayer, +/obj/structure/bed/chair/comfy/delta{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, /area/almayer/living/briefing) "xqS" = ( /obj/effect/decal/warning_stripes{ @@ -79442,9 +80119,6 @@ /turf/open/floor/plating, /area/almayer/hull/upper_hull/u_a_p) "xzp" = ( -/obj/structure/bed/chair/comfy/bravo{ - dir = 1 - }, /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, @@ -79461,6 +80135,18 @@ }, /turf/open/floor/almayer, /area/almayer/shipboard/brig/cells) +"xzB" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 9 + }, +/obj/structure/bed/chair/comfy/delta{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "xAe" = ( /turf/closed/wall/almayer/research/containment/wall/corner, /area/almayer/medical/containment/cell) @@ -79625,20 +80311,22 @@ }, /area/almayer/command/airoom) "xDQ" = ( -/obj/structure/platform, -/obj/item/trash/USCMtray{ - pixel_y = 4 +/obj/structure/surface/table/almayer, +/obj/item/reagent_container/food/snacks/mre_pack/xmas3{ + pixel_x = 5 }, -/obj/item/trash/USCMtray{ - pixel_y = 6 +/obj/item/reagent_container/food/snacks/mre_pack/xmas2{ + pixel_x = 5; + pixel_y = 9 }, -/obj/item/trash/USCMtray{ - pixel_y = 8 +/obj/effect/landmark/map_item{ + layer = 3.03; + pixel_x = -7; + pixel_y = 4 }, -/obj/item/trash/USCMtray{ - pixel_y = 10 +/turf/open/floor/almayer{ + icon_state = "plate" }, -/turf/open/floor/almayer, /area/almayer/living/briefing) "xEc" = ( /turf/open/floor/almayer{ @@ -79789,6 +80477,25 @@ icon_state = "red" }, /area/almayer/living/briefing) +"xGL" = ( +/obj/structure/surface/table/almayer, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper_bin/uscm{ + pixel_x = 9; + pixel_y = 6 + }, +/obj/item/tool/pen{ + pixel_x = 9; + pixel_y = 2 + }, +/obj/item/tool/pen{ + pixel_x = 9; + pixel_y = 9 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "xHe" = ( /obj/structure/pipes/vents/pump{ dir = 4 @@ -80143,13 +80850,20 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_m_s) "xPR" = ( -/obj/structure/platform{ - dir = 1 - }, /obj/structure/pipes/vents/scrubber{ dir = 4 }, -/turf/open/floor/almayer, +/obj/structure/surface/table/almayer, +/obj/structure/machinery/computer/emails{ + dir = 1 + }, +/obj/item/reagent_container/food/snacks/grown/banana{ + pixel_x = 18; + pixel_y = 5 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, /area/almayer/living/briefing) "xPZ" = ( /obj/structure/pipes/standard/simple/hidden/supply{ @@ -113072,7 +113786,7 @@ akU avj kpl awE -xgr +hlq bYj btz bsc @@ -113275,7 +113989,7 @@ akU avj awE awE -bqy +xgr bYj eUR gEI @@ -115578,8 +116292,8 @@ wsP izr aSh ccF -tGG -tGG +rFV +iXR bdg aLG awb @@ -115609,12 +116323,12 @@ buH hOR buH bdg -sNI +cxZ wAU diw -csG -sNI -wNT +tSv +cxZ +ffl wbe bdd qXo @@ -115776,13 +116490,13 @@ hhw umv hhw bdd -bqZ -kbV -tGG -tGG -tGG +hjT +jZr tGG +fHe tGG +sBs +iXR bdg aLG aYO @@ -115812,13 +116526,13 @@ buH bHL buH bdg -sNI -sNI -sNI -sNI +cxZ +hnH +kXH +kfG dkH cKX -bqZ +oqP bdd tLc rsM @@ -115980,12 +116694,12 @@ aSm eoM bdd vTt -kbV -tGG -tGG -tGG -tGG +tgE +tgE +fNu tGG +gmp +iXR bdg aLG aYO @@ -116015,13 +116729,13 @@ buH bHL buH bdg -sNI +cxZ csG sNI -sNI +mgR gNi -wNT -cab +wJL +oMC bdd hxZ rsM @@ -116117,7 +116831,7 @@ qVM csz awE qMe -bYj +nKJ bYj dyF awE @@ -116182,14 +116896,14 @@ aSm aSm kOf bdd -bDQ -kbV -tGG +dYH +bDP +tgE okB -tGG +tgE crK -tGG -bdg +xkY +bdd beB aYT beB @@ -116217,11 +116931,11 @@ bCx buH bHL buH -bdg -sNI -sNI -sNI -sNI +bdd +qWy +uZX +wJL +wJL eCS xqM udV @@ -116385,12 +117099,12 @@ mhl aSm ylY bdd -bqZ qgw -beH -qMR +qgw +qgw +tMc vlR -dRT +uLe qin pmv tBF @@ -116421,13 +117135,13 @@ bFu omW bFu hLS -eBg -eBg -eBg -eBg -fOk +vKe +vKe +sgE +ljz +xzB epq -bqZ +fCt bdd hTf rKO @@ -116791,13 +117505,13 @@ pOB hfk aLf bdd -bqZ +gVm kKL -aLJ -eBg +gOm +hFX dAO cEG -eBg +vKe dYX tBF lBz @@ -116827,13 +117541,13 @@ buH uXu bFu iUk -eBg +cIl gkJ -eBg -eBg +vKe +cum mVZ kTx -bqZ +jIG bdd hTf wRO @@ -116994,14 +117708,14 @@ lQu lQu aSm bdd -bDQ +iFG iWE jUo -wmz -wmz +iXd +iXd wwk -wmz -bdg +hMJ +bdd aLG awb aLG @@ -117029,14 +117743,14 @@ bdg buH hOR buH -bdg +bdd wLV nza -wLV -wLV -wLV +mwz +mwz +mwz ukA -bqZ +jIG bdd gKB rsM @@ -117197,13 +117911,13 @@ yfy ugV vUi bdd -vTt -kbV +jEI +iXd xzp vEn wmz -wmz -wmz +npS +qsa bdg aLG aYO @@ -117233,13 +117947,13 @@ bGe bHL buH bdg -wLV -wLV -wLV -wLV -gKH +kxF +elX +gAj +bHS +aLA ldj -cab +oMC bdd sOt cNX @@ -117400,13 +118114,13 @@ aLf qce aSm bdd -bqZ +gcw xPR nIW +uzb wmz -wmz -wmz -wmz +idJ +qsa bdg beB aYT @@ -117436,13 +118150,13 @@ bJz bHT bJz bdg -wLV -wLV -wLV -wLV -wLV -wNT -udV +kxF +lad +thE +hIt +gAj +wlH +sGX bdd pEl roU @@ -117605,11 +118319,11 @@ qEW bdd gGo mLb -wmz +qmB vpt kQU -wmz -wmz +rdb +kQU bdg aLG aYO @@ -117642,8 +118356,8 @@ bdg gKH cgz vyU -wLV -wLV +xGL +vkN xDQ bXc bdd diff --git a/maps/sorokyne_strata.json b/maps/sorokyne_strata.json index 61c3a7fd3f69..5a0f6d67c410 100644 --- a/maps/sorokyne_strata.json +++ b/maps/sorokyne_strata.json @@ -11,6 +11,7 @@ "/datum/equipment_preset/survivor/scientist/soro", "/datum/equipment_preset/survivor/doctor/soro", "/datum/equipment_preset/survivor/engineer/soro", + "/datum/equipment_preset/survivor/corporate/soro", "/datum/equipment_preset/survivor/security/soro", "/datum/equipment_preset/survivor/interstellar_human_rights_observer/soro" ], diff --git a/sound/weapons/gun_xm88_directhit_high.ogg b/sound/weapons/gun_xm88_directhit_high.ogg new file mode 100644 index 000000000000..6db42f73cf0e Binary files /dev/null and b/sound/weapons/gun_xm88_directhit_high.ogg differ diff --git a/sound/weapons/gun_xm88_directhit_low.ogg b/sound/weapons/gun_xm88_directhit_low.ogg new file mode 100644 index 000000000000..c516f4fc2650 Binary files /dev/null and b/sound/weapons/gun_xm88_directhit_low.ogg differ diff --git a/sound/weapons/gun_xm88_directhit_medium.ogg b/sound/weapons/gun_xm88_directhit_medium.ogg new file mode 100644 index 000000000000..106fd23cb981 Binary files /dev/null and b/sound/weapons/gun_xm88_directhit_medium.ogg differ