diff --git a/README.md b/README.md
index fced9e02c9..e02929ee4f 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
[![Build Status](https://github.com/PvE-CMSS13/PvE-CMSS13/workflows/CI%20Suite/badge.svg)](https://github.com/PvE-CMSS13/PvE-CMSS13/actions?query=workflow%3A%22CI+Suite%22)
* **Code:** https://github.com/PvE-CMSS13/PvE-CMSS13
-* **Discord:** https://discord.gg/v6P6wns5dN
+* **Discord:** https://discord.gg/pve-cmss13
This is the codebase for the PvE CM-SS13 fork of CM-SS13 flavoured fork of SpaceStation 13
diff --git a/code/__DEFINES/chemistry.dm b/code/__DEFINES/chemistry.dm
index 078ccbdc2d..b99013f8a0 100644
--- a/code/__DEFINES/chemistry.dm
+++ b/code/__DEFINES/chemistry.dm
@@ -221,6 +221,7 @@
#define PROPERTY_ANTICARCINOGENIC "anti-carcinogenic"
#define PROPERTY_UNKNOWN "unknown" //just has an OD effect
#define PROPERTY_HEMOSITIC "hemositic"
+#define PROPERTY_REVITALIZING "revitalizing"
//Property rarity
diff --git a/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm b/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm
index 6614272d33..1d7a727232 100644
--- a/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm
+++ b/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm
@@ -67,3 +67,7 @@
#define COMSIG_HUMAN_SURGERY_APPLY_MODIFIERS "human_surgery_apply_modifiers"
/// From /mob/living/carbon/human/proc/get_flags_cold_protection()
#define COMSIG_HUMAN_COLD_PROTECTION_APPLY_MODIFIERS "human_cold_protection_apply_modifiers"
+
+/// From /mob/living/carbon/human/UnarmedAttack()
+#define COMSIG_HUMAN_BEFORE_ATTACK_HAND "human_before_attack_hand"
+ #define COMPONENT_CANCEL_HUMAN_ATTACK_HAND (1<<0)
diff --git a/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm b/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm
index bab6064cfd..b9e89bf441 100644
--- a/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm
+++ b/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm
@@ -128,3 +128,7 @@
/// From /obj/item/proc/pickup() : (obj/item/picked_up)
#define COMSIG_MOB_PICKUP_ITEM "mob_pickup_item"
+
+/// From /mob/proc/say_dead(message)
+#define COMSIG_DEAD_SPEAK "comsig_dead_speak"
+ #define COMPONENT_OVERRIDE_DEAD_SPEAK (1<<0)
diff --git a/code/__DEFINES/dcs/signals/atom/signals_atom.dm b/code/__DEFINES/dcs/signals/atom/signals_atom.dm
index 7431c5593b..01e1533189 100644
--- a/code/__DEFINES/dcs/signals/atom/signals_atom.dm
+++ b/code/__DEFINES/dcs/signals/atom/signals_atom.dm
@@ -45,3 +45,23 @@
///When the transform or an atom is varedited through vv topic.
#define COMSIG_ATOM_VV_MODIFY_TRANSFORM "atom_vv_modify_transform"
+
+/// From /mob/living/carbon/human/UnarmedAttack()
+#define COMSIG_ATOM_BEFORE_HUMAN_ATTACK_HAND "atom_before_human_attack_hand"
+ #define COMPONENT_CANCEL_ATTACK_HAND (1<<0)
+
+/// From /mob/proc/click_adjacent()
+#define COMSIG_ATOM_MOB_ATTACKBY "atom_mob_attackby"
+ #define COMPONENT_CANCEL_ATTACKBY (1<<0)
+
+/// From /atom/proc/attack_hand()
+#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand"
+
+/// From /datum/component/phone/proc/picked_up_call() and /datum/component/phone/proc/post_call_phone()
+#define COMSIG_ATOM_PHONE_PICKED_UP "atom_phone_picked_up"
+/// From /datum/component/phone/proc/recall_handset()
+#define COMSIG_ATOM_PHONE_HUNG_UP "atom_phone_hung_up"
+/// From /datum/component/phone/proc/call_phone()
+#define COMSIG_ATOM_PHONE_RINGING "atom_phone_ringing"
+/// From /datum/component/phone/proc/reset_call()
+#define COMSIG_ATOM_PHONE_STOPPED_RINGING "atom_phone_stopped_ringing"
diff --git a/code/__DEFINES/dcs/signals/atom/signals_movable.dm b/code/__DEFINES/dcs/signals/atom/signals_movable.dm
index ba889d0b52..923c2cc60f 100644
--- a/code/__DEFINES/dcs/signals/atom/signals_movable.dm
+++ b/code/__DEFINES/dcs/signals/atom/signals_movable.dm
@@ -4,11 +4,15 @@
/// From /atom/movable/proc/launch_towards
#define COMSIG_MOVABLE_PRE_THROW "movable_pre_throw"
#define COMPONENT_CANCEL_THROW (1<<0)
+
///from base of atom/movable/Moved(): (/atom, dir, forced)
#define COMSIG_MOVABLE_MOVED "movable_moved"
/// From /atom/movable/Move(): (atom/NewLoc)
#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move"
#define COMPONENT_CANCEL_MOVE (1<<0)
+/// From /atom/movable/proc/forceMove(): (atom/NewLoc)
+#define COMSIG_MOVABLE_FORCEMOVED "movable_forcemove"
+
/// From /turf/open/gm/river/Entered(): (turf/open/gm/river/river, covered)
#define COMSIG_MOVABLE_ENTERED_RIVER "movable_entered_river"
@@ -29,3 +33,4 @@
#define COMSIG_MOVABLE_UPDATE_GLIDE_SIZE "movable_glide_size"
#define COMSIG_MOVABLE_TURF_ENTER "movable_turf_enter"
+
diff --git a/code/__DEFINES/dcs/signals/atom/signals_obj.dm b/code/__DEFINES/dcs/signals/atom/signals_obj.dm
index aebd0d09d0..7e4436b3cf 100644
--- a/code/__DEFINES/dcs/signals/atom/signals_obj.dm
+++ b/code/__DEFINES/dcs/signals/atom/signals_obj.dm
@@ -22,9 +22,6 @@
#define COMSIG_SENTRY_EMPTY_AMMO_ALERT "signal_sentry_empty_ammo"
#define COMSIG_SENTRY_DESTROYED_ALERT "signal_sentry_destroyed"
-/// from /obj/structure/transmitter/update_icon()
-#define COMSIG_TRANSMITTER_UPDATE_ICON "transmitter_update_icon"
-
#define COMSIG_TENT_COLLAPSING "tent_collapsing"
/// from /obj/proc/afterbuckle()
diff --git a/code/__DEFINES/dcs/signals/atom/signals_turf.dm b/code/__DEFINES/dcs/signals/atom/signals_turf.dm
index 6a0788bcf8..b59e9d60b4 100644
--- a/code/__DEFINES/dcs/signals/atom/signals_turf.dm
+++ b/code/__DEFINES/dcs/signals/atom/signals_turf.dm
@@ -15,7 +15,7 @@
/// From /turf/closed/wall/resin/attackby(): (obj/item/I, mob/M)
#define COMSIG_WALL_RESIN_ATTACKBY "wall_resin_attackby"
- #define COMPONENT_CANCEL_ATTACKBY (1<<0)
+ #define COMPONENT_CANCEL_RESIN_ATTACKBY (1<<0)
///from /turf/closed/wall/proc/place_poster
#define COMSIG_POSTER_PLACED "poster_placed"
diff --git a/code/__DEFINES/equipment.dm b/code/__DEFINES/equipment.dm
index 5f8f27a657..96c0fc3738 100644
--- a/code/__DEFINES/equipment.dm
+++ b/code/__DEFINES/equipment.dm
@@ -552,7 +552,11 @@ var/global/list/uniform_categories = list(
#define PHONE_UPP_SOLDIER "Soldier"
#define PHONE_IO "IO"
-#define PHONE_DND_FORCED 2
-#define PHONE_DND_ON 1
-#define PHONE_DND_OFF 0
-#define PHONE_DND_FORBIDDEN -1
+#define PHONE_DO_NOT_DISTURB_FORCED 2
+#define PHONE_DO_NOT_DISTURB_ON 1
+#define PHONE_DO_NOT_DISTURB_OFF 0
+#define PHONE_DO_NOT_DISTURB_FORBIDDEN -1
+
+#define PHONE_ON_BASE_UNIT_ICON_STATE "[initial(icon_state)]"
+#define PHONE_OFF_BASE_UNIT_ICON_STATE "[initial(icon_state)]_ear"
+#define PHONE_RINGING_ICON_STATE "[initial(icon_state)]_ring"
diff --git a/code/__DEFINES/mode.dm b/code/__DEFINES/mode.dm
index ea3aef5fa4..3a3a2473ec 100644
--- a/code/__DEFINES/mode.dm
+++ b/code/__DEFINES/mode.dm
@@ -58,7 +58,7 @@
#define MODE_RANDOM_HIVE (1<<12)// Makes Join-as-Xeno choose a hive to join as burrowed larva at random rather than at user's input..
#define MODE_THUNDERSTORM (1<<13)// Enables thunderstorm effects on maps that are compatible with it. (Lit exterior tiles, rain effects)
#define MODE_FACTION_CLASH (1<<14)// Disables scopes, sniper sentries, OBs, shooting corpses, dragging enemy corpses, stripping enemy corpses
-#define MODE_NO_XENO_EVOLVE (1<<15) // Stops all xenos from evolving
+#define MODE_NO_XENO_EVOLVE (1<<15) // Stops all xenos from evolving or straining
// Gamemode Toggleable Flags
#define MODE_NO_SNIPER_SENTRY (1<<0) /// Upgrade kits will no longer allow you to select long-range upgrades
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 21f3fcafd9..fe0c9e7b72 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -149,6 +149,9 @@
if(W.attack_speed && !src.contains(A)) //Not being worn or carried in the user's inventory somewhere, including internal storages.
next_move += W.attack_speed
+ if(SEND_SIGNAL(A, COMSIG_ATOM_MOB_ATTACKBY, W, src) & COMPONENT_CANCEL_ATTACKBY)
+ return
+
if(!A.attackby(W, src, mods) && A && !QDELETED(A))
// in case the attackby slept
if(!W)
diff --git a/code/_onclick/human.dm b/code/_onclick/human.dm
index cb71e27f9d..0bfba04070 100644
--- a/code/_onclick/human.dm
+++ b/code/_onclick/human.dm
@@ -80,12 +80,16 @@
to_chat(src, SPAN_NOTICE("You try to move your [temp.display_name], but cannot!"))
return
+ if(SEND_SIGNAL(A, COMSIG_ATOM_BEFORE_HUMAN_ATTACK_HAND, src, click_parameters) & COMPONENT_CANCEL_HUMAN_ATTACK_HAND)
+ return
+
A.attack_hand(src, click_parameters)
/datum/proc/handle_click(mob/living/carbon/human/user, atom/A, params) //Heres our handle click relay proc thing.
return HANDLE_CLICK_PASS_THRU
/atom/proc/attack_hand(mob/user)
+ SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user)
return
/mob/living/carbon/human/MouseDrop_T(atom/dropping, mob/user)
diff --git a/code/datums/components/phone.dm b/code/datums/components/phone.dm
new file mode 100644
index 0000000000..5d3c25e84b
--- /dev/null
+++ b/code/datums/components/phone.dm
@@ -0,0 +1,634 @@
+
+/// Holds all of our phone components
+GLOBAL_LIST_EMPTY_TYPED(phones, /datum/component/phone)
+
+/datum/component/phone
+
+ /// Our phone category which sorts us into tabs in the phone menu TGUI
+ var/phone_category = "Uncategorised"
+
+ /// Color of phone displayed in the phone menu
+ var/phone_color = "white"
+
+ /// The id of our phone which shows up when we talk
+ var/phone_id = "Telephone"
+
+ /// Our phone icon that is displayed in the phone menu TGUI
+ var/phone_icon
+
+ /// Our connected handset
+ var/obj/item/handset/phone_handset
+
+ /// What actually holds our phone, defaults to parent but may be set differently
+ var/atom/holder
+
+ /// A phone we are calling or has called us
+ var/datum/component/phone/calling_phone
+
+ /// Whether or not the phone is receiving calls or not. Varies between on/off or forcibly on/off.
+ var/do_not_disturb = PHONE_DO_NOT_DISTURB_OFF
+
+ /// The ID of our timer to cancel an attempted call and "go to voicemail"
+ var/timeout_timer_id
+
+ /// The time it takes for our timer to end to cancel an attempted call and "go to voicemail"
+ var/timeout_duration = 30 SECONDS
+
+ /// Networks that this phone can take calls from
+ var/list/networks_receive = list()
+
+ /// Networks that this phone can call
+ var/list/networks_transmit = list()
+
+ /// The looping ringing sound when the phone is called
+ var/datum/looping_sound/phone_ringing/ringing_loop
+
+ /// Whether the phone is able to be called or not
+ var/enabled = TRUE
+
+/datum/component/phone/Initialize(phone_category, phone_color, phone_id, phone_icon, do_not_disturb, list/networks_receive, list/networks_transmit, holder)
+ . = ..()
+
+ if(!istype(parent, /atom))
+ return COMPONENT_INCOMPATIBLE
+
+ if(!handle_initial_variables(arglist(args)))
+ return COMPONENT_INCOMPATIBLE
+
+ GLOB.phones += src
+
+/datum/component/phone/Destroy()
+ if(phone_handset)
+ if(!phone_handset.loc)
+ UnregisterSignal(phone_handset, COMSIG_PARENT_PREQDELETED)
+ qdel(phone_handset)
+ else
+ phone_handset.phone_component = null
+ phone_handset = null
+
+ networks_receive = null
+ networks_transmit = null
+ QDEL_NULL(ringing_loop)
+
+ GLOB.phones -= src
+ SStgui.close_uis(src)
+
+ reset_call()
+ return ..()
+
+/// Handles all of our variables usually set in Initialize(), needs to be a proc so virtual phones don't get incorrect signals or a handset
+/datum/component/phone/proc/handle_initial_variables(phone_category, phone_color, phone_id, phone_icon, do_not_disturb, list/networks_receive, list/networks_transmit, holder)
+ src.phone_category = isnull(phone_category) ? src.phone_category : phone_category
+ src.phone_color = isnull(phone_color) ? src.phone_color : phone_color
+ src.phone_id = isnull(phone_id) ? src.phone_id : phone_id
+ src.phone_icon = isnull(phone_icon) ? src.phone_icon : phone_icon
+ src.do_not_disturb = isnull(do_not_disturb) ? src.do_not_disturb : do_not_disturb
+ src.networks_receive = isnull(networks_receive) ? src.networks_receive : networks_receive.Copy()
+ src.networks_transmit = isnull(networks_transmit) ? src.networks_transmit : networks_transmit.Copy()
+ src.holder = holder ? holder : parent
+
+ phone_handset = new(null, src, src.holder)
+ RegisterSignal(phone_handset, COMSIG_PARENT_PREQDELETED, PROC_REF(override_delete))
+
+ RegisterSignal(src.holder, COMSIG_ATOM_MOB_ATTACKBY, PROC_REF(item_used_on_phone))
+ RegisterSignal(src.holder, COMSIG_ATOM_BEFORE_HUMAN_ATTACK_HAND, PROC_REF(use_phone))
+
+ if(istype(src.holder, /obj/item))
+ RegisterSignal(src.holder, COMSIG_ITEM_PICKUP, PROC_REF(holder_picked_up))
+ RegisterSignal(src.holder, COMSIG_ITEM_DROPPED, PROC_REF(holder_dropped))
+ enabled = FALSE
+
+ RegisterSignal(src.holder, COMSIG_MOVABLE_FORCEMOVED, PROC_REF(holder_forcemoved))
+
+ ringing_loop = new(src.holder)
+
+ return TRUE
+
+/// Handles bringing our handset back in case something tries to delete it
+/datum/component/phone/proc/override_delete()
+ SIGNAL_HANDLER
+ recall_handset()
+ return COMPONENT_ABORT_QDEL
+
+/// Handles any attackbys on our holder so we can hang up the phone
+/datum/component/phone/proc/item_used_on_phone(atom/phone, obj/item/attacking_item, mob/user)
+ SIGNAL_HANDLER
+
+ if(attacking_item == phone_handset)
+ recall_handset()
+ return COMPONENT_CANCEL_ATTACKBY
+
+/// When we initially interact with the phone, whether opening the menu to call someone or picking up the phone being called
+/datum/component/phone/proc/use_phone(atom/phone, mob/living/carbon/human/user, click_parameters)
+ SIGNAL_HANDLER
+
+ if(!calling_phone)
+ INVOKE_ASYNC(src, PROC_REF(tgui_interact), user)
+
+ if(enabled)
+ return COMPONENT_CANCEL_HUMAN_ATTACK_HAND
+ return
+
+ if(!phone_handset)
+ return
+
+ if(phone_handset.loc)
+ return
+
+ picked_up_call(user)
+ calling_phone.other_phone_picked_up_call()
+
+ return COMPONENT_CANCEL_HUMAN_ATTACK_HAND
+
+/// Handles what we want to do when we pick up a phone
+/datum/component/phone/proc/picked_up_call(mob/living/carbon/human/user)
+ to_chat(user, SPAN_PURPLE("[icon2html(holder, user)] Picked up a call from [calling_phone.phone_id]."))
+ playsound(get_turf(user), "rtb_handset")
+
+ user.put_in_active_hand(phone_handset)
+ SEND_SIGNAL(holder, COMSIG_ATOM_PHONE_PICKED_UP)
+ ringing_loop.stop()
+
+/// Handles what we want to do when a phone we are calling picks up
+/datum/component/phone/proc/other_phone_picked_up_call()
+ if(!calling_phone)
+ return
+
+ if(!phone_handset)
+ return
+
+ if(timeout_timer_id)
+ deltimer(timeout_timer_id)
+ timeout_timer_id = null
+
+ if(!ismob(phone_handset.loc))
+ return
+
+ var/mob/phone_user = phone_handset.loc
+ to_chat(phone_user, SPAN_PURPLE("[icon2html(calling_phone.holder, phone_user)] [calling_phone.phone_id] has picked up."))
+
+/// Handles setting a specific phone ID and enabling the phone when the holder is picked up
+/datum/component/phone/proc/holder_picked_up(obj/item/picked_up_holder, mob/user)
+ SIGNAL_HANDLER
+
+ enabled = TRUE
+
+ if(!ishuman(user))
+ phone_id = "[user]"
+ return
+
+ var/mob/living/carbon/human/human_user = user
+ if(human_user.comm_title)
+ phone_id = "[human_user.comm_title] [human_user]"
+ else if(human_user.job)
+ phone_id = "[human_user.job] [human_user]"
+ else
+ phone_id = "[human_user]"
+
+ if(human_user.assigned_squad)
+ phone_id += " ([human_user.assigned_squad.name])"
+
+/// Handles disabling the phone when the holder is dropped
+/datum/component/phone/proc/holder_dropped(obj/item/dropped_hold, mob/user)
+ SIGNAL_HANDLER
+
+ enabled = FALSE
+ phone_id = "[holder]"
+
+/// Tells our phone_handset that the holder has been forcemoved so the tether can be updated if need be
+/datum/component/phone/proc/holder_forcemoved(atom/movable/moving_atom, atom/destination)
+ SIGNAL_HANDLER
+
+ if(!phone_handset)
+ return
+
+ phone_handset.reset_tether()
+
+/// Gathers all phones that we can call from our phone, returns a list of those phones
+/datum/component/phone/proc/get_phones()
+ var/list/phone_list = list()
+
+ for(var/possible_phone in GLOB.phones)
+ var/datum/component/phone/target_phone = possible_phone
+
+ if(!target_phone.phone_available())
+ continue
+
+ var/net_link = FALSE
+ for(var/network in networks_transmit)
+ if(network in target_phone.networks_receive)
+ net_link = TRUE
+ continue
+ if(!net_link)
+ continue
+
+ var/id = target_phone.phone_id
+ var/num_id = 1
+ while(id in phone_list)
+ id = "[target_phone.phone_id] [num_id]"
+ num_id++
+
+ target_phone.phone_id = id
+ phone_list[id] = target_phone
+
+ return phone_list
+
+/// Whether or not our phone is available to be called from other phones, returns TRUE if callable, otherwise FALSE. Note: this does not account for network compatability
+/datum/component/phone/proc/phone_available()
+ if(calling_phone)
+ return FALSE
+
+ if(!phone_handset)
+ return FALSE
+
+ if(!enabled)
+ return FALSE
+
+ if(phone_handset.loc)
+ return FALSE
+
+ if(do_not_disturb == PHONE_DO_NOT_DISTURB_ON)
+ return FALSE
+
+ if(do_not_disturb == PHONE_DO_NOT_DISTURB_FORCED)
+ return FALSE
+
+ return TRUE
+
+/// Whether or not clicking on our phone will bring up the phone menu, returns TRUE if it will, otherwise FALSE
+/datum/component/phone/proc/phone_menu_usable()
+ if(calling_phone)
+ return FALSE
+
+ if(!phone_handset)
+ return FALSE
+
+ if(!enabled)
+ return FALSE
+
+ if(phone_handset.loc)
+ return
+
+ return TRUE
+
+/// Starts calling another phone, sets up connection between the phones
+/datum/component/phone/proc/call_phone(mob/user, calling_phone_id)
+ var/list/phones = get_phones()
+ phones -= phone_id
+
+ if(!length(phones) || !(calling_phone_id in phones))
+ to_chat(user, SPAN_PURPLE("[icon2html(holder, user)] No phones could be located to call!"))
+ return
+
+ calling_phone = phones[calling_phone_id]
+ if(!istype(calling_phone) || QDELETED(calling_phone))
+ calling_phone = null
+ CRASH("Qdelled/improper atom inside phones list! (istype returned: [istype(calling_phone)], QDELETED returned: [QDELETED(calling_phone)])")
+
+ if(!calling_phone.phone_available())
+ calling_phone = null
+ return
+
+ calling_phone.getting_call(src)
+
+ post_call_phone(user, calling_phone_id)
+
+/// What we do when our phone is receiving a call, called from incoming_call's call_phone()
+/datum/component/phone/proc/getting_call(datum/component/phone/incoming_call)
+ calling_phone = incoming_call
+ SEND_SIGNAL(holder, COMSIG_ATOM_PHONE_RINGING)
+ ringing_loop.start()
+
+/// What we do after our call is set up from call_phone()
+/datum/component/phone/proc/post_call_phone(mob/user, calling_phone_id)
+ to_chat(user, SPAN_PURPLE("[icon2html(holder, user)] Dialing [calling_phone_id].."))
+ timeout_timer_id = addtimer(CALLBACK(src, PROC_REF(reset_call), TRUE), timeout_duration, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE)
+ playsound(get_turf(user), "rtb_handset")
+
+ user.put_in_active_hand(phone_handset)
+ SEND_SIGNAL(holder, COMSIG_ATOM_PHONE_PICKED_UP)
+
+/// Resets this phone's connection as well as anything we are connected to's connection, calls itself on any other connections
+/datum/component/phone/proc/reset_call(timeout = FALSE, recursed = FALSE)
+ if(timeout_timer_id)
+ deltimer(timeout_timer_id)
+ timeout_timer_id = null
+
+ if(!calling_phone)
+ return
+
+ if(!recursed)
+ calling_phone.reset_call(timeout, recursed = TRUE)
+
+ SEND_SIGNAL(holder, COMSIG_ATOM_PHONE_STOPPED_RINGING)
+
+ ringing_loop?.stop()
+
+ handle_reset_call_message(timeout, recursed)
+
+ calling_phone = null
+
+/// Handles any messaging we want when a call is reset
+/datum/component/phone/proc/handle_reset_call_message(timeout = FALSE, recursed = FALSE)
+ if(!phone_handset)
+ return
+
+ if(!ismob(phone_handset.loc))
+ return
+
+ var/mob/handset_user = phone_handset.loc
+ if(recursed)
+ to_chat(handset_user, SPAN_PURPLE("[icon2html(holder, handset_user)] [calling_phone.phone_id] has hung up on you."))
+ else if(timeout)
+ to_chat(handset_user, SPAN_PURPLE("[icon2html(holder, handset_user)] Your call to [calling_phone.phone_id] has reached voicemail, you immediately disconnect the line."))
+ else
+ to_chat(handset_user, SPAN_PURPLE("[icon2html(holder, handset_user)] You have hung up on [calling_phone.phone_id]."))
+
+/// Recalls our handset back to holder and calls reset_call()
+/datum/component/phone/proc/recall_handset()
+ if(ismob(phone_handset.loc))
+ var/mob/M = phone_handset.loc
+ M.drop_held_item(phone_handset)
+ playsound(get_turf(M), "rtb_handset", 100, FALSE, 7)
+
+ phone_handset.moveToNullspace()
+ reset_call()
+
+ SEND_SIGNAL(holder, COMSIG_ATOM_PHONE_HUNG_UP)
+
+/// Handles any messages that our handset 'hears' and passes to us. Passes the message to this phone and any connected phone via handle_hear()
+/datum/component/phone/proc/handle_speak(message, datum/language/message_language, mob/speaker, direct_talking = TRUE)
+ if(message_language?.flags & SIGNLANG)
+ return
+
+ if(!calling_phone)
+ return
+
+ if(direct_talking)
+ handle_hear(message, message_language, speaker, direct_talking)
+
+ log_say("TELEPHONE: [key_name(speaker)] on Phone '[phone_id]' to '[calling_phone.phone_id]' said '[message]'")
+
+ var/comm_paygrade = ""
+
+ if (ishuman(speaker))
+ var/mob/living/carbon/human/human_speaker = speaker
+ comm_paygrade = human_speaker.get_paygrade()
+
+ for(var/mob/dead/observer/cycled_observer in GLOB.player_list)
+ if((cycled_observer.client) && (cycled_observer.client.prefs) && (cycled_observer.client.prefs.toggles_chat & CHAT_GHOSTRADIO))
+ var/ghost_message = "[comm_paygrade][speaker] (F) on '[phone_id]' to '[calling_phone.phone_id]': \"[message]\""
+ cycled_observer.show_message(ghost_message, SHOW_MESSAGE_AUDIBLE)
+
+ calling_phone.handle_hear(message, message_language, speaker, direct_talking)
+
+/// Handles any messages passed from handle_speak() and serves them to the user
+/datum/component/phone/proc/handle_hear(message, datum/language/message_language, mob/speaker, direct_talking)
+ if(!phone_handset)
+ return
+
+ if(!calling_phone)
+ return
+
+ if(!ismob(phone_handset.loc))
+ return
+
+ var/loudness = 0
+ if(phone_handset.raised)
+ loudness = 3
+
+ var/mob/hearing_mob = phone_handset.loc
+ var/name_override = calling_phone.phone_id
+
+ if(hearing_mob == speaker && direct_talking)
+ name_override = phone_id
+
+ hearing_mob.hear_radio(message, "says", message_language, part_a = "", part_b = " ", vname = name_override, speaker = speaker, command = loudness, no_paygrade = TRUE)
+
+/// Toggles do not disturb on or off, does not handle forced or unable do_not_disturb variables
+/datum/component/phone/proc/toggle_do_not_disturb(mob/user)
+ switch(do_not_disturb)
+ if(PHONE_DO_NOT_DISTURB_ON)
+ do_not_disturb = PHONE_DO_NOT_DISTURB_OFF
+ to_chat(user, SPAN_NOTICE("Do Not Disturb has been disabled. You can now receive calls."))
+ if(PHONE_DO_NOT_DISTURB_OFF)
+ do_not_disturb = PHONE_DO_NOT_DISTURB_ON
+ to_chat(user, SPAN_WARNING("Do Not Disturb has been enabled. No calls will be received."))
+ else
+ return FALSE
+ return TRUE
+
+
+
+//TGUI section
+
+/datum/component/phone/ui_status(mob/user, datum/ui_state/state)
+ . = ..()
+ if(phone_menu_usable())
+ return UI_INTERACTIVE
+
+/datum/component/phone/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+ if(.)
+ return
+
+ switch(action)
+ if("call_phone")
+ if(calling_phone)
+ return TRUE
+ call_phone(ui.user, params["phone_id"])
+ return TRUE
+
+ if("toggle_do_not_disturb")
+ toggle_do_not_disturb(ui.user)
+ return TRUE
+
+/datum/component/phone/ui_data(mob/user)
+ var/list/data = list()
+
+ data["do_not_disturb"] = do_not_disturb
+
+ return data
+
+/datum/component/phone/ui_static_data(mob/user)
+ . = list()
+
+ .["available_phones"] = get_phones() - list(phone_id)
+ var/list/phones = list()
+ for(var/datum/component/phone/cycled_phone as anything in GLOB.phones)
+ phones += list(list(
+ "phone_category" = cycled_phone.phone_category,
+ "phone_color" = cycled_phone.phone_color,
+ "phone_id" = cycled_phone.phone_id,
+ "phone_icon" = cycled_phone.phone_icon
+ ))
+
+ .["phones"] = phones
+
+/datum/component/phone/tgui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "PhoneMenu", phone_id)
+ ui.open()
+
+
+// Virtual phone section
+
+/// Virtual phone used for situations where you want to be able to use a phone without a handset
+/datum/component/phone/virtual
+ /// If it is a virtual phone we need a virtual user
+ var/client/virtual_user
+
+/datum/component/phone/virtual/Destroy()
+ virtual_user = null
+
+ return ..()
+
+/datum/component/phone/virtual/handle_initial_variables(phone_category, phone_color, phone_id, phone_icon, do_not_disturb, list/networks_receive, list/networks_transmit, holder, virtual_user)
+ src.phone_category = isnull(phone_category) ? src.phone_category : phone_category
+ src.phone_color = isnull(phone_color) ? src.phone_color : phone_color
+ src.phone_id = isnull(phone_id) ? src.phone_id : phone_id
+ src.phone_icon = isnull(phone_icon) ? src.phone_icon : phone_icon
+ src.do_not_disturb = isnull(do_not_disturb) ? src.do_not_disturb : do_not_disturb
+ src.networks_receive = isnull(networks_receive) ? src.networks_receive : networks_receive.Copy()
+ src.networks_transmit = isnull(networks_transmit) ? src.networks_transmit : networks_transmit.Copy()
+ src.holder = holder ? holder : parent
+
+ if(!virtual_user)
+ return FALSE
+ src.virtual_user = virtual_user
+
+ RegisterSignal(src.holder, COMSIG_ATOM_ATTACK_HAND, PROC_REF(use_phone))
+
+ return TRUE
+
+/datum/component/phone/virtual/use_phone(atom/phone, mob/living/carbon/human/user, click_parameters)
+ INVOKE_ASYNC(src, PROC_REF(tgui_interact), user)
+
+/datum/component/phone/virtual/picked_up_call(mob/living/carbon/human/user)
+ to_chat(user, SPAN_PURPLE("[icon2html(holder, user)] Picked up a call from [calling_phone.phone_id]."))
+
+ RegisterSignal(virtual_user.mob, COMSIG_DEAD_SPEAK, PROC_REF(handle_virtual_speak))
+
+/datum/component/phone/virtual/other_phone_picked_up_call()
+ if(!calling_phone)
+ return
+
+ if(timeout_timer_id)
+ deltimer(timeout_timer_id)
+ timeout_timer_id = null
+
+ RegisterSignal(virtual_user.mob, COMSIG_DEAD_SPEAK, PROC_REF(handle_virtual_speak))
+ to_chat(virtual_user, SPAN_PURPLE("[icon2html(calling_phone.holder, virtual_user)] [calling_phone.phone_id] has picked up."))
+
+/datum/component/phone/virtual/phone_available()
+ if(calling_phone)
+ return FALSE
+
+ if(do_not_disturb == PHONE_DO_NOT_DISTURB_ON)
+ return FALSE
+
+ if(do_not_disturb == PHONE_DO_NOT_DISTURB_FORCED)
+ return FALSE
+
+ return TRUE
+
+/datum/component/phone/virtual/reset_call(timeout = FALSE, recursed = FALSE)
+ . = ..()
+ if(!virtual_user?.mob)
+ return
+
+ UnregisterSignal(virtual_user.mob, COMSIG_DEAD_SPEAK)
+
+/datum/component/phone/virtual/handle_reset_call_message(timeout = FALSE, recursed = FALSE)
+ if(recursed)
+ to_chat(virtual_user, SPAN_PURPLE("[icon2html(holder, virtual_user)] [calling_phone.phone_id] has hung up on you."))
+ else if(timeout)
+ to_chat(virtual_user, SPAN_PURPLE("[icon2html(holder, virtual_user)] Your call to [calling_phone.phone_id] has reached voicemail, you immediately disconnect the line."))
+ else
+ to_chat(virtual_user, SPAN_PURPLE("[icon2html(holder, virtual_user)] You have hung up on [calling_phone.phone_id]."))
+
+/datum/component/phone/virtual/getting_call(datum/component/phone/incoming_call)
+ calling_phone = incoming_call
+ SEND_SIGNAL(holder, COMSIG_ATOM_PHONE_RINGING)
+ playsound_client(virtual_user, 'sound/machines/telephone/telephone_ring.ogg', vol = 50)
+ addtimer(CALLBACK(src, PROC_REF(delayed_client_sound)), (10 SECONDS))
+
+/datum/component/phone/virtual/proc/delayed_client_sound()
+ if(!calling_phone || !calling_phone.timeout_timer_id)
+ return
+
+ playsound_client(virtual_user, 'sound/machines/telephone/telephone_ring.ogg', vol = 50)
+
+/datum/component/phone/virtual/post_call_phone(mob/user, calling_phone_id)
+ to_chat(user, SPAN_PURPLE("[icon2html(holder, user)] Dialing [calling_phone_id].."))
+ timeout_timer_id = addtimer(CALLBACK(src, PROC_REF(reset_call), TRUE), timeout_duration, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE)
+
+ playsound_client(user.client, "rtb_handset")
+
+/datum/component/phone/virtual/recall_handset()
+ reset_call() // I don't think this will be possible given like... we don't have a handset but just in case
+ return
+
+/datum/component/phone/virtual/handle_hear(message, datum/language/message_language, mob/speaker, direct_talking)
+ if(!calling_phone)
+ return
+
+ var/name_override = calling_phone.phone_id
+
+ if(virtual_user == speaker)
+ name_override = phone_id
+
+ if(!virtual_user.mob)
+ return
+
+ virtual_user.mob.hear_radio(message, "says", message_language, part_a = "", part_b = " ", vname = name_override, speaker = speaker, command = 3, no_paygrade = TRUE)
+
+/// Used to fake the other side of our phone connection as a virtual user
+/datum/component/phone/virtual/proc/handle_virtual_speak(mob/speaker, message)
+ SIGNAL_HANDLER
+
+ if(!calling_phone)
+ return
+
+ handle_hear(message, null, speaker, TRUE)
+
+ log_say("TELEPHONE: [key_name(speaker)] on Phone '[phone_id]' to '[calling_phone.phone_id]' said '[message]'")
+
+ for(var/mob/dead/observer/cycled_observer in GLOB.player_list)
+ if((cycled_observer.client) && (cycled_observer.client.prefs) && (cycled_observer.client.prefs.toggles_chat & CHAT_GHOSTRADIO))
+ var/ghost_message = "Game Master on '[phone_id]' to '[calling_phone.phone_id]': \"[message]\""
+ cycled_observer.show_message(ghost_message, SHOW_MESSAGE_AUDIBLE)
+
+ calling_phone.handle_hear(message, null, speaker, TRUE)
+
+ return COMPONENT_OVERRIDE_DEAD_SPEAK
+
+// TGUI section
+
+/datum/component/phone/virtual/ui_status(mob/user, datum/ui_state/state)
+ return UI_INTERACTIVE
+
+/datum/component/phone/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+ if(.)
+ return
+
+ switch(action)
+ if("hang_up")
+ reset_call()
+ return TRUE
+ if("pick_up")
+ if(!calling_phone)
+ return
+ picked_up_call(ui.user)
+ calling_phone.other_phone_picked_up_call()
+ return TRUE
+
+/datum/component/phone/virtual/ui_data(mob/user)
+ . = ..()
+
+ .["virtual_phone"] = TRUE
+ .["being_called"] = calling_phone?.timeout_timer_id ? TRUE : FALSE
+ .["active_call"] = calling_phone ? TRUE : FALSE
+ .["calling_phone_id"] = "[calling_phone?.phone_id]"
diff --git a/code/datums/looping_sounds/item_sounds.dm b/code/datums/looping_sounds/item_sounds.dm
index a2aa2fb5b6..5382ad2f42 100644
--- a/code/datums/looping_sounds/item_sounds.dm
+++ b/code/datums/looping_sounds/item_sounds.dm
@@ -2,3 +2,11 @@
mid_sounds = list('sound/items/taperecorder/taperecorder_hiss_mid.ogg' = 1)
start_sound = list('sound/items/taperecorder/taperecorder_hiss_start.ogg' = 1)
volume = 10
+
+/datum/looping_sound/phone_ringing
+ start_sound = list('sound/machines/telephone/telephone_ring.ogg' = 1)
+ mid_sounds = list('sound/machines/telephone/telephone_ring.ogg' = 1)
+ volume = 25
+ extra_range = 14
+ mid_length = (3 SECONDS)
+ max_loops = 10
diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm
index 8e556318c7..bf96246e92 100644
--- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm
+++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm
@@ -49,7 +49,6 @@
list("Injector (Bicaridine)", 1, /obj/item/reagent_container/hypospray/autoinjector/bicaridine, null, VENDOR_ITEM_REGULAR),
list("Injector (Dexalin+)", 1, /obj/item/reagent_container/hypospray/autoinjector/dexalinp, null, VENDOR_ITEM_REGULAR),
- list("Injector (Epinephrine)", 2, /obj/item/reagent_container/hypospray/autoinjector/adrenaline, null, VENDOR_ITEM_REGULAR),
list("Injector (Inaprovaline)", 1, /obj/item/reagent_container/hypospray/autoinjector/inaprovaline, null, VENDOR_ITEM_REGULAR),
list("Injector (Kelotane)", 1, /obj/item/reagent_container/hypospray/autoinjector/kelotane, null, VENDOR_ITEM_REGULAR),
list("Injector (Oxycodone)", 2, /obj/item/reagent_container/hypospray/autoinjector/oxycodone, null, VENDOR_ITEM_REGULAR),
@@ -60,7 +59,6 @@
list("Autoinjector (C-M) (EMPTY)", 2, /obj/item/reagent_container/hypospray/autoinjector/empty/medium, null, VENDOR_ITEM_REGULAR),
list("Autoinjector (C-L) (EMPTY)", 4, /obj/item/reagent_container/hypospray/autoinjector/empty/large, null, VENDOR_ITEM_REGULAR),
- list("Emergency Defibrillator", 4, /obj/item/device/defibrillator, null, VENDOR_ITEM_MANDATORY),
list("Health Analyzer", 4, /obj/item/device/healthanalyzer, null, VENDOR_ITEM_REGULAR),
list("Surgical Line", 4, /obj/item/tool/surgery/surgical_line, null, VENDOR_ITEM_REGULAR),
list("Synth-Graft", 4, /obj/item/tool/surgery/synthgraft, null, VENDOR_ITEM_REGULAR),
@@ -348,7 +346,6 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list(
list("Autocompressor", 15, /obj/item/clothing/suit/auto_cpr, null, VENDOR_ITEM_REGULAR),
list("Backpack Firefighting Watertank", 15, /obj/item/reagent_container/glass/watertank/atmos, null, VENDOR_ITEM_REGULAR),
list("Breaching Hammer", 15, /obj/item/weapon/twohanded/breacher/synth, null, VENDOR_ITEM_REGULAR),
- list("Compact Defibrillator", 15, /obj/item/device/defibrillator/compact, null, VENDOR_ITEM_REGULAR),
list("Compact Nailgun kit", 15, /obj/effect/essentials_set/cnailgun, null, VENDOR_ITEM_REGULAR),
list("Crew Monitor", 15, /obj/item/tool/crew_monitor, null, VENDOR_ITEM_REGULAR),
list("Experimental Meson Goggles", 15, /obj/item/clothing/glasses/night/experimental_mesons, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/medical.dm b/code/game/machinery/vending/vendor_types/medical.dm
index 9844101cb1..ece0752721 100644
--- a/code/game/machinery/vending/vendor_types/medical.dm
+++ b/code/game/machinery/vending/vendor_types/medical.dm
@@ -141,7 +141,6 @@
list("AUTOINJECTORS", -1, null, null),
list("Autoinjector (Bicaridine)", round(scale * 5), /obj/item/reagent_container/hypospray/autoinjector/bicaridine, VENDOR_ITEM_REGULAR),
list("Autoinjector (Dexalin+)", round(scale * 5), /obj/item/reagent_container/hypospray/autoinjector/dexalinp, VENDOR_ITEM_REGULAR),
- list("Autoinjector (Epinephrine)", round(scale * 5), /obj/item/reagent_container/hypospray/autoinjector/adrenaline, VENDOR_ITEM_REGULAR),
list("Autoinjector (Inaprovaline)", round(scale * 5), /obj/item/reagent_container/hypospray/autoinjector/inaprovaline, VENDOR_ITEM_REGULAR),
list("Autoinjector (Kelotane)", round(scale * 5), /obj/item/reagent_container/hypospray/autoinjector/kelotane, VENDOR_ITEM_REGULAR),
list("Autoinjector (Oxycodone)", round(scale * 5), /obj/item/reagent_container/hypospray/autoinjector/oxycodone, VENDOR_ITEM_REGULAR),
@@ -174,7 +173,6 @@
list("Health Analyzer", round(scale * 5), /obj/item/device/healthanalyzer, VENDOR_ITEM_REGULAR),
list("M276 Pattern Medical Storage Rig", round(scale * 2), /obj/item/storage/belt/medical, VENDOR_ITEM_REGULAR),
list("Medical HUD Glasses", round(scale * 3), /obj/item/clothing/glasses/hud/health, VENDOR_ITEM_REGULAR),
- list("Stasis Bag", round(scale * 2), /obj/item/bodybag/cryobag, VENDOR_ITEM_REGULAR),
list("Syringe", round(scale * 7), /obj/item/reagent_container/syringe, VENDOR_ITEM_REGULAR)
)
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm
index c965b7c90e..dd3700b3d5 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm
@@ -23,7 +23,6 @@ GLOBAL_LIST_INIT(cm_vending_gear_medic, list(
list("AUTOINJECTORS", 0, null, null, null),
list("Autoinjector (Bicaridine)", 1, /obj/item/reagent_container/hypospray/autoinjector/bicaridine, null, VENDOR_ITEM_REGULAR),
list("Autoinjector (Dexalin+)", 1, /obj/item/reagent_container/hypospray/autoinjector/dexalinp, null, VENDOR_ITEM_REGULAR),
- list("Autoinjector (Epinephrine)", 2, /obj/item/reagent_container/hypospray/autoinjector/adrenaline, null, VENDOR_ITEM_REGULAR),
list("Autoinjector (Inaprovaline)", 1, /obj/item/reagent_container/hypospray/autoinjector/inaprovaline, null, VENDOR_ITEM_REGULAR),
list("Autoinjector (Kelotane)", 1, /obj/item/reagent_container/hypospray/autoinjector/kelotane, null, VENDOR_ITEM_REGULAR),
list("Autoinjector (Oxycodone)", 2, /obj/item/reagent_container/hypospray/autoinjector/oxycodone, null, VENDOR_ITEM_REGULAR),
@@ -42,7 +41,6 @@ GLOBAL_LIST_INIT(cm_vending_gear_medic, list(
list("MEDICAL UTILITIES", 0, null, null, null),
list("Health Analyzer", 4, /obj/item/device/healthanalyzer, null, VENDOR_ITEM_REGULAR),
list("Roller Bed", 4, /obj/item/roller, null, VENDOR_ITEM_REGULAR),
- list("Stasis Bag", 6, /obj/item/bodybag/cryobag, null, VENDOR_ITEM_REGULAR),
list("Pressurized Reagent Canister Pouch (EMPTY)", 3, /obj/item/storage/pouch/pressurized_reagent_canister, null, VENDOR_ITEM_REGULAR),
list("G8-A General Utility Pouch", 15, /obj/item/storage/backpack/general_belt, null, VENDOR_ITEM_REGULAR),
list("MS-11 Smart Refill Tank", 6, /obj/item/reagent_container/glass/minitank, null, VENDOR_ITEM_REGULAR),
@@ -214,4 +212,6 @@ GLOBAL_LIST_INIT(cm_vending_clothing_medic, list(
/obj/item/storage/surgical_case/regular,
/obj/item/reagent_container/blood/OMinus,
/obj/item/reagent_container/blood/OMinus,
+ /obj/item/reagent_container/hypospray/autoinjector/adrenaline_concentrated,
+ /obj/item/reagent_container/hypospray/autoinjector/adrenaline_concentrated,
)
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 ba9606d27b..4f382a8f34 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
@@ -288,6 +288,7 @@
list("Machete Scabbard (Full)", round(scale * 5), /obj/item/storage/large_holster/machete/full, VENDOR_ITEM_REGULAR),
list("Binoculars", round(scale * 1), /obj/item/device/binoculars, VENDOR_ITEM_REGULAR),
list("Spare PDT/L Battle Buddy Kit", round(scale * 3), /obj/item/storage/box/pdt_kit, VENDOR_ITEM_REGULAR),
+ list("Rail Flashlight", round(scale * 5), /obj/item/attachable/flashlight, VENDOR_ITEM_REGULAR),
)
//--------------SQUAD ATTACHMENTS VENDOR--------------
diff --git a/code/game/objects/items/reagent_containers/autoinjectors.dm b/code/game/objects/items/reagent_containers/autoinjectors.dm
index 46463e628c..248bdd7392 100644
--- a/code/game/objects/items/reagent_containers/autoinjectors.dm
+++ b/code/game/objects/items/reagent_containers/autoinjectors.dm
@@ -99,6 +99,15 @@
display_maptext = TRUE
maptext_label = "Ep"
+/obj/item/reagent_container/hypospray/autoinjector/adrenaline_concentrated
+ name = "epinephrine (concentrated) autoinjector"
+ chemname = "adrenaline_concentrated"
+ desc = "An autoinjector loaded with 3 uses of Epinephrine, better known as Adrenaline, a nerve stimulant useful in restarting the heart. In this concentrated form, it will prevent unconciousness but will cause minor suffocation."
+ amount_per_transfer_from_this = LOWM_REAGENTS_OVERDOSE * INJECTOR_PERCENTAGE_OF_OD
+ volume = (LOWM_REAGENTS_OVERDOSE * INJECTOR_PERCENTAGE_OF_OD) * INJECTOR_USES
+ display_maptext = TRUE
+ maptext_label = "Ep"
+
/obj/item/reagent_container/hypospray/autoinjector/dexalinp
name = "dexalin plus autoinjector"
chemname = "dexalinp"
diff --git a/code/game/objects/items/reagent_containers/blood_pack.dm b/code/game/objects/items/reagent_containers/blood_pack.dm
index 0879dcffdc..128c127082 100644
--- a/code/game/objects/items/reagent_containers/blood_pack.dm
+++ b/code/game/objects/items/reagent_containers/blood_pack.dm
@@ -74,14 +74,10 @@
update_beam()
return
- if(!skillcheck(user, SKILL_SURGERY, SKILL_SURGERY_NOVICE))
- to_chat(user, SPAN_WARNING("You don't know how to connect this!"))
- return
-
if(user.action_busy)
return
- if(!do_after(user, (1 SECONDS) * user.get_skill_duration_multiplier(SKILL_SURGERY), INTERRUPT_ALL, BUSY_ICON_FRIENDLY, attacked_mob, INTERRUPT_MOVED, BUSY_ICON_MEDICAL))
+ if(!do_after(user, skillcheck(user, SKILL_SURGERY, SKILL_SURGERY_NOVICE) ? (1 SECONDS) * user.get_skill_duration_multiplier(SKILL_SURGERY) : (8 SECONDS), INTERRUPT_ALL, BUSY_ICON_FRIENDLY, attacked_mob, INTERRUPT_MOVED, BUSY_ICON_MEDICAL))
to_chat(user, SPAN_WARNING("You were interrupted before you could finish!"))
return
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 3b65811b05..95c5f181cd 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -487,115 +487,41 @@
desc = "A heavy-duty chestrig used by some USCM technicians."
icon_state = "marinesatch_techi"
-GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/rto)
-
/obj/item/storage/backpack/marine/satchel/rto
name = "\improper USCM Radio Telephone Pack"
desc = "A heavy-duty pack, used for telecommunications between central command. Commonly carried by RTOs."
icon_state = "rto_backpack"
item_state = "rto_backpack"
has_gamemode_skin = FALSE
- actions_types = list(/datum/action/item_action/rto_pack/use_phone)
flags_item = ITEM_OVERRIDE_NORTHFACE
- var/obj/structure/transmitter/internal/internal_transmitter
-
var/phone_category = PHONE_MARINE
var/list/networks_receive = list(FACTION_MARINE)
var/list/networks_transmit = list(FACTION_MARINE)
- var/base_icon
-
-/datum/action/item_action/rto_pack/use_phone/New(mob/living/user, obj/item/holder)
- ..()
- name = "Use Phone"
- button.name = name
- button.overlays.Cut()
- var/image/IMG = image('icons/obj/items/misc.dmi', button, "rpb_phone")
- button.overlays += IMG
-
-/datum/action/item_action/rto_pack/use_phone/action_activate()
- for(var/obj/item/storage/backpack/marine/satchel/rto/radio_backpack in owner)
- radio_backpack.use_phone(owner)
- return
-
-/obj/item/storage/backpack/marine/satchel/rto/post_skin_selection()
- base_icon = icon_state
/obj/item/storage/backpack/marine/satchel/rto/Initialize()
. = ..()
- internal_transmitter = new(src)
- internal_transmitter.relay_obj = src
- internal_transmitter.phone_category = phone_category
- internal_transmitter.enabled = FALSE
- internal_transmitter.networks_receive = networks_receive
- internal_transmitter.networks_transmit = networks_transmit
- RegisterSignal(internal_transmitter, COMSIG_TRANSMITTER_UPDATE_ICON, PROC_REF(check_for_ringing))
- GLOB.radio_packs += src
-
-/obj/item/storage/backpack/marine/satchel/rto/proc/check_for_ringing()
- SIGNAL_HANDLER
- update_icon()
-
-/obj/item/storage/backpack/marine/satchel/rto/update_icon()
- . = ..()
- if(!internal_transmitter)
- return
-
- if(!internal_transmitter.attached_to \
- || internal_transmitter.attached_to.loc != internal_transmitter)
- icon_state = "[base_icon]_ear"
- return
-
- if(internal_transmitter.caller)
- icon_state = "[base_icon]_ring"
- else
- icon_state = base_icon
-
-/obj/item/storage/backpack/marine/satchel/rto/forceMove(atom/dest)
- . = ..()
- if(isturf(dest))
- internal_transmitter.set_tether_holder(src)
- else
- internal_transmitter.set_tether_holder(loc)
-/obj/item/storage/backpack/marine/satchel/rto/Destroy()
- GLOB.radio_packs -= src
- qdel(internal_transmitter)
- return ..()
+ AddComponent(/datum/component/phone, phone_category = phone_category, networks_receive = networks_receive, networks_transmit = networks_transmit)
+ RegisterSignal(src, COMSIG_ATOM_PHONE_PICKED_UP, PROC_REF(phone_picked_up))
+ RegisterSignal(src, COMSIG_ATOM_PHONE_HUNG_UP, PROC_REF(phone_hung_up))
+ RegisterSignal(src, COMSIG_ATOM_PHONE_RINGING, PROC_REF(phone_ringing))
+ RegisterSignal(src, COMSIG_ATOM_PHONE_STOPPED_RINGING, PROC_REF(phone_stopped_ringing))
-/obj/item/storage/backpack/marine/satchel/rto/pickup(mob/user)
- . = ..()
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(H.comm_title)
- internal_transmitter.phone_id = "[H.comm_title] [H]"
- else if(H.job)
- internal_transmitter.phone_id = "[H.job] [H]"
- else
- internal_transmitter.phone_id = "[H]"
+/obj/item/storage/backpack/marine/satchel/rto/proc/phone_picked_up()
+ icon_state = PHONE_OFF_BASE_UNIT_ICON_STATE
- if(H.assigned_squad)
- internal_transmitter.phone_id += " ([H.assigned_squad.name])"
- else
- internal_transmitter.phone_id = "[user]"
-
- internal_transmitter.enabled = TRUE
-
-/obj/item/storage/backpack/marine/satchel/rto/dropped(mob/user)
- . = ..()
- internal_transmitter.phone_id = "[src]"
- internal_transmitter.enabled = FALSE
+/obj/item/storage/backpack/marine/satchel/rto/proc/phone_hung_up()
+ icon_state = PHONE_ON_BASE_UNIT_ICON_STATE
-/obj/item/storage/backpack/marine/satchel/rto/proc/use_phone(mob/user)
- internal_transmitter.attack_hand(user)
+/obj/item/storage/backpack/marine/satchel/rto/proc/phone_ringing()
+ icon_state = PHONE_RINGING_ICON_STATE
-
-/obj/item/storage/backpack/marine/satchel/rto/attackby(obj/item/W, mob/user)
- if(internal_transmitter && internal_transmitter.attached_to == W)
- internal_transmitter.attackby(W, user)
- else
- . = ..()
+/obj/item/storage/backpack/marine/satchel/rto/proc/phone_stopped_ringing()
+ if(icon_state == PHONE_OFF_BASE_UNIT_ICON_STATE)
+ return
+ icon_state = PHONE_ON_BASE_UNIT_ICON_STATE
/obj/item/storage/backpack/marine/satchel/rto/upp_net
name = "\improper UPP Radio Telephone Pack"
@@ -606,7 +532,6 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r
name = "\improper USCM Small Radio Telephone Pack"
max_storage_space = 10
-
/obj/item/storage/backpack/marine/satchel/rto/small/upp_net
name = "\improper UPP Radio Telephone Pack"
networks_receive = list(FACTION_UPP)
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 71edc21e29..d2451ff29a 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -245,7 +245,6 @@
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/reagent_container/hypospray/autoinjector/adrenaline(src)
new /obj/item/reagent_container/hypospray/autoinjector/dexalinp(src)
new /obj/item/reagent_container/hypospray/autoinjector/oxycodone(src)
new /obj/item/storage/pill_bottle/bicaridine(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
index d6b4a35b04..b63936ef88 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
@@ -4,15 +4,6 @@
req_access = list(ACCESS_CIVILIAN_PUBLIC)
var/registered_name = null
-/obj/structure/closet/secure_closet/personal/Initialize()
- . = ..()
- if(prob(50))
- new /obj/item/storage/backpack(src)
- else
- new /obj/item/storage/backpack/satchel/norm(src)
- new /obj/item/device/radio/headset( src )
-
-
/obj/structure/closet/secure_closet/personal/patient
name = "patient's closet"
@@ -44,12 +35,6 @@
else
icon_state = icon_opened
-/obj/structure/closet/secure_closet/personal/cabinet/Initialize()
- . = ..()
- contents = list()
- new /obj/item/storage/backpack/satchel( src )
- new /obj/item/device/radio/headset( src )
-
/obj/structure/closet/secure_closet/personal/attackby(obj/item/W as obj, mob/user as mob)
if (src.opened)
return ..()
diff --git a/code/game/turfs/walls/wall_types.dm b/code/game/turfs/walls/wall_types.dm
index 22979858ce..d968b8d72f 100644
--- a/code/game/turfs/walls/wall_types.dm
+++ b/code/game/turfs/walls/wall_types.dm
@@ -1219,7 +1219,7 @@ INITIALIZE_IMMEDIATE(/turf/closed/wall/indestructible/splashscreen)
to_chat(user, SPAN_WARNING("You scrape ineffectively at \the [src]."))
/turf/closed/wall/resin/attackby(obj/item/W, mob/living/user)
- if(SEND_SIGNAL(src, COMSIG_WALL_RESIN_ATTACKBY, W, user) & COMPONENT_CANCEL_ATTACKBY)
+ if(SEND_SIGNAL(src, COMSIG_WALL_RESIN_ATTACKBY, W, user) & COMPONENT_CANCEL_RESIN_ATTACKBY)
return
if(!(W.flags_item & NOBLUDGEON))
diff --git a/code/modules/admin/game_master/game_master.dm b/code/modules/admin/game_master/game_master.dm
index 45f3750ff3..8da810d49a 100644
--- a/code/modules/admin/game_master/game_master.dm
+++ b/code/modules/admin/game_master/game_master.dm
@@ -75,23 +75,33 @@ GLOBAL_VAR_INIT(radio_communication_clarity, 100)
/// End Objective Stuff
+
+ /// Communication stuff
+
+ var/atom/movable/game_master_phone
+
+ /// End Communication stuff
+
/// Holds what type of click intercept we are using
var/current_click_intercept_action
/datum/game_master/New(client/using_client)
. = ..()
- if(using_client.mob)
- tgui_interact(using_client.mob)
+ tgui_interact(using_client.mob)
current_submenus = list()
+ game_master_phone = new(null)
+ game_master_phone.AddComponent(/datum/component/phone/virtual, "Game Master", "white", "Company Command", null, PHONE_DO_NOT_DISTURB_ON, list(FACTION_MARINE, FACTION_COLONIST, FACTION_WY), list(FACTION_MARINE, FACTION_COLONIST, FACTION_WY), null, using_client)
+
using_client.click_intercept = src
/datum/game_master/Destroy(force, ...)
. = ..()
submenu_types = null
current_submenus = null
+ QDEL_NULL(game_master_phone)
/datum/game_master/ui_data(mob/user)
. = ..()
@@ -154,6 +164,15 @@ GLOBAL_VAR_INIT(radio_communication_clarity, 100)
xeno_spawn_count = clamp(new_number, 1, 10)
return
+ if("delete_all_xenos")
+ if(tgui_alert(ui.user, "Do you want to delete all xenos?", "Confirmation", list("Yes", "No")) != "Yes")
+ return
+
+ for(var/mob/living/carbon/xenomorph/cycled_xeno in GLOB.alive_mob_list)
+ qdel(cycled_xeno)
+
+ return
+
//Objective Section
if("toggle_click_objective")
if(objective_click_intercept)
@@ -166,6 +185,9 @@ GLOBAL_VAR_INIT(radio_communication_clarity, 100)
return
//Communication Section
+ if("use_game_master_phone")
+ game_master_phone.attack_hand(ui.user)
+
if("set_communication_clarity")
var/new_clarity = text2num(params["clarity"])
if(!isnum(new_clarity))
@@ -201,6 +223,11 @@ GLOBAL_VAR_INIT(radio_communication_clarity, 100)
switch(current_click_intercept_action)
if(SPAWN_CLICK_INTERCEPT_ACTION)
+ if(LAZYACCESS(modifiers, MIDDLE_CLICK))
+ if(isxeno(object))
+ qdel(object)
+ return
+
var/spawning_xeno_type = RoleAuthority.get_caste_by_text(selected_xeno)
if(!spawning_xeno_type)
diff --git a/code/modules/cm_aliens/XenoStructures.dm b/code/modules/cm_aliens/XenoStructures.dm
index 73ced80994..b1fe57d55d 100644
--- a/code/modules/cm_aliens/XenoStructures.dm
+++ b/code/modules/cm_aliens/XenoStructures.dm
@@ -752,7 +752,7 @@
/obj/effect/alien/resin/resin_pillar/proc/handle_attackby(turf/T, obj/item/I, mob/M)
SIGNAL_HANDLER
attackby(I, M)
- return COMPONENT_CANCEL_ATTACKBY
+ return COMPONENT_CANCEL_RESIN_ATTACKBY
/obj/effect/alien/resin/resin_pillar/proc/handle_hitby(turf/T, atom/movable/AM)
SIGNAL_HANDLER
diff --git a/code/modules/cm_phone/handset.dm b/code/modules/cm_phone/handset.dm
new file mode 100644
index 0000000000..66ecdeb0d0
--- /dev/null
+++ b/code/modules/cm_phone/handset.dm
@@ -0,0 +1,179 @@
+
+#define HANDSET_RANGE 7
+
+/obj/item/handset
+ name = "telephone"
+ icon = 'icons/obj/items/misc.dmi'
+ icon_state = "rpb_phone"
+
+ w_class = SIZE_LARGE
+
+ flags_atom = FPRINT|USES_HEARING
+
+ var/datum/component/phone/phone_component
+
+ var/atom/holder
+
+ var/datum/effects/tethering/tether_effect
+
+ var/raised = FALSE
+ var/zlevel_transfer = FALSE
+ var/zlevel_transfer_timer = TIMER_ID_NULL
+ var/zlevel_transfer_timeout = 5 SECONDS
+
+/obj/item/handset/Initialize(mapload, phone_component, holder)
+ . = ..()
+
+ src.phone_component = phone_component
+ src.holder = holder
+ attach_to(src.holder)
+
+/obj/item/handset/Destroy()
+ phone_component = null
+ holder = null
+ remove_attached()
+ return ..()
+
+/obj/item/handset/hear_talk(mob/living/talker, message, verb="says", datum/language/message_language, italics = 0)
+ . = ..()
+
+ if(talker == loc)
+ phone_component.handle_speak(message, message_language, talker, direct_talking = TRUE)
+ return
+
+ var/distance = get_dist(src, talker)
+
+ if(distance > 1)
+ return
+
+ message = stars(message, (100 - (distance * 40 + rand(-15, 15))))
+
+ phone_component.handle_speak(message, message_language, talker, direct_talking = FALSE)
+
+/obj/item/handset/proc/attach_to(atom/to_attach)
+ if(!istype(to_attach))
+ return
+
+ remove_attached()
+
+ holder = to_attach
+
+/obj/item/handset/proc/remove_attached()
+ holder = null
+ reset_tether()
+
+/obj/item/handset/proc/reset_tether()
+ SIGNAL_HANDLER
+ if (tether_effect)
+ UnregisterSignal(tether_effect, COMSIG_PARENT_QDELETING)
+ if(!QDESTROYING(tether_effect))
+ qdel(tether_effect)
+ tether_effect = null
+ if(!do_zlevel_check())
+ on_beam_removed()
+
+/obj/item/handset/attack_hand(mob/user)
+ if(holder && get_dist(user, holder) > HANDSET_RANGE)
+ return FALSE
+ return ..()
+
+/obj/item/handset/proc/on_beam_removed()
+ if(!holder)
+ return
+
+ if(!loc)
+ return
+
+ if(get_dist(holder, src) > HANDSET_RANGE)
+ phone_component.recall_handset()
+
+ var/atom/tether_to = get_atom_on_turf(src)
+
+ var/atom/tether_from = get_atom_on_turf(holder)
+
+ if(tether_from == tether_to)
+ return
+
+ var/list/tether_effects = apply_tether(tether_from, tether_to, range = HANDSET_RANGE, icon = "wire", always_face = FALSE)
+ tether_effect = tether_effects["tetherer_tether"]
+ RegisterSignal(tether_effect, COMSIG_PARENT_QDELETING, PROC_REF(reset_tether))
+
+/obj/item/handset/attack_self(mob/user)
+ ..()
+
+ if(raised)
+ set_raised(FALSE, user)
+ to_chat(user, SPAN_NOTICE("You lower [src]."))
+ else
+ set_raised(TRUE, user)
+ to_chat(user, SPAN_NOTICE("You raise [src] to your ear."))
+
+/obj/item/handset/proc/set_raised(to_raise, mob/living/carbon/human/user)
+ if(!istype(user))
+ return
+
+ if(!to_raise)
+ raised = FALSE
+ item_state = "rpb_phone"
+ else
+ raised = TRUE
+ item_state = "rpb_phone_ear"
+
+ user.update_inv_r_hand()
+ user.update_inv_l_hand()
+
+/obj/item/handset/dropped(mob/user)
+ . = ..()
+ set_raised(FALSE, user)
+ reset_tether()
+
+/obj/item/handset/on_enter_storage(obj/item/storage/S)
+ . = ..()
+ if(phone_component)
+ phone_component.recall_handset()
+
+/obj/item/handset/forceMove(atom/dest)
+ . = ..()
+ if(.)
+ reset_tether()
+
+/obj/item/handset/moveToNullspace()
+ . = ..()
+ if(.)
+ reset_tether()
+
+/obj/item/handset/proc/do_zlevel_check()
+ if(!holder || !loc?.z || !holder.z)
+ return FALSE
+
+ if(zlevel_transfer)
+ if(loc.z == holder.z)
+ zlevel_transfer = FALSE
+ if(zlevel_transfer_timer)
+ deltimer(zlevel_transfer_timer)
+ UnregisterSignal(holder, COMSIG_MOVABLE_MOVED)
+ return FALSE
+ return TRUE
+
+ if(holder && loc.z != holder.z)
+ zlevel_transfer = TRUE
+ zlevel_transfer_timer = addtimer(CALLBACK(src, PROC_REF(try_doing_tether)), zlevel_transfer_timeout, TIMER_UNIQUE|TIMER_STOPPABLE)
+ RegisterSignal(holder, COMSIG_MOVABLE_MOVED, PROC_REF(transmitter_move_handler))
+ return TRUE
+ return FALSE
+
+/obj/item/handset/proc/transmitter_move_handler(datum/source)
+ SIGNAL_HANDLER
+ zlevel_transfer = FALSE
+ if(zlevel_transfer_timer)
+ deltimer(zlevel_transfer_timer)
+ UnregisterSignal(holder, COMSIG_MOVABLE_MOVED)
+ reset_tether()
+
+/obj/item/handset/proc/try_doing_tether()
+ zlevel_transfer_timer = TIMER_ID_NULL
+ zlevel_transfer = FALSE
+ UnregisterSignal(holder, COMSIG_MOVABLE_MOVED)
+ reset_tether()
+
+#undef HANDSET_RANGE
diff --git a/code/modules/cm_phone/internal_phone.dm b/code/modules/cm_phone/internal_phone.dm
deleted file mode 100644
index 96530503aa..0000000000
--- a/code/modules/cm_phone/internal_phone.dm
+++ /dev/null
@@ -1,15 +0,0 @@
-/obj/structure/transmitter/internal
- name = "\improper internal telephone receiver"
-
- phone_type = /obj/item/phone
-
- var/atom/relay_obj
-
-/obj/structure/transmitter/internal/ui_host(mob/user, datum/tgui/ui)
- if(!relay_obj)
- return ..()
- return relay_obj
-
-/obj/structure/transmitter/internal/Destroy()
- relay_obj = null
- return ..()
diff --git a/code/modules/cm_phone/phone.dm b/code/modules/cm_phone/phone.dm
deleted file mode 100644
index fd9c8aa02d..0000000000
--- a/code/modules/cm_phone/phone.dm
+++ /dev/null
@@ -1,623 +0,0 @@
-GLOBAL_LIST_EMPTY_TYPED(transmitters, /obj/structure/transmitter)
-
-/obj/structure/transmitter
- name = "telephone receiver"
- icon = 'icons/obj/structures/structures.dmi'
- icon_state = "wall_phone"
- desc = "It is a wall mounted telephone. The fine text reads: To log your details with the mainframe please insert your keycard into the slot below. Unfortunately the slot is jammed. You can still use the phone, however."
-
- var/phone_category = "Uncategorised"
- var/phone_color = "white"
- var/phone_id = "Telephone"
- var/phone_icon
-
- var/obj/item/phone/attached_to
- var/atom/tether_holder
-
- var/obj/structure/transmitter/calling
- var/obj/structure/transmitter/caller
-
- var/next_ring = 0
-
- var/phone_type = /obj/item/phone
-
- var/range = 7
-
- var/enabled = TRUE
- /// Whether or not the phone is receiving calls or not. Varies between on/off or forcibly on/off.
- var/do_not_disturb = PHONE_DND_OFF
-
- var/base_icon_state
-
- var/timeout_timer_id
- var/timeout_duration = 30 SECONDS
-
- var/list/networks_receive = list(FACTION_MARINE)
- var/list/networks_transmit = list(FACTION_MARINE)
-
-/obj/structure/transmitter/hidden
- do_not_disturb = PHONE_DND_FORCED
-
-/obj/structure/transmitter/Initialize(mapload, ...)
- . = ..()
- base_icon_state = icon_state
-
- attached_to = new phone_type(src)
- RegisterSignal(attached_to, COMSIG_PARENT_PREQDELETED, PROC_REF(override_delete))
- update_icon()
-
- if(!get_turf(src))
- return
-
- GLOB.transmitters += src
-
-/obj/structure/transmitter/update_icon()
- . = ..()
- SEND_SIGNAL(src, COMSIG_TRANSMITTER_UPDATE_ICON)
- if(attached_to.loc != src)
- icon_state = "[base_icon_state]_ear"
- return
-
- if(caller)
- icon_state = "[base_icon_state]_ring"
- else
- icon_state = base_icon_state
-
-/obj/structure/transmitter/proc/override_delete()
- SIGNAL_HANDLER
- recall_phone()
- return COMPONENT_ABORT_QDEL
-
-
-#define TRANSMITTER_UNAVAILABLE(T) (\
- T.get_calling_phone() \
- || !T.attached_to \
- || T.attached_to.loc != T \
- || !T.enabled\
-)
-
-/obj/structure/transmitter/proc/get_transmitters()
- var/list/phone_list = list()
-
- for(var/possible_phone in GLOB.transmitters)
- var/obj/structure/transmitter/target_phone = possible_phone
- var/current_dnd = FALSE
- switch(target_phone.do_not_disturb)
- if(PHONE_DND_ON, PHONE_DND_FORCED)
- current_dnd = TRUE
- if(TRANSMITTER_UNAVAILABLE(target_phone) || current_dnd) // Phone not available
- continue
- var/net_link = FALSE
- for(var/network in networks_transmit)
- if(network in target_phone.networks_receive)
- net_link = TRUE
- continue
- if(!net_link)
- continue
-
- var/id = target_phone.phone_id
- var/num_id = 1
- while(id in phone_list)
- id = "[target_phone.phone_id] [num_id]"
- num_id++
-
- target_phone.phone_id = id
- phone_list[id] = target_phone
-
- return phone_list
-
-/obj/structure/transmitter/ui_status(mob/user, datum/ui_state/state)
- . = ..()
- if(TRANSMITTER_UNAVAILABLE(src))
- return UI_CLOSE
-
-/obj/structure/transmitter/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
- . = ..()
- if(.)
- return
-
- if(TRANSMITTER_UNAVAILABLE(src))
- return
-
- if(!ishuman(usr))
- return
-
- var/mob/living/carbon/human/user = usr
-
- switch(action)
- if("call_phone")
- call_phone(user, params["phone_id"])
- . = TRUE
- SStgui.close_uis(src)
- if("toggle_dnd")
- toggle_dnd(user)
-
- update_icon()
-
-/obj/structure/transmitter/ui_data(mob/user)
- var/list/data = list()
-
- data["availability"] = do_not_disturb
-
- return data
-
-/obj/structure/transmitter/ui_static_data(mob/user)
- . = list()
-
- .["available_transmitters"] = get_transmitters() - list(phone_id)
- var/list/transmitters = list()
- for(var/i in GLOB.transmitters)
- var/obj/structure/transmitter/T = i
- transmitters += list(list(
- "phone_category" = T.phone_category,
- "phone_color" = T.phone_color,
- "phone_id" = T.phone_id,
- "phone_icon" = T.phone_icon
- ))
-
- .["transmitters"] = transmitters
-
-/obj/structure/transmitter/proc/call_phone(mob/living/carbon/human/user, calling_phone_id)
- var/list/transmitters = get_transmitters()
- transmitters -= phone_id
-
- if(!length(transmitters) || !(calling_phone_id in transmitters))
- to_chat(user, SPAN_PURPLE("[icon2html(src, user)] No transmitters could be located to call!"))
- return
-
- var/obj/structure/transmitter/T = transmitters[calling_phone_id]
- if(!istype(T) || QDELETED(T))
- transmitters -= T
- CRASH("Qdelled/improper atom inside transmitters list! (istype returned: [istype(T)], QDELETED returned: [QDELETED(T)])")
-
- if(TRANSMITTER_UNAVAILABLE(T))
- return
-
- calling = T
- T.caller = src
- T.update_icon()
-
- to_chat(user, SPAN_PURPLE("[icon2html(src, user)] Dialing [calling_phone_id].."))
- playsound(get_turf(user), "rtb_handset")
- timeout_timer_id = addtimer(CALLBACK(src, PROC_REF(reset_call), TRUE), timeout_duration, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE)
-
- START_PROCESSING(SSobj, src)
- START_PROCESSING(SSobj, T)
-
- user.put_in_hands(attached_to)
-
-/obj/structure/transmitter/proc/toggle_dnd(mob/living/carbon/human/user)
- switch(do_not_disturb)
- if(PHONE_DND_ON)
- do_not_disturb = PHONE_DND_OFF
- to_chat(user, SPAN_NOTICE("Do Not Disturb has been disabled. You can now receive calls."))
- if(PHONE_DND_OFF)
- do_not_disturb = PHONE_DND_ON
- to_chat(user, SPAN_WARNING("Do Not Disturb has been enabled. No calls will be received."))
- else
- return FALSE
- return TRUE
-
-/obj/structure/transmitter/attack_hand(mob/user)
- . = ..()
-
- if(!attached_to || attached_to.loc != src)
- return
-
- if(!ishuman(user))
- return
-
- if(!enabled)
- return
-
- if(!get_calling_phone())
- tgui_interact(user)
- return
-
- var/obj/structure/transmitter/T = get_calling_phone()
-
- if(T.attached_to && ismob(T.attached_to.loc))
- var/mob/M = T.attached_to.loc
- to_chat(M, SPAN_PURPLE("[icon2html(src, M)] [phone_id] has picked up."))
- if(T.timeout_timer_id)
- deltimer(T.timeout_timer_id)
- T.timeout_timer_id = null
-
- to_chat(user, SPAN_PURPLE("[icon2html(src, user)] Picked up a call from [T.phone_id]."))
- playsound(get_turf(user), "rtb_handset")
-
- user.put_in_active_hand(attached_to)
- update_icon()
-
-
-#undef TRANSMITTER_UNAVAILABLE
-
-/obj/structure/transmitter/tgui_interact(mob/user, datum/tgui/ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "PhoneMenu", phone_id)
- ui.open()
-
-/obj/structure/transmitter/proc/set_tether_holder(atom/A)
- tether_holder = A
-
- if(attached_to)
- attached_to.reset_tether()
-
-/obj/structure/transmitter/proc/reset_call(timeout = FALSE)
- var/obj/structure/transmitter/T = get_calling_phone()
- if(T)
- if(T.attached_to && ismob(T.attached_to.loc))
- var/mob/M = T.attached_to.loc
- to_chat(M, SPAN_PURPLE("[icon2html(src, M)] [phone_id] has hung up on you."))
-
- if(attached_to && ismob(attached_to.loc))
- var/mob/M = attached_to.loc
- if(timeout)
- to_chat(M, SPAN_PURPLE("[icon2html(src, M)] Your call to [T.phone_id] has reached voicemail, you immediately disconnect the line."))
- else
- to_chat(M, SPAN_PURPLE("[icon2html(src, M)] You have hung up on [T.phone_id]."))
-
- if(calling)
- calling.caller = null
- calling = null
-
- if(caller)
- caller.calling = null
- caller = null
-
- if(timeout_timer_id)
- deltimer(timeout_timer_id)
- timeout_timer_id = null
-
- if(T)
- if(T.timeout_timer_id)
- deltimer(T.timeout_timer_id)
- T.timeout_timer_id = null
-
- T.update_icon()
- STOP_PROCESSING(SSobj, T)
-
- STOP_PROCESSING(SSobj, src)
-
-/obj/structure/transmitter/process()
- if(caller)
- if(!attached_to)
- STOP_PROCESSING(SSobj, src)
- return
-
- if(attached_to.loc == src)
- if(next_ring < world.time)
- playsound(loc, 'sound/machines/telephone/telephone_ring.ogg', 75)
- visible_message(SPAN_WARNING("[src] rings vigorously!"))
- next_ring = world.time + 3 SECONDS
-
- else if(calling)
- var/obj/structure/transmitter/T = get_calling_phone()
- if(!T)
- STOP_PROCESSING(SSobj, src)
- return
-
- var/obj/item/phone/P = T.attached_to
-
- if(P && attached_to.loc == src && P.loc == T && next_ring < world.time)
- playsound(get_turf(attached_to), 'sound/machines/telephone/telephone_ring.ogg', 20, FALSE, 14)
- visible_message(SPAN_WARNING("[src] rings vigorously!"))
- next_ring = world.time + 3 SECONDS
-
- else
- STOP_PROCESSING(SSobj, src)
- return
-
-
-/obj/structure/transmitter/proc/recall_phone()
- if(ismob(attached_to.loc))
- var/mob/M = attached_to.loc
- M.drop_held_item(attached_to)
- playsound(get_turf(M), "rtb_handset", 100, FALSE, 7)
-
- attached_to.forceMove(src)
- reset_call()
-
- update_icon()
-
-/obj/structure/transmitter/proc/get_calling_phone()
- if(calling)
- return calling
- else if(caller)
- return caller
-
- return
-
-/obj/structure/transmitter/proc/handle_speak(message, datum/language/L, mob/speaking)
- if(L.flags & SIGNLANG) return
-
- var/obj/structure/transmitter/T = get_calling_phone()
- if(!istype(T))
- return
-
- var/obj/item/phone/P = T.attached_to
-
- if(!P || !attached_to)
- return
-
- 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)
- recall_phone()
- else
- . = ..()
-
-/obj/structure/transmitter/Destroy()
- if(attached_to)
- if(attached_to.loc == src)
- UnregisterSignal(attached_to, COMSIG_PARENT_PREQDELETED)
- qdel(attached_to)
- else
- attached_to.attached_to = null
- attached_to = null
-
- GLOB.transmitters -= src
- SStgui.close_uis(src)
-
- reset_call()
- return ..()
-
-/obj/item/phone
- name = "telephone"
- icon = 'icons/obj/items/misc.dmi'
- icon_state = "rpb_phone"
-
- w_class = SIZE_LARGE
-
- var/obj/structure/transmitter/attached_to
- var/datum/effects/tethering/tether_effect
-
- var/raised = FALSE
- var/zlevel_transfer = FALSE
- var/zlevel_transfer_timer = TIMER_ID_NULL
- var/zlevel_transfer_timeout = 5 SECONDS
-
-/obj/item/phone/Initialize(mapload)
- . = ..()
- if(istype(loc, /obj/structure/transmitter))
- attach_to(loc)
-
-/obj/item/phone/Destroy()
- remove_attached()
- return ..()
-
-/obj/item/phone/proc/handle_speak(mob/speaking, message, datum/language/L)
- SIGNAL_HANDLER
-
- if(!attached_to || loc == attached_to)
- UnregisterSignal(speaking, COMSIG_LIVING_SPEAK)
- return
-
- attached_to.handle_speak(message, L, speaking)
-
-/obj/item/phone/proc/handle_hear(message, datum/language/L, mob/speaking)
- if(!attached_to)
- return
-
- var/obj/structure/transmitter/T = attached_to.get_calling_phone()
-
- if(!T)
- return
-
- if(!ismob(loc))
- return
-
- var/loudness = 0
- if(raised)
- loudness = 3
-
- var/mob/M = loc
- var/vname = T.phone_id
-
- if(M == speaking)
- vname = attached_to.phone_id
-
- M.hear_radio(
- message, "says", L, part_a = "",
- part_b = " ", vname = vname,
- speaker = speaking, command = loudness, no_paygrade = TRUE)
-
-/obj/item/phone/proc/attach_to(obj/structure/transmitter/to_attach)
- if(!istype(to_attach))
- return
-
- remove_attached()
-
- attached_to = to_attach
-
-
-/obj/item/phone/proc/remove_attached()
- attached_to = null
- reset_tether()
-
-/obj/item/phone/proc/reset_tether()
- SIGNAL_HANDLER
- if (tether_effect)
- UnregisterSignal(tether_effect, COMSIG_PARENT_QDELETING)
- if(!QDESTROYING(tether_effect))
- qdel(tether_effect)
- tether_effect = null
- if(!do_zlevel_check())
- on_beam_removed()
-
-/obj/item/phone/attack_hand(mob/user)
- if(attached_to && get_dist(user, attached_to) > attached_to.range)
- return FALSE
- return ..()
-
-
-/obj/item/phone/proc/on_beam_removed()
- if(!attached_to)
- return
-
- if(loc == attached_to)
- return
-
- if(get_dist(attached_to, src) > attached_to.range)
- attached_to.recall_phone()
-
- var/atom/tether_to = src
-
- if(loc != get_turf(src))
- tether_to = loc
- if(tether_to.loc != get_turf(tether_to))
- attached_to.recall_phone()
- return
-
- var/atom/tether_from = attached_to
-
- if(attached_to.tether_holder)
- tether_from = attached_to.tether_holder
-
- if(tether_from == tether_to)
- return
-
- var/list/tether_effects = apply_tether(tether_from, tether_to, range = attached_to.range, icon = "wire", always_face = FALSE)
- tether_effect = tether_effects["tetherer_tether"]
- RegisterSignal(tether_effect, COMSIG_PARENT_QDELETING, PROC_REF(reset_tether))
-
-/obj/item/phone/attack_self(mob/user)
- ..()
- if(raised)
- set_raised(FALSE, user)
- to_chat(user, SPAN_NOTICE("You lower [src]."))
- else
- set_raised(TRUE, user)
- to_chat(user, SPAN_NOTICE("You raise [src] to your ear."))
-
-
-/obj/item/phone/proc/set_raised(to_raise, mob/living/carbon/human/H)
- if(!istype(H))
- return
-
- if(!to_raise)
- raised = FALSE
- item_state = "rpb_phone"
-
- var/obj/item/device/radio/R = H.get_type_in_ears(/obj/item/device/radio)
- R?.on = TRUE
- else
- raised = TRUE
- item_state = "rpb_phone_ear"
-
- var/obj/item/device/radio/R = H.get_type_in_ears(/obj/item/device/radio)
- R?.on = FALSE
-
- H.update_inv_r_hand()
- H.update_inv_l_hand()
-
-/obj/item/phone/dropped(mob/user)
- . = ..()
- UnregisterSignal(user, COMSIG_LIVING_SPEAK)
-
- set_raised(FALSE, user)
-
-/obj/item/phone/on_enter_storage(obj/item/storage/S)
- . = ..()
- if(attached_to)
- attached_to.recall_phone()
-
-/obj/item/phone/pickup(mob/user)
- . = ..()
- RegisterSignal(user, COMSIG_LIVING_SPEAK, PROC_REF(handle_speak))
-
-/obj/item/phone/forceMove(atom/dest)
- . = ..()
- if(.)
- reset_tether()
-
-/obj/item/phone/proc/do_zlevel_check()
- if(!attached_to || !loc.z || !attached_to.z)
- return FALSE
-
- if(zlevel_transfer)
- if(loc.z == attached_to.z)
- zlevel_transfer = FALSE
- if(zlevel_transfer_timer)
- deltimer(zlevel_transfer_timer)
- UnregisterSignal(attached_to, COMSIG_MOVABLE_MOVED)
- return FALSE
- return TRUE
-
- if(attached_to && loc.z != attached_to.z)
- zlevel_transfer = TRUE
- zlevel_transfer_timer = addtimer(CALLBACK(src, PROC_REF(try_doing_tether)), zlevel_transfer_timeout, TIMER_UNIQUE|TIMER_STOPPABLE)
- RegisterSignal(attached_to, COMSIG_MOVABLE_MOVED, PROC_REF(transmitter_move_handler))
- return TRUE
- return FALSE
-
-/obj/item/phone/proc/transmitter_move_handler(datum/source)
- SIGNAL_HANDLER
- zlevel_transfer = FALSE
- if(zlevel_transfer_timer)
- deltimer(zlevel_transfer_timer)
- UnregisterSignal(attached_to, COMSIG_MOVABLE_MOVED)
- reset_tether()
-
-/obj/item/phone/proc/try_doing_tether()
- zlevel_transfer_timer = TIMER_ID_NULL
- zlevel_transfer = FALSE
- UnregisterSignal(attached_to, COMSIG_MOVABLE_MOVED)
- reset_tether()
-
-/obj/structure/transmitter/no_dnd
- do_not_disturb = PHONE_DND_FORBIDDEN
-
-//rotary desk phones (need a touch tone handset at some point)
-/obj/structure/transmitter/rotary
- name = "rotary telephone"
- icon_state = "rotary_phone"
- desc = "The finger plate is a little stiff."
-
-/obj/structure/transmitter/rotary/no_dnd
- do_not_disturb = PHONE_DND_FORBIDDEN
-
-/obj/structure/transmitter/touchtone
- name = "touch-tone telephone"
- icon_state = "rotary_phone"//placeholder
- desc = "Ancient aliens, it's all true. I'm an expert just like you!"
-
-/obj/structure/transmitter/colony_net
- networks_receive = list(FACTION_COLONIST)
- networks_transmit = list(FACTION_COLONIST)
-
-/obj/structure/transmitter/colony_net/rotary
- name = "rotary telephone"
- icon_state = "rotary_phone"
- desc = "The finger plate is a little stiff."
-
-/obj/structure/transmitter/upp_net
- networks_receive = list(FACTION_UPP)
- networks_transmit = list(FACTION_UPP)
-
-/obj/structure/transmitter/upp_net/rotary
- name = "rotary telephone"
- icon_state = "rotary_phone"
- desc = "The finger plate is a little stiff."
-
-/obj/structure/transmitter/clf_net
- networks_receive = list(FACTION_CLF)
- networks_transmit = list(FACTION_CLF)
-
-/obj/structure/transmitter/clf_net/rotary
- name = "rotary telephone"
- icon_state = "rotary_phone"
- desc = "The finger plate is a little stiff."
-
-/obj/structure/transmitter/wy_net
- networks_receive = list(FACTION_WY)
- networks_transmit = list(FACTION_WY)
-
-/obj/structure/transmitter/wy_net/rotary
- name = "rotary telephone"
- icon_state = "rotary_phone"
- desc = "The finger plate is a little stiff."
diff --git a/code/modules/cm_phone/phone_base.dm b/code/modules/cm_phone/phone_base.dm
new file mode 100644
index 0000000000..4b74262b9e
--- /dev/null
+++ b/code/modules/cm_phone/phone_base.dm
@@ -0,0 +1,100 @@
+/obj/structure/phone_base
+ name = "telephone receiver"
+ icon = 'icons/obj/structures/structures.dmi'
+ icon_state = "wall_phone"
+ desc = "It is a wall mounted telephone. The fine text reads: To log your details with the mainframe please insert your keycard into the slot below. Unfortunately the slot is jammed. You can still use the phone, however."
+
+ var/phone_category = "Uncategorised"
+ var/phone_color = "white"
+ var/phone_id = "Telephone"
+ var/phone_icon
+
+ /// Whether or not the phone is receiving calls or not. Varies between on/off or forcibly on/off.
+ var/do_not_disturb = PHONE_DO_NOT_DISTURB_OFF
+
+ var/list/networks_receive = list(FACTION_MARINE)
+ var/list/networks_transmit = list(FACTION_MARINE)
+
+/obj/structure/phone_base/Initialize(mapload, ...)
+ . = ..()
+
+ AddComponent(/datum/component/phone, phone_category, phone_color, phone_id, phone_icon, do_not_disturb, networks_receive, networks_transmit)
+ RegisterSignal(src, COMSIG_ATOM_PHONE_PICKED_UP, PROC_REF(phone_picked_up))
+ RegisterSignal(src, COMSIG_ATOM_PHONE_HUNG_UP, PROC_REF(phone_hung_up))
+ RegisterSignal(src, COMSIG_ATOM_PHONE_RINGING, PROC_REF(phone_ringing))
+ RegisterSignal(src, COMSIG_ATOM_PHONE_STOPPED_RINGING, PROC_REF(phone_stopped_ringing))
+
+/obj/structure/phone_base/Destroy()
+ networks_receive = null
+ networks_transmit = null
+ return ..()
+
+/obj/structure/phone_base/proc/phone_picked_up()
+ icon_state = PHONE_OFF_BASE_UNIT_ICON_STATE
+
+/obj/structure/phone_base/proc/phone_hung_up()
+ icon_state = PHONE_ON_BASE_UNIT_ICON_STATE
+
+/obj/structure/phone_base/proc/phone_ringing()
+ icon_state = PHONE_RINGING_ICON_STATE
+
+/obj/structure/phone_base/proc/phone_stopped_ringing()
+ if(icon_state == PHONE_OFF_BASE_UNIT_ICON_STATE)
+ return
+ icon_state = PHONE_ON_BASE_UNIT_ICON_STATE
+
+/obj/structure/phone_base/hidden
+ do_not_disturb = PHONE_DO_NOT_DISTURB_FORCED
+
+/obj/structure/phone_base/no_dnd
+ do_not_disturb = PHONE_DO_NOT_DISTURB_FORBIDDEN
+
+//rotary desk phones (need a touch tone handset at some point)
+/obj/structure/phone_base/rotary
+ name = "rotary telephone"
+ icon_state = "rotary_phone"
+ desc = "The finger plate is a little stiff."
+
+/obj/structure/phone_base/rotary/no_dnd
+ do_not_disturb = PHONE_DO_NOT_DISTURB_FORBIDDEN
+
+/obj/structure/phone_base/touchtone
+ name = "touch-tone telephone"
+ icon_state = "rotary_phone"//placeholder
+ desc = "Ancient aliens, it's all true. I'm an expert just like you!"
+
+/obj/structure/phone_base/colony_net
+ networks_receive = list(FACTION_COLONIST)
+ networks_transmit = list(FACTION_COLONIST)
+
+/obj/structure/phone_base/colony_net/rotary
+ name = "rotary telephone"
+ icon_state = "rotary_phone"
+ desc = "The finger plate is a little stiff."
+
+/obj/structure/phone_base/upp_net
+ networks_receive = list(FACTION_UPP)
+ networks_transmit = list(FACTION_UPP)
+
+/obj/structure/phone_base/upp_net/rotary
+ name = "rotary telephone"
+ icon_state = "rotary_phone"
+ desc = "The finger plate is a little stiff."
+
+/obj/structure/phone_base/clf_net
+ networks_receive = list(FACTION_CLF)
+ networks_transmit = list(FACTION_CLF)
+
+/obj/structure/phone_base/clf_net/rotary
+ name = "rotary telephone"
+ icon_state = "rotary_phone"
+ desc = "The finger plate is a little stiff."
+
+/obj/structure/phone_base/wy_net
+ networks_receive = list(FACTION_WY)
+ networks_transmit = list(FACTION_WY)
+
+/obj/structure/phone_base/wy_net/rotary
+ name = "rotary telephone"
+ icon_state = "rotary_phone"
+ desc = "The finger plate is a little stiff."
diff --git a/code/modules/mob/living/carbon/xenomorph/Evolution.dm b/code/modules/mob/living/carbon/xenomorph/Evolution.dm
index bf46934730..467fceb360 100644
--- a/code/modules/mob/living/carbon/xenomorph/Evolution.dm
+++ b/code/modules/mob/living/carbon/xenomorph/Evolution.dm
@@ -202,7 +202,7 @@
to_chat(src, SPAN_WARNING("Nuh-uh."))
return FALSE
- if(SSticker?.mode?.flags_round_type & MODE_NO_XENO_EVOLVE)
+ if(SSticker.mode?.flags_round_type & MODE_NO_XENO_EVOLVE)
to_chat(src, SPAN_WARNING("This mode disallows xeno evolution."))
return FALSE
diff --git a/code/modules/mob/living/carbon/xenomorph/XenoMutatorSets.dm b/code/modules/mob/living/carbon/xenomorph/XenoMutatorSets.dm
index 1af6eebcf9..83c8500a1b 100644
--- a/code/modules/mob/living/carbon/xenomorph/XenoMutatorSets.dm
+++ b/code/modules/mob/living/carbon/xenomorph/XenoMutatorSets.dm
@@ -25,6 +25,10 @@
return FALSE
/datum/mutator_set/proc/list_and_purchase_mutators()
+ if(SSticker.mode?.flags_round_type & MODE_NO_XENO_EVOLVE)
+ to_chat(usr, SPAN_WARNING("This mode disallows xeno mutators."))
+ return FALSE
+
var/list/mutators_for_purchase = available_mutators()
var/mob/living/carbon/xenomorph/Xeno = usr
if(mutators_for_purchase.len == 0)
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 8cd5b148a1..fc62c076c7 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -65,6 +65,9 @@
if(!src.client) //Somehow
return
+ if(SEND_SIGNAL(src, COMSIG_DEAD_SPEAK, message) & COMPONENT_OVERRIDE_DEAD_SPEAK)
+ return
+
if(!src.client.admin_holder || !(client.admin_holder.rights & R_MOD))
if(!dsay_allowed)
to_chat(src, SPAN_DANGER("Deadchat is globally muted"))
diff --git a/code/modules/movement/movement.dm b/code/modules/movement/movement.dm
index da0c76cba9..4645756e29 100644
--- a/code/modules/movement/movement.dm
+++ b/code/modules/movement/movement.dm
@@ -102,11 +102,14 @@
/atom/movable/proc/forceMove(atom/destination)
. = FALSE
+
if(destination)
. = doMove(destination)
else
CRASH("No valid destination passed into forceMove")
+ if(SEND_SIGNAL(src, COMSIG_MOVABLE_FORCEMOVED, destination))
+ return
/atom/movable/proc/moveToNullspace()
return doMove(null)
diff --git a/code/modules/projectiles/guns/flamer/flamer.dm b/code/modules/projectiles/guns/flamer/flamer.dm
index 42a0e2ce03..5e61f5daa0 100644
--- a/code/modules/projectiles/guns/flamer/flamer.dm
+++ b/code/modules/projectiles/guns/flamer/flamer.dm
@@ -23,7 +23,8 @@
/obj/item/attachable/flashlight,
/obj/item/attachable/magnetic_harness,
/obj/item/attachable/attached_gun/extinguisher,
- /obj/item/attachable/attached_gun/flamer_nozzle
+ /obj/item/attachable/attached_gun/extinguisher/pyro,
+ /obj/item/attachable/attached_gun/flamer_nozzle,
)
flags_gun_features = GUN_UNUSUAL_DESIGN|GUN_WIELDED_FIRING_ONLY|GUN_TRIGGER_SAFETY
gun_category = GUN_CATEGORY_HEAVY
diff --git a/code/modules/reagents/chemistry_properties/prop_special.dm b/code/modules/reagents/chemistry_properties/prop_special.dm
index 640e184263..7baa66fc58 100644
--- a/code/modules/reagents/chemistry_properties/prop_special.dm
+++ b/code/modules/reagents/chemistry_properties/prop_special.dm
@@ -369,3 +369,20 @@
/datum/chem_property/special/firepenetrating/update_reagent()
holder.fire_penetrating = TRUE
..()
+
+/datum/chem_property/special/revitalizing
+ name = PROPERTY_REVITALIZING
+ code = "REV"
+ description = "For a period of time, revitalizes the main systems of the body and prevents unconciousness."
+ rarity = PROPERTY_ADMIN
+ category = PROPERTY_TYPE_STIMULANT
+ value = 666
+
+/datum/chem_property/special/revitalizing/reagent_added(mob/living/M)
+ if(!ishuman(M))
+ return
+ M.status_flags &= ~CANKNOCKOUT
+ M.knocked_out = 0
+
+/datum/chem_property/special/revitalizing/on_delete(mob/living/M)
+ M.status_flags |= CANKNOCKOUT
diff --git a/code/modules/reagents/chemistry_reactions/medical.dm b/code/modules/reagents/chemistry_reactions/medical.dm
index 2e38117134..72a491d779 100644
--- a/code/modules/reagents/chemistry_reactions/medical.dm
+++ b/code/modules/reagents/chemistry_reactions/medical.dm
@@ -14,6 +14,13 @@
required_reagents = list("carbon" = 1, "nitrogen" = 1, "oxygen" = 1)
result_amount = 2
+/datum/chemical_reaction/adrenaline_concentrated
+ name = "Epinephrine (concentrated)"
+ id = "adrenaline_concentrated"
+ result = "adrenaline_concentrated"
+ required_reagents = list("carbon" = 1, "nitrogen" = 1, "oxygen" = 1, "phoron" = 3)
+ result_amount = 1
+
/datum/chemical_reaction/alkysine
name = "Alkysine"
id = "alkysine"
diff --git a/code/modules/reagents/chemistry_reagents/medical.dm b/code/modules/reagents/chemistry_reagents/medical.dm
index f69d1b952c..01269a0d85 100644
--- a/code/modules/reagents/chemistry_reagents/medical.dm
+++ b/code/modules/reagents/chemistry_reagents/medical.dm
@@ -275,7 +275,7 @@
id = "adrenaline"
description = "A natural muscle and heart stimulant. Useful for restarting the heart. Overdosing may stress the heart and cause tissue damage."
reagent_state = LIQUID
- color = "FFE703" // Yellow-ish
+ color = "#FFE703" // Yellow-ish
overdose = LOWM_REAGENTS_OVERDOSE
overdose_critical = LOWM_REAGENTS_OVERDOSE_CRITICAL
custom_metabolism = AMOUNT_PER_TIME(1, 5 SECONDS)
@@ -283,6 +283,19 @@
properties = list(PROPERTY_PAINKILLING = 1.5, PROPERTY_ELECTROGENETIC = 4, PROPERTY_INTRAVENOUS = 1)
flags = REAGENT_TYPE_MEDICAL | REAGENT_SCANNABLE
+/datum/reagent/medical/adrenaline_concentrated
+ name = "Epinephrine (concentrated)"
+ id = "adrenaline_concentrated"
+ description = "A natural muscle and heart stimulant that is in a high concerntration. Useful for restarting the heart and preventing unconciousness but in this concentrated form it will cause minor suffocation. Overdosing may stress the heart and cause tissue damage."
+ reagent_state = LIQUID
+ color = "#FFE702" // Yellow-ish
+ overdose = LOWM_REAGENTS_OVERDOSE
+ overdose_critical = LOWM_REAGENTS_OVERDOSE_CRITICAL
+ custom_metabolism = AMOUNT_PER_TIME(1, 10 SECONDS)
+ chemclass = CHEM_CLASS_COMMON
+ properties = list(PROPERTY_PAINKILLING = 1.5, PROPERTY_ELECTROGENETIC = 4, PROPERTY_REVITALIZING = 1, PROPERTY_HYPOXEMIC = 5, PROPERTY_INTRAVENOUS = 1)
+ flags = REAGENT_TYPE_MEDICAL | REAGENT_SCANNABLE
+
/datum/reagent/medical/ultrazine
name = "Ultrazine"
id = "ultrazine"
diff --git a/code/modules/tents/equipment.dm b/code/modules/tents/equipment.dm
index 0d47c7e3ce..bf9a76fc2d 100644
--- a/code/modules/tents/equipment.dm
+++ b/code/modules/tents/equipment.dm
@@ -44,9 +44,10 @@
return ..()
/// Telephone
-/obj/structure/transmitter/tent
+/obj/structure/phone_base/tent
layer = INTERIOR_WALLMOUNT_LAYER
-/obj/structure/transmitter/tent/Initialize(mapload, ...)
+
+/obj/structure/phone_base/tent/Initialize(mapload, ...)
AddComponent(/datum/component/tent_supported_object)
return ..()
diff --git a/code/modules/vehicles/apc/apc_command.dm b/code/modules/vehicles/apc/apc_command.dm
index eb74f78c73..1fdfb938d1 100644
--- a/code/modules/vehicles/apc/apc_command.dm
+++ b/code/modules/vehicles/apc/apc_command.dm
@@ -7,7 +7,7 @@
interior_map = /datum/map_template/interior/apc_command
- passengers_slots = 8
+ passengers_slots = 15
var/sensor_radius = 45 //45 tiles radius
diff --git a/code/modules/vehicles/apc/apc_medical.dm b/code/modules/vehicles/apc/apc_medical.dm
index dd24c6fa8f..a1390753fc 100644
--- a/code/modules/vehicles/apc/apc_medical.dm
+++ b/code/modules/vehicles/apc/apc_medical.dm
@@ -8,7 +8,7 @@
interior_map = /datum/map_template/interior/apc_med
- passengers_slots = 8
+ passengers_slots = 15
//MED APC can store additional 6 dead revivable bodies for the triage
//but interior won't allow more revivable dead if passengers_taken_slots >= passengers_slots + revivable_dead_slots
//to prevent infinitely growing the marine force inside of the vehicle
diff --git a/code/modules/vehicles/interior/interactable/vendors.dm b/code/modules/vehicles/interior/interactable/vendors.dm
index 6d98bc85e4..f5aef4f430 100644
--- a/code/modules/vehicles/interior/interactable/vendors.dm
+++ b/code/modules/vehicles/interior/interactable/vendors.dm
@@ -77,7 +77,6 @@
list("AUTOINJECTORS", -1, null, null),
list("Autoinjector (Bicaridine)", round(scale * 3), /obj/item/reagent_container/hypospray/autoinjector/bicaridine, VENDOR_ITEM_REGULAR),
list("Autoinjector (Dexalin+)", round(scale * 3), /obj/item/reagent_container/hypospray/autoinjector/dexalinp, VENDOR_ITEM_REGULAR),
- list("Autoinjector (Epinephrine)", round(scale * 3), /obj/item/reagent_container/hypospray/autoinjector/adrenaline, VENDOR_ITEM_REGULAR),
list("Autoinjector (Inaprovaline)", round(scale * 3), /obj/item/reagent_container/hypospray/autoinjector/inaprovaline, VENDOR_ITEM_REGULAR),
list("Autoinjector (Kelotane)", round(scale * 3), /obj/item/reagent_container/hypospray/autoinjector/kelotane, VENDOR_ITEM_REGULAR),
list("Autoinjector (Oxycodone)", round(scale * 3), /obj/item/reagent_container/hypospray/autoinjector/oxycodone, VENDOR_ITEM_REGULAR),
diff --git a/code/modules/vehicles/interior/interior_landmarks.dm b/code/modules/vehicles/interior/interior_landmarks.dm
index 90284682d2..eb62e50243 100644
--- a/code/modules/vehicles/interior/interior_landmarks.dm
+++ b/code/modules/vehicles/interior/interior_landmarks.dm
@@ -216,18 +216,18 @@
color = "yellow"
/obj/effect/landmark/interior/spawn/telephone/on_load(datum/interior/I)
- var/obj/structure/transmitter/Phone = new(loc)
-
- Phone.icon = icon
- Phone.icon_state = icon_state
- Phone.layer = layer
- Phone.setDir(dir)
- Phone.alpha = alpha
- Phone.update_icon()
- Phone.pixel_x = pixel_x
- Phone.pixel_y = pixel_y
- Phone.phone_category = "Vehicles"
- Phone.phone_id = I.exterior.name
+ var/obj/structure/phone_base/phone = new(loc)
+
+ phone.icon = icon
+ phone.icon_state = icon_state
+ phone.layer = layer
+ phone.setDir(dir)
+ phone.alpha = alpha
+ phone.update_icon()
+ phone.pixel_x = pixel_x
+ phone.pixel_y = pixel_y
+ phone.phone_category = "Vehicles"
+ phone.phone_id = I.exterior.name
qdel(src)
diff --git a/colonialmarines.dme b/colonialmarines.dme
index 5228c4e0dd..dfab961be2 100644
--- a/colonialmarines.dme
+++ b/colonialmarines.dme
@@ -388,6 +388,7 @@ s// DM Environment file for colonialmarines.dme.
#include "code\datums\components\label.dm"
#include "code\datums\components\orbiter.dm"
#include "code\datums\components\overlay_lighting.dm"
+#include "code\datums\components\phone.dm"
#include "code\datums\components\rename.dm"
#include "code\datums\components\speed_modifier.dm"
#include "code\datums\components\toxin_buildup.dm"
@@ -1585,8 +1586,8 @@ s// DM Environment file for colonialmarines.dme.
#include "code\modules\cm_marines\equipment\weapons.dm"
#include "code\modules\cm_marines\equipment\mortar\mortar_shells.dm"
#include "code\modules\cm_marines\equipment\mortar\mortars.dm"
-#include "code\modules\cm_phone\internal_phone.dm"
-#include "code\modules\cm_phone\phone.dm"
+#include "code\modules\cm_phone\handset.dm"
+#include "code\modules\cm_phone\phone_base.dm"
#include "code\modules\cm_preds\_yaut_defines.dm"
#include "code\modules\cm_preds\falcon.dm"
#include "code\modules\cm_preds\huntdata.dm"
diff --git a/icons/obj/items/syringe.dmi b/icons/obj/items/syringe.dmi
index d08b2a8c2d..d54123a898 100644
Binary files a/icons/obj/items/syringe.dmi and b/icons/obj/items/syringe.dmi differ
diff --git a/interface/interface.dm b/interface/interface.dm
index abbf4049e5..538bf6ed00 100644
--- a/interface/interface.dm
+++ b/interface/interface.dm
@@ -43,7 +43,7 @@
if(tgui_alert(src, "This will open the discord in your browser. Are you sure?", "Confirm", list("Yes", "No")) != "Yes")
return
- src << link("https://discord.gg/v6P6wns5dN")
+ src << link("https://discord.gg/pve-cmss13")
return
/client/verb/github()
diff --git a/interface/skin.dmf b/interface/skin.dmf
index e9a5a21557..b3a762081a 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -297,7 +297,7 @@ window "infowindow"
text-align = center
font-weight = bold
saved-params = "is-checked"
- text = "discord.gg/v6P6wns5dN"
+ text = "discord.gg/PVE-CMSS13"
command = "discord"
window "outputwindow"
diff --git a/maps/interiors/tank.dmm b/maps/interiors/tank.dmm
index 75da1e24f7..8dc0bf1419 100644
--- a/maps/interiors/tank.dmm
+++ b/maps/interiors/tank.dmm
@@ -6,7 +6,7 @@
name = "back entrance marker";
tag = "back"
},
-/obj/structure/transmitter{
+/obj/structure/phone_base{
dir = 8;
layer = 3.1;
name = "Tank Telephone";
diff --git a/maps/map_files/BigRed/BigRed.dmm b/maps/map_files/BigRed/BigRed.dmm
index 6439378dba..e9b77c1ca9 100644
--- a/maps/map_files/BigRed/BigRed.dmm
+++ b/maps/map_files/BigRed/BigRed.dmm
@@ -1328,7 +1328,7 @@
/obj/structure/machinery/computer/telecomms/monitor{
req_one_access_txt = "19;200"
},
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
dir = 4;
phone_category = "Solaris Ridge";
phone_color = "yellow";
@@ -2958,7 +2958,7 @@
"aiG" = (
/obj/structure/surface/table,
/obj/item/handcuffs,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Solaris Ridge";
phone_color = "red";
phone_id = "Marshal Office"
@@ -7964,7 +7964,7 @@
"awB" = (
/obj/structure/surface/table/holotable/wood,
/obj/item/reagent_container/food/drinks/coffee,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Lambda Labs";
phone_color = "blue";
phone_id = "Administration"
@@ -9835,7 +9835,7 @@
/obj/item/device/healthanalyzer,
/obj/structure/pipes/vents/pump,
/obj/item/reagent_container/spray/cleaner,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "Solaris Ridge";
phone_color = "green";
phone_id = "Clinic";
@@ -11088,7 +11088,7 @@
"aFl" = (
/obj/structure/surface/table,
/obj/effect/spawner/random/technology_scanner,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
dir = 4;
phone_category = "Eta Labs";
phone_id = "Observation";
@@ -14186,7 +14186,7 @@
dir = 4;
health = 80
},
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Solaris Ridge";
phone_color = "blue";
phone_id = "Administration"
@@ -14648,7 +14648,7 @@
/area/bigredv2/caves/eta/storage)
"aOQ" = (
/obj/structure/surface/table,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Eta Labs";
phone_color = "Blue";
phone_id = "Director"
@@ -14778,7 +14778,7 @@
/area/bigredv2/outside/hydroponics)
"aPf" = (
/obj/structure/surface/table,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Eta Labs";
phone_id = "Workshop"
},
@@ -15068,7 +15068,7 @@
dir = 4;
health = 80
},
-/obj/item/phone,
+/obj/item/handset,
/turf/open/floor{
dir = 4;
icon_state = "warnwhite"
@@ -17370,7 +17370,7 @@
/obj/structure/bed/chair/office/dark{
dir = 4
},
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "Solaris Ridge";
phone_color = "blue";
phone_id = "Operations";
@@ -22512,7 +22512,7 @@
dir = 4
},
/obj/structure/surface/table/reinforced,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Lambda Labs";
phone_id = "Virology"
},
@@ -22833,7 +22833,7 @@
/area/bigredv2/outside/filtration_plant)
"boY" = (
/obj/structure/machinery/cm_vending/sorted/tech/tool_storage,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "Solaris Ridge";
phone_color = "yellow";
phone_id = "Filtration";
@@ -23347,7 +23347,7 @@
/obj/structure/surface/table,
/obj/effect/spawner/random/technology_scanner,
/obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "Solaris Ridge";
phone_color = "yellow";
phone_id = "Engineering";
@@ -24065,7 +24065,7 @@
"bwr" = (
/obj/structure/machinery/light,
/obj/structure/surface/table,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Solaris Ridge";
phone_color = "green";
phone_id = "Virology Lab"
@@ -24158,7 +24158,7 @@
"bwQ" = (
/obj/structure/surface/table,
/obj/item/tool/screwdriver,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Eta Labs";
phone_color = "yellow";
phone_id = "Robotics"
@@ -25169,7 +25169,7 @@
"bzF" = (
/obj/structure/surface/table,
/obj/effect/spawner/random/tech_supply,
-/obj/item/phone,
+/obj/item/handset,
/turf/open/floor{
dir = 1;
icon_state = "darkblue2"
@@ -27603,7 +27603,7 @@
/area/bigredv2/caves_sw)
"daB" = (
/obj/structure/surface/table/reinforced,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Lambda Labs";
phone_id = "Xenobiology"
},
@@ -28788,7 +28788,7 @@
},
/area/bigredv2/caves/eta/living)
"fyO" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "Solaris Ridge";
phone_color = "green";
phone_id = "Clinic Labs";
@@ -28898,7 +28898,7 @@
/obj/structure/machinery/light{
dir = 4
},
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "Lambda Labs";
phone_id = "Surgery";
pixel_y = 24
@@ -29563,7 +29563,7 @@
},
/area/bigredv2/outside/filtration_plant)
"htp" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
do_not_disturb = 1;
dir = 4;
phone_category = "Lambda Labs";
@@ -31175,7 +31175,7 @@
},
/area/bigredv2/caves/eta/xenobiology)
"kyz" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
dir = 4;
phone_category = "Eta Labs";
phone_id = "Observation";
@@ -32691,7 +32691,7 @@
/area/bigredv2/caves/mining)
"ofJ" = (
/obj/structure/surface/table,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Eta Labs";
phone_color = "red";
phone_id = "Security"
@@ -36454,7 +36454,7 @@
/area/bigredv2/caves_research)
"vBT" = (
/obj/structure/surface/table/reinforced,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Solaris Ridge";
phone_id = "Clinic Reception"
},
@@ -36812,7 +36812,7 @@
/area/bigredv2/outside/w)
"wry" = (
/obj/structure/surface/table,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Solaris Ridge";
phone_color = "blue";
phone_id = "Space Port"
diff --git a/maps/map_files/BigRed/sprinkles/70.se-checkpoint.dmm b/maps/map_files/BigRed/sprinkles/70.se-checkpoint.dmm
index 8907ab630f..ec219d07b9 100644
--- a/maps/map_files/BigRed/sprinkles/70.se-checkpoint.dmm
+++ b/maps/map_files/BigRed/sprinkles/70.se-checkpoint.dmm
@@ -69,7 +69,7 @@
/area/bigredv2/outside/filtration_cave_cas)
"kd" = (
/obj/structure/surface/table/almayer,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Solaris Ridge";
phone_color = "red";
phone_id = "Filtration Checkpoint"
diff --git a/maps/map_files/BigRed/standalone/medbay-v3.dmm b/maps/map_files/BigRed/standalone/medbay-v3.dmm
index 2e89ccc9f4..ae681377cb 100644
--- a/maps/map_files/BigRed/standalone/medbay-v3.dmm
+++ b/maps/map_files/BigRed/standalone/medbay-v3.dmm
@@ -1729,7 +1729,7 @@
/area/bigredv2/outside/medical)
"eD" = (
/obj/structure/surface/table/reinforced,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Solaris Ridge";
phone_id = "Clinic Reception"
},
@@ -2055,7 +2055,7 @@
},
/area/bigredv2/outside/medical)
"Xh" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "Solaris Ridge";
phone_color = "green";
phone_id = "Clinic Labs";
diff --git a/maps/map_files/CORSAT/Corsat.dmm b/maps/map_files/CORSAT/Corsat.dmm
index e265184172..c95caf2a9b 100644
--- a/maps/map_files/CORSAT/Corsat.dmm
+++ b/maps/map_files/CORSAT/Corsat.dmm
@@ -16467,7 +16467,7 @@
/turf/open/floor/wood,
/area/corsat/gamma/administration)
"aTJ" = (
-/obj/item/phone,
+/obj/item/handset,
/obj/structure/pipes/standard/simple/hidden/green,
/obj/structure/surface/table/woodentable/fancy,
/turf/open/floor{
@@ -25672,7 +25672,7 @@
/area/corsat/omega/offices)
"bug" = (
/obj/structure/surface/table/almayer,
-/obj/item/phone,
+/obj/item/handset,
/turf/open/floor/corsat{
dir = 8;
icon_state = "bluegrey"
@@ -29328,7 +29328,7 @@
/area/corsat/omega/hangar/security)
"bEt" = (
/obj/structure/surface/table/reinforced,
-/obj/item/phone,
+/obj/item/handset,
/turf/open/floor/corsat{
dir = 8;
icon_state = "red"
@@ -36395,7 +36395,7 @@
/area/corsat/gamma/hangar/cargo)
"csM" = (
/obj/structure/surface/table/almayer,
-/obj/item/phone,
+/obj/item/handset,
/turf/open/floor/corsat{
icon_state = "bluegreycorner"
},
@@ -38369,7 +38369,7 @@
/area/corsat/sigma/biodome/gunrange)
"dYh" = (
/obj/structure/surface/table/woodentable/fancy,
-/obj/item/phone,
+/obj/item/handset,
/turf/open/floor{
dir = 8;
icon_state = "carpet15-15"
@@ -41794,7 +41794,7 @@
/area/corsat/theta/airlock/east/id)
"gwW" = (
/obj/structure/surface/table/reinforced,
-/obj/item/phone,
+/obj/item/handset,
/turf/open/floor/corsat{
dir = 10;
icon_state = "red"
@@ -48246,7 +48246,7 @@
/area/corsat/gamma/biodome/complex)
"lnW" = (
/obj/structure/surface/table/reinforced,
-/obj/item/phone,
+/obj/item/handset,
/turf/open/floor/corsat{
dir = 4;
icon_state = "purplewhite"
@@ -48818,7 +48818,7 @@
/area/corsat/sigma/south/complex)
"lIX" = (
/obj/structure/surface/table/reinforced,
-/obj/item/phone,
+/obj/item/handset,
/turf/open/floor/corsat{
icon_state = "purplewhite"
},
@@ -54498,7 +54498,7 @@
dir = 4;
health = 80
},
-/obj/item/phone,
+/obj/item/handset,
/turf/open/floor/corsat{
icon_state = "blue"
},
@@ -64466,7 +64466,7 @@
/obj/item/ashtray/plastic{
pixel_x = 4
},
-/obj/item/phone{
+/obj/item/handset{
pixel_x = -4;
pixel_y = 4
},
diff --git a/maps/map_files/DesertDam/Desert_Dam.dmm b/maps/map_files/DesertDam/Desert_Dam.dmm
index 17a02d24ce..d7a3cd48f8 100644
--- a/maps/map_files/DesertDam/Desert_Dam.dmm
+++ b/maps/map_files/DesertDam/Desert_Dam.dmm
@@ -8246,7 +8246,7 @@
"ayG" = (
/obj/structure/surface/table,
/obj/effect/spawner/random/tech_supply,
-/obj/item/phone,
+/obj/item/handset,
/turf/open/floor/prison{
dir = 1;
icon_state = "blue"
diff --git a/maps/map_files/FOP_v2_Cellblocks/Prison_Station_FOP.dmm b/maps/map_files/FOP_v2_Cellblocks/Prison_Station_FOP.dmm
index 0fd8b269d3..9cd11760c2 100644
--- a/maps/map_files/FOP_v2_Cellblocks/Prison_Station_FOP.dmm
+++ b/maps/map_files/FOP_v2_Cellblocks/Prison_Station_FOP.dmm
@@ -17167,7 +17167,7 @@
},
/area/prison/security/checkpoint/highsec/n)
"aWF" = (
-/obj/item/phone,
+/obj/item/handset,
/obj/structure/surface/table/reinforced,
/turf/open/floor/prison{
dir = 9;
@@ -18315,7 +18315,7 @@
/turf/open/floor/prison,
/area/prison/kitchen)
"bag" = (
-/obj/item/phone,
+/obj/item/handset,
/obj/structure/surface/table/reinforced,
/turf/open/floor{
icon_state = "hydrofloor"
@@ -20844,7 +20844,7 @@
},
/area/prison/cellblock/vip)
"bhq" = (
-/obj/item/phone,
+/obj/item/handset,
/obj/structure/surface/table/reinforced,
/turf/open/floor/prison{
icon_state = "cell_stripe"
@@ -23437,7 +23437,7 @@
},
/area/prison/cellblock/vip)
"boR" = (
-/obj/item/phone,
+/obj/item/handset,
/obj/structure/surface/table/reinforced,
/turf/open/floor/prison{
dir = 1;
@@ -37320,7 +37320,7 @@
/turf/open/floor/prison,
/area/prison/recreation/medsec)
"cgm" = (
-/obj/item/phone,
+/obj/item/handset,
/obj/structure/surface/table/reinforced,
/turf/open/floor/prison,
/area/prison/recreation/medsec)
diff --git a/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm b/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm
index 660c219af5..fd4c360e7e 100644
--- a/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm
+++ b/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm
@@ -2035,7 +2035,7 @@
/area/fiorina/station/botany)
"bck" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_y = 7
},
/turf/open/floor/prison{
@@ -11656,7 +11656,7 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -11946,7 +11946,7 @@
},
/area/fiorina/station/lowsec)
"hob" = (
-/obj/item/phone{
+/obj/item/handset{
pixel_y = 7
},
/turf/open/floor/plating/prison,
@@ -12421,11 +12421,11 @@
/obj/structure/window/reinforced{
dir = 8
},
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 7;
pixel_y = -16
},
-/obj/item/phone{
+/obj/item/handset{
pixel_x = -3;
pixel_y = 16
},
@@ -16569,11 +16569,11 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 6;
pixel_y = -15
},
-/obj/item/phone{
+/obj/item/handset{
pixel_y = 7
},
/turf/open/floor/prison{
@@ -17733,7 +17733,7 @@
/area/fiorina/station/transit_hub)
"kLX" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone,
+/obj/item/handset,
/turf/open/floor/prison{
dir = 10;
icon_state = "sterile_white"
@@ -19893,7 +19893,7 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/item/phone{
+/obj/item/handset{
pixel_x = -3;
pixel_y = 13
},
@@ -21789,7 +21789,7 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/item/phone{
+/obj/item/handset{
pixel_x = -3;
pixel_y = 13
},
@@ -31826,7 +31826,7 @@
/turf/open/floor/plating/prison,
/area/fiorina/station/medbay)
"tER" = (
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 9;
pixel_y = -10
},
@@ -34510,11 +34510,11 @@
/obj/structure/window/reinforced{
dir = 8
},
-/obj/item/phone{
+/obj/item/handset{
pixel_x = -3;
pixel_y = 10
},
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 9;
pixel_y = -10
},
@@ -36440,10 +36440,10 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/item/phone{
+/obj/item/handset{
pixel_y = -4
},
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 7;
pixel_y = 10
},
diff --git a/maps/map_files/FOP_v3_Sciannex/sprinkles/20.medicalhold.dmm b/maps/map_files/FOP_v3_Sciannex/sprinkles/20.medicalhold.dmm
index 0043ae9f1c..368d8e5faa 100644
--- a/maps/map_files/FOP_v3_Sciannex/sprinkles/20.medicalhold.dmm
+++ b/maps/map_files/FOP_v3_Sciannex/sprinkles/20.medicalhold.dmm
@@ -494,7 +494,7 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/item/phone{
+/obj/item/handset{
pixel_x = -3;
pixel_y = 13
},
diff --git a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm
index d777aaf2e7..0332274d42 100644
--- a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm
+++ b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm
@@ -11183,7 +11183,7 @@
pixel_y = 5
},
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = -12;
pixel_y = 7
},
diff --git a/maps/map_files/Kutjevo/Kutjevo.dmm b/maps/map_files/Kutjevo/Kutjevo.dmm
index fdc0fdea32..f82f8bc42d 100644
--- a/maps/map_files/Kutjevo/Kutjevo.dmm
+++ b/maps/map_files/Kutjevo/Kutjevo.dmm
@@ -3336,7 +3336,7 @@
/turf/open/floor/almayer/research/containment/floor2,
/area/kutjevo/interior/power)
"ewF" = (
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 1;
pixel_y = 4
},
@@ -8059,7 +8059,7 @@
dir = 8
},
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 5;
pixel_y = -4
},
diff --git a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm
index e798127468..7559e07353 100644
--- a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm
+++ b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm
@@ -1367,7 +1367,7 @@
},
/area/lv522/indoors/a_block/dorms)
"aNn" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "LV522 Chances Claim";
phone_color = "red";
phone_id = "Colony Corporate";
@@ -2377,7 +2377,7 @@
/area/lv522/indoors/c_block/garage)
"bny" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "LV522 Chances Claim";
phone_color = "red";
phone_id = "Reactor Garage";
@@ -8838,7 +8838,7 @@
/area/lv522/oob)
"ebR" = (
/obj/structure/surface/table/almayer,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
dir = 1;
phone_category = "LV522 Chances Claim";
phone_color = "red";
@@ -11205,7 +11205,7 @@
/obj/structure/platform{
dir = 8
},
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "LV522 Chances Claim";
phone_color = "red";
phone_id = "LZ1 Service Tunnel";
@@ -11478,7 +11478,7 @@
/area/lv522/landing_zone_2)
"ffO" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
dir = 8;
phone_category = "LV522 Chances Claim";
phone_color = "red";
@@ -17534,7 +17534,7 @@
"huX" = (
/obj/structure/surface/table/almayer,
/obj/effect/decal/cleanable/dirt,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
dir = 1;
phone_category = "LV522 Chances Claim";
phone_color = "red";
@@ -18627,7 +18627,7 @@
"hPQ" = (
/obj/structure/pipes/standard/simple/hidden/green,
/obj/structure/surface/table/woodentable/fancy,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "LV522 Chances Claim";
phone_id = "Chief Engineer Office";
pixel_x = -2;
@@ -19659,7 +19659,7 @@
/area/lv522/landing_zone_1/tunnel)
"ike" = (
/obj/item/prop/alien/hugger,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
dir = 4;
phone_category = "LV522 Chances Claim";
phone_color = "red";
@@ -22663,7 +22663,7 @@
dir = 8
},
/obj/effect/decal/cleanable/dirt,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
dir = 4;
phone_category = "LV522 Chances Claim";
phone_color = "red";
@@ -23515,7 +23515,7 @@
/turf/closed/wall/r_wall/biodome/biodome_unmeltable,
/area/lv522/oob)
"jEF" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "LV522 Chances Claim";
phone_color = "red";
phone_id = "Reactor Meeting Room";
@@ -29654,7 +29654,7 @@
/area/lv522/landing_zone_2)
"lSP" = (
/obj/structure/surface/table/almayer,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "LV522 Chances Claim";
phone_id = "Colony Operations Centre";
pixel_y = 6
@@ -30067,7 +30067,7 @@
"mbw" = (
/obj/effect/decal/cleanable/blood,
/obj/effect/decal/cleanable/dirt,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "LV522 Chances Claim";
phone_color = "red";
phone_id = "Colony Dining";
@@ -31010,7 +31010,7 @@
/turf/open/floor/grass,
/area/lv522/indoors/a_block/garden)
"mtM" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
dir = 4;
phone_category = "LV522 Chances Claim";
phone_color = "red";
@@ -31032,7 +31032,7 @@
"muO" = (
/obj/structure/surface/table/almayer,
/obj/effect/decal/cleanable/dirt,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
dir = 1;
phone_category = "LV522 Chances Claim";
phone_color = "red";
@@ -32905,7 +32905,7 @@
/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/indoors/a_block/security)
"nem" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "LV522 Chances Claim";
phone_color = "red";
phone_id = "Colony Northern Dorms";
@@ -34187,7 +34187,7 @@
/turf/open/floor/prison,
/area/lv522/indoors/c_block/mining)
"nDS" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "LV522 Chances Claim";
phone_color = "red";
phone_id = "Colony Dorms";
@@ -36356,7 +36356,7 @@
},
/area/lv522/outdoors/colony_streets/north_west_street)
"osm" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "LV522 Chances Claim";
phone_color = "red";
phone_id = "Reactor Sewer";
@@ -37068,7 +37068,7 @@
},
/area/lv522/indoors/a_block/admin)
"oHR" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
dir = 4;
phone_category = "LV522 Chances Claim";
phone_color = "red";
@@ -37219,7 +37219,7 @@
},
/area/lv522/atmos/east_reactor/south)
"oKN" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "LV522 Chances Claim";
phone_color = "red";
phone_id = "Reactor Central Office";
@@ -41954,7 +41954,7 @@
},
/area/lv522/indoors/a_block/dorms)
"qyp" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "LV522 Chances Claim";
phone_color = "red";
phone_id = "Reactor Eastern Reactor Control";
@@ -42387,7 +42387,7 @@
/turf/open/asphalt/cement,
/area/lv522/outdoors/colony_streets/central_streets)
"qGh" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "LV522 Chances Claim";
phone_color = "red";
phone_id = "Colony Fitness";
@@ -44203,7 +44203,7 @@
"rjl" = (
/obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node,
/obj/effect/decal/cleanable/blood,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "LV522 Chances Claim";
phone_color = "red";
phone_id = "Reactor Entrance Office";
@@ -47074,7 +47074,7 @@
/area/lv522/landing_zone_2)
"slt" = (
/obj/structure/surface/table/almayer,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "LV522 Chances Claim";
phone_id = "Reactor Control";
pixel_y = 6
@@ -55594,7 +55594,7 @@
/obj/structure/bed/chair{
dir = 8
},
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
dir = 8;
phone_category = "LV522 Chances Claim";
phone_color = "red";
@@ -59282,7 +59282,7 @@
/area/lv522/indoors/a_block/admin)
"wDu" = (
/obj/structure/pipes/standard/simple/hidden/green,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
dir = 8;
phone_category = "LV522 Chances Claim";
phone_color = "red";
@@ -60553,7 +60553,7 @@
/area/lv522/outdoors/colony_streets/north_street)
"xfS" = (
/obj/structure/surface/table/woodentable/fancy,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
dir = 1;
phone_category = "LV522 Chances Claim";
phone_color = "red";
diff --git a/maps/map_files/LV624/LV624.dmm b/maps/map_files/LV624/LV624.dmm
index 20757954b5..80da4a7381 100644
--- a/maps/map_files/LV624/LV624.dmm
+++ b/maps/map_files/LV624/LV624.dmm
@@ -4750,7 +4750,7 @@
/obj/structure/machinery/light{
dir = 8
},
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "Lazarus Landing";
phone_id = "Research Dome";
pixel_y = 24
@@ -5744,7 +5744,7 @@
/area/lv624/lazarus/sleep_female)
"aBe" = (
/obj/structure/surface/table,
-/obj/item/phone,
+/obj/item/handset,
/obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot,
/turf/open/floor{
dir = 9;
@@ -8068,7 +8068,7 @@
},
/area/lv624/lazarus/main_hall)
"aJC" = (
-/obj/item/phone{
+/obj/item/handset{
desc = "A model of an ancient Earth communication device.";
force = 8
},
@@ -8640,7 +8640,7 @@
pixel_x = 6;
pixel_y = 14
},
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Lazarus Landing";
phone_color = "red";
phone_id = "Marshal Office"
@@ -11548,7 +11548,7 @@
"aXt" = (
/obj/structure/surface/rack,
/obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "Lazarus Landing";
phone_color = "yellow";
phone_id = "Engineering";
@@ -11861,7 +11861,7 @@
"aYJ" = (
/obj/structure/surface/table/woodentable/fancy,
/obj/item/trash/chips,
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Lazarus Landing";
phone_color = "blue";
phone_id = "Director's Office"
@@ -14986,7 +14986,7 @@
/turf/open/gm/river,
/area/lv624/ground/river/central_river)
"hXt" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "Lazarus Landing";
phone_id = "Lakeside Bar";
pixel_y = 32
@@ -17005,7 +17005,7 @@
},
/area/lv624/ground/barrens/west_barrens)
"nrP" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "Lazarus Landing";
phone_id = "Cargo";
pixel_y = 24
@@ -18086,7 +18086,7 @@
/obj/structure/machinery/light{
dir = 4
},
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Lazarus Landing";
phone_id = "Medbay"
},
@@ -18254,7 +18254,7 @@
pixel_x = 25;
pixel_y = -5
},
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "Lazarus Landing";
phone_color = "blue";
phone_id = "Corporate Office";
@@ -19042,7 +19042,7 @@
/turf/open/gm/dirtgrassborder/south,
/area/lv624/ground/colony/north_tcomms_road)
"rVH" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "Lazarus Landing";
phone_color = "yellow";
phone_id = "Communications";
@@ -20048,7 +20048,7 @@
},
/area/lv624/ground/caves/sand_temple)
"ulp" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "Lazarus Landing";
phone_color = "red";
phone_id = "Secure Storage";
diff --git a/maps/map_files/LV624/armory/10.cheese.dmm b/maps/map_files/LV624/armory/10.cheese.dmm
index af57be0474..b16499db31 100644
--- a/maps/map_files/LV624/armory/10.cheese.dmm
+++ b/maps/map_files/LV624/armory/10.cheese.dmm
@@ -17,7 +17,7 @@
},
/area/lv624/lazarus/main_hall)
"d" = (
-/obj/item/phone{
+/obj/item/handset{
desc = "A model of an ancient Earth communication device.";
force = 8
},
diff --git a/maps/map_files/LV624/armory/10.extra.dmm b/maps/map_files/LV624/armory/10.extra.dmm
index 6ac8be8435..e407d06c85 100644
--- a/maps/map_files/LV624/armory/10.extra.dmm
+++ b/maps/map_files/LV624/armory/10.extra.dmm
@@ -17,7 +17,7 @@
},
/area/lv624/lazarus/main_hall)
"d" = (
-/obj/item/phone{
+/obj/item/handset{
desc = "A model of an ancient Earth communication device.";
force = 8
},
diff --git a/maps/map_files/LV624/armory/10.looted.dmm b/maps/map_files/LV624/armory/10.looted.dmm
index cf9c2d141a..40e2637415 100644
--- a/maps/map_files/LV624/armory/10.looted.dmm
+++ b/maps/map_files/LV624/armory/10.looted.dmm
@@ -18,7 +18,7 @@
},
/area/lv624/lazarus/main_hall)
"d" = (
-/obj/item/phone{
+/obj/item/handset{
desc = "A model of an ancient Earth communication device.";
force = 8
},
diff --git a/maps/map_files/LV624/medbay/10.destroyed.dmm b/maps/map_files/LV624/medbay/10.destroyed.dmm
index bf310be7dd..d0f71603dd 100644
--- a/maps/map_files/LV624/medbay/10.destroyed.dmm
+++ b/maps/map_files/LV624/medbay/10.destroyed.dmm
@@ -129,7 +129,7 @@
/obj/structure/machinery/light{
dir = 4
},
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Lazarus Landing";
phone_id = "Medbay"
},
diff --git a/maps/map_files/LV624/medbay/30.larvasurgery.dmm b/maps/map_files/LV624/medbay/30.larvasurgery.dmm
index 613b76c3e2..7a773c4c6d 100644
--- a/maps/map_files/LV624/medbay/30.larvasurgery.dmm
+++ b/maps/map_files/LV624/medbay/30.larvasurgery.dmm
@@ -515,7 +515,7 @@
/obj/structure/machinery/light{
dir = 4
},
-/obj/structure/transmitter/colony_net/rotary{
+/obj/structure/phone_base/colony_net/rotary{
phone_category = "Lazarus Landing";
phone_id = "Medbay"
},
diff --git a/maps/map_files/LV624/science/10.yautja.dmm b/maps/map_files/LV624/science/10.yautja.dmm
index 7c8df9531d..52130f95fc 100644
--- a/maps/map_files/LV624/science/10.yautja.dmm
+++ b/maps/map_files/LV624/science/10.yautja.dmm
@@ -172,7 +172,7 @@
dir = 8
},
/obj/effect/landmark/crap_item,
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "Lazarus Landing";
phone_id = "Research Dome";
pixel_y = 24
diff --git a/maps/map_files/LV624/science/40.fullylocked.dmm b/maps/map_files/LV624/science/40.fullylocked.dmm
index 1957d6fef0..b6124474f9 100644
--- a/maps/map_files/LV624/science/40.fullylocked.dmm
+++ b/maps/map_files/LV624/science/40.fullylocked.dmm
@@ -409,7 +409,7 @@
},
/area/lv624/lazarus/research)
"oe" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
phone_category = "Lazarus Landing";
phone_id = "Research Dome";
pixel_y = 24
diff --git a/maps/map_files/LV624/standalone/clfship.dmm b/maps/map_files/LV624/standalone/clfship.dmm
index e69c2de5bc..2700593a2a 100644
--- a/maps/map_files/LV624/standalone/clfship.dmm
+++ b/maps/map_files/LV624/standalone/clfship.dmm
@@ -161,7 +161,7 @@
},
/area/lv624/lazarus/crashed_ship)
"fA" = (
-/obj/structure/transmitter/clf_net{
+/obj/structure/phone_base/clf_net{
phone_category = "CR-116";
phone_id = "Armoury";
pixel_y = 32
@@ -664,7 +664,7 @@
"sI" = (
/obj/structure/surface/table/reinforced/prison,
/obj/effect/spawner/random/toolbox,
-/obj/structure/transmitter/clf_net/rotary{
+/obj/structure/phone_base/clf_net/rotary{
phone_category = "CR-116";
phone_color = "yellow";
phone_id = "Engineering"
@@ -1657,7 +1657,7 @@
/area/lv624/lazarus/crashed_ship)
"Qj" = (
/obj/structure/machinery/body_scanconsole,
-/obj/structure/transmitter/clf_net{
+/obj/structure/phone_base/clf_net{
phone_category = "CR-116";
phone_color = "green";
phone_id = "Medical Bay";
@@ -1987,7 +1987,7 @@
},
/area/lv624/lazarus/crashed_ship)
"XM" = (
-/obj/structure/transmitter/clf_net{
+/obj/structure/phone_base/clf_net{
phone_category = "CR-116";
phone_id = "Cargo Bay";
pixel_y = 32
diff --git a/maps/map_files/LV624/standalone/laststand.dmm b/maps/map_files/LV624/standalone/laststand.dmm
index 43201f92cb..ebdb595397 100644
--- a/maps/map_files/LV624/standalone/laststand.dmm
+++ b/maps/map_files/LV624/standalone/laststand.dmm
@@ -404,7 +404,7 @@
/turf/open/floor/wood,
/area/lv624/ground/caves/north_central_caves)
"Yc" = (
-/obj/structure/transmitter/colony_net{
+/obj/structure/phone_base/colony_net{
pixel_y = 32;
phone_category = "Lazarus Landing";
phone_id = "Lakeside Bar"
diff --git a/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm b/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm
index 328e450fba..d34d18de84 100644
--- a/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm
+++ b/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm
@@ -1306,7 +1306,7 @@
/area/strata/ug/interior)
"adR" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -4512,7 +4512,7 @@
/area/strata/ag/interior/research_decks/security)
"anv" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -4540,7 +4540,7 @@
/area/strata/ag/exterior/research_decks)
"anz" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -4819,7 +4819,7 @@
/area/strata/ag/interior/outpost/security)
"aoD" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -6165,7 +6165,7 @@
/area/strata/ag/interior/outpost/security)
"asB" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -6252,7 +6252,7 @@
/area/strata/ag/interior/outpost/canteen/lower_cafeteria)
"asP" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -7055,7 +7055,7 @@
"avj" = (
/obj/structure/surface/table/reinforced/prison,
/obj/item/device/flashlight/lamp,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -7274,7 +7274,7 @@
dir = 8
},
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -8812,7 +8812,7 @@
/area/strata/ag/interior/outpost/security)
"aAC" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -8842,7 +8842,7 @@
"aAG" = (
/obj/structure/surface/table/reinforced/prison,
/obj/item/device/flashlight/lamp,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -12599,7 +12599,7 @@
pixel_x = -10
},
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -14807,7 +14807,7 @@
/area/strata/ag/interior/outpost/admin)
"aTN" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -15826,7 +15826,7 @@
/area/strata/ag/interior/mountain)
"aXH" = (
/obj/structure/surface/table,
-/obj/item/phone,
+/obj/item/handset,
/turf/open/floor/strata,
/area/strata/ag/interior/dorms/south)
"aXI" = (
@@ -17987,7 +17987,7 @@
/area/strata/ag/exterior/paths/adminext)
"bfF" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -20087,7 +20087,7 @@
"bnI" = (
/obj/structure/surface/table/reinforced/prison,
/obj/item/paper_bin,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -21469,7 +21469,7 @@
/area/strata/ag/interior/outpost/admin)
"bsH" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -23500,7 +23500,7 @@
/area/strata/ag/interior/outpost/med)
"bBY" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -23736,7 +23736,7 @@
/obj/item/paper_bin,
/obj/item/tool/pen/blue,
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -24098,7 +24098,7 @@
/area/strata/ag/interior/outpost/med)
"bGx" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -24569,7 +24569,7 @@
/area/strata/ag/interior/outpost/med)
"bJW" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -27900,7 +27900,7 @@
/obj/structure/surface/table/reinforced/prison,
/obj/item/paper_bin,
/obj/item/tool/pen/blue,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -28071,7 +28071,7 @@
/area/strata/ag/interior/outpost/engi/drome/shuttle)
"clr" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -29755,7 +29755,7 @@
dir = 1
},
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -31540,7 +31540,7 @@
/obj/structure/surface/table/reinforced/prison,
/obj/item/paper_bin,
/obj/item/tool/pen/blue,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -31654,7 +31654,7 @@
"gkA" = (
/obj/structure/surface/table/reinforced/prison,
/obj/item/device/flashlight/lamp,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -32113,7 +32113,7 @@
/area/strata/ag/exterior/research_decks)
"haw" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
@@ -37528,7 +37528,7 @@
/area/strata/ag/interior/mountain)
"qzf" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/item/phone{
+/obj/item/handset{
pixel_x = 8;
pixel_y = 6
},
diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm
index 91450070b8..c1cd06182d 100644
--- a/maps/map_files/USS_Almayer/USS_Almayer.dmm
+++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm
@@ -1576,7 +1576,7 @@
/area/almayer/shipboard/starboard_missiles)
"afb" = (
/obj/structure/surface/table/reinforced/almayer_B,
-/obj/structure/transmitter{
+/obj/structure/phone_base{
dir = 4;
name = "Starboard Railgun Control Telephone";
phone_category = "Command";
@@ -5561,7 +5561,7 @@
/obj/structure/pipes/standard/manifold/hidden/supply{
dir = 4
},
-/obj/structure/transmitter{
+/obj/structure/phone_base{
dir = 8;
name = "OT Telephone";
phone_category = "Almayer";
@@ -6983,7 +6983,7 @@
unacidable = 1;
unslashable = 1
},
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "AI Reception Telephone";
phone_category = "ARES";
phone_color = "blue";
@@ -10373,7 +10373,7 @@
/obj/effect/decal/warning_stripes{
icon_state = "S"
},
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "Researcher Office Telephone";
phone_category = "Almayer";
phone_id = "Research";
@@ -12001,7 +12001,7 @@
/turf/closed/wall/almayer,
/area/almayer/hallways/starboard_umbilical)
"aQy" = (
-/obj/structure/transmitter{
+/obj/structure/phone_base{
dir = 8;
name = "RO Office Telephone";
phone_category = "Offices";
@@ -19162,14 +19162,14 @@
pixel_x = -17
},
/obj/structure/surface/table/almayer,
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "Telephone";
phone_category = "Almayer";
phone_id = "Auxiliary Support Office Second Line";
pixel_x = -5;
pixel_y = 3
},
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "Telephone";
phone_category = "Almayer";
phone_id = "Auxiliary Support Office";
@@ -25705,7 +25705,7 @@
pixel_x = -6;
pixel_y = -5
},
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "Flight Deck Telephone";
phone_category = "Almayer";
phone_id = "Flight Deck";
@@ -30126,7 +30126,7 @@
},
/obj/item/reagent_container/food/condiment/enzyme,
/obj/item/reagent_container/food/condiment/enzyme,
-/obj/structure/transmitter{
+/obj/structure/phone_base{
name = "Kitchen Telephone";
phone_category = "Almayer";
phone_id = "Kitchen";
@@ -34010,7 +34010,7 @@
/area/almayer/medical/medical_science)
"eSJ" = (
/obj/structure/surface/table/woodentable/fancy,
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "Captain's Office";
phone_category = "Offices";
phone_id = "Captain's Office";
@@ -34626,7 +34626,7 @@
"ffV" = (
/obj/structure/surface/table/almayer,
/obj/structure/machinery/computer/crew/alt,
-/obj/structure/transmitter/rotary/no_dnd{
+/obj/structure/phone_base/rotary/no_dnd{
name = "Brig Cells Telephone";
phone_category = "Almayer";
phone_id = "Brig Cells";
@@ -36627,7 +36627,7 @@
department = "AI Core";
pixel_y = 8
},
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "AI Core Telephone";
phone_category = "ARES";
phone_color = "blue";
@@ -37479,7 +37479,7 @@
/area/almayer/command/cichallway)
"gtA" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/structure/transmitter{
+/obj/structure/phone_base{
dir = 8;
name = "Medical Telephone";
phone_category = "Almayer";
@@ -39952,7 +39952,7 @@
pixel_x = 5
},
/obj/structure/surface/table/reinforced/black,
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "CIC Reception Telephone";
phone_category = "Command";
phone_id = "CIC Reception";
@@ -41307,7 +41307,7 @@
},
/area/almayer/medical/lower_medical_medbay)
"hZU" = (
-/obj/structure/transmitter{
+/obj/structure/phone_base{
name = "Brig Offices Telephone";
phone_category = "Almayer";
phone_id = "Brig Main Offices";
@@ -41764,7 +41764,7 @@
pixel_x = 8;
pixel_y = -4
},
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "Senior Enlisted Advisor Office Telephone";
phone_category = "Almayer";
phone_id = "Senior Enlisted Advisor's Office";
@@ -43988,7 +43988,7 @@
/obj/structure/surface/table/almayer,
/obj/effect/landmark/map_item,
/obj/item/folder/red,
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "Brig CMP's Office Telephone";
phone_category = "Offices";
phone_id = "Brig CMP's Office";
@@ -45990,7 +45990,7 @@
unacidable = 1;
unslashable = 1
},
-/obj/structure/transmitter{
+/obj/structure/phone_base{
dir = 1;
name = "Brig Warden's Office Telephone";
phone_category = "Offices";
@@ -46299,7 +46299,7 @@
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 10
},
-/obj/structure/transmitter{
+/obj/structure/phone_base{
name = "CMO Office Telephone";
phone_category = "Offices";
phone_id = "CMO Office";
@@ -48101,7 +48101,7 @@
},
/area/almayer/hallways/aft_hallway)
"kSU" = (
-/obj/structure/transmitter/no_dnd{
+/obj/structure/phone_base/no_dnd{
name = "Requisition Telephone";
phone_category = "Almayer";
phone_id = "Requisition";
@@ -50677,7 +50677,7 @@
pixel_x = -17;
pixel_y = 16
},
-/obj/structure/transmitter/rotary/no_dnd{
+/obj/structure/phone_base/rotary/no_dnd{
name = "Alpha Overwatch Telephone";
phone_category = "Command";
phone_id = "Alpha Overwatch"
@@ -54503,7 +54503,7 @@
},
/area/almayer/hull/lower_hull/l_f_s)
"nDh" = (
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "CL Office Telephone";
phone_category = "Almayer";
phone_id = "CL Office"
@@ -58707,7 +58707,7 @@
pixel_y = 28
},
/obj/structure/surface/table/reinforced/almayer_B,
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "Intelligence Center Telephone";
phone_category = "Almayer";
phone_id = "Intelligence Center Telephone"
@@ -65440,7 +65440,7 @@
pixel_x = -17;
pixel_y = -17
},
-/obj/structure/transmitter/rotary/no_dnd{
+/obj/structure/phone_base/rotary/no_dnd{
name = "Delta Overwatch Telephone";
phone_category = "Command";
phone_id = "Delta Overwatch"
@@ -66792,7 +66792,7 @@
/obj/structure/machinery/light{
dir = 1
},
-/obj/structure/transmitter/rotary/no_dnd{
+/obj/structure/phone_base/rotary/no_dnd{
name = "Charlie Overwatch Telephone";
phone_category = "Command";
phone_id = "Charlie Overwatch"
@@ -67587,7 +67587,7 @@
dir = 4;
layer = 3.25
},
-/obj/structure/transmitter{
+/obj/structure/phone_base{
name = "CE Office Telephone";
phone_category = "Offices";
phone_id = "CE Office";
@@ -69696,7 +69696,7 @@
pixel_y = 15
},
/obj/structure/machinery/light,
-/obj/structure/transmitter/rotary/no_dnd{
+/obj/structure/phone_base/rotary/no_dnd{
name = "Bravo Overwatch Telephone";
phone_category = "Command";
phone_id = "Bravo Overwatch"
@@ -73872,7 +73872,7 @@
pixel_y = -5;
req_one_access_txt = "1;4"
},
-/obj/structure/transmitter/rotary/no_dnd{
+/obj/structure/phone_base/rotary/no_dnd{
name = "Combat Information Center Telephone";
phone_category = "Command";
phone_id = "Combat Information Center";
@@ -75727,7 +75727,7 @@
pixel_x = 7;
pixel_y = 29
},
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "Reporter Telephone";
phone_category = "Almayer";
phone_id = "Reporter";
@@ -80027,7 +80027,7 @@
/area/almayer/hull/lower_hull/l_a_s)
"ybZ" = (
/obj/structure/surface/table/reinforced/almayer_B,
-/obj/structure/transmitter{
+/obj/structure/phone_base{
dir = 4;
name = "Port Railgun Control Telephone";
phone_category = "Command";
diff --git a/maps/map_files/generic/Admin_level.dmm b/maps/map_files/generic/Admin_level.dmm
index 43b3d26ec3..88182faf3b 100644
--- a/maps/map_files/generic/Admin_level.dmm
+++ b/maps/map_files/generic/Admin_level.dmm
@@ -662,7 +662,7 @@
/turf/open/space/transit/east/shuttlespace_ew8,
/area/space)
"qu" = (
-/obj/structure/transmitter/hidden{
+/obj/structure/phone_base/hidden{
dir = 8;
name = "Station Telephone";
phone_id = "Unknown Signal";
diff --git a/maps/map_files/golden_arrow/golden_arrow.dmm b/maps/map_files/golden_arrow/golden_arrow.dmm
index 71575c902c..16bf4fdbc0 100644
--- a/maps/map_files/golden_arrow/golden_arrow.dmm
+++ b/maps/map_files/golden_arrow/golden_arrow.dmm
@@ -3126,6 +3126,8 @@
/obj/structure/closet/secure_closet/personal/cabinet{
req_access = null
},
+/obj/item/clothing/suit/storage/jacket/marine/service,
+/obj/item/clothing/suit/storage/jacket/marine/service/tanker,
/turf/open/floor/almayer{
icon_state = "plate"
},
@@ -4247,7 +4249,7 @@
layer = 2.1
},
/obj/structure/sign/safety/manualopenclose{
- layer = 4.3;
+ layer = 2.11;
pixel_x = 12;
pixel_y = 2
},
@@ -4343,6 +4345,9 @@
},
/area/almayer/engineering)
"Bu" = (
+/obj/item/ammo_magazine/sentry{
+ layer = 3.01
+ },
/obj/item/defenses/handheld/sentry,
/turf/open/floor/almayer{
icon_state = "plate"
@@ -4575,6 +4580,9 @@
pixel_y = 4
},
/obj/item/device/motiondetector,
+/obj/item/attachable/attached_gun/extinguisher/pyro{
+ layer = 3.01
+ },
/turf/open/floor/almayer{
icon_state = "plate"
},
@@ -6343,6 +6351,9 @@
pixel_x = 14;
pixel_y = 29
},
+/obj/item/ammo_magazine/sentry{
+ layer = 3.01
+ },
/obj/item/defenses/handheld/sentry,
/turf/open/floor/almayer{
icon_state = "plate"
@@ -6785,7 +6796,7 @@
pixel_x = -17;
pixel_y = 16
},
-/obj/structure/transmitter/rotary/no_dnd{
+/obj/structure/phone_base/rotary/no_dnd{
name = "Alpha Overwatch Telephone";
phone_category = "Command";
phone_id = "Alpha Overwatch"
@@ -8074,6 +8085,9 @@
/obj/item/ammo_magazine/flamer_tank,
/obj/item/ammo_magazine/flamer_tank,
/obj/item/device/motiondetector,
+/obj/item/attachable/attached_gun/extinguisher/pyro{
+ layer = 3.01
+ },
/turf/open/floor/almayer{
icon_state = "plate"
},
diff --git a/maps/shuttles/dropship_alamo.dmm b/maps/shuttles/dropship_alamo.dmm
index 7c49edfdd0..ea14641a75 100644
--- a/maps/shuttles/dropship_alamo.dmm
+++ b/maps/shuttles/dropship_alamo.dmm
@@ -382,7 +382,7 @@
/area/shuttle/drop1/sulaco)
"Ho" = (
/obj/structure/machinery/computer/dropship_weapons/dropship1,
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "Alamo Telephone";
phone_category = "Dropship";
phone_id = "Alamo";
diff --git a/maps/shuttles/dropship_normandy.dmm b/maps/shuttles/dropship_normandy.dmm
index f1595cd97d..55d07883e3 100644
--- a/maps/shuttles/dropship_normandy.dmm
+++ b/maps/shuttles/dropship_normandy.dmm
@@ -156,7 +156,7 @@
/area/shuttle/drop2/sulaco)
"lH" = (
/obj/structure/machinery/computer/dropship_weapons/dropship2,
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "Normandy Telephone";
phone_category = "Dropship";
phone_id = "Normandy";
diff --git a/maps/templates/clf_ert_station.dmm b/maps/templates/clf_ert_station.dmm
index 7347be914d..aa48ff8d9f 100644
--- a/maps/templates/clf_ert_station.dmm
+++ b/maps/templates/clf_ert_station.dmm
@@ -1654,7 +1654,7 @@
/obj/item/spacecash/c1,
/obj/item/storage/box/matches,
/obj/structure/surface/table/woodentable/fancy,
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "CLF Outpost";
phone_category = "CLF";
phone_id = "CLF Outpost";
diff --git a/maps/templates/upp_ert_station.dmm b/maps/templates/upp_ert_station.dmm
index ae2a8ad40c..6db27a83e6 100644
--- a/maps/templates/upp_ert_station.dmm
+++ b/maps/templates/upp_ert_station.dmm
@@ -876,7 +876,7 @@
/area/adminlevel/ert_station/upp_station)
"mG" = (
/obj/structure/surface/table/reinforced/black,
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
name = "UPP Station";
phone_category = "UPP";
phone_id = "UPP Station";
diff --git a/maps/templates/weyland_ert_station.dmm b/maps/templates/weyland_ert_station.dmm
index 1937aa6a61..82fe23c5bc 100644
--- a/maps/templates/weyland_ert_station.dmm
+++ b/maps/templates/weyland_ert_station.dmm
@@ -2794,7 +2794,7 @@
/area/adminlevel/ert_station/weyland_station)
"Js" = (
/obj/structure/surface/table/reinforced/black,
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
do_not_disturb = 2;
name = "Weyland-Yutani Station CiC";
phone_category = "W-Y";
@@ -3587,7 +3587,7 @@
/area/adminlevel/ert_station/weyland_station)
"SE" = (
/obj/structure/surface/table/woodentable/fancy,
-/obj/structure/transmitter/rotary{
+/obj/structure/phone_base/rotary{
do_not_disturb = 2;
name = "Weyland-Yutani Station Meeting Room";
phone_category = "W-Y";
diff --git a/maps/tents/tent_cmd.dmm b/maps/tents/tent_cmd.dmm
index 0dbd6a6ef3..2349142770 100644
--- a/maps/tents/tent_cmd.dmm
+++ b/maps/tents/tent_cmd.dmm
@@ -21,7 +21,7 @@
dir = 1
},
/obj/structure/surface/table,
-/obj/structure/transmitter/tent{
+/obj/structure/phone_base/tent{
phone_category = "Command";
phone_id = "Ground Command";
pixel_x = -2;
diff --git a/maps/tents/tent_reqs.dmm b/maps/tents/tent_reqs.dmm
index 2dc47531ed..d5dcd1d51a 100644
--- a/maps/tents/tent_reqs.dmm
+++ b/maps/tents/tent_reqs.dmm
@@ -53,7 +53,7 @@
dir = 8
},
/obj/structure/bed/chair,
-/obj/structure/transmitter/tent{
+/obj/structure/phone_base/tent{
pixel_y = 30;
pixel_x = 16;
phone_category = "Command";
diff --git a/tgui/packages/tgui/interfaces/GameMaster.js b/tgui/packages/tgui/interfaces/GameMaster.js
index 815e37dd05..631affd9a6 100644
--- a/tgui/packages/tgui/interfaces/GameMaster.js
+++ b/tgui/packages/tgui/interfaces/GameMaster.js
@@ -58,6 +58,14 @@ export const GameMaster = (props, context) => {
+
+
@@ -81,7 +89,7 @@ export const GameMaster = (props, context) => {