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