Kitchen Sink PR (#17515)

* insanity

- Crawling
- Recursive Listeners
- Global Conversion to GLOB.
- Sound channels (and sound (but not looping sound yet))
- Species and gender specific sounds
- Admin proc to enable vore antag on a target
- Dying by being crushed inside of shoes now enables your vore_death flag
- *pain emote
- RNG Spaceslipping removed
- Selecting the groin with help intent will do a bellyrub on the target
- Xenochimera get lick wounds
- Wolves now get stomachs (and stomach overlays)
- Proper vantag handling
- Staff exiting will now notify staff
- Modular computers get a power on sound now

GET IN THERE

* whoops forgot to give it to mobs

* Bellyrubbing is now an emote

* Update vorestation.dme

* some small edits

actually gives voice freq a valid starting selection
makes the default voice less jarring

* Update atoms_movable.dm

* Update atoms_movable.dm
This commit is contained in:
Cameron Lennox
2025-04-25 16:21:35 -04:00
committed by GitHub
parent 4e2e0b77c6
commit d0787362cd
337 changed files with 835 additions and 346 deletions
+79 -7
View File
@@ -1,5 +1,5 @@
#define CANBROADCAST_INNERBOX 0.7071067811865476 //This is sqrt(2)/2
// Access check is of the type requires one. These have been carefully selected to avoid allowing the janitor to see channels he shouldn't
//VOREStation Edit Start - Updating this for Virgo
var/global/list/default_internal_channels = list(
num2text(PUB_FREQ) = list(),
num2text(AI_FREQ) = list(access_synth),
@@ -14,7 +14,7 @@ var/global/list/default_internal_channels = list(
num2text(SCI_FREQ) = list(access_tox, access_robotics, access_xenobiology),
num2text(SUP_FREQ) = list(access_cargo, access_mining_station),
num2text(SRV_FREQ) = list(access_janitor, access_library, access_hydroponics, access_bar, access_kitchen),
num2text(EXP_FREQ) = list(access_explorer) //VOREStation Edit
num2text(EXP_FREQ) = list(access_explorer)
)
var/global/list/default_medbay_channels = list(
@@ -22,7 +22,6 @@ var/global/list/default_medbay_channels = list(
num2text(MED_FREQ) = list(),
num2text(MED_I_FREQ) = list()
)
//VOREStation Edit End
/obj/item/radio
icon = 'icons/obj/radio_vr.dmi'
@@ -298,7 +297,7 @@ var/global/list/default_medbay_channels = list(
GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer)
/obj/item/radio/proc/autosay(var/message, var/from, var/channel, var/list/zlevels, var/states) //VOREStation Edit
/obj/item/radio/proc/autosay(var/message, var/from, var/channel, var/list/zlevels, var/states)
if(!GLOB.autospeaker)
return
@@ -315,15 +314,13 @@ GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer)
if(!LAZYLEN(zlevels))
zlevels = list(0)
//VOREStation Edit Start
if(!states)
states = "states"
//VOREStation Edit End
GLOB.autospeaker.SetName(from)
Broadcast_Message(connection, GLOB.autospeaker,
0, "*garbled automated announcement*", src,
message_to_multilingual(message, GLOB.all_languages[LANGUAGE_GALCOM]), from, "Automated Announcement", from, "synthesized voice",
DATA_FAKE, 0, zlevels, connection.frequency, states) //VOREStation Edit
DATA_FAKE, 0, zlevels, connection.frequency, states)
// Interprets the message mode when talking into a radio, possibly returning a connection datum
/obj/item/radio/proc/handle_message_mode(mob/living/M as mob, list/message_pieces, message_mode)
@@ -769,3 +766,78 @@ GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer)
/obj/item/radio/phone/medbay/Initialize(mapload)
. = ..()
internal_channels = default_medbay_channels.Copy()
/obj/item/radio/proc/can_broadcast_to()
var/list/output = list()
var/turf/T = get_turf(src)
var/dnumber = canhear_range*CANBROADCAST_INNERBOX
for(var/cand_x = max(0, T.x - canhear_range), cand_x <= T.x + canhear_range, cand_x++)
for(var/cand_y = max(0, T.y - canhear_range), cand_y <= T.y + canhear_range, cand_y++)
var/turf/cand_turf = locate(cand_x,cand_y,T.z)
if(!cand_turf)
continue
if((abs(T.x - cand_x) < dnumber) || (abs(T.y - cand_y) < dnumber))
output += cand_turf
continue
if(sqrt((T.x - cand_x)**2 + (T.y - cand_y)**2) <= canhear_range)
output += cand_turf
continue
return output
/obj/item/radio/intercom
var/list/broadcast_tiles
/obj/item/radio/intercom/proc/update_broadcast_tiles()
var/list/output = list()
var/turf/T = get_turf(src)
if(!T)
return
var/dnumber = canhear_range*CANBROADCAST_INNERBOX
for(var/cand_x = max(0, T.x - canhear_range), cand_x <= T.x + canhear_range, cand_x++)
for(var/cand_y = max(0, T.y - canhear_range), cand_y <= T.y + canhear_range, cand_y++)
var/turf/cand_turf = locate(cand_x,cand_y,T.z)
if(!cand_turf)
continue
if((abs(T.x - cand_x) < dnumber) || (abs(T.y - cand_y) < dnumber))
output += cand_turf
continue
if(sqrt((T.x - cand_x)**2 + (T.y - cand_y)**2) <= canhear_range)
output += cand_turf
continue
broadcast_tiles = output
/obj/item/radio/intercom/forceMove(atom/destination)
. = ..()
update_broadcast_tiles()
/obj/item/radio/intercom/Initialize(mapload)
. = ..()
update_broadcast_tiles()
/obj/item/radio/intercom/can_broadcast_to()
if(!broadcast_tiles)
update_broadcast_tiles()
return broadcast_tiles
//*Subspace Radio*//
/obj/item/radio/subspace
adhoc_fallback = 1
canhear_range = 8
desc = "A heavy duty radio that can pick up all manor of shortwave and subspace frequencies. It's a bit bulkier than a normal radio thanks to the extra hardware."
description_info = "This radio can broadcast over any headset frequency that the user has access to. It has a shortwave fallback to directly broadcast to all radio equipment on the same Z-Level/Map in the event of a telecommunications failure. This device requires a functioning Telecommunications Network/Relay to send and receive signals meant for headsets. Additionally, the volume knob seems to be stuck on the max setting. You could hear this thing clear across a room... Not good for discretely listening in on secure channels or being stealthy!"
icon_state = "radio"
name = "subspace radio"
subspace_transmission = 1
throwforce = 5
throw_range = 7
throw_speed = 1
//* Bluespace Radio *//
/obj/item/bluespaceradio/southerncross_prelinked
name = "bluespace radio (southerncross)"
handset = /obj/item/radio/bluespacehandset/linked/southerncross_prelinked
/obj/item/radio/bluespacehandset/linked/southerncross_prelinked
bs_tx_preload_id = "Receiver A" //Transmit to a receiver
bs_rx_preload_id = "Broadcaster A" //Recveive from a transmitter
#undef CANBROADCAST_INNERBOX
@@ -116,7 +116,7 @@
/obj/item/perfect_tele/attack_self(mob/user, var/radial_menu_anchor = src)
if(loc_network)
for(var/obj/item/perfect_tele_beacon/stationary/nb in premade_tele_beacons)
for(var/obj/item/perfect_tele_beacon/stationary/nb in GLOB.premade_tele_beacons)
if(nb.tele_network == loc_network)
beacons[nb.tele_name] = nb
loc_network = null //Consumed
@@ -61,7 +61,7 @@ Frequency:
if (sr)
src.temp += span_bold("Located Beacons:") + "<BR>"
for(var/obj/item/radio/beacon/W in all_beacons)
for(var/obj/item/radio/beacon/W in GLOB.all_beacons)
if (W.frequency == src.frequency)
var/turf/tr = get_turf(W)
if (tr.z == sr.z && tr)
@@ -79,7 +79,7 @@ Frequency:
src.temp += "[W.code]-[dir2text(get_dir(sr, tr))]-[direct]<BR>"
src.temp += span_bold("Extraneous Signals:") + "<BR>"
for (var/obj/item/implant/tracking/W in all_tracking_implants)
for (var/obj/item/implant/tracking/W in GLOB.all_tracking_implants)
if (!W.implanted || !(istype(W.loc,/obj/item/organ/external) || ismob(W.loc) || W.malfunction))
continue
@@ -168,7 +168,7 @@ Frequency:
if ((user.get_active_hand() != src || user.stat || user.restrained()))
return
var/count = 0 //num of portals from this teleport in world
for(var/obj/effect/portal/PO in all_portals)
for(var/obj/effect/portal/PO in GLOB.all_portals)
if(PO.creator == src) count++
if(count >= 3)
user.show_message(span_notice("\The [src] is recharging!"))
-3
View File
@@ -186,9 +186,6 @@
/obj/proc/see_emote(mob/M as mob, text, var/emote_type)
return
/obj/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2)
return
// Used to mark a turf as containing objects that are dangerous to step onto.
/obj/proc/register_dangerous_to_step()
var/turf/T = get_turf(src)
+1 -1
View File
@@ -343,7 +343,7 @@ GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium)
if(..())
return
if(src.allowed(user))
for (var/obj/structure/morgue/crematorium/C in all_crematoriums)
for (var/obj/structure/morgue/crematorium/C in GLOB.all_crematoriums)
if (C.id == id)
if (!C.cremating)
C.cremate(user)