From d7f054b03504db1b3de20cab4e4bcefbb569c10a Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 31 Dec 2020 21:08:07 +0100 Subject: [PATCH] [MIRROR] Refactors monkeys into a species (#2379) * Refactors monkeys into a species * aaa Co-authored-by: Qustinnus Co-authored-by: Azarak --- .../lavaland_surface_syndicate_base1.dmm | 12 +- _maps/RandomZLevels/research.dmm | 6 +- .../map_files/Deltastation/DeltaStation2.dmm | 16 +- .../map_files/IceBoxStation/IceBoxStation.dmm | 18 +- _maps/map_files/KiloStation/KiloStation.dmm | 20 +- _maps/map_files/MetaStation/MetaStation.dmm | 16 +- _maps/shuttles/emergency_nature.dmm | 10 +- code/__DEFINES/DNA.dm | 22 +- code/__DEFINES/dcs/signals.dm | 2 + code/__DEFINES/is_helpers.dm | 2 +- code/__DEFINES/monkeys.dm | 4 +- code/__HELPERS/global_lists.dm | 1 + code/__HELPERS/mobs.dm | 2 +- code/__HELPERS/unsorted.dm | 2 - code/_globalvars/lists/flavor_misc.dm | 1 + code/_onclick/click.dm | 1 + code/_onclick/hud/monkey.dm | 169 --------- code/_onclick/other_mobs.dm | 38 +- .../configuration/entries/game_options.dm | 2 - code/datums/ai/_ai_controller.dm | 11 +- code/datums/ai/monkey/monkey_behaviors.dm | 5 +- code/datums/ai/monkey/monkey_controller.dm | 3 +- code/datums/components/bloodysoles.dm | 16 +- code/datums/components/creamed.dm | 5 +- code/datums/diseases/_MobProcs.dm | 20 +- code/datums/diseases/advance/advance.dm | 2 +- code/datums/diseases/anxiety.dm | 2 +- code/datums/diseases/beesease.dm | 2 +- code/datums/diseases/cold.dm | 2 +- code/datums/diseases/fake_gbs.dm | 2 +- code/datums/diseases/flu.dm | 2 +- code/datums/diseases/transformation.dm | 11 +- code/datums/dna.dm | 9 +- code/datums/mutations/body.dm | 8 +- code/datums/mutations/hulk.dm | 2 +- .../dynamic/dynamic_rulesets_latejoin.dm | 2 +- .../dynamic/dynamic_rulesets_roundstart.dm | 6 +- code/game/gamemodes/monkey/monkey.dm | 4 +- code/game/gamemodes/objective.dm | 5 +- code/game/gamemodes/revolution/revolution.dm | 2 +- code/game/machinery/computer/Operating.dm | 2 +- code/game/machinery/doors/door.dm | 3 - .../telecomms/computers/logbrowser.dm | 3 - code/game/objects/items/dna_injector.dm | 4 +- code/game/objects/items/food/meat.dm | 2 +- code/game/objects/items/robot/robot_items.dm | 2 +- .../game/objects/items/stacks/sheets/glass.dm | 5 - code/game/objects/items/storage/bags.dm | 2 +- .../objects/structures/petrified_statue.dm | 8 - code/game/objects/structures/tables_racks.dm | 2 +- code/modules/admin/admin.dm | 2 +- code/modules/admin/player_panel.dm | 6 +- code/modules/admin/topic.dm | 8 +- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 4 +- code/modules/admin/view_variables/topic.dm | 6 +- .../antagonists/changeling/changeling.dm | 2 +- .../changeling/changeling_power.dm | 7 +- .../changeling/powers/humanform.dm | 2 +- .../changeling/powers/lesserform.dm | 2 +- .../changeling/powers/tiny_prick.dm | 4 - code/modules/antagonists/monkey/monkey.dm | 20 +- .../antagonists/revolution/revolution.dm | 6 +- code/modules/client/verbs/suicide.dm | 18 - code/modules/clothing/head/helmet.dm | 2 +- .../kitchen_machinery/gibber.dm | 4 +- .../kitchen_machinery/monkeyrecycler.dm | 2 +- code/modules/jobs/access.dm | 2 +- .../mob/dead/new_player/sprite_accessories.dm | 5 + code/modules/mob/living/blood.dm | 21 -- .../mob/living/carbon/alien/alien_defense.dm | 2 +- .../living/carbon/alien/special/facehugger.dm | 4 - .../mob/living/carbon/carbon_defense.dm | 2 +- code/modules/mob/living/carbon/emote.dm | 40 +- code/modules/mob/living/carbon/human/death.dm | 4 +- code/modules/mob/living/carbon/human/emote.dm | 56 +++ code/modules/mob/living/carbon/human/human.dm | 7 +- .../mob/living/carbon/human/human_defense.dm | 4 +- .../living/carbon/human/human_update_icons.dm | 2 +- .../punpun.dm => human/monkey/monkey.dm} | 58 ++- .../mob/living/carbon/human/species.dm | 49 ++- .../carbon/human/species_types/abductors.dm | 2 +- .../carbon/human/species_types/android.dm | 2 +- .../carbon/human/species_types/dullahan.dm | 2 +- .../carbon/human/species_types/ethereal.dm | 2 +- .../carbon/human/species_types/golems.dm | 22 +- .../carbon/human/species_types/jellypeople.dm | 2 +- .../human/species_types/lizardpeople.dm | 2 +- .../carbon/human/species_types/monkeys.dm | 92 +++++ .../carbon/human/species_types/mushpeople.dm | 2 +- .../carbon/human/species_types/plasmamen.dm | 3 +- .../human/species_types/shadowpeople.dm | 4 +- .../carbon/human/species_types/skeletons.dm | 2 +- .../carbon/human/species_types/snail.dm | 2 +- .../carbon/human/species_types/synths.dm | 2 +- .../carbon/human/species_types/vampire.dm | 2 +- .../carbon/human/species_types/zombies.dm | 4 +- .../modules/mob/living/carbon/monkey/death.dm | 9 - .../mob/living/carbon/monkey/inventory.dm | 34 -- code/modules/mob/living/carbon/monkey/life.dm | 135 ------- .../mob/living/carbon/monkey/monkey.dm | 195 ---------- .../living/carbon/monkey/monkey_defense.dm | 217 ----------- .../carbon/monkey/monkey_update_icons.dm | 77 ---- code/modules/mob/living/living_defense.dm | 2 +- code/modules/mob/living/living_defines.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 4 +- .../living/simple_animal/animal_defense.dm | 2 +- .../simple_animal/hostile/gorilla/gorilla.dm | 2 +- .../living/simple_animal/hostile/headcrab.dm | 2 +- .../hostile/megafauna/colossus.dm | 2 +- .../mob/living/simple_animal/parrot.dm | 2 +- .../mob/living/simple_animal/slime/slime.dm | 2 +- code/modules/mob/transform_procs.dm | 343 ++---------------- code/modules/projectiles/projectile/magic.dm | 2 +- .../chemistry/reagents/food_reagents.dm | 2 +- .../chemistry/reagents/other_reagents.dm | 2 +- .../reagents/chemistry/recipes/others.dm | 2 +- .../research/xenobiology/xenobio_camera.dm | 41 +-- .../spells/spell_types/pointed/barnyard.dm | 2 +- .../spell_types/pointed/duffelbag_curse.dm | 2 +- code/modules/station_goals/dna_vault.dm | 4 +- .../advanced/bioware/cortex_folding.dm | 2 +- .../advanced/bioware/cortex_imprint.dm | 2 +- code/modules/surgery/advanced/lobotomy.dm | 2 +- code/modules/surgery/advanced/pacification.dm | 2 +- .../modules/surgery/advanced/viral_bonding.dm | 2 +- code/modules/surgery/amputation.dm | 2 +- code/modules/surgery/blood_filter.dm | 2 +- code/modules/surgery/bodyparts/_bodyparts.dm | 9 + code/modules/surgery/bodyparts/helpers.dm | 18 +- code/modules/surgery/brain_surgery.dm | 2 +- code/modules/surgery/cavity_implant.dm | 2 +- code/modules/surgery/eye_surgery.dm | 2 +- code/modules/surgery/gastrectomy.dm | 2 +- code/modules/surgery/hepatectomy.dm | 2 +- code/modules/surgery/implant_removal.dm | 2 +- code/modules/surgery/limb_augmentation.dm | 3 + code/modules/surgery/organ_manipulation.dm | 2 +- code/modules/surgery/organs/tails.dm | 25 ++ .../modules/surgery/prosthetic_replacement.dm | 2 +- code/modules/surgery/revival.dm | 2 +- code/modules/surgery/stomachpump.dm | 2 +- code/modules/unit_tests/metabolizing.dm | 2 - config/game_options.txt | 1 - icons/mob/human_parts.dmi | Bin 53195 -> 54726 bytes icons/mob/mutant_bodyparts.dmi | Bin 33474 -> 33977 bytes icons/obj/surgery.dmi | Bin 41229 -> 40956 bytes .../new_player/sprite_accessories/tails.dm | 8 + .../mob/living/carbon/human/species.dm | 4 + .../modules/surgery/organs/tails.dm | 3 + .../modules/surgery/robot_brain_surgery.dm | 4 +- .../modules/surgery/robot_healing.dm | 4 +- .../modules/surgery/robot_restore_looks.dm | 4 +- tgstation.dme | 14 +- .../mapmerge2/map_scripts/replacemonkeys.txt | 5 + 155 files changed, 614 insertions(+), 1609 deletions(-) delete mode 100644 code/_onclick/hud/monkey.dm rename code/modules/mob/living/carbon/{monkey/punpun.dm => human/monkey/monkey.dm} (54%) create mode 100644 code/modules/mob/living/carbon/human/species_types/monkeys.dm delete mode 100644 code/modules/mob/living/carbon/monkey/death.dm delete mode 100644 code/modules/mob/living/carbon/monkey/inventory.dm delete mode 100644 code/modules/mob/living/carbon/monkey/life.dm delete mode 100644 code/modules/mob/living/carbon/monkey/monkey.dm delete mode 100644 code/modules/mob/living/carbon/monkey/monkey_defense.dm delete mode 100644 code/modules/mob/living/carbon/monkey/monkey_update_icons.dm create mode 100644 tools/mapmerge2/map_scripts/replacemonkeys.txt 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 cc619a409319ea0c37f9ab1a78e0d99d9c5dc0c9..8dd0ac78ec3dc4366603fc2f87efd7e81b965124 100644 GIT binary patch literal 54726 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%0A8bf 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 BTW|mX literal 53195 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 K=zL|fhyMpCYd*aI diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi index 19ebe0a4be37fd0e8ce9d27dae3dae420b81a5cd..55ead4803e228bf62ee48aec9a281a94b7ad2aaa 100644 GIT binary patch delta 14423 zcmcJ0c_5T+`}QD8<&h{wr6`h03#~E|iENoj!nE5$*6g=7lt%~&FW5zawEMu1YyKdFf@;=Y|z2E!$egC-3xR>j`?(00x<2cUK%j<%~8-h{Nf27V6 zL7`9zRkHagl)!ZKIt8d`@6gA}`FN-KYC<8MVv6U_t|_3KxnC{g{h?o)dR+E>bof2N z>2W-+z-Yj%(-3;c$O^dIYjWs?4}QKEk9|1B*>I(-c}8}gZ)<9!Q3p>{LOx5|rqF!O znd}BXxuk*femj%mrF|`A=VzHxd0(8sxqWcSfSxbevi{a;TB()JHIa;`2X{u>rfdxS$b4j0Ow$=NcxT_Iy| z)#d6{i|5Wuc3Xeq?V9({>2R)irG)ZgtC7MF=gOPh>r*XNQxDCJ+!to9pfPU&)-`*n zz4N_4$h@$JmSTF?6ReBbsC@;S8`@c0ROEU`UWpX$F!sRT8S%Avcs*xBGrcJrn37oLBsuJq@gzm(X0$@U zbMJe@UzmH1-wEH45>@z&#mt%CvUpl4Sz60`UfhO1Jr2nad~UjQg)@n}@`rNQ;*!<7 z$YZW6UVO-!aEUl^DtW4*RJZhKlW*pm(Bph*_9K0!!gFf%(swvUZS1CCrC;inG8@iX& zoHSLS-_w4Zby4-`Ye)T9iB0F9E7~2oW!CB+J#y}R$Ft?kE}FQ^rP3BvlUL|%+urSy zNI)+vn&~VpncqbdQ?E*1R0J9C=kzn1@FoY&(FP+g@1zBI6e!ypOvnkLxu3)jbbZPX zRH7ekb0xJltW`^sav?cWH6su1nY+U5(xj-p0WG(yZ1lCPD(rEKl<>YdJDHrakILCk zu_qKeyz%eHH|KRtrSB4P=XLHT?wLsJ*-k2M3sT%QrS^Ez?s-Wr^#X)La~3qLuhzox zlyCvJQ#1n;yL@^g;E{{009TrE7hD=RzZDYEDXTog*_@`Vlv>VT<}*3e zR;S;0!nJ$}-|_>LqL?n#v+P5z8!nS|R?a0d?J`x+=m@IMcUr?x9$sWbXm`jYYv zsww9wj;i8|3mDTkaNzngn`c}HhmO5+r?=w7-@SWho06&^w}2`a#iQg*)$19!MP6nN z<>eaUW0jsJrU*~)(eGOHeGKx+bCm;2jT)EA5hh}y7DKoeDo#{6ZNshW{Bn<};m(WH zsPP%NfnwB8?Kzo6PBwdBv|l{u(rppXn+%T=kA&?145B`CaUGs1j=Y}1p)2C|IK)SB zDhuzN`IL@p%IIBo*H6|-W2s|p#m)&ri%)XH$kUAKm&yYqhxR3-K4BlOz5BH1JTB8N zmghS$?vV>IubvsWcR_GI03WKNuZR>FbKeIGqEM#SkPpG~YN_BWsrv%LC{*e^vGw4C zuDzB33bkHa2%MxPA!7=@y4mnwo&x=P8wr8{kCEiM!z4wcEnvKUXA*cH_}tI}I*q{M zn%FGpttB~+xh8R`itwIm7qoC1zTK%#cezw=uNN-_bxzP}JJ`iWeCHTwpZ1Pauon+w z11HS=z=fK?7H{HlrdD1P^PL%)>8Z!@nyapza&EC7JT@fbKqI09f`X1^dd@~83VppG-R_hK0Y1~<$kia zp*U;K^gaB7hi35o{Z07(h@D-Ba6vN;Ryh{o7|QFy-19J4lyq@4*K{(%=SyGX!AX`M z7#QOGkK$)(so5jEsV;w2-gGtk4x|9Ws)Gcf_XWzeaZhjW^NZVqv!S*r@)ax5Y@D(sb%smx=@A>@yuKSu$RQKucGXm@Ovg=#?h{}+ zn^cC83O#_jW096zYx_r-p^QjWi6AH?ri`*?qPs&jh~jRX*(pEpI@ zDeQ2q->#JKbgClnK%c069xfzs`ctT?(&?!Y8njzXT_T49wdiNOr8byoYx2HeVxEX3 zTp?tVd0;*J+n(C>gE4(|#1`HKO3M%$9Kb%7dQ-HIP%-K=m{V+Kpv)V{<2xECr-7CE z+>1VwR;GD?IF(RW>H?Ou%Wp6zUOG*=wrmNH!{_rj>8TOV5`7K2MmF^+o!sVn7!E@3 z-3yKHQ;o~a6=1Qp3wSJ|Fw;AFZSwAS^mc}@hR$_~Boym0SffPSVnz=y0DrKx3DwuFLSa408H7mTZU|DACRyum4SY5@Tq7=b%E=W+du%Pu2W3aI%J_0s+;AtkS!j5bZ{9oCb#t06OFV! zT{8p$Zhu2`{i54T8o>E05AZAHTlR!-e>xF4&qC64*BVK%23Ds9=U+Q3?D^Y$e?G5e zj+AlD94S=rofYZ=tP&Rxle7yd8jx=R8|>|uo>cl8h_U*;fgJlsh))-ET;b4bCFg2a z(#gt?EwbgCs9|!R5>A@2+)Lq>*E?Dxa%*&>j2*Lb1E@@^!h3&CzopE8BW}o{_%kixcShCagp&PuSm$+dMK4zPa z(Kdn4w_%qfj+)N|Sh7)F{v+k_MXMPj*?ARyY={QIye)J0PPh#fIS+6jK3*$+!jttax%!u@z$I%y`GWL1O1B#oVw{iG9Q z{wgt2y_ay%g|0xUP;H|<1~b*2ggBWFCkV9=+N0}ExoktwnN~|b3FCwz-rm$e z$@eCt3NTBuU*)nq=;{;^AA1&;KodwlNb!=bUVlbc^Oig%$WfhDng|ijIjWCjCl+st zPn>F8QOs%;wWoL`u^3HXvV*7zG!g`#82zCR>-AKl2XS{I>q>lUGP%DE zs>|=d+X>EZy4wTYRBej!_dol`sI`-p>%gt@7lTj9j$s}6hqLkGk49n}b!Nqv?Hj>( zapQlT0RMEgq5Qa3?LHmxfvjIUDuXhJ~%in|i=U`icGJXMK4Ph`B$`W&ff+% zYL_q)+o+rKwhNpK`j%Qz&$k{_Pt9&|jLwcq(kW}W@i$SJe;&2|T=S-90E7)}u5Ce& zxyBDs6(Q6|%cm*9txs-RSMC^+hp8=3#10rjBo}GoB-LJ1Aoxr|u)9=S@!?6E|6*2Ioz-9Cjn+S@1MnU$W! zSdeT*$RUIz@@mTW@pd1c?45{U`jrz#WbGsbGwP3s^~FXUt(V@@Se$c5B(V}41j&$_ z8hze-Y>c`sJa54B^Y+vfy9<$TscSExQ0_^r_(g!}n8qI=&29tE{{}HyqyzSMB6eh% zgyY+^5Qr-cXaEsbM4`4^?sX>~&!dF5+d4f4Z}rFlKJu0qy{f9xjmuNF0GOV!20~uR zyayqoAEdxbJ1E9Z0&h`kk-FjYbmTod*3gjmekJ3S;EwA*T|-Aq@``jd z4qokeH`r(m$Q4j?6iF12x;aNG=UkW%p#EV9*9f5h>M$9_lbA4&A=K%v2s_+gxUK(; zr5M|3_K)M^*X8+n|()qDOSQM3JudV5!<>!><-gqqYiDttFSNahY_I((PWpO)jxFh<(=lwe0Kfz?9w zb9rlD=4&}18?{to)95`1(`JM(_$h$pTJv-uwS+l2pv2@E&L zARDAD+;Ve#5?G`feyCkK-TPoW{-4wG4<7JgO_8ztg5j#FDk;d@+rY){QJ~DPXaN1p z6MjI*O0#UyzIhf}AwQVHPx$jY!%$4UZYi+*Hy-i#7fuLXdRqAG51s(c5|ke|{`r3A z1+BuCMEx87@#8`7irTOFuVxGV9bft}o!_VXZ)WQ~CTg!DpJNb(L(~c32a6e1bkL#< zPCOVash5KMjo*>U;bq1YuTvIiv)d5lGKN!Pi^o8=zl?j=!ul>RjFekzrY!-CT4c98 zqAv4AAIuGuTQ_E+%m@Pe{a5ybgLj5obDYbjToF8teM9n&>AXUHxuK?6Wp$&4W^NX5 z+4^XxIcD0g+;(GpT?DuKhTk6eW zOEBCaV3aw$B&sV`WzB5DKNX*O?8P@uqPQBlsb(4MdaQEC!mR=h0O;3o$`pBvA6OmJ zA{Y@DTU7G1Psw^GY~%E0)AnV5tiGYa8)(rK9_N#6azPxmw0hv5U?W(ec zu4DTpb>}*BOiox!A=$D0j`MKP2NNUe`xxFS$96?b)Q;M6BLs2W+@jCoaH94iAjI>n zH$TlCYb_iB$7j3eU7KpUVzs%|Y{vV9W70Llt-_h7#(d2qVj40PPZk+!=4G8*>^T3u zBC!|`zlE&wC=1$5&b${XOrsv15&vKvVQ<9AO?M`4n7VFW&&eV<*Abt*$L$5L;6ba% zBWy-^SD0bj+SY*klD<@e>On-5f;=Kac2_JHE;e^*v5$OvKd6hziuO&S|Izd{W4wAa ziy>P7suX_HzyH5v_OB}Yr@KJEsd<0(RIuODH(&GhSO{|ev6byg8#k+}x^mBeb>2!q z+*hDbr9|V^X}rj*$7D<+l=f8%D)0US6-=F=h{`k)SpF+Id=_j5 zC(*l4T>LxJ0QxVChEtw4#k;-4O5YL*R&Raf$p0`9!P@I72fhTT`xHq0b=dJm;29d< zhemO+>)?K@34eSI3>~Y5W+*Xm0R2O2Rd4UP5Hm2@kLMLrpC2*Eoz%5D4#?)RU!d=L z4$}^WT8+}z*?;sWp#?JBQP<((u7!XRS?hMhOE{%uhjF%@uJ@P~7QVUi!*yZmxGSRT zFUFdw1U9DR*!NcI@u5mOE}qNO=YJh*=SXGPzLNBNmB`%CT>*mpZ!X1_GSs^K&{AM! z>zmL>ZfGr9l}(QMK8mh4Ee})r5~fZze-*eqpFzC&OjV&(vp@dI8i*7k zPcvROHxP?i#r%qH(rqL7bmuljnAcpmiK-#=CZgk^i37FTI=4r)+igWYBj2jyJiTk% zEKz+ES1xK_MUcIWp=is7B$D&1v9H95Vd|0URcqD8h$`-^&?rv*EGprcj$Ox!oT*Yc zw<6XP`A=GAE!GnzdassY`h}tCskvW zTj|j{veX(?;1O<-MDJRaaDeAdBCDr@O)K>YeEV+7hy_DzIo_bf* za{3*|=RX_dr!+M)5ORZr+3p234nhkk$!(Z~0V0ILoO-J(vYavZK zyn$^3`w_>n*0zu>gX@oa{_0L$@A-0DY2xaQY^yUrlK_NOIMzTTqV|vCW*M#fUIkXu zZ=&b*4~qPg?SXLFDMu})rXMLQ?npqUAsuZpCZ`COfsx5%>e}K5OCY06%9~GIZrKgp zdEY_-FEd8V7KoU1hBx9JA}C&9v*%=d^`T=h8RGF zO)+W6XK5yWEqrQ>?DU2^ixGx$9Z(%dn!M<65 z-#0ur)C&0?)J3;RqJ2-6Zq~$Poe|t7EcpbPJHp7{x7m6#Zd1R#5FkuOfD=H(`Z$6(J6cN<*f_dpx9-pW z3i5p>6?*%?rXhziSmjQPg%oWl*Xw8;v>cm^L6nWidBOLa+km0_=qO`Xn9pNy{xXcK zU13$IbF>pp@5UL8G0i^#|1e1IN$-fjK)92(AQc=g8^Ko$I8X(V^Ycho^JE%5qNTZ#yQ2DQ9ulae`Gk&b+tTSX}83?rHtL!1BMBKbmh|k%G7(Mpu!Ly;7&u^&P}GJ z(-cz$iV92Wis@ZDZ9K!+UVZfOE06Tu z6K%cICnVBoP`R?={b;2_yPa_3MGre%Et&|{ah#40Idq!lRIYleI<`-zgK$6m$biz+ zq`iiTihGZ*If7TZ*0-!cy<@kuoP1YMXWbFbq+8VeNBXt1W(>W%TfWy(`|yZL@kfz{ zZkA5X%HW=9u6;}gRZ`vKtB2Aty%)e1go+CPuj>p2I}ozs&fk}tG_INA;aqh0KN>XC z36I749E$*Xm<#n<_?-a843MU}wG@qOTs*XoO%DBuA$%tYHL!U#o%F1%?5%B$JF(+2 zWw32H!}{+u)!!?hm1cu$$-%bP)`p{YcKGiS4*Cac^@p@UG~D~(6daB`W7})}T|Fe3 z<;7i{#iZ}p^ke+6hHbJ#AfmAHmbs&OHZU{lyL}Mncb|vqg~X7?^_F{(9woJ#ug2M@V6Z3!DBxi1oI%+_x3mNn;p*y?lI|tD-E?45>E7Sx zk`VkZW(s~1W1@vIu+Z8z%Wh_^U%)GBp<)o&2K>_BaR#`>)MAFdOalc>Uy_X^Xq!e_zBHiK1fiu#%4N&JL|UsLp0VhISgS_-|rV!gB}Y4 z`13<_;e1uxR_JK70-*Ravv~X1ZckjhQmJq;Ryfml-Q!pD4;8jV+AhdW#V~1Jor(jZ z8I#Zy>`vV1{z+mh$F`mse47mGEFn%N#rlj$Ryr0X2DD4}vq`qVy4^bAeNZ!W7{dWY zO55fIeSvp_J2nCsdIA6rSkH%4RLZQCINr4>YcQ*%B_aU{nKhFGc%JV??a3Ra-Q-P3 ze(EMK(rtw!HGu@1=I<0p$jgLo74ZY^nY~rLZeJyZ+gZTe!E@VMH43n5Sw7>8Q3BvM zB8{?{Hje{_04?gTogn3&M^(jN{ASP@;0c8stYJEi3f+bf;^y0o43Mm z<1BvZl5VQ{Pd3Ua1&$~5SRd`)-E_~Y{DA#UeS4NriM7Zh-lZ2pOi2Ds10qh zDl2;AwaqoALts}3Ig*OlQK++dN6U>takI$9ECK+f;U%Vb0@y_>NV?mLDKaYm&fwa}jXvJGa*d~imF`7D2OeTTUX{T%#& z0eu65ejgD}ao+qxv7D^-5$%cKF0ttU( zv&2A%?{Z7DZ`I@Aw|{AYszUu`~f0u)@FSz;8FfOU^9q0QEu4rJ1zXTud0kb?7*=w>%J> zzrvj+?79^AK0YI~&F-vXgIrsKt9a33Seb-O;@nDJ34;u*j z<^z4TfgB-NHNLJ^RqJ8Jl)pMo$iRpsAIN@d9_>WZzcHnG?pjK4x*E&iP;+>s^K5l0 z?@G&)5rhUAYPo>>2l~KB1#H>rS>ASd(hJm%jU3vQ?Zs3M%^rVVE^wmMZV7i+G#*=? zh(C#e@~-&9BpDc2pT2k06WGpYe|0MQP0jAIp;V`le1Xc8^91k3xLiE^XPloJawZ#oDe_AWIv||eswxaV+ zyW$#*p_bF#09$kFTF*D4me8gca`pogZKEH&Nf%;m;J6c};AY%)b2ZR1Qhm(B`a+yv zP5HG%!nqm{B5zu*wU*^MQVI7KsH`(7!9M{mIPqNsz8S8WJnC4{aO0Wt0qKX$Cc~^o zpOjYR+{;QbZ7wo<$t@YL!{BG zlhLdW;B$O&j)^5mp(!OuZ=1|X!95-T&hFHm%P*he(&IL-(>h{9Dc2a)2$=p1os~oJ zL_dG345bX5-t(=s1hF)T<5TN&6cDG>HKX^au^V?2$ad1$fasKc{*z-~fHL00;qYcf zND>5FqMd*Ky!6hy4kX2?pQpDi;aSalvr4!2Fq_8rvz)8+S%D9u_RwK&&1^t zQ|L@vtjib#wR8;D8S(QH{R4@$u(?N`>P|Mvad@KF;s9U9bY9kA$!U^!JI#CR6ip$* z%rFX{grI8i5S~oMC!^0 z-a;({Rf|r>%!)%WSI@vXKr#iP*bZ1oWgVM*7h_`l8Ro(}VX}zn|J} zHT_v%pAVAWo-v#pn`FRmiiWwMZiQSpaKXWAk{sY^KND6$v&oUjL#xrz=rNKpzv=D< zU=_{r3JS8Ndjb9i-uIIlr{2%tZ7Ze-MbBoQpZF&b-(u@8J_LGR>XXU`|4YLi%HHlS zmw&kV)L2mcT9aW$M(I48U?AoCzvr3=)H~K-h34;%3lRC(-TmN$Q^b;A%PxOO1PCc_ z0G|RZ`cW}5%J9YZ)&Ih~L08tU<>cVPpI%e__SEO<>KZ~@;{JnKw0vIp9H|!mOaBHC z8PIIU$hXC0FVuQ;!U{-?eL}aRf0&Z9$%ukH{AJl>94@pZ?HmYE`M{G07j1$u6w{F7TM;{#J{vS7J-VE zc^-5ne%I?>G&b#>n}qcEw>A!NYzy*w1y$VcFBv_%3NTT_^5ke)Hn8%}3`_-q-B;6e z&1``ue%n{M?oM3jyAUWc;39O?K=(43!R<7Ta?9vf0zXlFS-T`R>4F(B1yT&YwLz4l zjFi1u9O#>jPuHyemdOkPUh8&2h`%6)=$yBXSg$iFGm?!`z}s^;jhuaMG8!KS4xq$h z8e}H1V$>&fv2A+E0XF92YcISZKdWgPv8~5^&XkK-KLJ>FG9nj2d_1y9-}3eVX~UiI zZv{(B%mojK9v)RwB&R*RGuz=rZsLH(u_jIM8-d65Q*p@$C8sH#c71WC(4Sc>PX4M zdGVg!38VhKa%!oPO=0fyiL#A{q}`$&p=9lMRiQP-+dxmpGIu#3{}&RUJv&59Y)G6k zcc$I}ErPS4{2-n2^jMvj4`fF@YM|OtDlDCL@hy)Pg|ws|;sjVDE6GO;)$nEU0h^}^>Ohb}eq*kCA<*DasSa$7LNJ~A%=%0Mu_%x=E#&CY zygl^*X{(R7H-YHEG&aZ50+TQSHWOgg14gT)kw!9AY%wr(0Q1ZbRE4GKst}uW@dE#d z%L^X#Vy@f;O}GcGublSf3#>t$B=xIuNBCrtA^h2&M0w?(N@GCmA-jHQEM(&eCNVRZ zgoPt$hRR~hBS}=kRP1prR?z1cbCUw!4RZJ%WlgwR(pajr|7$0BvWqP>tI3uQM_R+DL z9MHCy2J(cI41)=OG3kf69FjDt&u?m+yb~Ub4^j@CDh|rN zaf7xK8${Gs?)+dqJWfVcyYc0AoG*R4Gj&tv&0}Lr%kG~TVI1N&mEYkqAzeOYWg_%Q zM9R1~NtM(w)MPo#Aq(7V?{j@oo)s5Pe&0Gc(fuxYFMe~6#TYIGpfO}msW3`oNQTM# z3$@=?t(fj^UUyL&N!zNIiPLw<^Y@GfiGLikHhB*vhUc1xr6k}VY2w9_+E z4*iE)Zbz5urhxs&&mLDwId%MneIU^lx-YQkKk-@K`a>-wgCs;O#f*=_x9+^3;=eXgzv5aS zATvf9b3K1cd#h)C?=iVn13v1x8>mT-bPzE^Q1@eD;Dsx{G}-b6Q6Na4PO4%IZ{gu< z)T-COsJ5IfBmFEkmak4!b}eU-UfCJb`2I;17FaDcC`K(+T3Q;zZEI6zFSPuZHUohN z?fg6KnKHTj6W$6pEIq7GT!pDH-RrLrV=d8nP1-sgoMTz;!F2|Vb7<`%wk;(=4b%UhQrt7xy; z^Lb(4yc7Z1-x?GIg2xmcR%(&S7KqAHrKdB?M4`N1rxk(qC2a)%0GDT7Txf z>KZE`$*o+gkRemGpd@!epa2N~dl3UWaHpn*+@zb!Q(V`@L7|GQ5Zh@+u*i6SNv;PZ z(Y_ujHu;uwKEBYG&RB)DeX|%fKk0&Cd$!wr;E<;Pfe5?peN0^-tKg3c4p4N}!puzi zK3SY+uANi7w15hxS5v+zutypB>rJ&(r|w8t24OQF{3zYH4?+-O^V( z-}d)cOF^NUlDLP%96yHZwXcOP-Myo_Mlg6%DmnOIny3RXN>Hm+5zTS)rqA40PI=|t zIShzX45<(-0|zK*FR|U&z1^e7VkpKofc3v^^lln2C2>kAd=3fbkRUeAq%kacX2Qg# zas>g$McT`sq`3wRca_HqkGUs2{R4&Cb%SE-?~F9#C&N5% z=<3tFVp@>@h~n4zfa%0~fO||2+nf?anO-NOVU0jOn^|AM&vd$5If)6e0~V5fdnW!Y zK8S~*YzbxI@4=n}g3me;Fc=32h3+3&vQplvym~`^@{y@?!zIiLx%4d8VQTr|<`U-G z8O=X!(Ws`z;9I6+LX%Lk|CB+Q;Znd82f?rJo2#{6@pkLhk93sAcLh#$w%IgHvQ3KW zkAVHNW8FL6*RIUi2RlZO42rw~7y10I++S5TD$|%i^W{w#y%HZ?9MP7Egow0qQGO17 zGCYqoi#4OuqdmtvA2gBBG~y-I`kWo;Y%b5nt!%;1{F}=_d>tCPlq8&6kK?%nNaowJAp_$QYBRUM8vcEP)3BUQOfo?$A zLk1HqP;)?N&-+PfVMDJMyrxKWN;lbf!|D1ng$)` z4v%{7rk1L3VJFVQpDM{aG5>N;oMixXw!(lR=Wt)aEa!Q@y_VkkmVkp+qRwu;7(UH$ zE1aoYB1TH1jvP*g6*@zx-K=7aixV^qfz+{O1im!fd012EBm_@0-HJPaO(m&J}{a45j zU5_{hNwYs}s7E=-32qC!u5cnD{z;Fb zwNq_m?YIvtT*peLkN*Hm?J3V!N$_)_rwkoz_?XyADG& h@SgwqKW<*Zb46ZR%BuH!bc5qi`ntwCx!NbM{2zwQnh5{^ delta 13936 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 diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index ea1169737b8375d399eb93b7a593aaf33901c210..be7380efcf830346525cfa3d2ca20fed08521d22 100755 GIT binary patch delta 39163 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 XSj5@s?D|eaz)SD0q1NX+b}#-1aH}E) delta 39374 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δJrKXfJ?u)e*r7N>8@F`LWpcgr+aRy8g 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 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