mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-20 14:45:05 +00:00
## About The Pull Request refactors all behaviors to work through clicking. also removes some now redundant behaviors. in the future ill try to generalize more of these behaviors ## Why It's Good For The Game makes AI controllers work through clicks which may help with swing combat implementation ## Changelog 🆑 refactor: basic mob AI interactions has been refactored. please report any bugs /🆑 --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
68 lines
2.7 KiB
Plaintext
68 lines
2.7 KiB
Plaintext
//behavior to find mineable mineral walls
|
|
|
|
/datum/ai_planning_subtree/mine_walls
|
|
var/find_wall_behavior = /datum/ai_behavior/find_mineral_wall
|
|
|
|
/datum/ai_planning_subtree/mine_walls/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
|
if(controller.blackboard_key_exists(BB_TARGET_MINERAL_WALL))
|
|
controller.queue_behavior(/datum/ai_behavior/mine_wall, BB_TARGET_MINERAL_WALL)
|
|
return SUBTREE_RETURN_FINISH_PLANNING
|
|
controller.queue_behavior(find_wall_behavior, BB_TARGET_MINERAL_WALL)
|
|
|
|
/datum/ai_behavior/mine_wall
|
|
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
|
|
action_cooldown = 15 SECONDS
|
|
|
|
/datum/ai_behavior/mine_wall/setup(datum/ai_controller/controller, target_key)
|
|
. = ..()
|
|
var/turf/target = controller.blackboard[target_key]
|
|
if(QDELETED(target))
|
|
return FALSE
|
|
set_movement_target(controller, target)
|
|
|
|
/datum/ai_behavior/mine_wall/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
|
|
var/mob/living/basic/living_pawn = controller.pawn
|
|
var/turf/closed/mineral/target = controller.blackboard[target_key]
|
|
var/is_gibtonite_turf = istype(target, /turf/closed/mineral/gibtonite)
|
|
if(!controller.ai_interact(target = target))
|
|
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
|
|
if(is_gibtonite_turf)
|
|
living_pawn.manual_emote("sighs...") //accept whats about to happen to us
|
|
|
|
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
|
|
|
|
/datum/ai_behavior/mine_wall/finish_action(datum/ai_controller/controller, success, target_key)
|
|
. = ..()
|
|
controller.clear_blackboard_key(target_key)
|
|
|
|
/datum/ai_behavior/find_mineral_wall
|
|
|
|
/datum/ai_behavior/find_mineral_wall/perform(seconds_per_tick, datum/ai_controller/controller, found_wall_key)
|
|
var/mob/living_pawn = controller.pawn
|
|
|
|
for(var/turf/closed/mineral/potential_wall in oview(9, living_pawn))
|
|
if(!check_if_mineable(controller, potential_wall)) //check if its surrounded by walls
|
|
continue
|
|
controller.set_blackboard_key(found_wall_key, potential_wall) //closest wall first!
|
|
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
|
|
|
|
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
|
|
|
|
/datum/ai_behavior/find_mineral_wall/proc/check_if_mineable(datum/ai_controller/controller, turf/target_wall)
|
|
var/mob/living/source = controller.pawn
|
|
var/direction_to_turf = get_dir(target_wall, source)
|
|
if(!ISDIAGONALDIR(direction_to_turf))
|
|
return TRUE
|
|
var/list/directions_to_check = list()
|
|
for(var/direction_check in GLOB.cardinals)
|
|
if(direction_check & direction_to_turf)
|
|
directions_to_check += direction_check
|
|
|
|
for(var/direction in directions_to_check)
|
|
var/turf/test_turf = get_step(target_wall, direction)
|
|
if(isnull(test_turf))
|
|
continue
|
|
if(!test_turf.is_blocked_turf(ignore_atoms = list(source)))
|
|
return TRUE
|
|
return FALSE
|