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."