diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 894b71d356b..4e3aa86868f 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -558,16 +558,10 @@ Turf and target are seperate in case you want to teleport some distance from a t
moblist.Add(M)
for(var/mob/new_player/M in sortmob)
moblist.Add(M)
- for(var/mob/living/carbon/monkey/M in sortmob)
- moblist.Add(M)
for(var/mob/living/carbon/slime/M in sortmob)
moblist.Add(M)
for(var/mob/living/simple_animal/M in sortmob)
moblist.Add(M)
-// for(var/mob/living/silicon/hivebot/M in world)
-// mob_list.Add(M)
-// for(var/mob/living/silicon/hive_mainframe/M in world)
-// mob_list.Add(M)
return moblist
//E = MC^2
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index dc93941ac6b..c0159f66390 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -176,7 +176,7 @@ datum/hud/New(mob/owner)
if(ishuman(mymob))
human_hud(ui_style, ui_color, ui_alpha) // Pass the player the UI style chosen in preferences
- else if(ismonkey(mymob))
+ else if(issmall(mymob))
monkey_hud(ui_style)
else if(isbrain(mymob))
brain_hud(ui_style)
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 3edd0ba0bde..17121f92f32 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -50,39 +50,6 @@
/mob/living/RestrainedClickOn(var/atom/A)
return
-/*
- Monkeys
-*/
-/mob/living/carbon/monkey/UnarmedAttack(var/atom/A)
- A.attack_paw(src)
-/atom/proc/attack_paw(mob/user as mob)
- return
-
-/*
- Monkey RestrainedClickOn() was apparently the
- one and only use of all of the restrained click code
- (except to stop you from doing things while handcuffed);
- moving it here instead of various hand_p's has simplified
- things considerably
-*/
-/mob/living/carbon/monkey/RestrainedClickOn(var/atom/A)
- if(..())
- return
- if(a_intent != "harm" || !ismob(A)) return
- if(is_muzzled())
- return
- var/mob/living/carbon/ML = A
- var/dam_zone = ran_zone(pick("chest", "l_hand", "r_hand", "l_leg", "r_leg"))
- var/armor = ML.run_armor_check(dam_zone, "melee")
- if(prob(75))
- ML.apply_damage(rand(1,3), BRUTE, dam_zone, armor)
- for(var/mob/O in viewers(ML, null))
- O.show_message("\red [name] has bit [ML]!", 1)
- if(armor >= 2) return
- else
- for(var/mob/O in viewers(ML, null))
- O.show_message("\red [src] has attempted to bite [ML]!", 1)
-
/*
Aliens
Defaults to same as monkey in most places
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index e3459ca6d55..47fade12372 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -1012,36 +1012,6 @@ datum/mind
message_admins("[key_name_admin(usr)] has thrall'ed [current].")
log_admin("[key_name(usr)] has thrall'ed [current].")
- else if (href_list["monkey"])
- var/mob/living/L = current
- if (L.notransform)
- return
- switch(href_list["monkey"])
- if("healthy")
- if (usr.client.holder.rights & R_ADMIN)
- var/mob/living/carbon/human/H = current
- var/mob/living/carbon/monkey/M = current
- if (istype(H))
- log_admin("[key_name(usr)] attempting to monkeyize [key_name(current)]")
- message_admins("\blue [key_name_admin(usr)] attempting to monkeyize [key_name_admin(current)]")
- src = null
- M = H.monkeyize()
- src = M.mind
- //world << "DEBUG: \"healthy\": M=[M], M.mind=[M.mind], src=[src]!"
- sleep(0) //because deleting of virus is done through spawn(0)
- if("human")
- var/mob/living/carbon/monkey/M = current
- if (istype(M))
- log_admin("[key_name(usr)] attempting to humanize [key_name(current)]")
- message_admins("\blue [key_name_admin(usr)] attempting to humanize [key_name_admin(current)]")
- var/obj/item/weapon/dnainjector/m2h/m2h = new
- var/obj/item/weapon/implant/mobfinder = new(M) //hack because humanizing deletes mind --rastaf0
- src = null
- m2h.inject(M)
- src = mobfinder.loc:mind
- del(mobfinder)
- current.radiation -= 50
-
else if (href_list["silicon"])
current.hud_updateflag |= (1 << SPECIALROLE_HUD)
switch(href_list["silicon"])
@@ -1396,9 +1366,6 @@ datum/mind
mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist)
mind.active = 1 //indicates that the mind is currently synced with a client
-//MONKEY
-/mob/living/carbon/monkey/mind_initialize()
- ..()
//slime
/mob/living/carbon/slime/mind_initialize()
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 29b1cd1b3d9..2ba16ac0663 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -132,7 +132,7 @@
return
if(usr.restrained() || usr.stat || usr.weakened || usr.stunned || usr.paralysis || usr.resting) //are you cuffed, dying, lying, stunned or other
return
- if (!ishuman(usr) && !ismonkey(usr)) //Make sure they're a mob that has dna
+ if (!ishuman(usr) && !issmall(usr)) //Make sure they're a mob that has dna
usr << "\blue Try as you might, you can not climb up into the scanner."
return
if (src.occupant)
diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm
index 09751412a30..44aae09ae9f 100644
--- a/code/game/gamemodes/changeling/powers/lesserform.dm
+++ b/code/game/gamemodes/changeling/powers/lesserform.dm
@@ -16,52 +16,18 @@
return
user << "Our genes cry out!"
- var/mob/living/carbon/C = user
+ var/mob/living/carbon/human/H = user
- //TODO replace with monkeyize proc
+ if(!istype(H) || !H.species.primitive_form)
+ src << "We cannot perform this ability in this form!"
+ return
+
+ H.visible_message("[H] transforms!")
+ changeling.geneticdamage = 30
+ H << "Our genes cry out!"
var/list/implants = list() //Try to preserve implants.
- for(var/obj/item/weapon/implant/W in C)
+ for(var/obj/item/weapon/implant/W in H)
implants += W
-
- C.notransform = 1
- C.canmove = 0
- C.icon = null
- C.overlays.Cut()
- C.invisibility = 101
-
- var/atom/movable/overlay/animation = new /atom/movable/overlay( C.loc )
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = src
- flick("h2monkey", animation)
- sleep(30)
- del(animation)
-
- var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey(src)
- O.dna = C.dna.Clone()
- C.dna = null
-
- for(var/obj/item/W in C)
- C.unEquip(W)
- for(var/obj/T in C)
- del(T)
-
- O.loc = C.loc
- O.name = "monkey ([copytext(md5(C.real_name), 2, 6)])"
- O.setToxLoss(C.getToxLoss())
- O.adjustBruteLoss(C.getBruteLoss())
- O.setOxyLoss(C.getOxyLoss())
- O.adjustFireLoss(C.getFireLoss())
- O.stat = C.stat
- O.a_intent = "harm"
- for(var/obj/item/weapon/implant/I in implants)
- I.loc = O
- I.implanted = O
-
- C.mind.transfer_to(O)
- O.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null)
- O.changeling_update_languages(changeling.absorbed_languages)
-
+ H.monkeyize()
feedback_add_details("changeling_powers","LF")
- qdel(C)
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 91739c16d22..d9a99767aa7 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -679,42 +679,6 @@ var/list/sacrificed = list()
H.dust()//To prevent the MMI from remaining
else
H.gib()
- for(var/mob/living/carbon/monkey/M in src.loc)
- if (ticker.mode.name == "cult")
- if(M.mind == ticker.mode:sacrifice_target)
- if(cultsinrange.len >= 3)
- sacrificed += M.mind
- usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
- else
- usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
- continue
- else
- if(prob(20))
- usr << "\red The Geometer of Blood accepts your meager sacrifice."
- ticker.mode:grant_runeword(usr)
- else
- usr << "\red The Geometer of blood accepts this sacrifice."
- usr << "\red However, a mere monkey is not enough to satisfy Him."
- else
- usr << "\red The Geometer of Blood accepts your meager sacrifice."
- if(prob(20))
- ticker.mode.grant_runeword(usr)
- M.gib()
-/* for(var/mob/living/carbon/alien/A)
- for(var/mob/K in cultsinrange)
- K.say("Barhah hra zar'garis!")
- A.dust() /// A.gib() doesnt work for some reason, and dust() leaves that skull and bones thingy which we dont really need.
- if (ticker.mode.name == "cult")
- if(prob(75))
- usr << "\red The Geometer of Blood accepts your exotic sacrifice."
- ticker.mode:grant_runeword(usr)
- else
- usr << "\red The Geometer of Blood accepts your exotic sacrifice."
- usr << "\red However, this alien is not enough to gain His favor."
- else
- usr << "\red The Geometer of Blood accepts your exotic sacrifice."
- return
- return fizzle() */
/////////////////////////////////////////SIXTEENTH RUNE
diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm
index 07794377d04..ed0383660a9 100644
--- a/code/game/gamemodes/events.dm
+++ b/code/game/gamemodes/events.dm
@@ -1,167 +1,3 @@
-//this file left in for legacy support
-/*
-/proc/start_events()
- //changed to a while(1) loop since they are more efficient.
- //Moved the spawn in here to allow it to be called with advance proc call if it crashes.
- //and also to stop spawn copying variables from the game ticker
- spawn(3000)
- while(1)
- if(prob(50))//Every 120 seconds and prob 50 2-4 weak spacedusts will hit the station
- spawn(1)
- dust_swarm("weak")
- if(!event)
- //CARN: checks to see if random events are enabled.
- if(config.allow_random_events)
- if(prob(eventchance))
- event()
- hadevent = 1
- else
- Holiday_Random_Event()
- else
- event = 0
- sleep(1200)
-
-/proc/event()
- event = 1
-
- var/eventNumbersToPickFrom = list(1,2,4,5,6,7,8,9,10,11,12,13,14, 15) //so ninjas don't cause "empty" events.
-
- if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round.
- eventNumbersToPickFrom += 3
- switch(pick(eventNumbersToPickFrom))
- if(1)
- command_announcement.Announce("Meteors have been detected on collision course with the station.", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg')
- spawn(100)
- meteor_wave()
- spawn_meteors()
- spawn(700)
- meteor_wave()
- spawn_meteors()
-
- if(2)
- command_announcement.Announce("Gravitational anomalies detected on the station. There is no additional data.", "Anomaly Alert", new_sound = 'sound/AI/granomalies.ogg')
- var/turf/T = pick(blobstart)
- var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 )
- spawn(rand(50, 300))
- del(bh)
- /*
- if(3) //Leaving the code in so someone can try and delag it, but this event can no longer occur randomly, per SoS's request. --NEO
- command_announcement.Announce("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert", new_sound = 'sound/AI/spanomalies.ogg')
- var/list/turfs = new
- var/turf/picked
- for(var/turf/simulated/floor/T in world)
- if((T.z in config.station_levels))
- turfs += T
- for(var/turf/simulated/floor/T in turfs)
- if(prob(20))
- spawn(50+rand(0,3000))
- picked = pick(turfs)
- var/obj/effect/portal/P = new /obj/effect/portal( T )
- P.target = picked
- P.creator = null
- P.icon = 'icons/obj/objects.dmi'
- P.failchance = 0
- P.icon_state = "anom"
- P.name = "wormhole"
- spawn(rand(300,600))
- del(P)
- */
- if(3)
- if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round.
- space_ninja_arrival()//Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like.
- if(4)
- mini_blob_event()
-
- if(5)
- high_radiation_event()
- if(6)
- viral_outbreak()
- if(7)
- alien_infestation()
- if(8)
- prison_break()
- if(9)
- carp_migration()
- if(10)
- immovablerod()
- if(11)
- lightsout(1,2)
- if(12)
- appendicitis()
- if(13)
- IonStorm()
- if(14)
- spacevine_infestation()
- if(15)
- communications_blackout()
-*/
-
-
-
-/*
-/proc/viral_outbreak(var/virus = null)
-// command_announcement.Announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
- var/virus_type
- if(!virus)
- virus_type = pick(/datum/disease/dnaspread,/datum/disease/advance/flu,/datum/disease/advance/cold,/datum/disease/brainrot,/datum/disease/magnitis,/datum/disease/pierrot_throat)
- else
- switch(virus)
- if("fake gbs")
- virus_type = /datum/disease/fake_gbs
- if("gbs")
- virus_type = /datum/disease/gbs
- if("magnitis")
- virus_type = /datum/disease/magnitis
- if("rhumba beat")
- virus_type = /datum/disease/rhumba_beat
- if("brain rot")
- virus_type = /datum/disease/brainrot
- if("cold")
- virus_type = /datum/disease/advance/cold
- if("retrovirus")
- virus_type = /datum/disease/dnaspread
- if("flu")
- virus_type = /datum/disease/advance/flu
-// if("t-virus")
-// virus_type = /datum/disease/t_virus
- if("pierrot's throat")
- virus_type = /datum/disease/pierrot_throat
- for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
-
- var/foundAlready = 0 // don't infect someone that already has the virus
- var/turf/T = get_turf(H)
- if(!T)
- continue
- if(!(T.z in config.station_levels))
- continue
- for(var/datum/disease/D in H.viruses)
- foundAlready = 1
- if(H.stat == 2 || foundAlready)
- continue
-
- if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work.
- if((!H.dna) || (H.sdisabilities & BLIND)) //A blindness disease would be the worst.
- continue
- var/datum/disease/dnaspread/D = new
- D.strain_data["name"] = H.real_name
- D.strain_data["UI"] = H.dna.uni_identity
- D.strain_data["SE"] = H.dna.struc_enzymes
- D.carrier = 1
- D.holder = H
- D.affected_mob = H
- H.viruses += D
- break
- else
- var/datum/disease/D = new virus_type
- D.carrier = 1
- D.holder = H
- D.affected_mob = H
- H.viruses += D
- break
- spawn(rand(1500, 3000)) //Delayed announcements to keep the crew on their toes.
- command_announcement.Announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
-*/
-
/proc/alien_infestation(var/spawncount = 1) // -- TLE
//command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
var/list/vents = list()
@@ -218,13 +54,6 @@
else
randmutg(H)
domutcheck(H,null,MUTCHK_FORCED)
- for(var/mob/living/carbon/monkey/M in living_mob_list)
- var/turf/T = get_turf(M)
- if(!T)
- continue
- if(!(T.z in config.station_levels))
- continue
- M.apply_effect((rand(15,75)),IRRADIATE,0)
sleep(100)
command_announcement.Announce("High levels of radiation detected near the station. Please report to the Med-bay if you feel strange.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg')
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index f6b34aef591..96fe8b41027 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -118,7 +118,7 @@
//if they are holding or wearing a card that has access, that works
if(src.check_access(H.get_active_hand()) || src.check_access(H.wear_id))
return 1
- else if(istype(M, /mob/living/carbon/monkey) || istype(M, /mob/living/carbon/alien/humanoid))
+ else if(istype(M, /mob/living/carbon/alien/humanoid))
var/mob/living/carbon/george = M
//they can only hold things :(
if(src.check_access(george.get_active_hand()))
@@ -211,14 +211,14 @@
if("Special Operations Officer")
return get_all_centcom_access() + get_all_accesses()
if("Nanotrasen Navy Representative")
- return get_all_centcom_access() + get_all_accesses()
+ return get_all_centcom_access() + get_all_accesses()
if("Nanotrasen Navy Officer")
return get_all_centcom_access() + get_all_accesses()
if("Nanotrasen Navy Captain")
return get_all_centcom_access() + get_all_accesses()
if("Supreme Commander")
return get_all_centcom_access() + get_all_accesses()
-
+
/proc/get_syndicate_access(job)
switch(job)
if("Syndicate Operative")
@@ -226,12 +226,12 @@
if("Syndicate Operative Leader")
return list(access_syndicate, access_syndicate_leader)
if("Vox Raider")
- return list(access_vox)
+ return list(access_vox)
if("Vox Trader")
- return list(access_vox)
+ return list(access_vox)
if("Syndicate Commando")
- return list(access_syndicate, access_syndicate_leader)
-
+ return list(access_syndicate, access_syndicate_leader)
+
/proc/get_all_accesses()
return list(access_security, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_court,
access_medical, access_genetics, access_morgue, access_rd,
@@ -470,7 +470,7 @@
return "Bridge"
if(access_cent_commander)
return "Commander"
-
+
/proc/get_syndicate_access_desc(A)
switch(A)
if(access_syndicate)
@@ -534,7 +534,7 @@
return assignment
return "Unknown"
-
+
proc/GetIdCard(var/mob/living/carbon/human/H)
if(H.wear_id)
var/id = H.wear_id.GetID()
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index fcc080124cd..c7d600bf62f 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -577,7 +577,7 @@
set name = "Enter Sleeper"
set category = null
set src in oview(1)
- if(usr.stat != 0 || !(ishuman(usr) || ismonkey(usr)))
+ if(usr.stat != 0 || !(ishuman(usr) || issmall(usr)))
return
if(src.occupant)
usr << "\blue The sleeper is already occupied!"
diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index ad3939b294a..2a9b0c833e3 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -290,9 +290,6 @@
if("jacket")
if (check_cost(500/efficiency)) return 0
else new/obj/item/clothing/suit/jacket/leather(src.loc)
- //if("monkey")
- // if (check_cost(500)) return 0
- // else new/mob/living/carbon/monkey(src.loc)
processing = 0
menustat = "complete"
update_icon()
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 30db6a7d225..14a461474e1 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -174,7 +174,7 @@
var/on_store_message = "has entered long-term storage."
var/on_store_name = "Cryogenic Oversight"
var/on_enter_occupant_message = "You feel cool air surround you. You go numb as your senses turn inward."
- var/allow_occupant_types = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ var/allow_occupant_types = list(/mob/living/carbon/human)
var/disallow_occupant_types = list()
var/mob/living/occupant = null // Person waiting to be despawned.
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 367e31f7ac6..a68fe87f068 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -331,8 +331,7 @@ Class Procs:
if(user.lying || user.stat)
return 1
if ( ! (istype(usr, /mob/living/carbon/human) || \
- istype(usr, /mob/living/silicon) || \
- istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") )
+ istype(usr, /mob/living/silicon)))
usr << "\red You don't have the dexterity to do this!"
return 1
/*
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 196850255eb..4458f560715 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -128,7 +128,7 @@
eprojectile = /obj/item/projectile/beam //If it has, going to kill mode
eshot_sound = 'sound/weapons/Laser.ogg'
egun = 1
-
+
if(/obj/item/weapon/gun/energy/gun/turret)
eprojectile = /obj/item/projectile/beam //If it has, going to copypaste mode
eshot_sound = 'sound/weapons/Laser.ogg'
@@ -210,7 +210,7 @@
/obj/machinery/porta_turret/proc/HasController()
var/area/A = get_area(src)
return A && A.turret_controls.len > 0
-
+
/obj/machinery/porta_turret/CanUseTopic(var/mob/user)
if(HasController())
user << "Turrets can only be controlled using the assigned turret controller."
@@ -336,9 +336,9 @@
spawn()
sleep(60)
attacked = 0
-
+
..()
-
+
/obj/machinery/porta_turret/emag_act(user as mob)
if(!emagged)
//Emagging the turret makes it go bonkers and stun everyone. It also makes
@@ -450,8 +450,8 @@
assess_and_assign(ME.occupant, targets, secondarytargets)
for(var/obj/spacepod/SP in view(7,src))
- assess_and_assign(SP.occupant, targets, secondarytargets)
-
+ assess_and_assign(SP.occupant, targets, secondarytargets)
+
for(var/obj/vehicle/train/T in view(7,src))
assess_and_assign(T.load, targets, secondarytargets)
@@ -502,7 +502,7 @@
if(iscuffed(L)) // If the target is handcuffed, leave it alone
return TURRET_NOT_TARGET
- if(isanimal(L) || ismonkey(L)) // Animals are not so dangerous
+ if(isanimal(L) || issmall(L)) // Animals are not so dangerous
return check_anomalies ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET
if(isalien(L)) // Xenos are dangerous
return check_anomalies ? TURRET_PRIORITY_TARGET : TURRET_NOT_TARGET
@@ -524,8 +524,8 @@
var/mob/living/M = pick(targets)
targets -= M
if(target(M))
- return 1
-
+ return 1
+
/obj/machinery/porta_turret/proc/popUp() //pops the turret up
if(disabled)
return
@@ -562,7 +562,7 @@
raised = 0
invisibility = INVISIBILITY_LEVEL_TWO
update_icon()
-
+
/obj/machinery/porta_turret/on_assess_perp(mob/living/carbon/human/perp)
if((check_access || attacked) && !allowed(perp))
//if the turret has been attacked or is angry, target all non-authorized personnel, see req_access
@@ -616,8 +616,8 @@
// Lethal/emagged turrets use twice the power due to higher energy beams
// Emagged turrets again use twice as much power due to higher firing rates
- use_power(reqpower * (2 * (emagged || lethal)) * (2 * emagged))
-
+ use_power(reqpower * (2 * (emagged || lethal)) * (2 * emagged))
+
//Shooting Code:
A.current = T
A.yo = U.y - T.y
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index 36b74f897a6..9708dbf3304 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -82,7 +82,7 @@
race = "[H.species.name]"
- else if(ismonkey(M))
+ else if(issmall(M))
race = "Monkey"
language = race
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index 9ca78dd7f30..dbb891ca337 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -19,7 +19,7 @@
if(triggered) return
- if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey))
+ if(istype(M, /mob/living/carbon/human))
for(var/mob/O in viewers(world.view, src.loc))
O << "[M] triggered the \icon[src] [src]"
triggered = 1
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index f73a366ea94..8b1f979d4a7 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -494,34 +494,6 @@
return 0 //Unsupported slot
//END HUMAN
- else if(ismonkey(M))
- //START MONKEY
- var/mob/living/carbon/monkey/MO = M
- switch(slot)
- if(slot_l_hand)
- if(MO.l_hand)
- return 0
- return 1
- if(slot_r_hand)
- if(MO.r_hand)
- return 0
- return 1
- if(slot_wear_mask)
- if(MO.wear_mask)
- return 0
- if( !(slot_flags & SLOT_MASK) )
- return 0
- return 1
- if(slot_back)
- if(MO.back)
- return 0
- if( !(slot_flags & SLOT_BACK) )
- return 0
- return 1
- return 0 //Unsupported slot
-
- //END MONKEY
-
/obj/item/verb/verb_pickup()
set src in oview(1)
@@ -586,14 +558,6 @@
user << "\red You're going to need to remove that mask/helmet/glasses first."
return
- var/mob/living/carbon/monkey/Mo = M
- if(istype(Mo) && ( \
- (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
- ))
- // you can't stab someone in the eyes wearing a mask!
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/slime))//Aliens don't have eyes./N slimes also don't have eyes!
user << "\red You cannot locate any eyes on this creature!"
return
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 281232f23a4..e31bfc79996 100755
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -1134,9 +1134,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
JFLOG("[user] used the fingerprint scanner on [C]")
if (!istype(C:dna, /datum/dna))
user << "\blue No fingerprints found on [C]"
- else if(!istype(C, /mob/living/carbon/monkey))
- if(!isnull(C:gloves))
- user << "\blue No fingerprints found on [C]"
else
user << text("\blue [C]'s Fingerprints: [md5(C:dna.uni_identity)]")
if ( !(C:blood_DNA) )
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 91e264715b0..8e6216e0417 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -68,7 +68,7 @@
user.visible_message("[user] directs [src] to [M]'s eyes.", \
"You direct [src] to [M]'s eyes.")
- if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey)) //robots and aliens are unaffected
+ if(istype(M, /mob/living/carbon/human)) //robots and aliens are unaffected
if(M.stat == DEAD || M.sdisabilities & BLIND) //mob is dead or fully blind
user << "[M] pupils does not react to the light!"
else if(XRAY in M.mutations) //mob has X-RAY vision
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 61e24b5932c..e81b0e6e9b3 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -15,7 +15,7 @@
user << "\The [src] cannot be applied to [M]!"
return 1
- if (!(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon) || istype(user, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey"))
+ if (!(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon))
user << "You don't have the dexterity to do this!"
return 1
diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm
index 19dc7b0850e..659cc938e2f 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -160,7 +160,7 @@
for(var/mob/O in viewers(M, null))
O.show_message(text("\red [] has been injected with [] by [].", M, src, user), 1)
//Foreach goto(192)
- if (!(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey)))
+ if (!(istype(M, /mob/living/carbon/human)))
user << "\red Apparently it didn't work."
return
diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm
index 44c8aaa5697..e94c806e998 100644
--- a/code/game/objects/items/weapons/storage/internal.dm
+++ b/code/game/objects/items/weapons/storage/internal.dm
@@ -26,7 +26,7 @@
//returns 1 if the master item's parent's MouseDrop() should be called, 0 otherwise. It's strange, but no other way of
//doing it without the ability to call another proc's parent, really.
/obj/item/weapon/storage/internal/proc/handle_mousedrop(mob/user as mob, obj/over_object as obj)
- if (ishuman(user) || ismonkey(user)) //so monkeys can take off their backpacks -- Urist
+ if (ishuman(user) || issmall(user)) //so monkeys can take off their backpacks -- Urist
if (istype(user.loc,/obj/mecha)) // stops inventory actions in a mech
return 0
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 07ded953aaf..cc064ca9489 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -25,7 +25,7 @@
var/use_sound = "rustle" //sound played when used. null for no sound.
/obj/item/weapon/storage/MouseDrop(obj/over_object as obj)
- if (ishuman(usr) || ismonkey(usr)) //so monkeys can take off their backpacks -- Urist
+ if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist
var/mob/M = usr
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index edc0426c5b8..df5e78ebf5f 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -59,11 +59,16 @@
unwield()
/obj/item/weapon/twohanded/attack_self(mob/user as mob)
- if( istype(user,/mob/living/carbon/monkey) )
- user << "It's too heavy for you to wield fully."
+ ..()
+
+ if(istype(user, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ if(H.species.is_small)
+ user << "It's too heavy for you to wield fully."
+ return
+ else
return
- ..()
if(wielded) //Trying to unwield it
unwield()
user << "You are now carrying the [name] with one hand."
diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm
index eb3f0a3c371..de2fef2875e 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -4,77 +4,57 @@
name = "a meat spike"
icon = 'icons/obj/kitchen.dmi'
icon_state = "spike"
- desc = "A spike for collecting meat from animals"
+ desc = "A spike for collecting meat from animals."
density = 1
anchored = 1
var/meat = 0
- var/occupied = 0
- var/meattype = 0 // 0 - Nothing, 1 - Monkey, 2 - Xeno
+ var/occupied
+ var/meat_type
+ var/victim_name = "corpse"
-/obj/structure/kitchenspike
- attack_paw(mob/user as mob)
- return src.attack_hand(usr)
-
- attackby(obj/item/weapon/grab/G as obj, mob/user as mob, params)
- if(!istype(G, /obj/item/weapon/grab))
- return
- if(istype(G.affecting, /mob/living/carbon/monkey))
- if(src.occupied == 0)
- src.icon_state = "spikebloody"
- src.occupied = 1
- src.meat = 5
- src.meattype = 1
- for(var/mob/O in viewers(src, null))
- O.show_message(text("\red [user] has forced [G.affecting] onto the spike, killing them instantly!"))
- del(G.affecting)
- del(G)
-
- else
- user << "\red The spike already has something on it, finish collecting its meat first!"
- else if(istype(G.affecting, /mob/living/carbon/alien))
- if(src.occupied == 0)
- src.icon_state = "spikebloodygreen"
- src.occupied = 1
- src.meat = 5
- src.meattype = 2
- for(var/mob/O in viewers(src, null))
- O.show_message(text("\red [user] has forced [G.affecting] onto the spike, killing them instantly!"))
- del(G.affecting)
- del(G)
- else
- user << "\red The spike already has something on it, finish collecting its meat first!"
+/obj/structure/kitchenspike/attackby(obj/item/weapon/grab/G as obj, mob/user as mob)
+ if(!istype(G, /obj/item/weapon/grab) || !G.affecting)
+ return
+ if(occupied)
+ user << "The spike already has something on it, finish collecting its meat first!"
+ else
+ if(spike(G.affecting))
+ visible_message("[user] has forced [G.affecting] onto the spike, killing them instantly!")
+ del(G.affecting)
+ del(G)
else
- user << "\red They are too big for the spike, try something smaller!"
- return
+ user << "They are too big for the spike, try something smaller!"
-// MouseDrop_T(var/atom/movable/C, mob/user)
-// if(istype(C, /obj/mob/carbon/monkey)
-// else if(istype(C, /obj/mob/carbon/alien) && !istype(C, /mob/living/carbon/alien/larva/slime))
-// else if(istype(C, /obj/livestock/spesscarp
+/obj/structure/kitchenspike/proc/spike(var/mob/living/victim)
- attack_hand(mob/user as mob)
- if(..())
- return
- if(src.occupied)
- if(src.meattype == 1)
- if(src.meat > 1)
- src.meat--
- new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey( src.loc )
- usr << "You remove some meat from the monkey."
- else if(src.meat == 1)
- src.meat--
- new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src.loc)
- usr << "You remove the last piece of meat from the monkey!"
- src.icon_state = "spike"
- src.occupied = 0
- else if(src.meattype == 2)
- if(src.meat > 1)
- src.meat--
- new /obj/item/weapon/reagent_containers/food/snacks/xenomeat( src.loc )
- usr << "You remove some meat from the alien."
- else if(src.meat == 1)
- src.meat--
- new /obj/item/weapon/reagent_containers/food/snacks/xenomeat(src.loc)
- usr << "You remove the last piece of meat from the alien!"
- src.icon_state = "spike"
- src.occupied = 0
\ No newline at end of file
+ if(!istype(victim))
+ return
+
+ if(istype(victim, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = victim
+ if(!H.species.is_small)
+ return 0
+ meat_type = H.species.meat_type
+ icon_state = "spikebloody"
+ else if(istype(victim, /mob/living/carbon/alien))
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
+ icon_state = "spikebloodygreen"
+ else
+ return 0
+
+ victim_name = victim.name
+ occupied = 1
+ meat = 5
+ return 1
+
+/obj/structure/kitchenspike/attack_hand(mob/user as mob)
+ if(..() || !occupied)
+ return
+ meat--
+ new meat_type(get_turf(src))
+ if(src.meat > 1)
+ user << "You remove some meat from \the [victim_name]."
+ else if(src.meat == 1)
+ user << "You remove the last piece of meat from \the [victim_name]!"
+ icon_state = "spike"
+ occupied = 0
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index a64e798c3ec..e610994fc5c 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -40,6 +40,11 @@ var/list/mechtoys = list(
density = 0
anchored = 1
layer = 4
+ var/list/mobs_can_pass = list(
+ /mob/living/carbon/slime,
+ /mob/living/simple_animal/mouse,
+ /mob/living/silicon/robot/drone
+ )
/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
if(istype(A) && A.checkpass(PASSGLASS))
@@ -52,10 +57,19 @@ var/list/mechtoys = list(
if(istype(A, /obj/vehicle)) //no vehicles
return 0
- if(istype(A, /mob/living)) // You Shall Not Pass!
- var/mob/living/M = A
- if(!M.lying && !istype(M, /mob/living/carbon/monkey) && !istype(M, /mob/living/carbon/slime) && !istype(M, /mob/living/simple_animal/mouse) && !istype(M, /mob/living/silicon/robot/drone)) //If your not laying down, or a small creature, no pass.
- return 0
+ var/mob/living/M = A
+ if(istype(M))
+ if(M.lying)
+ return ..()
+ for(var/mob_type in mobs_can_pass)
+ if(istype(A, mob_type))
+ return ..()
+ if(istype(A, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ if(H.species.is_small)
+ return ..()
+ return 0
+
return ..()
/obj/structure/plasticflaps/ex_act(severity)
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 329dbbefa1a..2a64766de41 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -167,9 +167,7 @@
// Only adds blood on the floor -- Skie
/turf/simulated/proc/add_blood_floor(mob/living/carbon/M as mob)
- if(istype(M, /mob/living/carbon/monkey))
- blood_splatter(src,M,1)
- else if( istype(M, /mob/living/carbon/alien ))
+ if( istype(M, /mob/living/carbon/alien ))
var/obj/effect/decal/cleanable/blood/xeno/this = new /obj/effect/decal/cleanable/blood/xeno(src)
this.blood_DNA["UNKNOWN BLOOD"] = "X*"
else if( istype(M, /mob/living/silicon/robot ))
diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm
index 2adf60e2443..fa525e22e1f 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/game/verbs/suicide.dm
@@ -101,32 +101,6 @@
death(0)
suiciding = 0
-/mob/living/carbon/monkey/verb/suicide()
- set hidden = 1
-
- if (stat == 2)
- src << "You're already dead!"
- return
-
- if (!ticker)
- src << "You can't commit suicide before the game starts!"
- return
-
- if (suiciding)
- src << "You're already committing suicide! Be patient!"
- return
-
- var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
-
- if(confirm == "Yes")
- if(!canmove || restrained())
- src << "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))"
- return
- suiciding = 1
- //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while
- viewers(src) << "\red [src] is attempting to bite \his tongue. It looks like \he's trying to commit suicide."
- adjustOxyLoss(max(175- getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
- updatehealth()
/mob/living/silicon/ai/verb/suicide()
set hidden = 1
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 2d6be2a6dbb..81086f3b3ef 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -101,7 +101,7 @@ var/global/nologevent = 0
body += "
"
//Monkey
- if(ismonkey(M))
+ if(issmall(M))
body += "Monkeyized | "
else
body += "Monkeyize | "
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 363f3d504da..e6b35ef45e2 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -436,9 +436,10 @@ var/list/admin_verbs_mentor = list(
var/mob/living/carbon/human/H = T
if (H.species)
D.affected_species = list(H.species.name)
- if(istype(T,/mob/living/carbon/monkey))
- var/mob/living/carbon/monkey/M = T
- D.affected_species = list(M.greaterform)
+ if(H.species.primitive_form)
+ D.affected_species |= H.species.primitive_form
+ if(H.species.greater_form)
+ D.affected_species |= H.species.greater_form
infect_virus2(T,D,1)
feedback_add_details("admin_verb","GD2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index ff98278ce90..738d21f0d34 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -234,7 +234,7 @@
M_job = M.job
else if(isslime(M))
M_job = "slime"
- else if(ismonkey(M))
+ else if(issmall(M))
M_job = "Monkey"
else if(isalien(M)) //aliens
if(islarva(M))
@@ -355,7 +355,7 @@
dat += "
New Player | "
else if(isobserver(M))
dat += "Ghost | "
- else if(ismonkey(M))
+ else if(issmall(M))
dat += "Monkey | "
else if(isalien(M))
dat += "Alien | "
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 93a1e32cd79..9bd31860ac4 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -306,7 +306,7 @@
if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob, 1 )
if("human") M.change_mob_type( /mob/living/carbon/human/human , null, null, delmob, 1 )
if("slime") M.change_mob_type( /mob/living/carbon/slime , null, null, delmob, 1 )
- if("monkey") M.change_mob_type( /mob/living/carbon/monkey , null, null, delmob, 1 )
+ if("monkey") M.change_mob_type( /mob/living/carbon/human/monkey , null, null, delmob, 1 )
if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob, 1 )
if("cat") M.change_mob_type( /mob/living/simple_animal/cat , null, null, delmob, 1 )
if("runtime") M.change_mob_type( /mob/living/simple_animal/cat/Runtime , null, null, delmob, 1 )
@@ -1440,44 +1440,6 @@
show_player_panel(H)
//H.regenerate_icons()
-/***************** BEFORE**************
-
- if (href_list["l_players"])
- var/dat = "Name/Real Name/Key/IP:
"
- for(var/mob/M in world)
- var/foo = ""
- if (ismob(M) && M.client)
- if(!M.client.authenticated && !M.client.authenticating)
- foo += text("\[ Authorize | ", src, M)
- else
- foo += text("\[ Authorized | ")
- if(M.start)
- if(!istype(M, /mob/living/carbon/monkey))
- foo += text("Monkeyize | ", src, M)
- else
- foo += text("Monkeyized | ")
- if(istype(M, /mob/living/silicon/ai))
- foo += text("Is an AI | ")
- else
- foo += text("Make AI | ", src, M)
- if(!(M.z in config.admin_levels))
- foo += text("Prison | ", src, M)
- foo += text("Maze | ", src, M)
- else
- foo += text("On Z = 2 | ")
- else
- foo += text("Hasn't Entered Game | ")
- foo += text("Heal/Revive | ", src, M)
-
- foo += text("Say \]", src, M)
- dat += text("N: [] R: [] (K: []) (IP: []) []
", M.name, M.real_name, (M.client ? M.client : "No client"), M.lastKnownIP, foo)
-
- usr << browse(dat, "window=players;size=900x480")
-
-*****************AFTER******************/
-
-// Now isn't that much better? IT IS NOW A PROC, i.e. kinda like a big panel like unstable
-
else if(href_list["adminplayeropts"])
var/mob/M = locate(href_list["adminplayeropts"])
show_player_panel(M)
@@ -2000,7 +1962,7 @@
where = "onfloor"
if ( where == "inhand" ) //Can only give when human or monkey
- if ( !( ishuman(usr) || ismonkey(usr) ) )
+ if ( !( ishuman(usr) || issmall(usr) ) )
usr << "Can only spawn in hand when you're a human or a monkey."
where = "onfloor"
else if ( usr.get_active_hand() )
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 1274c48e79f..5c89bfb3f8f 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -415,18 +415,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("\blue [key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.", 1)
return //all done. The ghost is auto-deleted
- //check if they were a monkey
- else if(findtext(G_found.real_name,"monkey"))
- if(alert("This character appears to have been a monkey. Would you like to respawn them as such?",,"Yes","No")=="Yes")
- var/mob/living/carbon/monkey/new_monkey = new(pick(latejoin))
- G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use
- new_monkey.key = G_found.key
- new_monkey << "You have been fully respawned. Enjoy the game."
- message_admins("\blue [key_name_admin(usr)] has respawned [new_monkey.key] as a filthy xeno.", 1)
- return //all done. The ghost is auto-deleted
-
-
- //Ok, it's not a xeno or a monkey. So, spawn a human.
var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned.
var/datum/data/record/record_found //Referenced to later to either randomize or not randomize the character.
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 2cf4ecee51e..d3d0fc747b8 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -413,13 +413,13 @@ BLIND // can't see anything
A.attack_hand(user)
return
- if ((ishuman(usr) || ismonkey(usr)) && src.loc == user) //make it harder to accidentally undress yourself
+ if ((ishuman(usr) || issmall(usr)) && src.loc == user) //make it harder to accidentally undress yourself
return
..()
/obj/item/clothing/under/MouseDrop(obj/over_object as obj)
- if (ishuman(usr) || ismonkey(usr))
+ if (ishuman(usr) || issmall(usr))
//makes sure that the clothing is equipped so that we can't drag it into our hand from miles away.
if (!(src.loc == usr))
return
diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm
index 5daabc84799..d22c1338c38 100644
--- a/code/modules/events/radiation_storm.dm
+++ b/code/modules/events/radiation_storm.dm
@@ -58,14 +58,6 @@
randmutg(H) // Applies good mutation
domutcheck(H,null,1)
-
- for(var/mob/living/carbon/monkey/M in living_mob_list)
- var/turf/T = get_turf(M)
- if(!T)
- continue
- if(!(T.z in config.station_levels))
- continue
- M.apply_effect((rand(5,25)),IRRADIATE,0)
sleep(100)
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 2ad7fc08929..feb06886004 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -570,4 +570,28 @@
else
return ..()
+/datum/language/human/monkey
+ name = "Chimpanzee"
+ desc = "Ook ook ook."
+ speech_verb = "chimpers"
+ ask_verb = "chimpers"
+ exclaim_verb = "screeches"
+ key = "6"
+
+/datum/language/skrell/monkey
+ name = "Neara"
+ desc = "Squik squik squik."
+ key = "8"
+
+/datum/language/unathi/monkey
+ name = "Stok"
+ desc = "Hiss hiss hiss."
+ key = "7"
+
+/datum/language/tajaran/monkey
+ name = "Farwa"
+ desc = "Meow meow meow."
+ key = "9"
+
+
#undef SCRAMBLE_CACHE_LEN
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 66cdd111b7e..8e7f0f71622 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -256,10 +256,11 @@
if(getBrainLoss() >= 60)
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
- if(!key && brain_op_stage != 4 && stat != DEAD)
- msg += "[t_He] [t_is] fast asleep. It doesn't look like they are waking up anytime soon.\n"
- else if(!client && brain_op_stage != 4 && stat != DEAD)
- msg += "[t_He] [t_has] suddenly fallen asleep.\n"
+ if(species.show_ssd && (!species.has_organ["brain"] || has_brain()) && stat != DEAD)
+ if(!key)
+ msg += "[t_He] [t_is] fast asleep. It doesn't look like they are waking up anytime soon.\n"
+ else if(!client)
+ msg += "[t_He] [t_has] suddenly fallen asleep.\n"
var/list/wound_flavor_text = list()
var/list/is_destroyed = list()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index de9680dccab..c60fce02d31 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -122,6 +122,18 @@
h_style = "Nucleation Crystals"
..(new_loc, "Nucleation")
+/mob/living/carbon/human/monkey/New(var/new_loc)
+ ..(new_loc, "Monkey")
+
+/mob/living/carbon/human/farwa/New(var/new_loc)
+ ..(new_loc, "Farwa")
+
+/mob/living/carbon/human/neara/New(var/new_loc)
+ ..(new_loc, "Neara")
+
+/mob/living/carbon/human/stok/New(var/new_loc)
+ ..(new_loc, "Stok")
+
/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes)
if ((!( yes ) || now_pushing))
return
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 01722c780ba..c5760170c68 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -345,10 +345,6 @@
name = "human"
var/mob/living/carbon/human/target = null
-/obj/effect/equip_e/monkey
- name = "monkey"
- var/mob/living/carbon/monkey/target = null
-
/obj/effect/equip_e/process()
return
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 0a3faac7886..ad7508c5b8d 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -124,6 +124,9 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
handle_heartattack()
+ if(!client)
+ species.handle_npc(src)
+
if(stat == DEAD)
handle_decay()
diff --git a/code/modules/mob/living/carbon/human/npcs.dm b/code/modules/mob/living/carbon/human/npcs.dm
new file mode 100644
index 00000000000..290c81723ee
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/npcs.dm
@@ -0,0 +1,13 @@
+/obj/item/clothing/under/punpun
+ name = "fancy uniform"
+ desc = "It looks like it was tailored for a monkey."
+ icon_state = "punpun"
+ item_color = "punpun"
+ species_restricted = list("Monkey")
+
+/mob/living/carbon/human/monkey/punpun/New()
+ ..()
+ spawn(1)
+ name = "Pun Pun"
+ real_name = name
+ w_uniform = new /obj/item/clothing/under/punpun(src)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm
new file mode 100644
index 00000000000..4f00eaea20a
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/monkey.dm
@@ -0,0 +1,88 @@
+/datum/species/monkey
+ name = "Monkey"
+ name_plural = "Monkeys"
+ blurb = "Ook."
+
+ icobase = 'icons/mob/human_races/monkeys/r_monkey.dmi'
+ deform = 'icons/mob/human_races/monkeys/r_monkey.dmi'
+ damage_overlays = 'icons/mob/human_races/masks/dam_monkey.dmi'
+ damage_mask = 'icons/mob/human_races/masks/dam_mask_monkey.dmi'
+ blood_mask = 'icons/mob/human_races/masks/blood_monkey.dmi'
+ language = null
+ default_language = "Chimpanzee"
+ greater_form = "Human"
+ is_small = 1
+ has_fine_manipulation = 0
+ show_ssd = 0
+ eyes = "blank_eyes"
+
+ gibbed_anim = "gibbed-m"
+ dusted_anim = "dust-m"
+ death_message = "lets out a faint chimper as it collapses and stops moving..."
+ tail = "chimptail"
+
+ unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws)
+ inherent_verbs = list(/mob/living/proc/ventcrawl)
+ hud_type = /datum/hud_data/monkey
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey
+
+ rarity_value = 0.1
+ total_health = 75
+ brute_mod = 1.5
+ burn_mod = 1.5
+
+ flags = IS_RESTRICTED
+
+/datum/species/monkey/handle_npc(var/mob/living/carbon/human/H)
+ if(H.stat != CONSCIOUS)
+ return
+ if(prob(33) && H.canmove && isturf(H.loc) && !H.pulledby) //won't move if being pulled
+ step(H, pick(cardinal))
+ if(prob(1))
+ H.emote(pick("scratch","jump","roll","tail"))
+
+/datum/species/monkey/handle_post_spawn(var/mob/living/carbon/human/H)
+ H.real_name = "[lowertext(name)] ([rand(100,999)])"
+ H.name = H.real_name
+ ..()
+
+/datum/species/monkey/tajaran
+ name = "Farwa"
+ name_plural = "Farwa"
+
+ icobase = 'icons/mob/human_races/monkeys/r_farwa.dmi'
+ deform = 'icons/mob/human_races/monkeys/r_farwa.dmi'
+
+ greater_form = "Tajaran"
+ default_language = "Farwa"
+ flesh_color = "#AFA59E"
+ base_color = "#333333"
+ tail = "farwatail"
+
+/datum/species/monkey/skrell
+ name = "Neara"
+ name_plural = "Neara"
+
+ icobase = 'icons/mob/human_races/monkeys/r_neara.dmi'
+ deform = 'icons/mob/human_races/monkeys/r_neara.dmi'
+
+ greater_form = "Skrell"
+ default_language = "Neara"
+ flesh_color = "#8CD7A3"
+ blood_color = "#1D2CBF"
+ reagent_tag = IS_SKRELL
+ tail = null
+
+/datum/species/monkey/unathi
+ name = "Stok"
+ name_plural = "Stok"
+
+ icobase = 'icons/mob/human_races/monkeys/r_stok.dmi'
+ deform = 'icons/mob/human_races/monkeys/r_stok.dmi'
+
+ tail = "stoktail"
+ greater_form = "Unathi"
+ default_language = "Stok"
+ flesh_color = "#34AF10"
+ base_color = "#066000"
+ reagent_tag = IS_UNATHI
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
new file mode 100644
index 00000000000..c7cdb5b6cd9
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -0,0 +1,457 @@
+/datum/species/human
+ name = "Human"
+ icobase = 'icons/mob/human_races/r_human.dmi'
+ deform = 'icons/mob/human_races/r_def_human.dmi'
+ primitive_form = "Monkey"
+ path = /mob/living/carbon/human/human
+ language = "Sol Common"
+ flags = HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
+ bodyflags = HAS_SKIN_TONE
+ dietflags = DIET_OMNI
+ unarmed_type = /datum/unarmed_attack/punch
+ blurb = "Humanity originated in the Sol system, and over the last five centuries has spread \
+ colonies across a wide swathe of space. They hold a wide range of forms and creeds.
\
+ While the central Sol government maintains control of its far-flung people, powerful corporate \
+ interests, rampant cyber and bio-augmentation and secretive factions make life on most human \
+ worlds tumultous at best."
+
+/datum/species/unathi
+ name = "Unathi"
+ icobase = 'icons/mob/human_races/r_lizard.dmi'
+ deform = 'icons/mob/human_races/r_def_lizard.dmi'
+ path = /mob/living/carbon/human/unathi
+ default_language = "Galactic Common"
+ language = "Sinta'unathi"
+ tail = "sogtail"
+ unarmed_type = /datum/unarmed_attack/claws
+ primitive_form = "Stok"
+ darksight = 3
+
+ blurb = "A heavily reptillian species, Unathi (or 'Sinta as they call themselves) hail from the \
+ Uuosa-Eso system, which roughly translates to 'burning mother'.
Coming from a harsh, radioactive \
+ desert planet, they mostly hold ideals of honesty, virtue, martial combat and bravery above all \
+ else, frequently even their own lives. They prefer warmer temperatures than most species and \
+ their native tongue is a heavy hissing laungage called Sinta'Unathi."
+
+ flags = HAS_LIPS | HAS_UNDERWEAR
+ bodyflags = FEET_CLAWS | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
+ dietflags = DIET_CARN
+
+ cold_level_1 = 280 //Default 260 - Lower is better
+ cold_level_2 = 220 //Default 200
+ cold_level_3 = 140 //Default 120
+
+ heat_level_1 = 380 //Default 360 - Higher is better
+ heat_level_2 = 420 //Default 400
+ heat_level_3 = 480 //Default 460
+ heat_level_3_breathe = 1100 //Default 1000
+
+ flesh_color = "#34AF10"
+
+ reagent_tag = IS_UNATHI
+ base_color = "#066000"
+
+/datum/species/unathi/handle_death(var/mob/living/carbon/human/H)
+
+ H.stop_tail_wagging(1)
+
+/datum/species/tajaran
+ name = "Tajaran"
+ icobase = 'icons/mob/human_races/r_tajaran.dmi'
+ deform = 'icons/mob/human_races/r_def_tajaran.dmi'
+ path = /mob/living/carbon/human/tajaran
+ default_language = "Galactic Common"
+ language = "Siik'tajr"
+ tail = "tajtail"
+ unarmed_type = /datum/unarmed_attack/claws
+ darksight = 8
+
+ blurb = "The Tajaran race is a species of feline-like bipeds hailing from the planet of Ahdomai in the \
+ S'randarr system. They have been brought up into the space age by the Humans and Skrell, and have been \
+ influenced heavily by their long history of Slavemaster rule. They have a structured, clan-influenced way \
+ of family and politics. They prefer colder environments, and speak a variety of languages, mostly Siik'Maas, \
+ using unique inflections their mouths form."
+
+ cold_level_1 = 240
+ cold_level_2 = 180
+ cold_level_3 = 100
+
+ heat_level_1 = 340
+ heat_level_2 = 380
+ heat_level_3 = 440
+ heat_level_3_breathe = 900
+
+ primitive_form = "Farwa"
+
+ flags = HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
+ bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
+ dietflags = DIET_OMNI
+
+ flesh_color = "#AFA59E"
+ base_color = "#333333"
+
+/datum/species/tajaran/handle_death(var/mob/living/carbon/human/H)
+
+ H.stop_tail_wagging(1)
+
+/datum/species/vulpkanin
+ name = "Vulpkanin"
+ icobase = 'icons/mob/human_races/r_vulpkanin.dmi'
+ deform = 'icons/mob/human_races/r_vulpkanin.dmi'
+ path = /mob/living/carbon/human/vulpkanin
+ default_language = "Galactic Common"
+ language = "Canilunzt"
+ tail = "vulptail"
+ unarmed_type = /datum/unarmed_attack/claws
+ darksight = 8
+
+ blurb = "Vulpkanin are a species of sharp-witted canine-pideds residing on the planet Altam just barely within the \
+ dual-star Vazzend system. Their politically de-centralized society and independent natures have led them to become a species and \
+ culture both feared and respected for their scientific breakthroughs. Discovery, loyalty, and utilitarianism dominates their lifestyles \
+ to the degree it can cause conflict with more rigorous and strict authorities. They speak a guttural language known as 'Canilunzt' \
+ which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent."
+
+ flags = HAS_LIPS | HAS_UNDERWEAR
+ bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
+ dietflags = DIET_OMNI
+
+ flesh_color = "#966464"
+ base_color = "#BE8264"
+
+/datum/species/vulpkanin/handle_death(var/mob/living/carbon/human/H)
+
+ H.stop_tail_wagging(1)
+
+/datum/species/skrell
+ name = "Skrell"
+ icobase = 'icons/mob/human_races/r_skrell.dmi'
+ deform = 'icons/mob/human_races/r_def_skrell.dmi'
+ path = /mob/living/carbon/human/skrell
+ default_language = "Galactic Common"
+ language = "Skrellian"
+ primitive_form = "Neara"
+ unarmed_type = /datum/unarmed_attack/punch
+
+ blurb = "An amphibious species, Skrell come from the star system known as Qerr'Vallis, which translates to 'Star of \
+ the royals' or 'Light of the Crown'.
Skrell are a highly advanced and logical race who live under the rule \
+ of the Qerr'Katish, a caste within their society which keeps the empire of the Skrell running smoothly. Skrell are \
+ herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \
+ the secrets of their empire to their allies."
+
+ flags = HAS_LIPS | HAS_UNDERWEAR
+ bodyflags = HAS_SKIN_COLOR
+ dietflags = DIET_HERB
+
+ flesh_color = "#8CD7A3"
+ blood_color = "#1D2CBF"
+ reagent_tag = IS_SKRELL
+
+/datum/species/vox
+ name = "Vox"
+ icobase = 'icons/mob/human_races/r_vox.dmi'
+ deform = 'icons/mob/human_races/r_def_vox.dmi'
+ path = /mob/living/carbon/human/vox
+
+ default_language = "Galactic Common"
+ language = "Vox-pidgin"
+ speech_sounds = list('sound/voice/shriek1.ogg')
+ speech_chance = 20
+
+ unarmed_type = /datum/unarmed_attack/claws //I dont think it will hurt to give vox claws too.
+
+ blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \
+ scavenging vermin who prey on isolated stations, ships or planets to keep their own ancient arkships \
+ alive. They are four to five feet tall, reptillian, beaked, tailed and quilled; human crews often \
+ refer to them as 'shitbirds' for their violent and offensive nature, as well as their horrible \
+ smell.
Most humans will never meet a Vox raider, instead learning of this insular species through \
+ dealing with their traders and merchants; those that do rarely enjoy the experience."
+
+ warning_low_pressure = 50
+ hazard_low_pressure = 0
+
+ cold_level_1 = 80
+ cold_level_2 = 50
+ cold_level_3 = 0
+
+ eyes = "vox_eyes_s"
+
+ breath_type = "nitrogen"
+ poison_type = "oxygen"
+
+ flags = NO_SCAN | IS_WHITELISTED
+ dietflags = DIET_OMNI
+
+ blood_color = "#2299FC"
+ flesh_color = "#808D11"
+
+ reagent_tag = IS_VOX
+
+ makeName(var/gender,var/mob/living/carbon/human/H=null)
+ var/sounds = rand(2,8)
+ var/i = 0
+ var/newname = ""
+
+ while(i<=sounds)
+ i++
+ newname += pick(vox_name_syllables)
+ return capitalize(newname)
+/*
+/datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H)
+
+ H.verbs += /mob/living/carbon/human/proc/leap
+ ..() */
+
+/datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H)
+
+ H.verbs += /mob/living/carbon/human/proc/gut
+ ..()
+
+/datum/species/vox/armalis
+ name = "Vox Armalis"
+ icobase = 'icons/mob/human_races/r_armalis.dmi'
+ deform = 'icons/mob/human_races/r_armalis.dmi'
+ path = /mob/living/carbon/human/voxarmalis
+ unarmed_type = /datum/unarmed_attack/claws/armalis
+
+ warning_low_pressure = 50
+ hazard_low_pressure = 0
+
+ cold_level_1 = 80
+ cold_level_2 = 50
+ cold_level_3 = 0
+
+ heat_level_1 = 2000
+ heat_level_2 = 3000
+ heat_level_3 = 4000
+ heat_level_3_breathe = 4000
+
+ brute_mod = 0.2
+ burn_mod = 0.2
+
+ eyes = "blank_eyes"
+ breath_type = "nitrogen"
+ poison_type = "oxygen"
+
+ flags = NO_SCAN | NO_BLOOD | HAS_TAIL | NO_PAIN | IS_WHITELISTED
+ dietflags = DIET_OMNI //should inherit this from vox, this is here just in case
+
+ blood_color = "#2299FC"
+ flesh_color = "#808D11"
+
+ reagent_tag = IS_VOX
+
+ tail = "armalis_tail"
+ icon_template = 'icons/mob/human_races/r_armalis.dmi'
+
+ has_organ = list(
+ "heart" = /obj/item/organ/heart,
+ "lungs" = /obj/item/organ/lungs,
+ "liver" = /obj/item/organ/liver,
+ "kidneys" = /obj/item/organ/kidneys,
+ "brain" = /obj/item/organ/brain,
+ "eyes" = /obj/item/organ/eyes,
+ "stack" = /obj/item/organ/stack/vox
+ )
+
+/datum/species/kidan
+ name = "Kidan"
+ icobase = 'icons/mob/human_races/r_kidan.dmi'
+ deform = 'icons/mob/human_races/r_def_kidan.dmi'
+ path = /mob/living/carbon/human/kidan
+ default_language = "Galactic Common"
+ language = "Chittin"
+ unarmed_type = /datum/unarmed_attack/claws
+
+ brute_mod = 0.8
+
+ flags = IS_WHITELISTED
+ bodyflags = FEET_CLAWS
+ dietflags = DIET_HERB
+
+ blood_color = "#FB9800"
+
+
+/datum/species/slime
+ name = "Slime People"
+ default_language = "Galactic Common"
+ language = "Bubblish"
+ icobase = 'icons/mob/human_races/r_slime.dmi'
+ deform = 'icons/mob/human_races/r_slime.dmi'
+ path = /mob/living/carbon/human/slime
+ unarmed_type = /datum/unarmed_attack/punch
+
+ flags = IS_WHITELISTED | NO_BREATHE | HAS_LIPS | NO_INTORGANS | NO_SCAN
+ bodyflags = HAS_SKIN_COLOR
+ bloodflags = BLOOD_SLIME
+ dietflags = DIET_CARN
+
+ //ventcrawler = 1 //ventcrawling commented out
+
+ has_organ = list(
+ "brain" = /obj/item/organ/brain/slime
+ )
+
+/datum/species/grey
+ name = "Grey"
+ icobase = 'icons/mob/human_races/r_grey.dmi'
+ deform = 'icons/mob/human_races/r_def_grey.dmi'
+ default_language = "Galactic Common"
+ //language = "Grey" // Perhaps if they ever get a hivemind
+ unarmed_type = /datum/unarmed_attack/punch
+ darksight = 5 // BOOSTED from 2
+ eyes = "grey_eyes_s"
+
+ brute_mod = 1.25 //greys are fragile
+
+ default_genes = list(REMOTE_TALK)
+
+
+ flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
+ dietflags = DIET_HERB
+
+ blood_color = "#A200FF"
+
+/datum/species/grey/handle_dna(var/mob/living/carbon/C, var/remove)
+ if(!remove)
+ C.dna.SetSEState(REMOTETALKBLOCK,1,1)
+ C.mutations |= REMOTE_TALK
+ genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED)
+ else
+ C.dna.SetSEState(REMOTETALKBLOCK,0,1)
+ C.mutations -= REMOTE_TALK
+ genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED)
+ C.update_mutations()
+ ..()
+
+/datum/species/diona
+ name = "Diona"
+ icobase = 'icons/mob/human_races/r_diona.dmi'
+ deform = 'icons/mob/human_races/r_def_plant.dmi'
+ path = /mob/living/carbon/human/diona
+ default_language = "Galactic Common"
+ language = "Rootspeak"
+ unarmed_type = /datum/unarmed_attack/diona
+ //primitive_form = "Nymph"
+ slowdown = 5
+
+ warning_low_pressure = 50
+ hazard_low_pressure = -1
+
+ cold_level_1 = 50
+ cold_level_2 = -1
+ cold_level_3 = -1
+
+ heat_level_1 = 300
+ heat_level_2 = 340
+ heat_level_3 = 400
+ heat_level_3_breathe = 700
+
+ blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \
+ species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \
+ there is no effective upper limit to the number that can fuse in gestalt, and reports exist of the Epsilon Ursae \
+ Minoris primary being ringed with a cloud of singing space-station-sized entities.
The Dionaea coexist peacefully with \
+ all known species, especially the Skrell. Their communal mind makes them slow to react, and they have difficulty understanding \
+ even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \
+ water and other radiation."
+
+ flags = NO_BREATHE | REQUIRE_LIGHT | IS_PLANT | RAD_ABSORB | NO_BLOOD | NO_PAIN
+ dietflags = 0 //Diona regenerate nutrition in light, no diet necessary
+
+ body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
+
+ blood_color = "#004400"
+ flesh_color = "#907E4A"
+
+ reagent_tag = IS_DIONA
+
+ has_organ = list(
+ "nutrient channel" = /obj/item/organ/diona/nutrients,
+ "neural strata" = /obj/item/organ/diona/strata,
+ "response node" = /obj/item/organ/diona/node,
+ "gas bladder" = /obj/item/organ/diona/bladder,
+ "polyp segment" = /obj/item/organ/diona/polyp,
+ "anchoring ligament" = /obj/item/organ/diona/ligament
+ )
+
+ has_limbs = list(
+ "chest" = list("path" = /obj/item/organ/external/diona/chest),
+ "groin" = list("path" = /obj/item/organ/external/diona/groin),
+ "head" = list("path" = /obj/item/organ/external/diona/head),
+ "l_arm" = list("path" = /obj/item/organ/external/diona/arm),
+ "r_arm" = list("path" = /obj/item/organ/external/diona/arm/right),
+ "l_leg" = list("path" = /obj/item/organ/external/diona/leg),
+ "r_leg" = list("path" = /obj/item/organ/external/diona/leg/right),
+ "l_hand" = list("path" = /obj/item/organ/external/diona/hand),
+ "r_hand" = list("path" = /obj/item/organ/external/diona/hand/right),
+ "l_foot" = list("path" = /obj/item/organ/external/diona/foot),
+ "r_foot" = list("path" = /obj/item/organ/external/diona/foot/right)
+ )
+
+/datum/species/diona/can_understand(var/mob/other)
+ var/mob/living/carbon/monkey/diona/D = other
+ if(istype(D))
+ return 1
+ return 0
+
+/datum/species/diona/handle_post_spawn(var/mob/living/carbon/human/H)
+ H.gender = NEUTER
+
+ return ..()
+
+/* //overpowered and dumb as hell; they get cloning back, though.
+/datum/species/diona/handle_death(var/mob/living/carbon/human/H)
+
+ var/mob/living/carbon/monkey/diona/S = new(get_turf(H))
+
+ if(H.mind)
+ H.mind.transfer_to(S)
+ else
+ S.key = H.key
+
+ for(var/mob/living/carbon/monkey/diona/D in H.contents)
+ if(D.client)
+ D.loc = H.loc
+ else
+ del(D)
+
+ H.visible_message("\red[H] splits apart with a wet slithering noise!") */
+
+/datum/species/machine
+ name = "Machine"
+ icobase = 'icons/mob/human_races/r_machine.dmi'
+ deform = 'icons/mob/human_races/r_machine.dmi'
+ path = /mob/living/carbon/human/machine
+ default_language = "Galactic Common"
+ language = "Trinary"
+ unarmed_type = /datum/unarmed_attack/punch
+
+ eyes = "blank_eyes"
+ brute_mod = 1.5
+ burn_mod = 1.5
+
+ cold_level_1 = 50
+ cold_level_2 = -1
+ cold_level_3 = -1
+
+ heat_level_1 = 500 //gives them about 25 seconds in space before taking damage
+ heat_level_2 = 540
+ heat_level_3 = 600
+ heat_level_3_breathe = 600
+
+ synth_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
+
+ flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | IS_SYNTHETIC | NO_INTORGANS
+ dietflags = 0 //IPCs can't eat, so no diet
+ blood_color = "#1F181F"
+ flesh_color = "#AAAAAA"
+
+/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
+ H.emote("deathgasp")
+ for(var/organ_name in H.organs_by_name)
+ if (organ_name == "head") // do the head last as that's when the user will be transfered to the posibrain
+ continue
+ var/obj/item/organ/external/O = H.organs_by_name[organ_name]
+ if(O && (O.body_part != UPPER_TORSO) && (O.body_part != LOWER_TORSO)) // We're making them fall apart, not gibbing them!
+ O.droplimb(1)
+ var/obj/item/organ/external/O = H.organs_by_name["head"]
+ if(O) O.droplimb(1)
diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm
index af066547923..3b2f9d0edf7 100644
--- a/code/modules/mob/living/carbon/species.dm
+++ b/code/modules/mob/living/carbon/species.dm
@@ -7,10 +7,17 @@
var/path // Species path
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.
+
+ // Damage overlay and masks.
+ var/damage_overlays = 'icons/mob/human_races/masks/dam_human.dmi'
+ var/damage_mask = 'icons/mob/human_races/masks/dam_mask_human.dmi'
+ var/blood_mask = 'icons/mob/human_races/masks/blood_human.dmi'
+
var/eyes = "eyes_s" // Icon for eyes.
var/blurb = "A completely nondescript species." // A brief lore summary for use in the chargen screen.
- var/primitive // Lesser form, if any (ie. monkey for humans)
+ var/primitive_form // Lesser form, if any (ie. monkey for humans)
+ var/greater_form // Greater form, if any, ie. human for monkeys.
var/tail // Name of tail image in species effects icon file.
var/unarmed //For empty hand harm-intent attack
var/unarmed_type = /datum/unarmed_attack
@@ -60,12 +67,15 @@
var/blood_color = "#A10808" //Red.
var/flesh_color = "#FFC896" //Pink.
var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs
+ var/meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human
var/base_color //Used when setting species.
//Used in icon caching.
var/race_key = 0
var/icon/icon_template
+ var/is_small
+ var/show_ssd = 1
// Language/culture vars.
var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers.
@@ -314,467 +324,9 @@
/datum/species/proc/can_understand(var/mob/other)
return
-/datum/species/human
- name = "Human"
- icobase = 'icons/mob/human_races/r_human.dmi'
- deform = 'icons/mob/human_races/r_def_human.dmi'
- primitive = /mob/living/carbon/monkey
- path = /mob/living/carbon/human/human
- language = "Sol Common"
- flags = HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
- bodyflags = HAS_SKIN_TONE
- dietflags = DIET_OMNI
- unarmed_type = /datum/unarmed_attack/punch
- blurb = "Humanity originated in the Sol system, and over the last five centuries has spread \
- colonies across a wide swathe of space. They hold a wide range of forms and creeds.
\
- While the central Sol government maintains control of its far-flung people, powerful corporate \
- interests, rampant cyber and bio-augmentation and secretive factions make life on most human \
- worlds tumultous at best."
-
-/datum/species/unathi
- name = "Unathi"
- icobase = 'icons/mob/human_races/r_lizard.dmi'
- deform = 'icons/mob/human_races/r_def_lizard.dmi'
- path = /mob/living/carbon/human/unathi
- default_language = "Galactic Common"
- language = "Sinta'unathi"
- tail = "sogtail"
- unarmed_type = /datum/unarmed_attack/claws
- primitive = /mob/living/carbon/monkey/unathi
- darksight = 3
-
- blurb = "A heavily reptillian species, Unathi (or 'Sinta as they call themselves) hail from the \
- Uuosa-Eso system, which roughly translates to 'burning mother'.
Coming from a harsh, radioactive \
- desert planet, they mostly hold ideals of honesty, virtue, martial combat and bravery above all \
- else, frequently even their own lives. They prefer warmer temperatures than most species and \
- their native tongue is a heavy hissing laungage called Sinta'Unathi."
-
- flags = HAS_LIPS | HAS_UNDERWEAR
- bodyflags = FEET_CLAWS | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
- dietflags = DIET_CARN
-
- cold_level_1 = 280 //Default 260 - Lower is better
- cold_level_2 = 220 //Default 200
- cold_level_3 = 140 //Default 120
-
- heat_level_1 = 380 //Default 360 - Higher is better
- heat_level_2 = 420 //Default 400
- heat_level_3 = 480 //Default 460
- heat_level_3_breathe = 1100 //Default 1000
-
- flesh_color = "#34AF10"
-
- reagent_tag = IS_UNATHI
- base_color = "#066000"
-
-/datum/species/unathi/handle_death(var/mob/living/carbon/human/H)
-
- H.stop_tail_wagging(1)
-
-/datum/species/tajaran
- name = "Tajaran"
- icobase = 'icons/mob/human_races/r_tajaran.dmi'
- deform = 'icons/mob/human_races/r_def_tajaran.dmi'
- path = /mob/living/carbon/human/tajaran
- default_language = "Galactic Common"
- language = "Siik'tajr"
- tail = "tajtail"
- unarmed_type = /datum/unarmed_attack/claws
- darksight = 8
-
- blurb = "The Tajaran race is a species of feline-like bipeds hailing from the planet of Ahdomai in the \
- S'randarr system. They have been brought up into the space age by the Humans and Skrell, and have been \
- influenced heavily by their long history of Slavemaster rule. They have a structured, clan-influenced way \
- of family and politics. They prefer colder environments, and speak a variety of languages, mostly Siik'Maas, \
- using unique inflections their mouths form."
-
- cold_level_1 = 240
- cold_level_2 = 180
- cold_level_3 = 100
-
- heat_level_1 = 340
- heat_level_2 = 380
- heat_level_3 = 440
- heat_level_3_breathe = 900
-
- primitive = /mob/living/carbon/monkey/tajara
-
- flags = HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
- bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
- dietflags = DIET_OMNI
-
- flesh_color = "#AFA59E"
- base_color = "#333333"
-
-/datum/species/tajaran/handle_death(var/mob/living/carbon/human/H)
-
- H.stop_tail_wagging(1)
-
-/datum/species/vulpkanin
- name = "Vulpkanin"
- icobase = 'icons/mob/human_races/r_vulpkanin.dmi'
- deform = 'icons/mob/human_races/r_vulpkanin.dmi'
- path = /mob/living/carbon/human/vulpkanin
- default_language = "Galactic Common"
- language = "Canilunzt"
- primitive = /mob/living/carbon/monkey/vulpkanin
- tail = "vulptail"
- unarmed_type = /datum/unarmed_attack/claws
- darksight = 8
-
- blurb = "Vulpkanin are a species of sharp-witted canine-pideds residing on the planet Altam just barely within the \
- dual-star Vazzend system. Their politically de-centralized society and independent natures have led them to become a species and \
- culture both feared and respected for their scientific breakthroughs. Discovery, loyalty, and utilitarianism dominates their lifestyles \
- to the degree it can cause conflict with more rigorous and strict authorities. They speak a guttural language known as 'Canilunzt' \
- which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent."
-
- flags = HAS_LIPS | HAS_UNDERWEAR
- bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
- dietflags = DIET_OMNI
-
- flesh_color = "#966464"
- base_color = "#BE8264"
-
-/datum/species/vulpkanin/handle_death(var/mob/living/carbon/human/H)
-
- H.stop_tail_wagging(1)
-
-/datum/species/skrell
- name = "Skrell"
- icobase = 'icons/mob/human_races/r_skrell.dmi'
- deform = 'icons/mob/human_races/r_def_skrell.dmi'
- path = /mob/living/carbon/human/skrell
- default_language = "Galactic Common"
- language = "Skrellian"
- primitive = /mob/living/carbon/monkey/skrell
- unarmed_type = /datum/unarmed_attack/punch
-
- blurb = "An amphibious species, Skrell come from the star system known as Qerr'Vallis, which translates to 'Star of \
- the royals' or 'Light of the Crown'.
Skrell are a highly advanced and logical race who live under the rule \
- of the Qerr'Katish, a caste within their society which keeps the empire of the Skrell running smoothly. Skrell are \
- herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \
- the secrets of their empire to their allies."
-
- flags = HAS_LIPS | HAS_UNDERWEAR
- bodyflags = HAS_SKIN_COLOR
- dietflags = DIET_HERB
-
- flesh_color = "#8CD7A3"
- blood_color = "#1D2CBF"
- reagent_tag = IS_SKRELL
-
-/datum/species/vox
- name = "Vox"
- icobase = 'icons/mob/human_races/r_vox.dmi'
- deform = 'icons/mob/human_races/r_def_vox.dmi'
- path = /mob/living/carbon/human/vox
-
- default_language = "Galactic Common"
- language = "Vox-pidgin"
- speech_sounds = list('sound/voice/shriek1.ogg')
- speech_chance = 20
-
- unarmed_type = /datum/unarmed_attack/claws //I dont think it will hurt to give vox claws too.
-
- blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \
- scavenging vermin who prey on isolated stations, ships or planets to keep their own ancient arkships \
- alive. They are four to five feet tall, reptillian, beaked, tailed and quilled; human crews often \
- refer to them as 'shitbirds' for their violent and offensive nature, as well as their horrible \
- smell.
Most humans will never meet a Vox raider, instead learning of this insular species through \
- dealing with their traders and merchants; those that do rarely enjoy the experience."
-
- warning_low_pressure = 50
- hazard_low_pressure = 0
-
- cold_level_1 = 80
- cold_level_2 = 50
- cold_level_3 = 0
-
- eyes = "vox_eyes_s"
-
- breath_type = "nitrogen"
- poison_type = "oxygen"
-
- flags = NO_SCAN | IS_WHITELISTED
- dietflags = DIET_OMNI
-
- blood_color = "#2299FC"
- flesh_color = "#808D11"
-
- reagent_tag = IS_VOX
-
- makeName(var/gender,var/mob/living/carbon/human/H=null)
- var/sounds = rand(2,8)
- var/i = 0
- var/newname = ""
-
- while(i<=sounds)
- i++
- newname += pick(vox_name_syllables)
- return capitalize(newname)
-/*
-/datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H)
-
- H.verbs += /mob/living/carbon/human/proc/leap
- ..() */
-
-/datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H)
-
- H.verbs += /mob/living/carbon/human/proc/gut
- ..()
-
-/datum/species/vox/armalis
- name = "Vox Armalis"
- icobase = 'icons/mob/human_races/r_armalis.dmi'
- deform = 'icons/mob/human_races/r_armalis.dmi'
- path = /mob/living/carbon/human/voxarmalis
- unarmed_type = /datum/unarmed_attack/claws/armalis
-
- warning_low_pressure = 50
- hazard_low_pressure = 0
-
- cold_level_1 = 80
- cold_level_2 = 50
- cold_level_3 = 0
-
- heat_level_1 = 2000
- heat_level_2 = 3000
- heat_level_3 = 4000
- heat_level_3_breathe = 4000
-
- brute_mod = 0.2
- burn_mod = 0.2
-
- eyes = "blank_eyes"
- breath_type = "nitrogen"
- poison_type = "oxygen"
-
- flags = NO_SCAN | NO_BLOOD | HAS_TAIL | NO_PAIN | IS_WHITELISTED
- dietflags = DIET_OMNI //should inherit this from vox, this is here just in case
-
- blood_color = "#2299FC"
- flesh_color = "#808D11"
-
- reagent_tag = IS_VOX
-
- tail = "armalis_tail"
- icon_template = 'icons/mob/human_races/r_armalis.dmi'
-
- has_organ = list(
- "heart" = /obj/item/organ/heart,
- "lungs" = /obj/item/organ/lungs,
- "liver" = /obj/item/organ/liver,
- "kidneys" = /obj/item/organ/kidneys,
- "brain" = /obj/item/organ/brain,
- "eyes" = /obj/item/organ/eyes,
- "stack" = /obj/item/organ/stack/vox
- )
-
-/datum/species/kidan
- name = "Kidan"
- icobase = 'icons/mob/human_races/r_kidan.dmi'
- deform = 'icons/mob/human_races/r_def_kidan.dmi'
- path = /mob/living/carbon/human/kidan
- default_language = "Galactic Common"
- language = "Chittin"
- unarmed_type = /datum/unarmed_attack/claws
-
- brute_mod = 0.8
-
- flags = IS_WHITELISTED
- bodyflags = FEET_CLAWS
- dietflags = DIET_HERB
-
- blood_color = "#FB9800"
-
-
-/datum/species/slime
- name = "Slime People"
- default_language = "Galactic Common"
- language = "Bubblish"
- icobase = 'icons/mob/human_races/r_slime.dmi'
- deform = 'icons/mob/human_races/r_slime.dmi'
- path = /mob/living/carbon/human/slime
- primitive = /mob/living/carbon/slime
- unarmed_type = /datum/unarmed_attack/punch
-
- flags = IS_WHITELISTED | NO_BREATHE | HAS_LIPS | NO_INTORGANS | NO_SCAN
- bodyflags = HAS_SKIN_COLOR
- bloodflags = BLOOD_SLIME
- dietflags = DIET_CARN
-
- //ventcrawler = 1 //ventcrawling commented out
-
- has_organ = list(
- "brain" = /obj/item/organ/brain/slime
- )
-
-/datum/species/grey
- name = "Grey"
- icobase = 'icons/mob/human_races/r_grey.dmi'
- deform = 'icons/mob/human_races/r_def_grey.dmi'
- default_language = "Galactic Common"
- //language = "Grey" // Perhaps if they ever get a hivemind
- unarmed_type = /datum/unarmed_attack/punch
- darksight = 5 // BOOSTED from 2
- eyes = "grey_eyes_s"
-
- brute_mod = 1.25 //greys are fragile
-
- default_genes = list(REMOTE_TALK)
-
- primitive = /mob/living/carbon/monkey // TODO
-
- flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
- dietflags = DIET_HERB
-
- blood_color = "#A200FF"
-
-/datum/species/grey/handle_dna(var/mob/living/carbon/C, var/remove)
- if(!remove)
- C.dna.SetSEState(REMOTETALKBLOCK,1,1)
- C.mutations |= REMOTE_TALK
- genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED)
- else
- C.dna.SetSEState(REMOTETALKBLOCK,0,1)
- C.mutations -= REMOTE_TALK
- genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED)
- C.update_mutations()
- ..()
-
-/datum/species/diona
- name = "Diona"
- icobase = 'icons/mob/human_races/r_diona.dmi'
- deform = 'icons/mob/human_races/r_def_plant.dmi'
- path = /mob/living/carbon/human/diona
- default_language = "Galactic Common"
- language = "Rootspeak"
- unarmed_type = /datum/unarmed_attack/diona
- primitive = /mob/living/carbon/monkey/diona
- slowdown = 5
-
- warning_low_pressure = 50
- hazard_low_pressure = -1
-
- cold_level_1 = 50
- cold_level_2 = -1
- cold_level_3 = -1
-
- heat_level_1 = 300
- heat_level_2 = 340
- heat_level_3 = 400
- heat_level_3_breathe = 700
-
- blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \
- species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \
- there is no effective upper limit to the number that can fuse in gestalt, and reports exist of the Epsilon Ursae \
- Minoris primary being ringed with a cloud of singing space-station-sized entities.
The Dionaea coexist peacefully with \
- all known species, especially the Skrell. Their communal mind makes them slow to react, and they have difficulty understanding \
- even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \
- water and other radiation."
-
- flags = NO_BREATHE | REQUIRE_LIGHT | IS_PLANT | RAD_ABSORB | NO_BLOOD | NO_PAIN
- dietflags = 0 //Diona regenerate nutrition in light, no diet necessary
-
- body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
-
- blood_color = "#004400"
- flesh_color = "#907E4A"
-
- reagent_tag = IS_DIONA
-
- has_organ = list(
- "nutrient channel" = /obj/item/organ/diona/nutrients,
- "neural strata" = /obj/item/organ/diona/strata,
- "response node" = /obj/item/organ/diona/node,
- "gas bladder" = /obj/item/organ/diona/bladder,
- "polyp segment" = /obj/item/organ/diona/polyp,
- "anchoring ligament" = /obj/item/organ/diona/ligament
- )
-
- has_limbs = list(
- "chest" = list("path" = /obj/item/organ/external/diona/chest),
- "groin" = list("path" = /obj/item/organ/external/diona/groin),
- "head" = list("path" = /obj/item/organ/external/diona/head),
- "l_arm" = list("path" = /obj/item/organ/external/diona/arm),
- "r_arm" = list("path" = /obj/item/organ/external/diona/arm/right),
- "l_leg" = list("path" = /obj/item/organ/external/diona/leg),
- "r_leg" = list("path" = /obj/item/organ/external/diona/leg/right),
- "l_hand" = list("path" = /obj/item/organ/external/diona/hand),
- "r_hand" = list("path" = /obj/item/organ/external/diona/hand/right),
- "l_foot" = list("path" = /obj/item/organ/external/diona/foot),
- "r_foot" = list("path" = /obj/item/organ/external/diona/foot/right)
- )
-
-/datum/species/diona/can_understand(var/mob/other)
- var/mob/living/carbon/monkey/diona/D = other
- if(istype(D))
- return 1
- return 0
-
-/datum/species/diona/handle_post_spawn(var/mob/living/carbon/human/H)
- H.gender = NEUTER
-
- return ..()
-
-/* //overpowered and dumb as hell; they get cloning back, though.
-/datum/species/diona/handle_death(var/mob/living/carbon/human/H)
-
- var/mob/living/carbon/monkey/diona/S = new(get_turf(H))
-
- if(H.mind)
- H.mind.transfer_to(S)
- else
- S.key = H.key
-
- for(var/mob/living/carbon/monkey/diona/D in H.contents)
- if(D.client)
- D.loc = H.loc
- else
- del(D)
-
- H.visible_message("\red[H] splits apart with a wet slithering noise!") */
-
-/datum/species/machine
- name = "Machine"
- icobase = 'icons/mob/human_races/r_machine.dmi'
- deform = 'icons/mob/human_races/r_machine.dmi'
- path = /mob/living/carbon/human/machine
- default_language = "Galactic Common"
- language = "Trinary"
- unarmed_type = /datum/unarmed_attack/punch
-
- eyes = "blank_eyes"
- brute_mod = 1.5
- burn_mod = 1.5
-
- cold_level_1 = 50
- cold_level_2 = -1
- cold_level_3 = -1
-
- heat_level_1 = 500 //gives them about 25 seconds in space before taking damage
- heat_level_2 = 540
- heat_level_3 = 600
- heat_level_3_breathe = 600
-
- synth_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
-
- flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | IS_SYNTHETIC | NO_INTORGANS
- dietflags = 0 //IPCs can't eat, so no diet
- blood_color = "#1F181F"
- flesh_color = "#AAAAAA"
-
-/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
- H.emote("deathgasp")
- for(var/organ_name in H.organs_by_name)
- if (organ_name == "head") // do the head last as that's when the user will be transfered to the posibrain
- continue
- var/obj/item/organ/external/O = H.organs_by_name[organ_name]
- if(O && (O.body_part != UPPER_TORSO) && (O.body_part != LOWER_TORSO)) // We're making them fall apart, not gibbing them!
- O.droplimb(1)
- var/obj/item/organ/external/O = H.organs_by_name["head"]
- if(O) O.droplimb(1)
-
+// Called in life() when the mob has no client.
+/datum/species/proc/handle_npc(var/mob/living/carbon/human/H)
+ return
//Species unarmed attacks