From 37cb78eefaa193481bde22dbd1d3f7a8030c690d Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 8 Oct 2014 23:10:12 +1030 Subject: [PATCH] Fixes #6613 and #6492 --- code/datums/diseases/appendicitis.dm | 4 -- code/game/gamemodes/events/space_ninja.dm | 2 +- .../directives/alien_fraud_directive.dm | 4 +- .../tau_ceti_needs_women_directive.dm | 2 +- code/game/gamemodes/nuclear/nuclear.dm | 4 +- code/game/jobs/job_controller.dm | 2 +- code/game/machinery/bioprinter.dm | 3 ++ code/game/machinery/suit_storage_unit.dm | 12 +++--- code/game/objects/items.dm | 5 ++- code/game/objects/items/devices/modkit.dm | 10 ++--- code/modules/client/preferences.dm | 4 +- code/modules/client/preferences_gear.dm | 8 ++-- code/modules/clothing/clothing.dm | 12 +++--- code/modules/clothing/gloves/stungloves.dm | 20 ++++----- code/modules/clothing/spacesuits/rig.dm | 16 +++---- .../carbon/human/alien/alien_species.dm | 7 +-- code/modules/mob/living/carbon/human/human.dm | 2 +- .../mob/living/carbon/human/human_species.dm | 2 +- .../mob/living/carbon/human/species.dm | 28 +++++++++++- .../mob/living/carbon/human/update_icons.dm | 1 + .../mob/living/carbon/monkey/monkey.dm | 2 +- .../simple_animal/borer/borer_powers.dm | 3 ++ .../mob/new_player/sprite_accessories.dm | 40 +++++++++--------- code/modules/organs/blood.dm | 2 +- code/modules/organs/organ_alien.dm | 12 ++++-- code/modules/organs/organ_external.dm | 9 +++- code/modules/organs/organ_internal.dm | 11 ++--- code/modules/organs/organ_objects.dm | 8 ++-- code/modules/surgery/generic.dm | 15 +++++-- code/modules/surgery/organs_internal.dm | 18 ++++---- code/modules/surgery/surgery.dm | 37 ++++++++++------ code/modules/virus2/disease2.dm | 2 +- icons/mob/alien.dmi | Bin 93777 -> 93707 bytes 33 files changed, 185 insertions(+), 122 deletions(-) diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index a9959ef0636..8ab0f1b491e 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -23,9 +23,6 @@ src.cure() if(stage == 1) - if(affected_mob.op_stage.appendix == 2.0) - // appendix is removed, can't get infected again - src.cure() if(prob(5)) affected_mob << "\red You feel a stinging pain in your abdomen!" affected_mob.emote("me",1,"winces slightly.") @@ -48,7 +45,6 @@ var/mob/living/carbon/human/H = affected_mob H << "\red Your abdomen is a world of pain!" H.Weaken(10) - H.op_stage.appendix = 2.0 var/datum/organ/external/groin = H.get_organ("groin") var/datum/wound/W = new /datum/wound/internal_bleeding(20) diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/gamemodes/events/space_ninja.dm index 5dae9e6e4b7..ff8b760bc1d 100644 --- a/code/game/gamemodes/events/space_ninja.dm +++ b/code/game/gamemodes/events/space_ninja.dm @@ -415,7 +415,7 @@ As such, it's hard-coded for now. No reason for it not to be, really. if(13) directive += "Some disgruntled NanoTrasen employees have been supportive of our operations. Be wary of any mistreatment by command staff." if(14) - var/xenorace = pick("Unathi","Tajaran", "Skrellian") + var/xenorace = pick("Unathi","Tajara", "Skrell") directive += "A group of [xenorace] radicals have been loyal supporters of the Spider Clan. Favor [xenorace] crew whenever possible." if(15) directive += "The Spider Clan has recently been accused of religious insensitivity. Attempt to speak with the Chaplain and prove these accusations false." diff --git a/code/game/gamemodes/mutiny/directives/alien_fraud_directive.dm b/code/game/gamemodes/mutiny/directives/alien_fraud_directive.dm index 6df5a22050c..580322f8e17 100644 --- a/code/game/gamemodes/mutiny/directives/alien_fraud_directive.dm +++ b/code/game/gamemodes/mutiny/directives/alien_fraud_directive.dm @@ -6,7 +6,7 @@ datum/directive/terminations/alien_fraud proc/is_alien(mob/M) var/species = M.get_species() - return species == "Tajaran" || species == "Unathi" + return species == "Tajara" || species == "Unathi" datum/directive/terminations/alien_fraud/get_crew_to_terminate() var/list/aliens[0] @@ -30,7 +30,7 @@ datum/directive/terminations/alien_fraud/meets_prerequisites() var/unathi = 0 for(var/mob/M in player_list) var/species = M.get_species() - if(species == "Tajaran") + if(species == "Tajara") tajarans++ if(species == "Unathi") unathi++ diff --git a/code/game/gamemodes/mutiny/directives/tau_ceti_needs_women_directive.dm b/code/game/gamemodes/mutiny/directives/tau_ceti_needs_women_directive.dm index b70ffd659d1..f1aa2e914db 100644 --- a/code/game/gamemodes/mutiny/directives/tau_ceti_needs_women_directive.dm +++ b/code/game/gamemodes/mutiny/directives/tau_ceti_needs_women_directive.dm @@ -28,7 +28,7 @@ datum/directive/tau_ceti_needs_women var/list/aliens[0] for(var/mob/M in get_crew_of_target_gender()) var/species = M.get_species() - if(species == "Tajaran" || species == "Unathi" || species == "Skrell") + if(species == "Tajara" || species == "Unathi" || species == "Skrell") aliens.Add(M) return aliens diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 911dc58d846..9a7f2e4cdf0 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -232,8 +232,8 @@ var/global/list/turf/synd_spawn = list() switch(race) if("Unathi") new_suit.species_restricted = list("Unathi") - if("Tajaran") - new_suit.species_restricted = list("Tajaran") + if("Tajara") + new_suit.species_restricted = list("Tajara") if("Skrell") new_suit.species_restricted = list("Skrell") diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 0400d58689e..16ae2f5e545 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -480,7 +480,7 @@ var/global/datum/controller/occupations/job_master //TODO: Generalize this by-species if(H.species) - if(H.species.name == "Tajaran" || H.species.name == "Unathi") + if(H.species.name == "Tajara" || H.species.name == "Unathi") H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes,1) else if(H.species.name == "Vox") H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask) diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm index 4ce50d404c5..a0ac4258cce 100644 --- a/code/game/machinery/bioprinter.dm +++ b/code/game/machinery/bioprinter.dm @@ -5,6 +5,9 @@ desc = "It's a machine that grows replacement organs." icon = 'icons/obj/surgery.dmi' + anchored = 1 + density = 1 + icon_state = "bioprinter" var/prints_prosthetics diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 3f0b7448895..8fc6fa35993 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -602,7 +602,7 @@ //Departments that the cycler can paint suits to look like. var/list/departments = list("Engineering","Mining","Medical","Security","Atmos") //Species that the suits can be configured to fit. - var/list/species = list("Human","Skrell","Unathi","Tajaran") + var/list/species = list("Human","Skrell","Unathi","Tajara") var/target_department var/target_species @@ -622,35 +622,35 @@ model_text = "Engineering" req_access = list(access_construction) departments = list("Engineering","Atmos") - species = list("Human","Tajaran","Skrell","Unathi") //Add Unathi when sprites exist for their suits. + species = list("Human","Tajara","Skrell","Unathi") //Add Unathi when sprites exist for their suits. /obj/machinery/suit_cycler/mining name = "Mining suit cycler" model_text = "Mining" req_access = list(access_mining) departments = list("Mining") - species = list("Human","Tajaran","Skrell","Unathi") + species = list("Human","Tajara","Skrell","Unathi") /obj/machinery/suit_cycler/security name = "Security suit cycler" model_text = "Security" req_access = list(access_security) departments = list("Security") - species = list("Human","Tajaran","Skrell","Unathi") + species = list("Human","Tajara","Skrell","Unathi") /obj/machinery/suit_cycler/medical name = "Medical suit cycler" model_text = "Medical" req_access = list(access_medical) departments = list("Medical") - species = list("Human","Tajaran","Skrell","Unathi") + species = list("Human","Tajara","Skrell","Unathi") /obj/machinery/suit_cycler/syndicate name = "Nonstandard suit cycler" model_text = "Nonstandard" req_access = list(access_syndicate) departments = list("Mercenary") - species = list("Human","Tajaran","Skrell","Unathi") + species = list("Human","Tajara","Skrell","Unathi") can_repair = 1 /obj/machinery/suit_cycler/attack_ai(mob/user as mob) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index c121bf746f8..80f1fcb8e51 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -44,7 +44,7 @@ /* Species-specific sprites, concept stolen from Paradise//vg/. ex: sprite_sheets = list( - "Tajaran" = 'icons/cat/are/bad' + "Tajara" = 'icons/cat/are/bad' ) If index term exists and icon_override is not set, this sprite sheet will be used. */ @@ -261,6 +261,9 @@ //START HUMAN var/mob/living/carbon/human/H = M + if(H.species && !(slot in H.species.hud.equip_slots)) + return 0 + switch(slot) if(slot_l_hand) if(H.l_hand) diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm index 02d11f22519..819583ef234 100644 --- a/code/game/objects/items/devices/modkit.dm +++ b/code/game/objects/items/devices/modkit.dm @@ -17,7 +17,7 @@ /obj/item/device/modkit/afterattack(obj/O, mob/user as mob, proximity) if(!proximity) return - + if (!target_species) return //it shouldn't be null, okay? @@ -31,12 +31,12 @@ for (var/permitted_type in permitted_types) if(istype(O, permitted_type)) allowed = 1 - + var/obj/item/clothing/I = O if (!istype(I) || !allowed) user << "[src] is unable to modify that." return - + var/excluding = ("exclude" in I.species_restricted) var/in_list = (target_species in I.species_restricted) if (excluding ^ in_list) @@ -57,7 +57,7 @@ parts &= ~MODKIT_HELMET if (istype(I, /obj/item/clothing/suit)) parts &= ~MODKIT_SUIT - + if(!parts) user.drop_from_inventory(src) del(src) @@ -69,4 +69,4 @@ /obj/item/device/modkit/tajaran name = "tajaran hardsuit modification kit" desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user. This one looks like it's meant for Tajaran." - target_species = "Tajaran" \ No newline at end of file + target_species = "Tajara" \ No newline at end of file diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index bb73a223c79..f00a8a9e6e9 100755 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1187,7 +1187,7 @@ datum/preferences b_type = new_b_type if("hair") - if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell") + if(species == "Human" || species == "Unathi" || species == "Tajara" || species == "Skrell") var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference") as color|null if(new_hair) r_hair = hex2num(copytext(new_hair, 2, 4)) @@ -1267,7 +1267,7 @@ datum/preferences s_tone = 35 - max(min( round(new_s_tone), 220),1) if("skin") - if(species == "Unathi" || species == "Tajaran" || species == "Skrell") + if(species == "Unathi" || species == "Tajara" || species == "Skrell") var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference") as color|null if(new_skin) r_skin = hex2num(copytext(new_skin, 2, 4)) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 306a31a81c8..5f2a5880cba 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -177,12 +177,14 @@ var/global/list/gear_datums = list() cost = 2 slot = slot_head +// This was sprited and coded specifically for Zhan-Khazan characters. Before you +// decide that it's 'not even Taj themed' maybe you should read the wiki, gamer. ~ Z /datum/gear/zhan_scarf - display_name = "headscarf, white" + display_name = "Zhan headscarf" path = /obj/item/clothing/head/tajaran/scarf cost = 2 slot = slot_head -// whitelisted = "Tajaran" // It's a headscarf. It isn't even a taj-themed headscarf! + whitelisted = "Tajara" // Eyes @@ -460,7 +462,7 @@ var/global/list/gear_datums = list() path = /obj/item/clothing/suit/tajaran/furs cost = 3 slot = slot_wear_suit - whitelisted = "Tajaran" // You do have a monopoly on a fur suit tho + whitelisted = "Tajara" // You do have a monopoly on a fur suit tho // Gloves diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index fa4dad398da..232fd91dad6 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -44,7 +44,7 @@ //Set species_restricted list switch(target_species) if("Human", "Skrell") //humanoid bodytypes - species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") + species_restricted = list("exclude","Unathi","Tajara","Diona","Vox") else species_restricted = list(target_species) @@ -63,9 +63,9 @@ //Set species_restricted list switch(target_species) if("Skrell") - species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") + species_restricted = list("exclude","Unathi","Tajara","Diona","Vox") if("Human") - species_restricted = list("exclude","Skrell","Unathi","Tajaran","Diona","Vox") + species_restricted = list("exclude","Skrell","Unathi","Tajara","Diona","Vox") else species_restricted = list(target_species) @@ -177,7 +177,7 @@ BLIND // can't see anything body_parts_covered = HANDS slot_flags = SLOT_GLOVES attack_verb = list("challenged") - species_restricted = list("exclude","Unathi","Tajaran") + species_restricted = list("exclude","Unathi","Tajara") sprite_sheets = list("Vox" = 'icons/mob/species/vox/gloves.dmi') /obj/item/clothing/gloves/examine() @@ -214,7 +214,7 @@ BLIND // can't see anything desc = "[desc]
They have had the fingertips cut off of them." if("exclude" in species_restricted) species_restricted -= "Unathi" - species_restricted -= "Tajaran" + species_restricted -= "Tajara" return //Head @@ -248,7 +248,7 @@ BLIND // can't see anything permeability_coefficient = 0.50 slowdown = SHOES_SLOWDOWN - species_restricted = list("exclude","Unathi","Tajaran") + species_restricted = list("exclude","Unathi","Tajara") sprite_sheets = list("Vox" = 'icons/mob/species/vox/shoes.dmi') //Suit diff --git a/code/modules/clothing/gloves/stungloves.dm b/code/modules/clothing/gloves/stungloves.dm index c40ff3e80c8..976b16e7e68 100644 --- a/code/modules/clothing/gloves/stungloves.dm +++ b/code/modules/clothing/gloves/stungloves.dm @@ -3,29 +3,29 @@ user << "That won't work." //i'm not putting my lips on that! ..() return - + //add wires if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = W if (clipped) user << "The [src] are too badly mangled for wiring." return - + if(wired) user << "The [src] are already wired." return - + if(C.get_amount() < 2) user << "There is not enough wire to cover the [src]." return - + C.use(2) wired = 1 siemens_coefficient = 3.0 user << "You wrap some wires around the [src]." update_icon() return - + //add cell else if(istype(W, /obj/item/weapon/cell)) if(!wired) @@ -56,26 +56,26 @@ user << "You cut the wires away from the [src]." update_icon() return - + //clipping fingertips if(!clipped) playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) user.visible_message("\red [user] cuts the fingertips off of the [src].","\red You cut the fingertips off of the [src].") - + clipped = 1 name = "mangled [name]" desc = "[desc]
They have had the fingertips cut off of them." if("exclude" in species_restricted) species_restricted -= "Unathi" - species_restricted -= "Tajaran" + species_restricted -= "Tajara" return else user << "The [src] have already been clipped!" update_icon() return - + return - + ..() /obj/item/clothing/gloves/update_icon() diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index a8017a95da0..4fef9c19587 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -14,15 +14,15 @@ max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE //Species-specific stuff. - species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox") + species_restricted = list("exclude","Unathi","Tajara","Skrell","Diona","Vox") sprite_sheets_refit = list( "Unathi" = 'icons/mob/species/unathi/helmet.dmi', - "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi', + "Tajara" = 'icons/mob/species/tajaran/helmet.dmi', "Skrell" = 'icons/mob/species/skrell/helmet.dmi', ) sprite_sheets_obj = list( "Unathi" = 'icons/obj/clothing/species/unathi/hats.dmi', - "Tajaran" = 'icons/obj/clothing/species/tajaran/hats.dmi', + "Tajara" = 'icons/obj/clothing/species/tajaran/hats.dmi', "Skrell" = 'icons/obj/clothing/species/skrell/hats.dmi', ) @@ -64,15 +64,15 @@ heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE - species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") + species_restricted = list("exclude","Unathi","Tajara","Diona","Vox") sprite_sheets_refit = list( "Unathi" = 'icons/mob/species/unathi/suit.dmi', - "Tajaran" = 'icons/mob/species/tajaran/suit.dmi', + "Tajara" = 'icons/mob/species/tajaran/suit.dmi', "Skrell" = 'icons/mob/species/skrell/suit.dmi', ) sprite_sheets_obj = list( "Unathi" = 'icons/obj/clothing/species/unathi/suits.dmi', - "Tajaran" = 'icons/obj/clothing/species/tajaran/suits.dmi', + "Tajara" = 'icons/obj/clothing/species/tajaran/suits.dmi', "Skrell" = 'icons/obj/clothing/species/skrell/suits.dmi', ) @@ -364,7 +364,7 @@ armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 60) siemens_coefficient = 0.6 var/obj/machinery/camera/camera - species_restricted = list("exclude","Unathi","Tajaran","Skrell","Vox") + species_restricted = list("exclude","Unathi","Tajara","Skrell","Vox") /obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user) @@ -392,7 +392,7 @@ armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 60) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs) siemens_coefficient = 0.6 - species_restricted = list("exclude","Unathi","Tajaran","Skrell","Vox") + species_restricted = list("exclude","Unathi","Tajara","Skrell","Vox") //Wizard Rig 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 fc7d589cd96..b592c6292b7 100644 --- a/code/modules/mob/living/carbon/human/alien/alien_species.dm +++ b/code/modules/mob/living/carbon/human/alien/alien_species.dm @@ -1,6 +1,8 @@ //Stand-in until this is made more lore-friendly. /datum/species/xenos name = "Xenomorph" + name_plural = "Xenomorphs" + default_language = "Xenomorph" language = "Hivemind" unarmed_type = /datum/unarmed_attack/claws/strong @@ -40,7 +42,6 @@ has_organ = list( "heart" = /datum/organ/internal/heart, - "lungs" = /datum/organ/internal/lungs, "brain" = /datum/organ/internal/brain/xeno, "plasma vessel" = /datum/organ/internal/xenos/plasmavessel, "hive node" = /datum/organ/internal/xenos/hivenode, @@ -116,7 +117,6 @@ has_organ = list( "heart" = /datum/organ/internal/heart, - "lungs" = /datum/organ/internal/lungs, "brain" = /datum/organ/internal/brain/xeno, "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/queen, "acid gland" = /datum/organ/internal/xenos/acidgland, @@ -155,7 +155,6 @@ has_organ = list( "heart" = /datum/organ/internal/heart, - "lungs" = /datum/organ/internal/lungs, "brain" = /datum/organ/internal/brain/xeno, "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/hunter, "hive node" = /datum/organ/internal/xenos/hivenode, @@ -183,7 +182,6 @@ has_organ = list( "heart" = /datum/organ/internal/heart, - "lungs" = /datum/organ/internal/lungs, "brain" = /datum/organ/internal/brain/xeno, "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/sentinel, "acid gland" = /datum/organ/internal/xenos/acidgland, @@ -214,7 +212,6 @@ has_organ = list( "heart" = /datum/organ/internal/heart, - "lungs" = /datum/organ/internal/lungs, "brain" = /datum/organ/internal/brain/xeno, "egg sac" = /datum/organ/internal/xenos/eggsac, "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/queen, diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index c8294d73583..7194eba0998 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1210,7 +1210,7 @@ src << msg organ.take_damage(rand(1,3), 0, 0) - if(!(organ.status & ORGAN_ROBOT)) //There is no blood in protheses. + if(!(organ.status & ORGAN_ROBOT) && !(species.flags & NO_BLOOD)) //There is no blood in protheses. organ.status |= ORGAN_BLEEDING src.adjustToxLoss(rand(1,3)) diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm index c313c6015e0..051ef214f41 100644 --- a/code/modules/mob/living/carbon/human/human_species.dm +++ b/code/modules/mob/living/carbon/human/human_species.dm @@ -12,7 +12,7 @@ /mob/living/carbon/human/tajaran/New(var/new_loc) h_style = "Tajaran Ears" - ..(new_loc, "Tajaran") + ..(new_loc, "Tajara") /mob/living/carbon/human/unathi/New(var/new_loc) h_style = "Unathi Horns" diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 917251731d8..bc94620069c 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -5,6 +5,7 @@ /datum/species var/name // Species name. + var/name_plural 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. @@ -202,6 +203,7 @@ /datum/species/human name = "Human" + name_plural = "Humans" language = "Sol Common" primitive = /mob/living/carbon/monkey unarmed_type = /datum/unarmed_attack/punch @@ -213,6 +215,7 @@ /datum/species/unathi name = "Unathi" + name_plural = "Unathi" icobase = 'icons/mob/human_races/r_lizard.dmi' deform = 'icons/mob/human_races/r_def_lizard.dmi' language = "Sinta'unathi" @@ -239,7 +242,8 @@ base_color = "#066000" /datum/species/tajaran - name = "Tajaran" + name = "Tajara" + name_plural = "Tajaran" icobase = 'icons/mob/human_races/r_tajaran.dmi' deform = 'icons/mob/human_races/r_def_tajaran.dmi' language = "Siik'tajr" @@ -264,6 +268,7 @@ /datum/species/skrell name = "Skrell" + name_plural = "Skrell" icobase = 'icons/mob/human_races/r_skrell.dmi' deform = 'icons/mob/human_races/r_def_skrell.dmi' language = "Skrellian" @@ -278,6 +283,7 @@ /datum/species/vox name = "Vox" + name_plural = "Vox" icobase = 'icons/mob/human_races/r_vox.dmi' deform = 'icons/mob/human_races/r_def_vox.dmi' default_language = "Vox-pidgin" @@ -324,6 +330,7 @@ /datum/species/vox/armalis name = "Vox Armalis" + name_plural = "Vox" icobase = 'icons/mob/human_races/r_armalis.dmi' deform = 'icons/mob/human_races/r_armalis.dmi' rarity_value = 10 @@ -364,6 +371,7 @@ /datum/species/diona name = "Diona" + name_plural = "Dionaea" icobase = 'icons/mob/human_races/r_diona.dmi' deform = 'icons/mob/human_races/r_def_plant.dmi' language = "Rootspeak" @@ -428,6 +436,8 @@ /datum/species/machine name = "Machine" + name_plural = "machines" + icobase = 'icons/mob/human_races/r_machine.dmi' deform = 'icons/mob/human_races/r_machine.dmi' language = "Tradeband" @@ -551,6 +561,7 @@ var/has_throw = 1 // Set to draw throw button. var/has_resist = 1 // Set to draw resist button. var/has_internals = 1 // Set to draw the internals toggle button. + var/list/equip_slots = list() // Checked by mob_can_equip(). // Contains information on the position and tag for all inventory slots // to be drawn for the mob. This is fairly delicate, try to avoid messing with it @@ -572,3 +583,18 @@ "storage2" = list("loc" = ui_storage2, "slot" = slot_r_store, "state" = "pocket"), "belt" = list("loc" = ui_belt, "slot" = slot_belt, "state" = "belt") ) + +/datum/hud_data/New() + ..() + for(var/slot in gear) + equip_slots |= gear[slot]["slot"] + + if(has_hands) + equip_slots |= slot_l_hand + equip_slots |= slot_r_hand + equip_slots |= slot_handcuffed + + if(slot_back in equip_slots) + equip_slots |= slot_in_backpack + + equip_slots |= slot_legcuffed \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index a49760a5279..f3a13b60355 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -177,6 +177,7 @@ var/global/list/damage_icon_parts = list() proc/get_damage_icon_part(damage_state, body_part) if(damage_icon_parts["[damage_state]/[body_part]"] == null) var/icon/DI = new /icon('icons/mob/dam_human.dmi', damage_state) // the damage icon for whole human + // TODO: Convert dam_human.dmi to greyscale and blend in species.blood_colour here. DI.Blend(new /icon('icons/mob/dam_mask.dmi', body_part), ICON_MULTIPLY) // mask with this organ's pixels damage_icon_parts["[damage_state]/[body_part]"] = DI return DI diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index a38ba9c6957..678eeccd6cd 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -94,7 +94,7 @@ ..() dna.mutantrace = "tajaran" - greaterform = "Tajaran" + greaterform = "Tajara" add_language("Siik'tajr") /mob/living/carbon/monkey/movement_delay() diff --git a/code/modules/mob/living/simple_animal/borer/borer_powers.dm b/code/modules/mob/living/simple_animal/borer/borer_powers.dm index 9f47dd6cf49..c07a105cbba 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_powers.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_powers.dm @@ -181,6 +181,9 @@ H.internal_organs_by_name["brain"] = B H.internal_organs |= B + var/datum/organ/external/affecting = H.get_organ("head") + affecting.implants -= src + var/s2h_id = src.computer_id var/s2h_ip= src.lastKnownIP src.computer_id = null diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 1e5906eaef4..3b231b751ee 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -496,7 +496,7 @@ name = "Shaved" icon_state = "bald" gender = NEUTER - species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox","Machine") + species_allowed = list("Human","Unathi","Tajara","Skrell","Vox","Machine") watson name = "Watson Mustache" @@ -636,62 +636,62 @@ taj_ears name = "Tajaran Ears" icon_state = "ears_plain" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") taj_ears_clean name = "Tajara Clean" icon_state = "hair_clean" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") taj_ears_bangs name = "Tajara Bangs" icon_state = "hair_bangs" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") taj_ears_braid name = "Tajara Braid" icon_state = "hair_tbraid" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") taj_ears_shaggy name = "Tajara Shaggy" icon_state = "hair_shaggy" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") taj_ears_mohawk name = "Tajaran Mohawk" icon_state = "hair_mohawk" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") taj_ears_plait name = "Tajara Plait" icon_state = "hair_plait" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") taj_ears_straight name = "Tajara Straight" icon_state = "hair_straight" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") taj_ears_long name = "Tajara Long" icon_state = "hair_long" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") taj_ears_rattail name = "Tajara Rat Tail" icon_state = "hair_rattail" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") taj_ears_spiky name = "Tajara Spiky" icon_state = "hair_tajspiky" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") taj_ears_messy name = "Tajara Messy" icon_state = "hair_messy" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") vox_quills_short name = "Short Vox Quills" @@ -703,32 +703,32 @@ taj_sideburns name = "Tajara Sideburns" icon_state = "facial_mutton" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") taj_mutton name = "Tajara Mutton" icon_state = "facial_mutton" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") taj_pencilstache name = "Tajara Pencilstache" icon_state = "facial_pencilstache" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") taj_moustache name = "Tajara Moustache" icon_state = "facial_moustache" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") taj_goatee name = "Tajara Goatee" icon_state = "facial_goatee" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") taj_smallstache name = "Tajara Smallsatche" icon_state = "facial_smallstache" - species_allowed = list("Tajaran") + species_allowed = list("Tajara") //skin styles - WIP //going to have to re-integrate this with surgery @@ -750,7 +750,7 @@ name = "Default tajaran skin" icon_state = "default" icon = 'icons/mob/human_races/r_tajaran.dmi' - species_allowed = list("Tajaran") + species_allowed = list("Tajara") unathi name = "Default Unathi skin" diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 45eb41585d8..9af498eea36 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -32,7 +32,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 if(B.id == "blood") B.data = list( "donor"=src,"viruses"=null,"species"=species.name,"blood_DNA"=dna.unique_enzymes,"blood_colour"= species.blood_color,"blood_type"=dna.b_type, \ "resistances"=null,"trace_chem"=null, "virus2" = null, "antibodies" = null) - B.color = B.data["blood_color"] + B.color = B.data["blood_colour"] // Takes care blood loss and regeneration /mob/living/carbon/human/proc/handle_blood() diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm index 8ecb8bb6581..ae70f485d96 100644 --- a/code/modules/organs/organ_alien.dm +++ b/code/modules/organs/organ_alien.dm @@ -96,8 +96,8 @@ if(!istype(H)) return - var/datum/reagent/blood = H.vessel.reagent_list["blood"] - blood_splatter(H,blood,1) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in H.vessel.reagent_list + blood_splatter(H,B,1) var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner) if(goo) goo.name = "husk ichor" @@ -170,27 +170,31 @@ name = "xeno organ" icon = 'icons/effects/blood.dmi' desc = "It smells like an accident in a chemical factory." - organ_tag = "special" //TODO functionality for transplants. /obj/item/organ/xenos/eggsac name = "egg sac" icon_state = "xgibmid1" + organ_tag = "egg sac" /obj/item/organ/xenos/plasmavessel name = "plasma vessel" - icon_state = "xgibdown" + icon_state = "xgibdown1" + organ_tag = "plasma vessel" /obj/item/organ/xenos/acidgland name = "acid gland" icon_state = "xgibtorso" + organ_tag = "acid gland" /obj/item/organ/xenos/hivenode name = "hive node" icon_state = "xgibmid2" + organ_tag = "hive node" /obj/item/organ/xenos/resinspinner name = "hive node" icon_state = "xgibmid2" + organ_tag = "resin spinner" //VOX ORGANS. /datum/organ/internal/stack diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index c4df67cc870..874bb936723 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -490,13 +490,18 @@ Note that amputating the affected organ does in fact remove the infection from t burn_dam = 0 status &= ~ORGAN_BLEEDING var/clamped = 0 + + var/mob/living/carbon/human/H + if(istype(owner,/mob/living/carbon/human)) + H = owner + for(var/datum/wound/W in wounds) if(W.damage_type == CUT || W.damage_type == BRUISE) brute_dam += W.damage else if(W.damage_type == BURN) burn_dam += W.damage - if(!(status & ORGAN_ROBOT) && W.bleeding()) + if(!(status & ORGAN_ROBOT) && W.bleeding() && (H && !(H.species.flags & NO_BLOOD))) W.bleed_timer-- status |= ORGAN_BLEEDING @@ -504,7 +509,7 @@ Note that amputating the affected organ does in fact remove the infection from t number_wounds += W.amount - if (open && !clamped) //things tend to bleed if they are CUT OPEN + if (open && !clamped && (H && !(H.species.flags & NO_BLOOD))) //things tend to bleed if they are CUT OPEN status |= ORGAN_BLEEDING diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 5605f8c40f8..907d5fa1228 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -83,14 +83,15 @@ if(rejecting % 10 == 0) //Only fire every ten rejection ticks. switch(rejecting) if(1 to 50) - take_damage(rand(1,2)) + take_damage(1) if(51 to 200) - take_damage(rand(2,3)) - if(201 to 500) - take_damage(rand(3,4)) owner.reagents.add_reagent("toxin", 1) + take_damage(1) + if(201 to 500) + take_damage(rand(2,3)) + owner.reagents.add_reagent("toxin", 2) if(501 to INFINITY) - take_damage(5) + take_damage(4) owner.reagents.add_reagent("toxin", rand(3,5)) /datum/organ/internal/proc/take_damage(amount, var/silent=0) diff --git a/code/modules/organs/organ_objects.dm b/code/modules/organs/organ_objects.dm index ea49f7276ad..178958d9361 100644 --- a/code/modules/organs/organ_objects.dm +++ b/code/modules/organs/organ_objects.dm @@ -46,8 +46,8 @@ if(fresh && prob(40)) fresh-- - var/datum/reagent/blood = reagents.reagent_list["blood"] - blood_splatter(src,blood,1) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list + blood_splatter(src,B,1) health -= rand(1,3) if(health <= 0) @@ -215,8 +215,8 @@ return user << "\blue You take an experimental bite out of \the [src]." - var/datum/reagent/blood = reagents.reagent_list["blood"] - blood_splatter(src,blood,1) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list + blood_splatter(src,B,1) user.drop_from_inventory(src) diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index a05c6f120b2..238657c28da 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -52,7 +52,10 @@ "\blue You have made a bloodless incision on [target]'s [affected.display_name] with \the [tool].",) //Could be cleaner ... affected.open = 1 - affected.status |= ORGAN_BLEEDING + + if(istype(target) && !(target.species.flags & NO_BLOOD)) + affected.status |= ORGAN_BLEEDING + affected.createwound(CUT, 1) affected.clamp() spread_germs_to_organ(affected, user) @@ -89,7 +92,10 @@ user.visible_message("\blue [user] has constructed a prepared incision on and within [target]'s [affected.display_name] with \the [tool].", \ "\blue You have constructed a prepared incision on and within [target]'s [affected.display_name] with \the [tool].",) affected.open = 1 - affected.status |= ORGAN_BLEEDING + + if(istype(target) && !(target.species.flags & NO_BLOOD)) + affected.status |= ORGAN_BLEEDING + affected.createwound(CUT, 1) affected.clamp() affected.open = 2 @@ -128,7 +134,10 @@ user.visible_message("\blue [user] has made an incision on [target]'s [affected.display_name] with \the [tool].", \ "\blue You have made an incision on [target]'s [affected.display_name] with \the [tool].",) affected.open = 1 - affected.status |= ORGAN_BLEEDING + + if(istype(target) && !(target.species.flags & NO_BLOOD)) + affected.status |= ORGAN_BLEEDING + affected.createwound(CUT, 1) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index e2ad2be2104..b5fbb3ecb06 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -327,7 +327,7 @@ O.organ_data.rejecting = null // Transfer over some blood data, if the organ doesn't have data. - var/datum/reagent/blood/organ_blood = O.reagents.reagent_list["blood"] + var/datum/reagent/blood/organ_blood = locate(/datum/reagent/blood) in O.reagents.reagent_list if(!organ_blood || !organ_blood.data["blood_DNA"]) target.vessel.trans_to(O, 5, 1, 1) @@ -367,32 +367,32 @@ if(!target.species) user << "\red You have no idea what species this person is. Report this on the bug tracker." - return 0 + return 2 var/o_is = (O.gender == PLURAL) ? "are" : "is" - var/o_a = (O.gender == PLURAL) ? "" : " a" + 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] [o_is] in no state to be transplanted." - return 0 + return 2 if(!target.internal_organs_by_name[O.organ_tag]) organ_missing = 1 else user << "\red \The [target] already has [o_a][O.organ_tag]." - return 0 + return 2 if(O.organ_data && affected.name == O.organ_data.parent_organ) organ_compatible = 1 else user << "\red \The [O.organ_tag] [o_do] normally go in \the [affected.display_name]." - return 0 + return 2 else - user << "\red \A [target.species.name] doesn't normally have [o_a][O.organ_tag]." - return 0 + user << "\red You're pretty sure [target.species.name_plural] don't normally have [o_a][O.organ_tag]." + return 2 return ..() && organ_missing && organ_compatible @@ -412,7 +412,7 @@ if(istype(O)) - var/datum/reagent/blood/transplant_blood = O.reagents.reagent_list["blood"] + var/datum/reagent/blood/transplant_blood = locate(/datum/reagent/blood) in O.reagents.reagent_list if(!transplant_blood) O.organ_data.transplant_data = list() O.organ_data.transplant_data["species"] = target.species.name diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 9ce44d12607..c5e883e79a4 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -77,21 +77,34 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user) E.germ_level = max(germ_level,E.germ_level) //as funny as scrubbing microbes out with clean gloves is - no. -proc/do_surgery(mob/living/M, mob/living/user, obj/item/tool) - if(!istype(M,/mob/living/carbon)) +proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool) + if(!istype(M)) return 0 if (user.a_intent == "harm") //check for Hippocratic Oath return 0 + if(M.op_stage.in_progress) //Can't operate on someone repeatedly. + user << "\red You can't operate on the patient while surgery is already in progress." + return 1 + for(var/datum/surgery_step/S in surgery_steps) //check if tool is right or close enough and if this step is possible - if( S.tool_quality(tool) && S.can_use(user, M, user.zone_sel.selecting, tool) && S.is_valid_target(M)) - S.begin_step(user, M, user.zone_sel.selecting, tool) //start on it - //We had proper tools! (or RNG smiled.) and user did not move or change hands. - if( prob(S.tool_quality(tool)) && do_mob(user, M, rand(S.min_duration, S.max_duration))) - S.end_step(user, M, user.zone_sel.selecting, tool) //finish successfully - else if (tool in user.contents && user.Adjacent(M)) //or - S.fail_step(user, M, user.zone_sel.selecting, tool) //malpractice~ - return 1 //don't want to do weapony things after surgery + if(S.tool_quality(tool)) + var/step_is_valid = S.can_use(user, M, user.zone_sel.selecting, tool) + if(step_is_valid && S.is_valid_target(M)) + if(step_is_valid == 2) // This is a failure that already has a message for failing. + return 1 + M.op_stage.in_progress = 1 + S.begin_step(user, M, user.zone_sel.selecting, tool) //start on it + //We had proper tools! (or RNG smiled.) and user did not move or change hands. + if(prob(S.tool_quality(tool)) && do_mob(user, M, rand(S.min_duration, S.max_duration))) + S.end_step(user, M, user.zone_sel.selecting, tool) //finish successfully + else if (tool in user.contents && user.Adjacent(M)) //or + S.fail_step(user, M, user.zone_sel.selecting, tool) //malpractice~ + else // This failing silently was a pain. + user << "\red You must remain close to your patient to conduct surgery." + M.op_stage.in_progress = 0 // Clear the in-progress flag. + return 1 //don't want to do weapony things after surgery + if (user.a_intent == "help") user << "\red You can't see any useful way to use [tool] on [M]." return 1 @@ -116,6 +129,6 @@ proc/sort_surgeries() /datum/surgery_status/ var/eyes = 0 var/face = 0 - var/appendix = 0 var/head_reattach = 0 - var/current_organ + var/current_organ = "organ" + var/in_progress = 0 \ No newline at end of file diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index d21f8b72af4..977c9ab9cab 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -10,7 +10,7 @@ var/list/datum/disease2/effectholder/effects = list() var/antigen = 0 // 16 bits describing the antigens, when one bit is set, a cure with that bit can dock here var/max_stage = 4 - var/list/affected_species = list("Human","Unathi","Skrell","Tajaran") + var/list/affected_species = list("Human","Unathi","Skrell","Tajara") /datum/disease2/disease/New() uniqueID = rand(0,10000) diff --git a/icons/mob/alien.dmi b/icons/mob/alien.dmi index 2f31429878b2a40b8ba64228bb6e0d49bb3b9b4f..362dcc96ea2bebf77a429c074b3902538df88c9b 100644 GIT binary patch delta 8819 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 delta 8890 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