mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-26 22:50:26 +01:00
[MIRROR] new syndicate item - bee smoker [MDB IGNORE] (#24450)
* new syndicate item - bee smoker (#78988) ## About The Pull Request this adds a new item for traitor botanists they can buy for 4 tc. it releases smoke which hypnotizes bees to follow ur every command, it can be used on a single bee or it can be used on a hive to hypnotize all the bees who live there. u can command the bees to enter or exit their beehive, and u can also command them to spiral around u where they will follow u and swirl around u to confuse whichever opponent u are fighting, and u can also command them to attack people. the bee smoker comes with some fuel but u can recharge it by putting cannabis into it. the stronger the weed the more fuel it will provide https://github.com/tgstation/tgstation/assets/138636438/18c9a350-8e24-4c49-abfa-dffb7622502f ## Why It's Good For The Game adds a traitor item which gives a new gameplay alternative for botanist and pacifist players. also i noticed the pet targetting datum was using some copy paste code so i made it a subtpye of the basic targetting datum ## Changelog 🆑 add: added a new syndicate item - the bee smoker /🆑 --------- Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com> * new syndicate item - bee smoker --------- Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com> Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com>
This commit is contained in:
co-authored by
MrMelbert
Ben10Omintrix
parent
8239cad917
commit
cffff937f6
@@ -45,6 +45,8 @@
|
||||
#define BB_CURRENT_HOME "BB_current_home"
|
||||
///the hydro we will pollinate
|
||||
#define BB_TARGET_HYDRO "BB_target_hydro"
|
||||
///key to swarm around
|
||||
#define BB_SWARM_TARGET "BB_swarm_target"
|
||||
|
||||
// bear keys
|
||||
///the hive with honey that we will steal from
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
var/list/airlocks = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock)
|
||||
for(var/i in 1 to run_distance)
|
||||
var/turf/test_destination = get_ranged_target_turf_direct(source, target, range = i, offset = angle)
|
||||
if(test_destination.is_blocked_turf(exclude_mobs = !source.density, source_atom = source, ignore_atoms = airlocks))
|
||||
if(test_destination.is_blocked_turf(source_atom = source, ignore_atoms = airlocks))
|
||||
break
|
||||
return_turf = test_destination
|
||||
return return_turf
|
||||
|
||||
@@ -1,43 +1,25 @@
|
||||
/// Don't target an atom in our friends list (or turfs), anything else is fair game
|
||||
/datum/targetting_datum/not_friends
|
||||
/datum/targetting_datum/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
|
||||
var/attack_until_past_stat = HARD_CRIT
|
||||
/// If we can try to closed turfs or not
|
||||
var/attack_closed_turf = FALSE
|
||||
|
||||
///Returns true or false depending on if the target can be attacked by the mob
|
||||
/datum/targetting_datum/not_friends/can_attack(mob/living/living_mob, atom/target, vision_range)
|
||||
if (!target)
|
||||
return FALSE
|
||||
if (attack_closed_turf)
|
||||
if (isopenturf(target))
|
||||
return FALSE
|
||||
else
|
||||
if (isturf(target))
|
||||
return FALSE
|
||||
|
||||
if (ismob(target))
|
||||
var/mob/mob_target = target
|
||||
if (mob_target.status_flags & GODMODE)
|
||||
return FALSE
|
||||
if (mob_target.stat > attack_until_past_stat)
|
||||
return FALSE
|
||||
|
||||
if (living_mob.see_invisible < target.invisibility)
|
||||
return FALSE
|
||||
if (isturf(target.loc) && living_mob.z != target.z) // z check will always fail if target is in a mech
|
||||
return FALSE
|
||||
if (!living_mob.ai_controller) // How did you get here?
|
||||
return FALSE
|
||||
|
||||
if (!(target in living_mob.ai_controller.blackboard[BB_FRIENDS_LIST]))
|
||||
// We don't have any friends, anything's fair game
|
||||
// OR This is not our friend, fire at will
|
||||
/datum/targetting_datum/basic/not_friends/can_attack(mob/living/living_mob, atom/target, vision_range)
|
||||
if(attack_closed_turf && isclosedturf(target))
|
||||
return TRUE
|
||||
|
||||
if(target in living_mob.ai_controller.blackboard[BB_FRIENDS_LIST])
|
||||
return FALSE
|
||||
|
||||
return ..()
|
||||
|
||||
///friends dont care about factions
|
||||
/datum/targetting_datum/basic/not_friends/faction_check(mob/living/living_mob, mob/living/the_target)
|
||||
return FALSE
|
||||
|
||||
/datum/targetting_datum/not_friends/attack_closed_turfs
|
||||
/datum/targetting_datum/basic/not_friends/attack_closed_turfs
|
||||
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.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
blackboard = list(
|
||||
BB_DOG_HARASS_HARM = TRUE,
|
||||
BB_VISION_RANGE = AI_DOG_VISION_RANGE,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(),
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
||||
)
|
||||
ai_movement = /datum/ai_movement/basic_avoidance
|
||||
idle_behavior = /datum/idle_behavior/idle_dog
|
||||
@@ -19,7 +19,7 @@
|
||||
blackboard = list(
|
||||
BB_DOG_HARASS_HARM = TRUE,
|
||||
BB_VISION_RANGE = AI_DOG_VISION_RANGE,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(),
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
||||
// Find nearby mobs with tongs in hand.
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/holding_object(/obj/item/kitchen/tongs),
|
||||
BB_BABIES_PARTNER_TYPES = list(/mob/living/basic/pet/dog),
|
||||
|
||||
@@ -41,13 +41,15 @@
|
||||
radial_icon = 'icons/testing/turf_analysis.dmi'
|
||||
radial_icon_state = "red_arrow"
|
||||
speech_commands = list("heel", "follow")
|
||||
///the behavior we use to follow
|
||||
var/follow_behavior = /datum/ai_behavior/pet_follow_friend
|
||||
|
||||
/datum/pet_command/follow/set_command_active(mob/living/parent, mob/living/commander)
|
||||
. = ..()
|
||||
set_command_target(parent, commander)
|
||||
|
||||
/datum/pet_command/follow/execute_action(datum/ai_controller/controller)
|
||||
controller.queue_behavior(/datum/ai_behavior/pet_follow_friend, BB_CURRENT_PET_TARGET)
|
||||
controller.queue_behavior(follow_behavior, BB_CURRENT_PET_TARGET)
|
||||
return SUBTREE_RETURN_FINISH_PLANNING
|
||||
|
||||
/**
|
||||
|
||||
@@ -40,3 +40,7 @@
|
||||
end_volume = 35
|
||||
volume = 40
|
||||
ignore_walls = FALSE
|
||||
|
||||
/datum/looping_sound/beesmoke
|
||||
mid_sounds = list('sound/weapons/beesmoke.ogg' = 1)
|
||||
volume = 5
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
/// multiplier to decide how much fuel we add to a smoker
|
||||
#define WEED_WINE_MULTIPLIER 0.2
|
||||
|
||||
/obj/item/bee_smoker
|
||||
name = "bee smoker"
|
||||
desc = "A device which can be used to hypnotize bees!"
|
||||
icon = 'icons/obj/service/hydroponics/equipment.dmi'
|
||||
icon_state = "bee_smoker"
|
||||
inhand_icon_state = "bee_smoker"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
|
||||
item_flags = NOBLUDGEON
|
||||
/// current level of fuel we have
|
||||
var/current_herb_fuel = 50
|
||||
/// maximum amount of fuel we can hold
|
||||
var/max_herb_fuel = 50
|
||||
/// are we currently activated?
|
||||
var/activated = FALSE
|
||||
/// sound to play when releasing smoke
|
||||
var/datum/looping_sound/beesmoke/beesmoke_loop
|
||||
///how much fuel it costs to use this item
|
||||
var/single_use_cost = 5
|
||||
|
||||
/obj/item/bee_smoker/Initialize(mapload)
|
||||
. = ..()
|
||||
beesmoke_loop = new(src)
|
||||
|
||||
/obj/item/bee_smoker/attack_self(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return TRUE
|
||||
if(!activated && current_herb_fuel <= 0)
|
||||
user.balloon_alert(user, "no fuel!")
|
||||
return TRUE
|
||||
alter_state()
|
||||
user.balloon_alert(user, "[activated ? "activated" : "deactivated"]")
|
||||
return TRUE
|
||||
|
||||
/obj/item/bee_smoker/afterattack(atom/attacked_atom, mob/living/user, proximity)
|
||||
. = ..()
|
||||
|
||||
if(!proximity)
|
||||
return
|
||||
|
||||
. |= AFTERATTACK_PROCESSED_ITEM
|
||||
|
||||
if(!activated)
|
||||
user.balloon_alert(user, "not activated!")
|
||||
return
|
||||
|
||||
if(current_herb_fuel < single_use_cost)
|
||||
user.balloon_alert(user, "not enough fuel!")
|
||||
return
|
||||
|
||||
current_herb_fuel -= single_use_cost
|
||||
playsound(src, 'sound/effects/spray2.ogg', 100, TRUE)
|
||||
var/turf/target_turf = get_turf(attacked_atom)
|
||||
new /obj/effect/temp_visual/mook_dust(target_turf)
|
||||
|
||||
for(var/mob/living/basic/bee/friend in target_turf)
|
||||
if(friend.flags_1 & HOLOGRAM_1)
|
||||
continue
|
||||
friend.befriend(user)
|
||||
|
||||
if(!istype(attacked_atom, /obj/structure/beebox))
|
||||
return
|
||||
|
||||
var/obj/structure/beebox/hive = attacked_atom
|
||||
for(var/mob/living/bee as anything in hive.bees)
|
||||
if(bee.flags_1 & HOLOGRAM_1)
|
||||
continue
|
||||
bee.befriend(user)
|
||||
|
||||
/obj/item/bee_smoker/attackby(obj/item/herb, mob/living/carbon/human/user, list/modifiers)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(!istype(herb, /obj/item/food/grown/cannabis))
|
||||
return
|
||||
var/obj/item/food/grown/cannabis/weed = herb
|
||||
if(isnull(weed.wine_power))
|
||||
return TRUE
|
||||
if(current_herb_fuel == max_herb_fuel)
|
||||
user.balloon_alert(user, "already at maximum fuel!")
|
||||
return TRUE
|
||||
var/fuel_worth = weed.wine_power * WEED_WINE_MULTIPLIER
|
||||
current_herb_fuel = (current_herb_fuel + fuel_worth > max_herb_fuel) ? max_herb_fuel : current_herb_fuel + fuel_worth
|
||||
user.balloon_alert(user, "fuel added")
|
||||
qdel(weed)
|
||||
return TRUE
|
||||
|
||||
/obj/item/bee_smoker/process(seconds_per_tick)
|
||||
current_herb_fuel--
|
||||
if(current_herb_fuel <= 0)
|
||||
alter_state()
|
||||
|
||||
/obj/item/bee_smoker/proc/alter_state()
|
||||
activated = !activated
|
||||
playsound(src, 'sound/items/welderdeactivate.ogg', 50, TRUE)
|
||||
|
||||
if(!activated)
|
||||
beesmoke_loop.stop()
|
||||
QDEL_NULL(particles)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return
|
||||
|
||||
beesmoke_loop.start()
|
||||
START_PROCESSING(SSobj, src)
|
||||
particles = new /particles/smoke/bee_smoke
|
||||
|
||||
/particles/smoke/bee_smoke
|
||||
lifespan = 0.4 SECONDS
|
||||
position = list(-12, 7, 0)
|
||||
velocity = list(0, 0.15, 0)
|
||||
fade = 2
|
||||
|
||||
#undef WEED_WINE_MULTIPLIER
|
||||
@@ -54,6 +54,16 @@
|
||||
var/icon_base = "bee"
|
||||
///the bee is a queen?
|
||||
var/is_queen = FALSE
|
||||
///commands we follow
|
||||
var/list/pet_commands = list(
|
||||
/datum/pet_command/idle,
|
||||
/datum/pet_command/free,
|
||||
/datum/pet_command/beehive/enter,
|
||||
/datum/pet_command/beehive/exit,
|
||||
/datum/pet_command/follow/bee,
|
||||
/datum/pet_command/point_targetting/attack/swirl,
|
||||
/datum/pet_command/scatter,
|
||||
)
|
||||
|
||||
/mob/living/basic/bee/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -62,6 +72,7 @@
|
||||
AddElement(/datum/element/simple_flying)
|
||||
AddComponent(/datum/component/clickbox, x_offset = -2, y_offset = -2)
|
||||
AddComponent(/datum/component/swarming)
|
||||
AddComponent(/datum/component/obeys_commands, pet_commands)
|
||||
AddElement(/datum/element/swabable, CELL_LINE_TABLE_QUEEN_BEE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
|
||||
RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack))
|
||||
|
||||
|
||||
@@ -102,9 +102,149 @@
|
||||
return FALSE
|
||||
|
||||
var/atom/bee_hive = bee_ai.blackboard[BB_CURRENT_HOME]
|
||||
if(bee_hive && get_dist(target, bee_hive) > AGGRO_DISTANCE_FROM_HIVE)
|
||||
if(bee_hive && get_dist(target, bee_hive) > AGGRO_DISTANCE_FROM_HIVE && can_see(owner, bee_hive, 9))
|
||||
return FALSE
|
||||
|
||||
return !(mob_target.bee_friendly())
|
||||
|
||||
|
||||
///pet commands
|
||||
/datum/pet_command/follow/bee
|
||||
///the behavior we use to follow
|
||||
follow_behavior = /datum/ai_behavior/pet_follow_friend/bee
|
||||
|
||||
/datum/ai_behavior/pet_follow_friend/bee
|
||||
required_distance = 0
|
||||
|
||||
///swirl around the owner in menacing fashion
|
||||
/datum/pet_command/point_targetting/attack/swirl
|
||||
command_name = "Swirl"
|
||||
command_desc = "Your pets will swirl around you and attack whoever you point at!"
|
||||
speech_commands = list("swirl", "spiral", "swarm")
|
||||
pointed_reaction = null
|
||||
refuse_reaction = null
|
||||
command_feedback = null
|
||||
///the owner we will swarm around
|
||||
var/key_to_swarm = BB_SWARM_TARGET
|
||||
|
||||
/datum/pet_command/point_targetting/attack/swirl/try_activate_command(mob/living/commander)
|
||||
var/mob/living/living_pawn = weak_parent.resolve()
|
||||
if(isnull(living_pawn))
|
||||
return
|
||||
var/datum/ai_controller/basic_controller/controller = living_pawn.ai_controller
|
||||
if(isnull(controller))
|
||||
return
|
||||
controller.clear_blackboard_key(BB_CURRENT_PET_TARGET)
|
||||
controller.set_blackboard_key(key_to_swarm, commander)
|
||||
return ..()
|
||||
|
||||
/datum/pet_command/point_targetting/attack/swirl/execute_action(datum/ai_controller/controller)
|
||||
if(controller.blackboard_key_exists(BB_CURRENT_PET_TARGET))
|
||||
return ..()
|
||||
controller.queue_behavior(/datum/ai_behavior/swirl_around_target, BB_SWARM_TARGET)
|
||||
return SUBTREE_RETURN_FINISH_PLANNING
|
||||
|
||||
/datum/ai_behavior/swirl_around_target
|
||||
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM
|
||||
required_distance = 0
|
||||
///chance to swirl
|
||||
var/swirl_chance = 60
|
||||
|
||||
/datum/ai_behavior/swirl_around_target/setup(datum/ai_controller/controller, target_key)
|
||||
. = ..()
|
||||
var/atom/target = controller.blackboard[target_key]
|
||||
if(QDELETED(target))
|
||||
return FALSE
|
||||
set_movement_target(controller, target)
|
||||
|
||||
/datum/ai_behavior/swirl_around_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
|
||||
. = ..()
|
||||
var/atom/target = controller.blackboard[target_key]
|
||||
var/mob/living/living_pawn = controller.pawn
|
||||
|
||||
if(QDELETED(target))
|
||||
finish_action(controller, TRUE)
|
||||
|
||||
if(get_dist(target, living_pawn) > 1)
|
||||
set_movement_target(controller, target)
|
||||
return
|
||||
|
||||
if(!SPT_PROB(swirl_chance, seconds_per_tick))
|
||||
return
|
||||
|
||||
var/list/possible_turfs = list()
|
||||
|
||||
for(var/turf/possible_turf in oview(2, target))
|
||||
if(possible_turf.is_blocked_turf(source_atom = living_pawn))
|
||||
continue
|
||||
possible_turfs += possible_turf
|
||||
|
||||
if(!length(possible_turfs))
|
||||
return
|
||||
|
||||
if(isnull(controller.movement_target_source) || controller.movement_target_source == type)
|
||||
set_movement_target(controller, pick(possible_turfs))
|
||||
|
||||
|
||||
/datum/pet_command/beehive
|
||||
radial_icon = 'icons/obj/service/hydroponics/equipment.dmi'
|
||||
radial_icon_state = "beebox"
|
||||
|
||||
/datum/pet_command/beehive/try_activate_command(mob/living/commander)
|
||||
var/mob/living/living_pawn = weak_parent.resolve()
|
||||
if(isnull(living_pawn))
|
||||
return
|
||||
var/datum/ai_controller/basic_controller/controller = living_pawn.ai_controller
|
||||
if(isnull(controller))
|
||||
return
|
||||
var/obj/hive = controller.blackboard[BB_CURRENT_HOME]
|
||||
if(isnull(hive))
|
||||
return
|
||||
if(!check_beehive_conditions(living_pawn, hive))
|
||||
return
|
||||
return ..()
|
||||
|
||||
/datum/pet_command/beehive/proc/check_beehive_conditions(obj/structure/hive)
|
||||
return
|
||||
|
||||
/datum/pet_command/beehive/execute_action(datum/ai_controller/controller)
|
||||
controller.queue_behavior(/datum/ai_behavior/enter_exit_hive, BB_CURRENT_HOME)
|
||||
controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND)
|
||||
return SUBTREE_RETURN_FINISH_PLANNING
|
||||
|
||||
/datum/pet_command/beehive/enter
|
||||
command_name = "Enter beehive"
|
||||
command_desc = "Your bees will enter their beehive."
|
||||
speech_commands = list("enter", "home", "in")
|
||||
|
||||
/datum/pet_command/beehive/enter/check_beehive_conditions(mob/living/living_pawn, obj/structure/hive)
|
||||
if(living_pawn in hive) //already in hive
|
||||
return FALSE
|
||||
return can_see(living_pawn, hive, 9)
|
||||
|
||||
/datum/pet_command/beehive/exit
|
||||
command_name = "Exit beehive"
|
||||
command_desc = "Your bees will exit their beehive."
|
||||
speech_commands = list("exit", "leave", "out")
|
||||
|
||||
/datum/pet_command/beehive/exit/check_beehive_conditions(mob/living/living_pawn, obj/structure/hive)
|
||||
return (living_pawn in hive)
|
||||
|
||||
/datum/pet_command/scatter
|
||||
command_name = "Scatter"
|
||||
command_desc = "Command your pets to scatter all around you!"
|
||||
speech_commands = list("disperse", "spread", "scatter")
|
||||
|
||||
/datum/pet_command/scatter/set_command_active(mob/living/parent, mob/living/commander)
|
||||
. = ..()
|
||||
set_command_target(parent, commander)
|
||||
|
||||
/datum/pet_command/scatter/execute_action(datum/ai_controller/controller)
|
||||
controller.queue_behavior(/datum/ai_behavior/run_away_from_target/scatter, BB_CURRENT_PET_TARGET)
|
||||
controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND)
|
||||
return SUBTREE_RETURN_FINISH_PLANNING
|
||||
|
||||
/datum/ai_behavior/run_away_from_target/scatter
|
||||
run_distance = 4
|
||||
|
||||
#undef AGGRO_DISTANCE_FROM_HIVE
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/datum/ai_controller/basic_controller/bee
|
||||
blackboard = list(
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/bee,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
||||
)
|
||||
|
||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||
@@ -8,6 +9,7 @@
|
||||
idle_behavior = /datum/idle_behavior/idle_random_walk
|
||||
|
||||
planning_subtrees = list(
|
||||
/datum/ai_planning_subtree/pet_planning,
|
||||
/datum/ai_planning_subtree/find_valid_home,
|
||||
/datum/ai_planning_subtree/enter_exit_home,
|
||||
/datum/ai_planning_subtree/find_and_hunt_target/pollinate,
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
/datum/ai_controller/basic_controller/star_gazer
|
||||
blackboard = list(
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/star_gazer(),
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends/attack_closed_turfs(),
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends/attack_closed_turfs,
|
||||
)
|
||||
|
||||
ai_movement = /datum/ai_movement/basic_avoidance
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/ai_controller/basic_controller/seedling
|
||||
blackboard = list(
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
||||
BB_WEEDLEVEL_THRESHOLD = 3,
|
||||
BB_WATERLEVEL_THRESHOLD = 90,
|
||||
)
|
||||
@@ -142,7 +142,7 @@
|
||||
/datum/ai_controller/basic_controller/seedling/meanie
|
||||
blackboard = list(
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
||||
)
|
||||
planning_subtrees = list(
|
||||
/datum/ai_planning_subtree/pet_planning,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/ai_controller/basic_controller/goldgrub
|
||||
blackboard = list(
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
||||
BB_ORE_IGNORE_TYPES = list(/obj/item/stack/ore/iron, /obj/item/stack/ore/glass),
|
||||
BB_STORM_APPROACHING = FALSE,
|
||||
)
|
||||
|
||||
@@ -135,6 +135,8 @@
|
||||
icon_state = "mook_leap_cloud"
|
||||
layer = BELOW_MOB_LAYER
|
||||
plane = GAME_PLANE
|
||||
pixel_x = -16
|
||||
pixel_y = -16
|
||||
base_pixel_y = -16
|
||||
base_pixel_x = -16
|
||||
duration = 1 SECONDS
|
||||
|
||||
@@ -267,7 +267,7 @@ GLOBAL_LIST_INIT(mook_commands, list(
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/mook,
|
||||
BB_MAXIMUM_DISTANCE_TO_VILLAGE = 10,
|
||||
BB_STORM_APPROACHING = FALSE,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
||||
)
|
||||
idle_behavior = /datum/idle_behavior/walk_near_target/mook_village
|
||||
planning_subtrees = list(
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/ai_controller/basic_controller/minebot
|
||||
blackboard = list(
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
||||
BB_BLACKLIST_MINERAL_TURFS = list(/turf/closed/mineral/gibtonite),
|
||||
BB_AUTOMATED_MINING = FALSE,
|
||||
)
|
||||
|
||||
@@ -9,8 +9,9 @@
|
||||
*/
|
||||
/datum/ai_controller/basic_controller/carp
|
||||
blackboard = list(
|
||||
BB_BASIC_MOB_STOP_FLEEING = TRUE,
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends
|
||||
)
|
||||
|
||||
ai_movement = /datum/ai_movement/basic_avoidance
|
||||
@@ -35,9 +36,9 @@
|
||||
*/
|
||||
/datum/ai_controller/basic_controller/carp/pet
|
||||
blackboard = list(
|
||||
BB_ALWAYS_IGNORE_FACTION = TRUE,
|
||||
BB_BASIC_MOB_STOP_FLEEING = TRUE,
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends
|
||||
)
|
||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||
planning_subtrees = list(
|
||||
@@ -79,8 +80,9 @@
|
||||
*/
|
||||
/datum/ai_controller/basic_controller/carp/passive
|
||||
blackboard = list(
|
||||
BB_BASIC_MOB_STOP_FLEEING = TRUE,
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
||||
)
|
||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||
planning_subtrees = list(
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
/datum/ai_controller/basic_controller/cockroach
|
||||
blackboard = list(
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(),
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(),
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
||||
)
|
||||
|
||||
ai_traits = STOP_MOVING_WHEN_PULLED
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
/datum/ai_controller/basic_controller/frog
|
||||
blackboard = list(
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(),
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(),
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends
|
||||
)
|
||||
|
||||
ai_movement = /datum/ai_movement/basic_avoidance
|
||||
|
||||
@@ -411,8 +411,8 @@
|
||||
/// AI controller for rats, slightly more complex than mice becuase they attack people
|
||||
/datum/ai_controller/basic_controller/mouse/rat
|
||||
blackboard = list(
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(),
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(),
|
||||
BB_TARGETTING_DATUM = new /datum/targetting_datum/basic,
|
||||
BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends,
|
||||
BB_BASIC_MOB_CURRENT_TARGET = null, // heathen
|
||||
BB_CURRENT_HUNTING_TARGET = null, // cheese
|
||||
BB_LOW_PRIORITY_HUNTING_TARGET = null, // cable
|
||||
|
||||
@@ -336,3 +336,10 @@
|
||||
item = /obj/item/seeds/seedling/evil
|
||||
cost = 8
|
||||
restricted_roles = list(JOB_BOTANIST)
|
||||
|
||||
/datum/uplink_item/role_restricted/bee_smoker
|
||||
name = "Bee Smoker"
|
||||
desc = "A device that runs on cannabis, turning it into a gas that can hypnotize bees to follow our commands."
|
||||
item = /obj/item/bee_smoker
|
||||
cost = 4
|
||||
restricted_roles = list(JOB_BOTANIST)
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.3 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.3 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
Binary file not shown.
@@ -4027,6 +4027,7 @@
|
||||
#include "code\modules\hydroponics\seed_extractor.dm"
|
||||
#include "code\modules\hydroponics\seeds.dm"
|
||||
#include "code\modules\hydroponics\unique_plant_genes.dm"
|
||||
#include "code\modules\hydroponics\beekeeping\bee_smoker.dm"
|
||||
#include "code\modules\hydroponics\beekeeping\beebox.dm"
|
||||
#include "code\modules\hydroponics\beekeeping\beekeeper_suit.dm"
|
||||
#include "code\modules\hydroponics\beekeeping\honey_frame.dm"
|
||||
|
||||
Reference in New Issue
Block a user