Turns Holodeck Monkeys into actual Monkeys (#79068)

## About The Pull Request

Old holodeck monkeys weren't even a subtype of simple animal monkeys, so
this really just got swept under the floor in the sweeping monkey
species refactors. Anyways, let's just spin up a quick species datum+mob
subtype that will have all the traits we wanted from old holodeck
monkeys (no meat, no organs, etc.) but reaping all of the benefits of
modern monkeys (better AI, etc.)

## Why It's Good For The Game

One more refactor done, very simple too. l'm not the greatest at carbon
code so let me know if something is wack, but I'm fond of the way
everything turned out (especially since I don't have to spam seven
billion subtypes of every organ and bodypart). If you're concerned about
the cost keep in mind people can spam monkeys through cubes, having a
max of three more (that are virtually useless) via the holodeck will not
kill us.

Also the fact that slimes could eat holodeck monkeys irked me so I also
touched that up. I swore there was something for it in the code but I
was mistaken, it's codified now.

## Changelog

🆑
refactor: Holodeck monkeys have been moved to the same system as old
monkeys, and should retain the similar "ephermeal" behavior, while being
a whole lot smarter by leveraging new AI. Please report anything that is
completely wack about this.
balance: Slimes can't eat holodeck monkeys anymore, because apparently
they could and that is wack.
/🆑

again let me know if my carbon/bodyparts code sucks. it does the job
fwiw
This commit is contained in:
san7890
2023-10-19 23:16:10 -04:00
committed by GitHub
parent 4d859c913b
commit a5f26ce473
13 changed files with 57 additions and 30 deletions
+1
View File
@@ -120,6 +120,7 @@
#define SPECIES_NIGHTMARE "nightmare"
#define SPECIES_MONKEY "monkey"
#define SPECIES_MONKEY_FREAK "monkey_freak"
#define SPECIES_MONKEY_HOLODECK "monkey_holodeck"
#define SPECIES_MONKEY_HUMAN_LEGGED "monkey_human_legged"
#define SPECIES_MOTH "moth"
#define SPECIES_MUSHROOM "mush"
+1 -1
View File
@@ -102,7 +102,7 @@
mobtype = /mob/living/basic/bee/toxin
/obj/effect/holodeck_effect/mobspawner/monkey
mobtype = /mob/living/simple_animal/holodeck_monkey
mobtype = /mob/living/carbon/human/species/monkey/holodeck
/obj/effect/holodeck_effect/mobspawner/penguin
mobtype = /mob/living/basic/pet/penguin/emperor/neuter
-23
View File
@@ -1,23 +0,0 @@
/*
Mobs
*/
/mob/living/simple_animal/holodeck_monkey
name = "monkey"
desc = "A holographic creature fond of bananas."
icon = 'icons/mob/human/human.dmi'
icon_state = "monkey"
icon_living = "monkey"
icon_dead = "monkey_dead"
speak_emote = list("chimpers")
emote_hear = list("chimpers.")
emote_see = list("scratches.", "looks around.")
speak_chance = 1
turns_per_move = 2
butcher_results = list()
response_help_continuous = "pets"
response_help_simple = "pet"
response_disarm_continuous = "pushes aside"
response_disarm_simple = "push aside"
response_harm_continuous = "kicks"
response_harm_simple = "kick"
@@ -14,6 +14,10 @@
to_chat(src, span_revenwarning("You are already siphoning the essence of a soul!"))
return FALSE
if(target.flags_1 & HOLOGRAM_1)
target.balloon_alert(src, "doesn't possess a soul!") // it's a machine generated visual
return
draining = TRUE
var/value_to_return = harvest_soul(target)
if(!value_to_return)
@@ -47,7 +47,7 @@
///only used by humans.
var/obj/item/clothing/ears = null
/// Carbon
/// Carbon, you should really only be accessing this through has_dna() but it's your life
var/datum/dna/dna = null
///last mind to control this mob, for blood-based cloning
var/datum/mind/last_mind = null
+16 -2
View File
@@ -4,7 +4,7 @@
ai_controller = /datum/ai_controller/monkey
faction = list(FACTION_NEUTRAL, FACTION_MONKEY)
/mob/living/carbon/human/species/monkey/Initialize(mapload, cubespawned=FALSE, mob/spawner)
/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)
@@ -21,7 +21,7 @@
/mob/living/carbon/human/species/monkey/angry
ai_controller = /datum/ai_controller/monkey/angry
/mob/living/carbon/human/species/monkey/angry/Initialize(mapload)
/mob/living/carbon/human/species/monkey/angry/Initialize(mapload, cubespawned = FALSE, mob/spawner)
. = ..()
if(prob(10))
INVOKE_ASYNC(src, PROC_REF(give_ape_escape_helmet))
@@ -32,6 +32,20 @@
equip_to_slot_or_del(helmet, ITEM_SLOT_HEAD)
helmet.attack_self(src) // todo encapsulate toggle
/mob/living/carbon/human/species/monkey/holodeck
race = /datum/species/monkey/holodeck
/mob/living/carbon/human/species/monkey/holodeck/spawn_gibs() // no blood and no gibs
return
/mob/living/carbon/human/species/monkey/holodeck/has_dna()
return null
/mob/living/carbon/human/species/monkey/holodeck/create_bodyparts(list/overrides) // done like this in case people add more limbs to monkeys or something
. = ..()
for(var/obj/item/bodypart/limb as anything in bodyparts)
limb.bodypart_flags |= BODYPART_UNREMOVABLE // no farming organs or limbs from these fellers. get a monkey cube
GLOBAL_DATUM(the_one_and_only_punpun, /mob/living/carbon/human/species/monkey/punpun)
/mob/living/carbon/human/species/monkey/punpun
@@ -192,4 +192,31 @@
/obj/item/organ/internal/brain/primate/get_attacking_limb(mob/living/carbon/human/target)
return owner.get_bodypart(BODY_ZONE_HEAD)
/// Virtual monkeys that crave virtual bananas. Everything about them is ephemeral (except that bite).
/datum/species/monkey/holodeck
id = SPECIES_MONKEY_HOLODECK
knife_butcher_results = list()
meat = null
skinned_type = null
inherent_traits = list(
TRAIT_GENELESS,
TRAIT_GUN_NATURAL,
TRAIT_NO_AUGMENTS,
TRAIT_NO_BLOOD_OVERLAY,
TRAIT_NO_DNA_COPY,
TRAIT_NO_UNDERWEAR,
TRAIT_NO_ZOMBIFY,
TRAIT_NOBLOOD,
TRAIT_NOHUNGER,
TRAIT_VENTCRAWLER_NUDE,
)
bodypart_overrides = list(
BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/monkey,
BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/monkey,
BODY_ZONE_HEAD = /obj/item/bodypart/head/monkey,
BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/monkey,
BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/monkey,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/monkey,
)
#undef MONKEY_SPEC_ATTACK_BITE_MISS_CHANCE
+1 -1
View File
@@ -711,7 +711,7 @@
///Check to see if we have the liver, if not automatically gives you last-stage effects of lacking a liver.
/mob/living/carbon/proc/handle_liver(seconds_per_tick, times_fired)
if(!dna)
if(isnull(has_dna()))
return
var/obj/item/organ/internal/liver/liver = get_organ_slot(ORGAN_SLOT_LIVER)
@@ -64,6 +64,10 @@
if(issilicon(meal) || meal.mob_biotypes & MOB_ROBOTIC)
return FALSE
if(meal.flags_1 & HOLOGRAM_1)
meal.balloon_alert(src, "no life energy!")
return FALSE
if(isanimal(meal))
var/mob/living/simple_animal/simple_meal = meal
if(simple_meal.damage_coeff[TOX] <= 0 && simple_meal.damage_coeff[BRUTE] <= 0) //The creature wouldn't take any damage, it must be too weird even for us.
@@ -86,6 +86,8 @@
. += cavity_item
cavity_item = null
return .
///limb removal. The "special" argument is used for swapping a limb with a new one without the effects of losing a limb kicking in.
/obj/item/bodypart/proc/drop_limb(special, dismembered)
if(!owner)
Binary file not shown.

After

Width:  |  Height:  |  Size: 778 B

@@ -41,7 +41,6 @@
/mob/living/simple_animal/drone/snowflake/bardrone,
/mob/living/simple_animal/drone/syndrone,
/mob/living/simple_animal/drone/syndrone/badass,
/mob/living/simple_animal/holodeck_monkey,
/mob/living/simple_animal/hostile,
/mob/living/simple_animal/hostile/alien,
/mob/living/simple_animal/hostile/alien/drone,
-1
View File
@@ -3924,7 +3924,6 @@
#include "code\modules\holodeck\holo_effect.dm"
#include "code\modules\holodeck\holodeck_map_templates.dm"
#include "code\modules\holodeck\items.dm"
#include "code\modules\holodeck\mobs.dm"
#include "code\modules\holodeck\turfs.dm"
#include "code\modules\hydroponics\biogenerator.dm"
#include "code\modules\hydroponics\bouquets.dm"