Merge pull request #29141 from Skyrat-SS13/upstream-merge-85380

[MIRROR] Carps, frogs and young lobstrosities now fear the fishing hat!
This commit is contained in:
projectkepler-RU
2024-08-01 04:58:38 +07:00
committed by GitHub
20 changed files with 161 additions and 34 deletions
+2
View File
@@ -24,6 +24,8 @@
///the list of interactions we can have with the owner
#define BB_INTERACTIONS_WITH_OWNER "BB_interactions_with_owner"
///The trait checked by ai_behavior/find_potential_targets/prioritize_trait to return a target with a trait over the rest.
#define BB_TARGET_PRIORITY_TRAIT "target_priority_trait"
/// Store a single or list of emotes at this key
#define BB_EMOTE_KEY "BB_emotes"
+4
View File
@@ -70,8 +70,12 @@
#define BB_LOBSTROSITY_TARGET_LIMB "BB_lobstrosity_target_limb"
/// We increment this counter every time we try to move while dragging an arm and if we go too long we'll give up trying to get out of line of sight and just eat the fingers
#define BB_LOBSTROSITY_FINGER_LUST "BB_lobstrosity_finger_lust"
/// Does this carp still target lying mobs even if they aren't stunned, and flee from sary fishermen?
#define BB_LOBSTROSITY_NAIVE_HUNTER "BB_lobstrosity_naive_hunter"
/// Does this carp run from scary fishermen?
#define BB_CARPS_FEAR_FISHERMAN "BB_carp_fear_fisherman"
// eyeball keys
///the death glare ability
#define BB_GLARE_ABILITY "BB_glare_ability"
-2
View File
@@ -70,5 +70,3 @@ GLOBAL_VAR_INIT(gutlunch_count, 0)
#define BB_RAPTOR_TROUGH_TARGET "raptor_trough_target"
#define MAX_RAPTOR_POP 64
+2
View File
@@ -225,6 +225,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_REVEAL_FISH "reveal_fish"
///This trait gets you a list of fishes that can be caught when examining a fishing spot.
#define TRAIT_EXAMINE_FISHING_SPOT "examine_fishing_spot"
///lobstrosities and carps will prioritize/flee from those that have this trait (given by the skill-locked hat)
#define TRAIT_SCARY_FISHERMAN "scary_fisherman"
///Trait given to turfs or objects that can be fished from
#define TRAIT_FISHING_SPOT "fishing_spot"
///Trait given to mobs that can fish without a rod
+1
View File
@@ -61,6 +61,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_ODD_CUSTOMIZABLE_FOOD_INGREDIENT" = TRAIT_ODD_CUSTOMIZABLE_FOOD_INGREDIENT,
"TRAIT_ON_HIT_EFFECT" = TRAIT_ON_HIT_EFFECT,
"TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN,
"TRAIT_SCARY_FISHERMAN" = TRAIT_SCARY_FISHERMAN,
"TRAIT_SECLUDED_LOCATION" = TRAIT_SECLUDED_LOCATION,
"TRAIT_SNOWSTORM_IMMUNE" = TRAIT_SNOWSTORM_IMMUNE,
"TRAIT_TELEKINESIS_CONTROLLED" = TRAIT_TELEKINESIS_CONTROLLED,
+1
View File
@@ -18,6 +18,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_MOVE_VENTCRAWLING" = TRAIT_MOVE_VENTCRAWLING,
"TRAIT_MOVE_UPSIDE_DOWN" = TRAIT_MOVE_UPSIDE_DOWN,
"TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN,
"TRAIT_SCARY_FISHERMAN" = TRAIT_SCARY_FISHERMAN,
"TRAIT_SNOWSTORM_IMMUNE" = TRAIT_SNOWSTORM_IMMUNE,
"TRAIT_VOIDSTORM_IMMUNE" = TRAIT_VOIDSTORM_IMMUNE,
"TRAIT_WEATHER_IMMUNE" = TRAIT_WEATHER_IMMUNE,
@@ -152,3 +152,15 @@ GLOBAL_LIST_INIT(target_interested_atoms, typecacheof(list(/mob, /obj/machinery/
/// Returns the desired final target from the filtered list of targets
/datum/ai_behavior/find_potential_targets/proc/pick_final_target(datum/ai_controller/controller, list/filtered_targets)
return pick(filtered_targets)
/// Targets with the trait specified by the BB_TARGET_PRIORITY_TRAIT blackboard key will be prioritized over the rest.
/datum/ai_behavior/find_potential_targets/prioritize_trait
/datum/ai_behavior/find_potential_targets/prioritize_trait/pick_final_target(datum/ai_controller/controller, list/filtered_targets)
var/priority_targets = list()
for(var/atom/target as anything in filtered_targets)
if(HAS_TRAIT(target, controller.blackboard[BB_TARGET_PRIORITY_TRAIT]))
priority_targets += target
if(length(priority_targets))
return pick(priority_targets)
return ..()
@@ -0,0 +1,6 @@
/// Find something with a specific trait to run from
/datum/ai_planning_subtree/find_target_prioritize_traits
/datum/ai_planning_subtree/find_target_prioritize_traits/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
. = ..()
controller.queue_behavior(/datum/ai_behavior/find_potential_targets/prioritize_trait, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION, BB_TARGET_PRIORITY_TRAIT)
@@ -12,6 +12,8 @@
var/atom/flee_from = controller.blackboard[target_key]
if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING] || QDELETED(flee_from))
return
if(!should_flee(controller, flee_from))
return
var/flee_distance = controller.blackboard[BB_BASIC_MOB_FLEE_DISTANCE] || DEFAULT_BASIC_FLEE_DISTANCE
if (get_dist(controller.pawn, flee_from) >= flee_distance)
return
@@ -19,8 +21,21 @@
controller.queue_behavior(flee_behaviour, target_key, hiding_place_key)
return SUBTREE_RETURN_FINISH_PLANNING //we gotta get out of here.
/datum/ai_planning_subtree/flee_target/proc/should_flee(datum/ai_controller/controller, atom/flee_from)
if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING] || QDELETED(flee_from))
return FALSE
return TRUE
/// Try to escape from your current target, without performing any other actions.
/// Reads from some fleeing-specific targeting keys rather than the current mob target.
/datum/ai_planning_subtree/flee_target/from_flee_key
target_key = BB_BASIC_MOB_FLEE_TARGET
hiding_place_key = BB_BASIC_MOB_FLEE_TARGET_HIDING_LOCATION
/// A subtype that forces the mob to flee from targets with the scary fisherman trait anyway.
/datum/ai_planning_subtree/flee_target/from_fisherman
/datum/ai_planning_subtree/flee_target/from_fisherman/should_flee(datum/ai_controller/controller, atom/flee_from)
if (!QDELETED(flee_from) && HAS_TRAIT(flee_from, TRAIT_SCARY_FISHERMAN))
return TRUE
return ..()
@@ -22,3 +22,12 @@
return
controller.queue_behavior(ranged_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
return SUBTREE_RETURN_FINISH_PLANNING //we are going into battle...no distractions.
/datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman
/datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
var/atom/movable/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]
if(QDELETED(target))
return ..()
if(!HAS_TRAIT(target, TRAIT_SCARY_FISHERMAN))
return ..()
@@ -12,4 +12,3 @@
if(watcher.stat != DEAD)
return
return ..()
+1
View File
@@ -169,6 +169,7 @@
clothing_flags = SNUG_FIT
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE
dog_fashion = null
clothing_traits = list(TRAIT_SCARY_FISHERMAN) //Fish, carps, lobstrosities and frogs fear me.
/obj/item/clothing/head/soft/fishing_hat/Initialize(mapload)
. = ..()
@@ -14,6 +14,7 @@
BB_LOBSTROSITY_FINGER_LUST = 0,
BB_LOBSTROSITY_NAIVE_HUNTER = FALSE,
BB_BASIC_MOB_FLEE_DISTANCE = 8,
BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN,
BB_OWNER_SELF_HARM_RESPONSES = SHRIMP_HARM_RESPONSES,
)
ai_traits = PAUSE_DURING_DO_AFTER
@@ -24,7 +25,7 @@
/datum/ai_planning_subtree/random_speech/insect,
/datum/ai_planning_subtree/hoard_fingers,
/datum/ai_planning_subtree/pet_planning,
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/find_target_prioritize_traits,
/datum/ai_planning_subtree/targeted_mob_ability/lobster,
/datum/ai_planning_subtree/flee_target/lobster,
/datum/ai_planning_subtree/attack_obstacle_in_path,
@@ -43,13 +44,14 @@
BB_LOBSTROSITY_FINGER_LUST = 0,
BB_LOBSTROSITY_NAIVE_HUNTER = TRUE,
BB_BASIC_MOB_FLEE_DISTANCE = 4,
BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN,
BB_OWNER_SELF_HARM_RESPONSES = SHRIMP_HARM_RESPONSES,
)
planning_subtrees = list(
/datum/ai_planning_subtree/random_speech/insect,
/datum/ai_planning_subtree/hoard_fingers,
/datum/ai_planning_subtree/pet_planning,
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/find_target_prioritize_traits,
/datum/ai_planning_subtree/targeted_mob_ability/lobster,
/datum/ai_planning_subtree/flee_target/lobster,
/datum/ai_planning_subtree/attack_obstacle_in_path,
@@ -100,14 +102,17 @@
melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/lobster
/datum/ai_planning_subtree/basic_melee_attack_subtree/lobster/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
if(!isliving(controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]))
var/atom/movable/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]
if(!isliving(target))
return ..()
if (!controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
return
if (!isnull(controller.blackboard[BB_LOBSTROSITY_TARGET_LIMB]))
return
if(controller.blackboard[BB_LOBSTROSITY_NAIVE_HUNTER] && HAS_TRAIT(target, TRAIT_SCARY_FISHERMAN))
return //juvenile lobstrosities fear me.
var/mob/living/living_pawn = controller.pawn
if (DOING_INTERACTION_WITH_TARGET(living_pawn, controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]))
if (DOING_INTERACTION_WITH_TARGET(living_pawn, target))
return
return ..()
@@ -118,9 +123,14 @@
if (isnull(target) || !istype(target))
return ..()
var/is_vulnerable = FALSE
if(controller.blackboard[BB_LOBSTROSITY_NAIVE_HUNTER] && target.body_position == LYING_DOWN)
is_vulnerable = TRUE
else
if(controller.blackboard[BB_LOBSTROSITY_NAIVE_HUNTER])
if(HAS_TRAIT(target, TRAIT_SCARY_FISHERMAN))
//Trigger lobstrosity PTSD. Don't clear the target so we can run away.
controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, FALSE)
return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
if(target.body_position == LYING_DOWN)
is_vulnerable = TRUE
if(!is_vulnerable)
for (var/trait in controller.blackboard[BB_LOBSTROSITY_EXPLOIT_TRAITS])
if (!HAS_TRAIT(target, trait))
continue
@@ -137,9 +147,12 @@
flee_behaviour = /datum/ai_behavior/run_away_from_target/lobster
/datum/ai_planning_subtree/flee_target/lobster/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
var/atom/movable/target = controller.blackboard[target_key]
if(!QDELETED(target) && controller.blackboard[BB_LOBSTROSITY_NAIVE_HUNTER] && HAS_TRAIT(target, TRAIT_SCARY_FISHERMAN))
return ..()
var/datum/action/cooldown/using_action = controller.blackboard[BB_TARGETED_ACTION]
if (using_action?.IsAvailable())
return
return FALSE
return ..()
/datum/ai_behavior/run_away_from_target/lobster
@@ -147,19 +160,23 @@
/datum/ai_behavior/run_away_from_target/lobster/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key)
var/atom/target = controller.blackboard[target_key]
if(isnull(target))
if(QDELETED(target))
return ..()
if(isliving(target))
var/mob/living/living_target = target
if(controller.blackboard[BB_LOBSTROSITY_NAIVE_HUNTER] && living_target.body_position == LYING_DOWN)
var/is_naive = controller.blackboard[BB_LOBSTROSITY_NAIVE_HUNTER]
var/is_scary = HAS_TRAIT(target, TRAIT_SCARY_FISHERMAN)
if(!is_naive || !is_scary) //the lobstrosity isn't naive/young and the target isn't a scary fisherman.
if(isliving(target))
var/mob/living/living_target = target
if(is_naive && living_target.body_position == LYING_DOWN)
controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE)
return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
for (var/trait in controller.blackboard[BB_LOBSTROSITY_EXPLOIT_TRAITS])
if (!HAS_TRAIT(target, trait))
continue
controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE)
return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
for (var/trait in controller.blackboard[BB_LOBSTROSITY_EXPLOIT_TRAITS])
if (!HAS_TRAIT(target, trait))
continue
controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE)
return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
var/mob/living/us = controller.pawn
if (us.pulling == target)
@@ -174,7 +191,9 @@
/datum/ai_planning_subtree/targeted_mob_ability/lobster/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
var/atom/target = controller.blackboard[target_key]
if(QDELETED(target) || in_range(controller.pawn, target))
return FALSE
return
if(controller.blackboard[BB_LOBSTROSITY_NAIVE_HUNTER] && HAS_TRAIT(target, TRAIT_SCARY_FISHERMAN))
return
return ..()
@@ -55,6 +55,12 @@
/// This subtype only exists because if you queue multiple of the same action with different arguments it deletes their stored arguments
/datum/ai_behavior/find_potential_targets/nearest/magicarp
/datum/ai_behavior/find_potential_targets/nearest/magicarp/pick_final_target(datum/ai_controller/controller, list/enemies_list)
for(var/atom/atom as anything in enemies_list)
if(HAS_TRAIT(atom, TRAIT_SCARY_FISHERMAN))
enemies_list -= atom
return ..()
/// Then use it on that target
/datum/ai_planning_subtree/targeted_mob_ability/magicarp
ability_key = BB_MAGICARP_SPELL
@@ -31,6 +31,9 @@
finish_planning = TRUE
/datum/ai_planning_subtree/make_carp_rift/panic_teleport/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
var/atom/movable/fleeing_from = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]
if(!QDELETED(fleeing_from) && controller.blackboard[BB_CARPS_FEAR_FISHERMAN] && HAS_TRAIT(fleeing_from, TRAIT_SCARY_FISHERMAN))
return ..()
if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
return
return ..()
@@ -42,6 +45,14 @@
/datum/ai_planning_subtree/make_carp_rift/aggressive_teleport
rift_behaviour = /datum/ai_behavior/make_carp_rift/towards/aggressive
/datum/ai_planning_subtree/make_carp_rift/aggressive_teleport/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
var/atom/movable/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]
if(QDELETED(target) || !controller.blackboard[BB_CARPS_FEAR_FISHERMAN] || !HAS_TRAIT(target, TRAIT_SCARY_FISHERMAN))
return ..()
if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
return
return ..()
/**
* # Make carp rift
* Make a carp rift somewhere
@@ -174,7 +185,7 @@
/datum/ai_planning_subtree/shortcut_to_target_through_carp_rift/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
var/mob/living/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]
if (QDELETED(target))
if (QDELETED(target) || (controller.blackboard[BB_CARPS_FEAR_FISHERMAN] && HAS_TRAIT(target, TRAIT_SCARY_FISHERMAN)))
return
var/distance_to_target = get_dist(controller.pawn, target)
@@ -12,24 +12,48 @@
BB_BASIC_MOB_STOP_FLEEING = TRUE,
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items,
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN,
BB_CARPS_FEAR_FISHERMAN = TRUE,
)
ai_movement = /datum/ai_movement/basic_avoidance
idle_behavior = /datum/idle_behavior/idle_random_walk
planning_subtrees = list(
/datum/ai_planning_subtree/pet_planning,
/datum/ai_planning_subtree/simple_find_nearest_target_to_flee,
/datum/ai_planning_subtree/find_target_prioritize_traits,
/datum/ai_planning_subtree/make_carp_rift/panic_teleport,
/datum/ai_planning_subtree/flee_target/from_fisherman,
/datum/ai_planning_subtree/find_food,
/datum/ai_planning_subtree/attack_obstacle_in_path/carp,
/datum/ai_planning_subtree/shortcut_to_target_through_carp_rift,
/datum/ai_planning_subtree/make_carp_rift/aggressive_teleport,
/datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman,
/datum/ai_planning_subtree/carp_migration,
)
///Megacarps. The only difference is that they don't flee from scary fishermen and prioritize them.
/datum/ai_controller/basic_controller/carp/mega
blackboard = list(
BB_BASIC_MOB_STOP_FLEEING = TRUE,
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items,
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN,
BB_CARPS_FEAR_FISHERMAN = FALSE,
)
planning_subtrees = list(
/datum/ai_planning_subtree/pet_planning,
/datum/ai_planning_subtree/simple_find_nearest_target_to_flee,
/datum/ai_planning_subtree/make_carp_rift/panic_teleport,
/datum/ai_planning_subtree/flee_target,
/datum/ai_planning_subtree/find_food,
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/find_target_prioritize_traits,
/datum/ai_planning_subtree/attack_obstacle_in_path/carp,
/datum/ai_planning_subtree/shortcut_to_target_through_carp_rift,
/datum/ai_planning_subtree/make_carp_rift/aggressive_teleport,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
/datum/ai_planning_subtree/carp_migration,
)
/**
* Carp which bites back, but doesn't look for targets.
* 'Not hunting targets' includes food (and can rings), because they have been well trained.
@@ -39,18 +63,20 @@
BB_BASIC_MOB_STOP_FLEEING = TRUE,
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN,
BB_CARPS_FEAR_FISHERMAN = TRUE,
)
ai_traits = STOP_MOVING_WHEN_PULLED
planning_subtrees = list(
/datum/ai_planning_subtree/pet_planning,
/datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee,
/datum/ai_planning_subtree/make_carp_rift/panic_teleport,
/datum/ai_planning_subtree/flee_target,
/datum/ai_planning_subtree/flee_target/from_fisherman,
/datum/ai_planning_subtree/target_retaliate,
/datum/ai_planning_subtree/attack_obstacle_in_path/carp,
/datum/ai_planning_subtree/shortcut_to_target_through_carp_rift,
/datum/ai_planning_subtree/make_carp_rift/aggressive_teleport,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
/datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman,
)
/**
@@ -61,12 +87,12 @@
planning_subtrees = list(
/datum/ai_planning_subtree/pet_planning,
/datum/ai_planning_subtree/simple_find_nearest_target_to_flee,
/datum/ai_planning_subtree/find_target_prioritize_traits,
/datum/ai_planning_subtree/make_carp_rift/panic_teleport,
/datum/ai_planning_subtree/flee_target,
/datum/ai_planning_subtree/flee_target/from_fisherman,
/datum/ai_planning_subtree/find_food,
/datum/ai_planning_subtree/find_nearest_magicarp_spell_target,
/datum/ai_planning_subtree/targeted_mob_ability/magicarp,
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/attack_obstacle_in_path/carp,
/datum/ai_planning_subtree/shortcut_to_target_through_carp_rift,
/datum/ai_planning_subtree/make_carp_rift/aggressive_teleport,
@@ -83,17 +109,19 @@
BB_BASIC_MOB_STOP_FLEEING = TRUE,
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN,
BB_CARPS_FEAR_FISHERMAN = TRUE,
)
ai_traits = STOP_MOVING_WHEN_PULLED
planning_subtrees = list(
/datum/ai_planning_subtree/pet_planning,
/datum/ai_planning_subtree/simple_find_nearest_target_to_flee,
/datum/ai_planning_subtree/make_carp_rift/panic_teleport,
/datum/ai_planning_subtree/flee_target,
/datum/ai_planning_subtree/flee_target/from_fisherman,
/datum/ai_planning_subtree/find_food,
/datum/ai_planning_subtree/attack_obstacle_in_path/carp,
/datum/ai_planning_subtree/shortcut_to_target_through_carp_rift,
/datum/ai_planning_subtree/make_carp_rift/aggressive_teleport,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
/datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman,
/datum/ai_planning_subtree/carp_migration,
)
@@ -24,6 +24,7 @@
ridable_data = /datum/component/riding/creature/megacarp
greyscale_config = /datum/greyscale_config/carp_mega
butcher_results = list(/obj/item/food/fishmeat/carp = 2, /obj/item/stack/sheet/animalhide/carp = 3)
ai_controller = /datum/ai_controller/basic_controller/carp/mega
/mob/living/basic/carp/mega/Initialize(mapload)
. = ..()
+12 -3
View File
@@ -109,6 +109,7 @@
/datum/ai_controller/basic_controller/frog
blackboard = list(
BB_BASIC_MOB_STOP_FLEEING = TRUE, //We only flee from scary fishermen.
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
BB_OWNER_SELF_HARM_RESPONSES = list(
@@ -122,7 +123,8 @@
planning_subtrees = list(
/datum/ai_planning_subtree/target_retaliate,
/datum/ai_planning_subtree/random_speech/frog,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
/datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman,
/datum/ai_planning_subtree/flee_target/from_fisherman,
/datum/ai_planning_subtree/go_for_swim,
)
@@ -131,11 +133,18 @@
/datum/ai_planning_subtree/pet_planning,
/datum/ai_planning_subtree/random_speech/frog,
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
/datum/ai_planning_subtree/basic_melee_attack_subtree/no_fisherman,
/datum/ai_planning_subtree/flee_target/from_fisherman,
)
/datum/ai_controller/basic_controller/frog/suicide_frog
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
BB_TARGET_PRIORITY_TRAIT = TRAIT_SCARY_FISHERMAN, //No fear, only hatred. It has nothing to lose
)
planning_subtrees = list(
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/find_target_prioritize_traits,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
)
+3 -1
View File
@@ -711,6 +711,7 @@
attached_hat = hat
var/obj/item/clothing/helmet = mod.get_part_from_slot(ITEM_SLOT_HEAD)
if(istype(helmet))
helmet.attach_clothing_traits(attached_hat.clothing_traits)
former_flags = helmet.flags_cover
former_visor_flags = helmet.visor_flags_cover
helmet.flags_cover |= attached_hat.flags_cover
@@ -733,11 +734,12 @@
balloon_alert(user, "hat removed")
else
balloon_alert_to_viewers("the hat falls to the floor!")
attached_hat = null
var/obj/item/clothing/helmet = mod.get_part_from_slot(ITEM_SLOT_HEAD)
if(istype(helmet))
helmet.detach_clothing_traits(attached_hat)
helmet.flags_cover = former_flags
helmet.visor_flags_cover = former_visor_flags
attached_hat = null
mod.wearer.update_clothing(mod.slot_flags)
/obj/item/mod/module/hat_stabilizer/syndicate
+1
View File
@@ -1007,6 +1007,7 @@
#include "code\datums\ai\basic_mobs\basic_subtrees\find_food.dm"
#include "code\datums\ai\basic_mobs\basic_subtrees\find_paper_and_write.dm"
#include "code\datums\ai\basic_mobs\basic_subtrees\find_parent.dm"
#include "code\datums\ai\basic_mobs\basic_subtrees\find_targets_prioritize_traits.dm"
#include "code\datums\ai\basic_mobs\basic_subtrees\flee_target.dm"
#include "code\datums\ai\basic_mobs\basic_subtrees\go_for_swim.dm"
#include "code\datums\ai\basic_mobs\basic_subtrees\maintain_distance.dm"