diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
index 1c338c233ea..815f139286c 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
@@ -652,7 +652,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/mob/living/carbon/monkey{
+/mob/living/carbon/human/species/monkey{
faction = list("neutral","Syndicate")
},
/turf/open/floor/plasteel/dark,
@@ -991,7 +991,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/mob/living/carbon/monkey{
+/mob/living/carbon/human/species/monkey{
faction = list("neutral","Syndicate")
},
/turf/open/floor/plasteel/dark,
@@ -2240,7 +2240,7 @@
/area/ruin/unpowered/syndicate_lava_base/cargo)
"hp" = (
/obj/effect/decal/cleanable/dirt,
-/mob/living/carbon/monkey{
+/mob/living/carbon/human/species/monkey{
faction = list("neutral","Syndicate")
},
/turf/open/floor/plasteel/white/side{
@@ -2257,7 +2257,7 @@
},
/area/ruin/unpowered/syndicate_lava_base/virology)
"hr" = (
-/mob/living/carbon/monkey{
+/mob/living/carbon/human/species/monkey{
faction = list("neutral","Syndicate")
},
/turf/open/floor/plasteel/white/side{
@@ -2395,7 +2395,7 @@
/turf/open/floor/mineral/plastitanium,
/area/ruin/unpowered/syndicate_lava_base/cargo)
"hE" = (
-/mob/living/carbon/monkey{
+/mob/living/carbon/human/species/monkey{
faction = list("neutral","Syndicate")
},
/turf/open/floor/plasteel/white/side{
@@ -2412,7 +2412,7 @@
/area/ruin/unpowered/syndicate_lava_base/virology)
"hG" = (
/obj/effect/decal/cleanable/dirt,
-/mob/living/carbon/monkey{
+/mob/living/carbon/human/species/monkey{
faction = list("neutral","Syndicate")
},
/turf/open/floor/plasteel/white/side{
diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm
index a0cba545286..4d617eb6230 100644
--- a/_maps/RandomZLevels/research.dmm
+++ b/_maps/RandomZLevels/research.dmm
@@ -1119,7 +1119,7 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
"cU" = (
@@ -1279,7 +1279,7 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
"dj" = (
@@ -3699,7 +3699,7 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
"hX" = (
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 5e08e07798c..355bc5dbb7d 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -26532,7 +26532,7 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
-/mob/living/carbon/monkey/punpun,
+/mob/living/carbon/human/species/monkey/punpun,
/turf/open/floor/plasteel,
/area/crew_quarters/kitchen)
"bff" = (
@@ -83762,7 +83762,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 9
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel/dark,
/area/science/genetics)
"djC" = (
@@ -83786,7 +83786,7 @@
/obj/effect/turf_decal/stripes/end{
dir = 4
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel/dark,
/area/science/genetics)
"djD" = (
@@ -84685,7 +84685,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel/dark,
/area/science/genetics)
"dlp" = (
@@ -85072,7 +85072,7 @@
layer = 2.9
},
/obj/effect/turf_decal/stripes/end,
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel/dark,
/area/science/genetics)
"dmC" = (
@@ -100811,7 +100811,7 @@
/obj/effect/turf_decal/tile/green{
dir = 8
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel/white,
/area/medical/virology)
"dVE" = (
@@ -100858,7 +100858,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 8
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel/white,
/area/medical/virology)
"dVH" = (
@@ -101182,7 +101182,7 @@
/obj/structure/bed/roller,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/bot,
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/medical/virology)
"dWy" = (
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index e7dfe9d33d6..f4510d42a33 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -19393,7 +19393,7 @@
/obj/effect/turf_decal/tile/bar{
dir = 1
},
-/mob/living/carbon/monkey/punpun,
+/mob/living/carbon/human/species/monkey/punpun,
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"aSG" = (
@@ -38559,7 +38559,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
dir = 6
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/medical/virology)
"bQK" = (
@@ -48362,7 +48362,7 @@
/obj/effect/turf_decal/tile/green{
dir = 4
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/medical/virology)
"cKZ" = (
@@ -48923,7 +48923,7 @@
pixel_y = 2;
req_access_txt = "9"
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/engine,
/area/science/genetics)
"ddD" = (
@@ -49279,7 +49279,7 @@
/obj/effect/turf_decal/tile/green{
dir = 4
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/medical/virology)
"dUO" = (
@@ -49290,7 +49290,7 @@
/obj/structure/window/reinforced{
dir = 1
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/engine,
/area/science/genetics)
"dYq" = (
@@ -49374,7 +49374,7 @@
/obj/effect/turf_decal/tile/green{
dir = 8
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/medical/virology)
"emq" = (
@@ -54109,7 +54109,7 @@
req_access_txt = "9"
},
/obj/machinery/light,
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/engine,
/area/science/genetics)
"qrU" = (
@@ -56824,7 +56824,7 @@
/obj/effect/turf_decal/tile/green{
dir = 1
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/medical/virology)
"xUi" = (
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index c9615f74513..7cee1978634 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -30478,7 +30478,7 @@
/area/science/xenobiology)
"aXb" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"aXc" = (
@@ -31066,7 +31066,7 @@
/obj/effect/turf_decal/box/corners{
dir = 4
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"aXV" = (
@@ -34807,7 +34807,7 @@
dir = 8
},
/obj/structure/flora/ausbushes/grassybush,
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"bdB" = (
@@ -35037,7 +35037,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
dir = 4
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"bdT" = (
@@ -38263,7 +38263,7 @@
/obj/item/food/grown/banana,
/obj/structure/flora/ausbushes/ywflowers,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/medical/virology)
"biE" = (
@@ -40223,7 +40223,7 @@
name = "medical camera";
network = list("ss13","medical")
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/medical/virology)
"blC" = (
@@ -41656,7 +41656,7 @@
/obj/machinery/light{
dir = 4
},
-/mob/living/carbon/monkey{
+/mob/living/carbon/human/species/monkey{
name = "mankey"
},
/turf/open/floor/grass,
@@ -42413,7 +42413,7 @@
/obj/structure/flora/grass/jungle,
/obj/structure/flora/ausbushes/fernybush,
/obj/structure/disposalpipe/segment,
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/medical/virology)
"bpb" = (
@@ -45441,7 +45441,7 @@
dir = 8;
pixel_x = 24
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/medical/virology)
"btw" = (
@@ -80856,7 +80856,7 @@
pixel_y = 24;
req_access_txt = "25"
},
-/mob/living/carbon/monkey/punpun,
+/mob/living/carbon/human/species/monkey/punpun,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/bar)
"cAl" = (
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 87d2a99fdea..aad2b54d2ce 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -1243,7 +1243,7 @@
/obj/machinery/airalarm{
pixel_y = 22
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/medical/virology)
"acX" = (
@@ -1393,7 +1393,7 @@
/area/security/prison)
"adv" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/medical/virology)
"adw" = (
@@ -1441,7 +1441,7 @@
/area/security/prison)
"adB" = (
/obj/structure/cable,
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/medical/virology)
"adC" = (
@@ -45483,7 +45483,7 @@
/area/bridge/showroom/corporate)
"chx" = (
/obj/structure/flora/ausbushes/brflowers,
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"chy" = (
@@ -50884,7 +50884,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"cuu" = (
@@ -64880,7 +64880,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
dir = 8
},
-/mob/living/carbon/monkey/punpun,
+/mob/living/carbon/human/species/monkey/punpun,
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"enV" = (
@@ -68641,7 +68641,7 @@
/turf/open/floor/plating,
/area/maintenance/aft)
"jwJ" = (
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/medical/virology)
"jwW" = (
@@ -75953,7 +75953,7 @@
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"sRB" = (
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"sSr" = (
diff --git a/_maps/shuttles/emergency_nature.dmm b/_maps/shuttles/emergency_nature.dmm
index 4f1bcae2999..51d16d6ffec 100644
--- a/_maps/shuttles/emergency_nature.dmm
+++ b/_maps/shuttles/emergency_nature.dmm
@@ -287,7 +287,7 @@
/turf/open/floor/grass,
/area/shuttle/escape)
"it" = (
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/obj/structure/flora/grass/jungle/b{
icon_state = "bushb3"
},
@@ -428,7 +428,7 @@
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"mq" = (
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/obj/machinery/light/floor,
/obj/structure/flora/ausbushes/sparsegrass,
/turf/open/floor/grass,
@@ -926,7 +926,7 @@
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"Ia" = (
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/obj/structure/flora/ausbushes/sparsegrass,
/turf/open/floor/grass,
/area/shuttle/escape)
@@ -1243,11 +1243,11 @@
/obj/effect/turf_decal/weather/dirt{
dir = 1
},
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/shuttle/escape)
"Vv" = (
-/mob/living/carbon/monkey,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/shuttle/escape)
"VI" = (
diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index c07dabafaf2..a8104a98f8a 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -91,22 +91,6 @@
#define DNA_MUTATION_BLOCKS 8
#define DNA_UNIQUE_ENZYMES_LEN 32
-//Transformation proc stuff
-#define TR_KEEPITEMS (1<<0)
-#define TR_KEEPVIRUS (1<<1)
-#define TR_KEEPDAMAGE (1<<2)
-/// hashing names (e.g. monkey(e34f)) (only in monkeyize)
-#define TR_HASHNAME (1<<3)
-#define TR_KEEPIMPLANTS (1<<4)
-/// changelings shouldn't edit the DNA's SE when turning into a monkey
-#define TR_KEEPSE (1<<5)
-#define TR_DEFAULTMSG (1<<6)
-#define TR_KEEPORGANS (1<<8)
-#define TR_KEEPSTUNS (1<<9)
-#define TR_KEEPREAGENTS (1<<10)
-#define TR_KEEPSTAMINADAMAGE (1<<11)
-#define TR_KEEPAI (1<<12)
-
//species traits for mutantraces
#define MUTCOLORS 1
#define HAIR 2
@@ -129,7 +113,6 @@
#define AGENDER 16
/// Do not draw eyes or eyeless overlay
#define NOEYESPRITES 17
-
/// Used for determining which wounds are applicable to this species.
/// if we have flesh (can suffer slash/piercing/burn wounds, requires they don't have NOBLOOD)
#define HAS_FLESH 18
@@ -137,7 +120,10 @@
#define HAS_BONE 19
///If we have a limb-specific overlay sprite
#define HAS_MARKINGS 20
-
+/// Do not draw blood overlay
+#define NOBLOODOVERLAY 21
+///No augments, for monkeys in specific because they will turn into fucking freakazoids https://cdn.discordapp.com/attachments/326831214667235328/791313258912153640/102707682-fa7cad80-4294-11eb-8f13-8c689468aeb0.png
+#define NOAUGMENTS 22
//organ slots
#define ORGAN_SLOT_BRAIN "brain"
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index aa156cf17a1..ab92c6aa16e 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -973,6 +973,8 @@
#define COMSIG_MOB_ITEM_ATTACK_QDELETED "mob_item_attack_qdeleted"
///from base of mob/RangedAttack(): (atom/A, params)
#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged"
+///From base of atom/ctrl_click(): (atom/A)
+#define COMSIG_MOB_CTRL_CLICKED "mob_ctrl_clicked"
///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity)
#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack"
///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity)
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 31df34720c6..5089fa5fac8 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -71,9 +71,9 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isethereal(A) (is_species(A, /datum/species/ethereal))
#define isvampire(A) (is_species(A,/datum/species/vampire))
#define isdullahan(A) (is_species(A, /datum/species/dullahan))
+#define ismonkey(A) (is_species(A, /datum/species/monkey))
//more carbon mobs
-#define ismonkey(A) (istype(A, /mob/living/carbon/monkey))
#define isalien(A) (istype(A, /mob/living/carbon/alien))
diff --git a/code/__DEFINES/monkeys.dm b/code/__DEFINES/monkeys.dm
index dba8e80c6e8..76b0820da37 100644
--- a/code/__DEFINES/monkeys.dm
+++ b/code/__DEFINES/monkeys.dm
@@ -1,7 +1,7 @@
//Monkey defines, placed here so they can be read by other things!
/// below this health value the monkey starts to flee from enemies
-#define MONKEY_FLEE_HEALTH 50
+#define MONKEY_FLEE_HEALTH 40
/// how close an enemy must be to trigger aggression
#define MONKEY_ENEMY_VISION 9
/// how close an enemy must be before it triggers flee
@@ -21,7 +21,7 @@
/// probability that monkey will get into mischief, i.e. finding/stealing items
#define MONKEY_SHENANIGAN_PROB 20
/// probability that monkey will disarm an armed attacker
-#define MONKEY_ATTACK_DISARM_PROB 50
+#define MONKEY_ATTACK_DISARM_PROB 20
/// probability that monkey will get recruited when friend is attacked
#define MONKEY_RECRUIT_PROB 25
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 9625b0ca24c..dc8e2a42bcf 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -35,6 +35,7 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings, GLOB.moth_wings_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_antennae, GLOB.moth_antennae_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, GLOB.moth_markings_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey, GLOB.tails_list_monkey)
*/
//SKYRAT EDIT REMOVAL END
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 784e9df4c99..6ea04b8ed1f 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -80,7 +80,7 @@
if(!GLOB.moth_markings_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, GLOB.moth_markings_list)
//For now we will always return none for tail_human and ears.
- return(list("mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),"ethcolor" = GLOB.color_list_ethereal[pick(GLOB.color_list_ethereal)], "tail_lizard" = pick(GLOB.tails_list_lizard), "tail_human" = "None", "wings" = "None", "snout" = pick(GLOB.snouts_list), "horns" = pick(GLOB.horns_list), "ears" = "None", "frills" = pick(GLOB.frills_list), "spines" = pick(GLOB.spines_list), "body_markings" = pick(GLOB.body_markings_list), "legs" = "Normal Legs", "caps" = pick(GLOB.caps_list), "moth_wings" = pick(GLOB.moth_wings_list), "moth_antennae" = pick(GLOB.moth_antennae_list), "moth_markings" = pick(GLOB.moth_markings_list)))
+ return(list("mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),"ethcolor" = GLOB.color_list_ethereal[pick(GLOB.color_list_ethereal)], "tail_lizard" = pick(GLOB.tails_list_lizard), "tail_human" = "None", "wings" = "None", "snout" = pick(GLOB.snouts_list), "horns" = pick(GLOB.horns_list), "ears" = "None", "frills" = pick(GLOB.frills_list), "spines" = pick(GLOB.spines_list), "body_markings" = pick(GLOB.body_markings_list), "legs" = "Normal Legs", "caps" = pick(GLOB.caps_list), "moth_wings" = pick(GLOB.moth_wings_list), "moth_antennae" = pick(GLOB.moth_antennae_list), "moth_markings" = pick(GLOB.moth_markings_list), "tail_monkey" = "None"))
*/
//SKYRAT EDIT REMOVAL END
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 0ab003422bf..8618c721acb 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -286,8 +286,6 @@ Turf and target are separate in case you want to teleport some distance from a t
moblist.Add(M)
for(var/mob/dead/new_player/M in sortmob)
moblist.Add(M)
- for(var/mob/living/carbon/monkey/M in sortmob)
- moblist.Add(M)
for(var/mob/living/simple_animal/slime/M in sortmob)
moblist.Add(M)
for(var/mob/living/simple_animal/M in sortmob)
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index dde4bece3b7..0a104dd3101 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -40,6 +40,7 @@ GLOBAL_LIST_EMPTY(moth_wings_list)
GLOBAL_LIST_EMPTY(moth_antennae_list)
GLOBAL_LIST_EMPTY(moth_markings_list)
GLOBAL_LIST_EMPTY(caps_list)
+GLOBAL_LIST_EMPTY(tails_list_monkey)
*/
//SKYRAT EDIT REMOVAL END
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 9bb8ae07cde..9fdfa8bd1f2 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -316,6 +316,7 @@
/atom/proc/CtrlClick(mob/user)
SEND_SIGNAL(src, COMSIG_CLICK_CTRL, user)
+ SEND_SIGNAL(user, COMSIG_MOB_CTRL_CLICKED, src)
var/mob/living/ML = user
if(istype(ML))
ML.pulled(src)
diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm
deleted file mode 100644
index 5e945a363bf..00000000000
--- a/code/_onclick/hud/monkey.dm
+++ /dev/null
@@ -1,169 +0,0 @@
-/datum/hud/monkey/New(mob/living/carbon/monkey/owner)
- ..()
- var/atom/movable/screen/using
- var/atom/movable/screen/inventory/inv_box
-
- action_intent = new /atom/movable/screen/act_intent()
- action_intent.icon = ui_style
- action_intent.icon_state = mymob.a_intent
- action_intent.screen_loc = ui_acti
- action_intent.hud = src
- static_inventory += action_intent
-
- using = new /atom/movable/screen/mov_intent()
- using.icon = ui_style
- using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking")
- using.screen_loc = ui_movi
- using.hud = src
- static_inventory += using
-
- using = new/atom/movable/screen/language_menu
- using.icon = ui_style
- using.hud = src
- static_inventory += using
-
- using = new /atom/movable/screen/drop()
- using.icon = ui_style
- using.screen_loc = ui_drop_throw
- using.hud = src
- static_inventory += using
-
- build_hand_slots()
-
- using = new /atom/movable/screen/swap_hand()
- using.icon = ui_style
- using.icon_state = "swap_1_m" //extra wide!
- using.screen_loc = ui_swaphand_position(owner,1)
- using.hud = src
- static_inventory += using
-
- using = new /atom/movable/screen/swap_hand()
- using.icon = ui_style
- using.icon_state = "swap_2"
- using.screen_loc = ui_swaphand_position(owner,2)
- using.hud = src
- static_inventory += using
-
- inv_box = new /atom/movable/screen/inventory()
- inv_box.name = "mask"
- inv_box.icon = ui_style
- inv_box.icon_state = "mask"
-// inv_box.icon_full = "template"
- inv_box.screen_loc = ui_monkey_mask
- inv_box.slot_id = ITEM_SLOT_MASK
- inv_box.hud = src
- static_inventory += inv_box
-
- inv_box = new /atom/movable/screen/inventory()
- inv_box.name = "neck"
- inv_box.icon = ui_style
- inv_box.icon_state = "neck"
-// inv_box.icon_full = "template"
- inv_box.screen_loc = ui_monkey_neck
- inv_box.slot_id = ITEM_SLOT_NECK
- inv_box.hud = src
- static_inventory += inv_box
-
- inv_box = new /atom/movable/screen/inventory()
- inv_box.name = "head"
- inv_box.icon = ui_style
- inv_box.icon_state = "head"
-// inv_box.icon_full = "template"
- inv_box.screen_loc = ui_monkey_head
- inv_box.slot_id = ITEM_SLOT_HEAD
- inv_box.hud = src
- static_inventory += inv_box
-
- inv_box = new /atom/movable/screen/inventory()
- inv_box.name = "back"
- inv_box.icon = ui_style
- inv_box.icon_state = "back"
- inv_box.screen_loc = ui_monkey_back
- inv_box.slot_id = ITEM_SLOT_BACK
- inv_box.hud = src
- static_inventory += inv_box
-
- throw_icon = new /atom/movable/screen/throw_catch()
- throw_icon.icon = ui_style
- throw_icon.screen_loc = ui_drop_throw
- throw_icon.hud = src
- hotkeybuttons += throw_icon
-
- internals = new /atom/movable/screen/internals()
- internals.hud = src
- infodisplay += internals
-
- healths = new /atom/movable/screen/healths()
- healths.hud = src
- infodisplay += healths
-
- pull_icon = new /atom/movable/screen/pull()
- pull_icon.icon = ui_style
- pull_icon.update_icon()
- pull_icon.screen_loc = ui_above_movement
- pull_icon.hud = src
- static_inventory += pull_icon
-
- lingchemdisplay = new /atom/movable/screen/ling/chems()
- lingchemdisplay.hud = src
- infodisplay += lingchemdisplay
-
- lingstingdisplay = new /atom/movable/screen/ling/sting()
- lingstingdisplay.hud = src
- infodisplay += lingstingdisplay
-
-
- zone_select = new /atom/movable/screen/zone_sel()
- zone_select.icon = ui_style
- zone_select.hud = src
- zone_select.update_icon()
- static_inventory += zone_select
-
- mymob.client.screen = list()
-
- using = new /atom/movable/screen/resist()
- using.icon = ui_style
- using.screen_loc = ui_above_intent
- using.hud = src
- hotkeybuttons += using
-
- for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory))
- if(inv.slot_id)
- inv.hud = src
- inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv
- inv.update_icon()
-
-/datum/hud/monkey/persistent_inventory_update()
- if(!mymob)
- return
- var/mob/living/carbon/monkey/M = mymob
-
- if(hud_shown)
- if(M.back)
- M.back.screen_loc = ui_monkey_back
- M.client.screen += M.back
- if(M.wear_mask)
- M.wear_mask.screen_loc = ui_monkey_mask
- M.client.screen += M.wear_mask
- if(M.wear_neck)
- M.wear_neck.screen_loc = ui_monkey_neck
- M.client.screen += M.wear_neck
- if(M.head)
- M.head.screen_loc = ui_monkey_head
- M.client.screen += M.head
- else
- if(M.back)
- M.back.screen_loc = null
- if(M.wear_mask)
- M.wear_mask.screen_loc = null
- if(M.head)
- M.head.screen_loc = null
-
- if(hud_version != HUD_STYLE_NOHUD)
- for(var/obj/item/I in M.held_items)
- I.screen_loc = ui_hand_position(M.get_held_index_of_item(I))
- M.client.screen += I
- else
- for(var/obj/item/I in M.held_items)
- I.screen_loc = null
- M.client.screen -= I
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 564cea000dd..148fce2c4c7 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -28,6 +28,9 @@
if(SEND_SIGNAL(src, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, A, proximity) & COMPONENT_CANCEL_ATTACK_CHAIN)
return
SEND_SIGNAL(src, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, A, proximity)
+
+ if(dna?.species?.spec_unarmedattack(src, A)) //Because species like monkeys dont use attack hand
+ return
A.attack_hand(src)
/// Return TRUE to cancel other attack hand effects that respect it.
@@ -104,40 +107,7 @@
/atom/proc/attack_animal(mob/user)
SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_ANIMAL, user)
-
-/*
- Monkeys
-*/
-/mob/living/carbon/monkey/UnarmedAttack(atom/A)
- if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED))
- if(a_intent != INTENT_HARM || is_muzzled())
- return
- if(!iscarbon(A))
- return
- var/mob/living/carbon/victim = A
- var/obj/item/bodypart/affecting = null
- if(ishuman(victim))
- var/mob/living/carbon/human/human_victim = victim
- affecting = human_victim.get_bodypart(pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
- var/armor = victim.run_armor_check(affecting, MELEE)
- if(prob(25))
- victim.visible_message("[src]'s bite misses [victim]!",
- "You avoid [src]'s bite!", "You hear jaws snapping shut!", COMBAT_MESSAGE_RANGE, src)
- to_chat(src, "Your bite misses [victim]!")
- return
- victim.apply_damage(rand(1, 3), BRUTE, affecting, armor)
- victim.visible_message("[name] bites [victim]!",
- "[name] bites you!", "You hear a chomp!", COMBAT_MESSAGE_RANGE, name)
- to_chat(name, "You bite [victim]!")
- if(armor >= 2)
- return
- for(var/d in diseases)
- var/datum/disease/bite_infection = d
- victim.ForceContractDisease(bite_infection)
- return
- A.attack_paw(src)
-
-
+///Attacked by monkey
/atom/proc/attack_paw(mob/user)
if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_PAW, user) & COMPONENT_CANCEL_ATTACK_CHAIN)
return TRUE
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index 8e99bf34c53..13d73d08298 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -269,8 +269,6 @@
movedelay_type = /mob/living/carbon/human
/datum/config_entry/number/outdated_movedelay/robot_delay
movedelay_type = /mob/living/silicon/robot
-/datum/config_entry/number/outdated_movedelay/monkey_delay
- movedelay_type = /mob/living/carbon/monkey
/datum/config_entry/number/outdated_movedelay/alien_delay
movedelay_type = /mob/living/carbon/alien
/datum/config_entry/number/outdated_movedelay/slime_delay
diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm
index cc0fade0195..c31cb7cd0d7 100644
--- a/code/datums/ai/_ai_controller.dm
+++ b/code/datums/ai/_ai_controller.dm
@@ -77,6 +77,8 @@ have ways of interacting with a specific atom and control it. They posses a blac
/// Generates a plan and see if our existing one is still valid.
/datum/ai_controller/process(delta_time)
if(!able_to_run())
+ var/atom/movable/movable_pawn = pawn
+ walk(movable_pawn, 0) //stop moving
return //this should remove them from processing in the future through event-based stuff.
if(!current_behaviors?.len)
SelectBehaviors(delta_time)
@@ -101,10 +103,13 @@ have ways of interacting with a specific atom and control it. They posses a blac
///Move somewhere using dumb movement (byond base)
/datum/ai_controller/proc/MoveTo(delta_time)
var/current_loc = get_turf(pawn)
+ var/atom/movable/movable_pawn = pawn
- if(!is_type_in_typecache(get_step(pawn, get_dir(pawn, current_movement_target)), GLOB.dangerous_turfs))
- step_towards(pawn, current_movement_target)
- if(current_loc == get_turf(pawn))
+ var/turf/target_turf = get_step_towards(movable_pawn, current_movement_target)
+
+ if(!is_type_in_typecache(target_turf, GLOB.dangerous_turfs))
+ movable_pawn.Move(target_turf, get_dir(current_loc, target_turf))
+ if(current_loc == get_turf(movable_pawn))
if(++pathing_attempts >= MAX_PATHING_ATTEMPTS)
CancelActions()
pathing_attempts = 0
diff --git a/code/datums/ai/monkey/monkey_behaviors.dm b/code/datums/ai/monkey/monkey_behaviors.dm
index 47994f02344..d052aa0f7de 100644
--- a/code/datums/ai/monkey/monkey_behaviors.dm
+++ b/code/datums/ai/monkey/monkey_behaviors.dm
@@ -156,6 +156,8 @@
/datum/ai_behavior/monkey_attack_mob/finish_action(datum/ai_controller/controller, succeeded)
. = ..()
+ var/mob/living/living_pawn = controller.pawn
+ walk(living_pawn, 0)
controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = null
/// attack using a held weapon otherwise bite the enemy, then if we are angry there is a chance we might calm down a little
@@ -176,8 +178,7 @@
if(weapon)
weapon.melee_attack_chain(living_pawn, target)
else
- target.attack_paw(living_pawn)
-
+ living_pawn.UnarmedAttack(target)
// no de-aggro
if(controller.blackboard[BB_MONKEY_AGRESSIVE])
return
diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm
index 1534a094477..c1000111c77 100644
--- a/code/datums/ai/monkey/monkey_controller.dm
+++ b/code/datums/ai/monkey/monkey_controller.dm
@@ -134,7 +134,8 @@ have ways of interacting with a specific mob and control it.
var/mob/living/living_pawn = pawn
if(DT_PROB(25, delta_time) && (living_pawn.mobility_flags & MOBILITY_MOVE) && isturf(living_pawn.loc) && !living_pawn.pulledby)
- step(living_pawn, pick(GLOB.cardinals))
+ var/move_dir = pick(GLOB.alldirs)
+ living_pawn.Move(get_step(living_pawn, move_dir), move_dir)
else if(DT_PROB(5, delta_time))
INVOKE_ASYNC(living_pawn, /mob.proc/emote, pick("screech"))
else if(DT_PROB(1, delta_time))
diff --git a/code/datums/components/bloodysoles.dm b/code/datums/components/bloodysoles.dm
index e16aaa60252..d1a758f2019 100644
--- a/code/datums/components/bloodysoles.dm
+++ b/code/datums/components/bloodysoles.dm
@@ -237,19 +237,17 @@
/datum/component/bloodysoles/feet/update_icon()
if(ishuman(wielder))
- // Monkeys get no bloody feet :(
+ var/mob/living/carbon/human/human = wielder
+ if(NOBLOODOVERLAY in human.dna.species.species_traits)
+ return
if(bloody_shoes[BLOOD_STATE_HUMAN] > 0 && !is_obscured())
- wielder.remove_overlay(SHOES_LAYER)
- wielder.overlays_standing[SHOES_LAYER] = bloody_feet
- wielder.apply_overlay(SHOES_LAYER)
+ human.remove_overlay(SHOES_LAYER)
+ human.overlays_standing[SHOES_LAYER] = bloody_feet
+ human.apply_overlay(SHOES_LAYER)
else
- wielder.update_inv_shoes()
+ human.update_inv_shoes()
/datum/component/bloodysoles/feet/add_parent_to_footprint(obj/effect/decal/cleanable/blood/footprints/FP)
- if(ismonkey(wielder))
- FP.species_types |= "monkey"
- return
-
if(!ishuman(wielder))
FP.species_types |= "unknown"
return
diff --git a/code/datums/components/creamed.dm b/code/datums/components/creamed.dm
index 147c1055f20..31b6e4fcdf6 100644
--- a/code/datums/components/creamed.dm
+++ b/code/datums/components/creamed.dm
@@ -1,6 +1,5 @@
GLOBAL_LIST_INIT(creamable, typecacheof(list(
/mob/living/carbon/human,
- /mob/living/carbon/monkey,
/mob/living/simple_animal/pet/dog/corgi,
/mob/living/silicon/ai)))
@@ -26,11 +25,11 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list(
var/mob/living/carbon/human/H = parent
if(H.dna.species.limbs_id == "lizard")
creamface.icon_state = "creampie_lizard"
+ else if(H.dna.species.limbs_id == "monkey")
+ creamface.icon_state = "creampie_monkey"
else
creamface.icon_state = "creampie_human"
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "creampie", /datum/mood_event/creampie)
- else if(ismonkey(parent))
- creamface.icon_state = "creampie_monkey"
else if(iscorgi(parent))
creamface.icon_state = "creampie_corgi"
else if(isAI(parent))
diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index 5a0445c51e4..e028d799dbd 100644
--- a/code/datums/diseases/_MobProcs.dm
+++ b/code/datums/diseases/_MobProcs.dm
@@ -57,7 +57,17 @@
else
target_zone = check_zone(target_zone)
- if(ishuman(src))
+
+
+ if(ismonkey(src))
+ var/mob/living/carbon/human/M = src
+ switch(target_zone)
+ if(BODY_ZONE_HEAD)
+ if(M.wear_mask && isobj(M.wear_mask))
+ Cl = M.wear_mask
+ passed = prob((Cl.permeability_coefficient*100) - 1)
+
+ else if(ishuman(src))
var/mob/living/carbon/human/H = src
switch(target_zone)
@@ -95,14 +105,6 @@
Cl = H.shoes
passed = prob((Cl.permeability_coefficient*100) - 1)
- else if(ismonkey(src))
- var/mob/living/carbon/monkey/M = src
- switch(target_zone)
- if(BODY_ZONE_HEAD)
- if(M.wear_mask && isobj(M.wear_mask))
- Cl = M.wear_mask
- passed = prob((Cl.permeability_coefficient*100) - 1)
-
if(passed)
D.try_infect(src)
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index feb4a680019..11ebd65c299 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -23,7 +23,7 @@
agent = "advance microbes"
max_stages = 5
spread_text = "Unknown"
- viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ viable_mobtypes = list(/mob/living/carbon/human)
// NEW VARS
var/list/properties = list()
diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm
index f622d5ed419..d6bf55b8de7 100644
--- a/code/datums/diseases/anxiety.dm
+++ b/code/datums/diseases/anxiety.dm
@@ -7,7 +7,7 @@
cure_text = "Ethanol"
cures = list(/datum/reagent/consumable/ethanol)
agent = "Excess Lepidopticides"
- viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ viable_mobtypes = list(/mob/living/carbon/human)
desc = "If left untreated subject will regurgitate butterflies."
severity = DISEASE_SEVERITY_MINOR
diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm
index 0154bfc4479..e5cb6b63751 100644
--- a/code/datums/diseases/beesease.dm
+++ b/code/datums/diseases/beesease.dm
@@ -7,7 +7,7 @@
cure_text = "Sugar"
cures = list(/datum/reagent/consumable/sugar)
agent = "Apidae Infection"
- viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ viable_mobtypes = list(/mob/living/carbon/human)
desc = "If left untreated subject will regurgitate bees."
severity = DISEASE_SEVERITY_MEDIUM
infectable_biotypes = MOB_ORGANIC|MOB_UNDEAD //bees nesting in corpses
diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm
index 628ceeeb32f..0a6cd5b5231 100644
--- a/code/datums/diseases/cold.dm
+++ b/code/datums/diseases/cold.dm
@@ -4,7 +4,7 @@
cure_text = "Rest & Spaceacillin"
cures = list(/datum/reagent/medicine/spaceacillin)
agent = "XY-rhinovirus"
- viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.5
desc = "If left untreated the subject will contract the flu."
severity = DISEASE_SEVERITY_NONTHREAT
diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm
index 0ae4dd78ef6..935cc12648b 100644
--- a/code/datums/diseases/fake_gbs.dm
+++ b/code/datums/diseases/fake_gbs.dm
@@ -6,7 +6,7 @@
cure_text = "Synaptizine & Sulfur"
cures = list(/datum/reagent/medicine/synaptizine,/datum/reagent/sulfur)
agent = "Gravitokinetic Bipotential SADS-"
- viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ viable_mobtypes = list(/mob/living/carbon/human)
desc = "If left untreated death will occur."
severity = DISEASE_SEVERITY_BIOHAZARD
diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm
index c9a84c0f7dc..f834d1457be 100644
--- a/code/datums/diseases/flu.dm
+++ b/code/datums/diseases/flu.dm
@@ -6,7 +6,7 @@
cures = list(/datum/reagent/medicine/spaceacillin)
cure_chance = 10
agent = "H13N1 flu virion"
- viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
desc = "If left untreated the subject will feel quite unwell."
severity = DISEASE_SEVERITY_MINOR
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index d9c20a00af9..26c7296a9a6 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -5,7 +5,7 @@
spread_flags = DISEASE_SPREAD_SPECIAL
cure_text = "A coder's love (theoretical)."
agent = "Shenanigans"
- viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey, /mob/living/carbon/alien)
+ viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/alien)
severity = DISEASE_SEVERITY_BIOHAZARD
stage_prob = 10
visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC
@@ -103,7 +103,7 @@
cures = list(/datum/reagent/medicine/adminordrazine)
spread_text = "Monkey Bites"
spread_flags = DISEASE_SPREAD_SPECIAL
- viable_mobtypes = list(/mob/living/carbon/monkey, /mob/living/carbon/human)
+ viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 1
cure_chance = 1
disease_flags = CAN_CARRY|CAN_RESIST
@@ -112,7 +112,7 @@
stage_prob = 4
visibility_flags = NONE
agent = "Kongey Vibrion M-909"
- new_form = /mob/living/carbon/monkey
+ new_form = /mob/living/carbon/human/species/monkey
bantype = ROLE_MONKEY
@@ -126,9 +126,8 @@
/datum/disease/transformation/jungle_fever/do_disease_transformation(mob/living/carbon/affected_mob)
if(affected_mob.mind && !is_monkey(affected_mob.mind))
add_monkey(affected_mob.mind)
- if(ishuman(affected_mob))
- var/mob/living/carbon/monkey/M = affected_mob.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE)
- M.ventcrawler = VENTCRAWLER_ALWAYS
+ affected_mob.monkeyize()
+ affected_mob.ventcrawler = VENTCRAWLER_ALWAYS
/datum/disease/transformation/jungle_fever/stage_act()
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index b554b4141e6..a104b901d94 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -141,11 +141,7 @@
mutation_index.Cut()
default_mutation_genes.Cut()
shuffle_inplace(mutations_temp)
- if(ismonkey(holder))
- mutations |= new RACEMUT(MUT_NORMAL)
- mutation_index[RACEMUT] = GET_SEQUENCE(RACEMUT)
- else
- mutation_index[RACEMUT] = create_sequence(RACEMUT, FALSE)
+ mutation_index[RACEMUT] = create_sequence(RACEMUT, FALSE)
default_mutation_genes[RACEMUT] = mutation_index[RACEMUT]
for(var/i in 2 to DNA_MUTATION_BLOCKS)
var/datum/mutation/human/M = mutations_temp[i]
@@ -443,8 +439,7 @@
return
for(var/mutation in dna.mutation_index)
- if(ismob(dna.check_block(mutation)))
- return //we got monkeyized/humanized, this mob will be deleted, no need to continue.
+ dna.check_block(mutation)
update_mutations_overlay()
diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm
index 1a8cea0d210..9281ecc27eb 100644
--- a/code/datums/mutations/body.dm
+++ b/code/datums/mutations/body.dm
@@ -180,11 +180,11 @@
/datum/mutation/human/race/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
- . = owner.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE | TR_KEEPAI)
+ . = owner.monkeyize()
-/datum/mutation/human/race/on_losing(mob/living/carbon/monkey/owner)
- if(owner && istype(owner) && owner.stat != DEAD && (owner.dna.mutations.Remove(src)))
- . = owner.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE | TR_KEEPAI)
+/datum/mutation/human/race/on_losing(mob/living/carbon/human/owner)
+ if(owner && owner.stat != DEAD && (owner.dna.mutations.Remove(src)) && ismonkey(owner))
+ . = owner.humanize()
/datum/mutation/human/glow
name = "Glowy"
diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm
index da2f1d3df55..d32df4f0858 100644
--- a/code/datums/mutations/hulk.dm
+++ b/code/datums/mutations/hulk.dm
@@ -110,7 +110,7 @@
return
var/mob/living/carbon/possible_throwable = user.pulling
- if(!possible_throwable.getorganslot(ORGAN_SLOT_TAIL) && !ismonkey(possible_throwable))
+ if(!possible_throwable.getorganslot(ORGAN_SLOT_TAIL))
return
if(ishuman(possible_throwable))
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm
index 4ed58775d2b..c4767cc6829 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm
@@ -167,7 +167,7 @@
for(var/datum/mind/rev_mind in revolution.head_revolutionaries())
var/turf/T = get_turf(rev_mind.current)
if(!considered_afk(rev_mind) && considered_alive(rev_mind) && is_station_level(T.z))
- if(ishuman(rev_mind.current) || ismonkey(rev_mind.current))
+ if(ishuman(rev_mind.current))
return FALSE
return TRUE
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
index 82d741ce903..31045e13e2d 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
@@ -467,7 +467,7 @@
for(var/datum/mind/rev_mind in revolution.head_revolutionaries())
var/turf/T = get_turf(rev_mind.current)
if(!considered_afk(rev_mind) && considered_alive(rev_mind) && is_station_level(T.z))
- if(ishuman(rev_mind.current) || ismonkey(rev_mind.current))
+ if(ishuman(rev_mind.current))
return FALSE
return TRUE
@@ -618,7 +618,9 @@
if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME)
return FALSE
var/datum/disease/D = new /datum/disease/transformation/jungle_fever()
- for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list)
+ for(var/mob/living/carbon/human/M in GLOB.alive_mob_list)
+ if(!ismonkey(M))
+ continue
if (M.HasDisease(D))
if(M.onCentCom() || M.onSyndieBase())
escaped_monkeys++
diff --git a/code/game/gamemodes/monkey/monkey.dm b/code/game/gamemodes/monkey/monkey.dm
index 54b287cb8db..64fe5e325e3 100644
--- a/code/game/gamemodes/monkey/monkey.dm
+++ b/code/game/gamemodes/monkey/monkey.dm
@@ -79,7 +79,9 @@
if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME)
return FALSE
var/datum/disease/D = new /datum/disease/transformation/jungle_fever()
- for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list)
+ for(var/mob/living/carbon/human/M in GLOB.alive_mob_list)
+ if(!ismonkey(M))
+ return
if (M.HasDisease(D))
if(M.onCentCom() || M.onSyndieBase())
escaped_monkeys++
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index dd4a043dd1e..302fb1ba277 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -687,12 +687,13 @@ GLOBAL_LIST_EMPTY(possible_items_special)
var/captured_amount = 0
var/area/centcom/holding/A = GLOB.areas_by_type[/area/centcom/holding]
for(var/mob/living/carbon/human/M in A)//Humans.
+ if(ismonkey(M))
+ captured_amount+=0.1
+ continue
if(M.stat == DEAD)//Dead folks are worth less.
captured_amount+=0.5
continue
captured_amount+=1
- 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 == DEAD)
captured_amount+=0.5
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index bf5cdecbc86..0ce9dca060c 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -149,7 +149,7 @@
for(var/datum/mind/rev_mind in revolution.head_revolutionaries())
var/turf/T = get_turf(rev_mind.current)
if(!considered_afk(rev_mind) && considered_alive(rev_mind) && is_station_level(T.z))
- if(ishuman(rev_mind.current) || ismonkey(rev_mind.current))
+ if(ishuman(rev_mind.current))
return FALSE
return TRUE
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index 6a773a8af4a..6bd287263fa 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -95,7 +95,7 @@
else
if(sbed)
data["table"] = sbed
- if(!ishuman(sbed.occupant) && !ismonkey(sbed.occupant))
+ if(!ishuman(sbed.occupant))
return data
data["patient"] = list()
patient = sbed.occupant
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 815ba31ac8d..e940de683e0 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -360,9 +360,6 @@
L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
L.emote("scream")
L.Paralyze(100)
- else if(ismonkey(L)) //For monkeys
- L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
- L.Paralyze(100)
else //for simple_animals & borgs
L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
var/turf/location = get_turf(src)
diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm
index 6b7dbe527a2..4d1f6693ced 100644
--- a/code/game/machinery/telecomms/computers/logbrowser.dm
+++ b/code/game/machinery/telecomms/computers/logbrowser.dm
@@ -76,9 +76,6 @@
else if(ispath(mobtype, /mob/living/simple_animal/slime))
race = "Slime"
- else if(ispath(mobtype, /mob/living/carbon/monkey))
- race = "Monkey"
-
// sometimes M gets deleted prematurely for AIs... just check the job
else if(ispath(mobtype, /mob/living/silicon) || C.parameters["job"] == "AI")
race = "Artificial Life"
diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm
index 6f7498f477c..af437867f50 100644
--- a/code/game/objects/items/dna_injector.dm
+++ b/code/game/objects/items/dna_injector.dm
@@ -447,7 +447,7 @@
var/endtime = world.time+duration
for(var/mutation in remove_mutations)
if(mutation == RACEMUT)
- if(ishuman(M))
+ if(!ismonkey(M))
continue
M = M.dna.remove_mutation(mutation)
else
@@ -455,7 +455,7 @@
for(var/mutation in add_mutations)
if(M.dna.get_mutation(mutation))
continue //Skip permanent mutations we already have.
- if(mutation == RACEMUT && ishuman(M))
+ if(mutation == RACEMUT && !ismonkey(M))
message_admins("[ADMIN_LOOKUPFLW(user)] injected [key_name_admin(M)] with the [name] (MONKEY)")
log_msg += " (MONKEY)"
M = M.dna.add_mutation(mutation, MUT_OTHER, endtime)
diff --git a/code/game/objects/items/food/meat.dm b/code/game/objects/items/food/meat.dm
index dcc5d43a7e2..032c20a48ce 100644
--- a/code/game/objects/items/food/meat.dm
+++ b/code/game/objects/items/food/meat.dm
@@ -324,7 +324,7 @@
foodtypes = MEAT | SUGAR
w_class = WEIGHT_CLASS_TINY
var/faction
- var/spawned_mob = /mob/living/carbon/monkey
+ var/spawned_mob = /mob/living/carbon/human/species/monkey
/obj/item/food/monkeycube/proc/Expand()
var/mob/spammer = get_mob_by_key(fingerprintslast)
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index 2f706ca07c5..ec4899f4228 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -113,7 +113,7 @@
if(2)
if(scooldown < world.time)
if(M.health >= 0)
- if(ishuman(M)||ismonkey(M))
+ if(ishuman(M))
M.electrocute_act(5, "[user]", flags = SHOCK_NOGLOVES)
user.visible_message("[user] electrocutes [M] with [user.p_their()] touch!", \
"You electrocute [M] with your touch!")
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index 63b5a209cc0..68916c316f7 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -314,11 +314,6 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
if(!H.gloves && !HAS_TRAIT(H, TRAIT_PIERCEIMMUNE)) // golems, etc
to_chat(H, "[src] cuts into your hand!")
H.apply_damage(force*0.5, BRUTE, hit_hand)
- else if(ismonkey(user))
- var/mob/living/carbon/monkey/M = user
- if(!HAS_TRAIT(M, TRAIT_PIERCEIMMUNE))
- to_chat(M, "[src] cuts into your hand!")
- M.apply_damage(force*0.5, BRUTE, hit_hand)
/obj/item/shard/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/lightreplacer))
diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm
index e502cb2bf53..e7e60b9e0b0 100644
--- a/code/game/objects/items/storage/bags.dm
+++ b/code/game/objects/items/storage/bags.dm
@@ -346,7 +346,7 @@
else
playsound(M, 'sound/items/trayhit2.ogg', 50, TRUE)
- if(ishuman(M) || ismonkey(M))
+ if(ishuman(M))
if(prob(10))
M.Paralyze(40)
update_icon()
diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm
index 2472a9c8602..76c8b0d4fe4 100644
--- a/code/game/objects/structures/petrified_statue.dm
+++ b/code/game/objects/structures/petrified_statue.dm
@@ -86,14 +86,6 @@
S.add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY)
return TRUE
-/mob/living/carbon/monkey/petrify(statue_timer)
- if(!isturf(loc))
- return FALSE
- var/obj/structure/statue/petrified/S = new(loc, src, statue_timer)
- S.name = "statue of a monkey"
- S.icon_state = "monkey"
- return TRUE
-
/mob/living/simple_animal/pet/dog/corgi/petrify(statue_timer)
if(!isturf(loc))
return FALSE
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 44e542f92eb..adbfe4dfe40 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -594,7 +594,7 @@
get_patient()
if(!patient)
return FALSE
- if(ishuman(patient) || ismonkey(patient))
+ if(ishuman(patient))
return TRUE
return FALSE
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 95393b26c31..1b5982229d5 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -127,7 +127,7 @@
body += "
"
//Human
- if(ishuman(M))
+ if(ishuman(M) && !ismonkey(M))
body += "Human | "
else
body += "Humanize | "
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 46b742eab90..21baaaee96f 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -231,10 +231,10 @@
if(isliving(M))
if(iscarbon(M)) //Carbon stuff
- if(ishuman(M))
- M_job = M.job
- else if(ismonkey(M))
+ if(ismonkey(M))
M_job = "Monkey"
+ else if(ishuman(M))
+ M_job = M.job
else if(isalien(M)) //aliens
if(islarva(M))
M_job = "Alien larva"
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 7951692de7b..ca7addf0c13 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -409,7 +409,7 @@
if("slime")
M.change_mob_type( /mob/living/simple_animal/slime , null, null, delmob )
if("monkey")
- M.change_mob_type( /mob/living/carbon/monkey , null, null, delmob )
+ M.change_mob_type( /mob/living/carbon/human/species/monkey , null, null, delmob )
if("robot")
M.change_mob_type( /mob/living/silicon/robot , null, null, delmob )
if("cat")
@@ -894,9 +894,9 @@
if(!check_rights(R_SPAWN))
return
- var/mob/living/carbon/monkey/Mo = locate(href_list["humanone"])
- if(!istype(Mo))
- to_chat(usr, "This can only be used on instances of type /mob/living/carbon/monkey.", confidential = TRUE)
+ var/mob/living/carbon/human/Mo = locate(href_list["humanone"])
+ if(!ismonkey(Mo))
+ to_chat(usr, "This can only be used on monkeys.", confidential = TRUE)
return
log_admin("[key_name(usr)] attempting to humanize [key_name(Mo)].")
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
index 63868583ac4..d9f3291f5d7 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
@@ -99,7 +99,7 @@
Don't crash the server, OK?
- "UPDATE /mob/living/carbon/monkey SET #null = forceMove(usr.loc)"
+ "UPDATE /mob/living/carbon/human/species/monkey SET #null = forceMove(usr.loc)"
Writing "#null" in front of the "=" will call the proc and discard the return value.
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index d3d472c6c71..380edb01af8 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -395,12 +395,12 @@ Traitors and the like can also be revived with the previous role mostly intact.
//check if they were a monkey
else if(findtext(G_found.real_name,"monkey"))
if(alert("This character appears to have been a monkey. Would you like to respawn them as such?",,"Yes","No")=="Yes")
- var/mob/living/carbon/monkey/new_monkey = new
+ var/mob/living/carbon/human/species/monkey/new_monkey = new
SSjob.SendToLateJoin(new_monkey)
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
to_chat(new_monkey, "You have been fully respawned. Enjoy the game.", confidential = TRUE)
- var/msg = "[key_name_admin(usr)] has respawned [new_monkey.key] as a filthy xeno."
+ var/msg = "[key_name_admin(usr)] has respawned [new_monkey.key] as a filthy monkey."
message_admins(msg)
admin_ticket_log(new_monkey, msg)
return //all done. The ghost is auto-deleted
diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm
index 212264bf98c..13a378a6047 100644
--- a/code/modules/admin/view_variables/topic.dm
+++ b/code/modules/admin/view_variables/topic.dm
@@ -64,9 +64,9 @@
if(!check_rights(R_SPAWN))
return
- var/mob/living/carbon/monkey/Mo = locate(href_list["makehuman"]) in GLOB.mob_list
- if(!istype(Mo))
- to_chat(usr, "This can only be done to instances of type /mob/living/carbon/monkey", confidential = TRUE)
+ var/mob/living/carbon/human/Mo = locate(href_list["makehuman"]) in GLOB.mob_list
+ if(!ismonkey(Mo))
+ to_chat(usr, "This can only be done to monkeys", confidential = TRUE)
return
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform")
diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm
index 328b6e9809d..cde85dc8ee8 100644
--- a/code/modules/antagonists/changeling/changeling.dm
+++ b/code/modules/antagonists/changeling/changeling.dm
@@ -106,7 +106,7 @@
mimicing = ""
/datum/antagonist/changeling/proc/remove_changeling_powers()
- if(ishuman(owner.current) || ismonkey(owner.current))
+ if(ishuman(owner.current))
reset_properties()
for(var/datum/action/changeling/p in purchasedpowers)
purchasedpowers -= p
diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm
index a629f4022cf..4fab82033f7 100644
--- a/code/modules/antagonists/changeling/changeling_power.dm
+++ b/code/modules/antagonists/changeling/changeling_power.dm
@@ -66,10 +66,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p
//Fairly important to remember to return 1 on success >.<
/datum/action/changeling/proc/can_sting(mob/living/user, mob/target)
- if(!ishuman(user) && !ismonkey(user)) //typecast everything from mob to carbon from this point onwards
- return FALSE
- if(req_human && !ishuman(user))
- to_chat(user, "We cannot do that in this form!")
+ if(!ishuman(user)) //typecast everything from mob to carbon from this point onwards
return FALSE
var/datum/antagonist/changeling/c = user.mind.has_antag_datum(/datum/antagonist/changeling)
if(c.chem_charges < chemical_cost)
@@ -92,7 +89,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p
/datum/action/changeling/proc/can_be_used_by(mob/user)
if(!user || QDELETED(user))
return FALSE
- if(!ishuman(user) && !ismonkey(user))
+ if(!ishuman(user))
return FALSE
if(req_human && !ishuman(user))
return FALSE
diff --git a/code/modules/antagonists/changeling/powers/humanform.dm b/code/modules/antagonists/changeling/powers/humanform.dm
index e109a5981bd..e53530083c7 100644
--- a/code/modules/antagonists/changeling/powers/humanform.dm
+++ b/code/modules/antagonists/changeling/powers/humanform.dm
@@ -28,7 +28,7 @@
..()
changeling.purchasedpowers -= src
- var/newmob = user.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE)
+ var/newmob = user.humanize()
changeling_transform(newmob, chosen_prof)
return TRUE
diff --git a/code/modules/antagonists/changeling/powers/lesserform.dm b/code/modules/antagonists/changeling/powers/lesserform.dm
index 0abbe63e220..ff129354aa2 100644
--- a/code/modules/antagonists/changeling/powers/lesserform.dm
+++ b/code/modules/antagonists/changeling/powers/lesserform.dm
@@ -14,6 +14,6 @@
to_chat(user, "Our genes cry out!")
..()
- user.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE | TR_KEEPSTAMINADAMAGE)
+ user.monkeyize()
return TRUE
diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm
index fc3b3cf02d1..069af603899 100644
--- a/code/modules/antagonists/changeling/powers/tiny_prick.dm
+++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm
@@ -99,16 +99,12 @@
/datum/action/changeling/sting/transformation/sting_action(mob/user, mob/target)
log_combat(user, target, "stung", "transformation sting", " new identity is '[selected_dna.dna.real_name]'")
var/datum/dna/NewDNA = selected_dna.dna
- if(ismonkey(target))
- to_chat(user, "Our genes cry out as we sting [target.name]!")
var/mob/living/carbon/C = target
. = TRUE
if(istype(C))
C.real_name = NewDNA.real_name
NewDNA.transfer_identity(C)
- if(ismonkey(C))
- C.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG | TR_KEEPAI)
C.updateappearance(mutcolor_update=1)
*/
//SKYRAT EDIT REMOVAL END
diff --git a/code/modules/antagonists/monkey/monkey.dm b/code/modules/antagonists/monkey/monkey.dm
index 168fbb4b5b0..7c8ad8659cb 100644
--- a/code/modules/antagonists/monkey/monkey.dm
+++ b/code/modules/antagonists/monkey/monkey.dm
@@ -77,14 +77,14 @@
objectives |= monkey_team.objectives
/datum/antagonist/monkey/admin_remove(mob/admin)
- var/mob/living/carbon/monkey/M = owner.current
- if(istype(M))
+ var/mob/living/carbon/human/M = owner.current
+ if(ismonkey(M))
switch(alert(admin, "Humanize?", "Humanize", "Yes", "No"))
if("Yes")
if(admin == M)
- admin = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG)
+ admin = M.humanize()
else
- M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG)
+ M.humanize()
if("No")
//nothing
else
@@ -144,7 +144,9 @@
/datum/objective/monkey/check_completion()
var/datum/disease/D = new /datum/disease/transformation/jungle_fever()
- for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list)
+ for(var/mob/living/carbon/human/M in GLOB.alive_mob_list)
+ if(!ismonkey(M))
+ continue
if (M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase()))
escaped_monkeys++
if(escaped_monkeys >= monkeys_to_win)
@@ -162,14 +164,18 @@
/datum/team/monkey/proc/infected_monkeys_alive()
var/datum/disease/D = new /datum/disease/transformation/jungle_fever()
- for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list)
+ for(var/mob/living/carbon/human/M in GLOB.alive_mob_list)
+ if(!ismonkey(M))
+ continue
if(M.HasDisease(D))
return TRUE
return FALSE
/datum/team/monkey/proc/infected_monkeys_escaped()
var/datum/disease/D = new /datum/disease/transformation/jungle_fever()
- for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list)
+ for(var/mob/living/carbon/human/M in GLOB.alive_mob_list)
+ if(!ismonkey(M))
+ continue
if(M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase()))
return TRUE
return FALSE
diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm
index f9e56b0530f..3cdfa6dbeeb 100644
--- a/code/modules/antagonists/revolution/revolution.dm
+++ b/code/modules/antagonists/revolution/revolution.dm
@@ -201,7 +201,7 @@
to_chat(old_owner, "Revolution has been disappointed of your leader traits! You are a regular revolutionary now!")
/datum/antagonist/rev/farewell()
- if(ishuman(owner.current) || ismonkey(owner.current))
+ if(ishuman(owner.current))
owner.current.visible_message("[owner.current] looks like [owner.current.p_theyve()] just remembered [owner.current.p_their()] real allegiance!", null, null, null, owner.current)
to_chat(owner, "You are no longer a brainwashed revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you....")
else if(issilicon(owner.current))
@@ -209,7 +209,7 @@
to_chat(owner, "The frame's firmware detects and deletes your neural reprogramming! You remember nothing but the name of the one who flashed you.")
/datum/antagonist/rev/head/farewell()
- if((ishuman(owner.current) || ismonkey(owner.current)))
+ if((ishuman(owner.current)))
if(owner.current.stat != DEAD)
owner.current.visible_message("[owner.current] looks like [owner.current.p_theyve()] just remembered [owner.current.p_their()] real allegiance!", null, null, null, owner.current)
to_chat(owner, "You have given up your cause of overthrowing the command staff. You are no longer a Head Revolutionary.")
@@ -236,7 +236,7 @@
/datum/antagonist/rev/head/equip_rev()
var/mob/living/carbon/C = owner.current
- if(!ishuman(C) && !ismonkey(C))
+ if(!ishuman(C))
return
if(give_flash)
diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm
index 3344338c4fe..62ab5f96a28 100644
--- a/code/modules/client/verbs/suicide.dm
+++ b/code/modules/client/verbs/suicide.dm
@@ -135,24 +135,6 @@
death(FALSE)
ghostize(FALSE) // Disallows reentering body and disassociates mind
-/mob/living/carbon/monkey/verb/suicide()
- set hidden = TRUE
- if(!canSuicide())
- return
- var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
- if(!canSuicide())
- return
- if(confirm == "Yes")
- set_suicide(TRUE)
- visible_message("[src] is attempting to bite [p_their()] tongue. It looks like [p_theyre()] trying to commit suicide.", \
- "[src] is attempting to bite [p_their()] tongue. It looks like [p_theyre()] trying to commit suicide.")
-
- suicide_log()
-
- adjustOxyLoss(max(200- getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
- death(FALSE)
- ghostize(FALSE) // Disallows reentering body and disassociates mind
-
/mob/living/silicon/ai/verb/suicide()
set hidden = TRUE
if(!canSuicide())
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 3bd77d21863..92c1117b7ce 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -390,7 +390,7 @@
icon_state = "monkeymind"
inhand_icon_state = "monkeymind"
strip_delay = 100
- var/mob/living/carbon/monkey/magnification = null ///if the helmet is on a valid target (just works like a normal helmet if not (cargo please stop))
+ var/mob/living/carbon/human/magnification = null ///if the helmet is on a valid target (just works like a normal helmet if not (cargo please stop))
var/polling = FALSE///if the helmet is currently polling for targets (special code for removal)
var/light_colors = 1 ///which icon state color this is (red, blue, yellow)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index 38f325496d0..2c02c85a59e 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -172,9 +172,7 @@
var/mob/living/carbon/C = occupant
typeofmeat = C.type_of_meat
gibtype = C.gib_type
- if(ismonkey(C))
- typeofskin = /obj/item/stack/sheet/animalhide/monkey
- else if(isalien(C))
+ if(isalien(C))
typeofskin = /obj/item/stack/sheet/animalhide/xeno
var/occupant_volume
if(occupant?.reagents)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
index 418c6119355..3c01e913a2b 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
@@ -66,7 +66,7 @@ GLOBAL_LIST_EMPTY(monkey_recyclers)
if(ismonkey(target))
stuff_monkey_in(target, user)
-/obj/machinery/monkey_recycler/proc/stuff_monkey_in(mob/living/carbon/monkey/target, mob/living/user)
+/obj/machinery/monkey_recycler/proc/stuff_monkey_in(mob/living/carbon/human/target, mob/living/user)
if(!istype(target))
return
if(target.stat == CONSCIOUS)
diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm
index 3fab13fdb19..614110403a3 100644
--- a/code/modules/jobs/access.dm
+++ b/code/modules/jobs/access.dm
@@ -18,7 +18,7 @@
//if they are holding or wearing a card that has access, that works
if(check_access(H.get_active_held_item()) || src.check_access(H.wear_id))
return TRUE
- else if(ismonkey(M) || isalienadult(M))
+ else if(isalienadult(M))
var/mob/living/carbon/george = M
//they can only hold things :(
if(check_access(george.get_active_held_item()))
diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm
index 0cf7c73e60d..d11915fcdb3 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories.dm
@@ -1614,6 +1614,11 @@
icon_state = "cat"
color_src = HAIR
+/datum/sprite_accessory/tails/monkey/default
+ name = "Monkey"
+ icon_state = "monkey"
+ color_src = FALSE
+
/datum/sprite_accessory/snouts
icon = 'icons/mob/mutant_bodyparts.dmi'
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index 79edeb9ff14..92a96460af1 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -4,23 +4,6 @@
BLOOD SYSTEM
****************************************************/
-/mob/living/carbon/monkey/handle_blood()
- if(bodytemperature <= TCRYO || (HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood.
- return
-
- var/temp_bleed = 0
- for(var/X in bodyparts)
- var/obj/item/bodypart/BP = X
- temp_bleed += BP.get_bleed_rate()
- BP.generic_bleedstacks = max(0, BP.generic_bleedstacks - 1)
- bleed(temp_bleed)
-
- //Blood regeneration if there is some space
- if(blood_volume < BLOOD_VOLUME_NORMAL)
- blood_volume += 0.1 // regenerate blood VERY slowly
- if(blood_volume < BLOOD_VOLUME_OKAY)
- adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1))
-
// Takes care blood loss and regeneration
/mob/living/carbon/human/handle_blood()
@@ -207,10 +190,6 @@
if(blood_volume)
return /datum/reagent/blood
-/mob/living/carbon/monkey/get_blood_id()
- if(!(HAS_TRAIT(src, TRAIT_HUSK)))
- return /datum/reagent/blood
-
/mob/living/carbon/human/get_blood_id()
if(HAS_TRAIT(src, TRAIT_HUSK))
return
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index 9a98d00a892..55dc90671d4 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -72,7 +72,7 @@ In all, this is a lot like the monkey code. /N
return FALSE
-/mob/living/carbon/alien/attack_paw(mob/living/carbon/monkey/M)
+/mob/living/carbon/alien/attack_paw(mob/living/carbon/human/M)
if(..())
if (stat != DEAD)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index d4b1d99a9ff..8fcf5cd6b12 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -250,10 +250,6 @@
return FALSE
if(M.getorgan(/obj/item/organ/alien/hivenode))
return FALSE
-
- if(ismonkey(M))
- return TRUE
-
var/mob/living/carbon/C = M
if(ishuman(C) && !(ITEM_SLOT_MASK in C.dna.species.no_equip))
var/mob/living/carbon/human/H = C
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 37e9e6221a2..cdd6b7ea524 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -168,7 +168,7 @@
return FALSE
-/mob/living/carbon/attack_paw(mob/living/carbon/monkey/M)
+/mob/living/carbon/attack_paw(mob/living/carbon/human/M)
if(can_inject(M, TRUE))
for(var/thing in diseases)
diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm
index 71a1720bdf3..fe9092e3b52 100644
--- a/code/modules/mob/living/carbon/emote.dm
+++ b/code/modules/mob/living/carbon/emote.dm
@@ -49,13 +49,6 @@
if(user.usable_hands < 2)
return FALSE
return ..()
-
-/datum/emote/living/carbon/gnarl
- key = "gnarl"
- key_third_person = "gnarls"
- message = "gnarls and shows its teeth..."
- mob_type_allowed_typecache = list(/mob/living/carbon/monkey)
-
/datum/emote/living/carbon/moan
key = "moan"
key_third_person = "moans"
@@ -67,46 +60,21 @@
key = "roll"
key_third_person = "rolls"
message = "rolls."
- mob_type_allowed_typecache = list(/mob/living/carbon/monkey, /mob/living/carbon/alien)
+ mob_type_allowed_typecache = list(/mob/living/carbon/alien)
hands_use_check = TRUE
/datum/emote/living/carbon/scratch
key = "scratch"
key_third_person = "scratches"
message = "scratches."
- mob_type_allowed_typecache = list(/mob/living/carbon/monkey, /mob/living/carbon/alien)
+ mob_type_allowed_typecache = list(/mob/living/carbon/alien)
hands_use_check = TRUE
-/datum/emote/living/carbon/screech
- key = "screech"
- key_third_person = "screeches"
- message = "screeches."
- mob_type_allowed_typecache = list(/mob/living/carbon/monkey)
- emote_type = EMOTE_AUDIBLE
-
-//SKYRAT EDIT REMOVAL BEGIN - EMOTES - begone with the annoying screech
-/*
-/datum/emote/living/carbon/screech/get_sound(mob/living/user)
- return pick('sound/creatures/monkey/monkey_screech_1.ogg',
- 'sound/creatures/monkey/monkey_screech_2.ogg',
- 'sound/creatures/monkey/monkey_screech_3.ogg',
- 'sound/creatures/monkey/monkey_screech_4.ogg',
- 'sound/creatures/monkey/monkey_screech_5.ogg',
- 'sound/creatures/monkey/monkey_screech_6.ogg',
- 'sound/creatures/monkey/monkey_screech_7.ogg')
-*/
-//SKYRAT EDIT REMOVAL END
-
-/datum/emote/living/carbon/screech/roar
- key = "roar"
- key_third_person = "roars"
- message = "roars."
-
/datum/emote/living/carbon/sign
key = "sign"
key_third_person = "signs"
message_param = "signs the number %t."
- mob_type_allowed_typecache = list(/mob/living/carbon/monkey, /mob/living/carbon/alien)
+ mob_type_allowed_typecache = list(/mob/living/carbon/alien)
hands_use_check = TRUE
/datum/emote/living/carbon/sign/select_param(mob/user, params)
@@ -124,7 +92,7 @@
/datum/emote/living/carbon/tail
key = "tail"
message = "waves their tail."
- mob_type_allowed_typecache = list(/mob/living/carbon/monkey, /mob/living/carbon/alien)
+ mob_type_allowed_typecache = list(/mob/living/carbon/alien)
/datum/emote/living/carbon/wink
key = "wink"
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index b096a824264..34fa24f19ed 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -1,9 +1,9 @@
GLOBAL_LIST_EMPTY(dead_players_during_shift)
/mob/living/carbon/human/gib_animation()
- new /obj/effect/temp_visual/gib_animation(loc, "gibbed-h")
+ new /obj/effect/temp_visual/gib_animation(loc, dna.species.gib_anim)
/mob/living/carbon/human/dust_animation()
- new /obj/effect/temp_visual/dust_animation(loc, "dust-h")
+ new /obj/effect/temp_visual/dust_animation(loc, dna.species.dust_anim)
/mob/living/carbon/human/spawn_gibs(with_bodyparts)
if(with_bodyparts)
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 6e0c5c5d6a8..8bac288a655 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -70,8 +70,23 @@
return pick('sound/voice/human/malescream_1.ogg', 'sound/voice/human/malescream_2.ogg', 'sound/voice/human/malescream_3.ogg', 'sound/voice/human/malescream_4.ogg', 'sound/voice/human/malescream_5.ogg', 'sound/voice/human/malescream_6.ogg')
else if(ismoth(H))
return 'sound/voice/moth/scream_moth.ogg'
+ else if(ismonkey(user)) //If its a monkey, override it.
+ return pick('sound/creatures/monkey/monkey_screech_1.ogg',
+ 'sound/creatures/monkey/monkey_screech_2.ogg',
+ 'sound/creatures/monkey/monkey_screech_3.ogg',
+ 'sound/creatures/monkey/monkey_screech_4.ogg',
+ 'sound/creatures/monkey/monkey_screech_5.ogg',
+ 'sound/creatures/monkey/monkey_screech_6.ogg',
+ 'sound/creatures/monkey/monkey_screech_7.ogg')
*/
+/datum/emote/living/carbon/human/scream/screech //If a human tries to screech it'll just scream.
+ key = "screech"
+ key_third_person = "screeches"
+ message = "screeches."
+ emote_type = EMOTE_AUDIBLE
+ vary = FALSE
+
/datum/emote/living/carbon/human/pale
key = "pale"
message = "goes pale for a second."
@@ -176,3 +191,44 @@
T.Entered(src)
//Ayy lmao
+
+
+///Snowflake emotes only for le epic chimp
+/datum/emote/living/carbon/human/monkey
+
+/datum/emote/living/carbon/human/monkey/can_run_emote(mob/user, status_check = TRUE, intentional)
+ if(ismonkey(user))
+ return ..()
+ return FALSE
+
+/datum/emote/living/carbon/human/monkey/gnarl
+ key = "gnarl"
+ key_third_person = "gnarls"
+ message = "gnarls and shows its teeth..."
+
+/datum/emote/living/carbon/human/monkey/roll
+ key = "roll"
+ key_third_person = "rolls"
+ message = "rolls."
+ hands_use_check = TRUE
+
+/datum/emote/living/carbon/human/monkey/scratch
+ key = "scratch"
+ key_third_person = "scratches"
+ message = "scratches."
+ hands_use_check = TRUE
+
+/datum/emote/living/carbon/human/monkey/screech/roar
+ key = "roar"
+ key_third_person = "roars"
+ message = "roars."
+
+/datum/emote/living/carbon/human/monkey/tail
+ key = "tail"
+ message = "waves their tail."
+
+/datum/emote/living/carbon/human/monkeysign
+ key = "sign"
+ key_third_person = "signs"
+ message_param = "signs the number %t."
+ hands_use_check = TRUE
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 0cc52bea95a..16a100478ee 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -23,7 +23,6 @@
//AddComponent(/datum/component/footstep, FOOTSTEP_MOB_HUMAN, 1, -6) //ORIGINAL
AddComponent(/datum/component/footstep, FOOTSTEP_MOB_HUMAN, 0.6, -6) //SKYRAT EDIT CHANGE - AESTHETICS
AddComponent(/datum/component/bloodysoles/feet)
- ADD_TRAIT(src, TRAIT_ADVANCEDTOOLUSER, ROUNDSTART_TRAIT)
AddElement(/datum/element/ridable, /datum/component/riding/creature/human)
GLOB.human_list += src
@@ -1154,11 +1153,17 @@
/mob/living/carbon/human/species
var/race = null
+ var/use_random_name = TRUE
/mob/living/carbon/human/species/Initialize()
. = ..()
INVOKE_ASYNC(src, .proc/set_species, race)
+/mob/living/carbon/human/species/set_species(datum/species/mrace, icon_update, pref_load)
+ . = ..()
+ if(use_random_name)
+ fully_replace_character_name(real_name, dna.species.random_name())
+
/mob/living/carbon/human/species/abductor
race = /datum/species/abductor
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index d8eaecfb01d..9adc3c64e73 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -213,7 +213,7 @@
var/mob/living/carbon/human/H = user
dna.species.spec_attack_hand(H, src)
-/mob/living/carbon/human/attack_paw(mob/living/carbon/monkey/M)
+/mob/living/carbon/human/attack_paw(mob/living/carbon/human/M)
var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
if(!affecting)
@@ -249,7 +249,7 @@
if(can_inject(M, 1, affecting))//Thick suits can stop monkey bites.
if(..()) //successful monkey bite, this handles disease contraction.
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
+ var/damage = rand(M.dna.species.punchdamagelow, M.dna.species.punchdamagehigh)
if(!damage)
return
if(check_shields(M, damage, "the [M.name]"))
diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm
index fbaf00db542..c7d0bd9d90a 100644
--- a/code/modules/mob/living/carbon/human/human_update_icons.dm
+++ b/code/modules/mob/living/carbon/human/human_update_icons.dm
@@ -177,7 +177,7 @@ There are several things that need to be remembered:
var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_GLOVES) + 1]
inv.update_icon()
- if(!gloves && blood_in_hands)
+ if(!gloves && blood_in_hands && !(NOBLOODOVERLAY in dna.species.species_traits))
var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER)
if(num_hands < 2)
if(has_left_hand(FALSE))
diff --git a/code/modules/mob/living/carbon/monkey/punpun.dm b/code/modules/mob/living/carbon/human/monkey/monkey.dm
similarity index 54%
rename from code/modules/mob/living/carbon/monkey/punpun.dm
rename to code/modules/mob/living/carbon/human/monkey/monkey.dm
index d5cd06137b5..e980679592d 100644
--- a/code/modules/mob/living/carbon/monkey/punpun.dm
+++ b/code/modules/mob/living/carbon/human/monkey/monkey.dm
@@ -1,6 +1,37 @@
-/mob/living/carbon/monkey/punpun //except for a few special persistence features, pun pun is just a normal monkey
+/mob/living/carbon/human/species/monkey
+ race = /datum/species/monkey
+ ai_controller = /datum/ai_controller/monkey
+ faction = list("neutral", "monkey")
+
+/mob/living/carbon/human/species/monkey/Initialize(mapload, cubespawned=FALSE, mob/spawner)
+ if (cubespawned)
+ var/cap = CONFIG_GET(number/monkeycap)
+ if (LAZYLEN(SSmobs.cubemonkeys) > cap)
+ if (spawner)
+ to_chat(spawner, "Bluespace harmonics prevent the spawning of more than [cap] monkeys on the station at one time!")
+ return INITIALIZE_HINT_QDEL
+ SSmobs.cubemonkeys += src
+ return ..()
+
+/mob/living/carbon/human/species/monkey/Destroy()
+ SSmobs.cubemonkeys -= src
+ return ..()
+
+/mob/living/carbon/human/species/monkey/angry
+ ai_controller = /datum/ai_controller/monkey/angry
+
+/mob/living/carbon/human/species/monkey/angry/Initialize()
+ . = ..()
+ if(prob(10))
+ var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src)
+ equip_to_slot_or_del(helmet,ITEM_SLOT_HEAD)
+ helmet.attack_self(src) // todo encapsulate toggle
+
+
+/mob/living/carbon/human/species/monkey/punpun //except for a few special persistence features, pun pun is just a normal monkey
name = "Pun Pun" //C A N O N
- unique_name = 0
+ unique_name = FALSE
+ use_random_name = FALSE
/// If we had one of the rare names in a past life
var/ancestor_name
/// The number of times Pun Pun has died since he was last gibbed
@@ -9,18 +40,23 @@
var/relic_mask
var/memory_saved = FALSE
-/mob/living/carbon/monkey/punpun/Initialize()
+/mob/living/carbon/human/species/monkey/punpun/Initialize()
Read_Memory()
+
+ var/name_to_use = name
+
if(ancestor_name)
- name = ancestor_name
+ name_to_use = ancestor_name
if(ancestor_chain > 1)
- name += " \Roman[ancestor_chain]"
+ name_to_use += " \Roman[ancestor_chain]"
else if(prob(10))
- name = pick(list("Professor Bobo", "Deempisi's Revenge", "Furious George", "King Louie", "Dr. Zaius", "Jimmy Rustles", "Dinner", "Lanky"))
- if(name == "Furious George")
+ name_to_use = pick(list("Professor Bobo", "Deempisi's Revenge", "Furious George", "King Louie", "Dr. Zaius", "Jimmy Rustles", "Dinner", "Lanky"))
+ if(name_to_use == "Furious George")
ai_controller = /datum/ai_controller/monkey/angry //hes always mad
. = ..()
+ fully_replace_character_name(real_name, name_to_use)
+
//These have to be after the parent new to ensure that the monkey
//bodyparts are actually created before we try to equip things to
//those slots
@@ -31,18 +67,18 @@
if(relic_mask)
equip_to_slot_or_del(new relic_mask, ITEM_SLOT_MASK)
-/mob/living/carbon/monkey/punpun/Life()
+/mob/living/carbon/human/species/monkey/punpun/Life()
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
Write_Memory(FALSE, FALSE)
memory_saved = TRUE
..()
-/mob/living/carbon/monkey/punpun/death(gibbed)
+/mob/living/carbon/human/species/monkey/punpun/death(gibbed)
if(!memory_saved)
Write_Memory(TRUE, gibbed)
..()
-/mob/living/carbon/monkey/punpun/proc/Read_Memory()
+/mob/living/carbon/human/species/monkey/punpun/proc/Read_Memory()
if(fexists("data/npc_saves/Punpun.sav")) //legacy compatability to convert old format to new
var/savefile/S = new /savefile("data/npc_saves/Punpun.sav")
S["ancestor_name"] >> ancestor_name
@@ -60,7 +96,7 @@
relic_hat = json["relic_hat"]
relic_mask = json["relic_hat"]
-/mob/living/carbon/monkey/punpun/proc/Write_Memory(dead, gibbed)
+/mob/living/carbon/human/species/monkey/punpun/proc/Write_Memory(dead, gibbed)
var/json_file = file("data/npc_saves/Punpun.json")
var/list/file_data = list()
if(gibbed)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index e06232bcaf5..978ba0375f9 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -67,6 +67,14 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/list/list/mutant_bodyparts = list() //SKYRAT EDIT CHANGE - CUSTOMIZATION (typed list)
///Internal organs that are unique to this race, like a tail.
var/list/mutant_organs = list()
+ ///The bodyparts this species uses. assoc of bodypart string - bodypart type. Make sure all the fucking entries are in or I'll skin you alive.
+ var/list/bodypart_overides = list(
+ BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm,\
+ BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm,\
+ BODY_ZONE_HEAD = /obj/item/bodypart/head,\
+ BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg,\
+ BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg,\
+ BODY_ZONE_CHEST = /obj/item/bodypart/chest)
///Multiplier for the race's speed. Positive numbers make it move slower, negative numbers make it move faster.
var/speedmod = 0
///Percentage modifier for overall defense of the race, or less defense, if it's negative.
@@ -129,7 +137,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
///Species-only traits. Can be found in [code/__DEFINES/DNA.dm]
var/list/species_traits = list()
///Generic traits tied to having the species.
- var/list/inherent_traits = list()
+ var/list/inherent_traits = list(TRAIT_ADVANCEDTOOLUSER)
/// List of biotypes the mob belongs to. Used by diseases.
var/inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
///List of factions the mob gain upon gaining this species.
@@ -144,6 +152,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
///What gas does this species breathe? Used by suffocation screen alerts, most of actual gas breathing is handled by mutantlungs. See [life.dm][code/modules/mob/living/carbon/human/life.dm]
var/breathid = "o2"
+ ///What anim to use for dusting
+ var/dust_anim = "dust-h"
+ ///What anim to use for gibbing
+ var/gib_anim = "gibbed-h"
+
//Do NOT remove by setting to null. use OR make a RESPECTIVE TRAIT (removing stomach? add the NOSTOMACH trait to your species)
//why does it work this way? because traits also disable the downsides of not having an organ, removing organs but not having the trait will make your species die
@@ -175,6 +188,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
///For custom overrides for species ass images
var/icon/ass_image
+ ///List of results you get from knife-butchering. null means you cant butcher it. Associated by resulting type - value of amount
+ var/list/knife_butcher_results
+
///////////
// PROCS //
///////////
@@ -349,6 +365,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(DIGITIGRADE in species_traits)
C.Digitigrade_Leg_Swap(FALSE)
+ fix_non_native_limbs(C)
+
C.mob_biotypes = inherent_biotypes
regenerate_organs(C,old_species)
@@ -752,6 +770,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "tail_human"
+ if("tail_monkey" in mutant_bodyparts)
+ if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ bodyparts_to_add -= "tail_monkey"
+
if(mutant_bodyparts["waggingtail_human"])
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
@@ -868,13 +890,15 @@ GLOBAL_LIST_EMPTY(roundstart_races)
S = GLOB.moth_antennae_list[H.dna.features["moth_antennae"]]
if("caps")
S = GLOB.caps_list[H.dna.features["caps"]]
+ if("tail_monkey")
+ S = GLOB.tails_list_monkey[H.dna.features["tail_monkey"]]
if(!S || S.icon_state == "none")
continue
var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer = -layer)
//A little rename so we don't have to use tail_lizard or tail_human when naming the sprites.
- if(bodypart == "tail_lizard" || bodypart == "tail_human")
+ if(bodypart == "tail_lizard" || bodypart == "tail_human" || bodypart == "tail_monkey")
bodypart = "tail"
else if(bodypart == "waggingtail_lizard" || bodypart == "waggingtail_human")
bodypart = "waggingtail"
@@ -1330,6 +1354,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
user.do_attack_animation(target, ATTACK_EFFECT_CLAW)
if(ATTACK_EFFECT_SMASH)
user.do_attack_animation(target, ATTACK_EFFECT_SMASH)
+ if(ATTACK_EFFECT_BITE)
+ if(user.is_mouth_covered(FALSE, TRUE))
+ to_chat(user, "You can't bite with your mouth covered!")
+ return FALSE
+ user.do_attack_animation(target, ATTACK_EFFECT_BITE)
else
user.do_attack_animation(target, ATTACK_EFFECT_PUNCH)
@@ -2119,3 +2148,19 @@ GLOBAL_LIST_EMPTY(roundstart_races)
. |= BIO_JUST_FLESH
if(HAS_BONE in species_traits)
. |= BIO_JUST_BONE
+
+///Species override for unarmed attacks because the attack_hand proc was made by a mouth-breathing troglodyte on a tricycle. Also to whoever thought it would be a good idea to make it so the original spec_unarmedattack was not actually linked to unarmed attack needs to be checked by a doctor because they clearly have a vast empty space in their head.
+/datum/species/proc/spec_unarmedattack(mob/living/carbon/human/user, atom/target)
+ return FALSE
+
+
+///Removes any non-native limbs from the mob
+/datum/species/proc/fix_non_native_limbs(mob/living/carbon/human/H)
+ for(var/X in H.bodyparts)
+ var/obj/item/bodypart/current_part = X
+ var/obj/item/bodypart/species_part = bodypart_overides[current_part.body_zone]
+
+ if(current_part.type == species_part)
+ continue
+
+ current_part.change_bodypart(species_part)
diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm
index d86bf74515d..763ce38fc0a 100644
--- a/code/modules/mob/living/carbon/human/species_types/abductors.dm
+++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm
@@ -4,7 +4,7 @@
say_mod = "gibbers"
sexes = FALSE
species_traits = list(NOBLOOD,NOEYESPRITES)
- inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_CHUNKYFINGERS,TRAIT_NOHUNGER,TRAIT_NOBREATH)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_VIRUSIMMUNE,TRAIT_CHUNKYFINGERS,TRAIT_NOHUNGER,TRAIT_NOBREATH)
mutanttongue = /obj/item/organ/tongue/abductor
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
ass_image = 'icons/ass/assgrey.png'
diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm
index 73e27f55f63..426a5b391de 100644
--- a/code/modules/mob/living/carbon/human/species_types/android.dm
+++ b/code/modules/mob/living/carbon/human/species_types/android.dm
@@ -3,7 +3,7 @@
id = "android"
say_mod = "states"
species_traits = list(NOBLOOD)
- inherent_traits = list(TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT,TRAIT_NOCLONELOSS)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT,TRAIT_NOCLONELOSS)
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
meat = null
damage_overlay_type = "synth"
diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
index 4585e532e51..2900ef060cb 100644
--- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
@@ -3,7 +3,7 @@
id = "dullahan"
default_color = "FFFFFF"
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS, HAS_FLESH, HAS_BONE)
- inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOHUNGER,TRAIT_NOBREATH)
mutant_bodyparts = list("tail_human" = "None", "ears" = "None", "wings" = "None")
use_skintones = TRUE
mutantbrain = /obj/item/organ/brain/dullahan
diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
index 9d074f1240b..040052aa61c 100644
--- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
@@ -18,7 +18,7 @@
species_traits = list(DYNCOLORS, AGENDER, NO_UNDERWEAR, HAIR, HAS_FLESH, HAS_BONE) // i mean i guess they have blood so they can have wounds too
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
species_language_holder = /datum/language_holder/ethereal
- inherent_traits = list(TRAIT_NOHUNGER)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOHUNGER)
sexes = FALSE //no fetish content allowed
toxic_food = NONE
// Body temperature for ethereals is much higher then humans as they like hotter environments
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index fbadb65b6d3..77910a96686 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -3,7 +3,7 @@
name = "Golem"
id = "iron golem"
species_traits = list(NOBLOOD,MUTCOLORS,NO_UNDERWEAR)
- inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
inherent_biotypes = MOB_HUMANOID|MOB_MINERAL
mutant_organs = list(/obj/item/organ/adamantine_resonator)
speedmod = 2
@@ -88,7 +88,7 @@
fixed_mut_color = "a3d"
meat = /obj/item/stack/ore/plasma
//Can burn and takes damage from heat
- inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) //no RESISTHEAT, NOFIRE
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) //no RESISTHEAT, NOFIRE
info_text = "As a Plasma Golem, you burn easily. Be careful, if you get hot enough while burning, you'll blow up!"
heatmod = 0 //fine until they blow up
prefix = "Plasma"
@@ -277,7 +277,7 @@
fixed_mut_color = "9E704B"
meat = /obj/item/stack/sheet/mineral/wood
//Can burn and take damage from heat
- inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
armor = 30
burnmod = 1.25
heatmod = 1.5
@@ -615,7 +615,7 @@
sexes = FALSE
info_text = "As a Runic Golem, you possess eldritch powers granted by the Elder Goddess Nar'Sie."
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES) //no mutcolors
- inherent_traits = list(TRAIT_NOFLASH,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOFLASH,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
inherent_biotypes = MOB_HUMANOID|MOB_MINERAL
prefix = "Runic"
special_names = null
@@ -670,7 +670,7 @@
info_text = "As a Cloth Golem, you are able to reform yourself after death, provided your remains aren't burned or destroyed. You are, of course, very flammable. \
Being made of cloth, your body is magic resistant and faster than that of other golems, but weaker and less resilient."
species_traits = list(NOBLOOD,NO_UNDERWEAR) //no mutcolors, and can burn
- inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_CHUNKYFINGERS)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_CHUNKYFINGERS)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
armor = 15 //feels no pain, but not too resistant
burnmod = 2 // don't get burned
@@ -869,7 +869,7 @@
special_names = list("Box")
info_text = "As a Cardboard Golem, you aren't very strong, but you are a bit quicker and can easily create more brethren by using cardboard on yourself."
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES)
- inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_NOFLASH)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_NOFLASH)
limbs_id = "c_golem" //special sprites
attack_verb = "whips"
attack_sound = 'sound/weapons/whip.ogg'
@@ -914,7 +914,7 @@
name = "Leather Golem"
id = "leather golem"
special_names = list("Face", "Man", "Belt") //Ah dude 4 strength 4 stam leather belt AHHH
- inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_STRONG_GRABBER)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_STRONG_GRABBER)
prefix = "Leather"
fixed_mut_color = "624a2e"
info_text = "As a Leather Golem, you are flammable, but you can grab things with incredible ease, allowing all your grabs to start at a strong level."
@@ -929,7 +929,7 @@
special_names = list("Boll","Weave")
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES)
fixed_mut_color = null
- inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_NOFLASH)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_NOFLASH)
info_text = "As a Durathread Golem, your strikes will cause those your targets to start choking, but your woven body won't withstand fire as well."
/datum/species/golem/durathread/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target)
@@ -951,7 +951,7 @@
mutantstomach = /obj/item/organ/stomach/bone
sexes = FALSE
fixed_mut_color = null
- inherent_traits = list(TRAIT_NOFLASH,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_FAKEDEATH)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOFLASH,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_FAKEDEATH)
species_language_holder = /datum/language_holder/golem/bone
info_text = "As a Bone Golem, You have a powerful spell that lets you chill your enemies with fear, and milk heals you! Just make sure to watch our for bone-hurting juice."
var/datum/action/innate/bonechill/bonechill
@@ -1041,7 +1041,7 @@
prefix = "Snow"
special_names = list("Flake", "Blizzard", "Storm")
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES) //no mutcolors, no eye sprites
- inherent_traits = list(TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
var/obj/effect/proc_holder/spell/targeted/conjure_item/snowball/ball
var/obj/effect/proc_holder/spell/aimed/cryo/cryo
@@ -1088,7 +1088,7 @@
info_text = "As a Metallic Hydrogen Golem, you were forged in the highest pressures and the highest heats. Your unique mineral makeup makes you immune to most types of damages."
prefix = "Metallic Hydrogen"
special_names = null
- inherent_traits = list(TRAIT_NOFLASH, TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_NODISMEMBER,TRAIT_CHUNKYFINGERS)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOFLASH, TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_NODISMEMBER,TRAIT_CHUNKYFINGERS)
/datum/species/golem/mhydrogen/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index 595dd0b1b43..d8e0c76832f 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -5,7 +5,7 @@
default_color = "00FF90"
say_mod = "chirps"
species_traits = list(MUTCOLORS,EYECOLOR,NOBLOOD)
- inherent_traits = list(TRAIT_TOXINLOVER)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_TOXINLOVER)
mutantlungs = /obj/item/organ/lungs/slime
meat = /obj/item/food/meat/slab/human/mutant/slime
exotic_blood = /datum/reagent/toxin/slimejelly
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index 7e32e1649b5..c5ef15d6ad7 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -113,5 +113,5 @@ Lizard subspecies: ASHWALKERS
id = "ashlizard"
limbs_id = "lizard"
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE,HAS_FLESH,HAS_BONE)
- inherent_traits = list(TRAIT_CHUNKYFINGERS,TRAIT_NOBREATH)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_CHUNKYFINGERS,TRAIT_NOBREATH)
species_language_holder = /datum/language_holder/lizard/ash
diff --git a/code/modules/mob/living/carbon/human/species_types/monkeys.dm b/code/modules/mob/living/carbon/human/species_types/monkeys.dm
new file mode 100644
index 00000000000..6eaef211754
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm
@@ -0,0 +1,92 @@
+/datum/species/monkey
+ name = "Monkey"
+ id = "monkey"
+ say_mod = "chimpers"
+ attack_verb = "bite"
+ attack_sound = 'sound/weapons/bite.ogg'
+ miss_sound = 'sound/weapons/bite.ogg'
+ mutant_organs = list(/obj/item/organ/tail/monkey)
+ mutant_bodyparts = list("tail_monkey" = "Monkey")
+ skinned_type = /obj/item/stack/sheet/animalhide/monkey
+ meat = /obj/item/food/meat/slab/monkey
+ knife_butcher_results = list(/obj/item/food/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1)
+ species_traits = list(HAS_FLESH,HAS_BONE,NO_UNDERWEAR,LIPS,NOEYESPRITES,NOBLOODOVERLAY,NOTRANSSTING, NOAUGMENTS)
+ inherent_traits = list(TRAIT_MONKEYLIKE)
+ no_equip = list(ITEM_SLOT_EARS, ITEM_SLOT_EYES, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING, ITEM_SLOT_SUITSTORE)
+ changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | ERT_SPAWN | SLIME_EXTRACT
+ liked_food = MEAT | FRUIT
+ limbs_id = "monkey"
+ damage_overlay_type = "monkey"
+ sexes = FALSE
+ punchdamagelow = 1
+ punchdamagehigh = 3
+ punchstunthreshold = 4 // no stun punches
+ species_language_holder = /datum/language_holder/monkey
+ bodypart_overides = list(
+ BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/monkey,\
+ BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/monkey,\
+ BODY_ZONE_HEAD = /obj/item/bodypart/head/monkey,\
+ BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/monkey,\
+ BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/monkey,\
+ BODY_ZONE_CHEST = /obj/item/bodypart/chest/monkey)
+ dust_anim = "dust-m"
+ gib_anim = "gibbed-m"
+
+ payday_modifier = 1.5
+
+
+/datum/species/monkey/random_name(gender,unique,lastname)
+ var/randname = "monkey ([rand(1,999)])"
+
+ return randname
+
+/datum/species/monkey/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
+ . = ..()
+ H.ventcrawler = VENTCRAWLER_NUDE
+ H.pass_flags |= PASSTABLE
+ H.butcher_results = knife_butcher_results
+ if(!H.dna.features["tail_monkey"] || H.dna.features["tail_monkey"] == "None")
+ H.dna.features["tail_monkey"] = "Monkey"
+ handle_mutant_bodyparts(H)
+
+ H.dna.add_mutation(RACEMUT, MUT_NORMAL)
+ H.dna.activate_mutation(RACEMUT)
+
+
+/datum/species/monkey/on_species_loss(mob/living/carbon/C)
+ . = ..()
+ C.ventcrawler = initial(C.ventcrawler)
+ C.pass_flags = initial(C.pass_flags)
+ C.butcher_results = null
+ C.dna.remove_mutation(RACEMUT)
+
+/datum/species/monkey/spec_unarmedattack(mob/living/carbon/human/user, atom/target)
+ . = ..()
+ if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))
+ if(!iscarbon(target))
+ return TRUE
+ var/mob/living/carbon/victim = target
+ if(user.a_intent != INTENT_HARM || user.is_muzzled())
+ return TRUE
+ var/obj/item/bodypart/affecting = null
+ if(ishuman(victim))
+ var/mob/living/carbon/human/human_victim = victim
+ affecting = human_victim.get_bodypart(pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
+ var/armor = victim.run_armor_check(affecting, MELEE)
+ if(prob(25))
+ victim.visible_message("[user]'s bite misses [victim]!",
+ "You avoid [user]'s bite!", "You hear jaws snapping shut!", COMBAT_MESSAGE_RANGE, user)
+ to_chat(user, "Your bite misses [victim]!")
+ return TRUE
+ victim.apply_damage(rand(punchdamagelow, punchdamagehigh), BRUTE, affecting, armor)
+ victim.visible_message("[name] bites [victim]!",
+ "[name] bites you!", "You hear a chomp!", COMBAT_MESSAGE_RANGE, name)
+ to_chat(user, "You bite [victim]!")
+ if(armor >= 2)
+ return TRUE
+ for(var/d in user.diseases)
+ var/datum/disease/bite_infection = d
+ victim.ForceContractDisease(bite_infection)
+ return TRUE
+ target.attack_paw(user)
+ return TRUE
diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
index 885850f417f..7970ea7c404 100644
--- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
@@ -10,7 +10,7 @@
say_mod = "poofs" //what does a mushroom sound like
species_traits = list(MUTCOLORS, NOEYESPRITES, NO_UNDERWEAR, HAS_FLESH, HAS_BONE)
- inherent_traits = list(TRAIT_NOBREATH, TRAIT_NOFLASH)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOBREATH, TRAIT_NOFLASH)
inherent_factions = list("mushroom")
speedmod = 1.5 //faster than golems but not by much
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index 45768a0fbf2..ac5ae61d120 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -6,7 +6,8 @@
meat = /obj/item/stack/sheet/mineral/plasma
species_traits = list(NOBLOOD,NOTRANSSTING, HAS_BONE)
// plasmemes get hard to wound since they only need a severe bone wound to dismember, but unlike skellies, they can't pop their bones back into place
- inherent_traits = list(TRAIT_RESISTCOLD, TRAIT_RADIMMUNE, TRAIT_GENELESS, TRAIT_NOHUNGER, TRAIT_HARDLY_WOUNDED)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_RESISTCOLD, TRAIT_RADIMMUNE, TRAIT_GENELESS, TRAIT_NOHUNGER, TRAIT_HARDLY_WOUNDED)
+
inherent_biotypes = MOB_HUMANOID|MOB_MINERAL
mutantlungs = /obj/item/organ/lungs/plasmaman
mutanttongue = /obj/item/organ/tongue/bone/plasmaman
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index dfb4c28fb42..3177d11cb11 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -8,7 +8,7 @@
sexes = 0
meat = /obj/item/food/meat/slab/human/mutant/shadow
species_traits = list(NOBLOOD,NOEYESPRITES)
- inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH)
inherent_factions = list("faithless")
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC
mutanteyes = /obj/item/organ/eyes/night_vision
@@ -37,7 +37,7 @@
burnmod = 1.5
no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING, ITEM_SLOT_SUITSTORE)
species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYESPRITES)
- inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER)
mutanteyes = /obj/item/organ/eyes/night_vision/nightmare
mutantheart = /obj/item/organ/heart/nightmare
mutantbrain = /obj/item/organ/brain/nightmare
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index b69a1bb3fb6..ab8546daba0 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -6,7 +6,7 @@
sexes = 0
meat = /obj/item/food/meat/slab/human/mutant/skeleton
species_traits = list(NOBLOOD, HAS_BONE, NOEYESPRITES)
- inherent_traits = list(TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,\
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,\
TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH,TRAIT_XENO_IMMUNE,TRAIT_NOCLONELOSS)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
mutanttongue = /obj/item/organ/tongue/bone
diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm
index 2211e33c048..1d7013dc13c 100644
--- a/code/modules/mob/living/carbon/human/species_types/snail.dm
+++ b/code/modules/mob/living/carbon/human/species_types/snail.dm
@@ -4,7 +4,7 @@
offset_features = list(OFFSET_UNIFORM = list(0,0), OFFSET_ID = list(0,0), OFFSET_GLOVES = list(0,0), OFFSET_GLASSES = list(0,4), OFFSET_EARS = list(0,0), OFFSET_SHOES = list(0,0), OFFSET_S_STORE = list(0,0), OFFSET_FACEMASK = list(0,0), OFFSET_HEAD = list(0,0), OFFSET_FACE = list(0,0), OFFSET_BELT = list(0,0), OFFSET_BACK = list(0,0), OFFSET_SUIT = list(0,0), OFFSET_NECK = list(0,0))
default_color = "336600" //vomit green
species_traits = list(MUTCOLORS, NO_UNDERWEAR, HAS_FLESH, HAS_BONE)
- inherent_traits = list(TRAIT_NOSLIPALL)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_NOSLIPALL)
attack_verb = "slap"
say_mod = "slurs"
coldmod = 0.5 //snails only come out when its cold and wet
diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm
index 8703f790cb5..227dc3f1d3d 100644
--- a/code/modules/mob/living/carbon/human/species_types/synths.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synths.dm
@@ -4,7 +4,7 @@
say_mod = "beep boops" //inherited from a user's real species
sexes = 0
species_traits = list(NOTRANSSTING) //all of these + whatever we inherit from the real species
- inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER,TRAIT_NOBREATH)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER,TRAIT_NOBREATH)
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
meat = null
damage_overlay_type = "synth"
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
index 4911e6f1ca8..aaf6cbb5719 100644
--- a/code/modules/mob/living/carbon/human/species_types/vampire.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -3,7 +3,7 @@
id = "vampire"
default_color = "FFFFFF"
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,DRINKSBLOOD, HAS_FLESH, HAS_BONE)
- inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOHUNGER,TRAIT_NOBREATH)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
mutant_bodyparts = list("tail_human" = "None", "ears" = "None", "wings" = "None")
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | ERT_SPAWN
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index e42864ec1c2..839ae79f078 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -8,7 +8,7 @@
sexes = 0
meat = /obj/item/food/meat/slab/human/mutant/zombie
species_traits = list(NOBLOOD,NOZOMBIE,NOTRANSSTING, HAS_FLESH, HAS_BONE)
- inherent_traits = list(TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,TRAIT_EASILY_WOUNDED,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH,TRAIT_NODEATH,TRAIT_FAKEDEATH,TRAIT_NOCLONELOSS)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,TRAIT_EASILY_WOUNDED,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH,TRAIT_NODEATH,TRAIT_FAKEDEATH,TRAIT_NOCLONELOSS)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
mutanttongue = /obj/item/organ/tongue/zombie
var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg')
@@ -100,6 +100,6 @@
mutanttongue = /obj/item/organ/tongue/zombie
changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN
species_traits = list(HAS_FLESH, HAS_BONE)
- inherent_traits = list(TRAIT_EASILY_WOUNDED)
+ inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_EASILY_WOUNDED)
#undef REGENERATION_DELAY
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 22621a3750e..00000000000
--- a/code/modules/mob/living/carbon/monkey/death.dm
+++ /dev/null
@@ -1,9 +0,0 @@
-/mob/living/carbon/monkey/gib_animation()
- new /obj/effect/temp_visual/gib_animation(loc, "gibbed-m")
-
-/mob/living/carbon/monkey/dust_animation()
- new /obj/effect/temp_visual/dust_animation(loc, "dust-m")
-
-/mob/living/carbon/monkey/death(gibbed)
- walk(src,0) // Stops dead monkeys from fleeing their attacker or climbing out from inside His Grace
- . = ..()
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 42803c5aa65..00000000000
--- a/code/modules/mob/living/carbon/monkey/inventory.dm
+++ /dev/null
@@ -1,34 +0,0 @@
-/mob/living/carbon/monkey/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE)
- switch(slot)
- if(ITEM_SLOT_HANDS)
- if(get_empty_held_indexes())
- return TRUE
- return FALSE
- if(ITEM_SLOT_MASK)
- if(wear_mask)
- return FALSE
- if( !(I.slot_flags & ITEM_SLOT_MASK) )
- return FALSE
- return TRUE
- if(ITEM_SLOT_NECK)
- if(wear_neck)
- return FALSE
- if( !(I.slot_flags & ITEM_SLOT_NECK) )
- return FALSE
- return TRUE
- if(ITEM_SLOT_HEAD)
- if(head)
- return FALSE
- if( !(I.slot_flags & ITEM_SLOT_HEAD) )
- return FALSE
- return TRUE
- if(ITEM_SLOT_BACK)
- if(back)
- return FALSE
- if( !(I.slot_flags & ITEM_SLOT_BACK) )
- return FALSE
- return TRUE
- return FALSE //Unsupported slot
-
-
-
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 456518e214c..00000000000
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ /dev/null
@@ -1,135 +0,0 @@
-
-
-/mob/living/carbon/monkey
-
-/mob/living/carbon/monkey/handle_mutations_and_radiation()
- if(radiation)
- if(radiation > RAD_MOB_KNOCKDOWN && prob(RAD_MOB_KNOCKDOWN_PROB))
- if(!IsParalyzed())
- emote("collapse")
- Paralyze(RAD_MOB_KNOCKDOWN_AMOUNT)
- to_chat(src, "You feel weak.")
- if(radiation > RAD_MOB_MUTATE)
- if(prob(1))
- to_chat(src, "You mutate!")
- easy_randmut(NEGATIVE+MINOR_NEGATIVE)
- emote("gasp")
- domutcheck()
-
- if(radiation > RAD_MOB_MUTATE * 2 && prob(50))
- gorillize()
- return
- if(radiation > RAD_MOB_VOMIT && prob(RAD_MOB_VOMIT_PROB))
- vomit(10, TRUE)
- return ..()
-
-/mob/living/carbon/monkey/handle_breath_temperature(datum/gas_mixture/breath)
- if(abs(get_body_temp_normal() - breath.temperature) > 50)
- switch(breath.temperature)
- if(-INFINITY to 120)
- adjustFireLoss(3)
- if(120 to 200)
- adjustFireLoss(1.5)
- if(200 to 260)
- adjustFireLoss(0.5)
- if(360 to 400)
- adjustFireLoss(2)
- if(400 to 1000)
- adjustFireLoss(3)
- if(1000 to INFINITY)
- adjustFireLoss(8)
-
- . = ..() // interact with body heat after dealing with the hot air
-
-/mob/living/carbon/monkey/handle_environment(datum/gas_mixture/environment)
- // Run base mob body temperature proc before taking damage
- // this balances body temp to the environment and natural stabilization
- . = ..()
-
- if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !HAS_TRAIT(src, TRAIT_RESISTHEAT))
- switch(bodytemperature)
- if(360 to 400)
- throw_alert("temp", /atom/movable/screen/alert/hot, 1)
- apply_damage(HEAT_DAMAGE_LEVEL_1, BURN)
- if(400 to 460)
- throw_alert("temp", /atom/movable/screen/alert/hot, 2)
- apply_damage(HEAT_DAMAGE_LEVEL_2, BURN)
- if(460 to INFINITY)
- throw_alert("temp", /atom/movable/screen/alert/hot, 3)
- if(on_fire)
- apply_damage(HEAT_DAMAGE_LEVEL_3, BURN)
- else
- apply_damage(HEAT_DAMAGE_LEVEL_2, BURN)
-
- else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !HAS_TRAIT(src, TRAIT_RESISTCOLD))
- if(!istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell))
- switch(bodytemperature)
- if(200 to 260)
- throw_alert("temp", /atom/movable/screen/alert/cold, 1)
- apply_damage(COLD_DAMAGE_LEVEL_1, BURN)
- if(120 to 200)
- throw_alert("temp", /atom/movable/screen/alert/cold, 2)
- apply_damage(COLD_DAMAGE_LEVEL_2, BURN)
- if(-INFINITY to 120)
- throw_alert("temp", /atom/movable/screen/alert/cold, 3)
- apply_damage(COLD_DAMAGE_LEVEL_3, BURN)
- else
- clear_alert("temp")
-
- else
- clear_alert("temp")
-
- //Account for massive pressure differences
-
- var/pressure = environment.return_pressure()
- var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
- switch(adjusted_pressure)
- if(HAZARD_HIGH_PRESSURE to INFINITY)
- adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) )
- throw_alert("pressure", /atom/movable/screen/alert/highpressure, 2)
- if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE)
- throw_alert("pressure", /atom/movable/screen/alert/highpressure, 1)
- if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE)
- clear_alert("pressure")
- if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
- throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 1)
- else
- adjustBruteLoss( LOW_PRESSURE_DAMAGE )
- throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 2)
-
- return
-
-/mob/living/carbon/monkey/handle_random_events()
- if (prob(1) && prob(2))
- emote("scratch")
-
-/mob/living/carbon/monkey/has_smoke_protection()
- if(wear_mask)
- if(wear_mask.clothing_flags & BLOCK_GAS_SMOKE_EFFECT)
- return 1
-
-/mob/living/carbon/monkey/handle_fire()
- . = ..()
- if(.) //if the mob isn't on fire anymore
- return
-
- //the fire tries to damage the exposed clothes and items
- var/list/burning_items = list()
- //HEAD//
- var/obscured = check_obscured_slots(TRUE)
- if(wear_mask && !(obscured & ITEM_SLOT_MASK))
- burning_items += wear_mask
- if(wear_neck && !(obscured & ITEM_SLOT_NECK))
- burning_items += wear_neck
- if(head)
- burning_items += head
-
- if(back)
- burning_items += back
-
- for(var/X in burning_items)
- var/obj/item/I = X
- I.fire_act((fire_stacks * 50)) //damage taken is reduced to 2% of this value by fire_act()
-
- adjust_bodytemperature(BODYTEMP_HEATING_MAX)
- SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire)
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 5c411cb3df9..00000000000
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ /dev/null
@@ -1,195 +0,0 @@
-/mob/living/carbon/monkey
- name = "monkey"
- verb_say = "chimpers"
- initial_language_holder = /datum/language_holder/monkey
- gender = NEUTER
- pass_flags = PASSTABLE
- ventcrawler = VENTCRAWLER_NUDE
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
- butcher_results = list(/obj/item/food/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1)
- type_of_meat = /obj/item/food/meat/slab/monkey
- gib_type = /obj/effect/decal/cleanable/blood/gibs
- unique_name = TRUE
- can_be_shoved_into = TRUE
- blocks_emissive = EMISSIVE_BLOCK_UNIQUE
- bodyparts = list(
- /obj/item/bodypart/chest/monkey,
- /obj/item/bodypart/head/monkey,
- /obj/item/bodypart/l_arm/monkey,
- /obj/item/bodypart/r_arm/monkey,
- /obj/item/bodypart/r_leg/monkey,
- /obj/item/bodypart/l_leg/monkey,
- )
- hud_type = /datum/hud/monkey
- melee_damage_lower = 1
- melee_damage_upper = 3
- ai_controller = /datum/ai_controller/monkey
- faction = list("neutral", "monkey")
-
-/mob/living/carbon/monkey/Initialize(mapload, cubespawned=FALSE, mob/spawner)
- add_verb(src, /mob/living/proc/mob_sleep)
- add_verb(src, /mob/living/proc/toggle_resting)
-
- if(unique_name) //used to exclude pun pun
- gender = pick(MALE, FEMALE)
- real_name = name
-
- //initialize limbs
- create_bodyparts()
- create_internal_organs()
-
- . = ..()
-
- if (cubespawned)
- var/cap = CONFIG_GET(number/monkeycap)
- if (LAZYLEN(SSmobs.cubemonkeys) > cap)
- if (spawner)
- to_chat(spawner, "Bluespace harmonics prevent the spawning of more than [cap] monkeys on the station at one time!")
- return INITIALIZE_HINT_QDEL
- SSmobs.cubemonkeys += src
-
- create_dna(src)
- dna.initialize_dna(random_blood_type())
- AddComponent(/datum/component/footstep, FOOTSTEP_MOB_BAREFOOT, 1, -6)
- AddComponent(/datum/component/bloodysoles/feet)
-
-/mob/living/carbon/monkey/Destroy()
- SSmobs.cubemonkeys -= src
- return ..()
-
-/mob/living/carbon/monkey/create_reagents(max_vol, flags)
- . = ..()
- RegisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_DEL_REAGENT), .proc/on_reagent_change)
- RegisterSignal(reagents, COMSIG_PARENT_QDELETING, .proc/on_reagents_del)
-
-/// Handles removing signal hooks incase someone is crazy enough to reset the reagents datum.
-/mob/living/carbon/monkey/proc/on_reagents_del(datum/reagents/reagents)
- SIGNAL_HANDLER
- UnregisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_PARENT_QDELETING))
- return NONE
-
-/mob/living/carbon/monkey/create_internal_organs()
- internal_organs += new /obj/item/organ/appendix
- internal_organs += new /obj/item/organ/lungs
- internal_organs += new /obj/item/organ/heart
- internal_organs += new /obj/item/organ/brain
- internal_organs += new /obj/item/organ/tongue
- internal_organs += new /obj/item/organ/eyes
- internal_organs += new /obj/item/organ/ears
- internal_organs += new /obj/item/organ/liver
- internal_organs += new /obj/item/organ/stomach
- ..()
-
-/**
- * Snowflake handling for morphine and nuka cola speed mods.
- *
- * Should be moved to the reagents at some future point. As it is I'm in a hurry.
- */
-/mob/living/carbon/monkey/proc/on_reagent_change(datum/reagents/holder, ...)
- SIGNAL_HANDLER
- var/amount
- if(reagents.has_reagent(/datum/reagent/medicine/morphine))
- amount = -1
- if(reagents.has_reagent(/datum/reagent/consumable/nuka_cola))
- amount = -1
- if(amount)
- add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/monkey_reagent_speedmod, TRUE, amount)
- return NONE
-
-/mob/living/carbon/monkey/updatehealth()
- . = ..()
- var/slow = 0
- if(!HAS_TRAIT(src, TRAIT_IGNOREDAMAGESLOWDOWN))
- var/health_deficiency = (maxHealth - health)
- if(health_deficiency >= 45)
- slow += (health_deficiency / 25)
- add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/monkey_health_speedmod, TRUE, slow)
-
-/mob/living/carbon/monkey/adjust_bodytemperature(amount, min_temp=0, max_temp=INFINITY, use_insulation=FALSE, use_steps=FALSE)
- . = ..()
- var/slow = 0
- if (bodytemperature < 283.222)
- slow += ((283.222 - bodytemperature) / 10) * 1.75
- add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/monkey_temperature_speedmod, TRUE, slow)
-
-/mob/living/carbon/monkey/get_status_tab_items()
- . = ..()
- . += "Intent: [a_intent]"
- . += "Move Mode: [m_intent]"
- if(client && mind)
- var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
- if(changeling)
- . += ""
- . += "Chemical Storage: [changeling.chem_charges]/[changeling.chem_storage]"
- . += "Absorbed DNA: [changeling.absorbedcount]"
-
-/mob/living/carbon/monkey/verb/removeinternal()
- set name = "Remove Internals"
- set category = "IC"
- internal = null
- return
-
-/mob/living/carbon/monkey/can_use_guns(obj/item/G)
- if(G.trigger_guard == TRIGGER_GUARD_NONE)
- to_chat(src, "You are unable to fire this!")
- return FALSE
- return TRUE
-
-/mob/living/carbon/monkey/reagent_check(datum/reagent/R) //can metabolize all reagents
- return FALSE
-
-/mob/living/carbon/monkey/canBeHandcuffed()
- if(num_hands < 2)
- return FALSE
- return TRUE
-
-/mob/living/carbon/monkey/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null)
- if(judgement_criteria & JUDGE_EMAGGED)
- return 10 //Everyone is a criminal!
-
- var/threatcount = 0
-
- //Securitrons can't identify monkeys
- if( !(judgement_criteria & JUDGE_IGNOREMONKEYS) && (judgement_criteria & JUDGE_IDCHECK) )
- threatcount += 4
-
- //Lasertag bullshit
- if(lasercolor)
- if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve
- if(is_holding_item_of_type(/obj/item/gun/energy/laser/redtag))
- threatcount += 4
-
- if(lasercolor == "r")
- if(is_holding_item_of_type(/obj/item/gun/energy/laser/bluetag))
- threatcount += 4
-
- return threatcount
-
- //Check for weapons
- if( (judgement_criteria & JUDGE_WEAPONCHECK) && weaponcheck )
- for(var/obj/item/I in held_items) //if they're holding a gun
- if(weaponcheck.Invoke(I))
- threatcount += 4
- if(weaponcheck.Invoke(back)) //if a weapon is present in the back slot
- threatcount += 4 //trigger look_for_perp() since they're nonhuman and very likely hostile
-
- //mindshield implants imply trustworthyness
- if(HAS_TRAIT(src, TRAIT_MINDSHIELD))
- threatcount -= 1
-
- return threatcount
-
-/mob/living/carbon/monkey/IsVocal()
- if(!getorganslot(ORGAN_SLOT_LUNGS))
- return 0
- return 1
-
-/mob/living/carbon/monkey/angry
-
-/mob/living/carbon/monkey/angry/Initialize()
- . = ..()
- ai_controller.blackboard[BB_MONKEY_AGRESSIVE] = TRUE
- if(prob(10))
- var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src)
- equip_to_slot_or_del(helmet,ITEM_SLOT_HEAD)
- helmet.attack_self(src) // todo encapsulate toggle
diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm
deleted file mode 100644
index d81a859de47..00000000000
--- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm
+++ /dev/null
@@ -1,217 +0,0 @@
-/mob/living/carbon/monkey/help_shake_act(mob/living/carbon/M)
- if(M == src)
- //monkey's currently don't have check_self_for_injuries() and this is the next best thing
- to_chat(src, "You examine yourself.")
- M.examinate(src)
- return
- if(health < 0 && ishuman(M))
- var/mob/living/carbon/human/H = M
- H.do_cpr(src)
- else
- ..()
-
-/mob/living/carbon/monkey/attack_paw(mob/living/M)
- if(..()) //successful monkey bite.
- var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
- var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
- if(!affecting)
- affecting = get_bodypart(BODY_ZONE_CHEST)
- if(M.limb_destroyer)
- dismembering_strike(M, affecting.body_zone)
- if(stat != DEAD)
- var/dmg = rand(1, 5)
- apply_damage(dmg, BRUTE, affecting)
-
-/mob/living/carbon/monkey/attack_larva(mob/living/carbon/alien/larva/L)
- if(..()) //successful larva bite.
- var/damage = rand(1, 3)
- if(stat != DEAD)
- L.amount_grown = min(L.amount_grown + damage, L.max_grown)
- var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected))
- if(!affecting)
- affecting = get_bodypart(BODY_ZONE_CHEST)
- apply_damage(damage, BRUTE, affecting)
-
-/mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M)
- if(..()) //To allow surgery to return properly.
- return
-
- switch(M.a_intent)
- if("help")
- help_shake_act(M)
- if("grab")
- grabbedby(M)
- if("harm")
- M.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
- if (prob(75))
- visible_message("[M] punches [name]!", \
- "[M] punches you!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, M)
- to_chat(M, "You punch [name]!")
-
- playsound(loc, "punch", 25, TRUE, -1)
- var/damage = rand(5, 10)
- if(prob(40))
- damage = rand(10, 15)
- if(AmountUnconscious() < 100 && health > 0)
- Unconscious(rand(200, 300))
- visible_message("[M] knocks [name] out!", \
- "[M] knocks you out!", "You hear a sickening sound of flesh hitting flesh!", 5, M)
- to_chat(M, "You knock [name] out!")
- var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
- if(!affecting)
- affecting = get_bodypart(BODY_ZONE_CHEST)
- apply_damage(damage, BRUTE, affecting)
- log_combat(M, src, "attacked")
-
- else
- playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1)
- visible_message("[M]'s punch misses [name]!", \
- "You avoid [M]'s punch!", "You hear a swoosh!", COMBAT_MESSAGE_RANGE, M)
- to_chat(M, "Your punch misses [name]!")
- if("disarm")
- if(stat < UNCONSCIOUS)
- M.disarm(src)
-
-/mob/living/carbon/monkey/attack_alien(mob/living/carbon/alien/humanoid/M)
- if(..()) //if harm or disarm intent.
- if (M.a_intent == INTENT_HARM)
- if ((prob(95) && health > 0))
- playsound(loc, 'sound/weapons/slice.ogg', 25, TRUE, -1)
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- if(AmountUnconscious() < 300)
- Unconscious(rand(200, 300))
- visible_message("[M] wounds [name]!", \
- "[M] wounds you!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, M)
- to_chat(M, "You wound [name]!")
- else
- visible_message("[M] slashes [name]!", \
- "[M] slashes you!", "You hear a sickening sound of a slice!", COMBAT_MESSAGE_RANGE, M)
- to_chat(M, "You slash [name]!")
-
- var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
- log_combat(M, src, "attacked")
- if(!affecting)
- affecting = get_bodypart(BODY_ZONE_CHEST)
- if(!dismembering_strike(M, affecting.body_zone)) //Dismemberment successful
- return 1
- apply_damage(damage, BRUTE, affecting)
-
- else
- playsound(loc, 'sound/weapons/slashmiss.ogg', 25, TRUE, -1)
- visible_message("[M]'s lunge misses [name]!", \
- "You avoid [M]'s lunge!", "You hear a swoosh!", COMBAT_MESSAGE_RANGE, M)
- to_chat(M, "Your lunge misses [name]!")
-
- if (M.a_intent == INTENT_DISARM)
- var/obj/item/I = null
- playsound(loc, 'sound/weapons/pierce.ogg', 25, TRUE, -1)
- if(prob(95))
- Paralyze(20)
- visible_message("[M] tackles [name] down!", \
- "[M] tackles you down!", "You hear aggressive shuffling followed by a loud thud!", COMBAT_MESSAGE_RANGE, M)
- to_chat(M, "You tackle [name] down!")
- else
- I = get_active_held_item()
- if(dropItemToGround(I))
- visible_message("[M] disarms [name]!", \
- "[M] disarms you!", "You hear aggressive shuffling!", COMBAT_MESSAGE_RANGE, M)
- to_chat(M, "You disarm [name]!")
- else
- I = null
- log_combat(M, src, "disarmed", "[I ? " removing \the [I]" : ""]")
- updatehealth()
-
-
-/mob/living/carbon/monkey/attack_animal(mob/living/simple_animal/M)
- . = ..()
- if(.)
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
- if(!dam_zone) //Dismemberment successful
- return TRUE
- var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
- if(!affecting)
- affecting = get_bodypart(BODY_ZONE_CHEST)
- apply_damage(damage, M.melee_damage_type, affecting)
-
-/mob/living/carbon/monkey/attack_slime(mob/living/simple_animal/slime/M)
- if(..()) //successful slime attack
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- if(M.is_adult)
- damage = rand(20, 40)
- var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
- if(!dam_zone) //Dismemberment successful
- return 1
- var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
- if(!affecting)
- affecting = get_bodypart(BODY_ZONE_CHEST)
- apply_damage(damage, BRUTE, affecting)
-
-/mob/living/carbon/monkey/attack_hulk(mob/living/carbon/human/user)
- . = ..()
- if(!.)
- return
- var/hulk_verb = pick("smash", "pummel")
- playsound(loc, user.dna.species.attack_sound, 25, TRUE, -1)
- visible_message("[user] [hulk_verb]ed [src]!", \
- "[user] [hulk_verb]ed [src]!", "You hear a sickening sound of flesh hitting flesh!", null, user)
- to_chat(user, "You [hulk_verb] [src]!")
- apply_damage(15, BRUTE, wound_bonus=10)
-
-/mob/living/carbon/monkey/acid_act(acidpwr, acid_volume, bodyzone_hit)
- . = TRUE
- if(!bodyzone_hit || bodyzone_hit == BODY_ZONE_HEAD)
- if(wear_mask)
- if(!(wear_mask.resistance_flags & UNACIDABLE))
- wear_mask.acid_act(acidpwr, acid_volume)
- else
- to_chat(src, "Your mask protects you from the acid.")
- return
- if(head)
- if(!(head.resistance_flags & UNACIDABLE))
- head.acid_act(acidpwr, acid_volume)
- else
- to_chat(src, "Your hat protects you from the acid.")
- return
- take_bodypart_damage(acidpwr * min(0.6, acid_volume*0.1))
-
-/mob/living/carbon/monkey/ex_act(severity, target, origin)
- if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src))
- return
- ..()
- if(QDELETED(src))
- return
- var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS)
- switch (severity)
- if (EXPLODE_DEVASTATE)
- gib()
- return
-
- if (EXPLODE_HEAVY)
- take_overall_damage(60, 60)
- damage_clothes(200, BRUTE, BOMB)
- if (ears && !HAS_TRAIT_FROM(src, TRAIT_DEAF, CLOTHING_TRAIT))
- ears.adjustEarDamage(30, 120)
- if(prob(70))
- Unconscious(200)
-
- if(EXPLODE_LIGHT)
- take_overall_damage(30, 0)
- damage_clothes(50, BRUTE, BOMB)
- if (ears && !HAS_TRAIT_FROM(src, TRAIT_DEAF, CLOTHING_TRAIT))
- ears.adjustEarDamage(15,60)
- if (prob(50))
- Unconscious(160)
-
-
- //attempt to dismember bodyparts
- if(severity <= 2)
- var/max_limb_loss = round(4/severity) //so you don't lose four limbs at severity 3.
- for(var/X in bodyparts)
- var/obj/item/bodypart/BP = X
- if(prob(50/severity) && BP.body_zone != BODY_ZONE_CHEST)
- BP.brute_dam = BP.max_damage
- BP.dismember()
- max_limb_loss--
- if(!max_limb_loss)
- break
diff --git a/code/modules/mob/living/carbon/monkey/monkey_update_icons.dm b/code/modules/mob/living/carbon/monkey/monkey_update_icons.dm
deleted file mode 100644
index 400948b3ece..00000000000
--- a/code/modules/mob/living/carbon/monkey/monkey_update_icons.dm
+++ /dev/null
@@ -1,77 +0,0 @@
-
-/mob/living/carbon/monkey/regenerate_icons()
- if(!..())
- update_body_parts()
- update_hair()
- update_inv_wear_mask()
- update_inv_head()
- update_inv_back()
- update_transform()
-
-
-////////
-
-
-/mob/living/carbon/monkey/update_hair()
- remove_overlay(HAIR_LAYER)
-
- var/obj/item/bodypart/head/HD = get_bodypart(BODY_ZONE_HEAD)
- if(!HD) //Decapitated
- return
-
- if(HAS_TRAIT(src, TRAIT_HUSK))
- return
-
- var/hair_hidden = 0
-
- if(head)
- var/obj/item/I = head
- if(I.flags_inv & HIDEHAIR)
- hair_hidden = 1
- if(wear_mask)
- var/obj/item/clothing/mask/M = wear_mask
- if(M.flags_inv & HIDEHAIR)
- hair_hidden = 1
- if(!hair_hidden)
- if(!getorgan(/obj/item/organ/brain)) //Applies the debrained overlay if there is no brain
- overlays_standing[HAIR_LAYER] = mutable_appearance('icons/mob/human_face.dmi', "debrained", -HAIR_LAYER)
- apply_overlay(HAIR_LAYER)
-
-
-/mob/living/carbon/monkey/update_fire()
- ..("Monkey_burning")
-
-/mob/living/carbon/monkey/update_inv_legcuffed()
- remove_overlay(LEGCUFF_LAYER)
- if(legcuffed)
- var/mutable_appearance/legcuff_overlay = mutable_appearance('icons/mob/mob.dmi', "legcuff1", -LEGCUFF_LAYER)
- legcuff_overlay.pixel_y = 8
- overlays_standing[LEGCUFF_LAYER] = legcuff_overlay
- apply_overlay(LEGCUFF_LAYER)
-
-
-//monkey HUD updates for items in our inventory
-
-//update whether our head item appears on our hud.
-/mob/living/carbon/monkey/update_hud_head(obj/item/I)
- if(client && hud_used?.hud_shown)
- I.screen_loc = ui_monkey_head
- client.screen += I
-
-//update whether our mask item appears on our hud.
-/mob/living/carbon/monkey/update_hud_wear_mask(obj/item/I)
- if(client && hud_used?.hud_shown)
- I.screen_loc = ui_monkey_mask
- client.screen += I
-
-//update whether our neck item appears on our hud.
-/mob/living/carbon/monkey/update_hud_neck(obj/item/I)
- if(client && hud_used?.hud_shown)
- I.screen_loc = ui_monkey_neck
- client.screen += I
-
-//update whether our back item appears on our hud.
-/mob/living/carbon/monkey/update_hud_back(obj/item/I)
- if(client && hud_used?.hud_shown)
- I.screen_loc = ui_monkey_back
- client.screen += I
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 91b32fe3695..e1048c00254 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -224,7 +224,7 @@
return TRUE
-/mob/living/attack_paw(mob/living/carbon/monkey/M)
+/mob/living/attack_paw(mob/living/carbon/human/M)
if(isturf(loc) && istype(loc.loc, /area/start))
to_chat(M, "No attacking people at spawn, you jackass.")
return FALSE
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 6996895dfce..3d5cf896f5d 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -106,7 +106,7 @@
var/health_doll_icon ///if this exists AND the normal sprite is bigger than 32x32, this is the replacement icon state (because health doll size limitations). the icon will always be screen_gen.dmi
var/last_bumped = 0
- var/unique_name = 0 ///if a mob's name should be appended with an id when created e.g. Mob (666)
+ var/unique_name = FALSE ///if a mob's name should be appended with an id when created e.g. Mob (666)
var/numba = 0 ///the id a mob gets when it's created
var/list/butcher_results = null ///these will be yielded from butchering with a probability chance equal to the butcher item's effectiveness
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index b50fa489a71..1a3a6df9241 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -408,8 +408,8 @@
//if they are holding or wearing a card that has access, that works
if(check_access(H.get_active_held_item()) || check_access(H.wear_id))
return TRUE
- else if(ismonkey(M))
- var/mob/living/carbon/monkey/george = M
+ else if(isalien(M))
+ var/mob/living/carbon/george = M
//they can only hold things :(
if(isitem(george.get_active_held_item()))
return check_access(george.get_active_held_item())
diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm
index 687e9d04e2d..a1bcd48d9c3 100644
--- a/code/modules/mob/living/simple_animal/animal_defense.dm
+++ b/code/modules/mob/living/simple_animal/animal_defense.dm
@@ -66,7 +66,7 @@
to_chat(user, "You punch [src]!")
adjustBruteLoss(15)
-/mob/living/simple_animal/attack_paw(mob/living/carbon/monkey/M)
+/mob/living/simple_animal/attack_paw(mob/living/carbon/human/M)
if(..()) //successful monkey bite.
if(stat != DEAD)
var/damage = rand(1, 3)
diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
index f346ed5e1c1..3554c6ce72e 100644
--- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
+++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
@@ -80,7 +80,7 @@
/mob/living/simple_animal/hostile/gorilla/CanAttack(atom/the_target)
var/list/parts = target_bodyparts(target)
- return ..() && !istype(the_target, /mob/living/carbon/monkey) && (!parts || parts.len > 3)
+ return ..() && !ismonkey(the_target) && (!parts || parts.len > 3)
/mob/living/simple_animal/hostile/gorilla/CanSmashTurfs(turf/T)
diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
index 08bb29d32f3..c933901552f 100644
--- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -65,7 +65,7 @@
qdel(src)
/obj/item/organ/body_egg/changeling_egg/proc/Pop()
- var/mob/living/carbon/monkey/M = new(owner)
+ var/mob/living/carbon/human/species/monkey/M = new(owner)
for(var/obj/item/organ/I in src)
I.Insert(M, 1)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index 35e647f676d..239a2375518 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -518,7 +518,7 @@
NewTerrainChairs = /obj/structure/chair/wood
NewTerrainTables = /obj/structure/table/wood
NewFlora = list(/obj/structure/flora/ausbushes/sparsegrass, /obj/structure/flora/ausbushes/fernybush, /obj/structure/flora/ausbushes/leafybush,
- /obj/structure/flora/ausbushes/grassybush, /obj/structure/flora/ausbushes/sunnybush, /obj/structure/flora/tree/palm, /mob/living/carbon/monkey)
+ /obj/structure/flora/ausbushes/grassybush, /obj/structure/flora/ausbushes/sunnybush, /obj/structure/flora/tree/palm, /mob/living/carbon/human/species/monkey)
florachance = 20
if("ayy lmao") //Beneficial, turns stuff into alien alloy which is useful to cargo and research. Also repairs atmos.
NewTerrainFloors = /turf/open/floor/plating/abductor
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 76e54ed17c2..e1c2dcac5ff 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -305,7 +305,7 @@
handle_automated_speech(1) //assured speak/emote
return
-/mob/living/simple_animal/parrot/attack_paw(mob/living/carbon/monkey/M)
+/mob/living/simple_animal/parrot/attack_paw(mob/living/carbon/human/M)
return attack_hand(M)
/mob/living/simple_animal/parrot/attack_alien(mob/living/carbon/alien/M)
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index c1507dc4e70..e344a7bf8de 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -294,7 +294,7 @@
attacked += 10
-/mob/living/simple_animal/slime/attack_paw(mob/living/carbon/monkey/M)
+/mob/living/simple_animal/slime/attack_paw(mob/living/carbon/human/M)
if(..()) //successful monkey bite.
attacked += 10
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 982d297977b..901651d6980 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -1,14 +1,11 @@
#define TRANSFORMATION_DURATION 22
-/mob/living/carbon/proc/monkeyize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG | TR_KEEPSTAMINADAMAGE | TR_KEEPAI))
+/mob/living/carbon/proc/monkeyize()
if (notransform || transformation_timer)
return
- if(tr_flags & TR_KEEPITEMS)
- var/Itemlist = get_equipped_items(TRUE)
- Itemlist += held_items
- for(var/obj/item/W in Itemlist)
- dropItemToGround(W)
+ if(ismonkey(src))
+ return
//Make mob invisible and spawn animation
notransform = TRUE
@@ -19,339 +16,45 @@
new /obj/effect/temp_visual/monkeyify(loc)
- transformation_timer = addtimer(CALLBACK(src, .proc/finish_monkeyize, tr_flags), TRANSFORMATION_DURATION, TIMER_UNIQUE)
+ transformation_timer = addtimer(CALLBACK(src, .proc/finish_monkeyize), TRANSFORMATION_DURATION, TIMER_UNIQUE)
-/mob/living/carbon/proc/finish_monkeyize(tr_flags)
+/mob/living/carbon/proc/finish_monkeyize()
transformation_timer = null
-
- var/list/missing_bodyparts_zones = get_missing_limbs()
- var/list/stored_implants = list()
-
- if (tr_flags & TR_KEEPIMPLANTS)
- for(var/X in implants)
- var/obj/item/implant/IMP = X
- stored_implants += IMP
- IMP.removed(src, 1, 1)
-
- var/list/int_organs = list()
- var/obj/item/cavity_object
-
- var/obj/item/bodypart/chest/CH = get_bodypart(BODY_ZONE_CHEST)
- if(CH.cavity_item)
- cavity_object = CH.cavity_item
- CH.cavity_item = null
-
- var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey( loc )
-
- // hash the original name?
- if(tr_flags & TR_HASHNAME)
- O.name = "monkey ([copytext_char(md5(real_name), 2, 6)])"
- O.real_name = "monkey ([copytext_char(md5(real_name), 2, 6)])"
-
- //handle DNA and other attributes
- dna.transfer_identity(O)
- O.updateappearance(icon_update=0)
-
- if(tr_flags & TR_KEEPSE)
- O.dna.mutation_index = dna.mutation_index
- O.dna.default_mutation_genes = dna.default_mutation_genes
- O.dna.set_se(1, GET_INITIALIZED_MUTATION(RACEMUT))
-
- if(suiciding)
- O.set_suicide(suiciding)
- O.a_intent = INTENT_HARM
-
- //keep viruses?
- if (tr_flags & TR_KEEPVIRUS)
- O.diseases = diseases
- diseases = list()
- for(var/thing in O.diseases)
- var/datum/disease/D = thing
- D.affected_mob = O
-
- //keep damage?
- if (tr_flags & TR_KEEPDAMAGE)
- O.setToxLoss(getToxLoss(), 0)
- O.adjustBruteLoss(getBruteLoss(), 0)
- O.setOxyLoss(getOxyLoss(), 0)
- O.setCloneLoss(getCloneLoss(), 0)
- O.adjustFireLoss(getFireLoss(), 0)
- O.setOrganLoss(ORGAN_SLOT_BRAIN, getOrganLoss(ORGAN_SLOT_BRAIN))
- O.updatehealth()
- O.radiation = radiation
-
- //re-add implants to new mob
- if (tr_flags & TR_KEEPIMPLANTS)
- for(var/Y in implants)
- var/obj/item/implant/IMP = Y
- IMP.implant(O, null, 1)
-
- //re-add organs to new mob. this order prevents moving the mind to a brain at any point
- if(tr_flags & TR_KEEPORGANS)
- for(var/X in O.internal_organs)
- var/obj/item/organ/I = X
- I.Remove(O, 1)
-
- if(mind)
- mind.transfer_to(O)
- var/datum/antagonist/changeling/changeling = O.mind.has_antag_datum(/datum/antagonist/changeling)
- if(changeling)
- var/datum/action/changeling/humanform/hf = new
- changeling.purchasedpowers += hf
- changeling.regain_powers()
-
- for(var/X in internal_organs)
- var/obj/item/organ/I = X
- int_organs += I
- I.Remove(src, 1)
-
- for(var/X in int_organs)
- var/obj/item/organ/I = X
- I.Insert(O, 1)
-
- var/obj/item/bodypart/chest/torso = O.get_bodypart(BODY_ZONE_CHEST)
- if(cavity_object)
- torso.cavity_item = cavity_object //cavity item is given to the new chest
- cavity_object.forceMove(O)
-
- for(var/missing_zone in missing_bodyparts_zones)
- var/obj/item/bodypart/BP = O.get_bodypart(missing_zone)
- BP.drop_limb(1)
- if(!(tr_flags & TR_KEEPORGANS)) //we didn't already get rid of the organs of the newly spawned mob
- for(var/X in O.internal_organs)
- var/obj/item/organ/G = X
- if(BP.body_zone == check_zone(G.zone))
- if(mind?.has_antag_datum(/datum/antagonist/changeling) && istype(G, /obj/item/organ/brain))
- continue //so headless changelings don't lose their brain when transforming
- qdel(G) //we lose the organs in the missing limbs
- qdel(BP)
-
- //transfer stuns
- if(tr_flags & TR_KEEPSTUNS)
- O.Stun(AmountStun(), ignore_canstun = TRUE)
- O.Knockdown(AmountKnockdown(), ignore_canstun = TRUE)
- O.Immobilize(AmountImmobilized(), ignore_canstun = TRUE)
- O.Paralyze(AmountParalyzed(), ignore_canstun = TRUE)
- O.Unconscious(AmountUnconscious(), ignore_canstun = TRUE)
- O.Sleeping(AmountSleeping())
-
- //transfer reagents
- if(tr_flags & TR_KEEPREAGENTS)
- reagents.trans_to(O, reagents.total_volume)
-
- //transfer mind if we didn't yet
- if(mind)
- mind.transfer_to(O)
- var/datum/antagonist/changeling/changeling = O.mind.has_antag_datum(/datum/antagonist/changeling)
- if(changeling)
- var/datum/action/changeling/humanform/hf = new
- changeling.purchasedpowers += hf
- changeling.regain_powers()
- //transfer stamina damage
- if(tr_flags & TR_KEEPSTAMINADAMAGE)
- O.adjustStaminaLoss(getStaminaLoss())
-
- //if we have an AI, transfer it; if we don't, make sure the new thing doesn't either
- if(tr_flags & TR_KEEPAI)
- if(ai_controller)
- ai_controller.PossessPawn(O)
- else if(O.ai_controller)
- QDEL_NULL(O.ai_controller)
-
- if (tr_flags & TR_DEFAULTMSG)
- to_chat(O, "You are now a monkey.")
-
- for(var/A in loc.vars)
- if(loc.vars[A] == src)
- loc.vars[A] = O
-
- transfer_observers_to(O)
-
- . = O
-
- qdel(src)
+ to_chat(src, "You are now a monkey.")
+ notransform = FALSE
+ icon = initial(icon)
+ invisibility = 0
+ set_species(/datum/species/monkey)
+ return src
////////////////////////// Humanize //////////////////////////////
//Could probably be merged with monkeyize but other transformations got their own procs, too
-/mob/living/carbon/proc/humanize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG | TR_KEEPAI))
+/mob/living/carbon/proc/humanize()
if (notransform || transformation_timer)
return
- //now the rest
- if (tr_flags & TR_KEEPITEMS)
- var/Itemlist = get_equipped_items(TRUE)
- Itemlist += held_items
- for(var/obj/item/W in Itemlist)
- dropItemToGround(W, TRUE)
- if (client)
- client.screen -= W
+ if(!ismonkey(src))
+ return
//Make mob invisible and spawn animation
notransform = TRUE
Paralyze(TRANSFORMATION_DURATION, ignore_canstun = TRUE)
-
icon = null
cut_overlays()
invisibility = INVISIBILITY_MAXIMUM
+
new /obj/effect/temp_visual/monkeyify/humanify(loc)
+ transformation_timer = addtimer(CALLBACK(src, .proc/finish_humanize), TRANSFORMATION_DURATION, TIMER_UNIQUE)
- transformation_timer = addtimer(CALLBACK(src, .proc/finish_humanize, tr_flags), TRANSFORMATION_DURATION, TIMER_UNIQUE)
-
-/mob/living/carbon/proc/finish_humanize(tr_flags)
+/mob/living/carbon/proc/finish_humanize()
transformation_timer = null
-
- var/list/stored_implants = list()
- var/list/int_organs = list()
-
- if (tr_flags & TR_KEEPIMPLANTS)
- for(var/X in implants)
- var/obj/item/implant/IMP = X
- stored_implants += IMP
- IMP.removed(src, 1, 1)
-
- var/list/missing_bodyparts_zones = get_missing_limbs()
-
- var/obj/item/cavity_object
-
- var/obj/item/bodypart/chest/CH = get_bodypart(BODY_ZONE_CHEST)
- if(CH.cavity_item)
- cavity_object = CH.cavity_item
- CH.cavity_item = null
-
- var/mob/living/carbon/human/O = new( loc )
- for(var/obj/item/C in O.loc)
- if(C.anchored)
- continue
- O.equip_to_appropriate_slot(C)
-
- dna.transfer_identity(O)
- O.updateappearance(mutcolor_update=1)
-
- if(findtext(O.dna.real_name, "monkey", 1, 7)) //7 == length("monkey") + 1
- O.real_name = random_unique_name(O.gender)
- O.dna.generate_unique_enzymes(O)
- else
- O.real_name = O.dna.real_name
- O.name = O.real_name
-
- if(tr_flags & TR_KEEPSE)
- O.dna.mutation_index = dna.mutation_index
- O.dna.default_mutation_genes = dna.default_mutation_genes
- O.dna.set_se(0, GET_INITIALIZED_MUTATION(RACEMUT))
- O.domutcheck()
-
- if(suiciding)
- O.set_suicide(suiciding)
-
- //keep viruses?
- if (tr_flags & TR_KEEPVIRUS)
- O.diseases = diseases
- diseases = null //null the old diseases, bye bye!
- for(var/thing in O.diseases)
- var/datum/disease/D = thing
- D.affected_mob = O
- O.med_hud_set_status()
-
- //keep damage?
- if (tr_flags & TR_KEEPDAMAGE)
- O.setToxLoss(getToxLoss(), 0)
- O.adjustBruteLoss(getBruteLoss(), 0)
- O.setOxyLoss(getOxyLoss(), 0)
- O.setCloneLoss(getCloneLoss(), 0)
- O.adjustFireLoss(getFireLoss(), 0)
- O.adjustOrganLoss(ORGAN_SLOT_BRAIN, getOrganLoss(ORGAN_SLOT_BRAIN))
- O.updatehealth()
- O.radiation = radiation
-
- //re-add implants to new mob
- if (tr_flags & TR_KEEPIMPLANTS)
- for(var/Y in implants)
- var/obj/item/implant/IMP = Y
- IMP.implant(O, null, 1)
-
- if(tr_flags & TR_KEEPORGANS)
- for(var/X in O.internal_organs)
- var/obj/item/organ/I = X
- I.Remove(O, 1)
-
- if(mind)
- mind.transfer_to(O)
- var/datum/antagonist/changeling/changeling = O.mind.has_antag_datum(/datum/antagonist/changeling)
- if(changeling)
- for(var/datum/action/changeling/humanform/HF in changeling.purchasedpowers)
- changeling.purchasedpowers -= HF
- changeling.regain_powers()
-
- for(var/X in internal_organs)
- var/obj/item/organ/I = X
- int_organs += I
- I.Remove(src, 1)
-
- for(var/X in int_organs)
- var/obj/item/organ/I = X
- I.Insert(O, 1)
-
-
- var/obj/item/bodypart/chest/torso = get_bodypart(BODY_ZONE_CHEST)
- if(cavity_object)
- torso.cavity_item = cavity_object //cavity item is given to the new chest
- cavity_object.forceMove(O)
-
- for(var/missing_zone in missing_bodyparts_zones)
- var/obj/item/bodypart/BP = O.get_bodypart(missing_zone)
- BP.drop_limb(1)
- if(!(tr_flags & TR_KEEPORGANS)) //we didn't already get rid of the organs of the newly spawned mob
- for(var/X in O.internal_organs)
- var/obj/item/organ/G = X
- if(BP.body_zone == check_zone(G.zone))
- if(mind?.has_antag_datum(/datum/antagonist/changeling) && istype(G, /obj/item/organ/brain))
- continue //so headless changelings don't lose their brain when transforming
- qdel(G) //we lose the organs in the missing limbs
- qdel(BP)
-
- //transfer stuns
- if(tr_flags & TR_KEEPSTUNS)
- O.Stun(AmountStun(), ignore_canstun = TRUE)
- O.Knockdown(AmountKnockdown(), ignore_canstun = TRUE)
- O.Immobilize(AmountImmobilized(), ignore_canstun = TRUE)
- O.Paralyze(AmountParalyzed(), ignore_canstun = TRUE)
- O.Unconscious(AmountUnconscious(), ignore_canstun = TRUE)
- O.Sleeping(AmountSleeping())
-
- //transfer reagents
- if(tr_flags & TR_KEEPREAGENTS)
- reagents.trans_to(O, reagents.total_volume)
-
- if(mind)
- mind.transfer_to(O)
- var/datum/antagonist/changeling/changeling = O.mind.has_antag_datum(/datum/antagonist/changeling)
- if(changeling)
- for(var/datum/action/changeling/humanform/HF in changeling.purchasedpowers)
- changeling.purchasedpowers -= HF
- changeling.regain_powers()
-
- //if we have an AI, transfer it; if we don't, make sure the new thing doesn't either
- if(tr_flags & TR_KEEPAI)
- if(ai_controller)
- ai_controller.PossessPawn(O)
- else if(O.ai_controller)
- QDEL_NULL(O.ai_controller)
-
-
- O.a_intent = INTENT_HELP
- if (tr_flags & TR_DEFAULTMSG)
- to_chat(O, "You are now a human.")
-
- transfer_observers_to(O)
-
- . = O
-
- for(var/A in loc.vars)
- if(loc.vars[A] == src)
- loc.vars[A] = O
-
- qdel(src)
+ to_chat(src, "You are now a human.")
+ notransform = FALSE
+ icon = initial(icon)
+ invisibility = 0
+ set_species(/datum/species/human)
+ return src
/mob/living/carbon/human/AIize(transfer_after = TRUE, client/preference_source)
if (notransform)
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 8bb95b2ede5..bb4bf60fa60 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -192,7 +192,7 @@
randomize = pick("monkey","robot","slime","xeno","humanoid","animal")
switch(randomize)
if("monkey")
- new_mob = new /mob/living/carbon/monkey(M.loc)
+ new_mob = new /mob/living/carbon/human/species/monkey(M.loc)
if("robot")
var/robot = pick(200;/mob/living/silicon/robot,
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 7f644331de6..9fae1a42719 100755
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -314,7 +314,7 @@
/datum/reagent/consumable/condensedcapsaicin/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume)
. = ..()
- if(!ishuman(exposed_mob) && !ismonkey(exposed_mob))
+ if(!ishuman(exposed_mob))
return
var/mob/living/carbon/victim = exposed_mob
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 1255e681155..82115ba57f0 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -2015,7 +2015,7 @@
/datum/reagent/magillitis/on_mob_life(mob/living/carbon/M)
..()
- if((ismonkey(M) || ishuman(M)) && current_cycle >= 10)
+ if((ishuman(M)) && current_cycle >= 10)
M.gorillize()
/datum/reagent/growthserum
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index b3d18309bd7..978e23daa6d 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -446,7 +446,7 @@
M.gib()
else
M.vomit(blood = TRUE, stun = TRUE) //not having a redo of itching powder (hopefully)
- new /mob/living/carbon/monkey(location, TRUE)
+ new /mob/living/carbon/human/species/monkey(location, TRUE)
//water electrolysis
/datum/chemical_reaction/electrolysis
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index 411d4ae809b..6b01eba1afa 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -119,12 +119,10 @@
hotkey_help.Grant(user)
actions += hotkey_help
- RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL, .proc/XenoSlimeClickCtrl)
+ RegisterSignal(user, COMSIG_MOB_CTRL_CLICKED, .proc/on_ctrl_click)
RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT, .proc/XenoSlimeClickAlt)
RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT, .proc/XenoSlimeClickShift)
RegisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT, .proc/XenoTurfClickShift)
- RegisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL, .proc/XenoTurfClickCtrl)
- RegisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL, .proc/XenoMonkeyClickCtrl)
//Checks for recycler on every interact, prevents issues with load order on certain maps.
if(!connected_recycler)
@@ -134,12 +132,10 @@
connected_recycler.connected += src
/obj/machinery/computer/camera_advanced/xenobio/remove_eye_control(mob/living/user)
- UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL)
+ UnregisterSignal(user, COMSIG_MOB_CTRL_CLICKED)
UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT)
UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT)
UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT)
- UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL)
- UnregisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL)
..()
/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params)
@@ -261,7 +257,7 @@
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
if(X.monkeys >= 1)
- var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(remote_eye.loc, TRUE, owner)
+ var/mob/living/carbon/human/species/monkey/food = new /mob/living/carbon/human/species/monkey(remote_eye.loc, TRUE, owner)
if (!QDELETED(food))
food.LAssailant = C
X.monkeys--
@@ -290,7 +286,9 @@
to_chat(owner, "There is no connected monkey recycler. Use a multitool to link one.")
return
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
- for(var/mob/living/carbon/monkey/M in remote_eye.loc)
+ for(var/mob/living/carbon/human/M in remote_eye.loc)
+ if(!ismonkey(M))
+ continue
if(M.stat)
M.visible_message("[M] vanishes as [M.p_theyre()] reclaimed for recycling!")
recycler.use_power(500)
@@ -359,10 +357,6 @@
//
// Alternate clicks for slime, monkey and open turf if using a xenobio console
-// Scans slime
-/mob/living/simple_animal/slime/CtrlClick(mob/user)
- SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_CTRL, src)
- ..()
//Feeds a potion to slime
/mob/living/simple_animal/slime/AltClick(mob/user)
@@ -379,15 +373,14 @@
SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_SHIFT, src)
..()
-//Place monkey
-/turf/open/CtrlClick(mob/user)
- SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_CTRL, src)
- ..()
-
-//Pick up monkey
-/mob/living/carbon/monkey/CtrlClick(mob/user)
- SEND_SIGNAL(user, COMSIG_XENO_MONKEY_CLICK_CTRL, src)
- ..()
+/obj/machinery/computer/camera_advanced/xenobio/proc/on_ctrl_click(datum/source, atom/clicked_atom)
+ SIGNAL_HANDLER
+ if(ismonkey(clicked_atom))
+ XenoMonkeyClickCtrl(source, clicked_atom)
+ if(isopenturf(clicked_atom))
+ XenoTurfClickCtrl(source, clicked_atom)
+ if(isslime(clicked_atom))
+ XenoSlimeClickCtrl(source, clicked_atom)
// Scans slime
/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/simple_animal/slime/S)
@@ -463,7 +456,7 @@
var/area/turfarea = get_area(T)
if(turfarea.name == E.allowed_area || (turfarea.area_flags & XENOBIOLOGY_COMPATIBLE))
if(X.monkeys >= 1)
- var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(T, TRUE, C)
+ var/mob/living/carbon/human/food = new /mob/living/carbon/human/species/monkey(T, TRUE, C)
if (!QDELETED(food))
food.LAssailant = C
X.monkeys--
@@ -473,7 +466,9 @@
to_chat(C, "[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.")
//Pick up monkey
-/obj/machinery/computer/camera_advanced/xenobio/proc/XenoMonkeyClickCtrl(mob/living/user, mob/living/carbon/monkey/M)
+/obj/machinery/computer/camera_advanced/xenobio/proc/XenoMonkeyClickCtrl(mob/living/user, mob/living/carbon/human/M)
+ if(!ismonkey(M))
+ return
if(!isturf(M.loc) || !GLOB.cameranet.checkTurfVis(M.loc))
to_chat(user, "Target is not near a camera. Cannot proceed.")
return
diff --git a/code/modules/spells/spell_types/pointed/barnyard.dm b/code/modules/spells/spell_types/pointed/barnyard.dm
index a62f7d8e275..e35fb63d475 100644
--- a/code/modules/spells/spell_types/pointed/barnyard.dm
+++ b/code/modules/spells/spell_types/pointed/barnyard.dm
@@ -16,7 +16,7 @@
active_msg = "You prepare to curse a target..."
deactive_msg = "You dispel the curse..."
/// List of mobs which are allowed to be a target of the spell
- var/static/list/compatible_mobs_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/carbon/monkey))
+ var/static/list/compatible_mobs_typecache = typecacheof(list(/mob/living/carbon/human))
/obj/effect/proc_holder/spell/pointed/barnyardcurse/cast(list/targets, mob/user)
if(!targets.len)
diff --git a/code/modules/spells/spell_types/pointed/duffelbag_curse.dm b/code/modules/spells/spell_types/pointed/duffelbag_curse.dm
index 6a3e465dc60..9f62b7cc336 100644
--- a/code/modules/spells/spell_types/pointed/duffelbag_curse.dm
+++ b/code/modules/spells/spell_types/pointed/duffelbag_curse.dm
@@ -16,7 +16,7 @@
active_msg = "You prepare to curse a target..."
deactive_msg = "You dispel the curse..."
/// List of mobs which are allowed to be a target of the spell
- var/static/list/compatible_mobs_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/carbon/monkey))
+ var/static/list/compatible_mobs_typecache = typecacheof(list(/mob/living/carbon/human))
/obj/effect/proc_holder/spell/pointed/duffelbagcurse/cast(list/targets, mob/user)
if(!targets.len)
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
index 410e10bc7e8..debe7528da0 100644
--- a/code/modules/station_goals/dna_vault.dm
+++ b/code/modules/station_goals/dna_vault.dm
@@ -96,8 +96,8 @@
to_chat(user, "Plant data added to local storage.")
//animals
- var/static/list/non_simple_animals = typecacheof(list(/mob/living/carbon/monkey, /mob/living/carbon/alien))
- if(isanimal(target) || is_type_in_typecache(target,non_simple_animals))
+ var/static/list/non_simple_animals = typecacheof(list(/mob/living/carbon/alien))
+ if(isanimal(target) || is_type_in_typecache(target,non_simple_animals) || ismonkey(target))
if(isanimal(target))
var/mob/living/simple_animal/A = target
if(!A.healable)//simple approximation of being animal not a robot or similar
diff --git a/code/modules/surgery/advanced/bioware/cortex_folding.dm b/code/modules/surgery/advanced/bioware/cortex_folding.dm
index 0ec190202be..f6e3b4e9784 100644
--- a/code/modules/surgery/advanced/bioware/cortex_folding.dm
+++ b/code/modules/surgery/advanced/bioware/cortex_folding.dm
@@ -9,7 +9,7 @@
/datum/surgery_step/fold_cortex,
/datum/surgery_step/close)
possible_locs = list(BODY_ZONE_HEAD)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
bioware_target = BIOWARE_CORTEX
/datum/surgery/advanced/bioware/cortex_folding/can_start(mob/user, mob/living/carbon/target)
diff --git a/code/modules/surgery/advanced/bioware/cortex_imprint.dm b/code/modules/surgery/advanced/bioware/cortex_imprint.dm
index 879842bd6c8..24b644f6d59 100644
--- a/code/modules/surgery/advanced/bioware/cortex_imprint.dm
+++ b/code/modules/surgery/advanced/bioware/cortex_imprint.dm
@@ -9,7 +9,7 @@
/datum/surgery_step/imprint_cortex,
/datum/surgery_step/close)
possible_locs = list(BODY_ZONE_HEAD)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
bioware_target = BIOWARE_CORTEX
/datum/surgery/advanced/bioware/cortex_imprint/can_start(mob/user, mob/living/carbon/target)
diff --git a/code/modules/surgery/advanced/lobotomy.dm b/code/modules/surgery/advanced/lobotomy.dm
index 86765a83462..b20420b506c 100644
--- a/code/modules/surgery/advanced/lobotomy.dm
+++ b/code/modules/surgery/advanced/lobotomy.dm
@@ -9,7 +9,7 @@
/datum/surgery_step/lobotomize,
/datum/surgery_step/close)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_HEAD)
requires_bodypart_type = 0
diff --git a/code/modules/surgery/advanced/pacification.dm b/code/modules/surgery/advanced/pacification.dm
index 78ac422e62e..7fe9caf8e6e 100644
--- a/code/modules/surgery/advanced/pacification.dm
+++ b/code/modules/surgery/advanced/pacification.dm
@@ -8,7 +8,7 @@
/datum/surgery_step/pacify,
/datum/surgery_step/close)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_HEAD)
requires_bodypart_type = 0
diff --git a/code/modules/surgery/advanced/viral_bonding.dm b/code/modules/surgery/advanced/viral_bonding.dm
index cf0b1cc3d7e..d2712cb36ad 100644
--- a/code/modules/surgery/advanced/viral_bonding.dm
+++ b/code/modules/surgery/advanced/viral_bonding.dm
@@ -8,7 +8,7 @@
/datum/surgery_step/viral_bond,
/datum/surgery_step/close)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_CHEST)
/datum/surgery/advanced/viral_bonding/can_start(mob/user, mob/living/carbon/target)
diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm
index 412386f7d0a..d33a49ca418 100644
--- a/code/modules/surgery/amputation.dm
+++ b/code/modules/surgery/amputation.dm
@@ -2,7 +2,7 @@
/datum/surgery/amputation
name = "Amputation"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/sever_limb)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD)
requires_bodypart_type = 0
diff --git a/code/modules/surgery/blood_filter.dm b/code/modules/surgery/blood_filter.dm
index da6b56db022..e122f44e1ab 100644
--- a/code/modules/surgery/blood_filter.dm
+++ b/code/modules/surgery/blood_filter.dm
@@ -6,7 +6,7 @@
/datum/surgery_step/filter_blood,
/datum/surgery_step/close)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_CHEST)
requires_bodypart_type = TRUE
ignore_clothes = FALSE
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index eb159984ea9..9087d961432 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -1017,3 +1017,12 @@
QDEL_NULL(current_gauze)
SEND_SIGNAL(src, COMSIG_BODYPART_GAUZE_DESTROYED)
*/
+
+
+///Proc to turn bodypart into another.
+/obj/item/bodypart/proc/change_bodypart(obj/item/bodypart/new_type)
+ var/mob/living/carbon/our_owner = owner //dropping nulls the limb
+ drop_limb(TRUE)
+ var/obj/item/bodypart/new_part = new new_type()
+ new_part.attach_limb(our_owner, TRUE)
+ qdel(src)
diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm
index f8d4735c8f6..f6ee3e1ae0b 100644
--- a/code/modules/surgery/bodyparts/helpers.dm
+++ b/code/modules/surgery/bodyparts/helpers.dm
@@ -143,21 +143,11 @@
L.change_bodypart_status(BODYPART_ROBOTIC)
. = L
-/mob/living/carbon/monkey/newBodyPart(zone, robotic, fixed_icon)
+/mob/living/carbon/human/newBodyPart(zone, robotic, fixed_icon)
var/obj/item/bodypart/L
- switch(zone)
- if(BODY_ZONE_L_ARM)
- L = new /obj/item/bodypart/l_arm/monkey()
- if(BODY_ZONE_R_ARM)
- L = new /obj/item/bodypart/r_arm/monkey()
- if(BODY_ZONE_HEAD)
- L = new /obj/item/bodypart/head/monkey()
- if(BODY_ZONE_L_LEG)
- L = new /obj/item/bodypart/l_leg/monkey()
- if(BODY_ZONE_R_LEG)
- L = new /obj/item/bodypart/r_leg/monkey()
- if(BODY_ZONE_CHEST)
- L = new /obj/item/bodypart/chest/monkey()
+ var/datum/species/species = dna.species
+ var/obj/item/bodypart/selected_type = species.bodypart_overides[zone]
+ L = new selected_type()
if(L)
L.update_limb(fixed_icon, src)
if(robotic)
diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm
index 2f114f7faf9..e14dfa57f86 100644
--- a/code/modules/surgery/brain_surgery.dm
+++ b/code/modules/surgery/brain_surgery.dm
@@ -8,7 +8,7 @@
/datum/surgery_step/fix_brain,
/datum/surgery_step/close)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_HEAD)
requires_bodypart_type = 0
diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm
index a65297a5f98..43359d17146 100644
--- a/code/modules/surgery/cavity_implant.dm
+++ b/code/modules/surgery/cavity_implant.dm
@@ -1,7 +1,7 @@
/datum/surgery/cavity_implant
name = "Cavity implant"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/handle_cavity, /datum/surgery_step/close)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_CHEST)
diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm
index d241953d49b..f9891e06fdb 100644
--- a/code/modules/surgery/eye_surgery.dm
+++ b/code/modules/surgery/eye_surgery.dm
@@ -1,7 +1,7 @@
/datum/surgery/eye_surgery
name = "Eye surgery"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/fix_eyes, /datum/surgery_step/close)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_PRECISE_EYES)
requires_bodypart_type = 0
diff --git a/code/modules/surgery/gastrectomy.dm b/code/modules/surgery/gastrectomy.dm
index 441b0cd61a2..f10b8481438 100644
--- a/code/modules/surgery/gastrectomy.dm
+++ b/code/modules/surgery/gastrectomy.dm
@@ -1,6 +1,6 @@
/datum/surgery/gastrectomy
name = "Gastrectomy"
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_CHEST)
requires_real_bodypart = TRUE
steps = list(/datum/surgery_step/incise,
diff --git a/code/modules/surgery/hepatectomy.dm b/code/modules/surgery/hepatectomy.dm
index 83623e2359b..b426a058240 100644
--- a/code/modules/surgery/hepatectomy.dm
+++ b/code/modules/surgery/hepatectomy.dm
@@ -1,6 +1,6 @@
/datum/surgery/hepatectomy
name = "Hepatectomy"
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_CHEST)
requires_real_bodypart = TRUE
steps = list(/datum/surgery_step/incise,
diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm
index 72693abd5c4..ee5b6c4da53 100644
--- a/code/modules/surgery/implant_removal.dm
+++ b/code/modules/surgery/implant_removal.dm
@@ -1,7 +1,7 @@
/datum/surgery/implant_removal
name = "Implant removal"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/extract_implant, /datum/surgery_step/close)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_CHEST)
diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm
index 37292c49e8d..568d2cd45a5 100644
--- a/code/modules/surgery/limb_augmentation.dm
+++ b/code/modules/surgery/limb_augmentation.dm
@@ -12,6 +12,9 @@
/datum/surgery_step/replace_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(NOAUGMENTS in target.dna.species.species_traits)
+ to_chat(user, "[target] cannot be augmented!")
+ return -1
if(istype(tool, /obj/item/organ_storage) && istype(tool.contents[1], /obj/item/bodypart))
tool = tool.contents[1]
var/obj/item/bodypart/aug = tool
diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm
index dc5f90442d0..a2def07ad41 100644
--- a/code/modules/surgery/organ_manipulation.dm
+++ b/code/modules/surgery/organ_manipulation.dm
@@ -1,6 +1,6 @@
/datum/surgery/organ_manipulation
name = "Organ manipulation"
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD)
requires_real_bodypart = 1
steps = list(
diff --git a/code/modules/surgery/organs/tails.dm b/code/modules/surgery/organs/tails.dm
index 18761fb2687..491c1959c80 100644
--- a/code/modules/surgery/organs/tails.dm
+++ b/code/modules/surgery/organs/tails.dm
@@ -85,3 +85,28 @@
new_tail.spines = spines
*/
//SKYRAT EDIT REMOVAL END
+
+/obj/item/organ/tail/monkey
+ name = "monkey tail"
+ desc = "A severed monkey tail. Does not look like a banana."
+ tail_type = "Monkey"
+ icon_state = "severedmonkeytail"
+
+//SKYRAT EDIT REMOVAL BEGIN - CUSTOMIZATION
+/*
+/obj/item/organ/tail/monkey/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE)
+ ..()
+ if(istype(H))
+ if(!("tail_monkey" in H.dna.species.mutant_bodyparts))
+ H.dna.species.mutant_bodyparts |= "tail_monkey"
+ H.dna.features["tail_monkey"] = tail_type
+ H.update_body()
+
+/obj/item/organ/tail/monkey/Remove(mob/living/carbon/human/H, special = 0)
+ ..()
+ if(istype(H))
+ H.dna.features["tail_monkey"] = "None"
+ H.dna.species.mutant_bodyparts -= "tail_monkey"
+ H.update_body()
+*/
+//SKYRAT EDIT REMOVAL END
diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm
index 951ad2fae1d..2c2d9f7f93a 100644
--- a/code/modules/surgery/prosthetic_replacement.dm
+++ b/code/modules/surgery/prosthetic_replacement.dm
@@ -1,7 +1,7 @@
/datum/surgery/prosthetic_replacement
name = "Prosthetic replacement"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/add_prosthetic)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD)
requires_bodypart = FALSE //need a missing limb
requires_bodypart_type = 0
diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm
index 1fdc43f3f8e..07e96a98a2a 100644
--- a/code/modules/surgery/revival.dm
+++ b/code/modules/surgery/revival.dm
@@ -9,7 +9,7 @@
/datum/surgery_step/revive,
/datum/surgery_step/close)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_HEAD)
requires_bodypart_type = 0
diff --git a/code/modules/surgery/stomachpump.dm b/code/modules/surgery/stomachpump.dm
index a302621fb53..efbb21d9e22 100644
--- a/code/modules/surgery/stomachpump.dm
+++ b/code/modules/surgery/stomachpump.dm
@@ -7,7 +7,7 @@
/datum/surgery_step/stomach_pump,
/datum/surgery_step/close)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_CHEST)
requires_bodypart_type = TRUE
ignore_clothes = FALSE
diff --git a/code/modules/unit_tests/metabolizing.dm b/code/modules/unit_tests/metabolizing.dm
index b7f8fc4f6ad..3c8cf4f1067 100644
--- a/code/modules/unit_tests/metabolizing.dm
+++ b/code/modules/unit_tests/metabolizing.dm
@@ -3,11 +3,9 @@
SSmobs.pause()
var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)
- var/mob/living/carbon/monkey/monkey = allocate(/mob/living/carbon/monkey)
for (var/reagent_type in subtypesof(/datum/reagent))
test_reagent(human, reagent_type)
- test_reagent(monkey, reagent_type)
/datum/unit_test/metabolization/proc/test_reagent(mob/living/carbon/C, reagent_type)
C.reagents.add_reagent(reagent_type, 10)
diff --git a/config/game_options.txt b/config/game_options.txt
index 31e05047656..7cbc1d40d9a 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -42,7 +42,6 @@ WALK_DELAY 4
## /mob/living/carbon/human on the last entry, the last entry will override the first.
##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/human 0
##MULTIPLICATIVE_MOVESPEED /mob/living/silicon/robot 0
-##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/monkey 0
##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien 0
##MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal/slime 0
MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal 0
diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi
index cc619a40931..8dd0ac78ec3 100644
Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ
diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi
index 19ebe0a4be3..55ead4803e2 100644
Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index ea1169737b8..be7380efcf8 100755
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm
index 55c93a81b7e..ef8c0445bb6 100644
--- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm
+++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm
@@ -55,6 +55,14 @@
recommended_species = list("human", "felinid", "mammal")
organ_type = /obj/item/organ/tail/cat
+/datum/sprite_accessory/tails/monkey/default
+ name = "Monkey"
+ icon_state = "monkey"
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+ recommended_species = list("human", "felinid", "mammal", "monkey")
+ color_src = FALSE
+ organ_type = /obj/item/organ/tail/monkey
+
/datum/sprite_accessory/tails/is_hidden(mob/living/carbon/human/H, obj/item/bodypart/HD)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
if(istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit))
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm
index 529ce9c71f3..16c4e917597 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm
@@ -252,6 +252,10 @@
mutant_bodyparts = list()
default_mutant_bodyparts = list("tail" = "Cat", "ears" = "Cat")
+/datum/species/human/monkey
+ mutant_bodyparts = list()
+ default_mutant_bodyparts = list("tail" = "Monkey")
+
/datum/species/human
mutant_bodyparts = list()
default_mutant_bodyparts = list("ears" = "None", "tail" = "None", "wings" = "None")
diff --git a/modular_skyrat/modules/customization/modules/surgery/organs/tails.dm b/modular_skyrat/modules/customization/modules/surgery/organs/tails.dm
index 292bcf472cd..3e6fd863fde 100644
--- a/modular_skyrat/modules/customization/modules/surgery/organs/tails.dm
+++ b/modular_skyrat/modules/customization/modules/surgery/organs/tails.dm
@@ -7,6 +7,9 @@
/obj/item/organ/tail/cat
mutantpart_info = list(MUTANT_INDEX_NAME = "Cat", MUTANT_INDEX_COLOR_LIST = list("FA0"))
+/obj/item/organ/tail/monkey
+ mutantpart_info = list(MUTANT_INDEX_NAME = "Monkey", MUTANT_INDEX_COLOR_LIST = list("FFF"))
+
/obj/item/organ/tail/lizard
mutantpart_info = list(MUTANT_INDEX_NAME = "Smooth", MUTANT_INDEX_COLOR_LIST = list("DFD"))
diff --git a/modular_skyrat/modules/customization/modules/surgery/robot_brain_surgery.dm b/modular_skyrat/modules/customization/modules/surgery/robot_brain_surgery.dm
index f2071374874..9e3acd669f5 100644
--- a/modular_skyrat/modules/customization/modules/surgery/robot_brain_surgery.dm
+++ b/modular_skyrat/modules/customization/modules/surgery/robot_brain_surgery.dm
@@ -8,7 +8,7 @@
/datum/surgery_step/fix_robot_brain,
/datum/surgery_step/mechanic_close)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_HEAD)
requires_bodypart_type = BODYPART_ROBOTIC
desc = "A surgical procedure that restores the default behavior logic and personality matrix of an IPC posibrain."
@@ -47,4 +47,4 @@
target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY)
else
user.visible_message("[user] suddenly notices that the posibrain [user.p_they()] [user.p_were()] working on is not there anymore.", "You suddenly notice that the posibrain you were working on is not there anymore.")
- return FALSE
+ return FALSE
diff --git a/modular_skyrat/modules/customization/modules/surgery/robot_healing.dm b/modular_skyrat/modules/customization/modules/surgery/robot_healing.dm
index 15cdb60e80d..f2d0e81f1ee 100644
--- a/modular_skyrat/modules/customization/modules/surgery/robot_healing.dm
+++ b/modular_skyrat/modules/customization/modules/surgery/robot_healing.dm
@@ -6,7 +6,7 @@
/datum/surgery_step/robot_heal,
/datum/surgery_step/mechanic_close)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_CHEST)
replaced_by = /datum/surgery
requires_bodypart_type = BODYPART_ROBOTIC
@@ -126,4 +126,4 @@
name = "repair damage"
brutehealing = 10
burnhealing = 10
- missinghpbonus = 15
+ missinghpbonus = 15
diff --git a/modular_skyrat/modules/customization/modules/surgery/robot_restore_looks.dm b/modular_skyrat/modules/customization/modules/surgery/robot_restore_looks.dm
index 4c1d0edfe42..af492940790 100644
--- a/modular_skyrat/modules/customization/modules/surgery/robot_restore_looks.dm
+++ b/modular_skyrat/modules/customization/modules/surgery/robot_restore_looks.dm
@@ -4,7 +4,7 @@
/datum/surgery_step/weld_plating,
/datum/surgery_step/restore_paintjob)
- target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ target_mobtypes = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_CHEST)
requires_bodypart_type = BODYPART_ROBOTIC
desc = "A procedure that welds the robotic limbs back into the patient's preferred state aswell as re-applying their paintjob."
@@ -46,4 +46,4 @@
/datum/surgery_step/restore_paintjob/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "You begin to spray paint on [target]...",
"[user] begins to spray paint on [target]'s [parse_zone(target_zone)].",
- "[user] begins to spray paint on [target]'s [parse_zone(target_zone)].")
+ "[user] begins to spray paint on [target]'s [parse_zone(target_zone)].")
diff --git a/tgstation.dme b/tgstation.dme
index 4de143eaa58..b5fa56cdb1b 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -261,7 +261,6 @@
#include "code\_onclick\hud\human.dm"
#include "code\_onclick\hud\living.dm"
#include "code\_onclick\hud\map_popups.dm"
-#include "code\_onclick\hud\monkey.dm"
#include "code\_onclick\hud\movable_screen_objects.dm"
#include "code\_onclick\hud\ooze.dm"
#include "code\_onclick\hud\pai.dm"
@@ -1470,8 +1469,8 @@
#include "code\modules\admin\verbs\pray.dm"
#include "code\modules\admin\verbs\randomverbs.dm"
#include "code\modules\admin\verbs\reestablish_db_connection.dm"
-#include "code\modules\admin\verbs\shuttlepanel.dm"
#include "code\modules\admin\verbs\secrets.dm"
+#include "code\modules\admin\verbs\shuttlepanel.dm"
#include "code\modules\admin\verbs\spawnobjasmob.dm"
#include "code\modules\admin\verbs\tripAI.dm"
#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm"
@@ -2389,6 +2388,7 @@
#include "code\modules\mob\living\carbon\human\species.dm"
#include "code\modules\mob\living\carbon\human\status_procs.dm"
#include "code\modules\mob\living\carbon\human\suicides.dm"
+#include "code\modules\mob\living\carbon\human\monkey\monkey.dm"
#include "code\modules\mob\living\carbon\human\species_types\abductors.dm"
#include "code\modules\mob\living\carbon\human\species_types\android.dm"
#include "code\modules\mob\living\carbon\human\species_types\dullahan.dm"
@@ -2399,6 +2399,7 @@
#include "code\modules\mob\living\carbon\human\species_types\humans.dm"
#include "code\modules\mob\living\carbon\human\species_types\jellypeople.dm"
#include "code\modules\mob\living\carbon\human\species_types\lizardpeople.dm"
+#include "code\modules\mob\living\carbon\human\species_types\monkeys.dm"
#include "code\modules\mob\living\carbon\human\species_types\mothmen.dm"
#include "code\modules\mob\living\carbon\human\species_types\mushpeople.dm"
#include "code\modules\mob\living\carbon\human\species_types\plasmamen.dm"
@@ -2409,13 +2410,6 @@
#include "code\modules\mob\living\carbon\human\species_types\synths.dm"
#include "code\modules\mob\living\carbon\human\species_types\vampire.dm"
#include "code\modules\mob\living\carbon\human\species_types\zombies.dm"
-#include "code\modules\mob\living\carbon\monkey\death.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\monkey.dm"
-#include "code\modules\mob\living\carbon\monkey\monkey_defense.dm"
-#include "code\modules\mob\living\carbon\monkey\monkey_update_icons.dm"
-#include "code\modules\mob\living\carbon\monkey\punpun.dm"
#include "code\modules\mob\living\silicon\damage_procs.dm"
#include "code\modules\mob\living\silicon\death.dm"
#include "code\modules\mob\living\silicon\examine.dm"
@@ -3427,9 +3421,9 @@
#include "modular_skyrat\modules\blueshield\code\modules\clothing\under\jobs\Plasmaman\security.dm"
#include "modular_skyrat\modules\blueshield\code\modules\jobs\job_types\blueshield.dm"
#include "modular_skyrat\modules\blueshield\code\modules\projectiles\guns\energy\special.dm"
+#include "modular_skyrat\modules\cargo\code\bloat.dm"
#include "modular_skyrat\modules\cargo\code\goodies.dm"
#include "modular_skyrat\modules\cargo\code\packs.dm"
-#include "modular_skyrat\modules\cargo\code\bloat.dm"
#include "modular_skyrat\modules\cloning\code\_DEFINES\access.dm"
#include "modular_skyrat\modules\cloning\code\_DEFINES\DNA.dm"
#include "modular_skyrat\modules\cloning\code\_DEFINES\machines.dm"
diff --git a/tools/mapmerge2/map_scripts/replacemonkeys.txt b/tools/mapmerge2/map_scripts/replacemonkeys.txt
new file mode 100644
index 00000000000..5057faffbb3
--- /dev/null
+++ b/tools/mapmerge2/map_scripts/replacemonkeys.txt
@@ -0,0 +1,5 @@
+#comment This replaces the monkeys pre-species refactor to the monkeys post-species refactor https://github.com/tgstation/tgstation/pull/55614
+
+/mob/living/carbon/monkey : /mob/living/carbon/human/species/monkey
+/mob/living/carbon/monkey/angry : /mob/living/carbon/human/species/monkey/angry
+/mob/living/carbon/monkey/punpun : /mob/living/carbon/human/species/monkey/punpun