diff --git a/code/controllers/subsystem/characters/languages.dm b/code/controllers/subsystem/characters/languages.dm
index cbd58ffb11e..961768ad5b8 100644
--- a/code/controllers/subsystem/characters/languages.dm
+++ b/code/controllers/subsystem/characters/languages.dm
@@ -20,9 +20,15 @@
if(initial(L.abstract_type) == path)
continue
L = new path
+ if(!L.id)
+ stack_trace("no ID on language type [path]")
+ continue
if(language_lookup[L.id])
stack_trace("duped language id [L.id] on [path] skipped")
continue
+ if(!L.name)
+ stack_trace("no name on language type [path]")
+ continue
if(language_names[L.name])
stack_trace("duped language name [L.name] on [path] skipped")
continue
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index 8b43344fe8c..8d8d0216498 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -221,6 +221,7 @@ var/global/list/datum/gene/dna_genes[0]
// Technically custom_species is not part of the UI, but this place avoids merge problems.
src.custom_species = character.custom_species
src.base_species = character.species.base_species
+ src.species = character.species.name
src.blood_color = character.species.blood_color
src.species_traits = character.species.traits.Copy()
diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm
index 8b68097a6cd..8d666c88028 100644
--- a/code/modules/admin/view_variables/topic.dm
+++ b/code/modules/admin/view_variables/topic.dm
@@ -447,7 +447,7 @@
to_chat(usr, "Mob doesn't exist anymore")
return
- if(H.set_species(new_species))
+ if(H.set_species(new_species, force = TRUE))
to_chat(usr, "Set species of [H] to [H.species].")
else
to_chat(usr, "Failed! Something went wrong.")
diff --git a/code/modules/language/event.dm b/code/modules/language/event.dm
index 49a87bc9b31..ce72f530c5c 100644
--- a/code/modules/language/event.dm
+++ b/code/modules/language/event.dm
@@ -1,6 +1,7 @@
// todo: dynamic language creation system we shouldn't have this
//For your event purposes.
/datum/language/occursus
+ id = LANGUAGE_ID_EVENT_1
name = LANGUAGE_EVENT1
desc = "The Powers That Be have seen it fit to grace you with a special language that sounds like... something. This description should be overridden by the time you see this."
speech_verb = "says"
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 000bf1521ff..9ccb214e33d 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -268,7 +268,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/observer/dead/verb/reenter_corpse()
set category = "Ghost"
set name = "Re-enter Corpse"
- if(!client) return
+ if(!client)
+ return
if(!(mind && mind.current && can_reenter_corpse))
to_chat(src, "You have no body.")
return
diff --git a/code/modules/species/outsider/scori.dm b/code/modules/species/outsider/scori.dm
index 2d4bbeee981..3fa375ce14e 100644
--- a/code/modules/species/outsider/scori.dm
+++ b/code/modules/species/outsider/scori.dm
@@ -4,6 +4,7 @@
name_plural = SPECIES_SCORI
category = SPECIES_CATEGORY_RESTRICTED
default_language = LANGUAGE_ID_EVENT_1
+ intrinsic_languages = LANGUAGE_ID_EVENT_1
max_additional_languages = 2
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/bite)
rarity_value = 4
diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm
index 4714785f7b9..e861ca3f96e 100644
--- a/code/modules/species/species.dm
+++ b/code/modules/species/species.dm
@@ -54,7 +54,7 @@
var/galactic_language = TRUE
/// intrinsic species languages - list() or singular language or null
// todo: linter check for language default being in here
- var/list/intrinsic_languages = LANGUAGE_ID_COMMON
+ var/list/intrinsic_languages
/// language our name is in - used for namegen; null to force stock ss13 namegen instead
// todo: language for namegen is questionaable
var/name_language = LANGUAGE_ID_COMMON
@@ -507,8 +507,10 @@
*/
/datum/species/proc/on_apply(mob/living/carbon/human/H)
// todo: language sources and holder
- for(var/id in intrinsic_languages)
+ for(var/id in get_intrinsic_language_ids())
H.add_language(id)
+ if(galactic_language)
+ H.add_language(LANGUAGE_ID_COMMON)
if(holder_type)
H.holder_type = holder_type
@@ -530,8 +532,11 @@
*/
/datum/species/proc/on_remove(mob/living/carbon/human/H)
// todo: language sources and holder
- for(var/id in intrinsic_languages)
+ for(var/id in get_intrinsic_language_ids())
H.remove_language(id)
+ if(galactic_language)
+ H.remove_language(LANGUAGE_ID_COMMON)
+
remove_inherent_spells(H)
remove_inherent_verbs(H)
H.holder_type = null
diff --git a/tgui/packages/tgui/interfaces/SpeciesPicker.tsx b/tgui/packages/tgui/interfaces/SpeciesPicker.tsx
index ef35479bf2c..37f11774dcc 100644
--- a/tgui/packages/tgui/interfaces/SpeciesPicker.tsx
+++ b/tgui/packages/tgui/interfaces/SpeciesPicker.tsx
@@ -143,6 +143,7 @@ export const SpeciesPicker = (props, context) => {
))}