diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index 3562639c84b..d936b65b09e 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 89c034035ed..87958b69338 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -161,7 +161,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 @@ -211,7 +211,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 f09c464c887..84bffec64de 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 9da6564adaa..33834afc77c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -13,62 +13,57 @@ 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/skellington/New() +/mob/living/carbon/human/skellington/New(var/new_loc) h_style = "Bald" - set_species("Skellington") - ..() + ..(new_loc, "Skellington") -/mob/living/carbon/human/diona/New() - species = new /datum/species/diona(src) - ..() -/mob/living/carbon/human/kidan/New() - species = new /datum/species/kidan(src) - ..() +/mob/living/carbon/human/kidan/New(var/new_loc) + ..(new_loc, "Kidan") -/mob/living/carbon/human/slime/New() - species = new /datum/species/slime(src) +/mob/living/carbon/human/slime/New(var/new_loc) + ..(new_loc, "Slime People") dna = new /datum/dna(null) dna.mutantrace = "slime" - ..() -/mob/living/carbon/human/machine/New() - species = new /datum/species/machine(src) - ..() -/mob/living/carbon/human/grey/New() - set_species("Grey") +/mob/living/carbon/human/grey/New(var/new_loc) + ..(new_loc, "Grey") mutations.Add(M_REMOTE_TALK) verbs += /mob/living/carbon/human/proc/remotesay - ..() -/mob/living/carbon/human/human/New() - species = new /datum/species/human(src) - ..() +/mob/living/carbon/human/human/New(var/new_loc) + ..(new_loc, "Human") -/mob/living/carbon/human/New() +/mob/living/carbon/human/diona/New(var/new_loc) + ..(new_loc, "Diona") + +/mob/living/carbon/human/machine/New(var/new_loc) + h_style = "blue IPC screen" + ..(new_loc, "Machine") + +/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() if(species.language) var/datum/language/L = all_languages[species.language] @@ -92,7 +87,7 @@ hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[STATUS_HUD_OOC] = image('icons/mob/hud.dmi', src, "hudhealthy") - + ..() @@ -100,7 +95,6 @@ dna.real_name = real_name prev_gender = gender // Debug for plural genders - make_organs() make_blood() @@ -1296,7 +1290,8 @@ else usr << "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]." -/mob/living/carbon/human/proc/set_species(var/new_species,var/on_spawn=0) + +/mob/living/carbon/human/proc/set_species(var/new_species, var/force_organs) if(!dna) if(!new_species) @@ -1315,6 +1310,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 77dd84aeebc..725776a6394 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -46,14 +46,46 @@ var/list/abilities = list() // For species-derived or admin-given powers -/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"]) + + if (name!="Slime People") + 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). @@ -143,7 +175,6 @@ flags = NO_SCAN | IS_WHITELISTED | NO_BLOOD /datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H) - var/datum/organ/external/affected = H.get_organ("head") //To avoid duplicates. @@ -235,9 +266,10 @@ flags = NO_BREATHE | REQUIRE_LIGHT | NO_SCAN | IS_PLANT | RAD_ABSORB | NO_BLOOD | IS_SLOW | NO_PAIN /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 ceabbc244e8..bc70606b09c 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -369,40 +369,21 @@ proc/create_character() spawning = 1 close_spawn_windows() + + 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. - switch(chosen_species.name) - if("Slime People") - new_character = new /mob/living/carbon/human/slime(loc) - if("Tajaran") - new_character = new /mob/living/carbon/human/tajaran(loc) - if("Unathi") - new_character = new /mob/living/carbon/human/unathi(loc) - if("Skrell") - new_character = new /mob/living/carbon/human/skrell(loc) - if("Diona") - new_character = new /mob/living/carbon/human/diona(loc) - if("Vox") - new_character = new /mob/living/carbon/human/vox(loc) - if("Kidan") - new_character = new /mob/living/carbon/human/kidan(loc) - if("Grey") - new_character = new /mob/living/carbon/human/grey(loc) - if("Machine") - new_character = new /mob/living/carbon/human/machine(loc) - if("Human") - new_character = new /mob/living/carbon/human/human(loc) -// new_character.set_species(client.prefs.species) - if(chosen_species.language) - new_character.add_language(chosen_species.language) - else - new_character = new /mob/living/carbon/human(loc) - new_character.lastarea = get_area(loc) + 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 0bc2d9fc1a8..e48b0f7371b 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["chest"]) - organs_by_name["l_leg"] = new/datum/organ/external/l_leg(organs_by_name["chest"]) - 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"]) - - if (species.name!="Slime People") - 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() diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 4d0d6838e5a..ca39c6d4cd0 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -59,7 +59,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) @@ -71,10 +71,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