Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion code/controllers/subsystem/sounds.dm
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,8 @@ SUBSYSTEM_DEF(sounds)
PRIVATE_PROC(TRUE)

using_channels_by_datum -= D
UnregisterSignal(D, COMSIG_PARENT_QDELETING)
if(D != DATUMLESS)
UnregisterSignal(D, COMSIG_PARENT_QDELETING)

/// Handles a tracked datum being deleted, automatically freeing the channels.
/datum/controller/subsystem/sounds/proc/tracked_datum_deleted(datum/source)
Expand Down
2 changes: 1 addition & 1 deletion code/datums/sound_token.dm
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@

var/is_muted = listeners[M] & SOUND_MUTE
var/should_be_muted = FALSE
if(!source_turf || !listener_turf)
if(!(source_turf && listener_turf) || source_turf.z != listener_turf.z)
should_be_muted = TRUE
if(should_be_muted && is_muted)
return
Expand Down
64 changes: 64 additions & 0 deletions code/modules/flockmind/actions/narrowbeam_transmission.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/datum/action/cooldown/flock/radio_talk
name = "Narrowbeam Transmission"
desc = "Hijack a radio headset of a target to broadcast a message."
button_icon_state = "talk"
cooldown_time = 2 SECONDS
click_to_activate = TRUE

/datum/action/cooldown/flock/radio_talk/Activate(atom/target)
var/obj/item/radio/radio_target

if(!ishuman(target) && !istype(target, /obj/item/radio))
to_chat(owner, span_warning("[target] is not a valid target."))
return FALSE

if(istype(target, /obj/item/radio))
radio_target = target
if(!radio_target.get_listening())
to_chat(owner, span_warning("[target] is not turned on."))
return FALSE

if(radio_target.canhear_range == -1)
to_chat(owner, span_warning("[target] is not a valid target."))
return FALSE

if(ishuman(target))
var/mob/living/carbon/human/schmuck = target
for(var/obj/item/I in schmuck.get_contents())
if(istype(I, /obj/item/radio))
radio_target = I
break

if(!istype(radio_target) || !radio_target.get_listening() || radio_target.canhear_range == -1)
to_chat(owner, span_warning("[target] does not have a working radio."))
return FALSE

var/msg = uppertext(tgui_input_text(usr, "What do you wish to broadcast?", "Narrowbeam Transmission", ""))
if(!msg)
return FALSE

. = ..()

playsound(get_turf(radio_target), pick('goon/sounds/radio_sweep1.ogg','goon/sounds/radio_sweep2.ogg','goon/sounds/radio_sweep3.ogg','goon/sounds/radio_sweep4.ogg','goon/sounds/radio_sweep5.ogg'), 20, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
to_chat(owner, span_notice("You transmit a message through [radio_target]."))

if(radio_target == target)
msg = Gibberish(msg, 70, 50)

var/atom/movable/virtualspeaker/speaker = new(null, null)
speaker.name = "Unknown"

var/rendered = speaker.compose_message(speaker, GET_LANGUAGE_DATUM(/datum/language/common), msg, FREQ_COMMON, list("flocksay", SPAN_ITALICS), list())

for(var/atom/movable/hearer in get_hearers_in_LOS(radio_target.canhear_range, radio_target))
hearer.Hear(
rendered,
speaker,
GET_LANGUAGE_DATUM(/datum/language/common),
msg,
FREQ_COMMON,
list("flocksay", SPAN_ITALICS), // spans
list(), // message mods
sound_loc = radio_target.speaker_location(),
message_range = INFINITY
)
2 changes: 1 addition & 1 deletion code/modules/flockmind/actions/radio_blast.dm
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@

for(var/mob/living/carbon/human/guy as anything in targets)
to_chat(guy, span_alert("Horrifying static bursts into your headset, disorienting you severely!"))
playsound(guy, "sound/effects/radio_sweep[rand(1,5)].ogg", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
playsound(guy, pick('goon/sounds/radio_sweep1.ogg','goon/sounds/radio_sweep2.ogg','goon/sounds/radio_sweep3.ogg','goon/sounds/radio_sweep4.ogg','goon/sounds/radio_sweep5.ogg'), 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
guy.Knockdown(3 SECONDS)
guy.set_confusion_if_lower(20 SECONDS)
guy.do_jitter_animation(10)
Expand Down
5 changes: 5 additions & 0 deletions code/modules/flockmind/ai_behaviors/flock_wander.dm
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@
. = ..()
controller.set_blackboard_key(BB_PATH_MAX_LENGTH, 4)

/datum/ai_behavior/move_to_target/flock_wander/perform(delta_time, datum/ai_controller/controller)
. = ..()
var/mob/living/simple_animal/flock/drone/bird = controller.pawn
bird.set_task_desc("wandering")

/datum/ai_behavior/move_to_target/flock_wander/finish_action(datum/ai_controller/controller, succeeded, ...)
. = ..()
controller.clear_blackboard_key(BB_FLOCK_WANDER_FRUSTRATION)
Expand Down
3 changes: 3 additions & 0 deletions code/modules/flockmind/flock_camera/_flock_camera.dm
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@
move_on_shuttle = FALSE
movement_type = PHASING

chat_color = "#6fbbac"
chat_color_darkened = "#6fbbac"

var/datum/flock/flock
var/list/actions_to_grant = list()

Expand Down
1 change: 1 addition & 0 deletions code/modules/flockmind/flock_camera/flock_overmind.dm
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
/datum/action/cooldown/flock/ping,
/datum/action/cooldown/flock/radio_blast,
/datum/action/cooldown/flock/gatecrash,
/datum/action/cooldown/flock/radio_talk
)

/mob/camera/flock/overmind/Initialize(mapload, join_flock)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,7 @@
/// Pings a location, alerting all flocktraces.
/datum/flock/proc/ping(turf/T, mob/camera/flock/pinger)
var/message = "System interrupt. Designating new target: [T] in [get_area(T)]."
flock_talk(pinger, message, src, TRUE, list("italics"))
flock_talk(pinger, message, src, TRUE, list("italics"), runechat = FALSE)
T.AddComponent(/datum/component/flock_ping, 5 SECONDS)

for(var/mob/camera/flock/ghost_bird in (traces + overmind))
Expand Down
2 changes: 1 addition & 1 deletion code/modules/flockmind/flock_mob/flock_mob.dm
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@

language = GET_LANGUAGE_DATUM(language) || get_selected_language()
if(flock && istype(language, /datum/language/flock))
flock_talk(src, message, flock, forced)
flock_talk(src, message, flock, forced, runechat = FALSE)

// changing the default arg value here
/mob/living/simple_animal/flock/treat_message(message, correct_grammar = FALSE)
Expand Down
15 changes: 11 additions & 4 deletions code/modules/flockmind/flock_say.dm
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,17 @@
avoid_highlighting = speaker == src
)

/proc/flock_talk(atom/speaker, message, datum/flock/flock, involuntary, list/inner_spans)
/proc/flock_talk(atom/speaker, raw_message, datum/flock/flock, involuntary, list/inner_spans, runechat = TRUE)

message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN))
if (!message)
raw_message = trim(copytext_char(sanitize(raw_message), 1, MAX_MESSAGE_LEN))
if (!raw_message)
return

var/message = raw_message
var/silicon_message = stars(raw_message, 50)
if(inner_spans)
message = attach_spans(message, inner_spans)
silicon_message = attach_spans(silicon_message, inner_spans)

var/used_name = ""
var/list/spans = list("flocksay")
Expand Down Expand Up @@ -80,7 +83,6 @@
var/mob/camera/flock/overmind/ghost_bird = speaker
used_name = ghost_bird.real_name

var/silicon_message = stars(message, 50)
if(mob_speaker)
var/say_verb = pick("sings", "clicks", "whistles", "intones", "transmits", "submits", "uploads")
message = "[say_verb], \"[message]\""
Expand All @@ -95,12 +97,17 @@
for(var/mob/player as anything in GLOB.player_list)
if(isflockmob(player))
to_chat(player, flock_message)
if(speaker && runechat && (mob_speaker ? player.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) : player.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs)))
player.create_chat_message(speaker, GET_LANGUAGE_DATUM(/datum/language/flock), raw_message)
continue

if(isobserver(player) && !involuntary)
to_chat(player, flock_message)
if(speaker && runechat && (mob_speaker ? player.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) : player.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs)))
player.create_chat_message(speaker, GET_LANGUAGE_DATUM(/datum/language/flock), raw_message)
continue

// Snooping in-round mobs don't get the runechat.
if(player.can_hear() && player.binarycheck() && (!involuntary && speaker || prob(30)))
to_chat(player, silicon_message)
continue
1 change: 1 addition & 0 deletions daedalus.dme
Original file line number Diff line number Diff line change
Expand Up @@ -3196,6 +3196,7 @@
#include "code\modules\flockmind\actions\diffract_drone.dm"
#include "code\modules\flockmind\actions\gatecrash.dm"
#include "code\modules\flockmind\actions\heal.dm"
#include "code\modules\flockmind\actions\narrowbeam_transmission.dm"
#include "code\modules\flockmind\actions\nest.dm"
#include "code\modules\flockmind\actions\partition_mind.dm"
#include "code\modules\flockmind\actions\ping.dm"
Expand Down
Loading