diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm index 825fde409bae..ebd4a7a38179 100644 --- a/code/__DEFINES/job.dm +++ b/code/__DEFINES/job.dm @@ -64,7 +64,11 @@ GLOBAL_LIST_INIT(job_squad_roles, JOB_SQUAD_ROLES_LIST) #define JOB_MEDIC_ROLES_LIST list(JOB_SQUAD_MEDIC, JOB_CMO, JOB_DOCTOR, JOB_NURSE, JOB_RESEARCHER, JOB_SURGEON) #define JOB_CORPORATE_LIAISON "Corporate Liaison" + #define JOB_COMBAT_REPORTER "Combat Correspondent" +#define JOB_CIVIL_ROLES /datum/timelock/civil +#define JOB_CIVIL_ROLES_LIST list(JOB_COMBAT_REPORTER) + #define JOB_MESS_SERGEANT "Mess Technician" #define JOB_SYNTH "Synthetic" #define JOB_SYNTH_K9 "Synthetic K9" @@ -214,6 +218,9 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST) #define ROLES_WY_CORPORATE list(JOB_EXECUTIVE_SUPERVISOR, JOB_EXECUTIVE_SPECIALIST, JOB_SENIOR_EXECUTIVE, JOB_EXECUTIVE, JOB_JUNIOR_EXECUTIVE, JOB_TRAINEE) #define ROLES_WY_LEADERSHIP list(JOB_DIRECTOR, JOB_PMC_DIRECTOR, JOB_CHIEF_EXECUTIVE, JOB_DIVISION_MANAGER, JOB_ASSISTANT_MANAGER) +#define JOB_CORPORATE_ROLES /datum/timelock/corporate +#define JOB_CORPORATE_ROLES_LIST list(JOB_CORPORATE_LIAISON, JOB_WO_CORPORATE_LIAISON, JOB_DIRECTOR, JOB_PMC_DIRECTOR, JOB_CHIEF_EXECUTIVE, JOB_DIVISION_MANAGER, JOB_ASSISTANT_MANAGER, JOB_EXECUTIVE_SUPERVISOR, JOB_EXECUTIVE_SPECIALIST, JOB_SENIOR_EXECUTIVE, JOB_EXECUTIVE, JOB_JUNIOR_EXECUTIVE, JOB_TRAINEE) + //-------- WY Goons --------// #define JOB_WY_GOON "WY Corporate Security" #define JOB_WY_GOON_TECH "WY Corporate Security Technician" @@ -373,6 +380,22 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST) #define DUTCH_JOB_LIST list(JOB_DUTCH_ARNOLD, JOB_DUTCH_RIFLEMAN, JOB_DUTCH_MINIGUNNER, JOB_DUTCH_FLAMETHROWER, JOB_DUTCH_MEDIC) +//---------- RESPONDERS ----------// +/// This root job should never appear ingame, it's used to select the character slot. +#define JOB_FAX_RESPONDER "Fax Responder" +#define JOB_FAX_RESPONDER_USCM_HC "USCM-HC Communications Officer" +#define JOB_FAX_RESPONDER_USCM_PVST "Provost Communications Officer" +#define JOB_FAX_RESPONDER_WY "WY Communications Executive" +#define JOB_FAX_RESPONDER_UPP "UPP Communications Officer" +#define JOB_FAX_RESPONDER_TWE "TWE Communications Officer" +#define JOB_FAX_RESPONDER_CLF "CLF Information Correspondant" +#define JOB_FAX_RESPONDER_CMB "CMB Deputy Operations Officer" +#define JOB_FAX_RESPONDER_PRESS "Free Press Relay Operator" + +#define FAX_RESPONDER_JOB_LIST list(JOB_FAX_RESPONDER_USCM_HC, JOB_FAX_RESPONDER_USCM_PVST, JOB_FAX_RESPONDER_WY, JOB_FAX_RESPONDER_UPP, JOB_FAX_RESPONDER_TWE, JOB_FAX_RESPONDER_CLF, JOB_FAX_RESPONDER_CMB, JOB_FAX_RESPONDER_PRESS) + + +//---------- ANTAG ----------// #define JOB_PREDATOR "Predator" #define JOB_XENOMORPH "Xenomorph" #define JOB_XENOMORPH_QUEEN "Queen" diff --git a/code/__DEFINES/mode.dm b/code/__DEFINES/mode.dm index 64a889f23a96..35eec6663f53 100644 --- a/code/__DEFINES/mode.dm +++ b/code/__DEFINES/mode.dm @@ -121,6 +121,7 @@ #define ROLE_WHITELISTED 16 #define ROLE_NO_ACCOUNT 32 #define ROLE_CUSTOM_SPAWN 64 +#define ROLE_HIDDEN 128 //================================================= //Role defines, specifically lists of roles for job bans, crew manifests and the like. @@ -151,7 +152,7 @@ GLOBAL_LIST_INIT(ROLES_WO, list(JOB_WO_CO, JOB_WO_XO, JOB_WO_CORPORATE_LIAISON, //Groundside roles GLOBAL_LIST_INIT(ROLES_XENO, list(JOB_XENOMORPH_QUEEN, JOB_XENOMORPH)) -GLOBAL_LIST_INIT(ROLES_WHITELISTED, list(JOB_SYNTH_SURVIVOR, JOB_CO_SURVIVOR, JOB_PREDATOR)) +GLOBAL_LIST_INIT(ROLES_WHITELISTED, list(JOB_SYNTH_SURVIVOR, JOB_CO_SURVIVOR, JOB_PREDATOR, JOB_FAX_RESPONDER)) GLOBAL_LIST_INIT(ROLES_SPECIAL, list(JOB_SURVIVOR)) GLOBAL_LIST_INIT(ROLES_USCM, ROLES_CIC + GLOB.ROLES_POLICE + GLOB.ROLES_AUXIL_SUPPORT + GLOB.ROLES_MISC + GLOB.ROLES_ENGINEERING + GLOB.ROLES_REQUISITION + GLOB.ROLES_MEDICAL + GLOB.ROLES_MARINES - ROLES_WO) @@ -211,13 +212,8 @@ GLOBAL_LIST_INIT(whitelist_hierarchy, list(WHITELIST_NORMAL, WHITELIST_COUNCIL, ///Senior Enlisted Advisor, auto granted by R_MENTOR #define WHITELIST_MENTOR (1<<15) - -#define WHITELISTS_GENERAL (WHITELIST_YAUTJA|WHITELIST_COMMANDER|WHITELIST_SYNTHETIC|WHITELIST_MENTOR|WHITELIST_JOE) -#define WHITELISTS_COUNCIL (WHITELIST_YAUTJA_COUNCIL|WHITELIST_COMMANDER_COUNCIL|WHITELIST_SYNTHETIC_COUNCIL) -#define WHITELISTS_LEGACY_COUNCIL (WHITELIST_YAUTJA_COUNCIL_LEGACY|WHITELIST_COMMANDER_COUNCIL_LEGACY|WHITELIST_SYNTHETIC_COUNCIL_LEGACY) -#define WHITELISTS_LEADER (WHITELIST_YAUTJA_LEADER|WHITELIST_COMMANDER_LEADER|WHITELIST_SYNTHETIC_LEADER) - -#define WHITELIST_EVERYTHING (WHITELISTS_GENERAL|WHITELISTS_COUNCIL|WHITELISTS_LEADER) +///Fax Responder +#define WHITELIST_FAX_RESPONDER (1<<16) #define COUNCIL_LIST list(WHITELIST_COMMANDER_COUNCIL, WHITELIST_SYNTHETIC_COUNCIL, WHITELIST_YAUTJA_COUNCIL) #define SENATOR_LIST list(WHITELIST_COMMANDER_LEADER, WHITELIST_SYNTHETIC_LEADER, WHITELIST_YAUTJA_LEADER) @@ -241,6 +237,7 @@ DEFINE_BITFIELD(whitelist_status, list( "WHITELIST_SYNTHETIC_COUNCIL_LEGACY" = WHITELIST_SYNTHETIC_COUNCIL_LEGACY, "WHITELIST_SYNTHETIC_LEADER" = WHITELIST_SYNTHETIC_LEADER, "WHITELIST_MENTOR" = WHITELIST_MENTOR, + "WHITELIST_FAX_RESPONDER" = WHITELIST_FAX_RESPONDER, )) //================================================= @@ -293,6 +290,7 @@ DEFINE_BITFIELD(whitelist_status, list( #define FACTION_YAUTJA "Yautja" #define FACTION_ZOMBIE "Zombie" #define FACTION_MONKEY "Monkey" // Nanu +#define FACTION_FAX "Fax Responder" #define FACTION_LIST_MARINE list(FACTION_MARINE) #define FACTION_LIST_HUMANOID list(FACTION_MARINE, FACTION_PMC, FACTION_WY, FACTION_WY_DEATHSQUAD, FACTION_CLF, FACTION_CONTRACTOR, FACTION_MARSHAL, FACTION_UPP, FACTION_FREELANCER, FACTION_SURVIVOR, FACTION_NEUTRAL, FACTION_COLONIST, FACTION_MERCENARY, FACTION_DUTCH, FACTION_HEFA, FACTION_GLADIATOR, FACTION_PIRATE, FACTION_PIZZA, FACTION_SOUTO, FACTION_YAUTJA, FACTION_ZOMBIE, FACTION_TWE) diff --git a/code/__DEFINES/urls.dm b/code/__DEFINES/urls.dm index 5d3fca1a2032..2745b41336d4 100644 --- a/code/__DEFINES/urls.dm +++ b/code/__DEFINES/urls.dm @@ -9,3 +9,4 @@ #define URL_WIKI_MACROS "Macros" #define URL_WIKI_SOP "Standard_Operating_Procedure" #define URL_WIKI_CO_RULES "CO_Council_Rulings" +#define URL_WIKI_FAX_RESPONDER "Fax_Responder" diff --git a/code/datums/emergency_calls/ert_stations.dm b/code/datums/emergency_calls/ert_stations.dm index 5a129723bad0..947007d25d70 100644 --- a/code/datums/emergency_calls/ert_stations.dm +++ b/code/datums/emergency_calls/ert_stations.dm @@ -18,3 +18,6 @@ /datum/lazy_template/ert/uscm_station map_name = "uscm_ert_station" + +/datum/lazy_template/fax_response_base + map_name = "fax_responder_base" diff --git a/code/datums/skills/civilian.dm b/code/datums/skills/civilian.dm index ff9cadf02913..66bca6b0fbef 100644 --- a/code/datums/skills/civilian.dm +++ b/code/datums/skills/civilian.dm @@ -224,3 +224,15 @@ CIVILIAN SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, ) + +/datum/skills/civilian/fax_responder + name = "Comms Relay Worker" //Used for fax responder presets, allowing use of appropriate HUDs and basics. + skills = list( + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_NOVICE, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_INTEL = SKILL_INTEL_EXPERT, + ) diff --git a/code/game/area/admin_level.dm b/code/game/area/admin_level.dm index 9dc43256f4de..f522ca24cd16 100644 --- a/code/game/area/admin_level.dm +++ b/code/game/area/admin_level.dm @@ -142,6 +142,10 @@ soundscape_playlist = SCAPE_PL_ELEVATOR_MUSIC icon_state = "yellow" +/area/adminlevel/ert_station/fax_response_station + name = "Sector Comms Relay" + icon_state = "green" + //Simulation area /area/adminlevel/simulation name = "Simulated Reality" diff --git a/code/game/gamemodes/cm_initialize.dm b/code/game/gamemodes/cm_initialize.dm index 3d1b85395438..5d0151212c81 100644 --- a/code/game/gamemodes/cm_initialize.dm +++ b/code/game/gamemodes/cm_initialize.dm @@ -48,6 +48,7 @@ Additional game mode variables. var/list/dead_queens // A list of messages listing the dead queens var/list/predators = list() var/list/joes = list() + var/list/fax_responders = list() var/xeno_required_num = 0 //We need at least one. You can turn this off in case we don't care if we spawn or don't spawn xenos. var/xeno_starting_num = 0 //To clamp starting xenos. @@ -255,6 +256,107 @@ Additional game mode variables. return new_predator +//===================================================\\ + + //FAX RESPONDER INITIATLIZE\\ + +//===================================================\\ + +/datum/game_mode/proc/check_fax_responder_late_join(mob/responder, show_warning = TRUE) + if(!responder.client) + return FALSE + if(!(responder?.client.check_whitelist_status(WHITELIST_FAX_RESPONDER))) + if(show_warning) + to_chat(responder, SPAN_WARNING("You are not whitelisted!")) + return FALSE + if(show_warning && tgui_alert(responder, "Confirm joining as a Fax Responder.", "Confirmation", list("Yes", "No"), 10 SECONDS) != "Yes") + return FALSE + if(!get_fax_responder_slots(responder)) + if(show_warning) + to_chat(responder, SPAN_WARNING("No slots available!")) + return FALSE + return TRUE + +/datum/game_mode/proc/get_fax_responder_slots(mob/responder_candidate) + var/list/options = list() + if(!responder_candidate.client) + return FALSE + if(!(responder_candidate.client.check_whitelist_status(WHITELIST_FAX_RESPONDER))) + to_chat(responder_candidate, SPAN_WARNING("You are not whitelisted!")) + return FALSE + + for(var/job in FAX_RESPONDER_JOB_LIST) + var/datum/job/fax_responder_job = GLOB.RoleAuthority.roles_by_name[job] + var/job_max = fax_responder_job.total_positions + if((fax_responder_job.current_positions < job_max) && fax_responder_job.can_play_role(responder_candidate.client)) + options += job + return options + +/datum/game_mode/proc/attempt_to_join_as_fax_responder(mob/responder_candidate, from_lobby = FALSE) + var/list/options = get_fax_responder_slots(responder_candidate) + if(!options || !options.len) + to_chat(responder_candidate, SPAN_WARNING("No Available Slot!")) + if(from_lobby) + var/mob/new_player/lobbied = responder_candidate + lobbied.new_player_panel() + return FALSE + + var/choice = tgui_input_list(responder_candidate, "What Fax Responder do you want to join as?", "Which Responder?", options, 30 SECONDS) + if(!(choice in FAX_RESPONDER_JOB_LIST)) + to_chat(responder_candidate, SPAN_WARNING("Error: No valid responder selected.")) + if(from_lobby) + var/mob/new_player/lobbied = responder_candidate + lobbied.new_player_panel() + return FALSE + + if(!transform_fax_responder(responder_candidate, choice)) + if(from_lobby) + var/mob/new_player/lobbied = responder_candidate + lobbied.new_player_panel() + return FALSE + + if(responder_candidate) + responder_candidate.moveToNullspace() //Nullspace it for garbage collection later. + return TRUE + +/datum/game_mode/proc/transform_fax_responder(mob/responder_candidate, sub_job) + //set waitfor = FALSE + + if(!(sub_job in FAX_RESPONDER_JOB_LIST)) + return FALSE + + if(!responder_candidate.client) // Legacy - probably due to spawn code sync sleeps + log_debug("Null client attempted to transform_fax_responder") + return FALSE + if(!loaded_fax_base) + loaded_fax_base = SSmapping.lazy_load_template(/datum/lazy_template/fax_response_base, force = TRUE) + if(!loaded_fax_base) + log_debug("Error loading fax response base!") + return FALSE + + responder_candidate.client.prefs.find_assigned_slot(JOB_FAX_RESPONDER) + + var/turf/spawn_point = get_turf(pick(GLOB.latejoin_by_job[sub_job])) + var/mob/living/carbon/human/new_responder = new(spawn_point) + responder_candidate.mind.transfer_to(new_responder, TRUE) + new_responder.client?.prefs.copy_all_to(new_responder, JOB_FAX_RESPONDER, TRUE, TRUE) + + var/datum/job/fax_responder_job = GLOB.RoleAuthority.roles_by_name[sub_job] + + if(!fax_responder_job) + qdel(new_responder) + return FALSE + + // This is usually done in assign_role, a proc which is not executed in this case, since check_fax_responder_late_join is running its own checks. + fax_responder_job.current_positions++ + GLOB.RoleAuthority.equip_role(new_responder, fax_responder_job, new_responder.loc) + SSticker.minds += new_responder.mind + + message_admins(FONT_SIZE_XL(SPAN_RED("([new_responder.key]) joined as a [sub_job], [new_responder.real_name]."))) + new_responder.add_fax_responder() + + return TRUE + //===================================================\\ diff --git a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm index cfe67465df07..3947447e4da0 100644 --- a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm +++ b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm @@ -26,7 +26,7 @@ /datum/job/civilian/doctor/whiskey = JOB_DOCTOR, /datum/job/civilian/researcher/whiskey = JOB_RESEARCHER, /datum/job/logistics/engineering/whiskey = JOB_CHIEF_ENGINEER, - /datum/job/logistics/tech/maint/whiskey = JOB_MAINT_TECH, + /datum/job/logistics/maint/whiskey = JOB_MAINT_TECH, /datum/job/logistics/cargo/whiskey = JOB_CARGO_TECH, /datum/job/civilian/liaison/whiskey = JOB_CORPORATE_LIAISON, /datum/job/marine/leader/whiskey = JOB_SQUAD_LEADER, diff --git a/code/game/gamemodes/colonialmarines/whiskey_outpost/equipping.dm b/code/game/gamemodes/colonialmarines/whiskey_outpost/equipping.dm index d5ff07391b5e..617f957f9aec 100644 --- a/code/game/gamemodes/colonialmarines/whiskey_outpost/equipping.dm +++ b/code/game/gamemodes/colonialmarines/whiskey_outpost/equipping.dm @@ -189,12 +189,12 @@ Ensure power is up, and the bunker is well defended. You share your bunker crew //************************************* //---------------MAINT TECH------------- //*************************************/ -/datum/job/logistics/tech/maint/whiskey +/datum/job/logistics/maint/whiskey title = JOB_WO_ORDNANCE_TECH supervisors = "the bunker crew master and the quartermaster" gear_preset = /datum/equipment_preset/wo/bc -/datum/job/logistics/tech/maint/whiskey/generate_entry_message(mob/living/carbon/human/H) +/datum/job/logistics/maint/whiskey/generate_entry_message(mob/living/carbon/human/H) . = {"You've worked here for a while, figuring it was a pretty comfy job. Now you gotta fight for your life. Have fun with that. Assist both the Bunker Crew Master and the Quartermaster in their duties."} diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 603f0313f840..d746248034a1 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -40,6 +40,9 @@ GLOBAL_VAR_INIT(cas_tracking_id_increment, 0) //this var used to assign unique t var/hardcore = FALSE + ///Whether or not the fax response station has loaded. + var/loaded_fax_base = FALSE + /datum/game_mode/New() ..() if(taskbar_icon) diff --git a/code/game/jobs/job/civilians/civilian.dm b/code/game/jobs/job/civilians/civilian.dm index a9631f2ed9c1..94865eb3b1b1 100644 --- a/code/game/jobs/job/civilians/civilian.dm +++ b/code/game/jobs/job/civilians/civilian.dm @@ -7,3 +7,18 @@ /datum/timelock/medic/New(name, time_required, list/roles) . = ..() src.roles = JOB_MEDIC_ROLES_LIST + +/datum/timelock/corporate + name = "Corporate Roles" + +/datum/timelock/corporate/New(name, time_required, list/roles) + . = ..() + src.roles = JOB_CORPORATE_ROLES_LIST + + +/datum/timelock/civil + name = "Civil Roles" + +/datum/timelock/civil/New(name, time_required, list/roles) + . = ..() + src.roles = JOB_CIVIL_ROLES_LIST diff --git a/code/game/jobs/job/special/responders.dm b/code/game/jobs/job/special/responders.dm new file mode 100644 index 000000000000..4fc6d162b2d7 --- /dev/null +++ b/code/game/jobs/job/special/responders.dm @@ -0,0 +1,83 @@ +/datum/job/fax_responder + title = JOB_FAX_RESPONDER + gear_preset = /datum/equipment_preset/fax_responder + selection_class = "job_command" + supervisors = "CMSS13 Administration Staff" + total_positions = 1 + spawn_positions = 1 + + late_joinable = FALSE + + flags_startup_parameters = ROLE_ADMIN_NOTIFY|ROLE_WHITELISTED|ROLE_NO_ACCOUNT|ROLE_CUSTOM_SPAWN|ROLE_HIDDEN + flags_whitelist = WHITELIST_FAX_RESPONDER + +/datum/job/fax_responder/on_config_load() + entry_message_body = "Your job is to answer faxes sent to your fax machine. You are answering on behalf of the CMSS13 staff team and are therefore expected to behave appropriately. Failure to adhere to expectations may result in loss of the role or a server ban. Non-staff players of this role are not able to authorise ERTs through their faxes." + return ..() + +/datum/job/fax_responder/uscm_hc + title = JOB_FAX_RESPONDER_USCM_HC + gear_preset = /datum/equipment_preset/fax_responder/uscm + +AddTimelock(/datum/job/fax_responder/uscm_hc, list( + JOB_POLICE_ROLES = 25 HOURS, + JOB_COMMAND_ROLES = 75 HOURS, +)) + +/datum/job/fax_responder/uscm_pvst + title = JOB_FAX_RESPONDER_USCM_PVST + gear_preset = /datum/equipment_preset/fax_responder/uscm/provost + +AddTimelock(/datum/job/fax_responder/uscm_pvst, list( + JOB_POLICE_ROLES = 75 HOURS, + JOB_COMMAND_ROLES = 75 HOURS, +)) + +/datum/job/fax_responder/wy + title = JOB_FAX_RESPONDER_WY + gear_preset = /datum/equipment_preset/fax_responder/wey_yu + +AddTimelock(/datum/job/fax_responder/wy, list( + JOB_CORPORATE_ROLES = 75 HOURS, +)) + +/datum/job/fax_responder/upp + title = JOB_FAX_RESPONDER_UPP + gear_preset = /datum/equipment_preset/fax_responder/upp + +AddTimelock(/datum/job/fax_responder/upp, list( + JOB_COMMAND_ROLES = 75 HOURS, +)) + +/datum/job/fax_responder/twe + title = JOB_FAX_RESPONDER_TWE + gear_preset = /datum/equipment_preset/fax_responder/twe + +AddTimelock(/datum/job/fax_responder/twe, list( + JOB_COMMAND_ROLES = 75 HOURS, +)) + +/datum/job/fax_responder/clf + title = JOB_FAX_RESPONDER_CLF + gear_preset = /datum/equipment_preset/fax_responder/clf + +AddTimelock(/datum/job/fax_responder/clf, list( + JOB_COMMAND_ROLES = 75 HOURS, +)) + +/datum/job/fax_responder/cmb + title = JOB_FAX_RESPONDER_CMB + gear_preset = /datum/equipment_preset/fax_responder/cmb + +AddTimelock(/datum/job/fax_responder/cmb, list( + JOB_POLICE_ROLES = 75 HOURS, + JOB_COMMAND_ROLES = 25 HOURS, +)) + +/datum/job/fax_responder/press + title = JOB_FAX_RESPONDER_PRESS + gear_preset = /datum/equipment_preset/fax_responder/press + +AddTimelock(/datum/job/fax_responder/press, list( + JOB_CIVIL_ROLES = 25 HOURS, +)) diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm index 8cd91a494c83..9de3240a4150 100644 --- a/code/game/jobs/whitelist.dm +++ b/code/game/jobs/whitelist.dm @@ -44,8 +44,10 @@ #define WL_PANEL_RIGHT_YAUTJA (1<<2) #define WL_PANEL_RIGHT_MENTOR (1<<3) #define WL_PANEL_RIGHT_OVERSEER (1<<4) +#define WL_PANEL_RIGHT_MANAGER (1<<5) #define WL_PANEL_ALL_COUNCILS (WL_PANEL_RIGHT_CO|WL_PANEL_RIGHT_SYNTH|WL_PANEL_RIGHT_YAUTJA) -#define WL_PANEL_ALL_RIGHTS (WL_PANEL_RIGHT_CO|WL_PANEL_RIGHT_SYNTH|WL_PANEL_RIGHT_YAUTJA|WL_PANEL_RIGHT_MENTOR|WL_PANEL_RIGHT_OVERSEER) +#define WL_PANEL_RIGHTS_OVERSEER (WL_PANEL_RIGHT_CO|WL_PANEL_RIGHT_SYNTH|WL_PANEL_RIGHT_YAUTJA|WL_PANEL_RIGHT_OVERSEER) +#define WL_PANEL_ALL_RIGHTS (WL_PANEL_RIGHT_CO|WL_PANEL_RIGHT_SYNTH|WL_PANEL_RIGHT_YAUTJA|WL_PANEL_RIGHT_MENTOR|WL_PANEL_RIGHT_OVERSEER|WL_PANEL_RIGHT_MANAGER) /datum/whitelist_panel var/viewed_player = list() @@ -68,7 +70,7 @@ if(person.check_whitelist_status(WHITELIST_YAUTJA_LEADER)) rights |= WL_PANEL_RIGHT_YAUTJA if(rights == WL_PANEL_ALL_COUNCILS) - return WL_PANEL_ALL_RIGHTS + rights |= WL_PANEL_RIGHTS_OVERSEER return rights /datum/whitelist_panel/tgui_interact(mob/user, datum/tgui/ui) @@ -114,7 +116,7 @@ GLOBAL_LIST_INIT(syn_flags, list( )) GLOBAL_LIST_INIT(yaut_flags, list( list(name = "Yautja", bitflag = WHITELIST_YAUTJA, permission = WL_PANEL_RIGHT_YAUTJA), - list(name = "Legacy Holder", bitflag = WHITELIST_YAUTJA_LEGACY, permission = WL_PANEL_RIGHT_OVERSEER), + list(name = "Legacy Holder", bitflag = WHITELIST_YAUTJA_LEGACY, permission = WL_PANEL_RIGHT_MANAGER), list(name = "Council", bitflag = WHITELIST_YAUTJA_COUNCIL, permission = WL_PANEL_RIGHT_YAUTJA), list(name = "Legacy Council", bitflag = WHITELIST_YAUTJA_COUNCIL_LEGACY, permission = WL_PANEL_RIGHT_YAUTJA), list(name = "Senator", bitflag = WHITELIST_YAUTJA_LEADER, permission = WL_PANEL_RIGHT_OVERSEER) @@ -122,6 +124,7 @@ GLOBAL_LIST_INIT(yaut_flags, list( GLOBAL_LIST_INIT(misc_flags, list( list(name = "Senior Enlisted Advisor", bitflag = WHITELIST_MENTOR, permission = WL_PANEL_RIGHT_MENTOR), list(name = "Working Joe", bitflag = WHITELIST_JOE, permission = WL_PANEL_RIGHT_SYNTH), + list(name = "Fax Responder", bitflag = WHITELIST_FAX_RESPONDER, permission = WL_PANEL_RIGHT_MANAGER), )) /datum/whitelist_panel/ui_static_data(mob/user) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 88e74ccdf141..35bfb3e1c3b8 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -8,7 +8,7 @@ //Used for logging people entering cryosleep and important items they are carrying. GLOBAL_LIST_EMPTY(frozen_crew) -GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = list(), SQUAD_MARINE_3 = list(), SQUAD_MARINE_4 = list(), "MP" = list(), "REQ" = list(), "Eng" = list(), "Med" = list(), "Yautja" = list())) +GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = list(), SQUAD_MARINE_3 = list(), SQUAD_MARINE_4 = list(), "MP" = list(), "REQ" = list(), "Eng" = list(), "Med" = list(), "Yautja" = list(), "Responders" = list())) //Main cryopod console. @@ -229,8 +229,8 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li var/list/dept_console = GLOB.frozen_items["REQ"] if(ishuman(occupant)) - var/mob/living/carbon/human/H = occupant - switch(H.job) + var/mob/living/carbon/human/cryo_human = occupant + switch(cryo_human.job) if(JOB_POLICE, JOB_WARDEN, JOB_CHIEF_POLICE) dept_console = GLOB.frozen_items["MP"] if(JOB_NURSE, JOB_DOCTOR, JOB_RESEARCHER, JOB_CMO) @@ -240,7 +240,10 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li if(JOB_PREDATOR) dept_console = GLOB.frozen_items["Yautja"] - H.species.handle_cryo(H) + if(cryo_human.job in FAX_RESPONDER_JOB_LIST) + cryo_human.despawn_fax_responder() + + cryo_human.species.handle_cryo(cryo_human) var/list/deleteempty = list(/obj/item/storage/backpack/marine/satchel) diff --git a/code/game/machinery/fax_machine.dm b/code/game/machinery/fax_machine.dm index b15117bb2554..4b5df130c96d 100644 --- a/code/game/machinery/fax_machine.dm +++ b/code/game/machinery/fax_machine.dm @@ -1,5 +1,6 @@ -GLOBAL_LIST_INIT_TYPED(allfaxes, /obj/structure/machinery/faxmachine, list()) -GLOBAL_LIST_EMPTY(alldepartments) +GLOBAL_LIST_INIT_TYPED(all_faxmachines, /obj/structure/machinery/faxmachine, list()) +GLOBAL_LIST_EMPTY(all_fax_departments) +GLOBAL_LIST_EMPTY(all_faxcodes) #define DEPARTMENT_WY "Weyland-Yutani" #define DEPARTMENT_HC "USCM High Command" @@ -9,8 +10,24 @@ GLOBAL_LIST_EMPTY(alldepartments) #define DEPARTMENT_TWE "Three World Empire" #define DEPARTMENT_UPP "Union of Progress Peoples" #define DEPARTMENT_CLF "Colonial Liberation Front" +#define DEPARTMENT_TARGET "Specific Machine Code"//Used to send to a single specific machine. #define HIGHCOM_DEPARTMENTS list(DEPARTMENT_WY, DEPARTMENT_HC, DEPARTMENT_CMB, DEPARTMENT_PROVOST, DEPARTMENT_PRESS, DEPARTMENT_TWE, DEPARTMENT_UPP, DEPARTMENT_CLF) +#define FAX_NET_USCM "USCM Encrypted Network" +#define FAX_NET_USCM_HC "USCM High Command Quantum Relay" +#define FAX_NET_WY "Weyland-Yutani Secure Network" +#define FAX_NET_WY_COL "Weyland-Yutani Public Network" +#define FAX_NET_WY_HC "Weyland-Yutani Quantum Relay" +#define FAX_NET_CMB "NC4 UA Federal Secure Network - CMB Relay" +#define FAX_NET_TWE "TWE Encrypted Network" +#define FAX_NET_TWE_HC "TWE Imperial Command Quantum Relay" +#define FAX_NET_UPP "UPP Encrypted Network" +#define FAX_NET_UPP_HC "UPP High Command Quantum Relay" +#define FAX_NET_CLF "Peridia Encrypted Network" +#define FAX_NET_CLF_HC "Peridia Quantum Relay" +#define FAX_NET_PRESS_HC "Free Press Quantum Relay" +#define FAX_HC_NETWORKS list(FAX_NET_USCM_HC, FAX_NET_WY_HC, FAX_NET_CMB, FAX_NET_TWE_HC, FAX_NET_UPP_HC, FAX_NET_CLF_HC, FAX_NET_PRESS_HC) + /obj/structure/machinery/faxmachine // why not fax_machine? name = "\improper General Purpose Fax Machine" icon = 'icons/obj/structures/machinery/library.dmi' @@ -35,24 +52,81 @@ GLOBAL_LIST_EMPTY(alldepartments) ///Target department var/target_department = DEPARTMENT_WY + var/target_machine_id = "No ID Selected" // list for img and their photo reference to be stored into the admin's cache. var/list/photo_list = list() ///Fluff network shown by fax machine when logged in - var/network = "Weyland-Yutani Public Network" + var/network = FAX_NET_WY_COL ///storer var for cooldown on sending faxes var/fax_cooldown = 300 COOLDOWN_DECLARE(send_cooldown) + /// Unique identifier for the fax machine. + var/machine_id_tag + /// Whether or not the ID tag can be changed by proc. + var/fixed_id_tag = FALSE + /obj/structure/machinery/faxmachine/Initialize(mapload, ...) . = ..() - GLOB.allfaxes += src + GLOB.all_faxmachines += src update_departments() + generate_id_tag() + +/obj/structure/machinery/faxmachine/proc/generate_id_tag(force = FALSE) + if(fixed_id_tag && !force) + return FALSE + if(machine_id_tag) + GLOB.all_faxcodes -= machine_id_tag + + var/id_tag_prefix + var/id_tag_suffix = "[rand(1000, 9999)][pick(GLOB.alphabet_uppercase)][pick(GLOB.alphabet_uppercase)]" + var/id_tag_final + switch(network) + if(FAX_NET_USCM) + id_tag_prefix = "UA-M"//United Americas Military + if(FAX_NET_USCM_HC) + id_tag_final = FAX_NET_USCM_HC + if(FAX_NET_CMB) + id_tag_final = FAX_NET_CMB + if(FAX_NET_WY) + id_tag_prefix = "WY-SCN"//Weyland Yutani Secure Corporate Network + if(FAX_NET_WY_COL) + id_tag_prefix = "WYC"//Weyland Yutani Communications + if(FAX_NET_WY_HC) + id_tag_final = FAX_NET_WY_HC + if(FAX_NET_TWE) + id_tag_prefix = "ICN"//Imperial Communication Network + if(FAX_NET_TWE_HC) + id_tag_final = FAX_NET_TWE_HC + if(FAX_NET_UPP) + id_tag_prefix = "UFR"//Union Fax Relay + if(FAX_NET_UPP_HC) + id_tag_final = FAX_NET_UPP_HC + if(FAX_NET_CLF) + id_tag_prefix = "PRD"//PeRiDia + if(FAX_NET_CLF_HC) + id_tag_final = FAX_NET_CLF_HC + if(FAX_NET_PRESS_HC) + id_tag_final = FAX_NET_PRESS_HC + + if(!id_tag_final) + id_tag_final = "[id_tag_prefix]-[id_tag_suffix]" + if(id_tag_final in GLOB.all_faxcodes) + generate_id_tag() + return FALSE + + machine_id_tag = id_tag_final + if(machine_id_tag == network) + return TRUE + GLOB.all_faxcodes += id_tag_final + return TRUE /obj/structure/machinery/faxmachine/Destroy() - GLOB.allfaxes -= src + GLOB.all_faxmachines -= src + GLOB.all_faxcodes -= machine_id_tag . = ..() /obj/structure/machinery/faxmachine/initialize_pass_flags(datum/pass_flags_container/PF) @@ -129,24 +203,26 @@ GLOBAL_LIST_EMPTY(alldepartments) return /obj/structure/machinery/faxmachine/proc/update_departments() - if( !("[department]" in GLOB.alldepartments) ) //Initialize departments. This will work with multiple fax machines. - GLOB.alldepartments += department - if(!(DEPARTMENT_WY in GLOB.alldepartments)) - GLOB.alldepartments += DEPARTMENT_WY - if(!(DEPARTMENT_HC in GLOB.alldepartments)) - GLOB.alldepartments += DEPARTMENT_HC - if(!(DEPARTMENT_PROVOST in GLOB.alldepartments)) - GLOB.alldepartments += DEPARTMENT_PROVOST - if(!(DEPARTMENT_CMB in GLOB.alldepartments)) - GLOB.alldepartments += DEPARTMENT_CMB - if(!(DEPARTMENT_PRESS in GLOB.alldepartments)) - GLOB.alldepartments += DEPARTMENT_PRESS - if(!(DEPARTMENT_TWE in GLOB.alldepartments)) - GLOB.alldepartments += DEPARTMENT_TWE - if(!(DEPARTMENT_UPP in GLOB.alldepartments)) - GLOB.alldepartments += DEPARTMENT_UPP - if(!(DEPARTMENT_CLF in GLOB.alldepartments)) - GLOB.alldepartments += DEPARTMENT_CLF + if(!(DEPARTMENT_TARGET in GLOB.all_fax_departments)) + GLOB.all_fax_departments += DEPARTMENT_TARGET + if( !("[department]" in GLOB.all_fax_departments) ) //Initialize departments. This will work with multiple fax machines. + GLOB.all_fax_departments += department + if(!(DEPARTMENT_WY in GLOB.all_fax_departments)) + GLOB.all_fax_departments += DEPARTMENT_WY + if(!(DEPARTMENT_HC in GLOB.all_fax_departments)) + GLOB.all_fax_departments += DEPARTMENT_HC + if(!(DEPARTMENT_PROVOST in GLOB.all_fax_departments)) + GLOB.all_fax_departments += DEPARTMENT_PROVOST + if(!(DEPARTMENT_CMB in GLOB.all_fax_departments)) + GLOB.all_fax_departments += DEPARTMENT_CMB + if(!(DEPARTMENT_PRESS in GLOB.all_fax_departments)) + GLOB.all_fax_departments += DEPARTMENT_PRESS + if(!(DEPARTMENT_TWE in GLOB.all_fax_departments)) + GLOB.all_fax_departments += DEPARTMENT_TWE + if(!(DEPARTMENT_UPP in GLOB.all_fax_departments)) + GLOB.all_fax_departments += DEPARTMENT_UPP + if(!(DEPARTMENT_CLF in GLOB.all_fax_departments)) + GLOB.all_fax_departments += DEPARTMENT_CLF // TGUI SHIT \\ @@ -169,6 +245,7 @@ GLOBAL_LIST_EMPTY(alldepartments) data["department"] = department data["network"] = network + data["machine_id_tag"] = machine_id_tag return data @@ -181,7 +258,17 @@ GLOBAL_LIST_EMPTY(alldepartments) data["paper_name"] = original_fax.name data["authenticated"] = authenticated + data["target_department"] = target_department + if(target_department == DEPARTMENT_TARGET) + data["target_department"] = target_machine_id + + if(target_department in HIGHCOM_DEPARTMENTS) + data["highcom_dept"] = TRUE + else + data["highcom_dept"] = FALSE + + data["awake_responder"] = is_department_responder_awake(target_department) data["worldtime"] = world.time data["nextfaxtime"] = send_cooldown @@ -266,8 +353,15 @@ GLOBAL_LIST_EMPTY(alldepartments) if("select") var/last_target_department = target_department - target_department = tgui_input_list(ui.user, "Which department?", "Choose a department", GLOB.alldepartments) - if(!target_department) target_department = last_target_department + target_department = tgui_input_list(ui.user, "Which department?", "Choose a department", GLOB.all_fax_departments) + if(!target_department) + target_department = last_target_department + if(target_department == DEPARTMENT_TARGET) + var/new_target_machine_id = tgui_input_list(ui.user, "Which machine?", "Choose a machine code", GLOB.all_faxcodes) + if(!new_target_machine_id) + target_department = last_target_department + else + target_machine_id = new_target_machine_id . = TRUE if("auth") @@ -330,15 +424,18 @@ GLOBAL_LIST_EMPTY(alldepartments) /obj/structure/machinery/faxmachine/proc/outgoing_fax_message(mob/user) - var/datum/fax/faxcontents = new(fax_paper_copy.info, photo_list) + var/datum/fax/faxcontents = new(fax_paper_copy.info, photo_list, fax_paper_copy.name) GLOB.fax_contents += faxcontents var/scan_department = target_department + var/the_target_department = target_department if(department in HIGHCOM_DEPARTMENTS) scan_department = department + else if(target_department == DEPARTMENT_TARGET) + the_target_department = "Fax Machine [target_machine_id]" - var/msg_admin = SPAN_STAFF_IC("[target_department]: [key_name(user, 1)] ") + var/msg_admin = SPAN_STAFF_IC("[the_target_department]: [key_name(user, 1)] ") msg_admin += "[CC_MARK(user)] [ADMIN_PP(user)] [ADMIN_VV(user)] [ADMIN_SM(user)] [ADMIN_JMP_USER(user)] " switch(scan_department) @@ -372,7 +469,7 @@ GLOBAL_LIST_EMPTY(alldepartments) msg_admin += SPAN_STAFF_IC("Receiving fax via secure connection ... view message") - var/msg_ghost = SPAN_NOTICE("[target_department]: ") + var/msg_ghost = SPAN_NOTICE("[the_target_department]: ") msg_ghost += "Receiving fax via secure connection ... view message" send_fax(faxcontents) @@ -404,80 +501,81 @@ GLOBAL_LIST_EMPTY(alldepartments) /obj/structure/machinery/faxmachine/proc/send_fax(datum/fax/faxcontents) - for(var/obj/structure/machinery/faxmachine/F in GLOB.allfaxes) - if(F != src && F.department == target_department) - if(!faxcontents) - return - if(! (F.inoperable() ) ) + var/list/target_machines = list() + for(var/obj/structure/machinery/faxmachine/pos_target in GLOB.all_faxmachines) + if(target_department == DEPARTMENT_TARGET) + if(pos_target != src && pos_target.machine_id_tag == target_machine_id) + target_machines += pos_target + else + if(pos_target != src && pos_target.department == target_department) + target_machines += pos_target + + for(var/obj/structure/machinery/faxmachine/target in target_machines) + if(!faxcontents) + return + if(!(target.inoperable())) - flick("[initial(icon_state)]receive", F) + flick("[initial(icon_state)]receive", target) - // give the sprite some time to flick - spawn(30) - var/obj/item/paper/P = new(F.loc,faxcontents.photo_list) + // give the sprite some time to flick + spawn(30) + var/obj/item/paper/P = new(target.loc,faxcontents.photo_list) + if(!faxcontents.paper_name) P.name = "faxed message" - P.info = "[faxcontents.data]" - P.update_icon() - - switch(network) - if("USCM High Command Quantum Relay") - var/image/stampoverlay = image('icons/obj/items/paper.dmi') - stampoverlay.icon_state = "paper_stamp-uscm" - P.stamps += "
This paper has been stamped by the USCM High Command Quantum Relay." - if("NC4 UA Federal Secure Network - CMB Relay") - var/image/stampoverlay = image('icons/obj/items/paper.dmi') - stampoverlay.icon_state = "paper_stamp-cmb" - if(!P.stamped) - P.stamped = new - P.stamped += /obj/item/tool/stamp - P.overlays += stampoverlay - P.stamps += "
This paper has been stamped by The Office of Colonial Marshals." - if("Weyland-Yutani Quantum Relay") - var/image/stampoverlay = image('icons/obj/items/paper.dmi') - stampoverlay.icon_state = "paper_stamp-weyyu" - if(!P.stamped) - P.stamped = new - P.stamped += /obj/item/tool/stamp - P.overlays += stampoverlay - P.stamps += "
This paper has been stamped and encrypted by the Weyland-Yutani Quantum Relay (tm)." - if("TWE Royal Marines Commando Quantum Relay") - var/image/stampoverlay = image('icons/obj/items/paper.dmi') - stampoverlay.icon_state = "paper_stamp-twe" - if(!P.stamped) - P.stamped = new - P.stamped += /obj/item/tool/stamp - P.overlays += stampoverlay - P.stamps += "
This paper has been stamped by the TWE Royal Marines Commando Quantum Relay." - if("UPP High Kommand Quantum Relay") - var/image/stampoverlay = image('icons/obj/items/paper.dmi') - stampoverlay.icon_state = "paper_stamp-upp" - if(!P.stamped) - P.stamped = new - P.stamped += /obj/item/tool/stamp - P.overlays += stampoverlay - P.stamps += "
This paper has been stamped by the UPP High Kommand Quantum Relay." - if("CLF Gureilla Command Quantum Relay") - var/image/stampoverlay = image('icons/obj/items/paper.dmi') - stampoverlay.icon_state = "paper_stamp-clf" - if(!P.stamped) - P.stamped = new - P.stamped += /obj/item/tool/stamp - P.overlays += stampoverlay - P.stamps += "
This paper has been stamped and encrypted by the CLF Gureilla Command Quantum Relay." - - playsound(F.loc, "sound/items/polaroid1.ogg", 15, 1) + else + P.name = "faxed message ([faxcontents.paper_name])" + P.info = "[faxcontents.data]" + P.update_icon() + var/image/stampoverlay = image('icons/obj/items/paper.dmi') + var/encrypted = FALSE + + switch(network) + if(FAX_NET_USCM_HC) + stampoverlay.icon_state = "paper_stamp-uscm" + encrypted = TRUE + if(FAX_NET_CMB) + stampoverlay.icon_state = "paper_stamp-cmb" + network = "NC4 UA Federal Secure Network." + encrypted = TRUE + if(FAX_NET_WY_HC) + stampoverlay.icon_state = "paper_stamp-weyyu" + encrypted = TRUE + if(FAX_NET_TWE_HC) + stampoverlay.icon_state = "paper_stamp-twe" + encrypted = TRUE + if(FAX_NET_UPP_HC) + stampoverlay.icon_state = "paper_stamp-upp" + encrypted = TRUE + if(FAX_NET_CLF_HC) + stampoverlay.icon_state = "paper_stamp-clf" + encrypted = TRUE + if(FAX_NET_PRESS_HC) + stampoverlay.icon_state = "paper_stamp-rd" + encrypted = TRUE + else + stampoverlay.icon_state = "paper_stamp-fax" + + + if(encrypted) + if(!P.stamped) + P.stamped = new + P.stamped += /obj/item/tool/stamp + P.stamps += "
This paper has been stamped and encrypted by the [network]." + else + P.stamps += "
This paper has been sent by [machine_id_tag]." + P.overlays += stampoverlay + playsound(target.loc, "sound/items/polaroid1.ogg", 15, 1) qdel(faxcontents) /obj/structure/machinery/faxmachine/cmb name = "\improper CMB Incident Command Center Fax Machine" - department = "Colonial Marshal Bureau, Anchorpoint Station" - network = "NC4 UA Federal Secure Network - CMB Relay" + network = FAX_NET_CMB department = DEPARTMENT_CMB /obj/structure/machinery/faxmachine/corporate name = "\improper W-Y Corporate Fax Machine" department = "W-Y Local Office" - network = "Weyland-Yutani Secure Network" + network = FAX_NET_WY /obj/structure/machinery/faxmachine/corporate/liaison department = "W-Y Liaison" @@ -485,12 +583,12 @@ GLOBAL_LIST_EMPTY(alldepartments) /obj/structure/machinery/faxmachine/corporate/highcom department = DEPARTMENT_WY target_department = "W-Y Liaison" - network = "Weyland-Yutani Quantum Relay" + network = FAX_NET_WY_HC /obj/structure/machinery/faxmachine/uscm name = "\improper USCM Military Fax Machine" department = "USCM Local Operations" - network = "USCM Encrypted Network" + network = FAX_NET_USCM target_department = DEPARTMENT_HC /obj/structure/machinery/faxmachine/uscm/command @@ -502,7 +600,7 @@ GLOBAL_LIST_EMPTY(alldepartments) /obj/structure/machinery/faxmachine/uscm/command/highcom department = DEPARTMENT_HC target_department = "Commanding Officer" - network = "USCM High Command Quantum Relay" + network = FAX_NET_USCM_HC /obj/structure/machinery/faxmachine/uscm/brig name = "\improper USCM Provost Fax Machine" @@ -515,8 +613,45 @@ GLOBAL_LIST_EMPTY(alldepartments) /obj/structure/machinery/faxmachine/uscm/brig/provost department = DEPARTMENT_PROVOST target_department = "Brig" - network = "USCM High Command Quantum Relay" - + network = FAX_NET_USCM_HC + +/obj/structure/machinery/faxmachine/upp + name = "\improper UPP Military Fax Machine" + department = "UPP Local Operations" + network = FAX_NET_UPP + target_department = DEPARTMENT_UPP + +/obj/structure/machinery/faxmachine/upp/highcom + department = DEPARTMENT_UPP + network = FAX_NET_UPP_HC + target_department = "UPP Local Operations" + +/obj/structure/machinery/faxmachine/clf + name = "\improper Hacked General Purpose Fax Machine" + department = "CLF Local Operations" + network = FAX_NET_CLF + target_department = DEPARTMENT_CLF + +/obj/structure/machinery/faxmachine/clf/highcom + department = DEPARTMENT_CLF + network = FAX_NET_CLF_HC + target_department = "CLF Local Operations" + +/obj/structure/machinery/faxmachine/twe + name = "\improper TWE Military Fax Machine" + department = "TWE Local Operations" + network = FAX_NET_TWE + target_department = DEPARTMENT_TWE + +/obj/structure/machinery/faxmachine/twe/highcom + department = DEPARTMENT_TWE + network = FAX_NET_TWE_HC + target_department = "TWE Local Operations" + +/obj/structure/machinery/faxmachine/press/highcom + department = DEPARTMENT_PRESS + network = FAX_NET_PRESS_HC + target_department = "General Public" ///The deployed fax machine backpack /obj/structure/machinery/faxmachine/backpack @@ -526,6 +661,14 @@ GLOBAL_LIST_EMPTY(alldepartments) needs_power = FALSE use_power = USE_POWER_NONE health = 150 + var/obj/item/device/fax_backpack/faxbag + +/obj/structure/machinery/faxmachine/backpack/New(loc, portable_id_tag) + . = ..() + if(portable_id_tag) + machine_id_tag = portable_id_tag + fixed_id_tag = TRUE + GLOB.all_faxcodes += machine_id_tag ///The wearable and deployable part of the fax machine backpack /obj/item/device/fax_backpack @@ -537,6 +680,7 @@ GLOBAL_LIST_EMPTY(alldepartments) w_class = SIZE_HUGE flags_equip_slot = SLOT_BACK flags_item = ITEM_OVERRIDE_NORTHFACE + var/machine_id_tag /obj/item/device/fax_backpack/attack_self(mob/user) //activate item version fax inhand to deploy if(!ishuman(user)) @@ -570,10 +714,12 @@ GLOBAL_LIST_EMPTY(alldepartments) to_chat(user, SPAN_NOTICE("You begin to deploy [src]...")) if(do_after(user, 4.5 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) to_chat(user, SPAN_NOTICE("You deploy [src].")) - var/obj/structure/machinery/faxmachine/backpack/deployedfax = new(deployturf) + var/obj/structure/machinery/faxmachine/backpack/deployedfax = new(deployturf, machine_id_tag) + deployedfax.faxbag = src transfer_label_component(deployedfax) playsound(src.loc, 'sound/machines/print.ogg', 40, 1) - qdel(src) + user.drop_held_item(src) + forceMove(deployedfax) return return ..() @@ -589,9 +735,10 @@ GLOBAL_LIST_EMPTY(alldepartments) if(do_after(user, 4.5 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) playsound(src.loc, 'sound/items/Ratchet.ogg', 25, 1) to_chat(user, SPAN_NOTICE("You pick up [src].")) - var/obj/item/device/fax_backpack/faxbag = new(loc) transfer_label_component(faxbag) user.put_in_hands(faxbag) + if(faxbag.machine_id_tag != machine_id_tag) + faxbag.machine_id_tag = machine_id_tag qdel(src) return return ..() @@ -599,8 +746,40 @@ GLOBAL_LIST_EMPTY(alldepartments) /datum/fax var/data var/list/photo_list + var/paper_name -/datum/fax/New(data, photo_list) +/datum/fax/New(new_data, new_photo_list, new_name) . = ..() - src.data = data - src.photo_list = photo_list + data = new_data + photo_list = new_photo_list + if(new_name != "paper") + paper_name = new_name + + + +/obj/structure/machinery/faxmachine/proc/is_department_responder_awake(target_department) + if(!(target_department in HIGHCOM_DEPARTMENTS)) + return FALSE + var/target_job = JOB_FAX_RESPONDER + switch(target_department) + if(DEPARTMENT_CLF) + target_job = JOB_FAX_RESPONDER_CLF + if(DEPARTMENT_CMB) + target_job = JOB_FAX_RESPONDER_CMB + if(DEPARTMENT_HC) + target_job = JOB_FAX_RESPONDER_USCM_HC + if(DEPARTMENT_PRESS) + target_job = JOB_FAX_RESPONDER_PRESS + if(DEPARTMENT_PROVOST) + target_job = JOB_FAX_RESPONDER_USCM_PVST + if(DEPARTMENT_TWE) + target_job = JOB_FAX_RESPONDER_TWE + if(DEPARTMENT_UPP) + target_job = JOB_FAX_RESPONDER_UPP + if(DEPARTMENT_WY) + target_job = JOB_FAX_RESPONDER_WY + + for(var/mob/living/carbon/human/responder in SSticker.mode.fax_responders) + if(!(responder.stat) && (responder.job == target_job)) + return TRUE + return FALSE diff --git a/code/game/objects/effects/landmarks/landmarks.dm b/code/game/objects/effects/landmarks/landmarks.dm index c424db878f6e..13013b5bbfd4 100644 --- a/code/game/objects/effects/landmarks/landmarks.dm +++ b/code/game/objects/effects/landmarks/landmarks.dm @@ -361,10 +361,10 @@ job = /datum/job/logistics/engineering/whiskey /obj/effect/landmark/start/whiskey/maint - job = /datum/job/logistics/tech/maint/whiskey + job = /datum/job/logistics/maint/whiskey /obj/effect/landmark/start/whiskey/tech - job = /datum/job/logistics/tech //Need to create a WO variant in the future + job = /datum/job/logistics/otech //Need to create a WO variant in the future //****************************************** MILITARY POLICE- HONOR-GUARD ************************************************/ /obj/effect/landmark/start/whiskey/warrant @@ -513,6 +513,39 @@ GLOB.latejoin -= src return ..() + +/obj/effect/landmark/late_join/responder/uscm + name = "USCM HC Fax Responder late join" + job = JOB_FAX_RESPONDER_USCM_HC + +/obj/effect/landmark/late_join/responder/uscm/provost + name = "USCM Provost Fax Responder late join" + job = JOB_FAX_RESPONDER_USCM_PVST + +/obj/effect/landmark/late_join/responder/wey_yu + name = "W-Y Fax Responder late join" + job = JOB_FAX_RESPONDER_WY + +/obj/effect/landmark/late_join/responder/upp + name = "UPP Fax Responder late join" + job = JOB_FAX_RESPONDER_UPP + +/obj/effect/landmark/late_join/responder/twe + name = "TWE Fax Responder late join" + job = JOB_FAX_RESPONDER_TWE + +/obj/effect/landmark/late_join/responder/clf + name = "CLF Fax Responder late join" + job = JOB_FAX_RESPONDER_CLF + +/obj/effect/landmark/late_join/responder/cmb + name = "CMB Fax Responder late join" + job = JOB_FAX_RESPONDER_CMB + +/obj/effect/landmark/late_join/responder/press + name = "Press Fax Responder late join" + job = JOB_FAX_RESPONDER_PRESS + //****************************************** STATIC COMMS ************************************************// /obj/effect/landmark/static_comms name = "static comms" diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index 029eda204f3a..6f660323f8e3 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -1344,7 +1344,7 @@ // Stamps var/image/stampoverlay = image('icons/obj/items/paper.dmi') - stampoverlay.icon_state = "paper_stamp-uscm" + stampoverlay.icon_state = "paper_stamp-rd" if(!P.stamped) P.stamped = new P.stamped += /obj/item/tool/stamp diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index a66df6a10d46..a84e03104613 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -886,6 +886,12 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( if((flag_to_check & WHITELIST_JOE) && CLIENT_IS_STAFF(src)) return TRUE + if((flag_to_check & WHITELIST_FAX_RESPONDER) && CLIENT_IS_MENTOR(src)) + return TRUE + + if((flag_to_check & WHITELIST_FAX_RESPONDER) && isCouncil(src)) + return TRUE + if(!player_data) load_player_data() if(!player_data) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 384ed0b11b82..931574b6dc11 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -694,6 +694,8 @@ GLOBAL_LIST_INIT(bgstate_options, list( if(!job) debug_log("Missing job for prefs: [role_name]") continue + if(job.flags_startup_parameters & ROLE_HIDDEN) + continue index++ if((index >= limit) || (job.title in splitJobs)) HTML += "" diff --git a/code/modules/cm_phone/phone.dm b/code/modules/cm_phone/phone.dm index b600f9fb67cb..8d54e429ce52 100644 --- a/code/modules/cm_phone/phone.dm +++ b/code/modules/cm_phone/phone.dm @@ -605,6 +605,12 @@ GLOBAL_LIST_EMPTY_TYPED(transmitters, /obj/structure/transmitter) /obj/structure/transmitter/rotary/no_dnd do_not_disturb = PHONE_DND_FORBIDDEN +/obj/structure/transmitter/rotary/fax_responder + phone_category = "Comms Relay" + networks_receive = list("Fax Responders") + pixel_x = -6 + pixel_y = 6 + /obj/structure/transmitter/touchtone name = "touch-tone telephone" icon_state = "rotary_phone"//placeholder diff --git a/code/modules/gear_presets/fax_responders.dm b/code/modules/gear_presets/fax_responders.dm new file mode 100644 index 000000000000..80212547d67b --- /dev/null +++ b/code/modules/gear_presets/fax_responders.dm @@ -0,0 +1,207 @@ +/datum/equipment_preset/fax_responder + name = "Fax Responder" + assignment = "Fax Responder" + rank = "Fax Responder" + + role_comm_title = "Resp." + + flags = EQUIPMENT_PRESET_EXTRA + faction = FACTION_FAX + + access = list(ACCESS_CIVILIAN_PUBLIC) + skills = /datum/skills/civilian/fax_responder + idtype = /obj/item/card/id/lanyard + + paygrades = list(PAY_SHORT_CIV = JOB_PLAYTIME_TIER_0) + + var/obj/item/device/radio/headset/headset_type = /obj/item/device/radio/headset + +/datum/equipment_preset/fax_responder/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel(new_human), WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new headset_type(new_human), WEAR_L_EAR) + + +/datum/equipment_preset/fax_responder/load_id(mob/living/carbon/human/new_human, client/mob_client) + var/obj/item/clothing/under/uniform = new_human.w_uniform + if(istype(uniform)) + uniform.has_sensor = UNIFORM_HAS_SENSORS + return ..() + +//*****************************************************************************************************/ + +/datum/equipment_preset/fax_responder/uscm + name = "Fax Responder - USCM HC" + assignment = JOB_FAX_RESPONDER_USCM_HC + rank = JOB_FAX_RESPONDER_USCM_HC + + paygrades = list(PAY_SHORT_MO2 = JOB_PLAYTIME_TIER_0, PAY_SHORT_MO3 = JOB_PLAYTIME_TIER_1, PAY_SHORT_MO4 = JOB_PLAYTIME_TIER_3) + idtype = /obj/item/card/id/gold + skills = /datum/skills/XO + access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_MEDBAY, ACCESS_MARINE_BRIG, ACCESS_MARINE_AI) + headset_type = /obj/item/device/radio/headset/almayer/highcom + idtype = /obj/item/card/id/gold + +/datum/equipment_preset/fax_responder/uscm/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/marine/dress_cover/officer(new_human), WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/dress/blues/senior(new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/jacket/marine/dress/blues/officer(new_human), WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/dress(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/dress(new_human), WEAR_HANDS) + + new_human.equip_to_slot_or_del(new /obj/item/notepad/blue(new_human), WEAR_R_STORE) + . = ..() + +/datum/equipment_preset/fax_responder/uscm/provost + name = "Fax Responder - USCM Provost" + assignment = JOB_FAX_RESPONDER_USCM_PVST + rank = JOB_FAX_RESPONDER_USCM_PVST + idtype = /obj/item/card/id/provost + +/datum/equipment_preset/fax_responder/uscm/provost/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/mp/provost/chief(new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(new_human), WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/jacket/marine/provost/chief(new_human), WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/marine/mp/provost/chief(new_human), WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/sec(new_human), WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud, WEAR_EYES) + + new_human.equip_to_slot_or_del(new /obj/item/notepad/red(new_human), WEAR_R_STORE) + . = ..() + +//*****************************************************************************************************/ + +/datum/equipment_preset/fax_responder/wey_yu + name = "Fax Responder - WY" + assignment = JOB_FAX_RESPONDER_WY + rank = JOB_FAX_RESPONDER_WY + paygrades = list(PAY_SHORT_WYC5 = JOB_PLAYTIME_TIER_0, PAY_SHORT_WYC6 = JOB_PLAYTIME_TIER_1, PAY_SHORT_WYC7 = JOB_PLAYTIME_TIER_3) + access = list(ACCESS_MARINE_COMMAND, ACCESS_WY_COLONIAL, ACCESS_WY_EXEC, ACCESS_WY_GENERAL, ACCESS_WY_LEADERSHIP) + headset_type = /obj/item/device/radio/headset/distress/pmc/command + idtype = /obj/item/card/id/pmc + +/datum/equipment_preset/fax_responder/wey_yu/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/liaison_suit/blue(new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/jacket/marine/corporate/blue(new_human), WEAR_JACKET) + + new_human.equip_to_slot_or_del(new /obj/item/notepad/black(new_human), WEAR_R_STORE) + + ..() + +//*****************************************************************************************************/ + +/datum/equipment_preset/fax_responder/upp + name = "Fax Responder - UPP" + assignment = JOB_FAX_RESPONDER_UPP + rank = JOB_FAX_RESPONDER_UPP + paygrades = list(PAY_SHORT_UO2 = JOB_PLAYTIME_TIER_0, PAY_SHORT_UO3 = JOB_PLAYTIME_TIER_1, PAY_SHORT_UO4 = JOB_PLAYTIME_TIER_3) + skills = /datum/skills/upp/kapitan + headset_type = /obj/item/device/radio/headset/distress/UPP/kdo/command + idtype = /obj/item/card/id/gold + +/datum/equipment_preset/fax_responder/upp/New() + . = ..() + access = get_access(ACCESS_LIST_UPP_ALL) + +/datum/equipment_preset/fax_responder/upp/load_gear(mob/living/carbon/human/new_human) + 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/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/kapitan, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp, WEAR_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp/naval, WEAR_ACCESSORY) + + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp, WEAR_FEET) + 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/notepad/green(new_human), WEAR_R_STORE) + + ..() + + +//*****************************************************************************************************/ + +/datum/equipment_preset/fax_responder/twe + name = "Fax Responder - TWE" + assignment = JOB_FAX_RESPONDER_TWE + rank = JOB_FAX_RESPONDER_TWE + headset_type = /obj/item/device/radio/headset/distress/royal_marine + idtype = /obj/item/card/id/gold + paygrades = list(PAY_SHORT_RNO2 = JOB_PLAYTIME_TIER_0, PAY_SHORT_RNO3 = JOB_PLAYTIME_TIER_1, PAY_SHORT_RNO4 = JOB_PLAYTIME_TIER_3) + +/datum/equipment_preset/fax_responder/twe/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/twe_suit(new_human), WEAR_BODY) + + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/white(new_human), WEAR_HANDS) + + new_human.equip_to_slot_or_del(new /obj/item/notepad/blue(new_human), WEAR_R_STORE) + + ..() + +//*****************************************************************************************************/ + +/datum/equipment_preset/fax_responder/clf + name = "Fax Responder - CLF" + assignment = JOB_FAX_RESPONDER_CLF + rank = JOB_FAX_RESPONDER_CLF + headset_type = /obj/item/device/radio/headset/distress/CLF/command + paygrades = list(PAY_SHORT_REBC = JOB_PLAYTIME_TIER_0) + +/datum/equipment_preset/fax_responder/clf/New() + . = ..() + access = get_access(ACCESS_LIST_CLF_ALL) + +/datum/equipment_preset/fax_responder/clf/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/colonist/clf(new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(new_human), WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/upp(new_human), WEAR_FEET) + + ..() + +//*****************************************************************************************************/ + +/datum/equipment_preset/fax_responder/cmb + name = "Fax Responder - CMB" + assignment = JOB_FAX_RESPONDER_CMB + rank = JOB_FAX_RESPONDER_CMB + headset_type = /obj/item/device/radio/headset/distress/CMB + idtype = /obj/item/card/id/marshal + paygrades = list(PAY_SHORT_CMBM = JOB_PLAYTIME_TIER_0) + +/datum/equipment_preset/fax_responder/cmb/New() + . = ..() + access = get_access(ACCESS_LIST_EMERGENCY_RESPONSE) + +/datum/equipment_preset/fax_responder/cmb/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/CM_uniform, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/holobadge/cord, WEAR_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/CMB/marshal, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/CMB, WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/veteran/pmc, WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud, WEAR_EYES) + + ..() + +//*****************************************************************************************************/ + +/datum/equipment_preset/fax_responder/press + name = "Fax Responder - Press" + assignment = JOB_FAX_RESPONDER_PRESS + rank = JOB_FAX_RESPONDER_PRESS + headset_type = /obj/item/device/radio/headset/almayer/reporter + idtype = /obj/item/card/id/silver/cl + paygrades = list(PAY_SHORT_CIV = JOB_PLAYTIME_TIER_0) + +/datum/equipment_preset/fax_responder/press/New() + . = ..() + access = get_access(ACCESS_LIST_EMERGENCY_RESPONSE) + +/datum/equipment_preset/fax_responder/press/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/reporter(new_human), WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/jacket/marine/reporter(new_human), WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large(new_human), WEAR_L_STORE) + + ..() diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index baae4793a897..eae5af870b27 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1139,6 +1139,20 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(SSticker.mode.check_joe_late_join(src)) SSticker.mode.attempt_to_join_as_joe(src) +/mob/dead/verb/join_as_responder() + set category = "Ghost.Join" + set name = "Join as a Fax Responder" + set desc = "If you are whitelisted, you'll be able to join in." + + if (!client) + return + + if(SSticker.current_state < GAME_STATE_PLAYING || !SSticker.mode) + to_chat(src, SPAN_WARNING("The game hasn't started yet!")) + return + + if(SSticker.mode.check_fax_responder_late_join(src)) + SSticker.mode.attempt_to_join_as_fax_responder(src) /mob/dead/verb/drop_vote() set category = "Ghost" diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index 28b043d5f796..166bd76c9837 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -49,6 +49,7 @@ var/list/data = list() var/list/humans = list() + var/list/responders = list() var/list/marines = list() var/list/survivors = list() var/list/xenos = list() @@ -179,6 +180,8 @@ marines += list(serialized) else if(issurvivorjob(human.job)) survivors += list(serialized) + else if(human.job in FAX_RESPONDER_JOB_LIST) + responders += list(serialized) else humans += list(serialized) continue @@ -194,6 +197,7 @@ data["clf"] = clf data["wy"] = wy data["twe"] = twe + data["responders"] = responders data["freelancer"] = freelancer data["contractor"] = contractor data["mercenary"] = mercenary diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 88d7305bc0a3..2e14cacbb3e3 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -54,6 +54,7 @@ /mob/living/carbon/human/Destroy() SSround_recording.recorder.stop_tracking(src) remove_from_all_mob_huds() + despawn_fax_responder() assigned_equipment_preset = null GLOB.human_mob_list -= src GLOB.alive_human_list -= src diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/carbon/human/login.dm index af46cdfc4e1d..f698b541579a 100644 --- a/code/modules/mob/living/carbon/human/login.dm +++ b/code/modules/mob/living/carbon/human/login.dm @@ -4,3 +4,16 @@ species.handle_login_special(src) if(selected_ability) set_selected_ability(null) + + +/mob/living/carbon/human/proc/add_fax_responder() + if(SSticker.mode) + SSticker.mode.fax_responders += src + return TRUE + return FALSE + +/mob/living/carbon/human/proc/despawn_fax_responder() + if(SSticker.mode) + SSticker.mode.fax_responders -= src + return TRUE + return FALSE diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index e80538353210..68ead812dd8f 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -63,7 +63,8 @@ output += "

Join the UPP!

" output += "

Join the Hive!

" if(SSticker.mode.flags_round_type & MODE_PREDATOR) - if(SSticker.mode.check_predator_late_join(src,0)) output += "

Join the Hunt!

" + if(SSticker.mode.check_predator_late_join(src, FALSE)) output += "

Join the Hunt!

" + if(SSticker.mode.check_fax_responder_late_join(src, FALSE)) output += "

Respond to Faxes

" output += "

Observe

" @@ -186,13 +187,27 @@ return if(tgui_alert(src, "Are you sure you want to attempt joining as a predator?", "Confirmation", list("Yes", "No")) == "Yes") - if(SSticker.mode.check_predator_late_join(src,0)) + if(SSticker.mode.check_predator_late_join(src, FALSE)) close_spawn_windows() SSticker.mode.attempt_to_join_as_predator(src) else to_chat(src, SPAN_WARNING("You are no longer able to join as predator.")) new_player_panel() + if("late_join_faxes") + if(SSticker.current_state != GAME_STATE_PLAYING || !SSticker.mode) + to_chat(src, SPAN_WARNING("The round is either not ready, or has already finished...")) + return + + if(alert(src,"Are you sure you want to attempt joining as a Fax Responder?","Confirmation","Yes","No") == "Yes" ) + if(SSticker.mode.check_fax_responder_late_join(src, FALSE)) + close_spawn_windows() + SSticker.mode.attempt_to_join_as_fax_responder(src, TRUE) + else + to_chat(src, SPAN_WARNING("You are no longer able to join as a Fax Responder.")) + new_player_panel() + + if("manifest") ViewManifest() diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index be7549488618..1fcb0c477279 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -56,22 +56,28 @@ updateinfolinks() /obj/item/paper/update_icon() - if(icon_state == "paper_talisman" || icon_state == "paper_wy_words" || icon_state == "paper_uscm" || icon_state == "fortune" || icon_state == "paper_flag") + switch(icon_state) + if("paper_talisman", "paper_wy_words", "paper_uscm_words", "paper_flag_words", "fortune") + return + + if(!info) + icon_state = "paper" return - if(info) - if(icon_state == "paper_wy") + + switch(icon_state) + if("paper_wy") icon_state = "paper_wy_words" return - if(icon_state == "paper_uscm") + if("paper_uscm") icon_state = "paper_uscm_words" return - if(icon_state == "paper_flag") + if("paper_flag") icon_state = "paper_flag_words" item_state = "paper_flag" return - icon_state = "paper_words" - return - icon_state = "paper" + else + icon_state = "paper_words" + return /obj/item/paper/get_examine_text(mob/user) . = ..() diff --git a/colonialmarines.dme b/colonialmarines.dme index 423b66356dd5..40bfa8737d12 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -846,6 +846,7 @@ #include "code\game\jobs\job\marine\squad\tl.dm" #include "code\game\jobs\job\special\cmb.dm" #include "code\game\jobs\job\special\provost.dm" +#include "code\game\jobs\job\special\responders.dm" #include "code\game\jobs\job\special\uaac.dm" #include "code\game\jobs\job\special\uscm.dm" #include "code\game\jobs\job\special\weyland_yutani.dm" @@ -1790,6 +1791,7 @@ #include "code\modules\gear_presets\corpses.dm" #include "code\modules\gear_presets\dust_raider.dm" #include "code\modules\gear_presets\dutch.dm" +#include "code\modules\gear_presets\fax_responders.dm" #include "code\modules\gear_presets\fun.dm" #include "code\modules\gear_presets\other.dm" #include "code\modules\gear_presets\pmc.dm" diff --git a/maps/templates/lazy_templates/fax_responder_base.dmm b/maps/templates/lazy_templates/fax_responder_base.dmm new file mode 100644 index 000000000000..44b88044d63d --- /dev/null +++ b/maps/templates/lazy_templates/fax_responder_base.dmm @@ -0,0 +1,2751 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"am" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/item/folder/red{ + pixel_x = 6 + }, +/obj/item/folder/black{ + pixel_x = 12 + }, +/obj/structure/transmitter/rotary/fax_responder{ + networks_transmit = list("USCM","Colonist","UPP","Fax Responders"); + phone_id = "UPP Communications Officer"; + phone_color = "green" + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"fr" = ( +/obj/structure/machinery/cryopod/no_store, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"gu" = ( +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"id" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/computer/crew/alt{ + pixel_y = 24; + pixel_x = -12; + faction = "UPP"; + name = "UPP monitoring computer" + }, +/obj/item/tool/pen/clicky, +/obj/item/tool/pen/blue/clicky{ + pixel_y = 8 + }, +/obj/item/tool/pen/green/clicky{ + pixel_y = 8; + pixel_x = -8 + }, +/obj/item/tool/pen/red/clicky{ + pixel_x = -8 + }, +/obj/item/paper_bin/wy{ + pixel_y = 6; + pixel_x = 8 + }, +/obj/structure/machinery/computer/crew/alt{ + pixel_y = 24; + pixel_x = 8; + name = "USCM monitoring computer" + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"jh" = ( +/turf/closed/wall/r_wall/prison_unmeltable, +/area/adminlevel/ert_station/fax_response_station) +"jV" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/item/folder/red{ + pixel_x = 6 + }, +/obj/item/folder/black{ + pixel_x = 12 + }, +/obj/structure/transmitter/rotary/fax_responder{ + networks_transmit = list("USCM","Colonist","TWE","Fax Responders"); + phone_id = "TWE Communications Officer"; + phone_color = "yellow" + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"kT" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/computer/cameras/almayer{ + dir = 8; + admin_console = 1; + network = list("ARES","Almayer","Research","Containment","Containment Hidden"); + pixel_x = 16; + layer = 2.99; + name = "USS Almayer Cameras"; + pixel_y = -6; + colony_camera_mapload = 0 + }, +/obj/structure/machinery/computer/cameras/almayer{ + dir = 8; + admin_console = 1; + network = list("Overwatch"); + pixel_x = 16; + pixel_y = 8; + name = "Overwatch Cameras"; + colony_camera_mapload = 0 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"ny" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/faxmachine/cmb{ + pixel_y = 8 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"nB" = ( +/obj/structure/machinery/cm_vending/sorted/medical/wall_med{ + pixel_x = -24 + }, +/obj/structure/machinery/cm_vending/sorted/marine_food{ + pixel_y = 16; + density = 0 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"ov" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/faxmachine/uscm/command/highcom{ + pixel_y = 8 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"oA" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/faxmachine/twe/highcom{ + pixel_y = 8 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"pu" = ( +/obj/structure/machinery/door_control/brbutton{ + pixel_y = 24; + id = "Faxes" + }, +/turf/open/floor/plating, +/area/adminlevel/ert_station/fax_response_station) +"pH" = ( +/obj/structure/machinery/door/airlock/almayer/maint/reinforced/colony{ + dir = 1; + req_one_access = null + }, +/obj/structure/machinery/door/poddoor/almayer{ + unacidable = 1; + use_power = 0; + needs_power = 0; + id = "Faxes" + }, +/turf/open/floor/almayer/test_floor4, +/area/adminlevel/ert_station/fax_response_station) +"qw" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/faxmachine/press/highcom{ + pixel_y = 8 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"rS" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/item/folder/red{ + pixel_x = 6 + }, +/obj/item/folder/black{ + pixel_x = 12 + }, +/obj/structure/transmitter/rotary/fax_responder{ + networks_transmit = list("USCM","Colonist","Press","Fax Responders"); + phone_id = "Free Press Relay" + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"rV" = ( +/obj/effect/landmark/late_join/responder/uscm/provost, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"sx" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/item/folder/white{ + pixel_x = -6 + }, +/obj/item/folder/white, +/obj/item/folder/white{ + pixel_x = 6 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"sZ" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/computer/cameras/almayer{ + dir = 8; + admin_console = 1; + network = list("Overwatch"); + pixel_x = 16; + pixel_y = 8; + name = "Overwatch Cameras"; + colony_camera_mapload = 0 + }, +/obj/structure/machinery/computer/cameras/almayer{ + dir = 8; + admin_console = 1; + network = list("ARES","Almayer","Research","Containment","Containment Hidden"); + pixel_x = 16; + layer = 2.99; + name = "USS Almayer Cameras"; + pixel_y = -6; + colony_camera_mapload = 0 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"tq" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/item/folder/red{ + pixel_x = 6 + }, +/obj/item/folder/black{ + pixel_x = 12 + }, +/obj/structure/transmitter/rotary/fax_responder{ + networks_transmit = list("USCM","Colonist","Fax Responders"); + phone_id = "USCM-HC Communications Officer"; + phone_color = "blue" + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"tM" = ( +/obj/effect/landmark/late_join/responder/clf, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"uX" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/faxmachine/clf/highcom{ + pixel_y = 8 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"vc" = ( +/turf/open/floor/plating, +/area/adminlevel/ert_station/fax_response_station) +"wv" = ( +/obj/effect/landmark/late_join/responder/cmb, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"wx" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/computer/crew/alt{ + pixel_y = 24; + pixel_x = -12; + faction = "Colonial Marshal"; + name = "CMB monitoring computer" + }, +/obj/item/tool/pen/clicky, +/obj/item/tool/pen/blue/clicky{ + pixel_y = 8 + }, +/obj/item/tool/pen/green/clicky{ + pixel_y = 8; + pixel_x = -8 + }, +/obj/item/tool/pen/red/clicky{ + pixel_x = -8 + }, +/obj/item/paper_bin/wy{ + pixel_y = 6; + pixel_x = 8 + }, +/obj/structure/machinery/computer/crew/alt{ + pixel_y = 24; + pixel_x = 8; + name = "USCM monitoring computer" + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"wz" = ( +/turf/closed/wall/r_wall/bunker{ + hull = 1 + }, +/area/adminlevel/ert_station/fax_response_station) +"xb" = ( +/obj/effect/landmark/late_join/responder/wey_yu, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"xc" = ( +/turf/closed/wall/r_wall/chigusa{ + hull = 1 + }, +/area/adminlevel/ert_station/fax_response_station) +"xX" = ( +/turf/closed/wall/r_wall/unmeltable, +/area/adminlevel/ert_station/fax_response_station) +"yv" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/computer/crew/alt{ + pixel_y = 24; + pixel_x = -12; + faction = "TWE"; + name = "TWE monitoring computer" + }, +/obj/item/tool/pen/clicky, +/obj/item/tool/pen/blue/clicky{ + pixel_y = 8 + }, +/obj/item/tool/pen/green/clicky{ + pixel_y = 8; + pixel_x = -8 + }, +/obj/item/tool/pen/red/clicky{ + pixel_x = -8 + }, +/obj/item/paper_bin/wy{ + pixel_y = 6; + pixel_x = 8 + }, +/obj/structure/machinery/computer/crew/alt{ + pixel_y = 24; + pixel_x = 8; + name = "USCM monitoring computer" + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"Ba" = ( +/obj/structure/filingcabinet{ + density = 0; + pixel_y = 24; + pixel_x = 9 + }, +/obj/structure/filingcabinet{ + density = 0; + pixel_y = 24; + pixel_x = -7 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"Bp" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/item/tool/stamp/hos{ + name = "red stamp"; + pixel_y = 8 + }, +/obj/item/tool/stamp/hop{ + name = "blue stamp" + }, +/obj/item/tool/stamp/ce{ + name = "yellow stamp"; + pixel_y = -8 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"Bz" = ( +/obj/effect/landmark/late_join/responder/press, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"BC" = ( +/turf/closed/wall/r_wall/biodome/biodome_unmeltable, +/area/adminlevel/ert_station/fax_response_station) +"Du" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/item/tool/pen/clicky, +/obj/item/tool/pen/blue/clicky{ + pixel_y = 8 + }, +/obj/item/tool/pen/green/clicky{ + pixel_y = 8; + pixel_x = -8 + }, +/obj/item/tool/pen/red/clicky{ + pixel_x = -8 + }, +/obj/structure/machinery/computer/crew/alt{ + pixel_y = 24; + name = "USCM monitoring computer" + }, +/obj/item/paper_bin/uscm{ + pixel_x = 8; + pixel_y = 6 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"Dy" = ( +/turf/closed/wall/solaris/reinforced/hull, +/area/adminlevel/ert_station/fax_response_station) +"Ei" = ( +/turf/closed/wall/almayer/outer, +/area/adminlevel/ert_station/fax_response_station) +"EI" = ( +/obj/structure/filingcabinet{ + density = 0; + pixel_y = 24; + pixel_x = -7 + }, +/obj/structure/filingcabinet{ + density = 0; + pixel_y = 24; + pixel_x = 9 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"EK" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/computer/crew/alt{ + pixel_y = 24; + pixel_x = -12; + faction = "Wey-Yu"; + name = "WY monitoring computer" + }, +/obj/item/tool/pen/clicky, +/obj/item/tool/pen/blue/clicky{ + pixel_y = 8 + }, +/obj/item/tool/pen/green/clicky{ + pixel_y = 8; + pixel_x = -8 + }, +/obj/item/tool/pen/red/clicky{ + pixel_x = -8 + }, +/obj/item/paper_bin/wy{ + pixel_y = 6; + pixel_x = 8 + }, +/obj/structure/machinery/computer/crew/alt{ + pixel_y = 24; + pixel_x = 8; + name = "USCM monitoring computer" + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"FB" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/item/folder/red{ + pixel_x = 6 + }, +/obj/item/folder/black{ + pixel_x = 12 + }, +/obj/structure/transmitter/rotary/fax_responder{ + networks_transmit = list("USCM","Colonist","Wey-Yu","PMC","Fax Responders"); + phone_id = "WY Communications Executive" + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"FD" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/faxmachine/corporate/highcom{ + pixel_y = 8 + }, +/obj/structure/machinery/computer/crew/alt{ + pixel_y = 24; + faction = "PMC"; + name = "PMC monitoring computer" + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"IO" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/computer/cameras/almayer{ + dir = 8; + admin_console = 1; + network = list("Overwatch"); + pixel_x = 16; + pixel_y = 16; + name = "Overwatch Cameras"; + colony_camera_mapload = 0 + }, +/obj/structure/machinery/computer/cameras/almayer{ + dir = 8; + admin_console = 1; + network = list("WY","Containment Hidden","Colony"); + pixel_x = 16; + name = "WY Cameras"; + colony_camera_mapload = 0 + }, +/obj/structure/machinery/computer/cameras/almayer{ + dir = 8; + admin_console = 1; + network = list("ARES","Almayer","Research","Containment"); + pixel_x = 16; + layer = 2.99; + name = "USS Almayer Cameras"; + pixel_y = -16; + colony_camera_mapload = 0 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"Ml" = ( +/turf/closed/wall/shiva/prefabricated/reinforced/hull, +/area/adminlevel/ert_station/fax_response_station) +"Nb" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/item/folder/red{ + pixel_x = 6 + }, +/obj/item/folder/black{ + pixel_x = 12 + }, +/obj/structure/transmitter/rotary/fax_responder{ + networks_transmit = list("USCM","Colonist","Colonial Marshal","Fax Responders"); + phone_id = "CMB Deputy Operations Officer"; + phone_color = "green" + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"NP" = ( +/obj/structure/machinery/light, +/obj/structure/surface/table/woodentable/fancy, +/obj/item/folder/red{ + pixel_x = 6 + }, +/obj/item/folder/black{ + pixel_x = 12 + }, +/obj/structure/transmitter/rotary/fax_responder{ + networks_transmit = list("USCM","Colonist","Fax Responders"); + phone_id = "Provost Communications Officer"; + phone_color = "red" + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"OA" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"Pn" = ( +/obj/structure/window/framed/almayer/hull, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"Rh" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/computer/crew/alt{ + pixel_y = 24; + pixel_x = -12; + faction = "CLF"; + name = "CLF monitoring computer" + }, +/obj/item/tool/pen/clicky, +/obj/item/tool/pen/blue/clicky{ + pixel_y = 8 + }, +/obj/item/tool/pen/green/clicky{ + pixel_y = 8; + pixel_x = -8 + }, +/obj/item/tool/pen/red/clicky{ + pixel_x = -8 + }, +/obj/item/paper_bin/wy{ + pixel_y = 6; + pixel_x = 8 + }, +/obj/structure/machinery/computer/crew/alt{ + pixel_y = 24; + pixel_x = 8; + name = "USCM monitoring computer" + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"ST" = ( +/obj/structure/bed/chair/comfy/teal{ + dir = 4 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"UB" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/faxmachine/uscm/brig/provost{ + pixel_y = 8 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"VV" = ( +/obj/effect/landmark/late_join/responder/upp, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"Wp" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/structure/machinery/faxmachine/upp/highcom{ + pixel_y = 8 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"XW" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/item/tool/pen/clicky, +/obj/item/tool/pen/blue/clicky{ + pixel_y = 8 + }, +/obj/item/tool/pen/green/clicky{ + pixel_y = 8; + pixel_x = -8 + }, +/obj/item/tool/pen/red/clicky{ + pixel_x = -8 + }, +/obj/item/paper_bin/wy{ + pixel_y = 6; + pixel_x = 8 + }, +/obj/structure/machinery/computer/crew/alt{ + pixel_y = 24; + name = "USCM monitoring computer" + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"XZ" = ( +/obj/effect/landmark/late_join/responder/twe, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"Yv" = ( +/obj/structure/surface/table/woodentable/fancy, +/obj/item/folder/red{ + pixel_x = 6 + }, +/obj/item/folder/black{ + pixel_x = 12 + }, +/obj/structure/transmitter/rotary/fax_responder{ + networks_transmit = list("USCM","Colonist","CLF","Fax Responders"); + phone_id = "CLF Information Correspondant"; + phone_color = "orange" + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"Yy" = ( +/turf/open/space/basic, +/area/space) +"YO" = ( +/obj/effect/landmark/late_join/responder/uscm, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) +"YR" = ( +/obj/structure/machinery/cm_vending/sorted/marine_food{ + pixel_y = 16; + density = 0 + }, +/obj/structure/machinery/cm_vending/sorted/medical/wall_med{ + pixel_x = -24 + }, +/turf/open/floor/wood/ship, +/area/adminlevel/ert_station/fax_response_station) + +(1,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(2,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(3,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(4,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(5,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(6,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(7,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Ei +YR +OA +rV +fr +Ei +nB +OA +YO +fr +Ei +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(8,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +xX +Ei +EI +gu +gu +gu +Pn +EI +gu +gu +gu +Ei +xX +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(9,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +vc +pH +gu +gu +gu +gu +Pn +gu +gu +gu +gu +pH +vc +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(10,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +vc +Ei +UB +ST +gu +NP +Pn +ov +ST +gu +tq +Ei +vc +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(11,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +vc +Ei +Du +sZ +Bp +sx +Ei +Du +sZ +Bp +sx +Ei +vc +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(12,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +vc +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +Ei +vc +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(13,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +vc +vc +vc +vc +vc +vc +vc +vc +vc +vc +vc +vc +vc +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(14,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +xX +xX +xX +xX +xX +xX +vc +xX +xX +xX +xX +xX +xX +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(15,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +BC +BC +BC +BC +BC +BC +vc +wz +wz +wz +wz +wz +wz +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(16,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +BC +YR +OA +xb +fr +BC +vc +wz +YR +OA +VV +fr +wz +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(17,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +BC +EI +gu +gu +gu +BC +vc +wz +Ba +gu +gu +gu +wz +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(18,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +BC +gu +gu +gu +gu +pH +vc +pH +gu +gu +gu +gu +wz +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(19,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +BC +FD +ST +gu +FB +BC +vc +wz +Wp +ST +gu +am +wz +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(20,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +BC +EK +IO +Bp +sx +BC +vc +wz +id +kT +Bp +sx +wz +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(21,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +BC +BC +BC +BC +BC +BC +vc +wz +wz +wz +wz +wz +wz +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(22,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +xX +xX +xX +xX +xX +xX +pu +xX +xX +xX +xX +xX +xX +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(23,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +xX +xX +xX +xX +xX +xX +vc +xX +xX +xX +xX +xX +xX +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(24,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +jh +jh +jh +jh +jh +jh +vc +xc +xc +xc +xc +xc +xc +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(25,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +jh +YR +OA +tM +fr +jh +vc +xc +YR +OA +XZ +fr +xc +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(26,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +jh +Ba +gu +gu +gu +jh +vc +xc +Ba +gu +gu +gu +xc +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(27,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +jh +gu +gu +gu +gu +pH +vc +pH +gu +gu +gu +gu +xc +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(28,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +jh +uX +ST +gu +Yv +jh +vc +xc +oA +ST +gu +jV +xc +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(29,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +jh +Rh +kT +Bp +sx +jh +vc +xc +yv +kT +Bp +sx +xc +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(30,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +jh +jh +jh +jh +jh +jh +vc +xc +xc +xc +xc +xc +xc +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(31,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +xX +xX +xX +xX +xX +xX +vc +xX +xX +xX +xX +xX +xX +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(32,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +xX +xX +xX +xX +xX +xX +pu +xX +xX +xX +xX +xX +xX +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(33,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +Dy +Dy +Dy +Dy +Dy +Dy +vc +Ml +Ml +Ml +Ml +Ml +Ml +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(34,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +Dy +nB +OA +wv +fr +Dy +vc +Ml +YR +OA +Bz +fr +Ml +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(35,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +Dy +EI +gu +gu +gu +Dy +vc +Ml +Ba +gu +gu +gu +Ml +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(36,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +Dy +gu +gu +gu +gu +pH +vc +pH +gu +gu +gu +gu +Ml +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(37,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +Dy +ny +ST +gu +Nb +Dy +vc +Ml +qw +ST +gu +rS +Ml +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(38,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +Dy +wx +kT +Bp +sx +Dy +vc +Ml +XW +kT +Bp +sx +Ml +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(39,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +Dy +Dy +Dy +Dy +Dy +Dy +vc +Ml +Ml +Ml +Ml +Ml +Ml +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(40,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +xX +xX +xX +xX +xX +xX +xX +xX +xX +xX +xX +xX +xX +xX +xX +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(41,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(42,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(43,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(44,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} +(45,1,1) = {" +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +Yy +"} diff --git a/tgui/packages/tgui/interfaces/FaxMachine.jsx b/tgui/packages/tgui/interfaces/FaxMachine.jsx index e374bf4b210a..8cb881a5da00 100644 --- a/tgui/packages/tgui/interfaces/FaxMachine.jsx +++ b/tgui/packages/tgui/interfaces/FaxMachine.jsx @@ -17,7 +17,7 @@ export const FaxMachine = () => { const { idcard } = data; const body = idcard ? : ; const windowWidth = idcard ? 600 : 400; - const windowHeight = idcard ? 270 : 215; + const windowHeight = idcard ? 340 : 215; return ( @@ -27,10 +27,27 @@ export const FaxMachine = () => { }; const FaxMain = (props) => { + const { data } = useBackend(); + const { machine_id_tag, awake_responder, highcom_dept } = data; return ( <> + + The machine identification is {machine_id_tag}. + + {!!highcom_dept && ( + + A designated communications operator is + {awake_responder ? ' currently' : ' not currently'} awake. +
+ Message responses + {awake_responder ? ' are likely to be swift.' : ' may be delayed.'} +
+ )} ); }; diff --git a/tgui/packages/tgui/interfaces/Orbit/index.tsx b/tgui/packages/tgui/interfaces/Orbit/index.tsx index 75625f02ed98..2a493ef1f15b 100644 --- a/tgui/packages/tgui/interfaces/Orbit/index.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/index.tsx @@ -287,6 +287,7 @@ const ObservableContent = () => { const { data } = useBackend(); const { humans = [], + responders = [], marines = [], survivors = [], xenos = [], @@ -376,6 +377,11 @@ const ObservableContent = () => { section={marshal} title="Colonial Marshal Bureau" /> +