mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-11 15:14:27 +01:00
Converts bees to basic mobs (#30662)
* Converts bees to basic mobs * Undefs * Linters
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
/// if we have a hive, this will be our aggro distance
|
||||
#define AGGRO_DISTANCE_FROM_HIVE 2
|
||||
/datum/ai_behavior/hunt_target/pollinate
|
||||
always_reset_target = TRUE
|
||||
|
||||
/datum/ai_behavior/hunt_target/pollinate/target_caught(mob/living/hunter, obj/machinery/hydroponics/hydro_target)
|
||||
var/datum/callback/callback = CALLBACK(hunter, TYPE_PROC_REF(/mob/living/basic/bee, pollinate), hydro_target)
|
||||
callback.Invoke()
|
||||
|
||||
/datum/ai_behavior/find_hunt_target/pollinate
|
||||
action_cooldown = 10 SECONDS
|
||||
|
||||
/datum/ai_behavior/find_hunt_target/pollinate/valid_dinner(mob/living/source, obj/machinery/hydroponics/dinner, radius)
|
||||
if(!dinner.can_bee_pollinate())
|
||||
return FALSE
|
||||
return can_see(source, dinner, radius)
|
||||
|
||||
/datum/ai_behavior/enter_exit_hive
|
||||
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH
|
||||
action_cooldown = 10 SECONDS
|
||||
|
||||
/datum/ai_behavior/enter_exit_hive/setup(datum/ai_controller/controller, target_key, attack_key)
|
||||
. = ..()
|
||||
var/atom/target = controller.blackboard[target_key]
|
||||
if(QDELETED(target))
|
||||
return FALSE
|
||||
set_movement_target(controller, target)
|
||||
|
||||
/datum/ai_behavior/enter_exit_hive/perform(seconds_per_tick, datum/ai_controller/controller, target_key, attack_key)
|
||||
var/obj/structure/beebox/current_home = controller.blackboard[target_key]
|
||||
var/atom/attack_target = controller.blackboard[attack_key]
|
||||
|
||||
if(attack_target) // forget about who we attacking when we go home
|
||||
controller.clear_blackboard_key(attack_key)
|
||||
|
||||
controller.ai_interact(target = current_home, intent = INTENT_HELP)
|
||||
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
|
||||
|
||||
/datum/ai_behavior/inhabit_hive
|
||||
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH
|
||||
|
||||
/datum/ai_behavior/inhabit_hive/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/inhabit_hive/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
|
||||
var/obj/structure/beebox/potential_home = controller.blackboard[target_key]
|
||||
var/mob/living/bee_pawn = controller.pawn
|
||||
|
||||
if(!potential_home.habitable(bee_pawn)) //the house become full before we get to it
|
||||
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
|
||||
|
||||
controller.ai_interact(target = potential_home, intent = INTENT_HELP)
|
||||
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
|
||||
|
||||
/datum/ai_behavior/inhabit_hive/finish_action(datum/ai_controller/controller, succeeded, target_key)
|
||||
. = ..()
|
||||
if(!succeeded)
|
||||
controller.clear_blackboard_key(target_key) //failed to make it our home so find another
|
||||
|
||||
/datum/ai_behavior/find_and_set/bee_hive
|
||||
action_cooldown = 10 SECONDS
|
||||
|
||||
/datum/ai_behavior/find_and_set/bee_hive/search_tactic(datum/ai_controller/controller, locate_path, search_range)
|
||||
var/list/valid_hives = list()
|
||||
var/mob/living/bee_pawn = controller.pawn
|
||||
|
||||
if(istype(bee_pawn.loc, /obj/structure/beebox))
|
||||
return bee_pawn.loc //for premade homes
|
||||
|
||||
for(var/obj/structure/beebox/potential_home in oview(search_range, bee_pawn))
|
||||
if(!potential_home.habitable(bee_pawn))
|
||||
continue
|
||||
valid_hives += potential_home
|
||||
|
||||
if(valid_hives.len)
|
||||
return pick(valid_hives)
|
||||
|
||||
/datum/targeting_strategy/basic/bee
|
||||
|
||||
/datum/targeting_strategy/basic/bee/can_attack(mob/living/owner, atom/target, vision_range)
|
||||
if(!isliving(target))
|
||||
return FALSE
|
||||
. = ..()
|
||||
if(!.)
|
||||
return FALSE
|
||||
|
||||
var/mob/living/mob_target = target
|
||||
|
||||
if(mob_target.mob_biotypes & MOB_PLANT)
|
||||
return FALSE
|
||||
|
||||
var/datum/ai_controller/basic_controller/bee_ai = owner.ai_controller
|
||||
if(isnull(bee_ai))
|
||||
return FALSE
|
||||
|
||||
var/atom/bee_hive = bee_ai.blackboard[BB_CURRENT_HOME]
|
||||
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())
|
||||
|
||||
#undef AGGRO_DISTANCE_FROM_HIVE
|
||||
@@ -0,0 +1,108 @@
|
||||
/datum/ai_controller/basic_controller/bee
|
||||
blackboard = list(
|
||||
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/bee,
|
||||
)
|
||||
|
||||
ai_traits = PASSIVE_AI_FLAGS
|
||||
ai_movement = /datum/ai_movement/basic_avoidance
|
||||
idle_behavior = /datum/idle_behavior/idle_random_walk
|
||||
|
||||
planning_subtrees = list(
|
||||
/datum/ai_planning_subtree/find_valid_home,
|
||||
/datum/ai_planning_subtree/enter_exit_home,
|
||||
/datum/ai_planning_subtree/find_and_hunt_target/pollinate,
|
||||
/datum/ai_planning_subtree/simple_find_target/bee,
|
||||
/datum/ai_planning_subtree/basic_melee_attack_subtree,
|
||||
)
|
||||
|
||||
/datum/ai_controller/basic_controller/queen_bee
|
||||
blackboard = list(
|
||||
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/bee,
|
||||
)
|
||||
|
||||
ai_traits = PASSIVE_AI_FLAGS
|
||||
ai_movement = /datum/ai_movement/basic_avoidance
|
||||
idle_behavior = /datum/idle_behavior/idle_random_walk
|
||||
|
||||
planning_subtrees = list(
|
||||
/datum/ai_planning_subtree/find_valid_home,
|
||||
/datum/ai_planning_subtree/enter_exit_home/queen,
|
||||
/datum/ai_planning_subtree/simple_find_target,
|
||||
/datum/ai_planning_subtree/basic_melee_attack_subtree,
|
||||
)
|
||||
|
||||
/datum/ai_controller/basic_controller/syndibee
|
||||
blackboard = list(
|
||||
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends,
|
||||
)
|
||||
|
||||
ai_movement = /datum/ai_movement/jps
|
||||
idle_behavior = /datum/idle_behavior/idle_random_walk
|
||||
planning_subtrees = list(
|
||||
/datum/ai_planning_subtree/simple_find_target,
|
||||
/datum/ai_planning_subtree/basic_melee_attack_subtree,
|
||||
)
|
||||
|
||||
/datum/ai_planning_subtree/simple_find_target/bee/select_behaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||
var/atom/hydro_target = controller.blackboard[BB_TARGET_HYDRO]
|
||||
if(hydro_target)
|
||||
return SUBTREE_RETURN_FINISH_PLANNING
|
||||
return ..()
|
||||
|
||||
/datum/ai_planning_subtree/find_valid_home
|
||||
|
||||
/datum/ai_planning_subtree/find_valid_home/select_behaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||
var/mob/living/work_bee = controller.pawn
|
||||
|
||||
var/obj/structure/beebox/current_home = controller.blackboard[BB_CURRENT_HOME]
|
||||
|
||||
if(QDELETED(current_home))
|
||||
controller.queue_behavior(/datum/ai_behavior/find_and_set/bee_hive, BB_CURRENT_HOME, /obj/structure/beebox)
|
||||
return
|
||||
|
||||
if(work_bee in current_home.bees)
|
||||
return
|
||||
|
||||
controller.queue_behavior(/datum/ai_behavior/inhabit_hive, BB_CURRENT_HOME)
|
||||
return SUBTREE_RETURN_FINISH_PLANNING
|
||||
|
||||
/datum/ai_planning_subtree/enter_exit_home
|
||||
/// chance we go back home
|
||||
var/flyback_chance = 15
|
||||
/// chance we exit the home
|
||||
var/exit_chance = 35
|
||||
|
||||
/datum/ai_planning_subtree/enter_exit_home/select_behaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||
|
||||
var/obj/structure/beebox/current_home = controller.blackboard[BB_CURRENT_HOME]
|
||||
|
||||
if(QDELETED(current_home))
|
||||
return
|
||||
|
||||
var/mob/living/bee_pawn = controller.pawn
|
||||
var/action_prob = (bee_pawn.loc == current_home) ? exit_chance : flyback_chance
|
||||
|
||||
if(!SPT_PROB(action_prob, seconds_per_tick))
|
||||
return
|
||||
|
||||
controller.queue_behavior(/datum/ai_behavior/enter_exit_hive, BB_CURRENT_HOME, BB_BASIC_MOB_CURRENT_TARGET)
|
||||
return SUBTREE_RETURN_FINISH_PLANNING
|
||||
|
||||
// the queen spends more time in the hive
|
||||
/datum/ai_planning_subtree/enter_exit_home/queen
|
||||
flyback_chance = 85
|
||||
exit_chance = 5
|
||||
|
||||
/datum/ai_planning_subtree/find_and_hunt_target/pollinate
|
||||
target_key = BB_TARGET_HYDRO
|
||||
hunting_behavior = /datum/ai_behavior/hunt_target/pollinate
|
||||
finding_behavior = /datum/ai_behavior/find_hunt_target/pollinate
|
||||
hunt_targets = list(/obj/machinery/hydroponics)
|
||||
hunt_range = 10
|
||||
hunt_chance = 85
|
||||
|
||||
/datum/ai_planning_subtree/find_and_hunt_target/pollinate/select_behaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||
var/atom/atom_pawn = controller.pawn
|
||||
if(!isturf(atom_pawn.loc))
|
||||
return
|
||||
return ..()
|
||||
@@ -0,0 +1,284 @@
|
||||
#define BEE_TRAY_RECENT_VISIT 20 SECONDS /// How long in deciseconds until a tray can be visited by a bee again
|
||||
#define BEE_DEFAULT_COLOUR "#e5e500" /// the colour we make the stripes of the bee if our reagent has no colour (or we have no reagent)
|
||||
#define BEE_POLLINATE_YIELD_CHANCE 33 /// chance to increase yield of plant
|
||||
#define BEE_POLLINATE_PEST_CHANCE 33 /// chance to decrease pest of plant
|
||||
#define BEE_POLLINATE_POTENCY_CHANCE 50 /// chance to increase potancy of plant
|
||||
#define BEE_FOODGROUPS RAW | MEAT | GORE | BUGS /// the bee food contents
|
||||
|
||||
/mob/living/basic/bee
|
||||
name = "bee"
|
||||
desc = "Buzzy buzzy bee, stingy sti- Ouch!"
|
||||
icon_state = ""
|
||||
icon = 'icons/mob/bees.dmi'
|
||||
gender = FEMALE
|
||||
speak_emote = list("buzzes")
|
||||
|
||||
melee_damage_lower = 1
|
||||
melee_damage_upper = 1
|
||||
attack_verb_continuous = "stings"
|
||||
attack_verb_simple = "sting"
|
||||
response_help_continuous = "shoos"
|
||||
response_help_simple = "shoo"
|
||||
response_disarm_continuous = "swats away"
|
||||
response_disarm_simple = "swat away"
|
||||
response_harm_continuous = "squashes"
|
||||
response_harm_simple = "squash"
|
||||
|
||||
speed = 0.5
|
||||
maxHealth = 10
|
||||
health = 10
|
||||
melee_damage_lower = 1
|
||||
melee_damage_upper = 1
|
||||
melee_attack_cooldown_min = 1.5 SECONDS
|
||||
melee_attack_cooldown_max = 2.5 SECONDS
|
||||
attack_sound = null // Stings are quiet
|
||||
faction = list("hostile")
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
mob_size = MOB_SIZE_TINY
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BUG
|
||||
density = FALSE
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minimum_survivable_temperature = 0
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
basic_mob_flags = DEL_ON_DEATH
|
||||
initial_traits = list(TRAIT_FLYING)
|
||||
ai_controller = /datum/ai_controller/basic_controller/bee
|
||||
/// the reagent the bee has
|
||||
var/datum/reagent/beegent = null
|
||||
/// the house we live in
|
||||
var/obj/structure/beebox/beehome = null
|
||||
/// our icon base
|
||||
var/icon_base = "bee"
|
||||
/// Icon creation
|
||||
var/static/list/bee_icons = list()
|
||||
/// the bee is a queen?
|
||||
var/is_queen = FALSE
|
||||
/// Is this a syndibee?
|
||||
var/bee_syndicate = FALSE
|
||||
|
||||
/mob/living/basic/bee/Initialize(mapload)
|
||||
. = ..()
|
||||
generate_bee_visuals()
|
||||
AddComponent(/datum/component/swarming)
|
||||
|
||||
/mob/living/basic/bee/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE
|
||||
|
||||
/mob/living/basic/bee/examine(mob/user)
|
||||
. = ..()
|
||||
if(!bee_syndicate && !beehome)
|
||||
. += "<span class='warning'>This bee is homeless!</span>"
|
||||
|
||||
/mob/living/basic/bee/Destroy()
|
||||
if(beehome)
|
||||
beehome.bees -= src
|
||||
beehome = null
|
||||
beegent = null
|
||||
return ..()
|
||||
|
||||
/mob/living/basic/bee/death(gibbed)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
if(beehome)
|
||||
if(beehome.bees)
|
||||
beehome.bees.Remove(src)
|
||||
beehome = null
|
||||
|
||||
// All bee sprites are made up of overlays. They do not have any special sprite overlays for items placed on them, such as collars, so this proc is unneeded.
|
||||
/mob/living/basic/bee/regenerate_icons()
|
||||
return
|
||||
|
||||
/mob/living/basic/bee/proc/generate_bee_visuals()
|
||||
overlays.Cut()
|
||||
|
||||
var/col = BEE_DEFAULT_COLOUR
|
||||
if(beegent && beegent.color)
|
||||
col = beegent.color
|
||||
|
||||
var/image/base
|
||||
if(!bee_icons["[icon_base]_base"])
|
||||
bee_icons["[icon_base]_base"] = image(icon = 'icons/mob/bees.dmi', icon_state = "[icon_base]_base")
|
||||
base = bee_icons["[icon_base]_base"]
|
||||
overlays += base
|
||||
|
||||
var/image/greyscale
|
||||
if(!bee_icons["[icon_base]_grey_[col]"])
|
||||
bee_icons["[icon_base]_grey_[col]"] = image(icon = 'icons/mob/bees.dmi', icon_state = "[icon_base]_grey")
|
||||
greyscale = bee_icons["[icon_base]_grey_[col]"]
|
||||
greyscale.color = col
|
||||
overlays += greyscale
|
||||
|
||||
var/image/wings
|
||||
if(!bee_icons["[icon_base]_wings"])
|
||||
bee_icons["[icon_base]_wings"] = image(icon = 'icons/mob/bees.dmi', icon_state = "[icon_base]_wings")
|
||||
wings = bee_icons["[icon_base]_wings"]
|
||||
overlays += wings
|
||||
|
||||
/mob/living/basic/bee/melee_attack(atom/target, list/modifiers, ignore_cooldown)
|
||||
if(istype(target, /obj/machinery/hydroponics))
|
||||
var/obj/machinery/hydroponics/hydro = target
|
||||
pollinate(hydro)
|
||||
return FALSE
|
||||
|
||||
if(istype(target, /obj/structure/beebox))
|
||||
var/obj/structure/beebox/hive = target
|
||||
handle_habitation(hive)
|
||||
return FALSE
|
||||
|
||||
. = ..()
|
||||
if(. && isliving(target) && (!client || a_intent == INTENT_HARM))
|
||||
make_opaque()
|
||||
var/mob/living/L = target
|
||||
if(L.reagents)
|
||||
if(beegent)
|
||||
beegent.reaction_mob(L, REAGENT_INGEST)
|
||||
L.reagents.add_reagent(beegent.id, rand(1, 5))
|
||||
else
|
||||
L.reagents.add_reagent("spidertoxin", 5)
|
||||
|
||||
/mob/living/basic/bee/proc/make_opaque()
|
||||
// If a bee attacks someone, make it very easy to hit for a while
|
||||
mouse_opacity = MOUSE_OPACITY_OPAQUE
|
||||
|
||||
/mob/living/basic/bee/proc/handle_habitation(obj/structure/beebox/hive)
|
||||
if(hive == beehome) // if its our home, we enter or exit it
|
||||
var/drop_location = (src in beehome.contents) ? get_turf(beehome) : beehome
|
||||
forceMove(drop_location)
|
||||
return
|
||||
if(!isnull(hive.queen_bee) && is_queen) // if we are queen and house already have a queen, dont inhabit
|
||||
return
|
||||
if(!hive.habitable(src) || !isnull(beehome)) // if not habitable or we already have a home
|
||||
return
|
||||
beehome = hive
|
||||
beehome.bees += src
|
||||
if(is_queen)
|
||||
beehome.queen_bee = src
|
||||
|
||||
/mob/living/basic/bee/proc/reagent_incompatible(mob/living/basic/bee/ruler)
|
||||
if(!ruler)
|
||||
return FALSE
|
||||
if(ruler.beegent?.type != beegent?.type)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/basic/bee/proc/pollinate(obj/machinery/hydroponics/Hydro)
|
||||
if(!istype(Hydro) || !Hydro.myseed || Hydro.dead || Hydro.recent_bee_visit || Hydro.lid_closed)
|
||||
return
|
||||
|
||||
Hydro.recent_bee_visit = TRUE
|
||||
addtimer(VARSET_CALLBACK(Hydro, recent_bee_visit, FALSE), BEE_TRAY_RECENT_VISIT)
|
||||
|
||||
var/growth = health // Health also means how many bees are in the swarm, roughly.
|
||||
// better healthier plants!
|
||||
Hydro.adjustHealth(growth*0.5)
|
||||
if(prob(BEE_POLLINATE_PEST_CHANCE))
|
||||
Hydro.adjustPests(-10)
|
||||
if(prob(BEE_POLLINATE_YIELD_CHANCE) && !Hydro.self_sustaining)
|
||||
Hydro.yieldmod = 2
|
||||
|
||||
if(beehome)
|
||||
beehome.bee_resources = min(beehome.bee_resources + growth, 100)
|
||||
|
||||
/mob/living/basic/bee/proc/assign_reagent(datum/reagent/R)
|
||||
if(istype(R))
|
||||
beegent = R
|
||||
name = "[initial(name)] ([R.name])"
|
||||
generate_bee_visuals()
|
||||
|
||||
/mob/living/basic/bee/queen
|
||||
name = "queen bee"
|
||||
desc = "She's the queen of bees, BZZ BZZ!"
|
||||
icon_base = "queen"
|
||||
is_queen = TRUE
|
||||
mouse_opacity = MOUSE_OPACITY_OPAQUE
|
||||
ai_controller = /datum/ai_controller/basic_controller/queen_bee
|
||||
|
||||
// leave pollination for the peasent bees
|
||||
/mob/living/basic/bee/queen/melee_attack(atom/target, list/modifiers, ignore_cooldown)
|
||||
. = ..()
|
||||
if(. && beegent && isliving(target))
|
||||
var/mob/living/L = target
|
||||
beegent.reaction_mob(L, REAGENT_TOUCH)
|
||||
L.reagents.add_reagent(beegent.id, rand(1, 5))
|
||||
|
||||
/mob/living/basic/bee/queen/pollinate()
|
||||
return
|
||||
|
||||
/obj/item/queen_bee
|
||||
name = "queen bee"
|
||||
desc = "She's the queen of bees, BZZ BZZ!"
|
||||
icon = 'icons/mob/bees.dmi'
|
||||
icon_state = "queen_item"
|
||||
gender = FEMALE
|
||||
new_attack_chain = TRUE
|
||||
/// Associated bee mob
|
||||
var/mob/living/basic/bee/queen/queen
|
||||
|
||||
/obj/item/queen_bee/item_interaction(mob/living/user, obj/item/I, list/modifiers)
|
||||
if(!istype(I, /obj/item/reagent_containers/syringe))
|
||||
return ..()
|
||||
var/obj/item/reagent_containers/syringe/S = I
|
||||
if(S.reagents.has_reagent("royal_bee_jelly")) // We check it twice because if we use an if/else statement, it won't catch the check for blacklisted chemicals below
|
||||
if(!S.reagents.has_reagent("royal_bee_jelly", 5))
|
||||
to_chat(user, "<span class='warning'>You don't have enough royal bee jelly to split a bee in two!</span>")
|
||||
return
|
||||
S.reagents.remove_reagent("royal_bee_jelly", 5)
|
||||
var/obj/item/queen_bee/qb = new(user.drop_location())
|
||||
qb.queen = new(qb)
|
||||
if(queen?.beegent)
|
||||
qb.queen.assign_reagent(queen.beegent) //Bees use the global singleton instances of reagents, so we don't need to worry about one bee being deleted and her copies losing their reagents.
|
||||
user.put_in_active_hand(qb)
|
||||
user.visible_message("<span class='notice'>[user] injects [src] with royal bee jelly, causing it to split into two bees, MORE BEES!</span>", "<span class='warning'>You inject [src] with royal bee jelly, causing it to split into two bees, MORE BEES!</span>")
|
||||
return
|
||||
|
||||
var/datum/reagent/R = GLOB.chemical_reagents_list[S.reagents.get_master_reagent_id()]
|
||||
if(R && S.reagents.has_reagent(R.id, 5))
|
||||
S.reagents.remove_reagent(R.id, 5) // Whether or not the chemical is blocked, we want it gone just because you tried to
|
||||
if(R.id in GLOB.blocked_chems)
|
||||
to_chat(user, "<span class='warning'>The [src]'s immune system rejects [R.name]!</span>")
|
||||
return
|
||||
queen.assign_reagent(R)
|
||||
user.visible_message("<span class='warning'>[user] injects [src]'s genome with [R.name], mutating its DNA!</span>", "<span class='warning'>You inject [src]'s genome with [R.name], mutating its DNA!</span>")
|
||||
name = queen.name
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You don't have enough units of that chemical to modify the bee's DNA!</span>")
|
||||
|
||||
/obj/item/queen_bee/bought/Initialize(mapload)
|
||||
. = ..()
|
||||
queen = new(src)
|
||||
|
||||
/obj/item/queen_bee/Destroy()
|
||||
QDEL_NULL(queen)
|
||||
return ..()
|
||||
|
||||
// Syndicate Bees
|
||||
/mob/living/basic/bee/syndi
|
||||
name = "syndi-bee"
|
||||
desc = "The result of a large influx of BEES!"
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 5
|
||||
maxHealth = 25
|
||||
health = 25
|
||||
faction = list("hostile", "syndicate")
|
||||
bee_syndicate = TRUE
|
||||
mouse_opacity = MOUSE_OPACITY_OPAQUE
|
||||
ai_controller = /datum/ai_controller/basic_controller/syndibee
|
||||
|
||||
/mob/living/basic/bee/syndi/Initialize(mapload)
|
||||
. = ..()
|
||||
beegent = GLOB.chemical_reagents_list["facid"] // Prepare to die
|
||||
|
||||
/mob/living/basic/bee/syndi/assign_reagent(datum/reagent/R)
|
||||
return
|
||||
|
||||
/mob/living/basic/bee/syndi/pollinate() // No Pollination
|
||||
return
|
||||
|
||||
#undef BEE_TRAY_RECENT_VISIT
|
||||
#undef BEE_DEFAULT_COLOUR
|
||||
#undef BEE_POLLINATE_YIELD_CHANCE
|
||||
#undef BEE_POLLINATE_PEST_CHANCE
|
||||
#undef BEE_POLLINATE_POTENCY_CHANCE
|
||||
#undef BEE_FOODGROUPS
|
||||
Reference in New Issue
Block a user