mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-20 18:47:20 +01:00
* LINDA -> MILLA * Tiles now change their atmos mode properly. * Fixed a bug that made walls generate supercold air when deconstructed/destroyed. * Apply suggestions from code review Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> Co-authored-by: GDN <96800819+GDNgit@users.noreply.github.com> Signed-off-by: Charlie Nolan <funnyman3595@gmail.com> * Begone, var! * MILLA -> milla * Lint. * More lint. * Prevent negative/NaN atmos from spreading. * Made fires start more reliably. * Undef what the rest should not see. * Enums are nice. * Match LINDA better. * Debugging verbs. * Debug verb fixes. * Labelled more lavaland stuff with ATMOS_MODE_LAVALAND * Block superconductivity on a couple more things for Lavaland. * Updated milla.dll * Lavaland map fixes. * Missed a spot. * Begone, var! (again) * Add libmilla_ci.so for continuous integration tests. * Install/contributing instructions for MILLA. * Directional plasmaglass windows on shuttles shouldn't stop protecting from heat after moving. * Banish bad naming. * Better naming and debug stats for SSair. * Apply suggestions from code review Co-authored-by: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com> Signed-off-by: Charlie Nolan <funnyman3595@gmail.com> * Magic numbers and formatting. * Don't screw up the temperature during reactions. * Efficiency and readability. * Fix hotspots. * Removed redundant safety (MILLA will already output an error) * Optimizations. * oops * TGS build script update. * Change API of gas_mixture and how you get one from a turf. * Get in there. * so many vars * MILLA binary updates. * Lint * Made MT cost more honest. * Gave MILLA a read-only mode. * More read-only vs synchronized mode work. * Even more. * Synchronize disposals. * Updated a bunch of stuff to use SSair.synchronize or GM.synchronize. * MILLA <3 Tracy * lint * cargo fmt * more lint * Test needed MILLA sync. * Silence atmos machinery that's behaving as intended, but continue objecting to other potential failures to synchronize. * Push new MILLA DLL * Build MILLA * Update PR instructions for MILLA. * Add some fancy plasmaglass windows to the Lifebringers' ship. * The golems remembered that they should insulate *all* their engines. * First round of TM bugfixes. * Build MILLA * fix two lavaland ruin turf types * bunch more maps * fixes milla ci and makes the interesting turf verb better * Solid turfs can no longer conduct heat (for now...) * Made indoor tiles in beach and winter biodomes not lavaland air. * Re-added random IT teleport, adjusted warning message * Fixed a tinted window on Lavaland to be a plasglass window instead. * Made firelocks and holofans heatproof * Made RPD auto-wrench pipes if you have a wrench in your offhand. * Runtime fixes. * Made visuals update more reliably. * Lint * Update .github/CONTRIBUTING.md Co-authored-by: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com> Signed-off-by: Charlie Nolan <funnyman3595@gmail.com> * Build MILLA * The Syndicate have installed tiny fans on their research base. * The syndicate have figured out how to make plastitanium windows heatproof. * This is getting out of hand. Now there are two of them. * Un-break the auto-wrenching that I broke before committing. * Build MILLA * Build MILLA * Massive MILLA refactor, assorted bugfixes. * Build MILLA * Explicit typing. * Less sleeping/blocking. * Build MILLA * Yes, yes, this part can sleep. * Build MILLA * SSair reporting improvements. * Build MILLA * Please do not dock twice and splat yourself. * Build MILLA * Pls to not make SM go nuts. * Build MILLA * Build MILLA * Added stricter lower bounds on plasmafire, fixing perpetually-burning SM. * Build MILLA * Lint * Temporary logging, begone. * Build MILLA * Prevent hotspot strobing. * Add in radiate_to_spess behavior. * Build MILLA * progress * Compiling is good. * bugfixes * Progress. * Ruins update. * This one exists. * Fixup temporary hotspots to last longer than one tick. * Add/fix comments. * Cut the slash. * Fix test. * No sleep for you. * Build MILLA * Prevent nested MILLA safety from runtiming. * Build MILLA * Runtime fix. * Build MILLA * Fix canisters not updating icon when gas contents change. * Build MILLA * Build MILLA * Fixed an issue that made mechs very cold on environment air. * Build MILLA * oops * Build MILLA * Walls can make loud noises again. * Build MILLA * Fixes a rare runtime. * Build MILLA * Update .github/DOWNLOADING.md Co-authored-by: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com> Signed-off-by: Charlie Nolan <funnyman3595@gmail.com> * Review suggestions * Lint * Build MILLA * bound_mixtures now only contains mixtures that can be written * Build MILLA * Apply suggestions from code review Co-authored-by: Matt <116982774+Burzah@users.noreply.github.com> Signed-off-by: Charlie Nolan <funnyman3595@gmail.com> * Build MILLA * Restore the original async behavior of pyro anomalies. * Build MILLA * Build MILLA * Make the safety assertion in /datum/milla_safe safer. * Build MILLA --------- Signed-off-by: Charlie Nolan <funnyman3595@gmail.com> Co-authored-by: FunnyMan3595 (Charlie Nolan) <funnyman@google.com> Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> Co-authored-by: GDN <96800819+GDNgit@users.noreply.github.com> Co-authored-by: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com> Co-authored-by: paradisess13[bot] <165046124+paradisess13[bot]@users.noreply.github.com> Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Co-authored-by: GDN <Roanrichards1@Gmail.com>
216 lines
7.5 KiB
Plaintext
216 lines
7.5 KiB
Plaintext
// At minimum every mob has a hear_say proc.
|
|
|
|
/mob/proc/combine_message(list/message_pieces, verb, atom/movable/speaker, always_stars = FALSE)
|
|
var/iteration_count = 0
|
|
var/msg = "" // This is to make sure that the pieces have actually added something
|
|
for(var/datum/multilingual_say_piece/SP in message_pieces)
|
|
iteration_count++
|
|
var/piece = SP.message
|
|
if(piece == "")
|
|
continue
|
|
|
|
if(SP.speaking && SP.speaking.flags & INNATE) // Fucking snowflake noise lang
|
|
return SP.speaking.format_message(piece)
|
|
|
|
if(iteration_count == 1)
|
|
piece = capitalize(piece)
|
|
|
|
if(SP.speaking)
|
|
if(!say_understands(speaker, SP.speaking))
|
|
if(isanimal(speaker))
|
|
var/mob/living/simple_animal/S = speaker
|
|
if(LAZYLEN(S.speak))
|
|
piece = pick(S.speak)
|
|
else
|
|
piece = stars(piece)
|
|
else
|
|
piece = SP.speaking.scramble(piece)
|
|
if(always_stars)
|
|
piece = stars(piece)
|
|
piece = SP.speaking.format_message(piece)
|
|
else
|
|
if(!say_understands(speaker, null))
|
|
piece = stars(piece)
|
|
if(isanimal(speaker))
|
|
var/mob/living/simple_animal/S = speaker
|
|
if(LAZYLEN(S.speak))
|
|
piece = pick(S.speak)
|
|
if(always_stars)
|
|
piece = stars(piece)
|
|
piece = "<span class='message'><span class='body'>[piece]</span></span>"
|
|
msg += (piece + " ")
|
|
if(msg == "")
|
|
// There is literally no content left in this message, we need to shut this shit down
|
|
. = "" // hear_say will suppress it
|
|
return
|
|
if(isliving(src))
|
|
for(var/datum/component/codeword_hearing/hearing_datum in GetComponents(/datum/component/codeword_hearing))
|
|
var/tmp_msg = hearing_datum.handle_hearing(msg)
|
|
if(!tmp_msg)
|
|
continue
|
|
msg = tmp_msg
|
|
|
|
if(verb)
|
|
. = "[verb], \"[trim(msg)]\""
|
|
else
|
|
. = trim(msg)
|
|
|
|
/mob/proc/hear_say(list/message_pieces, verb = "says", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol, sound_frequency, use_voice = TRUE)
|
|
if(!client)
|
|
return 0
|
|
|
|
if(isobserver(src) && client.prefs.toggles & PREFTOGGLE_CHAT_GHOSTEARS)
|
|
if(speaker && !speaker.client && !(speaker in view(src)))
|
|
//Does the speaker have a client? It's either random stuff that observers won't care about (Experiment 97B says, 'EHEHEHEHEHEHEHE')
|
|
//Or someone snoring. So we make it where they won't hear it.
|
|
return 0
|
|
|
|
//make sure the air can transmit speech - hearer's side
|
|
var/turf/T = get_turf(src)
|
|
if(T && !isobserver(src))
|
|
var/datum/gas_mixture/environment = T.get_readonly_air()
|
|
var/pressure = environment ? environment.return_pressure() : 0
|
|
if(pressure < SOUND_MINIMUM_PRESSURE && get_dist(speaker, src) > 1)
|
|
return FALSE
|
|
|
|
if(pressure < ONE_ATMOSPHERE * 0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet
|
|
italics = TRUE
|
|
sound_vol *= 0.5
|
|
|
|
if(stat == UNCONSCIOUS)
|
|
hear_sleep(multilingual_to_message(message_pieces))
|
|
return 0
|
|
|
|
var/speaker_name = speaker.name
|
|
if(use_voice && ishuman(speaker))
|
|
var/mob/living/carbon/human/H = speaker
|
|
speaker_name = H.GetVoice()
|
|
|
|
var/message = combine_message(message_pieces, null, speaker)
|
|
if(message == "")
|
|
return
|
|
|
|
var/message_clean = message
|
|
if(italics)
|
|
message = "<i>[message]</i>"
|
|
|
|
var/track = null
|
|
if(isobserver(src))
|
|
if(speaker_name != speaker.real_name && speaker.real_name)
|
|
speaker_name = "[speaker.real_name] ([speaker_name])"
|
|
track = "([ghost_follow_link(speaker, ghost=src)]) "
|
|
if(client.prefs.toggles & PREFTOGGLE_CHAT_GHOSTEARS && (speaker in view(src)))
|
|
message = "<b>[message]</b>"
|
|
|
|
// Ensure only the speaker is forced to emote, and that the spoken language is inname
|
|
if(speaker == src)
|
|
for(var/datum/multilingual_say_piece/SP in message_pieces)
|
|
if(SP.speaking && SP.speaking.flags & INNATE)
|
|
custom_emote(EMOTE_AUDIBLE, message_clean, TRUE)
|
|
return
|
|
|
|
if(!can_hear())
|
|
// INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set
|
|
// if(!language || !(language.flags & INNATE))
|
|
if(speaker == src)
|
|
to_chat(src, "<span class='warning'>You cannot hear yourself speak!</span>")
|
|
else
|
|
to_chat(src, "<span class='name'>[speaker.name]</span> talks but you cannot hear [speaker.p_them()].")
|
|
else
|
|
to_chat(src, "<span class='game say'><span class='name'>[speaker_name]</span>[speaker.GetAltName()] [track][verb], \"[message]\"</span>")
|
|
|
|
// Create map text message
|
|
if(client?.prefs.toggles2 & PREFTOGGLE_2_RUNECHAT) // can_hear is checked up there on L99
|
|
create_chat_message(locateUID(speaker.runechat_msg_location), message_clean, italics)
|
|
|
|
if(speech_sound && (get_dist(speaker, src) <= world.view && src.z == speaker.z))
|
|
var/turf/source = speaker? get_turf(speaker) : get_turf(src)
|
|
playsound_local(source, speech_sound, sound_vol, 1, sound_frequency)
|
|
|
|
|
|
/mob/proc/hear_radio(list/message_pieces, verb = "says", part_a, part_b, atom/movable/speaker = null, hard_to_hear = 0, vname = "", atom/follow_target, check_name_against)
|
|
if(!client)
|
|
return
|
|
|
|
if(stat == UNCONSCIOUS) //If unconscious or sleeping
|
|
hear_sleep(multilingual_to_message(message_pieces))
|
|
return
|
|
|
|
var/message = combine_message(message_pieces, verb, speaker, always_stars = hard_to_hear)
|
|
if(message == "")
|
|
return
|
|
|
|
var/track = null
|
|
if(!follow_target)
|
|
follow_target = speaker
|
|
|
|
var/speaker_name = handle_speaker_name(speaker, vname, hard_to_hear, check_name_against)
|
|
track = handle_track(message, verb, speaker, speaker_name, follow_target, hard_to_hear)
|
|
|
|
if(!can_hear())
|
|
if(prob(20))
|
|
to_chat(src, "<span class='warning'>You feel your headset vibrate but can hear nothing from it!</span>")
|
|
else if(track)
|
|
to_chat(src, "[part_a][track][part_b][message]</span></span>")
|
|
else
|
|
to_chat(src, "[part_a][speaker_name][part_b][message]</span></span>")
|
|
|
|
/mob/proc/handle_speaker_name(atom/movable/speaker = null, vname, hard_to_hear)
|
|
var/speaker_name = "unknown"
|
|
if(speaker)
|
|
speaker_name = speaker.name
|
|
|
|
if(vname)
|
|
speaker_name = vname
|
|
|
|
if(hard_to_hear)
|
|
speaker_name = "unknown"
|
|
|
|
return speaker_name
|
|
|
|
/mob/proc/handle_track(message, verb = "says", atom/movable/speaker = null, speaker_name, atom/follow_target, hard_to_hear)
|
|
return
|
|
|
|
/mob/proc/hear_sleep(message)
|
|
var/heard = ""
|
|
if(prob(15))
|
|
message = html_decode(strip_html_tags(message))
|
|
var/list/punctuation = list(",", "!", ".", ";", "?")
|
|
var/list/messages = splittext(message, " ")
|
|
if(length(messages) > 0)
|
|
var/R = rand(1, length(messages))
|
|
var/heardword = messages[R]
|
|
if(copytext(heardword,1, 1) in punctuation)
|
|
heardword = html_encode(copytext(heardword, 2))
|
|
if(copytext(heardword,-1) in punctuation)
|
|
heardword = html_encode(copytext(heardword, 1, length(heardword)))
|
|
heard = "<span class='game say'>...<i>You hear something about<i>... '[heardword]'...</span>"
|
|
else
|
|
heard = "<span class='game say'>...<i>You almost hear something...</i>...</span>"
|
|
else
|
|
heard = "<span class='game say'>...<i>You almost hear someone talking</i>...</span>"
|
|
|
|
to_chat(src, heard)
|
|
|
|
/mob/proc/hear_holopad_talk(list/message_pieces, verb = "says", atom/movable/speaker = null, obj/effect/overlay/holo_pad_hologram/H)
|
|
if(stat == UNCONSCIOUS)
|
|
hear_sleep(multilingual_to_message(message_pieces))
|
|
return
|
|
|
|
if(!can_hear())
|
|
return
|
|
|
|
var/message = combine_message(message_pieces, verb, speaker)
|
|
var/message_unverbed = combine_message(message_pieces, null, speaker)
|
|
|
|
var/name = speaker.name
|
|
if(!say_understands(speaker) && ismob(speaker))
|
|
var/mob/speaker_mob = speaker
|
|
name = speaker_mob.voice_name
|
|
|
|
if((client?.prefs.toggles2 & PREFTOGGLE_2_RUNECHAT) && can_hear())
|
|
create_chat_message(H, message_unverbed)
|
|
|
|
var/rendered = "<span class='game say'><span class='name'>[name]</span> [message]</span>"
|
|
to_chat(src, rendered)
|