From bbcadcc08071d1eb2e567e0e0d8c66823170db06 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Mon, 5 Oct 2015 11:12:26 +0200 Subject: [PATCH] Makes silicon language handling more robust. Also fixes an issue with lists being targets for qdel(). Fixes #11221. --- code/modules/mob/language/language.dm | 2 +- .../mob/living/silicon/robot/robot_modules.dm | 28 +++++++++++++------ code/modules/mob/living/silicon/silicon.dm | 18 ++++++++---- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index 03ab8ea297..8c6b92c555 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -123,7 +123,7 @@ var/datum/language/new_language = all_languages[language] - if(!istype(new_language) || new_language in languages) + if(!istype(new_language) || (new_language in languages)) return 0 languages.Add(new_language) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 819fbf4561..d5a2edf3e1 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -34,7 +34,7 @@ var/global/list/robot_modules = list( var/list/obj/item/borg/upgrade/supported_upgrades = list() // Bookkeeping - var/list/added_languages = list() + var/list/original_languages = list() var/list/added_networks = list() /obj/item/weapon/robot_module/New(var/mob/living/silicon/robot/R) @@ -63,12 +63,14 @@ var/global/list/robot_modules = list( qdel(src) /obj/item/weapon/robot_module/Destroy() - qdel(modules) - qdel(synths) + for(var/obj/O in modules) + qdel(O) + modules.Cut() + for(var/datum/matter_synth/S in synths) + qdel(S) + synths.Cut() qdel(emag) qdel(jetpack) - modules = null - synths = null emag = null jetpack = null return ..() @@ -100,14 +102,22 @@ var/global/list/robot_modules = list( modules += O /obj/item/weapon/robot_module/proc/add_languages(var/mob/living/silicon/robot/R) + // Stores the languages as they were before receiving the module, and whether they could be synthezized. + for(var/datum/language/language_datum in R.languages) + original_languages[language_datum] = (language_datum in R.speech_synthesizer_langs) + for(var/language in languages) - if(R.add_language(language, languages[language])) - added_languages |= language + R.add_language(language, languages[language]) /obj/item/weapon/robot_module/proc/remove_languages(var/mob/living/silicon/robot/R) - for(var/language in added_languages) + // Clear all added languages, whether or not we originally had them. + for(var/language in languages) R.remove_language(language) - added_languages.Cut() + + // Then add back all the original languages, and the relevant synthezising ability + for(var/original_language in original_languages) + R.add_language(original_language, original_languages[original_language]) + original_languages.Cut() /obj/item/weapon/robot_module/proc/add_camera_networks(var/mob/living/silicon/robot/R) if(R.camera && (NETWORK_ROBOTS in R.camera.network)) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index d6fc2e4aa9..5186a7f6b8 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -188,16 +188,22 @@ return universal_speak || (speaking in src.speech_synthesizer_langs) //need speech synthesizer support to vocalize a language /mob/living/silicon/add_language(var/language, var/can_speak=1) - if (..(language) && can_speak) - speech_synthesizer_langs.Add(all_languages[language]) + var/var/datum/language/added_language = all_languages[language] + if(!added_language) + return + + . = ..(language) + if (can_speak && (added_language in languages) && !(added_language in speech_synthesizer_langs)) + speech_synthesizer_langs += added_language return 1 /mob/living/silicon/remove_language(var/rem_language) - ..(rem_language) + var/var/datum/language/removed_language = all_languages[rem_language] + if(!removed_language) + return - for (var/datum/language/L in speech_synthesizer_langs) - if (L.name == rem_language) - speech_synthesizer_langs -= L + ..(rem_language) + speech_synthesizer_langs -= removed_language /mob/living/silicon/check_languages() set name = "Check Known Languages"