Datumizes saymodes (#33013)

* Datumized saymodes!

* Update living.dm

* ...
This commit is contained in:
MoreRobustThanYou
2017-12-03 13:55:03 -05:00
committed by Jordan Brown
parent b9848d2640
commit 36414ac1e6
16 changed files with 182 additions and 143 deletions

View File

@@ -187,3 +187,5 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list(
/obj/item/stack/sheet/plasmarglass))) /obj/item/stack/sheet/plasmarglass)))
#define is_glass_sheet(O) (is_type_in_typecache(O, GLOB.glass_sheet_types)) #define is_glass_sheet(O) (is_type_in_typecache(O, GLOB.glass_sheet_types))
#define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob))

View File

@@ -49,4 +49,10 @@
#define LOGCHAT "chat" #define LOGCHAT "chat"
#define LOGASAY "adminsay" #define LOGASAY "adminsay"
#define LOGCOMMENT "comment" #define LOGCOMMENT "comment"
#define LOGOOC "ooc" #define LOGOOC "ooc"
#define LINGHIVE_NONE 0
#define LINGHIVE_OUTSIDER 1
#define LINGHIVE_LING 2
#define LINGHIVE_LINK 3

View File

@@ -30,7 +30,7 @@ SUBSYSTEM_DEF(atoms)
initialized = INITIALIZATION_INNEW_MAPLOAD initialized = INITIALIZATION_INNEW_MAPLOAD
LAZYINITLIST(late_loaders) LAZYINITLIST(late_loaders)
var/count var/count
var/list/mapload_arg = list(TRUE) var/list/mapload_arg = list(TRUE)
if(atoms) if(atoms)
@@ -60,10 +60,10 @@ SUBSYSTEM_DEF(atoms)
A.LateInitialize() A.LateInitialize()
testing("Late initialized [late_loaders.len] atoms") testing("Late initialized [late_loaders.len] atoms")
late_loaders.Cut() late_loaders.Cut()
if(atoms) if(atoms)
. = created_atoms + atoms . = created_atoms + atoms
created_atoms = null created_atoms = null
/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments) /datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments)
var/the_type = A.type var/the_type = A.type
@@ -77,7 +77,7 @@ SUBSYSTEM_DEF(atoms)
if(start_tick != world.time) if(start_tick != world.time)
BadInitializeCalls[the_type] |= BAD_INIT_SLEPT BadInitializeCalls[the_type] |= BAD_INIT_SLEPT
var/qdeleted = FALSE var/qdeleted = FALSE
if(result != INITIALIZE_HINT_NORMAL) if(result != INITIALIZE_HINT_NORMAL)
@@ -92,12 +92,12 @@ SUBSYSTEM_DEF(atoms)
qdeleted = TRUE qdeleted = TRUE
else else
BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT
if(!A) //possible harddel if(!A) //possible harddel
qdeleted = TRUE qdeleted = TRUE
else if(!A.initialized) else if(!A.initialized)
BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT
return qdeleted || QDELING(A) return qdeleted || QDELING(A)
/datum/controller/subsystem/atoms/proc/map_loader_begin() /datum/controller/subsystem/atoms/proc/map_loader_begin()

View File

@@ -3,6 +3,13 @@ SUBSYSTEM_DEF(radio)
flags = SS_NO_FIRE|SS_NO_INIT flags = SS_NO_FIRE|SS_NO_INIT
var/list/datum/radio_frequency/frequencies = list() var/list/datum/radio_frequency/frequencies = list()
var/list/saymodes = list()
/datum/controller/subsystem/radio/PreInit(timeofday)
for(var/_SM in subtypesof(/datum/saymode))
var/datum/saymode/SM = new _SM()
saymodes[SM.key] = SM
return ..()
/datum/controller/subsystem/radio/proc/add_object(obj/device, new_frequency as num, filter = null as text|null) /datum/controller/subsystem/radio/proc/add_object(obj/device, new_frequency as num, filter = null as text|null)
var/f_text = num2text(new_frequency) var/f_text = num2text(new_frequency)

112
code/datums/saymode.dm Normal file
View File

@@ -0,0 +1,112 @@
/datum/saymode
var/key
var/mode
//Return FALSE if you have handled the message. Otherwise, return TRUE and saycode will continue doing saycode things.
//user = whoever said the message
//message = the message
//language = the language.
/datum/saymode/proc/handle_message(mob/living/user, message, datum/language/language)
return TRUE
/datum/saymode/changeling
key = "g"
mode = MODE_CHANGELING
/datum/saymode/changeling/handle_message(mob/living/user, message, datum/language/language)
switch(user.lingcheck())
if(LINGHIVE_LINK)
var/msg = "<i><font color=#800040><b>[user.mind]:</b> [message]</font></i>"
for(var/_M in GLOB.mob_list)
var/mob/M = _M
if(M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, user)
to_chat(M, "[link] [msg]")
else
switch(M.lingcheck())
if(LINGHIVE_LINK, LINGHIVE_LING)
to_chat(M, msg)
if(LINGHIVE_OUTSIDER)
if(prob(40))
to_chat(M, "<i><font color=#800080>We can faintly sense an outsider trying to communicate through the hivemind...</font></i>")
if(LINGHIVE_LING)
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/msg = "<i><font color=#800080><b>[changeling.changelingID]:</b> [message]</font></i>"
log_talk(src,"[changeling.changelingID]/[user.key] : [message]",LOGSAY)
for(var/_M in GLOB.mob_list)
var/mob/M = _M
if(M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, user)
to_chat(M, "[link] [msg]")
else
switch(M.lingcheck())
if(LINGHIVE_LINK)
to_chat(M, msg)
if(LINGHIVE_LING)
to_chat(M, msg)
if(LINGHIVE_OUTSIDER)
if(prob(40))
to_chat(M, "<i><font color=#800080>We can faintly sense another of our kind trying to communicate through the hivemind...</font></i>")
if(LINGHIVE_OUTSIDER)
to_chat(user, "<i><font color=#800080>Our senses have not evolved enough to be able to communicate this way...</font></i>")
return FALSE
/datum/saymode/xeno
key = "a"
mode = MODE_ALIEN
/datum/saymode/xeno/handle_message(mob/living/user, message, datum/language/language)
if(user.hivecheck())
user.alien_talk(message)
return FALSE
/datum/saymode/vocalcords
key = "x"
mode = MODE_VOCALCORDS
/datum/saymode/vocalcords/handle_message(mob/living/user, message, datum/language/language)
if(iscarbon(user))
var/mob/living/carbon/C = user
var/obj/item/organ/vocal_cords/V = C.getorganslot(ORGAN_SLOT_VOICE)
if(V && V.can_speak_with())
V.handle_speech(message) //message
V.speak_with(message) //action
return FALSE
/datum/saymode/binary //everything that uses .b (silicons, drones, blobbernauts/spores, swarmers)
key = "b"
mode = MODE_BINARY
/datum/saymode/binary/handle_message(mob/living/user, message, datum/language/language)
if(isswarmer(user))
var/mob/living/simple_animal/hostile/swarmer/S = user
S.swarmer_chat(message)
return FALSE
if(isblobmonster(user))
var/mob/living/simple_animal/hostile/blob/B = user
B.blob_chat(message)
return FALSE
if(isdrone(user))
var/mob/living/simple_animal/drone/D = user
D.drone_chat(message)
return FALSE
if(user.binarycheck())
user.robot_talk(message)
return FALSE
return FALSE
/datum/saymode/holopad
key = "h"
mode = MODE_HOLOPAD
/datum/saymode/holopad/handle_message(mob/living/user, message, datum/language/language)
if(isAI(user))
var/mob/living/silicon/ai/AI = user
AI.holopad_talk(message, language)
return FALSE
return FALSE

View File

@@ -56,13 +56,6 @@
return 1 return 1
return ..() return ..()
/mob/living/simple_animal/hostile/blob/handle_inherent_channels(message, message_mode)
if(message_mode == MODE_BINARY)
blob_chat(message)
return 1
else
..()
/mob/living/simple_animal/hostile/blob/proc/blob_chat(msg) /mob/living/simple_animal/hostile/blob/proc/blob_chat(msg)
var/spanned_message = say_quote(msg, get_spans()) var/spanned_message = say_quote(msg, get_spans())
var/rendered = "<font color=\"#EE4000\"><b>\[Blob Telepathy\] [real_name]</b> [spanned_message]</font>" var/rendered = "<font color=\"#EE4000\"><b>\[Blob Telepathy\] [real_name]</b> [spanned_message]</font>"

View File

@@ -50,7 +50,7 @@
to_chat(target, "<span class='userdanger'>A migraine throbs behind your eyes, you hear yourself screaming - but your mouth has not opened!</span>") to_chat(target, "<span class='userdanger'>A migraine throbs behind your eyes, you hear yourself screaming - but your mouth has not opened!</span>")
for(var/mi in GLOB.mob_list) for(var/mi in GLOB.mob_list)
var/mob/M = mi var/mob/M = mi
if(M.lingcheck() == 2) if(M.lingcheck() == LINGHIVE_LING)
to_chat(M, "<i><font color=#800080>We can sense a foreign presence in the hivemind...</font></i>") to_chat(M, "<i><font color=#800080>We can sense a foreign presence in the hivemind...</font></i>")
target.mind.linglink = 1 target.mind.linglink = 1
target.say(":g AAAAARRRRGGGGGHHHHH!!") target.say(":g AAAAARRRRGGGGGHHHHH!!")

View File

@@ -120,13 +120,6 @@
if(statpanel("Status")) if(statpanel("Status"))
stat("Resources:",resources) stat("Resources:",resources)
/mob/living/simple_animal/hostile/swarmer/handle_inherent_channels(message, message_mode)
if(message_mode == MODE_BINARY)
swarmer_chat(message)
return ITALICS | REDUCE_RANGE
else
. = ..()
/mob/living/simple_animal/hostile/swarmer/get_spans() /mob/living/simple_animal/hostile/swarmer/get_spans()
return ..() | SPAN_ROBOT return ..() | SPAN_ROBOT

View File

@@ -21,7 +21,7 @@
return ITALICS | REDUCE_RANGE return ITALICS | REDUCE_RANGE
/mob/living/brain/lingcheck() /mob/living/brain/lingcheck()
return 0 return LINGHIVE_NONE
/mob/living/brain/treat_message(message) /mob/living/brain/treat_message(message)
message = capitalize(message) message = capitalize(message)

View File

@@ -1009,4 +1009,15 @@
/mob/living/proc/add_abilities_to_panel() /mob/living/proc/add_abilities_to_panel()
for(var/obj/effect/proc_holder/A in abilities) for(var/obj/effect/proc_holder/A in abilities)
statpanel("[A.panel]",A.get_panel_text(),A) statpanel("[A.panel]",A.get_panel_text(),A)
/mob/living/lingcheck()
if(mind)
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling)
if(changeling.changeling_speak)
return LINGHIVE_LING
return LINGHIVE_OUTSIDER
if(mind && mind.linglink)
return LINGHIVE_LINK
return LINGHIVE_NONE

View File

@@ -37,41 +37,42 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
//kinda localization -- rastaf0 //kinda localization -- rastaf0
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding. //same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.
// Location // Location
"ê" = "right hand", "<EFBFBD>" = "right hand",
"ä" = "left hand", "<EFBFBD>" = "left hand",
"ø" = "intercom", "<EFBFBD>" = "intercom",
// Department // Department
"ð" = "department", "<EFBFBD>" = "department",
"ñ" = "Command", "<EFBFBD>" = "Command",
"ò" = "Science", "<EFBFBD>" = "Science",
"ü" = "Medical", "<EFBFBD>" = "Medical",
"ó" = "Engineering", "<EFBFBD>" = "Engineering",
"û" = "Security", "<EFBFBD>" = "Security",
"ã" = "Supply", "<EFBFBD>" = "Supply",
"ì" = "Service", "<EFBFBD>" = "Service",
// Faction // Faction
"å" = "Syndicate", "<EFBFBD>" = "Syndicate",
"í" = "CentCom", "<EFBFBD>" = "CentCom",
// Species // Species
"è" = "binary", "<EFBFBD>" = "binary",
"ï" = "changeling", "<EFBFBD>" = "changeling",
"ô" = "alientalk", "<EFBFBD>" = "alientalk",
// Admin // Admin
"ç" = "admin", "<EFBFBD>" = "admin",
"â" = "deadmin", "<EFBFBD>" = "deadmin",
// Misc // Misc
"ù" = "AI Private", "<EFBFBD>" = "AI Private",
"÷" = "cords" "<EFBFBD>" = "cords"
)) ))
/mob/living/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE) /mob/living/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE)
var/static/list/crit_allowed_modes = list(MODE_WHISPER = TRUE, MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE) var/static/list/crit_allowed_modes = list(MODE_WHISPER = TRUE, MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE)
var/static/list/unconscious_allowed_modes = list(MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE) var/static/list/unconscious_allowed_modes = list(MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE)
var/key = get_key(message)
var/static/list/one_character_prefix = list(MODE_HEADSET = TRUE, MODE_ROBOT = TRUE, MODE_WHISPER = TRUE) var/static/list/one_character_prefix = list(MODE_HEADSET = TRUE, MODE_ROBOT = TRUE, MODE_WHISPER = TRUE)
@@ -134,8 +135,11 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
// AIs use inherent channels for the holopad. Most inherent channels // AIs use inherent channels for the holopad. Most inherent channels
// ignore the language argument however. // ignore the language argument however.
if(handle_inherent_channels(message, message_mode, language)) //Hiveminds, binary chat & holopad. var/datum/saymode/SM = SSradio.saymodes[key]
return if(key && SM)
if(!SM.handle_message(src, message, language))
return
if(!can_speak_vocal(message)) if(!can_speak_vocal(message))
to_chat(src, "<span class='warning'>You find yourself unable to speak!</span>") to_chat(src, "<span class='warning'>You find yourself unable to speak!</span>")
@@ -264,7 +268,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, I, speech_bubble_recipients, 30) INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, I, speech_bubble_recipients, 30)
/mob/proc/binarycheck() /mob/proc/binarycheck()
return 0 return FALSE
/mob/living/can_speak(message) //For use outside of Say() /mob/living/can_speak(message) //For use outside of Say()
if(can_speak_basic(message) && can_speak_vocal(message)) if(can_speak_basic(message) && can_speak_vocal(message))
@@ -307,6 +311,11 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
var/key_symbol = lowertext(copytext(message, 2, 3)) var/key_symbol = lowertext(copytext(message, 2, 3))
return GLOB.department_radio_keys[key_symbol] return GLOB.department_radio_keys[key_symbol]
/mob/living/proc/get_key(message)
var/key = copytext(message, 1, 2)
if(key in GLOB.department_radio_prefixes)
return lowertext(copytext(message, 2, 3))
/mob/living/proc/get_message_language(message) /mob/living/proc/get_message_language(message)
if(copytext(message, 1, 2) == ",") if(copytext(message, 1, 2) == ",")
var/key = copytext(message, 2, 3) var/key = copytext(message, 2, 3)
@@ -316,60 +325,6 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
return LD return LD
return null return null
/mob/living/proc/handle_inherent_channels(message, message_mode)
if(message_mode == MODE_CHANGELING)
switch(lingcheck())
if(3)
var/msg = "<i><font color=#800040><b>[src.mind]:</b> [message]</font></i>"
for(var/_M in GLOB.mob_list)
var/mob/M = _M
if(M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, src)
to_chat(M, "[link] [msg]")
else
switch(M.lingcheck())
if(3)
to_chat(M, msg)
if(2)
to_chat(M, msg)
if(1)
if(prob(40))
to_chat(M, "<i><font color=#800080>We can faintly sense an outsider trying to communicate through the hivemind...</font></i>")
if(2)
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
var/msg = "<i><font color=#800080><b>[changeling.changelingID]:</b> [message]</font></i>"
log_talk(src,"[changeling.changelingID]/[key] : [message]",LOGSAY)
for(var/_M in GLOB.mob_list)
var/mob/M = _M
if(M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, src)
to_chat(M, "[link] [msg]")
else
switch(M.lingcheck())
if(3)
to_chat(M, msg)
if(2)
to_chat(M, msg)
if(1)
if(prob(40))
to_chat(M, "<i><font color=#800080>We can faintly sense another of our kind trying to communicate through the hivemind...</font></i>")
if(1)
to_chat(src, "<i><font color=#800080>Our senses have not evolved enough to be able to communicate this way...</font></i>")
return TRUE
if(message_mode == MODE_ALIEN)
if(hivecheck())
alien_talk(message)
return TRUE
if(message_mode == MODE_VOCALCORDS)
if(iscarbon(src))
var/mob/living/carbon/C = src
var/obj/item/organ/vocal_cords/V = C.getorganslot(ORGAN_SLOT_VOICE)
if(V && V.can_speak_with())
V.handle_speech(message) //message
V.speak_with(message) //action
return TRUE
return FALSE
/mob/living/proc/treat_message(message) /mob/living/proc/treat_message(message)
if(getBrainLoss() >= 60) if(getBrainLoss() >= 60)
message = derpspeech(message, stuttering) message = derpspeech(message, stuttering)
@@ -408,22 +363,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
return ITALICS | REDUCE_RANGE return ITALICS | REDUCE_RANGE
if(MODE_BINARY) if(MODE_BINARY)
if(binarycheck())
robot_talk(message)
return ITALICS | REDUCE_RANGE //Does not return 0 since this is only reached by humans, not borgs or AIs. return ITALICS | REDUCE_RANGE //Does not return 0 since this is only reached by humans, not borgs or AIs.
return 0 return 0
/mob/living/lingcheck() //1 is ling w/ no hivemind. 2 is ling w/hivemind. 3 is ling victim being linked into hivemind.
if(mind)
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling)
if(changeling.changeling_speak)
return 2
return 1
if(mind && mind.linglink)
return 3
return 0
/mob/living/say_mod(input, message_mode) /mob/living/say_mod(input, message_mode)
if(message_mode == MODE_WHISPER) if(message_mode == MODE_WHISPER)
. = verb_whisper . = verb_whisper

View File

@@ -31,15 +31,6 @@
else else
return ..() return ..()
/mob/living/silicon/ai/handle_inherent_channels(message, message_mode, language)
. = ..()
if(.)
return .
if(message_mode == MODE_HOLOPAD)
holopad_talk(message, language)
return 1
//For holopads only. Usable by AI. //For holopads only. Usable by AI.
/mob/living/silicon/ai/proc/holopad_talk(message, language) /mob/living/silicon/ai/proc/holopad_talk(message, language)

View File

@@ -57,14 +57,3 @@
return MODE_ROBOT return MODE_ROBOT
else else
return . return .
/mob/living/silicon/handle_inherent_channels(message, message_mode)
. = ..()
if(.)
return .
if(message_mode == MODE_BINARY)
if(binarycheck())
robot_talk(message)
return 1
return 0

View File

@@ -3,14 +3,6 @@
///////////// /////////////
//Drone speach //Drone speach
/mob/living/simple_animal/drone/handle_inherent_channels(message, message_mode)
if(message_mode == MODE_BINARY)
drone_chat(message)
return 1
else
..()
/mob/living/simple_animal/drone/get_spans() /mob/living/simple_animal/drone/get_spans()
return ..() | SPAN_ROBOT return ..() | SPAN_ROBOT

View File

@@ -79,4 +79,4 @@
return 0 return 0
/mob/proc/lingcheck() /mob/proc/lingcheck()
return 0 return LINGHIVE_NONE

View File

@@ -267,6 +267,7 @@
#include "code\datums\recipe.dm" #include "code\datums\recipe.dm"
#include "code\datums\riding.dm" #include "code\datums\riding.dm"
#include "code\datums\ruins.dm" #include "code\datums\ruins.dm"
#include "code\datums\saymode.dm"
#include "code\datums\shuttles.dm" #include "code\datums\shuttles.dm"
#include "code\datums\soullink.dm" #include "code\datums\soullink.dm"
#include "code\datums\spawners_menu.dm" #include "code\datums\spawners_menu.dm"