mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-18 19:44:58 +01:00
88 lines
3.6 KiB
Plaintext
88 lines
3.6 KiB
Plaintext
/datum/ai_controller/basic_controller/bot/vibebot
|
|
blackboard = list(
|
|
BB_UNREACHABLE_LIST_COOLDOWN = 2 MINUTES,
|
|
BB_VIBEBOT_HAPPY_SONG = VIBEBOT_CHEER_SONG,
|
|
BB_VIBEBOT_GRIM_SONG = VIBEBOT_GRIM_MUSIC,
|
|
BB_VIBEBOT_BIRTHDAY_SONG = VIBEBOT_HAPPY_BIRTHDAY,
|
|
)
|
|
planning_subtrees = list(
|
|
/datum/ai_planning_subtree/escape_captivity/pacifist,
|
|
/datum/ai_planning_subtree/respond_to_summon,
|
|
/datum/ai_planning_subtree/find_party_friends,
|
|
/datum/ai_planning_subtree/find_patrol_beacon,
|
|
)
|
|
reset_keys = list(
|
|
BB_BEACON_TARGET,
|
|
BB_PREVIOUS_BEACON_TARGET,
|
|
BB_VIBEBOT_PARTY_TARGET,
|
|
BB_BOT_SUMMON_TARGET,
|
|
)
|
|
|
|
/datum/ai_controller/basic_controller/bot/vibebot/TryPossessPawn(atom/new_pawn)
|
|
. = ..()
|
|
if(. & AI_CONTROLLER_INCOMPATIBLE)
|
|
return
|
|
RegisterSignal(new_pawn, COMSIG_AI_BLACKBOARD_KEY_SET(BB_VIBEBOT_PARTY_TARGET), PROC_REF(play_music))
|
|
|
|
/datum/ai_controller/basic_controller/bot/vibebot/proc/play_music(datum/source, blackboard_key)
|
|
SIGNAL_HANDLER
|
|
|
|
var/mob/living/basic/bot/living_bot = pawn
|
|
var/obj/item/instrument/instrument = blackboard[BB_SONG_INSTRUMENT]
|
|
if(isnull(instrument))
|
|
return
|
|
var/atom/target = blackboard[blackboard_key]
|
|
var/datum/song/song = instrument.song
|
|
song.stop_playing()
|
|
var/song_lines
|
|
if(living_bot.bot_access_flags & BOT_COVER_EMAGGED)
|
|
song_lines = blackboard[BB_VIBEBOT_GRIM_SONG]
|
|
else
|
|
song_lines = HAS_TRAIT(target, TRAIT_BIRTHDAY_BOY) ? blackboard[BB_VIBEBOT_BIRTHDAY_SONG] : blackboard[BB_VIBEBOT_HAPPY_SONG]
|
|
if(isnull(song_lines))
|
|
return
|
|
song.ParseSong(new_song = song_lines)
|
|
song.start_playing(pawn)
|
|
addtimer(CALLBACK(song, TYPE_PROC_REF(/datum/song, stop_playing)), 10 SECONDS) //in 10 seconds, stop playing music
|
|
|
|
///subtree we use to find party friends in general
|
|
/datum/ai_planning_subtree/find_party_friends
|
|
|
|
/datum/ai_planning_subtree/find_party_friends/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
|
var/static/list/type_to_search = typecacheof(list(/mob/living/carbon/human))
|
|
if(!controller.blackboard_key_exists(BB_VIBEBOT_PARTY_TARGET))
|
|
controller.queue_behavior(/datum/ai_behavior/bot_search/party_friends, BB_VIBEBOT_PARTY_TARGET, type_to_search)
|
|
return
|
|
|
|
controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability/and_clear_target/vibebot_party, BB_VIBEBOT_PARTY_ABILITY, BB_VIBEBOT_PARTY_TARGET)
|
|
return SUBTREE_RETURN_FINISH_PLANNING
|
|
|
|
///behavior we use to party with people
|
|
/datum/ai_behavior/targeted_mob_ability/and_clear_target/vibebot_party
|
|
behavior_flags = AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_REQUIRE_MOVEMENT
|
|
|
|
/datum/ai_behavior/targeted_mob_ability/and_clear_target/vibebot_party/setup(datum/ai_controller/controller, ability_key, target_key)
|
|
. = ..()
|
|
var/atom/target = controller.blackboard[target_key]
|
|
if(QDELETED(target))
|
|
return FALSE
|
|
set_movement_target(controller, target)
|
|
|
|
/datum/ai_behavior/targeted_mob_ability/and_clear_target/vibebot_party/finish_action(datum/ai_controller/basic_controller/bot/controller, succeeded, ability_key, target_key)
|
|
var/atom/target = controller.blackboard[target_key]
|
|
controller.add_to_blacklist(target)
|
|
if(succeeded)
|
|
var/mob/living/living_pawn = controller.pawn
|
|
living_pawn.manual_emote("celebrates with [target]!")
|
|
living_pawn.emote("flip")
|
|
return ..()
|
|
|
|
///behavior that searches for party friends
|
|
/datum/ai_behavior/bot_search/party_friends
|
|
action_cooldown = 5 SECONDS
|
|
|
|
/datum/ai_behavior/bot_search/party_friends/valid_target(datum/ai_controller/basic_controller/bot/controller, mob/living/carbon/human/my_target)
|
|
if(my_target.stat != CONSCIOUS || isnull(my_target.mind))
|
|
return FALSE
|
|
return (my_target.mob_mood.mood_level < MOOD_LEVEL_NEUTRAL || HAS_TRAIT(my_target, TRAIT_BIRTHDAY_BOY))
|