diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index ed740f85d1..ecbac32ed1 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -17,6 +17,10 @@ var/global/list/landmarks_list = list() //list of all landmarks created var/global/list/surgery_steps = list() //list of all surgery steps |BS12 var/global/list/mechas_list = list() //list of all mechs. Used by hostile mobs target tracking. +//Languages/species +var/global/list/all_species[0] +var/global/list/all_languages[0] + //Preferences stuff //Hairstyles var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name @@ -69,6 +73,18 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al var/datum/surgery_step/S = new T surgery_steps += S sort_surgeries() + + //Languages and species. + paths = typesof(/datum/language)-/datum/language + for(var/T in paths) + var/datum/language/L = new T + all_languages[L.name] = L + + paths = typesof(/datum/species)-/datum/species + for(var/T in paths) + var/datum/species/S = new T + all_species[S.name] = S + /* // Uncomment to debug chemical reaction list. /client/verb/debug_chemical_list() diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index cafc1c58cd..517c6d0931 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -754,13 +754,13 @@ client usr << "This can only be done to instances of type /mob/living/carbon/human" return - var/datum/species/new_species = input("Please choose a new species.","Species",null) as null|anything in (typesof(/datum/species)-/datum/species) + var/new_species = input("Please choose a new species.","Species",null) as null|anything in all_species if(!H) usr << "Mob doesn't exist anymore" return - if(H.set_species(new new_species)) + if(H.set_species(new_species)) usr << "Set species of [H] to [H.species]." else usr << "Failed! Something went wrong." @@ -773,13 +773,13 @@ client usr << "This can only be done to instances of type /mob" return - var/datum/language/new_language = input("Please choose a language to add.","Language",null) as null|anything in (typesof(/datum/language)-/datum/language) + var/new_language = input("Please choose a language to add.","Language",null) as null|anything in all_languages if(!H) usr << "Mob doesn't exist anymore" return - if(H.add_language(new new_language)) + if(H.add_language(new_language)) usr << "Added [new_language] to [H]." else usr << "Mob already knows that language." @@ -792,13 +792,17 @@ client usr << "This can only be done to instances of type /mob" return + if(!H.languages.len) + usr << "This mob knows no languages." + return + var/datum/language/rem_language = input("Please choose a language to remove.","Language",null) as null|anything in H.languages if(!H) usr << "Mob doesn't exist anymore" return - if(H.remove_language(rem_language)) + if(H.remove_language(rem_language.name)) usr << "Removed [rem_language] from [H]." else usr << "Mob doesn't know that language." diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index fa4299c3c1..935e0974c7 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -95,12 +95,12 @@ var/global/vox_kills = 0 //Used to check the Inviolate. var/mob/living/carbon/human/vox = raider.current - vox.languages += new /datum/language/vox vox.real_name = capitalize(newname) vox.name = vox.real_name vox.age = rand(12,20) - vox.set_species(new /datum/species/vox) vox.dna.mutantrace = "vox" + vox.set_species("Vox") + vox.add_language("Vox-pidgin") vox.h_style = "Short Vox Quills" vox.equip_vox_raider() vox.regenerate_icons() diff --git a/code/game/machinery/podmen.dm b/code/game/machinery/podmen.dm index 5078dd379a..2fe409dcfb 100644 --- a/code/game/machinery/podmen.dm +++ b/code/game/machinery/podmen.dm @@ -117,7 +117,7 @@ Growing it to term with nothing injected will grab a ghost from the observers. * podman.gender = NEUTER podman.dna = new /datum/dna() podman.dna.real_name = podman.real_name - podman.set_species(new /datum/species/diona) + podman.set_species("Diona") podman.dna.mutantrace = "plant" podman.update_mutantrace() diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index c5b20ecb92..e4850b4ceb 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -507,13 +507,14 @@ client/proc/one_click_antag() i++ newname += pick(list("ti","hi","ki","ya","ta","ha","ka","ya","chi","cha","kah")) - new_vox.languages += new /datum/language/vox new_vox.real_name = capitalize(newname) new_vox.name = new_vox.real_name new_vox.age = rand(12,20) new_vox.dna.ready_dna(new_vox) // Creates DNA. - new_vox.set_species(new /datum/species/vox) // Actually makes the vox! How about that. + new_vox.dna.mutantrace = "vox" + new_vox.set_species("Vox") // Actually makes the vox! How about that. + new_vox.add_language("Vox-pidgin") new_vox.mind_initialize() new_vox.mind.assigned_role = "MODE" new_vox.mind.special_role = "Vox Raider" diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 727437a19f..92bb8d3a82 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -30,4 +30,29 @@ name = "Vox-pidgin" speech_verb = "shrieks" colour = "vox" - key = "v" \ No newline at end of file + key = "v" + + +// Language handling. +/mob/proc/add_language(var/language) + + var/datum/language/new_language = all_languages[language] + + if(!istype(new_language,/datum/language)) + return + + for(var/datum/language/L in languages) + if(L && L.name == new_language) + return 0 + + languages += new_language + return 1 + +/mob/proc/remove_language(var/rem_language) + + for(var/datum/language/L in languages) + if(L && L.name == rem_language) + languages -= L + return 1 + + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6b98ec7c1d..4858383309 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -13,22 +13,22 @@ /mob/living/carbon/human/skrell/New() h_style = "Skrell Male Tentacles" - set_species(new /datum/species/skrell(src)) + set_species("Skrell") ..() /mob/living/carbon/human/tajaran/New() h_style = "Tajaran Ears" - set_species(new /datum/species/tajaran(src)) + set_species("Tajara") ..() /mob/living/carbon/human/unathi/New() h_style = "Unathi Horns" - set_species(new /datum/species/unathi(src)) + set_species("Unathi") ..() /mob/living/carbon/human/vox/New() h_style = "Short Vox Quills" - species = new /datum/species/vox(src) + set_species("Vox") ..() /mob/living/carbon/human/diona/New() @@ -41,7 +41,9 @@ set_species() if(species.language) - languages += species.language + var/datum/language/L = all_languages[species.language] + if(L) + languages += L var/datum/reagents/R = new/datum/reagents(1000) reagents = R @@ -1260,21 +1262,15 @@ mob/living/carbon/human/yank_out_object() else usr << "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]." -/mob/living/carbon/human/proc/set_species(var/datum/species/new_species) +/mob/living/carbon/human/proc/set_species(var/new_species) if(!new_species) - new_species = new /datum/species/human + new_species = "Human" - if(species) + if(species && (species.name && species.name == new_species)) + return - if(species.name == new_species.name) - return - - var/temp = species - species = new_species - del(temp) - else - species = new_species + species = all_species[new_species] spawn(0) update_icons() diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index 62c8a6273b..6d5ec719c1 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -25,7 +25,7 @@ var/tail // Name of tail image in species effects icon file. var/primitive // Lesser form, if any (ie. monkey for humans) - var/datum/language/language // Default racial language, if any. + var/language // Default racial language, if any. var/attack_verb = "punch" // Empty hand hurt intent verb. var/breath_type // Non-oxygen gas breathed, if any. @@ -56,7 +56,7 @@ name = "Unathi" icobase = 'icons/mob/human_races/r_lizard.dmi' deform = 'icons/mob/human_races/r_def_lizard.dmi' - language = new /datum/language/unathi + language = "Sinta'unathi" tail = "sogtail" attack_verb = "scratch" @@ -66,7 +66,7 @@ name = "Tajara" icobase = 'icons/mob/human_races/r_tajaran.dmi' deform = 'icons/mob/human_races/r_def_tajaran.dmi' - language = new /datum/language/tajaran + language = "Siik'mas" tail = "tajtail" attack_verb = "scratch" @@ -76,7 +76,7 @@ name = "Skrell" icobase = 'icons/mob/human_races/r_skrell.dmi' deform = 'icons/mob/human_races/r_def_skrell.dmi' - language = new /datum/language/skrell + language = "Skrellian" flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR @@ -84,7 +84,7 @@ name = "Vox" icobase = 'icons/mob/human_races/r_vox.dmi' deform = 'icons/mob/human_races/r_def_vox.dmi' - language = new /datum/language/vox + language = "Vox-pidgin" eyes = "vox_eyes_s" breath_type = "nitrogen" diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 0bd7802709..ded645a11e 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -955,23 +955,4 @@ mob/verb/yank_out_object() pinned -= O if(!pinned.len) anchored = 0 - return 1 - -// Language handling. -/mob/proc/add_language(var/datum/language/new_language) - - for(var/datum/language/L in languages) - if(L && L.name == new_language.name) - return 0 - - languages += new_language - return 1 - -/mob/proc/remove_language(var/datum/language/rem_language) - - for(var/datum/language/L in languages) - if(L && L.name == rem_language.name) - languages -= L - return 1 - - return 0 \ No newline at end of file + return 1 \ No newline at end of file diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 06575f9fa7..3c77f36965 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -349,26 +349,26 @@ if(client.prefs.species == "Tajaran") //This is like the worst, but it works, so meh. - Erthilo if(is_alien_whitelisted(src, "Tajaran") || !config.usealienwhitelist) - new_character.set_species(new /datum/species/tajaran) - new_character.languages += new /datum/language/tajaran + new_character.set_species("Tajara") + new_character.add_language("Siik'mas") if(client.prefs.species == "Unathi") if(is_alien_whitelisted(src, "Soghun") || !config.usealienwhitelist) - new_character.set_species(new /datum/species/unathi) - new_character.languages += new /datum/language/unathi + new_character.set_species("Unathi") + new_character.add_language("Sinta'unathi") if(client.prefs.species == "Skrell") if(is_alien_whitelisted(src, "Skrell") || !config.usealienwhitelist) - new_character.set_species(new /datum/species/skrell) - new_character.languages += new /datum/language/skrell + new_character.set_species("Skrell") + new_character.add_language("Skrellian") if(client.prefs.language == "Tajaran") if(is_alien_whitelisted(src, "Language_Tajaran") || !config.usealienwhitelist) - new_character.languages += new /datum/language/tajaran + new_character.add_language("Siik'mas") if(client.prefs.language == "Unathi") if(is_alien_whitelisted(src, "Language_Soghun") || !config.usealienwhitelist) - new_character.languages += new /datum/language/unathi + new_character.add_language("Sinta'unathi") if(client.prefs.language == "Skrell") if(is_alien_whitelisted(src, "Language_Skrell") || !config.usealienwhitelist) - new_character.languages += new /datum/language/skrell + new_character.add_language("Skrellian") if(ticker.random_players) new_character.gender = pick(MALE, FEMALE) diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 699e1f76ad..d3cdbcc02b 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -73,8 +73,8 @@ A.randomize_appearance_for(new_mob) var/mob/living/carbon/human/H = new_mob - var/newspecies = pick(typesof(/datum/species)-/datum/species) - H.set_species(new newspecies) + var/datum/species/newspecies = pick(all_species) + H.set_species(newspecies.name) else return