mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-12 10:42:37 +00:00
[MIRROR] Targeting Datums Renamed (and global) [MDB IGNORE] (#24885)
* Targeting Datums Renamed (and global) (#79513) ## About The Pull Request [Implements the backend required to make targeting datums global](6901ead12e) It's inconsistent with the rest of basic ai for these to have a high degree of state, plus like, such a waste yaknow? [Implements GET_TARGETING_STRATEGY](d79c29134d) Regexes used: new.*(/datum/targetting_datum[^,(]*)\(*\)* -> GET_TARGETING_STRATEGY($1) Renamed all instances of targetting to targeting (also targetting datum -> targeting strategy) I've used GET_TARGETING_STRATEGY at the source where the keys are actually used, rather then in the listing. This works out just fine. ## Why It's Good For The Game Not a misspelled name through the whole codebase, very slightly less memory load for basically no downside (slight cpu cost maybe but not a significant one. --------- Co-authored-by: John Willard <53777086+JohnFulpWillard@ users.noreply.github.com> * Targeting Datums Renamed (and global) * Update dogs.dm * Modular * Modular * Modular * Merge skew? * Revert "Merge skew?" This reverts commit 0889389ab5cb5c56655f1860d9173ba87efe9a22. --------- Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> Co-authored-by: John Willard <53777086+JohnFulpWillard@ users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
#define GET_AI_BEHAVIOR(behavior_type) SSai_behaviors.ai_behaviors[behavior_type]
|
#define GET_AI_BEHAVIOR(behavior_type) SSai_behaviors.ai_behaviors[behavior_type]
|
||||||
|
#define GET_TARGETING_STRATEGY(targeting_type) SSai_behaviors.targeting_strategies[targeting_type]
|
||||||
#define HAS_AI_CONTROLLER_TYPE(thing, type) istype(thing?.ai_controller, type)
|
#define HAS_AI_CONTROLLER_TYPE(thing, type) istype(thing?.ai_controller, type)
|
||||||
|
|
||||||
#define AI_STATUS_ON 1
|
#define AI_STATUS_ON 1
|
||||||
|
|||||||
@@ -40,26 +40,28 @@
|
|||||||
|
|
||||||
///Basic Mob Keys
|
///Basic Mob Keys
|
||||||
|
|
||||||
///Targetting subtrees
|
///Targeting subtrees
|
||||||
#define BB_BASIC_MOB_CURRENT_TARGET "BB_basic_current_target"
|
#define BB_BASIC_MOB_CURRENT_TARGET "BB_basic_current_target"
|
||||||
#define BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION "BB_basic_current_target_hiding_location"
|
#define BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION "BB_basic_current_target_hiding_location"
|
||||||
#define BB_TARGETTING_DATUM "targetting_datum"
|
#define BB_TARGETING_STRATEGY "targeting_strategy"
|
||||||
///some behaviors that check current_target also set this on deep crit mobs
|
///some behaviors that check current_target also set this on deep crit mobs
|
||||||
#define BB_BASIC_MOB_EXECUTION_TARGET "BB_basic_execution_target"
|
#define BB_BASIC_MOB_EXECUTION_TARGET "BB_basic_execution_target"
|
||||||
///Blackboard key for a whitelist typecache of "things we can target while trying to move"
|
///Blackboard key for a whitelist typecache of "things we can target while trying to move"
|
||||||
#define BB_OBSTACLE_TARGETTING_WHITELIST "BB_targetting_whitelist"
|
#define BB_OBSTACLE_TARGETING_WHITELIST "BB_targeting_whitelist"
|
||||||
/// Key for the minimum status at which we want to target mobs (does not need to be specified if CONSCIOUS)
|
/// Key for the minimum status at which we want to target mobs (does not need to be specified if CONSCIOUS)
|
||||||
#define BB_TARGET_MINIMUM_STAT "BB_target_minimum_stat"
|
#define BB_TARGET_MINIMUM_STAT "BB_target_minimum_stat"
|
||||||
/// Flag for whether to target only wounded mobs
|
/// Flag for whether to target only wounded mobs
|
||||||
#define BB_TARGET_WOUNDED_ONLY "BB_target_wounded_only"
|
#define BB_TARGET_WOUNDED_ONLY "BB_target_wounded_only"
|
||||||
|
/// What typepath the holding object targeting strategy should look for
|
||||||
|
#define BB_TARGET_HELD_ITEM "BB_target_held_item"
|
||||||
|
|
||||||
/// Blackboard key storing how long your targetting datum has held a particular target
|
/// Blackboard key storing how long your targeting strategy has held a particular target
|
||||||
#define BB_BASIC_MOB_HAS_TARGET_TIME "BB_basic_mob_has_target_time"
|
#define BB_BASIC_MOB_HAS_TARGET_TIME "BB_basic_mob_has_target_time"
|
||||||
|
|
||||||
///Targetting keys for something to run away from, if you need to store this separately from current target
|
///Targeting keys for something to run away from, if you need to store this separately from current target
|
||||||
#define BB_BASIC_MOB_FLEE_TARGET "BB_basic_flee_target"
|
#define BB_BASIC_MOB_FLEE_TARGET "BB_basic_flee_target"
|
||||||
#define BB_BASIC_MOB_FLEE_TARGET_HIDING_LOCATION "BB_basic_flee_target_hiding_location"
|
#define BB_BASIC_MOB_FLEE_TARGET_HIDING_LOCATION "BB_basic_flee_target_hiding_location"
|
||||||
#define BB_FLEE_TARGETTING_DATUM "flee_targetting_datum"
|
#define BB_FLEE_TARGETING_STRATEGY "flee_targeting_strategy"
|
||||||
#define BB_BASIC_MOB_FLEE_DISTANCE "BB_basic_flee_distance"
|
#define BB_BASIC_MOB_FLEE_DISTANCE "BB_basic_flee_distance"
|
||||||
#define DEFAULT_BASIC_FLEE_DISTANCE 9
|
#define DEFAULT_BASIC_FLEE_DISTANCE 9
|
||||||
|
|
||||||
@@ -115,9 +117,9 @@
|
|||||||
///Range for a MOD AI controller.
|
///Range for a MOD AI controller.
|
||||||
#define MOD_AI_RANGE 200
|
#define MOD_AI_RANGE 200
|
||||||
|
|
||||||
///should we skip the faction check for the targetting datum?
|
///should we skip the faction check for the targeting strategy?
|
||||||
#define BB_ALWAYS_IGNORE_FACTION "BB_always_ignore_factions"
|
#define BB_ALWAYS_IGNORE_FACTION "BB_always_ignore_factions"
|
||||||
///are we in some kind of temporary state of ignoring factions when targetting? can result in volatile results if multiple behaviours touch this
|
///are we in some kind of temporary state of ignoring factions when targeting? can result in volatile results if multiple behaviours touch this
|
||||||
#define BB_TEMPORARILY_IGNORE_FACTION "BB_temporarily_ignore_factions"
|
#define BB_TEMPORARILY_IGNORE_FACTION "BB_temporarily_ignore_factions"
|
||||||
|
|
||||||
///currently only used by clowns, a list of what can the mob speak randomly
|
///currently only used by clowns, a list of what can the mob speak randomly
|
||||||
|
|||||||
@@ -7,9 +7,9 @@
|
|||||||
/// Current target turf in your migration
|
/// Current target turf in your migration
|
||||||
#define BB_CARP_MIGRATION_TARGET "BB_carp_migration_target"
|
#define BB_CARP_MIGRATION_TARGET "BB_carp_migration_target"
|
||||||
|
|
||||||
/// Targetting keys for magicarp spells
|
/// Targeting keys for magicarp spells
|
||||||
#define BB_MAGICARP_SPELL_TARGET "BB_magicarp_spell_target"
|
#define BB_MAGICARP_SPELL_TARGET "BB_magicarp_spell_target"
|
||||||
#define BB_MAGICARP_SPELL_SPECIAL_TARGETTING "BB_magicarp_spell_special_targetting"
|
#define BB_MAGICARP_SPELL_SPECIAL_TARGETING "BB_magicarp_spell_special_targeting"
|
||||||
#define MAGICARP_SPELL_CORPSES "magicarp_spell_corpses"
|
#define MAGICARP_SPELL_CORPSES "magicarp_spell_corpses"
|
||||||
#define MAGICARP_SPELL_WALLS "magicarp_spell_walls"
|
#define MAGICARP_SPELL_WALLS "magicarp_spell_walls"
|
||||||
#define MAGICARP_SPELL_OBJECTS "magicarp_spell_objects"
|
#define MAGICARP_SPELL_OBJECTS "magicarp_spell_objects"
|
||||||
|
|||||||
@@ -4,6 +4,6 @@
|
|||||||
/// Blackboard field for what we actually want the pet to target
|
/// Blackboard field for what we actually want the pet to target
|
||||||
#define BB_CURRENT_PET_TARGET "BB_current_pet_target"
|
#define BB_CURRENT_PET_TARGET "BB_current_pet_target"
|
||||||
/// Blackboard field for how we target things, as usually we want to be more permissive than normal
|
/// Blackboard field for how we target things, as usually we want to be more permissive than normal
|
||||||
#define BB_PET_TARGETTING_DATUM "BB_pet_targetting"
|
#define BB_PET_TARGETING_STRATEGY "BB_pet_targeting"
|
||||||
/// Typecache of weakrefs to mobs this mob is friends with, will follow their instructions and won't attack them
|
/// Typecache of weakrefs to mobs this mob is friends with, will follow their instructions and won't attack them
|
||||||
#define BB_FRIENDS_LIST "BB_friends_list"
|
#define BB_FRIENDS_LIST "BB_friends_list"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
/// Key that holds a vent that we want to exit out of (when we're already in a pipenet)
|
/// Key that holds a vent that we want to exit out of (when we're already in a pipenet)
|
||||||
#define BB_EXIT_VENT_TARGET "BB_exit_vent_target"
|
#define BB_EXIT_VENT_TARGET "BB_exit_vent_target"
|
||||||
/// Do we plan on going inside a vent? Boolean.
|
/// Do we plan on going inside a vent? Boolean.
|
||||||
#define BB_CURRENTLY_TARGETTING_VENT "BB_currently_targetting_vent"
|
#define BB_CURRENTLY_TARGETING_VENT "BB_currently_targeting_vent"
|
||||||
/// How long should we wait before we try and enter a vent again?
|
/// How long should we wait before we try and enter a vent again?
|
||||||
#define BB_VENTCRAWL_COOLDOWN "BB_ventcrawl_cooldown"
|
#define BB_VENTCRAWL_COOLDOWN "BB_ventcrawl_cooldown"
|
||||||
/// The least amount of time (in seconds) we take to go through the vents.
|
/// The least amount of time (in seconds) we take to go through the vents.
|
||||||
|
|||||||
@@ -57,7 +57,7 @@
|
|||||||
|
|
||||||
// VV HREF KEYS
|
// VV HREF KEYS
|
||||||
#define VV_HK_TARGET "target"
|
#define VV_HK_TARGET "target"
|
||||||
#define VV_HK_VARNAME "targetvar" //name or index of var for 1 variable targetting hrefs.
|
#define VV_HK_VARNAME "targetvar" //name or index of var for 1 variable targeting hrefs.
|
||||||
|
|
||||||
// vv_do_list() keys
|
// vv_do_list() keys
|
||||||
#define VV_HK_LIST_ADD "listadd"
|
#define VV_HK_LIST_ADD "listadd"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
///Hud type with targetting dol and a nutrition bar
|
///Hud type with targeting dol and a nutrition bar
|
||||||
/datum/hud/ooze/New(mob/living/owner)
|
/datum/hud/ooze/New(mob/living/owner)
|
||||||
. = ..()
|
. = ..()
|
||||||
|
|
||||||
|
|||||||
@@ -8,9 +8,12 @@ PROCESSING_SUBSYSTEM_DEF(ai_behaviors)
|
|||||||
wait = 1
|
wait = 1
|
||||||
///List of all ai_behavior singletons, key is the typepath while assigned value is a newly created instance of the typepath. See SetupAIBehaviors()
|
///List of all ai_behavior singletons, key is the typepath while assigned value is a newly created instance of the typepath. See SetupAIBehaviors()
|
||||||
var/list/ai_behaviors
|
var/list/ai_behaviors
|
||||||
|
///List of all targeting_strategy singletons, key is the typepath while assigned value is a newly created instance of the typepath. See SetupAIBehaviors()
|
||||||
|
var/list/targeting_strategies
|
||||||
|
|
||||||
/datum/controller/subsystem/processing/ai_behaviors/Initialize()
|
/datum/controller/subsystem/processing/ai_behaviors/Initialize()
|
||||||
SetupAIBehaviors()
|
SetupAIBehaviors()
|
||||||
|
SetupTargetingStrats()
|
||||||
return SS_INIT_SUCCESS
|
return SS_INIT_SUCCESS
|
||||||
|
|
||||||
/datum/controller/subsystem/processing/ai_behaviors/proc/SetupAIBehaviors()
|
/datum/controller/subsystem/processing/ai_behaviors/proc/SetupAIBehaviors()
|
||||||
@@ -18,3 +21,9 @@ PROCESSING_SUBSYSTEM_DEF(ai_behaviors)
|
|||||||
for(var/behavior_type in subtypesof(/datum/ai_behavior))
|
for(var/behavior_type in subtypesof(/datum/ai_behavior))
|
||||||
var/datum/ai_behavior/ai_behavior = new behavior_type
|
var/datum/ai_behavior/ai_behavior = new behavior_type
|
||||||
ai_behaviors[behavior_type] = ai_behavior
|
ai_behaviors[behavior_type] = ai_behavior
|
||||||
|
|
||||||
|
/datum/controller/subsystem/processing/ai_behaviors/proc/SetupTargetingStrats()
|
||||||
|
targeting_strategies = list()
|
||||||
|
for(var/target_type in subtypesof(/datum/targeting_strategy))
|
||||||
|
var/datum/targeting_strategy/target_start = new target_type
|
||||||
|
targeting_strategies[target_type] = target_start
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
action_cooldown = 0.2 SECONDS // We gotta check unfortunately often because we're in a race condition with nextmove
|
action_cooldown = 0.2 SECONDS // We gotta check unfortunately often because we're in a race condition with nextmove
|
||||||
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
|
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
|
||||||
|
|
||||||
/datum/ai_behavior/basic_melee_attack/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key)
|
/datum/ai_behavior/basic_melee_attack/setup(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
|
||||||
. = ..()
|
. = ..()
|
||||||
if(!controller.blackboard_key_exists(targetting_datum_key))
|
if(!controller.blackboard[targeting_strategy_key])
|
||||||
CRASH("No target datum was supplied in the blackboard for [controller.pawn]")
|
CRASH("No target datum was supplied in the blackboard for [controller.pawn]")
|
||||||
|
|
||||||
//Hiding location is priority
|
//Hiding location is priority
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
set_movement_target(controller, target)
|
set_movement_target(controller, target)
|
||||||
|
|
||||||
/datum/ai_behavior/basic_melee_attack/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key)
|
/datum/ai_behavior/basic_melee_attack/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
|
||||||
if (isliving(controller.pawn))
|
if (isliving(controller.pawn))
|
||||||
var/mob/living/pawn = controller.pawn
|
var/mob/living/pawn = controller.pawn
|
||||||
if (world.time < pawn.next_move)
|
if (world.time < pawn.next_move)
|
||||||
@@ -22,15 +22,15 @@
|
|||||||
|
|
||||||
. = ..()
|
. = ..()
|
||||||
var/mob/living/basic/basic_mob = controller.pawn
|
var/mob/living/basic/basic_mob = controller.pawn
|
||||||
//targetting datum will kill the action if not real anymore
|
//targeting strategy will kill the action if not real anymore
|
||||||
var/atom/target = controller.blackboard[target_key]
|
var/atom/target = controller.blackboard[target_key]
|
||||||
var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key]
|
var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
|
||||||
|
|
||||||
if(!targetting_datum.can_attack(basic_mob, target))
|
if(!targeting_strategy.can_attack(basic_mob, target))
|
||||||
finish_action(controller, FALSE, target_key)
|
finish_action(controller, FALSE, target_key)
|
||||||
return
|
return
|
||||||
|
|
||||||
var/hiding_target = targetting_datum.find_hidden_mobs(basic_mob, target) //If this is valid, theyre hidden in something!
|
var/hiding_target = targeting_strategy.find_hidden_mobs(basic_mob, target) //If this is valid, theyre hidden in something!
|
||||||
|
|
||||||
controller.set_blackboard_key(hiding_location_key, hiding_target)
|
controller.set_blackboard_key(hiding_location_key, hiding_target)
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
basic_mob.melee_attack(target)
|
basic_mob.melee_attack(target)
|
||||||
|
|
||||||
|
|
||||||
/datum/ai_behavior/basic_melee_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targetting_datum_key, hiding_location_key)
|
/datum/ai_behavior/basic_melee_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key)
|
||||||
. = ..()
|
. = ..()
|
||||||
if(!succeeded)
|
if(!succeeded)
|
||||||
controller.clear_blackboard_key(target_key)
|
controller.clear_blackboard_key(target_key)
|
||||||
@@ -54,30 +54,30 @@
|
|||||||
///do we care about avoiding friendly fire?
|
///do we care about avoiding friendly fire?
|
||||||
var/avoid_friendly_fire = FALSE
|
var/avoid_friendly_fire = FALSE
|
||||||
|
|
||||||
/datum/ai_behavior/basic_ranged_attack/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key)
|
/datum/ai_behavior/basic_ranged_attack/setup(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
|
||||||
. = ..()
|
. = ..()
|
||||||
var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key]
|
var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key]
|
||||||
if(QDELETED(target))
|
if(QDELETED(target))
|
||||||
return FALSE
|
return FALSE
|
||||||
set_movement_target(controller, target)
|
set_movement_target(controller, target)
|
||||||
|
|
||||||
/datum/ai_behavior/basic_ranged_attack/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key)
|
/datum/ai_behavior/basic_ranged_attack/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
|
||||||
var/mob/living/basic/basic_mob = controller.pawn
|
var/mob/living/basic/basic_mob = controller.pawn
|
||||||
//targetting datum will kill the action if not real anymore
|
//targeting strategy will kill the action if not real anymore
|
||||||
var/atom/target = controller.blackboard[target_key]
|
var/atom/target = controller.blackboard[target_key]
|
||||||
var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key]
|
var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
|
||||||
|
|
||||||
if(!targetting_datum.can_attack(basic_mob, target, chase_range))
|
if(!targeting_strategy.can_attack(basic_mob, target, chase_range))
|
||||||
finish_action(controller, FALSE, target_key)
|
finish_action(controller, FALSE, target_key)
|
||||||
return
|
return
|
||||||
|
|
||||||
var/atom/hiding_target = targetting_datum.find_hidden_mobs(basic_mob, target) //If this is valid, theyre hidden in something!
|
var/atom/hiding_target = targeting_strategy.find_hidden_mobs(basic_mob, target) //If this is valid, theyre hidden in something!
|
||||||
var/atom/final_target = hiding_target ? hiding_target : target
|
var/atom/final_target = hiding_target ? hiding_target : target
|
||||||
|
|
||||||
if(!can_see(basic_mob, final_target, required_distance))
|
if(!can_see(basic_mob, final_target, required_distance))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(avoid_friendly_fire && check_friendly_in_path(basic_mob, target, targetting_datum))
|
if(avoid_friendly_fire && check_friendly_in_path(basic_mob, target, targeting_strategy))
|
||||||
adjust_position(basic_mob, target)
|
adjust_position(basic_mob, target)
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
@@ -85,17 +85,17 @@
|
|||||||
basic_mob.RangedAttack(final_target)
|
basic_mob.RangedAttack(final_target)
|
||||||
return ..() //only start the cooldown when the shot is shot
|
return ..() //only start the cooldown when the shot is shot
|
||||||
|
|
||||||
/datum/ai_behavior/basic_ranged_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targetting_datum_key, hiding_location_key)
|
/datum/ai_behavior/basic_ranged_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key)
|
||||||
. = ..()
|
. = ..()
|
||||||
if(!succeeded)
|
if(!succeeded)
|
||||||
controller.clear_blackboard_key(target_key)
|
controller.clear_blackboard_key(target_key)
|
||||||
|
|
||||||
/datum/ai_behavior/basic_ranged_attack/proc/check_friendly_in_path(mob/living/source, atom/target, datum/targetting_datum/targetting_datum)
|
/datum/ai_behavior/basic_ranged_attack/proc/check_friendly_in_path(mob/living/source, atom/target, datum/targeting_strategy/targeting_strategy)
|
||||||
var/list/turfs_list = calculate_trajectory(source, target)
|
var/list/turfs_list = calculate_trajectory(source, target)
|
||||||
for(var/turf/possible_turf as anything in turfs_list)
|
for(var/turf/possible_turf as anything in turfs_list)
|
||||||
|
|
||||||
for(var/mob/living/potential_friend in possible_turf)
|
for(var/mob/living/potential_friend in possible_turf)
|
||||||
if(!targetting_datum.can_attack(source, potential_friend))
|
if(!targeting_strategy.can_attack(source, potential_friend))
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|||||||
@@ -7,16 +7,16 @@
|
|||||||
/// Static typecache list of potentially dangerous objs
|
/// Static typecache list of potentially dangerous objs
|
||||||
var/static/list/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha))
|
var/static/list/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha))
|
||||||
|
|
||||||
/datum/ai_behavior/find_potential_targets/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key)
|
/datum/ai_behavior/find_potential_targets/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
|
||||||
. = ..()
|
. = ..()
|
||||||
var/mob/living/living_mob = controller.pawn
|
var/mob/living/living_mob = controller.pawn
|
||||||
var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key]
|
var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
|
||||||
|
|
||||||
if(!targetting_datum)
|
if(!targeting_strategy)
|
||||||
CRASH("No target datum was supplied in the blackboard for [controller.pawn]")
|
CRASH("No target datum was supplied in the blackboard for [controller.pawn]")
|
||||||
|
|
||||||
var/atom/current_target = controller.blackboard[target_key]
|
var/atom/current_target = controller.blackboard[target_key]
|
||||||
if (targetting_datum.can_attack(living_mob, current_target, vision_range))
|
if (targeting_strategy.can_attack(living_mob, current_target, vision_range))
|
||||||
finish_action(controller, succeeded = FALSE)
|
finish_action(controller, succeeded = FALSE)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
var/list/filtered_targets = list()
|
var/list/filtered_targets = list()
|
||||||
|
|
||||||
for(var/atom/pot_target in potential_targets)
|
for(var/atom/pot_target in potential_targets)
|
||||||
if(targetting_datum.can_attack(living_mob, pot_target))//Can we attack it?
|
if(targeting_strategy.can_attack(living_mob, pot_target))//Can we attack it?
|
||||||
filtered_targets += pot_target
|
filtered_targets += pot_target
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
var/atom/target = pick_final_target(controller, filtered_targets)
|
var/atom/target = pick_final_target(controller, filtered_targets)
|
||||||
controller.set_blackboard_key(target_key, target)
|
controller.set_blackboard_key(target_key, target)
|
||||||
|
|
||||||
var/atom/potential_hiding_location = targetting_datum.find_hidden_mobs(living_mob, target)
|
var/atom/potential_hiding_location = targeting_strategy.find_hidden_mobs(living_mob, target)
|
||||||
|
|
||||||
if(potential_hiding_location) //If they're hiding inside of something, we need to know so we can go for that instead initially.
|
if(potential_hiding_location) //If they're hiding inside of something, we need to know so we can go for that instead initially.
|
||||||
controller.set_blackboard_key(hiding_location_key, potential_hiding_location)
|
controller.set_blackboard_key(hiding_location_key, potential_hiding_location)
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
. = ..()
|
. = ..()
|
||||||
var/obj/machinery/atmospherics/components/unary/vent_pump/entry_vent = controller.blackboard[target_key] || controller.blackboard[BB_ENTRY_VENT_TARGET]
|
var/obj/machinery/atmospherics/components/unary/vent_pump/entry_vent = controller.blackboard[target_key] || controller.blackboard[BB_ENTRY_VENT_TARGET]
|
||||||
var/mob/living/cached_pawn = controller.pawn
|
var/mob/living/cached_pawn = controller.pawn
|
||||||
if(HAS_TRAIT(cached_pawn, TRAIT_MOVE_VENTCRAWLING) || !controller.blackboard[BB_CURRENTLY_TARGETTING_VENT] || !is_vent_valid(entry_vent))
|
if(HAS_TRAIT(cached_pawn, TRAIT_MOVE_VENTCRAWLING) || !controller.blackboard[BB_CURRENTLY_TARGETING_VENT] || !is_vent_valid(entry_vent))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(!cached_pawn.can_enter_vent(entry_vent, provide_feedback = FALSE)) // we're an AI we scoff at feedback
|
if(!cached_pawn.can_enter_vent(entry_vent, provide_feedback = FALSE)) // we're an AI we scoff at feedback
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
finish_action(controller, FALSE, target_key)
|
finish_action(controller, FALSE, target_key)
|
||||||
return
|
return
|
||||||
|
|
||||||
controller.set_blackboard_key(BB_CURRENTLY_TARGETTING_VENT, FALSE) // must be done here because we have a do_after sleep in handle_ventcrawl unfortunately and double dipping could lead to erroneous suicide pill calls.
|
controller.set_blackboard_key(BB_CURRENTLY_TARGETING_VENT, FALSE) // must be done here because we have a do_after sleep in handle_ventcrawl unfortunately and double dipping could lead to erroneous suicide pill calls.
|
||||||
cached_pawn.handle_ventcrawl(entry_vent)
|
cached_pawn.handle_ventcrawl(entry_vent)
|
||||||
if(!HAS_TRAIT(cached_pawn, TRAIT_MOVE_VENTCRAWLING)) //something failed and we ARE NOT IN THE VENT even though the earlier check said we were good to go! odd.
|
if(!HAS_TRAIT(cached_pawn, TRAIT_MOVE_VENTCRAWLING)) //something failed and we ARE NOT IN THE VENT even though the earlier check said we were good to go! odd.
|
||||||
finish_action(controller, FALSE, target_key)
|
finish_action(controller, FALSE, target_key)
|
||||||
@@ -134,5 +134,5 @@
|
|||||||
controller.clear_blackboard_key(target_key)
|
controller.clear_blackboard_key(target_key)
|
||||||
controller.clear_blackboard_key(BB_ENTRY_VENT_TARGET)
|
controller.clear_blackboard_key(BB_ENTRY_VENT_TARGET)
|
||||||
controller.clear_blackboard_key(BB_EXIT_VENT_TARGET)
|
controller.clear_blackboard_key(BB_EXIT_VENT_TARGET)
|
||||||
controller.set_blackboard_key(BB_CURRENTLY_TARGETTING_VENT, FALSE) // just in case
|
controller.set_blackboard_key(BB_CURRENTLY_TARGETING_VENT, FALSE) // just in case
|
||||||
|
|
||||||
|
|||||||
@@ -12,19 +12,19 @@
|
|||||||
var/mob/living/pawn = controller.pawn
|
var/mob/living/pawn = controller.pawn
|
||||||
if (LAZYLEN(pawn.do_afters))
|
if (LAZYLEN(pawn.do_afters))
|
||||||
return
|
return
|
||||||
controller.queue_behavior(melee_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
|
controller.queue_behavior(melee_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
|
||||||
|
|
||||||
/// Attack something which is already adjacent to us without moving
|
/// Attack something which is already adjacent to us without moving
|
||||||
/datum/ai_behavior/basic_melee_attack/opportunistic
|
/datum/ai_behavior/basic_melee_attack/opportunistic
|
||||||
action_cooldown = 0.2 SECONDS // We gotta check unfortunately often because we're in a race condition with nextmove
|
action_cooldown = 0.2 SECONDS // We gotta check unfortunately often because we're in a race condition with nextmove
|
||||||
behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
|
behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
|
||||||
|
|
||||||
/datum/ai_behavior/basic_melee_attack/opportunistic/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key)
|
/datum/ai_behavior/basic_melee_attack/opportunistic/setup(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
|
||||||
if (!controller.blackboard_key_exists(targetting_datum_key))
|
if (!controller.blackboard_key_exists(targeting_strategy_key))
|
||||||
CRASH("No target datum was supplied in the blackboard for [controller.pawn]")
|
CRASH("No target datum was supplied in the blackboard for [controller.pawn]")
|
||||||
return controller.blackboard_key_exists(target_key)
|
return controller.blackboard_key_exists(target_key)
|
||||||
|
|
||||||
/datum/ai_behavior/basic_melee_attack/opportunistic/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key)
|
/datum/ai_behavior/basic_melee_attack/opportunistic/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
|
||||||
var/atom/movable/atom_pawn = controller.pawn
|
var/atom/movable/atom_pawn = controller.pawn
|
||||||
if(!atom_pawn.CanReach(controller.blackboard[target_key]))
|
if(!atom_pawn.CanReach(controller.blackboard[target_key]))
|
||||||
finish_action(controller, TRUE, target_key) // Don't clear target
|
finish_action(controller, TRUE, target_key) // Don't clear target
|
||||||
|
|||||||
@@ -74,7 +74,7 @@
|
|||||||
return FALSE
|
return FALSE
|
||||||
if (basic_mob.see_invisible < object.invisibility)
|
if (basic_mob.see_invisible < object.invisibility)
|
||||||
return FALSE
|
return FALSE
|
||||||
var/list/whitelist = basic_mob.ai_controller.blackboard[BB_OBSTACLE_TARGETTING_WHITELIST]
|
var/list/whitelist = basic_mob.ai_controller.blackboard[BB_OBSTACLE_TARGETING_WHITELIST]
|
||||||
if(whitelist && !is_type_in_typecache(object, whitelist))
|
if(whitelist && !is_type_in_typecache(object, whitelist))
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
/// Add or remove people to our retaliation shitlist just on an arbitrary whim
|
/// Add or remove people to our retaliation shitlist just on an arbitrary whim
|
||||||
/datum/ai_planning_subtree/capricious_retaliate
|
/datum/ai_planning_subtree/capricious_retaliate
|
||||||
/// Blackboard key which tells us how to select valid targets
|
/// Blackboard key which tells us how to select valid targets
|
||||||
var/targetting_datum_key = BB_TARGETTING_DATUM
|
var/targeting_strategy_key = BB_TARGETING_STRATEGY
|
||||||
/// Whether we should skip checking faction for our decision
|
/// Whether we should skip checking faction for our decision
|
||||||
var/ignore_faction = TRUE
|
var/ignore_faction = TRUE
|
||||||
|
|
||||||
/datum/ai_planning_subtree/capricious_retaliate/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
/datum/ai_planning_subtree/capricious_retaliate/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||||
. = ..()
|
. = ..()
|
||||||
controller.queue_behavior(/datum/ai_behavior/capricious_retaliate, targetting_datum_key, ignore_faction)
|
controller.queue_behavior(/datum/ai_behavior/capricious_retaliate, targeting_strategy_key, ignore_faction)
|
||||||
|
|
||||||
/// Add or remove people to our retaliation shitlist just on an arbitrary whim
|
/// Add or remove people to our retaliation shitlist just on an arbitrary whim
|
||||||
/datum/ai_behavior/capricious_retaliate
|
/datum/ai_behavior/capricious_retaliate
|
||||||
action_cooldown = 1 SECONDS
|
action_cooldown = 1 SECONDS
|
||||||
|
|
||||||
/datum/ai_behavior/capricious_retaliate/perform(seconds_per_tick, datum/ai_controller/controller, targetting_datum_key, ignore_faction)
|
/datum/ai_behavior/capricious_retaliate/perform(seconds_per_tick, datum/ai_controller/controller, targeting_strategy_key, ignore_faction)
|
||||||
. = ..()
|
. = ..()
|
||||||
var/atom/pawn = controller.pawn
|
var/atom/pawn = controller.pawn
|
||||||
if (controller.blackboard_key_exists(BB_BASIC_MOB_RETALIATE_LIST))
|
if (controller.blackboard_key_exists(BB_BASIC_MOB_RETALIATE_LIST))
|
||||||
@@ -35,10 +35,10 @@
|
|||||||
var/aggro_range = controller.blackboard[BB_AGGRO_RANGE] || 9
|
var/aggro_range = controller.blackboard[BB_AGGRO_RANGE] || 9
|
||||||
var/list/potential_targets = hearers(aggro_range, get_turf(pawn)) - pawn
|
var/list/potential_targets = hearers(aggro_range, get_turf(pawn)) - pawn
|
||||||
if (!length(potential_targets))
|
if (!length(potential_targets))
|
||||||
failed_targetting(controller, pawn, ignore_faction)
|
failed_targeting(controller, pawn, ignore_faction)
|
||||||
return
|
return
|
||||||
|
|
||||||
var/datum/targetting_datum/target_helper = controller.blackboard[targetting_datum_key]
|
var/datum/targeting_strategy/target_helper = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
|
||||||
|
|
||||||
var/mob/living/final_target = null
|
var/mob/living/final_target = null
|
||||||
if (ignore_faction)
|
if (ignore_faction)
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
final_target = test_target
|
final_target = test_target
|
||||||
|
|
||||||
if (isnull(final_target))
|
if (isnull(final_target))
|
||||||
failed_targetting(controller, pawn, ignore_faction)
|
failed_targeting(controller, pawn, ignore_faction)
|
||||||
return
|
return
|
||||||
|
|
||||||
controller.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, final_target)
|
controller.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, final_target)
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
finish_action(controller, TRUE, ignore_faction)
|
finish_action(controller, TRUE, ignore_faction)
|
||||||
|
|
||||||
/// Called if we try but fail to target something
|
/// Called if we try but fail to target something
|
||||||
/datum/ai_behavior/capricious_retaliate/proc/failed_targetting(datum/ai_controller/controller, atom/pawn, ignore_faction)
|
/datum/ai_behavior/capricious_retaliate/proc/failed_targeting(datum/ai_controller/controller, atom/pawn, ignore_faction)
|
||||||
finish_action(controller, FALSE, ignore_faction)
|
finish_action(controller, FALSE, ignore_faction)
|
||||||
pawn.visible_message(span_notice("[pawn] grumbles.")) // We're pissed off but with no outlet to vent our frustration upon
|
pawn.visible_message(span_notice("[pawn] grumbles.")) // We're pissed off but with no outlet to vent our frustration upon
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
return SUBTREE_RETURN_FINISH_PLANNING //we gotta get out of here.
|
return SUBTREE_RETURN_FINISH_PLANNING //we gotta get out of here.
|
||||||
|
|
||||||
/// Try to escape from your current target, without performing any other actions.
|
/// Try to escape from your current target, without performing any other actions.
|
||||||
/// Reads from some fleeing-specific targetting keys rather than the current mob target.
|
/// Reads from some fleeing-specific targeting keys rather than the current mob target.
|
||||||
/datum/ai_planning_subtree/flee_target/from_flee_key
|
/datum/ai_planning_subtree/flee_target/from_flee_key
|
||||||
target_key = BB_BASIC_MOB_FLEE_TARGET
|
target_key = BB_BASIC_MOB_FLEE_TARGET
|
||||||
hiding_place_key = BB_BASIC_MOB_FLEE_TARGET_HIDING_LOCATION
|
hiding_place_key = BB_BASIC_MOB_FLEE_TARGET_HIDING_LOCATION
|
||||||
|
|||||||
@@ -15,6 +15,6 @@
|
|||||||
controller.queue_behavior(/datum/ai_behavior/travel_towards, BB_ENTRY_VENT_TARGET)
|
controller.queue_behavior(/datum/ai_behavior/travel_towards, BB_ENTRY_VENT_TARGET)
|
||||||
return
|
return
|
||||||
|
|
||||||
controller.set_blackboard_key(BB_CURRENTLY_TARGETTING_VENT, TRUE)
|
controller.set_blackboard_key(BB_CURRENTLY_TARGETING_VENT, TRUE)
|
||||||
controller.queue_behavior(/datum/ai_behavior/crawl_through_vents, BB_ENTRY_VENT_TARGET)
|
controller.queue_behavior(/datum/ai_behavior/crawl_through_vents, BB_ENTRY_VENT_TARGET)
|
||||||
return SUBTREE_RETURN_FINISH_PLANNING // we are going into this vent... no distractions
|
return SUBTREE_RETURN_FINISH_PLANNING // we are going into this vent... no distractions
|
||||||
|
|||||||
@@ -14,30 +14,30 @@
|
|||||||
. = ..()
|
. = ..()
|
||||||
if(!controller.blackboard_key_exists(target_key))
|
if(!controller.blackboard_key_exists(target_key))
|
||||||
return
|
return
|
||||||
controller.queue_behavior(attack_behavior, target_key, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION, max_range, min_range)
|
controller.queue_behavior(attack_behavior, target_key, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION, max_range, min_range)
|
||||||
|
|
||||||
/// How often will we try to perform our ranged attack?
|
/// How often will we try to perform our ranged attack?
|
||||||
/datum/ai_behavior/ranged_skirmish
|
/datum/ai_behavior/ranged_skirmish
|
||||||
action_cooldown = 1 SECONDS
|
action_cooldown = 1 SECONDS
|
||||||
|
|
||||||
/datum/ai_behavior/ranged_skirmish/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key, max_range, min_range)
|
/datum/ai_behavior/ranged_skirmish/setup(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key, max_range, min_range)
|
||||||
. = ..()
|
. = ..()
|
||||||
var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key]
|
var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key]
|
||||||
return !QDELETED(target)
|
return !QDELETED(target)
|
||||||
|
|
||||||
/datum/ai_behavior/ranged_skirmish/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key, max_range, min_range)
|
/datum/ai_behavior/ranged_skirmish/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key, max_range, min_range)
|
||||||
. = ..()
|
. = ..()
|
||||||
var/atom/target = controller.blackboard[target_key]
|
var/atom/target = controller.blackboard[target_key]
|
||||||
if (QDELETED(target))
|
if (QDELETED(target))
|
||||||
finish_action(controller, succeeded = FALSE)
|
finish_action(controller, succeeded = FALSE)
|
||||||
return
|
return
|
||||||
|
|
||||||
var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key]
|
var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
|
||||||
if(!targetting_datum.can_attack(controller.pawn, target))
|
if(!targeting_strategy.can_attack(controller.pawn, target))
|
||||||
finish_action(controller, succeeded = FALSE)
|
finish_action(controller, succeeded = FALSE)
|
||||||
return
|
return
|
||||||
|
|
||||||
var/hiding_target = targetting_datum.find_hidden_mobs(controller.pawn, target)
|
var/hiding_target = targeting_strategy.find_hidden_mobs(controller.pawn, target)
|
||||||
controller.set_blackboard_key(hiding_location_key, hiding_target)
|
controller.set_blackboard_key(hiding_location_key, hiding_target)
|
||||||
|
|
||||||
target = hiding_target || target
|
target = hiding_target || target
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
. = ..()
|
. = ..()
|
||||||
if(!controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET))
|
if(!controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET))
|
||||||
return
|
return
|
||||||
controller.queue_behavior(melee_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
|
controller.queue_behavior(melee_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
|
||||||
if (end_planning)
|
if (end_planning)
|
||||||
return SUBTREE_RETURN_FINISH_PLANNING //we are going into battle...no distractions.
|
return SUBTREE_RETURN_FINISH_PLANNING //we are going into battle...no distractions.
|
||||||
|
|
||||||
@@ -20,5 +20,5 @@
|
|||||||
. = ..()
|
. = ..()
|
||||||
if(!controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET))
|
if(!controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET))
|
||||||
return
|
return
|
||||||
controller.queue_behavior(ranged_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
|
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.
|
return SUBTREE_RETURN_FINISH_PLANNING //we are going into battle...no distractions.
|
||||||
|
|||||||
@@ -5,11 +5,11 @@
|
|||||||
. = ..()
|
. = ..()
|
||||||
if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
|
if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
|
||||||
return
|
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)
|
controller.queue_behavior(/datum/ai_behavior/find_potential_targets/nearest, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
|
||||||
|
|
||||||
/// Find the nearest thing on our list of 'things which have done damage to me' and set it as the flee target
|
/// Find the nearest thing on our list of 'things which have done damage to me' and set it as the flee target
|
||||||
/datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee
|
/datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee
|
||||||
var/targeting_key = BB_TARGETTING_DATUM
|
var/targeting_key = BB_TARGETING_STRATEGY
|
||||||
|
|
||||||
/datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
/datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||||
. = ..()
|
. = ..()
|
||||||
@@ -18,4 +18,4 @@
|
|||||||
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)
|
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)
|
||||||
|
|
||||||
/datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee/from_flee_key
|
/datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee/from_flee_key
|
||||||
targeting_key = BB_FLEE_TARGETTING_DATUM
|
targeting_key = BB_FLEE_TARGETING_STRATEGY
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
/datum/ai_planning_subtree/simple_find_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
/datum/ai_planning_subtree/simple_find_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||||
. = ..()
|
. = ..()
|
||||||
controller.queue_behavior(/datum/ai_behavior/find_potential_targets, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
|
controller.queue_behavior(/datum/ai_behavior/find_potential_targets, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
|
||||||
|
|
||||||
// Prevents finding a target if a human is nearby
|
// Prevents finding a target if a human is nearby
|
||||||
/datum/ai_planning_subtree/simple_find_target/not_while_observed
|
/datum/ai_planning_subtree/simple_find_target/not_while_observed
|
||||||
|
|||||||
@@ -3,4 +3,4 @@
|
|||||||
|
|
||||||
/datum/ai_planning_subtree/simple_find_wounded_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
/datum/ai_planning_subtree/simple_find_wounded_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||||
. = ..()
|
. = ..()
|
||||||
controller.queue_behavior(/datum/ai_behavior/find_potential_targets/most_wounded, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
|
controller.queue_behavior(/datum/ai_behavior/find_potential_targets/most_wounded, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
/datum/ai_planning_subtree/target_retaliate
|
/datum/ai_planning_subtree/target_retaliate
|
||||||
operational_datums = list(/datum/element/ai_retaliate, /datum/component/ai_retaliate_advanced)
|
operational_datums = list(/datum/element/ai_retaliate, /datum/component/ai_retaliate_advanced)
|
||||||
/// Blackboard key which tells us how to select valid targets
|
/// Blackboard key which tells us how to select valid targets
|
||||||
var/targetting_datum_key = BB_TARGETTING_DATUM
|
var/targeting_strategy_key = BB_TARGETING_STRATEGY
|
||||||
/// Blackboard key in which to store selected target
|
/// Blackboard key in which to store selected target
|
||||||
var/target_key = BB_BASIC_MOB_CURRENT_TARGET
|
var/target_key = BB_BASIC_MOB_CURRENT_TARGET
|
||||||
/// Blackboard key in which to store selected target's hiding place
|
/// Blackboard key in which to store selected target's hiding place
|
||||||
@@ -12,16 +12,16 @@
|
|||||||
|
|
||||||
/datum/ai_planning_subtree/target_retaliate/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
/datum/ai_planning_subtree/target_retaliate/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||||
. = ..()
|
. = ..()
|
||||||
controller.queue_behavior(/datum/ai_behavior/target_from_retaliate_list, BB_BASIC_MOB_RETALIATE_LIST, target_key, targetting_datum_key, hiding_place_key, check_faction)
|
controller.queue_behavior(/datum/ai_behavior/target_from_retaliate_list, BB_BASIC_MOB_RETALIATE_LIST, target_key, targeting_strategy_key, hiding_place_key, check_faction)
|
||||||
|
|
||||||
/datum/ai_planning_subtree/target_retaliate/check_faction
|
/datum/ai_planning_subtree/target_retaliate/check_faction
|
||||||
check_faction = TRUE
|
check_faction = TRUE
|
||||||
|
|
||||||
/// Places a mob which you can see and who has recently attacked you into some 'run away from this' AI keys
|
/// Places a mob which you can see and who has recently attacked you into some 'run away from this' AI keys
|
||||||
/// Can use a different targetting datum than you use to select attack targets
|
/// Can use a different targeting strategy than you use to select attack targets
|
||||||
/// Not required if fleeing is the only target behaviour or uses the same target datum
|
/// Not required if fleeing is the only target behaviour or uses the same target datum
|
||||||
/datum/ai_planning_subtree/target_retaliate/to_flee
|
/datum/ai_planning_subtree/target_retaliate/to_flee
|
||||||
targetting_datum_key = BB_FLEE_TARGETTING_DATUM
|
targeting_strategy_key = BB_FLEE_TARGETING_STRATEGY
|
||||||
target_key = BB_BASIC_MOB_FLEE_TARGET
|
target_key = BB_BASIC_MOB_FLEE_TARGET
|
||||||
hiding_place_key = BB_BASIC_MOB_FLEE_TARGET_HIDING_LOCATION
|
hiding_place_key = BB_BASIC_MOB_FLEE_TARGET_HIDING_LOCATION
|
||||||
|
|
||||||
@@ -34,11 +34,11 @@
|
|||||||
/// How far can we see stuff?
|
/// How far can we see stuff?
|
||||||
var/vision_range = 9
|
var/vision_range = 9
|
||||||
|
|
||||||
/datum/ai_behavior/target_from_retaliate_list/perform(seconds_per_tick, datum/ai_controller/controller, shitlist_key, target_key, targetting_datum_key, hiding_location_key, check_faction)
|
/datum/ai_behavior/target_from_retaliate_list/perform(seconds_per_tick, datum/ai_controller/controller, shitlist_key, target_key, targeting_strategy_key, hiding_location_key, check_faction)
|
||||||
. = ..()
|
. = ..()
|
||||||
var/mob/living/living_mob = controller.pawn
|
var/mob/living/living_mob = controller.pawn
|
||||||
var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key]
|
var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
|
||||||
if(!targetting_datum)
|
if(!targeting_strategy)
|
||||||
CRASH("No target datum was supplied in the blackboard for [controller.pawn]")
|
CRASH("No target datum was supplied in the blackboard for [controller.pawn]")
|
||||||
|
|
||||||
var/list/shitlist = controller.blackboard[shitlist_key]
|
var/list/shitlist = controller.blackboard[shitlist_key]
|
||||||
@@ -47,13 +47,13 @@
|
|||||||
if (!check_faction)
|
if (!check_faction)
|
||||||
controller.set_blackboard_key(BB_TEMPORARILY_IGNORE_FACTION, TRUE)
|
controller.set_blackboard_key(BB_TEMPORARILY_IGNORE_FACTION, TRUE)
|
||||||
|
|
||||||
if (!QDELETED(existing_target) && (locate(existing_target) in shitlist) && targetting_datum.can_attack(living_mob, existing_target, vision_range))
|
if (!QDELETED(existing_target) && (locate(existing_target) in shitlist) && targeting_strategy.can_attack(living_mob, existing_target, vision_range))
|
||||||
finish_action(controller, succeeded = TRUE, check_faction = check_faction)
|
finish_action(controller, succeeded = TRUE, check_faction = check_faction)
|
||||||
return
|
return
|
||||||
|
|
||||||
var/list/enemies_list = list()
|
var/list/enemies_list = list()
|
||||||
for(var/mob/living/potential_target as anything in shitlist)
|
for(var/mob/living/potential_target as anything in shitlist)
|
||||||
if(!targetting_datum.can_attack(living_mob, potential_target, vision_range))
|
if(!targeting_strategy.can_attack(living_mob, potential_target, vision_range))
|
||||||
continue
|
continue
|
||||||
enemies_list += potential_target
|
enemies_list += potential_target
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
var/atom/new_target = pick_final_target(controller, enemies_list)
|
var/atom/new_target = pick_final_target(controller, enemies_list)
|
||||||
controller.set_blackboard_key(target_key, new_target)
|
controller.set_blackboard_key(target_key, new_target)
|
||||||
|
|
||||||
var/atom/potential_hiding_location = targetting_datum.find_hidden_mobs(living_mob, new_target)
|
var/atom/potential_hiding_location = targeting_strategy.find_hidden_mobs(living_mob, new_target)
|
||||||
|
|
||||||
if(potential_hiding_location) //If they're hiding inside of something, we need to know so we can go for that instead initially.
|
if(potential_hiding_location) //If they're hiding inside of something, we need to know so we can go for that instead initially.
|
||||||
controller.set_blackboard_key(hiding_location_key, potential_hiding_location)
|
controller.set_blackboard_key(hiding_location_key, potential_hiding_location)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/// The most basic AI tree which just finds a guy and then runs at them to click them
|
/// The most basic AI tree which just finds a guy and then runs at them to click them
|
||||||
/datum/ai_controller/basic_controller/simple_hostile
|
/datum/ai_controller/basic_controller/simple_hostile
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_movement = /datum/ai_movement/basic_avoidance
|
ai_movement = /datum/ai_movement/basic_avoidance
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
/// Find a target, walk at target, attack intervening obstacles
|
/// Find a target, walk at target, attack intervening obstacles
|
||||||
/datum/ai_controller/basic_controller/simple_hostile_obstacles
|
/datum/ai_controller/basic_controller/simple_hostile_obstacles
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_movement = /datum/ai_movement/basic_avoidance
|
ai_movement = /datum/ai_movement/basic_avoidance
|
||||||
|
|||||||
@@ -1,18 +1,19 @@
|
|||||||
///Datum for basic mobs to define what they can attack.
|
///Datum for basic mobs to define what they can attack.GET_TARGETING_STRATEGY\((/[^,]*)\),
|
||||||
/datum/targetting_datum
|
///Global, just like ai_behaviors
|
||||||
|
/datum/targeting_strategy
|
||||||
|
|
||||||
///Returns true or false depending on if the target can be attacked by the mob
|
///Returns true or false depending on if the target can be attacked by the mob
|
||||||
/datum/targetting_datum/proc/can_attack(mob/living/living_mob, atom/target, vision_range)
|
/datum/targeting_strategy/proc/can_attack(mob/living/living_mob, atom/target, vision_range)
|
||||||
return
|
return
|
||||||
|
|
||||||
///Returns something the target might be hiding inside of
|
///Returns something the target might be hiding inside of
|
||||||
/datum/targetting_datum/proc/find_hidden_mobs(mob/living/living_mob, atom/target)
|
/datum/targeting_strategy/proc/find_hidden_mobs(mob/living/living_mob, atom/target)
|
||||||
var/atom/target_hiding_location
|
var/atom/target_hiding_location
|
||||||
if(istype(target.loc, /obj/structure/closet) || istype(target.loc, /obj/machinery/disposal) || istype(target.loc, /obj/machinery/sleeper))
|
if(istype(target.loc, /obj/structure/closet) || istype(target.loc, /obj/machinery/disposal) || istype(target.loc, /obj/machinery/sleeper))
|
||||||
target_hiding_location = target.loc
|
target_hiding_location = target.loc
|
||||||
return target_hiding_location
|
return target_hiding_location
|
||||||
|
|
||||||
/datum/targetting_datum/basic
|
/datum/targeting_strategy/basic
|
||||||
/// When we do our basic faction check, do we look for exact faction matches?
|
/// When we do our basic faction check, do we look for exact faction matches?
|
||||||
var/check_factions_exactly = FALSE
|
var/check_factions_exactly = FALSE
|
||||||
/// Whether we care for seeing the target or not
|
/// Whether we care for seeing the target or not
|
||||||
@@ -22,7 +23,7 @@
|
|||||||
/// If this blackboard key is TRUE, makes us only target wounded mobs
|
/// If this blackboard key is TRUE, makes us only target wounded mobs
|
||||||
var/target_wounded_key
|
var/target_wounded_key
|
||||||
|
|
||||||
/datum/targetting_datum/basic/can_attack(mob/living/living_mob, atom/the_target, vision_range)
|
/datum/targeting_strategy/basic/can_attack(mob/living/living_mob, atom/the_target, vision_range)
|
||||||
var/datum/ai_controller/basic_controller/our_controller = living_mob.ai_controller
|
var/datum/ai_controller/basic_controller/our_controller = living_mob.ai_controller
|
||||||
|
|
||||||
if(isnull(our_controller))
|
if(isnull(our_controller))
|
||||||
@@ -82,29 +83,29 @@
|
|||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
/// Returns true if the mob and target share factions
|
/// Returns true if the mob and target share factions
|
||||||
/datum/targetting_datum/basic/proc/faction_check(datum/ai_controller/controller, mob/living/living_mob, mob/living/the_target)
|
/datum/targeting_strategy/basic/proc/faction_check(datum/ai_controller/controller, mob/living/living_mob, mob/living/the_target)
|
||||||
if (controller.blackboard[BB_ALWAYS_IGNORE_FACTION] || controller.blackboard[BB_TEMPORARILY_IGNORE_FACTION])
|
if (controller.blackboard[BB_ALWAYS_IGNORE_FACTION] || controller.blackboard[BB_TEMPORARILY_IGNORE_FACTION])
|
||||||
return FALSE
|
return FALSE
|
||||||
return living_mob.faction_check_atom(the_target, exact_match = check_factions_exactly)
|
return living_mob.faction_check_atom(the_target, exact_match = check_factions_exactly)
|
||||||
|
|
||||||
/// Subtype more forgiving for items.
|
/// Subtype more forgiving for items.
|
||||||
/// Careful, this can go wrong and keep a mob hyper-focused on an item it can't lose aggro on
|
/// Careful, this can go wrong and keep a mob hyper-focused on an item it can't lose aggro on
|
||||||
/datum/targetting_datum/basic/allow_items
|
/datum/targeting_strategy/basic/allow_items
|
||||||
|
|
||||||
/datum/targetting_datum/basic/allow_items/can_attack(mob/living/living_mob, atom/the_target, vision_range)
|
/datum/targeting_strategy/basic/allow_items/can_attack(mob/living/living_mob, atom/the_target, vision_range)
|
||||||
. = ..()
|
. = ..()
|
||||||
if(isitem(the_target))
|
if(isitem(the_target))
|
||||||
// trust fall exercise
|
// trust fall exercise
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
/// Subtype which searches for mobs of a size relative to ours
|
/// Subtype which searches for mobs of a size relative to ours
|
||||||
/datum/targetting_datum/basic/of_size
|
/datum/targeting_strategy/basic/of_size
|
||||||
/// If true, we will return mobs which are smaller than us. If false, larger.
|
/// If true, we will return mobs which are smaller than us. If false, larger.
|
||||||
var/find_smaller = TRUE
|
var/find_smaller = TRUE
|
||||||
/// If true, we will return mobs which are the same size as us.
|
/// If true, we will return mobs which are the same size as us.
|
||||||
var/inclusive = TRUE
|
var/inclusive = TRUE
|
||||||
|
|
||||||
/datum/targetting_datum/basic/of_size/can_attack(mob/living/owner, atom/target, vision_range)
|
/datum/targeting_strategy/basic/of_size/can_attack(mob/living/owner, atom/target, vision_range)
|
||||||
if(!isliving(target))
|
if(!isliving(target))
|
||||||
return FALSE
|
return FALSE
|
||||||
. = ..()
|
. = ..()
|
||||||
@@ -119,14 +120,14 @@
|
|||||||
return !find_smaller
|
return !find_smaller
|
||||||
|
|
||||||
// This is just using the default values but the subtype makes it clearer
|
// This is just using the default values but the subtype makes it clearer
|
||||||
/datum/targetting_datum/basic/of_size/ours_or_smaller
|
/datum/targeting_strategy/basic/of_size/ours_or_smaller
|
||||||
|
|
||||||
/datum/targetting_datum/basic/of_size/larger
|
/datum/targeting_strategy/basic/of_size/larger
|
||||||
find_smaller = FALSE
|
find_smaller = FALSE
|
||||||
inclusive = FALSE
|
inclusive = FALSE
|
||||||
|
|
||||||
/// Makes the mob only attack their own faction. Useful mostly if their attacks do something helpful (e.g. healing touch).
|
/// Makes the mob only attack their own faction. Useful mostly if their attacks do something helpful (e.g. healing touch).
|
||||||
/datum/targetting_datum/basic/same_faction
|
/datum/targeting_strategy/basic/same_faction
|
||||||
|
|
||||||
/datum/targetting_datum/basic/same_faction/faction_check(mob/living/living_mob, mob/living/the_target)
|
/datum/targeting_strategy/basic/same_faction/faction_check(mob/living/living_mob, mob/living/the_target)
|
||||||
return !..() // inverts logic to ONLY target mobs that share a faction
|
return !..() // inverts logic to ONLY target mobs that share a faction
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
/// Don't target an atom in our friends list (or turfs), anything else is fair game
|
/// Don't target an atom in our friends list (or turfs), anything else is fair game
|
||||||
/datum/targetting_datum/basic/not_friends
|
/datum/targeting_strategy/basic/not_friends
|
||||||
/// Stop regarding someone as a valid target once they pass this stat level, setting it to DEAD means you will happily attack corpses
|
/// Stop regarding someone as a valid target once they pass this stat level, setting it to DEAD means you will happily attack corpses
|
||||||
var/attack_until_past_stat = HARD_CRIT
|
var/attack_until_past_stat = HARD_CRIT
|
||||||
/// If we can try to closed turfs or not
|
/// If we can try to closed turfs or not
|
||||||
var/attack_closed_turf = FALSE
|
var/attack_closed_turf = FALSE
|
||||||
|
|
||||||
///Returns true or false depending on if the target can be attacked by the mob
|
///Returns true or false depending on if the target can be attacked by the mob
|
||||||
/datum/targetting_datum/basic/not_friends/can_attack(mob/living/living_mob, atom/target, vision_range)
|
/datum/targeting_strategy/basic/not_friends/can_attack(mob/living/living_mob, atom/target, vision_range)
|
||||||
if(attack_closed_turf && isclosedturf(target))
|
if(attack_closed_turf && isclosedturf(target))
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
@@ -16,16 +16,16 @@
|
|||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
///friends dont care about factions
|
///friends dont care about factions
|
||||||
/datum/targetting_datum/basic/not_friends/faction_check(mob/living/living_mob, mob/living/the_target)
|
/datum/targeting_strategy/basic/not_friends/faction_check(mob/living/living_mob, mob/living/the_target)
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
/datum/targetting_datum/basic/not_friends/attack_closed_turfs
|
/datum/targeting_strategy/basic/not_friends/attack_closed_turfs
|
||||||
attack_closed_turf = TRUE
|
attack_closed_turf = TRUE
|
||||||
|
|
||||||
/// Subtype that allows us to target items while deftly avoiding attacking our allies. Be careful when it comes to targetting items as an AI could get trapped targetting something it can't destroy.
|
/// Subtype that allows us to target items while deftly avoiding attacking our allies. Be careful when it comes to targeting items as an AI could get trapped targeting something it can't destroy.
|
||||||
/datum/targetting_datum/basic/not_friends/allow_items
|
/datum/targeting_strategy/basic/not_friends/allow_items
|
||||||
|
|
||||||
/datum/targetting_datum/basic/not_friends/allow_items/can_attack(mob/living/living_mob, atom/the_target, vision_range)
|
/datum/targeting_strategy/basic/not_friends/allow_items/can_attack(mob/living/living_mob, atom/the_target, vision_range)
|
||||||
. = ..()
|
. = ..()
|
||||||
if(isitem(the_target))
|
if(isitem(the_target))
|
||||||
// trust fall exercise
|
// trust fall exercise
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* Find mobs who are holding the bb configurable object type
|
||||||
|
*
|
||||||
|
* This is an extension of basic targeting behaviour, that allows you to
|
||||||
|
* only target the mob if they have a specific item in their hand.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
/datum/targeting_strategy/basic/holding_object
|
||||||
|
/// BB key that holds the target typepath to use
|
||||||
|
var/target_item_key = BB_TARGET_HELD_ITEM
|
||||||
|
|
||||||
|
///Returns true or false depending on if the target can be attacked by the mob
|
||||||
|
/datum/targeting_strategy/basic/holding_object/can_attack(mob/living/living_mob, atom/target, vision_range)
|
||||||
|
var/datum/ai_controller/controller = living_mob.ai_controller
|
||||||
|
var/object_type_path = controller.blackboard[target_item_key]
|
||||||
|
|
||||||
|
if (object_type_path == null)
|
||||||
|
return FALSE // no op
|
||||||
|
if(!ismob(target))
|
||||||
|
return FALSE // no hands no problems
|
||||||
|
|
||||||
|
// Look at me, type casting like a grown up
|
||||||
|
var/mob/targetmob = target
|
||||||
|
// Check if our parent behaviour agrees we can attack this target (we ignore faction by default)
|
||||||
|
var/can_attack = ..()
|
||||||
|
if(can_attack && targetmob.is_holding_item_of_type(object_type_path))
|
||||||
|
return TRUE // they have the item
|
||||||
|
// No valid target
|
||||||
|
return FALSE
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/**
|
|
||||||
* Find mobs who are holding the configurable object type
|
|
||||||
*
|
|
||||||
* This is an extension of basic targeting behaviour, that allows you to
|
|
||||||
* only target the mob if they have a specific item in their hand.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
/datum/targetting_datum/basic/holding_object
|
|
||||||
// We will find mobs who are holding this object in their hands
|
|
||||||
var/object_type_path = null
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create an instance of the holding object targeting datum
|
|
||||||
*
|
|
||||||
* * object_type_path Pass an object type path, this will be compared to the items
|
|
||||||
* in targets hands to filter the target list.
|
|
||||||
*/
|
|
||||||
/datum/targetting_datum/basic/holding_object/New(object_type_path)
|
|
||||||
if (!ispath(object_type_path))
|
|
||||||
stack_trace("trying to create an item targeting datum with no valid typepath")
|
|
||||||
// Leaving object type as null will make this basically a noop
|
|
||||||
return
|
|
||||||
src.object_type_path = object_type_path
|
|
||||||
|
|
||||||
///Returns true or false depending on if the target can be attacked by the mob
|
|
||||||
/datum/targetting_datum/basic/holding_object/can_attack(mob/living/living_mob, atom/target, vision_range)
|
|
||||||
if (object_type_path == null)
|
|
||||||
return FALSE // no op
|
|
||||||
if(!ismob(target))
|
|
||||||
return FALSE // no hands no problems
|
|
||||||
|
|
||||||
// Look at me, type casting like a grown up
|
|
||||||
var/mob/targetmob = target
|
|
||||||
// Check if our parent behaviour agrees we can attack this target (we ignore faction by default)
|
|
||||||
var/can_attack = ..()
|
|
||||||
if(can_attack && targetmob.is_holding_item_of_type(object_type_path))
|
|
||||||
return TRUE // they have the item
|
|
||||||
// No valid target
|
|
||||||
return FALSE
|
|
||||||
@@ -7,18 +7,18 @@
|
|||||||
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM
|
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM
|
||||||
required_distance = 3
|
required_distance = 3
|
||||||
|
|
||||||
/datum/ai_behavior/basic_melee_attack/dog/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key)
|
/datum/ai_behavior/basic_melee_attack/dog/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
|
||||||
controller.behavior_cooldowns[src] = world.time + action_cooldown
|
controller.behavior_cooldowns[src] = world.time + action_cooldown
|
||||||
var/mob/living/living_pawn = controller.pawn
|
var/mob/living/living_pawn = controller.pawn
|
||||||
if(!(isturf(living_pawn.loc) || HAS_TRAIT(living_pawn, TRAIT_AI_BAGATTACK))) // Void puppies can attack from inside bags
|
if(!(isturf(living_pawn.loc) || HAS_TRAIT(living_pawn, TRAIT_AI_BAGATTACK))) // Void puppies can attack from inside bags
|
||||||
finish_action(controller, FALSE, target_key, targetting_datum_key, hiding_location_key)
|
finish_action(controller, FALSE, target_key, targeting_strategy_key, hiding_location_key)
|
||||||
return
|
return
|
||||||
|
|
||||||
// Unfortunately going to repeat this check in parent call but what can you do
|
// Unfortunately going to repeat this check in parent call but what can you do
|
||||||
var/atom/target = controller.blackboard[target_key]
|
var/atom/target = controller.blackboard[target_key]
|
||||||
var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key]
|
var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
|
||||||
if (!targetting_datum.can_attack(living_pawn, target))
|
if (!targeting_strategy.can_attack(living_pawn, target))
|
||||||
finish_action(controller, FALSE, target_key, targetting_datum_key, hiding_location_key)
|
finish_action(controller, FALSE, target_key, targeting_strategy_key, hiding_location_key)
|
||||||
return
|
return
|
||||||
|
|
||||||
if (!living_pawn.Adjacent(target))
|
if (!living_pawn.Adjacent(target))
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_DOG_HARASS_HARM = TRUE,
|
BB_DOG_HARASS_HARM = TRUE,
|
||||||
BB_VISION_RANGE = AI_DOG_VISION_RANGE,
|
BB_VISION_RANGE = AI_DOG_VISION_RANGE,
|
||||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
|
||||||
)
|
)
|
||||||
ai_movement = /datum/ai_movement/basic_avoidance
|
ai_movement = /datum/ai_movement/basic_avoidance
|
||||||
idle_behavior = /datum/idle_behavior/idle_dog
|
idle_behavior = /datum/idle_behavior/idle_dog
|
||||||
@@ -19,9 +19,11 @@
|
|||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_DOG_HARASS_HARM = TRUE,
|
BB_DOG_HARASS_HARM = TRUE,
|
||||||
BB_VISION_RANGE = AI_DOG_VISION_RANGE,
|
BB_VISION_RANGE = AI_DOG_VISION_RANGE,
|
||||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
|
||||||
// Find nearby mobs with tongs in hand.
|
// Find nearby mobs ...
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/holding_object(/obj/item/kitchen/tongs),
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/holding_object,
|
||||||
|
// With tongs in hand!
|
||||||
|
BB_TARGET_HELD_ITEM = /obj/item/kitchen/tongs,
|
||||||
BB_BABIES_PARTNER_TYPES = list(/mob/living/basic/pet/dog),
|
BB_BABIES_PARTNER_TYPES = list(/mob/living/basic/pet/dog),
|
||||||
BB_BABIES_CHILD_TYPES = list(/mob/living/basic/pet/dog/corgi/puppy = 95, /mob/living/basic/pet/dog/corgi/puppy/void = 5),
|
BB_BABIES_CHILD_TYPES = list(/mob/living/basic/pet/dog/corgi/puppy = 95, /mob/living/basic/pet/dog/corgi/puppy/void = 5),
|
||||||
)
|
)
|
||||||
@@ -31,7 +33,7 @@
|
|||||||
/datum/ai_planning_subtree/make_babies, // Ian WILL prioritise sex over following your instructions
|
/datum/ai_planning_subtree/make_babies, // Ian WILL prioritise sex over following your instructions
|
||||||
/datum/ai_planning_subtree/pet_planning,
|
/datum/ai_planning_subtree/pet_planning,
|
||||||
/datum/ai_planning_subtree/dog_harassment,
|
/datum/ai_planning_subtree/dog_harassment,
|
||||||
// Find targets to run away from (uses the targetting datum from above)
|
// Find targets to run away from (uses the targeting strategy from above)
|
||||||
/datum/ai_planning_subtree/simple_find_target,
|
/datum/ai_planning_subtree/simple_find_target,
|
||||||
// Flee from that target
|
// Flee from that target
|
||||||
/datum/ai_planning_subtree/flee_target,
|
/datum/ai_planning_subtree/flee_target,
|
||||||
|
|||||||
@@ -4,27 +4,27 @@
|
|||||||
/datum/ai_planning_subtree/dog_harassment/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
/datum/ai_planning_subtree/dog_harassment/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||||
if(!SPT_PROB(10, seconds_per_tick))
|
if(!SPT_PROB(10, seconds_per_tick))
|
||||||
return
|
return
|
||||||
controller.queue_behavior(/datum/ai_behavior/find_hated_dog_target, BB_DOG_HARASS_TARGET, BB_PET_TARGETTING_DATUM)
|
controller.queue_behavior(/datum/ai_behavior/find_hated_dog_target, BB_DOG_HARASS_TARGET, BB_PET_TARGETING_STRATEGY)
|
||||||
var/atom/harass_target = controller.blackboard[BB_DOG_HARASS_TARGET]
|
var/atom/harass_target = controller.blackboard[BB_DOG_HARASS_TARGET]
|
||||||
if (isnull(harass_target))
|
if (isnull(harass_target))
|
||||||
return
|
return
|
||||||
|
|
||||||
controller.queue_behavior(/datum/ai_behavior/basic_melee_attack/dog, BB_DOG_HARASS_TARGET, BB_PET_TARGETTING_DATUM)
|
controller.queue_behavior(/datum/ai_behavior/basic_melee_attack/dog, BB_DOG_HARASS_TARGET, BB_PET_TARGETING_STRATEGY)
|
||||||
return SUBTREE_RETURN_FINISH_PLANNING
|
return SUBTREE_RETURN_FINISH_PLANNING
|
||||||
|
|
||||||
/datum/ai_behavior/find_hated_dog_target
|
/datum/ai_behavior/find_hated_dog_target
|
||||||
|
|
||||||
/datum/ai_behavior/find_hated_dog_target/setup(datum/ai_controller/controller, target_key, targetting_datum_key)
|
/datum/ai_behavior/find_hated_dog_target/setup(datum/ai_controller/controller, target_key, targeting_strategy_key)
|
||||||
. = ..()
|
. = ..()
|
||||||
var/mob/living/dog = controller.pawn
|
var/mob/living/dog = controller.pawn
|
||||||
var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key]
|
var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
|
||||||
for(var/mob/living/iter_living in oview(2, dog))
|
for(var/mob/living/iter_living in oview(2, dog))
|
||||||
if(iter_living.stat != CONSCIOUS || !HAS_TRAIT(iter_living, TRAIT_HATED_BY_DOGS))
|
if(iter_living.stat != CONSCIOUS || !HAS_TRAIT(iter_living, TRAIT_HATED_BY_DOGS))
|
||||||
continue
|
continue
|
||||||
if(!isnull(dog.buckled))
|
if(!isnull(dog.buckled))
|
||||||
dog.audible_message(span_notice("[dog] growls at [iter_living], yet [dog.p_they()] [dog.p_are()] much too comfy to move."), hearing_distance = COMBAT_MESSAGE_RANGE)
|
dog.audible_message(span_notice("[dog] growls at [iter_living], yet [dog.p_they()] [dog.p_are()] much too comfy to move."), hearing_distance = COMBAT_MESSAGE_RANGE)
|
||||||
continue
|
continue
|
||||||
if(!targetting_datum.can_attack(dog, iter_living))
|
if(!targeting_strategy.can_attack(dog, iter_living))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
dog.audible_message(span_warning("[dog] growls at [iter_living], seemingly annoyed by [iter_living.p_their()] presence."), hearing_distance = COMBAT_MESSAGE_RANGE)
|
dog.audible_message(span_warning("[dog] growls at [iter_living], seemingly annoyed by [iter_living.p_their()] presence."), hearing_distance = COMBAT_MESSAGE_RANGE)
|
||||||
|
|||||||
@@ -26,8 +26,8 @@
|
|||||||
var/valid_biotypes
|
var/valid_biotypes
|
||||||
/// Which kinds of carbon limbs can we heal, has no effect on non-carbon mobs. Set to null if you don't care about excluding prosthetics.
|
/// Which kinds of carbon limbs can we heal, has no effect on non-carbon mobs. Set to null if you don't care about excluding prosthetics.
|
||||||
var/required_bodytype
|
var/required_bodytype
|
||||||
/// How targetting yourself works, expects one of HEALING_TOUCH_ANYONE, HEALING_TOUCH_NOT_SELF, or HEALING_TOUCH_SELF_ONLY
|
/// How targeting yourself works, expects one of HEALING_TOUCH_ANYONE, HEALING_TOUCH_NOT_SELF, or HEALING_TOUCH_SELF_ONLY
|
||||||
var/self_targetting
|
var/self_targeting
|
||||||
/// Text to print when action starts, replaces %SOURCE% with healer and %TARGET% with healed mob
|
/// Text to print when action starts, replaces %SOURCE% with healer and %TARGET% with healed mob
|
||||||
var/action_text
|
var/action_text
|
||||||
/// Text to print when action completes, replaces %SOURCE% with healer and %TARGET% with healed mob
|
/// Text to print when action completes, replaces %SOURCE% with healer and %TARGET% with healed mob
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
list/valid_targets_typecache = list(),
|
list/valid_targets_typecache = list(),
|
||||||
valid_biotypes = MOB_ORGANIC | MOB_MINERAL,
|
valid_biotypes = MOB_ORGANIC | MOB_MINERAL,
|
||||||
required_bodytype = BODYTYPE_ORGANIC,
|
required_bodytype = BODYTYPE_ORGANIC,
|
||||||
self_targetting = HEALING_TOUCH_NOT_SELF,
|
self_targeting = HEALING_TOUCH_NOT_SELF,
|
||||||
action_text = "%SOURCE% begins healing %TARGET%",
|
action_text = "%SOURCE% begins healing %TARGET%",
|
||||||
complete_text = "%SOURCE% finishes healing %TARGET%",
|
complete_text = "%SOURCE% finishes healing %TARGET%",
|
||||||
show_health = FALSE,
|
show_health = FALSE,
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
src.valid_targets_typecache = valid_targets_typecache.Copy()
|
src.valid_targets_typecache = valid_targets_typecache.Copy()
|
||||||
src.valid_biotypes = valid_biotypes
|
src.valid_biotypes = valid_biotypes
|
||||||
src.required_bodytype = required_bodytype
|
src.required_bodytype = required_bodytype
|
||||||
src.self_targetting = self_targetting
|
src.self_targeting = self_targeting
|
||||||
src.action_text = action_text
|
src.action_text = action_text
|
||||||
src.complete_text = complete_text
|
src.complete_text = complete_text
|
||||||
src.show_health = show_health
|
src.show_health = show_health
|
||||||
@@ -98,7 +98,7 @@
|
|||||||
healer.balloon_alert(healer, "busy!")
|
healer.balloon_alert(healer, "busy!")
|
||||||
return COMPONENT_CANCEL_ATTACK_CHAIN
|
return COMPONENT_CANCEL_ATTACK_CHAIN
|
||||||
|
|
||||||
switch (self_targetting)
|
switch (self_targeting)
|
||||||
if (HEALING_TOUCH_NOT_SELF)
|
if (HEALING_TOUCH_NOT_SELF)
|
||||||
if (target == healer)
|
if (target == healer)
|
||||||
healer.balloon_alert(healer, "can't heal yourself!")
|
healer.balloon_alert(healer, "can't heal yourself!")
|
||||||
|
|||||||
@@ -8,13 +8,13 @@
|
|||||||
*/
|
*/
|
||||||
/datum/component/lock_on_cursor
|
/datum/component/lock_on_cursor
|
||||||
dupe_mode = COMPONENT_DUPE_ALLOWED
|
dupe_mode = COMPONENT_DUPE_ALLOWED
|
||||||
/// Appearance to overlay onto whatever we are targetting
|
/// Appearance to overlay onto whatever we are targeting
|
||||||
var/mutable_appearance/lock_appearance
|
var/mutable_appearance/lock_appearance
|
||||||
/// Current images we are displaying to the client
|
/// Current images we are displaying to the client
|
||||||
var/list/image/lock_images
|
var/list/image/lock_images
|
||||||
/// Typecache of things we are allowed to target
|
/// Typecache of things we are allowed to target
|
||||||
var/list/target_typecache
|
var/list/target_typecache
|
||||||
/// Cache of weakrefs to ignore targetting formatted as `list(weakref = TRUE)`
|
/// Cache of weakrefs to ignore targeting formatted as `list(weakref = TRUE)`
|
||||||
var/list/immune_weakrefs
|
var/list/immune_weakrefs
|
||||||
/// Number of things we can target at once
|
/// Number of things we can target at once
|
||||||
var/lock_amount
|
var/lock_amount
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
* Watch for someone throwing or pointing at something and then go get it and bring it back.
|
* Watch for someone throwing or pointing at something and then go get it and bring it back.
|
||||||
* If it's food we might eat it instead.
|
* If it's food we might eat it instead.
|
||||||
*/
|
*/
|
||||||
/datum/pet_command/point_targetting/fetch
|
/datum/pet_command/point_targeting/fetch
|
||||||
command_name = "Fetch"
|
command_name = "Fetch"
|
||||||
command_desc = "Command your pet to retrieve something you throw or point at."
|
command_desc = "Command your pet to retrieve something you throw or point at."
|
||||||
radial_icon = 'icons/mob/actions/actions_spells.dmi'
|
radial_icon = 'icons/mob/actions/actions_spells.dmi'
|
||||||
@@ -16,22 +16,22 @@
|
|||||||
/// If true, this is a poorly trained pet who will eat food you throw instead of bringing it back
|
/// If true, this is a poorly trained pet who will eat food you throw instead of bringing it back
|
||||||
var/will_eat_targets = TRUE
|
var/will_eat_targets = TRUE
|
||||||
|
|
||||||
/datum/pet_command/point_targetting/fetch/New(mob/living/parent)
|
/datum/pet_command/point_targeting/fetch/New(mob/living/parent)
|
||||||
. = ..()
|
. = ..()
|
||||||
if(isnull(parent))
|
if(isnull(parent))
|
||||||
return
|
return
|
||||||
parent.AddElement(/datum/element/ai_held_item) // We don't remove this on destroy because they might still be holding something
|
parent.AddElement(/datum/element/ai_held_item) // We don't remove this on destroy because they might still be holding something
|
||||||
|
|
||||||
/datum/pet_command/point_targetting/fetch/add_new_friend(mob/living/tamer)
|
/datum/pet_command/point_targeting/fetch/add_new_friend(mob/living/tamer)
|
||||||
. = ..()
|
. = ..()
|
||||||
RegisterSignal(tamer, COMSIG_MOB_THROW, PROC_REF(listened_throw))
|
RegisterSignal(tamer, COMSIG_MOB_THROW, PROC_REF(listened_throw))
|
||||||
|
|
||||||
/datum/pet_command/point_targetting/fetch/remove_friend(mob/living/unfriended)
|
/datum/pet_command/point_targeting/fetch/remove_friend(mob/living/unfriended)
|
||||||
. = ..()
|
. = ..()
|
||||||
UnregisterSignal(unfriended, COMSIG_MOB_THROW)
|
UnregisterSignal(unfriended, COMSIG_MOB_THROW)
|
||||||
|
|
||||||
/// A friend has thrown something, if we're listening or at least not busy then go get it
|
/// A friend has thrown something, if we're listening or at least not busy then go get it
|
||||||
/datum/pet_command/point_targetting/fetch/proc/listened_throw(mob/living/carbon/thrower)
|
/datum/pet_command/point_targeting/fetch/proc/listened_throw(mob/living/carbon/thrower)
|
||||||
SIGNAL_HANDLER
|
SIGNAL_HANDLER
|
||||||
|
|
||||||
var/mob/living/parent = weak_parent.resolve()
|
var/mob/living/parent = weak_parent.resolve()
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
RegisterSignal(thrown_thing, COMSIG_MOVABLE_THROW_LANDED, PROC_REF(listen_throw_land))
|
RegisterSignal(thrown_thing, COMSIG_MOVABLE_THROW_LANDED, PROC_REF(listen_throw_land))
|
||||||
|
|
||||||
/// A throw we were listening to has finished, see if it's in range for us to try grabbing it
|
/// A throw we were listening to has finished, see if it's in range for us to try grabbing it
|
||||||
/datum/pet_command/point_targetting/fetch/proc/listen_throw_land(obj/item/thrown_thing, datum/thrownthing/throwing_datum)
|
/datum/pet_command/point_targeting/fetch/proc/listen_throw_land(obj/item/thrown_thing, datum/thrownthing/throwing_datum)
|
||||||
SIGNAL_HANDLER
|
SIGNAL_HANDLER
|
||||||
|
|
||||||
UnregisterSignal(thrown_thing, COMSIG_MOVABLE_THROW_LANDED)
|
UnregisterSignal(thrown_thing, COMSIG_MOVABLE_THROW_LANDED)
|
||||||
@@ -74,7 +74,7 @@
|
|||||||
parent.ai_controller.set_blackboard_key(BB_FETCH_DELIVER_TO, throwing_datum.thrower)
|
parent.ai_controller.set_blackboard_key(BB_FETCH_DELIVER_TO, throwing_datum.thrower)
|
||||||
|
|
||||||
// Don't try and fetch turfs or anchored objects if someone points at them
|
// Don't try and fetch turfs or anchored objects if someone points at them
|
||||||
/datum/pet_command/point_targetting/fetch/look_for_target(mob/living/pointing_friend, obj/item/pointed_atom)
|
/datum/pet_command/point_targeting/fetch/look_for_target(mob/living/pointing_friend, obj/item/pointed_atom)
|
||||||
if (!istype(pointed_atom))
|
if (!istype(pointed_atom))
|
||||||
return FALSE
|
return FALSE
|
||||||
if (pointed_atom.anchored)
|
if (pointed_atom.anchored)
|
||||||
@@ -87,7 +87,7 @@
|
|||||||
parent.ai_controller.set_blackboard_key(BB_FETCH_DELIVER_TO, pointing_friend)
|
parent.ai_controller.set_blackboard_key(BB_FETCH_DELIVER_TO, pointing_friend)
|
||||||
|
|
||||||
// Finally, plan our actions
|
// Finally, plan our actions
|
||||||
/datum/pet_command/point_targetting/fetch/execute_action(datum/ai_controller/controller)
|
/datum/pet_command/point_targeting/fetch/execute_action(datum/ai_controller/controller)
|
||||||
controller.queue_behavior(/datum/ai_behavior/forget_failed_fetches)
|
controller.queue_behavior(/datum/ai_behavior/forget_failed_fetches)
|
||||||
|
|
||||||
var/atom/target = controller.blackboard[BB_CURRENT_PET_TARGET]
|
var/atom/target = controller.blackboard[BB_CURRENT_PET_TARGET]
|
||||||
|
|||||||
@@ -109,25 +109,25 @@
|
|||||||
CRASH("Pet command execute action not implemented.")
|
CRASH("Pet command execute action not implemented.")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* # Point Targetting Pet Command
|
* # Point Targeting Pet Command
|
||||||
* As above but also listens for you pointing at something and marks it as a target
|
* As above but also listens for you pointing at something and marks it as a target
|
||||||
*/
|
*/
|
||||||
/datum/pet_command/point_targetting
|
/datum/pet_command/point_targeting
|
||||||
/// Text describing an action we perform upon receiving a new target
|
/// Text describing an action we perform upon receiving a new target
|
||||||
var/pointed_reaction
|
var/pointed_reaction
|
||||||
/// Blackboard key for targetting datum, this is likely going to need it
|
/// Blackboard key for targeting strategy, this is likely going to need it
|
||||||
var/targetting_datum_key = BB_PET_TARGETTING_DATUM
|
var/targeting_strategy_key = BB_PET_TARGETING_STRATEGY
|
||||||
|
|
||||||
/datum/pet_command/point_targetting/add_new_friend(mob/living/tamer)
|
/datum/pet_command/point_targeting/add_new_friend(mob/living/tamer)
|
||||||
. = ..()
|
. = ..()
|
||||||
RegisterSignal(tamer, COMSIG_MOB_POINTED, PROC_REF(look_for_target))
|
RegisterSignal(tamer, COMSIG_MOB_POINTED, PROC_REF(look_for_target))
|
||||||
|
|
||||||
/datum/pet_command/point_targetting/remove_friend(mob/living/unfriended)
|
/datum/pet_command/point_targeting/remove_friend(mob/living/unfriended)
|
||||||
. = ..()
|
. = ..()
|
||||||
UnregisterSignal(unfriended, COMSIG_MOB_POINTED)
|
UnregisterSignal(unfriended, COMSIG_MOB_POINTED)
|
||||||
|
|
||||||
/// Target the pointed atom for actions
|
/// Target the pointed atom for actions
|
||||||
/datum/pet_command/point_targetting/proc/look_for_target(mob/living/friend, atom/pointed_atom)
|
/datum/pet_command/point_targeting/proc/look_for_target(mob/living/friend, atom/pointed_atom)
|
||||||
SIGNAL_HANDLER
|
SIGNAL_HANDLER
|
||||||
|
|
||||||
var/mob/living/parent = weak_parent.resolve()
|
var/mob/living/parent = weak_parent.resolve()
|
||||||
|
|||||||
@@ -118,7 +118,7 @@
|
|||||||
* # Pet Command: Attack
|
* # Pet Command: Attack
|
||||||
* Tells a pet to chase and bite the next thing you point at
|
* Tells a pet to chase and bite the next thing you point at
|
||||||
*/
|
*/
|
||||||
/datum/pet_command/point_targetting/attack
|
/datum/pet_command/point_targeting/attack
|
||||||
command_name = "Attack"
|
command_name = "Attack"
|
||||||
command_desc = "Command your pet to attack things that you point out to it."
|
command_desc = "Command your pet to attack things that you point out to it."
|
||||||
radial_icon = 'icons/effects/effects.dmi'
|
radial_icon = 'icons/effects/effects.dmi'
|
||||||
@@ -133,13 +133,13 @@
|
|||||||
var/attack_behaviour = /datum/ai_behavior/basic_melee_attack
|
var/attack_behaviour = /datum/ai_behavior/basic_melee_attack
|
||||||
|
|
||||||
// Refuse to target things we can't target, chiefly other friends
|
// Refuse to target things we can't target, chiefly other friends
|
||||||
/datum/pet_command/point_targetting/attack/set_command_target(mob/living/parent, atom/target)
|
/datum/pet_command/point_targeting/attack/set_command_target(mob/living/parent, atom/target)
|
||||||
if (!target)
|
if (!target)
|
||||||
return
|
return
|
||||||
var/mob/living/living_parent = parent
|
var/mob/living/living_parent = parent
|
||||||
if (!living_parent.ai_controller)
|
if (!living_parent.ai_controller)
|
||||||
return
|
return
|
||||||
var/datum/targetting_datum/targeter = living_parent.ai_controller.blackboard[targetting_datum_key]
|
var/datum/targeting_strategy/targeter = GET_TARGETING_STRATEGY(living_parent.ai_controller.blackboard[targeting_strategy_key])
|
||||||
if (!targeter)
|
if (!targeter)
|
||||||
return
|
return
|
||||||
if (!targeter.can_attack(living_parent, target))
|
if (!targeter.can_attack(living_parent, target))
|
||||||
@@ -147,21 +147,21 @@
|
|||||||
return
|
return
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
/// Display feedback about not targetting something
|
/// Display feedback about not targeting something
|
||||||
/datum/pet_command/point_targetting/attack/proc/refuse_target(mob/living/parent, atom/target)
|
/datum/pet_command/point_targeting/attack/proc/refuse_target(mob/living/parent, atom/target)
|
||||||
var/mob/living/living_parent = parent
|
var/mob/living/living_parent = parent
|
||||||
living_parent.balloon_alert_to_viewers("[refuse_reaction]")
|
living_parent.balloon_alert_to_viewers("[refuse_reaction]")
|
||||||
living_parent.visible_message(span_notice("[living_parent] refuses to attack [target]."))
|
living_parent.visible_message(span_notice("[living_parent] refuses to attack [target]."))
|
||||||
|
|
||||||
/datum/pet_command/point_targetting/attack/execute_action(datum/ai_controller/controller)
|
/datum/pet_command/point_targeting/attack/execute_action(datum/ai_controller/controller)
|
||||||
controller.queue_behavior(attack_behaviour, BB_CURRENT_PET_TARGET, targetting_datum_key)
|
controller.queue_behavior(attack_behaviour, BB_CURRENT_PET_TARGET, targeting_strategy_key)
|
||||||
return SUBTREE_RETURN_FINISH_PLANNING
|
return SUBTREE_RETURN_FINISH_PLANNING
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* # Pet Command: Targetted Ability
|
* # Pet Command: Targetted Ability
|
||||||
* Tells a pet to use some kind of ability on the next thing you point at
|
* Tells a pet to use some kind of ability on the next thing you point at
|
||||||
*/
|
*/
|
||||||
/datum/pet_command/point_targetting/use_ability
|
/datum/pet_command/point_targeting/use_ability
|
||||||
command_name = "Use ability"
|
command_name = "Use ability"
|
||||||
command_desc = "Command your pet to use one of its special skills on something that you point out to it."
|
command_desc = "Command your pet to use one of its special skills on something that you point out to it."
|
||||||
radial_icon = 'icons/mob/actions/actions_spells.dmi'
|
radial_icon = 'icons/mob/actions/actions_spells.dmi'
|
||||||
@@ -172,7 +172,7 @@
|
|||||||
/// Blackboard key where a reference to some kind of mob ability is stored
|
/// Blackboard key where a reference to some kind of mob ability is stored
|
||||||
var/pet_ability_key
|
var/pet_ability_key
|
||||||
|
|
||||||
/datum/pet_command/point_targetting/use_ability/execute_action(datum/ai_controller/controller)
|
/datum/pet_command/point_targeting/use_ability/execute_action(datum/ai_controller/controller)
|
||||||
if (!pet_ability_key)
|
if (!pet_ability_key)
|
||||||
return
|
return
|
||||||
var/datum/action/cooldown/using_action = controller.blackboard[pet_ability_key]
|
var/datum/action/cooldown/using_action = controller.blackboard[pet_ability_key]
|
||||||
@@ -207,7 +207,7 @@
|
|||||||
if(victim.stat > controller.blackboard[BB_TARGET_MINIMUM_STAT])
|
if(victim.stat > controller.blackboard[BB_TARGET_MINIMUM_STAT])
|
||||||
controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND)
|
controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND)
|
||||||
return
|
return
|
||||||
controller.queue_behavior(protect_behavior, BB_CURRENT_PET_TARGET, BB_PET_TARGETTING_DATUM)
|
controller.queue_behavior(protect_behavior, BB_CURRENT_PET_TARGET, BB_PET_TARGETING_STRATEGY)
|
||||||
return SUBTREE_RETURN_FINISH_PLANNING
|
return SUBTREE_RETURN_FINISH_PLANNING
|
||||||
|
|
||||||
/datum/pet_command/protect_owner/set_command_active(mob/living/parent, mob/living/victim)
|
/datum/pet_command/protect_owner/set_command_active(mob/living/parent, mob/living/victim)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
/// The ability to use when we are attacked
|
/// The ability to use when we are attacked
|
||||||
var/datum/action/cooldown/ability
|
var/datum/action/cooldown/ability
|
||||||
/// Optional datum for validating targets
|
/// Optional datum for validating targets
|
||||||
var/datum/targetting_datum/targetting
|
var/datum/targeting_strategy/targeting
|
||||||
/// Trigger only if target is at least this far away
|
/// Trigger only if target is at least this far away
|
||||||
var/min_range
|
var/min_range
|
||||||
/// Trigger only if target is at least this close
|
/// Trigger only if target is at least this close
|
||||||
@@ -16,12 +16,12 @@
|
|||||||
/// Target the ability at ourself instead of at the offender
|
/// Target the ability at ourself instead of at the offender
|
||||||
var/target_self
|
var/target_self
|
||||||
|
|
||||||
/datum/component/revenge_ability/Initialize(datum/action/cooldown/ability, datum/targetting_datum/targetting, min_range = 0, max_range = INFINITY, target_self = FALSE)
|
/datum/component/revenge_ability/Initialize(datum/action/cooldown/ability, datum/targeting_strategy/targeting, min_range = 0, max_range = INFINITY, target_self = FALSE)
|
||||||
. = ..()
|
. = ..()
|
||||||
if (!isliving(parent))
|
if (!isliving(parent))
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
src.ability = ability
|
src.ability = ability
|
||||||
src.targetting = targetting
|
src.targeting = targeting
|
||||||
src.min_range = min_range
|
src.min_range = min_range
|
||||||
src.max_range = max_range
|
src.max_range = max_range
|
||||||
src.target_self = target_self
|
src.target_self = target_self
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
var/distance = get_dist(ability_user, attacker)
|
var/distance = get_dist(ability_user, attacker)
|
||||||
if (distance < min_range || distance > max_range)
|
if (distance < min_range || distance > max_range)
|
||||||
return
|
return
|
||||||
if (targetting && !targetting.can_attack(victim, attacker))
|
if (targeting && !targeting.can_attack(victim, attacker))
|
||||||
return
|
return
|
||||||
INVOKE_ASYNC(ability, TYPE_PROC_REF(/datum/action/cooldown, InterceptClickOn), ability_user, null, (target_self) ? ability_user : attacker)
|
INVOKE_ASYNC(ability, TYPE_PROC_REF(/datum/action/cooldown, InterceptClickOn), ability_user, null, (target_self) ? ability_user : attacker)
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
. = ..()
|
. = ..()
|
||||||
UnregisterSignal(source, COMSIG_LIVING_UNARMED_ATTACK)
|
UnregisterSignal(source, COMSIG_LIVING_UNARMED_ATTACK)
|
||||||
|
|
||||||
/// If we're targetting an airlock, open it
|
/// If we're targeting an airlock, open it
|
||||||
/datum/element/door_pryer/proc/on_attack(mob/living/basic/attacker, atom/target, proximity_flag)
|
/datum/element/door_pryer/proc/on_attack(mob/living/basic/attacker, atom/target, proximity_flag)
|
||||||
SIGNAL_HANDLER
|
SIGNAL_HANDLER
|
||||||
if(!proximity_flag || !istype(target, /obj/machinery/door/airlock))
|
if(!proximity_flag || !istype(target, /obj/machinery/door/airlock))
|
||||||
|
|||||||
@@ -1221,7 +1221,7 @@
|
|||||||
return src
|
return src
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* tryEmbed() is for when you want to try embedding something without dealing with the damage + hit messages of calling hitby() on the item while targetting the target.
|
* tryEmbed() is for when you want to try embedding something without dealing with the damage + hit messages of calling hitby() on the item while targeting the target.
|
||||||
*
|
*
|
||||||
* Really, this is used mostly with projectiles with shrapnel payloads, from [/datum/element/embed/proc/checkEmbedProjectile], and called on said shrapnel. Mostly acts as an intermediate between different embed elements.
|
* Really, this is used mostly with projectiles with shrapnel payloads, from [/datum/element/embed/proc/checkEmbedProjectile], and called on said shrapnel. Mostly acts as an intermediate between different embed elements.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -42,22 +42,22 @@
|
|||||||
/// Boolean on whether people with chunky fingers can use this baton.
|
/// Boolean on whether people with chunky fingers can use this baton.
|
||||||
var/chunky_finger_usable = FALSE
|
var/chunky_finger_usable = FALSE
|
||||||
|
|
||||||
/// The context to show when the baton is active and targetting a living thing
|
/// The context to show when the baton is active and targeting a living thing
|
||||||
var/context_living_target_active = "Stun"
|
var/context_living_target_active = "Stun"
|
||||||
|
|
||||||
/// The context to show when the baton is active and targetting a living thing in combat mode
|
/// The context to show when the baton is active and targeting a living thing in combat mode
|
||||||
var/context_living_target_active_combat_mode = "Stun"
|
var/context_living_target_active_combat_mode = "Stun"
|
||||||
|
|
||||||
/// The context to show when the baton is inactive and targetting a living thing
|
/// The context to show when the baton is inactive and targeting a living thing
|
||||||
var/context_living_target_inactive = "Prod"
|
var/context_living_target_inactive = "Prod"
|
||||||
|
|
||||||
/// The context to show when the baton is inactive and targetting a living thing in combat mode
|
/// The context to show when the baton is inactive and targeting a living thing in combat mode
|
||||||
var/context_living_target_inactive_combat_mode = "Attack"
|
var/context_living_target_inactive_combat_mode = "Attack"
|
||||||
|
|
||||||
/// The RMB context to show when the baton is active and targetting a living thing
|
/// The RMB context to show when the baton is active and targeting a living thing
|
||||||
var/context_living_rmb_active = "Attack"
|
var/context_living_rmb_active = "Attack"
|
||||||
|
|
||||||
/// The RMB context to show when the baton is inactive and targetting a living thing
|
/// The RMB context to show when the baton is inactive and targeting a living thing
|
||||||
var/context_living_rmb_inactive = "Attack"
|
var/context_living_rmb_inactive = "Attack"
|
||||||
|
|
||||||
/obj/item/melee/baton/Initialize(mapload)
|
/obj/item/melee/baton/Initialize(mapload)
|
||||||
|
|||||||
@@ -248,7 +248,7 @@
|
|||||||
/datum/pet_command/idle,
|
/datum/pet_command/idle,
|
||||||
/datum/pet_command/free,
|
/datum/pet_command/free,
|
||||||
/datum/pet_command/follow,
|
/datum/pet_command/follow,
|
||||||
/datum/pet_command/point_targetting/attack/star_gazer
|
/datum/pet_command/point_targeting/attack/star_gazer
|
||||||
)
|
)
|
||||||
|
|
||||||
/datum/heretic_knowledge/ultimate/cosmic_final/is_valid_sacrifice(mob/living/carbon/human/sacrifice)
|
/datum/heretic_knowledge/ultimate/cosmic_final/is_valid_sacrifice(mob/living/carbon/human/sacrifice)
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
abstract_type = /datum/traitor_objective/destroy_heirloom
|
abstract_type = /datum/traitor_objective/destroy_heirloom
|
||||||
|
|
||||||
/// The jobs that this objective is targetting.
|
/// The jobs that this objective is targeting.
|
||||||
var/list/target_jobs
|
var/list/target_jobs
|
||||||
/// the item we need to destroy
|
/// the item we need to destroy
|
||||||
var/obj/item/target_item
|
var/obj/item/target_item
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
abstract_type = /datum/traitor_objective/target_player/kidnapping
|
abstract_type = /datum/traitor_objective/target_player/kidnapping
|
||||||
|
|
||||||
/// The jobs that this objective is targetting.
|
/// The jobs that this objective is targeting.
|
||||||
var/list/target_jobs
|
var/list/target_jobs
|
||||||
/// Area that the target needs to be delivered to
|
/// Area that the target needs to be delivered to
|
||||||
var/area/dropoff_area
|
var/area/dropoff_area
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
/mob/living/basic/sloth/paperwork,
|
/mob/living/basic/sloth/paperwork,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
/// The head that we are targetting
|
/// The head that we are targeting
|
||||||
var/datum/job/target
|
var/datum/job/target
|
||||||
/// Whether or not we only take from the traitor's own department head or not.
|
/// Whether or not we only take from the traitor's own department head or not.
|
||||||
var/limited_to_department_head = TRUE
|
var/limited_to_department_head = TRUE
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
/datum/ai_controller/basic_controller/blobbernaut
|
/datum/ai_controller/basic_controller/blobbernaut
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
/datum/ai_controller/basic_controller/blob_zombie
|
/datum/ai_controller/basic_controller/blob_zombie
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
*/
|
*/
|
||||||
/datum/ai_controller/basic_controller/blob_spore
|
/datum/ai_controller/basic_controller/blob_spore
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/datum/ai_controller/basic_controller/clown
|
/datum/ai_controller/basic_controller/clown
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_BASIC_MOB_SPEAK_LINES = null,
|
BB_BASIC_MOB_SPEAK_LINES = null,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/clown/murder
|
/datum/ai_controller/basic_controller/clown/murder
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_BASIC_MOB_SPEAK_LINES = null,
|
BB_BASIC_MOB_SPEAK_LINES = null,
|
||||||
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -68,7 +68,7 @@
|
|||||||
heal_time = 0,\
|
heal_time = 0,\
|
||||||
valid_targets_typecache = typecacheof(list(/mob/living/basic/construct, /mob/living/basic/shade)),\
|
valid_targets_typecache = typecacheof(list(/mob/living/basic/construct, /mob/living/basic/shade)),\
|
||||||
valid_biotypes = MOB_MINERAL | MOB_SPIRIT,\
|
valid_biotypes = MOB_MINERAL | MOB_SPIRIT,\
|
||||||
self_targetting = can_repair_self ? HEALING_TOUCH_ANYONE : HEALING_TOUCH_NOT_SELF,\
|
self_targeting = can_repair_self ? HEALING_TOUCH_ANYONE : HEALING_TOUCH_NOT_SELF,\
|
||||||
action_text = "%SOURCE% begins repairing %TARGET%'s dents.",\
|
action_text = "%SOURCE% begins repairing %TARGET%'s dents.",\
|
||||||
complete_text = "%TARGET%'s dents are repaired.",\
|
complete_text = "%TARGET%'s dents are repaired.",\
|
||||||
show_health = TRUE,\
|
show_health = TRUE,\
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
*/
|
*/
|
||||||
/datum/ai_controller/basic_controller/artificer
|
/datum/ai_controller/basic_controller/artificer
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/same_faction/construct,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/same_faction/construct,
|
||||||
BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_TARGET_WOUNDED_ONLY = TRUE,
|
BB_TARGET_WOUNDED_ONLY = TRUE,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
*/
|
*/
|
||||||
/datum/ai_controller/basic_controller/juggernaut
|
/datum/ai_controller/basic_controller/juggernaut
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -46,9 +46,9 @@
|
|||||||
*/
|
*/
|
||||||
/datum/ai_controller/basic_controller/proteon
|
/datum/ai_controller/basic_controller/proteon
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
||||||
BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_movement = /datum/ai_movement/basic_avoidance
|
ai_movement = /datum/ai_movement/basic_avoidance
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
*/
|
*/
|
||||||
/datum/ai_controller/basic_controller/wraith
|
/datum/ai_controller/basic_controller/wraith
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -80,11 +80,11 @@
|
|||||||
/datum/ai_planning_subtree/basic_melee_attack_subtree,
|
/datum/ai_planning_subtree/basic_melee_attack_subtree,
|
||||||
)
|
)
|
||||||
|
|
||||||
/// Targetting datum that will only allow mobs that constructs can heal.
|
/// Targeting strategy that will only allow mobs that constructs can heal.
|
||||||
/datum/targetting_datum/basic/same_faction/construct
|
/datum/targeting_strategy/basic/same_faction/construct
|
||||||
target_wounded_key = BB_TARGET_WOUNDED_ONLY
|
target_wounded_key = BB_TARGET_WOUNDED_ONLY
|
||||||
|
|
||||||
/datum/targetting_datum/basic/same_faction/construct/can_attack(mob/living/living_mob, atom/the_target, vision_range, check_faction = TRUE)
|
/datum/targeting_strategy/basic/same_faction/construct/can_attack(mob/living/living_mob, atom/the_target, vision_range, check_faction = TRUE)
|
||||||
if(isconstruct(the_target) || istype(the_target, /mob/living/basic/shade))
|
if(isconstruct(the_target) || istype(the_target, /mob/living/basic/shade))
|
||||||
return ..()
|
return ..()
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|||||||
@@ -61,7 +61,7 @@
|
|||||||
/datum/pet_command/beehive/enter,
|
/datum/pet_command/beehive/enter,
|
||||||
/datum/pet_command/beehive/exit,
|
/datum/pet_command/beehive/exit,
|
||||||
/datum/pet_command/follow/bee,
|
/datum/pet_command/follow/bee,
|
||||||
/datum/pet_command/point_targetting/attack/swirl,
|
/datum/pet_command/point_targeting/attack/swirl,
|
||||||
/datum/pet_command/scatter,
|
/datum/pet_command/scatter,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -83,9 +83,9 @@
|
|||||||
if(valid_hives.len)
|
if(valid_hives.len)
|
||||||
return pick(valid_hives)
|
return pick(valid_hives)
|
||||||
|
|
||||||
/datum/targetting_datum/basic/bee
|
/datum/targeting_strategy/basic/bee
|
||||||
|
|
||||||
/datum/targetting_datum/basic/bee/can_attack(mob/living/owner, atom/target, vision_range)
|
/datum/targeting_strategy/basic/bee/can_attack(mob/living/owner, atom/target, vision_range)
|
||||||
if(!isliving(target))
|
if(!isliving(target))
|
||||||
return FALSE
|
return FALSE
|
||||||
. = ..()
|
. = ..()
|
||||||
@@ -117,7 +117,7 @@
|
|||||||
required_distance = 0
|
required_distance = 0
|
||||||
|
|
||||||
///swirl around the owner in menacing fashion
|
///swirl around the owner in menacing fashion
|
||||||
/datum/pet_command/point_targetting/attack/swirl
|
/datum/pet_command/point_targeting/attack/swirl
|
||||||
command_name = "Swirl"
|
command_name = "Swirl"
|
||||||
command_desc = "Your pets will swirl around you and attack whoever you point at!"
|
command_desc = "Your pets will swirl around you and attack whoever you point at!"
|
||||||
speech_commands = list("swirl", "spiral", "swarm")
|
speech_commands = list("swirl", "spiral", "swarm")
|
||||||
@@ -127,7 +127,7 @@
|
|||||||
///the owner we will swarm around
|
///the owner we will swarm around
|
||||||
var/key_to_swarm = BB_SWARM_TARGET
|
var/key_to_swarm = BB_SWARM_TARGET
|
||||||
|
|
||||||
/datum/pet_command/point_targetting/attack/swirl/try_activate_command(mob/living/commander)
|
/datum/pet_command/point_targeting/attack/swirl/try_activate_command(mob/living/commander)
|
||||||
var/mob/living/living_pawn = weak_parent.resolve()
|
var/mob/living/living_pawn = weak_parent.resolve()
|
||||||
if(isnull(living_pawn))
|
if(isnull(living_pawn))
|
||||||
return
|
return
|
||||||
@@ -138,7 +138,7 @@
|
|||||||
controller.set_blackboard_key(key_to_swarm, commander)
|
controller.set_blackboard_key(key_to_swarm, commander)
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
/datum/pet_command/point_targetting/attack/swirl/execute_action(datum/ai_controller/controller)
|
/datum/pet_command/point_targeting/attack/swirl/execute_action(datum/ai_controller/controller)
|
||||||
if(controller.blackboard_key_exists(BB_CURRENT_PET_TARGET))
|
if(controller.blackboard_key_exists(BB_CURRENT_PET_TARGET))
|
||||||
return ..()
|
return ..()
|
||||||
controller.queue_behavior(/datum/ai_behavior/swirl_around_target, BB_SWARM_TARGET)
|
controller.queue_behavior(/datum/ai_behavior/swirl_around_target, BB_SWARM_TARGET)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/datum/ai_controller/basic_controller/bee
|
/datum/ai_controller/basic_controller/bee
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/bee,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/bee,
|
||||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/queen_bee
|
/datum/ai_controller/basic_controller/queen_bee
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/bee,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/bee,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||||
|
|||||||
@@ -66,7 +66,7 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/chick
|
/datum/ai_controller/basic_controller/chick
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_FIND_MOM_TYPES = list(/mob/living/basic/chicken),
|
BB_FIND_MOM_TYPES = list(/mob/living/basic/chicken),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ GLOBAL_VAR_INIT(chicken_count, 0)
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/chicken
|
/datum/ai_controller/basic_controller/chicken
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/datum/ai_controller/basic_controller/cow
|
/datum/ai_controller/basic_controller/cow
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items(),
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items,
|
||||||
BB_BASIC_MOB_TIP_REACTING = FALSE,
|
BB_BASIC_MOB_TIP_REACTING = FALSE,
|
||||||
BB_BASIC_MOB_TIPPER = null,
|
BB_BASIC_MOB_TIPPER = null,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/cow/moonicorn
|
/datum/ai_controller/basic_controller/cow/moonicorn
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items/moonicorn(),
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items/moonicorn,
|
||||||
BB_BASIC_MOB_TIP_REACTING = FALSE,
|
BB_BASIC_MOB_TIP_REACTING = FALSE,
|
||||||
BB_BASIC_MOB_TIPPER = null,
|
BB_BASIC_MOB_TIPPER = null,
|
||||||
)
|
)
|
||||||
@@ -60,14 +60,14 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
///moonicorns will not attack people holding something that could tame them.
|
///moonicorns will not attack people holding something that could tame them.
|
||||||
/datum/targetting_datum/basic/allow_items/moonicorn
|
/datum/targeting_strategy/basic/allow_items/moonicorn
|
||||||
|
|
||||||
/datum/targetting_datum/basic/allow_items/moonicorn/can_attack(mob/living/living_mob, atom/the_target, vision_range)
|
/datum/targeting_strategy/basic/allow_items/moonicorn/can_attack(mob/living/living_mob, atom/the_target, vision_range)
|
||||||
. = ..()
|
. = ..()
|
||||||
if(!.)
|
if(!.)
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
if(isliving(the_target)) //Targetting vs living mobs
|
if(isliving(the_target)) //Targeting vs living mobs
|
||||||
var/mob/living/living_target = the_target
|
var/mob/living/living_target = the_target
|
||||||
for(var/obj/item/food/grown/galaxythistle/tame_food in living_target.held_items)
|
for(var/obj/item/food/grown/galaxythistle/tame_food in living_target.held_items)
|
||||||
return FALSE //heyyy this can tame me! let's NOT fight
|
return FALSE //heyyy this can tame me! let's NOT fight
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
return //cannot tame me! and I don't care about eatin' nothing, neither!
|
return //cannot tame me! and I don't care about eatin' nothing, neither!
|
||||||
|
|
||||||
/datum/ai_controller/basic_controller/cow/wisdom
|
/datum/ai_controller/basic_controller/cow/wisdom
|
||||||
//don't give a targetting datum
|
//don't give a targeting strategy
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_BASIC_MOB_TIP_REACTING = FALSE,
|
BB_BASIC_MOB_TIP_REACTING = FALSE,
|
||||||
BB_BASIC_MOB_TIPPER = null,
|
BB_BASIC_MOB_TIPPER = null,
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
/datum/ai_controller/basic_controller/deer
|
/datum/ai_controller/basic_controller/deer
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_STATIONARY_MOVE_TO_TARGET = TRUE,
|
BB_STATIONARY_MOVE_TO_TARGET = TRUE,
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||||
ai_movement = /datum/ai_movement/basic_avoidance
|
ai_movement = /datum/ai_movement/basic_avoidance
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/// Goats are normally content to sorta hang around and crunch any plant in sight, but they will go ape on someone who attacks them.
|
/// Goats are normally content to sorta hang around and crunch any plant in sight, but they will go ape on someone who attacks them.
|
||||||
/datum/ai_controller/basic_controller/goat
|
/datum/ai_controller/basic_controller/goat
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/// Pretty basic, just click people to death. Also hunt and eat bananas.
|
/// Pretty basic, just click people to death. Also hunt and eat bananas.
|
||||||
/datum/ai_controller/basic_controller/gorilla
|
/datum/ai_controller/basic_controller/gorilla
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items,
|
||||||
BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
|
BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
|
||||||
BB_EMOTE_KEY = "ooga",
|
BB_EMOTE_KEY = "ooga",
|
||||||
BB_EMOTE_CHANCE = 40,
|
BB_EMOTE_CHANCE = 40,
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/gorilla/lesser
|
/datum/ai_controller/basic_controller/gorilla/lesser
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items,
|
||||||
BB_EMOTE_KEY = "ooga",
|
BB_EMOTE_KEY = "ooga",
|
||||||
BB_EMOTE_CHANCE = 60,
|
BB_EMOTE_CHANCE = 60,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -47,7 +47,7 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/pig
|
/datum/ai_controller/basic_controller/pig
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||||
|
|||||||
@@ -106,7 +106,7 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/pony
|
/datum/ai_controller/basic_controller/pony
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/rabbit
|
/datum/ai_controller/basic_controller/rabbit
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||||
ai_movement = /datum/ai_movement/basic_avoidance
|
ai_movement = /datum/ai_movement/basic_avoidance
|
||||||
|
|||||||
@@ -81,7 +81,7 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/sheep
|
/datum/ai_controller/basic_controller/sheep
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||||
ai_movement = /datum/ai_movement/basic_avoidance
|
ai_movement = /datum/ai_movement/basic_avoidance
|
||||||
|
|||||||
@@ -51,7 +51,7 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/festivus_pole
|
/datum/ai_controller/basic_controller/festivus_pole
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(),
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_LOW_PRIORITY_HUNTING_TARGET = null, // APCs
|
BB_LOW_PRIORITY_HUNTING_TARGET = null, // APCs
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
/datum/ai_controller/basic_controller/stalker
|
/datum/ai_controller/basic_controller/stalker
|
||||||
ai_traits = CAN_ACT_IN_STASIS
|
ai_traits = CAN_ACT_IN_STASIS
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_movement = /datum/ai_movement/basic_avoidance
|
ai_movement = /datum/ai_movement/basic_avoidance
|
||||||
|
|||||||
@@ -85,7 +85,7 @@
|
|||||||
/// Walk and attack people, blind them when we can
|
/// Walk and attack people, blind them when we can
|
||||||
/datum/ai_controller/basic_controller/raw_prophet
|
/datum/ai_controller/basic_controller/raw_prophet
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_movement = /datum/ai_movement/basic_avoidance
|
ai_movement = /datum/ai_movement/basic_avoidance
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
/// Converts unconverted terrain, sprays pocket sand around
|
/// Converts unconverted terrain, sprays pocket sand around
|
||||||
/datum/ai_controller/basic_controller/rust_walker
|
/datum/ai_controller/basic_controller/rust_walker
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_movement = /datum/ai_movement/basic_avoidance
|
ai_movement = /datum/ai_movement/basic_avoidance
|
||||||
|
|||||||
@@ -66,7 +66,7 @@
|
|||||||
|
|
||||||
target.apply_status_effect(/datum/status_effect/star_mark)
|
target.apply_status_effect(/datum/status_effect/star_mark)
|
||||||
target.apply_damage(damage = 5, damagetype = CLONE)
|
target.apply_damage(damage = 5, damagetype = CLONE)
|
||||||
var/datum/targetting_datum/target_confirmer = ai_controller.blackboard[BB_TARGETTING_DATUM]
|
var/datum/targeting_strategy/target_confirmer = GET_TARGETING_STRATEGY(ai_controller.blackboard[BB_TARGETING_STRATEGY])
|
||||||
for(var/mob/living/nearby_mob in range(1, src))
|
for(var/mob/living/nearby_mob in range(1, src))
|
||||||
if(target == nearby_mob || !target_confirmer?.can_attack(src, nearby_mob))
|
if(target == nearby_mob || !target_confirmer?.can_attack(src, nearby_mob))
|
||||||
continue
|
continue
|
||||||
@@ -78,9 +78,9 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/star_gazer
|
/datum/ai_controller/basic_controller/star_gazer
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
||||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends/attack_closed_turfs,
|
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends/attack_closed_turfs,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_movement = /datum/ai_movement/basic_avoidance
|
ai_movement = /datum/ai_movement/basic_avoidance
|
||||||
@@ -104,7 +104,7 @@
|
|||||||
can_attack_turfs = TRUE
|
can_attack_turfs = TRUE
|
||||||
can_attack_dense_objects = TRUE
|
can_attack_dense_objects = TRUE
|
||||||
|
|
||||||
/datum/pet_command/point_targetting/attack/star_gazer
|
/datum/pet_command/point_targeting/attack/star_gazer
|
||||||
speech_commands = list("attack", "sic", "kill", "slash them")
|
speech_commands = list("attack", "sic", "kill", "slash them")
|
||||||
command_feedback = "stares!"
|
command_feedback = "stares!"
|
||||||
pointed_reaction = "stares intensely!"
|
pointed_reaction = "stares intensely!"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/datum/ai_controller/basic_controller/ice_demon
|
/datum/ai_controller/basic_controller/ice_demon
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_LIST_SCARY_ITEMS = list(
|
BB_LIST_SCARY_ITEMS = list(
|
||||||
/obj/item/weldingtool,
|
/obj/item/weldingtool,
|
||||||
/obj/item/flashlight/flare,
|
/obj/item/flashlight/flare,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#define ENRAGE_ADDITION 25
|
#define ENRAGE_ADDITION 25
|
||||||
/datum/ai_controller/basic_controller/ice_whelp
|
/datum/ai_controller/basic_controller/ice_whelp
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items,
|
||||||
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
||||||
BB_WHELP_ENRAGED = 0,
|
BB_WHELP_ENRAGED = 0,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -44,9 +44,9 @@
|
|||||||
/datum/pet_command/follow,
|
/datum/pet_command/follow,
|
||||||
/datum/pet_command/untargetted_ability/blood_rain,
|
/datum/pet_command/untargetted_ability/blood_rain,
|
||||||
/datum/pet_command/untargetted_ability/summon_toad,
|
/datum/pet_command/untargetted_ability/summon_toad,
|
||||||
/datum/pet_command/point_targetting/attack,
|
/datum/pet_command/point_targeting/attack,
|
||||||
/datum/pet_command/point_targetting/use_ability/flop,
|
/datum/pet_command/point_targeting/use_ability/flop,
|
||||||
/datum/pet_command/point_targetting/use_ability/bubble,
|
/datum/pet_command/point_targeting/use_ability/bubble,
|
||||||
)
|
)
|
||||||
|
|
||||||
/mob/living/basic/leaper/Initialize(mapload)
|
/mob/living/basic/leaper/Initialize(mapload)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/datum/ai_controller/basic_controller/leaper
|
/datum/ai_controller/basic_controller/leaper
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_movement = /datum/ai_movement/basic_avoidance
|
ai_movement = /datum/ai_movement/basic_avoidance
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
ability_key = BB_LEAPER_SUMMON
|
ability_key = BB_LEAPER_SUMMON
|
||||||
finish_planning = FALSE
|
finish_planning = FALSE
|
||||||
|
|
||||||
/datum/pet_command/point_targetting/use_ability/flop
|
/datum/pet_command/point_targeting/use_ability/flop
|
||||||
command_name = "Flop"
|
command_name = "Flop"
|
||||||
command_desc = "Command your pet to belly flop your target!"
|
command_desc = "Command your pet to belly flop your target!"
|
||||||
radial_icon = 'icons/mob/actions/actions_items.dmi'
|
radial_icon = 'icons/mob/actions/actions_items.dmi'
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
speech_commands = list("flop", "crush")
|
speech_commands = list("flop", "crush")
|
||||||
pet_ability_key = BB_LEAPER_FLOP
|
pet_ability_key = BB_LEAPER_FLOP
|
||||||
|
|
||||||
/datum/pet_command/point_targetting/use_ability/bubble
|
/datum/pet_command/point_targeting/use_ability/bubble
|
||||||
command_name = "Poison Bubble"
|
command_name = "Poison Bubble"
|
||||||
command_desc = "Launch poisonous bubbles at your target!"
|
command_desc = "Launch poisonous bubbles at your target!"
|
||||||
radial_icon = 'icons/obj/weapons/guns/projectiles.dmi'
|
radial_icon = 'icons/obj/weapons/guns/projectiles.dmi'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/datum/ai_controller/basic_controller/mega_arachnid
|
/datum/ai_controller/basic_controller/mega_arachnid
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_BASIC_MOB_FLEE_DISTANCE = 5,
|
BB_BASIC_MOB_FLEE_DISTANCE = 5,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -212,9 +212,9 @@
|
|||||||
/datum/pet_command/idle,
|
/datum/pet_command/idle,
|
||||||
/datum/pet_command/free,
|
/datum/pet_command/free,
|
||||||
/datum/pet_command/follow,
|
/datum/pet_command/follow,
|
||||||
/datum/pet_command/point_targetting/attack,
|
/datum/pet_command/point_targeting/attack,
|
||||||
/datum/pet_command/point_targetting/use_ability/solarbeam,
|
/datum/pet_command/point_targeting/use_ability/solarbeam,
|
||||||
/datum/pet_command/point_targetting/use_ability/rapidseeds,
|
/datum/pet_command/point_targeting/use_ability/rapidseeds,
|
||||||
)
|
)
|
||||||
|
|
||||||
//abilities
|
//abilities
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/datum/ai_controller/basic_controller/seedling
|
/datum/ai_controller/basic_controller/seedling
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
|
||||||
BB_WEEDLEVEL_THRESHOLD = 3,
|
BB_WEEDLEVEL_THRESHOLD = 3,
|
||||||
BB_WATERLEVEL_THRESHOLD = 90,
|
BB_WATERLEVEL_THRESHOLD = 90,
|
||||||
)
|
)
|
||||||
@@ -141,8 +141,8 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/seedling/meanie
|
/datum/ai_controller/basic_controller/seedling/meanie
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
|
||||||
)
|
)
|
||||||
planning_subtrees = list(
|
planning_subtrees = list(
|
||||||
/datum/ai_planning_subtree/pet_planning,
|
/datum/ai_planning_subtree/pet_planning,
|
||||||
@@ -161,7 +161,7 @@
|
|||||||
finish_planning = FALSE
|
finish_planning = FALSE
|
||||||
|
|
||||||
///pet commands
|
///pet commands
|
||||||
/datum/pet_command/point_targetting/use_ability/solarbeam
|
/datum/pet_command/point_targeting/use_ability/solarbeam
|
||||||
command_name = "Launch solarbeam"
|
command_name = "Launch solarbeam"
|
||||||
command_desc = "Command your pet to launch a solarbeam at your target!"
|
command_desc = "Command your pet to launch a solarbeam at your target!"
|
||||||
radial_icon = 'icons/effects/beam.dmi'
|
radial_icon = 'icons/effects/beam.dmi'
|
||||||
@@ -169,7 +169,7 @@
|
|||||||
speech_commands = list("beam", "solar")
|
speech_commands = list("beam", "solar")
|
||||||
pet_ability_key = BB_SOLARBEAM_ABILITY
|
pet_ability_key = BB_SOLARBEAM_ABILITY
|
||||||
|
|
||||||
/datum/pet_command/point_targetting/use_ability/rapidseeds
|
/datum/pet_command/point_targeting/use_ability/rapidseeds
|
||||||
command_name = "Rapid seeds"
|
command_name = "Rapid seeds"
|
||||||
command_desc = "Command your pet to launch a volley of seeds at your target!"
|
command_desc = "Command your pet to launch a volley of seeds at your target!"
|
||||||
radial_icon = 'icons/obj/weapons/guns/projectiles.dmi'
|
radial_icon = 'icons/obj/weapons/guns/projectiles.dmi'
|
||||||
|
|||||||
@@ -255,7 +255,7 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/human_trap
|
/datum/ai_controller/basic_controller/human_trap
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_movement = /datum/ai_movement/basic_avoidance
|
ai_movement = /datum/ai_movement/basic_avoidance
|
||||||
|
|||||||
@@ -77,7 +77,7 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/basilisk
|
/datum/ai_controller/basic_controller/basilisk
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_AGGRO_RANGE = 5,
|
BB_AGGRO_RANGE = 5,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/datum/ai_controller/basic_controller/bileworm
|
/datum/ai_controller/basic_controller/bileworm
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/bileworm(),
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/bileworm,
|
||||||
)
|
)
|
||||||
|
|
||||||
planning_subtrees = list(
|
planning_subtrees = list(
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
/datum/ai_planning_subtree/bileworm_execute,
|
/datum/ai_planning_subtree/bileworm_execute,
|
||||||
)
|
)
|
||||||
|
|
||||||
/datum/targetting_datum/basic/bileworm
|
/datum/targeting_strategy/basic/bileworm
|
||||||
ignore_sight = TRUE
|
ignore_sight = TRUE
|
||||||
|
|
||||||
/datum/ai_planning_subtree/bileworm_attack
|
/datum/ai_planning_subtree/bileworm_attack
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
*/
|
*/
|
||||||
/datum/ai_controller/basic_controller/brimdemon
|
/datum/ai_controller/basic_controller/brimdemon
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
/datum/pet_command/free,
|
/datum/pet_command/free,
|
||||||
/datum/pet_command/grub_spit,
|
/datum/pet_command/grub_spit,
|
||||||
/datum/pet_command/follow,
|
/datum/pet_command/follow,
|
||||||
/datum/pet_command/point_targetting/fetch,
|
/datum/pet_command/point_targeting/fetch,
|
||||||
)
|
)
|
||||||
|
|
||||||
/mob/living/basic/mining/goldgrub/Initialize(mapload)
|
/mob/living/basic/mining/goldgrub/Initialize(mapload)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/datum/ai_controller/basic_controller/goldgrub
|
/datum/ai_controller/basic_controller/goldgrub
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
|
||||||
BB_ORE_IGNORE_TYPES = list(/obj/item/stack/ore/iron, /obj/item/stack/ore/glass),
|
BB_ORE_IGNORE_TYPES = list(/obj/item/stack/ore/iron, /obj/item/stack/ore/glass),
|
||||||
BB_STORM_APPROACHING = FALSE,
|
BB_STORM_APPROACHING = FALSE,
|
||||||
)
|
)
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/babygrub
|
/datum/ai_controller/basic_controller/babygrub
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_ORE_IGNORE_TYPES = list(/obj/item/stack/ore/glass),
|
BB_ORE_IGNORE_TYPES = list(/obj/item/stack/ore/glass),
|
||||||
BB_FIND_MOM_TYPES = list(/mob/living/basic/mining/goldgrub),
|
BB_FIND_MOM_TYPES = list(/mob/living/basic/mining/goldgrub),
|
||||||
BB_IGNORE_MOM_TYPES = list(/mob/living/basic/mining/goldgrub/baby),
|
BB_IGNORE_MOM_TYPES = list(/mob/living/basic/mining/goldgrub/baby),
|
||||||
|
|||||||
@@ -80,10 +80,10 @@
|
|||||||
tentacles.Grant(src)
|
tentacles.Grant(src)
|
||||||
melee_tentacles = new(src)
|
melee_tentacles = new(src)
|
||||||
melee_tentacles.Grant(src)
|
melee_tentacles.Grant(src)
|
||||||
AddComponent(/datum/component/revenge_ability, melee_tentacles, targetting = ai_controller.blackboard[BB_TARGETTING_DATUM], max_range = 1, target_self = TRUE)
|
AddComponent(/datum/component/revenge_ability, melee_tentacles, targeting = GET_TARGETING_STRATEGY(ai_controller.blackboard[BB_TARGETING_STRATEGY]), max_range = 1, target_self = TRUE)
|
||||||
tentacle_line = new (src)
|
tentacle_line = new (src)
|
||||||
tentacle_line.Grant(src)
|
tentacle_line.Grant(src)
|
||||||
AddComponent(/datum/component/revenge_ability, tentacle_line, targetting = ai_controller.blackboard[BB_TARGETTING_DATUM], min_range = 2, max_range = 9)
|
AddComponent(/datum/component/revenge_ability, tentacle_line, targeting = GET_TARGETING_STRATEGY(ai_controller.blackboard[BB_TARGETING_STRATEGY]), min_range = 2, max_range = 9)
|
||||||
|
|
||||||
tentacles_ready()
|
tentacles_ready()
|
||||||
RegisterSignal(src, COMSIG_MOB_ABILITY_FINISHED, PROC_REF(used_ability))
|
RegisterSignal(src, COMSIG_MOB_ABILITY_FINISHED, PROC_REF(used_ability))
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/goliath
|
/datum/ai_controller/basic_controller/goliath
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items,
|
||||||
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
/// Go for the tentacles if they're available
|
/// Go for the tentacles if they're available
|
||||||
/datum/ai_behavior/basic_melee_attack/goliath
|
/datum/ai_behavior/basic_melee_attack/goliath
|
||||||
|
|
||||||
/datum/ai_behavior/basic_melee_attack/goliath/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key, health_ratio_key)
|
/datum/ai_behavior/basic_melee_attack/goliath/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key, health_ratio_key)
|
||||||
var/time_on_target = controller.blackboard[BB_BASIC_MOB_HAS_TARGET_TIME] || 0
|
var/time_on_target = controller.blackboard[BB_BASIC_MOB_HAS_TARGET_TIME] || 0
|
||||||
if (time_on_target < MIN_TIME_TO_TENTACLE)
|
if (time_on_target < MIN_TIME_TO_TENTACLE)
|
||||||
return ..()
|
return ..()
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/// Basically just keep away and shit out worms
|
/// Basically just keep away and shit out worms
|
||||||
/datum/ai_controller/basic_controller/hivelord
|
/datum/ai_controller/basic_controller/hivelord
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_AGGRO_RANGE = 5, // Only get mad at people nearby
|
BB_AGGRO_RANGE = 5, // Only get mad at people nearby
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
cooldown_time = 2 SECONDS
|
cooldown_time = 2 SECONDS
|
||||||
melee_cooldown_time = 0
|
melee_cooldown_time = 0
|
||||||
shared_cooldown = NONE
|
shared_cooldown = NONE
|
||||||
/// If a mob is not clicked directly, inherit targetting data from this blackboard key and setting it upon this target key
|
/// If a mob is not clicked directly, inherit targeting data from this blackboard key and setting it upon this target key
|
||||||
var/ai_target_key = BB_BASIC_MOB_CURRENT_TARGET
|
var/ai_target_key = BB_BASIC_MOB_CURRENT_TARGET
|
||||||
/// What are we actually spawning?
|
/// What are we actually spawning?
|
||||||
var/spawn_type = /mob/living/basic/hivelord_brood
|
var/spawn_type = /mob/living/basic/hivelord_brood
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/// Keep away and launch skulls at every opportunity, prioritising injured allies
|
/// Keep away and launch skulls at every opportunity, prioritising injured allies
|
||||||
/datum/ai_controller/basic_controller/legion
|
/datum/ai_controller/basic_controller/legion
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/legion,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/legion,
|
||||||
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
||||||
BB_AGGRO_RANGE = 5, // Unobservant
|
BB_AGGRO_RANGE = 5, // Unobservant
|
||||||
BB_BASIC_MOB_FLEE_DISTANCE = 6,
|
BB_BASIC_MOB_FLEE_DISTANCE = 6,
|
||||||
@@ -16,10 +16,10 @@
|
|||||||
/datum/ai_planning_subtree/flee_target/legion,
|
/datum/ai_planning_subtree/flee_target/legion,
|
||||||
)
|
)
|
||||||
|
|
||||||
/// Chase and attack whatever we are targetting, if it's friendly we will heal them
|
/// Chase and attack whatever we are targeting, if it's friendly we will heal them
|
||||||
/datum/ai_controller/basic_controller/legion_brood
|
/datum/ai_controller/basic_controller/legion_brood
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/legion,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/legion,
|
||||||
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -31,9 +31,9 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
/// Target nearby friendlies if they are hurt (and are not themselves Legions)
|
/// Target nearby friendlies if they are hurt (and are not themselves Legions)
|
||||||
/datum/targetting_datum/basic/legion
|
/datum/targeting_strategy/basic/legion
|
||||||
|
|
||||||
/datum/targetting_datum/basic/legion/faction_check(datum/ai_controller/controller, mob/living/living_mob, mob/living/the_target)
|
/datum/targeting_strategy/basic/legion/faction_check(datum/ai_controller/controller, mob/living/living_mob, mob/living/the_target)
|
||||||
if (!living_mob.faction_check_atom(the_target, exact_match = check_factions_exactly))
|
if (!living_mob.faction_check_atom(the_target, exact_match = check_factions_exactly))
|
||||||
return FALSE
|
return FALSE
|
||||||
if (istype(the_target, living_mob.type))
|
if (istype(the_target, living_mob.type))
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
cooldown_time = 2 SECONDS
|
cooldown_time = 2 SECONDS
|
||||||
melee_cooldown_time = 0
|
melee_cooldown_time = 0
|
||||||
shared_cooldown = NONE
|
shared_cooldown = NONE
|
||||||
/// If a mob is not clicked directly, inherit targetting data from this blackboard key and setting it upon this target key
|
/// If a mob is not clicked directly, inherit targeting data from this blackboard key and setting it upon this target key
|
||||||
var/ai_target_key = BB_BASIC_MOB_CURRENT_TARGET
|
var/ai_target_key = BB_BASIC_MOB_CURRENT_TARGET
|
||||||
/// What are we actually spawning?
|
/// What are we actually spawning?
|
||||||
var/spawn_type = /mob/living/basic/legion_brood
|
var/spawn_type = /mob/living/basic/legion_brood
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/datum/ai_controller/basic_controller/lobstrosity
|
/datum/ai_controller/basic_controller/lobstrosity
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
||||||
BB_LOBSTROSITY_EXPLOIT_TRAITS = list(TRAIT_INCAPACITATED, TRAIT_FLOORED, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT),
|
BB_LOBSTROSITY_EXPLOIT_TRAITS = list(TRAIT_INCAPACITATED, TRAIT_FLOORED, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT),
|
||||||
BB_LOBSTROSITY_FINGER_LUST = 0
|
BB_LOBSTROSITY_FINGER_LUST = 0
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
/datum/ai_behavior/basic_melee_attack/lobster
|
/datum/ai_behavior/basic_melee_attack/lobster
|
||||||
|
|
||||||
/datum/ai_behavior/basic_melee_attack/lobster/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key)
|
/datum/ai_behavior/basic_melee_attack/lobster/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
|
||||||
var/mob/living/target = controller.blackboard[target_key]
|
var/mob/living/target = controller.blackboard[target_key]
|
||||||
if (isnull(target))
|
if (isnull(target))
|
||||||
return ..()
|
return ..()
|
||||||
|
|||||||
@@ -41,8 +41,8 @@
|
|||||||
var/list/pet_commands = list(
|
var/list/pet_commands = list(
|
||||||
/datum/pet_command/idle,
|
/datum/pet_command/idle,
|
||||||
/datum/pet_command/free,
|
/datum/pet_command/free,
|
||||||
/datum/pet_command/point_targetting/attack,
|
/datum/pet_command/point_targeting/attack,
|
||||||
/datum/pet_command/point_targetting/fetch,
|
/datum/pet_command/point_targeting/fetch,
|
||||||
)
|
)
|
||||||
|
|
||||||
/mob/living/basic/mining/mook/Initialize(mapload)
|
/mob/living/basic/mining/mook/Initialize(mapload)
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
///commands the chief can pick from
|
///commands the chief can pick from
|
||||||
GLOBAL_LIST_INIT(mook_commands, list(
|
GLOBAL_LIST_INIT(mook_commands, list(
|
||||||
new /datum/pet_command/point_targetting/attack,
|
new /datum/pet_command/point_targeting/attack,
|
||||||
new /datum/pet_command/point_targetting/fetch,
|
new /datum/pet_command/point_targeting/fetch,
|
||||||
))
|
))
|
||||||
|
|
||||||
/datum/ai_controller/basic_controller/mook
|
/datum/ai_controller/basic_controller/mook
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/mook,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/mook,
|
||||||
BB_BLACKLIST_MINERAL_TURFS = list(/turf/closed/mineral/gibtonite, /turf/closed/mineral/strong),
|
BB_BLACKLIST_MINERAL_TURFS = list(/turf/closed/mineral/gibtonite, /turf/closed/mineral/strong),
|
||||||
BB_MAXIMUM_DISTANCE_TO_VILLAGE = 7,
|
BB_MAXIMUM_DISTANCE_TO_VILLAGE = 7,
|
||||||
BB_STORM_APPROACHING = FALSE,
|
BB_STORM_APPROACHING = FALSE,
|
||||||
@@ -28,7 +28,7 @@ GLOBAL_LIST_INIT(mook_commands, list(
|
|||||||
)
|
)
|
||||||
|
|
||||||
///check for faction if not a ash walker, otherwise just attack
|
///check for faction if not a ash walker, otherwise just attack
|
||||||
/datum/targetting_datum/basic/mook/faction_check(datum/ai_controller/controller, mob/living/living_mob, mob/living/the_target)
|
/datum/targeting_strategy/basic/mook/faction_check(datum/ai_controller/controller, mob/living/living_mob, mob/living/the_target)
|
||||||
if(FACTION_ASHWALKER in living_mob.faction)
|
if(FACTION_ASHWALKER in living_mob.faction)
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
@@ -212,7 +212,7 @@ GLOBAL_LIST_INIT(mook_commands, list(
|
|||||||
///bard mook plays nice music for the village
|
///bard mook plays nice music for the village
|
||||||
/datum/ai_controller/basic_controller/mook/bard
|
/datum/ai_controller/basic_controller/mook/bard
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/mook,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/mook,
|
||||||
BB_MAXIMUM_DISTANCE_TO_VILLAGE = 10,
|
BB_MAXIMUM_DISTANCE_TO_VILLAGE = 10,
|
||||||
BB_STORM_APPROACHING = FALSE,
|
BB_STORM_APPROACHING = FALSE,
|
||||||
BB_SONG_LINES = MOOK_SONG,
|
BB_SONG_LINES = MOOK_SONG,
|
||||||
@@ -264,10 +264,10 @@ GLOBAL_LIST_INIT(mook_commands, list(
|
|||||||
///healer mooks guard the village from intruders and heal the miner mooks when they come home
|
///healer mooks guard the village from intruders and heal the miner mooks when they come home
|
||||||
/datum/ai_controller/basic_controller/mook/support
|
/datum/ai_controller/basic_controller/mook/support
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/mook,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/mook,
|
||||||
BB_MAXIMUM_DISTANCE_TO_VILLAGE = 10,
|
BB_MAXIMUM_DISTANCE_TO_VILLAGE = 10,
|
||||||
BB_STORM_APPROACHING = FALSE,
|
BB_STORM_APPROACHING = FALSE,
|
||||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
|
||||||
)
|
)
|
||||||
idle_behavior = /datum/idle_behavior/walk_near_target/mook_village
|
idle_behavior = /datum/idle_behavior/walk_near_target/mook_village
|
||||||
planning_subtrees = list(
|
planning_subtrees = list(
|
||||||
@@ -324,7 +324,7 @@ GLOBAL_LIST_INIT(mook_commands, list(
|
|||||||
///the chief would rather command his mooks to attack people than attack them himself
|
///the chief would rather command his mooks to attack people than attack them himself
|
||||||
/datum/ai_controller/basic_controller/mook/tribal_chief
|
/datum/ai_controller/basic_controller/mook/tribal_chief
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/mook,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/mook,
|
||||||
BB_STORM_APPROACHING = FALSE,
|
BB_STORM_APPROACHING = FALSE,
|
||||||
)
|
)
|
||||||
idle_behavior = /datum/idle_behavior/walk_near_target/mook_village
|
idle_behavior = /datum/idle_behavior/walk_near_target/mook_village
|
||||||
@@ -349,7 +349,7 @@ GLOBAL_LIST_INIT(mook_commands, list(
|
|||||||
if(!locate(/mob/living/basic/mining/mook) in oview(command_distance, controller.pawn))
|
if(!locate(/mob/living/basic/mining/mook) in oview(command_distance, controller.pawn))
|
||||||
return
|
return
|
||||||
if(controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET))
|
if(controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET))
|
||||||
controller.queue_behavior(/datum/ai_behavior/issue_commands, BB_BASIC_MOB_CURRENT_TARGET, /datum/pet_command/point_targetting/attack)
|
controller.queue_behavior(/datum/ai_behavior/issue_commands, BB_BASIC_MOB_CURRENT_TARGET, /datum/pet_command/point_targeting/attack)
|
||||||
return
|
return
|
||||||
|
|
||||||
var/atom/ore_target = controller.blackboard[BB_ORE_TARGET]
|
var/atom/ore_target = controller.blackboard[BB_ORE_TARGET]
|
||||||
@@ -359,7 +359,7 @@ GLOBAL_LIST_INIT(mook_commands, list(
|
|||||||
if(get_dist(ore_target, living_pawn) <= 1)
|
if(get_dist(ore_target, living_pawn) <= 1)
|
||||||
return
|
return
|
||||||
|
|
||||||
controller.queue_behavior(/datum/ai_behavior/issue_commands, BB_ORE_TARGET, /datum/pet_command/point_targetting/fetch)
|
controller.queue_behavior(/datum/ai_behavior/issue_commands, BB_ORE_TARGET, /datum/pet_command/point_targeting/fetch)
|
||||||
|
|
||||||
/datum/ai_behavior/issue_commands
|
/datum/ai_behavior/issue_commands
|
||||||
action_cooldown = 5 SECONDS
|
action_cooldown = 5 SECONDS
|
||||||
|
|||||||
@@ -62,7 +62,7 @@
|
|||||||
var/datum/action/cooldown/mob_cooldown/watcher_gaze/gaze = new gaze_attack(src)
|
var/datum/action/cooldown/mob_cooldown/watcher_gaze/gaze = new gaze_attack(src)
|
||||||
gaze.Grant(src)
|
gaze.Grant(src)
|
||||||
ai_controller.set_blackboard_key(BB_GENERIC_ACTION, gaze)
|
ai_controller.set_blackboard_key(BB_GENERIC_ACTION, gaze)
|
||||||
AddComponent(/datum/component/revenge_ability, gaze, targetting = ai_controller.blackboard[BB_TARGETTING_DATUM])
|
AddComponent(/datum/component/revenge_ability, gaze, targeting = GET_TARGETING_STRATEGY(ai_controller.blackboard[BB_TARGETING_STRATEGY]))
|
||||||
|
|
||||||
/mob/living/basic/mining/watcher/update_overlays()
|
/mob/living/basic/mining/watcher/update_overlays()
|
||||||
. = ..()
|
. = ..()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/datum/ai_controller/basic_controller/watcher
|
/datum/ai_controller/basic_controller/watcher
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_traits = PAUSE_DURING_DO_AFTER
|
ai_traits = PAUSE_DURING_DO_AFTER
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
/datum/pet_command/automate_mining,
|
/datum/pet_command/automate_mining,
|
||||||
/datum/pet_command/free/minebot,
|
/datum/pet_command/free/minebot,
|
||||||
/datum/pet_command/follow,
|
/datum/pet_command/follow,
|
||||||
/datum/pet_command/point_targetting/attack/minebot,
|
/datum/pet_command/point_targeting/attack/minebot,
|
||||||
)
|
)
|
||||||
|
|
||||||
/mob/living/basic/mining_drone/Initialize(mapload)
|
/mob/living/basic/mining_drone/Initialize(mapload)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/datum/ai_controller/basic_controller/minebot
|
/datum/ai_controller/basic_controller/minebot
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
|
||||||
BB_BLACKLIST_MINERAL_TURFS = list(/turf/closed/mineral/gibtonite),
|
BB_BLACKLIST_MINERAL_TURFS = list(/turf/closed/mineral/gibtonite),
|
||||||
BB_AUTOMATED_MINING = FALSE,
|
BB_AUTOMATED_MINING = FALSE,
|
||||||
)
|
)
|
||||||
@@ -201,10 +201,10 @@
|
|||||||
radial_icon_state = "mech_eject"
|
radial_icon_state = "mech_eject"
|
||||||
ability_key = BB_MINEBOT_DUMP_ABILITY
|
ability_key = BB_MINEBOT_DUMP_ABILITY
|
||||||
|
|
||||||
/datum/pet_command/point_targetting/attack/minebot
|
/datum/pet_command/point_targeting/attack/minebot
|
||||||
attack_behaviour = /datum/ai_behavior/basic_ranged_attack/minebot
|
attack_behaviour = /datum/ai_behavior/basic_ranged_attack/minebot
|
||||||
|
|
||||||
/datum/pet_command/point_targetting/attack/minebot/execute_action(datum/ai_controller/controller)
|
/datum/pet_command/point_targeting/attack/minebot/execute_action(datum/ai_controller/controller)
|
||||||
controller.set_blackboard_key(BB_AUTOMATED_MINING, FALSE)
|
controller.set_blackboard_key(BB_AUTOMATED_MINING, FALSE)
|
||||||
var/mob/living/living_pawn = controller.pawn
|
var/mob/living/living_pawn = controller.pawn
|
||||||
if(!living_pawn.combat_mode)
|
if(!living_pawn.combat_mode)
|
||||||
|
|||||||
@@ -7,10 +7,10 @@
|
|||||||
speech_commands = list("good dog")
|
speech_commands = list("good dog")
|
||||||
|
|
||||||
// Set correct attack behaviour
|
// Set correct attack behaviour
|
||||||
/datum/pet_command/point_targetting/attack/dog
|
/datum/pet_command/point_targeting/attack/dog
|
||||||
attack_behaviour = /datum/ai_behavior/basic_melee_attack/dog
|
attack_behaviour = /datum/ai_behavior/basic_melee_attack/dog
|
||||||
|
|
||||||
/datum/pet_command/point_targetting/attack/dog/set_command_active(mob/living/parent, mob/living/commander)
|
/datum/pet_command/point_targeting/attack/dog/set_command_active(mob/living/parent, mob/living/commander)
|
||||||
. = ..()
|
. = ..()
|
||||||
parent.ai_controller.set_blackboard_key(BB_DOG_HARASS_HARM, TRUE)
|
parent.ai_controller.set_blackboard_key(BB_DOG_HARASS_HARM, TRUE)
|
||||||
|
|
||||||
@@ -40,8 +40,8 @@
|
|||||||
/datum/pet_command/free,
|
/datum/pet_command/free,
|
||||||
/datum/pet_command/good_boy/dog,
|
/datum/pet_command/good_boy/dog,
|
||||||
/datum/pet_command/follow/dog,
|
/datum/pet_command/follow/dog,
|
||||||
/datum/pet_command/point_targetting/attack/dog,
|
/datum/pet_command/point_targeting/attack/dog,
|
||||||
/datum/pet_command/point_targetting/fetch,
|
/datum/pet_command/point_targeting/fetch,
|
||||||
/datum/pet_command/play_dead,
|
/datum/pet_command/play_dead,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -39,8 +39,8 @@
|
|||||||
/datum/ai_controller/basic_controller/fox
|
/datum/ai_controller/basic_controller/fox
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_ALWAYS_IGNORE_FACTION = TRUE,
|
BB_ALWAYS_IGNORE_FACTION = TRUE,
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/of_size/ours_or_smaller,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/of_size/ours_or_smaller,
|
||||||
BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_movement = /datum/ai_movement/basic_avoidance
|
ai_movement = /datum/ai_movement/basic_avoidance
|
||||||
|
|||||||
@@ -84,7 +84,7 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/penguin
|
/datum/ai_controller/basic_controller/penguin
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||||
@@ -178,7 +178,7 @@
|
|||||||
|
|
||||||
/datum/ai_controller/basic_controller/penguin/baby
|
/datum/ai_controller/basic_controller/penguin/baby
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_FIND_MOM_TYPES = list(/mob/living/basic/pet/penguin),
|
BB_FIND_MOM_TYPES = list(/mob/living/basic/pet/penguin),
|
||||||
BB_IGNORE_MOM_TYPES = list(/mob/living/basic/pet/penguin/baby),
|
BB_IGNORE_MOM_TYPES = list(/mob/living/basic/pet/penguin/baby),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -75,8 +75,8 @@ GLOBAL_DATUM(cargo_sloth, /mob/living/basic/sloth)
|
|||||||
/// They're really passive in game, so they just wanna get away if you start smacking them. No trees in space from them to use for clawing your eyes out, but they will try if desperate.
|
/// They're really passive in game, so they just wanna get away if you start smacking them. No trees in space from them to use for clawing your eyes out, but they will try if desperate.
|
||||||
/datum/ai_controller/basic_controller/sloth
|
/datum/ai_controller/basic_controller/sloth
|
||||||
blackboard = list(
|
blackboard = list(
|
||||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||||
)
|
)
|
||||||
|
|
||||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user