diff --git a/baystation12.dme b/baystation12.dme
index c7929f31df1..9348f106ce0 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -216,8 +216,6 @@
#include "code\game\gamemodes\setupgame.dm"
#include "code\game\gamemodes\autotraitor\autotraitor.dm"
#include "code\game\gamemodes\blob\blob.dm"
-#include "code\game\gamemodes\blob\blob_finish.dm"
-#include "code\game\gamemodes\blob\blob_report.dm"
#include "code\game\gamemodes\blob\theblob.dm"
#include "code\game\gamemodes\blob\blobs\core.dm"
#include "code\game\gamemodes\blob\blobs\factory.dm"
@@ -851,6 +849,7 @@
#include "code\modules\mob\death.dm"
#include "code\modules\mob\emote.dm"
#include "code\modules\mob\inventory.dm"
+#include "code\modules\mob\language.dm"
#include "code\modules\mob\login.dm"
#include "code\modules\mob\logout.dm"
#include "code\modules\mob\mob.dm"
@@ -881,6 +880,7 @@
#include "code\modules\mob\living\carbon\carbon_defines.dm"
#include "code\modules\mob\living\carbon\give.dm"
#include "code\modules\mob\living\carbon\shock.dm"
+#include "code\modules\mob\living\carbon\species.dm"
#include "code\modules\mob\living\carbon\alien\alien.dm"
#include "code\modules\mob\living\carbon\alien\death.dm"
#include "code\modules\mob\living\carbon\alien\login.dm"
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 81abf92546a..cafc1c58cd3 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -256,9 +256,12 @@ client
body += ""
body += ""
+ body += ""
+ body += ""
if(ishuman(D))
body += ""
body += ""
+ body += ""
body += ""
body += ""
body += ""
@@ -743,6 +746,63 @@ client
H.dna.mutantrace = new_mutantrace
H.update_mutantrace()
+ else if(href_list["setspecies"])
+ if(!check_rights(R_SPAWN)) return
+
+ var/mob/living/carbon/human/H = locate(href_list["setspecies"])
+ if(!istype(H))
+ 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)
+
+ if(!H)
+ usr << "Mob doesn't exist anymore"
+ return
+
+ if(H.set_species(new new_species))
+ usr << "Set species of [H] to [H.species]."
+ else
+ usr << "Failed! Something went wrong."
+
+ else if(href_list["addlanguage"])
+ if(!check_rights(R_SPAWN)) return
+
+ var/mob/H = locate(href_list["addlanguage"])
+ if(!istype(H))
+ 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)
+
+ if(!H)
+ usr << "Mob doesn't exist anymore"
+ return
+
+ if(H.add_language(new new_language))
+ usr << "Added [new_language] to [H]."
+ else
+ usr << "Mob already knows that language."
+
+ else if(href_list["remlanguage"])
+ if(!check_rights(R_SPAWN)) return
+
+ var/mob/H = locate(href_list["remlanguage"])
+ if(!istype(H))
+ usr << "This can only be done to instances of type /mob"
+ 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))
+ usr << "Removed [rem_language] from [H]."
+ else
+ usr << "Mob doesn't know that language."
+
else if(href_list["regenerateicons"])
if(!check_rights(0)) return
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 7cca20dfac0..e53053764b2 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -6,7 +6,7 @@ var/list/blob_cores = list()
var/list/blob_nodes = list()
-/datum/game_mode/blob
+/*/datum/game_mode/blob
name = "blob"
config_tag = "blob"
required_players = 0
@@ -130,3 +130,4 @@ var/list/blob_nodes = list()
stage = 3
return
+*/
\ No newline at end of file
diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm
index 6daacd3ffe4..fa4299c3c1b 100644
--- a/code/game/gamemodes/heist/heist.dm
+++ b/code/game/gamemodes/heist/heist.dm
@@ -95,10 +95,11 @@ var/global/vox_kills = 0 //Used to check the Inviolate.
var/mob/living/carbon/human/vox = raider.current
- vox.vox_talk_understand = 1
+ 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.h_style = "Short Vox Quills"
vox.equip_vox_raider()
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 124239dc82b..fd66d0c2c32 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -116,7 +116,7 @@
//Clonepod
//Start growing a human clone in the pod!
-/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/mrace)
+/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/datum/species/mrace)
if(mess || attempting)
return 0
var/datum/mind/clonemind = locate(mindref)
@@ -191,13 +191,11 @@
randmutb(H) //Sometimes the clones come out wrong.
H.f_style = "Shaved"
- if(mrace == "none") //no more xenos losing ears/tentacles
+ if(mrace.name == "Human") //no more xenos losing ears/tentacles
H.h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3")
- if(H.dna)
- H.dna.mutantrace = mrace
- H.update_mutantrace()
- H.update_mutantrace_languages()
+ H.species = mrace
+ H.update_mutantrace()
H.suiciding = 0
src.attempting = 0
return 1
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index edb4882cd2b..e29097a0308 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -443,10 +443,7 @@
subject.dna.check_integrity()
var/datum/data/record/R = new /datum/data/record( )
- if(subject.dna)
- R.fields["mrace"] = subject.dna.mutantrace
- else
- R.fields["mrace"] = null
+ R.fields["mrace"] = subject.species
R.fields["ckey"] = subject.ckey
R.fields["name"] = subject.real_name
R.fields["id"] = copytext(md5(subject.real_name), 2, 6)
diff --git a/code/game/machinery/podmen.dm b/code/game/machinery/podmen.dm
index 54fc75f19ac..5078dd379a5 100644
--- a/code/game/machinery/podmen.dm
+++ b/code/game/machinery/podmen.dm
@@ -117,6 +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.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 72e22b1c824..c5b20ecb924 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -507,13 +507,13 @@ client/proc/one_click_antag()
i++
newname += pick(list("ti","hi","ki","ya","ta","ha","ka","ya","chi","cha","kah"))
- new_vox.vox_talk_understand = 1
+ 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.dna.mutantrace = "vox" // Actually makes the vox! How about that.
+ new_vox.set_species(new /datum/species/vox) // Actually makes the vox! How about that.
new_vox.mind_initialize()
new_vox.mind.assigned_role = "MODE"
new_vox.mind.special_role = "Vox Raider"
diff --git a/code/modules/admin/verbs/vox_raiders.dm b/code/modules/admin/verbs/vox_raiders.dm
index d226500fa8d..65a0f65ad2c 100644
--- a/code/modules/admin/verbs/vox_raiders.dm
+++ b/code/modules/admin/verbs/vox_raiders.dm
@@ -35,9 +35,6 @@ var/global/vox_tick = 1
equip_to_slot_or_del(new /obj/item/weapon/storage/box/emps(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/device/multitool(src), slot_l_hand)
- var/obj/item/weapon/storage/pneumatic/W = new(src)
- W.tank = new /obj/item/weapon/tank/nitrogen(W)
- equip_to_slot_or_del(W, slot_r_hand)
if(3) // Vox saboteur!
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(src), slot_wear_suit)
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 1261642e4f6..0883b1a2747 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -132,10 +132,10 @@ proc/move_mining_shuttle()
usr.set_machine(src)
src.add_fingerprint(usr)
if(href_list["move"])
- if(ticker.mode.name == "blob")
- if(ticker.mode:declared)
- usr << "Under directive 7-10, [station_name()] is quarantined until further notice."
- return
+ //if(ticker.mode.name == "blob")
+ // if(ticker.mode:declared)
+ // usr << "Under directive 7-10, [station_name()] is quarantined until further notice."
+ // return
if (!mining_shuttle_moving)
usr << "\blue Shuttle recieved message and will be sent shortly."
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
new file mode 100644
index 00000000000..727437a19f2
--- /dev/null
+++ b/code/modules/mob/language.dm
@@ -0,0 +1,33 @@
+/*
+ Datum based languages. Easily editable and modular.
+*/
+
+/datum/language
+ var/name = "name" // Fluff name of language if any.
+ var/speech_verb // 'says', 'hisses', 'farts'.
+ var/colour // CSS style to use for strings in this language.
+ var/key // Character used to speak in language eg. :o for Unathi.
+
+/datum/language/unathi
+ name = "Sinta'unathi"
+ speech_verb = "hisses"
+ colour = "soghun"
+ key = "o"
+
+/datum/language/tajaran
+ name = "Siik'mas"
+ speech_verb = "mrowls"
+ colour = "tajaran"
+ key = "j"
+
+/datum/language/skrell
+ name = "Skrellian"
+ speech_verb = "warbles"
+ colour = "skrell"
+ key = "k"
+
+/datum/language/vox
+ name = "Vox-pidgin"
+ speech_verb = "shrieks"
+ colour = "vox"
+ key = "v"
\ 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 c67476f52c5..6b98ec7c1dc 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -5,15 +5,44 @@
icon = 'icons/mob/human.dmi'
icon_state = "body_m_s"
var/list/hud_list = list()
-
+ var/datum/species/species //Contains icon generation and language information, set during New().
/mob/living/carbon/human/dummy
real_name = "Test Dummy"
status_flags = GODMODE|CANPUSH
+/mob/living/carbon/human/skrell/New()
+ h_style = "Skrell Male Tentacles"
+ set_species(new /datum/species/skrell(src))
+ ..()
+/mob/living/carbon/human/tajaran/New()
+ h_style = "Tajaran Ears"
+ set_species(new /datum/species/tajaran(src))
+ ..()
+
+/mob/living/carbon/human/unathi/New()
+ h_style = "Unathi Horns"
+ set_species(new /datum/species/unathi(src))
+ ..()
+
+/mob/living/carbon/human/vox/New()
+ h_style = "Short Vox Quills"
+ species = new /datum/species/vox(src)
+ ..()
+
+/mob/living/carbon/human/diona/New()
+ species = new /datum/species/diona(src)
+ ..()
/mob/living/carbon/human/New()
+
+ if(!species)
+ set_species()
+
+ if(species.language)
+ languages += species.language
+
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
@@ -795,22 +824,14 @@
return
/mob/living/carbon/human/get_species()
- if(dna)
- switch(dna.mutantrace)
- if("lizard")
- return "Unathi"
- if("tajaran")
- return "Tajaran"
- if("skrell")
- return "Skrell"
- if("vox")
- return "Vox"
- if("plant")
- return "Mobile vegetation"
- if("golem")
- return "Animated Construct"
- else
- return "Human"
+
+ if(!species)
+ set_species()
+
+ if(dna && dna.mutantrace == "golem")
+ return "Animated Construct"
+
+ return species.name
/mob/living/carbon/get_species()
if(src.dna)
@@ -823,17 +844,6 @@
else if(src.dna.mutantrace == "vox")
return "vox"
-/mob/living/carbon/proc/update_mutantrace_languages()
- if(src.dna)
- if(src.dna.mutantrace == "lizard")
- src.soghun_talk_understand = 1
- else if(src.dna.mutantrace == "skrell")
- src.skrell_talk_understand = 1
- else if(src.dna.mutantrace == "tajaran")
- src.tajaran_talk_understand = 1
- else if(src.dna.mutantrace == "vox")
- src.vox_talk_understand = 1
-
/mob/living/carbon/human/proc/play_xylophone()
if(!src.xylophone)
visible_message("\red [src] begins playing his ribcage like a xylophone. It's quite spooky.","\blue You begin to play a spooky refrain on your ribcage.","\red You hear a spooky xylophone melody.")
@@ -1250,3 +1260,26 @@ 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)
+
+ if(!new_species)
+ new_species = new /datum/species/human
+
+ if(species)
+
+ if(species.name == new_species.name)
+ return
+
+ var/temp = species
+ species = new_species
+ del(temp)
+ else
+ species = new_species
+
+ spawn(0)
+ update_icons()
+
+ if(species)
+ return 1
+ else
+ return 0
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 92fb75a1c17..cb161b9d944 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -103,34 +103,19 @@
if("hurt")
- var/attack_verb
- if(M.dna)
- switch(M.dna.mutantrace)
- if("lizard")
- attack_verb = "scratch"
- if("tajaran")
- attack_verb = "scratch"
- if("plant")
- attack_verb = "slash"
- else
- attack_verb = "punch"
+ M.attack_log += text("\[[time_stamp()]\] [M.species.attack_verb]ed [src.name] ([src.ckey])")
+ src.attack_log += text("\[[time_stamp()]\] Has been [M.species.attack_verb]ed by [M.name] ([M.ckey])")
- M.attack_log += text("\[[time_stamp()]\] [attack_verb]ed [src.name] ([src.ckey])")
- src.attack_log += text("\[[time_stamp()]\] Has been [attack_verb]ed by [M.name] ([M.ckey])")
-
- log_attack("[M.name] ([M.ckey]) [attack_verb]ed [src.name] ([src.ckey])")
+ log_attack("[M.name] ([M.ckey]) [M.species.attack_verb]ed [src.name] ([src.ckey])")
var/damage = rand(0, 5)//BS12 EDIT
if(!damage)
- switch(attack_verb)
- if("slash")
- playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
- if("scratch")
- playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
- else
- playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
+ if(M.species.attack_verb == "punch")
+ playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
+ else
+ playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
- visible_message("\red [M] has attempted to [attack_verb] [src]!")
+ visible_message("\red [M] has attempted to [M.species.attack_verb] [src]!")
return 0
@@ -140,21 +125,18 @@
if(HULK in M.mutations) damage += 5
- switch(attack_verb)
- if("slash")
- playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
- if("scratch")
- playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
- else
- playsound(loc, "punch", 25, 1, -1)
+ if(M.species.attack_verb == "punch")
+ playsound(loc, "punch", 25, 1, -1)
+ else
+ playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
- visible_message("\red [M] has [attack_verb]ed [src]!")
+ visible_message("\red [M] has [M.species.attack_verb]ed [src]!")
//Rearranged, so claws don't increase weaken chance.
if(damage >= 5 && prob(50))
visible_message("\red [M] has weakened [src]!")
apply_effect(2, WEAKEN, armor_block)
- if(attack_verb == "scratch") damage += 5
+ if(M.species.attack_verb != "punch") damage += 5
apply_damage(damage, BRUTE, affecting, armor_block)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 45164ff77d3..608279c19c9 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -408,7 +408,7 @@
// Nitrogen, for Vox.
var/Nitrogen_pp = (breath.nitrogen/breath.total_moles())*breath_pressure
- if(O2_pp < safe_oxygen_min && src.dna.mutantrace!="vox") // Too little oxygen
+ if(O2_pp < safe_oxygen_min && species.name != "Vox") // Too little oxygen
if(prob(20))
spawn(0) emote("gasp")
if(O2_pp > 0)
@@ -426,7 +426,7 @@
oxyloss += 5*ratio
oxygen_used = breath.oxygen*ratio/6
oxygen_alert = max(oxygen_alert, 1)*/
- else if(Nitrogen_pp < safe_oxygen_min && src.dna.mutantrace=="vox") //Vox breathe nitrogen, not oxygen.
+ else if(Nitrogen_pp < safe_oxygen_min && species.name == "Vox") //Vox breathe nitrogen, not oxygen.
if(prob(20))
spawn(0) emote("gasp")
@@ -471,7 +471,7 @@
if(reagents)
reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
toxins_alert = max(toxins_alert, 1)
- else if(O2_pp > vox_oxygen_max && src.dna.mutantrace=="vox") //Oxygen is toxic to vox.
+ else if(O2_pp > vox_oxygen_max && species.name == "Vox") //Oxygen is toxic to vox.
var/ratio = (breath.oxygen/vox_oxygen_max) * 1000
adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
toxins_alert = max(toxins_alert, 1)
@@ -492,30 +492,30 @@
if( (abs(310.15 - breath.temperature) > 50) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :(
if(status_flags & GODMODE) return 1 //godmode
- if(breath.temperature < 260.15 && dna.mutantrace != "vox") //Vox are resistant to cold.
+ if(breath.temperature < species.cold_level_1)
if(prob(20))
src << "\red You feel your face freezing and an icicle forming in your lungs!"
- else if(breath.temperature > 360.15)
+ else if(breath.temperature > species.heat_level_1)
if(prob(20))
src << "\red You feel your face burning and a searing heat in your lungs!"
switch(breath.temperature)
- if(-INFINITY to 120)
+ if(-INFINITY to species.cold_level_3)
apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
- if(120 to 200 && dna.mutantrace != "vox") //Vox are resistant to cold.
+ if(species.cold_level_3 to species.cold_level_2)
apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
- if(200 to 260 && dna.mutantrace != "vox") //Vox are resistant to cold.
+ if(species.cold_level_2 to species.cold_level_1)
apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
- if(360 to 400)
+ if(species.heat_level_1 to species.heat_level_2)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
fire_alert = max(fire_alert, 2)
- if(400 to 1000)
+ if(species.heat_level_2 to species.heat_level_3)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
fire_alert = max(fire_alert, 2)
- if(1000 to INFINITY)
+ if(species.heat_level_3 to INFINITY)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
fire_alert = max(fire_alert, 2)
@@ -596,22 +596,22 @@
var/pressure = environment.return_pressure()
var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
if(status_flags & GODMODE) return 1 //godmode
- switch(adjusted_pressure)
- if(HAZARD_HIGH_PRESSURE to INFINITY)
- adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) )
- pressure_alert = 2
- if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE)
- pressure_alert = 1
- if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE)
- pressure_alert = 0
- if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
- pressure_alert = -1
+
+ if(adjusted_pressure >= species.hazard_high_pressure)
+ adjustBruteLoss( min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) )
+ pressure_alert = 2
+ else if(adjusted_pressure >= species.warning_high_pressure)
+ pressure_alert = 1
+ else if(adjusted_pressure >= species.warning_low_pressure)
+ pressure_alert = 0
+ else if(adjusted_pressure >= species.hazard_low_pressure)
+ pressure_alert = -1
+ else
+ if( !(COLD_RESISTANCE in mutations))
+ adjustBruteLoss( LOW_PRESSURE_DAMAGE )
+ pressure_alert = -2
else
- if( !(COLD_RESISTANCE in mutations) && src.dna.mutantrace!="vox") //Vox are resistant to pressure loss.
- adjustBruteLoss( LOW_PRESSURE_DAMAGE )
- pressure_alert = -2
- else
- pressure_alert = -1
+ pressure_alert = -1
if(environment.toxins > MOLES_PLASMA_VISIBLE)
pl_effects()
@@ -841,7 +841,7 @@
if(status_flags & GODMODE) return 0 //godmode
adjustToxLoss(total_plasmaloss)
- if(PLANT in mutations || (dna && dna.mutantrace == "plant"))
+ if(species.flags & REQUIRE_LIGHT)
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
if(isturf(loc)) //else, there's considered to be no light
var/turf/T = loc
@@ -899,7 +899,7 @@
if(overeatduration > 1)
overeatduration -= 2 //doubled the unfat rate
- if(PLANT in mutations || (dna && dna.mutantrace == "plant"))
+ if(species.flags & REQUIRE_LIGHT)
if(nutrition < 200)
take_overall_damage(2,0)
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 4a4d6cf0d96..fbc06d00c6b 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -68,7 +68,7 @@
message = replacetext(message, "u", "µ")
message = replacetext(message, "b", "ß")
- else if(istype(wear_mask, /obj/item/clothing/mask/luchador))
+ /*else if(istype(wear_mask, /obj/item/clothing/mask/luchador))
if(copytext(message, 1, 2) != "*")
message = replacetext(message, "captain", "CAPITÁN")
message = replacetext(message, "station", "ESTACIÓN")
@@ -88,7 +88,7 @@
message = replacetext(message, "wizard", "mago")
message = uppertext(message) //Things end up looking better this way (no mixed cases), and it fits the macho wrestler image.
if(prob(25))
- message += " OLE!"
+ message += " OLE!"*/
else if(istype(wear_mask, /obj/item/clothing/mask/horsehead))
var/obj/item/clothing/mask/horsehead/hoers = wear_mask
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index eed0e94f1ef..1526203f9ba 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -220,14 +220,12 @@ proc/get_damage_icon_part(damage_state, body_part)
var/husk_color_mod = rgb(96,88,80)
var/hulk_color_mod = rgb(48,224,40)
- //var/plant_color_mod = rgb(144,224,144)
var/necrosis_color_mod = rgb(10,50,0)
var/husk = (HUSK in src.mutations) //100% unnecessary -Agouri //nope, do you really want to iterate through src.mutations repeatedly? -Pete
var/fat = (FAT in src.mutations)
var/hulk = (HULK in src.mutations)
var/skeleton = (SKELETON in src.mutations)
- var/plant = (PLANT in src.mutations || (dna && dna.mutantrace == "plant"))
var/g = "m"
if(gender == FEMALE) g = "f"
@@ -240,8 +238,6 @@ proc/get_damage_icon_part(damage_state, body_part)
else if(hulk)
var/list/TONE = ReadRGB(hulk_color_mod)
stand_icon.MapColors(rgb(TONE[1],0,0),rgb(0,TONE[2],0),rgb(0,0,TONE[3]))
- //else if(plant)
- // stand_icon.ColorTone(plant_color_mod)
var/datum/organ/external/head = get_organ("head")
var/has_head = 0
@@ -269,8 +265,6 @@ proc/get_damage_icon_part(damage_state, body_part)
else if(hulk)
var/list/TONE = ReadRGB(hulk_color_mod)
temp.MapColors(rgb(TONE[1],0,0),rgb(0,TONE[2],0),rgb(0,0,TONE[3]))
- //else if(plant)
- // temp.ColorTone(plant_color_mod)
//That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST
//And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part)
@@ -293,7 +287,7 @@ proc/get_damage_icon_part(damage_state, body_part)
stand_icon.Blend(temp, ICON_OVERLAY)
//Skin tone
- if(!skeleton && !husk && !hulk && !plant)
+ if(!skeleton && !husk && !hulk && (species.flags & HAS_SKIN_TONE))
if(s_tone >= 0)
stand_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
else
@@ -309,18 +303,16 @@ proc/get_damage_icon_part(damage_state, body_part)
if(has_head)
//Eyes
if(!skeleton)
- var/icon/eyes_s = new/icon('icons/mob/human_face.dmi', "eyes_s")
- if(src.get_species()=="Vox")
- eyes_s = new/icon('icons/mob/human_face.dmi', "vox_eyes_s")
- eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
- stand_icon.Blend(eyes_s, ICON_OVERLAY)
+ var/icon/eyes = new/icon('icons/mob/human_face.dmi', species.eyes)
+ eyes.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
+ stand_icon.Blend(eyes, ICON_OVERLAY)
- //Mouth (lipstick!)
- if(lip_style) //skeletons are allowed to wear lipstick no matter what you think, agouri.
- stand_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_s"), ICON_OVERLAY)
+ //Mouth (lipstick!)
+ if(lip_style && (species && species.flags & HAS_LIPS)) //skeletons are allowed to wear lipstick no matter what you think, agouri.
+ stand_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_s"), ICON_OVERLAY)
//Underwear
- if(underwear >0 && underwear < 12 && (src.dna.mutantrace != "vox" && src.dna.mutantrace != "plant" && src.dna.mutantrace != "kidan"))
+ if(underwear >0 && underwear < 12 && species.flags & HAS_UNDERWEAR)
if(!fat && !skeleton)
stand_icon.Blend(new /icon('icons/mob/human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY)
@@ -429,48 +421,23 @@ proc/get_damage_icon_part(damage_state, body_part)
var/skeleton = (SKELETON in src.mutations)
if(skeleton)
race_icon = 'icons/mob/human_races/r_skeleton.dmi'
- else if(dna)
- switch(dna.mutantrace)
- if("tajaran")
- race_icon = 'icons/mob/human_races/r_tajaran.dmi'
- deform_icon = 'icons/mob/human_races/r_def_tajaran.dmi'
- if("lizard")
- race_icon = 'icons/mob/human_races/r_lizard.dmi'
- deform_icon = 'icons/mob/human_races/r_def_lizard.dmi'
- if("skrell")
- race_icon = 'icons/mob/human_races/r_skrell.dmi'
- deform_icon = 'icons/mob/human_races/r_def_skrell.dmi'
- if("vox")
- race_icon = 'icons/mob/human_races/r_vox.dmi'
- deform_icon = 'icons/mob/human_races/r_def_vox.dmi'
- if("plant")
- race_icon = 'icons/mob/human_races/r_plant.dmi'
- deform_icon = 'icons/mob/human_races/r_def_plant.dmi'
- else
- race_icon = 'icons/mob/human_races/r_human.dmi'
- deform_icon = 'icons/mob/human_races/r_def_human.dmi'
else
- icon = 'icons/mob/human_races/r_human.dmi'
+ //Icon data is kept in species datums within the mob.
+ race_icon = species.icobase
+ deform_icon = species.deform
if(dna)
switch(dna.mutantrace)
if("golem","slime","shadow","adamantine")
overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_l")
overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_s")
- // if("lizard","tajaran","skrell")
- // overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[gender]_l")
- // overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[gender]_s")
- // if("plant")
- // if(stat == DEAD) //TODO
- // overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace]_d")
- // else
- // overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_l")
- // overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_s")
else
overlays_lying[MUTANTRACE_LAYER] = null
overlays_standing[MUTANTRACE_LAYER] = null
+
if(!dna || !(dna.mutantrace in list("golem","metroid")))
update_body(0)
+
update_hair(0)
if(update_icons) update_icons()
@@ -807,15 +774,11 @@ proc/get_damage_icon_part(damage_state, body_part)
/mob/living/carbon/human/proc/update_tail_showing(var/update_icons=1)
overlays_lying[TAIL_LAYER] = null
overlays_standing[TAIL_LAYER] = null
- var/cur_species = get_species()
- if( cur_species == "Tajaran")
+
+ if(species.tail && species.flags & HAS_TAIL)
if(!wear_suit || !(wear_suit.flags_inv & HIDEJUMPSUIT) && !istype(wear_suit, /obj/item/clothing/suit/space))
- overlays_lying[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "tajtail_l")
- overlays_standing[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "tajtail_s")
- else if( cur_species == "Unathi")
- if(!wear_suit || !(wear_suit.flags_inv & HIDEJUMPSUIT) && !istype(wear_suit, /obj/item/clothing/suit/space))
- overlays_lying[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "sogtail_l")
- overlays_standing[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "sogtail_s")
+ overlays_lying[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_l")
+ overlays_standing[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s")
if(update_icons)
update_icons()
diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm
new file mode 100644
index 00000000000..62c8a6273b6
--- /dev/null
+++ b/code/modules/mob/living/carbon/species.dm
@@ -0,0 +1,100 @@
+#define NO_EAT 1
+#define NO_BREATHE 2
+#define NO_SLEEP 4
+#define NO_SHOCK 8
+#define NO_SCAN 16
+#define NON_GENDERED 32
+#define REQUIRE_LIGHT 64
+#define WHITELISTED 128
+#define HAS_SKIN_TONE 256
+#define HAS_LIPS 512
+#define HAS_UNDERWEAR 1024
+#define HAS_TAIL 2048
+#define IS_PLANT 4096
+
+/*
+ Datum-based species. Should make for much cleaner and easier to maintain mutantrace code.
+*/
+
+/datum/species
+ var/name // Species name.
+
+ var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
+ var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set.
+ var/eyes = "eyes_s" // Icon for eyes.
+
+ 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/attack_verb = "punch" // Empty hand hurt intent verb.
+
+ var/breath_type // Non-oxygen gas breathed, if any.
+
+ var/cold_level_1 = 260 // Cold damage level 1 below this point.
+ var/cold_level_2 = 200 // Cold damage level 2 below this point.
+ var/cold_level_3 = 120 // Cold damage level 3 below this point.
+
+ var/heat_level_1 = 360 // Heat damage level 1 above this point.
+ var/heat_level_2 = 400 // Heat damage level 2 above this point.
+ var/heat_level_3 = 1000 // Heat damage level 2 above this point.
+
+ var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure.
+ var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning.
+ var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning.
+ var/hazard_low_pressure = HAZARD_LOW_PRESSURE // Dangerously low pressure.
+
+ var/brute_resist // Physical damage reduction.
+ var/burn_resist // Burn damage reduction.
+
+ var/flags = 0 // Various specific features.
+
+/datum/species/human
+ name = "Human"
+ flags = HAS_LIPS | HAS_UNDERWEAR
+
+/datum/species/unathi
+ name = "Unathi"
+ icobase = 'icons/mob/human_races/r_lizard.dmi'
+ deform = 'icons/mob/human_races/r_def_lizard.dmi'
+ language = new /datum/language/unathi
+ tail = "sogtail"
+ attack_verb = "scratch"
+
+ flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL
+
+/datum/species/tajaran
+ name = "Tajara"
+ icobase = 'icons/mob/human_races/r_tajaran.dmi'
+ deform = 'icons/mob/human_races/r_def_tajaran.dmi'
+ language = new /datum/language/tajaran
+ tail = "tajtail"
+ attack_verb = "scratch"
+
+ flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL
+
+/datum/species/skrell
+ name = "Skrell"
+ icobase = 'icons/mob/human_races/r_skrell.dmi'
+ deform = 'icons/mob/human_races/r_def_skrell.dmi'
+ language = new /datum/language/skrell
+
+ flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR
+
+/datum/species/vox
+ name = "Vox"
+ icobase = 'icons/mob/human_races/r_vox.dmi'
+ deform = 'icons/mob/human_races/r_def_vox.dmi'
+ language = new /datum/language/vox
+
+ eyes = "vox_eyes_s"
+ breath_type = "nitrogen"
+
+ flags = NO_SCAN
+
+/datum/species/diona
+ name = "Diona"
+ icobase = 'icons/mob/human_races/r_plant.dmi'
+ deform = 'icons/mob/human_races/r_def_plant.dmi'
+ attack_verb = "slash"
+
+ flags = NO_EAT | NO_BREATHE | REQUIRE_LIGHT | NON_GENDERED | NO_SCAN | IS_PLANT
\ No newline at end of file
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 420e20a1b92..28d49b39043 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -85,6 +85,8 @@ var/list/department_radio_keys = list(
if(dongle.translate_hive) return 1
/mob/living/say(var/message)
+
+ //world << "[src] speaks! [message]"
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
message = capitalize(message)
@@ -123,11 +125,14 @@ var/list/department_radio_keys = list(
var/italics = 0
var/message_range = null
var/message_mode = null
+ var/datum/language/speaking //For use if a specific language is being spoken.
+ // If brain damaged, talk on headset at random.
if (getBrainLoss() >= 60 && prob(50))
if (ishuman(src))
message_mode = "headset"
- // Special message handling
+
+ // General public key. Special message handling
else if (copytext(message, 1, 2) == ";")
if (ishuman(src))
message_mode = "headset"
@@ -138,6 +143,12 @@ var/list/department_radio_keys = list(
else if (length(message) >= 2)
var/channel_prefix = copytext(message, 1, 3)
+ //Check if the person is speaking a language that they know.
+ for(var/datum/language/L in languages)
+ if(lowertext(channel_prefix) == ":[L.key]")
+ //world << "Key [L.key] matches [lowertext(channel_prefix)] for [src]."
+ speaking = L
+ break
message_mode = department_radio_keys[channel_prefix]
//world << "channel_prefix=[channel_prefix]; message_mode=[message_mode]"
if (message_mode)
@@ -183,11 +194,6 @@ var/list/department_radio_keys = list(
message += "Z"
*/
var/list/obj/item/used_radios = new
-
- var/is_speaking_skrell = 0
- var/is_speaking_soghun = 0
- var/is_speaking_taj = 0
- var/is_speaking_vox = 0
var/is_speaking_radio = 0
switch (message_mode)
@@ -274,22 +280,6 @@ var/list/department_radio_keys = list(
message_range = 1
italics = 1
- if ("tajaran")
- if(tajaran_talk_understand || universal_speak)
- is_speaking_taj = 1
-
- if ("soghun")
- if(soghun_talk_understand || universal_speak)
- is_speaking_soghun = 1
-
- if ("skrell")
- if(skrell_talk_understand || universal_speak)
- is_speaking_skrell = 1
-
- if ("vox")
- if(vox_talk_understand || universal_speak)
- is_speaking_vox = 1
-
if("changeling")
if(mind && mind.changeling)
for(var/mob/Changeling in mob_list)
@@ -377,20 +367,31 @@ var/list/department_radio_keys = list(
for (var/M in listening)
if(hascall(M,"say_understands"))
- if (M:say_understands(src) && !is_speaking_skrell && !is_speaking_soghun && !is_speaking_vox && !is_speaking_taj)
+ if (M:say_understands(src) && !speaking)
+ //world << "[M] understood [src] (0)."
heard_a += M
else if(ismob(M))
- if(is_speaking_skrell && (M:skrell_talk_understand || M:universal_speak))
- heard_a += M
- else if(is_speaking_soghun && (M:soghun_talk_understand || M:universal_speak))
- heard_a += M
- else if(is_speaking_taj && (M:tajaran_talk_understand || M:universal_speak))
- heard_a += M
- else if(is_speaking_vox && (M:vox_talk_understand || M:universal_speak))
- heard_a += M
+
+ // If speaking is set, it means that a language has been found that uses the given key.
+ // If it hasn't, then they are likely just speaking English.
+
+ var/understood
+ var/mob/P = M
+ if (speaking)
+ for(var/datum/language/L in P.languages)
+ if(speaking.name == L.name)
+ understood = 1
+ if(understood)
+ //world << "[M] understood [src] (1)."
+ heard_a += M
+ else
+ //world << "[M] didn't understand [src]."
+ heard_b += M
else
- heard_b += M
+ heard_a += M
+
else
+ //world << "[M] understood [src] (2)."
heard_a += M
var/speech_bubble_test = say_test(message)
@@ -403,7 +404,7 @@ var/list/department_radio_keys = list(
var/rendered = null
if (length(heard_a))
- var/message_a = say_quote(message,is_speaking_soghun,is_speaking_skrell,is_speaking_taj,is_speaking_vox)
+ var/message_a = say_quote(message,speaking)
if (italics)
message_a = "[message_a]"
@@ -428,7 +429,7 @@ var/list/department_radio_keys = list(
message_b = voice_message
else
message_b = stars(message)
- message_b = say_quote(message_b,is_speaking_soghun,is_speaking_skrell,is_speaking_taj,is_speaking_vox)
+ message_b = say_quote(message_b,speaking)
if (italics)
message_b = "[message_b]"
diff --git a/code/modules/mob/living/simple_animal/vox.dm b/code/modules/mob/living/simple_animal/vox.dm
index 66d580c0d93..f3354ce8561 100644
--- a/code/modules/mob/living/simple_animal/vox.dm
+++ b/code/modules/mob/living/simple_animal/vox.dm
@@ -18,7 +18,6 @@
attack_sound = 'sound/weapons/bladeslice.ogg'
status_flags = 0
universal_speak = 1
- vox_talk_understand = 1
var/armour = null
var/amp = null
@@ -102,7 +101,7 @@
M << "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]"
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
- if(H.dna.mutantrace == "vox")
+ if(H.species.name == "Vox")
return
H << "\red Your nose begins to bleed..."
H.drip(1)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index adc535e70d9..0bd78027093 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -956,3 +956,22 @@ mob/verb/yank_out_object()
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
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 45391a31f66..6cbd091c0c1 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -86,9 +86,9 @@
var/lastpuke = 0
var/unacidable = 0
var/small = 0
- var/list/pinned = list() //List of things pinning this creature to walls (see living_defense.dm)
- var/list/embedded = list() //Embedded items, since simple mobs don't have organs.
-
+ var/list/pinned = list() //List of things pinning this creature to walls (see living_defense.dm)
+ var/list/embedded = list() //Embedded items, since simple mobs don't have organs.
+ var/list/languages = list() // For speaking/listening.
var/name_archive //For admin things like possession
var/timeofdeath = 0.0//Living
@@ -211,10 +211,6 @@
var/universal_speak = 0 // Set to 1 to enable the mob to speak to everyone -- TLE
var/robot_talk_understand = 0
var/alien_talk_understand = 0
- var/tajaran_talk_understand = 0
- var/soghun_talk_understand = 0
- var/skrell_talk_understand = 0
- var/vox_talk_understand = 0
var/has_limbs = 1 //Whether this mob have any limbs he can move with
var/can_stand = 1 //Whether this mob have ability to stand
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index e808a608da9..06575f9fa79 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -349,31 +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.dna.mutantrace = "tajaran"
- new_character.tajaran_talk_understand = 1
+ new_character.set_species(new /datum/species/tajaran)
+ new_character.languages += new /datum/language/tajaran
if(client.prefs.species == "Unathi")
if(is_alien_whitelisted(src, "Soghun") || !config.usealienwhitelist)
- new_character.dna.mutantrace = "lizard"
- new_character.soghun_talk_understand = 1
+ new_character.set_species(new /datum/species/unathi)
+ new_character.languages += new /datum/language/unathi
if(client.prefs.species == "Skrell")
if(is_alien_whitelisted(src, "Skrell") || !config.usealienwhitelist)
- new_character.dna.mutantrace = "skrell"
- new_character.skrell_talk_understand = 1
- if(client.prefs.species == "Vox")
- if(is_alien_whitelisted(src, "Vox"|| !config.usealienwhitelist))
- new_character.dna.mutantrace = "vox"
- new_character.vox_talk_understand = 1
+ new_character.set_species(new /datum/species/skrell)
+ new_character.languages += new /datum/language/skrell
if(client.prefs.language == "Tajaran")
if(is_alien_whitelisted(src, "Language_Tajaran") || !config.usealienwhitelist)
- new_character.tajaran_talk_understand = 1
+ new_character.languages += new /datum/language/tajaran
if(client.prefs.language == "Unathi")
if(is_alien_whitelisted(src, "Language_Soghun") || !config.usealienwhitelist)
- new_character.soghun_talk_understand = 1
+ new_character.languages += new /datum/language/unathi
if(client.prefs.language == "Skrell")
if(is_alien_whitelisted(src, "Language_Skrell") || !config.usealienwhitelist)
- new_character.skrell_talk_understand = 1
-
+ new_character.languages += new /datum/language/skrell
if(ticker.random_players)
new_character.gender = pick(MALE, FEMALE)
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index b6452266a00..a2786198e1e 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -74,19 +74,15 @@
return 1
return 0
-/mob/proc/say_quote(var/text,var/is_speaking_soghun,var/is_speaking_skrell,var/is_speaking_tajaran,var/is_speaking_vox)
+/mob/proc/say_quote(var/text,var/datum/language/speaking)
if(!text)
return "says, \"...\""; //not the best solution, but it will stop a large number of runtimes. The cause is somewhere in the Tcomms code
//tcomms code is still runtiming somewhere here
var/ending = copytext(text, length(text))
- if (is_speaking_soghun)
- return "hisses, \"[text]\"";
- if (is_speaking_skrell)
- return "warbles, \"[text]\"";
- if (is_speaking_tajaran)
- return "mrowls, \"[text]\"";
- if (is_speaking_vox)
- return "chirps, \"[text]\"";
+
+ if (speaking)
+ return "[speaking.speech_verb], \"[text]\"";
+
//Needs Virus2
// if (src.disease_symptoms & DISEASE_HOARSE)
// return "rasps, \"[text]\"";
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index 8cf63f673cc..45828edc2aa 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -84,7 +84,7 @@
broken = 1
//Moving around with fractured ribs won't do you any good
- if (broken && internal_organs && prob(15))
+ if (broken && E.internal_organs && prob(15))
if (!lying && world.timeofday - l_move_time < 15)
var/datum/organ/internal/I = pick(E.internal_organs)
custom_pain("You feel broken bones moving in your [E.display_name]!", 1)
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 2dfecd2a9c7..0db5b9a489d 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -738,20 +738,7 @@ obj/item/weapon/organ/New(loc, mob/living/carbon/human/H)
//Setting base icon for this mob's race
if(ishuman(H) && H.dna)
- var/icon/base
- switch(H.dna.mutantrace)
- if("tajaran")
- base = new('icons/mob/human_races/r_tajaran.dmi')
- if("lizard")
- base = new('icons/mob/human_races/r_lizard.dmi')
- if("skrell")
- base = new('icons/mob/human_races/r_skrell.dmi')
-
- if("vox")
- base = new('icons/mob/human_races/r_vox.dmi')
-
- else
- base = new('icons/mob/human_races/r_human.dmi')
+ var/icon/base = new H.species.icobase
if(base)
icon = base.MakeLying()
else
diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm
index 2b4b4c457d8..699e1f76ad1 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
- if(H.dna)
- H.dna.mutantrace = pick("lizard","tajaran","skrell","golem","slime","plant","vox",4;"")
+ var/newspecies = pick(typesof(/datum/species)-/datum/species)
+ H.set_species(new newspecies)
else
return
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 5c644d6c1b1..70a5e9e326e 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -80,26 +80,28 @@
on_hit(var/atom/target, var/blocked = 0)
var/mob/living/M = target
// if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //Plantmen possibly get mutated and damaged by the rays.
- if(ishuman(target) && (PLANT in M.mutations)) //Plantmen possibly get mutated and damaged by the rays.
- if(prob(15))
- M.apply_effect((rand(30,80)),IRRADIATE)
- M.Weaken(5)
- for (var/mob/V in viewers(src))
- V.show_message("\red [M] writhes in pain as \his vacuoles boil.", 3, "\red You hear the crunching of leaves.", 2)
- if(prob(35))
- // for (var/mob/V in viewers(src)) //Public messages commented out to prevent possible metaish genetics experimentation and stuff. - Cheridan
- // V.show_message("\red [M] is mutated by the radiation beam.", 3, "\red You hear the snapping of twigs.", 2)
- if(prob(80))
- randmutb(M)
- domutcheck(M,null)
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = M
+ if((H.species.flags & IS_PLANT) && (M.nutrition < 500))
+ if(prob(15))
+ M.apply_effect((rand(30,80)),IRRADIATE)
+ M.Weaken(5)
+ for (var/mob/V in viewers(src))
+ V.show_message("\red [M] writhes in pain as \his vacuoles boil.", 3, "\red You hear the crunching of leaves.", 2)
+ if(prob(35))
+ // for (var/mob/V in viewers(src)) //Public messages commented out to prevent possible metaish genetics experimentation and stuff. - Cheridan
+ // V.show_message("\red [M] is mutated by the radiation beam.", 3, "\red You hear the snapping of twigs.", 2)
+ if(prob(80))
+ randmutb(M)
+ domutcheck(M,null)
+ else
+ randmutg(M)
+ domutcheck(M,null)
else
- randmutg(M)
- domutcheck(M,null)
- else
- M.adjustFireLoss(rand(5,15))
- M.show_message("\red The radiation beam singes you!")
- // for (var/mob/V in viewers(src))
- // V.show_message("\red [M] is singed by the radiation beam.", 3, "\red You hear the crackle of burning leaves.", 2)
+ M.adjustFireLoss(rand(5,15))
+ M.show_message("\red The radiation beam singes you!")
+ // for (var/mob/V in viewers(src))
+ // V.show_message("\red [M] is singed by the radiation beam.", 3, "\red You hear the crackle of burning leaves.", 2)
else if(istype(target, /mob/living/carbon/))
// for (var/mob/V in viewers(src))
// V.show_message("The radiation beam dissipates harmlessly through [M]", 3)
@@ -118,8 +120,9 @@
on_hit(var/atom/target, var/blocked = 0)
var/mob/M = target
// if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //These rays make plantmen fat.
- if(ishuman(target) && (PLANT in M.mutations)) //These rays make plantmen fat.
- if(M.nutrition < 500) //sanity check
+ if(ishuman(target)) //These rays make plantmen fat.
+ var/mob/living/carbon/human/H = M
+ if((H.species.flags & IS_PLANT) && (M.nutrition < 500))
M.nutrition += 30
else if (istype(target, /mob/living/carbon/))
M.show_message("\blue The radiation beam dissipates harmlessly through your body.")
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 81dceaf7eb4..2a8f6db50db 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -1257,7 +1257,7 @@ datum
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.dna)
- if(H.dna.mutantrace == "plant") //plantmen take a LOT of damage
+ if(H.species.flags & IS_PLANT) //plantmen take a LOT of damage
H.adjustToxLoss(10)
plasma
@@ -3463,4 +3463,4 @@ datum
else if(data >= 115 && prob(33))
M.confused = max(M.confused+15,15)
..()
- return
+ return
diff --git a/code/modules/research/research_shuttle.dm b/code/modules/research/research_shuttle.dm
index 875c33fe8bb..1fe54587498 100644
--- a/code/modules/research/research_shuttle.dm
+++ b/code/modules/research/research_shuttle.dm
@@ -81,10 +81,10 @@ proc/move_research_shuttle()
usr.machine = src
src.add_fingerprint(usr)
if(href_list["move"])
- if(ticker.mode.name == "blob")
- if(ticker.mode:declared)
- usr << "Under directive 7-10, [station_name()] is quarantined until further notice."
- return
+ //if(ticker.mode.name == "blob")
+ // if(ticker.mode:declared)
+ // usr << "Under directive 7-10, [station_name()] is quarantined until further notice."
+ // return
if (!research_shuttle_moving)
usr << "\blue Shuttle recieved message and will be sent shortly."