diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index c3f1b0db88..444e56a587 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -110,9 +110,11 @@ sleep(48) del(animation) - var/mob/living/carbon/human/O = new( src ) + var/mob/living/carbon/human/O if(Mo.greaterform) - O.set_species(Mo.greaterform) + O = new(src, Mo.greaterform) + else + O = new(src) if (M.dna.GetUIState(DNA_UI_GENDER)) O.gender = FEMALE diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 15d0b2d61c..4361460980 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -162,7 +162,7 @@ spawn(30) src.eject_wait = 0 - var/mob/living/carbon/human/H = new /mob/living/carbon/human(src) + var/mob/living/carbon/human/H = new /mob/living/carbon/human(src, R.dna.species) occupant = H if(!R.dna.real_name) //to prevent null names @@ -212,8 +212,6 @@ if(R.dna.species == "Human") //no more xenos losing ears/tentacles H.h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3") - H.set_species(R.dna.species) - //for(var/datum/language/L in languages) // H.add_language(L.name) H.suiciding = 0 diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 81fcb93546..9d25643468 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -492,7 +492,7 @@ client/proc/one_click_antag() /datum/admins/proc/create_vox_raider(obj/spawn_location, leader_chosen = 0) - var/mob/living/carbon/human/new_vox = new(spawn_location.loc) + var/mob/living/carbon/human/new_vox = new(spawn_location.loc, "Vox") new_vox.gender = pick(MALE, FEMALE) new_vox.h_style = "Short Vox Quills" @@ -512,8 +512,6 @@ client/proc/one_click_antag() new_vox.dna.ready_dna(new_vox) // Creates DNA. new_vox.dna.mutantrace = "vox" - new_vox.set_species("Vox") // Actually makes the vox! How about that. - new_vox.add_language("Vox-pidgin") new_vox.mind_initialize() new_vox.mind.assigned_role = "MODE" new_vox.mind.special_role = "Vox Raider" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 9e75b94987..54651d07c7 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -12,39 +12,36 @@ real_name = "Test Dummy" status_flags = GODMODE|CANPUSH -/mob/living/carbon/human/skrell/New() +/mob/living/carbon/human/skrell/New(var/new_loc) h_style = "Skrell Male Tentacles" - set_species("Skrell") - ..() + ..(new_loc, "Skrell") -/mob/living/carbon/human/tajaran/New() +/mob/living/carbon/human/tajaran/New(var/new_loc) h_style = "Tajaran Ears" - set_species("Tajaran") - ..() + ..(new_loc, "Tajaran") -/mob/living/carbon/human/unathi/New() +/mob/living/carbon/human/unathi/New(var/new_loc) h_style = "Unathi Horns" - set_species("Unathi") - ..() + ..(new_loc, "Unathi") -/mob/living/carbon/human/vox/New() +/mob/living/carbon/human/vox/New(var/new_loc) h_style = "Short Vox Quills" - set_species("Vox") - ..() + ..(new_loc, "Vox") -/mob/living/carbon/human/diona/New() - species = new /datum/species/diona(src) - ..() +/mob/living/carbon/human/diona/New(var/new_loc) + ..(new_loc, "Diona") -/mob/living/carbon/human/machine/New() +/mob/living/carbon/human/machine/New(var/new_loc) h_style = "blue IPC screen" - set_species("Machine") - ..() + ..(new_loc, "Machine") -/mob/living/carbon/human/New() +/mob/living/carbon/human/New(var/new_loc, var/new_species = null) if(!species) - set_species() + if(new_species) + set_species(new_species) + else + set_species() var/datum/reagents/R = new/datum/reagents(1000) reagents = R @@ -71,7 +68,6 @@ dna.real_name = real_name prev_gender = gender // Debug for plural genders - make_organs() make_blood() /mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes) @@ -1202,7 +1198,7 @@ else usr << "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]." -/mob/living/carbon/human/proc/set_species(var/new_species) +/mob/living/carbon/human/proc/set_species(var/new_species, var/force_organs) if(!dna) if(!new_species) @@ -1221,6 +1217,9 @@ species = all_species[new_species] + if(force_organs || !organs || !organs.len) + species.create_organs(src) + if(species.language) add_language(species.language) diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index 384774f14f..a8d595c710 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -42,14 +42,45 @@ var/blood_color = "#A10808" //Red. var/flesh_color = "#FFC896" //Pink. -/datum/species/proc/handle_post_spawn(var/mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment. +/datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs. + //This is a basic humanoid limb setup. + H.organs = list() + H.organs_by_name["chest"] = new/datum/organ/external/chest() + H.organs_by_name["groin"] = new/datum/organ/external/groin(H.organs_by_name["chest"]) + H.organs_by_name["head"] = new/datum/organ/external/head(H.organs_by_name["chest"]) + H.organs_by_name["l_arm"] = new/datum/organ/external/l_arm(H.organs_by_name["chest"]) + H.organs_by_name["r_arm"] = new/datum/organ/external/r_arm(H.organs_by_name["chest"]) + H.organs_by_name["r_leg"] = new/datum/organ/external/r_leg(H.organs_by_name["groin"]) + H.organs_by_name["l_leg"] = new/datum/organ/external/l_leg(H.organs_by_name["groin"]) + H.organs_by_name["l_hand"] = new/datum/organ/external/l_hand(H.organs_by_name["l_arm"]) + H.organs_by_name["r_hand"] = new/datum/organ/external/r_hand(H.organs_by_name["r_arm"]) + H.organs_by_name["l_foot"] = new/datum/organ/external/l_foot(H.organs_by_name["l_leg"]) + H.organs_by_name["r_foot"] = new/datum/organ/external/r_foot(H.organs_by_name["r_leg"]) + + H.internal_organs = list() + H.internal_organs_by_name["heart"] = new/datum/organ/internal/heart(H) + H.internal_organs_by_name["lungs"] = new/datum/organ/internal/lungs(H) + H.internal_organs_by_name["liver"] = new/datum/organ/internal/liver(H) + H.internal_organs_by_name["kidney"] = new/datum/organ/internal/kidney(H) + H.internal_organs_by_name["brain"] = new/datum/organ/internal/brain(H) + H.internal_organs_by_name["eyes"] = new/datum/organ/internal/eyes(H) + + for(var/name in H.organs_by_name) + H.organs += H.organs_by_name[name] + + for(var/datum/organ/external/O in H.organs) + O.owner = H if(flags & IS_SYNTHETIC) for(var/datum/organ/external/E in H.organs) if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue E.status |= ORGAN_ROBOT for(var/datum/organ/internal/I in H.internal_organs) - I.robotic = 2 + I.mechanize() + + return + +/datum/species/proc/handle_post_spawn(var/mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment. return /datum/species/proc/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns). @@ -152,7 +183,6 @@ flesh_color = "#808D11" /datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H) - var/datum/organ/external/affected = H.get_organ("head") //To avoid duplicates. @@ -199,9 +229,10 @@ flesh_color = "#907E4A" /datum/species/diona/handle_post_spawn(var/mob/living/carbon/human/H) - H.gender = NEUTER + return ..() + /datum/species/diona/handle_death(var/mob/living/carbon/human/H) var/mob/living/carbon/monkey/diona/S = new(get_turf(H)) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 26e1715a80..57b29181da 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -349,15 +349,19 @@ spawning = 1 close_spawn_windows() - var/mob/living/carbon/human/new_character = new(loc) - new_character.lastarea = get_area(loc) + var/mob/living/carbon/human/new_character var/datum/species/chosen_species if(client.prefs.species) chosen_species = all_species[client.prefs.species] if(chosen_species) if(is_alien_whitelisted(src, client.prefs.species) || !config.usealienwhitelist || !(chosen_species.flags & IS_WHITELISTED) || (client.holder.rights & R_ADMIN) )// Have to recheck admin due to no usr at roundstart. Latejoins are fine though. - new_character.set_species(client.prefs.species) + new_character = new(loc, client.prefs.species) + + if(!new_character) + new_character = new(loc) + + new_character.lastarea = get_area(loc) var/datum/language/chosen_language if(client.prefs.language) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 3e169f22b6..b0971c385e 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -37,34 +37,6 @@ /mob/living/carbon/human/var/list/organs_by_name = list() // map organ names to organs /mob/living/carbon/human/var/list/internal_organs_by_name = list() // so internal organs have less ickiness too -//Creates and initializes and connects external and internal organs -/mob/living/carbon/human/proc/make_organs() - organs = list() - organs_by_name["chest"] = new/datum/organ/external/chest() - organs_by_name["groin"] = new/datum/organ/external/groin(organs_by_name["chest"]) - organs_by_name["head"] = new/datum/organ/external/head(organs_by_name["chest"]) - organs_by_name["l_arm"] = new/datum/organ/external/l_arm(organs_by_name["chest"]) - organs_by_name["r_arm"] = new/datum/organ/external/r_arm(organs_by_name["chest"]) - organs_by_name["r_leg"] = new/datum/organ/external/r_leg(organs_by_name["groin"]) - organs_by_name["l_leg"] = new/datum/organ/external/l_leg(organs_by_name["groin"]) - organs_by_name["l_hand"] = new/datum/organ/external/l_hand(organs_by_name["l_arm"]) - organs_by_name["r_hand"] = new/datum/organ/external/r_hand(organs_by_name["r_arm"]) - organs_by_name["l_foot"] = new/datum/organ/external/l_foot(organs_by_name["l_leg"]) - organs_by_name["r_foot"] = new/datum/organ/external/r_foot(organs_by_name["r_leg"]) - - internal_organs_by_name["heart"] = new/datum/organ/internal/heart(src) - internal_organs_by_name["lungs"] = new/datum/organ/internal/lungs(src) - internal_organs_by_name["liver"] = new/datum/organ/internal/liver(src) - internal_organs_by_name["kidney"] = new/datum/organ/internal/kidney(src) - internal_organs_by_name["brain"] = new/datum/organ/internal/brain(src) - internal_organs_by_name["eyes"] = new/datum/organ/internal/eyes(src) - - for(var/name in organs_by_name) - organs += organs_by_name[name] - - for(var/datum/organ/external/O in organs) - O.owner = src - // Takes care of organ related updates, such as broken and missing limbs /mob/living/carbon/human/proc/handle_organs() number_wounds = 0 diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 9f5036dea1..aee7b1f6d8 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -61,7 +61,7 @@ else new_mob = new /mob/living/carbon/alien/larva(M.loc) new_mob.universal_speak = 1 if("human") - new_mob = new /mob/living/carbon/human(M.loc) + new_mob = new /mob/living/carbon/human(M.loc, pick(all_species)) if(M.gender == MALE) new_mob.gender = MALE new_mob.name = pick(first_names_male) @@ -73,10 +73,6 @@ var/datum/preferences/A = new() //Randomize appearance for the human A.randomize_appearance_for(new_mob) - - var/mob/living/carbon/human/H = new_mob - var/newspecies = pick(all_species) - H.set_species(newspecies) else return