From 96e57fc09134072506933fe0559c63fdf4a0647a Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Tue, 7 Oct 2014 08:54:05 +1030 Subject: [PATCH 1/2] Bunch of minor fixes for xenomorphs and borer husks. --- code/game/machinery/adv_med.dm | 9 ++++++- code/modules/mob/language.dm | 20 ++++++++++++--- code/modules/mob/living/carbon/alien/say.dm | 3 +++ code/modules/mob/living/carbon/brain/MMI.dm | 8 +++++- .../mob/living/carbon/brain/brain_item.dm | 6 +++++ .../mob/living/carbon/human/alien/alien.dm | 4 --- .../carbon/human/alien/alien_species.dm | 23 ++++++++++++++---- code/modules/mob/living/carbon/human/life.dm | 13 +++++++++- code/modules/mob/living/carbon/human/say.dm | 7 ++++++ .../mob/living/carbon/human/species.dm | 11 +++++++++ code/modules/organs/organ_alien.dm | 20 +++++++++------ code/modules/organs/organ_internal.dm | 3 +++ code/modules/organs/organ_objects.dm | 3 +++ code/modules/surgery/organs_internal.dm | 18 ++++++++++---- icons/obj/surgery.dmi | Bin 14638 -> 14743 bytes 15 files changed, 121 insertions(+), 27 deletions(-) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 7819a34e1a..963b07df0f 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -296,7 +296,8 @@ "tg_diseases_list" = H.viruses.Copy(), "lung_ruptured" = H.is_lung_ruptured(), "external_organs" = H.organs.Copy(), - "internal_organs" = H.internal_organs.Copy() + "internal_organs" = H.internal_organs.Copy(), + "species_organs" = H.species.has_organ //Just pass a reference for this, it shouldn't ever be modified outside of the datum. ) return occupant_data @@ -413,6 +414,7 @@ dat += "" for(var/datum/organ/internal/i in occ["internal_organs"]) + var/mech = "" if(i.robotic == 1) mech = "Assisted:" @@ -439,6 +441,11 @@ dat += "" dat += "" + var/list/species_organs = occ["species_organs"] + for(var/organ_name in species_organs) + if(!locate(species_organs[organ_name]) in occ["internal_organs"]) + dat += text("No [organ_name] detected.
") + if(occ["sdisabilities"] & BLIND) dat += text("Cataracts detected.
") if(occ["sdisabilities"] & NEARSIGHTED) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 383d20ff18..feae925a86 100755 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -22,12 +22,16 @@ if(istype(player,/mob/dead)) understood = 1 - else if(src in player.languages) + else if((src in player.languages) && check_special_condition(player)) understood = 1 if(understood) if(!speaker_mask) speaker_mask = speaker.name - player << "[name], [speaker_mask] [speech_verb], \"[message]\"" + var/msg = "[name], [speaker_mask] [speech_verb], \"[message]\"" + player << "[msg]" + +/datum/language/proc/check_special_condition(var/mob/other) + return 1 /datum/language/unathi name = "Sinta'unathi" @@ -99,6 +103,16 @@ key = "a" flags = RESTRICTED | HIVEMIND +/datum/language/xenos/check_special_condition(var/mob/other) + + var/mob/living/carbon/M = other + if(!istype(M)) + return 1 + if(locate(/datum/organ/internal/xenos/hivenode) in M.internal_organs) + return 1 + + return 0 + /datum/language/ling name = "Changeling" desc = "Although they are normally wary and suspicious of each other, changelings can commune over a distance." @@ -116,7 +130,7 @@ /datum/language/corticalborer name = "Cortical Link" - desc = "Cortical borers possess a strange between their tiny minds." + desc = "Cortical borers possess a strange link between their tiny minds." speech_verb = "sings" colour = "alien" key = "x" diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm index f822078885..e58e193a6e 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -12,6 +12,9 @@ if(stat == 2) return say_dead(message) + if(copytext(message,1,2) == "*") + return emote(copytext(message,2)) + var/datum/language/speaking = null if(length(message) >= 2) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index ae2ed01192..5daa904bf6 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -23,9 +23,15 @@ attackby(var/obj/item/O as obj, var/mob/user as mob) if(istype(O,/obj/item/organ/brain) && !brainmob) //Time to stick a brain in it --NEO - if(!O:brainmob) + + var/obj/item/organ/brain/B = O + if(B.health <= 0) + user << "\red That brain is well and truly dead." + return + else if(!B:brainmob) user << "\red You aren't sure where this brain came from, but you're pretty sure it's a useless brain." return + for(var/mob/V in viewers(src, null)) V.show_message(text("\blue [user] sticks \a [O] into \the [src].")) diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index d2ba4fbb94..382af96282 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -17,6 +17,12 @@ var/mob/living/carbon/brain/brainmob = null +/obj/item/organ/brain/xeno + name = "thinkpan" + desc = "It looks kind of like an enormous wad of purple bubblegum." + icon = 'icons/mob/alien.dmi' + icon_state = "chitin" + /obj/item/organ/brain/New() ..() spawn(5) diff --git a/code/modules/mob/living/carbon/human/alien/alien.dm b/code/modules/mob/living/carbon/human/alien/alien.dm index 4c5c9e739b..e1caf89324 100644 --- a/code/modules/mob/living/carbon/human/alien/alien.dm +++ b/code/modules/mob/living/carbon/human/alien/alien.dm @@ -23,10 +23,6 @@ proc/create_new_xenomorph(var/alien_caste,var/target) h_style = "Bald" ..(new_loc, "Xenomorph Queen") -/mob/living/carbon/human/Stat() - - ..() - // I feel like we should generalize/condense down all the various icon-rendering antag procs. /*---------------------------------------- Proc: AddInfectionImages() diff --git a/code/modules/mob/living/carbon/human/alien/alien_species.dm b/code/modules/mob/living/carbon/human/alien/alien_species.dm index c1c820a17f..09c8a19b13 100644 --- a/code/modules/mob/living/carbon/human/alien/alien_species.dm +++ b/code/modules/mob/living/carbon/human/alien/alien_species.dm @@ -6,6 +6,7 @@ secondary_unarmed_type = /datum/unarmed_attack/bite/strong hud_type = /datum/hud_data/alien rarity_value = 3 + speaks_common = 0 has_fine_manipulation = 0 insulated = 1 @@ -40,7 +41,7 @@ has_organ = list( "heart" = /datum/organ/internal/heart, "lungs" = /datum/organ/internal/lungs, - "brain" = /datum/organ/internal/brain, + "brain" = /datum/organ/internal/brain/xeno, "plasma vessel" = /datum/organ/internal/xenos/plasmavessel, "hive node" = /datum/organ/internal/xenos/hivenode, "nutrient vessel" = /datum/organ/internal/diona/nutrients @@ -51,6 +52,18 @@ var/weeds_heal_rate = 1 // Health regen on weeds. var/weeds_plasma_rate = 5 // Plasma regen on weeds. +/datum/species/xenos/can_understand(var/mob/other) + + if(istype(other,/mob/living/carbon/alien/larva)) + return 1 + + if(istype(other,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = other + if(istype(H.species,/datum/species/xenos)) + return 1 + + return 0 + /datum/species/xenos/hug(var/mob/living/carbon/human/H,var/mob/living/target) H.visible_message("[H] caresses [target] with its scythe-like arm.", \ "You caress [target] with your scythe-like arm.") @@ -109,7 +122,7 @@ has_organ = list( "heart" = /datum/organ/internal/heart, "lungs" = /datum/organ/internal/lungs, - "brain" = /datum/organ/internal/brain, + "brain" = /datum/organ/internal/brain/xeno, "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/queen, "acid gland" = /datum/organ/internal/xenos/acidgland, "hive node" = /datum/organ/internal/xenos/hivenode, @@ -148,7 +161,7 @@ has_organ = list( "heart" = /datum/organ/internal/heart, "lungs" = /datum/organ/internal/lungs, - "brain" = /datum/organ/internal/brain, + "brain" = /datum/organ/internal/brain/xeno, "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/hunter, "hive node" = /datum/organ/internal/xenos/hivenode, "nutrient vessel" = /datum/organ/internal/diona/nutrients @@ -176,7 +189,7 @@ has_organ = list( "heart" = /datum/organ/internal/heart, "lungs" = /datum/organ/internal/lungs, - "brain" = /datum/organ/internal/brain, + "brain" = /datum/organ/internal/brain/xeno, "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/sentinel, "acid gland" = /datum/organ/internal/xenos/acidgland, "hive node" = /datum/organ/internal/xenos/hivenode, @@ -207,7 +220,7 @@ has_organ = list( "heart" = /datum/organ/internal/heart, "lungs" = /datum/organ/internal/lungs, - "brain" = /datum/organ/internal/brain, + "brain" = /datum/organ/internal/brain/xeno, "egg sac" = /datum/organ/internal/xenos/eggsac, "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/queen, "acid gland" = /datum/organ/internal/xenos/acidgland, diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 70ba0805f5..3a2e262253 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -435,6 +435,7 @@ proc/handle_breath(datum/gas_mixture/breath) + if(status_flags & GODMODE) return @@ -456,7 +457,17 @@ return 0 var/safe_pressure_min = 16 // Minimum safe partial pressure of breathable gas in kPa - //var/safe_pressure_max = 140 // Maximum safe partial pressure of breathable gas in kPa (Not used for now) + + // Lung damage increases the minimum safe pressure. + if(species.has_organ["lungs"]) + var/datum/organ/internal/lungs/L = internal_organs_by_name["lungs"] + if(!L) + safe_pressure_min = INFINITY //No lungs, how are you breathing? + else if(L.is_broken()) + safe_pressure_min *= 1.5 + else if(L.is_bruised()) + safe_pressure_min *= 1.25 + var/safe_exhaled_max = 10 var/safe_toxins_max = 0.005 var/SA_para_min = 1 diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 21b336a650..35c310c5de 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -169,6 +169,9 @@ if(has_brain_worms()) //Brain worms translate everything. Even mice and alien speak. return 1 + if(species.can_understand(other)) + return 1 + //These only pertain to common. Languages are handled by mob/say_understands() if (!speaking) if (istype(other, /mob/living/carbon/alien/diona)) @@ -180,6 +183,10 @@ return 1 if (istype(other, /mob/living/carbon/slime)) return 1 + if(istype(other,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = other + if(!species.speaks_common || !H.species.speaks_common) + return 0 //This is already covered by mob/say_understands() //if (istype(other, /mob/living/simple_animal)) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 6b4e3b4586..895e0234d3 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -24,6 +24,7 @@ var/unarmed_type = /datum/unarmed_attack var/secondary_unarmed_type = /datum/unarmed_attack/bite + var/speaks_common = 1 // Speaks the common galactic tongue. var/secondary_langs = list() // The names of secondary languages that are available to this species. var/mutantrace // Safeguard due to old code. var/list/speech_sounds // A list of sounds to potentially play when speaking. @@ -194,6 +195,10 @@ /datum/species/proc/get_inventory_dialogue(var/mob/living/carbon/human/H) return +//Used by xenos understanding larvae and dionaea understanding nymphs. +/datum/species/proc/can_understand(var/mob/other) + return + /datum/species/human name = "Human" language = "Sol Common" @@ -395,6 +400,12 @@ reagent_tag = IS_DIONA +/datum/species/diona/can_understand(var/mob/other) + var/mob/living/carbon/alien/diona/D = other + if(istype(D)) + return 1 + return 0 + /datum/species/diona/handle_post_spawn(var/mob/living/carbon/human/H) H.gender = NEUTER return ..() diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm index 8eb5f12a31..8ca87ef3ba 100644 --- a/code/modules/organs/organ_alien.dm +++ b/code/modules/organs/organ_alien.dm @@ -56,11 +56,13 @@ del(src) -//These are different to the standard diona organs as they have a purpose in other +// These are different to the standard diona organs as they have a purpose in other // species (absorbing radiation and light respectively) /obj/item/organ/diona/nutrients name = "nutrient vessel" organ_tag = "nutrient vessel" + icon = 'icons/mob/alien.dmi' + icon_state = "claw" /obj/item/organ/diona/nutrients/removed() return @@ -68,6 +70,8 @@ /obj/item/organ/diona/node name = "receptor node" organ_tag = "receptor node" + icon = 'icons/mob/alien.dmi' + icon_state = "claw" /obj/item/organ/diona/node/removed() return @@ -88,11 +92,14 @@ // They're also super gross and ooze ichor. if(prob(5)) - var/obj/effect/decal/cleanable/blood/splatter/goo = new(get_turf(owner)) - goo.name = "husk ichor" - goo.desc = "It's thick and stinks of decay." - goo.basecolor = "#412464" - goo.update_icon() + var/datum/reagent/blood = owner.reagents.reagent_list["blood"] + blood_splatter(owner,blood,1) + var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner) + if(goo) + goo.name = "husk ichor" + goo.desc = "It's thick and stinks of decay." + goo.basecolor = "#412464" + goo.update_icon() /obj/item/organ/borer name = "cortical borer" @@ -103,7 +110,6 @@ /obj/item/organ/borer/removed(var/mob/living/target,var/mob/living/user) - ..() var/mob/living/simple_animal/borer/B = target.has_brain_worms() diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 39840c88f0..5605f8c40f 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -249,6 +249,9 @@ removed_type = /obj/item/organ/brain vital = 1 +/datum/organ/internal/brain/xeno + removed_type = /obj/item/organ/brain/xeno + /datum/organ/internal/eyes name = "eyes" parent_organ = "head" diff --git a/code/modules/organs/organ_objects.dm b/code/modules/organs/organ_objects.dm index c48a9d4b54..ea49f7276a 100644 --- a/code/modules/organs/organ_objects.dm +++ b/code/modules/organs/organ_objects.dm @@ -97,6 +97,7 @@ /obj/item/organ/lungs name = "lungs" icon_state = "lungs" + gender = PLURAL prosthetic_name = "gas exchange system" prosthetic_icon = "lungs-prosthetic" organ_tag = "lungs" @@ -104,6 +105,7 @@ /obj/item/organ/kidneys name = "kidneys" icon_state = "kidneys" + gender = PLURAL prosthetic_name = "prosthetic kidneys" prosthetic_icon = "kidneys-prosthetic" organ_tag = "kidneys" @@ -111,6 +113,7 @@ /obj/item/organ/eyes name = "eyeballs" icon_state = "eyes" + gender = PLURAL prosthetic_name = "visual prosthesis" prosthetic_icon = "eyes-prosthetic" organ_tag = "eyes" diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 1d8fa06e53..e2ad2be210 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -365,25 +365,33 @@ if(!istype(O)) return 0 - if(target.species && target.species.has_organ[O.organ_tag]) + if(!target.species) + user << "\red You have no idea what species this person is. Report this on the bug tracker." + return 0 + + var/o_is = (O.gender == PLURAL) ? "are" : "is" + var/o_a = (O.gender == PLURAL) ? "" : " a" + var/o_do = (O.gender == PLURAL) ? "don't" : "doesn't" + + if(target.species.has_organ[O.organ_tag]) if(!O.health) - user << "\red \The [O.organ_tag] is dead." + user << "\red \The [O.organ_tag] [o_is] in no state to be transplanted." return 0 if(!target.internal_organs_by_name[O.organ_tag]) organ_missing = 1 else - user << "\red \The [target] already has a [O.organ_tag]." //TODO: grammar. + user << "\red \The [target] already has [o_a][O.organ_tag]." return 0 if(O.organ_data && affected.name == O.organ_data.parent_organ) organ_compatible = 1 else - user << "\red \The [O.organ_tag] doesn't normally go in \the [affected.display_name]." + user << "\red \The [O.organ_tag] [o_do] normally go in \the [affected.display_name]." return 0 else - user << "\red \A [target.species.name] doesn't normally have a [O.organ_tag]." //TODO: grammar. + user << "\red \A [target.species.name] doesn't normally have [o_a][O.organ_tag]." return 0 return ..() && organ_missing && organ_compatible diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 58a7aaf25c046d161364add6d4279166bd4ea571..202ec39bc8c2a8b13c4f403a0cf437b559e69e45 100644 GIT binary patch literal 14743 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 literal 14638 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 Date: Tue, 7 Oct 2014 09:51:48 +1030 Subject: [PATCH 2/2] Minor fixes for previous commit, implemented default species languages. --- code/modules/mob/language.dm | 15 +++++++++++++++ .../mob/living/carbon/alien/larva/larva.dm | 2 +- code/modules/mob/living/carbon/brain/MMI.dm | 2 +- .../living/carbon/human/alien/alien_species.dm | 7 +------ code/modules/mob/living/carbon/human/human.dm | 8 +++++++- code/modules/mob/living/carbon/human/say.dm | 12 +++++------- code/modules/mob/living/carbon/human/species.dm | 9 +++++---- code/modules/organs/organ_alien.dm | 8 ++++++-- 8 files changed, 41 insertions(+), 22 deletions(-) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index feae925a86..14c134dc08 100755 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -73,6 +73,13 @@ key = "q" flags = RESTRICTED +/datum/language/common + name = "Galactic Common" + desc = "The common galactic tongue." + speech_verb = "says" + key = "0" + flags = RESTRICTED + /datum/language/human name = "Sol Common" desc = "A bastardized hybrid of informal English and elements of Mandarin Chinese; the common language of the Sol system." @@ -95,6 +102,14 @@ colour = "rough" key = "3" +/datum/language/xenocommon + name = "Xenomorph" + colour = "alien" + desc = "The common tongue of the xenomorphs." + speech_verb = "hisses" + key = "4" + flags = RESTRICTED + /datum/language/xenos name = "Hivemind" desc = "Xenomorphs have the strange ability to commune over a psychic hivemind." diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index c811fd2b09..7f77e33631 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -16,4 +16,4 @@ /mob/living/carbon/alien/larva/New() ..() - add_language("Rootspeak") \ No newline at end of file + add_language("Xenomorph") //Bonus language. \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 5daa904bf6..f7c85f0b71 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -28,7 +28,7 @@ if(B.health <= 0) user << "\red That brain is well and truly dead." return - else if(!B:brainmob) + else if(!B.brainmob) user << "\red You aren't sure where this brain came from, but you're pretty sure it's a useless brain." return diff --git a/code/modules/mob/living/carbon/human/alien/alien_species.dm b/code/modules/mob/living/carbon/human/alien/alien_species.dm index 09c8a19b13..fc7d589cd9 100644 --- a/code/modules/mob/living/carbon/human/alien/alien_species.dm +++ b/code/modules/mob/living/carbon/human/alien/alien_species.dm @@ -1,12 +1,12 @@ //Stand-in until this is made more lore-friendly. /datum/species/xenos name = "Xenomorph" + default_language = "Xenomorph" language = "Hivemind" unarmed_type = /datum/unarmed_attack/claws/strong secondary_unarmed_type = /datum/unarmed_attack/bite/strong hud_type = /datum/hud_data/alien rarity_value = 3 - speaks_common = 0 has_fine_manipulation = 0 insulated = 1 @@ -57,11 +57,6 @@ if(istype(other,/mob/living/carbon/alien/larva)) return 1 - if(istype(other,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = other - if(istype(H.species,/datum/species/xenos)) - return 1 - return 0 /datum/species/xenos/hug(var/mob/living/carbon/human/H,var/mob/living/target) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 69653cd5a8..c8294d7358 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1263,6 +1263,9 @@ if(species.language) remove_language(species.language) + if(species.default_language) + remove_language(species.default_language) + species = all_species[new_species] species.create_organs(src) @@ -1270,6 +1273,9 @@ if(species.language) add_language(species.language) + if(species.default_language) + add_language(species.default_language) + if(species.base_color && default_colour) //Apply colour. r_skin = hex2num(copytext(species.base_color,2,4)) @@ -1426,4 +1432,4 @@ var/datum/organ/internal/eyes = internal_organs_by_name["eyes"] if(eyes && istype(eyes) && !eyes.status & ORGAN_CUT_AWAY) return 1 - return 0 + return 0 diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 35c310c5de..0b7d601ca9 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -1,7 +1,5 @@ /mob/living/carbon/human/say(var/message) - //TODO: Add checks for species who do not speak common. - var/verb = "says" var/alt_name = "" var/message_range = world.view @@ -34,9 +32,13 @@ //parse the language code and consume it var/datum/language/speaking = parse_language(message) + if(speaking) + message = copytext(message,3) + else if(species.default_language) + speaking = all_languages[species.default_language] + if (speaking) verb = speaking.speech_verb - message = copytext(message,3) // This is broadcast to all mobs with the language, // irrespective of distance or anything else. @@ -183,10 +185,6 @@ return 1 if (istype(other, /mob/living/carbon/slime)) return 1 - if(istype(other,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = other - if(!species.speaks_common || !H.species.speaks_common) - return 0 //This is already covered by mob/say_understands() //if (istype(other, /mob/living/simple_animal)) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 895e0234d3..917251731d 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -13,7 +13,6 @@ var/primitive // Lesser form, if any (ie. monkey for humans) var/tail // Name of tail image in species effects icon file. - var/language // Default racial language, if any. var/datum/unarmed_attack/unarmed // For empty hand harm-intent attack var/datum/unarmed_attack/secondary_unarmed // For empty hand harm-intent attack if the first fails. var/datum/hud_data/hud @@ -24,7 +23,9 @@ var/unarmed_type = /datum/unarmed_attack var/secondary_unarmed_type = /datum/unarmed_attack/bite - var/speaks_common = 1 // Speaks the common galactic tongue. + var/language // Default racial language, if any. + // Default language is used when 'say' is used without modifiers. + var/default_language = "Galactic Common" var/secondary_langs = list() // The names of secondary languages that are available to this species. var/mutantrace // Safeguard due to old code. var/list/speech_sounds // A list of sounds to potentially play when speaking. @@ -279,7 +280,8 @@ name = "Vox" icobase = 'icons/mob/human_races/r_vox.dmi' deform = 'icons/mob/human_races/r_def_vox.dmi' - language = "Vox-pidgin" + default_language = "Vox-pidgin" + language = "Galactic Common" unarmed_type = /datum/unarmed_attack/claws/strong secondary_unarmed_type = /datum/unarmed_attack/bite/strong rarity_value = 2 @@ -324,7 +326,6 @@ name = "Vox Armalis" icobase = 'icons/mob/human_races/r_armalis.dmi' deform = 'icons/mob/human_races/r_armalis.dmi' - language = "Vox-pidgin" rarity_value = 10 warning_low_pressure = 50 diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm index 8ca87ef3ba..8ecb8bb658 100644 --- a/code/modules/organs/organ_alien.dm +++ b/code/modules/organs/organ_alien.dm @@ -92,8 +92,12 @@ // They're also super gross and ooze ichor. if(prob(5)) - var/datum/reagent/blood = owner.reagents.reagent_list["blood"] - blood_splatter(owner,blood,1) + var/mob/living/carbon/human/H = owner + if(!istype(H)) + return + + var/datum/reagent/blood = H.vessel.reagent_list["blood"] + blood_splatter(H,blood,1) var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner) if(goo) goo.name = "husk ichor"