From 12c1464bc3d3e6a3681e1b90e9c1d8dfdd6fb3ef Mon Sep 17 00:00:00 2001 From: Qustinnus Date: Sun, 13 Dec 2020 13:19:54 +0100 Subject: [PATCH] [READY] Creates Datumized AI and applies it to monkeys (#55238) New AI system, implemented for monkeys. --- code/__DEFINES/DNA.dm | 2 + code/__DEFINES/ai.dm | 35 ++ code/__DEFINES/dcs/signals.dm | 7 + code/__DEFINES/monkeys.dm | 64 +-- code/__DEFINES/vv.dm | 1 + code/_globalvars/lists/mobs.dm | 7 + .../subsystem/processing/ai_controllers.dm | 22 + code/datums/ai/README.md | 21 + code/datums/ai/_ai_behavior.dm | 17 + code/datums/ai/_ai_controller.dm | 137 ++++++ code/datums/ai/generic_actions.dm | 22 + code/datums/ai/monkey/monkey_behaviors.dm | 258 +++++++++++ code/datums/ai/monkey/monkey_controller.dm | 213 +++++++++ code/datums/mutations/body.dm | 4 +- code/game/atoms.dm | 27 ++ code/game/objects/items.dm | 2 +- code/game/objects/items/handcuffs.dm | 8 +- .../changeling/powers/tiny_prick.dm | 2 +- code/modules/clothing/head/helmet.dm | 2 +- .../mob/living/carbon/carbon_defense.dm | 2 + code/modules/mob/living/carbon/emote.dm | 16 +- .../mob/living/carbon/human/examine.dm | 3 + code/modules/mob/living/carbon/human/human.dm | 3 + .../mob/living/carbon/monkey/combat.dm | 426 ------------------ code/modules/mob/living/carbon/monkey/life.dm | 24 - .../mob/living/carbon/monkey/monkey.dm | 4 +- .../living/carbon/monkey/monkey_defense.dm | 1 - .../mob/living/carbon/monkey/punpun.dm | 2 +- code/modules/mob/transform_procs.dm | 10 +- .../reagents/reagent_containers/syringes.dm | 5 +- code/modules/recycling/disposal/bin.dm | 2 + sound/creatures/monkey/monkey_screech_1.ogg | Bin 0 -> 17130 bytes sound/creatures/monkey/monkey_screech_2.ogg | Bin 0 -> 17470 bytes sound/creatures/monkey/monkey_screech_3.ogg | Bin 0 -> 19805 bytes sound/creatures/monkey/monkey_screech_4.ogg | Bin 0 -> 18669 bytes sound/creatures/monkey/monkey_screech_5.ogg | Bin 0 -> 22307 bytes sound/creatures/monkey/monkey_screech_6.ogg | Bin 0 -> 21131 bytes sound/creatures/monkey/monkey_screech_7.ogg | Bin 0 -> 20735 bytes tgstation.dme | 8 +- 39 files changed, 855 insertions(+), 502 deletions(-) create mode 100644 code/__DEFINES/ai.dm create mode 100644 code/controllers/subsystem/processing/ai_controllers.dm create mode 100644 code/datums/ai/README.md create mode 100644 code/datums/ai/_ai_behavior.dm create mode 100644 code/datums/ai/_ai_controller.dm create mode 100644 code/datums/ai/generic_actions.dm create mode 100644 code/datums/ai/monkey/monkey_behaviors.dm create mode 100644 code/datums/ai/monkey/monkey_controller.dm delete mode 100644 code/modules/mob/living/carbon/monkey/combat.dm create mode 100644 sound/creatures/monkey/monkey_screech_1.ogg create mode 100644 sound/creatures/monkey/monkey_screech_2.ogg create mode 100644 sound/creatures/monkey/monkey_screech_3.ogg create mode 100644 sound/creatures/monkey/monkey_screech_4.ogg create mode 100644 sound/creatures/monkey/monkey_screech_5.ogg create mode 100644 sound/creatures/monkey/monkey_screech_6.ogg create mode 100644 sound/creatures/monkey/monkey_screech_7.ogg diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 66a5dc9c9bb..c07dabafaf2 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -105,6 +105,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 diff --git a/code/__DEFINES/ai.dm b/code/__DEFINES/ai.dm new file mode 100644 index 00000000000..d3cbc31fce6 --- /dev/null +++ b/code/__DEFINES/ai.dm @@ -0,0 +1,35 @@ +#define GET_AI_BEHAVIOR(behavior_type) SSai_controllers.ai_behaviors[behavior_type] +#define HAS_AI_CONTROLLER_TYPE(thing, type) istype(thing?.ai_controller, type) + +#define AI_STATUS_ON 1 +#define AI_STATUS_OFF 2 + + +///Monkey checks +#define SHOULD_RESIST(source) (source.on_fire || source.buckled || HAS_TRAIT(source, TRAIT_RESTRAINED) || (source.pulledby && source.pulledby.grab_state > GRAB_PASSIVE)) +#define IS_DEAD_OR_INCAP(source) (HAS_TRAIT(source, TRAIT_INCAPACITATED) || HAS_TRAIT(source, TRAIT_HANDS_BLOCKED) || IS_IN_STASIS(source)) + +///Max pathing attempts before auto-fail +#define MAX_PATHING_ATTEMPTS 30 + +///Flags for ai_behavior new() +#define AI_CONTROLLER_INCOMPATIBLE (1<<0) + +///Does this task require movement from the AI before it can be performed? +#define AI_BEHAVIOR_REQUIRE_MOVEMENT (1<<0) +///Does this task let you perform the action while you move closer? (Things like moving and shooting) +#define AI_BEHAVIOR_MOVE_AND_PERFORM (1<<1) + + +///Monkey AI controller blackboard keys + +#define BB_MONKEY_AGRESSIVE "BB_monkey_agressive" +#define BB_MONKEY_BEST_FORCE_FOUND "BB_monkey_bestforcefound" +#define BB_MONKEY_ENEMIES "BB_monkey_enemies" +#define BB_MONKEY_BLACKLISTITEMS "BB_monkey_blacklistitems" +#define BB_MONKEY_PICKUPTARGET "BB_monkey_pickuptarget" +#define BB_MONKEY_PICKPOCKETING "BB_monkey_pickpocketing" +#define BB_MONKEY_CURRENT_ATTACK_TARGET "BB_monkey_current_attack_target" +#define BB_MONKEY_TARGET_DISPOSAL "BB_monkey_target_disposal" +#define BB_MONKEY_DISPOSING "BB_monkey_disposing" +#define BB_MONKEY_RECRUIT_COOLDOWN "BB_monkey_recruit_cooldown" diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 02027ec957e..d1d861e6df2 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -157,6 +157,8 @@ #define COMSIG_ATOM_ORBIT_STOP "atom_orbit_stop" ///from base of atom/set_opacity(): (new_opacity) #define COMSIG_ATOM_SET_OPACITY "atom_set_opacity" +///from base of atom/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) +#define COMSIG_ATOM_HITBY "atom_hitby" //from base of atom/movable/on_enter_storage(): (datum/component/storage/concrete/master_storage) #define COMSIG_STORAGE_ENTERED "storage_entered" @@ -391,6 +393,9 @@ #define COMSIG_LIVING_REGENERATE_LIMBS "living_regen_limbs" ///from base of mob/living/set_buckled(): (new_buckled) #define COMSIG_LIVING_SET_BUCKLED "living_set_buckled" +///From post-can inject check of syringe after attack (mob/user) +#define COMSIG_LIVING_TRY_SYRINGE "living_try_syringe" + ///Sent when bloodcrawl ends in mob/living/phasein(): (phasein_decal) #define COMSIG_LIVING_AFTERPHASEIN "living_phasein" @@ -463,6 +468,8 @@ #define COMSIG_CARBON_EMBED_RIP "item_embed_start_rip" ///called when removing a given item from a mob, from mob/living/carbon/remove_embedded_object(mob/living/carbon/target, /obj/item) #define COMSIG_CARBON_EMBED_REMOVAL "item_embed_remove_safe" +///Called when someone attempts to cuff a carbon +#define COMSIG_CARBON_CUFF_ATTEMPTED "carbon_attempt_cuff" // /mob/living/simple_animal/hostile signals #define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget" diff --git a/code/__DEFINES/monkeys.dm b/code/__DEFINES/monkeys.dm index 46fe9698b3c..dba8e80c6e8 100644 --- a/code/__DEFINES/monkeys.dm +++ b/code/__DEFINES/monkeys.dm @@ -1,37 +1,41 @@ //Monkey defines, placed here so they can be read by other things! -//Mode defines -#define MONKEY_IDLE 0 // idle -#define MONKEY_HUNT 1 // found target, hunting -#define MONKEY_FLEE 2 // free from enemies -#define MONKEY_DISPOSE 3 // dump body in disposals - -#define MONKEY_FLEE_HEALTH 50 // below this health value the monkey starts to flee from enemies -#define MONKEY_ENEMY_VISION 9 // how close an enemy must be to trigger aggression -#define MONKEY_FLEE_VISION 4 // how close an enemy must be before it triggers flee -#define MONKEY_ITEM_SNATCH_DELAY 25 // How long does it take the item to be taken from a mobs hand -#define MONKEY_CUFF_RETALIATION_PROB 20 // Probability monkey will aggro when cuffed -#define MONKEY_SYRINGE_RETALIATION_PROB 20 // Probability monkey will aggro when syringed +/// below this health value the monkey starts to flee from enemies +#define MONKEY_FLEE_HEALTH 50 +/// how close an enemy must be to trigger aggression +#define MONKEY_ENEMY_VISION 9 +/// how close an enemy must be before it triggers flee +#define MONKEY_FLEE_VISION 4 +/// How long does it take the item to be taken from a mobs hand +#define MONKEY_ITEM_SNATCH_DELAY 25 +/// Probability monkey will aggro when cuffed +#define MONKEY_CUFF_RETALIATION_PROB 20 +/// Probability monkey will aggro when syringed +#define MONKEY_SYRINGE_RETALIATION_PROB 20 // Probability per Life tick that the monkey will: -#define MONKEY_RESIST_PROB 50 // resist out of restraints - // when the monkey is idle -#define MONKEY_PULL_AGGRO_PROB 5 // aggro against the mob pulling it -#define MONKEY_SHENANIGAN_PROB 5 // chance of getting into mischief, i.e. finding/stealing items - // when the monkey is hunting -#define MONKEY_ATTACK_DISARM_PROB 50 // disarm an armed attacker -#define MONKEY_WEAPON_PROB 20 // if not currently getting an item, search for a weapon around it -#define MONKEY_RECRUIT_PROB 25 // recruit a monkey near it -#define MONKEY_SWITCH_TARGET_PROB 25 // switch targets if it sees another enemy +/// probability that monkey resist out of restraints +#define MONKEY_RESIST_PROB 50 +/// probability that monkey aggro against the mob pulling it +#define MONKEY_PULL_AGGRO_PROB 5 +/// 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 +/// probability that monkey will get recruited when friend is attacked +#define MONKEY_RECRUIT_PROB 25 -#define MONKEY_RETALIATE_HARM_PROB 95 // probability for the monkey to aggro when attacked with harm intent -#define MONKEY_RETALIATE_DISARM_PROB 20 // probability for the monkey to aggro when attacked with disarm intent +/// probability for the monkey to aggro when attacked with harm intent +#define MONKEY_RETALIATE_HARM_PROB 95 +/// probability for the monkey to aggro when attacked with disarm intent +#define MONKEY_RETALIATE_DISARM_PROB 20 -#define MONKEY_HATRED_AMOUNT 4 // amount of aggro to add to an enemy when they attack user -#define MONKEY_HATRED_REDUCTION_PROB 25 // probability of reducing aggro by one when the monkey attacks +/// amount of aggro to add to an enemy when they attack user +#define MONKEY_HATRED_AMOUNT 4 +/// amount of aggro to add to an enemy when a monkey is recruited +#define MONKEY_RECRUIT_HATED_AMOUNT 2 +/// probability of reducing aggro by one when the monkey attacks +#define MONKEY_HATRED_REDUCTION_PROB 20 -// how many Life ticks the monkey will fail to: -#define MONKEY_HUNT_FRUSTRATION_LIMIT 8 // Chase after an enemy before giving up -#define MONKEY_DISPOSE_FRUSTRATION_LIMIT 16 // Dispose of a body before giving up - -#define MONKEY_AGGRESSIVE_MVM_PROB 0 // If you mass edit monkies to be aggressive. there is a small chance of in-fighting +///Monkey recruit cooldown +#define MONKEY_RECRUIT_COOLDOWN 1 MINUTES diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 07079caed49..dce63618ce6 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -84,6 +84,7 @@ #define VV_HK_TRIGGER_EXPLOSION "explode" #define VV_HK_AUTO_RENAME "auto_rename" #define VV_HK_RADIATE "radiate" +#define VV_HK_ADD_AI "add_ai" // /obj #define VV_HK_OSAY "osay" diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index bb5118b60bf..1683c3a26f2 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -6,6 +6,13 @@ GLOBAL_LIST_EMPTY(deadmins) //all ckeys who have used the de-admin verb. GLOBAL_LIST_EMPTY(directory) //all ckeys with associated client GLOBAL_LIST_EMPTY(stealthminID) //reference list with IDs that store ckeys, for stealthmins +GLOBAL_LIST_INIT(dangerous_turfs, typecacheof(list( + /turf/open/lava, + /turf/open/chasm, + /turf/open/space, + /turf/open/openspace))) + + //Since it didn't really belong in any other category, I'm putting this here //This is for procs to replace all the goddamn 'in world's that are chilling around the code diff --git a/code/controllers/subsystem/processing/ai_controllers.dm b/code/controllers/subsystem/processing/ai_controllers.dm new file mode 100644 index 00000000000..093ce9962dc --- /dev/null +++ b/code/controllers/subsystem/processing/ai_controllers.dm @@ -0,0 +1,22 @@ +/// The subsystem used to tick [/datum/ai_controllers] instances. Handling the re-checking of plans. +PROCESSING_SUBSYSTEM_DEF(ai_controllers) + name = "AI behavior" + flags = SS_POST_FIRE_TIMING|SS_BACKGROUND + priority = FIRE_PRIORITY_NPC + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + wait = 8 //Uses the value of CLICK_CD_MELEE because that seemed like a nice standard for the speed of AI behavior + + ///an assoc list of all ai_behaviors by type, to + var/list/ai_behaviors + +/datum/controller/subsystem/processing/ai_controllers/Initialize(timeofday) + SetupAIBehaviors() + return ..() + +/datum/controller/subsystem/processing/ai_controllers/proc/SetupAIBehaviors() + ai_behaviors = list() + for(var/i in subtypesof(/datum/ai_behavior)) + var/datum/ai_behavior/ai_behavior = new i + ai_behaviors[i] = ai_behavior + + diff --git a/code/datums/ai/README.md b/code/datums/ai/README.md new file mode 100644 index 00000000000..f219b11bb24 --- /dev/null +++ b/code/datums/ai/README.md @@ -0,0 +1,21 @@ +# AI controllers + +## Introduction + +Our AI controller system is an attempt at making it possible to create modularized AI that stores its behavior in datums, while keeping state and decision making in a controller. This allows a more versatile way of creating AI that doesn't rely on OOP as much, and doesn't clutter up the Life() code in Mobs. + +## AI Controllers + +A datum that can be added to any atom in the game. Similarly to components, they might only support a given subtype (e.g. /mob/living), but the idea is that theoretically, you could apply a specific AI controller to a big a group of different types as possible and it would still work. + +These datums handle both the normal movement of mobs, but also their decision making, deciding which actions they will take based on the checks you put into their SelectBehaviors proc. + +If behaviors are selected, and the AI is in range, it will try to perform them. It runs all the behaviors it currently has in parallel; allowing for it to for example screech at someone while trying to attack them. Aslong as it has behaviors running, it will not try to generate new plans, making it not waste CPU when it already has an active goal. + +They also hold data for any of the actions they might need to use, such as cooldowns, whether or not they're currently fighting, etcetera this is stored in the blackboard, more information on that below. + +### Blackboard +The blackboard is an associated list keyed with strings and with values of whatever you want. These store information the mob has such as "Am I attacking someone", "Do I have a weapon". By using an associated list like this, no data needs to be stored on the actions themselves, and you could make actions that work on multiple ai controllers if you so pleased by making the key to use a variable. + +## AI Behavior +AI behaviors are the actions an AI can take. These can range from "Do an emote" to "Attack this target until he is dead". They are singletons and should contain nothing but static data. Any dynamic data should be stored in the blackboard, to allow different controllers to use the same behaviors. diff --git a/code/datums/ai/_ai_behavior.dm b/code/datums/ai/_ai_behavior.dm new file mode 100644 index 00000000000..3c5154f42a0 --- /dev/null +++ b/code/datums/ai/_ai_behavior.dm @@ -0,0 +1,17 @@ +///Abstract class for an action an AI can take, can range from movement to grabbing a nearby weapon. +/datum/ai_behavior + ///What distance you need to be from the target to perform the action + var/required_distance = 1 + ///Flags for extra behavior + var/behavior_flags = NONE + +///Called by the AI controller when this action is performed +/datum/ai_behavior/proc/perform(delta_time, datum/ai_controller/controller) + return + +///Called when the action is finished. +/datum/ai_behavior/proc/finish_action(datum/ai_controller/controller, succeeded) + controller.current_behaviors.Remove(src) + if(behavior_flags & AI_BEHAVIOR_REQUIRE_MOVEMENT) //If this was a movement task, reset our movement target. + controller.current_movement_target = null + return diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm new file mode 100644 index 00000000000..05ad86686d3 --- /dev/null +++ b/code/datums/ai/_ai_controller.dm @@ -0,0 +1,137 @@ +/* +AI controllers are a datumized form of AI that simulates the input a player would otherwise give to a atom. What this means is that these datums +have ways of interacting with a specific atom and control it. They posses a blackboard with the information the AI knows and has, and will plan behaviors it will try to execute. +*/ + +/datum/ai_controller + ///The atom this controller is controlling + var/atom/pawn + ///Bitfield of traits for this AI to handle extra behavior + var/ai_traits + ///Current actions being performed by the AI. + var/list/current_behaviors = list() + ///Current status of AI (OFF/ON/IDLE) + var/ai_status + ///Current movement target of the AI, generally set by decision making. + var/atom/current_movement_target + ///Delay between atom movements, if this is not a multiplication of the delay in + var/move_delay + ///This is a list of variables the AI uses and can be mutated by actions. When an action is performed you pass this list and any relevant keys for the variables it can mutate. + var/list/blackboard = list() + ///Tracks recent pathing attempts, if we fail too many in a row we fail our current plans. + var/pathing_attempts + +/datum/ai_controller/New(atom/new_pawn) + PossessPawn(new_pawn) + +/datum/ai_controller/Destroy(force, ...) + set_ai_status(AI_STATUS_OFF) + UnpossessPawn() + return ..() + +///Proc to move from one pawn to another, this will destroy the target's existing controller. +/datum/ai_controller/proc/PossessPawn(atom/new_pawn) + if(pawn) //Reset any old signals + UnpossessPawn() + + if(istype(new_pawn.ai_controller)) //Existing AI, kill it. + QDEL_NULL(new_pawn.ai_controller) + + if(TryPossessPawn(new_pawn) & AI_CONTROLLER_INCOMPATIBLE) + qdel(src) + CRASH("[src] attached to [new_pawn] but these are not compatible!") + + pawn = new_pawn + pawn.ai_controller = src + + set_ai_status(AI_STATUS_ON) + + RegisterSignal(pawn, COMSIG_MOB_LOGIN, .proc/on_sentience_gained) + +///Abstract proc for initializing the pawn to the new controller +/datum/ai_controller/proc/TryPossessPawn(atom/new_pawn) + return + +///Proc for deinitializing the pawn to the old controller +/datum/ai_controller/proc/UnpossessPawn() + UnregisterSignal(pawn, COMSIG_MOB_LOGIN, COMSIG_MOB_LOGOUT) + pawn.ai_controller = null + pawn = null + return + +///Returns TRUE if the ai controller can actually run at the moment. +/datum/ai_controller/proc/able_to_run() + return TRUE + +/// Generates a plan and see if our existing one is still valid. +/datum/ai_controller/process(delta_time) + if(!able_to_run()) + return //this should remove them from processing in the future through event-based stuff. + if(!current_behaviors?.len) + SelectBehaviors(delta_time) + if(!current_behaviors?.len) + PerformIdleBehavior(delta_time) //Do some stupid shit while we have nothing to do + return + + var/want_to_move = FALSE + for(var/i in current_behaviors) + var/datum/ai_behavior/current_behavior = i + if(current_behavior.behavior_flags & AI_BEHAVIOR_REQUIRE_MOVEMENT && current_movement_target && current_behavior.required_distance < get_dist(pawn, current_movement_target)) //Move closer + want_to_move = TRUE + if(current_behavior.behavior_flags & AI_BEHAVIOR_MOVE_AND_PERFORM) //Move and perform the action + current_behavior.perform(delta_time, src) + else //Perform the action + current_behavior.perform(delta_time, src) + + if(want_to_move) + MoveTo(delta_time) //Need to add some code to check if we can perform the actions now without too much overhead + + +///Move somewhere using dumb movement (byond base) +/datum/ai_controller/proc/MoveTo(delta_time) + var/current_loc = get_turf(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)) + if(++pathing_attempts >= MAX_PATHING_ATTEMPTS) + CancelActions() + pathing_attempts = 0 + + +///Perform some dumb idle behavior. +/datum/ai_controller/proc/PerformIdleBehavior(delta_time) + return + +///This is where you decide what actions are taken by the AI. +/datum/ai_controller/proc/SelectBehaviors(delta_time) + SHOULD_NOT_SLEEP(TRUE) //Fuck you don't sleep in procs like this. + return + +///This proc handles changing ai status, and starts/stops processing if required. +/datum/ai_controller/proc/set_ai_status(new_ai_status) + if(ai_status == new_ai_status) + return FALSE //no change + + ai_status = new_ai_status + switch(ai_status) + if(AI_STATUS_ON) + START_PROCESSING(SSai_controllers, src) + if(AI_STATUS_OFF) + STOP_PROCESSING(SSai_controllers, src) + CancelActions() + +/datum/ai_controller/proc/CancelActions() + for(var/i in current_behaviors) + var/datum/ai_behavior/current_behavior = i + current_behavior.finish_action(src, FALSE) + +/datum/ai_controller/proc/on_sentience_gained() + UnregisterSignal(pawn, COMSIG_MOB_LOGIN) + set_ai_status(AI_STATUS_OFF) //Can't do anything while player is connected + RegisterSignal(pawn, COMSIG_MOB_LOGOUT, .proc/on_sentience_lost) + +/datum/ai_controller/proc/on_sentience_lost() + UnregisterSignal(pawn, COMSIG_MOB_LOGOUT) + set_ai_status(AI_STATUS_ON) //Can't do anything while player is connected + RegisterSignal(pawn, COMSIG_MOB_LOGIN, .proc/on_sentience_gained) diff --git a/code/datums/ai/generic_actions.dm b/code/datums/ai/generic_actions.dm new file mode 100644 index 00000000000..76793c39e08 --- /dev/null +++ b/code/datums/ai/generic_actions.dm @@ -0,0 +1,22 @@ + +/datum/ai_behavior/resist/perform(delta_time, datum/ai_controller/controller) + . = ..() + var/mob/living/living_pawn = controller.pawn + living_pawn.resist() + finish_action(controller, TRUE) + +/datum/ai_behavior/battle_screech + ///List of possible screeches the behavior has + var/list/screeches + +/datum/ai_behavior/battle_screech/perform(delta_time, datum/ai_controller/controller) + var/mob/living/living_pawn = controller.pawn + INVOKE_ASYNC(living_pawn, /mob.proc/emote, pick(screeches)) + finish_action(controller, TRUE) + + + + + + + diff --git a/code/datums/ai/monkey/monkey_behaviors.dm b/code/datums/ai/monkey/monkey_behaviors.dm new file mode 100644 index 00000000000..47994f02344 --- /dev/null +++ b/code/datums/ai/monkey/monkey_behaviors.dm @@ -0,0 +1,258 @@ +/datum/ai_behavior/battle_screech/monkey + screeches = list("roar","screech") + +/datum/ai_behavior/monkey_equip + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + +/datum/ai_behavior/monkey_equip/finish_action(datum/ai_controller/controller, success) + . = ..() + + if(!success) //Don't try again on this item if we failed + var/list/item_blacklist = controller.blackboard[BB_MONKEY_BLACKLISTITEMS] + var/obj/item/target = controller.blackboard[BB_MONKEY_PICKUPTARGET] + + item_blacklist[target] = TRUE + + controller.blackboard[BB_MONKEY_PICKUPTARGET] = null + +/datum/ai_behavior/monkey_equip/proc/equip_item(datum/ai_controller/controller) + var/mob/living/living_pawn = controller.pawn + + var/obj/item/target = controller.blackboard[BB_MONKEY_PICKUPTARGET] + var/best_force = controller.blackboard[BB_MONKEY_BEST_FORCE_FOUND] + + if(!target) + finish_action(controller, FALSE) + return + + if(target.anchored) //Can't pick it up, so stop trying. + finish_action(controller, FALSE) + return + + // Strong weapon + else if(target.force > best_force) + living_pawn.put_in_hands(target) + controller.blackboard[BB_MONKEY_BEST_FORCE_FOUND] = target.force + finish_action(controller, TRUE) + return + + else if(target.slot_flags) //Clothing == top priority + living_pawn.dropItemToGround(target, TRUE) + living_pawn.update_icons() + if(!living_pawn.equip_to_appropriate_slot(target)) + finish_action(controller, FALSE) + return //Already wearing something, in the future this should probably replace the current item but the code didn't actually do that, and I dont want to support it right now. + finish_action(controller, TRUE) + return + + // EVERYTHING ELSE + else if(living_pawn.get_empty_held_index_for_side(LEFT_HANDS) || living_pawn.get_empty_held_index_for_side(RIGHT_HANDS)) + living_pawn.put_in_hands(target) + finish_action(controller, TRUE) + return + + + + finish_action(controller, FALSE) + +/datum/ai_behavior/monkey_equip/ground + required_distance = 0 + +/datum/ai_behavior/monkey_equip/ground/perform(delta_time, datum/ai_controller/controller) + equip_item(controller) + +/datum/ai_behavior/monkey_equip/pickpocket + +/datum/ai_behavior/monkey_equip/pickpocket/perform(delta_time, datum/ai_controller/controller) + + if(controller.blackboard[BB_MONKEY_PICKPOCKETING]) //We are pickpocketing, don't do ANYTHING!!!! + return + INVOKE_ASYNC(src, .proc/attempt_pickpocket, controller) + +/datum/ai_behavior/monkey_equip/pickpocket/proc/attempt_pickpocket(datum/ai_controller/controller) + var/obj/item/target = controller.blackboard[BB_MONKEY_PICKUPTARGET] + + var/mob/living/victim = target.loc + + var/mob/living/living_pawn = controller.pawn + + victim.visible_message("[living_pawn] starts trying to take [target] from [controller.current_movement_target]!", "[living_pawn] tries to take [target]!") + + controller.blackboard[BB_MONKEY_PICKPOCKETING] = TRUE + + var/success = FALSE + + if(do_mob(living_pawn, victim, MONKEY_ITEM_SNATCH_DELAY) && target) + + for(var/obj/item/I in victim.held_items) + if(I == target) + victim.visible_message("[living_pawn] snatches [target] from [victim].", "[living_pawn] snatched [target]!") + if(victim.temporarilyRemoveItemFromInventory(target)) + if(!QDELETED(target) && !equip_item(controller)) + target.forceMove(living_pawn.drop_location()) + success = TRUE + break + else + victim.visible_message("[living_pawn] tried to snatch [target] from [victim], but failed!", "[living_pawn] tried to grab [target]!") + + finish_action(controller, success) //We either fucked up or got the item. + +/datum/ai_behavior/monkey_equip/pickpocket/finish_action(datum/ai_controller/controller, success) + . = ..() + controller.blackboard[BB_MONKEY_PICKPOCKETING] = FALSE + controller.blackboard[BB_MONKEY_PICKUPTARGET] = null + +/datum/ai_behavior/monkey_flee + +/datum/ai_behavior/monkey_flee/perform(delta_time, datum/ai_controller/controller) + . = ..() + + var/mob/living/living_pawn = controller.pawn + + if(living_pawn.health >= MONKEY_FLEE_HEALTH) + finish_action(controller, TRUE) //we're back in bussiness + + var/mob/living/target = null + + // flee from anyone who attacked us and we didn't beat down + for(var/mob/living/L in view(living_pawn, MONKEY_FLEE_VISION)) + if(controller.blackboard[BB_MONKEY_ENEMIES][L] && L.stat == CONSCIOUS) + target = L + break + + if(target) + walk_away(living_pawn, target, MONKEY_ENEMY_VISION, 5) + else + finish_action(controller, TRUE) + +/datum/ai_behavior/monkey_attack_mob + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM //performs to increase frustration + +/datum/ai_behavior/monkey_attack_mob/perform(delta_time, datum/ai_controller/controller) + . = ..() + + var/mob/living/target = controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] + var/mob/living/living_pawn = controller.pawn + + if(!target || target.stat != CONSCIOUS) + finish_action(controller, TRUE) //Target == owned + + if(living_pawn.Adjacent(target) && isturf(target.loc) && !IS_DEAD_OR_INCAP(living_pawn)) // if right next to perp + // check if target has a weapon + var/obj/item/W + for(var/obj/item/I in target.held_items) + if(!(I.item_flags & ABSTRACT)) + W = I + break + + // if the target has a weapon, chance to disarm them + if(W && DT_PROB(MONKEY_ATTACK_DISARM_PROB, delta_time)) + living_pawn.a_intent = INTENT_DISARM + monkey_attack(controller, target, delta_time) + else + living_pawn.a_intent = INTENT_HARM + monkey_attack(controller, target, delta_time) + + +/datum/ai_behavior/monkey_attack_mob/finish_action(datum/ai_controller/controller, succeeded) + . = ..() + 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 +/datum/ai_behavior/monkey_attack_mob/proc/monkey_attack(datum/ai_controller/controller, mob/living/target, delta_time) + + var/mob/living/living_pawn = controller.pawn + + if(living_pawn.next_move > world.time) + return + + living_pawn.changeNext_move(CLICK_CD_MELEE) //We play fair + + var/obj/item/weapon = locate(/obj/item) in living_pawn.held_items + + living_pawn.face_atom(target) + + // attack with weapon if we have one + if(weapon) + weapon.melee_attack_chain(living_pawn, target) + else + target.attack_paw(living_pawn) + + // no de-aggro + if(controller.blackboard[BB_MONKEY_AGRESSIVE]) + return + + if(DT_PROB(MONKEY_HATRED_REDUCTION_PROB, delta_time)) + controller.blackboard[BB_MONKEY_ENEMIES][target]-- + + // if we are not angry at our target, go back to idle + if(controller.blackboard[BB_MONKEY_ENEMIES][target] <= 0) + var/list/enemies = controller.blackboard[BB_MONKEY_ENEMIES] + enemies.Remove(target) + if(controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] == target) + finish_action(controller, TRUE) + +/datum/ai_behavior/disposal_mob + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM //performs to increase frustration + +/datum/ai_behavior/disposal_mob/finish_action(datum/ai_controller/controller, succeeded) + . = ..() + controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = null //Reset attack target + controller.blackboard[BB_MONKEY_DISPOSING] = FALSE //No longer disposing + controller.blackboard[BB_MONKEY_TARGET_DISPOSAL] = null //No target disposal + +/datum/ai_behavior/disposal_mob/perform(delta_time, datum/ai_controller/controller) + . = ..() + + if(controller.blackboard[BB_MONKEY_DISPOSING]) //We are disposing, don't do ANYTHING!!!! + return + + var/mob/living/target = controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] + var/mob/living/living_pawn = controller.pawn + + controller.current_movement_target = target + + if(target.pulledby != living_pawn && !HAS_AI_CONTROLLER_TYPE(target.pulledby, /datum/ai_controller/monkey)) //Dont steal from my fellow monkeys. + if(living_pawn.Adjacent(target) && isturf(target.loc)) + living_pawn.a_intent = INTENT_GRAB + target.grabbedby(living_pawn) + return //Do the rest next turn + + var/obj/machinery/disposal/disposal = controller.blackboard[BB_MONKEY_TARGET_DISPOSAL] + controller.current_movement_target = disposal + + if(living_pawn.Adjacent(disposal)) + INVOKE_ASYNC(src, .proc/try_disposal_mob, controller) //put him in! + else //This means we might be getting pissed! + return + +/datum/ai_behavior/disposal_mob/proc/try_disposal_mob(datum/ai_controller/controller) + var/mob/living/living_pawn = controller.pawn + var/mob/living/target = controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] + var/obj/machinery/disposal/disposal = controller.blackboard[BB_MONKEY_TARGET_DISPOSAL] + + controller.blackboard[BB_MONKEY_DISPOSING] = TRUE + + if(target && disposal?.stuff_mob_in(target, living_pawn)) + disposal.flush() + finish_action(controller, TRUE) + + +/datum/ai_behavior/recruit_monkeys/perform(delta_time, datum/ai_controller/controller) + . = ..() + + controller.blackboard[BB_MONKEY_RECRUIT_COOLDOWN] = world.time + MONKEY_RECRUIT_COOLDOWN + var/mob/living/living_pawn = controller.pawn + + for(var/mob/living/L in view(living_pawn, MONKEY_ENEMY_VISION)) + if(!HAS_AI_CONTROLLER_TYPE(L, /datum/ai_controller/monkey)) + continue + + if(!DT_PROB(MONKEY_RECRUIT_PROB, delta_time)) + continue + var/datum/ai_controller/monkey/monkey_ai = L.ai_controller + var/atom/your_enemy = controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] + var/list/enemies = L.ai_controller.blackboard[BB_MONKEY_ENEMIES] + enemies[your_enemy] = MONKEY_RECRUIT_HATED_AMOUNT + monkey_ai.blackboard[BB_MONKEY_RECRUIT_COOLDOWN] = world.time + MONKEY_RECRUIT_COOLDOWN + finish_action(controller, TRUE) diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm new file mode 100644 index 00000000000..5c3da9eebca --- /dev/null +++ b/code/datums/ai/monkey/monkey_controller.dm @@ -0,0 +1,213 @@ +/* +AI controllers are a datumized form of AI that simulates the input a player would otherwise give to a mob. What this means is that these datums +have ways of interacting with a specific mob and control it. +*/ +///OOK OOK OOK + +/datum/ai_controller/monkey + blackboard = list(BB_MONKEY_AGRESSIVE = FALSE,\ + BB_MONKEY_BEST_FORCE_FOUND = 0,\ + BB_MONKEY_ENEMIES = list(),\ + BB_MONKEY_BLACKLISTITEMS = list(),\ + BB_MONKEY_PICKUPTARGET = null,\ + BB_MONKEY_PICKPOCKETING = FALSE, + BB_MONKEY_DISPOSING = FALSE, + BB_MONKEY_TARGET_DISPOSAL = null, + BB_MONKEY_CURRENT_ATTACK_TARGET = null, + BB_MONKEY_CURRENT_ATTACK_TARGET) + +/datum/ai_controller/monkey/angry + +/datum/ai_controller/monkey/angry/TryPossessPawn(atom/new_pawn) + . = ..() + if(. & AI_CONTROLLER_INCOMPATIBLE) + return + blackboard[BB_MONKEY_AGRESSIVE] = TRUE //Angry cunt + +/datum/ai_controller/monkey/TryPossessPawn(atom/new_pawn) + if(!isliving(new_pawn)) + return AI_CONTROLLER_INCOMPATIBLE + RegisterSignal(new_pawn, COMSIG_PARENT_ATTACKBY, .proc/on_attackby) + RegisterSignal(new_pawn, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand) + RegisterSignal(new_pawn, COMSIG_ATOM_ATTACK_PAW, .proc/on_attack_paw) + RegisterSignal(new_pawn, COMSIG_ATOM_BULLET_ACT, .proc/on_bullet_act) + RegisterSignal(new_pawn, COMSIG_ATOM_HITBY, .proc/on_hitby) + RegisterSignal(new_pawn, COMSIG_MOVABLE_CROSSED, .proc/on_Crossed) + RegisterSignal(new_pawn, COMSIG_LIVING_START_PULL, .proc/on_startpulling) + RegisterSignal(new_pawn, COMSIG_LIVING_TRY_SYRINGE, .proc/on_try_syringe) + RegisterSignal(new_pawn, COMSIG_ATOM_HULK_ATTACK, .proc/on_attack_hulk) + RegisterSignal(new_pawn, COMSIG_CARBON_CUFF_ATTEMPTED, .proc/on_attempt_cuff) + return ..() //Run parent at end + +/datum/ai_controller/monkey/UnpossessPawn() + UnregisterSignal(pawn, list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_MOVABLE_CROSSED, COMSIG_LIVING_START_PULL,\ + COMSIG_LIVING_TRY_SYRINGE, COMSIG_ATOM_HULK_ATTACK, COMSIG_CARBON_CUFF_ATTEMPTED)) + return ..() //Run parent at end + +/datum/ai_controller/monkey/able_to_run() + var/mob/living/living_pawn = pawn + + if(IS_DEAD_OR_INCAP(living_pawn)) + return FALSE + return ..() + +/datum/ai_controller/monkey/SelectBehaviors(delta_time) + current_behaviors = list() + var/mob/living/living_pawn = pawn + + if(SHOULD_RESIST(living_pawn) && DT_PROB(MONKEY_RESIST_PROB, delta_time)) + current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/resist) //BRO IM ON FUCKING FIRE BRO + return //IM NOT DOING ANYTHING ELSE BUT EXTUINGISH MYSELF, GOOD GOD HAVE MERCY. + + var/list/enemies = blackboard[BB_MONKEY_ENEMIES] + + if(HAS_TRAIT(pawn, TRAIT_PACIFISM)) //Not a pacifist? lets try some combat behavior. + return + if(length(enemies) || blackboard[BB_MONKEY_AGRESSIVE]) //We have enemies or are pissed + + var/mob/living/selected_enemy + + for(var/mob/living/possible_enemy in view(MONKEY_ENEMY_VISION, living_pawn)) + if(possible_enemy == living_pawn || (!enemies[possible_enemy] && (!blackboard[BB_MONKEY_AGRESSIVE] || HAS_AI_CONTROLLER_TYPE(possible_enemy, /datum/ai_controller/monkey)))) //Are they an enemy? (And do we even care?) + continue + + selected_enemy = possible_enemy + break + if(selected_enemy) + if(!selected_enemy.stat) //He's up, get him! + if(living_pawn.health < MONKEY_FLEE_HEALTH) //Time to skeddadle + blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy + current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/monkey_flee) + return //I'm running fuck you guys + + if(TryFindWeapon()) //Getting a weapon is higher priority if im not fleeing. + return + + blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy + current_movement_target = selected_enemy + if(blackboard[BB_MONKEY_RECRUIT_COOLDOWN] < world.time) + current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/recruit_monkeys) + current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/battle_screech/monkey) + current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/monkey_attack_mob) + return //Focus on this + + else //He's down, can we disposal him? + var/obj/machinery/disposal/bodyDisposal = locate(/obj/machinery/disposal/) in view(MONKEY_ENEMY_VISION, living_pawn) + if(bodyDisposal) + blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy + blackboard[BB_MONKEY_TARGET_DISPOSAL] = bodyDisposal + current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/disposal_mob) + return + + return //Too busy fighting to steal atm. + + else if(DT_PROB(MONKEY_SHENANIGAN_PROB, delta_time)) + if(TryFindWeapon()) //Found a better weapon, let's grab it first. + return + +///re-used behavior pattern by monkeys for finding a weapon +/datum/ai_controller/monkey/proc/TryFindWeapon() + var/mob/living/living_pawn = pawn + + if(!locate(/obj/item) in living_pawn.held_items) + blackboard[BB_MONKEY_BEST_FORCE_FOUND] = 0 + + var/obj/item/W = locate(/obj/item) in oview(2, living_pawn) + + if(W && !blackboard[BB_MONKEY_BLACKLISTITEMS][W] && W.force > blackboard[BB_MONKEY_BEST_FORCE_FOUND]) + blackboard[BB_MONKEY_PICKUPTARGET] = W + current_movement_target = W + current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/monkey_equip/ground) + return TRUE + else + var/mob/living/carbon/human/H = locate(/mob/living/carbon/human/) in oview(2,living_pawn) + if(H) + W = pick(H.held_items) + if(W && !blackboard[BB_MONKEY_BLACKLISTITEMS][W] && W.force > blackboard[BB_MONKEY_BEST_FORCE_FOUND]) + blackboard[BB_MONKEY_PICKUPTARGET] = W + current_movement_target = W + current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/monkey_equip/pickpocket) + return TRUE + +//When idle just kinda fuck around. +/datum/ai_controller/monkey/PerformIdleBehavior(delta_time) + 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)) + else if(DT_PROB(5, delta_time)) + INVOKE_ASYNC(living_pawn, /mob.proc/emote, pick("screech")) + else if(DT_PROB(1, delta_time)) + INVOKE_ASYNC(living_pawn, /mob.proc/emote, pick("scratch","jump","roll","tail")) + +///Reactive events to being hit +/datum/ai_controller/monkey/proc/retaliate(mob/living/L) + var/list/enemies = blackboard[BB_MONKEY_ENEMIES] + enemies[L] += MONKEY_HATRED_AMOUNT + +/datum/ai_controller/monkey/proc/on_attackby(datum/source, obj/item/I, mob/user) + SIGNAL_HANDLER + if(I.force && I.damtype != STAMINA) + retaliate(user) + +/datum/ai_controller/monkey/proc/on_attack_hand(datum/source, mob/living/L) + SIGNAL_HANDLER + if(L.a_intent == INTENT_HARM && prob(MONKEY_RETALIATE_HARM_PROB)) + retaliate(L) + else if(L.a_intent == INTENT_DISARM && prob(MONKEY_RETALIATE_DISARM_PROB)) + retaliate(L) + +/datum/ai_controller/monkey/proc/on_attack_paw(datum/source, mob/living/L) + SIGNAL_HANDLER + if(L.a_intent == INTENT_HARM && prob(MONKEY_RETALIATE_HARM_PROB)) + retaliate(L) + else if(L.a_intent == INTENT_DISARM && prob(MONKEY_RETALIATE_DISARM_PROB)) + retaliate(L) + +/datum/ai_controller/monkey/proc/on_bullet_act(datum/source, obj/projectile/Proj) + SIGNAL_HANDLER + var/mob/living/living_pawn = pawn + if(istype(Proj , /obj/projectile/beam)||istype(Proj, /obj/projectile/bullet)) + if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)) + if(!Proj.nodamage && Proj.damage < living_pawn.health && isliving(Proj.firer)) + retaliate(Proj.firer) + +/datum/ai_controller/monkey/proc/on_hitby(datum/source, atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) + SIGNAL_HANDLER + if(istype(AM, /obj/item)) + var/mob/living/living_pawn = pawn + var/obj/item/I = AM + if(I.throwforce < living_pawn.health && ishuman(I.thrownby)) + var/mob/living/carbon/human/H = I.thrownby + retaliate(H) + +/datum/ai_controller/monkey/proc/on_Crossed(datum/source, atom/movable/AM) + SIGNAL_HANDLER + var/mob/living/living_pawn = pawn + if(!IS_DEAD_OR_INCAP(living_pawn) && ismob(AM)) + var/mob/living/in_the_way_mob = AM + in_the_way_mob.knockOver(living_pawn) + return + +/datum/ai_controller/monkey/proc/on_startpulling(datum/source, atom/movable/puller, state, force) + SIGNAL_HANDLER + var/mob/living/living_pawn = pawn + if(!IS_DEAD_OR_INCAP(living_pawn) && prob(MONKEY_PULL_AGGRO_PROB)) // nuh uh you don't pull me! + retaliate(living_pawn.pulledby) + return TRUE + +/datum/ai_controller/monkey/proc/on_try_syringe(datum/source, mob/user) + SIGNAL_HANDLER + // chance of monkey retaliation + if(prob(MONKEY_SYRINGE_RETALIATION_PROB)) + retaliate(user) + +/datum/ai_controller/monkey/proc/on_attack_hulk(datum/source, mob/user) + SIGNAL_HANDLER + retaliate(user) + +/datum/ai_controller/monkey/proc/on_attempt_cuff(datum/source, mob/user) + SIGNAL_HANDLER + // chance of monkey retaliation + if(prob(MONKEY_CUFF_RETALIATION_PROB)) + retaliate(user) diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 8bcb68f3311..b95abe073c8 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) + . = owner.monkeyize(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/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) + . = owner.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE | TR_KEEPAI) /datum/mutation/human/glow name = "Glowy" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index dc82a04c351..9332b17d976 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -146,6 +146,8 @@ var/list/canSmoothWith = null ///Reference to atom being orbited var/atom/orbit_target + ///AI controller that controls this atom. type on init, then turned into an instance during runtime + var/datum/ai_controller/ai_controller /** * Called when an atom is created in byond (built in engine proc) @@ -236,6 +238,7 @@ set_custom_materials(custom_materials) ComponentInitialize() + InitializeAIController() return INITIALIZE_HINT_NORMAL @@ -281,6 +284,7 @@ LAZYCLEARLIST(overlays) QDEL_NULL(light) + QDEL_NULL(ai_controller) if(smoothing_flags & SMOOTH_QUEUED) SSicon_smooth.remove_from_queues(src) @@ -714,6 +718,7 @@ * throw lots of items around - singularity being a notable example) */ /atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) + SEND_SIGNAL(src, COMSIG_ATOM_HITBY, AM, skipcatch, hitpush, blocked, throwingdatum) if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...). addtimer(CALLBACK(src, .proc/hitby_react, AM), 2) @@ -1097,6 +1102,7 @@ VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EMP, "EMP Pulse") VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EXPLOSION, "Explosion") VV_DROPDOWN_OPTION(VV_HK_RADIATE, "Radiate") + VV_DROPDOWN_OPTION(VV_HK_ADD_AI, "Add AI controller") /atom/vv_do_topic(list/href_list) . = ..() @@ -1141,6 +1147,16 @@ var/strength = input(usr, "Choose the radiation strength.", "Choose the strength.") as num|null if(!isnull(strength)) AddComponent(/datum/component/radioactive, strength, src) + + + if(href_list[VV_HK_ADD_AI]) + if(!check_rights(R_VAREDIT)) + return + var/result = input(usr, "Choose the AI controller to apply to this atom WARNING: Not all AI works on all atoms.", "AI controller") as null|anything in subtypesof(/datum/ai_controller) + if(!result) + return + ai_controller = new result(src) + if(href_list[VV_HK_MODIFY_TRANSFORM] && check_rights(R_VAREDIT)) var/result = input(usr, "Choose the transformation to apply","Transform Mod") as null|anything in list("Scale","Translate","Rotate") var/matrix/M = transform @@ -1687,3 +1703,14 @@ var/atom/atom_orbiter = o output += atom_orbiter.get_all_orbiters(processed, source = FALSE) return output + + +/** +* Instantiates the AI controller of this atom. Override this if you want to assign variables first. +* +* This will work fine without manually passing arguments. + ++*/ +/atom/proc/InitializeAIController() + if(ai_controller) + ai_controller = new ai_controller(src) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 07af56b96bd..74834242e05 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -746,7 +746,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb . = "" /obj/item/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) - return + return SEND_SIGNAL(src, COMSIG_ATOM_HITBY, AM, skipcatch, hitpush, blocked, throwingdatum) /obj/item/attack_hulk(mob/living/carbon/human/user) return FALSE diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 92b79b805fb..c272d23d57a 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -46,17 +46,13 @@ if(!istype(C)) return + SEND_SIGNAL(C, COMSIG_CARBON_CUFF_ATTEMPTED, user) + if(iscarbon(user) && (HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))) to_chat(user, "Uh... how do those things work?!") apply_cuffs(user,user) return - // chance of monkey retaliation - if(ismonkey(C) && prob(MONKEY_CUFF_RETALIATION_PROB)) - var/mob/living/carbon/monkey/M - M = C - M.retaliate(user) - if(!C.handcuffed) if(C.canBeHandcuffed()) C.visible_message("[user] is trying to put [src.name] on [C]!", \ diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 32a89387079..631a4634995 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -107,7 +107,7 @@ 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) + 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) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index fe9d11b5133..ecab5b3d85d 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -457,7 +457,7 @@ if(prob(10)) switch(rand(1,4)) if(1) //blood rage - magnification.aggressive = TRUE + magnification.ai_controller.blackboard[BB_MONKEY_AGRESSIVE] = TRUE if(2) //brain death magnification.apply_damage(500,BRAIN,BODY_ZONE_HEAD,FALSE,FALSE,FALSE) if(3) //primal gene (gorilla) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index cf3ebd068ff..dc4c6ef0f14 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -142,6 +142,8 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /mob/living/carbon/attack_hand(mob/living/carbon/human/user) + if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user) & COMPONENT_CANCEL_ATTACK_CHAIN) + . = TRUE for(var/thing in diseases) var/datum/disease/D = thing if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index af8dad2dc8a..1057802416b 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -77,7 +77,21 @@ key = "screech" key_third_person = "screeches" message = "screeches." - mob_type_allowed_typecache = list(/mob/living/carbon/monkey, /mob/living/carbon/alien) + mob_type_allowed_typecache = list(/mob/living/carbon/monkey) + emote_type = EMOTE_AUDIBLE + +/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') +/datum/emote/living/carbon/screech/roar + key = "roar" + key_third_person = "roars" + message = "roars." /datum/emote/living/carbon/sign key = "sign" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 4951d044cca..7ee134321c7 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -6,6 +6,7 @@ var/t_him = p_them() var/t_has = p_have() var/t_is = p_are() + var/t_es = p_es() var/obscure_name if(isliving(user)) @@ -354,6 +355,8 @@ if(HAS_TRAIT(src, TRAIT_DUMB)) msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n" if(getorgan(/obj/item/organ/brain)) + if(ai_controller?.ai_status == AI_STATUS_ON) + msg += "[t_He] do[t_es]n't appear to be [t_him]self.\n" if(!key) msg += "[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely.\n" else if(!client) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 65b66992fde..20eac1a7e21 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1168,6 +1168,9 @@ return FALSE return ..() +/mob/living/carbon/human/monkeybrain + ai_controller = /datum/ai_controller/monkey + /mob/living/carbon/human/species var/race = null diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm deleted file mode 100644 index 535893c147f..00000000000 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ /dev/null @@ -1,426 +0,0 @@ -#define MAX_RANGE_FIND 32 - -/mob/living/carbon/monkey - var/aggressive=0 // set to 1 using VV for an angry monkey - var/frustration=0 - var/pickupTimer=0 - var/list/enemies = list() - var/mob/living/target - var/obj/item/pickupTarget - var/mode = MONKEY_IDLE - var/list/myPath = list() - var/list/blacklistItems = list() - var/maxStepsTick = 6 - var/best_force = 0 - var/martial_art = new/datum/martial_art - var/resisting = FALSE - var/pickpocketing = FALSE - var/disposing_body = FALSE - var/obj/machinery/disposal/bodyDisposal = null - var/next_battle_screech = 0 - var/battle_screech_cooldown = 50 - -/mob/living/carbon/monkey/proc/IsStandingStill() - return resisting || pickpocketing || disposing_body - -// blocks -// taken from /mob/living/carbon/human/interactive/ -/mob/living/carbon/monkey/proc/walk2derpless(target) - if(!target || IsStandingStill()) - return FALSE - - if(myPath.len <= 0) - myPath = get_path_to(src, get_turf(target), /turf/proc/Distance, MAX_RANGE_FIND + 1, 250,1) - - if(myPath) - if(myPath.len > 0) - for(var/i = 0; i < maxStepsTick; ++i) - if(!IsDeadOrIncap()) - if(myPath.len >= 1) - walk_to(src,myPath[1],0,5) - myPath -= myPath[1] - return TRUE - - // failed to path correctly so just try to head straight for a bit - walk_to(src,get_turf(target),0,5) - sleep(1) - walk_to(src,0) - - return FALSE - - -// taken from /mob/living/carbon/human/interactive/ -/mob/living/carbon/monkey/proc/IsDeadOrIncap() - return HAS_TRAIT(src, TRAIT_INCAPACITATED) || HAS_TRAIT(src, TRAIT_HANDS_BLOCKED) - - -/mob/living/carbon/monkey/proc/battle_screech() - if(next_battle_screech < world.time) - emote(pick("roar","screech")) - for(var/mob/living/carbon/monkey/M in view(7,src)) - M.next_battle_screech = world.time + battle_screech_cooldown - -/mob/living/carbon/monkey/proc/equip_item(obj/item/I) - if(I.loc == src) - return TRUE - - if(I.anchored) - blacklistItems[I] ++ - return FALSE - - // WEAPONS - if(istype(I, /obj/item)) - var/obj/item/W = I - if(W.force >= best_force) - put_in_hands(W) - best_force = W.force - return TRUE - - // CLOTHING - else if(istype(I, /obj/item/clothing)) - var/obj/item/clothing/C = I - monkeyDrop(C) - addtimer(CALLBACK(src, .proc/pickup_and_wear, C), 5) - return TRUE - - // EVERYTHING ELSE - else - if(!get_item_for_held_index(1) || !get_item_for_held_index(2)) - put_in_hands(I) - return TRUE - - blacklistItems[I] ++ - return FALSE - -/mob/living/carbon/monkey/proc/pickup_and_wear(obj/item/clothing/C) - if(!equip_to_appropriate_slot(C)) - monkeyDrop(get_item_by_slot(C)) // remove the existing item if worn - addtimer(CALLBACK(src, .proc/equip_to_appropriate_slot, C), 5) - -/mob/living/carbon/monkey/resist_restraints() - var/obj/item/I = null - if(handcuffed) - I = handcuffed - else if(legcuffed) - I = legcuffed - if(I) - changeNext_move(CLICK_CD_BREAKOUT) - last_special = world.time + CLICK_CD_BREAKOUT - cuff_resist(I) - -/mob/living/carbon/monkey/proc/should_target(mob/living/L) - if(HAS_TRAIT(src, TRAIT_PACIFISM)) - return FALSE - - if(enemies[L]) - return TRUE - - // target non-monkey mobs when aggressive, with a small probability of monkey v monkey - if(aggressive && (!istype(L, /mob/living/carbon/monkey/) || prob(MONKEY_AGGRESSIVE_MVM_PROB))) - return TRUE - - return FALSE - -/mob/living/carbon/monkey/proc/handle_combat() - if(pickupTarget) - if(IsDeadOrIncap() || blacklistItems[pickupTarget] || HAS_TRAIT(pickupTarget, TRAIT_NODROP)) - pickupTarget = null - else - pickupTimer++ - if(pickupTimer >= 4) - blacklistItems[pickupTarget] ++ - pickupTarget = null - pickupTimer = 0 - else - INVOKE_ASYNC(src, .proc/walk2derpless, pickupTarget.loc) - if(Adjacent(pickupTarget) || Adjacent(pickupTarget.loc)) // next to target - drop_all_held_items() // who cares about these items, i want that one! - if(isturf(pickupTarget.loc)) // on floor - equip_item(pickupTarget) - pickupTarget = null - pickupTimer = 0 - else if(ismob(pickupTarget.loc)) // in someones hand - var/mob/M = pickupTarget.loc - if(!pickpocketing) - pickpocketing = TRUE - M.visible_message("[src] starts trying to take [pickupTarget] from [M]!", "[src] tries to take [pickupTarget]!") - INVOKE_ASYNC(src, .proc/pickpocket, M) - return TRUE - - switch(mode) - if(MONKEY_IDLE) // idle - if(enemies.len) - var/list/around = view(src, MONKEY_ENEMY_VISION) // scan for enemies - for(var/mob/living/L in around) - if( should_target(L) ) - if(L.stat == CONSCIOUS) - battle_screech() - retaliate(L) - return TRUE - else - bodyDisposal = locate(/obj/machinery/disposal/) in around - if(bodyDisposal) - target = L - mode = MONKEY_DISPOSE - return TRUE - - // pickup any nearby objects - if(!pickupTarget) - var/obj/item/I = locate(/obj/item/) in oview(2,src) - if(I && !blacklistItems[I]) - pickupTarget = I - else - var/mob/living/carbon/human/H = locate(/mob/living/carbon/human/) in oview(2,src) - if(H) - pickupTarget = pick(H.held_items) - - if(MONKEY_HUNT) // hunting for attacker - if(health < MONKEY_FLEE_HEALTH) - mode = MONKEY_FLEE - return TRUE - - if(target != null) - INVOKE_ASYNC(src, .proc/walk2derpless, target) - - // pickup any nearby weapon - if(!pickupTarget && prob(MONKEY_WEAPON_PROB)) - var/obj/item/W = locate(/obj/item/) in oview(2,src) - if(!locate(/obj/item) in held_items) - best_force = 0 - if(W && !blacklistItems[W] && W.force > best_force) - pickupTarget = W - - // recruit other monkies - var/list/around = view(src, MONKEY_ENEMY_VISION) - for(var/mob/living/carbon/monkey/M in around) - if(M.mode == MONKEY_IDLE && prob(MONKEY_RECRUIT_PROB)) - M.battle_screech() - M.target = target - M.mode = MONKEY_HUNT - - // switch targets - for(var/mob/living/L in around) - if(L != target && should_target(L) && L.stat == CONSCIOUS && prob(MONKEY_SWITCH_TARGET_PROB)) - target = L - return TRUE - - // if can't reach target for long enough, go idle - if(frustration >= MONKEY_HUNT_FRUSTRATION_LIMIT) - back_to_idle() - return TRUE - - if(target && target.stat == CONSCIOUS) // make sure target exists - if(Adjacent(target) && isturf(target.loc) && !IsDeadOrIncap()) // if right next to perp - - // check if target has a weapon - var/obj/item/W - for(var/obj/item/I in target.held_items) - if(!(I.item_flags & ABSTRACT)) - W = I - break - - // if the target has a weapon, chance to disarm them - if(W && prob(MONKEY_ATTACK_DISARM_PROB)) - pickupTarget = W - a_intent = INTENT_DISARM - monkey_attack(target) - - else - a_intent = INTENT_HARM - monkey_attack(target) - - return TRUE - - else // not next to perp - var/turf/olddist = get_dist(src, target) - if((get_dist(src, target)) >= (olddist)) - frustration++ - else - frustration = 0 - else - back_to_idle() - - if(MONKEY_FLEE) - var/list/around = view(src, MONKEY_FLEE_VISION) - target = null - - // flee from anyone who attacked us and we didn't beat down - for(var/mob/living/L in around) - if( enemies[L] && L.stat == CONSCIOUS ) - target = L - - if(target != null) - walk_away(src, target, MONKEY_ENEMY_VISION, 5) - else - back_to_idle() - - return TRUE - - if(MONKEY_DISPOSE) - - // if can't dispose of body go back to idle - if(!target || !bodyDisposal || frustration >= MONKEY_DISPOSE_FRUSTRATION_LIMIT) - back_to_idle() - return TRUE - - if(target.pulledby != src && !istype(target.pulledby, /mob/living/carbon/monkey/)) - - INVOKE_ASYNC(src, .proc/walk2derpless, target.loc) - - if(Adjacent(target) && isturf(target.loc)) - a_intent = INTENT_GRAB - target.grabbedby(src) - else - var/turf/olddist = get_dist(src, target) - if((get_dist(src, target)) >= (olddist)) - frustration++ - else - frustration = 0 - - else if(!disposing_body) - INVOKE_ASYNC(src, .proc/walk2derpless, bodyDisposal.loc) - - if(Adjacent(bodyDisposal)) - disposing_body = TRUE - addtimer(CALLBACK(src, .proc/stuff_mob_in), 5) - - else - var/turf/olddist = get_dist(src, bodyDisposal) - if((get_dist(src, bodyDisposal)) >= (olddist)) - frustration++ - else - frustration = 0 - - return TRUE - - return IsStandingStill() - -/mob/living/carbon/monkey/proc/pickpocket(mob/M) - if(do_mob(src, M, MONKEY_ITEM_SNATCH_DELAY) && pickupTarget) - for(var/obj/item/I in M.held_items) - if(I == pickupTarget) - M.visible_message("[src] snatches [pickupTarget] from [M].", "[src] snatched [pickupTarget]!") - if(M.temporarilyRemoveItemFromInventory(pickupTarget)) - if(!QDELETED(pickupTarget) && !equip_item(pickupTarget)) - pickupTarget.forceMove(drop_location()) - else - M.visible_message("[src] tried to snatch [pickupTarget] from [M], but failed!", "[src] tried to grab [pickupTarget]!") - pickpocketing = FALSE - pickupTarget = null - pickupTimer = 0 - -/mob/living/carbon/monkey/proc/stuff_mob_in() - if(bodyDisposal && target && Adjacent(bodyDisposal)) - bodyDisposal.stuff_mob_in(target, src) - disposing_body = FALSE - back_to_idle() - -/mob/living/carbon/monkey/proc/back_to_idle() - - if(pulling) - stop_pulling() - - mode = MONKEY_IDLE - target = null - a_intent = INTENT_HELP - frustration = 0 - walk_to(src,0) - -// attack using a held weapon otherwise bite the enemy, then if we are angry there is a chance we might calm down a little -/mob/living/carbon/monkey/proc/monkey_attack(mob/living/L) - var/obj/item/Weapon = locate(/obj/item) in held_items - - // attack with weapon if we have one - if(Weapon) - Weapon.melee_attack_chain(src, L) - else - L.attack_paw(src) - - // no de-aggro - if(aggressive) - return - - // if we arn't enemies, we were likely recruited to attack this target, jobs done if we calm down so go back to idle - if(!enemies[L]) - if( target == L && prob(MONKEY_HATRED_REDUCTION_PROB) ) - back_to_idle() - return // already de-aggroed - - if(prob(MONKEY_HATRED_REDUCTION_PROB)) - enemies[L] -- - - // if we are not angry at our target, go back to idle - if(enemies[L] <= 0) - enemies.Remove(L) - if( target == L ) - back_to_idle() - -// get angry are a mob -/mob/living/carbon/monkey/proc/retaliate(mob/living/L) - mode = MONKEY_HUNT - target = L - if(L != src) - enemies[L] += MONKEY_HATRED_AMOUNT - - if(a_intent != INTENT_HARM) - battle_screech() - a_intent = INTENT_HARM - -/mob/living/carbon/monkey/attack_hand(mob/living/L) - if(L.a_intent == INTENT_HARM && prob(MONKEY_RETALIATE_HARM_PROB)) - retaliate(L) - else if(L.a_intent == INTENT_DISARM && prob(MONKEY_RETALIATE_DISARM_PROB)) - retaliate(L) - return ..() - -/mob/living/carbon/monkey/attack_paw(mob/living/L) - if(L.a_intent == INTENT_HARM && prob(MONKEY_RETALIATE_HARM_PROB)) - retaliate(L) - else if(L.a_intent == INTENT_DISARM && prob(MONKEY_RETALIATE_DISARM_PROB)) - retaliate(L) - return ..() - -/mob/living/carbon/monkey/attackby(obj/item/W, mob/user, params) - ..() - if((W.force) && (!target) && (W.damtype != STAMINA) ) - retaliate(user) - -/mob/living/carbon/monkey/bullet_act(obj/projectile/Proj) - if(istype(Proj , /obj/projectile/beam)||istype(Proj, /obj/projectile/bullet)) - if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)) - if(!Proj.nodamage && Proj.damage < src.health && isliving(Proj.firer)) - retaliate(Proj.firer) - . = ..() - -/mob/living/carbon/monkey/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) - if(istype(AM, /obj/item)) - var/obj/item/I = AM - if(I.throwforce < src.health && I.thrownby && ishuman(I.thrownby)) - var/mob/living/carbon/human/H = I.thrownby - retaliate(H) - ..() - -/mob/living/carbon/monkey/Crossed(atom/movable/AM) - if(!IsDeadOrIncap() && ismob(AM) && target) - var/mob/living/carbon/monkey/M = AM - if(!istype(M) || !M) - return - knockOver(M) - return - ..() - -/mob/living/carbon/monkey/proc/monkeyDrop(obj/item/A) - if(A) - dropItemToGround(A, TRUE) - update_icons() - -/mob/living/carbon/monkey/grabbedby(mob/living/carbon/user) - . = ..() - if(!IsDeadOrIncap() && pulledby && (mode != MONKEY_IDLE || prob(MONKEY_PULL_AGGRO_PROB))) // nuh uh you don't pull me! - if(Adjacent(pulledby)) - a_intent = INTENT_DISARM - monkey_attack(pulledby) - retaliate(pulledby) - return TRUE - -#undef MAX_RANGE_FIND diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 9da1206e2c8..456518e214c 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -2,30 +2,6 @@ /mob/living/carbon/monkey - -/mob/living/carbon/monkey/Life() - if (notransform) - return - - if(..() && !IS_IN_STASIS(src)) - - if(!client) - if(stat == CONSCIOUS) - if(on_fire || buckled || HAS_TRAIT(src, TRAIT_RESTRAINED) || (pulledby && pulledby.grab_state > GRAB_PASSIVE)) - if(!resisting && prob(MONKEY_RESIST_PROB)) - resisting = TRUE - walk_to(src,0) - resist() - else if(resisting) - resisting = FALSE - else if((mode == MONKEY_IDLE && !pickupTarget && !prob(MONKEY_SHENANIGAN_PROB)) || !handle_combat()) - if(prob(25) && (mobility_flags & MOBILITY_MOVE) && isturf(loc) && !pulledby) - step(src, pick(GLOB.cardinals)) - else if(prob(1)) - emote(pick("scratch","jump","roll","tail")) - else - walk_to(src,0) - /mob/living/carbon/monkey/handle_mutations_and_radiation() if(radiation) if(radiation > RAD_MOB_KNOCKDOWN && prob(RAD_MOB_KNOCKDOWN_PROB)) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index d539df201ac..6beb18b2edd 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -21,6 +21,8 @@ /obj/item/bodypart/l_leg/monkey, ) hud_type = /datum/hud/monkey + 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) @@ -164,10 +166,10 @@ return 1 /mob/living/carbon/monkey/angry - aggressive = TRUE /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) diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm index 65d7a57f47e..9f2ce79adc3 100644 --- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm +++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm @@ -159,7 +159,6 @@ "[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) - retaliate(user) /mob/living/carbon/monkey/acid_act(acidpwr, acid_volume, bodyzone_hit) . = TRUE diff --git a/code/modules/mob/living/carbon/monkey/punpun.dm b/code/modules/mob/living/carbon/monkey/punpun.dm index d96bed7d685..d5cd06137b5 100644 --- a/code/modules/mob/living/carbon/monkey/punpun.dm +++ b/code/modules/mob/living/carbon/monkey/punpun.dm @@ -18,7 +18,7 @@ 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") - aggressive = TRUE // Furious George is PISSED + ai_controller = /datum/ai_controller/monkey/angry //hes always mad . = ..() //These have to be after the parent new to ensure that the monkey diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 0ae6b10c7b1..ab8ddd6218e 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -1,6 +1,6 @@ #define TRANSFORMATION_DURATION 22 -/mob/living/carbon/proc/monkeyize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG | TR_KEEPSTAMINADAMAGE)) +/mob/living/carbon/proc/monkeyize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG | TR_KEEPSTAMINADAMAGE | TR_KEEPAI)) if (notransform || transformation_timer) return @@ -151,6 +151,9 @@ if(tr_flags & TR_KEEPSTAMINADAMAGE) O.adjustStaminaLoss(getStaminaLoss()) + if(tr_flags & TR_KEEPAI) + ai_controller.PossessPawn(O) + if (tr_flags & TR_DEFAULTMSG) to_chat(O, "You are now a monkey.") @@ -167,7 +170,7 @@ ////////////////////////// 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)) +/mob/living/carbon/proc/humanize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG | TR_KEEPAI)) if (notransform || transformation_timer) return @@ -324,6 +327,9 @@ changeling.purchasedpowers -= HF changeling.regain_powers() + if(tr_flags & TR_KEEPAI) + ai_controller.PossessPawn(O) + O.a_intent = INTENT_HELP if (tr_flags & TR_DEFAULTMSG) to_chat(O, "You are now a human.") diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 3cface04486..52dbebce403 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -70,10 +70,7 @@ return // chance of monkey retaliation - if(ismonkey(target) && prob(MONKEY_SYRINGE_RETALIATION_PROB)) - var/mob/living/carbon/monkey/M - M = target - M.retaliate(user) + SEND_SIGNAL(target, COMSIG_LIVING_TRY_SYRINGE, user) switch(mode) if(SYRINGE_DRAW) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 00d64358c27..40e76cf1feb 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -142,10 +142,12 @@ target.forceMove(src) if(user == target) user.visible_message("[user] climbs into [src].", "You climb into [src].") + . = TRUE else target.visible_message("[user] places [target] in [src].", "[user] places you in [src].") log_combat(user, target, "stuffed", addition="into [src]") target.LAssailant = user + . = TRUE update_icon() /obj/machinery/disposal/relaymove(mob/living/user, direction) diff --git a/sound/creatures/monkey/monkey_screech_1.ogg b/sound/creatures/monkey/monkey_screech_1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..45f8db6ac6b6e16d7c73ca55836589030732f6b2 GIT binary patch literal 17130 zcmeIZby!tj_b<9O4N@Y~u~AYwrP-9y-60^|l1guo?(Pz45fG$Pkw&^(x&#F2*k_^N z_dW0Z-QRQ0eV+5&|ITvl<%}`sSaZajpE>42+0s%SKmz```pN$$5QcLE5Gshfqw`B^ zm%Ab)sj`1aocXJ4?TZ;C(XoDI#is0R3AM9+ zsr82gR2Is`!O6wJ#la0_RJM1pe&uZLV(#F|gbI=qfIo3H4Ow*!5e+MIsDkxNXA@@+ zBCu3LRzpErgp-4dTfm5un@@m;laG^^(;lpmR8~}!R?<)x5m%B`6jxw@O3KJ8s)#G; zNlQan|7M`-l4{c8is~#-aTRG6sG_oxytFP<#o5~4#MRsdq*8Qrur>E^0oz(x+rI+; z7k>qoGiq5oxSCj+L)FYp9i7dr9W0q}?p{SrTvA?1Q&B=%O@xyKEO;)hq$d5}u!o@j z6$F!nq!t9g04X^Ypq=pHSWN)H2LNMQCfo!IS*C)-cZ?pXi86PoPL8nD#IQ~h(@4&) ze?6c)W)A@X1%NYRM!(;XwHXw!Bw>hl&K0m$;xB@thpR3NV17NJH+3ldTxjbs$V7*M zqYDZX34qDa1QDv;Jzj>=1e1V|5DMoWnxaf+tS7~}0a#o;(6idqkGEB9Mn17+i(~nB9p4iW&ciDgM1| zp@mJkbw;h#hg$poDwh5#>^~%+k)qta4UlV{UikmIEp(I3|Mxe{s^a~Ga&7h&*z?kd%rsPO%_0^YxraHnPN{1$D{Pm)4n^Hk|GEQ%s5g^olCG=(s82N7OG27LnglA>7~F(h&K{Sy2AW=<@so<|ifl7s%#fqbm{&AAvROddXBG4=T zQ*np1L-#31{^K6{MWISS2i_xGtm@n%ni`tg?)JJVZgX`(hSP3KQ$9;mQAWhU|JAVm z?KuGGG=YD7GVx_3XLsgXB?-*G3jUYpI1zToQS`>q%2&}Uj@!;3=0H$$Tt!;-DT(n}li?E1=g z8~?ZWzdh%xV@Rv5D1C^`)Uw=>@x zM25sZekS{qMtuMur6zS)Hi&S1MbC!PMI$2WqnV62Yi*Yr&3Z99IPGBo???gMZU}`U zGKD-c=y`XS>=>X(2>JftZY>0__7NV~0}A%_kvnR-iM->IU|LF!~G@=0+;rWLb z$fccI8pZ>zB>(5vf5S_a7oz+hykIq|E&Z-6Nlh}KO%{DG|WhF zeh3h<3X6xz9`e9Vbq|H#kSRP^)*%wcOGh93mv?{*>=Dl!Dq*}r%vc`0Z1kbG*8j%2 z0MrAl$OegJ?kYCF{L8Mv7dcdTP>4AaXoDm?7HIvI$E5VXe>pe+z#-@W9C*+N`}aG& zmjTf#f4rG4h%aQ~%^?8XTsIpX0OHL(sQ&wI{=b+07lsfxBLIZt=@7l5=tqh+)rG~g z+%wh%6p`PM!3ZID#7K8gwDugMhD=d0?V%m`$u_H*Z7kQtn+%DSmei~;>O3(t{_Q%qMF23rVEHavOp3D0Q)QLa62Uq0*yc7eh9QL->EB`0Tj1v ze4$4+1BhE~;`9HOqze!IBYltTe`M@z2x{X_P;~uwIw~nG#R7960>RgFDs@(n z*cP;f$7WF_U3#G5V46opu}&nq459)s5q9+Q{~{zowl;2sh*y{KNaF2yaaVdYWlB=cY*P0ePD~b3XmOL!T8@6jCV*_uH@ep z1&N7jf7)XFfym%i^bV;KfVP{c2DS?VdHluBpg^!d9)Bw2z%47G1m@q0#CVXd;GYVR z5!nAf6(A$9o4+l<#2o}rx}&{I{CSq#rNHdp=iiC~kP%q;x9E-$nEj`}Ka3L9p8U;% z(=YPf?DzNy>o+Cta$%(Bgj@=+KRyfY(D2beeV)|&5b4|}EBjIM8QDf|{lzZ>cf0!l06@Oa^#Fqq=I@UU z@WW(ckpQfF*pwa8Fc=%n`}W*d3j7RNd|==rbO1jrv=hqtj*Rh1Au_xZHP{>I8J?DD zs)w^78w__EqDx>%;0NeXz#y3X{6B&j77qi-Gjr87c3>bM0H6Yv!Rc!Tc=RYQZFTGL z9KgI!O2fn{Ab$T(wGeO)05WRu&`_%lenDYTn1s|b894xfk{8m-Yd#qLl?BvoDQEIO|)QX?)SMoBCxVJb6y}<4Nm^8u@qXp`vAg?E?VlgXJ+TwkuaOO;%$z?{SI*w0Ptm=NK(V{H}-fquE zeeU|&yGr}!Nd`YvCq`Z=u0Vnj!>h}pCpkuzl(c9cpTd_BQT8s#K;n%%d-l&#QTL8; zQndM`fYX`$$GNnIA0Dc50}gFIcDkuExf@lH4nMKO*+zupzG_!;zl9bPg%cVQOYc)V zUS+SZ-f;O*#kjp`@zgZpsWlo3p{}WF(F~Kq4T6->RA8GowWBiVXE;p_cRk+Xf8MnC zLTEf*rlSHAF0e}(nNb+G7qu|8R?B(sh-9xyf03%Ml;lRLCe!hH{COQ$|4pOOZHsTA zti#5vNR)RYVj=HIxt&A#y%%EW4EdB5%C(ka?~7>(1Z25i9PDMYO`-)!DV;Q(NPINj zU{@{@NO}ZpP|%0xIJ~tlXcT3ZZ2R?)o&CPXxc>WRI+|{pmWEM+^uF&I%NwqQYNsl0 zRyPN4$kY+SeN)^s3t|i^fCi1XTD7Y{OV6TnpF3evlVd8XIoEBLjJXyesw$J z-FQfJIahzQm$!N5hz#ht&np<4Fc6p%jkDYykJ#eUG~O4{4kBzw9z zAy!lr5Vsdc=E4oBZYR3kxU;h!i!ad3W>TZJkB4onbfg{-0Px#A%FT#q`QG8Pn+aIX zq7UU%J(um27{1W~d)bxPNlp$QMT?GG4YA>onrv1>si9>QGW`XHE~TEb$1h9tyn9=S&AS(uKt@fDDNF#so)?a{A7QCsS$4@r^gXjHLki{SlRK zWxZ>5oO)^^35I+uL!2xhgEgblSsi=`(BHx?LQDLTD=7m9yWcb*UnYK7dA*tTOxcg( zIa|w>5ShE510;=VKdeniXlUc-=bQS}IrBK9-`WW857)P8qMB`y0@ZKlx;@b5gs#3s zT;Aj%tS^h;vba+vR|_>)*#n}y_#8qfxY*ubiS;{5T3%b64fPHzU-Ddg&7(u^Ex!tA zpKBKoYrD6Rf?JFRJ0Vuk3(5r;2N6?vxBa&tM1kaJMvmMy`TH<$5T9^M=-<sx*c=c%U_qn)-B zm!fHHi5J?7HtHmvAqsfx6%>h4d-Lf!1ImgzBvZswXD#lewD%?m9}2y{Z}reeR1zu8GWeIsWYzJ)>BpMvCSo>BZ-ah5JtV5UwRk? zmmc*LXLXpkS!UKf1x$D@tY>beJ`Ey`><)`cHw4E_3%)n0{M$*pd9nRxSuF{o*fpA) zm#8Uc5UOdUo>^JGOtO8SEdMKHzyqtPm+zpz(l^9B)rh*fQ}n1x+%nt9jv)T}D{j@Y z$idGX!_`|yM6gfRwHCyOZ?4^N`R4wxTrB*ZvEcFtGWjzoxn$RRZqZ{&?*QvcvG(9>a6`{<5_odJb*x1PYQ3YUV4vymXe``E$6Zyb-pUSw~w=7`oJNzq^rqO&=>tA#AY?BwAH zWdn<@Z>{`NFiJhH_Yn2rDdtPI>x~@qDI(N81mtReG1Io5pWEF&KvMy4d^3aiy_cwA zj^&X8*Ku7sgaq22+AHf@F;MtHN%2@%lR>P&j=>=J0{P@ci2AfR-H$2ULmD(ld|T+- zYx!6Bz@dGucYg(@@%tNOq>ZpJ^m--7HQIqGQefHSvgZtVQ8*tccM0jSoI;KtWROV= zGLm#Cb87X+F7-nc_Pi6b8E0@H)(&AdQP#b&q8-EgD9uc6hzjo7=xcM@>_vrzY4>B( zSy{QIh^m2%uE-~fg%cmNH+coU+R7GV;zSjziWzP{xt@sA1xI4bWXnBz4?-Y9CQnrt zLZt+X8ZX|Y+4eO7Mrf6-VY1rW2jiT4HgNd(y*z8ltiaYmj3C$X$3Oa>jK7yn3n>0{ z&G(D8TH4D~m}|HAAW7pPmP(7yE|EWpMlhP-V4w2^eb!M{MDNJ#pm8?)rJC+hc{RIB zOT_I!_wR8b5nctJ;Y023W^=C%s;;AN`Pp3R_s`MAR(dWRh>5?o@lYPn`$LkuqdWJn zW~xr+_ADhK7nCY=3DOJd#ei@du|G2OM4dw@&1>s8``v49G>Vh5U+i97$_w<>BD^#6 zA4Yye!Z**~k8w8{*IxWc(Ev9&;BMFqMVA5*)ROcQj~q|~tnMx1EJ5C~@ z5p1owm&xr@V6#V#ElIqv5hST^{8j=- zn?0z;)k`u-=NsBefJU{dKbA)2Z<$c!PHq=XVz;M1Wh%M8Mp@yJ2r3B%(q&^s7qo{V zQLtGEP#P{yHD~5Lw03(u%OCjb#aOHDa=q#ox5ep1Y((REvCqv`P94?vp$tX$2c78S z$|jI$bb{qCOA5xC?%j@UPX<3Ykd&+AaNw{T13;9`#**98maBd3{?X*Nm+etD*^?ZT za&F6G$JDX_hoKj(78;o-q-Orv$nGqi1)bD1E^`!fTNmjcqDE}o_6d;oy7sVux{t`f zn-2S4sKU=tZSUWdC@Q6)zi>i9h`N+rfeHYkb@P>y`?eiZg5s(YK5_(AmvvR^UBVBA z0pg+?oR`?ytZ`+Fa~Vku!qlI8;tBcfS};w|xC?V?L#Dj>gX31JOaUOaqbXU>)b4aK zLyG03T*LCY7J)bW_U~>%)@>6MbtH#J>5;NCIp&KW9CZCB{K+0^F4XeMl&r`Y1B_;Y zdv=_Tn|tsh>!ODmfPvo%+1FXDSi-Yjw#rSN)IL8l4jAvj~wTjAUuJt)?lUQ zSd7sYgt2{@n5G*xQ`eVF{cT^4<20bu>CJpFmfD?c>02FDfiRO6^yo3k(I5K-z`pWO z=>VuojP0CW#(iRJ%hN9e&^{5h&m0Knmg>B6>~xCO|K#`4cR%DAyVts9T7N5pw%X!8 zK3#o|?GZ-a)b1;Uf9&AqqN1da9@6FUO3O7NLRcR~YrP7$lz8tWjyu#5%_$vi1^J}V zEb%D5W7wJJg5}UC${!$qF-0-?%l9YJq_{NhN!TNn50|lB^Yvd*$YXyFoe^_h#h#a5 zo_`U|Kh2$xOL$bMGN>cLLZ5l1e@QC&J` z7*5H)7`tCY{gt14;l8u0?AJ{V;aetV^ml7z?+0gX(;^4c_4CDp3yhgUaSC^I&|ao4 zqgtRsEiiO=Ij-BZO*V1cJ~;)^jlZ1pL5DhGu{?{=3CEO6PN$^9#dkw>3wvM4j2!nV zNO(B!3ChxKzIc3IFrxET<8Cw@O07b(?415o>CJ z%_a4)^!^A=ik)oQRT||U6n3u$rjdS{-|YRrCJ}3!h~3(it<}s%PAqZctw>~GQutM- zv8gQCzCtRBFvk_|Fb33E>f2zwMap}-lepE7759h=+xb0z6K+%ZFh%eId*=G8-%}Xd z8KK!9yWB67)gqO;tZV)HAGqST(_f}VtP7oU)``Od;{q!b+ET+Sr|5{uG0A~9D2$vi zv`J-A@*|WH7xk4pZxI4w=o=XIAY*q$ZZ?) zR(S1xX~044EB|hD3ycafey^S&`#95uLtk7UMn;?_>pFR5w*L_i*CZipZ?4%{nW?c6 zw+L^S;+wPGDN%e=!dkfWaN-kN$>BLIe=3q(wU<& z{BXVDDW`QVu{qO`3M#Ud)5se)SQ#=}JMg5F38cDCL~WncoxXl~JstC5*0)X5#P61o z8aE>;f+3vo#pJx%%(k|+-<4zR@k*|?WssnRC8f*zl0$=bVdZ0++C6CzQ@)Ijly0U868docZF*(VgqNUVqazYU&5j(7k1ToP!}sf+w#D~G<6 z)Ua*d=`4A8VU;dvSAa_u)H^j!3~w6!w&2GxI5~g+lT& z0c5xb9moE@o$rezLyrLi)MWEo6qD9_n_r%y0dVZHliemRc75k*6J}3-2Qv!Ol(zoR zdKnRr|3AT$e~!WKf+=?))s4E zrI~#pU6C!><+ZMN(_)6Vk=^mk`09#v-y^F&EJ4;Xd7U|9U^W!RdY}>Q4Ue5>+Q3PG za|(AO3N`tCq)I*gQaExX^^a}(9JDOg&CjF5x=AK^O39*G9wsH#J$Y=>l z<|4spzi%n7(~Jx4G15~JetUCo!Q#<}NOtkGZOQIW1m@y0`Jy7yJi$)p1q-`%zg*(_ z$Q!a6W0X*S;xPeNDn4^Lw~goZz3V?uJ6qLtTYFfV?v)eU-?mx8?tuf>fdIJRmp1Jj z0ZXkU#HJgri*HUZtj#ZWLyYZF0OUDHSsnG<-eYAr|WEGG!Pf_H+xK1;EFSTo5wWyq~LkwJqa+v!Fe* zQM78r-d0#b7V{hRITUT4Z{Ui6$MyXBmk)O=J zpKP?gAz6GHRs;+D1lcX4HXUpr{2clYNnVY4ADj&=`WHVS>J>-`CT>T4M=xx2^~yh& zOz9Qh6oh?V)7B|Uzk26?xlP+}Vk(cp8Txzc(HsQ{0gZ7dhG!`E{p}L>CT?PXsqoLg z)6K6x!}ecV$zXIP(x86O_<~F|A;lt%hUy<&B(eEji<+q}AW#0Ys`^>as_w9|39MZZ zkQrm6WqWva82gEV`n95x#y$CQRT10=5>BpcLAm%Xf_BnH$k9uUr#9Kg5#XCSAvdr0?sqUPmkue@p)Ru5 z1s$XVOoyO5x3eD|U7cKyShi*En>!bJ)E*JHzrffll2`d^w2BG6InaM(+re(|v~?Vq z`|XQ1F3=(hs&$cQ!ECDT!^iPwS$5JN~U+$Efg5{J7jzxW#`h$9wmqE9xJ0*>oX(vIGXkTQ2uYQ-O4H)nnv@=BxeoE$?K(Z=GD_tJW8k&lNg~JNPf^m6%!wP3koXT9Kkl+a3?j0T7 z@1ynSw{=dVTT~6Cpj>$kbnoW)n)sGY8^8N3Jx#Phuj1c*OZP{Gf1@c^{fm&==DaYEO7wk7HZYZEsg>qI?@ zFAmCGEG=;iM5@JhRz;9YAr{VlO5FW>Xv-W|b(?#)IH&;HIoYNTL2DNiX7I%c6Ssbw zIsgUij)+0s3A{jtw!e`$hMFq%iqKX|9tO(fc$7eqUzIPVpgwu>GCUhmDT1leD53-a zz6=ZX8g$KkZz`;{B1`NuT~`f$K}gE_DP5~57yN76MUUurw+N}y8QzPI+kmU!UZ?q- z8+p_0I*&lU9&+^Dl)OI0P=ml!Mc*U$h238+)UV)z@fq%63wD-qonOpCM@_f_2=1FJ z%7TDm6aUd8;UJmHg(L`4pCVl9n~l9Ww}mzR=o>P$_*6aaFYPaN&|fQhX>H+G%_q*# zq*w?ZBXvATAJ?t7{MO+r+-C9!O7#pTThCasV56}s=u#fdJdf9ZWAnU@xtVNY%|PT^ zLip@9ZNZV95Bd*swj?hBZ%X!cjCh;+t!;f%SMPy+lLrr_)Qjk*&aM~OmWpD$u5eG6 zx>1&SWf|5SZ@Eudk!fuo-~j`|)b741`qVguV=gg|ea<>gxDXlF*;QLPeGquz4UM3W z$YW|`AmDSks)P)Ho171(q2cnhrIMzXKEfN=_&GLE@%cY=CzGTbBN0xowY#7YT)ZUCsvTmr6uH(q{@l!Q#)4|@vi09U`O*GOU$J3~Hm z5a1k9f#myiA#ik`*u#D1{_=$4)4^|>&XJ874iaZ=CYCR}y(Y_^PA6sal_wKNdY=ny zelD0y=F?zRM!R#KRl?0#M+Lv1En!_9Q$sGgV$L1Cz(A`<-*vHEX5W)2K9jih7wShs z9Sag8;xNOoh|&TB6loS@dr1wAEf^1GyrMSB0EKB;snClTgTz`ATBC3MDM%GXNOF1f zU-xn%9Ka^uF4Xtln$-3y;xaGe%N#&5tc@o!C6U`-wUP^R8m21%tXi3$c3uQ|@t zfq^=hPUSSxvLFDwc)C!pHTdC|hK=XUv#iDZ45&|eS2?9yP?USjXz>OVfOn8^#B+wk zxJLzt4=~ER7a;-g1Fg;X@s%|Svw}sgR;%Ga;DRe(j0NH2Vx=bGf$nDs3E^G?F)!`R zX*F#vP2ZddZ7o(9xQ$?I<7vr9sj;)Dz9r%UlsQN+0#n`XU}!Wi^MfO)%=Btx-|g_U z!xAHMgHa}}8-sPvEZjzkV%~llz;5_%qHU>UZsSO28`CqvnNh!DH=9dE@Bc==Wg~jU zX(Qe>te{tb=FE)kQ_Fg^YBK$>QYP{jGe!R&Ogdz0#)5OJ!WLCO6sum`UUYbfrEy$8 zcye<&oH%FHp$wVH4MtcfAuYXptuFKq{_y~@kiEX+wbj=UuTaSM`SqrrVIv84=+iowWb8qC)$MY)R!B5sD z0RDDrJ>+sY*{@jC#jmiCd zcxp^-9f*JIj65g$taWcVd}n%jJ`+4kx7z#cQ&S*jwi$52`ksvBzi3L{iaDj#)<}Gdvhe=v}6K&~9Qofi6T}{Sy3F4kv5(m|M z@1qZEzkS}fE|KSVTgJ?amSEp)qVw~ny{;nSI}PNtmHk;bYi9662#TAL^9t8Tl9r2r z;IMAZm%0bP5`v6#U%7>^QmTA_vtHNn}&d;f|=j6B(4^x&S<%t zHpM7#3l1HzM{JUnXFt+~i4R-viLh_h^`d_wHlwVB0Hkr9H&{~b?Y?Nhqg)Wp?*s0E z9-I_@)IhzjNJk5JdWt1ZquI>|Jbgt9;7=n}=VA}j{&A|&iroymHdXYU@(hPe>YNX% zAiP7VX`u;p8eVDbq00|U8?Ya+Y28zke6v0<*&qn+2e@X8NyK~>3CQvCCUw6%-ot$B zu4On&ADVmxFy5h! z(?3J0vH9?-g}Y>pf&&W*`?M;Vw1J}j+7bisorLQ+pr*9XS&*h~8Y?||!LXtj=SxVl z_{dg9YwK0;5iD%|vCsK|cjk^jk?5vt+T%^9ZudzWD(=SqJR9~2Gj-PGrOTg&buB1x z63^E7ZF;|P?{k&!$2U%;zqfi%S-aVt&OhRXP*Xd2U42hzThicKU*6RNfSt!SWGuxC zJPj2GC+CfqCpYJPH?CWs?U!1?(;&N>gR+~|Hn#Gc-VQx&Ld|BuBEOr=fEqlbXylp2 zW^_x>!>_)-wnygJMXxrDPB(@eva>2KVULhTAAozJ_B5n?lI4pJnfK4N00MlDeDSVV zeeFJYOFkPXub!+`p8wj+X)9;<#$^ou8Ik2|r~_Peva?(GnItUv1NYLNQh@Lu06s=Q zj193tFb=L-=aXVnW7}L1Qs?~U?ckEz3dg2?9?dReTu;-!ZA{j;_TO(BGdsGf-pB3n z>^3R`05n7F){SD997otRA%oc~!yJ*ew@$y*)0pDzQ*OTJQLxo-yJ7lLXt+c_LB33U zvMj^~bH-LP!GK0c&R$YB7gY_l5hI2Gg@ZwSAi8qB{`h*r>_tM-h*8>fpKkEhs>`)*jgi>V*Pg1jaBS6} zPciXRSfh-O!Pw6|ko+yBm&sDo+lx}av9qAh!LdUxP~l0vjrWwA)K83y%9s9X)6Z#Z z=is!y-VV`0Gr}8@v93@2x}CZiuZRG)*9<^n^;@|8HY$6sXK9V}Lk)9ZOCp(dP|NgW z9j2)tGE^7(?`OZ;+TXtI1y>b(Kml2hp^$_BysYJ7VY{@avo}!5 zQ`7CS(N*0`*QQT%+`(?#O!!(EtOvC}UG^9VufNTjlVOo<#Y(ojrmmB3K^6jX)dl6MvU0ge5$M-jXhMSG8IWk+BzG;IG2|iB5zR*jL zL4ASE7u$|{$z10{paZ9Z)7L7@ZF8Nxw2)Alh*NVyGpX~nq=k6Zu@UttPYn_rf+EPi^BaN%EMHR; zi^DG*3x7EKS|BK!DC+Rs;gZI{@x{JjTRKubfSEg(M|g1?a1R8Zgj0O2QTvYTTWx;L zQeQjU)cHRxh(!EI|4~_L#!a20f}hmXy?!6f$z+KU^vb{C5R|vC?$W@YZ%gh@8yOLg zeh`2kmAnK0r69r)abQp+2Judmc)`m4>O|G{xkxbft>5SmQ-lF|P2v5ZCuwu&??$=s zoL(07&m;lYg?%ToJWI z<@Py>eVk5WRwGK0Kv#Mk!ZXvhsX0~3;VYcs=pEx3mE6mfK7UpFalFEZ*O@OPpl_h_ z#IC_q2)&7JO|ZMzm~i+hBeROLzp)xCG?9|gb+C_dy}ut_VRe*s)0g zU|Sj~e*cP`wkw%=y;Nc76M9&6a(MRo;%PfK@a;fp=k6n)1iA8}qs$+bx=$nPujaOU z?H{kaN9a0Jwk?c5?A{9Rl$#)LA$0i?2Dtj?Mck z5{EHfO9VYD$Rv)h*Vhl4uWw)gc6+O;q}(vLX{RDyI3H~Wx{BWtsT>%%uG%yk4K>~H zsjXO);my;SIdrR`1$c4BB0bA<`OK&N(VE=hY@q~%uO=2OITSK^rgO1^+>1G8gP$HM z=DG3@eH$oK%@WhXmX>f^k=o<^Hld5f7qF%$u9+qcbJeloeg~CC+t*@DY**8OPg~0D zt@BkUABbf?8$+XANcUtrT|FweEa9J(aC_}3ILncemEzp*p;;ya9uk~HzZC1?{DeB= zO5C}OT^jRLKO$xN=wU8{Z`-cH112pm^QkI`Y3{hzj#^Bfl!cX@^kY`s^QLkEs)``wc!< zT%v00K%~@fw7`kiS|O#S7mm{gUkR@cPr%R5Ag!`w)7mN1MT-`GXBXFY%V*cwgBPKM z6m82MEO2m}M+6`>YPUNA5qLm5`5c1yZe?3u;!A-n|9tNpbG0&Z>Kyl?XScxC{&TAb z&vuwW^4zbOVirR}Gkr&xRN!k|e|XB%8L$x;n+oJw?qh6xsXT9&?X-JNY|JANy0|RxQUwgQwuf%EPKR@Z;B0N>U-3H5b=`+Xoi1 zA35uOYufkdTDYT3NgmWCE|i|+XT;69A636_(_}bJrXLgdsc0w7WjkIirN>ZG`bL#Z zS~bYI5(A8Ly)gFzX#JaXO7-@8*Ed)+ufRXwQ)!xO0uDKtjn90DQF!YFxR^04w)bOD zhpbapSgSt|xEHMROP{E(U!cHnRN!2+Jmz`NLb3;rniy!ePgd54RSk$v`G4-F?Qb8M z(UAc7_&s7Rozw>lM^1yQN2{g@6;0>oEuE*ks~z&g z8-#3V#s})^yVBP-r^Ku=XE}A7M%3(^S4X#EEyn;MPwbfrcG4LDI}lz{hm#rOrMdX> z^GbewO>Lu0wCun)tYS1si{fa!wul?xeK?f`z_49V;CxSkVTc0w=^T=ZI7E~Ys^ZP% zX|rgwm4F9zWf$cGpq*hxM%2yMzhk5ZF?}cJ*K{c1?`xODH7Utz`jUB{&M*)UU_NT1s|gQ?Pv!>$Vr!n=qf4&O!*DypDn7gyE1d{A?}~f> zG>pSLGu1`^*fm4OxqVGR_h;e5dvpmVZj}%4QVU)R@R&ToMWKx&urk=9(FqP~&qd?> z`rVDxJLH!DYlsLf$D4@((KO64Y>|shqED6TloKq^&;@CCN{Ek2uDf&>A<|ckFad?- zRBE5dU@V%HJmKBv)&&X2lnErl?R4cV! z#Nu7g*Iabd)%ke&F1R3$ac}r?mON$Te;vKN1yW3Qn57L7bL z+;K{X8(KT6qd0P$xRKvnYRSMOY|gL&4@QuI!9p8kS_C(Og}X_pX-OSXcHid->2%cN zdM&6Z?a^2rbEY=dLdv%dWh3L1mr+qdU&-rRQ&q2z}D2&iOI6C zU@M(U57sCHBn>HOJIuV5@r_#}Bwz*d-4=@6jxIzx7NwQ> zYh5o7u4w~d%@u%d@z}!8$ zF5{76=N9Qj+^;RmC@|h?Y{}@PbcXCS*CzCxJ)7vX(M{Rv`cotnCP}_9n#xR3TmhF_;9=L;K#h=&ktNV9+x3s z2d>j+*yf%+!xaXA{fdiqzkoMK2aVUH>3O56Ce@tu5aZI#tDxiO*R$RlSgoVTmK7*a z%Gd$)$EG)L1}j)^Ejrk*A+Xu_e0HEd^7_~q*_i$LfZyc?(cRw=FDB0`*gK-pzfBLg&-J+&T*F$+jM9+T1EP1W{H%NzCFoiNK1fnM$ zq(&-EH!TU3i*i<#r4&J#51<>cm+yBMa{F1qQhE6w)gz?a>j z!D&b8a8QEW#~M`-Tgh7#|EOBwDg4`2dyq?HpqR1k_?AXW&)u^S@`$)V>%i8Rn3#8k zR(0TaVmpb|*kU<*|BouWl$Hv-lr!E*IS9tP`>;|SO#GoZS6^87khjhSV(7Zy67tT(|iTy5mTk9lr)s5!qn6L*;OnG&mWyA-xcMjVH~*)NjvRbW&9@7$o^tiWusOm_0x`{w|j~A0kf8d^y?qH z(Fa>76J}o7>E*qdW35)>4aJ>QDZhA!=EGKc%X``KjwWnt&zuhm=Jk9Q44Z@U6UkL{ zNk62bc^2C4DolBvGNcj}I%((Pt9n%g z24%YeJfQw|>do2H=4=s)oUk2fLi|;-Mx9o-08tN;!A;;dwmxW}z-7~r=vBrV=@-}U zy?DQjX9mu9{E-&Xi?`4GZ@6=+{ieSlnAA;hfni+1C#?CS*KUuINPv2FWH`{ymGc%M za&tf;itgliyF}-gPGrTjGY_*b(DwxH;B;!BxoIF zM8?eboo^j|=>v91DzleJ?1lT!&)<2pYm7C+72{C=@3TfHQ-ROkV!UD%hzsw`98b-a zzH?KxsphO|vNQcnnSDz4518s+MT5(q4ZWw`At=HAvQ0frjqXvkms^YvHS@ z4KtGpo??-!j4?b!BiqrBZ}h6|=EB^z&@#qV z{rao+Ay#U(h2L1jre(NV7*lwEcY2)~k+~hy#qPQX_3|0q?RYf>Fa8#BOATNx3m7Z- z;I;cr#m-U5DmeN2(43b19-e#tuHP~>3)x7a`jvJYa{DUT09W#_n-lo@b=`#@k+brF zkgeF5LYrldvN$9+Hp382F_NB>>4F?1mvKo0_=*zA12ct=P-9d)@73Q^y{!-~pt==; zfcQq3sa?;11Sy-Bc82XokeedAy&mifWmj<51R{36yiK>T(oUGlK_O*Vzp~|3*J*(6 z0Xc63M%1vCCKycu-Z@#>uwNQpcTt|q`J4=TI`Ec$bKQ%XZ`_Xc_ViBYn(O$!urZQ9 zGDRYr7*xu_S{kYqQafGe;|V9!bjlt?dTe9Qc1E>7l!cnCse9Z!gxJeL3~deu^!0_W zSQ##E`V>Cjooac&RPD&b7X9UHid2)!QeF4v;;N?XAhC&od~H{$XZ!cDXu{Z4Y~AhB z+8z>#z^6jCGrQMQQ*zy2lbvf>lt#Sim)>G+uY1$``exe>uO_}Z^Zw@f-B|XeG|zoS z9h>jCHN3e(==j##<UjS5SKc8F1$C8QQsLqjJY;&F4x*yH}r#x&kp&N76hoi!t6yM|fZ z(vbL>IS{&teqWEc9{`9j%qkC0ZmyfF0N|CfKHXa{Ke4j{!^Lk(ovuv35fZw$jQE~; OyFSmi&n)#pLH`dR#;~#g literal 0 HcmV?d00001 diff --git a/sound/creatures/monkey/monkey_screech_2.ogg b/sound/creatures/monkey/monkey_screech_2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5a5015916d4dc4b6b165aa9d00db693c864c3b3f GIT binary patch literal 17470 zcmeIZby!u;_b9v%-5`x3B}zz#fD(rkkPeYX>5^^^9F>;t?vO6&R3xMk5s(szLwCnH zccY*0_kQ2s`+M$vpXWaBe|Mfa`%J8vwP(f5nl-akEiE+xG~k~waOZCVWjI3$p@X

&ks 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 literal 0 HcmV?d00001 diff --git a/sound/creatures/monkey/monkey_screech_5.ogg b/sound/creatures/monkey/monkey_screech_5.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fd8ccef0f69fb6e1cc1d6ad99ca3f3132877747d GIT binary patch literal 22307 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 bm9U_;tve09zgL_92Eg*syTQgTvS8sf< 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%0DxQF@AsRM5?A;k0Fwpxk9kQr2b)x27%^-dmicff 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 DQUbub literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index e3d86d82255..a484300f424 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -26,6 +26,7 @@ #include "code\__DEFINES\acid.dm" #include "code\__DEFINES\actionspeed_modification.dm" #include "code\__DEFINES\admin.dm" +#include "code\__DEFINES\ai.dm" #include "code\__DEFINES\antagonists.dm" #include "code\__DEFINES\atmospherics.dm" #include "code\__DEFINES\atom_hud.dm" @@ -331,6 +332,7 @@ #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" #include "code\controllers\subsystem\processing\acid.dm" +#include "code\controllers\subsystem\processing\ai_controllers.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" #include "code\controllers\subsystem\processing\fields.dm" #include "code\controllers\subsystem\processing\fluids.dm" @@ -393,6 +395,11 @@ #include "code\datums\achievements\misc_achievements.dm" #include "code\datums\achievements\skill_achievements.dm" #include "code\datums\actions\beam_rifle.dm" +#include "code\datums\ai\_ai_behavior.dm" +#include "code\datums\ai\_ai_controller.dm" +#include "code\datums\ai\generic_actions.dm" +#include "code\datums\ai\monkey\monkey_controller.dm" +#include "code\datums\ai\monkey\monkey_behaviors.dm" #include "code\datums\atmosphere\_atmosphere.dm" #include "code\datums\atmosphere\planetary.dm" #include "code\datums\brain_damage\brain_trauma.dm" @@ -2372,7 +2379,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\combat.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"