diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index dcc8e4bf6c4b..044271be9b5a 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -42,6 +42,7 @@ most of them are tied into map-placed objects. This should be reworked in the fu #define ACCESS_MARINE_OT 35 #define ACCESS_MARINE_SYNTH 36 +#define ACCESS_MARINE_ASO 37 // AI Core Accesses /// Used in temporary passes diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm index d598a8ff6f67..eac5121f173e 100644 --- a/code/__DEFINES/job.dm +++ b/code/__DEFINES/job.dm @@ -72,10 +72,13 @@ var/global/list/job_squad_roles = JOB_SQUAD_ROLES_LIST #define JOB_COMMAND_ROLES_LIST list(JOB_CO, JOB_XO, JOB_SO) var/global/list/job_command_roles = JOB_COMMAND_ROLES_LIST +#define JOB_AUXILIARY_OFFICER "Auxiliary Support Officer" #define JOB_PILOT "Pilot Officer" #define JOB_DROPSHIP_CREW_CHIEF "Dropship Crew Chief" #define JOB_CREWMAN "Vehicle Crewman" #define JOB_INTEL "Intelligence Officer" +#define JOB_AUXILIARY_ROLES /datum/timelock/auxiliary +#define JOB_AUXILIARY_ROLES_LIST list(JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_CREWMAN, JOB_INTEL) #define JOB_POLICE "Military Police" #define JOB_WARDEN "Military Warden" @@ -91,7 +94,7 @@ var/global/list/job_command_roles = JOB_COMMAND_ROLES_LIST #define JOB_ENGINEER_ROLES /datum/timelock/engineer #define JOB_ENGINEER_ROLES_LIST list(JOB_SQUAD_ENGI, JOB_MAINT_TECH, JOB_ORDNANCE_TECH, JOB_CHIEF_ENGINEER) -#define JOB_CHIEF_REQUISITION "Requisitions Officer" +#define JOB_CHIEF_REQUISITION "Quartermaster" #define JOB_CARGO_TECH "Cargo Technician" #define JOB_REQUISITION_ROLES /datum/timelock/requisition #define JOB_REQUISITION_ROLES_LIST list(JOB_CHIEF_REQUISITION, JOB_CARGO_TECH) @@ -143,7 +146,7 @@ var/global/list/job_command_roles = JOB_COMMAND_ROLES_LIST #define JOB_WO_CHIEF_ENGINEER "Bunker Crew Master" #define JOB_WO_ORDNANCE_TECH "Bunker Crew" -#define JOB_WO_CHIEF_REQUISITION "Quartermaster" +#define JOB_WO_CHIEF_REQUISITION "Bunker Quartermaster" #define JOB_WO_REQUISITION "Bunker Crew Logistics" #define JOB_WO_CMO "Head Surgeon" @@ -344,11 +347,12 @@ var/global/list/job_command_roles = JOB_COMMAND_ROLES_LIST #define JOB_PLAYTIME_TIER_4 (175 HOURS) #define XENO_NO_AGE -1 -#define XENO_NORMAL 0 -#define XENO_MATURE 1 -#define XENO_ELDER 2 -#define XENO_ANCIENT 3 -#define XENO_PRIME 4 +#define XENO_YOUNG 0 +#define XENO_NORMAL 1 +#define XENO_MATURE 2 +#define XENO_ELDER 3 +#define XENO_ANCIENT 4 +#define XENO_PRIME 5 /// For monthly time tracking #define JOB_OBSERVER "Observer" diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index 557f8e6a3f68..e4c4041a3dda 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -20,6 +20,8 @@ #define ALL_SYNTH_LANGUAGES list(LANGUAGE_ENGLISH, LANGUAGE_JAPANESE, LANGUAGE_CHINESE, LANGUAGE_RUSSIAN, LANGUAGE_GERMAN, LANGUAGE_SPANISH, LANGUAGE_YAUTJA, LANGUAGE_XENOMORPH) +#define ALL_SYNTH_LANGUAGES_UPP list(LANGUAGE_RUSSIAN, LANGUAGE_ENGLISH, LANGUAGE_JAPANESE, LANGUAGE_CHINESE, LANGUAGE_GERMAN, LANGUAGE_SPANISH, LANGUAGE_YAUTJA, LANGUAGE_XENOMORPH) + //Chinese language sound bitflags //initial flags diff --git a/code/__DEFINES/minimap.dm b/code/__DEFINES/minimap.dm index 9069ed323357..c9f21484f622 100644 --- a/code/__DEFINES/minimap.dm +++ b/code/__DEFINES/minimap.dm @@ -4,7 +4,8 @@ #define MINIMAP_FLAG_PMC (1<<2) #define MINIMAP_FLAG_UPP (1<<3) #define MINIMAP_FLAG_CLF (1<<4) -#define MINIMAP_FLAG_ALL (1<<5) - 1 +#define MINIMAP_FLAG_YAUTJA (1<<5) +#define MINIMAP_FLAG_ALL (1<<6) - 1 ///Converts the overworld x and y to minimap x and y values #define MINIMAP_SCALE 2 @@ -59,6 +60,7 @@ GLOBAL_LIST_INIT(all_minimap_flags, bitfield2list(MINIMAP_FLAG_ALL)) #define MINIMAP_ICON_COLOR_COMMANDER "#c6fcfc" #define MINIMAP_ICON_COLOR_HEAD "#F0C542" +#define MINIMAP_ICON_COLOR_SILVER "#c0c0c0" #define MINIMAP_ICON_COLOR_BRONZE "#eb9545" #define MINIMAP_ICON_COLOR_DOCTOR "#b83737" diff --git a/code/__DEFINES/mode.dm b/code/__DEFINES/mode.dm index 2895b3211fd3..c44a8e340546 100644 --- a/code/__DEFINES/mode.dm +++ b/code/__DEFINES/mode.dm @@ -70,6 +70,7 @@ #define MODE_LZ_PROTECTION (1<<7) /// Prevents the LZ from being mortared #define MODE_SHIPSIDE_SD (1<<8) /// Toggles whether Predators can big SD when not on the groundmap #define MODE_HARDCORE_PERMA (1<<9) /// Toggles Hardcore for all marines, meaning they instantly perma upon death +#define MODE_DISPOSABLE_MOBS (1<<10) // Toggles if mobs fit in disposals or not. Off by default. #define ROUNDSTATUS_FOG_DOWN 1 #define ROUNDSTATUS_PODDOORS_OPEN 2 @@ -107,12 +108,12 @@ //================================================= //Role defines, specifically lists of roles for job bans, crew manifests and the like. -var/global/list/ROLES_COMMAND = list(JOB_CO, JOB_XO, JOB_SO, JOB_INTEL, JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_CREWMAN, JOB_POLICE, JOB_CORPORATE_LIAISON, JOB_COMBAT_REPORTER, JOB_CHIEF_REQUISITION, JOB_CHIEF_ENGINEER, JOB_CMO, JOB_CHIEF_POLICE, JOB_SEA, JOB_SYNTH, JOB_WARDEN) +var/global/list/ROLES_COMMAND = list(JOB_CO, JOB_XO, JOB_SO, JOB_AUXILIARY_OFFICER, JOB_INTEL, JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_CREWMAN, JOB_POLICE, JOB_CORPORATE_LIAISON, JOB_COMBAT_REPORTER, JOB_CHIEF_REQUISITION, JOB_CHIEF_ENGINEER, JOB_CMO, JOB_CHIEF_POLICE, JOB_SEA, JOB_SYNTH, JOB_WARDEN) //Marine roles -#define ROLES_OFFICERS list(JOB_CO, JOB_XO, JOB_SO, JOB_INTEL, JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_SEA, JOB_CORPORATE_LIAISON, JOB_COMBAT_REPORTER, JOB_SYNTH, JOB_CHIEF_POLICE, JOB_WARDEN, JOB_POLICE) +#define ROLES_OFFICERS list(JOB_CO, JOB_XO, JOB_SO, JOB_AUXILIARY_OFFICER, JOB_INTEL, JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_SEA, JOB_CORPORATE_LIAISON, JOB_COMBAT_REPORTER, JOB_SYNTH, JOB_CHIEF_POLICE, JOB_WARDEN, JOB_POLICE) var/global/list/ROLES_CIC = list(JOB_CO, JOB_XO, JOB_SO, JOB_WO_CO, JOB_WO_XO) -var/global/list/ROLES_AUXIL_SUPPORT = list(JOB_INTEL, JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_WO_CHIEF_POLICE, JOB_WO_SO, JOB_WO_CREWMAN, JOB_WO_POLICE, JOB_WO_PILOT) +var/global/list/ROLES_AUXIL_SUPPORT = list(JOB_AUXILIARY_OFFICER, JOB_INTEL, JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_WO_CHIEF_POLICE, JOB_WO_SO, JOB_WO_CREWMAN, JOB_WO_POLICE, JOB_WO_PILOT) var/global/list/ROLES_MISC = list(JOB_SYNTH, JOB_WORKING_JOE, JOB_SEA, JOB_CORPORATE_LIAISON, JOB_COMBAT_REPORTER, JOB_MESS_SERGEANT, JOB_WO_CORPORATE_LIAISON, JOB_WO_SYNTH) var/global/list/ROLES_POLICE = list(JOB_CHIEF_POLICE, JOB_WARDEN, JOB_POLICE) var/global/list/ROLES_ENGINEERING = list(JOB_CHIEF_ENGINEER, JOB_ORDNANCE_TECH, JOB_MAINT_TECH, JOB_WO_CHIEF_ENGINEER, JOB_WO_ORDNANCE_TECH) diff --git a/code/__DEFINES/urls.dm b/code/__DEFINES/urls.dm index e12ec1079589..4d9268220f2b 100644 --- a/code/__DEFINES/urls.dm +++ b/code/__DEFINES/urls.dm @@ -34,7 +34,8 @@ #define URL_WIKI_CMP_GUIDE "https://cm-ss13.com/wiki/Chief_MP" // MP Roles // #define URL_WIKI_MW_GUIDE "https://cm-ss13.com/wiki/Warden" #define URL_WIKI_MP_GUIDE "https://cm-ss13.com/wiki/Military_Police" -#define URL_WIKI_PO_GUIDE "https://cm-ss13.com/wiki/Pilot_Officer" // Auxiliary Support +#define URL_WIKI_ASO_GUIDE "https://cm-ss13.com/wiki/Auxiliary_Support_Officer" // Auxiliary Support +#define URL_WIKI_PO_GUIDE "https://cm-ss13.com/wiki/Pilot_Officer" #define URL_WIKI_DCC_GUIDE "https://cm-ss13.com/wiki/Dropship_Crew_Chief" #define URL_WIKI_IO_GUIDE "https://cm-ss13.com/wiki/Intelligence_Officer" #define URL_WIKI_SYN_GUIDE "https://cm-ss13.com/wiki/Synthetic" diff --git a/code/__DEFINES/xeno.dm b/code/__DEFINES/xeno.dm index 82237cd793b2..0f822385ad13 100644 --- a/code/__DEFINES/xeno.dm +++ b/code/__DEFINES/xeno.dm @@ -8,6 +8,9 @@ #define TUNNEL_ENTER_BIG_XENO_DELAY 120 #define TUNNEL_ENTER_LARVA_DELAY 10 +/// The duration it takes a player controlled facehugger to leap or hug adjacently +#define FACEHUGGER_WINDUP_DURATION 1 SECONDS + // Defines for action types and click delays used by xenomorph/unarmedattack() and attack_alien(). /// Full attack delay. @@ -165,6 +168,12 @@ /// The amount of time after round start before buried larva spawns are disallowed #define XENO_BURIED_LARVA_TIME_LIMIT (30 MINUTES) +/// The time when xenos can start taking over comm towers +#define XENO_COMM_ACQUISITION_TIME (90 MINUTES) + +/// The time it takes for a pylon to give one larva while activated +#define XENO_PYLON_ACTIVATION_COOLDOWN (5 MINUTES) + /// The time against away_timer when an AFK xeno larva can be replaced #define XENO_LEAVE_TIMER_LARVA 80 //80 seconds /// The time against away_timer when an AFK xeno (not larva) can be replaced diff --git a/code/__HELPERS/logging.dm b/code/__HELPERS/logging.dm index 32da4c953188..5ecbff108725 100644 --- a/code/__HELPERS/logging.dm +++ b/code/__HELPERS/logging.dm @@ -108,8 +108,10 @@ if (CONFIG_GET(flag/log_interact)) WRITE_LOG(GLOB.world_game_log, "INTERACT: [msg]") LOG_REDIS("interact", "\[[time]\] [msg]") - origin.attack_log += "\[[time]\] [msg] " - target.attack_log += "\[[time]\] [msg] " + if(origin) + origin.attack_log += "\[[time]\] [msg] " + if(target) + target.attack_log += "\[[time]\] [msg] " GLOB.STUI.attack.Add("\[[time]]INTERACT: [msg]") GLOB.STUI.processing |= STUI_LOG_ATTACK diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index ef539b8459c7..4936609d892e 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -415,6 +415,7 @@ DEFINE_BITFIELD(toggleable_flags, list( "MODE_NO_COMBAT_CAS" = MODE_NO_COMBAT_CAS, "MODE_LZ_PROTECTION" = MODE_LZ_PROTECTION, "MODE_SHIPSIDE_SD" = MODE_SHIPSIDE_SD, + "MODE_DISPOSABLE_MOBS" = MODE_DISPOSABLE_MOBS, )) DEFINE_BITFIELD(state, list( diff --git a/code/_globalvars/lists/mapping_globals.dm b/code/_globalvars/lists/mapping_globals.dm index cf5b2ad435b8..47cc22dae5e1 100644 --- a/code/_globalvars/lists/mapping_globals.dm +++ b/code/_globalvars/lists/mapping_globals.dm @@ -27,6 +27,7 @@ GLOBAL_LIST_EMPTY(latewhiskey) GLOBAL_LIST_EMPTY(latejoin) GLOBAL_LIST_EMPTY(latejoin_by_squad) +GLOBAL_LIST_EMPTY(latejoin_by_job) GLOBAL_LIST_EMPTY(zombie_landmarks) diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 5acfe74f2965..b67953b1edbe 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -53,6 +53,13 @@ ManualFollow(target) return FALSE + if(xeno.hive) + for(var/mob_name in xeno.hive.banished_ckeys) + if(xeno.hive.banished_ckeys[mob_name] == ckey) + to_chat(src, SPAN_WARNING("You are banished from the [xeno.hive], you may not rejoin unless the Queen re-admits you or dies.")) + ManualFollow(target) + return FALSE + if(alert(src, "Are you sure you want to transfer yourself into [xeno]?", "Confirm Transfer", "Yes", "No") != "Yes") return FALSE if(((!islarva(xeno) && xeno.away_timer < XENO_LEAVE_TIMER) || (islarva(xeno) && xeno.away_timer < XENO_LEAVE_TIMER_LARVA)) || xeno.stat == DEAD) // Do it again, just in case diff --git a/code/datums/components/weed_food.dm b/code/datums/components/weed_food.dm index 0c578b661517..ce6c17e0af95 100644 --- a/code/datums/components/weed_food.dm +++ b/code/datums/components/weed_food.dm @@ -193,6 +193,8 @@ return FALSE if(!parent_turf?.weeds) return FALSE + if(SEND_SIGNAL(parent_mob, COMSIG_ATTEMPT_MOB_PULL) & COMPONENT_CANCEL_MOB_PULL) + return FALSE if(unmerged_time == world.time) return merge_with_weeds() // Weeds upgraded, re-merge now re-using the apperance @@ -245,6 +247,9 @@ UnregisterSignal(parent_buckle, COSMIG_OBJ_AFTER_BUCKLE) parent_buckle = null + if(SEND_SIGNAL(parent_mob, COMSIG_ATTEMPT_MOB_PULL) & COMPONENT_CANCEL_MOB_PULL) + return FALSE + absorbing_weeds = parent_turf?.weeds if(!absorbing_weeds) return FALSE diff --git a/code/datums/emergency_calls/cryo_marines.dm b/code/datums/emergency_calls/cryo_marines.dm index eb914e198b37..fb4a0d94e177 100644 --- a/code/datums/emergency_calls/cryo_marines.dm +++ b/code/datums/emergency_calls/cryo_marines.dm @@ -36,30 +36,35 @@ if(leaders < cryo_squad.max_leaders && HAS_FLAG(H.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(H.client, JOB_SQUAD_LEADER, time_required_for_job)) leader = H leaders++ - arm_equipment(H, /datum/equipment_preset/uscm/leader/cryo, TRUE, TRUE) + H.client.prefs.copy_all_to(H, JOB_SQUAD_LEADER, TRUE, TRUE) + arm_equipment(H, /datum/equipment_preset/uscm/leader/cryo, FALSE, TRUE) to_chat(H, SPAN_ROLE_HEADER("You are a Squad Leader 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_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 && 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/spec/cryo, TRUE, TRUE) + H.client.prefs.copy_all_to(H, JOB_SQUAD_SPECIALIST, TRUE, TRUE) + arm_equipment(H, /datum/equipment_preset/uscm/spec/cryo, FALSE, 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]. 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.")) 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/cryo, TRUE, TRUE) + H.client.prefs.copy_all_to(H, JOB_SQUAD_MEDIC, TRUE, TRUE) + arm_equipment(H, /datum/equipment_preset/uscm/medic/cryo, FALSE, TRUE) to_chat(H, SPAN_ROLE_HEADER("You are a Hospital Corpsman 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_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 && 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/cryo, TRUE, TRUE) + H.client.prefs.copy_all_to(H, JOB_SQUAD_ENGI, TRUE, TRUE) + arm_equipment(H, /datum/equipment_preset/uscm/engineer/cryo, FALSE, TRUE) to_chat(H, SPAN_ROLE_HEADER("You are an Engineer 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_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced.")) else - arm_equipment(H, /datum/equipment_preset/uscm/pfc/cryo, TRUE, TRUE) + H.client.prefs.copy_all_to(H, JOB_SQUAD_MARINE, TRUE, TRUE) + arm_equipment(H, /datum/equipment_preset/uscm/pfc/cryo, FALSE, TRUE) to_chat(H, SPAN_ROLE_HEADER("You are a Rifleman 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_BOLDWARNING("If you wish to cryo or ghost upon spawning in, you must ahelp and inform staff so you can be replaced.")) diff --git a/code/datums/entities/player.dm b/code/datums/entities/player.dm index 9b8f95938de6..ed97c4eafaae 100644 --- a/code/datums/entities/player.dm +++ b/code/datums/entities/player.dm @@ -105,6 +105,7 @@ BSQL_PROTECT_DATUM(/datum/entity/player) note.player_id = id note.text = note_text note.date = "[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]" + note.round_id = GLOB.round_id note.is_confidential = is_confidential note.note_category = note_category note.is_ban = is_ban diff --git a/code/datums/entities/player_note.dm b/code/datums/entities/player_note.dm index f6662a153113..420bb5f0a470 100644 --- a/code/datums/entities/player_note.dm +++ b/code/datums/entities/player_note.dm @@ -1,8 +1,11 @@ +#define NOTE_ROUND_ID(note_entity) note_entity.round_id ? "(ID: [note_entity.round_id])" : "" + /datum/entity/player_note var/player_id var/admin_id var/text var/date + var/round_id var/is_ban = FALSE var/ban_time var/is_confidential = FALSE @@ -19,15 +22,16 @@ BSQL_PROTECT_DATUM(/datum/entity/player_note) entity_type = /datum/entity/player_note table_name = "player_notes" field_types = list( - "player_id"=DB_FIELDTYPE_BIGINT, - "admin_id"=DB_FIELDTYPE_BIGINT, - "text"=DB_FIELDTYPE_STRING_MAX, - "date"=DB_FIELDTYPE_STRING_LARGE, - "is_ban"=DB_FIELDTYPE_INT, - "ban_time"=DB_FIELDTYPE_BIGINT, - "is_confidential"=DB_FIELDTYPE_INT, - "admin_rank"=DB_FIELDTYPE_STRING_MEDIUM, - "note_category" =DB_FIELDTYPE_INT, + "player_id" = DB_FIELDTYPE_BIGINT, + "admin_id" = DB_FIELDTYPE_BIGINT, + "text" = DB_FIELDTYPE_STRING_MAX, + "date" = DB_FIELDTYPE_STRING_LARGE, + "round_id" = DB_FIELDTYPE_BIGINT, + "is_ban" = DB_FIELDTYPE_INT, + "ban_time" = DB_FIELDTYPE_BIGINT, + "is_confidential" = DB_FIELDTYPE_INT, + "admin_rank" = DB_FIELDTYPE_STRING_MEDIUM, + "note_category" = DB_FIELDTYPE_INT, ) /datum/entity_meta/player_note/on_read(datum/entity/player_note/note) @@ -64,6 +68,7 @@ BSQL_PROTECT_DATUM(/datum/entity/player_note) var/is_ban var/admin_ckey var/date + var/round_id var/ban_time var/is_confidential var/admin_rank @@ -79,6 +84,7 @@ BSQL_PROTECT_DATUM(/datum/entity/player_note) "is_ban", "admin_ckey" = "admin.ckey", "date", + "round_id", "ban_time", "is_confidential", "admin_rank", @@ -88,4 +94,4 @@ BSQL_PROTECT_DATUM(/datum/entity/player_note) /// Returns all notes associated with a CKEY, structured as a list of strings. /proc/get_all_notes(player_ckey) for(var/datum/view_record/note_view/note in DB_VIEW(/datum/view_record/note_view, DB_COMP("player_ckey", DB_EQUALS, player_ckey))) - LAZYADDASSOC(., "[note.note_category]", "\"[note.text]\", by [note.admin_ckey] ([note.admin_rank]) on [note.date]") + LAZYADDASSOC(., "[note.note_category]", "\"[note.text]\", by [note.admin_ckey] ([note.admin_rank]) on [note.date] ([note.round_id])") diff --git a/code/datums/factions/uscm.dm b/code/datums/factions/uscm.dm index 4d13e7d285ca..cf77142ce5d6 100644 --- a/code/datums/factions/uscm.dm +++ b/code/datums/factions/uscm.dm @@ -77,6 +77,9 @@ if(JOB_SO) marine_rk = "so" border_rk = "command" + if(JOB_AUXILIARY_OFFICER) + marine_rk = "aso" + border_rk = "command" if(JOB_GENERAL, JOB_COLONEL, JOB_ACMC, JOB_CMC) marine_rk = "general" border_rk = "command" diff --git a/code/datums/mob_hud.dm b/code/datums/mob_hud.dm index c1f67e93a53c..aa1bc9b40783 100644 --- a/code/datums/mob_hud.dm +++ b/code/datums/mob_hud.dm @@ -441,9 +441,9 @@ var/list/datum/mob_hud/huds = list( holder2_set = 1 return - holder.icon_state = "huddead" + holder.icon_state = HAS_TRAIT(src, TRAIT_HARDCORE) || MODE_HAS_TOGGLEABLE_FLAG(MODE_HARDCORE_PERMA) ? "hudhcdead" : "huddead" if(!holder2_set) - holder2.icon_state = "huddead" + holder2.icon_state = holder.icon_state holder3.icon_state = "huddead" holder2_set = 1 diff --git a/code/datums/skills.dm b/code/datums/skills.dm index b70b2bb9b7b0..584d466d948c 100644 --- a/code/datums/skills.dm +++ b/code/datums/skills.dm @@ -699,6 +699,23 @@ COMMAND STAFF SKILL_INTEL = SKILL_INTEL_TRAINED, ) +/datum/skills/auxiliary_officer + name = "Auxiliary Support Officer" + skills = list( + SKILL_PILOT = SKILL_PILOT_EXPERT, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_POLICE = SKILL_POLICE_FLASH, + SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + ) + /datum/skills/CE name = "Chief Engineer" skills = list( @@ -1594,6 +1611,82 @@ COLONIAL MARSHALS SKILL_INTEL = SKILL_INTEL_EXPERT, SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER ) + +/datum/skills/military/survivor/upp_private + name = "UPP Private" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/upp_sapper + name = "UPP Sapper" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/upp_medic + name = "UPP Medic" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/upp_spec + name = "UPP Specialist" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_UPP, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + ) + +/datum/skills/military/survivor/upp_sl + name = "UPP Squad Leader" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) + /* --------------------- SPEC-OPS diff --git a/code/datums/statistics/entities/death_stats.dm b/code/datums/statistics/entities/death_stats.dm index 7e26e92ae135..4a01e4e9d72b 100644 --- a/code/datums/statistics/entities/death_stats.dm +++ b/code/datums/statistics/entities/death_stats.dm @@ -65,13 +65,25 @@ ) /mob/proc/track_mob_death(datum/cause_data/cause_data, turf/death_loc) - if(!mind || statistic_exempt) - return - if(cause_data && !istype(cause_data)) stack_trace("track_mob_death called with string cause ([cause_data]) instead of datum") cause_data = create_cause_data(cause_data) + var/log_message = "\[[time_stamp()]\] [key_name(src)] died to " + if(cause_data) + log_message += "[cause_data.cause_name]" + else + log_message += "unknown causes" + var/mob/cause_mob = cause_data?.resolve_mob() + if(cause_mob) + log_message += " from [key_name(cause_data.resolve_mob())]" + cause_mob.attack_log += "\[[time_stamp()]\] [key_name(cause_mob)] killed [key_name(src)] with [cause_data.cause_name]." + + attack_log += "[log_message]." + + if(!mind || statistic_exempt) + return + var/datum/entity/statistic/death/new_death = DB_ENTITY(/datum/entity/statistic/death) var/datum/entity/player/player_entity = get_player_from_key(mind.ckey) if(player_entity) @@ -96,7 +108,6 @@ new_death.cause_role_name = cause_data?.role new_death.cause_faction_name = cause_data?.faction - var/mob/cause_mob = cause_data?.resolve_mob() if(cause_mob) cause_mob.life_kills_total += life_value diff --git a/code/datums/supply_packs/attachments.dm b/code/datums/supply_packs/attachments.dm index 2a812e94cfc1..b685e5c3c37f 100644 --- a/code/datums/supply_packs/attachments.dm +++ b/code/datums/supply_packs/attachments.dm @@ -84,17 +84,6 @@ containername = "extended barrel attachment crate" group = "Attachments" -/datum/supply_packs/muzzle_heavy - name = "barrel charger attachment crate (x2)" - contains = list( - /obj/item/attachable/heavy_barrel, - /obj/item/attachable/heavy_barrel, - ) - cost = 30 - containertype = /obj/structure/closet/crate - containername = "heavy barrel attachment crate" - group = "Attachments" - /datum/supply_packs/muzzle_compensator name = "compensator attachment crate (x6)" contains = list( diff --git a/code/datums/supply_packs/clothing.dm b/code/datums/supply_packs/clothing.dm index 0e7604ead7c7..1c7241bb253b 100644 --- a/code/datums/supply_packs/clothing.dm +++ b/code/datums/supply_packs/clothing.dm @@ -110,7 +110,7 @@ /datum/supply_packs/officer_outfits//lmao this shit is so hideously out of date contains = list( - /obj/item/clothing/under/rank/ro_suit, + /obj/item/clothing/under/rank/qm_suit, /obj/item/clothing/under/marine/officer/bridge, /obj/item/clothing/under/marine/officer/bridge, /obj/item/clothing/under/marine/officer/exec, diff --git a/code/game/area/Sulaco.dm b/code/game/area/Sulaco.dm index ffc087ad9851..851025e1b63a 100644 --- a/code/game/area/Sulaco.dm +++ b/code/game/area/Sulaco.dm @@ -13,6 +13,7 @@ is_resin_allowed = FALSE flags_area = AREA_NOTUNNEL is_landing_zone = TRUE + ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop1/Enter(atom/movable/O, atom/oldloc) if(istype(O, /obj/structure/barricade)) @@ -23,36 +24,30 @@ name = "\improper Dropship Alamo" icon_state = "shuttlered" base_muffle = MUFFLE_HIGH - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop1/LV624 name = "\improper Dropship Alamo" ambience_exterior = AMBIENCE_LV624 icon_state = "shuttle" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop1/prison name = "\improper Dropship Alamo" ambience_exterior = AMBIENCE_PRISON icon_state = "shuttle" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop1/BigRed name = "\improper Dropship Alamo" ambience_exterior = AMBIENCE_BIGRED icon_state = "shuttle" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop1/ice_colony name = "\improper Dropship Alamo" icon_state = "shuttle" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop1/DesertDam name = "\improper Dropship Alamo" ambience_exterior = AMBIENCE_TRIJENT icon_state = "shuttle" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop1/transit ambience_exterior = 'sound/ambience/dropship_ambience_loop.ogg' @@ -75,41 +70,36 @@ is_resin_allowed = FALSE flags_area = AREA_NOTUNNEL is_landing_zone = TRUE + ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop2/sulaco name = "\improper Dropship Normandy" icon_state = "shuttle" base_muffle = MUFFLE_HIGH - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop2/LV624 name = "\improper Dropship Normandy" ambience_exterior = AMBIENCE_LV624 icon_state = "shuttle2" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop2/prison name = "\improper Dropship Normandy" ambience_exterior = AMBIENCE_PRISON icon_state = "shuttle2" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop2/BigRed name = "\improper Dropship Normandy" ambience_exterior = AMBIENCE_BIGRED icon_state = "shuttle2" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop2/ice_colony name = "\improper Dropship Normandy" icon_state = "shuttle2" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop2/DesertDam name = "\improper Dropship Normandy" ambience_exterior = AMBIENCE_TRIJENT icon_state = "shuttle2" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop2/transit ambience_exterior = 'sound/ambience/dropship_ambience_loop.ogg' diff --git a/code/game/area/almayer.dm b/code/game/area/almayer.dm index d19cbd3a6dec..6ced81a22b15 100644 --- a/code/game/area/almayer.dm +++ b/code/game/area/almayer.dm @@ -317,6 +317,11 @@ icon_state = "livingspace" fake_zlevel = 2 +/area/almayer/living/auxiliary_officer_office + name = "\improper Auxiliary Support Officer office" + icon_state = "livingspace" + fake_zlevel = 2 + /area/almayer/squads/tankdeliveries name = "\improper Vehicle ASRS" icon_state = "req" diff --git a/code/game/area/strata.dm b/code/game/area/strata.dm index 91bdff277c3d..1cf0eac58d1c 100644 --- a/code/game/area/strata.dm +++ b/code/game/area/strata.dm @@ -50,6 +50,10 @@ EXTERIOR is FUCKING FREEZING, and refers to areas out in the open and or exposed temperature = T20C //Nice and room temp ceiling = CEILING_METAL +/area/strata/ag/interior/mountain + name = "Outside mountain" + icon_state = "ag_e" + /area/strata/ag/interior/restricted is_resin_allowed = FALSE flags_area = AREA_NOTUNNEL diff --git a/code/game/gamemodes/cm_initialize.dm b/code/game/gamemodes/cm_initialize.dm index a7e8ab612bb4..efb92dd1678e 100644 --- a/code/game/gamemodes/cm_initialize.dm +++ b/code/game/gamemodes/cm_initialize.dm @@ -576,6 +576,11 @@ Additional game mode variables. to_chat(xeno_candidate, SPAN_WARNING("The selected hive does not have a hive core to spawn from!")) return + for(var/mob_name in hive.banished_ckeys) + if(hive.banished_ckeys[mob_name] == xeno_candidate.ckey) + to_chat(xeno_candidate, SPAN_WARNING("You are banished from the [hive], you may not rejoin unless the Queen re-admits you or dies.")) + return + hive.hive_location.spawn_lesser_drone(xeno_candidate) return TRUE diff --git a/code/game/gamemodes/colonialmarines/colonialmarines.dm b/code/game/gamemodes/colonialmarines/colonialmarines.dm index 067201277e38..cf2b7819a596 100644 --- a/code/game/gamemodes/colonialmarines/colonialmarines.dm +++ b/code/game/gamemodes/colonialmarines/colonialmarines.dm @@ -372,11 +372,11 @@ var/headcount = count_per_faction() var/living = headcount["total_headcount"] if ((headcount["WY_headcount"] / living) > MAJORITY) - musical_track = pick('sound/theme/LastManStanding_WY.ogg') + musical_track = pick('sound/theme/lastmanstanding_wy.ogg') else if ((headcount["UPP_headcount"] / living) > MAJORITY) - musical_track = pick('sound/theme/LastManStanding_UPP.ogg') + musical_track = pick('sound/theme/lastmanstanding_upp.ogg') else if ((headcount["CLF_headcount"] / living) > MAJORITY) - musical_track = pick('sound/theme/LastManStanding_CLF.ogg') + musical_track = pick('sound/theme/lastmanstanding_clf.ogg') else if ((headcount["marine_headcount"] / living) > MAJORITY) musical_track = pick('sound/theme/neutral_melancholy2.ogg') //This is the theme song for Colonial Marines the game, fitting else diff --git a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm index 64d8795be3d2..e172939c847f 100644 --- a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm +++ b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm @@ -664,8 +664,8 @@ /obj/item/ammo_magazine/rocket/wp) if(2) //Smartgun supplies spawnitems = list( - /obj/item/cell/high, - /obj/item/cell/high, + /obj/item/smartgun_battery, + /obj/item/smartgun_battery, /obj/item/ammo_magazine/smartgun, /obj/item/ammo_magazine/smartgun, /obj/item/ammo_magazine/smartgun, diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 54f79ce32881..425a09afb591 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -156,6 +156,7 @@ ACCESS_MARINE_KITCHEN, ACCESS_MARINE_SYNTH, ACCESS_PRESS, + ACCESS_MARINE_ASO, ) /proc/get_all_weyland_access() diff --git a/code/game/jobs/job/civilians/other/mess_seargent.dm b/code/game/jobs/job/civilians/other/mess_seargent.dm index 37e0b01ad711..615df24ecb47 100644 --- a/code/game/jobs/job/civilians/other/mess_seargent.dm +++ b/code/game/jobs/job/civilians/other/mess_seargent.dm @@ -4,7 +4,7 @@ spawn_positions = 1 selection_class = "job_ot" flags_startup_parameters = ROLE_ADD_TO_DEFAULT - supervisors = "the acting commanding officer" + supervisors = "the auxiliary support officer" gear_preset = /datum/equipment_preset/uscm_ship/chef entry_message_body = "Your job is to service the marines with excellent food, drinks and entertaining the shipside crew when needed. You have a lot of freedom and it is up to you, to decide what to do with it. Good luck!" diff --git a/code/game/jobs/job/command/auxiliary/auxiliary_support_officer.dm b/code/game/jobs/job/command/auxiliary/auxiliary_support_officer.dm new file mode 100644 index 000000000000..262ba271edbf --- /dev/null +++ b/code/game/jobs/job/command/auxiliary/auxiliary_support_officer.dm @@ -0,0 +1,26 @@ +/datum/job/command/auxiliary_officer + title = JOB_AUXILIARY_OFFICER + total_positions = 1 + spawn_positions = 1 + allow_additional = TRUE + flags_startup_parameters = ROLE_ADD_TO_DEFAULT + gear_preset = /datum/equipment_preset/uscm_ship/auxiliary_officer + entry_message_body = "Your job is to oversee the hangar crew, the intel officers, the engineering department, and requisition department. You have many responsibilities and a few plates to keep spinning but your subordinates are mostly self-reliant. Assist where you can and make sure command personnel are confident the auxiliary departments are operating at peak efficiency." + +AddTimelock(/datum/job/command/auxiliary_officer, list( + JOB_SQUAD_ROLES = 5 HOURS, + JOB_REQUISITION_ROLES = 5 HOURS, + JOB_ENGINEER_ROLES = 5 HOURS, + JOB_AUXILIARY_ROLES = 5 HOURS, +)) + +/obj/effect/landmark/start/auxiliary_officer + name = JOB_AUXILIARY_OFFICER + job = /datum/job/command/auxiliary_officer + +/datum/timelock/auxiliary + name = "Auxiliary Roles" + +/datum/timelock/auxiliary/New(name, time_required, list/roles) + . = ..() + src.roles = JOB_AUXILIARY_ROLES_LIST diff --git a/code/game/jobs/job/command/auxiliary/crew_chief.dm b/code/game/jobs/job/command/auxiliary/crew_chief.dm index 3bf7f0bcd33e..5f846bf6581e 100644 --- a/code/game/jobs/job/command/auxiliary/crew_chief.dm +++ b/code/game/jobs/job/command/auxiliary/crew_chief.dm @@ -4,6 +4,7 @@ spawn_positions = 2 allow_additional = TRUE scaled = TRUE + supervisors = "the pilot officers" flags_startup_parameters = ROLE_ADD_TO_DEFAULT gear_preset = /datum/equipment_preset/uscm_ship/dcc entry_message_body = "Your job is to assist the pilot officer maintain the ship's dropship. You have authority only on the dropship, but you are expected to maintain order, as not to disrupt the pilot." diff --git a/code/game/jobs/job/command/auxiliary/intel.dm b/code/game/jobs/job/command/auxiliary/intel.dm index f30bb62e8d72..10b8381c417e 100644 --- a/code/game/jobs/job/command/auxiliary/intel.dm +++ b/code/game/jobs/job/command/auxiliary/intel.dm @@ -5,6 +5,7 @@ spawn_positions = 3 allow_additional = 1 scaled = 1 + supervisors = "the auxiliary support officer" flags_startup_parameters = ROLE_ADD_TO_DEFAULT gear_preset = "USCM Intelligence Officer (IO) (Cryo)" entry_message_body = "Your job is to assist the marines in collecting intelligence related to the current operation to better inform command of their opposition. You are in charge of gathering any data disks, folders, and notes you may find on the operational grounds and decrypt them to grant the USCM additional resources." diff --git a/code/game/jobs/job/command/auxiliary/pilot.dm b/code/game/jobs/job/command/auxiliary/pilot.dm index b7c9d15fa366..57495fe8be28 100644 --- a/code/game/jobs/job/command/auxiliary/pilot.dm +++ b/code/game/jobs/job/command/auxiliary/pilot.dm @@ -4,6 +4,7 @@ spawn_positions = 2 allow_additional = TRUE scaled = TRUE + supervisors = "the auxiliary support officer" flags_startup_parameters = ROLE_ADD_TO_DEFAULT gear_preset = /datum/equipment_preset/uscm_ship/po entry_message_body = "Your job is to fly, protect, and maintain the ship's dropship. While you are an officer, your authority is limited to the dropship, where you have authority over the enlisted personnel. If you are not piloting, there is an autopilot fallback for command, but don't leave the dropship without reason." diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index b860667486be..234902e11d22 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -288,6 +288,8 @@ join_turf = get_turf(pick(GLOB.spawns_by_job[type])) else if(assigned_squad && GLOB.latejoin_by_squad[assigned_squad]) join_turf = get_turf(pick(GLOB.latejoin_by_squad[assigned_squad])) + else if(GLOB.latejoin_by_job[title]) + join_turf = get_turf(pick(GLOB.latejoin_by_job[title])) else join_turf = get_turf(pick(GLOB.latejoin)) human.forceMove(join_turf) diff --git a/code/game/jobs/job/logistics/cargo/chief_req.dm b/code/game/jobs/job/logistics/cargo/chief_req.dm index ffdb04da3421..3b6fb7262a80 100644 --- a/code/game/jobs/job/logistics/cargo/chief_req.dm +++ b/code/game/jobs/job/logistics/cargo/chief_req.dm @@ -1,9 +1,8 @@ -//Requisitions Officer /datum/job/logistics/requisition title = JOB_CHIEF_REQUISITION - selection_class = "job_ro" + selection_class = "job_qm" flags_startup_parameters = ROLE_ADD_TO_DEFAULT - gear_preset = /datum/equipment_preset/uscm_ship/ro + gear_preset = /datum/equipment_preset/uscm_ship/qm entry_message_body = "Your job is to dispense supplies to the marines, including weapon attachments. Your cargo techs can help you out, but you have final say in your department. Make sure they're not goofing off. While you may request paperwork for supplies, do not go out of your way to screw with marines, unless you want to get deposed. A happy ship is a well-functioning ship." AddTimelock(/datum/job/logistics/requisition, list( diff --git a/code/game/jobs/job/logistics/logistics.dm b/code/game/jobs/job/logistics/logistics.dm index 6c0a2d0447e1..ef4364354067 100644 --- a/code/game/jobs/job/logistics/logistics.dm +++ b/code/game/jobs/job/logistics/logistics.dm @@ -1,5 +1,5 @@ /datum/job/logistics - supervisors = "the acting commanding officer" + supervisors = "the auxiliary support officer" total_positions = 1 spawn_positions = 1 diff --git a/code/game/jobs/role_authority.dm b/code/game/jobs/role_authority.dm index e7697d54f0de..d1934c597da7 100644 --- a/code/game/jobs/role_authority.dm +++ b/code/game/jobs/role_authority.dm @@ -553,6 +553,8 @@ I hope it's easier to tell what the heck this proc is even doing, unlike previou var/turf/late_join_turf if(GLOB.latejoin_by_squad[assigned_squad]) late_join_turf = get_turf(pick(GLOB.latejoin_by_squad[assigned_squad])) + else if(GLOB.latejoin_by_job[J.title]) + late_join_turf = get_turf(pick(GLOB.latejoin_by_job[J.title])) else late_join_turf = get_turf(pick(GLOB.latejoin)) H.forceMove(late_join_turf) diff --git a/code/game/machinery/computer/almayer_control.dm b/code/game/machinery/computer/almayer_control.dm index b2a931224464..7d63a2e8c3af 100644 --- a/code/game/machinery/computer/almayer_control.dm +++ b/code/game/machinery/computer/almayer_control.dm @@ -1,16 +1,3 @@ -#define STATE_DEFAULT 1 -#define STATE_EVACUATION 2 -#define STATE_EVACUATION_CANCEL 3 -#define STATE_DISTRESS 4 -#define STATE_DESTROY 5 -#define STATE_DEFCONLIST 6 - -#define STATE_MESSAGELIST 7 -#define STATE_VIEWMESSAGE 8 -#define STATE_DELMESSAGE 9 - - - #define COMMAND_SHIP_ANNOUNCE "Command Ship Announcement" /obj/structure/machinery/computer/almayer_control @@ -21,273 +8,149 @@ unslashable = TRUE unacidable = TRUE - var/state = STATE_DEFAULT - - var/is_announcement_active = TRUE - - var/cooldown_request = 0 - var/cooldown_destruct = 0 - var/cooldown_central = 0 + /// requesting a distress beacon + COOLDOWN_DECLARE(cooldown_request) + /// requesting evac + COOLDOWN_DECLARE(cooldown_destruct) + /// messaging HC (admins) + COOLDOWN_DECLARE(cooldown_central) + /// making a ship announcement + COOLDOWN_DECLARE(cooldown_message) var/list/messagetitle = list() var/list/messagetext = list() - var/currmsg = 0 - var/aicurrmsg = 0 /obj/structure/machinery/computer/almayer_control/attack_remote(mob/user as mob) return attack_hand(user) /obj/structure/machinery/computer/almayer_control/attack_hand(mob/user as mob) - if(..() || !allowed(user) || inoperable()) + if(..() || inoperable()) return + if(!allowed(user)) + to_chat(usr, SPAN_WARNING("Access denied.")) + return FALSE + if(!istype(loc.loc, /area/almayer/command/cic)) //Has to be in the CIC. Can also be a generic CIC area to communicate, if wanted. to_chat(usr, SPAN_WARNING("Unable to establish a connection.")) return FALSE - ui_interact(user) - -/obj/structure/machinery/computer/almayer_control/ui_interact(mob/user as mob) - user.set_interaction(src) + tgui_interact(user) - var/dat = "Almayer Control Console" +// tgui boilerplate \\ - if(EvacuationAuthority.evac_status == EVACUATION_STATUS_INITIATING) - dat += "Evacuation in Progress\n
\nETA: [EvacuationAuthority.get_status_panel_eta()]
" - - switch(state) - if(STATE_DEFAULT) - dat += "Alert Level: [get_security_level()]
" - dat += "
[is_announcement_active ? "Make a ship announcement" : "*Unavailable*"]" - dat += GLOB.admins.len > 0 ? "
Send a message to USCM" : "
USCM communication offline" - dat += "
Award a medal" - dat += "

" - dat += "

" - - - dat += "
Message list" - dat += "
Send Distress Beacon" - dat += "
Activate Self-Destruct" - switch(EvacuationAuthority.evac_status) - if(EVACUATION_STATUS_STANDING_BY) - dat += "
Initiate emergency evacuation" - if(EVACUATION_STATUS_INITIATING) - dat += "
Cancel emergency evacuation" - - if(STATE_EVACUATION) - dat += "Are you sure you want to evacuate the [MAIN_SHIP_NAME]? Confirm" - - if(STATE_EVACUATION_CANCEL) - dat += "Are you sure you want to cancel the evacuation of the [MAIN_SHIP_NAME]? Confirm" - - if(STATE_DISTRESS) - dat += "Are you sure you want to trigger a distress signal? The signal can be picked up by anyone listening, friendly or not. Confirm" - - if(STATE_DESTROY) - dat += "Are you sure you want to trigger the self-destruct? This would mean abandoning ship. Confirm" - - if(STATE_MESSAGELIST) - dat += "Messages:" - for(var/i = 1; i<=messagetitle.len; i++) - dat += "
[messagetitle[i]]" - - if(STATE_VIEWMESSAGE) - if (currmsg) - dat += "[messagetitle[currmsg]]

[messagetext[currmsg]]" - dat += "

Delete" - else - state = STATE_MESSAGELIST - attack_hand(user) - return FALSE +/obj/structure/machinery/computer/almayer_control/tgui_interact(mob/user, datum/tgui/ui, datum/ui_state/state) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AlmayerControl", "[name]") + ui.open() - if(STATE_DELMESSAGE) - if (currmsg) - dat += "Are you sure you want to delete this message? OK|Cancel" - else - state = STATE_MESSAGELIST - attack_hand(user) - return FALSE +/obj/structure/machinery/computer/almayer_control/ui_status(mob/user, datum/ui_state/state) + . = ..() + if(!allowed(user)) + return UI_CLOSE + if(!operable()) + return UI_CLOSE - dat += "
[(state != STATE_DEFAULT) ? "Main Menu|" : ""]Close" +/obj/structure/machinery/computer/almayer_control/ui_state(mob/user) + return GLOB.not_incapacitated_and_adjacent_strict_state - show_browser(user, dat, name, "almayer_control") - onclose(user, "almayer_control") +// tgui data \\ -/obj/structure/machinery/computer/almayer_control/Topic(href, href_list) - if(..()) - return FALSE - - usr.set_interaction(src) - var/datum/ares_link/link = GLOB.ares_link - switch(href_list["operation"]) - if("main") - state = STATE_DEFAULT - - if("ship_announce") - if(!is_announcement_active) - to_chat(usr, SPAN_WARNING("Please allow at least [COOLDOWN_COMM_MESSAGE*0.1] second\s to pass between announcements.")) - return FALSE - var/input = stripped_multiline_input(usr, "Please write a message to announce to the station crew.", "Priority Announcement", "") - if(!input || !is_announcement_active || !(usr in view(1,src))) - return FALSE - - is_announcement_active = FALSE - - var/signed = null - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - var/obj/item/card/id/id = H.wear_id - if(istype(id)) - var/paygrade = get_paygrades(id.paygrade, FALSE, H.gender) - signed = "[paygrade] [id.registered_name]" +/obj/structure/machinery/computer/almayer_control/ui_static_data(mob/user) + var/list/data = list() - shipwide_ai_announcement(input, COMMAND_SHIP_ANNOUNCE, signature = signed) - addtimer(CALLBACK(src, PROC_REF(reactivate_announcement), usr), COOLDOWN_COMM_MESSAGE) - message_admins("[key_name(usr)] has made a shipwide annoucement.") - log_announcement("[key_name(usr)] has announced the following to the ship: [input]") + data["cooldown_request"] = COOLDOWN_COMM_REQUEST + data["cooldown_destruct"] = COOLDOWN_COMM_DESTRUCT + data["cooldown_central"] = COOLDOWN_COMM_CENTRAL + data["cooldown_message"] = COOLDOWN_COMM_MESSAGE + data["distresstimelock"] = DISTRESS_TIME_LOCK + return data - if("evacuation_start") - if(state == STATE_EVACUATION) - if(security_level < SEC_LEVEL_RED) - to_chat(usr, SPAN_WARNING("The ship must be under red alert in order to enact evacuation procedures.")) - return FALSE +/obj/structure/machinery/computer/almayer_control/ui_data(mob/user) + var/list/data = list() + var/list/messages = list() - if(EvacuationAuthority.flags_scuttle & FLAGS_EVACUATION_DENY) - to_chat(usr, SPAN_WARNING("The USCM has placed a lock on deploying the evacuation pods.")) - return FALSE + data["alert_level"] = security_level - if(!EvacuationAuthority.initiate_evacuation()) - to_chat(usr, SPAN_WARNING("You are unable to initiate an evacuation procedure right now!")) - return FALSE + data["time_request"] = cooldown_request + data["time_destruct"] = cooldown_destruct + data["time_central"] = cooldown_central + data["time_message"] = cooldown_message - log_game("[key_name(usr)] has called for an emergency evacuation.") - message_admins("[key_name_admin(usr)] has called for an emergency evacuation.") - link.log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") - return TRUE + data["worldtime"] = world.time - state = STATE_EVACUATION + data["evac_status"] = EvacuationAuthority.evac_status + if(EvacuationAuthority.evac_status == EVACUATION_STATUS_INITIATING) + data["evac_eta"] = EvacuationAuthority.get_status_panel_eta() - if("evacuation_cancel") - if(state == STATE_EVACUATION_CANCEL) - if(!EvacuationAuthority.cancel_evacuation()) - to_chat(usr, SPAN_WARNING("You are unable to cancel the evacuation right now!")) - return FALSE + if(!messagetitle.len) + data["messages"] = null + else + for(var/i in 1 to length(messagetitle)) + var/list/messagedata = list(list( + "title" = messagetitle[i], + "text" = messagetext[i], + "number" = i + )) + messages += messagedata - spawn(35)//some time between AI announcements for evac cancel and SD cancel. - if(EvacuationAuthority.evac_status == EVACUATION_STATUS_STANDING_BY)//nothing changed during the wait - //if the self_destruct is active we try to cancel it (which includes lowering alert level to red) - if(!EvacuationAuthority.cancel_self_destruct(1)) - //if SD wasn't active (likely canceled manually in the SD room), then we lower the alert level manually. - set_security_level(SEC_LEVEL_RED, TRUE) //both SD and evac are inactive, lowering the security level. + data["messages"] = messages - log_game("[key_name(usr)] has canceled the emergency evacuation.") - message_admins("[key_name_admin(usr)] has canceled the emergency evacuation.") - link.log_ares_security("Cancel Evacuation", "[usr] has cancelled the emergency evacuation.") - return TRUE + return data - state = STATE_EVACUATION_CANCEL +// end tgui data \\ - if("distress") - if(state == STATE_DISTRESS) - if(world.time < DISTRESS_TIME_LOCK) - to_chat(usr, SPAN_WARNING("The distress beacon cannot be launched this early in the operation. Please wait another [time_left_until(DISTRESS_TIME_LOCK, world.time, 1 MINUTES)] minutes before trying again.")) - return FALSE +// tgui interact \\ - if(!SSticker.mode) - return FALSE //Not a game mode? +/obj/structure/machinery/computer/almayer_control/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return - if(SSticker.mode.force_end_at == 0) - to_chat(usr, SPAN_WARNING("ARES has denied your request for operational security reasons.")) - return FALSE + switch(action) + if("award") + print_medal(usr, src) + . = TRUE - if(world.time < cooldown_request + COOLDOWN_COMM_REQUEST) - to_chat(usr, SPAN_WARNING("The distress beacon has recently broadcast a message. Please wait.")) - return FALSE + // evac stuff start \\ - if(security_level == SEC_LEVEL_DELTA) - to_chat(usr, SPAN_WARNING("The ship is already undergoing self-destruct procedures!")) - return FALSE + if("evacuation_start") + if(security_level < SEC_LEVEL_RED) + to_chat(usr, SPAN_WARNING("The ship must be under red alert in order to enact evacuation procedures.")) + return FALSE - for(var/client/C in GLOB.admins) - if((R_ADMIN|R_MOD) & C.admin_holder.rights) - C << 'sound/effects/sos-morse-code.ogg' - message_admins("[key_name(usr)] has requested a Distress Beacon! [CC_MARK(usr)] (SEND) (DENY) [ADMIN_JMP_USER(usr)] [CC_REPLY(usr)]") - to_chat(usr, SPAN_NOTICE("A distress beacon request has been sent to USCM Central Command.")) + if(EvacuationAuthority.flags_scuttle & FLAGS_EVACUATION_DENY) + to_chat(usr, SPAN_WARNING("The USCM has placed a lock on deploying the evacuation pods.")) + return FALSE - cooldown_request = world.time - return TRUE + if(!EvacuationAuthority.initiate_evacuation()) + to_chat(usr, SPAN_WARNING("You are unable to initiate an evacuation procedure right now!")) + return FALSE - state = STATE_DISTRESS + log_game("[key_name(usr)] has called for an emergency evacuation.") + message_admins("[key_name_admin(usr)] has called for an emergency evacuation.") + var/datum/ares_link/link = GLOB.ares_link + link.log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") + . = TRUE - if("destroy") - if(state == STATE_DESTROY) - //Comment to test - if(world.time < DISTRESS_TIME_LOCK) - to_chat(usr, SPAN_WARNING("The self-destruct cannot be activated this early in the operation. Please wait another [time_left_until(DISTRESS_TIME_LOCK, world.time, 1 MINUTES)] minutes before trying again.")) - return FALSE - - if(!SSticker.mode) - return FALSE //Not a game mode? - - if(SSticker.mode.force_end_at == 0) - to_chat(usr, SPAN_WARNING("ARES has denied your request for operational security reasons.")) - return FALSE - - if(world.time < cooldown_destruct + COOLDOWN_COMM_DESTRUCT) - to_chat(usr, SPAN_WARNING("A self-destruct request has already been sent to high command. Please wait.")) - return FALSE - - if(get_security_level() == "delta") - to_chat(usr, SPAN_WARNING("The [MAIN_SHIP_NAME]'s self-destruct is already activated.")) - return FALSE - - for(var/client/C in GLOB.admins) - if((R_ADMIN|R_MOD) & C.admin_holder.rights) - C << 'sound/effects/sos-morse-code.ogg' - message_admins("[key_name(usr)] has requested Self-Destruct! [CC_MARK(usr)] (GRANT) (DENY) [ADMIN_JMP_USER(usr)] [CC_REPLY(usr)]") - to_chat(usr, SPAN_NOTICE("A self-destruct request has been sent to USCM Central Command.")) - cooldown_destruct = world.time - return TRUE - - state = STATE_DESTROY - - if("messagelist") - currmsg = 0 - state = STATE_MESSAGELIST - - if("viewmessage") - state = STATE_VIEWMESSAGE - if (!currmsg) - if(href_list["message-num"]) currmsg = text2num(href_list["message-num"]) - else state = STATE_MESSAGELIST + if("evacuation_cancel") + if(!EvacuationAuthority.cancel_evacuation()) + to_chat(usr, SPAN_WARNING("You are unable to cancel the evacuation right now!")) + return FALSE - if("delmessage") - state = (currmsg) ? STATE_DELMESSAGE : STATE_MESSAGELIST - - if("delmessage2") - if(currmsg) - var/title = messagetitle[currmsg] - var/text = messagetext[currmsg] - messagetitle.Remove(title) - messagetext.Remove(text) - if(currmsg == aicurrmsg) aicurrmsg = 0 - currmsg = 0 - state = STATE_MESSAGELIST + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/structure/machinery/computer/almayer_control, cancel_evac)), 4 SECONDS) - if("messageUSCM") - if(world.time < cooldown_central + COOLDOWN_COMM_CENTRAL) - to_chat(usr, SPAN_WARNING("Arrays recycling. Please stand by.")) - return FALSE - var/input = stripped_input(usr, "Please choose a message to transmit to USCM. Please be aware that this process is very expensive, and abuse will lead to termination. Transmission does not guarantee a response. There is a small delay before you may send another message. Be clear and concise.", "To abort, send an empty message.", "") - if(!input || !(usr in view(1,src)) || world.time < cooldown_central + COOLDOWN_COMM_CENTRAL) return FALSE + log_game("[key_name(usr)] has canceled the emergency evacuation.") + message_admins("[key_name_admin(usr)] has canceled the emergency evacuation.") + var/datum/ares_link/link = GLOB.ares_link + link.log_ares_security("Cancel Evacuation", "[usr] has cancelled the emergency evacuation.") + . = TRUE - high_command_announce(input, usr) - to_chat(usr, SPAN_NOTICE("Message transmitted.")) - log_announcement("[key_name(usr)] has made an USCM announcement: [input]") - cooldown_central = world.time + // evac stuff end \\ - if("changeseclevel") + if("change_sec_level") var/list/alert_list = list(num2seclevel(SEC_LEVEL_GREEN), num2seclevel(SEC_LEVEL_BLUE)) switch(security_level) if(SEC_LEVEL_GREEN) @@ -302,27 +165,125 @@ return set_security_level(seclevel2num(level_selected)) - log_game("[key_name(usr)] has changed the security level to [get_security_level()].") message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") + var/datum/ares_link/link = GLOB.ares_link + link.log_ares_security("Security Level Update", "[usr] has changed the security level to [get_security_level()].") + . = TRUE - if("award") - print_medal(usr, src) + if("messageUSCM") + if(!COOLDOWN_FINISHED(src, cooldown_central)) + to_chat(usr, SPAN_WARNING("Arrays are re-cycling. Please stand by.")) + return FALSE + var/input = stripped_input(usr, "Please choose a message to transmit to USCM. Please be aware that this process is very expensive, and abuse will lead to termination. Transmission does not guarantee a response. There is a small delay before you may send another message. Be clear and concise.", "To abort, send an empty message.", "") + if(!input || !(usr in view(1,src)) || !COOLDOWN_FINISHED(src, cooldown_central)) + return FALSE + + high_command_announce(input, usr) + to_chat(usr, SPAN_NOTICE("Message transmitted.")) + log_announcement("[key_name(usr)] has made an USCM announcement: [input]") + COOLDOWN_START(src, cooldown_central, COOLDOWN_COMM_CENTRAL) + . = TRUE + + if("ship_announce") + if(!COOLDOWN_FINISHED(src, cooldown_message)) + to_chat(usr, SPAN_WARNING("Please allow at least [COOLDOWN_TIMELEFT(src, cooldown_message)/10] second\s to pass between announcements.")) + return FALSE + var/input = stripped_multiline_input(usr, "Please write a message to announce to the station crew.", "Priority Announcement", "") + if(!input || !COOLDOWN_FINISHED(src, cooldown_message) || !(usr in view(1,src))) + return FALSE + + var/signed = null + if(ishuman(usr)) + var/mob/living/carbon/human/human_user = usr + var/obj/item/card/id/id = human_user.wear_id + if(istype(id)) + var/paygrade = get_paygrades(id.paygrade, FALSE, human_user.gender) + signed = "[paygrade] [id.registered_name]" + + COOLDOWN_START(src, cooldown_message, COOLDOWN_COMM_MESSAGE) + shipwide_ai_announcement(input, COMMAND_SHIP_ANNOUNCE, signature = signed) + message_admins("[key_name(usr)] has made a shipwide annoucement.") + log_announcement("[key_name(usr)] has announced the following to the ship: [input]") + . = TRUE + + if("distress") + if(world.time < DISTRESS_TIME_LOCK) + to_chat(usr, SPAN_WARNING("The distress beacon cannot be launched this early in the operation. Please wait another [time_left_until(DISTRESS_TIME_LOCK, world.time, 1 MINUTES)] minutes before trying again.")) + return FALSE + + if(!SSticker.mode) + return FALSE //Not a game mode? + + if(SSticker.mode.force_end_at == 0) + to_chat(usr, SPAN_WARNING("ARES has denied your request for operational security reasons.")) + return FALSE + + if(!COOLDOWN_FINISHED(src, cooldown_request)) + to_chat(usr, SPAN_WARNING("The distress beacon has recently broadcast a message. Please wait.")) + return FALSE - updateUsrDialog() + if(security_level == SEC_LEVEL_DELTA) + to_chat(usr, SPAN_WARNING("The ship is already undergoing self-destruct procedures!")) + return FALSE + + for(var/client/admin_client as anything in GLOB.admins) + if((R_ADMIN|R_MOD) & admin_client.admin_holder.rights) + admin_client << 'sound/effects/sos-morse-code.ogg' + message_admins("[key_name(usr)] has requested a Distress Beacon! [CC_MARK(usr)] (SEND) (DENY) [ADMIN_JMP_USER(usr)] [CC_REPLY(usr)]") + to_chat(usr, SPAN_NOTICE("A distress beacon request has been sent to USCM Central Command.")) + + COOLDOWN_START(src, cooldown_request, COOLDOWN_COMM_REQUEST) + . = TRUE + + // sd \\ + + if("destroy") + if(world.time < DISTRESS_TIME_LOCK) + to_chat(usr, SPAN_WARNING("The self-destruct cannot be activated this early in the operation. Please wait another [time_left_until(DISTRESS_TIME_LOCK, world.time, 1 MINUTES)] minutes before trying again.")) + return FALSE + + if(!SSticker.mode) + return FALSE //Not a game mode? + + if(SSticker.mode.force_end_at == 0) + to_chat(usr, SPAN_WARNING("ARES has denied your request for operational security reasons.")) + return FALSE + + if(!COOLDOWN_FINISHED(src, cooldown_destruct)) + to_chat(usr, SPAN_WARNING("A self-destruct request has already been sent to high command. Please wait.")) + return FALSE + + if(get_security_level() == "delta") + to_chat(usr, SPAN_WARNING("The [MAIN_SHIP_NAME]'s self-destruct is already activated.")) + return FALSE + + for(var/client/admin_client as anything in GLOB.admins) + if((R_ADMIN|R_MOD) & admin_client.admin_holder.rights) + admin_client << 'sound/effects/sos-morse-code.ogg' + message_admins("[key_name(usr)] has requested Self-Destruct! [CC_MARK(usr)] (GRANT) (DENY) [ADMIN_JMP_USER(usr)] [CC_REPLY(usr)]") + to_chat(usr, SPAN_NOTICE("A self-destruct request has been sent to USCM Central Command.")) + COOLDOWN_START(src, cooldown_destruct, COOLDOWN_COMM_DESTRUCT) + . = TRUE + + if("delmessage") + var/number_of_message = params["number"] + if(!number_of_message) + return FALSE + var/title = messagetitle[number_of_message] + var/text = messagetext[number_of_message] + messagetitle.Remove(title) + messagetext.Remove(text) + . = TRUE -/obj/structure/machinery/computer/almayer_control/proc/reactivate_announcement(mob/user) - is_announcement_active = TRUE - updateUsrDialog() +// end tgui interact \\ -#undef STATE_DEFAULT -#undef STATE_EVACUATION -#undef STATE_EVACUATION_CANCEL -#undef STATE_DISTRESS -#undef STATE_DESTROY -#undef STATE_DEFCONLIST +// end tgui \\ -#undef STATE_MESSAGELIST -#undef STATE_VIEWMESSAGE -#undef STATE_DELMESSAGE +/obj/structure/machinery/computer/almayer_control/proc/cancel_evac() + if(EvacuationAuthority.evac_status == EVACUATION_STATUS_STANDING_BY)//nothing changed during the wait + //if the self_destruct is active we try to cancel it (which includes lowering alert level to red) + if(!EvacuationAuthority.cancel_self_destruct(1)) + //if SD wasn't active (likely canceled manually in the SD room), then we lower the alert level manually. + set_security_level(SEC_LEVEL_RED, TRUE) //both SD and evac are inactive, lowering the security level. diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm index c56360953650..47d4bb20849b 100644 --- a/code/game/machinery/telecomms/presets.dm +++ b/code/game/machinery/telecomms/presets.dm @@ -212,12 +212,27 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) freq_listening = list(COLONY_FREQ) var/toggle_cooldown = 0 + /// Tower has been taken over by xenos, is not usable + var/corrupted = FALSE + + /// Held image for the current overlay on the tower from xeno corruption + var/image/corruption_image + +/obj/structure/machinery/telecomms/relay/preset/tower/mapcomms/Initialize() + . = ..() + + RegisterSignal(src, COMSIG_ATOM_TURF_CHANGE, PROC_REF(register_with_turf)) + register_with_turf() + /obj/structure/machinery/telecomms/relay/preset/tower/mapcomms/attack_hand(mob/user) if(user.action_busy) return if(toggle_cooldown > world.time) //cooldown only to prevent spam toggling to_chat(user, SPAN_WARNING("\The [src]'s processors are still cooling! Wait before trying to flip the switch again.")) return + if(corrupted) + to_chat(user, SPAN_WARNING("[src] is entangled in resin. Impossible to interact with.")) + return var/current_state = on if(!do_after(user, 20, INTERRUPT_NO_NEEDHAND|BEHAVIOR_IMMOBILE, BUSY_ICON_FRIENDLY, src)) return @@ -282,6 +297,84 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) else update_icon() +/// Handles xenos corrupting the tower when weeds touch the turf it is located on +/obj/structure/machinery/telecomms/relay/preset/tower/mapcomms/proc/handle_xeno_acquisition(turf/weeded_turf) + SIGNAL_HANDLER + + if(corrupted) + return + + if(!weeded_turf.weeds) + return + + if(weeded_turf.weeds.weed_strength < WEED_LEVEL_HIVE) + return + + if(!weeded_turf.weeds.parent) + return + + if(!istype(weeded_turf.weeds.parent, /obj/effect/alien/weeds/node/pylon/cluster)) + return + + if(SSticker.mode.is_in_endgame) + return + + if(ROUND_TIME < XENO_COMM_ACQUISITION_TIME) + addtimer(CALLBACK(src, PROC_REF(handle_xeno_acquisition), weeded_turf), (XENO_COMM_ACQUISITION_TIME - ROUND_TIME)) + return + + var/obj/effect/alien/weeds/node/pylon/cluster/parent_node = weeded_turf.weeds.parent + + var/obj/effect/alien/resin/special/cluster/cluster_parent = parent_node.resin_parent + + var/list/held_children_weeds = parent_node.children + var/cluster_loc = cluster_parent.loc + var/linked_hive = cluster_parent.linked_hive + + parent_node.children = list() + + qdel(cluster_parent) + + var/obj/effect/alien/resin/special/pylon/endgame/new_pylon = new(cluster_loc, linked_hive) + new_pylon.node.children = held_children_weeds + + for(var/obj/effect/alien/weeds/weed in new_pylon.node.children) + weed.parent = new_pylon.node + + RegisterSignal(new_pylon, COMSIG_PARENT_QDELETING, PROC_REF(uncorrupt)) + + corrupted = TRUE + + corruption_image = image(icon, icon_state = "resin_growing") + + flick_overlay(src, corruption_image, (2 SECONDS)) + addtimer(CALLBACK(src, PROC_REF(switch_to_idle_corruption)), (2 SECONDS)) + + new_pylon.comms_relay_connection() + +/// Handles removing corruption effects from the comms relay +/obj/structure/machinery/telecomms/relay/preset/tower/mapcomms/proc/uncorrupt(datum/deleting_datum) + SIGNAL_HANDLER + + corrupted = FALSE + + overlays -= corruption_image + +/// Handles moving the overlay from growing to idle +/obj/structure/machinery/telecomms/relay/preset/tower/mapcomms/proc/switch_to_idle_corruption() + if(!corrupted) + return + + corruption_image = image(icon, icon_state = "resin_idle") + + overlays += corruption_image + +/// Handles re-registering signals on new turfs if changed +/obj/structure/machinery/telecomms/relay/preset/tower/mapcomms/proc/register_with_turf() + SIGNAL_HANDLER + + RegisterSignal(get_turf(src), COMSIG_WEEDNODE_GROWTH, PROC_REF(handle_xeno_acquisition)) + /obj/structure/machinery/telecomms/relay/preset/telecomms id = "Telecomms Relay" autolinkers = list("relay") diff --git a/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm b/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm index 3d6a48b45daa..fac4182ea5fe 100644 --- a/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm +++ b/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm @@ -42,7 +42,6 @@ GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( list("Underbarrel Flamethrower", 15, /obj/item/attachable/attached_gun/flamer, null, VENDOR_ITEM_REGULAR), list("BARREL ATTACHMENTS", 0, null, null, null), - list("Barrel Charger", 25, /obj/item/attachable/heavy_barrel, null, VENDOR_ITEM_RECOMMENDED), list("Suppressor", 15, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR), list("Extended Barrel", 15, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR), list("Recoil Compensator", 15, /obj/item/attachable/compensator, null, VENDOR_ITEM_REGULAR), 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 24b60079692b..157f79cd43c2 100644 --- a/code/game/machinery/vending/vendor_types/crew/senior_officers.dm +++ b/code/game/machinery/vending/vendor_types/crew/senior_officers.dm @@ -2,7 +2,7 @@ name = "\improper ColMarTech Senior Officer Equipment Rack" desc = "An automated equipment vendor for Senior Officers." req_access = list(ACCESS_MARINE_SENIOR) - vendor_role = list(JOB_CHIEF_POLICE,JOB_CMO,JOB_XO,JOB_CHIEF_ENGINEER,JOB_CHIEF_REQUISITION) + vendor_role = list(JOB_CHIEF_POLICE, JOB_CMO, JOB_XO, JOB_CHIEF_ENGINEER, JOB_CHIEF_REQUISITION, JOB_AUXILIARY_OFFICER) /obj/structure/machinery/cm_vending/clothing/senior_officer/get_listed_products(mob/user) if(!user) @@ -23,6 +23,8 @@ return GLOB.cm_vending_clothing_cmo else if(user.job == JOB_CHIEF_POLICE) return GLOB.cm_vending_clothing_military_police_chief + else if(user.job == JOB_AUXILIARY_OFFICER) + return GLOB.cm_vending_clothing_auxiliary_officer return ..() @@ -161,11 +163,11 @@ GLOBAL_LIST_INIT(cm_vending_clothing_req_officer, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Insulated Gloves", 0, /obj/item/clothing/gloves/yellow, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), - list("RO Uniform", 0, /obj/item/clothing/under/rank/ro_suit, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("Headset", 0, /obj/item/device/radio/headset/almayer/ro, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), + list("Quartermaster Uniform", 0, /obj/item/clothing/under/rank/qm_suit, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), + list("Headset", 0, /obj/item/device/radio/headset/almayer/qm, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("Satchel", 0, /obj/item/storage/backpack/marine/satchel/tech, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), list("Req Cap", 0, /obj/item/clothing/head/cmcap/req, MARINE_CAN_BUY_MASK, VENDOR_ITEM_MANDATORY), - list("RO Jacket", 0, /obj/item/clothing/suit/storage/RO, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), + list("Quartermaster Jacket", 0, /obj/item/clothing/suit/storage/RO, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), 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), @@ -201,9 +203,12 @@ GLOBAL_LIST_INIT(cm_vending_clothing_cmo, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Gloves", 0, /obj/item/clothing/gloves/latex, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/almayer/cmo, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Medical HUD Glasses", 0, /obj/item/clothing/glasses/hud/health, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_MANDATORY), list("Labcoat", 0, /obj/item/clothing/suit/storage/labcoat, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), + list("EYEWARE (CHOOSE 1)", 0, null, null, null), + list("Medical HUD Glasses", 0, /obj/item/clothing/glasses/hud/health, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_MANDATORY), + list("Reagent Scanner HUD Goggles", 0, /obj/item/clothing/glasses/science, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR), + list("UNIFORM (CHOOSE 1)", 0, null, null, null), list("Green Scrubs", 0, /obj/item/clothing/under/rank/medical/green, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_RECOMMENDED), list("Blue Scrubs", 0, /obj/item/clothing/under/rank/medical/blue, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), @@ -308,3 +313,38 @@ GLOBAL_LIST_INIT(cm_vending_clothing_xo, list( list("Patrol Cap", 0, /obj/item/clothing/head/cmcap, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), list("Officer Cap", 0, /obj/item/clothing/head/cmcap/ro, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), )) + +//------------ AUXILIARY SUPPORT OFFICER --------------- +GLOBAL_LIST_INIT(cm_vending_clothing_auxiliary_officer, list( + + list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), + list("Insulated Gloves", 0, /obj/item/clothing/gloves/yellow, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), + list("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("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), + list("M44 Custom Revolver", 0, /obj/item/storage/belt/gun/m44/custom, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), + + list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), + list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/SO, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), + list("Officer M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), + 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("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("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("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 dd11cea0f242..0496530be861 100644 --- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm +++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm @@ -21,6 +21,7 @@ list("Industrial Blowtorch", 2, /obj/item/tool/weldingtool/largetank, null, VENDOR_ITEM_REGULAR), list("High-Capacity Industrial Blowtorch", 4, /obj/item/tool/weldingtool/hugetank, null, VENDOR_ITEM_REGULAR), list("Plastic Explosive", 3, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR), + list("Toolkit", 1, /obj/item/storage/firstaid/toolkit/empty, null, VENDOR_ITEM_REGULAR), list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_REGULAR), @@ -75,7 +76,8 @@ list("Motion Detector", 5, /obj/item/device/motiondetector, null, VENDOR_ITEM_REGULAR), list("Space Cleaner", 2, /obj/item/reagent_container/spray/cleaner, null, VENDOR_ITEM_REGULAR), list("Whistle", 5, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR), - list("Machete Scabbard (Full)", 2, /obj/item/storage/large_holster/machete/full, null, VENDOR_ITEM_REGULAR) + list("Machete Scabbard (Full)", 2, /obj/item/storage/large_holster/machete/full, null, VENDOR_ITEM_REGULAR), + list("Stethoscope", 2, /obj/item/clothing/accessory/stethoscope, null, VENDOR_ITEM_REGULAR) ) @@ -250,7 +252,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list( list("Windbreaker, Exploration", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_covenant, null, VENDOR_ITEM_REGULAR), list("Labcoat", 12, /obj/item/clothing/suit/storage/labcoat, null, VENDOR_ITEM_REGULAR), list("Labcoat, Researcher", 12, /obj/item/clothing/suit/storage/labcoat/researcher, null, VENDOR_ITEM_REGULAR), - list("RO Jacket", 12, /obj/item/clothing/suit/storage/RO, null, VENDOR_ITEM_REGULAR), + list("Quartermaster Jacket", 12, /obj/item/clothing/suit/storage/RO, null, VENDOR_ITEM_REGULAR), list("USCM Poncho", 12, /obj/item/clothing/accessory/poncho, null, VENDOR_ITEM_REGULAR), list("BACKPACK", 0, null, null, null), @@ -263,6 +265,12 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list( list("USCM RTO Pack", 12, /obj/item/storage/backpack/marine/satchel/rto, null, VENDOR_ITEM_REGULAR), list("USCM Welderpack", 12, /obj/item/storage/backpack/marine/engineerpack, null, VENDOR_ITEM_REGULAR), list("USCM Weldersatchel", 12, /obj/item/storage/backpack/marine/engineerpack/satchel, null, VENDOR_ITEM_REGULAR), + + list("OTHER", 0, null, null, null), + list("Red Armband", 6, /obj/item/clothing/accessory/armband, null, VENDOR_ITEM_REGULAR), + list("Yellow Armband", 6, /obj/item/clothing/accessory/armband/engine, null, VENDOR_ITEM_REGULAR), + list("Green Armband", 6, /obj/item/clothing/accessory/armband/medgreen, null, VENDOR_ITEM_REGULAR), + )) /obj/structure/machinery/cm_vending/clothing/synth/snowflake diff --git a/code/game/machinery/vending/vendor_types/engineering.dm b/code/game/machinery/vending/vendor_types/engineering.dm index 83f69ae09889..f0a81d990491 100644 --- a/code/game/machinery/vending/vendor_types/engineering.dm +++ b/code/game/machinery/vending/vendor_types/engineering.dm @@ -25,6 +25,7 @@ list("Utility Tool Belt", round(scale * 2), /obj/item/storage/belt/utility, VENDOR_ITEM_REGULAR), list("Welding Goggles", round(scale * 2), /obj/item/clothing/glasses/welding, VENDOR_ITEM_REGULAR), list("Welding Helmet", round(scale * 2), /obj/item/clothing/head/welding, VENDOR_ITEM_REGULAR), + list("Toolkit", round(scale * 4), /obj/item/storage/firstaid/toolkit/empty, VENDOR_ITEM_REGULAR), list("SCANNERS", -1, null, null), list("Atmos Scanner", round(scale * 2), /obj/item/device/analyzer, VENDOR_ITEM_REGULAR), @@ -54,6 +55,7 @@ list("EQUIPMENT", -1, null, null), list("Utility Tool Belt", round(scale * 4), /obj/item/storage/belt/utility, VENDOR_ITEM_REGULAR), list("Cable Coil", round(scale * 4), /obj/item/stack/cable_coil/random, VENDOR_ITEM_REGULAR), + list("Toolkit", round(scale * 12), /obj/item/storage/firstaid/toolkit/empty, VENDOR_ITEM_REGULAR), list("TOOLS", -1, null, null), list("Blowtorch", round(scale * 4), /obj/item/tool/weldingtool, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/requisitions.dm b/code/game/machinery/vending/vendor_types/requisitions.dm index f85657e887a8..cdf64368c8d4 100644 --- a/code/game/machinery/vending/vendor_types/requisitions.dm +++ b/code/game/machinery/vending/vendor_types/requisitions.dm @@ -342,7 +342,6 @@ /obj/structure/machinery/cm_vending/sorted/attachments/populate_product_list(scale) listed_products = list( list("BARREL", -1, null, null), - list("Barrel Charger", round(scale * 2.5), /obj/item/attachable/heavy_barrel, VENDOR_ITEM_REGULAR), 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), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm index 05784ec3c161..445ae80d401c 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm @@ -110,6 +110,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_engi, list( list("Technician Satchel", 0, /obj/item/storage/backpack/marine/satchel/tech, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), list("Technician Welderpack", 0, /obj/item/storage/backpack/marine/engineerpack, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), list("Technician Welder-Satchel", 0, /obj/item/storage/backpack/marine/engineerpack/satchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), + list("Technician Welder Chestrig", 0, /obj/item/storage/backpack/marine/engineerpack/welder_chestrig, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), list("BELT (CHOOSE 1)", 0, null, null, null), list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), 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 9775c20cac33..28cc72a1708e 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 @@ -77,6 +77,7 @@ list("Shotgun Scabbard", 5, /obj/item/storage/large_holster/m37, VENDOR_ITEM_REGULAR), list("USCM Satchel", 10, /obj/item/storage/backpack/marine/satchel, VENDOR_ITEM_REGULAR), list("USCM Technical Satchel", 10, /obj/item/storage/backpack/marine/satchel/tech, VENDOR_ITEM_REGULAR), + list("USCM Technical Chestrig", 10, /obj/item/storage/backpack/marine/engineerpack/welder_chestrig, VENDOR_ITEM_REGULAR), list("USCM Uniform", 20, /obj/item/clothing/under/marine, VENDOR_ITEM_REGULAR), list("BELTS", -1, null, null), @@ -193,7 +194,7 @@ 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), list("HIRR Baton Slugs", round(scale * 6), /obj/item/explosive/grenade/slug/baton, VENDOR_ITEM_REGULAR), - list("M74 AGM-S Star Shell", round(scale * 2), /obj/item/explosive/grenade/high_explosive/airburst/starshell, VENDOR_ITEM_REGULAR), + list("M74 AGM-S Star Shell", round(scale * 4), /obj/item/explosive/grenade/high_explosive/airburst/starshell, VENDOR_ITEM_REGULAR), list("M74 AGM-S Hornet Shell", round(scale * 4), /obj/item/explosive/grenade/high_explosive/airburst/hornet_shell, VENDOR_ITEM_REGULAR), ) @@ -280,7 +281,6 @@ /obj/structure/machinery/cm_vending/sorted/attachments/squad/populate_product_list(scale) listed_products = list( list("BARREL", -1, null, null), - list("Barrel Charger", round(scale * 0.9), /obj/item/attachable/heavy_barrel, VENDOR_ITEM_REGULAR), 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), diff --git a/code/game/objects/effects/landmarks/landmarks.dm b/code/game/objects/effects/landmarks/landmarks.dm index 1cbe10c497f6..5f4a374ba31c 100644 --- a/code/game/objects/effects/landmarks/landmarks.dm +++ b/code/game/objects/effects/landmarks/landmarks.dm @@ -378,6 +378,8 @@ name = "late join" icon_state = "x2" var/squad + /// What job should latejoin on this landmark + var/job /obj/effect/landmark/late_join/alpha name = "alpha late join" @@ -396,16 +398,24 @@ squad = SQUAD_MARINE_4 +/obj/effect/landmark/late_join/working_joe + name = "working joe late join" + job = JOB_WORKING_JOE + /obj/effect/landmark/late_join/Initialize(mapload, ...) . = ..() if(squad) LAZYADD(GLOB.latejoin_by_squad[squad], src) + else if(job) + LAZYADD(GLOB.latejoin_by_job[job], src) else GLOB.latejoin += src /obj/effect/landmark/late_join/Destroy() if(squad) LAZYREMOVE(GLOB.latejoin_by_squad[squad], src) + else if(job) + LAZYREMOVE(GLOB.latejoin_by_job[job], src) else GLOB.latejoin -= src return ..() diff --git a/code/game/objects/effects/landmarks/survivor_spawner.dm b/code/game/objects/effects/landmarks/survivor_spawner.dm index eba13a41c89d..d19bbbe49516 100644 --- a/code/game/objects/effects/landmarks/survivor_spawner.dm +++ b/code/game/objects/effects/landmarks/survivor_spawner.dm @@ -117,7 +117,6 @@ spawn_priority = SPAWN_PRIORITY_VERY_HIGH - //Military Survivors// /obj/effect/landmark/survivor_spawner/lv522_forecon_tech @@ -139,3 +138,29 @@ /obj/effect/landmark/survivor_spawner/lv522_forecon_squad_leader equipment = /datum/equipment_preset/survivor/forecon/squad_leader spawn_priority = SPAWN_PRIORITY_HIGH + +/obj/effect/landmark/survivor_spawner/upp/soldier + equipment = /datum/equipment_preset/survivor/upp/soldier + synth_equipment = /datum/equipment_preset/synth/survivor/upp + spawn_priority = SPAWN_PRIORITY_MEDIUM + +/obj/effect/landmark/survivor_spawner/upp_sapper + equipment = /datum/equipment_preset/survivor/upp/sapper + synth_equipment = /datum/equipment_preset/synth/survivor/upp + spawn_priority = SPAWN_PRIORITY_MEDIUM + +/obj/effect/landmark/survivor_spawner/upp_medic + equipment = /datum/equipment_preset/survivor/upp/medic + synth_equipment = /datum/equipment_preset/synth/survivor/upp + spawn_priority = SPAWN_PRIORITY_HIGH + +/obj/effect/landmark/survivor_spawner/upp_specialist + equipment = /datum/equipment_preset/survivor/upp/specialist + synth_equipment = /datum/equipment_preset/synth/survivor/upp + spawn_priority = SPAWN_PRIORITY_HIGH + +/obj/effect/landmark/survivor_spawner/squad_leader + equipment = /datum/equipment_preset/survivor/upp/squad_leader + synth_equipment = /datum/equipment_preset/synth/survivor/upp + spawn_priority = SPAWN_PRIORITY_VERY_HIGH + diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 2edfc3d6ea2b..dd5e99545d11 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1064,3 +1064,7 @@ cases. Override_icon_state should be a list.*/ animate(attack_image, alpha = 175, transform = copy_transform.Scale(0.75), pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3) animate(time = 1) animate(alpha = 0, time = 3, easing = CIRCULAR_EASING|EASE_OUT) + +///Called by /mob/living/carbon/swap_hand() when hands are swapped +/obj/item/proc/hands_swapped(mob/living/carbon/swapper_of_hands) + return diff --git a/code/game/objects/items/devices/cictablet.dm b/code/game/objects/items/devices/cictablet.dm index 1a4aebe813cc..b2707a20aa90 100644 --- a/code/game/objects/items/devices/cictablet.dm +++ b/code/game/objects/items/devices/cictablet.dm @@ -53,6 +53,7 @@ data["faction"] = announcement_faction data["cooldown_message"] = cooldown_between_messages + data["distresstimelock"] = DISTRESS_TIME_LOCK return data @@ -63,7 +64,6 @@ data["evac_status"] = EvacuationAuthority.evac_status data["endtime"] = announcement_cooldown data["distresstime"] = distress_cooldown - data["distresstimelock"] = DISTRESS_TIME_LOCK data["worldtime"] = world.time return data diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 07b56eedb7d2..9bcda4a82bbb 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -441,7 +441,7 @@ if(mapload) return INITIALIZE_HINT_QDEL . = ..() - fuel = rand(5 SECONDS, 60 SECONDS) + fuel = rand(30 SECONDS, 60 SECONDS) /obj/item/device/flashlight/flare/on/illumination/chemical name = "chemical light" diff --git a/code/game/objects/items/devices/motion_detector.dm b/code/game/objects/items/devices/motion_detector.dm index ade74531bc91..dd0c5d45eda4 100644 --- a/code/game/objects/items/devices/motion_detector.dm +++ b/code/game/objects/items/devices/motion_detector.dm @@ -229,11 +229,14 @@ if(human_user) show_blip(human_user, M) - for(var/mob/hologram/queen/Q in GLOB.hologram_list) - if(Q.z != cur_turf.z || !(range_bounds.contains_atom(Q))) continue + for(var/mob/hologram/holo as anything in GLOB.hologram_list) + if(!holo.motion_sensed) + continue + if(holo.z != cur_turf.z || !(range_bounds.contains_atom(holo))) + continue ping_count++ if(human_user) - show_blip(human_user, Q, "queen_eye") + show_blip(human_user, holo, "queen_eye") if(ping_count > 0) playsound(loc, pick('sound/items/detector_ping_1.ogg', 'sound/items/detector_ping_2.ogg', 'sound/items/detector_ping_3.ogg', 'sound/items/detector_ping_4.ogg'), 60, 0, 7, 2) diff --git a/code/game/objects/items/devices/portable_vendor.dm b/code/game/objects/items/devices/portable_vendor.dm index 0b96b859c4ac..875087efbff0 100644 --- a/code/game/objects/items/devices/portable_vendor.dm +++ b/code/game/objects/items/devices/portable_vendor.dm @@ -270,4 +270,7 @@ list("MISC", 0, null, null, null), list("Hollow Cane", 15, /obj/item/weapon/pole/fancy_cane/this_is_a_knife, "white", "A hollow cane that can store any commonplace sharp weaponry. Said weapon not included."), + + list("AMMO", 0, null, null, null), + list("ES-4 stun magazine", 10, /obj/item/ammo_magazine/pistol/es4, "white", "Holds 19 rounds of specialized Conductive 9mm."), ) diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index 9fa85f03b9b1..d724e1cec10f 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -68,6 +68,9 @@ icon_state = "cap_key" channels = list(RADIO_CHANNEL_COMMAND = TRUE, SQUAD_MARINE_1 = TRUE, SQUAD_MARINE_2 = TRUE, SQUAD_MARINE_3 = TRUE, SQUAD_MARINE_4 = TRUE, SQUAD_MARINE_5 = TRUE, SQUAD_MARINE_CRYO = TRUE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_INTEL = TRUE) +/obj/item/device/encryptionkey/mcom/alt + channels = list(RADIO_CHANNEL_COMMAND = TRUE, SQUAD_MARINE_1 = FALSE, SQUAD_MARINE_2 = FALSE, SQUAD_MARINE_3 = FALSE, SQUAD_MARINE_4 = FALSE, SQUAD_MARINE_5 = FALSE, SQUAD_MARINE_CRYO = FALSE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_INTEL = TRUE) + // MARINE ENGINEERING /obj/item/device/encryptionkey/ce @@ -85,7 +88,7 @@ /obj/item/device/encryptionkey/cmo name = "Chief Medical Officer's Encryption Key" icon_state = "cmo_key" - channels = list(RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_COMMAND = TRUE) + channels = list(RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_INTEL = TRUE) /obj/item/device/encryptionkey/med name = "Medical Radio Encryption Key" @@ -116,7 +119,7 @@ // MARINE REQUISTIONS -/obj/item/device/encryptionkey/ro +/obj/item/device/encryptionkey/qm name = "Requisition Officer's Encryption Key" icon_state = "ce_key" channels = list(RADIO_CHANNEL_REQ = TRUE, RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_ENGI = FALSE, RADIO_CHANNEL_MEDSCI = FALSE, SQUAD_MARINE_1 = FALSE, SQUAD_MARINE_2 = FALSE, SQUAD_MARINE_3 = FALSE, SQUAD_MARINE_4 = FALSE, SQUAD_MARINE_5 = FALSE, SQUAD_MARINE_CRYO = FALSE) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 0bd0fae364e5..7e6b0db056d0 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -451,11 +451,11 @@ icon_state = "req_headset" initial_keys = list(/obj/item/device/encryptionkey/req/ct) -/obj/item/device/radio/headset/almayer/ro - desc = "A headset used by the RO for controlling their slave(s). Channels are as follows: :u - requisitions, :v - marine command, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad." +/obj/item/device/radio/headset/almayer/qm + desc = "A headset used by the quartermaster for controlling their slave(s). Channels are as follows: :u - requisitions, :v - marine command, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad." name = "requisition officer radio headset" icon_state = "ro_headset" - initial_keys = list(/obj/item/device/encryptionkey/ro) + initial_keys = list(/obj/item/device/encryptionkey/qm) volume = RADIO_VOLUME_CRITICAL multibroadcast_cooldown = LOW_MULTIBROADCAST_COOLDOWN @@ -494,6 +494,9 @@ volume = RADIO_VOLUME_CRITICAL multibroadcast_cooldown = LOW_MULTIBROADCAST_COOLDOWN +/obj/item/device/radio/headset/almayer/mcom/alt + initial_keys = list(/obj/item/device/encryptionkey/mcom/alt) + /obj/item/device/radio/headset/almayer/marine/mp_honor/com name = "marine honor guard command radio headset" desc = "Given to highly trusted marine honor guard only. It features a non-standard brace. Channels are as follows: :v - marine command, :p - military police, :n - engineering, :m - medbay, :u - requisitions, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad." diff --git a/code/game/objects/items/explosives/grenades/marines.dm b/code/game/objects/items/explosives/grenades/marines.dm index 1892c7543414..a8e0e1803a33 100644 --- a/code/game/objects/items/explosives/grenades/marines.dm +++ b/code/game/objects/items/explosives/grenades/marines.dm @@ -547,31 +547,32 @@ ram_distance -- //for max pinballing. icon_state = inactive_icon -/obj/item/explosive/grenade/slug/proc/impact_mob(mob/living/M) - var/direction = Get_Angle(src,M) - var/target_turf = get_angle_target_turf(src,direction,throw_max) - var/fling = rand(throw_min,throw_max) //WEEEEEEEEEEEEEEEEEEEE What is going to be put into throw_atom +/obj/item/explosive/grenade/slug/proc/impact_mob(mob/living/smacked) + var/direction = Get_Angle(src, smacked) + var/target_turf = get_angle_target_turf(src,direction, throw_max) + var/fling = rand(throw_min, throw_max) //WEEEEEEEEEEEEEEEEEEEE What is going to be put into throw_atom var/random_tile = 0 //random tile for bounce - playsound(M.loc, impact_sound, 75, 1) - M.apply_damage(impact_damage, BRUTE) + playsound(smacked.loc, impact_sound, 75, 1) + smacked.apply_damage(impact_damage, BRUTE) + smacked.attack_log += "\[[time_stamp()]\] [src], fired by [fingerprintslast], struck [key_name(smacked)]." random_tile = get_random_turf_in_range(src,ram_distance,ram_distance) //getting random tile for bounce src.throw_atom(random_tile,ram_distance,SPEED_FAST,src,TRUE,NORMAL_LAUNCH,NO_FLAGS) //time for a little trolling - if(isyautja(M)|| issynth(M)) - M.apply_effect(slowdown_time * 0.5, SLOW) - M.apply_effect(dazed_time * 0.5, DAZE) + if(isyautja(smacked)|| issynth(smacked)) + smacked.apply_effect(slowdown_time * 0.5, SLOW) + smacked.apply_effect(dazed_time * 0.5, DAZE) - if(M.mob_size >= MOB_SIZE_BIG)//big xenos not KO'ed - M.apply_effect(slowdown_time * 1.2, SLOW)//They are slowed more :trol: - M.apply_effect(dazed_time * 1.2, DAZE) + if(smacked.mob_size >= MOB_SIZE_BIG)//big xenos not KO'ed + smacked.apply_effect(slowdown_time * 1.2, SLOW)//They are slowed more :trol: + smacked.apply_effect(dazed_time * 1.2, DAZE) return - M.apply_effect(knockout_time, WEAKEN)//but little xenos and humans are - M.throw_atom(target_turf,fling,SPEED_AVERAGE,M,TRUE) - M.apply_effect(slowdown_time, SLOW) - M.apply_effect(dazed_time, DAZE) + smacked.apply_effect(knockout_time, WEAKEN)//but little xenos and humans are + smacked.throw_atom(target_turf, fling, SPEED_AVERAGE, smacked, TRUE) + smacked.apply_effect(slowdown_time, SLOW) + smacked.apply_effect(dazed_time, DAZE) return /obj/item/explosive/grenade/slug/baton diff --git a/code/game/objects/items/stacks/predator.dm b/code/game/objects/items/stacks/predator.dm index e500932b08f6..42874b907e02 100644 --- a/code/game/objects/items/stacks/predator.dm +++ b/code/game/objects/items/stacks/predator.dm @@ -51,6 +51,8 @@ SPAN_NOTICE("You start hanging [victim] up by the rope...")) if(!do_after(user, 3 SECONDS, INTERRUPT_NO_NEEDHAND, BUSY_ICON_HOSTILE, victim)) return + if(victim.anchored) + return // Just in case weed_food took them during this time user.visible_message(SPAN_WARNING("[user] hangs [victim] from the ceiling!"), SPAN_NOTICE("You finish hanging [victim].")) user.stop_pulling() victim.get_hung() @@ -106,4 +108,5 @@ apply_transform(A) pixel_x = 0 pixel_y = 0 + Moved(loc, NONE, TRUE) // Trigger any movement signals return COMPONENT_CANCEL_ATTACK diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 34719747bd02..98a7ab036f06 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -144,6 +144,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \ /* new/datum/stack_recipe("table parts", /obj/item/frame/table/wood, 2), \ */ + new/datum/stack_recipe("campfire", /obj/structure/prop/brazier/frame/full/campfire, 5, time = 15, one_per_turf = ONE_TYPE_PER_TURF, on_floor = TRUE), \ new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood/normal, 1, time = 10, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 20, one_per_turf = ONE_TYPE_PER_BORDER, on_floor = 1), \ new/datum/stack_recipe("wooden crate", /obj/structure/closet/coffin/woodencrate, 5, time = 15, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1), \ diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index e36225177d91..3bf3656f4bd2 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -437,6 +437,10 @@ xeno_icon_state = "medicpack" xeno_types = list(/mob/living/carbon/xenomorph/runner, /mob/living/carbon/xenomorph/praetorian, /mob/living/carbon/xenomorph/drone, /mob/living/carbon/xenomorph/warrior, /mob/living/carbon/xenomorph/defender, /mob/living/carbon/xenomorph/sentinel, /mob/living/carbon/xenomorph/spitter) +/obj/item/storage/backpack/marine/medic/upp + name = "\improper UPP corpsman backpack" + desc = "Uncommon issue backpack worn by UPP medics from isolated sectors. You can swear you can see a faded USCM symbol." + /obj/item/storage/backpack/marine/tech name = "\improper USCM technician backpack" desc = "A standard-issue backpack worn by USCM technicians." @@ -914,6 +918,16 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r max_fuel = 100 worn_accessible = TRUE +/obj/item/storage/backpack/marine/engineerpack/welder_chestrig + name = "\improper Technician Welder Chestrig" + desc = "A specialized Chestrig worn by technicians and engineers. It carries one medium fuel tank for quick welder refueling and use." + icon_state = "welder_chestrig" + item_state = "welder_chestrig" + max_storage_space = 12 + has_gamemode_skin = FALSE + max_fuel = 100 + worn_accessible = TRUE + // Pyrotechnician Spec backpack fuel tank /obj/item/storage/backpack/marine/engineerpack/flamethrower name = "\improper USCM Pyrotechnician G6-2 fueltank" diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 290460da758f..d12e5b2808a1 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -283,6 +283,19 @@ new /obj/item/storage/pill_bottle/tramadol(src) new /obj/item/storage/pill_bottle/peridaxon(src) +/obj/item/storage/belt/medical/lifesaver/upp/partial/fill_preset_inventory() + new /obj/item/stack/medical/advanced/bruise_pack(src) + new /obj/item/stack/medical/advanced/bruise_pack(src) + new /obj/item/stack/medical/advanced/ointment(src) + new /obj/item/stack/medical/advanced/ointment(src) + new /obj/item/stack/medical/splint(src) + new /obj/item/stack/medical/splint(src) + new /obj/item/reagent_container/hypospray/autoinjector/oxycodone(src) + new /obj/item/storage/pill_bottle/bicaridine(src) + new /obj/item/storage/pill_bottle/kelotane(src) + new /obj/item/storage/pill_bottle/inaprovaline(src) + new /obj/item/storage/pill_bottle/tramadol(src) + /obj/item/storage/belt/security name = "\improper M276 pattern security rig" desc = "The M276 is the standard load-bearing equipment of the USCM. It consists of a modular belt with various clips. This configuration is commonly seen among USCM Military Police and peacekeepers, though it can hold some light munitions." diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 2717b7c98501..0d976b4cdf57 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -212,6 +212,22 @@ /obj/item/storage/firstaid/surgical/empty/fill_preset_inventory() return +//---------TOOLKIT--------- + +/obj/item/storage/firstaid/toolkit + name = "toolkit" + desc = "An combat engineering toolkit intended to carry electrical and mechanical supplies into combat." + icon_state = "toolkit" + item_state = "fulton" + +/obj/item/storage/firstaid/toolkit/update_icon() + if(content_watchers || !length(contents)) + icon_state = "toolkit_empty" + else + icon_state = icon_full + +/obj/item/storage/firstaid/toolkit/empty/fill_preset_inventory() + return //---------SYRINGE CASE--------- @@ -265,7 +281,14 @@ /obj/item/storage/surgical_case name = "surgical case" - desc = "It's a medical case for storing basic surgical tools." + desc = "It's a medical case for storing basic surgical tools. It comes with a brief description for treating common internal bleeds.\ + \nBefore surgery: Verify correct location and patient is adequately numb to pain.\ + \nStep one: Open an incision at the site with the scalpel.\ + \nStep two: Clamp bleeders with the hemostat.\ + \nStep three: Draw back the skin with the retracter.\ + \nStep four: Patch the damaged vein with a surgical line.\ + \nStep five: Close the incision with a surgical line." + icon_state = "surgical_case" throw_speed = SPEED_FAST throw_range = 8 @@ -448,6 +471,22 @@ ..() update_icon() +/obj/item/storage/pill_bottle/attack_hand(mob/user, mods) + if(loc != user) + return ..() + + if(!mods || !mods["alt"]) + return ..() + + if(!ishuman(user)) + return ..() + + if(skilllock && !skillcheck(user, SKILL_MEDICAL, SKILL_MEDICAL_MEDIC)) + error_idlock(user) + return FALSE + + return ..() + /obj/item/storage/pill_bottle/proc/error_idlock(mob/user) to_chat(user, SPAN_WARNING("It must have some kind of ID lock...")) diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index aa9d91921fae..30be2f6bc2e2 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -54,11 +54,9 @@ req_access = list(ACCESS_WY_CORPORATE) /obj/item/storage/lockbox/loyalty/fill_preset_inventory() - new /obj/item/ammo_magazine/pistol/mod88(src) - new /obj/item/ammo_magazine/pistol/mod88(src) - new /obj/item/ammo_magazine/pistol/mod88/rubber(src) - new /obj/item/ammo_magazine/pistol/mod88/rubber(src) - + new /obj/item/ammo_magazine/pistol/es4(src) + new /obj/item/ammo_magazine/pistol/es4(src) + new /obj/item/ammo_magazine/pistol/es4(src) /obj/item/storage/lockbox/cluster name = "lockbox of cluster flashbangs" diff --git a/code/game/objects/items/storage/pouch.dm b/code/game/objects/items/storage/pouch.dm index dc3ee0ba1506..6397c33b76c1 100644 --- a/code/game/objects/items/storage/pouch.dm +++ b/code/game/objects/items/storage/pouch.dm @@ -1211,6 +1211,12 @@ new /obj/item/explosive/plastic(src) new /obj/item/explosive/plastic(src) +/obj/item/storage/pouch/tools/uppsynth/fill_preset_inventory() + new /obj/item/tool/crowbar(src) + new /obj/item/tool/wirecutters(src) + new /obj/item/tool/weldingtool(src) + new /obj/item/tool/wrench(src) + /obj/item/storage/pouch/sling name = "sling strap" desc = "Keeps a single item attached to a strap." diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index c9bfb9b9f757..be7571fa84a1 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -323,13 +323,25 @@ item_state = "syn_breacher" force_wielded = MELEE_FORCE_VERY_STRONG really_heavy = TRUE + var/move_delay_addition = 1.5 /obj/item/weapon/twohanded/breacher/synth/pickup(mob/user) if(!(HAS_TRAIT(user, TRAIT_SUPER_STRONG))) - to_chat(user, SPAN_WARNING("You barely manage to lift \the [src] above your knees. This thing will probably be useless to you.")) + to_chat(user, SPAN_HIGHDANGER("You barely manage to lift [src] above your knees. This thing will probably be useless to you.")) + user.apply_effect(3, EYE_BLUR) + RegisterSignal(user, COMSIG_HUMAN_POST_MOVE_DELAY, PROC_REF(handle_movedelay)) + return ..() +/obj/item/weapon/twohanded/breacher/synth/proc/handle_movedelay(mob/living/M, list/movedata) + SIGNAL_HANDLER + movedata["move_delay"] += move_delay_addition + +/obj/item/weapon/twohanded/breacher/synth/dropped(mob/user, silent) + . = ..() + UnregisterSignal(user, COMSIG_HUMAN_POST_MOVE_DELAY) + /obj/item/weapon/twohanded/breacher/synth/attack(target as mob, mob/living/user as mob) if(!HAS_TRAIT(user, TRAIT_SUPER_STRONG)) to_chat(user, SPAN_WARNING("\The [src] is too heavy for you to use as a weapon!")) diff --git a/code/game/objects/structures/barricade/deployable.dm b/code/game/objects/structures/barricade/deployable.dm index 7ed2eefd75fb..77aa6b7e6816 100644 --- a/code/game/objects/structures/barricade/deployable.dm +++ b/code/game/objects/structures/barricade/deployable.dm @@ -23,56 +23,38 @@ . = ..() . += SPAN_INFO("Drag its sprite onto yourself to undeploy.") -/obj/structure/barricade/deployable/attackby(obj/item/W, mob/user) +/obj/structure/barricade/deployable/attackby(obj/item/item, mob/user) - if(iswelder(W)) - if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) + if(iswelder(item)) + if(!HAS_TRAIT(item, TRAIT_TOOL_BLOWTORCH)) to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) return if(user.action_busy) return - var/obj/item/tool/weldingtool/WT = W + var/obj/item/tool/weldingtool/welder = item if(health == maxhealth) to_chat(user, SPAN_WARNING("[src] doesn't need repairs.")) return - weld_cade(WT, user) + weld_cade(welder, user) return - else if(HAS_TRAIT(W, TRAIT_TOOL_WRENCH)) + else if(HAS_TRAIT(item, TRAIT_TOOL_CROWBAR)) if(user.action_busy) return - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) - to_chat(user, SPAN_WARNING("You do not know where the loosening bolts are on [src]...")) - return - else - if(build_state == BARRICADE_BSTATE_UNSECURED) - to_chat(user, SPAN_NOTICE("You tighten the bolts on [src].")) - playsound(src.loc, 'sound/items/Ratchet.ogg', 25, 1) - build_state = BARRICADE_BSTATE_SECURED - else - to_chat(user, SPAN_NOTICE("You loosen the bolts on [src].")) - playsound(src.loc, 'sound/items/Ratchet.ogg', 25, 1) - build_state = BARRICADE_BSTATE_UNSECURED - - else if(HAS_TRAIT(W, TRAIT_TOOL_CROWBAR)) - if(build_state != BARRICADE_BSTATE_UNSECURED) - return - if(user.action_busy) - return - if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) + if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You do not know how to collapse [src] using a crowbar...")) return else user.visible_message(SPAN_NOTICE("[user] starts collapsing [src]."), \ SPAN_NOTICE("You begin collapsing [src]...")) - playsound(src.loc, 'sound/items/Crowbar.ogg', 25, 1) - if(do_after(user, 2 SECONDS, INTERRUPT_ALL, BUSY_ICON_FRIENDLY, src)) + playsound(loc, 'sound/items/Crowbar.ogg', 25, 1) + if(do_after(user, 1.5 SECONDS, INTERRUPT_NO_NEEDHAND, BUSY_ICON_FRIENDLY, src)) collapse(usr) else to_chat(user, SPAN_WARNING("You stop collapsing [src].")) - if(try_nailgun_usage(W, user)) + if(try_nailgun_usage(item, user)) return . = ..() @@ -87,20 +69,20 @@ if(over_object == usr && Adjacent(usr)) usr.visible_message(SPAN_NOTICE("[usr] starts collapsing [src]."), SPAN_NOTICE("You begin collapsing [src].")) - playsound(src.loc, 'sound/items/Crowbar.ogg', 25, 1) + playsound(loc, 'sound/items/Crowbar.ogg', 25, 1) if(do_after(usr, 3 SECONDS, INTERRUPT_NO_NEEDHAND, BUSY_ICON_FRIENDLY, src)) collapse(usr) else to_chat(usr, SPAN_WARNING("You stop collapsing [src].")) /obj/structure/barricade/deployable/proc/collapse(mob/living/carbon/human/user) - var/obj/item/stack/folding_barricade/FB = new source_type(loc) - FB.health = health - FB.maxhealth = maxhealth + var/obj/item/stack/folding_barricade/folding = new source_type(loc) + folding.stack_health = list(health) + folding.maxhealth = maxhealth if(istype(user)) user.visible_message(SPAN_NOTICE("[user] collapses [src]."), SPAN_NOTICE("You collapse [src].")) - user.put_in_active_hand(FB) + user.put_in_active_hand(folding) qdel(src) /obj/structure/barricade/deployable/initialize_pass_flags(datum/pass_flags_container/PF) @@ -133,6 +115,14 @@ ) icon = 'icons/obj/items/marine-items.dmi' + var/list/stack_health = list() + +/obj/item/stack/folding_barricade/Initialize(mapload, init_amount) + . = ..() + for(var/counter in 1 to amount) + stack_health += initial(health) + + /obj/item/stack/folding_barricade/update_icon() . = ..() icon_state = "folding-[amount]" @@ -153,16 +143,16 @@ var/obj/structure/blocker/anti_cade/AC = locate(/obj/structure/blocker/anti_cade) in OT // for M2C HMG, look at smartgun_mount.dm if(!OT.allow_construction) - to_chat(usr, SPAN_WARNING("[src.singular_name] must be constructed on a proper surface!")) + to_chat(usr, SPAN_WARNING("[singular_name] must be constructed on a proper surface!")) return if(AC) - to_chat(usr, SPAN_WARNING("[src.singular_name] cannot be built here!")) + to_chat(usr, SPAN_WARNING("[singular_name] cannot be built here!")) return - user.visible_message(SPAN_NOTICE("[user] begins deploying [src.singular_name]."), - SPAN_NOTICE("You begin deploying [src.singular_name].")) + user.visible_message(SPAN_NOTICE("[user] begins deploying [singular_name]."), + SPAN_NOTICE("You begin deploying [singular_name].")) - playsound(src.loc, 'sound/items/Ratchet.ogg', 25, 1) + playsound(loc, 'sound/items/Ratchet.ogg', 25, 1) if(!do_after(user, 1 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) to_chat(user, SPAN_WARNING("You were interrupted.")) @@ -173,12 +163,12 @@ to_chat(user, SPAN_WARNING("There is already \a [B] in this direction!")) return - user.visible_message(SPAN_NOTICE("[user] has finished deploying [src.singular_name]."), - SPAN_NOTICE("You finish deploying [src.singular_name].")) + user.visible_message(SPAN_NOTICE("[user] has finished deploying [singular_name]."), + SPAN_NOTICE("You finish deploying [singular_name].")) var/obj/structure/barricade/deployable/cade = new(user.loc) cade.setDir(user.dir) - cade.health = health + cade.health = pop(stack_health) cade.maxhealth = maxhealth cade.source_type = singular_type cade.update_damage_state() @@ -186,76 +176,90 @@ use(1) -/obj/item/stack/folding_barricade/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/stack/folding_barricade)) - var/obj/item/stack/folding_barricade/F = W - - if(health != maxhealth || F.health != F.maxhealth) - to_chat(user, "You cannot stack damaged [src.singular_name]\s.") +/obj/item/stack/folding_barricade/attackby(obj/item/item, mob/user) + if(istype(item, /obj/item/stack/folding_barricade)) + var/obj/item/stack/folding_barricade/folding = item + if(!ismob(loc)) //gather from ground + if(amount >= max_amount) + to_chat(user, "You cannot stack more [folding.singular_name]\s.") + return + var/to_transfer = min(folding.max_amount - folding.amount, amount) + for(var/counter in 1 to to_transfer) + folding.stack_health += pop(stack_health) + use(to_transfer) + folding.add(to_transfer) + to_chat(user, SPAN_INFO("You transfer [to_transfer] between the stacks.")) return - - if(!ismob(src.loc)) - return ..() - if(amount >= max_amount) - to_chat(user, "You cannot stack more [src.singular_name]\s.") + to_chat(user, "You cannot stack more [singular_name]\s.") return - var/to_transfer = min(max_amount - amount, F.amount) - F.use(to_transfer) + var/to_transfer = min(max_amount - amount, folding.amount) + for(var/counter in 1 to to_transfer) + stack_health += pop(folding.stack_health) + folding.use(to_transfer) add(to_transfer) to_chat(user, SPAN_INFO("You transfer [to_transfer] between the stacks.")) return - else if(iswelder(W)) - if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) + else if(iswelder(item)) + if(!HAS_TRAIT(item, TRAIT_TOOL_BLOWTORCH)) to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) return - if(src != user.get_inactive_hand()) - to_chat(user, SPAN_WARNING("You need to hold [src.singular_name] in hand or deploy to repair it.")) - return if(user.action_busy) return - var/obj/item/tool/weldingtool/WT = W - if(health == maxhealth) - to_chat(user, SPAN_WARNING("[src.singular_name] doesn't need repairs.")) + var/need_repairs = 0 + for(var/counter in 1 to length(stack_health)) + if(stack_health[counter] < maxhealth) + need_repairs++ + + if(!need_repairs) + to_chat(user, SPAN_WARNING("[singular_name] doesn't need repairs.")) return - if(!(WT.remove_fuel(2, user))) + var/obj/item/tool/weldingtool/welder = item + if(!(welder.remove_fuel(2, user))) return user.visible_message(SPAN_NOTICE("[user] begins repairing damage to [src]."), SPAN_NOTICE("You begin repairing the damage to [src].")) - playsound(src.loc, 'sound/items/Welder2.ogg', 25, TRUE) + playsound(loc, 'sound/items/Welder2.ogg', 25, TRUE) - var/welding_time = skillcheck(user, SKILL_CONSTRUCTION, 2) ? 5 SECONDS : 10 SECONDS - if(!do_after(user, welding_time, INTERRUPT_NO_NEEDHAND|BEHAVIOR_IMMOBILE, BUSY_ICON_FRIENDLY, src)) - return + var/welding_time = (skillcheck(user, SKILL_CONSTRUCTION, SKILL_CONSTRUCTION_TRAINED) ? 5 SECONDS : 10 SECONDS) * need_repairs + + if(src != user.get_inactive_hand()) + if(!do_after(user, welding_time, INTERRUPT_NO_NEEDHAND|BEHAVIOR_IMMOBILE, BUSY_ICON_FRIENDLY, src)) + return + else + if(!do_after(user, welding_time, (INTERRUPT_ALL & (~INTERRUPT_MOVED)), BUSY_ICON_FRIENDLY, src, INTERRUPT_DIFF_LOC)) //you can move while repairing if you have cade in hand + return user.visible_message(SPAN_NOTICE("[user] repairs some damage on [src]."), SPAN_NOTICE("You repair [src].")) user.count_niche_stat(STATISTICS_NICHE_REPAIR_CADES) - health += 200 - if(health > maxhealth) - health = maxhealth + for(var/counter in 1 to length(stack_health)) + stack_health[counter] += 200 + if(stack_health[counter] > maxhealth) + stack_health[counter] = maxhealth - playsound(src.loc, 'sound/items/Welder2.ogg', 25, TRUE) + playsound(loc, 'sound/items/Welder2.ogg', 25, TRUE) return . = ..() /obj/item/stack/folding_barricade/attack_hand(mob/user) - var/mob/living/carbon/human/H = user - if(!(amount > 1 && H.back == src)) + var/mob/living/carbon/human/human = user + if(!(amount > 1 && (human.back == src || human.get_inactive_hand() == src))) return ..() - var/obj/item/stack/F = new singular_type(user, 1) - transfer_fingerprints_to(F) - user.put_in_hands(F) - src.add_fingerprint(user) - F.add_fingerprint(user) + var/obj/item/stack/folding_barricade/folding = new singular_type(user, 1) + transfer_fingerprints_to(folding) + folding.stack_health = list(pop(stack_health)) + user.put_in_hands(folding) + add_fingerprint(user) + folding.add_fingerprint(user) use(1) /obj/item/stack/folding_barricade/MouseDrop(obj/over_object as obj) @@ -277,7 +281,7 @@ /obj/item/stack/folding_barricade/get_examine_text(mob/user) . = ..() - if(health < maxhealth) + if(round(min(stack_health)/maxhealth * 100) <= 75) . += SPAN_WARNING("It appears to be damaged.") /obj/item/stack/folding_barricade/three diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cm_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/cm_closets.dm index 4d275ee7b9d8..fbd476e2bfe5 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cm_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cm_closets.dm @@ -306,8 +306,8 @@ GLOBAL_LIST_EMPTY(co_secure_boxes) /obj/structure/closet/secure_closet/req_officer/Initialize() . = ..() - new /obj/item/device/radio/headset/almayer/ro(src) - new /obj/item/clothing/under/rank/ro_suit(src) + new /obj/item/device/radio/headset/almayer/qm(src) + new /obj/item/clothing/under/rank/qm_suit(src) new /obj/item/clothing/shoes/marine(src) new /obj/item/storage/belt/marine(src) new /obj/item/clothing/head/cmcap/req(src) diff --git a/code/game/objects/structures/props.dm b/code/game/objects/structures/props.dm index c71f9b227668..ea3a2af391bc 100644 --- a/code/game/objects/structures/props.dm +++ b/code/game/objects/structures/props.dm @@ -639,6 +639,10 @@ icon_state = "" icon = 'icons/turf/lifeboat.dmi' +#define STATE_COMPLETE 0 +#define STATE_FUEL 1 +#define STATE_IGNITE 2 + /obj/structure/prop/brazier name = "brazier" desc = "The fire inside the brazier emits a relatively dim glow to flashlights and flares, but nothing can replace the feeling of sitting next to a fireplace with your friends." @@ -647,6 +651,40 @@ density = TRUE health = 150 luminosity = 6 + /// What obj this becomes when it gets to its next stage of construction / ignition + var/frame_type + /// What is used to progress to the next stage + var/state = STATE_COMPLETE + +/obj/structure/prop/brazier/get_examine_text(mob/user) + . = ..() + switch(state) + if(STATE_FUEL) + . += "[src] requires wood to be fueled." + if(STATE_IGNITE) + . += "[src] needs to be lit." + +/obj/structure/prop/brazier/attackby(obj/item/hit_item, mob/user) + switch(state) + if(STATE_COMPLETE) + return ..() + if(STATE_FUEL) + if(!istype(hit_item, /obj/item/stack/sheet/wood)) + return ..() + var/obj/item/stack/sheet/wood/wooden_boards = hit_item + if(!wooden_boards.use(5)) + to_chat(user, SPAN_WARNING("Not enough wood!")) + return + user.visible_message(SPAN_NOTICE("[user] fills [src] with [hit_item].")) + if(STATE_IGNITE) + if(!hit_item.heat_source) + return ..() + if(!do_after(user, 3 SECONDS, INTERRUPT_MOVED, BUSY_ICON_BUILD)) + return + user.visible_message(SPAN_NOTICE("[user] ignites [src] with [hit_item].")) + + new frame_type(loc) + qdel(src) /obj/structure/prop/brazier/Destroy() SetLuminosity(0) @@ -662,31 +700,15 @@ desc = "An empty brazier." icon_state = "brazier_frame" luminosity = 0 + frame_type = /obj/structure/prop/brazier/frame/full + state = STATE_FUEL -/obj/structure/prop/brazier/frame/attackby(obj/item/hit_item, mob/user) - if(!istype(hit_item, /obj/item/stack/sheet/wood)) - return ..() - var/obj/item/stack/wooden_boards = hit_item - if(wooden_boards.amount < 5) - to_chat(user, SPAN_WARNING("Not enough wood!")) - return - wooden_boards.use(5) - user.visible_message(SPAN_NOTICE("[user] fills the brazier with wood.")) - new /obj/structure/prop/brazier/frame_woodened(loc) - qdel(src) - -/obj/structure/prop/brazier/frame_woodened +/obj/structure/prop/brazier/frame/full name = "empty full brazier" desc = "An empty brazier. Yet it's also full. What??? Use something hot to ignite it, like a welding tool." icon_state = "brazier_frame_filled" - luminosity = 0 - -/obj/structure/prop/brazier/frame_woodened/attackby(obj/item/hit_item, mob/user) - if(!hit_item.heat_source) - return ..() - user.visible_message(SPAN_NOTICE("[user] ignites the brazier with [hit_item].")) - new /obj/structure/prop/brazier(loc) - qdel(src) + frame_type = /obj/structure/prop/brazier + state = STATE_IGNITE /obj/structure/prop/brazier/torch name = "torch" @@ -695,25 +717,136 @@ density = FALSE luminosity = 5 -/obj/structure/prop/brazier/torch/frame +/obj/structure/prop/brazier/frame/full/torch name = "unlit torch" desc = "It's a torch, but it's not lit. Use something hot to ignite it, like a welding tool." icon_state = "torch_frame" - luminosity = 0 - -/obj/structure/prop/brazier/torch/frame/attackby(obj/item/hit_item, mob/user) - if(!hit_item.heat_source) - return ..() - user.visible_message(SPAN_NOTICE("[user] ignites the torch with [hit_item].")) - new /obj/structure/prop/brazier/torch(loc) - qdel(src) + frame_type = /obj/structure/prop/brazier/torch /obj/item/prop/torch_frame name = "unlit torch" icon = 'icons/obj/structures/structures.dmi' desc = "It's a torch, but it's not lit or placed down. Click on a wall to place it." icon_state = "torch_frame" - luminosity = 0 + +/obj/structure/prop/brazier/frame/full/campfire + name = "unlit campfire" + desc = "A circle of stones surrounding a pile of wood. If only you were to light it." + icon_state = "campfire" + frame_type = /obj/structure/prop/brazier/campfire + density = FALSE + +/obj/structure/prop/brazier/frame/full/campfire/smolder + name = "smoldering campfire" + desc = "A campfire that used to be lit, but was extinguished. You can still see the embers, and smoke rises from it." + state = STATE_FUEL + frame_type = /obj/structure/prop/brazier/frame/full/campfire + +/obj/structure/prop/brazier/campfire + name = "campfire" + desc = "A circle of stones surrounding a burning pile of wood. The fire is roaring and you can hear its crackle. You could probably stomp the fire out." + icon = 'icons/obj/structures/structures.dmi' + icon_state = "campfire_on" + density = FALSE + ///How many tiles the heating and sound goes + var/heating_range = 2 + /// time between sounds + var/time_to_sound = 20 + /// Time for it to burn through fuel + var/fuel_stage_time = 1 MINUTES + /// How much fuel it has + var/remaining_fuel = 5 //Maxes at 5, but burns one when made + /// If the fire can be manually put out + var/extinguishable = TRUE + /// Make no noise + var/quiet = FALSE + +/obj/structure/prop/brazier/campfire/Initialize() + . = ..() + START_PROCESSING(SSobj, src) + fuel_drain(TRUE) + +/obj/structure/prop/brazier/campfire/get_examine_text(mob/user) + . = ..() + switch(remaining_fuel) + if(4 to INFINITY) + . += "The fire is roaring." + if(2 to 3) + . += "The fire is burning warm." + if(-INFINITY to 1) + . += "The embers of the fire barely burns." + +/obj/structure/prop/brazier/campfire/process(delta_time) + if(!isturf(loc)) + return + + for(var/mob/living/carbon/human/mob in range(heating_range, src)) + if(mob.bodytemperature < T20C) + mob.bodytemperature += min(round(T20C - mob.bodytemperature)*0.7, 25) + mob.recalculate_move_delay = TRUE + + if(quiet) + return + time_to_sound -= delta_time + if(time_to_sound <= 0) + playsound(loc, 'sound/machines/firepit_ambience.ogg', 15, FALSE, heating_range) + time_to_sound = initial(time_to_sound) + +/obj/structure/prop/brazier/campfire/attack_hand(mob/user) + . = ..() + if(!extinguishable) + to_chat(user, SPAN_WARNING("You cannot extinguish [src].")) + return + to_chat(user, SPAN_NOTICE("You begin to extinguish [src].")) + while(remaining_fuel) + if(user.action_busy || !do_after(user, 3 SECONDS, INTERRUPT_MOVED, BUSY_ICON_BUILD)) + return + fuel_drain() + to_chat(user, SPAN_NOTICE("You continue to extinguish [src].")) + visible_message(SPAN_NOTICE("[user] extinguishes [src].")) + +/obj/structure/prop/brazier/campfire/attackby(obj/item/attacking_item, mob/user) + if(!istype(attacking_item, /obj/item/stack/sheet/wood)) + to_chat(SPAN_NOTICE("You cannot fuel [src] with [attacking_item].")) + return + var/obj/item/stack/sheet/wood/fuel = attacking_item + if(remaining_fuel >= initial(remaining_fuel)) + to_chat(user, SPAN_NOTICE("You cannot fuel [src] further.")) + if(!fuel.use(1)) + to_chat(SPAN_NOTICE("You do not have enough [attacking_item] to fuel [src].")) + visible_message(SPAN_NOTICE("[user] fuels [src] with [fuel].")) + remaining_fuel++ + +/obj/structure/prop/brazier/campfire/attack_alien(mob/living/carbon/xenomorph/xeno) + if(!extinguishable) + to_chat(xeno, SPAN_WARNING("You cannot extinguish [src].")) + return + to_chat(xeno, SPAN_NOTICE("You begin to extinguish [src].")) + while(remaining_fuel) + if(xeno.action_busy || !do_after(xeno, 1 SECONDS, INTERRUPT_MOVED, BUSY_ICON_HOSTILE)) + return + fuel_drain() + to_chat(xeno, SPAN_NOTICE("You continue to extinguish [src].")) + visible_message(SPAN_WARNING("[xeno] extinguishes [src]!")) + +/obj/structure/prop/brazier/campfire/proc/fuel_drain(looping) + remaining_fuel-- + if(!remaining_fuel) + new /obj/structure/prop/brazier/frame/full/campfire/smolder(loc) + qdel(src) + return + if(!looping || !fuel_stage_time) + return + addtimer(CALLBACK(src, PROC_REF(fuel_drain), TRUE), fuel_stage_time) + +/obj/structure/prop/brazier/campfire/Destroy() + SetLuminosity(0) + STOP_PROCESSING(SSobj, src) + return ..() + +#undef STATE_COMPLETE +#undef STATE_FUEL +#undef STATE_IGNITE //ICE COLONY PROPS //Thematically look to Blackmesa's Xen levels. Generic science-y props n' stuff. @@ -1152,3 +1285,91 @@ icon = 'icons/obj/structures/props/almayer_props.dmi' icon_state = "rope" density = FALSE + +/obj/structure/prop/pred_flight + name = "hunter flight console" + desc = "A console designed by the Hunters to assist in flight pathing and navigation." + icon = 'icons/obj/structures/machinery/computer.dmi' + icon_state = "overwatch" + density = TRUE + +/obj/structure/prop/invuln/joey + name = "Workin' Joey" + desc = "A defunct Seegson-brand Working Joe lifted from deep storage by a crew of marines after the last shore leave. Attempts have been made to modify the janitorial synthetic to serve as a crude bartender, but with little success." + icon = 'icons/obj/structures/props/props.dmi' + icon_state = "joey" + unslashable = FALSE + wrenchable = FALSE + /// converted into minutes when used to determine cooldown timer between quips + var/quip_delay_minimum = 5 + /// delay between Quips. Slightly randomized with quip_delay_minimum plus a random number + COOLDOWN_DECLARE(quip_delay) + /// delay between attack voicelines. Short but done for anti-spam + COOLDOWN_DECLARE(damage_delay) + /// list of quip emotes, taken from Working Joe + var/static/list/quips = list( + /datum/emote/living/carbon/human/synthetic/working_joe/quip/alwaysknow_damaged, + /datum/emote/living/carbon/human/synthetic/working_joe/quip/not_liking, + /datum/emote/living/carbon/human/synthetic/working_joe/greeting/how_can_i_help, + /datum/emote/living/carbon/human/synthetic/working_joe/task_update/day_never_done, + /datum/emote/living/carbon/human/synthetic/working_joe/task_update/required_by_apollo, + /datum/emote/living/carbon/human/synthetic/working_joe/warning/safety_breach + ) + /// list of voicelines to use when damaged + var/static/list/damaged = list( + /datum/emote/living/carbon/human/synthetic/working_joe/warning/damage, + /datum/emote/living/carbon/human/synthetic/working_joe/warning/that_stings, + /datum/emote/living/carbon/human/synthetic/working_joe/warning/irresponsible, + /datum/emote/living/carbon/human/synthetic/working_joe/warning/this_is_futile, + /datum/emote/living/carbon/human/synthetic/working_joe/warning/hysterical, + /datum/emote/living/carbon/human/synthetic/working_joe/warning/patience + ) + +/obj/structure/prop/invuln/joey/Initialize() + . = ..() + START_PROCESSING(SSobj, src) + +/obj/structure/prop/invuln/joey/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/structure/prop/invuln/joey/process() + //check if quip_delay cooldown finished. If so, random chance it says a line + if(COOLDOWN_FINISHED(src, quip_delay) && prob(10)) + emote(pick(quips)) + var/delay = rand(3) + quip_delay_minimum + COOLDOWN_START(src, quip_delay, delay MINUTES) + +// Advert your eyes. +/obj/structure/prop/invuln/joey/attackby(obj/item/W, mob/user) + attacked() + return ..() + +/obj/structure/prop/invuln/joey/bullet_act(obj/item/projectile/P) + attacked() + return ..() + +/// A terrible way of handling being hit. If signals would work it should be used. +/obj/structure/prop/invuln/joey/proc/attacked() + if(COOLDOWN_FINISHED(src, damage_delay) && prob(25)) + emote(pick(damaged)) + COOLDOWN_START(src, damage_delay, 8 SECONDS) + +/// SAY THE LINE JOE +/obj/structure/prop/invuln/joey/proc/emote(datum/emote/living/carbon/human/synthetic/working_joe/emote) + if (!emote) + return FALSE + + for(var/mob/mob in hearers(src, null)) + mob.show_message("[src] says, \"[initial(emote.say_message)]\"", SHOW_MESSAGE_AUDIBLE) + + var/list/viewers = get_mobs_in_view(7, src) + for(var/mob/current_mob in viewers) + if(!(current_mob.client?.prefs.toggles_langchat & LANGCHAT_SEE_EMOTES)) + viewers -= current_mob + langchat_speech(initial(emote.say_message), viewers, GLOB.all_languages, skip_language_check = TRUE) + + if(initial(emote.sound)) + playsound(loc, initial(emote.sound), 50, FALSE) + return TRUE + diff --git a/code/game/turfs/walls/walls.dm b/code/game/turfs/walls/walls.dm index 3599d5bb980b..2387a2086192 100644 --- a/code/game/turfs/walls/walls.dm +++ b/code/game/turfs/walls/walls.dm @@ -403,7 +403,7 @@ if(istype(attacking_item, /obj/item/prop/torch_frame)) to_chat(user, SPAN_NOTICE("You place the torch down on the wall.")) - new /obj/structure/prop/brazier/torch/frame(src) + new /obj/structure/prop/brazier/frame/full/torch(src) qdel(attacking_item) if(hull) diff --git a/code/game/verbs/records.dm b/code/game/verbs/records.dm index 56a440e3558c..f09de72da2e6 100644 --- a/code/game/verbs/records.dm +++ b/code/game/verbs/records.dm @@ -53,7 +53,7 @@ if(NOTE_YAUTJA) color = "#114e11" - dat += "[N.text] by [admin_ckey] ([N.admin_rank]) on [N.date] " + dat += "[N.text] by [admin_ckey] ([N.admin_rank]) on [N.date] [NOTE_ROUND_ID(N)] " dat += "

" dat += "
" @@ -168,7 +168,7 @@ continue var/admin_ckey = N.admin_ckey - dat += "[N.text] by [admin_ckey] ([N.admin_rank]) on [N.date] " + dat += "[N.text] by [admin_ckey] ([N.admin_rank]) on [N.date] [NOTE_ROUND_ID(N)] " ///Can remove notes from anyone other than yourself, unless you're the host. So long as you have deletion access anyway. if((can_del && target != get_player_from_key(key)) || ishost(usr)) dat += "Remove" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 5f24f71c8a50..2c749df71bb7 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -89,7 +89,7 @@ if(N.is_ban) var/time_d = N.ban_time ? "Banned for [N.ban_time] minutes | " : "" color = "#880000" //Removed confidential check because we can't make confidential bans - dat += "[time_d][N.text] by [admin_ckey] ([N.admin_rank])[confidential_text] on [N.date] " + dat += "[time_d][N.text] by [admin_ckey] ([N.admin_rank])[confidential_text] on [N.date] [NOTE_ROUND_ID(N)] " else if(N.is_confidential) color = "#AA0055" @@ -102,7 +102,7 @@ else if(N.note_category == NOTE_YAUTJA) color = "#114e11" - dat += "[N.text] by [admin_ckey] ([N.admin_rank])[confidential_text] on [N.date] " + dat += "[N.text] by [admin_ckey] ([N.admin_rank])[confidential_text] on [N.date] [NOTE_ROUND_ID(N)] " if(admin_ckey == usr.ckey || admin_ckey == "Adminbot" || ishost(usr)) dat += "Remove" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 20ff65ed144e..05e27625daeb 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -121,6 +121,7 @@ var/list/admin_verbs_minor_event = list( /client/proc/toggle_sniper_upgrade, /client/proc/toggle_attack_dead, /client/proc/toggle_strip_drag, + /client/proc/toggle_disposal_mobs, /client/proc/toggle_uniform_strip, /client/proc/toggle_strong_defibs, /client/proc/toggle_blood_optimization, @@ -576,6 +577,10 @@ var/list/roundstart_mod_verbs = list( set desc = "Tells everyone about a random statistic in the round." set category = "OOC" + var/prompt = tgui_alert(usr, "Are you sure you want to do this?", "Announce Random Fact", list("No", "Yes")) + if(prompt != "Yes") + return + message_admins("[key_name(usr)] announced a random fact.") SSticker.mode?.declare_fun_facts() diff --git a/code/modules/admin/player_panel/actions/transform.dm b/code/modules/admin/player_panel/actions/transform.dm index 185165357e05..91a62b1a1d02 100644 --- a/code/modules/admin/player_panel/actions/transform.dm +++ b/code/modules/admin/player_panel/actions/transform.dm @@ -127,7 +127,7 @@ GLOBAL_LIST_INIT(pp_transformables, list( "Alien Tier 4" = list( list( - name = XENO_CASTE_QUEEN+" (Young)", + name = XENO_CASTE_QUEEN+" (Immature)", key = /mob/living/carbon/xenomorph/queen, color = "purple" ), diff --git a/code/modules/admin/tabs/admin_tab.dm b/code/modules/admin/tabs/admin_tab.dm index 5a98faa6ddaa..6dc08c63e5de 100644 --- a/code/modules/admin/tabs/admin_tab.dm +++ b/code/modules/admin/tabs/admin_tab.dm @@ -169,12 +169,12 @@ if(N.is_ban) var/ban_text = N.ban_time ? "Banned for [N.ban_time] | " : "" color = "#880000" - dat += "[ban_text][N.text] by [admin_ckey] ([N.admin_rank])[confidential_text] on [N.date] " + dat += "[ban_text][N.text] by [admin_ckey] ([N.admin_rank])[confidential_text] on [N.date] [NOTE_ROUND_ID(N)] " else if(N.is_confidential) color = "#AA0055" - dat += "[N.text] by [admin_ckey] ([N.admin_rank])[confidential_text] on [N.date] " + dat += "[N.text] by [admin_ckey] ([N.admin_rank])[confidential_text] on [N.date] [NOTE_ROUND_ID(N)] " dat += "

" dat += "
" @@ -708,6 +708,20 @@ SSticker.mode.toggleable_flags ^= MODE_NO_ATTACK_DEAD message_admins("[src] has [MODE_HAS_TOGGLEABLE_FLAG(MODE_NO_ATTACK_DEAD) ? "prevented dead mobs from being" : "allowed dead mobs to be"] attacked.") +/client/proc/toggle_disposal_mobs() + set name = "Toggle Disposable Mobs" + set category = "Admin.Flags" + + if(!admin_holder || !check_rights(R_EVENT, FALSE)) + return + + if(!SSticker.mode) + to_chat(usr, SPAN_WARNING("A mode hasn't been selected yet!")) + return + + SSticker.mode.toggleable_flags ^= MODE_DISPOSABLE_MOBS + message_admins("[src] has [MODE_HAS_TOGGLEABLE_FLAG(MODE_DISPOSABLE_MOBS) ? "allowed mobs to fit" : "prevented mobs fitting"] inside disposals.") + /client/proc/toggle_strip_drag() set name = "Toggle Strip/Drag Dead" set category = "Admin.Flags" diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm index b9eb4fd47ea1..fdf70d314c21 100644 --- a/code/modules/admin/tabs/event_tab.dm +++ b/code/modules/admin/tabs/event_tab.dm @@ -491,10 +491,10 @@ for(var/obj/structure/machinery/computer/almayer_control/C in machines) if(!(C.inoperable())) var/obj/item/paper/P = new /obj/item/paper( C.loc ) - P.name = "'[command_name] Update.'" + P.name = "'[customname].'" P.info = input P.update_icon() - C.messagetitle.Add("[command_name] Update") + C.messagetitle.Add("[customname]") C.messagetext.Add(P.info) if(alert("Press \"Yes\" if you want to announce it to ship crew and marines. Press \"No\" to keep it only as printed report on communication console.",,"Yes","No") == "Yes") diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 03d2ae517354..3d50b50e414c 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -519,6 +519,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) AddInteraction("Deferred to Mentors by [key_name_admin(usr)].", player_message = "Deferred to Mentors.") to_chat(initiator, SPAN_ADMINHELP("Your ticket has been deferred to Mentors.")) + log_admin_private("Ticket [TicketHref("#[id]")] deferred to mentors by [usr.key].") log_ahelp(id, "Defer", "Deferred to mentors by [usr.key]", null, usr.ckey) Close(silent = TRUE) diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index e00f4a2d1263..3f0775c0b65d 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -143,6 +143,7 @@ assets = list( "wylogo.png" = 'html/images/wylogo.png', "uscmlogo.png" = 'html/images/uscmlogo.png', + "upplogo.png" = 'html/images/upplogo.png', "faxwylogo.png" = 'html/images/faxwylogo.png', "faxbackground.jpg" = 'html/images/faxbackground.jpg', ) @@ -204,10 +205,10 @@ /datum/asset/spritesheet/playtime_rank/register() var/icon_file = 'icons/mob/hud/hud.dmi' - var/tier1_state = "hudxenoupgrade1" - var/tier2_state = "hudxenoupgrade2" - var/tier3_state = "hudxenoupgrade3" - var/tier4_state = "hudxenoupgrade4" + var/tier1_state = "hudxenoupgrade2" + var/tier2_state = "hudxenoupgrade3" + var/tier3_state = "hudxenoupgrade4" + var/tier4_state = "hudxenoupgrade5" var/icon/tier1_icon = icon(icon_file, tier1_state, SOUTH) var/icon/tier2_icon = icon(icon_file, tier2_state, SOUTH) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 16afa8d1b4f2..4f1161709657 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1955,11 +1955,17 @@ var/const/MAX_SAVE_SLOTS = 10 load_character(slot_for_job) /// Transfers both physical characteristics and character information to character -/datum/preferences/proc/copy_all_to(mob/living/carbon/human/character, job_title, is_late_join = FALSE) +/datum/preferences/proc/copy_all_to(mob/living/carbon/human/character, job_title, is_late_join = FALSE, check_datacore = FALSE) if(!istype(character)) return find_assigned_slot(job_title, is_late_join) + if(check_datacore && !(be_random_body && be_random_name)) + for(var/datum/data/record/record as anything in GLOB.data_core.locked) + if(record.fields["name"] == real_name) + be_random_body = TRUE + be_random_name = TRUE + break if(be_random_name) real_name = random_name(gender) @@ -1987,10 +1993,11 @@ var/const/MAX_SAVE_SLOTS = 10 character.flavor_texts["legs"] = flavor_texts["legs"] character.flavor_texts["feet"] = flavor_texts["feet"] - character.med_record = strip_html(med_record) - character.sec_record = strip_html(sec_record) - character.gen_record = strip_html(gen_record) - character.exploit_record = strip_html(exploit_record) + if(!be_random_name) + character.med_record = strip_html(med_record) + character.sec_record = strip_html(sec_record) + character.gen_record = strip_html(gen_record) + character.exploit_record = strip_html(exploit_record) character.age = age character.gender = gender diff --git a/code/modules/clothing/suits/marine_armor.dm b/code/modules/clothing/suits/marine_armor.dm index 713b6df355c2..20004e0367fb 100644 --- a/code/modules/clothing/suits/marine_armor.dm +++ b/code/modules/clothing/suits/marine_armor.dm @@ -271,7 +271,7 @@ /obj/item/clothing/suit/storage/marine/rto/intel name = "\improper XM4 pattern intelligence officer armor" - uniform_restricted = list(/obj/item/clothing/under/marine/officer, /obj/item/clothing/under/rank/ro_suit, /obj/item/clothing/under/marine/officer/intel) + uniform_restricted = list(/obj/item/clothing/under/marine/officer, /obj/item/clothing/under/rank/qm_suit, /obj/item/clothing/under/marine/officer/intel) specialty = "XM4 pattern intel" /obj/item/clothing/suit/storage/marine/MP @@ -347,7 +347,7 @@ icon_state = "officer" storage_slots = 3 flags_atom = null - uniform_restricted = list(/obj/item/clothing/under/marine/officer, /obj/item/clothing/under/rank/ro_suit, /obj/item/clothing/under/rank/chief_medical_officer) + uniform_restricted = list(/obj/item/clothing/under/marine/officer, /obj/item/clothing/under/rank/qm_suit, /obj/item/clothing/under/rank/chief_medical_officer) specialty = "M2 pattern officer" item_state_slots = list(WEAR_JACKET = "officer") @@ -362,7 +362,7 @@ storage_slots = 3 flags_atom = NO_SNOW_TYPE flags_inventory = BLOCKSHARPOBJ|SMARTGUN_HARNESS - uniform_restricted = list(/obj/item/clothing/under/marine, /obj/item/clothing/under/rank/ro_suit) + uniform_restricted = list(/obj/item/clothing/under/marine, /obj/item/clothing/under/rank/qm_suit) specialty = "M3 pattern captain" item_state_slots = list(WEAR_JACKET = "co_officer") valid_accessory_slots = list(ACCESSORY_SLOT_MEDAL, ACCESSORY_SLOT_RANK, ACCESSORY_SLOT_DECOR, ACCESSORY_SLOT_PONCHO) @@ -1516,7 +1516,7 @@ pockets.max_storage_space = 8 /obj/item/clothing/suit/storage/RO - name = "\improper RO jacket" + name = "quartermaster jacket" desc = "A green jacket worn by USCM personnel. The back has the flag of the United Americas on it." icon_state = "RO_jacket" blood_overlay_type = "coat" diff --git a/code/modules/clothing/suits/marine_coat.dm b/code/modules/clothing/suits/marine_coat.dm index 3113b38e6e41..4ca2a54af4bf 100644 --- a/code/modules/clothing/suits/marine_coat.dm +++ b/code/modules/clothing/suits/marine_coat.dm @@ -217,6 +217,13 @@ icon_state = "bridge_coat_grey" valid_accessory_slots = list(ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_RANK, ACCESSORY_SLOT_MEDAL) +/obj/item/clothing/suit/storage/jacket/marine/service/aso + name = "auxiliary support officer jacket" + desc = "A comfortable vest for officers who are expected to work long hours staring at rows of numbers and inspecting equipment from knives to torpedos to entire dropships." + icon_state = "aso_jacket" + blood_overlay_type = "coat" + flags_armor_protection = BODY_FLAG_CHEST + has_buttons = FALSE //=========================//PROVOST\\================================\\ diff --git a/code/modules/clothing/under/marine_uniform.dm b/code/modules/clothing/under/marine_uniform.dm index eca050cc4b88..a4b38b657735 100644 --- a/code/modules/clothing/under/marine_uniform.dm +++ b/code/modules/clothing/under/marine_uniform.dm @@ -527,7 +527,7 @@ min_cold_protection_temperature = ICE_PLANET_MIN_COLD_PROT has_sensor = UNIFORM_HAS_SENSORS sensor_faction = FACTION_UPP - suit_restricted = list(/obj/item/clothing/suit/storage/marine/faction/UPP, /obj/item/clothing/suit/gimmick/jason, /obj/item/clothing/suit/storage/snow_suit/soviet, /obj/item/clothing/suit/storage/snow_suit/survivor) + suit_restricted = list(/obj/item/clothing/suit/storage/marine/faction/UPP, /obj/item/clothing/suit/gimmick/jason, /obj/item/clothing/suit/storage/snow_suit/soviet, /obj/item/clothing/suit/storage/snow_suit/survivor, /obj/item/clothing/suit/storage/webbing) flags_jumpsuit = UNIFORM_SLEEVE_ROLLABLE /obj/item/clothing/under/marine/veteran/UPP/medic @@ -839,9 +839,9 @@ desc = "A formal white undersuit." flags_jumpsuit = FALSE -/obj/item/clothing/under/rank/ro_suit - name = "requisition officer suit" - desc = "A nicely-fitting military suit for a requisition officer. It has shards of light Kevlar to help protect against stabbing weapons and bullets." +/obj/item/clothing/under/rank/qm_suit + name = "quartermaster suit" + desc = "A nicely-fitting military suit for a quartermaster. It has shards of light Kevlar to help protect against stabbing weapons and bullets." icon_state = "RO_jumpsuit" worn_state = "RO_jumpsuit" flags_jumpsuit = UNIFORM_SLEEVE_ROLLABLE diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm index d42e7d17bfd2..329e2055778e 100644 --- a/code/modules/clothing/under/ties.dm +++ b/code/modules/clothing/under/ties.dm @@ -359,6 +359,11 @@ desc = "A fire-resistant shoulder patch, worn by the men and women of the USS Hanyut, USCM FORECON." icon_state = "forecon_patch" +/obj/item/clothing/accessory/patch/upp + name = "UPP Airborne Reconnaissance patch" + desc = "A fire-resistant shoulder patch, worn by the men and women of the 173rd Airborne Reconnaissance Platoon." + icon_state = "upppatch" + /obj/item/clothing/accessory/poncho name = "USCM Poncho" desc = "The standard USCM poncho has variations for every climate. Custom fitted to be attached to standard USCM armor variants it is comfortable, warming or cooling as needed, and well-fit. A marine couldn't ask for more. Affectionately referred to as a \"woobie\"." diff --git a/code/modules/cm_aliens/structures/special/pylon_core.dm b/code/modules/cm_aliens/structures/special/pylon_core.dm index 993d4f833fa6..068ffeb659eb 100644 --- a/code/modules/cm_aliens/structures/special/pylon_core.dm +++ b/code/modules/cm_aliens/structures/special/pylon_core.dm @@ -12,6 +12,7 @@ block_range = 0 var/cover_range = WEED_RANGE_PYLON var/node_type = /obj/effect/alien/weeds/node/pylon + var/obj/effect/alien/weeds/node/node var/linked_turfs = list() var/damaged = FALSE @@ -25,7 +26,7 @@ /obj/effect/alien/resin/special/pylon/Initialize(mapload, hive_ref) . = ..() - place_node() + node = place_node() for(var/turf/A in range(round(cover_range*PYLON_COVERAGE_MULT), loc)) LAZYADD(A.linked_pylons, src) linked_turfs += A @@ -34,9 +35,8 @@ for(var/turf/A as anything in linked_turfs) LAZYREMOVE(A.linked_pylons, src) - var/obj/effect/alien/weeds/node/pylon/W = locate() in loc - if(W) - qdel(W) + if(node) + QDEL_NULL(node) . = ..() /obj/effect/alien/resin/special/pylon/attack_alien(mob/living/carbon/xenomorph/M) @@ -87,8 +87,78 @@ playsound(loc, "alien_resin_build", 25) /obj/effect/alien/resin/special/pylon/proc/place_node() - var/obj/effect/alien/weeds/node/pylon/W = new node_type(loc, null, null, linked_hive) - W.resin_parent = src + var/obj/effect/alien/weeds/node/pylon/pylon_node = new node_type(loc, null, null, linked_hive) + pylon_node.resin_parent = src + return pylon_node + +/obj/effect/alien/resin/special/pylon/endgame + cover_range = WEED_RANGE_CORE + var/activated = FALSE + +/obj/effect/alien/resin/special/pylon/endgame/Destroy() + if(activated) + activated = FALSE + + if(hijack_delete) + return ..() + + marine_announcement("ALERT.\n\nEnergy build up around communication relay at [get_area(src)] halted.", "[MAIN_AI_SYSTEM] Biological Scanner") + + for(var/hivenumber in GLOB.hive_datum) + var/datum/hive_status/checked_hive = GLOB.hive_datum[hivenumber] + if(!length(checked_hive.totalXenos)) + continue + + if(checked_hive == linked_hive) + xeno_announcement(SPAN_XENOANNOUNCE("We have lost our control of the tall's communication relay at [get_area(src)]."), hivenumber, XENO_GENERAL_ANNOUNCE) + else + xeno_announcement(SPAN_XENOANNOUNCE("Another hive has lost control of the tall's communication relay at [get_area(src)]."), hivenumber, XENO_GENERAL_ANNOUNCE) + + return ..() + +/// Checks if all comms towers are connected and then starts end game content on all pylons if they are +/obj/effect/alien/resin/special/pylon/endgame/proc/comms_relay_connection() + marine_announcement("ALERT.\n\nIrregular build up of energy around communication relays at [get_area(src)].", "[MAIN_AI_SYSTEM] Biological Scanner") + + for(var/hivenumber in GLOB.hive_datum) + var/datum/hive_status/checked_hive = GLOB.hive_datum[hivenumber] + if(!length(checked_hive.totalXenos)) + continue + + if(checked_hive == linked_hive) + xeno_announcement(SPAN_XENOANNOUNCE("We have harnessed the tall's communication relay at [get_area(src)]. Hold it!"), hivenumber, XENO_GENERAL_ANNOUNCE) + else + xeno_announcement(SPAN_XENOANNOUNCE("Another hive has harnessed the tall's communication relay at [get_area(src)].[linked_hive.faction_is_ally(checked_hive.name) ? "" : " Stop them!"]"), hivenumber, XENO_GENERAL_ANNOUNCE) + + activated = TRUE + addtimer(CALLBACK(src, PROC_REF(give_larva)), XENO_PYLON_ACTIVATION_COOLDOWN, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_LOOP|TIMER_DELETE_ME) + +#define ENDGAME_LARVA_CAP_MULTIPLIER 0.4 +#define LARVA_ADDITION_MULTIPLIER 0.10 + +/// Looped proc via timer to give larva after time +/obj/effect/alien/resin/special/pylon/endgame/proc/give_larva() + if(!activated) + return + + if(!linked_hive.hive_location || !linked_hive.living_xeno_queen) + return + + var/list/hive_xenos = linked_hive.totalXenos + + for(var/mob/living/carbon/xenomorph/xeno in hive_xenos) + if(!xeno.counts_for_slots) + hive_xenos -= xeno + + if(length(hive_xenos) > (length(GLOB.alive_human_list) * ENDGAME_LARVA_CAP_MULTIPLIER)) + return + + linked_hive.partial_larva += length(hive_xenos) * LARVA_ADDITION_MULTIPLIER + linked_hive.convert_partial_larva_to_full_larva() + linked_hive.hive_ui.update_burrowed_larva() + +#undef ENDGAME_LARVA_CAP_MULTIPLIER +#undef LARVA_ADDITION_MULTIPLIER //Hive Core - Generates strong weeds, supports other buildings /obj/effect/alien/resin/special/pylon/core diff --git a/code/modules/cm_aliens/structures/special_structure.dm b/code/modules/cm_aliens/structures/special_structure.dm index caa729f1df87..69bdcc2438ac 100644 --- a/code/modules/cm_aliens/structures/special_structure.dm +++ b/code/modules/cm_aliens/structures/special_structure.dm @@ -39,6 +39,9 @@ plane = FLOOR_PLANE + /// Tells the structure if they are being deleted because of hijack + var/hijack_delete = FALSE + /obj/effect/alien/resin/special/Initialize(mapload, hive_ref) . = ..() maxhealth = health diff --git a/code/modules/cm_aliens/weeds.dm b/code/modules/cm_aliens/weeds.dm index f20fa842e446..01140beae304 100644 --- a/code/modules/cm_aliens/weeds.dm +++ b/code/modules/cm_aliens/weeds.dm @@ -55,7 +55,7 @@ linked_hive = GLOB.hive_datum[hivenumber] set_hive_data(src, hivenumber) - if(spread_on_semiweedable) + if(spread_on_semiweedable && weed_strength < WEED_LEVEL_HIVE) if(color) var/list/RGB = ReadRGB(color) RGB[1] = Clamp(RGB[1] + 35, 0, 255) @@ -588,9 +588,13 @@ weed_strength = WEED_LEVEL_HIVE node_range = WEED_RANGE_PYLON overlay_node = FALSE + spread_on_semiweedable = TRUE var/obj/effect/alien/resin/special/resin_parent /obj/effect/alien/weeds/node/pylon/proc/set_parent_damaged() + if(!resin_parent) + return + var/obj/effect/alien/resin/special/pylon/parent_pylon = resin_parent parent_pylon.damaged = TRUE @@ -616,7 +620,13 @@ /obj/effect/alien/weeds/node/pylon/acid_spray_act() return +/obj/effect/alien/weeds/node/pylon/cluster + spread_on_semiweedable = FALSE + /obj/effect/alien/weeds/node/pylon/cluster/set_parent_damaged() + if(!resin_parent) + return + var/obj/effect/alien/resin/special/cluster/parent_cluster = resin_parent parent_cluster.damaged = TRUE diff --git a/code/modules/cm_marines/Donator_Items.dm b/code/modules/cm_marines/Donator_Items.dm index 47380ca2c84a..58b8d448a92f 100644 --- a/code/modules/cm_marines/Donator_Items.dm +++ b/code/modules/cm_marines/Donator_Items.dm @@ -55,6 +55,8 @@ //DON'T GRAB STUFF BETWEEN THIS LINE flags_inventory = ALLOWREBREATH flags_inv_hide = HIDEEARS|HIDEEYES|HIDEFACE + flags_cold_protection = BODY_FLAG_HEAD + min_cold_protection_temperature = ICE_PLANET_MIN_COLD_PROT //AND THIS LINE //END MASK TEMPLATE diff --git a/code/modules/cm_marines/equipment/guncases.dm b/code/modules/cm_marines/equipment/guncases.dm index ff4d8397be26..8538af7ca90e 100644 --- a/code/modules/cm_marines/equipment/guncases.dm +++ b/code/modules/cm_marines/equipment/guncases.dm @@ -58,13 +58,15 @@ /obj/item/storage/box/guncase/lmg name = "\improper M41AE2 heavy pulse rifle case" desc = "A gun case containing the M41AE2 heavy pulse rifle. You can get additional ammunition at requisitions." - storage_slots = 3 + storage_slots = 5 can_hold = list(/obj/item/weapon/gun/rifle/lmg, /obj/item/ammo_magazine/rifle/lmg) /obj/item/storage/box/guncase/lmg/fill_preset_inventory() new /obj/item/weapon/gun/rifle/lmg(src) new /obj/item/ammo_magazine/rifle/lmg(src) new /obj/item/ammo_magazine/rifle/lmg/holo_target(src) + new /obj/item/attachable/flashlight + new /obj/item/attachable/bipod //------------ /obj/item/storage/box/guncase/m41aMK1 diff --git a/code/modules/cm_marines/marines_consoles.dm b/code/modules/cm_marines/marines_consoles.dm index 36535a0b5141..ad0ebac8307b 100644 --- a/code/modules/cm_marines/marines_consoles.dm +++ b/code/modules/cm_marines/marines_consoles.dm @@ -679,11 +679,13 @@ idle_power_usage = 250 active_power_usage = 500 var/faction = FACTION_MARINE + /// What type of /datum/crewmonitor this will create + var/crewmonitor_type = /datum/crewmonitor /obj/structure/machinery/computer/crew/Initialize() . = ..() if(!GLOB.crewmonitor[faction]) - GLOB.crewmonitor[faction] = new /datum/crewmonitor(faction) + GLOB.crewmonitor[faction] = new crewmonitor_type(faction) /obj/structure/machinery/computer/crew/attack_remote(mob/living/user) attack_hand(user) @@ -714,6 +716,12 @@ icon_state = "cmonitor" density = FALSE +/obj/structure/machinery/computer/crew/alt/yautja + name = "\improper Yautja health monitor" + desc = "Used to monitor active health sensors of all Yautja in the system. You can see that the console highlights the human's ship areas with BLUE and the hunting locations with RED." + faction = FACTION_YAUTJA + crewmonitor_type = /datum/crewmonitor/yautja + /obj/structure/machinery/computer/crew/upp faction = FACTION_UPP @@ -790,7 +798,7 @@ GLOBAL_LIST_EMPTY_TYPED(crewmonitor, /datum/crewmonitor) /datum/crewmonitor/ui_data(mob/user) . = list( "sensors" = update_data(), - "link_allowed" = isAI(user) + "link_allowed" = isAI(user), ) /datum/crewmonitor/proc/update_data() @@ -902,10 +910,11 @@ GLOBAL_LIST_EMPTY_TYPED(crewmonitor, /datum/crewmonitor) RAIDER_OFFICER_SQUAD = 11, JOB_SO = 12, JOB_SEA = 13, - // 20-29: Aux Command (Synth isn't Aux head, but important - make him bold) - JOB_SYNTH = 20, - JOB_PILOT = 21, - JOB_DROPSHIP_CREW_CHIEF = 22, + // 20-29: Aux Command + JOB_AUXILIARY_OFFICER = 20, + JOB_SYNTH = 21, + JOB_PILOT = 22, + JOB_DROPSHIP_CREW_CHIEF = 23, JOB_INTEL = 24, // 30-39: Security JOB_CHIEF_POLICE = 30, @@ -929,11 +938,11 @@ GLOBAL_LIST_EMPTY_TYPED(crewmonitor, /datum/crewmonitor) // 60-69: Cargo JOB_CHIEF_REQUISITION = 60, JOB_CARGO_TECH = 61, + JOB_MESS_SERGEANT = 62, // 70-139: SQUADS (look below) // 140+: Civilian/other JOB_CORPORATE_LIAISON = 140, - JOB_MESS_SERGEANT = 141, - JOB_PASSENGER = 142, + JOB_PASSENGER = 141, // Non Almayer jobs lower then registered JOB_SYNTH_SURVIVOR = 150, JOB_SURVIVOR = 151, @@ -1102,6 +1111,51 @@ GLOBAL_LIST_EMPTY_TYPED(crewmonitor, /datum/crewmonitor) else jobs = list() +/datum/crewmonitor/yautja + faction = FACTION_YAUTJA + +/datum/crewmonitor/yautja/update_data() + var/list/results = list() + for(var/mob/living/carbon/human/human_mob as anything in GLOB.human_mob_list) + + if(!isyautja(human_mob)) + continue + + if(faction != human_mob.faction) + continue + + // Check if z-level is correct + var/turf/pos = get_turf(human_mob) + if(!pos) + continue + + // The entry for this human + var/list/entry = list( + "ref" = REF(human_mob), + "name" = human_mob.real_name, + "ijob" = UNKNOWN_JOB_ID, + "assignment" = "Hunter", + "oxydam" = round(human_mob.getOxyLoss(), 1), + "toxdam" = round(human_mob.getToxLoss(), 1), + "burndam" = round(human_mob.getFireLoss(), 1), + "brutedam" = round(human_mob.getBruteLoss(), 1), + "can_track" = TRUE, + ) + + if(is_mainship_level(pos.z)) + entry["side"] = "Almayer" + + var/area/mob_area = get_area(human_mob) + entry["area"] = sanitize_area(mob_area.name) + + results[++results.len] = entry + + // Cache result + data = results + last_update = world.time + + return results + #undef SENSOR_LIVING #undef SENSOR_VITALS #undef SENSOR_COORDS diff --git a/code/modules/cm_phone/phone.dm b/code/modules/cm_phone/phone.dm index ac00e717f79a..b3e0ecd87206 100644 --- a/code/modules/cm_phone/phone.dm +++ b/code/modules/cm_phone/phone.dm @@ -312,6 +312,7 @@ GLOBAL_LIST_EMPTY_TYPED(transmitters, /obj/structure/transmitter) P.handle_hear(message, L, speaking) attached_to.handle_hear(message, L, speaking) + log_say("TELEPHONE: [key_name(speaking)] on Phone '[phone_id]' to '[T.phone_id]' said '[message]'") /obj/structure/transmitter/attackby(obj/item/W, mob/user) if(W == attached_to) diff --git a/code/modules/cm_preds/falcon.dm b/code/modules/cm_preds/falcon.dm index 19977a7bd84a..4461f9b4f7e7 100644 --- a/code/modules/cm_preds/falcon.dm +++ b/code/modules/cm_preds/falcon.dm @@ -68,6 +68,7 @@ var/obj/item/falcon_drone/parent_drone var/obj/item/clothing/gloves/yautja/owned_bracers desc = "An agile drone used by Yautja to survey the hunting grounds." + motion_sensed = TRUE /mob/hologram/falcon/Initialize(mapload, mob/M, obj/item/falcon_drone/drone, obj/item/clothing/gloves/yautja/bracers) . = ..() diff --git a/code/modules/cm_preds/yaut_bracers.dm b/code/modules/cm_preds/yaut_bracers.dm index f33d5f9a5554..305badf6fceb 100644 --- a/code/modules/cm_preds/yaut_bracers.dm +++ b/code/modules/cm_preds/yaut_bracers.dm @@ -46,6 +46,8 @@ var/mob/living/carbon/human/owner //Pred spawned on, or thrall given to. var/obj/item/clothing/gloves/yautja/linked_bracer //Bracer linked to this one (thrall or mentor). COOLDOWN_DECLARE(bracer_recharge) + /// What minimap icon this bracer should have + var/minimap_icon = "predator" /obj/item/clothing/gloves/yautja/equipped(mob/user, slot) . = ..() @@ -54,6 +56,8 @@ if(!owner) owner = user toggle_lock_internal(user, TRUE) + RegisterSignal(user, list(COMSIG_MOB_STAT_SET_ALIVE, COMSIG_MOB_DEATH), PROC_REF(update_minimap_icon)) + INVOKE_NEXT_TICK(src, PROC_REF(update_minimap_icon), user) /obj/item/clothing/gloves/yautja/Destroy() STOP_PROCESSING(SSobj, src) @@ -65,6 +69,8 @@ /obj/item/clothing/gloves/yautja/dropped(mob/user) STOP_PROCESSING(SSobj, src) flags_item = initial(flags_item) + UnregisterSignal(user, list(COMSIG_MOB_STAT_SET_ALIVE, COMSIG_MOB_DEATH)) + SSminimaps.remove_marker(user) ..() /obj/item/clothing/gloves/yautja/pickup(mob/living/user) @@ -94,7 +100,7 @@ return if(human_holder.stat == DEAD) decloak(human_holder, TRUE) - if(!HAS_TRAIT(human_holder, TRAIT_YAUTJA_TECH) && !human_holder.hunter_data.thralled && prob(15)) + if(!HAS_TRAIT(human_holder, TRAIT_YAUTJA_TECH) && !human_holder.hunter_data.thralled && prob(2)) decloak(human_holder) shock_user(human_holder) @@ -102,6 +108,27 @@ /obj/item/clothing/gloves/yautja/proc/decloak() return +/// Called to update the minimap icon of the predator +/obj/item/clothing/gloves/yautja/proc/update_minimap_icon() + if(!ishuman(owner)) + return + + var/mob/living/carbon/human/human_owner = owner + var/turf/wearer_turf = get_turf(owner) + SSminimaps.remove_marker(owner) + if(!isyautja(owner)) + if(owner.stat >= DEAD) + if(human_owner.undefibbable) + SSminimaps.add_marker(owner, wearer_turf.z, MINIMAP_FLAG_YAUTJA, "bracer_stolen", 'icons/ui_icons/map_blips.dmi', overlay_iconstates = list("undefibbable")) + else + SSminimaps.add_marker(owner, wearer_turf.z, MINIMAP_FLAG_YAUTJA, "bracer_stolen", 'icons/ui_icons/map_blips.dmi', overlay_iconstates = list("defibbable")) + else + SSminimaps.add_marker(owner, wearer_turf.z, MINIMAP_FLAG_YAUTJA, "bracer_stolen", 'icons/ui_icons/map_blips.dmi') + else + if(owner?.stat >= DEAD) + SSminimaps.add_marker(owner, wearer_turf.z, MINIMAP_FLAG_YAUTJA, minimap_icon, 'icons/ui_icons/map_blips.dmi', overlay_iconstates = list("undefibbable")) //defib/undefib status doesn't really matter because they're gonna explode in the end regardless + else + SSminimaps.add_marker(owner, wearer_turf.z, MINIMAP_FLAG_YAUTJA, minimap_icon, 'icons/ui_icons/map_blips.dmi') /* *This is the main proc for checking AND draining the bracer energy. It must have human passed as an argument. *It can take a negative value in amount to restore energy. @@ -193,8 +220,23 @@ desc = "A pair of strange alien bracers, adapted for human biology." color = "#b85440" + minimap_icon = "thrall" +/obj/item/clothing/gloves/yautja/thrall/update_minimap_icon() + if(!ishuman(owner)) + return + + var/mob/living/carbon/human/human_owner = owner + var/turf/wearer_turf = get_turf(owner) + if(owner.stat >= DEAD) + if(human_owner.undefibbable) + SSminimaps.add_marker(owner, wearer_turf.z, MINIMAP_FLAG_YAUTJA, minimap_icon, overlay_iconstates = list("undefibbable")) + else + SSminimaps.add_marker(owner, wearer_turf.z, MINIMAP_FLAG_YAUTJA, minimap_icon, overlay_iconstates = list("defibbable")) + else + SSminimaps.add_marker(owner, wearer_turf.z, MINIMAP_FLAG_YAUTJA, minimap_icon) + /obj/item/clothing/gloves/yautja/hunter name = "clan bracers" desc = "An extremely complex, yet simple-to-operate set of armored bracers worn by the Yautja. It has many functions, activate them to use some." @@ -293,7 +335,7 @@ var/mob/living/carbon/human/human = loc //Non-Yautja have a chance to get stunned with each power drain - if((!HAS_TRAIT(human, TRAIT_YAUTJA_TECH) && !human.hunter_data.thralled) && prob(15)) + if((!HAS_TRAIT(human, TRAIT_YAUTJA_TECH) && !human.hunter_data.thralled) && prob(4)) if(cloaked) decloak(human, TRUE, DECLOAK_SPECIES) shock_user(human) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index d5f009912b6a..96a32d414d1d 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -889,7 +889,7 @@ /obj/item/weapon/gun/energy/yautja/plasmarifle name = "plasma rifle" - desc = "A long-barreled heavy plasma weapon capable of taking down large game. It has a mounted scope for distant shots and an integrated battery." + desc = "A long-barreled heavy plasma weapon. Intended for combat, not hunting. Has an integrated battery that allows for a functionally unlimited amount of shots to be discharged. Equipped with an internal gyroscopic stabilizer allowing its operator to fire the weapon one-handed if desired" icon_state = "plasmarifle" item_state = "plasmarifle" unacidable = TRUE @@ -902,8 +902,9 @@ var/charge_time = 0 var/last_regen = 0 flags_gun_features = GUN_UNUSUAL_DESIGN - flags_item = ITEM_PREDATOR + flags_item = ITEM_PREDATOR|TWOHANDED has_unique_action = FALSE + flags_item = ITEM_PREDATOR|TWOHANDED /obj/item/weapon/gun/energy/yautja/plasmarifle/Initialize(mapload, spawn_empty) . = ..() @@ -955,12 +956,8 @@ return ..() /obj/item/weapon/gun/energy/yautja/plasmarifle/load_into_chamber() - if(charge_time >= 80) - ammo = GLOB.ammo_list[/datum/ammo/energy/yautja/rifle/blast] - charge_time -= 80 - else - ammo = GLOB.ammo_list[/datum/ammo/energy/yautja/rifle/bolt] - charge_time -= 10 + ammo = GLOB.ammo_list[/datum/ammo/energy/yautja/rifle/bolt] + charge_time -= 10 var/obj/item/projectile/projectile = create_bullet(ammo, initial(name)) projectile.SetLuminosity(1) in_chamber = projectile diff --git a/code/modules/cm_tech/hologram.dm b/code/modules/cm_tech/hologram.dm index 83cc0937b46e..5c0e986f45b2 100644 --- a/code/modules/cm_tech/hologram.dm +++ b/code/modules/cm_tech/hologram.dm @@ -1,4 +1,4 @@ -GLOBAL_LIST_EMPTY(hologram_list) +GLOBAL_LIST_EMPTY_TYPED(hologram_list, /mob/hologram) /mob/hologram name = "Hologram" @@ -16,6 +16,8 @@ GLOBAL_LIST_EMPTY(hologram_list) var/mob/linked_mob var/datum/action/leave_hologram/leave_button + ///If can be detected on motion detectors. + var/motion_sensed = FALSE /mob/hologram/movement_delay() . = -2 // Very fast speed, so they can navigate through easily, they can't ever have movement delay whilst as a hologram diff --git a/code/modules/gear_presets/_select_equipment.dm b/code/modules/gear_presets/_select_equipment.dm index fc70e5fc90bb..94a628553252 100644 --- a/code/modules/gear_presets/_select_equipment.dm +++ b/code/modules/gear_presets/_select_equipment.dm @@ -952,3 +952,53 @@ var/list/rebel_rifles = list( list("Shoulder Holster", 10, /obj/item/clothing/accessory/storage/holster, null, VENDOR_ITEM_REGULAR), list("Webbing", 10, /obj/item/clothing/accessory/storage/webbing, null, VENDOR_ITEM_REGULAR) ) + +/datum/equipment_preset/proc/add_upp_weapon(mob/living/carbon/human/new_human) + var/random_gun = rand(1,3) + switch(random_gun) + if(1) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/type71(new_human), WEAR_L_HAND) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71(new_human), WEAR_IN_BACK) + if(2) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/type71/carbine(new_human), WEAR_L_HAND) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71(new_human), WEAR_IN_BACK) + if(3) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/type23(new_human), WEAR_L_HAND) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/heavy/buckshot(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/heavy/buckshot(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/heavy/buckshot(new_human), WEAR_IN_BACK) + +/datum/equipment_preset/proc/spawn_random_upp_headgear(mob/living/carbon/human/new_human) + var/random_hat = rand(1,10) + switch(random_hat) + if (1, 2) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/UPP(new_human), WEAR_HEAD) + if (3, 4, 5) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap(new_human), WEAR_HEAD) + if (6, 7) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap/beret(new_human), WEAR_HEAD) + if (8, 9) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap/ushanka(new_human), WEAR_HEAD) + +/datum/equipment_preset/proc/spawn_random_upp_armor(mob/living/carbon/human/new_human) + var/random_gear = rand(1, 4) + switch(random_gear) + if (1, 2, 3) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP (new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/webbing(new_human), WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar(new_human), WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/device/flashlight(new_human), WEAR_J_STORE) + if (4) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP (new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP(new_human), WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar(new_human), WEAR_IN_JACKET) + +/datum/equipment_preset/proc/spawn_random_upp_belt(mob/living/carbon/human/new_human) + var/random_gun = rand(1, 3) + switch(random_gun) + if (1, 2) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/NY(new_human), WEAR_WAIST) + if (3) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine/upp(new_human), WEAR_WAIST) diff --git a/code/modules/gear_presets/survivors.dm b/code/modules/gear_presets/survivors.dm index 8c6a118d24d4..9ab5e7c8d22c 100644 --- a/code/modules/gear_presets/survivors.dm +++ b/code/modules/gear_presets/survivors.dm @@ -1562,3 +1562,159 @@ new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/med_small_stack(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/m4a3/m1911(new_human), WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/cmcap(new_human), WEAR_HEAD) + + ..() + +/datum/equipment_preset/survivor/upp + name = "UPP Soldier" + paygrade = "UE1" + origin_override = ORIGIN_UPP + rank = JOB_SURVIVOR + skills = /datum/skills/military/survivor/upp_private + languages = list(LANGUAGE_RUSSIAN, LANGUAGE_GERMAN, LANGUAGE_CHINESE) + faction = FACTION_UPP + faction_group = list(FACTION_UPP, FACTION_SURVIVOR) + role_comm_title = "UPP 173RD RECON" + idtype = /obj/item/card/id/dogtag + flags = EQUIPMENT_PRESET_EXTRA + uses_special_name = TRUE + access = list( + ACCESS_CIVILIAN_PUBLIC, + ) + +/datum/equipment_preset/survivor/upp/load_name(mob/living/carbon/human/new_human, randomise) + var/random_name = capitalize(pick(new_human.gender == MALE ? first_names_male_upp : first_names_female_upp)) + " " + capitalize(pick(last_names_upp)) + new_human.change_real_name(new_human, random_name) + +/datum/equipment_preset/survivor/upp/load_gear(mob/living/carbon/human/new_human) + var/obj/item/clothing/under/marine/veteran/UPP/uniform = new() + var/random_number = rand(1,2) + switch(random_number) + if(1) + uniform.roll_suit_jacket(new_human) + if(2) + uniform.roll_suit_sleeves(new_human) + new_human.equip_to_slot_or_del(uniform, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp (new_human), WEAR_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp_knife(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flare(new_human), WEAR_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate(new_human), WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/five_slot(new_human), WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/med_small_stack(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/device/radio(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS) + +/datum/equipment_preset/survivor/upp/soldier + name = "Survivor - UPP Soldier" + paygrade = "UE2" + assignment = "UPP Soldier" + skills = /datum/skills/military/survivor/upp_private + +/datum/equipment_preset/survivor/upp/soldier/load_gear(mob/living/carbon/human/new_human) + var/obj/item/clothing/under/marine/veteran/UPP/uniform = new() + var/random_number = rand(1,2) + switch(random_number) + if(1) + uniform.roll_suit_jacket(new_human) + if(2) + uniform.roll_suit_sleeves(new_human) + new_human.equip_to_slot_or_del(uniform, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/five_slot(new_human), WEAR_BACK) + add_upp_weapon(new_human) + spawn_random_upp_headgear(new_human) + spawn_random_upp_armor(new_human) + spawn_random_upp_belt(new_human) + + ..() + +/datum/equipment_preset/survivor/upp/sapper + name = "Survivor - UPP Sapper" + paygrade = "UE3S" + assignment = "UPP Sapper" + skills = /datum/skills/military/survivor/upp_sapper + +/datum/equipment_preset/survivor/upp/sapper/load_gear(mob/living/carbon/human/new_human) + + var/obj/item/clothing/under/marine/veteran/UPP/engi/uniform = new() + var/R = rand(1,2) + switch(R) + if(1) + uniform.roll_suit_jacket(new_human) + if(2) + uniform.roll_suit_sleeves(new_human) + new_human.equip_to_slot_or_del(uniform, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/insulated(new_human), WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/utility/full(new_human), WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/welding(new_human), WEAR_EYES) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/five_slot(new_human), WEAR_BACK) + spawn_random_upp_armor(new_human) + add_upp_weapon(new_human) + spawn_random_upp_headgear(new_human) + + ..() + +/datum/equipment_preset/survivor/upp/medic + name = "Survivor - UPP Medic" + paygrade = "UE3M" + assignment = "UPP Medic" + skills = /datum/skills/military/survivor/upp_medic + +/datum/equipment_preset/survivor/upp/medic/load_gear(mob/living/carbon/human/new_human) + var/obj/item/clothing/under/marine/veteran/UPP/medic/uniform = new() + var/random_number = rand(1,2) + switch(random_number) + if(1) + uniform.roll_suit_jacket(new_human) + if(2) + uniform.roll_suit_sleeves(new_human) + new_human.equip_to_slot_or_del(uniform, WEAR_BODY) + new_human.equip_to_slot_or_del(new/obj/item/clothing/glasses/hud/health(new_human), WEAR_EYES) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/upp/partial(new_human), WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/medic/upp(new_human), WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/device/radio(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(new_human), WEAR_IN_BACK) + spawn_random_upp_armor(new_human) + add_upp_weapon(new_human) + spawn_random_upp_headgear(new_human) + + ..() + +/datum/equipment_preset/survivor/upp/specialist + name = "Survivor - UPP Specialist" + paygrade = "UE4" + assignment = "UPP Specialist" + skills = /datum/skills/military/survivor/upp_spec + +/datum/equipment_preset/survivor/upp/specialist/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/UPP/heavy(new_human), WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP (new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/heavy (new_human), WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar(new_human), WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/type71/flamer(new_human), WEAR_L_HAND) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/five_slot(new_human), WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/PK9(new_human), WEAR_WAIST) + + ..() + +/datum/equipment_preset/survivor/upp/squad_leader + name = "Survivor - UPP Squad Leader" + paygrade = "UE5" + languages = list(LANGUAGE_RUSSIAN, LANGUAGE_ENGLISH, LANGUAGE_GERMAN, LANGUAGE_CHINESE) + assignment = "UPP Squad Leader" + role_comm_title = "UPP 173Rd RECON SL" + skills = /datum/skills/military/survivor/upp_sl + +/datum/equipment_preset/survivor/upp/squad_leader/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/UPP/officer (new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/officer (new_human), WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar(new_human), WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap/beret(new_human), WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/five_slot(new_human), WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/type47/PK9(new_human), WEAR_WAIST) + add_upp_weapon(new_human) + + ..() diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm index eaf6299b88a8..eaab23630ed2 100644 --- a/code/modules/gear_presets/synths.dm +++ b/code/modules/gear_presets/synths.dm @@ -455,13 +455,51 @@ survivor_variant = ENGINEERING_SURVIVOR - faction = FACTION_SURVIVOR - faction_group = list(FACTION_SURVIVOR) - access = list(ACCESS_CIVILIAN_PUBLIC, ACCESS_CIVILIAN_COMMAND) +/datum/equipment_preset/synth/survivor/upp + name = "Survivor - Synthetic - UPP Synth" + flags = EQUIPMENT_PRESET_EXTRA + languages = ALL_SYNTH_LANGUAGES_UPP + assignment = JOB_UPP_COMBAT_SYNTH + rank = JOB_SURVIVOR + faction = FACTION_UPP + faction_group = list(FACTION_UPP, FACTION_SURVIVOR) + skills = /datum/skills/colonial_synthetic + paygrade = "SYN" + idtype = /obj/item/card/id/dogtag + role_comm_title = "UPP 173Rd RECON Syn" + +/datum/equipment_preset/synth/survivor/upp/load_gear(mob/living/carbon/human/new_human) + var/obj/item/clothing/under/marine/veteran/UPP/medic/uniform = new() + var/random_number = rand(1,2) + switch(random_number) + if(1) + uniform.roll_suit_jacket(new_human) + if(2) + uniform.roll_suit_sleeves(new_human) + new_human.equip_to_slot_or_del(uniform, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/uppcap/beret, WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/tool/screwdriver, WEAR_R_EAR) + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress, WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/upp, WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/roller, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/device/multitool, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/device/radio, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/stack/cable_coil, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/small_stack, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/webbing, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/device/flashlight, WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/upp/partial, WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp, WEAR_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/tools/uppsynth, WEAR_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) /datum/equipment_preset/synth/survivor/pmc name = "Survivor - Synthetic - PMC Support Synth" - + faction = FACTION_SURVIVOR + faction_group = list(FACTION_SURVIVOR) + access = list(ACCESS_CIVILIAN_PUBLIC, ACCESS_CIVILIAN_COMMAND) idtype = /obj/item/card/id/pmc assignment = JOB_PMC_SYNTH rank = JOB_PMC_SYNTH @@ -507,6 +545,7 @@ new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/hugetank, WEAR_IN_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/construction/full_barbed_wire, WEAR_R_STORE) + //*****************************************************************************************************/ /datum/equipment_preset/synth/working_joe diff --git a/code/modules/gear_presets/upp.dm b/code/modules/gear_presets/upp.dm index 2f7148302485..a43404c59450 100644 --- a/code/modules/gear_presets/upp.dm +++ b/code/modules/gear_presets/upp.dm @@ -1777,7 +1777,7 @@ name = "UPP Combat Synthetic" flags = EQUIPMENT_PRESET_EXTRA - languages = ALL_SYNTH_LANGUAGES + languages = ALL_SYNTH_LANGUAGES_UPP skills = /datum/skills/synthetic assignment = JOB_UPP_COMBAT_SYNTH diff --git a/code/modules/gear_presets/uscm_ship.dm b/code/modules/gear_presets/uscm_ship.dm index 75d661da503f..457ef71e9a46 100644 --- a/code/modules/gear_presets/uscm_ship.dm +++ b/code/modules/gear_presets/uscm_ship.dm @@ -193,7 +193,6 @@ ACCESS_MARINE_ENGINEERING, ACCESS_MARINE_COMMAND, ACCESS_CIVILIAN_ENGINEERING, - ACCESS_MARINE_SENIOR, ACCESS_MARINE_DATABASE, ACCESS_MARINE_MAINT, ACCESS_MARINE_OT, @@ -202,7 +201,7 @@ ) assignment = JOB_CHIEF_ENGINEER rank = JOB_CHIEF_ENGINEER - paygrade = "MO2" + paygrade = "MO1" role_comm_title = "CE" minimum_age = 27 skills = /datum/skills/CE @@ -261,6 +260,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/medium(new_human), WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/device/demo_scanner(new_human), WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/bag/trash(new_human), WEAR_L_HAND) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/engineerpack/welder_chestrig, (new_human), WEAR_R_HAND) /datum/equipment_preset/uscm_ship/maint/load_rank(mob/living/carbon/human/new_human) if(new_human.client) @@ -307,8 +307,8 @@ //*****************************************************************************************************/ -/datum/equipment_preset/uscm_ship/ro - name = "USCM Requisitions Officer (RO)" +/datum/equipment_preset/uscm_ship/qm + name = "USCM Quartermaster (QM)" flags = EQUIPMENT_PRESET_START_OF_ROUND|EQUIPMENT_PRESET_MARINE idtype = /obj/item/card/id/silver @@ -317,7 +317,6 @@ ACCESS_MARINE_RO, ACCESS_MARINE_COMMAND, ACCESS_MARINE_DATABASE, - ACCESS_MARINE_SENIOR, ACCESS_MARINE_ALPHA, ACCESS_MARINE_BRAVO, ACCESS_MARINE_CHARLIE, @@ -326,23 +325,23 @@ ) assignment = JOB_CHIEF_REQUISITION rank = JOB_CHIEF_REQUISITION - paygrade = "MO2" - role_comm_title = "RO" + paygrade = "ME7" + role_comm_title = "QM" minimum_age = 27 skills = /datum/skills/RO minimap_background = MINIMAP_ICON_BACKGROUND_CIC minimap_icon = list("ct" = MINIMAP_ICON_COLOR_HEAD) - utility_under = list(/obj/item/clothing/under/rank/ro_suit) + utility_under = list(/obj/item/clothing/under/rank/qm_suit) -/datum/equipment_preset/uscm_ship/ro/load_gear(mob/living/carbon/human/new_human) +/datum/equipment_preset/uscm_ship/qm/load_gear(mob/living/carbon/human/new_human) var/back_item = /obj/item/storage/backpack/marine/satchel/tech if (new_human.client && new_human.client.prefs && (new_human.client.prefs.backbag == 1)) back_item = /obj/item/storage/backpack/industrial - new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/ro(new_human), WEAR_L_EAR) - new_human.equip_to_slot_or_del(new /obj/item/clothing/under/rank/ro_suit(new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/qm(new_human), WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/rank/qm_suit(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow(new_human), WEAR_HANDS) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/cmcap/req(new_human), WEAR_HEAD) @@ -615,6 +614,63 @@ //*****************************************************************************************************/ +/datum/equipment_preset/uscm_ship/auxiliary_officer + name = "USCM Auxiliary Support Officer (ASO)" + flags = EQUIPMENT_PRESET_START_OF_ROUND|EQUIPMENT_PRESET_MARINE + + idtype = /obj/item/card/id/silver + assignment = JOB_AUXILIARY_OFFICER + rank = JOB_AUXILIARY_OFFICER + paygrade = "MO2" + role_comm_title = "ASO" + minimum_age = 27 + skills = /datum/skills/auxiliary_officer + + minimap_icon = list("cic" = MINIMAP_ICON_COLOR_SILVER) + minimap_background = MINIMAP_ICON_BACKGROUND_CIC + +/datum/equipment_preset/uscm_ship/auxiliary_officer/New() + . = ..() + access = list( + ACCESS_MARINE_SENIOR, + ACCESS_MARINE_ASO, + ACCESS_MARINE_COMMAND, + ACCESS_MARINE_BRIG, + ACCESS_MARINE_ARMORY, + ACCESS_MARINE_MEDBAY, + ACCESS_MARINE_CE, + ACCESS_MARINE_ENGINEERING, + ACCESS_MARINE_MAINT, + ACCESS_MARINE_OT, + ACCESS_MARINE_RO, + ACCESS_MARINE_CARGO, + ACCESS_MARINE_PREP, + ACCESS_MARINE_ALPHA, + ACCESS_MARINE_BRAVO, + ACCESS_MARINE_CHARLIE, + ACCESS_MARINE_DELTA, + ACCESS_MARINE_PILOT, + ACCESS_MARINE_DROPSHIP, + ACCESS_MARINE_KITCHEN, + ACCESS_PRESS, + ) + +/datum/equipment_preset/uscm_ship/auxiliary_officer/load_gear(mob/living/carbon/human/new_human) + var/back_item = /obj/item/storage/backpack/satchel + if (new_human.client && new_human.client.prefs && (new_human.client.prefs.backbag == 1)) + back_item = /obj/item/storage/backpack/marine + + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/mcom/alt(new_human), WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/officer/bridge(new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/jacket/marine/service/aso(new_human), WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new back_item(new_human), WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large(new_human), WEAR_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large(new_human), WEAR_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range(new_human), WEAR_L_STORE) + +//*****************************************************************************************************/ + /datum/equipment_preset/uscm_ship/po name = "USCM Pilot (DP) (Cryo)" flags = EQUIPMENT_PRESET_START_OF_ROUND|EQUIPMENT_PRESET_MARINE diff --git a/code/modules/law/laws/minor_crime.dm b/code/modules/law/laws/minor_crime.dm index 3fc257cf1cbf..651b9dd42d4f 100644 --- a/code/modules/law/laws/minor_crime.dm +++ b/code/modules/law/laws/minor_crime.dm @@ -50,3 +50,8 @@ desc = "To take items (or property) from another person or entity without their express permission, or to retain possession of items that have been taken without permission. This includes the removal of vendors from department areas without permission." special_punishment = "Return of Stolen Item" brig_time = 10 + +/datum/law/minor_law/false_testimony + name = "False Testimony" + desc = "To intentionally and willingly lie to an MP, or deputized officer, during a legal investigation with the intent to disrupt said investigation." + brig_time = 5 diff --git a/code/modules/law/laws/optional.dm b/code/modules/law/laws/optional.dm index b553d5530a12..942f824aae56 100644 --- a/code/modules/law/laws/optional.dm +++ b/code/modules/law/laws/optional.dm @@ -2,8 +2,8 @@ severity = OPTIONAL_CRIME /datum/law/optional_law/minor_unruly - name = "Minor Disordely Conduct in Confinement" - desc = "To cause disruption in a minor manner while in Brig and under arrest. Disruption is considered breaking Minor Law. This can be added on to any charge." + name = "Minor Disorderly Conduct in Confinement" + desc = "To cause disruption in a minor manner while in the Brig and under arrest. Disruption is considered breaking a Minor Law. This can be added on to any charge." brig_time = 7.5 /datum/law/optional_law/aiding name = "Aiding and Abetting" @@ -17,6 +17,6 @@ brig_time = 10 /datum/law/optional_law/major_unruly - name = "Major Disordely Conduct in Confinement" - desc = "To cause disruption in a major manner while in Brig and under arrest. Disruption is considered breaking Major Law. This can be added on to any charge." + name = "Major Disorderly Conduct in Confinement" + desc = "To cause disruption in a major manner while in the Brig and under arrest. Disruption is considered breaking a Major Law. This can be added on to any charge." brig_time = 15 diff --git a/code/modules/mob/camera/imaginary_friend.dm b/code/modules/mob/camera/imaginary_friend.dm index 054dd6ea8ff4..a78de70a7e15 100644 --- a/code/modules/mob/camera/imaginary_friend.dm +++ b/code/modules/mob/camera/imaginary_friend.dm @@ -200,6 +200,7 @@ to_chat(owner, "[rendered]") to_chat(src, "[rendered]") + log_say("Imaginary Friend: [dead_rendered]") if(!hidden) var/list/send_to = list() if(!owner.client?.prefs.lang_chat_disabled) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 9e8fa264af1d..ee36d25fc687 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -544,6 +544,27 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!istype(target)) return + if(check_client_rights(client, R_MOD, FALSE)) + view_health_scan(target) + return + + if(!mind.original) + view_health_scan(target) + return + + if(!ishuman(mind.original)) + view_health_scan(target) + return + + var/mob/living/carbon/human/original_human = mind.original + + if(!original_human.check_tod() || !original_human.is_revivable() || !can_reenter_corpse) + view_health_scan(target) + return + + to_chat(src, SPAN_NOTICE("You must be permanently unrevivable or unable to reenter your body to use the scan health verb.")) + +/mob/dead/observer/proc/view_health_scan(mob/living/target) if (!last_health_display) last_health_display = new(target) else diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index ffa3bd1b1977..a4eb3b99a13a 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -238,6 +238,10 @@ else hud_used.l_hand_hud_object.icon_state = "hand_inactive" hud_used.r_hand_hud_object.icon_state = "hand_active" + if(l_hand) + l_hand.hands_swapped(src) + if(r_hand) + r_hand.hands_swapped(src) return /mob/living/carbon/proc/activate_hand(selhand) //0 or "r" or "right" for right hand; 1 or "l" or "left" for left hand. diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d64e5d1bfde0..fded3d5e3f77 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -41,7 +41,7 @@ handle_chemicals_in_body(delta_time) //Organs and blood - handle_organs() + handle_organs(delta_time) handle_blood() //Random events (vomiting etc) diff --git a/code/modules/mob/living/carbon/human/life/handle_organs.dm b/code/modules/mob/living/carbon/human/life/handle_organs.dm index 8d0a0dbc3e15..2c978f2295ed 100644 --- a/code/modules/mob/living/carbon/human/life/handle_organs.dm +++ b/code/modules/mob/living/carbon/human/life/handle_organs.dm @@ -1,11 +1,11 @@ // Takes care of organ & limb related updates, such as broken and missing limbs -/mob/living/carbon/human/proc/handle_organs() +/mob/living/carbon/human/proc/handle_organs(delta_time) last_dam = getBruteLoss() + getFireLoss() + getToxLoss() // Processing internal organs is pretty cheap, do that first. for(var/datum/internal_organ/I as anything in internal_organs) - I.process() + I.process(delta_time) for(var/obj/limb/E as anything in limbs_to_process) if(!E) diff --git a/code/modules/mob/living/carbon/human/species/yautja/fake_sounds.dm b/code/modules/mob/living/carbon/human/species/yautja/fake_sounds.dm index f29a990b6254..80aa853c663f 100644 --- a/code/modules/mob/living/carbon/human/species/yautja/fake_sounds.dm +++ b/code/modules/mob/living/carbon/human/species/yautja/fake_sounds.dm @@ -2,21 +2,25 @@ category = YAUTJA_EMOTE_CATEGORY_FAKESOUND /datum/emote/living/carbon/human/yautja/fake_sound/aliengrowl + override_say = "Xenomorph growl" key = "aliengrowl" /datum/emote/living/carbon/human/yautja/fake_sound/aliengrowl/get_sound(mob/living/user) return pick('sound/voice/alien_growl1.ogg', 'sound/voice/alien_growl2.ogg') /datum/emote/living/carbon/human/yautja/fake_sound/alienhelp + override_say = "Xenomorph needs help" key = "alienhelp" /datum/emote/living/carbon/human/yautja/fake_sound/alienhelp/get_sound(mob/living/user) return pick('sound/voice/alien_help1.ogg', 'sound/voice/alien_help2.ogg') /datum/emote/living/carbon/human/yautja/fake_sound/malescream + override_say = "Human scream (male)" key = "malescream" sound = "male_scream" /datum/emote/living/carbon/human/yautja/fake_sound/femalescream + override_say = "Human scream (female)" key = "femalescream" sound = "female_scream" diff --git a/code/modules/mob/living/carbon/human/species/yautja/fake_voice.dm b/code/modules/mob/living/carbon/human/species/yautja/fake_voice.dm index 409fa83e7f1b..7e2c73fd41e4 100644 --- a/code/modules/mob/living/carbon/human/species/yautja/fake_voice.dm +++ b/code/modules/mob/living/carbon/human/species/yautja/fake_voice.dm @@ -2,49 +2,58 @@ category = YAUTJA_EMOTE_CATEGORY_VOICE /datum/emote/living/carbon/human/yautja/voice/anytime + override_say = "Anytime." key = "anytime" sound = 'sound/voice/pred_anytime.ogg' /datum/emote/living/carbon/human/yautja/voice/helpme + override_say = "Help me!" key = "helpme" sound = 'sound/voice/pred_helpme.ogg' volume = 25 /datum/emote/living/carbon/human/yautja/voice/iseeyou + override_say = "I see you." key = "iseeyou" sound = 'sound/hallucinations/i_see_you2.ogg' /datum/emote/living/carbon/human/yautja/voice/itsatrap + override_say = "It's a trap." key = "itsatrap" sound = 'sound/voice/pred_itsatrap.ogg' volume = 25 /datum/emote/living/carbon/human/yautja/voice/overhere + override_say = "Over here." key = "overhere" sound = 'sound/voice/pred_overhere.ogg' volume = 25 /datum/emote/living/carbon/human/yautja/voice/turnaround + override_say = "Turn around." key = "turnaround" sound = 'sound/voice/pred_turnaround.ogg' volume = 25 /datum/emote/living/carbon/human/yautja/voice/comeonout + override_say = "Come on out, motherfucker." key = "comeonout" sound = 'sound/voice/pred_come_on_out.ogg' /datum/emote/living/carbon/human/yautja/voice/overthere + override_say = "Over there." key = "overthere" sound = 'sound/voice/pred_over_there.ogg' /datum/emote/living/carbon/human/yautja/voice/uglyfreak + override_say = "Come on, you ugly freak." key = "uglyfreak" sound = 'sound/voice/pred_ugly_freak.ogg' diff --git a/code/modules/mob/living/carbon/xenomorph/Embryo.dm b/code/modules/mob/living/carbon/xenomorph/Embryo.dm index b599e9b5567a..4ce266f70596 100644 --- a/code/modules/mob/living/carbon/xenomorph/Embryo.dm +++ b/code/modules/mob/living/carbon/xenomorph/Embryo.dm @@ -147,59 +147,92 @@ affected_mob.take_limb_damage(1) if(5) become_larva() - if(6) + if(7) // Stage 6 is while we are trying to find a candidate in become_larva larva_autoburst_countdown-- if(!larva_autoburst_countdown) var/mob/living/carbon/xenomorph/larva/larva_embryo = locate() in affected_mob if(larva_embryo) larva_embryo.chest_burst(affected_mob) -//We look for a candidate. If found, we spawn the candidate as a larva -//Order of priority is bursted individual (if xeno is enabled), then random candidate, and then it's up for grabs and spawns braindead +///We look for a candidate. If found, we spawn the candidate as a larva +///Order of priority is bursted individual (if xeno is enabled), then player hugger, then random candidate, and then it's up for grabs and spawns braindead /obj/item/alien_embryo/proc/become_larva() // We do not allow chest bursts on the Centcomm Z-level, to prevent // stranded players from admin experiments and other issues if(!affected_mob || is_admin_level(affected_mob.z)) return - var/datum/hive_status/hive = GLOB.hive_datum[hivenumber] + stage = 6 // Increase the stage value to prevent this proc getting repeated + var/datum/hive_status/hive = GLOB.hive_datum[hivenumber] var/mob/picked + var/mob/dead/observer/hugger = null + var/is_nested = istype(affected_mob.buckled, /obj/structure/bed/nest) + // If the bursted person themselves has Xeno enabled, they get the honor of first dibs on the new larva. - if((!isyautja(affected_mob) || (isyautja(affected_mob) && prob(20))) && istype(affected_mob.buckled, /obj/structure/bed/nest)) + if((!isyautja(affected_mob) || (isyautja(affected_mob) && prob(20))) && is_nested) if(affected_mob.first_xeno || (affected_mob.client?.prefs?.be_special & BE_ALIEN_AFTER_DEATH && !jobban_isbanned(affected_mob, JOB_XENOMORPH))) picked = affected_mob else if(affected_mob.mind?.ghost_mob && affected_mob.client?.prefs?.be_special & BE_ALIEN_AFTER_DEATH && !jobban_isbanned(affected_mob, JOB_XENOMORPH)) picked = affected_mob.mind.ghost_mob // This currently doesn't look possible else if(affected_mob.persistent_ckey) for(var/mob/dead/observer/cur_obs as anything in GLOB.observer_list) + if(!cur_obs) + continue if(cur_obs.ckey != affected_mob.persistent_ckey) continue - if(cur_obs?.client?.prefs?.be_special & BE_ALIEN_AFTER_DEATH && !jobban_isbanned(cur_obs, JOB_XENOMORPH)) + if(cur_obs.client?.prefs?.be_special & BE_ALIEN_AFTER_DEATH && !jobban_isbanned(cur_obs, JOB_XENOMORPH)) picked = cur_obs break if(!picked) // Get a candidate from observers var/list/candidates = get_alien_candidates(hive) - if(candidates && candidates.len) + if(candidates && length(candidates)) // If they were facehugged by a player thats still in queue, they get second dibs on the new larva. if(hugger_ckey) for(var/mob/dead/observer/cur_obs as anything in candidates) if(cur_obs.ckey == hugger_ckey) - picked = cur_obs - candidates -= cur_obs - message_alien_candidates(candidates, dequeued = 0) - for(var/obj/item/alien_embryo/embryo as anything in GLOB.player_embryo_list) - if(embryo.hugger_ckey == cur_obs.ckey && embryo != src) - // Skipping src just in case an admin wants to quickly check before this thing fully deletes - // If this nulls out any embryo, wow - embryo.hugger_ckey = null + hugger = cur_obs + if(!is_nested) + cur_obs.ManualFollow(affected_mob) + if(cur_obs.client.prefs?.toggles_flashing & FLASH_POOLSPAWN) + window_flash(cur_obs.client) + if(is_nested || tgui_alert(cur_obs, "An unnested host you hugged is about to burst! Do you want to control the new larva?", "Larva maturation", list("Yes", "No"), 10 SECONDS) == "Yes") + picked = cur_obs + candidates -= cur_obs + message_alien_candidates(candidates, dequeued = 0) + for(var/obj/item/alien_embryo/embryo as anything in GLOB.player_embryo_list) + if(!embryo) + continue + if(embryo.hugger_ckey == cur_obs.ckey && embryo != src) + // Skipping src just in case an admin wants to quickly check before this thing fully deletes + // If this nulls out any embryo, wow + embryo.hugger_ckey = null break + // Get a candidate from the front of the queue if(!picked) - picked = candidates[1] - message_alien_candidates(candidates, dequeued = 1) + if(is_nested) + picked = candidates[1] + message_alien_candidates(candidates, dequeued = 1) + else + // Make up to 5 attempts from the queue for an unnested host + // At 10s per candidate, for 6 candidates (facehugger is the +1) this means we may have delayed an unnested autoburst up to 60 seconds + for(var/i in 1 to min(5, length(candidates))) + var/mob/dead/observer/cur_candidate = candidates[i] + if(!cur_candidate?.client) // Make sure they are still a valid candidate since tgui_alerts may have delayed us to this point + continue + if(cur_candidate == hugger) + continue // They were already asked + cur_candidate.ManualFollow(affected_mob) + if(cur_candidate.client.prefs?.toggles_flashing & FLASH_POOLSPAWN) + window_flash(cur_candidate.client) + if(tgui_alert(cur_candidate, "An unnested host is about to burst! Do you want to control the new larva?", "Larva maturation", list("Yes", "No"), 10 SECONDS) == "Yes") + picked = cur_candidate + candidates -= cur_candidate + message_alien_candidates(candidates, dequeued = 0) + break // Spawn the larva var/mob/living/carbon/xenomorph/larva/new_xeno @@ -227,6 +260,8 @@ if(new_xeno.client) new_xeno.client.change_view(world_view_size) + if(new_xeno.client.prefs?.toggles_flashing & FLASH_POOLSPAWN) + window_flash(new_xeno.client) SSround_recording.recorder.track_player(new_xeno) @@ -247,7 +282,7 @@ to_chat(observer, SPAN_DEADSAY("A [new_xeno.hive.prefix]Larva is about to chestburst out of [affected_mob]! [OBSERVER_JMP(observer, affected_mob)]")) to_chat(src, SPAN_DEADSAY("A [new_xeno.hive.prefix]Larva is about to chestburst out of [affected_mob]!")) - stage = 6 + stage = 7 // Begin the autoburst countdown /mob/living/carbon/xenomorph/larva/proc/cause_unbearable_pain(mob/living/carbon/victim) if(loc != victim) @@ -302,8 +337,8 @@ if(larva_embryo.client) larva_embryo.set_lighting_alpha_from_prefs(larva_embryo.client) - larva_embryo.attack_log += "\[[time_stamp()]\] chestbursted from [key_name(victim)]" - victim.attack_log += "\[[time_stamp()]\] Was chestbursted, larva was [key_name(larva_embryo)]" + larva_embryo.attack_log += "\[[time_stamp()]\] chestbursted from [key_name(victim)] in [get_area_name(larva_embryo)] at X[victim.x], Y[victim.y], Z[victim.z]" + victim.attack_log += "\[[time_stamp()]\] Was chestbursted in [get_area_name(larva_embryo)] at X[victim.x], Y[victim.y], Z[victim.z]. The larva was [key_name(larva_embryo)]." if(burstcount) step(larva_embryo, pick(cardinal)) @@ -324,7 +359,7 @@ if(!victim.first_xeno) to_chat(larva_embryo, SPAN_XENOHIGHDANGER("The Queen's will overwhelms your instincts...")) to_chat(larva_embryo, SPAN_XENOHIGHDANGER("\"[hive.hive_orders]\"")) - log_attack("[key_name(victim)] chestbursted, the larva was [key_name(larva_embryo)].") //this is so that admins are not spammed with los logs + log_attack("[key_name(victim)] chestbursted in [get_area_name(larva_embryo)] at X[victim.x], Y[victim.y], Z[victim.z]. The larva was [key_name(larva_embryo)].") //this is so that admins are not spammed with los logs for(var/obj/item/alien_embryo/AE in victim) qdel(AE) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoUpgrade.dm b/code/modules/mob/living/carbon/xenomorph/XenoUpgrade.dm index a89a3ad32e85..ae03d0646657 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoUpgrade.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoUpgrade.dm @@ -3,6 +3,7 @@ return age = XENO_NORMAL + var/hours_as_xeno = client.get_total_xeno_playtime() var/hours_as_caste = get_job_playtime(client, caste.caste_type) switch(hours_as_caste) @@ -15,11 +16,16 @@ if(JOB_PLAYTIME_TIER_4 to INFINITY) age = XENO_PRIME + if(hours_as_xeno < JOB_PLAYTIME_TIER_1) + age = XENO_YOUNG + // For people who wish to remain anonymous if(!client.prefs.playtime_perks) age = XENO_NORMAL switch(age) + if(XENO_YOUNG) + age_prefix = "Young " if(XENO_NORMAL) age_prefix = "" if(XENO_MATURE) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_abilities.dm index 9f5de1c631cd..91bda707ec45 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_abilities.dm @@ -12,7 +12,7 @@ knockdown = TRUE knockdown_duration = 0.5 windup = TRUE - windup_duration = 10 + windup_duration = FACEHUGGER_WINDUP_DURATION freeze_self = TRUE freeze_time = 5 freeze_play_sound = FALSE diff --git a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm index 246e2d2809db..8e64afa3f733 100644 --- a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm +++ b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm @@ -982,3 +982,12 @@ var/matrix/A = matrix() apply_transform(A) stat &= ~BROKEN //Remove broken. MAGICAL REPAIRS + +//Misc +/obj/structure/prop/invuln/joey/attack_alien(mob/living/carbon/xenomorph/alien) + alien.animation_attack_on(src) + alien.visible_message(SPAN_DANGER("[alien] [alien.slashes_verb] [src]!"), \ + SPAN_DANGER("You [alien.slash_verb] [src]!"), null, 5) + playsound(loc, "alien_claw_metal", 25, 1) + attacked() + return XENO_ATTACK_ACTION diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm b/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm index 79a5f986ea10..ac03389994c9 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm @@ -133,7 +133,7 @@ to_chat(src, SPAN_WARNING("You can't infect \the [human]...")) return visible_message(SPAN_WARNING("\The [src] starts climbing onto \the [human]'s face..."), SPAN_XENONOTICE("You start climbing onto \the [human]'s face...")) - if(!do_after(src, 6 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE, human, INTERRUPT_MOVED, BUSY_ICON_HOSTILE)) + if(!do_after(src, FACEHUGGER_WINDUP_DURATION, INTERRUPT_ALL, BUSY_ICON_HOSTILE, human, INTERRUPT_MOVED, BUSY_ICON_HOSTILE)) return if(!human.lying) to_chat(src, SPAN_WARNING("You can't reach \the [human], they need to be lying down.")) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm index f3a354b42ad0..8a7425e2071a 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm @@ -68,6 +68,7 @@ /mob/hologram/queen name = "Queen Eye" action_icon_state = "queen_exit" + motion_sensed = TRUE color = "#a800a8" @@ -412,17 +413,24 @@ if(queen_aged) age_xeno() switch(age) - if(XENO_NORMAL) name = "[name_prefix]Queen" //Young - if(XENO_MATURE) name = "[name_prefix]Elder Queen" //Mature - if(XENO_ELDER) name = "[name_prefix]Elder Empress" //Elite - if(XENO_ANCIENT) name = "[name_prefix]Ancient Empress" //Ancient - if(XENO_PRIME) name = "[name_prefix]Prime Empress" //Primordial + if(XENO_YOUNG) + name = "[name_prefix]Young Queen" //Young + if(XENO_NORMAL) + name = "[name_prefix]Queen" //Regular + if(XENO_MATURE) + name = "[name_prefix]Elder Queen" //Mature + if(XENO_ELDER) + name = "[name_prefix]Elder Empress" //Elite + if(XENO_ANCIENT) + name = "[name_prefix]Ancient Empress" //Ancient + if(XENO_PRIME) + name = "[name_prefix]Prime Empress" //Primordial else age = XENO_NORMAL if(client) hud_update() - name = "[name_prefix]Young Queen" + name = "[name_prefix]Immature Queen" var/name_client_prefix = "" var/name_client_postfix = "" diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Runner.dm b/code/modules/mob/living/carbon/xenomorph/castes/Runner.dm index 69e5b82aa307..f946ec44b5b7 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Runner.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Runner.dm @@ -71,7 +71,7 @@ /mob/living/carbon/xenomorph/runner/initialize_pass_flags(datum/pass_flags_container/PF) ..() if (PF) - PF.flags_pass = PASS_FLAGS_CRAWLER + PF.flags_pass |= PASS_FLAGS_CRAWLER /datum/behavior_delegate/runner_base name = "Base Runner Behavior Delegate" diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/runner/acid.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/runner/acid.dm index 7a2196a3c209..7b64ae9f69d7 100644 --- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/runner/acid.dm +++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/runner/acid.dm @@ -159,7 +159,12 @@ new /obj/effect/particle_effect/smoke/acid_runner_harmless(T) playsound(bound_xeno, 'sound/effects/blobattack.ogg', 75) if(bound_xeno.client && bound_xeno.hive) - addtimer(CALLBACK(bound_xeno.hive, TYPE_PROC_REF(/datum/hive_status, free_respawn), bound_xeno.client), 5 SECONDS) + var/datum/hive_status/hive_status = bound_xeno.hive + var/turf/spawning_turf = get_turf(bound_xeno) + if(!hive_status.hive_location) + addtimer(CALLBACK(bound_xeno.hive, TYPE_PROC_REF(/datum/hive_status, respawn_on_turf), bound_xeno.client, spawning_turf), 0.5 SECONDS) + else + addtimer(CALLBACK(bound_xeno.hive, TYPE_PROC_REF(/datum/hive_status, free_respawn), bound_xeno.client), 5 SECONDS) bound_xeno.gib() /mob/living/carbon/xenomorph/runner/ventcrawl_carry() diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm b/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm index bb58d2cf2a03..512c26f8c360 100644 --- a/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm +++ b/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm @@ -317,6 +317,7 @@ XENO_STRUCTURE_EGGMORPH = 6, XENO_STRUCTURE_EVOPOD = 2, XENO_STRUCTURE_RECOVERY = 6, + XENO_STRUCTURE_PYLON = 2, ) var/global/list/hive_structure_types = list( @@ -353,6 +354,8 @@ /// 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 = 3 var/datum/tacmap/xeno/tacmap var/minimap_type = MINIMAP_FLAG_XENO @@ -368,17 +371,25 @@ if(hivenumber != XENO_HIVE_NORMAL) return - RegisterSignal(SSdcs, COMSIG_GLOB_POST_SETUP, PROC_REF(setup_evolution_announcements)) + RegisterSignal(SSdcs, COMSIG_GLOB_POST_SETUP, PROC_REF(post_setup)) -/datum/hive_status/proc/setup_evolution_announcements() +/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() @@ -881,6 +892,7 @@ 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) @@ -934,6 +946,24 @@ 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) @@ -1020,6 +1050,10 @@ //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() @@ -1048,7 +1082,7 @@ hugger.timeofdeath = user.timeofdeath // Keep old death time /datum/hive_status/proc/update_lesser_drone_limit() - lesser_drone_limit = Ceiling(totalXenos.len / 3) + lesser_drone_limit = lesser_drone_minimum + Ceiling(length(totalXenos) / 3) /datum/hive_status/proc/can_spawn_as_lesser_drone(mob/dead/observer/user) if(!GLOB.hive_datum || ! GLOB.hive_datum[hivenumber]) @@ -1082,11 +1116,11 @@ 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]")) + if(tgui_alert(user, "Are you sure you want to become a lesser drone?", "Confirmation", list("Yes", "No")) != "Yes") return FALSE - if(tgui_alert(user, "Are you sure you want to become a lesser drone?", "Confirmation", list("Yes", "No")) != "Yes") + 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) @@ -1098,6 +1132,10 @@ /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++ diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index f8c86f9c5171..1839fe191627 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -245,6 +245,8 @@ return /datum/equipment_preset/uscm_ship/so if(JOB_XO) return /datum/equipment_preset/uscm_ship/xo + if(JOB_AUXILIARY_OFFICER) + return /datum/equipment_preset/uscm_ship/auxiliary_officer if(JOB_INTEL) return /datum/equipment_preset/uscm/intel/full if(JOB_PILOT) @@ -277,7 +279,7 @@ if(JOB_MAINT_TECH) return /datum/equipment_preset/uscm_ship/maint if(JOB_CHIEF_REQUISITION) - return /datum/equipment_preset/uscm_ship/ro + return /datum/equipment_preset/uscm_ship/qm if(JOB_CARGO_TECH) return /datum/equipment_preset/uscm_ship/cargo if(JOB_CMO) diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 1038f2a86e8a..2178e2d53f5c 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -247,6 +247,21 @@ robotic_type = /obj/item/organ/brain/prosthetic vital = 1 +/datum/internal_organ/brain/process(delta_time) + ..() + + if(organ_status >= ORGAN_BRUISED && prob(5 * delta_time)) + var/dir_choice = pick(list(NORTH, SOUTH, EAST, WEST)) + owner.drop_held_items() + owner.Move(get_step(get_turf(owner), dir_choice)) + to_chat(owner, SPAN_DANGER("Your mind wanders and goes blank for a moment...")) + + if(organ_status >= ORGAN_BROKEN && prob(5 * delta_time)) + owner.apply_effect(1, PARALYZE) + if(owner.jitteriness < 100) + owner.make_jittery(50) + to_chat(owner, SPAN_DANGER("Your body seizes up!")) + /datum/internal_organ/brain/prosthetic //used by synthetic species robotic = ORGAN_ROBOT removed_type = /obj/item/organ/brain/prosthetic diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 7665e0a5d7ab..3b10c757f2f4 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -256,6 +256,7 @@ t = replacetext(t, "\[logo\]", "") t = replacetext(t, "\[wy\]", "") t = replacetext(t, "\[uscm\]", "") + t = replacetext(t, "\[upp\]", "") t = "[t]" else // If it is a crayon, and he still tries to use these, make them empty! @@ -606,6 +607,15 @@ color = "green" info = "

I could not do it, the fucking marshals, the minions of THEM, have gotten a whiff of my co-workers plans and started raiding us pre-emptively. We managed to get word of it and erected a few barricades to slow them down, but it is too late. Our plan, my plan to save humanity has turned to dust.

As I lay and write this, they are gassing the entire area with tear gas, while gunshots echo around the caves. \n They have gotten to my mind already, their voices are... laughing, saying that, \" it's over \" and that \n “we have risen\". Their voices are mocking me as I could do nothing to prevent their rise \n Just as I am about to finish my final entry, I overhear a few panicked radio calls from a dead officer's radio, about a code red lambda breach, and \" X-RAYS OUT OF CONTAINMENT\". \n However, not a single one of their cries has been met with a response as their fellow officers are too preoccupied with beating up poor miners... \n They have won.... they have PLANNED THIS all along.... \n only God may save us now..." +/obj/item/paper/bigred/upp + name = "UPP Orders" + +/obj/item/paper/bigred/upp/Initialize(mapload, photo_list) + . = ..() + + var/datum/asset/asset = get_asset_datum(/datum/asset/simple/paper) + info = "

Union Of Progressive People's Fourth Fleet
Orders For 173rd Airborne Reconnaissance: 2nd Platoon
No.52

Order of Military Officer of the UPP
Kolonel Ganbaatar
Commander of MV-35
Date: 2182
On Special Mission
The actions of the hostile Weyland-Yutani corporation on the fringes of the Neroid sector have grown increasingly intolerable. However, evidence suggesting they are researching into the creation and deployment of some form of biological weapons program represent an unacceptable risk to the security of UPP interests in this sector. The risk of these items falling into UA/USCM hands is unacceptable.

Orders for the Boris squad of the 173rd Airborne Recon are as follows. Initiate airborne reconnaissance of WY colony Oxley's Buttle, Trijent Dam, location on planet Raijin (UA Code: LV-670). Ascertain veracity of onsight biological weapons program. If positive confirmation of the weapons program is identified, authorization for rapid assault and recovery is granted. Avoid all contact with UA/USCM military forces, abort missions if UA/USCM forces are encountered.
Authorizing Officer: Gaanbatar
Name and Rank: Kolonel

FOR SANCTIONED USE ONLY" + /obj/item/paper/crumpled name = "paper scrap" icon_state = "scrap" diff --git a/code/modules/projectiles/ammo_datums.dm b/code/modules/projectiles/ammo_datums.dm index f97195d5ac32..d09c7ad7bb26 100644 --- a/code/modules/projectiles/ammo_datums.dm +++ b/code/modules/projectiles/ammo_datums.dm @@ -2367,32 +2367,7 @@ flags_ammo_behavior = AMMO_IGNORE_RESIST damage = 55 - -/datum/ammo/energy/yautja/rifle/blast - name = "plasma shatterer" - icon_state = "bluespace" - damage_type = BURN - - shell_speed = AMMO_SPEED_TIER_4 - damage = 40 - -/datum/ammo/energy/yautja/rifle/blast/on_hit_mob(mob/M, obj/item/projectile/P) - var/L = get_turf(M) - cell_explosion(L, 90, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - ..() - -/datum/ammo/energy/yautja/rifle/blast/on_hit_turf(turf/T, obj/item/projectile/P) - cell_explosion(T, 90, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - ..() - -/datum/ammo/energy/yautja/rifle/blast/on_hit_obj(obj/O, obj/item/projectile/P) - cell_explosion(get_turf(O), 100, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - ..() - -/datum/ammo/energy/yautja/rifle/blast/do_at_max_range(obj/item/projectile/P) - cell_explosion(get_turf(P), 100, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - ..() - + penetration = 50 /* //====== diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index c45f8f620243..5b5ee2b96608 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -1219,6 +1219,16 @@ and you're good to go. #define EXECUTION_CHECK (attacked_mob.stat == UNCONSCIOUS || attacked_mob.is_mob_restrained()) && ((user.a_intent == INTENT_GRAB)||(user.a_intent == INTENT_DISARM)) +/obj/item/weapon/gun/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(!proximity_flag) + return FALSE + + if(active_attachable && (active_attachable.flags_attach_features & ATTACH_MELEE)) + active_attachable.last_fired = world.time + active_attachable.fire_attachment(target, src, user) + return TRUE + + /obj/item/weapon/gun/attack(mob/living/attacked_mob, mob/living/user) if(active_attachable && (active_attachable.flags_attach_features & ATTACH_MELEE)) //this is expected to do something in melee. active_attachable.last_fired = world.time @@ -1818,9 +1828,17 @@ not all weapons use normal magazines etc. load_into_chamber() itself is designed UnregisterSignal(gun_user, list(COMSIG_MOB_MOUSEUP, COMSIG_MOB_MOUSEDOWN, COMSIG_MOB_MOUSEDRAG)) gun_user = to_set - RegisterSignal(gun_user, COMSIG_MOB_MOUSEDOWN, PROC_REF(start_fire)) - RegisterSignal(gun_user, COMSIG_MOB_MOUSEDRAG, PROC_REF(change_target)) - RegisterSignal(gun_user, COMSIG_MOB_MOUSEUP, PROC_REF(stop_fire)) + if(gun_user) + RegisterSignal(gun_user, COMSIG_MOB_MOUSEDOWN, PROC_REF(start_fire)) + RegisterSignal(gun_user, COMSIG_MOB_MOUSEDRAG, PROC_REF(change_target)) + RegisterSignal(gun_user, COMSIG_MOB_MOUSEUP, PROC_REF(stop_fire)) + +/obj/item/weapon/gun/hands_swapped(mob/living/carbon/swapper_of_hands) + if(src == swapper_of_hands.get_active_hand()) + set_gun_user(swapper_of_hands) + return + + set_gun_user(null) ///Update the target if you draged your mouse /obj/item/weapon/gun/proc/change_target(datum/source, atom/src_object, atom/over_object, turf/src_location, turf/over_location, src_control, over_control, params) diff --git a/code/modules/projectiles/gun_attachables.dm b/code/modules/projectiles/gun_attachables.dm index 2a77a6ba6a68..7f6e01045745 100644 --- a/code/modules/projectiles/gun_attachables.dm +++ b/code/modules/projectiles/gun_attachables.dm @@ -368,6 +368,7 @@ Defined in conflicts.dm of the #defines folder. icon_state = "ebarrel" attach_icon = "ebarrel_a" hud_offset_mod = -3 + wield_delay_mod = WIELD_DELAY_FAST /obj/item/attachable/extended_barrel/New() ..() @@ -2522,10 +2523,9 @@ Defined in conflicts.dm of the #defines folder. accuracy_unwielded_mod = -HIT_ACCURACY_MULT_TIER_3 scatter_unwielded_mod = SCATTER_AMOUNT_TIER_10 - /obj/item/attachable/angledgrip name = "angled grip" - desc = "An angled foregrip that improves weapon ergonomics and offers less recoil, and faster wielding time. \nHowever, it also increases weapon size." + desc = "An angled foregrip that improves weapon ergonomics resulting in faster wielding time. \nHowever, it also increases weapon size." icon = 'icons/obj/items/weapons/guns/attachments/under.dmi' icon_state = "angledgrip" attach_icon = "angledgrip_a" @@ -2534,16 +2534,6 @@ Defined in conflicts.dm of the #defines folder. slot = "under" pixel_shift_x = 20 -/obj/item/attachable/angledgrip/New() - ..() - recoil_mod = -RECOIL_AMOUNT_TIER_4 - accuracy_mod = HIT_ACCURACY_MULT_TIER_1 - accuracy_unwielded_mod = -HIT_ACCURACY_MULT_TIER_1 - scatter_mod = -SCATTER_AMOUNT_TIER_10 - scatter_unwielded_mod = SCATTER_AMOUNT_TIER_10 - - - /obj/item/attachable/gyro name = "gyroscopic stabilizer" desc = "A set of weights and balances to stabilize the weapon when fired with one hand. Slightly decreases firing speed." diff --git a/code/modules/projectiles/guns/specialist.dm b/code/modules/projectiles/guns/specialist.dm index 22fb290878e9..66456f4e21fc 100644 --- a/code/modules/projectiles/guns/specialist.dm +++ b/code/modules/projectiles/guns/specialist.dm @@ -829,26 +829,27 @@ muzzle_flash(angle,user) simulate_recoil(0, user) - var/obj/item/explosive/grenade/F = cylinder.contents[1] - cylinder.remove_from_storage(F, user.loc) + var/obj/item/explosive/grenade/fired = cylinder.contents[1] + cylinder.remove_from_storage(fired, user.loc) var/pass_flags = NO_FLAGS if(is_lobbing) - if(istype(F, /obj/item/explosive/grenade/slug/baton)) + if(istype(fired, /obj/item/explosive/grenade/slug/baton)) if(ishuman(user)) var/mob/living/carbon/human/human_user = user - human_user.remember_dropped_object(F) + human_user.remember_dropped_object(fired) + fired.fingerprintslast = key_name(user) pass_flags |= PASS_MOB_THRU_HUMAN|PASS_MOB_IS_OTHER|PASS_OVER else pass_flags |= PASS_MOB_THRU|PASS_HIGH_OVER - msg_admin_attack("[key_name_admin(user)] fired a grenade ([F.name]) from \a ([name]).") + msg_admin_attack("[key_name_admin(user)] fired a grenade ([fired.name]) from \a ([name]).") log_game("[key_name_admin(user)] used a grenade ([name]).") - F.throw_range = 20 - F.det_time = min(10, F.det_time) - F.activate(user, FALSE) - F.forceMove(get_turf(src)) - F.throw_atom(target, 20, SPEED_VERY_FAST, user, null, NORMAL_LAUNCH, pass_flags) + fired.throw_range = 20 + fired.det_time = min(10, fired.det_time) + fired.activate(user, FALSE) + fired.forceMove(get_turf(src)) + fired.throw_atom(target, 20, SPEED_VERY_FAST, user, null, NORMAL_LAUNCH, pass_flags) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 2fc04e35f399..e4251f5f6b31 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -501,13 +501,14 @@ if(ammo.sound_miss) playsound_client(L.client, ammo.sound_miss, get_turf(L), 75, TRUE) L.visible_message(SPAN_AVOIDHARM("[src] misses [L]!"), SPAN_AVOIDHARM("[src] narrowly misses you!"), null, 4, CHAT_TYPE_TAKING_HIT) - log_attack("[src] narrowly missed [key_name(L)]") + var/log_message = "[src] narrowly missed [key_name(L)]" var/mob/living/carbon/shotby = firer if(istype(shotby)) - L.attack_log += "[time_stamp()]\] [src], fired by [key_name(firer)], narrowly missed [key_name(L)]" - shotby.attack_log += "[time_stamp()]\] [src], fired by [key_name(shotby)], narrowly missed [key_name(L)]" - + L.attack_log += "\[[time_stamp()]\] [src], fired by [key_name(firer)], narrowly missed [key_name(L)]" + shotby.attack_log += "\[[time_stamp()]\] [src], fired by [key_name(shotby)], narrowly missed [key_name(L)]" + log_message = "[src], fired by [key_name(firer)], narrowly missed [key_name(L)]" + log_attack(log_message) #if DEBUG_HIT_CHANCE to_world(SPAN_DEBUG("([L]) Missed.")) diff --git a/code/modules/reagents/chemistry_machinery/acid_harness.dm b/code/modules/reagents/chemistry_machinery/acid_harness.dm index 49cb8860fa00..ae54474c3aed 100644 --- a/code/modules/reagents/chemistry_machinery/acid_harness.dm +++ b/code/modules/reagents/chemistry_machinery/acid_harness.dm @@ -39,6 +39,10 @@ /obj/item/storage/internal/accessory/black_vest/acid_harness storage_slots = 2 + can_hold = list( + /obj/item/reagent_container/glass/beaker, + /obj/item/cell, + ) /obj/item/clothing/accessory/storage/black_vest/acid_harness name = "A.C.I.D. Harness" diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 8a5a6ec960ec..2c7401ac278c 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -37,6 +37,13 @@ active_power_usage = 3500 idle_power_usage = 100 var/disposal_pressure = 0 + ///Whether the disposals tube is too narrow for a mob to fit into. + var/narrow_tube = FALSE + +/obj/structure/machinery/disposal/delivery + name = "delivery chute" + desc = "A pneumatic delivery unit connecting two locations. It's rather narrow." + narrow_tube = TRUE /obj/structure/machinery/disposal/broken name = "broken disposal unit" @@ -128,24 +135,42 @@ update() return - var/obj/item/grab/G = I - if(istype(G)) //Handle grabbed mob - if(ismob(G.grabbed_thing)) - to_chat(user, SPAN_WARNING("You can't fit that in there!")) - return - /*&& user.grab_level >= GRAB_AGGRESSIVE) - var/mob/GM = G.grabbed_thing - user.visible_message(SPAN_WARNING("[user] starts putting [GM] into [src]."), - SPAN_WARNING("You start putting [GM] into [src].")) - if(do_after(user, 20, INTERRUPT_ALL, BUSY_ICON_HOSTILE)) - GM.forceMove(src) - user.visible_message(SPAN_WARNING("[user] puts [GM] into [src]."), - SPAN_WARNING("[user] puts [GM] into [src].")) - user.attack_log += text("\[[time_stamp()]\] Has placed [GM] ([GM.ckey]) in disposals.") - GM.attack_log += text("\[[time_stamp()]\] Has been placed in disposals by [user] ([user.ckey])") - msg_admin_attack("[user] ([user.ckey]) placed [GM] ([GM.ckey]) in a disposals unit in [get_area(user)] ([user.loc.x],[user.loc.y],[user.loc.z]).", user.loc.x, user.loc.y, user.loc.z) - flush()*/ - return + var/obj/item/grab/grab_effect = I + if(istype(grab_effect)) //Handle grabbed mob + if(ismob(grab_effect.grabbed_thing)) + var/mob/grabbed_mob = grab_effect.grabbed_thing + if((!MODE_HAS_TOGGLEABLE_FLAG(MODE_DISPOSABLE_MOBS) && !HAS_TRAIT(grabbed_mob, TRAIT_CRAWLER)) || narrow_tube || grabbed_mob.mob_size >= MOB_SIZE_BIG) + to_chat(user, SPAN_WARNING("You can't fit that in there!")) + return FALSE + var/max_grab_size = user.mob_size + /// Amazing what you can do with a bit of dexterity. + if(HAS_TRAIT(user, TRAIT_DEXTROUS)) + max_grab_size++ + /// Strong mobs can lift above their own weight. + if(HAS_TRAIT(user, TRAIT_SUPER_STRONG))//NB; this will mean Yautja can bodily lift MOB_SIZE_XENO(3) and Synths can lift MOB_SIZE_XENO_SMALL(2) + max_grab_size++ + if(grabbed_mob.mob_size > max_grab_size || !(grabbed_mob.status_flags & CANPUSH)) + to_chat(user, SPAN_WARNING("You don't have the strength to move [grabbed_mob]!")) + return FALSE//can't tighten your grip on mobs bigger than you and mobs you can't push. + if(!user.grab_level >= GRAB_AGGRESSIVE) + to_chat(user, SPAN_WARNING("You need a better grip to force [grabbed_mob] in there!")) + return FALSE + user.visible_message(SPAN_WARNING("[user] starts putting [grabbed_mob] into [src]."), + SPAN_WARNING("You start putting [grabbed_mob] into [src].")) + if(!do_after(user, 2 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE)) + user.visible_message(SPAN_WARNING("[user] stops putting [grabbed_mob] into [src]."), + SPAN_WARNING("You stop putting [grabbed_mob] into [src].")) + return FALSE + + grabbed_mob.forceMove(src) + user.visible_message(SPAN_WARNING("[user] puts [grabbed_mob] into [src]."), + SPAN_WARNING("[user] puts [grabbed_mob] into [src].")) + user.attack_log += text("\[[time_stamp()]\] Has placed [key_name(grabbed_mob)] in disposals.") + grabbed_mob.attack_log += text("\[[time_stamp()]\] Has been placed in disposals by [user] ([user.ckey])") + msg_admin_attack("[user] ([user.ckey]) placed [key_name(grabbed_mob)] in a disposals unit in [get_area(user)] ([user.loc.x],[user.loc.y],[user.loc.z]).", user.loc.x, user.loc.y, user.loc.z) + flush(TRUE)//Forcibly flushing someone if forced in by another player. + return TRUE + return FALSE if(isrobot(user)) return @@ -161,51 +186,50 @@ ///Mouse drop another mob or self /obj/structure/machinery/disposal/MouseDrop_T(mob/target, mob/user) - return -/* - if(!istype(target) || target.anchored || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.is_mob_incapacitated(TRUE) || isRemoteControlling(user) || target.mob_size >= MOB_SIZE_BIG) - return - if(!(ishuman(target)) || !(ishuman(user))) return - if(isanimal(user) && target != user) return //Animals cannot put mobs other than themselves into disposal + if((!MODE_HAS_TOGGLEABLE_FLAG(MODE_DISPOSABLE_MOBS) && !HAS_TRAIT(user, TRAIT_CRAWLER)) || narrow_tube) + to_chat(user, SPAN_WARNING("Looks a little bit too tight in there!")) + return FALSE + + if(target != user) + to_chat(user, SPAN_WARNING("You need a better grip on [target] to force them into [src]!")) + 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]!")) + return FALSE add_fingerprint(user) var/target_loc = target.loc if(target == user) visible_message(SPAN_NOTICE("[user] starts climbing into the disposal.")) - else - if(user.is_mob_restrained()) return //can't stuff someone other than you if restrained. - visible_message(SPAN_WARNING("[user] starts stuffing [target] into the disposal.")) + if(!do_after(user, 40, INTERRUPT_NO_NEEDHAND, BUSY_ICON_HOSTILE)) - return + return FALSE if(target_loc != target.loc) - return + return FALSE + if(user.is_mob_incapacitated(TRUE)) + to_chat(user, SPAN_WARNING("You cannot do this while incapacitated!")) + return FALSE + if(target == user) - if(user.is_mob_incapacitated(TRUE)) return user.visible_message(SPAN_NOTICE("[user] climbs into [src]."), SPAN_NOTICE("You climb into [src].")) - else - if(user.is_mob_incapacitated()) return - user.visible_message(SPAN_DANGER("[user] stuffs [target] into [src]!"), - SPAN_WARNING("You stuff [target] into [src]!")) - - user.attack_log += text("\[[time_stamp()]\] Has placed [target.name] ([target.ckey]) in disposals.") - target.attack_log += text("\[[time_stamp()]\] Has been placed in disposals by [user.name] ([user.ckey])") - msg_admin_attack("[user] ([user.ckey]) placed [target] ([target.ckey]) in a disposals unit in [get_area(user)] ([user.loc.x],[user.loc.y],[user.loc.z]).", user.loc.x, user.loc.y, user.loc.z) + user.attack_log += text("\[[time_stamp()]\] [key_name(user)] climbed into a disposals bin!") target.forceMove(src) - flush() - update()*/ + flush()//Not forcing flush if climbing in by self. + update() ///Attempt to move while inside /obj/structure/machinery/disposal/relaymove(mob/user) if(user.stat || user.stunned || user.knocked_down || flushing) - return + return FALSE if(user.loc == src) go_out(user) + return TRUE ///Leave the disposal /obj/structure/machinery/disposal/proc/go_out(mob/user) - if(user.client) user.client.eye = user.client.mob user.client.perspective = MOB_PERSPECTIVE @@ -364,7 +388,9 @@ return ///Perform a flush -/obj/structure/machinery/disposal/proc/flush() +/obj/structure/machinery/disposal/proc/flush(forced = FALSE) + if((disposal_pressure < SEND_PRESSURE) && !forced) + return FALSE flushing = TRUE flick("[icon_state]-flush", src) diff --git a/code/modules/shuttle/computers/dropship_computer.dm b/code/modules/shuttle/computers/dropship_computer.dm index 50449b32fcb9..5ad84e17f159 100644 --- a/code/modules/shuttle/computers/dropship_computer.dm +++ b/code/modules/shuttle/computers/dropship_computer.dm @@ -362,6 +362,9 @@ update_equipment(is_optimised) if(is_set_flyby) to_chat(user, SPAN_NOTICE("You begin the launch sequence for a flyby.")) + var/log = "[key_name(user)] launched the dropship [src.shuttleId] on flyby." + msg_admin_niche(log) + log_interact(user, msg = "[log]") shuttle.send_for_flyby() return TRUE var/dockId = params["target"] @@ -387,6 +390,9 @@ return TRUE SSshuttle.moveShuttle(shuttle.id, dock.id, TRUE) to_chat(user, SPAN_NOTICE("You begin the launch sequence to [dock].")) + var/log = "[key_name(user)] launched the dropship [src.shuttleId] on transport." + msg_admin_niche(log) + log_interact(user, msg = "[log]") return TRUE if("button-push") playsound(loc, get_sfx("terminal_button"), KEYBOARD_SOUND_VOLUME, 1) @@ -403,10 +409,14 @@ to_chat(user, SPAN_WARNING("Door controls have been overridden. Please call technical support.")) if("set-ferry") is_set_flyby = FALSE - msg_admin_niche("[key_name_admin(usr)] set the dropship [src.shuttleId] into transport") + var/log = "[key_name(user)] set the dropship [src.shuttleId] into transport" + msg_admin_niche(log) + log_interact(user, msg = "[log]") if("set-flyby") is_set_flyby = TRUE - msg_admin_niche("[key_name_admin(usr)] set the dropship [src.shuttleId] into flyby") + var/log = "[key_name(user)] set the dropship [src.shuttleId] into flyby." + msg_admin_niche(log) + log_interact(user, msg = "[log]") if("set-automate") var/almayer_lz = params["hangar_id"] var/ground_lz = params["ground_id"] @@ -426,7 +436,9 @@ shuttle.automated_lz_id = ground_lz shuttle.automated_delay = delay playsound(loc, get_sfx("terminal_button"), KEYBOARD_SOUND_VOLUME, 1) - message_admins("[key_name_admin(usr)] has set auto pilot on '[shuttle.name]'") + var/log = "[key_name(user)] has enabled auto pilot on '[shuttle.name]'" + message_admins(log) + log_interact(user, msg = "[log]") return /* TODO if(!dropship.automated_launch) //If we're toggling it on... @@ -440,7 +452,9 @@ shuttle.automated_lz_id = null shuttle.automated_delay = null playsound(loc, get_sfx("terminal_button"), KEYBOARD_SOUND_VOLUME, 1) - message_admins("[key_name_admin(usr)] has removed auto pilot on '[shuttle.name]'") + var/log = "[key_name(user)] has disabled auto pilot on '[shuttle.name]'" + message_admins(log) + log_interact(user, msg = "[log]") return if("cancel-flyby") diff --git a/code/modules/shuttle/shuttles/escape_shuttle.dm b/code/modules/shuttle/shuttles/escape_shuttle.dm index 859aa45aceb3..daf91034036f 100644 --- a/code/modules/shuttle/shuttles/escape_shuttle.dm +++ b/code/modules/shuttle/shuttles/escape_shuttle.dm @@ -8,9 +8,12 @@ rechargeTime = SHUTTLE_RECHARGE ignitionTime = 8 SECONDS ignition_sound = 'sound/effects/escape_pod_warmup.ogg' - /// The % chance of the escape pod crashing into the groundmap + /// The % chance of the escape pod crashing into the groundmap before lifeboats leaving var/early_crash_land_chance = 75 + /// The % chance of the escape pod crashing into the groundmap var/crash_land_chance = 25 + /// How many people can be in the escape pod before it crashes + var/max_capacity = 3 var/datum/door_controller/single/door_handler = new() var/launched = FALSE @@ -71,7 +74,7 @@ occupant_count++ for(var/obj/structure/machinery/cryopod/evacuation/cryotube in interior_area) cryos += list(cryotube) - if (occupant_count > 3) + if (occupant_count > max_capacity) playsound(src,'sound/effects/escape_pod_warmup.ogg', 50, 1) sleep(31) var/turf/sploded = return_center_turf() diff --git a/code/modules/surgery/brainrepair.dm b/code/modules/surgery/brainrepair.dm index 6d3060c2a4a6..2b4e51292203 100644 --- a/code/modules/surgery/brainrepair.dm +++ b/code/modules/surgery/brainrepair.dm @@ -55,10 +55,11 @@ var/datum/internal_organ/brain/B = target.internal_organs_by_name["brain"] if(B) - B.damage = 0 + B.heal_damage(B.damage) target.disabilities &= ~NERVOUS target.sdisabilities &= ~DISABILITY_DEAF target.sdisabilities &= ~DISABILITY_MUTE + target.jitteriness = 0 target.pain.recalculate_pain() log_interact(user, target, "[key_name(user)] finished taking bone chips out of [key_name(target)]'s brain with \the [tool], finishing [surgery].") diff --git a/code/modules/tents/deployed_tents.dm b/code/modules/tents/deployed_tents.dm index fc9a69d2366c..d55fe6b59879 100644 --- a/code/modules/tents/deployed_tents.dm +++ b/code/modules/tents/deployed_tents.dm @@ -100,12 +100,12 @@ /obj/structure/tent/attackby(obj/item/item, mob/user) var/obj/item/tool/shovel/shovel = item - if(!istype(shovel) || shovel.folded) + if(!istype(shovel) || shovel.folded || user.action_busy) return visible_message(SPAN_HIGHDANGER("[user] is trying to tear down the [src]")) playsound(src, 'sound/items/paper_ripped.ogg', 25, 1) - if(user.action_busy || !do_after(user, 150, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE, src) || QDELETED(src)) + 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]")) diff --git a/colonialmarines.dme b/colonialmarines.dme index 2b3b08984dfa..11c35963edf9 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -704,6 +704,7 @@ #include "code\game\jobs\job\civilians\support\synthetic.dm" #include "code\game\jobs\job\civilians\support\working_joe.dm" #include "code\game\jobs\job\command\command.dm" +#include "code\game\jobs\job\command\auxiliary\auxiliary_support_officer.dm" #include "code\game\jobs\job\command\auxiliary\crew_chief.dm" #include "code\game\jobs\job\command\auxiliary\intel.dm" #include "code\game\jobs\job\command\auxiliary\pilot.dm" diff --git a/html/browser/common.css b/html/browser/common.css index fa8687d1f592..bb2bdd32e3e6 100644 --- a/html/browser/common.css +++ b/html/browser/common.css @@ -467,7 +467,7 @@ a.purple:hover { background-color: #e6b800; } -.job_ro { +.job_qm { background-color: #8378a1; } diff --git a/html/browser/legacy.css b/html/browser/legacy.css index 47d0f2bb46cd..cd8999e88862 100644 --- a/html/browser/legacy.css +++ b/html/browser/legacy.css @@ -181,7 +181,7 @@ a.purple { background-color: #ffeeaa; } -.job_ro { +.job_qm { background-color: #9990B2; } diff --git a/html/changelogs/AutoChangeLog-pr-3917.yml b/html/changelogs/AutoChangeLog-pr-3917.yml deleted file mode 100644 index 06c525a74669..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3917.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SpartanBobby" -delete-after: True -changes: - - rscadd: "Added a new survivor to LV522 the FORECON sniper he spawns alone his only company being the corpse of his dead battle buddy, good luck" - - maptweak: "Sweeping changes to LV522 including the reactor, north of engineering, LZ1, the entire central area of the map, and north of fitness in an attempt to see more of the colony used and to incentivize flanking" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3942.yml b/html/changelogs/AutoChangeLog-pr-3942.yml new file mode 100644 index 000000000000..6e72c89aac0a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3942.yml @@ -0,0 +1,4 @@ +author: "Steelpoint" +delete-after: True +changes: + - balance: "Yautja's Plasma Rifle has been rebalanced to make it a more effective assault weapon against xenomorphs. It has lost its mini-high explosive fire mode but its default fire mode now mostly ignores xenomorph armor." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3952.yml b/html/changelogs/AutoChangeLog-pr-3952.yml new file mode 100644 index 000000000000..c4363cdb5c04 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3952.yml @@ -0,0 +1,4 @@ +author: "thwomper, Steelpoint" +delete-after: True +changes: + - rscadd: "Toolkits have been added to the game. Holds engineering supplies akin to a medkit. Issued freely to ComTechs and Engineers, can be bought by the USCM Synthetic for cheap." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3962.yml b/html/changelogs/AutoChangeLog-pr-3962.yml deleted file mode 100644 index 757a54e036d6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3962.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "spartanbobby" -delete-after: True -changes: - - maptweak: "heavy changes to the research department" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3985.yml b/html/changelogs/AutoChangeLog-pr-3985.yml new file mode 100644 index 000000000000..9753f46415d8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3985.yml @@ -0,0 +1,4 @@ +author: "Morrow, Sleepynecrons (beautiful sprites)" +delete-after: True +changes: + - rscadd: "Xenos can now capture comms relays for bonuses after 90 minutes into the round." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3990.yml b/html/changelogs/AutoChangeLog-pr-3990.yml deleted file mode 100644 index 7f3a072608fc..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3990.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "ihatethisengine" -delete-after: True -changes: - - rscadd: "Added announcements for xenos about forming and breaking alliances." - - rscadd: "Xenos with IFF tag now have a choice to stay loyal to USCM when Queen decides to betray." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4006.yml b/html/changelogs/AutoChangeLog-pr-4006.yml deleted file mode 100644 index 9e809782b95d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4006.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "ghostsheet" -delete-after: True -changes: - - bugfix: "Advanced mini flamer can no longer nerf itself by changing mode." - - rscadd: "HG 37-12 pump shotgun's intergrated stock no longer give any stat change." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4017.yml b/html/changelogs/AutoChangeLog-pr-4017.yml deleted file mode 100644 index 0b825327160b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4017.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "GoldenDarkness55" -delete-after: True -changes: - - balance: "Player controlled facehuggers apply the same knockout duration as regular ones." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4019.yml b/html/changelogs/AutoChangeLog-pr-4019.yml deleted file mode 100644 index 7fe31a5cb8b6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4019.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "GoldenDarkness55" -delete-after: True -changes: - - balance: "Shaking people up shortens stun durations by 6 instead of 3." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4021.yml b/html/changelogs/AutoChangeLog-pr-4021.yml deleted file mode 100644 index f4d657bb4ef4..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4021.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Morrow" -delete-after: True -changes: - - balance: "2.5 squad marines per 1 larva latejoin" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4099.yml b/html/changelogs/AutoChangeLog-pr-4099.yml new file mode 100644 index 000000000000..df86b7105b7b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4099.yml @@ -0,0 +1,5 @@ +author: "blackdragonTOW" +delete-after: True +changes: + - ui: "Hardcore deaths are now marked with a unique red skull" + - imageadd: "Red skull added for hardcore deaths" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4121.yml b/html/changelogs/AutoChangeLog-pr-4121.yml new file mode 100644 index 000000000000..d9e78ede8551 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4121.yml @@ -0,0 +1,4 @@ +author: "morrowwolf" +delete-after: True +changes: + - rscadd: "Added basic IB surgery instructions to surgical case" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4122.yml b/html/changelogs/AutoChangeLog-pr-4122.yml new file mode 100644 index 000000000000..2f821c756627 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4122.yml @@ -0,0 +1,6 @@ +author: "Morrow" +delete-after: True +changes: + - balance: "Removed the barrel charger from vendors" + - balance: "Removed all benefits other than wield delay mod from the angled grip" + - balance: "Added wield delay to extended barrel" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4124.yml b/html/changelogs/AutoChangeLog-pr-4124.yml new file mode 100644 index 000000000000..c335ea69aae5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4124.yml @@ -0,0 +1,4 @@ +author: "Morrow" +delete-after: True +changes: + - rscadd: "Scan health now only works when non-revivable" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4125.yml b/html/changelogs/AutoChangeLog-pr-4125.yml new file mode 100644 index 000000000000..c678b8473a7a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4125.yml @@ -0,0 +1,5 @@ +author: "Morrow" +delete-after: True +changes: + - rscadd: "Xenos with less than 10 hours on xeno now have the \"Young\" prefix" + - rscadd: "Young Queen has been renamed to Growing Queen" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4130.yml b/html/changelogs/AutoChangeLog-pr-4130.yml new file mode 100644 index 000000000000..a6bcf4c97cec --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4130.yml @@ -0,0 +1,4 @@ +author: "BeagleGaming1" +delete-after: True +changes: + - code_imp: "occupant limit of evacuation pods changed to a variable" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4133.yml b/html/changelogs/AutoChangeLog-pr-4133.yml new file mode 100644 index 000000000000..5e2b0c16c10d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4133.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fix new map dropship areas not getting changes to dropship ceilings that prevents OBs" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4135.yml b/html/changelogs/AutoChangeLog-pr-4135.yml new file mode 100644 index 000000000000..27c91e6adb0f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4135.yml @@ -0,0 +1,5 @@ +author: "Megastar1234" +delete-after: True +changes: + - rscadd: "Adds reagent scanner goggles to CMO vendor" + - rscadd: "Gives CMO headset intel radio" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4138.yml b/html/changelogs/AutoChangeLog-pr-4138.yml new file mode 100644 index 000000000000..b1bc8ce7bff2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4138.yml @@ -0,0 +1,5 @@ +author: "realforest2001" +delete-after: True +changes: + - rscadd: "Changed 'Growing Queen' to 'Immature Queen'" + - bugfix: "Updated playerpanel transform Queen button title." \ No newline at end of file diff --git a/html/changelogs/archive/2023-07.yml b/html/changelogs/archive/2023-07.yml index 177089bf7c67..0ee8702c72e8 100644 --- a/html/changelogs/archive/2023-07.yml +++ b/html/changelogs/archive/2023-07.yml @@ -573,3 +573,67 @@ - balance: when facehugged, more paralyze chance with a smaller paralyze duration - ui: during hugged effects, changes messaging to encourage new players to seek help +2023-07-29: + GoldenDarkness55: + - balance: Shaking people up shortens stun durations by 6 instead of 3. + - balance: Player controlled facehuggers apply the same knockout duration as regular + ones. + Morrow: + - balance: 2.5 squad marines per 1 larva latejoin + SpartanBobby: + - rscadd: Added a new survivor to LV522 the FORECON sniper he spawns alone his only + company being the corpse of his dead battle buddy, good luck + - maptweak: Sweeping changes to LV522 including the reactor, north of engineering, + LZ1, the entire central area of the map, and north of fitness in an attempt + to see more of the colony used and to incentivize flanking + ghostsheet: + - bugfix: Advanced mini flamer can no longer nerf itself by changing mode. + - rscadd: HG 37-12 pump shotgun's intergrated stock no longer give any stat change. + ihatethisengine: + - rscadd: Added announcements for xenos about forming and breaking alliances. + - rscadd: Xenos with IFF tag now have a choice to stay loyal to USCM when Queen + decides to betray. + spartanbobby: + - maptweak: heavy changes to the research department +2023-07-30: + Ben10083: + - bugfix: You can no longer circumvent the lesser drone limit by keeping the prompt + open. + Drathek: + - bugfix: Fix joining as facehugger or lesser drone not checking banishment. + Katskan: + - rscadd: Added a stethoscope, red, yellow, and white/green armband to synthetic + vendors + Morrow: + - bugfix: Fixed holding two guns firing both + harryob: + - admin: notes applied to players now include the round id it was applied in + realforest2001: + - bugfix: Donator custom masks now properly protect from cold weather. +2023-07-31: + Drathek: + - rscadd: Added prompts for xeno candidates to optionally take over a larva when + an unnested host is ready to burst + - bugfix: Fixed larva spawning in hosts not triggering the preference unpool taskbar + flash. + - bugfix: Fixed ctrl+click joining as an afk xeno not checking banishment + Morrow: + - rscadd: Brain damage now causes random wandering, dropping of items, paralysis, + and jittering + ihatethisengine: + - balance: you can stack scratched portable cades if their HP at least 75%. Doing + so will reduce the health of all barricades in the stack to the level of the + most damaged. + - balance: you can repair stacked portable cades but it will take longer time depending + on how many cades in stack. + - balance: miniengi skill makes repairs of folded portable cades faster (10 seconds + to 5 seconds, same as engineer). + - balance: with engineering skill at least of miniengi you can collapse deployed + portable barricade with a crowbar (wrench is no longer required, slightly faster + (2 sec to 1.5 sec)). + - balance: you no longer need to have folded portable cade in hand in order to repair + it. + - balance: if you have folded portable cade in hand, you can move while repairing + it. + zzzmike: + - spellcheck: disordely -> disorderly and minor grammar fixes diff --git a/html/changelogs/archive/2023-08.yml b/html/changelogs/archive/2023-08.yml new file mode 100644 index 000000000000..892d3b284d61 --- /dev/null +++ b/html/changelogs/archive/2023-08.yml @@ -0,0 +1,110 @@ +2023-08-01: + Drathek: + - bugfix: Fixed hung mobs merging with weeds +2023-08-02: + Dorodomki: + - rscadd: Adds A Bipod and Rail Flashlight to the HPR kit + Drathek: + - balance: Facehugger attack windup duration is now 1s like the pounce windup. + Huffie56: + - bugfix: Care package for SG on WO will now spawn with the proper batteries for + them. + Morrow: + - bugfix: Fixes brain damage + - qol: Jittering from brain damage is now capped +2023-08-03: + Ben10083: + - rscadd: Lesser Drone Slots now have a minimum, currently set to 3. + Huffie56: + - balance: adding the possibility to buy "ES-4 stun magazine" for 10 point in the + portable vendor. + - bugfix: remove a bunch of ammo that where improper for ES-4 gun that are in the + lockbox. + Thwomper: + - maptweak: added Workin' Joey to maint bar. +2023-08-04: + Ben10083: + - mapadd: ARES Chamber now has a security camera console + - rscadd: Workin Joey now randomly talks and responds when attacked + Huffie56: + - bugfix: forbidden all the items beside battery and beakers to avoid weirdness + and bug. + Segrain: + - bugfix: Lesser drones now can pass through runners same as through any other castes. + - rscadd: Joining cryomarines now uses your assigned character slot for the role + you get (as long as you have not already used that character name this round). + Zonespace27: + - bugfix: Predator flight computers can no longer be walked on. + - rscadd: Predators and thralls are now visible on the predship tacmap. + - rscadd: Anyone wearing a stolen predator bracer is now visible on the predship + tacmap. + - qol: Predator emote panel emotes now look a bit cleaner in the menu + - bugfix: Predator ship health monitor console now works + - rscadd: WJs now spawn in the ARES core. + - rscadd: There is now a synthetic repair station in the ARES core. + - rscdel: You can no longer move the carp nade in the yautja ship + blackdragonTOW: + - bugfix: fixed a file reference that broke end of round music for some factions + ghostsheet: + - rscadd: B5 Breaching Hammer will now slow down humans who picks it up. + realforest2001: + - admin: Added logs for speech through telephones and deferring ahelps to mentors. + - admin: Chestburst logs now include location data. Mentor Imaginary Friend now + logs its speech. Narrow miss shots now log who fired them (where applicable). + - admin: Dropship interactions (Launch/Flyby/Autopilot) are now logged again, and + also included in attack logs for the user. + - bugfix: Yautja Bracers are no longer hyper lethal electrical outlets. + - rscadd: Added the falcon drone to marine motion detectors, appearing the same + as Queen eye. + stanalbatross: + - ui: changed the almayer control console from html to tgui + - bugfix: custom faction messages will now be named properly in the paper printed + out from the almayer control console +2023-08-05: + BeagleGaming1: + - rscadd: Adds campfires, craftable with wood + - code_imp: Modifies brazier construction code for easier use and mapping + Morrow: + - bugfix: You can no longer bypass skill checks on pill bottles + Steelpoint: + - rscadd: A team of UPP survivors may spawn on Trijent Dam. + - mapadd: A new nightmare insert for Trijent Dam has been added, featuring a crashed + UPP dropship. + Vile Beggar: + - balance: Star Shells now have a higher minimum burn time and are more plentiful + in squad prep. + Zonespace27: + - bugfix: Underbarrel extinguishers can now be refilled. + ghostsheet: + - rscadd: Acid Runners will now respawn where it blew up, if there is no hivecore + to spawn at. + realforest2001: + - rscadd: Added an admin toggle flag for fitting mobs into disposals. (Within reason + - no queens...) + - rscadd: The Crawler trait that allows mobs to enter vents will also allow them + to climb into disposals regardless of above flag. + - rscadd: Added a subtype of disposal that can't fit mobs, used for the delivery + units. + smov: + - rscadd: Adds a new Marine Law charge +2023-08-06: + Ben10083: + - admin: You now need to give confirmation before announcing random facts (OOC tab + verb) + Steelpoint: + - bugfix: EMT/White-Green armband now has a sprite +2023-08-07: + Huffie56: + - maptweak: changing an area so it stop snowing inside walls. +2023-08-08: + HeresKozmos: + - maptweak: Added non-alcoholic drinks dispenser, space cleaner bottle and a regular + medkit to the storage closet. Deleted old toxin medkit in the storage closet + Morrow, Thwomper: + - rscadd: Added Auxiliary Support Officer + - rscadd: Auxiliary Support Officer oversees the hangar, the intel team, the engineering + department, and the requisitions department + - rscadd: Chief Engineer has been demoted to O1. + - rscadd: Requisitions Officer is now "Quartermaster" and a Gunnery Sergeant. + Segrain: + - bugfix: Non-UPP synthetics no longer default to speaking Russian. diff --git a/html/images/upplogo.png b/html/images/upplogo.png new file mode 100644 index 000000000000..55619e2ce5ea Binary files /dev/null and b/html/images/upplogo.png differ diff --git a/icons/mob/hud/hud.dmi b/icons/mob/hud/hud.dmi index f8ea98d01e53..c9e4c0c6c23d 100644 Binary files a/icons/mob/hud/hud.dmi and b/icons/mob/hud/hud.dmi differ diff --git a/icons/mob/hud/marine_hud.dmi b/icons/mob/hud/marine_hud.dmi index 32c1d71e68cb..05390b270254 100644 Binary files a/icons/mob/hud/marine_hud.dmi and b/icons/mob/hud/marine_hud.dmi differ diff --git a/icons/mob/hud/sec_hud.dmi b/icons/mob/hud/sec_hud.dmi index 9c1c4052caaf..9cc3e66c3e0b 100644 Binary files a/icons/mob/hud/sec_hud.dmi and b/icons/mob/hud/sec_hud.dmi differ diff --git a/icons/mob/humans/onmob/back.dmi b/icons/mob/humans/onmob/back.dmi index fe04c9d66dc3..4689fd35ab50 100644 Binary files a/icons/mob/humans/onmob/back.dmi and b/icons/mob/humans/onmob/back.dmi differ diff --git a/icons/mob/humans/onmob/hunter/items_lefthand.dmi b/icons/mob/humans/onmob/hunter/items_lefthand.dmi index f3379c469113..91aa364340cb 100644 Binary files a/icons/mob/humans/onmob/hunter/items_lefthand.dmi and b/icons/mob/humans/onmob/hunter/items_lefthand.dmi differ diff --git a/icons/mob/humans/onmob/hunter/items_righthand.dmi b/icons/mob/humans/onmob/hunter/items_righthand.dmi index fbca4cfed5bb..8ec0871464c5 100644 Binary files a/icons/mob/humans/onmob/hunter/items_righthand.dmi and b/icons/mob/humans/onmob/hunter/items_righthand.dmi differ diff --git a/icons/mob/humans/onmob/items_lefthand_0.dmi b/icons/mob/humans/onmob/items_lefthand_0.dmi index 1f154ef92396..a040ddb7a65e 100644 Binary files a/icons/mob/humans/onmob/items_lefthand_0.dmi and b/icons/mob/humans/onmob/items_lefthand_0.dmi differ diff --git a/icons/mob/humans/onmob/items_righthand_0.dmi b/icons/mob/humans/onmob/items_righthand_0.dmi index 858da88c29ed..a09244c30139 100644 Binary files a/icons/mob/humans/onmob/items_righthand_0.dmi and b/icons/mob/humans/onmob/items_righthand_0.dmi differ diff --git a/icons/mob/humans/onmob/suit_1.dmi b/icons/mob/humans/onmob/suit_1.dmi index f0daf54e7ac9..19f2a2f6f68b 100644 Binary files a/icons/mob/humans/onmob/suit_1.dmi and b/icons/mob/humans/onmob/suit_1.dmi differ diff --git a/icons/mob/humans/onmob/ties.dmi b/icons/mob/humans/onmob/ties.dmi index b9ffbdd61ca4..a908aaf71037 100644 Binary files a/icons/mob/humans/onmob/ties.dmi and b/icons/mob/humans/onmob/ties.dmi differ diff --git a/icons/obj/items/clothing/backpacks.dmi b/icons/obj/items/clothing/backpacks.dmi index 8dbba91502fe..26d2c944e9dd 100644 Binary files a/icons/obj/items/clothing/backpacks.dmi and b/icons/obj/items/clothing/backpacks.dmi differ diff --git a/icons/obj/items/clothing/cm_suits.dmi b/icons/obj/items/clothing/cm_suits.dmi index 3a2ba038bef4..232e74695a1b 100644 Binary files a/icons/obj/items/clothing/cm_suits.dmi and b/icons/obj/items/clothing/cm_suits.dmi differ diff --git a/icons/obj/items/clothing/ties.dmi b/icons/obj/items/clothing/ties.dmi index 4f5a3777ab10..083aaa4d4ada 100644 Binary files a/icons/obj/items/clothing/ties.dmi and b/icons/obj/items/clothing/ties.dmi differ diff --git a/icons/obj/items/storage.dmi b/icons/obj/items/storage.dmi index 2d0c1f5928df..310bee26b9e9 100644 Binary files a/icons/obj/items/storage.dmi and b/icons/obj/items/storage.dmi differ diff --git a/icons/obj/structures/machinery/comm_tower3.dmi b/icons/obj/structures/machinery/comm_tower3.dmi index 931d6f77514a..8a5aa1f68fe3 100644 Binary files a/icons/obj/structures/machinery/comm_tower3.dmi and b/icons/obj/structures/machinery/comm_tower3.dmi differ diff --git a/icons/obj/structures/props/props.dmi b/icons/obj/structures/props/props.dmi index bd22e985b2ae..57485feeaecc 100644 Binary files a/icons/obj/structures/props/props.dmi and b/icons/obj/structures/props/props.dmi differ diff --git a/icons/obj/structures/structures.dmi b/icons/obj/structures/structures.dmi index 21567936aad0..ef63dee56e13 100644 Binary files a/icons/obj/structures/structures.dmi and b/icons/obj/structures/structures.dmi differ diff --git a/icons/turf/ert_shuttle.dmi b/icons/turf/ert_shuttle.dmi index 2a9627a77094..6c38d6b409c0 100644 Binary files a/icons/turf/ert_shuttle.dmi and b/icons/turf/ert_shuttle.dmi differ diff --git a/icons/ui_icons/map_blips.dmi b/icons/ui_icons/map_blips.dmi index 829d9b8a43b0..0034b4fd6ff7 100644 Binary files a/icons/ui_icons/map_blips.dmi and b/icons/ui_icons/map_blips.dmi differ diff --git a/maps/Nightmare/maps/DesertDam/nightmare.json b/maps/Nightmare/maps/DesertDam/nightmare.json index e1b1e5123ac0..261481f6531b 100644 --- a/maps/Nightmare/maps/DesertDam/nightmare.json +++ b/maps/Nightmare/maps/DesertDam/nightmare.json @@ -1,9 +1,16 @@ [ { "type": "pick", "choices": [ { "type": "map_insert", "landmark": "green-new-bridge", "path": "greenriver/newbridge.dmm" } - ], "chance": 0.5 }, + ], "chance": 0.0 }, { "type": "pick", "choices": [ { "weight": 2, "type": "map_insert", "landmark": "purple-new-bridge", "path": "purpleriver/newbridge.dmm" } - ], "chance": 0.6 }, - { "type": "map_sprinkle", "path": "sprinkles/" } + ], "chance": 0.0 }, + { "type": "map_sprinkle", "path": "sprinkles/" }, + { + "type": "map_insert", + "landmark": "uppcrash", + "chance": 1.0, + "path": "standalone/crashlanding-upp-bar.dmm", + "when": { "lvevent": "uppcrash" } + } ] diff --git a/maps/Nightmare/maps/DesertDam/scenario.json b/maps/Nightmare/maps/DesertDam/scenario.json index fe51488c7066..bacb95e27c25 100644 --- a/maps/Nightmare/maps/DesertDam/scenario.json +++ b/maps/Nightmare/maps/DesertDam/scenario.json @@ -1 +1,9 @@ -[] +[ + { + "type": "pick", "name": "uppcrash", + "choices": [ + { "weight": 10, "type": "def", "values": { "lvevent": "none" } }, + { "weight": 4, "type": "def", "values": { "lvevent": "uppcrash" } } + ] + } +] diff --git a/maps/map_files/BigRed/BigRed.dmm b/maps/map_files/BigRed/BigRed.dmm index 29e43dc9e128..32259fa72f45 100644 --- a/maps/map_files/BigRed/BigRed.dmm +++ b/maps/map_files/BigRed/BigRed.dmm @@ -1975,7 +1975,6 @@ "afP" = ( /obj/structure/machinery/door/airlock/almayer/security/glass/colony{ dir = 1; - locked = 0; name = "\improper Marshal Office Prison" }, /turf/open/floor{ @@ -1986,7 +1985,6 @@ /obj/structure/pipes/standard/simple/hidden/green, /obj/structure/machinery/door/airlock/almayer/security/glass/colony{ dir = 1; - locked = 0; name = "\improper Marshal Office Prison" }, /turf/open/floor{ @@ -2799,7 +2797,6 @@ /obj/structure/pipes/standard/simple/hidden/green, /obj/structure/machinery/door/airlock/almayer/security/glass/colony{ dir = 1; - locked = 0; name = "\improper Marshal Office Armory" }, /turf/open/floor{ @@ -3387,7 +3384,6 @@ dir = 4 }, /obj/structure/machinery/door/airlock/almayer/security/glass/colony{ - locked = 0; name = "\improper Marshal Office Armory" }, /turf/open/floor{ @@ -4684,7 +4680,6 @@ "anx" = ( /obj/structure/machinery/door/airlock/almayer/security/glass/colony{ dir = 1; - locked = 0; name = "\improper Marshal Office Holding Cell" }, /turf/open/floor{ @@ -6923,7 +6918,6 @@ dir = 1; icon_state = "door_locked"; id = "safe_room"; - locked = 0; name = "\improper Lambda Lab Secure Storage" }, /turf/open/floor{ @@ -27115,12 +27109,6 @@ icon_state = "delivery" }, /area/bigredv2/outside/office_complex) -"bFh" = ( -/obj/structure/surface/table, -/turf/open/floor{ - icon_state = "wood" - }, -/area/bigredv2/caves/eta/living) "bFw" = ( /turf/closed/wall/solaris/reinforced, /area/bigredv2/outside/telecomm/warehouse) @@ -62303,14 +62291,14 @@ aDX kqS bDu bDA -bFh +aRf aDX bDU elM aDX bDo aQy -bFh +aRf aRf aDX bEK diff --git a/maps/map_files/DesertDam/Desert_Dam.dmm b/maps/map_files/DesertDam/Desert_Dam.dmm index 9aeb42c9d8c5..938092bde688 100644 --- a/maps/map_files/DesertDam/Desert_Dam.dmm +++ b/maps/map_files/DesertDam/Desert_Dam.dmm @@ -64447,6 +64447,15 @@ icon_state = "desert_transition_corner1" }, /area/desert_dam/interior/caves/temple) +"sRl" = ( +/obj/effect/landmark/nightmare{ + insert_tag = "uppcrash" + }, +/turf/open/desert/dirt{ + dir = 6; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/valley_hydro) "sUe" = ( /obj/effect/decal/sand_overlay/sand1{ dir = 1 @@ -82412,7 +82421,7 @@ dTs dTs dTs dTs -cMo +sRl dNS cZw xgA diff --git a/maps/map_files/DesertDam/standalone/crashlanding-upp-bar.dmm b/maps/map_files/DesertDam/standalone/crashlanding-upp-bar.dmm new file mode 100644 index 000000000000..f4efd48f0a88 --- /dev/null +++ b/maps/map_files/DesertDam/standalone/crashlanding-upp-bar.dmm @@ -0,0 +1,4544 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/closed/shuttle/ert{ + icon_state = "upp25"; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"ab" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal7" + }, +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 1 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"am" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal11" + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 6 + }, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"aw" = ( +/obj/effect/decal/sand_overlay/sand1, +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/obj/item/ammo_casing/bullet, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached12" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"aO" = ( +/obj/item/prop/colony/used_flare, +/turf/open/floor/plating{ + dir = 8; + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/bar) +"aT" = ( +/turf/closed/shuttle/ert{ + icon_state = "T16"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"aY" = ( +/obj/item/reagent_container/food/drinks/flask/canteen{ + desc = "You take a sip from your trusty UPP canteen..." + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"be" = ( +/obj/structure/closet/secure_closet/bar, +/obj/effect/landmark/objective_landmark/close, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/backroom) +"bf" = ( +/obj/structure/desertdam/decals/road_edge, +/obj/effect/spawner/gibspawner/xeno, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"bu" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor{ + icon_state = "grimy" + }, +/area/desert_dam/building/bar/bar) +"bz" = ( +/obj/structure/bed/roller, +/obj/structure/machinery/iv_drip, +/obj/effect/decal/cleanable/blood, +/obj/item/prop/colony/usedbandage{ + dir = 5 + }, +/obj/effect/spawner/gibspawner/human, +/turf/open/shuttle/dropship{ + icon_state = "rasputin6" + }, +/area/desert_dam/building/bar/bar) +"bC" = ( +/obj/structure/barricade/sandbags/wired{ + dir = 1 + }, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/backroom) +"bI" = ( +/obj/item/ammo_casing/bullet, +/turf/open/desert/dirt{ + dir = 5; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"bJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"bN" = ( +/obj/item/stack/sheet/metal, +/turf/open/floor/plating, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"bO" = ( +/turf/closed/shuttle/ert{ + icon_state = "T4"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"bP" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/obj/structure/disposalpipe/segment, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"bY" = ( +/turf/closed/shuttle/ert{ + icon_state = "upp4"; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"cl" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal2" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"cu" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) +"cH" = ( +/obj/item/stack/sheet/metal, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"cI" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar_restroom) +"cL" = ( +/obj/effect/decal/cleanable/blood, +/obj/structure/bed/chair/dropship/pilot{ + dir = 1 + }, +/obj/structure/machinery/computer/cameras{ + desc = "The flight controls for a Mi-220 Attack Dropship. these controls look pretty banged up, and there's some blood covering the screen.."; + name = "\improper 'Fulcrum' flight controls"; + network = null; + pixel_y = 21 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/desert_dam/building/bar/bar) +"cR" = ( +/obj/effect/landmark/crap_item, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"cZ" = ( +/turf/open/asphalt/cement{ + icon_state = "cement2" + }, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"da" = ( +/obj/structure/flora/grass/desert/heavygrass_4, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"ds" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/shuttle/ert{ + icon_state = "T11"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"du" = ( +/obj/item/stack/rods, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/backroom) +"dJ" = ( +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/asphalt/cement{ + icon_state = "cement14" + }, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"dQ" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal4" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"dR" = ( +/turf/open/asphalt/cement{ + icon_state = "cement3" + }, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"dX" = ( +/obj/structure/surface/table/almayer, +/obj/item/ammo_box/rounds/type71{ + bullet_amount = 129 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/desert_dam/building/bar/bar) +"ee" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E" + }, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"eh" = ( +/turf/open/floor/plating{ + dir = 8; + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/bar_restroom) +"ej" = ( +/obj/structure/flora/grass/desert/lightgrass_2, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"eD" = ( +/obj/structure/flora/grass/tallgrass/desert, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"eI" = ( +/obj/effect/decal/sand_overlay/sand1, +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal3" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"eJ" = ( +/obj/structure/desertdam/decals/road_edge, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"eK" = ( +/obj/structure/fence, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"eQ" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal9" + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"eT" = ( +/obj/structure/barricade/sandbags/wired{ + dir = 4 + }, +/obj/item/shard{ + icon_state = "medium" + }, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"eU" = ( +/obj/structure/surface/table/almayer, +/obj/item/trash/semki, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"eV" = ( +/obj/structure/surface/table/almayer, +/obj/item/clothing/accessory/patch/upp{ + pixel_y = -6; + pixel_x = -7 + }, +/obj/item/paper/bigred/upp{ + pixel_y = 4; + pixel_x = 3 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/desert_dam/building/bar/bar) +"fk" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached13" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"fy" = ( +/obj/structure/flora/grass/desert/lightgrass_6, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"fL" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal2" + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/obj/item/ammo_magazine/rifle/type71/heap{ + current_rounds = 0 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"fM" = ( +/obj/item/stack/rods, +/turf/open/floor{ + icon_state = "grimy" + }, +/area/desert_dam/building/bar/bar) +"fN" = ( +/obj/structure/disposalpipe/segment, +/obj/item/stack/sandbags, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"fP" = ( +/obj/structure/bed/bedroll, +/obj/item/bedsheet/brown, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) +"fR" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 4 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached13" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"ga" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/obj/item/prop/colony/used_flare, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached13" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"gm" = ( +/obj/structure/desertdam/decals/road_edge, +/turf/open/floor/plating, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"gA" = ( +/obj/structure/disposalpipe/segment, +/obj/item/ammo_casing/bullet, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"gM" = ( +/obj/item/trash/candy, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"gN" = ( +/obj/item/ammo_casing/bullet, +/obj/effect/decal/cleanable/blood, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"gP" = ( +/obj/structure/flora/grass/desert/lightgrass_4, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"gR" = ( +/obj/effect/decal/sand_overlay/sand1, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"hc" = ( +/obj/structure/prop/dam/wide_boulder/boulder1, +/turf/open/desert/dirt{ + dir = 9; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"hd" = ( +/obj/structure/flora/grass/desert/lightgrass_8, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"hi" = ( +/obj/item/ammo_casing/bullet, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"hk" = ( +/obj/structure/machinery/squeezer, +/turf/open/floor/plating, +/area/desert_dam/building/bar/backroom) +"hm" = ( +/turf/closed/shuttle/ert{ + icon_state = "upp5"; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"hn" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal2" + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/obj/effect/spawner/gibspawner/xeno, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"hv" = ( +/turf/closed/wall/wood, +/area/desert_dam/building/bar/bar) +"hx" = ( +/turf/closed/shuttle/ert{ + icon_state = "upp20"; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"hF" = ( +/obj/structure/machinery/light/double{ + dir = 8 + }, +/obj/effect/landmark/survivor_spawner/upp_medic, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) +"hH" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal4" + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"hJ" = ( +/obj/item/ammo_box/rounds/type71/heap/empty{ + bullet_amount = 0 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"hO" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"hT" = ( +/obj/structure/pipes/vents/pump{ + dir = 4 + }, +/turf/open/floor/prison{ + dir = 8; + icon_state = "sterile_white" + }, +/area/desert_dam/building/bar/bar_restroom) +"hY" = ( +/obj/structure/bed/stool, +/turf/open/floor{ + icon_state = "grimy" + }, +/area/desert_dam/building/bar/bar) +"if" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/rods, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"ig" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 5 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"in" = ( +/obj/item/prop/colony/used_flare, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"is" = ( +/turf/open/desert/dirt{ + icon_state = "desert_transition_corner1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"iy" = ( +/turf/closed/wall/wood, +/area/desert_dam/building/bar/backroom) +"iz" = ( +/obj/structure/flora/bush/desert/cactus, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"iI" = ( +/obj/item/ammo_casing/bullet, +/turf/open/desert/rock, +/area/desert_dam/exterior/valley/bar_valley_dam) +"iL" = ( +/obj/structure/prop/dam/boulder/boulder1, +/turf/open/desert/dirt{ + dir = 1; + icon_state = "desert_transition_corner1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"iV" = ( +/obj/effect/landmark/crap_item, +/turf/open/floor/plating, +/area/desert_dam/building/bar/backroom) +"jf" = ( +/obj/structure/prop/invuln/lattice_prop{ + icon_state = "lattice12"; + pixel_x = -7; + pixel_y = 35 + }, +/obj/structure/prop/invuln/pipe_water{ + pixel_y = 11 + }, +/obj/item/reagent_container/glass/bucket/mopbucket, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"jj" = ( +/obj/item/trash/cheesie, +/obj/item/stack/sheet/wood, +/turf/open/floor{ + icon_state = "grimy" + }, +/area/desert_dam/building/bar/bar) +"jm" = ( +/obj/effect/decal/sand_overlay/sand1, +/obj/structure/barricade/sandbags/wired{ + dir = 8 + }, +/obj/item/prop/colony/usedbandage{ + dir = 5; + pixel_y = 8 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"jp" = ( +/obj/structure/desertdam/decals/road_edge, +/obj/structure/machinery/door/poddoor/almayer/locked{ + dir = 2; + id = "dam_checkpoint_west"; + name = "\improper Checkpoint Lock" + }, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"jr" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal2" + }, +/obj/structure/machinery/door/poddoor/almayer/locked{ + dir = 2; + id = "dam_checkpoint_west"; + name = "\improper Checkpoint Lock" + }, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"jt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/interior/wood/alt, +/area/desert_dam/building/bar/bar) +"jw" = ( +/obj/item/ammo_casing/bullet, +/turf/open/desert/dirt{ + dir = 6; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"jy" = ( +/obj/structure/machinery/door/airlock/almayer/maint/colony{ + dir = 1; + name = "\improper Bar Backroom" + }, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/backroom) +"jC" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"jI" = ( +/obj/structure/barricade/sandbags/wired{ + dir = 4 + }, +/turf/open/desert/dirt{ + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"jJ" = ( +/obj/structure/flora/grass/desert/lightgrass_1, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"kf" = ( +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"kh" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal2" + }, +/obj/item/ammo_casing/bullet, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"ki" = ( +/obj/item/stack/sandbags, +/turf/open/desert/dirt{ + dir = 10; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"kk" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached13" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"kp" = ( +/obj/effect/decal/cleanable/blood, +/obj/item/prop/almayer/flight_recorder/colony, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) +"kB" = ( +/obj/structure/barricade/sandbags/wired{ + dir = 4 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached14" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"kD" = ( +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"kM" = ( +/turf/closed/shuttle/ert{ + icon_state = "rightengine_2"; + opacity = 0; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"kQ" = ( +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/desert_dam/building/bar/backroom) +"ln" = ( +/turf/open/desert/rock, +/area/desert_dam/exterior/valley/bar_valley_dam) +"lC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached4" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"lT" = ( +/turf/open/desert/dirt{ + dir = 8; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"mb" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 6 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"md" = ( +/obj/item/ammo_magazine/rifle/type71/heap{ + current_rounds = 0 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"mf" = ( +/turf/open/desert/dirt{ + dir = 9; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"mq" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 8 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"mw" = ( +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 4 + }, +/obj/item/prop/colony/used_flare, +/turf/open/floor/plating{ + dir = 8; + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/backroom) +"mF" = ( +/obj/structure/disposalpipe/segment, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"mL" = ( +/obj/structure/flora/bush/desert/cactus{ + icon_state = "cactus_8" + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"mR" = ( +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"mT" = ( +/obj/item/ammo_casing/bullet, +/obj/structure/machinery/light/double{ + dir = 1 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"mV" = ( +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/building/bar/bar_restroom) +"nk" = ( +/turf/closed/shuttle/ert{ + icon_state = "T3"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"np" = ( +/obj/structure/flora/grass/desert/lightgrass_1, +/obj/item/ammo_casing/bullet, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"nt" = ( +/obj/effect/decal/sand_overlay/sand1, +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal3" + }, +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"ny" = ( +/obj/effect/decal/cleanable/blood, +/obj/item/prop/almayer/comp_closed, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) +"nz" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/shuttle/ert{ + icon_state = "T8"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"nB" = ( +/obj/effect/landmark/survivor_spawner/upp/soldier, +/turf/open/shuttle/dropship{ + icon_state = "rasputin5" + }, +/area/desert_dam/building/bar/bar) +"nC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/rods, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/bar) +"nD" = ( +/obj/structure/flora/grass/desert/heavygrass_4, +/obj/item/trash/cheesie, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"nP" = ( +/obj/structure/machinery/colony_floodlight, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"nR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 1 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"oc" = ( +/obj/structure/surface/table/reinforced, +/obj/structure/machinery/chem_dispenser/soda{ + density = 0; + pixel_y = 32 + }, +/obj/effect/landmark/objective_landmark/medium, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"oo" = ( +/obj/structure/flora/grass/desert/heavygrass_4, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"oy" = ( +/obj/effect/decal/sand_overlay/sand1, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached16" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"oD" = ( +/obj/structure/machinery/vending/snack, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/bar) +"oF" = ( +/obj/item/ammo_casing/bullet, +/obj/item/ammo_magazine/rifle/type71/heap{ + current_rounds = 0 + }, +/turf/open/desert/dirt{ + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"oK" = ( +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 8 + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 9 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached16" + }, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"oN" = ( +/obj/effect/decal/sand_overlay/sand1, +/obj/item/ammo_casing/bullet, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached12" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"pk" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 10 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"pq" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal2" + }, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"pu" = ( +/obj/structure/machinery/light/double, +/turf/open/desert/dirt{ + dir = 5; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"px" = ( +/obj/structure/barricade/sandbags/wired{ + dir = 4 + }, +/obj/item/prop/colony/used_flare, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"py" = ( +/obj/structure/machinery/door/airlock/almayer/generic{ + dir = 2; + name = "\improper Fulcrum Airlock" + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) +"pA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/rods, +/turf/open/floor/plating{ + dir = 8; + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/bar) +"pM" = ( +/obj/structure/bed/chair/dropship/passenger, +/obj/item/storage/belt/medical/lifesaver/upp, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/desert_dam/building/bar/bar) +"pO" = ( +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 4 + }, +/turf/closed/shuttle/ert{ + icon_state = "T10"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"pW" = ( +/turf/closed/wall/r_wall/bunker{ + name = "reinforced metal wall" + }, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"pZ" = ( +/obj/item/prop/colony/usedbandage{ + dir = 9; + pixel_x = 5; + pixel_y = 15 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"qe" = ( +/obj/structure/prop/dam/boulder/boulder3, +/turf/open/desert/dirt{ + dir = 8; + icon_state = "desert_transition_corner1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"qu" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/obj/item/prop/colony/used_flare, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"qx" = ( +/turf/open/desert/dirt{ + dir = 4; + icon_state = "desert_transition_corner1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"qS" = ( +/turf/open/floor/interior/wood/alt, +/area/desert_dam/building/bar/bar) +"qU" = ( +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/floor/interior/wood/alt, +/area/desert_dam/building/bar/bar) +"rj" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"rl" = ( +/obj/structure/barricade/sandbags/wired{ + dir = 1 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"rm" = ( +/obj/structure/machinery/power/apc{ + dir = 8; + pixel_x = -30; + start_charge = 0 + }, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/bar) +"rR" = ( +/obj/structure/prop/dam/boulder/boulder1, +/turf/open/desert/dirt{ + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"rX" = ( +/obj/item/prop/colony/folded_bedroll, +/obj/item/shard{ + icon_state = "medium" + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/bar) +"se" = ( +/obj/item/trash/semki, +/turf/open/shuttle/dropship, +/area/desert_dam/building/bar/bar) +"sn" = ( +/obj/structure/barricade/sandbags/wired{ + dir = 4 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"so" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/asphalt/cement{ + icon_state = "cement3" + }, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"sp" = ( +/obj/structure/machinery/cm_vending/sorted/boozeomat, +/turf/open/floor{ + icon_state = "grimy" + }, +/area/desert_dam/building/bar/bar) +"su" = ( +/obj/structure/surface/table/reinforced, +/obj/structure/machinery/chem_dispenser/soda{ + density = 0; + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"sv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/tool/shovel, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"sE" = ( +/obj/structure/machinery/light/double{ + dir = 4; + pixel_y = -5 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin7" + }, +/area/desert_dam/building/bar/bar) +"sH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/barricade/sandbags/wired, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"sI" = ( +/obj/structure/flora/grass/desert/lightgrass_5, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"sO" = ( +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/backroom) +"sT" = ( +/obj/structure/flora/grass/desert/lightgrass_3, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"tl" = ( +/obj/item/ammo_casing/bullet, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"tu" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/shuttle/dropship{ + icon_state = "rasputin8" + }, +/area/desert_dam/building/bar/bar) +"tA" = ( +/obj/item/tool/wrench, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) +"tE" = ( +/obj/structure/flora/grass/desert/heavygrass_3, +/obj/item/ammo_magazine/rifle/type71/heap{ + current_rounds = 0 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"tK" = ( +/obj/structure/bed/bedroll, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"tM" = ( +/turf/closed/shuttle/ert{ + icon_state = "leftengine_1"; + opacity = 0; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"tR" = ( +/obj/item/prop/colony/used_flare, +/turf/open/floor/plating, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"tW" = ( +/turf/closed/shuttle/ert{ + icon_state = "T11"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"tX" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"ug" = ( +/obj/structure/flora/grass/desert/lightgrass_10, +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"uA" = ( +/obj/structure/surface/table/almayer, +/obj/item/prop{ + desc = "A gas-operated rotary machine gun used by UPP heavies. Its enormous volume of fire and ammunition capacity allows the suppression of large concentrations of enemy forces. Heavy weapons training is required control its recoil, is non-functional."; + icon_state = "painless"; + item_state = "m41amk1"; + name = "\improper GSh-7.62 rotary machine gun"; + pixel_y = 7; + icon = 'icons/obj/items/weapons/guns/guns_by_faction/upp.dmi' + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/desert_dam/building/bar/bar) +"uF" = ( +/turf/open/desert/dirt{ + dir = 4; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"uZ" = ( +/obj/item/roller, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) +"vk" = ( +/obj/structure/flora/grass/desert/lightgrass_9, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"vl" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal2" + }, +/obj/effect/decal/sand_overlay/sand1/corner1, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"vn" = ( +/obj/item/prop/colony/used_flare, +/turf/open/floor/prison{ + dir = 8; + icon_state = "sterile_white" + }, +/area/desert_dam/building/bar/bar_restroom) +"vq" = ( +/obj/structure/sink, +/obj/effect/landmark/objective_landmark/medium, +/turf/open/floor/prison{ + dir = 8; + icon_state = "sterile_white" + }, +/area/desert_dam/building/bar/bar_restroom) +"vy" = ( +/obj/item/prop/colony/used_flare, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar_restroom) +"vP" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal5" + }, +/obj/item/ammo_casing/bullet, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"vR" = ( +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"vZ" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached13" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"wj" = ( +/obj/item/stack/sheet/metal, +/turf/open/floor/plating{ + dir = 8; + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/bar) +"wm" = ( +/obj/structure/pipes/standard/simple/hidden/green, +/turf/closed/shuttle/ert{ + icon_state = "upp5"; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"wp" = ( +/obj/structure/flora/grass/desert/heavygrass_10, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"wq" = ( +/obj/structure/flora/grass/desert/lightgrass_2, +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"ws" = ( +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 4 + }, +/turf/closed/shuttle/ert{ + icon_state = "T17"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"wv" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 6 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"wy" = ( +/obj/item/trash/candy, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/desert_dam/building/bar/bar_restroom) +"wE" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"wI" = ( +/obj/structure/machinery/light/double{ + dir = 1 + }, +/obj/structure/bed/bedroll, +/obj/item/reagent_container/food/drinks/bottle/vodka, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"wJ" = ( +/turf/open/desert/dirt{ + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"wO" = ( +/obj/structure/barricade/sandbags/wired{ + dir = 4 + }, +/obj/structure/barricade/sandbags/wired{ + dir = 1 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"wT" = ( +/turf/closed/shuttle/ert{ + icon_state = "upp16"; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"wZ" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S-corner" + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/desert_dam/building/bar/bar) +"xg" = ( +/obj/structure/prop/dam/boulder/boulder1, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"xj" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/obj/effect/landmark/crap_item, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached4" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"xm" = ( +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"xn" = ( +/obj/structure/prop/dam/large_boulder{ + icon_state = "boulder_large1" + }, +/turf/open/desert/rock, +/area/desert_dam/exterior/valley/bar_valley_dam) +"xr" = ( +/obj/structure/prop/dam/boulder/boulder3, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"xt" = ( +/obj/structure/barricade/sandbags/wired{ + dir = 1 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"xx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/bar) +"xz" = ( +/obj/structure/prop/wooden_cross{ + pixel_y = 13 + }, +/obj/item/clothing/accessory/patch/upp{ + pixel_y = -6 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"xG" = ( +/obj/structure/machinery/power/apc{ + dir = 8; + pixel_x = -30; + start_charge = 0 + }, +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/floor/prison{ + dir = 10; + icon_state = "floor_plate" + }, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"xN" = ( +/turf/closed/shuttle/ert{ + icon_state = "rightengine_1"; + opacity = 0; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"xP" = ( +/obj/item/ammo_casing/bullet, +/turf/open/desert/dirt{ + dir = 9; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"xT" = ( +/turf/template_noop, +/area/template_noop) +"xX" = ( +/obj/item/prop/colony/used_flare, +/turf/open/desert/rock, +/area/desert_dam/exterior/valley/bar_valley_dam) +"yc" = ( +/obj/structure/flora/grass/desert/lightgrass_3, +/obj/item/prop/colony/usedbandage{ + dir = 10 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"ye" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/sheet/wood, +/turf/open/floor{ + icon_state = "grimy" + }, +/area/desert_dam/building/bar/bar) +"yf" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E" + }, +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"yk" = ( +/obj/structure/prop/dam/large_boulder/boulder2, +/turf/open/desert/dirt{ + dir = 6; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"ym" = ( +/obj/item/stack/sandbags/large_stack, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"yo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/shard{ + icon_state = "medium" + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/desert_dam/building/bar/bar) +"ys" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 1 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"yx" = ( +/obj/structure/closet/secure_closet/bar, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/backroom) +"yC" = ( +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 9 + }, +/turf/closed/shuttle/ert{ + icon_state = "upp5"; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"yF" = ( +/obj/effect/decal/cleanable/blood, +/obj/item/ammo_magazine/rifle/type71/heap{ + current_rounds = 0 + }, +/turf/open/shuttle/dropship, +/area/desert_dam/building/bar/bar) +"yG" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal11" + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 6 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"yP" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached4" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"zl" = ( +/obj/structure/disposalpipe/segment{ + dir = 8; + icon_state = "pipe-c" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"zm" = ( +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 4 + }, +/obj/structure/machinery/light/double{ + dir = 1 + }, +/turf/open/floor/prison{ + dir = 8; + icon_state = "sterile_white" + }, +/area/desert_dam/building/bar/bar_restroom) +"zC" = ( +/obj/structure/pipes/standard/manifold/hidden/green{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/closed/shuttle/ert{ + icon_state = "T6"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"zD" = ( +/obj/structure/surface/table/woodentable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor{ + icon_state = "grimy" + }, +/area/desert_dam/building/bar/bar) +"zM" = ( +/turf/open/floor/plating{ + dir = 8; + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/bar) +"zO" = ( +/turf/open/desert/dirt{ + dir = 10; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"zS" = ( +/obj/structure/flora/grass/desert/heavygrass_4, +/turf/open/desert/dirt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"zT" = ( +/obj/structure/surface/table/woodentable, +/obj/effect/landmark/good_item, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/backroom) +"zZ" = ( +/obj/structure/barricade/sandbags/wired{ + dir = 8 + }, +/obj/structure/machinery/light/double{ + dir = 1 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Ae" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/prison{ + dir = 10; + icon_state = "floor_plate" + }, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"Ah" = ( +/obj/structure/barricade/wooden{ + dir = 1; + pixel_y = 7 + }, +/turf/open/floor/plating, +/area/desert_dam/building/bar/backroom) +"Al" = ( +/obj/structure/machinery/light/double{ + dir = 1 + }, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"At" = ( +/obj/effect/landmark/crap_item, +/turf/open/floor/interior/wood/alt, +/area/desert_dam/building/bar/bar) +"Aw" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal5" + }, +/obj/effect/decal/sand_overlay/sand1/corner1, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"AC" = ( +/obj/structure/barricade/sandbags/wired{ + dir = 1 + }, +/turf/open/desert/dirt{ + dir = 6; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"AT" = ( +/turf/closed/shuttle/ert{ + icon_state = "T2"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"Bj" = ( +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/backroom) +"Bq" = ( +/obj/structure/machinery/light/double{ + dir = 8 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin6" + }, +/area/desert_dam/building/bar/bar) +"Bu" = ( +/obj/effect/decal/sand_overlay/sand1, +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached12" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Bx" = ( +/obj/structure/surface/table/almayer, +/obj/item/reagent_container/food/drinks/bottle/vodka, +/obj/item/reagent_container/food/drinks/bottle/vodka{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/reagent_container/food/drinks/bottle/vodka{ + pixel_y = -8; + pixel_x = -8 + }, +/obj/item/reagent_container/food/drinks/bottle/vodka{ + pixel_x = 6 + }, +/obj/item/ammo_magazine/rifle/type71/heap{ + current_rounds = 0 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/desert_dam/building/bar/bar) +"BB" = ( +/turf/closed/shuttle/ert{ + icon_state = "T5"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"BK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/obj/item/reagent_container/food/drinks/flask/canteen{ + desc = "You take a sip from your trusty UPP canteen..." + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"BM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + dir = 8; + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/bar) +"BP" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal5" + }, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"BU" = ( +/obj/item/ammo_magazine/rifle/type71/heap{ + current_rounds = 0 + }, +/obj/item/shard{ + icon_state = "medium" + }, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"BW" = ( +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 4 + }, +/turf/open/floor/plating{ + dir = 8; + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/backroom) +"Cc" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal9" + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 9 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Ce" = ( +/turf/open/desert/dirt{ + dir = 8; + icon_state = "desert_transition_corner1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Ch" = ( +/turf/open/desert/dirt{ + dir = 6; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Cm" = ( +/obj/structure/prop/invuln/lattice_prop{ + icon_state = "lattice12"; + pixel_x = 1; + pixel_y = 35 + }, +/turf/closed/shuttle/ert{ + icon_state = "T3"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"Cn" = ( +/obj/effect/landmark/survivor_spawner/upp/soldier, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) +"Cx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached13" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"CA" = ( +/turf/closed/shuttle/ert{ + icon_state = "upp21"; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"CE" = ( +/obj/structure/desertdam/decals/road_edge, +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"CH" = ( +/obj/item/stack/sheet/metal, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/desert_dam/building/bar/bar_restroom) +"CI" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 10 + }, +/obj/structure/prop/wooden_cross{ + pixel_y = 13 + }, +/obj/item/clothing/mask/cigarette/cigar, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"CL" = ( +/turf/closed/shuttle/ert{ + icon_state = "leftengine_2"; + opacity = 0; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"CX" = ( +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 4 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached13" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Db" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"Df" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Di" = ( +/obj/item/prop/colony/used_flare, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Dn" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/shuttle/ert{ + icon_state = "T7"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"Dt" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/bar_restroom) +"Du" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/shuttle/ert{ + icon_state = "upp5"; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"DB" = ( +/obj/structure/bed/bedroll, +/obj/item/trash/cheesie, +/turf/open/shuttle/dropship{ + icon_state = "rasputin7" + }, +/area/desert_dam/building/bar/bar) +"DD" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ + dir = 2; + name = "\improper Bar" + }, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/bar) +"DE" = ( +/obj/structure/machinery/light, +/turf/open/floor/prison{ + dir = 8; + icon_state = "sterile_white" + }, +/area/desert_dam/building/bar/bar_restroom) +"DO" = ( +/obj/effect/spawner/gibspawner/xeno, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"DR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/sand_overlay/sand1, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached12" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"DZ" = ( +/obj/structure/pipes/standard/simple/hidden/green, +/obj/effect/decal/cleanable/dirt, +/turf/closed/shuttle/ert{ + icon_state = "T4"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"Eb" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"Ec" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/ammo_casing/bullet, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Eg" = ( +/turf/open/desert/dirt{ + dir = 5; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Ek" = ( +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 4 + }, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/backroom) +"Eq" = ( +/obj/effect/decal/sand_overlay/sand1, +/obj/structure/barricade/sandbags/wired{ + dir = 4 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached19" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Er" = ( +/obj/item/stack/sheet/wood, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/bar) +"Ev" = ( +/turf/open/floor{ + icon_state = "grimy" + }, +/area/desert_dam/building/bar/bar) +"Ex" = ( +/obj/item/prop/colony/used_flare, +/turf/open/desert/dirt{ + dir = 5; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"EH" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"EO" = ( +/turf/closed/shuttle/ert{ + icon_state = "T14"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"EW" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/obj/structure/disposalpipe/segment, +/obj/item/ammo_casing/bullet, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Fa" = ( +/obj/structure/flora/tree/joshua, +/turf/closed/wall/rock/orange, +/area/desert_dam/exterior/rock) +"Fd" = ( +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 4 + }, +/turf/open/floor{ + icon_state = "grimy" + }, +/area/desert_dam/building/bar/bar) +"Fh" = ( +/obj/item/storage/belt/utility, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) +"Fl" = ( +/obj/structure/pipes/standard/manifold/hidden/green, +/turf/closed/shuttle/ert{ + icon_state = "T15"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"Fr" = ( +/obj/item/stack/sandbags, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Fs" = ( +/obj/structure/flora/bush/desert{ + icon_state = "tree_3" + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"FB" = ( +/obj/structure/barricade/sandbags/wired{ + dir = 4 + }, +/turf/open/desert/dirt{ + dir = 4; + icon_state = "desert_transition_corner1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"FF" = ( +/obj/structure/disposalpipe/segment, +/obj/item/ammo_casing/bullet, +/obj/item/prop/colony/used_flare, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"FI" = ( +/obj/effect/decal/sand_overlay/sand1, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached15" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Gc" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/obj/item/ammo_casing/bullet, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached4" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Gd" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "pipe-c" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"GK" = ( +/obj/item/ammo_magazine/rifle/type71/heap{ + current_rounds = 0 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) +"GP" = ( +/obj/item/prop/colony/used_flare, +/turf/open/floor{ + icon_state = "grimy" + }, +/area/desert_dam/building/bar/bar) +"GY" = ( +/obj/item/trash/used_stasis_bag, +/obj/effect/landmark/survivor_spawner/squad_leader, +/turf/open/shuttle/dropship{ + icon_state = "rasputin5" + }, +/area/desert_dam/building/bar/bar) +"GZ" = ( +/obj/item/stack/barbed_wire/small_stack, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Hb" = ( +/obj/structure/desertdam/decals/road_edge, +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 8 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Hl" = ( +/turf/open/desert/dirt{ + dir = 1; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Hq" = ( +/obj/structure/barricade/sandbags/wired{ + dir = 4 + }, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"HB" = ( +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/desert_dam/building/bar/bar) +"HH" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E" + }, +/obj/item/prop/colony/used_flare, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"HI" = ( +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"HP" = ( +/turf/closed/shuttle/ert{ + icon_state = "T8"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"HV" = ( +/obj/structure/disposalpipe/segment, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Ip" = ( +/obj/item/prop/colony/usedbandage{ + dir = 5 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Iu" = ( +/turf/open/desert/dirt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"IA" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal2" + }, +/obj/item/stack/sandbags, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"IF" = ( +/obj/structure/bed/chair/dropship/passenger{ + dir = 8 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/desert_dam/building/bar/bar) +"IU" = ( +/obj/item/tool/shovel, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"IW" = ( +/turf/closed/shuttle/ert{ + icon_state = "upp27"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"Jc" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/desert_dam/building/bar/bar) +"Jd" = ( +/obj/structure/flora/grass/desert/lightgrass_5, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Ji" = ( +/obj/item/trash/candy, +/obj/item/stack/rods, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/desert_dam/building/bar/bar) +"Jk" = ( +/turf/open/desert/dirt{ + dir = 9; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"Js" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"Jt" = ( +/obj/item/trash/cheesie, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Jx" = ( +/obj/structure/desertdam/decals/road_edge, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"JB" = ( +/obj/structure/desertdam/decals/road_edge, +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/obj/item/prop/colony/used_flare, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"JS" = ( +/obj/structure/barricade/sandbags/wired, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"JT" = ( +/turf/closed/shuttle/ert{ + icon_state = "upp3"; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"Kf" = ( +/obj/structure/bed/bedroll, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"Kl" = ( +/obj/structure/window/framed/wood/reinforced, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"KA" = ( +/obj/structure/pipes/standard/manifold/hidden/green{ + dir = 1 + }, +/turf/closed/shuttle/ert{ + icon_state = "upp5"; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"KC" = ( +/obj/structure/barricade/sandbags/wired, +/turf/open/desert/dirt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"Li" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/obj/item/stack/sandbags, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached13" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Lo" = ( +/obj/effect/landmark/survivor_spawner/upp_medic, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) +"Lu" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal3" + }, +/obj/effect/decal/sand_overlay/sand1/corner1, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"Lw" = ( +/obj/item/stack/rods, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/bar) +"LB" = ( +/obj/structure/machinery/door/poddoor/almayer/locked{ + dir = 2; + id = "dam_checkpoint_west"; + name = "\improper Checkpoint Lock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"LC" = ( +/obj/item/prop/colony/usedbandage, +/turf/open/desert/dirt{ + dir = 10; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"LD" = ( +/obj/item/ammo_casing/bullet, +/turf/open/desert/dirt{ + dir = 8; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"LF" = ( +/obj/effect/spawner/gibspawner/xeno, +/turf/open/floor/prison{ + dir = 10; + icon_state = "floor_plate" + }, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"LJ" = ( +/obj/structure/machinery/power/apc{ + dir = 1; + pixel_y = 24; + start_charge = 0 + }, +/obj/item/stack/sheet/metal, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/backroom) +"LM" = ( +/obj/item/prop/colony/used_flare, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached16" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Ms" = ( +/obj/item/ammo_casing/bullet, +/obj/item/prop/colony/usedbandage{ + dir = 1 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Mw" = ( +/obj/structure/machinery/blackbox_recorder, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"MM" = ( +/obj/structure/machinery/light/double{ + dir = 4; + pixel_y = -5 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/spawner/gibspawner/human, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) +"MW" = ( +/obj/effect/decal/sand_overlay/sand1, +/obj/structure/barricade/sandbags/wired{ + dir = 4 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached12" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Nh" = ( +/obj/structure/flora/grass/desert/lightgrass_4, +/obj/effect/decal/sand_overlay/sand1{ + dir = 6 + }, +/obj/item/ammo_box/rounds/type71/heap/empty{ + bullet_amount = 0 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Nj" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 6 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"No" = ( +/obj/effect/spawner/gibspawner/xeno, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Nu" = ( +/obj/effect/spawner/gibspawner/xeno, +/turf/open/desert/dirt{ + dir = 1; + icon_state = "desert_transition_corner1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"NH" = ( +/obj/structure/machinery/light/double{ + dir = 4; + pixel_y = -5 + }, +/obj/effect/landmark/survivor_spawner/upp_sapper, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) +"NK" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/shuttle/ert{ + icon_state = "T20"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"Oe" = ( +/obj/structure/barricade/sandbags/wired{ + dir = 4 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Oj" = ( +/turf/closed/shuttle/ert{ + icon_state = "T12"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"Om" = ( +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 4 + }, +/turf/closed/shuttle/ert{ + icon_state = "T7"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"Ou" = ( +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 8 + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Ow" = ( +/obj/structure/prop/dam/boulder/boulder2, +/turf/open/desert/dirt{ + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"OD" = ( +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"OJ" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/obj/structure/machinery/sentry_holder/colony{ + dir = 1; + pixel_y = -10 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached19" + }, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"OO" = ( +/turf/closed/wall/r_wall, +/area/desert_dam/exterior/valley/bar_valley_dam) +"OS" = ( +/obj/structure/barricade/sandbags/wired, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"OU" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal4" + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/obj/item/ammo_casing/bullet, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"OZ" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Pd" = ( +/obj/structure/machinery/vending/coffee, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/bar) +"Pw" = ( +/turf/open/floor/prison{ + dir = 10; + icon_state = "floor_plate" + }, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"PH" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/obj/structure/prop/invuln/lattice_prop{ + icon_state = "lattice12"; + pixel_x = -7; + pixel_y = 35 + }, +/obj/structure/prop/invuln/lattice_prop{ + icon_state = "lattice12"; + pixel_x = 1; + pixel_y = 35 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"PR" = ( +/obj/structure/bed/chair/dropship/passenger{ + dir = 4 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/desert_dam/building/bar/bar) +"PS" = ( +/obj/effect/decal/sand_overlay/sand1, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached12" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"PX" = ( +/obj/structure/flora/grass/desert/heavygrass_5, +/obj/effect/decal/sand_overlay/sand1{ + dir = 5 + }, +/obj/effect/decal/cleanable/blood, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"PY" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/obj/structure/prop/wooden_cross{ + pixel_y = 13 + }, +/obj/item/toy/farwadoll, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Qc" = ( +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 4 + }, +/turf/open/floor{ + icon_state = "freezerfloor" + }, +/area/desert_dam/building/bar/bar_restroom) +"Qk" = ( +/obj/item/ammo_magazine/rifle/type71/heap{ + current_rounds = 0 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"QA" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/shuttle/ert{ + icon_state = "T2"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"QG" = ( +/obj/structure/surface/table/reinforced, +/obj/structure/machinery/chem_dispenser/soda{ + density = 0; + pixel_y = 32 + }, +/turf/open/floor{ + icon_state = "grimy" + }, +/area/desert_dam/building/bar/bar) +"QI" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 10 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"QK" = ( +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 4 + }, +/turf/closed/shuttle/ert{ + icon_state = "T9"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"QN" = ( +/obj/structure/machinery/door/poddoor/almayer/locked{ + dir = 2; + id = "dam_checkpoint_west"; + name = "\improper Checkpoint Lock" + }, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"QW" = ( +/obj/item/prop/colony/used_flare, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Re" = ( +/obj/item/ammo_box/rounds/type71/heap/empty{ + bullet_amount = 0 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin4" + }, +/area/desert_dam/building/bar/bar) +"Rl" = ( +/obj/structure/closet/crate/supply, +/obj/item/ammo_box/magazine/misc/flares, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/desert_dam/building/bar/bar) +"Ro" = ( +/obj/structure/flora/grass/desert/lightgrass_11, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Rs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/rods, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/desert_dam/building/bar/bar) +"RU" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 5 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached9" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"RW" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S-corner" + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) +"Sb" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E" + }, +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/floor/plating, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"Sh" = ( +/obj/effect/decal/cleanable/generic, +/turf/open/floor/plating{ + dir = 8; + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/bar) +"Sl" = ( +/obj/structure/pipes/standard/manifold/hidden/green{ + dir = 1 + }, +/turf/open/floor/plating{ + dir = 8; + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/bar) +"So" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/shuttle/ert{ + icon_state = "T16"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"SE" = ( +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 4 + }, +/turf/closed/shuttle/ert{ + icon_state = "T19"; + opacity = 0; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"SF" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/backroom) +"SG" = ( +/obj/effect/decal/sand_overlay/sand1, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"SL" = ( +/obj/item/ammo_magazine/rifle/type71/heap{ + current_rounds = 0 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"SP" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/barricade/sandbags/wired{ + dir = 1 + }, +/turf/open/floor/plating{ + dir = 8; + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/bar) +"SY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/sheet/metal, +/obj/structure/barricade/wooden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"Ta" = ( +/obj/item/prop/colony/used_flare, +/turf/open/desert/dirt{ + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Tc" = ( +/obj/structure/bed/chair/wood/normal{ + dir = 8 + }, +/obj/structure/machinery/light, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/backroom) +"Td" = ( +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 4 + }, +/obj/structure/machinery/light{ + dir = 1 + }, +/obj/structure/barricade/wooden{ + dir = 8 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/bar) +"Tl" = ( +/obj/effect/decal/sand_overlay/sand1, +/obj/item/ammo_magazine/rifle/type71/heap{ + current_rounds = 0 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached12" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"TH" = ( +/obj/effect/decal/sand_overlay/sand1, +/obj/item/ammo_casing/bullet, +/obj/effect/landmark/crap_item, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"TO" = ( +/obj/structure/pipes/vents/pump{ + dir = 8 + }, +/obj/structure/machinery/light{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor{ + icon_state = "grimy" + }, +/area/desert_dam/building/bar/bar) +"TR" = ( +/turf/open/floor/prison{ + dir = 8; + icon_state = "sterile_white" + }, +/area/desert_dam/building/bar/bar_restroom) +"Ug" = ( +/obj/item/ammo_casing/bullet, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Ui" = ( +/obj/structure/prop/dam/boulder/boulder2, +/turf/open/desert/dirt{ + dir = 8; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Ul" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood{ + layer = 3 + }, +/turf/closed/shuttle/ert{ + icon_state = "upp1"; + name = "Fulcrum" + }, +/area/desert_dam/building/bar/bar) +"Un" = ( +/obj/structure/prop/dam/large_boulder/boulder2, +/turf/open/desert/rock, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Uq" = ( +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/desert/dirt{ + icon_state = "desert_transition_corner1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"UB" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/bar) +"UK" = ( +/obj/item/ammo_box/rounds/type71/heap/empty{ + bullet_amount = 0 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"UL" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 10 + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/obj/structure/prop/wooden_cross{ + pixel_y = 13 + }, +/obj/item/clothing/head/helmet/marine/veteran/UPP, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"UQ" = ( +/obj/structure/surface/table/reinforced, +/obj/structure/machinery/chem_dispenser/soda{ + density = 0; + pixel_y = 32 + }, +/obj/effect/landmark/objective_landmark/far, +/turf/open/floor{ + icon_state = "grimy" + }, +/area/desert_dam/building/bar/bar) +"Vc" = ( +/obj/structure/desertdam/decals/road_edge, +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/obj/item/ammo_casing/bullet, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Vg" = ( +/obj/item/stack/sandbags, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Vl" = ( +/obj/structure/bed/chair/wood/normal{ + dir = 4 + }, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/backroom) +"Vr" = ( +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor{ + icon_state = "grimy" + }, +/area/desert_dam/building/bar/bar) +"Vt" = ( +/obj/item/prop/colony/usedbandage{ + dir = 1 + }, +/obj/effect/landmark/survivor_spawner/upp_specialist, +/turf/open/shuttle/dropship{ + icon_state = "rasputin5" + }, +/area/desert_dam/building/bar/bar) +"VA" = ( +/obj/item/shard{ + icon_state = "medium" + }, +/turf/open/floor/plating{ + dir = 8; + icon_state = "platingdmg3" + }, +/area/desert_dam/building/bar/bar) +"VG" = ( +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/desert/dirt{ + dir = 9; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"VI" = ( +/turf/open/floor/plating, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"VP" = ( +/obj/structure/desertdam/decals/road_edge, +/obj/effect/decal/sand_overlay/sand1/corner1{ + dir = 1 + }, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"VQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "pipe-c" + }, +/obj/structure/barricade/sandbags/wired, +/obj/structure/barricade/sandbags/wired{ + dir = 4 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"VT" = ( +/turf/closed/wall/wood, +/area/desert_dam/building/bar/bar_restroom) +"VU" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal2" + }, +/obj/effect/decal/sand_overlay/sand1{ + dir = 8 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"VW" = ( +/obj/structure/desertdam/decals/road_edge, +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/obj/item/ammo_magazine/rifle/type71/heap{ + current_rounds = 0 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Wb" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal2" + }, +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"Wh" = ( +/obj/structure/pipes/vents/pump{ + dir = 4 + }, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/backroom) +"WE" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/bar) +"WG" = ( +/obj/item/stack/sheet/wood, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"WK" = ( +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"WO" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"WX" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal8" + }, +/obj/effect/spawner/gibspawner/xeno, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"WY" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal4" + }, +/obj/item/stack/sheet/wood/medium_stack, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"WZ" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal3" + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Xe" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/item/reagent_container/food/drinks/flask/canteen{ + desc = "You take a sip from your trusty UPP canteen..."; + pixel_x = 3; + pixel_y = -6 + }, +/obj/item/reagent_container/food/drinks/flask/canteen{ + desc = "You take a sip from your trusty UPP canteen..."; + pixel_y = 5; + pixel_x = -8 + }, +/obj/item/reagent_container/food/drinks/flask/canteen{ + desc = "You take a sip from your trusty UPP canteen..."; + pixel_y = 4 + }, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Xh" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/bar) +"Xo" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 6 + }, +/obj/item/ammo_casing/bullet, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Xv" = ( +/obj/structure/prop/dam/boulder/boulder3, +/turf/open/mars{ + icon_state = "mars_dirt_5" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Xw" = ( +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/bar) +"XB" = ( +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal2" + }, +/obj/item/ammo_magazine/rifle/type71/heap{ + current_rounds = 0 + }, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"XF" = ( +/obj/structure/bed/chair/wood/normal{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"XR" = ( +/obj/structure/desertdam/decals/road_edge, +/obj/effect/decal/sand_overlay/sand1{ + dir = 4 + }, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"XZ" = ( +/obj/effect/decal/cleanable/blood/xeno, +/turf/open/desert/dirt{ + dir = 5; + icon_state = "desert_transition_edge1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Yf" = ( +/obj/effect/spawner/gibspawner/xeno, +/turf/open/floor/interior/wood, +/area/desert_dam/building/bar/bar) +"Yn" = ( +/turf/open/desert/dirt{ + dir = 1; + icon_state = "desert_transition_corner1" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"Yq" = ( +/turf/open/floor{ + dir = 8; + icon_state = "carpet6-2" + }, +/area/desert_dam/building/bar/bar) +"YA" = ( +/obj/structure/bed/chair/wood/normal, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/desert_dam/building/bar/bar) +"YE" = ( +/obj/effect/decal/sand_overlay/sand1, +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal3" + }, +/obj/item/ammo_casing/bullet, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"YK" = ( +/obj/item/stack/rods, +/turf/open/floor/plating, +/area/desert_dam/building/bar/bar) +"YM" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 10 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"YQ" = ( +/obj/effect/decal/sand_overlay/sand1, +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal3" + }, +/obj/structure/machinery/light, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"YS" = ( +/turf/closed/shuttle/ert{ + icon_state = "T7"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"YY" = ( +/turf/closed/shuttle/ert{ + icon_state = "T1"; + name = "Fulcrum"; + opacity = 0 + }, +/area/desert_dam/building/bar/bar) +"YZ" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/desert_dam/building/bar/bar_restroom) +"Zn" = ( +/obj/effect/landmark/survivor_spawner/upp_sapper, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/desert_dam/building/bar/bar) +"ZA" = ( +/obj/effect/decal/sand_overlay/sand1{ + dir = 1 + }, +/obj/structure/barricade/sandbags/wired{ + dir = 4 + }, +/turf/open/asphalt/cement_sunbleached{ + icon_state = "cement_sunbleached4" + }, +/area/desert_dam/exterior/valley/bar_valley_dam) +"ZB" = ( +/obj/effect/decal/sand_overlay/sand1, +/obj/structure/desertdam/decals/road_edge{ + icon_state = "road_edge_decal3" + }, +/turf/open/asphalt, +/area/desert_dam/interior/dam_interior/south_tunnel_entrance) +"ZD" = ( +/obj/structure/flora/grass/tallgrass/desert/corner{ + dir = 9 + }, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"ZS" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/obj/structure/disposalpipe/segment, +/turf/open/asphalt, +/area/desert_dam/exterior/valley/bar_valley_dam) +"ZY" = ( +/obj/structure/flora/grass/desert/heavygrass_5, +/turf/open/desert/dirt, +/area/desert_dam/exterior/valley/bar_valley_dam) + +(1,1,1) = {" +iy +iy +iy +iy +iy +xT +xT +xT +xT +xT +xT +VT +vq +vn +TR +DE +VT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(2,1,1) = {" +iy +sO +Bj +SF +iy +xT +xT +xT +xT +xT +mV +YZ +TR +TR +hT +TR +cI +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(3,1,1) = {" +iy +Bj +Wh +Vl +iy +hv +hv +wE +Mw +wj +CH +tW +zC +DZ +zm +eh +Dt +xT +xT +Fa +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(4,1,1) = {" +iy +Bj +Ek +zT +iy +Pd +rm +qS +Yq +aO +tW +nz +Om +BB +Qc +wy +vy +jf +kD +kD +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(5,1,1) = {" +iy +be +Ek +Tc +iy +oD +Xw +jt +Rs +tW +HP +YS +QK +CL +tM +zM +YK +PH +jC +jC +pk +kD +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(6,1,1) = {" +iy +yx +Ek +hk +iy +if +Xh +BM +ds +HP +YS +YS +pO +kM +xN +Sh +YY +Cm +nk +bO +kf +pk +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(7,1,1) = {" +jy +bC +mw +iV +Ah +Jc +cH +hx +bY +bY +bY +bY +bY +bY +bY +bY +bY +Ul +QA +EO +zZ +jm +xz +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(8,1,1) = {" +iy +LJ +kQ +hx +bY +wT +bY +CA +bz +hF +Lo +Cn +Re +PR +PR +PR +Bq +RW +hJ +sH +kf +SG +WO +UL +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(9,1,1) = {" +iy +du +BW +IW +cL +CA +cL +CA +GY +pM +dX +Rl +nB +GK +Fh +cu +yF +wZ +gM +kf +kf +kf +jC +IU +PY +CI +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(10,1,1) = {" +hv +su +HB +IW +kp +MM +ny +py +Vt +uA +eV +Bx +nB +fP +uZ +tA +se +wZ +kf +ym +GZ +cR +kf +kf +kf +kf +pk +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(11,1,1) = {" +hv +oc +Sl +aa +hm +hm +hm +CA +DB +NH +Zn +Cn +tu +IF +IF +IF +sE +RW +GZ +OS +sv +kf +kf +Di +md +tl +OS +QI +xT +xT +xT +xT +xT +xT +xT +xT +"} +(12,1,1) = {" +hv +hv +Td +SY +Jc +zM +Jc +aa +hm +hm +hm +KA +wm +yC +Du +hm +hm +JT +nk +bO +wI +kf +Jt +kf +hJ +Ms +OS +gR +xT +xT +xT +xT +xT +xT +xT +xT +"} +(13,1,1) = {" +hv +sp +Fd +nC +WG +UB +WK +zM +So +NK +Dn +Dn +SE +CL +tM +Kf +Oj +AT +AT +EO +md +kf +Jd +kf +tl +np +OS +Nj +pu +xT +xT +xT +xT +xT +xT +xT +"} +(14,1,1) = {" +hv +sp +Vr +bu +jj +ye +Xh +zM +YA +So +NK +Dn +ws +kM +xN +zM +wE +tK +Xe +tK +kf +Jd +gM +kf +kf +oo +mb +zS +Iu +xT +xT +xT +xT +xT +xT +xT +"} +(15,1,1) = {" +hv +hv +TO +fM +zD +bu +Xh +qU +in +XF +aT +NK +Om +BB +eU +Eb +Ji +Xv +aY +BK +qu +wp +pZ +kf +tl +TH +Ug +KC +Iu +Db +xT +xT +xT +xT +xT +pW +"} +(16,1,1) = {" +hv +QG +Ev +Ev +zD +hY +Er +At +qS +Js +pA +aT +Fl +EO +Al +wj +rX +Ip +mb +Gc +aw +PX +EH +EH +EH +Xo +tE +KC +Iu +bN +VI +Db +pW +pW +pW +pW +"} +(17,1,1) = {" +hv +UQ +Ev +GP +Ev +Ev +Yf +WE +Xw +xx +xm +yo +SP +VA +BU +wE +Lw +Nh +sI +yP +oN +yc +wq +nD +Ug +UK +Ug +KC +oK +VI +tR +Ae +xG +Pw +LF +Db +"} +(18,1,1) = {" +hv +hv +Kl +Kl +hv +Kl +Kl +hv +Kl +xx +DD +Kl +hv +eT +Hq +wE +mT +SL +gN +xj +Tl +kD +hc +LC +Cc +CE +Vc +XR +VP +jp +eJ +eJ +eJ +eJ +eJ +gm +"} +(19,1,1) = {" +xT +xT +ln +ln +ln +ln +ln +ln +wJ +lC +DR +xr +kD +kD +kD +gP +wO +sn +sn +yP +oN +VG +Ce +oF +OU +Ec +JS +ee +HH +QN +OD +ee +DO +OD +ee +Sb +"} +(20,1,1) = {" +xT +xT +ln +ln +ln +ln +ln +xX +wJ +lC +Bu +kD +kD +kD +kD +ej +kD +kD +kD +ZA +MW +Hl +xn +jI +OU +Oe +VQ +bP +bP +LB +mF +bP +mF +mF +bP +tX +"} +(21,1,1) = {" +xT +ln +ln +ln +ln +ln +ln +ln +Ta +yP +PS +kD +nP +kD +mR +fy +QW +mR +vk +yP +PS +Hl +Yn +Ch +hH +HI +bJ +BP +pq +jr +pq +pq +Wb +pq +pq +jr +"} +(22,1,1) = {" +xT +xT +ln +iI +Yn +Uq +ln +Nu +Ch +RU +Ou +fR +kk +Cx +kk +kk +kk +kk +kk +nR +FI +Eg +Ch +kD +hH +Df +hO +Lu +OJ +pW +cZ +so +dR +dR +dJ +pW +"} +(23,1,1) = {" +xT +xT +xT +Yn +jw +bI +is +wJ +kD +kD +kD +eQ +Jx +Jx +Jx +Jx +Jx +bf +Jx +Jx +Hb +CE +CE +JB +ab +vR +bJ +ZB +xT +xT +xT +xT +xT +xT +xT +xT +"} +(24,1,1) = {" +xT +xT +xT +wJ +Ug +Ug +Eg +Ch +kD +kD +kD +hH +HI +OZ +HI +HI +OZ +HI +HI +yf +HI +HI +OZ +HI +HI +OZ +bJ +YQ +xT +xT +xT +xT +xT +xT +xT +xT +"} +(25,1,1) = {" +xT +xT +xT +FB +ki +px +kD +kD +kD +ej +sT +hH +HI +Gd +HV +HV +ZS +HV +HV +ZS +HV +HV +ZS +HV +HV +ZS +zl +ZB +xT +xT +xT +xT +xT +xT +xT +xT +"} +(26,1,1) = {" +xT +xT +Yn +is +Ow +kD +sT +ug +wv +ig +hd +hH +HI +bJ +Aw +VU +VU +VU +VU +VU +VU +VU +hn +VU +VU +VU +VU +am +xT +xT +xT +xT +xT +xT +xT +xT +"} +(27,1,1) = {" +xT +xT +Ch +XZ +Ch +kD +da +wv +eD +ys +jJ +hH +Df +hO +eI +mf +lT +Ui +zO +kD +kD +kD +kD +mf +zO +nP +kD +Jk +xT +xT +xT +xT +xT +xT +xT +xT +"} +(28,1,1) = {" +xT +xT +zO +kD +kD +kD +wv +eD +eD +ZD +kD +hH +HI +bJ +eI +Hl +Un +iL +Ch +kD +kD +kD +kD +Hl +rR +kD +mf +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(29,1,1) = {" +xT +Yn +yk +QW +kD +Fs +YM +mq +ZD +vk +kD +hH +HI +bJ +eI +Eg +uF +Ch +Ug +kD +mL +mR +mf +Ce +qx +lT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(30,1,1) = {" +is +wJ +kD +Ug +kD +kD +jJ +fy +hd +Ro +QW +hH +vR +bJ +eI +Fr +kD +Ug +kD +iz +mf +lT +Ce +ln +xT +ln +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(31,1,1) = {" +XZ +AC +Ug +kD +nP +kD +kD +kD +kD +kD +kD +hH +Df +hO +eI +xt +kD +QW +kD +mf +qe +ln +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(32,1,1) = {" +CE +CE +VW +CE +Vc +CE +CE +Vc +CE +Vc +CE +ab +HI +bJ +eI +kD +ZY +xP +LD +Ce +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(33,1,1) = {" +No +vR +OZ +rl +hi +OZ +HI +hi +Qk +vR +OZ +HI +HI +bJ +nt +mf +lT +Ce +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(34,1,1) = {" +HV +HV +ZS +fN +HV +EW +HV +FF +HV +HV +ZS +HV +gA +zl +YE +Hl +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(35,1,1) = {" +cl +IA +cl +kh +XB +cl +WX +Vg +Oe +vP +vl +fL +hn +VU +yG +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(36,1,1) = {" +ga +Li +vZ +fk +CX +kB +dQ +Df +rj +WZ +Eq +Fr +kD +sn +Fr +Hl +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} +(37,1,1) = {" +eK +eK +eK +eK +OO +LM +WY +vR +HI +WZ +oy +nP +mR +xg +kD +Ex +uF +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +xT +"} diff --git a/maps/map_files/New_Varadero/New_Varadero.dmm b/maps/map_files/New_Varadero/New_Varadero.dmm index 20558b48ac32..4488d13b9bc7 100644 --- a/maps/map_files/New_Varadero/New_Varadero.dmm +++ b/maps/map_files/New_Varadero/New_Varadero.dmm @@ -2832,7 +2832,6 @@ /obj/structure/surface/table/reinforced/prison{ color = "#6b675e" }, -/obj/item/attachable/heavy_barrel, /obj/structure/window/reinforced, /turf/open/floor/strata{ color = "#5e5d5d"; diff --git a/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm b/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm index 17f2e577a120..c43a02dddf12 100644 --- a/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm +++ b/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm @@ -10,7 +10,7 @@ /area/space) "aac" = ( /turf/closed/wall/strata_ice/dirty, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "aad" = ( /turf/closed/wall/strata_ice/jungle, /area/strata/ug/interior) @@ -427,7 +427,7 @@ "abA" = ( /obj/structure/fence, /turf/open/auto_turf/snow/brown_base/layer0, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "abB" = ( /obj/structure/bed/nest, /obj/effect/landmark/corpsespawner/upp, @@ -1746,7 +1746,7 @@ "aff" = ( /obj/item/lightstick/planted, /turf/closed/wall/strata_ice/dirty, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "afg" = ( /obj/structure/machinery/door/airlock/almayer/maint/colony, /turf/open/floor/strata{ @@ -9870,7 +9870,7 @@ "aDQ" = ( /obj/structure/pipes/standard/simple/hidden/cyan, /turf/closed/wall/strata_ice/dirty, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "aDR" = ( /obj/effect/decal/cleanable/blood/oil, /obj/structure/barricade/handrail/strata, @@ -10715,7 +10715,7 @@ layer = 2.9 }, /turf/open/auto_turf/snow/brown_base/layer0, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "aGh" = ( /obj/structure/pipes/vents/pump, /turf/open/floor/strata{ @@ -10930,7 +10930,7 @@ dir = 9 }, /turf/open/auto_turf/snow/brown_base/layer0, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "aGM" = ( /obj/item/stack/sandbags, /obj/structure/barricade/handrail/strata{ @@ -10957,7 +10957,7 @@ /area/strata/ag/interior/outpost/canteen) "aGP" = ( /turf/open/auto_turf/snow/brown_base/layer0, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "aGQ" = ( /obj/structure/machinery/door/airlock/almayer/generic{ dir = 2 @@ -12302,7 +12302,7 @@ pixel_y = 28 }, /turf/closed/wall/strata_outpost, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "aLy" = ( /obj/structure/platform/strata/metal{ dir = 8 @@ -15956,7 +15956,7 @@ /area/strata/ag/interior/dorms/south) "aXG" = ( /turf/closed/wall/strata_outpost/reinforced/hull, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "aXH" = ( /obj/structure/surface/table, /obj/item/phone, @@ -19583,7 +19583,7 @@ dir = 1 }, /turf/open/auto_turf/snow/brown_base/layer0, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "bkX" = ( /obj/structure/platform/strata{ dir = 1 @@ -19592,7 +19592,7 @@ dir = 4 }, /turf/open/auto_turf/snow/brown_base/layer0, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "bkY" = ( /obj/structure/pipes/standard/simple/hidden/cyan, /turf/open/floor/strata{ @@ -19677,23 +19677,23 @@ "blo" = ( /obj/structure/flora/grass/tallgrass/ice, /turf/open/auto_turf/snow/brown_base/layer0, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "blp" = ( /obj/structure/platform/strata{ dir = 1 }, /turf/open/auto_turf/snow/brown_base/layer0, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "blq" = ( /obj/structure/inflatable, /turf/open/auto_turf/snow/brown_base/layer0, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "blr" = ( /obj/structure/platform_decoration/strata{ dir = 8 }, /turf/open/auto_turf/snow/brown_base/layer0, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "bls" = ( /obj/structure/machinery/light/small, /turf/open/auto_turf/ice/layer0, @@ -19704,7 +19704,7 @@ dir = 1 }, /turf/open/auto_turf/snow/brown_base/layer0, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "blv" = ( /obj/structure/platform/strata{ dir = 1 @@ -20416,7 +20416,7 @@ "bom" = ( /obj/effect/decal/cleanable/blood, /turf/closed/wall/strata_ice/dirty, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "bon" = ( /turf/open/auto_turf/strata_grass/layer0_mud_alt, /area/strata/ug/interior/jungle/deep/minehead) @@ -25013,7 +25013,7 @@ pixel_y = -8 }, /turf/closed/wall/strata_outpost/reinforced, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "bMd" = ( /turf/open/asphalt/cement{ icon_state = "cement2" @@ -25026,7 +25026,7 @@ /area/strata/ag/exterior/north_lz_caves) "bME" = ( /turf/closed/wall/strata_outpost, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "bMF" = ( /obj/structure/window/framed/strata/reinforced, /turf/open/floor/strata{ @@ -25144,7 +25144,7 @@ /area/strata/ag/exterior/research_decks) "bNW" = ( /turf/closed/wall/strata_ice/jungle, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "bOh" = ( /obj/structure/barricade/handrail/strata, /turf/open/floor/strata{ @@ -30605,7 +30605,7 @@ "efT" = ( /obj/effect/decal/cleanable/blood, /turf/open/floor/strata, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "egh" = ( /obj/structure/flora/bush/ausbushes/grassybush{ icon_state = "fullgrass_1" @@ -30737,7 +30737,7 @@ /area/strata/ag/exterior/research_decks) "eqV" = ( /turf/closed/wall/wood, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "era" = ( /obj/structure/machinery/power/apc{ dir = 1; @@ -30759,7 +30759,7 @@ /area/strata/ag/exterior/north_lz_caves) "esJ" = ( /turf/open/auto_turf/snow/brown_base/layer4, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "euc" = ( /obj/structure/platform_decoration/strata{ dir = 4 @@ -31203,7 +31203,7 @@ pixel_y = -8 }, /turf/closed/wall/strata_outpost/reinforced/hull, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "fiD" = ( /obj/structure/fence, /turf/open/asphalt/cement{ @@ -31636,7 +31636,7 @@ /area/strata/ag/exterior/tcomms/tcomms_deck) "fPO" = ( /turf/open/auto_turf/ice/layer1, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "fQG" = ( /obj/effect/decal/cleanable/blood/oil, /turf/open/floor/strata{ @@ -31941,7 +31941,7 @@ /area/strata/ag/interior/outpost/gen/bball/nest) "glL" = ( /turf/open/auto_turf/snow/brown_base/layer1, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "glN" = ( /obj/structure/machinery/weather_siren{ dir = 8; @@ -32121,7 +32121,7 @@ "gAD" = ( /obj/structure/machinery/iv_drip, /turf/open/floor/strata, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "gBj" = ( /obj/effect/decal/cleanable/blood, /turf/open/auto_turf/ice/layer1, @@ -32145,7 +32145,7 @@ layer = 2.9 }, /turf/open/auto_turf/snow/brown_base/layer0, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "gFf" = ( /obj/effect/decal/cleanable/blood, /turf/open/floor/strata{ @@ -33303,7 +33303,7 @@ /obj/item/clothing/gloves/latex, /obj/item/storage/surgical_tray, /turf/open/floor/strata, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "iJJ" = ( /obj/effect/blocker/sorokyne_cold_water, /obj/effect/blocker/sorokyne_cold_water, @@ -33758,7 +33758,7 @@ "jww" = ( /obj/structure/sign/safety/biohazard, /turf/closed/wall/strata_outpost/reinforced/hull, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "jwS" = ( /obj/structure/surface/rack, /obj/item/weapon/gun/pistol/c99, @@ -34897,7 +34897,7 @@ pixel_y = 32 }, /turf/open/floor/strata, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "luA" = ( /obj/effect/blocker/sorokyne_cold_water, /obj/effect/blocker/sorokyne_cold_water, @@ -35085,7 +35085,7 @@ dir = 4 }, /turf/open/auto_turf/ice/layer1, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "lMB" = ( /obj/structure/bed/chair/comfy{ dir = 8 @@ -36008,7 +36008,7 @@ "nhv" = ( /obj/structure/flora/grass/tallgrass/ice, /turf/open/auto_turf/ice/layer1, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "njA" = ( /obj/structure/pipes/standard/manifold/hidden/cyan{ dir = 1 @@ -36616,7 +36616,7 @@ /obj/structure/surface/rack, /obj/item/storage/pill_bottle/bicaridine, /turf/open/floor/strata, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "oyu" = ( /obj/structure/machinery/shower{ dir = 8 @@ -37909,7 +37909,7 @@ pixel_y = 10 }, /turf/closed/wall/strata_outpost/reinforced, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "qzf" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/phone{ @@ -38533,7 +38533,7 @@ "ryA" = ( /obj/structure/inflatable, /turf/open/floor/strata, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "ryK" = ( /turf/open/floor/strata{ dir = 4; @@ -39711,7 +39711,7 @@ dir = 4 }, /turf/closed/wall/strata_ice/dirty, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "tIv" = ( /obj/effect/decal/cleanable/blood/oil, /turf/open/floor/strata{ @@ -40045,7 +40045,7 @@ /obj/structure/inflatable/door, /obj/effect/decal/cleanable/blood, /turf/open/floor/strata, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "ueD" = ( /obj/structure/window/reinforced/tinted{ dir = 4 @@ -40735,7 +40735,7 @@ pixel_y = -8 }, /turf/closed/wall/strata_outpost/reinforced, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "vmm" = ( /obj/structure/surface/table/reinforced/prison, /obj/structure/machinery/light/small{ @@ -41336,7 +41336,7 @@ "wgI" = ( /obj/item/tank/anesthetic, /turf/open/floor/strata, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "whO" = ( /obj/structure/filingcabinet, /obj/effect/landmark/objective_landmark/medium, @@ -41872,7 +41872,7 @@ dir = 4; icon_state = "floor3" }, -/area/strata/ag/exterior) +/area/strata/ag/interior/mountain) "xoE" = ( /obj/structure/largecrate/random, /obj/structure/barricade/handrail/strata{ diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index f8c9cc99d534..828e406cc28b 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -5011,7 +5011,7 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/structure/machinery/disposal{ +/obj/structure/machinery/disposal/delivery{ density = 0; desc = "A pneumatic delivery unit. Sends items to the requisitions."; icon_state = "delivery_engi"; @@ -5211,6 +5211,12 @@ icon_state = "plate" }, /area/almayer/medical/medical_science) +"aqI" = ( +/turf/open/floor/almayer{ + dir = 8; + icon_state = "silver" + }, +/area/almayer/living/auxiliary_officer_office) "aqJ" = ( /turf/open/floor/almayer{ dir = 5; @@ -19333,7 +19339,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "bBa" = ( /turf/open/floor/almayer{ dir = 4; @@ -19514,19 +19520,31 @@ }, /area/almayer/hallways/aft_hallway) "bBD" = ( -/obj/structure/bed/chair{ - dir = 4 - }, /obj/structure/machinery/firealarm{ pixel_y = 28 }, /obj/structure/sign/safety/maint{ pixel_x = -17 }, +/obj/structure/surface/table/almayer, +/obj/structure/transmitter/rotary{ + name = "Telephone"; + phone_category = "Almayer"; + phone_id = "Auxiliary Support Office Second Line"; + pixel_x = -5; + pixel_y = 3 + }, +/obj/structure/transmitter/rotary{ + name = "Telephone"; + phone_category = "Almayer"; + phone_id = "Auxiliary Support Office"; + pixel_x = 8; + pixel_y = 8 + }, /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "bBN" = ( /obj/structure/machinery/light, /turf/open/floor/plating/plating_catwalk, @@ -20425,7 +20443,7 @@ "bFr" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/plating/plating_catwalk, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "bFs" = ( /obj/structure/machinery/cm_vending/sorted/cargo_guns/squad_prep, /turf/open/floor/almayer{ @@ -21122,7 +21140,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "bII" = ( /obj/structure/sign/safety/distribution_pipes{ pixel_x = 8; @@ -21262,8 +21280,8 @@ "bJl" = ( /obj/structure/machinery/door/airlock/almayer/generic{ dir = 1; - name = "\improper Tanker Quarters"; - req_one_access_txt = "19;27" + name = "\improper Auxiliary Support Officers Quarters"; + req_one_access_txt = "37" }, /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/machinery/door/firedoor/border_only/almayer{ @@ -21276,7 +21294,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "bJo" = ( /turf/closed/wall/almayer, /area/almayer/hallways/repair_bay) @@ -23219,32 +23237,13 @@ }, /area/almayer/shipboard/brig/lobby) "bRo" = ( -/obj/structure/machinery/door/poddoor/shutters/almayer{ - id = "ARES StairsLower"; - name = "\improper ARES Core Shutters"; - plane = -7 - }, -/obj/effect/step_trigger/ares_alert/public{ - alert_id = "AresStairs"; - alert_message = "Caution: Movement detected in ARES Core."; - cooldown_duration = 1200 - }, -/obj/effect/step_trigger/ares_alert/public{ - alert_id = "AresStairs"; - alert_message = "Caution: Movement detected in ARES Core."; - cooldown_duration = 1200 - }, -/obj/structure/machinery/door/poddoor/almayer/blended/white/open{ - closed_layer = 3.2; - id = "ARES Emergency"; - layer = 3.2; - name = "ARES Emergency Lockdown"; - needs_power = 0; - open_layer = 1.9; - plane = -7 +/obj/effect/landmark/late_join/working_joe, +/obj/effect/landmark/start/working_joe, +/obj/structure/machinery/light{ + dir = 8 }, /turf/open/floor/almayer/no_build{ - icon_state = "test_floor4" + icon_state = "ai_floors" }, /area/almayer/command/airoom) "bRr" = ( @@ -23773,20 +23772,15 @@ /obj/structure/machinery/light{ dir = 1 }, -/obj/structure/surface/table/almayer, -/obj/item/paper_bin, -/obj/item/tool/pen, -/obj/item/clothing/mask/rebreather/scarf, -/obj/item/clothing/mask/rebreather/scarf, /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "bTS" = ( /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "bTT" = ( /obj/structure/window/framed/almayer/hull, /turf/open/floor/plating, @@ -23794,11 +23788,14 @@ "bTU" = ( /obj/structure/surface/table/almayer, /obj/item/storage/toolbox/mechanical, +/obj/item/dogtag{ + desc = "A blank marine's information dog tag. The word ranger and a pawprint is scratched into it." + }, /obj/item/device/megaphone, /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "bTV" = ( /obj/item/bedsheet/brown{ pixel_y = 13 @@ -23953,7 +23950,6 @@ }, /area/almayer/squads/delta) "bUx" = ( -/obj/effect/landmark/start/working_joe, /obj/structure/machinery/light/small{ dir = 8 }, @@ -24430,7 +24426,7 @@ /obj/structure/machinery/door/window/eastright, /obj/structure/window/reinforced/tinted/frosted, /turf/open/floor/plating/plating_catwalk, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "bWK" = ( /obj/structure/bed/chair{ dir = 1 @@ -26236,10 +26232,6 @@ icon_state = "plate" }, /area/almayer/hallways/port_umbilical) -"cey" = ( -/obj/structure/largecrate/random/barrel/white, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_f_p) "ceC" = ( /obj/structure/machinery/light, /obj/structure/bed/chair{ @@ -27937,10 +27929,6 @@ icon_state = "blue" }, /area/almayer/squads/delta) -"coo" = ( -/obj/structure/largecrate/random/secure, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/living/tankerbunks) "cop" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/living/tankerbunks) @@ -28456,6 +28444,12 @@ icon_state = "redcorner" }, /area/almayer/shipboard/brig/execution) +"czG" = ( +/obj/structure/machinery/recharge_station, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "czJ" = ( /obj/structure/sign/safety/restrictedarea{ pixel_x = 8; @@ -28703,6 +28697,13 @@ icon_state = "red" }, /area/almayer/hull/upper_hull/u_a_p) +"cDZ" = ( +/obj/structure/surface/table/almayer, +/obj/item/paper, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/tankerbunks) "cEg" = ( /obj/structure/surface/table/almayer, /obj/item/device/flashlight/lamp{ @@ -32461,7 +32462,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/hull/lower_hull/l_f_p) +/area/almayer/living/tankerbunks) "eim" = ( /obj/structure/pipes/vents/pump{ dir = 1 @@ -33468,6 +33469,12 @@ icon_state = "plating" }, /area/almayer/medical/upper_medical) +"eDu" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer, +/area/almayer/living/bridgebunks) "eDG" = ( /obj/structure/barricade/handrail{ dir = 1; @@ -34417,10 +34424,6 @@ icon_state = "red" }, /area/almayer/hull/upper_hull/u_a_p) -"eZX" = ( -/obj/structure/largecrate/random/barrel/green, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_f_p) "fau" = ( /obj/structure/pipes/standard/manifold/hidden/supply, /obj/structure/disposalpipe/junction{ @@ -35017,6 +35020,10 @@ icon_state = "emeraldcorner" }, /area/almayer/squads/charlie) +"foN" = ( +/obj/structure/bed/chair, +/turf/open/floor/almayer, +/area/almayer/living/tankerbunks) "foP" = ( /obj/structure/machinery/shower{ pixel_y = 16 @@ -37871,19 +37878,13 @@ /turf/open/floor/almayer, /area/almayer/hull/upper_hull/u_f_p) "gAe" = ( -/obj/structure/filingcabinet{ - density = 0; - pixel_x = -8; - pixel_y = 18 - }, -/obj/structure/filingcabinet{ - density = 0; - pixel_x = 8; - pixel_y = 18 +/obj/structure/machinery/door_control{ + id = "ARES JoeCryo"; + name = "Working Joe Cryogenics Lockdown"; + pixel_x = 24; + pixel_y = 8; + req_one_access_txt = "19;200;90;91;92" }, -/obj/item/folder/white, -/obj/item/folder/white, -/obj/item/folder/white, /turf/open/floor/almayer/no_build{ icon_state = "ai_floors" }, @@ -38918,12 +38919,8 @@ /turf/open/floor/almayer, /area/almayer/lifeboat_pumps/south1) "gZK" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "SE-out"; - pixel_x = 1 - }, /turf/open/floor/almayer, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "ham" = ( /turf/open/floor/almayer{ icon_state = "sterile_green" @@ -38977,6 +38974,15 @@ icon_state = "green" }, /area/almayer/hallways/port_hallway) +"hbu" = ( +/obj/structure/bed/chair{ + dir = 1 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "silver" + }, +/area/almayer/living/auxiliary_officer_office) "hbx" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/disposalpipe/segment, @@ -39782,11 +39788,6 @@ icon_state = "greenfull" }, /area/almayer/living/offices) -"hum" = ( -/turf/open/floor/almayer{ - icon_state = "cargo" - }, -/area/almayer/living/tankerbunks) "huK" = ( /turf/open/floor/almayer{ icon_state = "redcorner" @@ -40074,7 +40075,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/living/tankerbunks) +/area/almayer/hull/lower_hull/l_f_s) "hzP" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/power/apc/almayer{ @@ -40637,6 +40638,13 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_a_p) +"hPh" = ( +/obj/structure/bed/chair/comfy, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "silver" + }, +/area/almayer/living/auxiliary_officer_office) "hPo" = ( /obj/structure/surface/rack, /obj/item/tool/wet_sign, @@ -41348,6 +41356,13 @@ }, /turf/open/floor/almayer, /area/almayer/living/briefing) +"ifb" = ( +/obj/structure/machinery/cm_vending/sorted/cargo_guns/vehicle_crew{ + density = 0; + pixel_y = 16 + }, +/turf/open/floor/almayer, +/area/almayer/living/tankerbunks) "iff" = ( /obj/structure/sign/safety/reception{ pixel_x = 32; @@ -41479,6 +41494,7 @@ /obj/item/reagent_container/food/drinks/bottle/sake{ pixel_x = -4 }, +/obj/structure/machinery/light, /turf/open/floor/almayer{ icon_state = "plate" }, @@ -41802,12 +41818,12 @@ "iqp" = ( /obj/structure/machinery/door/airlock/almayer/maint{ req_one_access = null; - req_one_access_txt = "19;27" + req_one_access_txt = "37" }, /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "iqx" = ( /obj/structure/machinery/light/small{ dir = 4 @@ -42430,6 +42446,12 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/port_hallway) +"iEg" = ( +/turf/open/floor/almayer{ + dir = 9; + icon_state = "silver" + }, +/area/almayer/living/auxiliary_officer_office) "iEr" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -43029,17 +43051,8 @@ }, /area/almayer/hull/lower_hull/l_m_p) "iTD" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "E"; - pixel_x = 1 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "S" - }, -/turf/open/floor/almayer{ - dir = 6; - icon_state = "silver" - }, +/obj/effect/landmark/start/auxiliary_officer, +/turf/open/floor/plating/plating_catwalk, /area/almayer/living/bridgebunks) "iTI" = ( /obj/structure/machinery/light/small{ @@ -43230,8 +43243,11 @@ /obj/structure/pipes/standard/simple/hidden/supply{ dir = 10 }, -/turf/open/floor/almayer, -/area/almayer/living/tankerbunks) +/turf/open/floor/almayer{ + dir = 4; + icon_state = "silver" + }, +/area/almayer/living/auxiliary_officer_office) "iYf" = ( /obj/structure/machinery/cm_vending/clothing/medical_crew{ density = 0; @@ -43741,7 +43757,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "jgu" = ( /obj/structure/sink{ dir = 4; @@ -45105,14 +45121,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_a_s) -"jPz" = ( -/obj/structure/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_f_p) "jQt" = ( /turf/open/floor/almayer/research/containment/floor2{ dir = 8 @@ -45549,11 +45557,11 @@ }, /area/almayer/hull/lower_hull/l_m_p) "jZU" = ( -/obj/structure/machinery/light{ +/obj/structure/machinery/power/apc/almayer{ dir = 1 }, /turf/open/floor/almayer, -/area/almayer/command/corporateliason) +/area/almayer/medical/containment/cell/cl) "jZY" = ( /obj/structure/closet/l3closet/virology, /turf/open/floor/almayer{ @@ -45705,6 +45713,9 @@ /obj/structure/window/framed/almayer, /turf/open/floor/plating, /area/almayer/squads/bravo) +"kcp" = ( +/turf/closed/wall/almayer, +/area/almayer/living/auxiliary_officer_office) "kcH" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/living/synthcloset) @@ -46076,13 +46087,17 @@ /area/almayer/hull/upper_hull/u_a_p) "kmL" = ( /obj/structure/surface/table/almayer, -/obj/item/storage/firstaid/toxin{ +/obj/item/storage/firstaid/regular{ pixel_x = 8; pixel_y = -2 }, /obj/item/storage/box/drinkingglasses{ pixel_x = -7 }, +/obj/item/reagent_container/spray/cleaner{ + pixel_x = -10; + pixel_y = 14 + }, /obj/item/storage/xeno_tag_case/full{ pixel_y = 8 }, @@ -47800,6 +47815,16 @@ icon_state = "orange" }, /area/almayer/hallways/port_umbilical) +"kZN" = ( +/obj/structure/surface/table/almayer, +/obj/structure/machinery/prop/almayer/computer/PC{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "silver" + }, +/area/almayer/living/auxiliary_officer_office) "kZV" = ( /obj/structure/machinery/light, /obj/effect/decal/warning_stripes{ @@ -48964,7 +48989,6 @@ }, /area/almayer/squads/charlie) "lxo" = ( -/obj/structure/machinery/cm_vending/sorted/cargo_guns/vehicle_crew, /obj/structure/sign/safety/hazard{ pixel_x = -17; pixel_y = -8 @@ -48976,20 +49000,15 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "lxW" = ( -/obj/structure/bed/chair{ - dir = 8 - }, -/obj/item/device/radio/intercom{ - freerange = 1; - name = "General Listening Channel"; - pixel_y = 28 +/obj/structure/sign/prop2{ + pixel_y = 29 }, /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "lyi" = ( /obj/structure/surface/table/almayer, /obj/item/trash/pistachios, @@ -49020,6 +49039,16 @@ icon_state = "silvercorner" }, /area/almayer/command/computerlab) +"lyX" = ( +/obj/structure/machinery/cm_vending/clothing/senior_officer{ + req_access = null; + req_access_txt = 37; + req_one_access = null + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/auxiliary_officer_office) "lzj" = ( /obj/structure/sign/safety/storage{ pixel_x = 8; @@ -51742,7 +51771,6 @@ }, /area/almayer/living/pilotbunks) "mLE" = ( -/obj/effect/landmark/start/working_joe, /turf/open/floor/plating, /area/almayer/command/airoom) "mLF" = ( @@ -52436,7 +52464,7 @@ dir = 4 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "naB" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/shipboard/brig/perma) @@ -52782,7 +52810,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "niY" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -53990,7 +54018,7 @@ }, /area/almayer/hull/upper_hull/u_a_p) "nJH" = ( -/obj/structure/machinery/computer/cameras/almayer/ares{ +/obj/structure/machinery/computer/cameras/almayer{ dir = 8; pixel_x = 17 }, @@ -55232,7 +55260,6 @@ "onY" = ( /obj/structure/surface/table/almayer, /obj/item/paper_bin/uscm, -/obj/item/attachable/bayonet, /obj/item/device/flashlight/lamp{ pixel_x = -8; pixel_y = 12 @@ -55240,7 +55267,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "oog" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -56370,20 +56397,16 @@ }, /area/almayer/squads/req) "oMi" = ( -/obj/structure/surface/table/almayer, -/obj/structure/machinery/microwave{ - pixel_y = 6 - }, /obj/structure/machinery/status_display{ pixel_y = 30 }, /obj/structure/sign/safety/rewire{ pixel_x = 32 }, -/turf/open/floor/prison{ - icon_state = "kitchen" +/turf/open/floor/almayer{ + icon_state = "plate" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "oMs" = ( /obj/structure/machinery/computer/cameras/almayer{ dir = 1 @@ -56554,10 +56577,25 @@ /obj/structure/pipes/vents/pump{ dir = 4 }, +/obj/structure/surface/table/almayer, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 8 + }, +/obj/item/tool/pen, +/obj/item/book/manual/marine_law{ + pixel_x = 15; + pixel_y = 5 + }, +/obj/item/book/manual/security_space_law{ + pixel_x = 16; + pixel_y = 9 + }, /turf/open/floor/almayer{ - icon_state = "cargo" + dir = 8; + icon_state = "silver" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "oRj" = ( /obj/structure/stairs{ icon_state = "ramptop" @@ -57415,7 +57453,7 @@ dir = 5 }, /turf/open/floor/almayer, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "pqc" = ( /obj/structure/machinery/firealarm{ dir = 4; @@ -58575,11 +58613,11 @@ }, /area/almayer/engineering/engine_core) "pQu" = ( -/obj/structure/machinery/power/apc/almayer{ - dir = 1 +/obj/structure/machinery/chem_dispenser/soda{ + pixel_y = 20 }, /turf/open/floor/almayer, -/area/almayer/medical/containment/cell/cl) +/area/almayer/command/corporateliason) "pQy" = ( /obj/structure/window/framed/almayer, /turf/open/floor/plating, @@ -58708,6 +58746,16 @@ icon_state = "silvercorner" }, /area/almayer/command/computerlab) +"pTt" = ( +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "ARES JoeCryo"; + name = "\improper ARES Core Shutters"; + plane = -7 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "pTT" = ( /obj/structure/platform{ dir = 4 @@ -59208,7 +59256,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "qdk" = ( /obj/structure/surface/table/almayer, /obj/structure/pipes/standard/simple/hidden/supply{ @@ -59462,6 +59510,16 @@ /obj/structure/sign/dartboard, /turf/closed/wall/almayer, /area/almayer/hallways/hangar) +"qih" = ( +/obj/structure/machinery/door/airlock/almayer/generic{ + dir = 1; + name = "\improper Tanker Quarters"; + req_one_access_txt = "19;27" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/tankerbunks) "qim" = ( /obj/structure/disposalpipe/segment, /obj/structure/pipes/standard/manifold/hidden/supply{ @@ -61664,8 +61722,21 @@ /obj/structure/pipes/vents/scrubber{ dir = 8 }, -/turf/open/floor/almayer, -/area/almayer/living/tankerbunks) +/obj/structure/surface/table/almayer, +/obj/item/device/flashlight/lamp{ + layer = 3.5; + pixel_x = 5; + pixel_y = 14 + }, +/obj/item/attachable/bayonet{ + pixel_x = -14; + pixel_y = 3 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "silver" + }, +/area/almayer/living/auxiliary_officer_office) "rgW" = ( /turf/open/floor/almayer{ icon_state = "emeraldcorner" @@ -61685,15 +61756,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/port_emb) -"rix" = ( -/obj/structure/largecrate/supply/ammo/m41a/half, -/obj/structure/largecrate/supply/ammo/pistol/half{ - pixel_y = 12 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_f_p) "riA" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -62393,6 +62455,13 @@ icon_state = "redfull" }, /area/almayer/command/cic) +"rzf" = ( +/obj/effect/landmark/late_join/working_joe, +/obj/effect/landmark/start/working_joe, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "rzj" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/machinery/door/firedoor/border_only/almayer{ @@ -63023,6 +63092,17 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/port_hallway) +"rKA" = ( +/obj/structure/bed{ + can_buckle = 0 + }, +/obj/item/bedsheet/brown{ + layer = 3.1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/auxiliary_officer_office) "rKO" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -65411,8 +65491,8 @@ /area/almayer/living/briefing) "sTV" = ( /obj/structure/machinery/power/apc/almayer/hardened{ - dir = 1; - cell_type = /obj/item/cell/hyper + cell_type = /obj/item/cell/hyper; + dir = 1 }, /turf/open/floor/plating, /area/almayer/command/airoom) @@ -65575,12 +65655,12 @@ /area/almayer/hallways/hangar) "sXE" = ( /obj/structure/machinery/door/airlock/almayer/generic{ - name = "\improper Tanker's Room" + name = "\improper Auxiliary Support Officer's Room" }, /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "sXK" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -66176,6 +66256,13 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/medical_science) +"tjw" = ( +/obj/structure/machinery/cm_vending/clothing/vehicle_crew{ + density = 0; + pixel_y = 16 + }, +/turf/open/floor/almayer, +/area/almayer/living/tankerbunks) "tjU" = ( /obj/structure/bed/chair/wood/normal, /obj/item/bedsheet/brown, @@ -67449,14 +67536,14 @@ }, /area/almayer/command/lifeboat) "tKr" = ( +/obj/structure/machinery/cryopod/right{ + dir = 2 + }, /obj/structure/machinery/light{ dir = 8 }, -/obj/effect/decal/warning_stripes{ - icon_state = "S" - }, /turf/open/floor/almayer{ - icon_state = "silver" + icon_state = "cargo" }, /area/almayer/living/bridgebunks) "tLc" = ( @@ -68258,7 +68345,9 @@ }, /obj/structure/machinery/cm_vending/clothing/senior_officer{ density = 0; - pixel_y = 30 + pixel_y = 30; + req_access = list(); + req_access_txt = "6" }, /turf/open/floor/wood/ship, /area/almayer/engineering/ce_room) @@ -68860,13 +68949,10 @@ /obj/structure/machinery/light{ dir = 4 }, -/obj/effect/decal/warning_stripes{ - icon_state = "S" - }, /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "utX" = ( /turf/closed/wall/almayer/research/containment/wall/connect_e2{ icon_state = "containment_wall_connect_e" @@ -70813,12 +70899,19 @@ }, /area/almayer/hull/lower_hull/l_m_p) "vhe" = ( -/obj/structure/prop/server_equipment/yutani_server{ +/obj/structure/filingcabinet{ density = 0; - desc = "A powerful server tower housing various AI functions."; - name = "server tower"; - pixel_y = 16 + pixel_x = -8; + pixel_y = 18 + }, +/obj/structure/filingcabinet{ + density = 0; + pixel_x = 8; + pixel_y = 18 }, +/obj/item/folder/white, +/obj/item/folder/white, +/obj/item/folder/white, /turf/open/floor/almayer/no_build{ icon_state = "ai_floors" }, @@ -73107,11 +73200,8 @@ /obj/structure/bed/chair{ dir = 1 }, -/obj/effect/decal/warning_stripes{ - icon_state = "S" - }, /turf/open/floor/almayer, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "wdo" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -74141,6 +74231,20 @@ icon_state = "bluefull" }, /area/almayer/command/cichallway) +"wyv" = ( +/obj/structure/machinery/door_control{ + id = "ARES JoeCryo"; + name = "Working Joe Cryogenics Lockdown"; + pixel_x = -24; + pixel_y = -8; + req_one_access_txt = "19;200;90;91;92" + }, +/obj/effect/landmark/late_join/working_joe, +/obj/effect/landmark/start/working_joe, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "wyK" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer{ @@ -74170,12 +74274,6 @@ icon_state = "plating" }, /area/almayer/command/airoom) -"wza" = ( -/obj/structure/machinery/cm_vending/clothing/vehicle_crew, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/living/tankerbunks) "wzg" = ( /obj/structure/bed/chair{ dir = 4 @@ -74474,8 +74572,9 @@ /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 }, +/obj/structure/surface/table/almayer, /turf/open/floor/plating/plating_catwalk, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "wHo" = ( /turf/open/floor/almayer{ icon_state = "emerald" @@ -74489,7 +74588,10 @@ /turf/open/floor/almayer, /area/almayer/lifeboat_pumps/south1) "wIr" = ( -/obj/structure/machinery/cm_vending/clothing/senior_officer, +/obj/structure/machinery/cm_vending/clothing/senior_officer{ + req_access = list(); + req_access_txt = "26" + }, /obj/structure/sign/safety/hvac_old{ pixel_x = 8; pixel_y = 32 @@ -75005,19 +75107,13 @@ /turf/closed/wall/almayer/research/containment/wall/south, /area/almayer/medical/containment/cell) "wTN" = ( -/obj/structure/surface/table/almayer, -/obj/item/storage/box/cups{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/donkpockets, /obj/structure/machinery/power/apc/almayer{ dir = 1 }, -/turf/open/floor/prison{ - icon_state = "kitchen" +/turf/open/floor/almayer{ + icon_state = "plate" }, -/area/almayer/living/tankerbunks) +/area/almayer/living/auxiliary_officer_office) "wUd" = ( /obj/structure/surface/table/almayer, /obj/item/storage/box/gloves{ @@ -75281,7 +75377,7 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/delta) "wXv" = ( -/obj/structure/machinery/vending/cigarette, +/obj/structure/prop/invuln/joey, /turf/open/floor/almayer{ icon_state = "plate" }, @@ -75609,6 +75705,19 @@ icon_state = "green" }, /area/almayer/squads/req) +"xfO" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "silver" + }, +/area/almayer/living/bridgebunks) "xfT" = ( /obj/structure/machinery/disposal, /obj/structure/disposalpipe/trunk{ @@ -75717,12 +75826,12 @@ pixel_y = 32 }, /obj/item/folded_tent/big{ - pixel_y = 10; - pixel_x = -6 + pixel_x = -6; + pixel_y = 10 }, /obj/item/storage/box/mousetraps{ - pixel_y = 12; - pixel_x = 3 + pixel_x = 3; + pixel_y = 12 }, /turf/open/floor/almayer{ icon_state = "plate" @@ -76129,12 +76238,12 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/structure/machinery/disposal{ +/obj/structure/machinery/disposal/delivery{ density = 0; desc = "A pneumatic delivery unit. Sends items to the requisitions."; icon_state = "delivery_med"; name = "Requisitions Delivery Unit"; - pixel_y = 29 + pixel_y = 28 }, /turf/open/floor/almayer{ icon_state = "mono" @@ -77253,6 +77362,21 @@ icon_state = "silver" }, /area/almayer/command/computerlab) +"xNz" = ( +/obj/structure/surface/table/almayer, +/obj/structure/machinery/microwave{ + pixel_y = 7 + }, +/obj/item/storage/box/cups{ + pixel_x = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_y = 19 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/auxiliary_officer_office) "xNB" = ( /obj/structure/machinery/light, /obj/structure/sign/safety/security{ @@ -77676,6 +77800,16 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/lifeboat_pumps/south2) +"xVT" = ( +/obj/structure/prop/invuln/overhead_pipe{ + pixel_x = 12 + }, +/obj/structure/prop/invuln/overhead_pipe{ + pixel_x = 12; + pixel_y = 12 + }, +/turf/closed/wall/almayer, +/area/almayer/living/tankerbunks) "xWd" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/almayer{ @@ -78348,6 +78482,12 @@ icon_state = "plate" }, /area/almayer/squads/delta) +"ylg" = ( +/obj/structure/machinery/cryopod, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "ylm" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, /obj/structure/disposalpipe/segment{ @@ -91119,7 +91259,7 @@ uNL tVf mGL oxp -bSv +kcp bWJ nar alU @@ -91322,7 +91462,7 @@ mGL poR mGL pNp -bSv +kcp bTS bIA alU @@ -91521,13 +91661,13 @@ hJp oPI uNL hJp -bSv -bSv +kcp +kcp iqp -bSv -bSv +kcp +kcp jgl -bSv +kcp alU alU alU @@ -91724,13 +91864,13 @@ mGL dqd uNL hJp -bSv +kcp bBD bTS -wza +bTS lxo qcy -bSv +kcp bAg edM egq @@ -91748,11 +91888,11 @@ jjs jjs jjs jYd -bzy -fIH -nqU -vhq -nqU +bSv +bSv +bSv +bSv +bSv nqU vRz aag @@ -91927,13 +92067,13 @@ pzZ ijp uNL mGL -bSv +kcp bTR -bTH +iEg oQM -hum -bTH -bSv +aqI +aqI +kcp bzA bBB bBB @@ -91951,11 +92091,11 @@ afz afz afz iDd -bzy -rix -wlL -vhq -vhq +qih +bTH +foN +cDZ +bSv pch vRz aag @@ -92130,13 +92270,13 @@ uNL uNL uNL mGL -bSv +kcp lxW -bTH +hPh wGX bFr ppe -bSv +kcp bzA bKh bKh @@ -92154,11 +92294,11 @@ afz afz afz iDd -bzy -mzo -mzo -mzo -vhq +bSv +tjw +bTH +bTV +bSv nqU vRz aag @@ -92333,11 +92473,11 @@ qDv aLk uNL xCR -bSv +kcp wTN -bTH +kZN rgK -bTH +hbu iYe bJl bKa @@ -92357,11 +92497,11 @@ afC afz afz bRx -bzy -cEY -fIH -mzo -rpW +bSv +ifb +bTH +bSv +xVT kAs vRz aag @@ -92536,13 +92676,13 @@ kmM eqk uNL hJp -bSv +kcp oMi bAZ bTS bTS niR -bSv +kcp bzA bKh bKh @@ -92560,10 +92700,10 @@ afz afz afz iDd -bzy -cey -eZX -mzo +bSv +aIX +aIX +bSv ehZ eXo vRz @@ -92739,13 +92879,13 @@ hJp hJp uNL hJp -bSv -bSv -bSv +kcp +kcp +kcp sXE -bSv -bSv -bSv +kcp +kcp +kcp bzA bBB bBB @@ -92763,10 +92903,10 @@ afz afz afz iDd -bzy -vhq -wqE -mzo +bSv +cop +cop +bSv vhq nqU vRz @@ -92942,13 +93082,13 @@ aSY hJp uNL hJp -coo -bSv +dqd +kcp bTU gZK -aIX -aIX -bSv +bTS +lyX +kcp bAr bKh bBB @@ -92966,10 +93106,10 @@ eGg eGg eGg jYd -bzy -nqU -jPz -mzo +bSv +kBY +bTn +bSv vhq vhq vRz @@ -93145,13 +93285,13 @@ uNL lgY uNL mGL -cop -bSv +hJp +kcp onY wdf -cop -cop -bSv +bTS +kcp +kcp bzy bKh bBB @@ -93169,10 +93309,10 @@ hdh hdh hdh bRD -bzy -qOU -mzo -mzo +bSv +bSv +bSv +bSv mzo qOU vRz @@ -93349,12 +93489,12 @@ hJp qee mGL hzM -bSv -bTV +kcp +xNz utK -kBY -bTn -bSv +rKA +kcp +kcp bzy bXs bBB @@ -93551,13 +93691,13 @@ aQv aQv bcm bcm -bSv -bSv -bSv -bSv -bSv -bSv -bSv +kcp +kcp +kcp +kcp +kcp +kcp +kcp bzy bZL cat @@ -96316,7 +96456,7 @@ qnh aKa rrB aGr -aGr +eDu tKr uNg cLN @@ -96519,7 +96659,7 @@ gtp qfA tYX tpD -tpD +xfO iTD vCO vCO @@ -108909,7 +109049,7 @@ iBt iBt iBt awE -cvj +jZU rjH qVM vGk @@ -109112,7 +109252,7 @@ iBt iBt iBt awE -jZU +cvj iiz qVM oLw @@ -136553,7 +136693,7 @@ pYi fMl gUN bLv -bRo +wkM xvM osy cBm @@ -137355,7 +137495,7 @@ lmz lmz lmz lmz -lmz +daz sbJ sbJ sbJ @@ -137558,11 +137698,11 @@ lmz lmz lmz lmz -lmz -lmz -lmz -lmz daz +rzf +bRo +wyv +pTt gAe rCi gba @@ -137761,10 +137901,10 @@ lmz lmz lmz lmz -lmz -lmz -lmz -lmz +daz +czG +ylg +ylg daz daz daz @@ -137964,11 +138104,11 @@ bdH bdH bdH lmz -lmz -lmz -lmz -lmz -lmz +daz +daz +daz +daz +daz lmz lmz lmz diff --git a/maps/predship/huntership.dmm b/maps/predship/huntership.dmm index 5680271c4df2..d7dcb49427a0 100644 --- a/maps/predship/huntership.dmm +++ b/maps/predship/huntership.dmm @@ -486,8 +486,7 @@ /obj/structure/pipes/standard/simple/hidden{ dir = 4 }, -/obj/structure/machinery/computer/crew/alt{ - faction = "Yautja"; +/obj/structure/machinery/computer/crew/alt/yautja{ pixel_y = 24 }, /turf/open/floor/corsat{ @@ -674,9 +673,9 @@ color = "#6b675e" }, /obj/item/weapon/claymore/mercsword/machete/arnold{ + anchored = 1; desc = "Won by an Elder during their youthful hunting days. None are allowed to touch it."; - name = "\improper Dutch's Machete"; - anchored = 1 + name = "\improper Dutch's Machete" }, /turf/open/floor/corsat{ dir = 1; @@ -1789,9 +1788,9 @@ /area/yautja) "gr" = ( /obj/structure/closet/crate/secure{ - req_one_access_txt = "252"; color = "#6b675e"; - name = "Secure Yautja crate" + name = "Secure Yautja crate"; + req_one_access_txt = "252" }, /obj/item/explosive/grenade/spawnergrenade/hellhound, /obj/item/explosive/grenade/spawnergrenade/hellhound, @@ -1806,9 +1805,9 @@ /obj/structure/machinery/door_control{ id = "Yautja Armory"; name = "Armory Shutters"; + needs_power = 0; pixel_x = 24; - req_one_access_txt = "252"; - needs_power = 0 + req_one_access_txt = "252" }, /turf/open/floor/corsat{ dir = 1; @@ -2424,9 +2423,9 @@ /area/yautja) "Bg" = ( /obj/structure/closet/crate/secure{ - req_one_access_txt = "252"; color = "#6b675e"; - name = "Secure Yautja crate" + name = "Secure Yautja crate"; + req_one_access_txt = "252" }, /obj/item/weapon/yautja/combistick, /obj/item/weapon/yautja/combistick{ @@ -2623,7 +2622,10 @@ /obj/structure/surface/table/reinforced/prison{ color = "#6b675e" }, -/obj/item/explosive/grenade/spawnergrenade/spesscarp, +/obj/item/explosive/grenade/spawnergrenade/spesscarp{ + anchored = 1; + desc = "A strange device taken from a far-off land. It looks incredibly fragile, best not to touch it." + }, /turf/open/floor/corsat{ dir = 1; icon_state = "squareswood" @@ -2686,14 +2688,14 @@ layer = 2.79 }, /obj/item/stack/medical/advanced/ointment/predator{ - pixel_x = 6; desc = "A poultice made of cold, blue petals that is rubbed on burns. Not to be removed from the ship."; - name = "arena soothing herbs" + name = "arena soothing herbs"; + pixel_x = 6 }, /obj/item/stack/medical/advanced/bruise_pack/predator{ - pixel_x = -6; desc = "A poultice made of soft leaves that is rubbed on bruises. Not to be removed from the ship."; - name = "arena mending herbs" + name = "arena mending herbs"; + pixel_x = -6 }, /turf/open/shuttle/predship, /area/yautja) @@ -2721,9 +2723,9 @@ "HD" = ( /obj/structure/surface/rack{ color = "#6b675e"; + density = 0; layer = 2.79; - pixel_y = 24; - density = 0 + pixel_y = 24 }, /obj/item/weapon/gun/energy/yautja/plasmarifle{ pixel_y = -8 @@ -2924,13 +2926,7 @@ }, /area/yautja) "LX" = ( -/obj/item/moneybag{ - anchored = 1; - desc = "A console designed by the Hunters to assist in flight pathing and navigation."; - icon = 'icons/obj/structures/machinery/computer.dmi'; - icon_state = "overwatch"; - name = "Hunter Flight Console" - }, +/obj/structure/prop/pred_flight, /turf/open/floor/corsat{ dir = 1; icon_state = "squareswood" diff --git a/maps/templates/clf_ert_station.dmm b/maps/templates/clf_ert_station.dmm index cf8bc8d46bf6..330f7b2a1819 100644 --- a/maps/templates/clf_ert_station.dmm +++ b/maps/templates/clf_ert_station.dmm @@ -46,7 +46,7 @@ /turf/closed/wall/rock/brown, /area/adminlevel/ert_station/clf_station) "az" = ( -/obj/structure/prop/brazier/frame_woodened, +/obj/structure/prop/brazier/frame/full, /turf/open/floor/plating{ dir = 1; icon_state = "asteroidwarning" @@ -1079,7 +1079,7 @@ /turf/open/auto_turf/strata_grass/layer1, /area/adminlevel/ert_station/clf_station) "yY" = ( -/obj/structure/prop/brazier/frame_woodened, +/obj/structure/prop/brazier/frame/full, /turf/open/floor/plating{ icon_state = "asteroidwarning" }, diff --git a/scripts/ShuttleGenerator.rar b/scripts/ShuttleGenerator.rar deleted file mode 100644 index 582cc2041d00..000000000000 Binary files a/scripts/ShuttleGenerator.rar and /dev/null differ diff --git a/scripts/ircbot_message.py b/scripts/ircbot_message.py deleted file mode 100644 index 4339019e03d7..000000000000 --- a/scripts/ircbot_message.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python2 - -# Four arguments, password host channel and message. -# EG: "ircbot_message.py hunter2 example.com #adminchannel ADMINHELP, people are killing me!" - -import sys,cPickle,socket,HTMLParser - -def pack(): - ht = HTMLParser.HTMLParser() - - passwd = sys.argv[1] - ip = sys.argv[3] - try: - data = [] - for in_data in sys.argv[4:]: #The rest of the arguments is data - data += {ht.unescape(in_data)} - except: - data = "NO DATA SPECIFIED" - dictionary = {"ip":ip,"data":[passwd] + data} - pickled = cPickle.dumps(dictionary) - nudge(pickled) -def nudge(data): - HOST = sys.argv[2] - PORT = 45678 - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.connect((HOST,PORT)) - s.send(data) - s.close() - -if __name__ == "__main__" and len(sys.argv) > 1: # If not imported and more than one argument - pack() diff --git a/sound/machines/firepit_ambience.ogg b/sound/machines/firepit_ambience.ogg new file mode 100644 index 000000000000..bebbd13cc6dc Binary files /dev/null and b/sound/machines/firepit_ambience.ogg differ diff --git a/tgui/packages/tgui/interfaces/AlmayerControl.js b/tgui/packages/tgui/interfaces/AlmayerControl.js new file mode 100644 index 000000000000..6cc44737626c --- /dev/null +++ b/tgui/packages/tgui/interfaces/AlmayerControl.js @@ -0,0 +1,259 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Button, Section, Flex, NoticeBox, Collapsible, Divider, Box } from '../components'; +import { Window } from '../layouts'; + +export const AlmayerControl = (_props, context) => { + const { act, data } = useBackend(context); + + const worldTime = data.worldtime; + const messages = data.messages; + + const evacstatus = data.evac_status; + const evacEta = data.evac_eta; + + const AlertLevel = data.alert_level; + + const minimumTimeElapsed = worldTime > data.distresstimelock; + + const canMessage = data.time_message < worldTime; // ship announcement + const canRequest = // requesting distress beacon + data.time_request < worldTime && AlertLevel === 2 && minimumTimeElapsed; + const canEvac = (evacstatus === 0, AlertLevel >= 2); // triggering evac + const canDestruct = + data.time_destruct < worldTime && minimumTimeElapsed && AlertLevel === 2; + const canCentral = data.time_central < worldTime; // messaging HC + + let distress_reason; + let destruct_reason; + if (AlertLevel === 3) { + distress_reason = 'Self-destruct in progress. Beacon disabled.'; + destruct_reason = 'Self-destruct is already active!'; + } else if (AlertLevel !== 2) { + distress_reason = 'Ship is not under an active emergency.'; + destruct_reason = 'Ship is not under an active emergency.'; + } else if (data.time_request < worldTime) { + distress_reason = + 'Beacon is currently recharging. Time remaining: ' + + Math.ceil((data.time_message - worldTime) / 10) + + 'secs.'; + } else if (data.time_destruct < worldTime) { + destruct_reason = + 'A request has already been sent to HC. Please wait: ' + + Math.ceil((data.time_destruct - worldTime) / 10) + + 'secs to send another.'; + } else if (!minimumTimeElapsed) { + distress_reason = "It's too early to launch a distress beacon."; + destruct_reason = "It's too early to initiate the self-destruct."; + } + + let alertLevelString; + let alertLevelColor; + if (AlertLevel === 3) { + alertLevelString = 'DELTA'; + alertLevelColor = 'purple'; + } + if (AlertLevel === 2) { + alertLevelString = 'RED'; + alertLevelColor = 'red'; + } + if (AlertLevel === 1) { + alertLevelString = 'BLUE'; + alertLevelColor = 'blue'; + } + if (AlertLevel === 0) { + alertLevelString = 'GREEN'; + alertLevelColor = 'green'; + } + + return ( + + +
+ + + + + + {!canMessage && ( + + )} + {!!canMessage && ( + + )} + {!!canCentral && ( +
+ + + {messages && ( + + + + + {messages.map((entry) => { + return ( + +
+ act('delmessage', { number: entry.number }) + } + /> + }> + {entry.text} +
+
+ ); + })} +
+
+
+ )} +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/CommandTablet.js b/tgui/packages/tgui/interfaces/CommandTablet.js index f4cc882070b2..8b334d1dac62 100644 --- a/tgui/packages/tgui/interfaces/CommandTablet.js +++ b/tgui/packages/tgui/interfaces/CommandTablet.js @@ -28,7 +28,7 @@ export const CommandTablet = (_props, context) => { } else if (AlertLevel !== 2) { distress_reason = 'Ship is not under an active emergency.'; } else if (distressCooldown) { - distress_reason = 'Beacon is currently on cooldown.'; + distress_reason = 'Beacon is currently recharging.'; } else if (!minimumTimeElapsed) { distress_reason = "It's too early to launch a distress beacon."; } @@ -41,7 +41,7 @@ export const CommandTablet = (_props, context) => { {!canAnnounce && ( )}