mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-24 21:48:39 +01:00
[MIRROR] Fixes fleeing behaviour [MDB IGNORE] (#24223)
* Fixes fleeing behaviour (#78821) ## About The Pull Request This PR does three things: - Fixes fleeing, I broke it in a recent PR so mobs would walk to a location then sort of stand there doing nothing. This is due to using `>=` instead of `>`. - Makes lobstrosities stop running and charge at you more responsively (when they detect they can charge). - Inverts the `BB_BASIC_MOB_FLEEING` blackboard key to `BB_BASIC_MOB_STOP_FLEEING` so that the default behaviour is "to perform the behaviour that you put on the mob" instead of to not do that. ## Why It's Good For The Game Makes commonly used behaviour work properly. Removes footgun we hand to ai developers. ## Changelog 🆑 fix: Cowardly mobs will consistently run away from you instead of getting tired and just sort of standing there after an initial burst of movement. /🆑 * Fixes fleeing behaviour --------- Co-authored-by: Jacquerel <hnevard@gmail.com>
This commit is contained in:
@@ -80,8 +80,8 @@
|
||||
///List of mobs who have damaged us
|
||||
#define BB_BASIC_MOB_RETALIATE_LIST "BB_basic_mob_shitlist"
|
||||
|
||||
/// Flag to set on or off if you want your mob to prioritise running away
|
||||
#define BB_BASIC_MOB_FLEEING "BB_basic_fleeing"
|
||||
/// Flag to set on if you want your mob to STOP running away
|
||||
#define BB_BASIC_MOB_STOP_FLEEING "BB_basic_stop_fleeing"
|
||||
|
||||
///list of foods this mob likes
|
||||
#define BB_BASIC_FOODS "BB_basic_foods"
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
|
||||
/datum/ai_behavior/run_away_from_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key)
|
||||
. = ..()
|
||||
if (!controller.blackboard[BB_BASIC_MOB_FLEEING])
|
||||
if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
|
||||
return
|
||||
var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key]
|
||||
if (QDELETED(target) || !can_see(controller.pawn, target, run_distance))
|
||||
finish_action(controller, succeeded = TRUE, target_key = target_key, hiding_location_key = hiding_location_key)
|
||||
return
|
||||
if (get_dist(controller.pawn, controller.current_movement_target) >= required_distance)
|
||||
if (get_dist(controller.pawn, controller.current_movement_target) > required_distance)
|
||||
return // Still heading over
|
||||
if (plot_path_away_from(controller, target))
|
||||
return
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
/datum/ai_planning_subtree/flee_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||
. = ..()
|
||||
var/atom/flee_from = controller.blackboard[target_key]
|
||||
if (!controller.blackboard[BB_BASIC_MOB_FLEEING] || QDELETED(flee_from))
|
||||
if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING] || QDELETED(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)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
/datum/ai_planning_subtree/simple_find_nearest_target_to_flee/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||
. = ..()
|
||||
if (!controller.blackboard[BB_BASIC_MOB_FLEEING])
|
||||
if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
|
||||
return
|
||||
controller.queue_behavior(/datum/ai_behavior/find_potential_targets/nearest, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
/datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||
. = ..()
|
||||
if (!controller.blackboard[BB_BASIC_MOB_FLEEING])
|
||||
if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
|
||||
return
|
||||
controller.queue_behavior(/datum/ai_behavior/target_from_retaliate_list/nearest, BB_BASIC_MOB_RETALIATE_LIST, BB_BASIC_MOB_CURRENT_TARGET, targeting_key, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
|
||||
|
||||
|
||||
@@ -18,8 +18,6 @@
|
||||
/datum/ai_controller/basic_controller/dog/corgi
|
||||
blackboard = list(
|
||||
BB_DOG_HARASS_HARM = TRUE,
|
||||
// IF you dont have this fleeing behavviour will just refuse to work, isn't that funny ha ha
|
||||
BB_BASIC_MOB_FLEEING = TRUE,
|
||||
BB_VISION_RANGE = AI_DOG_VISION_RANGE,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(),
|
||||
// Find nearby mobs with tongs in hand.
|
||||
|
||||
@@ -32,14 +32,14 @@
|
||||
return
|
||||
|
||||
var/current_health_percentage = source.health / source.maxHealth
|
||||
if (source.ai_controller.blackboard[BB_BASIC_MOB_FLEEING])
|
||||
if (current_health_percentage < stop_fleeing_at)
|
||||
if (source.ai_controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
|
||||
if (current_health_percentage > start_fleeing_below)
|
||||
return
|
||||
source.ai_controller.CancelActions() // Stop fleeing go back to whatever you were doing
|
||||
source.ai_controller.set_blackboard_key(BB_BASIC_MOB_FLEEING, FALSE)
|
||||
source.ai_controller.CancelActions()
|
||||
source.ai_controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, FALSE)
|
||||
return
|
||||
|
||||
if (current_health_percentage > start_fleeing_below)
|
||||
if (current_health_percentage < stop_fleeing_at)
|
||||
return
|
||||
source.ai_controller.CancelActions()
|
||||
source.ai_controller.set_blackboard_key(BB_BASIC_MOB_FLEEING, TRUE)
|
||||
source.ai_controller.CancelActions() // Stop fleeing go back to whatever you were doing
|
||||
source.ai_controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE)
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
|
||||
/datum/ai_controller/basic_controller/deer
|
||||
blackboard = list(
|
||||
BB_BASIC_MOB_FLEEING = TRUE,
|
||||
BB_STATIONARY_MOVE_TO_TARGET = TRUE,
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction,
|
||||
)
|
||||
|
||||
@@ -49,7 +49,6 @@
|
||||
|
||||
/datum/ai_controller/basic_controller/rabbit
|
||||
blackboard = list(
|
||||
BB_BASIC_MOB_FLEEING = TRUE,
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction(),
|
||||
)
|
||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||
|
||||
@@ -81,7 +81,6 @@
|
||||
|
||||
/datum/ai_controller/basic_controller/sheep
|
||||
blackboard = list(
|
||||
BB_BASIC_MOB_FLEEING = TRUE,
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction(),
|
||||
)
|
||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/datum/ai_controller/basic_controller/mega_arachnid
|
||||
blackboard = list(
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
||||
BB_BASIC_MOB_FLEEING = TRUE,
|
||||
BB_BASIC_MOB_FLEE_DISTANCE = 5,
|
||||
)
|
||||
|
||||
@@ -37,7 +36,7 @@
|
||||
flee_behaviour = /datum/ai_behavior/run_away_from_target/mega_arachnid
|
||||
|
||||
/datum/ai_planning_subtree/flee_target/mega_arachnid/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||
if(!controller.blackboard[BB_BASIC_MOB_FLEEING])
|
||||
if(controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
|
||||
return
|
||||
var/datum/action/cooldown/slip_acid = controller.blackboard[BB_ARACHNID_SLIP]
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends,
|
||||
BB_ORE_IGNORE_TYPES = list(/obj/item/stack/ore/iron, /obj/item/stack/ore/glass),
|
||||
BB_BASIC_MOB_FLEEING = TRUE,
|
||||
BB_STORM_APPROACHING = FALSE,
|
||||
)
|
||||
|
||||
@@ -25,7 +24,6 @@
|
||||
BB_ORE_IGNORE_TYPES = list(/obj/item/stack/ore/glass),
|
||||
BB_FIND_MOM_TYPES = list(/mob/living/basic/mining/goldgrub),
|
||||
BB_IGNORE_MOM_TYPES = list(/mob/living/basic/mining/goldgrub/baby),
|
||||
BB_BASIC_MOB_FLEEING = TRUE,
|
||||
BB_STORM_APPROACHING = FALSE,
|
||||
)
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
/datum/ai_controller/basic_controller/legion
|
||||
blackboard = list(
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/attack_until_dead/legion,
|
||||
BB_BASIC_MOB_FLEEING = TRUE,
|
||||
BB_AGGRO_RANGE = 5, // Unobservant
|
||||
BB_BASIC_MOB_FLEE_DISTANCE = 6,
|
||||
)
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
var/mob/living/basic/basic_source = source
|
||||
var/mob/living/living_target = target
|
||||
basic_source.melee_attack(living_target, ignore_cooldown = TRUE)
|
||||
basic_source.ai_controller?.set_blackboard_key(BB_BASIC_MOB_FLEEING, FALSE)
|
||||
basic_source.ai_controller?.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE)
|
||||
basic_source.start_pulling(living_target)
|
||||
|
||||
/datum/action/cooldown/mob_cooldown/charge/basic_charge/lobster/do_charge(atom/movable/charger, atom/target_atom, delay, past)
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
blackboard = list(
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/lobster,
|
||||
BB_LOBSTROSITY_EXPLOIT_TRAITS = list(TRAIT_INCAPACITATED, TRAIT_FLOORED, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT),
|
||||
BB_BASIC_MOB_FLEEING = TRUE,
|
||||
BB_LOBSTROSITY_FINGER_LUST = 0
|
||||
)
|
||||
|
||||
@@ -26,7 +25,7 @@
|
||||
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 (controller.blackboard[BB_BASIC_MOB_FLEEING])
|
||||
if (!controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
|
||||
return
|
||||
if (!isnull(controller.blackboard[BB_LOBSTROSITY_TARGET_LIMB]))
|
||||
return
|
||||
@@ -48,8 +47,8 @@
|
||||
is_vulnerable = TRUE
|
||||
break
|
||||
if (!is_vulnerable)
|
||||
controller.set_blackboard_key(BB_BASIC_MOB_FLEEING, TRUE)
|
||||
if (controller.blackboard[BB_BASIC_MOB_FLEEING])
|
||||
controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, FALSE)
|
||||
if (!controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
|
||||
finish_action(controller = controller, succeeded = TRUE, target_key = target_key) // We don't want to clear our target
|
||||
return
|
||||
return ..()
|
||||
@@ -57,6 +56,12 @@
|
||||
/datum/ai_planning_subtree/flee_target/lobster
|
||||
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/datum/action/cooldown/using_action = controller.blackboard[BB_TARGETTED_ACTION]
|
||||
if (using_action?.IsAvailable())
|
||||
return
|
||||
return ..()
|
||||
|
||||
/datum/ai_behavior/run_away_from_target/lobster
|
||||
clear_failed_targets = FALSE
|
||||
|
||||
@@ -64,10 +69,11 @@
|
||||
var/atom/target = controller.blackboard[target_key]
|
||||
if(isnull(target))
|
||||
return ..()
|
||||
|
||||
for (var/trait in controller.blackboard[BB_LOBSTROSITY_EXPLOIT_TRAITS])
|
||||
if (!HAS_TRAIT(target, trait))
|
||||
continue
|
||||
controller.set_blackboard_key(BB_BASIC_MOB_FLEEING, FALSE)
|
||||
controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE)
|
||||
finish_action(controller, succeeded = FALSE)
|
||||
return
|
||||
|
||||
|
||||
@@ -38,7 +38,6 @@
|
||||
|
||||
/datum/ai_controller/basic_controller/fox
|
||||
blackboard = list(
|
||||
BB_BASIC_MOB_FLEEING = TRUE,
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/of_size/ours_or_smaller/ignore_faction,
|
||||
BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction
|
||||
)
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
finish_planning = TRUE
|
||||
|
||||
/datum/ai_planning_subtree/make_carp_rift/panic_teleport/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||
if (!controller.blackboard[BB_BASIC_MOB_FLEEING])
|
||||
if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
|
||||
return
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
*/
|
||||
/datum/ai_controller/basic_controller/carp
|
||||
blackboard = list(
|
||||
BB_BASIC_MOB_STOP_FLEEING = TRUE,
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items(),
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends()
|
||||
)
|
||||
@@ -35,6 +36,7 @@
|
||||
*/
|
||||
/datum/ai_controller/basic_controller/carp/pet
|
||||
blackboard = list(
|
||||
BB_BASIC_MOB_STOP_FLEEING = TRUE,
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction(),
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends()
|
||||
)
|
||||
@@ -78,6 +80,7 @@
|
||||
*/
|
||||
/datum/ai_controller/basic_controller/carp/passive
|
||||
blackboard = list(
|
||||
BB_BASIC_MOB_STOP_FLEEING = TRUE,
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction(),
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends()
|
||||
)
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/datum/ai_controller/basic_controller/regal_rat
|
||||
blackboard = list(
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
||||
BB_BASIC_MOB_FLEEING = TRUE,
|
||||
BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction,
|
||||
)
|
||||
|
||||
|
||||
@@ -45,7 +45,6 @@
|
||||
blackboard = list(
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/of_size/ours_or_smaller(), // Hunt mobs our size
|
||||
BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic/of_size/larger(), // Run away from mobs bigger than we are
|
||||
BB_BASIC_MOB_FLEEING = TRUE,
|
||||
)
|
||||
idle_behavior = /datum/idle_behavior/idle_random_walk
|
||||
|
||||
|
||||
@@ -61,7 +61,6 @@
|
||||
/datum/ai_controller/basic_controller/spiderling
|
||||
blackboard = list(
|
||||
BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic/of_size/larger, // Run away from mobs bigger than we are
|
||||
BB_BASIC_MOB_FLEEING = TRUE,
|
||||
BB_VENTCRAWL_COOLDOWN = 20 SECONDS, // enough time to get splatted while we're out in the open.
|
||||
BB_TIME_TO_GIVE_UP_ON_VENT_PATHING = 30 SECONDS,
|
||||
)
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
fugu.melee_damage_upper = 20
|
||||
fugu.status_flags |= GODMODE
|
||||
fugu.obj_damage = 60
|
||||
fugu.ai_controller.set_blackboard_key(BB_BASIC_MOB_FLEEING, FALSE)
|
||||
fugu.ai_controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE)
|
||||
fugu.ai_controller.CancelActions()
|
||||
|
||||
/datum/status_effect/inflated/on_remove()
|
||||
@@ -84,7 +84,7 @@
|
||||
if (fugu.stat != DEAD)
|
||||
fugu.icon_state = "Fugu0"
|
||||
fugu.obj_damage = 0
|
||||
fugu.ai_controller.set_blackboard_key(BB_BASIC_MOB_FLEEING, TRUE)
|
||||
fugu.ai_controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, FALSE)
|
||||
fugu.ai_controller.CancelActions()
|
||||
|
||||
/// Remove status effect if we die
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
/datum/ai_controller/basic_controller/wumborian_fugu
|
||||
blackboard = list(
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(),
|
||||
BB_BASIC_MOB_FLEEING = TRUE,
|
||||
)
|
||||
|
||||
ai_movement = /datum/ai_movement/basic_avoidance
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
///The basic ai controller for crabs
|
||||
/datum/ai_controller/basic_controller/crab
|
||||
blackboard = list(
|
||||
BB_BASIC_MOB_FLEEING = FALSE,
|
||||
BB_BASIC_MOB_STOP_FLEEING = TRUE,
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/of_size/ours_or_smaller,
|
||||
BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction,
|
||||
)
|
||||
|
||||
@@ -376,8 +376,7 @@
|
||||
|
||||
/// The mouse AI controller
|
||||
/datum/ai_controller/basic_controller/mouse
|
||||
blackboard = list(
|
||||
BB_BASIC_MOB_FLEEING = TRUE, // Always cowardly
|
||||
blackboard = list( // Always cowardly
|
||||
BB_CURRENT_HUNTING_TARGET = null, // cheese
|
||||
BB_LOW_PRIORITY_HUNTING_TARGET = null, // cable
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), // Use this to find people to run away from
|
||||
|
||||
Reference in New Issue
Block a user