diff --git a/baystation12.dme b/baystation12.dme
index 5363f933422..8b53f3e7d60 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -245,7 +245,6 @@
#include "code\game\dna\dna_modifier.dm"
#include "code\game\dna\genes\disabilities.dm"
#include "code\game\dna\genes\gene.dm"
-#include "code\game\dna\genes\monkey.dm"
#include "code\game\dna\genes\powers.dm"
#include "code\game\gamemodes\events.dm"
#include "code\game\gamemodes\game_mode.dm"
@@ -1055,6 +1054,7 @@
#include "code\modules\mob\dead\observer\say.dm"
#include "code\modules\mob\language\generic.dm"
#include "code\modules\mob\language\language.dm"
+#include "code\modules\mob\language\monkey.dm"
#include "code\modules\mob\language\outsider.dm"
#include "code\modules\mob\language\station.dm"
#include "code\modules\mob\language\synthetic.dm"
@@ -1120,6 +1120,7 @@
#include "code\modules\mob\living\carbon\human\login.dm"
#include "code\modules\mob\living\carbon\human\logout.dm"
#include "code\modules\mob\living\carbon\human\MedicalSideEffects.dm"
+#include "code\modules\mob\living\carbon\human\npcs.dm"
#include "code\modules\mob\living\carbon\human\say.dm"
#include "code\modules\mob\living\carbon\human\unarmed_attack.dm"
#include "code\modules\mob\living\carbon\human\update_icons.dm"
@@ -1130,6 +1131,7 @@
#include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm"
#include "code\modules\mob\living\carbon\human\species\outsider\vox.dm"
#include "code\modules\mob\living\carbon\human\species\station\golem.dm"
+#include "code\modules\mob\living\carbon\human\species\station\monkey.dm"
#include "code\modules\mob\living\carbon\human\species\station\slime.dm"
#include "code\modules\mob\living\carbon\human\species\station\station.dm"
#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_embryo.dm"
@@ -1149,14 +1151,6 @@
#include "code\modules\mob\living\carbon\metroid\say.dm"
#include "code\modules\mob\living\carbon\metroid\subtypes.dm"
#include "code\modules\mob\living\carbon\metroid\update_icons.dm"
-#include "code\modules\mob\living\carbon\monkey\death.dm"
-#include "code\modules\mob\living\carbon\monkey\emote.dm"
-#include "code\modules\mob\living\carbon\monkey\examine.dm"
-#include "code\modules\mob\living\carbon\monkey\inventory.dm"
-#include "code\modules\mob\living\carbon\monkey\life.dm"
-#include "code\modules\mob\living\carbon\monkey\login.dm"
-#include "code\modules\mob\living\carbon\monkey\monkey.dm"
-#include "code\modules\mob\living\carbon\monkey\update_icons.dm"
#include "code\modules\mob\living\silicon\death.dm"
#include "code\modules\mob\living\silicon\laws.dm"
#include "code\modules\mob\living\silicon\login.dm"
diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm
index 2066a6f9bf8..cbaeb3bf9c9 100644
--- a/code/ATMOSPHERICS/components/unary/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm
@@ -423,18 +423,3 @@
initial_loc.air_vent_names -= id_tag
..()
return
-
-/*
- Alt-click to vent crawl - Monkeys, aliens, slimes and mice.
- This is a little buggy but somehow that just seems to plague ventcrawl.
- I am sorry, I don't know why.
-*/
-// Commenting this out for now, it's not critical, stated to be buggy, and seems like
-// a really clumsy way of doing this. ~Z
-/*/obj/machinery/atmospherics/unary/vent_pump/AltClick(var/mob/living/ML)
- if(istype(ML))
- var/list/ventcrawl_verbs = list(/mob/living/carbon/monkey/verb/ventcrawl, /mob/living/carbon/alien/verb/ventcrawl, /mob/living/carbon/slime/verb/ventcrawl,/mob/living/simple_animal/mouse/verb/ventcrawl)
- if(length(ML.verbs & ventcrawl_verbs)) // alien queens have this removed, an istype would be complicated
- ML.handle_ventcrawl(src)
- return
- ..()*/
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index c00bb17b1d2..16f61d9fecf 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -460,8 +460,6 @@ 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)
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index e9c5429dd2a..c41f9594b34 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -235,7 +235,7 @@ datum/hud/New(mob/owner)
if(ishuman(mymob))
human_hud(ui_style, ui_color, ui_alpha, mymob) // 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)
@@ -259,11 +259,11 @@ datum/hud/New(mob/owner)
if(!hud_used)
usr << "\red This mob type does not use a HUD."
return
-
+
if(!ishuman(src))
usr << "\red Inventory hiding is currently only supported for human mobs, sorry."
return
-
+
if(!client) return
if(client.view != world.view)
return
@@ -325,7 +325,7 @@ datum/hud/New(mob/owner)
return
if(client.view != world.view)
return
-
+
if(hud_used.hud_shown)
hud_used.hud_shown = 0
if(src.hud_used.adding)
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 496553558df..e8c868bb729 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -52,45 +52,6 @@
/mob/living/RestrainedClickOn(var/atom/A)
return
-/*
- Monkeys
-*/
-
-
-/mob/living/carbon/monkey/UnarmedAttack(var/atom/A, var/proximity)
-
- if(!..())
- return
-
- A.attack_hand(src)
-
-/*
- 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(a_intent != "harm" || !ismob(A)) return
- if(istype(wear_mask, /obj/item/clothing/mask/muzzle))
- 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
- if(ismonkey(ML))
- for(var/datum/disease/D in viruses)
- if(istype(D, /datum/disease/jungle_fever))
- ML.contract_disease(D,1,0)
- else
- for(var/mob/O in viewers(ML, null))
- O.show_message("\red [src] has attempted to bite [ML]!", 1)
-
/*
Aliens
*/
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 21881e281cd..be44f560560 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -320,6 +320,7 @@ datum/mind
H.implant_loyalty(H, override = TRUE)
log_admin("[key_name_admin(usr)] has loyalty implanted [current].")
else
+ /*
else if (href_list["monkey"])
var/mob/living/L = current
if (L.monkeyizing)
@@ -369,7 +370,7 @@ datum/mind
src = mobfinder.loc:mind
del(mobfinder)
current.radiation -= 50
-
+ */
else if (href_list["silicon"])
BITSET(current.hud_updateflag, SPECIALROLE_HUD)
switch(href_list["silicon"])
@@ -540,10 +541,6 @@ datum/mind
..()
if(!mind.assigned_role) mind.assigned_role = "Assistant" //defualt
-//MONKEY
-/mob/living/carbon/monkey/mind_initialize()
- ..()
-
//slime
/mob/living/carbon/slime/mind_initialize()
..()
@@ -596,10 +593,3 @@ datum/mind
..()
mind.assigned_role = "Juggernaut"
mind.special_role = "Cultist"
-
-/mob/living/simple_animal/vox/armalis/mind_initialize()
- ..()
- mind.assigned_role = "Armalis"
- mind.special_role = "Vox Raider"
-
-
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 53086de2522..65f797658d2 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -102,7 +102,7 @@
if (usr.stat != 0)
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/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 066604834e1..bad1e095e87 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -326,64 +326,24 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
src << "We cannot perform this ability at the present time!"
return
- var/mob/living/carbon/C = src
+ var/mob/living/carbon/human/H = src
+
+ if(!istype(H) || !H.species.primitive_form)
+ src << "We cannot perform this ability in this form!"
+ return
+
changeling.chem_charges--
- C.remove_changeling_powers()
- C.visible_message("[C] transforms!")
+ H.remove_changeling_powers()
+ H.visible_message("[H] transforms!")
changeling.geneticdamage = 30
- C << "Our genes cry out!"
-
- //TODO replace with monkeyize proc
+ 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.monkeyizing = 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(48)
- 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.drop_from_inventory(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 = "hurt"
- for(var/obj/item/weapon/implant/I in implants)
- I.loc = O
- I.implanted = O
-
- C.mind.transfer_to(O)
-
- O.make_changeling(1)
- O.verbs += /mob/proc/changeling_lesser_transform
- O.changeling_update_languages(changeling.absorbed_languages)
-
+ H.monkeyize()
feedback_add_details("changeling_powers","LF")
- del(C)
return 1
-
//Transform into a human
/mob/proc/changeling_lesser_transform()
set category = "Changeling"
@@ -842,7 +802,7 @@ var/list/datum/dna/hivemind_bank = list()
var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_transformation_sting)
if(!T) return 0
- if((HUSK in T.mutations) || (!ishuman(T) && !ismonkey(T)))
+ if((HUSK in T.mutations) || (!ishuman(T) && !issmall(T)))
src << "Our sting appears ineffective against its DNA."
return 0
T.visible_message("[T] transforms!")
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index b4b5ae4d51a..8008549d363 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -705,27 +705,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 (cult)
- if(M.mind == cult.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."
- cult.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))
- cult.grant_runeword(usr)
- M.gib()
/////////////////////////////////////////SIXTEENTH RUNE
diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm
index 26e38476b73..feed6092e27 100644
--- a/code/game/gamemodes/events.dm
+++ b/code/game/gamemodes/events.dm
@@ -233,13 +233,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(isNotStationLevel(T.z))
- 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/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index b6b638c578f..995648e4feb 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -649,9 +649,6 @@ datum/objective/capture
continue
captured_amount += worth
- for(var/mob/living/carbon/monkey/M in A)//Monkeys are almost worthless, you failure.
- captured_amount+=0.1
-
for(var/mob/living/carbon/alien/larva/M in A)//Larva are important for research.
if(M.stat==2)
captured_amount+=0.5
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 95bdf512e16..6d2b5e33d67 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -101,11 +101,6 @@
//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))
- var/mob/living/carbon/george = M
- //they can only hold things :(
- if(src.check_access(george.get_active_hand()))
- return 1
return 0
/obj/item/proc/GetAccess()
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 91c96fcfc99..20c16dcb9c6 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -408,7 +408,7 @@
set category = "Object"
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)
diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index 8fd27904ce8..a8df2abaad3 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -214,7 +214,7 @@
if("cashbag")
new/obj/item/weapon/storage/bag/cash(loc)
if("monkey")
- new/mob/living/carbon/monkey(loc)
+ new/mob/living/carbon/human/monkey(loc)
processing = 0
menustat = "complete"
update_icon()
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index c6c5b922b97..fcece506c37 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -175,7 +175,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/occupant = null // Person waiting to be despawned.
diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm
index 52c1bdc380f..74e7de99346 100644
--- a/code/game/machinery/kitchen/gibber.dm
+++ b/code/game/machinery/kitchen/gibber.dm
@@ -194,10 +194,9 @@
if(critter.meat_type)
slab_type = critter.meat_type
else if(istype(src.occupant,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = occupant
slab_name = src.occupant.real_name
- slab_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human
- else if(istype(src.occupant, /mob/living/carbon/monkey))
- slab_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey
+ slab_type = H.species.meat_type
// Small mobs don't give as much nutrition.
if(src.occupant.small)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 101e6995079..8836cb90f72 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -215,8 +215,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)) )
+ 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 a5f7bf0be0c..3e08aad5856 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -488,7 +488,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(isxenomorph(L) || isalien(L)) // Xenos are dangerous
return check_anomalies ? TURRET_PRIORITY_TARGET : TURRET_NOT_TARGET
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index 82a80822e64..6dd5586fd81 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -77,7 +77,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 de356849917..e8bf9348f6a 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 8879eeb2b79..b52c5930f9e 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -417,35 +417,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)
set category = "Object"
@@ -507,14 +478,6 @@
user << "\red You're going to need to remove the eye covering 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 the eye covering first."
- return
-
if(!M.has_eyes())
user << "\red You cannot locate any eyes on [M]!"
return
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 2825045fb2d..cef5307ace5 100755
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -1218,9 +1218,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(2)
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 0f6d0abb102..fb3edec8732 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -75,7 +75,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 5a071ae8180..27e3eea6f7f 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -16,8 +16,7 @@
return 1
if ( ! (istype(user, /mob/living/carbon/human) || \
- istype(user, /mob/living/silicon) || \
- istype(user, /mob/living/carbon/monkey)) )
+ istype(user, /mob/living/silicon)) )
user << "\red 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 651cc2e27f1..dfd221650b7 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -151,7 +151,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/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 5ed83d086b3..42249d14358 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -67,20 +67,6 @@
O.process()
return
- if (ismonkey(target))
- var/mob/living/carbon/monkey/M = target
- var/obj/effect/equip_e/monkey/O = new /obj/effect/equip_e/monkey( )
- O.source = user
- O.target = M
- O.item = user.get_active_hand()
- O.s_loc = user.loc
- O.t_loc = M.loc
- O.place = "handcuff"
- M.requests += O
- spawn( 0 )
- O.process()
- return
-
var/last_chew = 0
/mob/living/carbon/human/RestrainedClickOn(var/atom/A)
if (A != src) return ..()
diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm
index 082002a5b9a..5dda9b89c25 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
@@ -37,12 +37,12 @@
if (!( istype(over_object, /obj/screen) ))
return 1
-
+
//makes sure master_item is equipped before putting it in hand, so that we can't drag it into our hand from miles away.
//there's got to be a better way of doing this...
- if (!(master_item.loc == user) || (master_item.loc && master_item.loc.loc == user))
+ if (!(master_item.loc == user) || (master_item.loc && master_item.loc.loc == user))
return 0
-
+
if (!( user.restrained() ) && !( user.stat ))
switch(over_object.name)
if("r_hand")
@@ -70,12 +70,12 @@
H.put_in_hands(master_item)
H.r_store = null
return 0
-
+
src.add_fingerprint(user)
if (master_item.loc == user)
src.open(user)
return 0
-
+
for(var/mob/M in range(1, master_item.loc))
if (M.s_active == src)
src.close(M)
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 912ea4651b5..f24ff6bb2ca 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -28,7 +28,7 @@
if(!canremove)
return
- 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
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 2ccd78d3616..8a1e35ca98c 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -63,12 +63,17 @@
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."
- return
..()
+ 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 f480cdd9779..de2fef2875e 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -4,75 +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
-
- attackby(obj/item/weapon/grab/G as obj, mob/user as mob)
- 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
+ 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 72107e66490..d32173c2677 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -49,6 +49,11 @@ var/list/mechtoys = list(
anchored = 1
layer = 4
explosion_resistance = 5
+ 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))
@@ -61,10 +66,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 0aabdae3d01..9546bf9ba1b 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -118,9 +118,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 ab3c8dcc804..afc576ed4f9 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/game/verbs/suicide.dm
@@ -110,33 +110,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 bbee0157d69..78524320a71 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -92,7 +92,7 @@ var/global/floorIsLava = 0
body += "
"
//Monkey
- if(ismonkey(M))
+ if(issmall(M))
body += "Monkeyized | "
else
body += "Monkeyize | "
@@ -953,25 +953,6 @@ var/global/floorIsLava = 0
return 0
-/*
-/datum/admins/proc/get_sab_desc(var/target)
- switch(target)
- if(1)
- return "Destroy at least 70% of the phoron canisters on the station"
- if(2)
- return "Destroy the AI"
- if(3)
- var/count = 0
- for(var/mob/living/carbon/monkey/Monkey in world)
- if(Monkey.z in station_levels)
- count++
- return "Kill all [count] of the monkeys on the station"
- if(4)
- return "Cut power to at least 80% of the station"
- else
- return "Error: Invalid sabotage target: [target]"
-*/
-
/datum/admins/proc/spawn_fruit()
set category = "Debug"
set desc = "Spawn the product of a seed."
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 5fb0d5f2314..8176ca8418b 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -602,9 +602,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 234f702a177..828667aa132 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -231,7 +231,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))
M_job = "Alien"
@@ -342,7 +342,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 b40d441ef21..164cae69605 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -266,7 +266,7 @@
if("nymph") M.change_mob_type( /mob/living/carbon/alien/diona , null, null, delmob )
if("human") M.change_mob_type( /mob/living/carbon/human , null, null, delmob, href_list["species"])
if("slime") M.change_mob_type( /mob/living/carbon/slime , null, null, delmob )
- if("monkey") M.change_mob_type( /mob/living/carbon/monkey , null, null, delmob )
+ if("monkey") M.change_mob_type( /mob/living/carbon/human/monkey , null, null, delmob )
if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob )
if("cat") M.change_mob_type( /mob/living/simple_animal/cat , null, null, delmob )
if("runtime") M.change_mob_type( /mob/living/simple_animal/cat/fluff/Runtime , null, null, delmob )
@@ -1183,44 +1183,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(isNotAdminLevel(M.z))
- foo += text("Prison | ", src, M)
- foo += text("Maze | ", src, M)
- else
- foo += text("On Z = [M.z] | ")
- 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)
@@ -1647,7 +1609,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 07d80092192..4ea4ad998bf 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -368,19 +368,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
usr << "There is no active key like that in the game or the person is not currently a ghost."
return
- if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something
-
- //check if they were a monkey
- 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 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 673189ff79b..2cd1450a97b 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -453,13 +453,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 87720ca63d8..12ec1334786 100644
--- a/code/modules/events/radiation_storm.dm
+++ b/code/modules/events/radiation_storm.dm
@@ -49,8 +49,6 @@
else
randmutg(H) // Applies good mutation
domutcheck(H,null,MUTCHK_FORCED)
- else if(istype(C,/mob/living/carbon/monkey))
- C.apply_effect((rand(5,25)),IRRADIATE,0)
/datum/event/radiation_storm/end()
revoke_maint_all_access()
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index 79d0eba9f1c..5e7fbe438d4 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -83,21 +83,19 @@
/obj/item/weapon/holder/monkey
name = "monkey"
desc = "It's a monkey. Ook."
- icon_state = "cat"
- icon = 'icons/mob/monkey.dmi'
- icon_state = "monkey1"
+ icon_state = "monkey"
/obj/item/weapon/holder/monkey/farwa
name = "farwa"
desc = "It's a farwa."
- icon_state = "tajkey1"
+ icon_state = "farwa"
/obj/item/weapon/holder/monkey/stok
name = "stok"
desc = "It's a stok. stok."
- icon_state = "stokkey1"
+ icon_state = "stok"
/obj/item/weapon/holder/monkey/neaera
name = "neaera"
desc = "It's a neaera."
- icon_state = "skrellkey1"
+ icon_state = "neara"
diff --git a/code/modules/mob/language/monkey.dm b/code/modules/mob/language/monkey.dm
new file mode 100644
index 00000000000..f40a276bbcd
--- /dev/null
+++ b/code/modules/mob/language/monkey.dm
@@ -0,0 +1,22 @@
+/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"
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 3630d609a34..73f8fc90eeb 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -242,7 +242,7 @@
if(getBrainLoss() >= 60)
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
- if((!species.has_organ["brain"] || has_brain()) && stat != DEAD)
+ 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)
diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm
index 051ef214f41..49f1bd4eee8 100644
--- a/code/modules/mob/living/carbon/human/human_species.dm
+++ b/code/modules/mob/living/carbon/human/human_species.dm
@@ -1,7 +1,3 @@
-// These may have some say.dm bugs regarding understanding common,
-// might be worth adapting the bugs into a feature and using these
-// subtypes as a basis for non-common-speaking alien foreigners. ~ Z
-
/mob/living/carbon/human/dummy
real_name = "Test Dummy"
status_flags = GODMODE|CANPUSH
@@ -31,4 +27,16 @@
/mob/living/carbon/human/machine/New(var/new_loc)
h_style = "blue IPC screen"
- ..(new_loc, "Machine")
\ No newline at end of file
+ ..(new_loc, "Machine")
+
+/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")
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 44b212694eb..d1f8b21f057 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -351,10 +351,6 @@ This saves us from having to call add_fingerprint() any time something is put in
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 29a1d067cb7..b660654f76c 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -100,6 +100,9 @@
handle_heartbeat()
+ if(!client)
+ species.handle_npc(src)
+
handle_stasis_bag()
if(life_tick > 5 && timeofdeath && (timeofdeath < 5 || world.time - timeofdeath > 6000)) //We are long dead, or we're junk mobs spawned like the clowns on the clown shuttle
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/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 1162c84236f..90ff22cab0b 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -12,6 +12,12 @@
// Icon/appearance vars.
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/prone_icon // If set, draws this from icobase when mob is prone.
var/eyes = "eyes_s" // Icon for eyes.
var/blood_color = "#A10808" // Red.
@@ -20,6 +26,8 @@
var/tail // Name of tail image in species effects icon file.
var/race_key = 0 // Used for mob icon cache string.
var/icon/icon_template // Used for mob icon generation for non-32x32 species.
+ 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.
@@ -40,6 +48,7 @@
var/vision_flags = 0 // Same flags as glasses.
// Death vars.
+ var/meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human
var/gibber_type = /obj/effect/gibspawner/human
var/remains_type = /obj/effect/decal/remains/xeno
var/gibbed_anim = "gibbed-h"
@@ -91,7 +100,8 @@
var/darksight = 2 // Native darksight distance.
var/flags = 0 // Various specific features.
var/slowdown = 0 // Passive movement speed malus (or boost, if negative)
- 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/gluttonous // Can eat some mobs. 1 for monkeys, 2 for people.
var/rarity_value = 1 // Relative rarity/collector value for this species.
// Determines the organs that the species spawns with and
@@ -251,3 +261,6 @@
return 0
+// Called in life() when the mob has no client.
+/datum/species/proc/handle_npc(var/mob/living/carbon/human/H)
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/species_hud.dm b/code/modules/mob/living/carbon/human/species/species_hud.dm
index b7b05f48c9f..2bb26ca3da5 100644
--- a/code/modules/mob/living/carbon/human/species/species_hud.dm
+++ b/code/modules/mob/living/carbon/human/species/species_hud.dm
@@ -65,4 +65,10 @@
"storage1" = list("loc" = ui_storage1, "slot" = slot_l_store, "state" = "pocket"),
"storage2" = list("loc" = ui_storage2, "slot" = slot_r_store, "state" = "pocket"),
"belt" = list("loc" = ui_belt, "slot" = slot_belt, "state" = "belt")
+ )
+
+/datum/hud_data/monkey
+ gear = list(
+ "mask" = list("loc" = ui_shoes, "slot" = slot_wear_mask, "state" = "equip", "toggle" = 1, "dir" = NORTH),
+ "back" = list("loc" = ui_sstore1, "slot" = slot_back, "state" = "back", "dir" = NORTH),
)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm
new file mode 100644
index 00000000000..4f00eaea20a
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/station/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/slime.dm b/code/modules/mob/living/carbon/human/species/station/slime.dm
index d573558143e..83af39876a6 100644
--- a/code/modules/mob/living/carbon/human/species/station/slime.dm
+++ b/code/modules/mob/living/carbon/human/species/station/slime.dm
@@ -1,6 +1,7 @@
/datum/species/slime
name = "Slime"
name_plural = "slimes"
+ is_small = 1
icobase = 'icons/mob/human_races/r_slime.dmi'
deform = 'icons/mob/human_races/r_slime.dmi'
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index bc46cf9c45c..8cf07fc8d58 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -2,7 +2,7 @@
name = "Human"
name_plural = "Humans"
language = "Sol Common"
- primitive = /mob/living/carbon/monkey
+ primitive_form = "Monkey"
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite)
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.
\
@@ -20,7 +20,7 @@
language = "Sinta'unathi"
tail = "sogtail"
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
- primitive = /mob/living/carbon/monkey/unathi
+ primitive_form = "Stok"
darksight = 3
gluttonous = 1
@@ -85,7 +85,7 @@
heat_level_2 = 380 //Default 400
heat_level_3 = 800 //Default 1000
- primitive = /mob/living/carbon/monkey/tajara
+ primitive_form = "Farwa"
flags = CAN_JOIN | IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
@@ -107,7 +107,7 @@
deform = 'icons/mob/human_races/r_def_skrell.dmi'
eyes = "skrell_eyes_s"
language = "Skrellian"
- primitive = /mob/living/carbon/monkey/skrell
+ primitive_form = "Neara"
unarmed_types = list(/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 \
@@ -130,7 +130,7 @@
deform = 'icons/mob/human_races/r_def_plant.dmi'
language = "Rootspeak"
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/diona)
- primitive = /mob/living/carbon/alien/diona
+ //primitive_form = "Nymph"
slowdown = 7
rarity_value = 3
hud_type = /datum/hud_data/diona
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 15ad0b6bfd8..dadebe8c577 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -175,15 +175,6 @@ Please contact me on #coderbus IRC. ~Carn x
src.transform = M
var/global/list/damage_icon_parts = list()
-proc/get_damage_icon_part(damage_state, body_part)
- if(damage_icon_parts["[damage_state]/[body_part]"] == null)
- var/icon/DI = new /icon('icons/mob/dam_human.dmi', damage_state) // the damage icon for whole human
- // TODO: Convert dam_human.dmi to greyscale and blend in species.blood_colour here.
- DI.Blend(new /icon('icons/mob/dam_mask.dmi', body_part), ICON_MULTIPLY) // mask with this organ's pixels
- damage_icon_parts["[damage_state]/[body_part]"] = DI
- return DI
- else
- return damage_icon_parts["[damage_state]/[body_part]"]
//DAMAGE OVERLAYS
//constructs damage icon for each organ from mask * damage field and saves it in our overlays_ lists
@@ -202,7 +193,7 @@ proc/get_damage_icon_part(damage_state, body_part)
previous_damage_appearance = damage_appearance
- var/icon/standing = new /icon('icons/mob/dam_human.dmi', "00")
+ var/icon/standing = new /icon(species.damage_overlays, "00")
var/image/standing_image = new /image("icon" = standing)
@@ -211,8 +202,15 @@ proc/get_damage_icon_part(damage_state, body_part)
if(!(O.status & ORGAN_DESTROYED))
O.update_icon()
if(O.damage_state == "00") continue
-
- var/icon/DI = get_damage_icon_part(O.damage_state, O.icon_name)
+ var/icon/DI
+ var/cache_index = "[O.damage_state]/[O.icon_name]/[species.blood_color]/[species.name]"
+ if(damage_icon_parts[cache_index] == null)
+ DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human
+ DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
+ DI.Blend(species.blood_color, ICON_MULTIPLY)
+ damage_icon_parts[cache_index] = DI
+ else
+ DI = damage_icon_parts[cache_index]
standing_image.overlays += DI
@@ -336,7 +334,7 @@ proc/get_damage_icon_part(damage_state, body_part)
base_icon.MapColors(rgb(tone[1],0,0),rgb(0,tone[2],0),rgb(0,0,tone[3]))
//Handle husk overlay.
- if(husk)
+ if(husk && ("overlay_husk" in icon_states(race_icon)))
var/icon/mask = new(base_icon)
var/icon/husk_over = new(race_icon,"overlay_husk")
mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0)
@@ -534,7 +532,7 @@ proc/get_damage_icon_part(damage_state, body_part)
standing.icon = 'icons/mob/uniform.dmi'
if(w_uniform.blood_DNA)
- var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "uniformblood")
+ var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "uniformblood")
bloodsies.color = w_uniform.blood_color
standing.overlays += bloodsies
@@ -583,14 +581,14 @@ proc/get_damage_icon_part(damage_state, body_part)
standing = image("icon" = 'icons/mob/hands.dmi', "icon_state" = "[t_state]")
if(gloves.blood_DNA)
- var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "bloodyhands")
+ var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "bloodyhands")
bloodsies.color = gloves.blood_color
standing.overlays += bloodsies
gloves.screen_loc = ui_gloves
overlays_standing[GLOVES_LAYER] = standing
else
if(blood_DNA)
- var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "bloodyhands")
+ var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "bloodyhands")
bloodsies.color = hand_blood_color
overlays_standing[GLOVES_LAYER] = bloodsies
else
@@ -659,13 +657,13 @@ proc/get_damage_icon_part(damage_state, body_part)
standing = image("icon" = 'icons/mob/feet.dmi', "icon_state" = "[shoes.icon_state]")
if(shoes.blood_DNA)
- var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "shoeblood")
+ var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "shoeblood")
bloodsies.color = shoes.blood_color
standing.overlays += bloodsies
overlays_standing[SHOES_LAYER] = standing
else
if(feet_blood_DNA)
- var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "shoeblood")
+ var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "shoeblood")
bloodsies.color = feet_blood_color
overlays_standing[SHOES_LAYER] = bloodsies
else
@@ -698,7 +696,7 @@ proc/get_damage_icon_part(damage_state, body_part)
standing = image("icon" = 'icons/mob/head.dmi', "icon_state" = "[head.icon_state]")
if(head.blood_DNA)
- var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "helmetblood")
+ var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "helmetblood")
bloodsies.color = head.blood_color
standing.overlays += bloodsies
@@ -760,7 +758,7 @@ proc/get_damage_icon_part(damage_state, body_part)
if(wear_suit.blood_DNA)
var/obj/item/clothing/suit/S = wear_suit
- var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "[S.blood_overlay_type]blood")
+ var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "[S.blood_overlay_type]blood")
bloodsies.color = wear_suit.blood_color
standing.overlays += bloodsies
@@ -796,7 +794,7 @@ proc/get_damage_icon_part(damage_state, body_part)
standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]")
if( !istype(wear_mask, /obj/item/clothing/mask/smokable/cigarette) && wear_mask.blood_DNA )
- var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "maskblood")
+ var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "maskblood")
bloodsies.color = wear_mask.blood_color
standing.overlays += bloodsies
overlays_standing[FACEMASK_LAYER] = standing
diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm
index 22b61291ef3..ce7bdad6f63 100644
--- a/code/modules/mob/living/carbon/metroid/life.dm
+++ b/code/modules/mob/living/carbon/metroid/life.dm
@@ -248,7 +248,7 @@
Target = C
break
- if(isalien(C) || ismonkey(C) || isanimal(C))
+ if(isalien(C) || issmall(C) || isanimal(C))
Target = C
break
diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm
deleted file mode 100644
index 6d0c48c804c..00000000000
--- a/code/modules/mob/living/carbon/monkey/death.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-/mob/living/carbon/monkey/gib()
- ..(null,1)
-
-/mob/living/carbon/monkey/dust()
- ..("dust-m")
-
-/mob/living/carbon/monkey/death(gibbed)
- ..(gibbed,"lets out a faint chimper as it collapses and stops moving...")
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/monkey/emote.dm b/code/modules/mob/living/carbon/monkey/emote.dm
deleted file mode 100644
index 92493b6d386..00000000000
--- a/code/modules/mob/living/carbon/monkey/emote.dm
+++ /dev/null
@@ -1,132 +0,0 @@
-/mob/living/carbon/monkey/emote(var/act,var/m_type=1,var/message = null)
-
- var/param = null
- if (findtext(act, "-", 1, null))
- var/t1 = findtext(act, "-", 1, null)
- param = copytext(act, t1 + 1, length(act) + 1)
- act = copytext(act, 1, t1)
-
- if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
- act = copytext(act,1,length(act))
-
- var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle)
-
- switch(act)
- if ("me")
- if(silent)
- return
- if (src.client)
- if (client.prefs.muted & MUTE_IC)
- src << "\red You cannot send IC messages (muted)."
- return
- if (src.client.handle_spam_prevention(message,MUTE_IC))
- return
- if (stat)
- return
- if(!(message))
- return
- return custom_emote(m_type, message)
-
-
- if ("custom")
- return custom_emote(m_type, message)
-
- if("sign")
- if (!src.restrained())
- message = text("The monkey signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null))
- m_type = 1
- if("scratch")
- if (!src.restrained())
- message = "The [src.name] scratches."
- m_type = 1
- if("whimper")
- if (!muzzled)
- message = "The [src.name] whimpers."
- m_type = 2
- if("roar")
- if (!muzzled)
- message = "The [src.name] roars."
- m_type = 2
- if("tail")
- message = "The [src.name] waves his tail."
- m_type = 1
- if("gasp")
- message = "The [src.name] gasps."
- m_type = 2
- if("shiver")
- message = "The [src.name] shivers."
- m_type = 2
- if("drool")
- message = "The [src.name] drools."
- m_type = 1
- if("paw")
- if (!src.restrained())
- message = "The [src.name] flails his paw."
- m_type = 1
- if("scretch")
- if (!muzzled)
- message = "The [src.name] scretches."
- m_type = 2
- if("choke")
- message = "The [src.name] chokes."
- m_type = 2
- if("moan")
- message = "The [src.name] moans!"
- m_type = 2
- if("nod")
- message = "The [src.name] nods his head."
- m_type = 1
- if("sit")
- message = "The [src.name] sits down."
- m_type = 1
- if("sway")
- message = "The [src.name] sways around dizzily."
- m_type = 1
- if("sulk")
- message = "The [src.name] sulks down sadly."
- m_type = 1
- if("twitch")
- message = "The [src.name] twitches violently."
- m_type = 1
- if("dance")
- if (!src.restrained())
- message = "The [src.name] dances around happily."
- m_type = 1
- if("roll")
- if (!src.restrained())
- message = "The [src.name] rolls."
- m_type = 1
- if("shake")
- message = "The [src.name] shakes his head."
- m_type = 1
- if("gnarl")
- if (!muzzled)
- message = "The [src.name] gnarls and shows his teeth.."
- m_type = 2
- if("jump")
- message = "The [src.name] jumps!"
- m_type = 1
- if("collapse")
- Paralyse(2)
- message = text("[] collapses!", src)
- m_type = 2
- if("deathgasp")
- message = "The [src.name] lets out a faint chimper as it collapses and stops moving..."
- m_type = 1
- if("help")
- text += "choke, collapse, dance, deathgasp, drool, gasp, shiver, gnarl, jump, paw, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper"
- src << text
- else
- src << text("Invalid Emote: []", act)
- if ((message && src.stat == 0))
- if(src.client)
- log_emote("[name]/[key] : [message]")
- if (m_type & 1)
- for(var/mob/O in viewers(src, null))
- O.show_message(message, m_type)
- //Foreach goto(703)
- else
- for(var/mob/O in hearers(src, null))
- O.show_message(message, m_type)
- //Foreach goto(746)
- return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/monkey/examine.dm b/code/modules/mob/living/carbon/monkey/examine.dm
deleted file mode 100644
index 93857878418..00000000000
--- a/code/modules/mob/living/carbon/monkey/examine.dm
+++ /dev/null
@@ -1,39 +0,0 @@
-/mob/living/carbon/monkey/examine(mob/user)
- ..(user)
-
- var/msg = ""
- if (src.handcuffed)
- msg += "It is \icon[src.handcuffed] handcuffed!\n"
- if (src.wear_mask)
- msg += "It has \icon[src.wear_mask] \a [src.wear_mask] on its head.\n"
- if (src.l_hand)
- msg += "It has \icon[src.l_hand] \a [src.l_hand] in its left hand.\n"
- if (src.r_hand)
- msg += "It has \icon[src.r_hand] \a [src.r_hand] in its right hand.\n"
- if (src.back)
- msg += "It has \icon[src.back] \a [src.back] on its back.\n"
- if (src.stat == DEAD)
- msg += "It is limp and unresponsive, with no signs of life.\n"
- else
- msg += ""
- if (src.getBruteLoss())
- if (src.getBruteLoss() < 30)
- msg += "It has minor bruising.\n"
- else
- msg += "It has severe bruising!\n"
- if (src.getFireLoss())
- if (src.getFireLoss() < 30)
- msg += "It has minor burns.\n"
- else
- msg += "It has severe burns!\n"
- if (src.stat == UNCONSCIOUS)
- msg += "It isn't responding to anything around it; it seems to be asleep.\n"
- msg += ""
-
- if (src.digitalcamo)
- msg += "It is repulsively uncanny!\n"
-
- msg += "*---------*"
-
- user << msg
- return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/monkey/inventory.dm b/code/modules/mob/living/carbon/monkey/inventory.dm
deleted file mode 100644
index adeb4f903a8..00000000000
--- a/code/modules/mob/living/carbon/monkey/inventory.dm
+++ /dev/null
@@ -1,238 +0,0 @@
-/obj/effect/equip_e/monkey/process()
- if (item)
- item.add_fingerprint(source)
- if (!( item ))
- switch(place)
- if("head")
- if (!( target.wear_mask ))
- del(src)
- return
- if("l_hand")
- if (!( target.l_hand ))
- del(src)
- return
- if("r_hand")
- if (!( target.r_hand ))
- del(src)
- return
- if("back")
- if (!( target.back ))
- del(src)
- return
- if("handcuff")
- if (!( target.handcuffed ))
- del(src)
- return
- if("internal")
- if ((!( (istype(target.wear_mask, /obj/item/clothing/mask) && istype(target.back, /obj/item/weapon/tank) && !( target.internal )) ) && !( target.internal )))
- del(src)
- return
-
- if (item)
- if(isrobot(source) && place != "handcuff")
- var/list/L = list( "syringe", "pill", "drink", "dnainjector", "fuel")
- if(!(L.Find(place)))
- del(src)
- return
- for(var/mob/O in viewers(target, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\red [] is trying to put a [] on []", source, item, target), 1)
- else
- var/message = null
- switch(place)
- if("mask")
- if(istype(target.wear_mask, /obj/item/clothing)&&!target.wear_mask:canremove)
- message = text("\red [] fails to take off \a [] from []'s body!", source, target.wear_mask, target)
- else
- message = text("\red [] is trying to take off \a [] from []'s head!", source, target.wear_mask, target)
- if("l_hand")
- message = text("\red [] is trying to take off a [] from []'s left hand!", source, target.l_hand, target)
- if("r_hand")
- message = text("\red [] is trying to take off a [] from []'s right hand!", source, target.r_hand, target)
- if("back")
- message = text("\red [] is trying to take off a [] from []'s back!", source, target.back, target)
- if("handcuff")
- message = text("\red [] is trying to unhandcuff []!", source, target)
- if("internal")
- if (target.internal)
- message = text("\red [] is trying to remove []'s internals", source, target)
- else
- message = text("\red [] is trying to set on []'s internals.", source, target)
- if("pockets")
- message = text("\red [] is trying to empty []'s pockets",source, target)
- else
- for(var/mob/M in viewers(target, null))
- M.show_message(message, 1)
- spawn( 30 )
- done()
- return
- return
-
-/obj/effect/equip_e/monkey/done()
- if(!source || !target) return
- if(source.loc != s_loc) return
- if(target.loc != t_loc) return
- if(LinkBlocked(s_loc,t_loc)) return
- if(item && source.get_active_hand() != item) return
- if ((source.restrained() || source.stat)) return
- switch(place)
- if("mask")
- if (target.wear_mask)
- if(istype(target.wear_mask, /obj/item/clothing)&& !target.wear_mask:canremove)
- return
- var/obj/item/W = target.wear_mask
- target.u_equip(W)
- if (target.client)
- target.client.screen -= W
- if (W)
- W.loc = target.loc
- W.dropped(target)
- W.layer = initial(W.layer)
- W.add_fingerprint(source)
- else
- if (istype(item, /obj/item/clothing/mask))
- source.drop_item()
- loc = target
- item.layer = 20
- target.wear_mask = item
- item.loc = target
- if("l_hand")
- if (target.l_hand)
- var/obj/item/W = target.l_hand
- target.u_equip(W)
- if (target.client)
- target.client.screen -= W
- if (W)
- W.loc = target.loc
- W.layer = initial(W.layer)
- W.dropped(target)
- W.add_fingerprint(source)
- else
- if (istype(item, /obj/item))
- source.drop_item()
- loc = target
- item.layer = 20
- target.l_hand = item
- item.loc = target
- item.dropped(source)
- item.equipped(target,target.l_hand)
- if("r_hand")
- if (target.r_hand)
- var/obj/item/W = target.r_hand
- target.u_equip(W)
- if (target.client)
- target.client.screen -= W
- if (W)
- W.loc = target.loc
- W.layer = initial(W.layer)
- W.dropped(target)
- W.add_fingerprint(source)
- else
- if (istype(item, /obj/item))
- source.drop_item()
- loc = target
- item.layer = 20
- target.r_hand = item
- item.loc = target
- item.dropped(source)
- item.equipped(target,target.r_hand)
- if("back")
- if (target.back)
- var/obj/item/W = target.back
- target.u_equip(W)
- if (target.client)
- target.client.screen -= W
- if (W)
- W.loc = target.loc
- W.dropped(target)
- W.layer = initial(W.layer)
- W.add_fingerprint(source)
- else
- if ((istype(item, /obj/item) && item.slot_flags & SLOT_BACK ))
- source.drop_item()
- loc = target
- item.layer = 20
- target.back = item
- item.loc = target
- if("handcuff")
- if (target.handcuffed)
- var/obj/item/W = target.handcuffed
- target.u_equip(W)
- if (target.client)
- target.client.screen -= W
- if (W)
- W.loc = target.loc
- W.dropped(target)
- W.layer = initial(W.layer)
- W.add_fingerprint(source)
- else
- if (istype(item, /obj/item/weapon/handcuffs))
- source.drop_item()
- target.handcuffed = item
- item.loc = target
- if("internal")
- if (target.internal)
- target.internal.add_fingerprint(source)
- target.internal = null
- else
- if (target.internal)
- target.internal = null
- if (!( istype(target.wear_mask, /obj/item/clothing/mask) ))
- return
- else
- if (istype(target.back, /obj/item/weapon/tank))
- target.internal = target.back
- target.internal.add_fingerprint(source)
- for(var/mob/M in viewers(target, 1))
- if ((M.client && !( M.blinded )))
- M.show_message(text("[] is now running on internals.", target), 1)
- else
- source.regenerate_icons()
- target.regenerate_icons()
- del(src)
- return
-
-
-
-//This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible()
-//set redraw_mob to 0 if you don't wish the hud to be updated - if you're doing it manually in your own proc.
-/mob/living/carbon/monkey/equip_to_slot(obj/item/W as obj, slot, redraw_mob = 1)
- if(!slot) return
- if(!istype(W)) return
-
- if(W == get_active_hand())
- u_equip(W)
-
- switch(slot)
- if(slot_back)
- src.back = W
- W.equipped(src, slot)
- update_inv_back(redraw_mob)
- if(slot_wear_mask)
- src.wear_mask = W
- W.equipped(src, slot)
- update_inv_wear_mask(redraw_mob)
- if(slot_handcuffed)
- src.handcuffed = W
- update_inv_handcuffed(redraw_mob)
- if(slot_legcuffed)
- src.legcuffed = W
- W.equipped(src, slot)
- update_inv_legcuffed(redraw_mob)
- if(slot_l_hand)
- src.l_hand = W
- W.equipped(src, slot)
- update_inv_l_hand(redraw_mob)
- if(slot_r_hand)
- src.r_hand = W
- W.equipped(src, slot)
- update_inv_r_hand(redraw_mob)
- if(slot_in_backpack)
- W.loc = src.back
- else
- usr << "\red You are trying to eqip this item to an unsupported inventory slot. How the heck did you manage that? Stop it..."
- return
-
- W.layer = 20
-
- return
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
deleted file mode 100644
index 22a5c7f2fbc..00000000000
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ /dev/null
@@ -1,511 +0,0 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
-
-/mob/living/carbon/monkey
- var/oxygen_alert = 0
- var/phoron_alert = 0
- var/fire_alert = 0
- var/pressure_alert = 0
-
- var/temperature_alert = 0
-
-
-/mob/living/carbon/monkey/Life()
- set invisibility = 0
- set background = 1
- if (monkeyizing) return
- if (update_muts)
- update_muts=0
- domutcheck(src,null,MUTCHK_FORCED)
- ..()
-
- var/datum/gas_mixture/environment // Added to prevent null location errors-- TLE
- if(loc)
- environment = loc.return_air()
-
- if (stat != DEAD)
- //First, resolve location and get a breath
- if(air_master.current_cycle%4==2)
- //Only try to take a breath every 4 seconds, unless suffocating
- breathe()
-
- //Updates the number of stored chemicals for powers
- handle_changeling()
-
- //Mutations and radiation
- handle_mutations_and_radiation()
-
- //Chemicals in the body
- handle_chemicals_in_body()
-
- //Disabilities
- handle_disabilities()
-
- //Apparently, the person who wrote this code designed it so that
- //blinded get reset each cycle and then get activated later in the
- //code. Very ugly. I dont care. Moving this stuff here so its easy
- //to find it.
- blinded = null
-
- //Handle temperature/pressure differences between body and environment
- if(environment) // More error checking -- TLE
- handle_environment(environment)
-
- //Check if we're on fire
- handle_fire()
-
- //Status updates, death etc.
- handle_regular_status_updates()
- update_canmove()
-
- if(client)
- handle_regular_hud_updates()
-
- // Grabbing
- for(var/obj/item/weapon/grab/G in src)
- G.process()
-
- if(!client && stat == CONSCIOUS)
-
- if(prob(33) && canmove && isturf(loc) && !pulledby) //won't move if being pulled
-
- step(src, pick(cardinal))
-
- if(prob(1))
- emote(pick("scratch","jump","roll","tail"))
- updatehealth()
-
-/mob/living/carbon/monkey
-
- proc/handle_disabilities()
-
- if (disabilities & EPILEPSY)
- if ((prob(1) && paralysis < 10))
- src << "\red You have a seizure!"
- Paralyse(10)
- if (disabilities & COUGHING)
- if ((prob(5) && paralysis <= 1))
- drop_item()
- spawn( 0 )
- emote("cough")
- return
- if (disabilities & TOURETTES)
- if ((prob(10) && paralysis <= 1))
- Stun(10)
- spawn( 0 )
- emote("twitch")
- return
- if (disabilities & NERVOUS)
- if (prob(10))
- stuttering = max(10, stuttering)
-
- proc/handle_mutations_and_radiation()
-
- if(getFireLoss())
- if((COLD_RESISTANCE in mutations) || prob(50))
- switch(getFireLoss())
- if(1 to 50)
- adjustFireLoss(-1)
- if(51 to 100)
- adjustFireLoss(-5)
-
- if ((HULK in mutations) && health <= 25)
- mutations.Remove(HULK)
- src << "\red You suddenly feel very weak."
- Weaken(3)
- emote("collapse")
-
- if (radiation)
-
- if (radiation > 100)
- radiation = 100
- Weaken(10)
- if(!lying)
- src << "\red You feel weak."
- emote("collapse")
-
- switch(radiation)
- if(1 to 49)
- radiation--
- if(prob(25))
- adjustToxLoss(1)
-
- if(50 to 74)
- radiation -= 2
- adjustToxLoss(1)
- if(prob(5))
- radiation -= 5
- Weaken(3)
- if(!lying)
- src << "\red You feel weak."
- emote("collapse")
-
- if(75 to 100)
- radiation -= 3
- adjustToxLoss(3)
- if(prob(1))
- src << "\red You mutate!"
- randmutb(src)
- domutcheck(src,null)
- emote("gasp")
-
- handle_breath(datum/gas_mixture/breath)
- if(status_flags & GODMODE)
- return
-
- if(!breath || (breath.total_moles == 0))
- adjustOxyLoss(7)
-
- oxygen_alert = max(oxygen_alert, 1)
-
- return 0
-
- var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa
- //var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now)
- var/safe_co2_max = 10 // Yes it's an arbitrary value who cares?
- var/safe_phoron_max = 0.5
- var/SA_para_min = 0.5
- var/SA_sleep_min = 5
- var/oxygen_used = 0
- var/breath_pressure = (breath.total_moles * R_IDEAL_GAS_EQUATION * breath.temperature) / BREATH_VOLUME
-
- //Partial pressure of the O2 in our breath
- var/O2_pp = (breath.gas["oxygen"] / breath.total_moles) * breath_pressure
- // Same, but for the phoron
- var/Toxins_pp = (breath.gas["phoron"] / breath.total_moles) * breath_pressure
- // And CO2, lets say a PP of more than 10 will be bad (It's a little less really, but eh, being passed out all round aint no fun)
- var/CO2_pp = (breath.gas["carbon_dioxide"] / breath.total_moles) * breath_pressure
-
- if(O2_pp < safe_oxygen_min) // Too little oxygen
- if(prob(20))
- spawn(0) emote("gasp")
- if (O2_pp == 0)
- O2_pp = 0.01
- var/ratio = safe_oxygen_min/O2_pp
- adjustOxyLoss(min(5*ratio, 7)) // Don't fuck them up too fast (space only does 7 after all!)
- oxygen_used = breath.gas["oxygen"] * ratio / 6
- oxygen_alert = max(oxygen_alert, 1)
- /*else if (O2_pp > safe_oxygen_max) // Too much oxygen (commented this out for now, I'll deal with pressure damage elsewhere I suppose)
- spawn(0) emote("cough")
- var/ratio = O2_pp/safe_oxygen_max
- oxyloss += 5*ratio
- oxygen_used = breath.oxygen*ratio/6
- oxygen_alert = max(oxygen_alert, 1)*/
- else // We're in safe limits
- adjustOxyLoss(-5)
- oxygen_used = breath.gas["oxygen"] / 6
- oxygen_alert = 0
-
- breath.adjust_gas("oxygen", -oxygen_used)
- breath.adjust_gas("carbon_dioxide", oxygen_used)
-
- if(CO2_pp > safe_co2_max)
- if(!co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so.
- co2overloadtime = world.time
- else if(world.time - co2overloadtime > 120)
- Paralyse(3)
- adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business
- if(world.time - co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good!
- adjustOxyLoss(8)
- if(prob(20)) // Lets give them some chance to know somethings not right though I guess.
- spawn(0) emote("cough")
-
- else
- co2overloadtime = 0
-
- if(Toxins_pp > safe_phoron_max) // Too much phoron
- var/ratio = (breath.gas["phoron"] / safe_phoron_max) * 10
- //adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second
- if(reagents)
- reagents.add_reagent("toxin", Clamp(ratio, MIN_TOXIN_DAMAGE, MAX_TOXIN_DAMAGE))
- phoron_alert = max(phoron_alert, 1)
- else
- phoron_alert = 0
-
- if(breath.gas["sleeping_agent"])
- var/SA_pp = (breath.gas["sleeping_agent"] / breath.total_moles) * breath_pressure
- if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit
- Paralyse(3) // 3 gives them one second to wake up and run away a bit!
- if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
- sleeping = max(sleeping+2, 10)
- else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
- if(prob(20))
- spawn(0) emote(pick("giggle", "laugh"))
-
-
- if(breath.temperature > (T0C+66)) // Hot air hurts :(
- if(prob(20))
- src << "\red You feel a searing heat in your lungs!"
- fire_alert = max(fire_alert, 2)
- else
- fire_alert = 0
-
-
- //Temporary fixes to the alerts.
-
- return 1
-
- proc/handle_environment(datum/gas_mixture/environment)
- if(!environment)
- return
-
- //Moved these vars here for use in the fuck-it-skip-processing check.
- var/pressure = environment.return_pressure()
- if(pressure < WARNING_HIGH_PRESSURE && pressure > WARNING_LOW_PRESSURE && abs(environment.temperature - 293.15) < 20 && abs(bodytemperature - 310.14) < 0.5 && environment.gas["phoron"] < MOLES_PHORON_VISIBLE)
-
-
- //Hopefully should fix the walk-inside-still-pressure-warning issue.
- if(pressure_alert)
- pressure_alert = 0
-
- return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp
-
- var/environment_heat_capacity = environment.heat_capacity()
- if(istype(get_turf(src), /turf/space))
- var/turf/heat_turf = get_turf(src)
- environment_heat_capacity = heat_turf.heat_capacity
-
- if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10)))
- var/transfer_coefficient = 1
-
- handle_temperature_damage(HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient)
-
- if(stat==2)
- bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000)
-
- //Account for massive pressure differences
- switch(pressure)
- if(HAZARD_HIGH_PRESSURE to INFINITY)
- adjustBruteLoss( min( ( (pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) )
- pressure_alert = 2
- if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE)
- pressure_alert = 1
- if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE)
- pressure_alert = 0
- if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
- pressure_alert = -1
- else
- if( !(COLD_RESISTANCE in mutations) )
- adjustBruteLoss( LOW_PRESSURE_DAMAGE )
- pressure_alert = -2
- else
- pressure_alert = -1
-
- return
-
- proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity)
- if(status_flags & GODMODE) return
- var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0)
- //adjustFireLoss(2.5*discomfort)
-
- if(exposed_temperature > bodytemperature)
- adjustFireLoss(20.0*discomfort)
-
- else
- adjustFireLoss(5.0*discomfort)
-
- proc/handle_chemicals_in_body()
-
- if(reagents && reagents.reagent_list.len)
- reagents.metabolize(src)
-
- if (drowsyness)
- drowsyness--
- eye_blurry = max(2, eye_blurry)
- if (prob(5))
- sleeping += 1
- Paralyse(5)
-
- if(confused)
- confused = max(0, confused - 1)
-
- if(resting)
- dizziness = max(0, dizziness - 5)
- else
- dizziness = max(0, dizziness - 1)
-
- return //TODO: DEFERRED
-
- proc/handle_regular_status_updates()
-
- if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
- blinded = 1
- silent = 0
- else //ALIVE. LIGHTS ARE ON
- updatehealth()
- if(health < config.health_threshold_dead || !has_brain())
- death()
- blinded = 1
- stat = DEAD
- silent = 0
- return 1
-
- //UNCONSCIOUS. NO-ONE IS HOME
- if( (getOxyLoss() > 25) || (config.health_threshold_crit > health) )
- if( health <= 20 && prob(1) )
- spawn(0)
- emote("gasp")
- if(!reagents.has_reagent("inaprovaline"))
- adjustOxyLoss(1)
- Paralyse(3)
- if(halloss > 100)
- src << "You're in too much pain to keep going..."
- for(var/mob/O in oviewers(src, null))
- O.show_message("[src] slumps to the ground, too weak to continue fighting.", 1)
- Paralyse(10)
- setHalLoss(99)
-
- if(paralysis)
- AdjustParalysis(-1)
- blinded = 1
- stat = UNCONSCIOUS
- if(halloss > 0)
- adjustHalLoss(-3)
- else if(sleeping)
- handle_dreams()
- adjustHalLoss(-3)
- sleeping = max(sleeping-1, 0)
- blinded = 1
- stat = UNCONSCIOUS
- if( prob(10) && health && !hal_crit )
- spawn(0)
- emote("snore")
- else if(resting)
- if(halloss > 0)
- adjustHalLoss(-3)
- //CONSCIOUS
- else
- stat = CONSCIOUS
- if(halloss > 0)
- adjustHalLoss(-1)
-
- //Eyes
- if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own
- blinded = 1
- else if(eye_blind) //blindness, heals slowly over time
- eye_blind = max(eye_blind-1,0)
- blinded = 1
- else if(eye_blurry) //blurry eyes heal slowly
- eye_blurry = max(eye_blurry-1, 0)
-
- //Ears
- if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own
- ear_deaf = max(ear_deaf, 1)
- else if(ear_deaf) //deafness, heals slowly over time
- ear_deaf = max(ear_deaf-1, 0)
- else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs
- ear_damage = max(ear_damage-0.05, 0)
-
- //Other
- handle_statuses()
- return 1
-
-
- proc/handle_regular_hud_updates()
-
- if (stat == 2 || (XRAY in mutations))
- sight |= SEE_TURFS
- sight |= SEE_MOBS
- sight |= SEE_OBJS
- see_in_dark = 8
- see_invisible = SEE_INVISIBLE_LEVEL_TWO
- else if (stat != 2)
- sight &= ~SEE_TURFS
- sight &= ~SEE_MOBS
- sight &= ~SEE_OBJS
- see_in_dark = 2
- see_invisible = SEE_INVISIBLE_LIVING
-
- if (healths)
- if (stat != 2)
- switch(health)
- if(100 to INFINITY)
- healths.icon_state = "health0"
- if(80 to 100)
- healths.icon_state = "health1"
- if(60 to 80)
- healths.icon_state = "health2"
- if(40 to 60)
- healths.icon_state = "health3"
- if(20 to 40)
- healths.icon_state = "health4"
- if(0 to 20)
- healths.icon_state = "health5"
- else
- healths.icon_state = "health6"
- else
- healths.icon_state = "health7"
-
-
- if(pressure)
- pressure.icon_state = "pressure[pressure_alert]"
-
- if (toxin) toxin.icon_state = "tox[phoron_alert ? 1 : 0]"
- if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]"
- if (fire) fire.icon_state = "fire[fire_alert ? 2 : 0]"
- //NOTE: the alerts dont reset when youre out of danger. dont blame me,
- //blame the person who coded them. Temporary fix added.
-
- if(bodytemp)
- switch(bodytemperature) //310.055 optimal body temp
- if(345 to INFINITY)
- bodytemp.icon_state = "temp4"
- if(335 to 345)
- bodytemp.icon_state = "temp3"
- if(327 to 335)
- bodytemp.icon_state = "temp2"
- if(316 to 327)
- bodytemp.icon_state = "temp1"
- if(300 to 316)
- bodytemp.icon_state = "temp0"
- if(295 to 300)
- bodytemp.icon_state = "temp-1"
- if(280 to 295)
- bodytemp.icon_state = "temp-2"
- if(260 to 280)
- bodytemp.icon_state = "temp-3"
- else
- bodytemp.icon_state = "temp-4"
-
- client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired)
-
- if(blind && stat != DEAD)
- if(blinded)
- blind.layer = 18
- else
- blind.layer = 0
-
- if(disabilities & NEARSIGHTED)
- client.screen += global_hud.vimpaired
-
- if(eye_blurry)
- client.screen += global_hud.blurry
-
- if(druggy)
- client.screen += global_hud.druggy
-
- if (stat != 2)
- if (machine)
- if (!( machine.check_eye(src) ))
- reset_view(null)
- else
- if(client && !client.adminobs)
- reset_view(null)
-
- return 1
-
- proc/handle_random_events()
- if (prob(1) && prob(2))
- spawn(0)
- emote("scratch")
- return
-
-
- proc/handle_changeling()
- if(mind && mind.changeling)
- mind.changeling.regenerate()
-
-/mob/living/carbon/monkey/handle_fire()
- if(..())
- return
- adjustFireLoss(6)
- return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/monkey/login.dm b/code/modules/mob/living/carbon/monkey/login.dm
deleted file mode 100644
index 3b7e5dcb971..00000000000
--- a/code/modules/mob/living/carbon/monkey/login.dm
+++ /dev/null
@@ -1,4 +0,0 @@
-/mob/living/carbon/monkey/Login()
- ..()
- update_hud()
- return
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
deleted file mode 100644
index 07a64c55132..00000000000
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ /dev/null
@@ -1,291 +0,0 @@
-/mob/living/carbon/monkey
- name = "monkey"
- voice_name = "monkey"
- speak_emote = list("chimpers")
- icon_state = "monkey1"
- icon = 'icons/mob/monkey.dmi'
- gender = NEUTER
- pass_flags = PASSTABLE
- update_icon = 0 ///no need to call regenerate_icon
-
- var/obj/item/weapon/card/id/wear_id = null // Fix for station bounced radios -- Skie
- var/greaterform = "Human" // Used when humanizing a monkey.
- icon_state = "monkey1"
- //var/uni_append = "12C4E2" // Small appearance modifier for different species.
- var/list/uni_append = list(0x12C,0x4E2) // Same as above for DNA2.
- var/update_muts = 1 // Monkey gene must be set at start.
- holder_type = /obj/item/weapon/holder/monkey
-
-/mob/living/carbon/monkey/tajara
- name = "farwa"
- voice_name = "farwa"
- speak_emote = list("mews")
- icon_state = "tajkey1"
- greaterform = "Tajara"
- uni_append = list(0x0A0,0xE00) // 0A0E00
- holder_type = /obj/item/weapon/holder/monkey/farwa
-
-/mob/living/carbon/monkey/skrell
- name = "neaera"
- voice_name = "neaera"
- speak_emote = list("squicks")
- icon_state = "skrellkey1"
- greaterform = "Skrell"
- uni_append = list(0x01C,0xC92) // 01CC92
- holder_type = /obj/item/weapon/holder/monkey/neaera
-
-/mob/living/carbon/monkey/unathi
- name = "stok"
- voice_name = "stok"
- speak_emote = list("hisses")
- icon_state = "stokkey1"
- greaterform = "Unathi"
- uni_append = list(0x044,0xC5D) // 044C5D
- holder_type = /obj/item/weapon/holder/monkey/stok
-
-/mob/living/carbon/monkey/New()
-
- verbs += /mob/living/proc/ventcrawl
-
- var/datum/reagents/R = new/datum/reagents(1000)
- reagents = R
- R.my_atom = src
-
- species = all_species[greaterform]
- add_language(species.language)
-
- if(name == initial(name)) //To stop Pun-Pun becoming generic.
- name = "[name] ([rand(1, 1000)])"
- real_name = name
-
- if (!(dna))
- if(gender == NEUTER)
- gender = pick(MALE, FEMALE)
- dna = new /datum/dna( null )
- dna.real_name = real_name
- dna.ResetSE()
- dna.ResetUI()
- //dna.uni_identity = "00600200A00E0110148FC01300B009"
- //dna.SetUI(list(0x006,0x002,0x00A,0x00E,0x011,0x014,0x8FC,0x013,0x00B,0x009))
- //dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
- //dna.SetSE(list(0x433,0x591,0x567,0x561,0x31E,0x137,0x633,0x34D,0x1C3,0x690,0x120,0x321,0x64D,0x4FE,0x4CD,0x615,0x44B,0x6C0,0x3F2,0x51B,0x6C6,0x0A4,0x282,0x1D2,0x6BA,0x3B0,0xFD6))
- dna.unique_enzymes = md5(name)
-
- // We're a monkey
- dna.SetSEState(MONKEYBLOCK, 1)
- dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF)
- // Fix gender
- dna.SetUIState(DNA_UI_GENDER, gender != MALE, 1)
-
- // Set the blocks to uni_append, if needed.
- if(uni_append.len>0)
- for(var/b=1;b<=uni_append.len;b++)
- dna.SetUIValue(DNA_UI_LENGTH-(uni_append.len-b),uni_append[b], 1)
- dna.UpdateUI()
-
- update_muts=1
-
- ..()
- update_icons()
- return
-
-/mob/living/carbon/monkey/movement_delay()
- var/tally = 0
- if(reagents)
- if(reagents.has_reagent("hyperzine")) return -1
-
- if(reagents.has_reagent("nuka_cola")) return -1
-
- var/health_deficiency = (100 - health)
- if(health_deficiency >= 45) tally += (health_deficiency / 25)
-
- if (bodytemperature < 283.222)
- tally += (283.222 - bodytemperature) / 10 * 1.75
- return tally+config.monkey_delay
-
-/mob/living/carbon/monkey/Topic(href, href_list)
- ..()
- if (href_list["mach_close"])
- var/t1 = text("window=[]", href_list["mach_close"])
- unset_machine()
- src << browse(null, t1)
- if ((href_list["item"] && !( usr.stat ) && !( usr.restrained() ) && in_range(src, usr) ))
- var/obj/effect/equip_e/monkey/O = new /obj/effect/equip_e/monkey( )
- O.source = usr
- O.target = src
- O.item = usr.get_active_hand()
- O.s_loc = usr.loc
- O.t_loc = loc
- O.place = href_list["item"]
- requests += O
- spawn( 0 )
- O.process()
- return
- ..()
- return
-
-/mob/living/carbon/monkey/meteorhit(obj/O as obj)
- for(var/mob/M in viewers(src, null))
- M.show_message(text("\red [] has been hit by []", src, O), 1)
- if (health > 0)
- var/shielded = 0
- adjustBruteLoss(30)
- if ((O.icon_state == "flaming" && !( shielded )))
- adjustFireLoss(40)
- health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
- return
-
-/mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M as mob)
-
- if (M.a_intent == "help" && a_intent == "help")
- help_shake_act(M)
- get_scooped(M)
- else
- if (M.a_intent == "hurt")
- var/datum/unarmed_attack/attack = null
- for(var/datum/unarmed_attack/u_attack in M.species.unarmed_attacks)
- if(!u_attack.is_usable(M, src))
- continue
- else
- attack = u_attack
- break
- if(!attack)
- return 0
- if ((prob(75) && health > 0))
- visible_message("\red [M] [pick(attack.attack_verb)] [src]!")
-
- playsound(loc, "punch", 25, 1, -1)
- var/damage = rand(5, 10)
- if (prob(40))
- damage = rand(10, 15)
- if (paralysis < 5)
- Paralyse(rand(10, 15))
- visible_message("\red [M] has knocked out [src]!")
-
- adjustBruteLoss(damage)
-
- M.attack_log += text("\[[time_stamp()]\] [pick(attack.attack_verb)]ed [src.name] ([src.ckey])")
- src.attack_log += text("\[[time_stamp()]\] Has been [pick(attack.attack_verb)]ed by [M.name] ([M.ckey])")
- msg_admin_attack("[key_name(M)] [pick(attack.attack_verb)]ed [key_name(src)]")
-
- updatehealth()
- else
- playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
- visible_message("\red [M] tried to [pick(attack.attack_verb)] [src]!")
- else
- if (M.a_intent == "grab")
- if (M == src || anchored)
- return
-
- var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
-
- M.put_in_active_hand(G)
-
- G.synch()
-
- LAssailant = M
-
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- for(var/mob/O in viewers(src, null))
- O.show_message(text("\red [] has grabbed [name] passively!", M), 1)
- else
- if (!( paralysis ))
- if (prob(25))
- Paralyse(2)
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\red [] has pushed down [name]!", M), 1)
- else
- drop_item()
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\red [] has disarmed [name]!", M), 1)
- return
-
-/mob/living/carbon/monkey/Stat()
- ..()
- statpanel("Status")
- stat(null, text("Intent: []", a_intent))
- stat(null, text("Move Mode: []", m_intent))
- if(client && mind)
- if (client.statpanel == "Status")
- if(mind.changeling)
- stat("Chemical Storage", mind.changeling.chem_charges)
- stat("Genetic Damage Time", mind.changeling.geneticdamage)
- return
-
-
-/mob/living/carbon/monkey/verb/removeinternal()
- set name = "Remove Internals"
- set category = "IC"
- internal = null
- return
-
-/mob/living/carbon/monkey/var/co2overloadtime = null
-/mob/living/carbon/monkey/var/temperature_resistance = T0C+75
-
-/mob/living/carbon/monkey/emp_act(severity)
- if(wear_id) wear_id.emp_act(severity)
- ..()
-
-/mob/living/carbon/monkey/ex_act(severity)
- if(!blinded)
- flick("flash", flash)
-
- switch(severity)
- if(1.0)
- if (stat != 2)
- adjustBruteLoss(200)
- health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
- if(2.0)
- if (stat != 2)
- adjustBruteLoss(60)
- adjustFireLoss(60)
- health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
- if(3.0)
- if (stat != 2)
- adjustBruteLoss(30)
- health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
- if (prob(50))
- Paralyse(10)
- else
- return
-
-/mob/living/carbon/monkey/blob_act()
- if (stat != 2)
- adjustFireLoss(60)
- health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
- if (prob(50))
- Paralyse(10)
- if (stat == DEAD && client)
- gib()
- return
- if (stat == DEAD && !client)
- gibs(loc, viruses)
- del(src)
- return
-
-//Unless its monkey mode monkeys cant use advanced tools
-/mob/living/carbon/monkey/IsAdvancedToolUser(var/silent)
- if(!silent)
- src << "You don't have the dexterity to use that!"
- return 0
-
-/mob/living/carbon/monkey/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/italics=0, var/message_range = world.view, var/list/used_radios = list())
- if(stat)
- return
-
- if(copytext(message,1,2) == "*")
- return emote(copytext(message,2))
-
- if(stat)
- return
-
- if(speak_emote.len)
- verb = pick(speak_emote)
-
- message = capitalize(trim_left(message))
-
- ..(message, speaking, verb, alt_name, italics, message_range, used_radios)
diff --git a/code/modules/mob/living/carbon/monkey/npc.dm b/code/modules/mob/living/carbon/monkey/npc.dm
deleted file mode 100644
index a7d4bfc7aef..00000000000
--- a/code/modules/mob/living/carbon/monkey/npc.dm
+++ /dev/null
@@ -1,89 +0,0 @@
-mob/living/carbon/monkey/var
- mob/npc_target = null // the NPC this monkey is attacking
- mob/npc_fleeing = null // the monkey is scared of this mob
- mob/hiding_behind = null
- hid_behind = 0
-
- var/list/hostiles = list()
-
- fleeing_duration = 0
-
-mob/living/carbon/monkey/proc/npc_act()
- if(!client && !stat)
- if(npc_fleeing && canmove)
- var/prevloc = loc
- if(!hiding_behind)
- for(var/mob/living/carbon/human/H in view(7, src))
- if(!hostiles.Find(H))
- hiding_behind = H
-
- if(hiding_behind)
- if(get_dist(src, hiding_behind) == 1)
- if(!hid_behind)
- emote("me", 1, "hides behind [hiding_behind]!")
- hid_behind = 1
- step_to(src, get_step(hiding_behind, get_dir(npc_fleeing, hiding_behind)))
- else
- if(!step_to(src, hiding_behind, 1))
- hiding_behind = null
- else
- step_away(src, npc_fleeing, 7)
-
- if(prob(7))
- if(prob(50) && (npc_fleeing in view(8,src)))
- switch(rand(1,3))
- if(1)
- emote("me", 1, "shows [npc_fleeing] its fangs!")
- if(2)
- emote("me", 2, "gnarls at [npc_fleeing].")
- if(3)
- emote("me", 2, "eyes [npc_fleeing] fearfully.")
- else
- switch(rand(1,3))
- if(1)
- emote("whimper")
- if(2)
- emote("me", 1, "trembles heavily.")
- if(3)
- emote("me", 2, "chimpers nervously.")
-
- fleeing_duration--
- if(fleeing_duration <= 0)
- npc_fleeing = null
- hiding_behind = null
- hid_behind = 0
-
- if(loc == prevloc) set_dir(get_dir(src, npc_fleeing))
- else
- if(prob(33) && canmove && isturf(loc))
- step(src, pick(cardinal))
- if(prob(1))
- if(health < 70)
- switch(rand(1,3))
- if(1)
- emote("me", 1, "cowers on the floor, writhing in pain.")
- if(2)
- emote("me", 1, "trembles visibly, it seems to be in pain.")
- if(3)
- emote("me", 1, "wraps its arms around its knees, breathing heavily.")
- else
- emote(pick("scratch","jump","roll","tail"))
-
-mob/living/carbon/monkey/react_to_attack(mob/M)
- if(npc_fleeing == M)
- fleeing_duration += 30
- return
-
- if(!hostiles.Find(M)) hostiles += M
-
- spawn(5)
- switch(rand(1,3))
- if(1)
- emote("me", 1, "flails about wildly!")
- if(2)
- emote("me", 2, "screams loudly at [M]!")
- if(3)
- emote("me", 2, "whimpers fearfully!")
-
- npc_fleeing = M
- fleeing_duration = 30
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm
deleted file mode 100644
index ec69d454f6b..00000000000
--- a/code/modules/mob/living/carbon/monkey/update_icons.dm
+++ /dev/null
@@ -1,129 +0,0 @@
-//Monkey Overlays Indexes////////
-#define M_MASK_LAYER 1
-#define M_BACK_LAYER 2
-#define M_HANDCUFF_LAYER 3
-#define M_L_HAND_LAYER 4
-#define M_R_HAND_LAYER 5
-#define TARGETED_LAYER 6
-#define M_FIRE_LAYER 6
-#define M_TOTAL_LAYERS 7
-/////////////////////////////////
-
-/mob/living/carbon/monkey
- var/list/overlays_lying[M_TOTAL_LAYERS]
- var/list/overlays_standing[M_TOTAL_LAYERS]
-
-/mob/living/carbon/monkey/regenerate_icons()
- ..()
- update_inv_wear_mask(0)
- update_inv_back(0)
- update_inv_r_hand(0)
- update_inv_l_hand(0)
- update_inv_handcuffed(0)
- update_fire(0)
- update_icons()
- //Hud Stuff
- update_hud()
- return
-
-/mob/living/carbon/monkey/update_icons()
- update_hud()
- lying_prev = lying //so we don't update overlays for lying/standing unless our stance changes again
- overlays.Cut()
- for(var/image/I in overlays_standing)
- overlays += I
-
- if(lying)
- var/matrix/M = matrix()
- M.Turn(90)
- M.Translate(1,-6)
- src.transform = M
- else
- var/matrix/M = matrix()
- src.transform = M
-
-
-////////
-/mob/living/carbon/monkey/update_inv_wear_mask(var/update_icons=1)
- if( wear_mask && istype(wear_mask, /obj/item/clothing/mask) )
- overlays_standing[M_MASK_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "[wear_mask.icon_state]")
- wear_mask.screen_loc = ui_monkey_mask
- else
- overlays_standing[M_MASK_LAYER] = null
- if(update_icons) update_icons()
-
-
-/mob/living/carbon/monkey/update_inv_r_hand(var/update_icons=1)
- if(r_hand)
- var/t_state = r_hand.item_state
- if(!t_state) t_state = r_hand.icon_state
- overlays_standing[M_R_HAND_LAYER] = image("icon" = 'icons/mob/items_righthand.dmi', "icon_state" = t_state)
- r_hand.screen_loc = ui_rhand
- if (handcuffed) drop_r_hand()
- else
- overlays_standing[M_R_HAND_LAYER] = null
- if(update_icons) update_icons()
-
-
-/mob/living/carbon/monkey/update_inv_l_hand(var/update_icons=1)
- if(l_hand)
- var/t_state = l_hand.item_state
- if(!t_state) t_state = l_hand.icon_state
- overlays_standing[M_L_HAND_LAYER] = image("icon" = 'icons/mob/items_lefthand.dmi', "icon_state" = t_state)
- l_hand.screen_loc = ui_lhand
- if (handcuffed) drop_l_hand()
- else
- overlays_standing[M_L_HAND_LAYER] = null
- if(update_icons) update_icons()
-
-
-/mob/living/carbon/monkey/update_inv_back(var/update_icons=1)
- if(back)
- overlays_standing[M_BACK_LAYER] = image("icon" = 'icons/mob/back.dmi', "icon_state" = "[back.icon_state]")
- back.screen_loc = ui_monkey_back
- else
- overlays_standing[M_BACK_LAYER] = null
- if(update_icons) update_icons()
-
-
-/mob/living/carbon/monkey/update_inv_handcuffed(var/update_icons=1)
- if(handcuffed)
- drop_r_hand()
- drop_l_hand()
- stop_pulling()
- overlays_standing[M_HANDCUFF_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "handcuff1")
- else
- overlays_standing[M_HANDCUFF_LAYER] = null
- if(update_icons) update_icons()
-
-
-/mob/living/carbon/monkey/update_hud()
- if (client)
- client.screen |= contents
-
-//Call when target overlay should be added/removed
-/mob/living/carbon/monkey/update_targeted(var/update_icons=1)
- if (targeted_by && target_locked)
- overlays_standing[TARGETED_LAYER] = target_locked
- else if (!targeted_by && target_locked)
- del(target_locked)
- if (!targeted_by)
- overlays_standing[TARGETED_LAYER] = null
- if(update_icons) update_icons()
-
-/mob/living/carbon/monkey/update_fire(var/update_icons=1)
- if(on_fire)
- overlays_standing[M_FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing", "layer"= -M_FIRE_LAYER)
- else
- overlays_standing[M_FIRE_LAYER] = null
- if(update_icons) update_icons()
-//Monkey Overlays Indexes////////
-#undef M_MASK_LAYER
-#undef M_BACK_LAYER
-#undef M_HANDCUFF_LAYER
-#undef M_L_HAND_LAYER
-#undef M_R_HAND_LAYER
-#undef TARGETED_LAYER
-#undef M_FIRE_LAYER
-#undef M_TOTAL_LAYERS
-
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index b98c3a74487..3f54916bb84 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -59,13 +59,6 @@
H.UpdateDamageIcon()
H.updatehealth()
return 1
- else if(istype(src, /mob/living/carbon/monkey))
- if (COLD_RESISTANCE in src.mutations) //fireproof
- return 0
- var/mob/living/carbon/monkey/M = src
- M.adjustFireLoss(burn_amount)
- M.updatehealth()
- return 1
else if(istype(src, /mob/living/silicon/ai))
return 0
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 52cb315ce86..7c0d3dd85d4 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -899,11 +899,6 @@
//if they are holding or wearing a card that has access, that works
if(check_access(H.get_active_hand()) || check_access(H.wear_id))
return 1
- else if(istype(M, /mob/living/carbon/monkey))
- var/mob/living/carbon/monkey/george = M
- //they can only hold things :(
- if(george.get_active_hand() && istype(george.get_active_hand(), /obj/item/weapon/card/id) && check_access(george.get_active_hand()))
- return 1
return 0
/mob/living/silicon/robot/proc/check_access(obj/item/weapon/card/id/I)
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 8cce2342dff..89a824f61f7 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -69,7 +69,7 @@
//Removing from inventory
if(href_list["remove_inv"])
- if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr)))
+ if(!Adjacent(usr) || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr)))
return
var/remove_from = href_list["remove_inv"]
switch(remove_from)
@@ -100,7 +100,7 @@
//Adding things to inventory
else if(href_list["add_inv"])
- if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr)))
+ if(!Adjacent(usr) || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr)))
return
var/add_to = href_list["add_inv"]
if(!usr.get_active_hand())
diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm
index bf59a7e5464..43b6c42ceed 100644
--- a/code/modules/mob/living/simple_animal/friendly/crab.dm
+++ b/code/modules/mob/living/simple_animal/friendly/crab.dm
@@ -82,7 +82,7 @@
//Removing from inventory
if(href_list["remove_inv"])
- if(get_dist(src,usr) > 1 || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr)))
+ if(get_dist(src,usr) > 1 || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr)))
return
var/remove_from = href_list["remove_inv"]
switch(remove_from)
@@ -112,7 +112,7 @@
//Adding things to inventory
else if(href_list["add_inv"])
- if(get_dist(src,usr) > 1 || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr)))
+ if(get_dist(src,usr) > 1 || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr)))
return
var/add_to = href_list["add_inv"]
if(!usr.get_active_hand())
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 7790f9ecd83..9090ab6fe62 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -136,7 +136,7 @@
return
//Is the usr's mob type able to do this?
- if(ishuman(usr) || ismonkey(usr) || isrobot(usr))
+ if(ishuman(usr) || issmall(usr) || isrobot(usr))
//Removing from inventory
if(href_list["remove_inv"])
diff --git a/code/modules/mob/mob_cleanup.dm b/code/modules/mob/mob_cleanup.dm
index 1cac93904f8..cdc734c49a7 100644
--- a/code/modules/mob/mob_cleanup.dm
+++ b/code/modules/mob/mob_cleanup.dm
@@ -152,14 +152,6 @@ Put (mob/proc)s here that are in dire need of a code cleanup.
//
world << "Shoes pass [passed]"
*/ //
- else if(istype(src, /mob/living/carbon/monkey))
- var/mob/living/carbon/monkey/M = src
- switch(target_zone)
- if(1)
- if(M.wear_mask && isobj(M.wear_mask))
- Cl = M.wear_mask
- passed = prob((Cl.permeability_coefficient*100) - 1)
- //world << "Mask pass [passed]"
if(!passed && spread_type == AIRBORNE && !internals)
passed = (prob((50*virus.permeability_mod) - 1))
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 2b47227dfee..39895f22b24 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -196,14 +196,14 @@
if(M == assailant && state >= GRAB_AGGRESSIVE)
var/can_eat
- if((FAT in user.mutations) && ismonkey(affecting))
+ if((FAT in user.mutations) && issmall(affecting))
can_eat = 1
else
var/mob/living/carbon/human/H = user
if(istype(H) && H.species.gluttonous)
if(H.species.gluttonous == 2)
can_eat = 2
- else if(!ishuman(affecting) && !ismonkey(affecting) && (affecting.small || iscarbon(affecting)))
+ else if(!ishuman(affecting) && !issmall(affecting) && (affecting.small || iscarbon(affecting)))
can_eat = 1
if(can_eat)
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 0cbab165819..4deb43a3c21 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -15,9 +15,11 @@
return istype(H.species, /datum/species/xenos)
return 0
-/proc/ismonkey(A)
- if(A && istype(A, /mob/living/carbon/monkey))
- return 1
+/proc/issmall(A)
+ if(A && istype(A, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = A
+ if(H.species && H.species.is_small)
+ return 1
return 0
/proc/isbrain(A)
@@ -257,7 +259,7 @@ var/list/global/organ_rel_size = list(
for(var/obj/item/weapon/grab/G in target.grabbed_by)
if(G.state >= GRAB_AGGRESSIVE)
return zone
-
+
var/miss_chance = 10
if (zone in base_miss_chance)
miss_chance = base_miss_chance[zone]
@@ -462,7 +464,7 @@ var/list/intents = list("help","disarm","grab","hurt")
if(hud_used && hud_used.action_intent)
hud_used.action_intent.icon_state = "intent_[a_intent]"
- else if(isrobot(src) || ismonkey(src))
+ else if(isrobot(src))
switch(input)
if("help")
a_intent = "help"
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 227329e9152..9793fe02fad 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -21,36 +21,25 @@
sleep(48)
//animation = null
- if(!species.primitive) //If the creature in question has no primitive set, this is going to be messy.
+ monkeyizing = 0
+ stunned = 0
+ update_canmove()
+ invisibility = initial(invisibility)
+
+ if(!species.primitive_form) //If the creature in question has no primitive set, this is going to be messy.
gib()
return
- var/mob/living/carbon/monkey/O = null
+ for(var/obj/item/W in src)
+ drop_from_inventory(W)
+ set_species(species.primitive_form)
+ dna.SetSEState(MONKEYBLOCK,1)
+ dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF)
- O = new species.primitive(loc)
-
- O.dna = dna.Clone()
- O.dna.SetSEState(MONKEYBLOCK,1)
- O.dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF)
- O.loc = loc
- O.viruses = viruses
- O.a_intent = "hurt"
-
- for(var/datum/disease/D in O.viruses)
- D.affected_mob = O
-
- if (client)
- client.mob = O
- if(mind)
- mind.transfer_to(O)
-
- O << "You are now [O]. "
-
- spawn(0)//To prevent the proc from returning null.
- del(src)
+ src << "You are now [species.name]. "
del(animation)
- return O
+ return src
/mob/new_player/AIize()
spawning = 1
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index b04d631046d..5f045736dce 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -282,12 +282,6 @@ proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large)
if(istype(source,/mob/living/carbon/human))
var/mob/living/carbon/human/M = source
source = M.get_blood(M.vessel)
- else if(istype(source,/mob/living/carbon/monkey))
- var/mob/living/carbon/monkey/donor = source
- if(donor.dna)
- source = new()
- source.data["blood_DNA"] = donor.dna.unique_enzymes
- source.data["blood_type"] = donor.dna.b_type
// Are we dripping or splattering?
var/list/drips = list()
diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm
index cbec31306be..2113ba87f77 100644
--- a/code/modules/power/singularity/particle_accelerator/particle.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle.dm
@@ -74,12 +74,6 @@
/obj/effect/accelerated_particle/proc/toxmob(var/mob/living/M)
var/radiation = (energy*2)
-/* if(istype(M,/mob/living/carbon/human))
- if(M:wear_suit) //TODO: check for radiation protection
- radiation = round(radiation/2,1)
- if(istype(M,/mob/living/carbon/monkey))
- if(M:wear_suit) //TODO: check for radiation protection
- radiation = round(radiation/2,1)*/
M.apply_effect((radiation*3),IRRADIATE,0)
M.updatehealth()
//M << "\red You feel odd."
diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm
index f48a2d4a61a..5bde8a5cfc1 100644
--- a/code/modules/projectiles/projectile/change.dm
+++ b/code/modules/projectiles/projectile/change.dm
@@ -35,11 +35,8 @@
var/mob/living/new_mob
- var/randomize = pick("monkey","robot","slime","xeno","human")
+ var/randomize = pick("robot","slime","xeno","human")
switch(randomize)
- if("monkey")
- new_mob = new /mob/living/carbon/monkey(M.loc)
- new_mob.universal_speak = 1
if("robot")
new_mob = new /mob/living/silicon/robot(M.loc)
new_mob.gender = M.gender
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index d5a3095e490..89e993e4b3c 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -153,9 +153,6 @@ datum
if(!self.data["donor"] || istype(self.data["donor"], /mob/living/carbon/human))
blood_splatter(T,self,1)
- else if(istype(self.data["donor"], /mob/living/carbon/monkey))
- var/obj/effect/decal/cleanable/blood/B = blood_splatter(T,self,1)
- if(B) B.blood_DNA["Non-Human DNA"] = "A+"
else if(istype(self.data["donor"], /mob/living/carbon/alien))
var/obj/effect/decal/cleanable/blood/B = blood_splatter(T,self,1)
if(B) B.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*"
@@ -2057,17 +2054,6 @@ datum
del (H.glasses)
H.update_inv_glasses(0)
- else if(ismonkey(M))
- var/mob/living/carbon/monkey/MK = M
- if(MK.wear_mask)
- if(!MK.wear_mask.unacidable)
- MK << "Your mask melts away but protects you from the acid!"
- del (MK.wear_mask)
- MK.update_inv_wear_mask(0)
- else
- MK << "Your mask protects you from the acid."
- return
-
if(!M.unacidable)
if(istype(M, /mob/living/carbon/human) && volume >= 10)
var/mob/living/carbon/human/H = M
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index 502a741c6b4..50273f2d8b9 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -1543,7 +1543,7 @@
filling_color = "#ADAC7F"
var/wrapped = 0
- var/monkey_type = /mob/living/carbon/monkey
+ var/monkey_type = "Monkey"
New()
..()
@@ -1561,6 +1561,7 @@
if(wrapped)
Unwrap(user)
+ /*
On_Consume(var/mob/M)
M << "Something inside of you suddently expands!"
@@ -1586,7 +1587,7 @@
else //someone is having a bad day
E.createwound(CUT, 30)
E.embed(surprise)
- else if (ismonkey(M))
+ else if (issmall(M))
M.visible_message("[M] suddenly tears in half!")
var/mob/living/carbon/monkey/ook = new monkey_type(M.loc)
ook.name = "malformed [ook.name]"
@@ -1594,11 +1595,13 @@
ook.add_blood(M)
M.gib()
..()
+ */
proc/Expand()
for(var/mob/M in viewers(src,7))
M << "\red \The [src] expands!"
- new monkey_type(src)
+ var/mob/living/carbon/human/H = new (src)
+ H.set_species(monkey_type)
del(src)
proc/Unwrap(mob/user as mob)
@@ -1612,24 +1615,30 @@
desc = "Still wrapped in some paper."
icon_state = "monkeycubewrap"
wrapped = 1
+
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/farwacube
name = "farwa cube"
- monkey_type = /mob/living/carbon/monkey/tajara
+ monkey_type = "Farwa"
+
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/farwacube
name = "farwa cube"
- monkey_type =/mob/living/carbon/monkey/tajara
+ monkey_type = "Farwa"
+
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/stokcube
name = "stok cube"
- monkey_type = /mob/living/carbon/monkey/unathi
+ monkey_type = "Stok"
+
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/stokcube
name = "stok cube"
- monkey_type =/mob/living/carbon/monkey/unathi
+ monkey_type = "Stok"
+
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/neaeracube
name = "neaera cube"
- monkey_type = /mob/living/carbon/monkey/skrell
+ monkey_type = "Neara"
+
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube
name = "neaera cube"
- monkey_type =/mob/living/carbon/monkey/skrell
+ monkey_type = "Neara"
/obj/item/weapon/reagent_containers/food/snacks/spellburger
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm b/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm
index 9c3cc70eeba..4daf56e0566 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm
+++ b/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm
@@ -39,8 +39,7 @@
/mob/living/simple_animal/slime,\
/mob/living/simple_animal/crab,\
/mob/living/simple_animal/mouse,\
- /mob/living/simple_animal/hostile/retaliate/goat,\
- /mob/living/carbon/monkey\
+ /mob/living/simple_animal/hostile/retaliate/goat\
)
//todo: how the hell is the asteroid permanently powered?
diff --git a/code/modules/spells/horsemask.dm b/code/modules/spells/horsemask.dm
index 1319f620081..32e362f3468 100644
--- a/code/modules/spells/horsemask.dm
+++ b/code/modules/spells/horsemask.dm
@@ -11,7 +11,7 @@
invocation_type = "shout"
range = 7
selection_type = "range"
- var/list/compatible_mobs = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ var/list/compatible_mobs = list(/mob/living/carbon/human)
/obj/effect/proc_holder/spell/targeted/horsemask/cast(list/targets, mob/user = usr)
if(!targets.len)
@@ -43,7 +43,7 @@
dropped(mob/user as mob)
canremove = 1
..()
-
+
equipped(var/mob/user, var/slot)
if (slot == slot_wear_mask)
canremove = 0 //curses!
diff --git a/code/modules/spells/inflict_handler.dm b/code/modules/spells/inflict_handler.dm
index f9b809c674b..34b810d3093 100644
--- a/code/modules/spells/inflict_handler.dm
+++ b/code/modules/spells/inflict_handler.dm
@@ -24,7 +24,7 @@
if("gib")
target.gib()
if("gib_brain")
- if(ishuman(target) || ismonkey(target))
+ if(ishuman(target) || issmall(target))
var/mob/living/carbon/C = target
if(!C.has_brain()) // Their brain is already taken out
var/obj/item/organ/brain/B = new(C.loc)
diff --git a/code/modules/spells/mind_transfer.dm b/code/modules/spells/mind_transfer.dm
index 80a249615a9..161ed3516d1 100644
--- a/code/modules/spells/mind_transfer.dm
+++ b/code/modules/spells/mind_transfer.dm
@@ -9,7 +9,7 @@
invocation_type = "whisper"
range = 1
var/list/protected_roles = list("Wizard","Changeling","Cultist") //which roles are immune to the spell
- var/list/compatible_mobs = list(/mob/living/carbon/human,/mob/living/carbon/monkey) //which types of mobs are affected by the spell. NOTE: change at your own risk
+ var/list/compatible_mobs = list(/mob/living/carbon/human) //which types of mobs are affected by the spell. NOTE: change at your own risk
var/base_spell_loss_chance = 20 //base probability of the wizard losing a spell in the process
var/spell_loss_chance_modifier = 7 //amount of probability of losing a spell added per spell (mind_transfer included)
var/spell_loss_amount = 1 //the maximum amount of spells possible to lose during a single transfer
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index cfee510475d..2ae347ee4ae 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -80,7 +80,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
usr << "Not when you're incapacitated."
return 0
- if(ishuman(usr) || ismonkey(usr))
+ if(ishuman(usr) || issmall(usr))
if(istype(usr.wear_mask, /obj/item/clothing/mask/muzzle))
usr << "Mmmf mrrfff!"
return 0
diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi
index 8b70722fd90..f0146ec2cc4 100644
Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ
diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi
index defb526a7f8..99588092d08 100644
Binary files a/icons/effects/species.dmi and b/icons/effects/species.dmi differ
diff --git a/icons/mob/dam_human.dmi b/icons/mob/dam_human.dmi
deleted file mode 100644
index 9f649669c0d..00000000000
Binary files a/icons/mob/dam_human.dmi and /dev/null differ
diff --git a/icons/mob/dam_mask.dmi b/icons/mob/dam_mask.dmi
deleted file mode 100644
index df1cc8536a0..00000000000
Binary files a/icons/mob/dam_mask.dmi and /dev/null differ
diff --git a/icons/mob/human_races/masks/blood_human.dmi b/icons/mob/human_races/masks/blood_human.dmi
new file mode 100644
index 00000000000..dc54991c84d
Binary files /dev/null and b/icons/mob/human_races/masks/blood_human.dmi differ
diff --git a/icons/mob/human_races/masks/blood_monkey.dmi b/icons/mob/human_races/masks/blood_monkey.dmi
new file mode 100644
index 00000000000..5d5dd66d752
Binary files /dev/null and b/icons/mob/human_races/masks/blood_monkey.dmi differ
diff --git a/icons/mob/human_races/masks/dam_human.dmi b/icons/mob/human_races/masks/dam_human.dmi
new file mode 100644
index 00000000000..cb6bf82d98e
Binary files /dev/null and b/icons/mob/human_races/masks/dam_human.dmi differ
diff --git a/icons/mob/human_races/masks/dam_mask_human.dmi b/icons/mob/human_races/masks/dam_mask_human.dmi
new file mode 100644
index 00000000000..db55b5a6b5d
Binary files /dev/null and b/icons/mob/human_races/masks/dam_mask_human.dmi differ
diff --git a/icons/mob/human_races/masks/dam_mask_monkey.dmi b/icons/mob/human_races/masks/dam_mask_monkey.dmi
new file mode 100644
index 00000000000..4761f21fbd5
Binary files /dev/null and b/icons/mob/human_races/masks/dam_mask_monkey.dmi differ
diff --git a/icons/mob/human_races/masks/dam_monkey.dmi b/icons/mob/human_races/masks/dam_monkey.dmi
new file mode 100644
index 00000000000..43d1f2c7a73
Binary files /dev/null and b/icons/mob/human_races/masks/dam_monkey.dmi differ
diff --git a/icons/mob/human_races/monkeys/r_farwa.dmi b/icons/mob/human_races/monkeys/r_farwa.dmi
new file mode 100644
index 00000000000..585fa3bcf35
Binary files /dev/null and b/icons/mob/human_races/monkeys/r_farwa.dmi differ
diff --git a/icons/mob/human_races/monkeys/r_monkey.dmi b/icons/mob/human_races/monkeys/r_monkey.dmi
new file mode 100644
index 00000000000..c405a94978d
Binary files /dev/null and b/icons/mob/human_races/monkeys/r_monkey.dmi differ
diff --git a/icons/mob/human_races/monkeys/r_neara.dmi b/icons/mob/human_races/monkeys/r_neara.dmi
new file mode 100644
index 00000000000..69183f0d4bb
Binary files /dev/null and b/icons/mob/human_races/monkeys/r_neara.dmi differ
diff --git a/icons/mob/human_races/monkeys/r_stok.dmi b/icons/mob/human_races/monkeys/r_stok.dmi
new file mode 100644
index 00000000000..28af62205cc
Binary files /dev/null and b/icons/mob/human_races/monkeys/r_stok.dmi differ
diff --git a/icons/mob/monkey.dmi b/icons/mob/monkey.dmi
deleted file mode 100644
index b9c1299ec25..00000000000
Binary files a/icons/mob/monkey.dmi and /dev/null differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index bd98dff120e..8bcb5920ed0 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 32e720754f5..fa842ae5076 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 9c19f3da13d..23beb5f4fa3 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm
index 5a598b2962b..64f5f1e5451 100644
--- a/maps/exodus-1.dmm
+++ b/maps/exodus-1.dmm
@@ -2096,7 +2096,7 @@
"aOp" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_chapel_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aOq" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/auxport)
"aOr" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
-"aOs" = (/mob/living/carbon/monkey{name = "Pun Pun"; icon_state = "punpun1"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
+"aOs" = (/obj/effect/landmark/start{name = "Bartender"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/carbon/human/monkey/punpun,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
"aOt" = (/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
"aOu" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/flame/lighter/zippo,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
"aOv" = (/obj/structure/bed/chair/comfy/brown{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
@@ -2184,7 +2184,6 @@
"aPZ" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/hallway/primary/central_two)
"aQa" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit)
"aQb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
-"aQc" = (/obj/effect/landmark/start{name = "Bartender"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
"aQd" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_2_berth_hatch"; locked = 1; name = "Escape Pod"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore)
"aQe" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
"aQf" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
@@ -7444,8 +7443,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaT
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaIwaFlaFlaDKaFlaGLaFlaGLaIxaGLaIyaGLaFlaGMaGNaGOaDPaFFaIAaIAbeeaICbeaaICaIAaIAaIEaIFaFCaGQaFHaGWaGVaFCaIKaILaIMaFLaFLaINaFLaIOaIPaIKaCMaaaaBYaBYaIQaIRaIQaBYaBYaaaazJazOazPaISaITaIUaFTaIVazPaIWaIXayLaIYazTbeNaEwaCfaJaaEyaATaJbaJcazTaJdaJeaJfaJgaJhaMbbeMaCuaCuaCuaCuaCuaHRaGCaJlaJmaJnaBjaJoaBjaJpaBjaJqaBjaJraGpbguaJtaGsaGsaDqaJvaDsaDsbfxaDsaDsaJxaDsaGsaJyaGsaGsaGsaJzaHZaHTaHSaHWbfyaHYaIaaIaaIaaJjaIbaIgaJIaJJaJKaJLaJMaJNaIgaJOaJPaGFaJQaJRaJSaJTbinaJUaIoaJVaJkaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaFraJXaGJaGKaFlaGLaFlaGLaFlaGLaFlaGLaFlaGMaGNaGOaDPaGYaGXaHaaGZaHbaHbaIBaIzaIHaIGaIJaAHaJZaJYaJAaKaaFCaIKaKmaKnaKoaKpaIKaKqaKraKsaKtaKuaaaaafaaaaKvaKwaKvaaaaafaaaaKuazOazPaKxaKyaKzaKAaKBazPaKCaKDayLaKEazTaARaKFaKGaHrazTaKHaKIaKJaKKaKLaJeaEDaKNaKOaKPaEEaKRaaaaaaaJlaKSaJGawnaJlaAvaJnaJnaJnaKWaJnaJnaJnaBjaDpaAbaDpaDpaDpaDpazUaDpaKZaLaaLbaLcaLdazFaLfaLgaLhaLfaLfaLfaLfaLfazpaLfaLfaLfaLfaLfaLfaLfaLfaJHaIgaLjaLkaLlaEFaLnaLoaIgaLpaJWaGFaLraLsaLtaJTazmaJUaIoaJVaIoaLvaLwaLxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaLyaLzaDJaFkaFlaFlaFlaLAaFlaFlaLBaFlaFlaFraLCaLDaDPaLEaLFaLGaLHaLGaLGaLGaLGaLGaLIaLJaFCaFCaFCaFCaFCaFCaLLaLMaLNaLOaLOaLOaLOaLPaLQaLRaKuaLSaLTaLTaLUaLVaLWaLTaLTaLXaKuayNaKuaKuaLZaMaaLZaJeaJeaMbaxCaJeaJeaJeaJeaMdaMeaxOayzaMhaMiaJeaJeaJeaJeaMjaKNaMkaMkaMlaMmaMnaMoaJlaMpaLqaKUaJlaJlaJlaJlaJlaJlaJlaJlaBjaBjaMsaMtaMuaMvaxwaMxaMyaMzaKZaMAaMBaMCaMCaMDaLfaxyaMFaMGaMHaMIaMJaMKaMLaMMaMNaMHaMJaMIaMHaMOaLfaJHaIgaMPaMQaMRaMSaMTaMUaIgaMVaMWawMaMYaMZaNaaNbaGFaGGaNcaJVaIoaNdaNeaNfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaLyaDJaDKaDJaDJaDLaDMaDJaDJaDKaLzaNgaBIaNhaLEaNiaNjaNjaNkaNjaNlaIAaNmaNnaLJaNoaNpaNqaNraNsaNtaNraNuaNraNraNraNvaNraNraNwaNxaNyaNzaNAaNBaNzaNCaNzaNzaNzaNzaNDaNEaNFaNGaNraNHaNIaNJaNKaNLaNMaNLaNNaNOaNPaNQaNQaNRaNSaNTaNSaNUaNVaNWaEGaNYaNZaOaaObaOcaMkaMkaMkaOdaOeaMgaMfaOhaOiaOjaOkaOlaOmaOnaJlaOoaCLaCDaOraOsaOtaOuaOvaOwaOxaKZaOyaOzaOAaOAaOBaLfaOCaODaOEaOEaOEaOEaOFaOGaCtaOIaOJaOKaOKaOLaOMaLfaJHaIgaONaOOaOPaOQaONaONaIgaORaOSaGFaOTaOUaOVaOWaGFaIoaIoaJVaIoaGGaGGaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOXaOYaOZaPaaPaaPaaPaaPbaOYaOXaaaaBIaPcaPdaPeaMraMqaPhaPhaPiaIAaPjaNnaPkaPlaPmaPnaPoaPpaPqaPqaPraPsaPsaPsaPtaPuaPuaPvaPwaNIaPqaPqaPxaPyaPzaPAaPBaPBaPCaPBaPDaPyaPyaPyaPEaPFaPGaPHaMkaPIaPJaPJaPJaPJaPJaPJaPJaPJaPKaPJaPLaPMaPNaPOaPPaPQaPRaPSaPTaPJaPUaPJaPVaPWaPXaPWaPWaPWaPWaPWaPWaPYaPZaRsaQbaQbaQbaQcaQbaQbaBkaQeaQfaQgaKZaQhaMCaQiaQjaQkaLfaQlaQmaQnaQnaQnaQnaQnaQoaQpaOfaQraQnaQnaQsaQtaLfaJHaIgaQuaONaONaQvaONaQwaIgaGFaGFaGFaGFaGFaGFaBwaGFaIoaIoaJVaIoaBtaQzaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaLyaDJaDKaDJaDJaDLaDMaDJaDJaDKaLzaNgaBIaNhaLEaNiaNjaNjaNkaNjaNlaIAaNmaNnaLJaNoaNpaNqaNraNsaNtaNraNuaNraNraNraNvaNraNraNwaNxaNyaNzaNAaNBaNzaNCaNzaNzaNzaNzaNDaNEaNFaNGaNraNHaNIaNJaNKaNLaNMaNLaNNaNOaNPaNQaNQaNRaNSaNTaNSaNUaNVaNWaEGaNYaNZaOaaObaOcaMkaMkaMkaOdaOeaMgaMfaOhaOiaOjaOkaOlaOmaOnaJlaOoaCLaCDaOraOtaOtaOuaOvaOwaOxaKZaOyaOzaOAaOAaOBaLfaOCaODaOEaOEaOEaOEaOFaOGaCtaOIaOJaOKaOKaOLaOMaLfaJHaIgaONaOOaOPaOQaONaONaIgaORaOSaGFaOTaOUaOVaOWaGFaIoaIoaJVaIoaGGaGGaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOXaOYaOZaPaaPaaPaaPaaPbaOYaOXaaaaBIaPcaPdaPeaMraMqaPhaPhaPiaIAaPjaNnaPkaPlaPmaPnaPoaPpaPqaPqaPraPsaPsaPsaPtaPuaPuaPvaPwaNIaPqaPqaPxaPyaPzaPAaPBaPBaPCaPBaPDaPyaPyaPyaPEaPFaPGaPHaMkaPIaPJaPJaPJaPJaPJaPJaPJaPJaPKaPJaPLaPMaPNaPOaPPaPQaPRaPSaPTaPJaPUaPJaPVaPWaPXaPWaPWaPWaPWaPWaPWaPYaPZaRsaQbaQbaQbaOsaQbaQbaBkaQeaQfaQgaKZaQhaMCaQiaQjaQkaLfaQlaQmaQnaQnaQnaQnaQnaQoaQpaOfaQraQnaQnaQsaQtaLfaJHaIgaQuaONaONaQvaONaQwaIgaGFaGFaGFaGFaGFaGFaBwaGFaIoaIoaJVaIoaBtaQzaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaafaBIawqaBIaQBaQCaGOaQDaQEaQFaQGaGOaQCaQHaQIaBIaQJaLEaPeaOgaQLaPhaPhaPiaIAaQMaNnaLJaQNaNpaQOaQPaNraNraQQaQRaQSaQTaNraQUaQVaQWaQVaQXaQYaQVaQVaQZaQVaQVaRaaRbaQVaRcaQVaRdaNraNraNraReaPFaPGaPHaMkaRfaMkaRgaRgaRgaRgaRgaRgaRgaRgaRhaRiaRgaRjaRgaRgaRkaRgaRgaRgaRgaRlaRmaRnaRoaRoaRoaRoaRoaRoaRoaRpaRqaRpaJlaImawOawOawOawOawOaItaRuaRvaRwaKZaKZaKZaKZaKZatUaLfaRyaQmaQnaRzaRAaRBaPfaRDaREaRFaQraRGaRHaRIaRJaLfaJHaIgaRKaRKaRLaRMaRNaRNaROaIgaRPaRQaRRaGGaRSaRTaRUaRVaRVaRWaRXaGGaRYaGGaRZaRZaRZaSaaSbaScaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaGeaGgaGgaGiaGfaGhaSdaOYaLDaDPaHxaHxaSfaLDaOYaLDaHyaHAaHzaLEaSkaSlaSlaNkaSlaNlaIAaSmaNnaSnaIAaLKaLKasYaLKaLKaLKaLKaLKaLKaSpaSqaLKaLKaLKaLKaLKaLKaSraSsaSraLKatraLKaNraQPaSuaSvaSwaSxaNraSyaLKaMbaMbaMkaSzaKOaSAaMnaMnaSBaSBaSBaSBaSCaJeasfasNarVarXarXavParXarXarVasNawFaJeaSJaSKaSKaSKaSKaSLaSLaSMaSNaRqaRpaJlaSOaSPaSPaSPaSPaSPaSPaSQaSRaSSaSTaSUaSVaSWaSXaSYaKZaKZasXaTaaTbaTcaTdaTeaTeaTeaTfaTgaTfaTeaTeaTeaTeaJHaIgaThaONaRLaRMaONaONaTiaIgaTjaTkaTlaGGaIoaTmaTnaToaTpaTqaIoaTraTsaGGaTtaTuaRZaTvaTwaTxaafaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDauSaNXavTavUavVaSgaSeaSiaShaSjaSiaTzaTyaTBaTAaTEaTCaTAaTFcozaTIaTJaTKaTLaTLaTLaTMaTLaTNaTOaIAavRaTQaTRaTSaTTaTUaTVaTWaTXaTUaTYaTZaUaaUbaUcaUdaUeaUfaUgaUhaUeaUiaLKaLKawLaLKaLKaLKaLKaUkawfaLKaUmaMbaUnaSzaKOaUoaaaaaaaaaaaaaaaaaaaaaaUpaUqaUraUsaUtaUvaUuaUxaUwaUzaUyaVUaUpaaaaaaaaaaaaaaaaaaaaaaUAaSNaRqaUBaUCaUDaUEaUFaUFaUFaUFaUGaUHaUIaUFaUFaUFaUJaUKaULaUMaUNaUOaUPaUQaURaUSaUTaTfaUUaUVaUWaUXaUYaUZaVaaVbaTeaJHaIgaVcaVcaRLaRMaVdaVdaVeaIgaIgavFaIgaGGaVgaVhaViaViaViaVjaVkaGGaGGaGGaVlaVmaVnaVoaVpaVqaafaafaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm
index d88a1b830e9..f1e51f645d2 100644
--- a/maps/exodus-2.dmm
+++ b/maps/exodus-2.dmm
@@ -1888,7 +1888,7 @@
"Kp" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/wizard_station)
"Kq" = (/obj/structure/flora/ausbushes/fullgrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/wizard_station)
"Kr" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station)
-"Ks" = (/mob/living/carbon/monkey{name = "Murphey"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station)
+"Ks" = (/mob/living/carbon/human/monkey{name = "Murphey"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station)
"Kt" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station)
"Ku" = (/obj/item/organ/xenos/plasmavessel,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"})
"Kv" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror/raider{pixel_x = -28; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"})
diff --git a/maps/exodus-5.dmm b/maps/exodus-5.dmm
index caf25f095ee..98aae309719 100644
--- a/maps/exodus-5.dmm
+++ b/maps/exodus-5.dmm
@@ -242,8 +242,8 @@
"eH" = (/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/plating,/area/outpost/research/disposal)
"eI" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
"eJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
-"eK" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/mob/living/carbon/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
-"eL" = (/obj/machinery/alarm{dir = 4; pixel_x = -25; pixel_y = 0},/mob/living/carbon/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
+"eK" = (/obj/machinery/door/window/westleft{dir = 4; name = "Monkey Pen"; req_access = list(47)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/mob/living/carbon/human/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
+"eL" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/mob/living/carbon/human/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
"eM" = (/obj/structure/table/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/latex,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/outpost/research/hallway)
"eN" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/research/hallway)
"eO" = (/turf/simulated/floor,/area/outpost/research/hallway)
@@ -273,8 +273,8 @@
"fm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
"fn" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/outpost/research/disposal)
"fo" = (/obj/structure/table/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/latex,/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/outpost/research/hallway)
-"fp" = (/obj/machinery/door/window/westleft{dir = 4; name = "Monkey Pen"; req_access = list(47)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/mob/living/carbon/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
-"fq" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/mob/living/carbon/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
+"fp" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/mob/living/carbon/human/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
+"fq" = (/obj/machinery/alarm{dir = 4; pixel_x = -25; pixel_y = 0},/mob/living/carbon/human/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
"fr" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/outpost/research/hallway)
"fs" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/outpost/research/hallway)
"ft" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/research/hallway)
@@ -1659,8 +1659,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaecocqcpcrabababababababababababababababababababababababababababababababababababababababababababababababababababababalaaaaaaexexexexexexexcscwcxcyctctcucvctcycFcEcDcCcBcAczcMcMcLcKcJcIcHcGcOkrcNazalalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaefxemelekcrababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaexexexexexexexejcwdAdBdCeheidFdGdYaGeadZaGebedecdOdNdPaGdVdUaidWdWdWdWeeefegalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaedLdKdMcrdJdIcrcrcrcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaexexexexexexexdHcwdAdBdCdDdEdFdGdyaGdxdwaGdzbbbbbbbbdsaGlyduaidtdodpdmdndqdrdqdqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaacacacacacaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaegzfefEfHfGfFafbCeYcrfbfacrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaexexexexexexexaifkflfjdCfhfidFfgfvaGfzfwfsfrfuftfoaGfqfpfmeRaifnfAfBfCfDdqalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaacacacacacaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefcfdfeffeUeTeWeVeYeXfaeZfbcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaeAereseyezeresevewepeqeneneneoeoeoeoeoeSeReQePeOeNeMaGeLeKeJeIaieHeFeGeDeEeCaGaGeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaegzfefEfHfGfFafbCeYcrfbfacrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaexexexexexexexaifkflfjdCfhfidFfgfvaGfzfwfsfrfuftfoaGeLeKfmeRaifnfAfBfCfDdqalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaacacacacacaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefcfdfeffeUeTeWeVeYeXfaeZfbcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaeAereseyezeresevewepeqeneneneoeoeoeoeoeSeReQePeOeNeMaGfqfpeJeIaieHeFeGeDeEeCaGaGeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahSfchbfcfEfEdJheeUcrekhdcrfahccrabababababababababababababababababababababababababababababababababababababababababababababababdXaaaaaaaaaagMgPgQgNgOgTgQgRgSgWgXgUgVhaeogYgZgweogxeRgBgAgDgCgEaGgGgFgIgHaiaigJaiaiaieReRgKeBeBeBeBgLeBeBeBeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaegugvfEgsgtfEcpgqeTgrgpgocrcrcrcrcrcrababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaagngbgcgcgcgcgdgegfggghgigjgkeoglgmfVfUfTeIfXfWeReRfYfweReReJeIgafZfKfLfIlzeReRfMeBfOfPeBfNfRfSfQeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeiCiBhRfEgtiDffiGeUiFcriIiHcrhOhKbCiEcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaagngQgQgQhWgQhVhUgQibgXhZiahYeogmhXihigijiiidicifieilieimieikieieieirisitiuinioipiqixiyiziAivhAiweBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa