Beekeeping 3.7 (#36967)

* beekeeping 3.7

* adjustments

* duh

* burn baby burn
This commit is contained in:
DeityLink
2024-08-27 16:04:43 +02:00
committed by GitHub
parent 69e4966d85
commit 5bf3fd77be
13 changed files with 146 additions and 85 deletions

View File

@@ -8,7 +8,7 @@
/*
> apiary tray
> apiary
> angry-bee hive
*/
@@ -17,13 +17,17 @@ var/list/apiary_reservation = list()
var/list/apiaries_list = list()
/obj/machinery/apiary
name = "apiary tray"
icon = 'icons/obj/hydroponics/hydro_tools.dmi'
icon_state = "hydrotray"
name = "apiary"
icon = 'icons/obj/apiary_bees_etc.dmi'
icon_state = "apiary"
var/apiary_icon = "apiary"
density = 1
anchored = 1
pass_flags_self = PASSTABLE
var/apiary_icon = "apiary"
w_type = RECYK_WOOD
flammable = TRUE
thermal_mass = 20//same as apiary kits
fire_sprite = "fire_apiary"
var/beezeez = 0//beezeez removes 1 toxic and adds 1 nutrilevel per cycle
var/nutrilevel = 0//consumed every round based on how many bees the apiary is sustaining.
var/yieldmod = 1
@@ -38,8 +42,7 @@ var/list/apiaries_list = list()
var/worker_bees_inside = 0
var/list/bees_outside_hive = list()
var/hydrotray_type = /obj/machinery/portable_atmospherics/hydroponics
var/obj/item/itemform = null //The item used to build this
var/kit_type = /obj/item/apiary
var/obj/item/weapon/reagent_containers/glass/consume = null
@@ -59,7 +62,7 @@ var/list/apiaries_list = list()
/obj/machinery/apiary/New()
..()
apiaries_list.Add(src)
overlays += image('icons/obj/apiary_bees_etc.dmi', icon_state=apiary_icon)
update_icon()
create_reagents(100)
consume = new()
spawn(EXILE_RESTRICTION)
@@ -73,22 +76,47 @@ var/list/apiaries_list = list()
B.mob.home = null
..()
/obj/machinery/apiary/wrenchAnchor(var/mob/user, var/obj/item/I, var/time_to_wrench = 3 SECONDS)
. = ..()
if (.)
update_icon()
/obj/machinery/apiary/attack_hand(var/mob/user)
if(reagents.total_volume <= 0)
alert(user,"There's no honey to harvest yet!","[name]","Ok")
return
if(alert(user,"Harvest the honeycombs?[((queen_bees_inside || worker_bees_inside) && species.angery) ? " Be ready to handle some angry bees!" : ""]","[name]","Yes","No")== "Yes")
user.visible_message("<span class='notice'>\the [user] begins dismantling the apiary.</span>","<span class='danger'>You begin harvesting the honeycombs.</span>")
if((queen_bees_inside || worker_bees_inside) && species.angery)
user.visible_message("<span class='danger'>The [species.common_name] don't like that.</span>")
angry_swarm(user)
if(do_after(user, loc, 50))
if(harvest_honeycombs())
to_chat(user, "<span class='notice'>You successfully harvest the honeycombs.</span>")
else
to_chat(user, "<span class='notice'>You somehow didn't find a single honeycomb in there.</span>")
/obj/machinery/apiary/update_icon()
overlays.len = 0
overlays += image('icons/obj/apiary_bees_etc.dmi', icon_state=apiary_icon)
icon_state = "[apiary_icon][anchored ? "-anchored" : ""]"
var/image/I = null
switch(reagents.total_volume)
if(30 to 60)
I = image('icons/obj/apiary_bees_etc.dmi', icon_state="honey_1")
I = image('icons/obj/apiary_bees_etc.dmi', icon_state="[apiary_icon]_honey_1")
if(60 to 90)
I = image('icons/obj/apiary_bees_etc.dmi', icon_state="honey_2")
I = image('icons/obj/apiary_bees_etc.dmi', icon_state="[apiary_icon]_honey_2")
if(90 to INFINITY)
I = image('icons/obj/apiary_bees_etc.dmi', icon_state="honey_3")
I = image('icons/obj/apiary_bees_etc.dmi', icon_state="[apiary_icon]_honey_3")
if(!I)
return
I.color = mix_color_from_reagents(reagents.reagent_list)
overlays += I
if (on_fire)
overlays += fire_overlay
/obj/machinery/apiary/examine(mob/user)
..()
@@ -96,30 +124,30 @@ var/list/apiaries_list = list()
if (species)
species_name = species.common_name
if(!worker_bees_inside && !queen_bees_inside)
to_chat(user, "<span class='info'>There doesn't seem to be any [species_name] in it.</span>")
to_chat(user, "<span class='info'>There doesn't seem to be any [species_name]s in it.</span>")
else
if(worker_bees_inside < 10)
to_chat(user, "<span class='info'>You can hear a few [species_name] buzzing inside.</span>")
to_chat(user, "<span class='info'>You can hear a few [species_name]s buzzing inside.</span>")
else if(worker_bees_inside > 35)
to_chat(user, "<span class='danger'>The [species_name] are over-crowded!</span>")
to_chat(user, "<span class='danger'>The [species_name]s are over-crowded!</span>")
else
to_chat(user, "<span class='info'>You hear a loud buzzing from the inside.</span>")
if(nutrilevel < 0)
to_chat(user, "<span class='danger'>The [species_name] inside appear to be starving.</span>")
to_chat(user, "<span class='danger'>The [species_name]s inside appear to be starving.</span>")
else if(nutrilevel < 10)
to_chat(user, "<span class='warning'>The [species_name] inside appear to be low on food reserves.</span>")
to_chat(user, "<span class='warning'>The [species_name]s inside appear to be low on food reserves.</span>")
if(beezeez > 0)
to_chat(user, "<span class='info'>The [species_name] are collecting the beezeez pellets.</span>")
to_chat(user, "<span class='info'>The [species_name]s are collecting the beezeez pellets.</span>")
if(toxic > 5)
if (toxic < 33)
to_chat(user, "<span class='warning'>The [species_name] look a bit on edge, their diet might be toxic.</span>")
to_chat(user, "<span class='warning'>The [species_name]s look a bit on edge, their diet might be toxic.</span>")
else if (toxic < 50)
to_chat(user, "<span class='warning'>The [species_name] are starting to act violent, the hive's toxicity is rising.</span>")
to_chat(user, "<span class='warning'>The [species_name]s are starting to act violent, the hive's toxicity is rising.</span>")
else
to_chat(user, "<span class='danger'>The [species_name] are violent and exhausted, the hive's toxicity is reaching critical levels.</span>")
to_chat(user, "<span class='danger'>The [species_name]s are violent and exhausted, the hive's toxicity is reaching critical levels.</span>")
if (species?.worker_product)
switch(reagents.total_volume)
@@ -176,41 +204,29 @@ var/list/apiaries_list = list()
to_chat(user, "<span class='notice'>You pour the BeezEez into \the [src]. A relaxed humming appears to pick up.</span>")
else
to_chat(user, "<span class='notice'>You pour the BeezEez into \the [src]. Now it just needs some bees.</span>")
playsound(src, "sand", 50, 0)
else
to_chat(user, "<span class='notice'>There is no BeezEez in \the [O].</span>")
return
user.drop_from_inventory(O)
var/obj/item/trash/beezeez/TrashItem = new /obj/item/trash/beezeez(user)
user.put_in_hands(TrashItem)
qdel(O)
else if(istype(O, /obj/item/weapon/hatchet))
if(reagents.total_volume > 0)
user.visible_message("<span class='notice'>\the [user] begins harvesting the honeycombs.</span>","<span class='danger'>You begin harvesting the honeycombs.</span>")
else
to_chat(user, "<span class='notice'>You begin to dislodge the apiary from the tray.</span>")
else if(istype(O, /obj/item/weapon/hatchet) || iscrowbar(O))
user.visible_message("<span class='notice'>\the [user] begins dismantling the apiary.</span>","<span class='danger'>You begin to dismantle the apiary.</span>")
if((queen_bees_inside || worker_bees_inside) && species.angery)
user.visible_message("<span class='danger'>The [species.common_name] don't like that.</span>")
angry_swarm(user)
if(do_after(user, src, 50))
var/obj/machinery/created_tray = new hydrotray_type(src.loc)
created_tray.component_parts = list()
for(var/obj/I in src.component_parts)
created_tray.component_parts += I
I.forceMove(created_tray)
component_parts -= I
for(var/obj/I in src.contents)
I.forceMove(created_tray)
contents -= I
if(itemform)
itemform.forceMove(loc)
else //if there is no stored itemform, just make a normal apiary
new /obj/item/apiary(loc)
if(do_after(user, loc, 50))
new kit_type(loc)
if(harvest_honeycombs())
to_chat(user, "<span class='notice'>You successfully harvest the honeycombs. The empty apiary can be relocated.</span>")
to_chat(user, "<span class='notice'>You finish dismantling the apiary after harvesting the honeycombs that were inside.</span>")
else
to_chat(user, "<span class='notice'>You dislodge the apiary from the tray.</span>")
to_chat(user, "<span class='notice'>You finish dismantling the apiary.</span>")
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
if (queen_bees_inside || worker_bees_inside)
empty_beehive()
@@ -328,6 +344,9 @@ var/list/apiaries_list = list()
var/image/I = image('icons/obj/food.dmi', icon_state="honeycomb-color")
I.color = mix_color_from_reagents(reagents.reagent_list)
var/image/glint = image('icons/obj/food.dmi',icon_state="honeycomb-glint")
glint.blend_mode = BLEND_ADD
for (var/i = 1 to number_of_honeycombs)
var/obj/item/weapon/reagent_containers/food/snacks/honeycomb/H = new(T)
H.reagents.clear_reagents()
@@ -335,9 +354,11 @@ var/list/apiaries_list = list()
H.icon_state = "[species.prefix]honeycomb-base"
H.extra_food_overlay.overlays.len = 0 // removing the one added in the honeycomb's New()
H.extra_food_overlay.overlays += I
H.extra_food_overlay.overlays += glint
H.update_icon()
reagents.trans_to(H,reagents_per_honeycomb)
H.authentify()
update_icon()
return 1
/obj/machinery/apiary/proc/empty_beehive()
@@ -514,6 +535,9 @@ var/list/apiaries_list = list()
icon_state = "apiary-wild-inprogress0"
density = 0
anchored = 1
w_type = RECYK_WOOD
flammable = TRUE
thermal_mass = 20
var/base_icon_state = "apiary-wild-inprogress"
var/prefix = ""
var/remaining_work = 10
@@ -549,6 +573,8 @@ var/list/apiaries_list = list()
qdel(B_mob)
qdel(src)
/obj/structure/wild_apiary/attack_hand(var/mob/user)
to_chat(user,"<span class='warning'>You don't think you can harvest that one by hand. Gotta break it apart.</span>")
/obj/structure/wild_apiary/bullet_act(var/obj/item/projectile/P)
. = ..()
@@ -591,9 +617,10 @@ var/list/apiaries_list = list()
health -= P.damage
updateHealth()
/obj/machinery/apiary/wild/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(..())
return
/obj/structure/apiary/wild/attack_hand(var/mob/user)
to_chat(user,"<span class='warning'>You don't think you can harvest that one by hand. Gotta break it apart.</span>")
/obj/machinery/apiary/wild/attackby(var/obj/item/O, var/mob/user)
if(istype(O, /obj/item/queen_bee))
to_chat(user, "<span class='warning'>This type of bee hive isn't fit for domesticated bees.</span>")
else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/beezeez))
@@ -605,6 +632,8 @@ var/list/apiaries_list = list()
O.on_attack(src, user)
health -= O.force
updateHealth()
else
return ..()
/obj/machinery/apiary/wild/proc/updateHealth()
if(health <= 0)
@@ -619,7 +648,8 @@ var/list/apiaries_list = list()
/obj/machinery/apiary/wild/update_icon()
overlays.len = 0
return
if (on_fire)
overlays += fire_overlay
/obj/machinery/apiary/wild/angry
name = "angry-bee hive"

View File

@@ -41,6 +41,7 @@ var/list/disappear_sound = list('sound/effects/disappear_1.ogg', 'sound/effects/
var/list/pd_wail_sound = list('sound/voice/pdwail1.ogg', 'sound/voice/pdwail2.ogg', 'sound/voice/pdwail3.ogg')
var/list/procgun_sound = list('sound/weapons/procgun1.ogg', 'sound/weapons/procgun2.ogg')
var/list/trayhit_sound = list('sound/items/trayhit1.ogg', 'sound/items/trayhit2.ogg')
var/list/sand_sound = list('sound/effects/sand_walk1.ogg', 'sound/effects/sand_walk2.ogg')
//var/list/gun_sound = list('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg','sound/weapons/Gunshot3.ogg','sound/weapons/Gunshot4.ogg')
//gas_modified controls if a sound is affected by how much gas there is in the atmosphere of the source
@@ -257,6 +258,8 @@ var/const/SURROUND_CAP = 7
soundin = pick(procgun_sound)
if ("trayhit")
soundin = pick(trayhit_sound)
if ("sand")
soundin = pick(sand_sound)
//if ("gunshot") soundin = pick(gun_sound)
else if(islist(soundin))
soundin = pick(soundin)

View File

@@ -445,24 +445,8 @@ var/list/hydro_trays = list()
else if(O.is_wrench(user) && is_soil) //Soil isn't a portable atmospherics machine by any means
return //Don't call parent. I mean, soil shouldn't be a child of portable_atmospherics at all, but that's not very feasible.
else if(istype(O, /obj/item/apiary))
if(seed)
to_chat(user, "<span class='alert'>[src] is already occupied!</span>")
else
user.drop_item(O, force_drop = 1)
var/obj/item/apiary/IA = O
var/obj/machinery/apiary/A = new IA.buildtype(src.loc)
A.itemform = O
O.forceMove(A)
A.icon = src.icon
A.icon_state = src.icon_state
A.hydrotray_type = src.type
A.component_parts = component_parts.Copy()
A.contents = contents.Copy()
contents.len = 0
component_parts.len = 0
qdel(src)
else if(istype(O, /obj/item/apiary))//Because not everyone is gonna read the changelog
to_chat(user,"<span class='warning'>[is_soil ? "" : "You're not sure why you'd put an apiary in an hydroponics tray of all things. Like, it doesn't really makes much sense does it? "]You should build the kit directly on top of the floor.</span>")
else if((O.sharpness_flags & (SHARP_BLADE|SERRATED_BLADE)) && harvest)
if(arcanetampered)

View File

@@ -145,7 +145,7 @@
if (!caught_bees.len)
current_species = null
/obj/item/weapon/bee_net/attack_self(mob/user as mob)
/obj/item/weapon/bee_net/attack_self(var/mob/user)
empty_bees()
/obj/item/weapon/bee_net/verb/empty_bees()
@@ -192,13 +192,42 @@
/obj/item/apiary
name = "moveable apiary"
name = "apiary kit"
icon = 'icons/obj/apiary_bees_etc.dmi'
icon_state = "apiary_item"
item_state = "giftbag"
item_state = "apiary"
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/beekeeping.dmi', "right_hand" = 'icons/mob/in-hand/right/beekeeping.dmi')
w_class = W_CLASS_HUGE
w_type = RECYK_WOOD
flammable = TRUE
throwforce = 5
var/buildtype = /obj/machinery/apiary
/obj/item/apiary/attack_self(var/mob/user)
to_chat(user, "<span class='warning'>You must build this kit on an empty and adjacent floor.</span>")
/obj/item/apiary/afterattack(var/atom/A, var/mob/living/user, var/proximity_flag, var/click_parameters)
if(!proximity_flag)
to_chat(user, "<span class='warning'>You must build this kit on an empty and adjacent floor.</span>")
return
if (!isturf(A))
return
var/turf/T = A
if(!T.density && !T.has_dense_content())
build_apiary(user, T)
/obj/item/apiary/proc/build_apiary(var/mob/user, var/turf/T)
if (!T)
T = get_turf(src)
if (!isfloor(T) || T.has_dense_content())
to_chat(user, "<span class='warning'>There is no room to build an apiary there!</span>")
return
if(do_after(user, T, 25))
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
user.drop_item(src, force_drop = 1)
new buildtype(T)
qdel(src)
/obj/item/weapon/reagent_containers/food/snacks/beezeez
name = "packet of BeezEez"
@@ -238,6 +267,10 @@
I.color = mix_color_from_reagents(reagents.reagent_list)
icon_state = "honeycomb-base"
extra_food_overlay.overlays += I
var/image/glint = image('icons/obj/food.dmi',icon_state="honeycomb-glint")
glint.blend_mode = BLEND_ADD
extra_food_overlay.overlays += glint
update_icon()
/obj/item/weapon/reagent_containers/food/snacks/honeycomb/chill
@@ -255,8 +288,11 @@
var/image/I = image('icons/obj/food.dmi', icon_state="honeycomb-color")
I.color = mix_color_from_reagents(reagents.reagent_list)
icon_state = "chill_honeycomb-base"
var/image/glint = image('icons/obj/food.dmi',icon_state="honeycomb-glint")
glint.blend_mode = BLEND_ADD
extra_food_overlay.overlays.len = 0
extra_food_overlay.overlays += I
extra_food_overlay.overlays += glint
update_icon()
/obj/item/weapon/reagent_containers/food/snacks/honeycomb/proc/authentify()
@@ -315,11 +351,10 @@
<h3>Collecting Honeycombs</h3>
Collecting honeycombs is a relatively simple process, but you'll need to make some preparations, such as getting a Bio suit or prepairing another apiary where to move the bees.
First you start by deconstructing the apiary with a hatchet. The bees will become aggressive as soon as you begin. Once the apiary is deconstructed, follow the steps in the above
section to capture the homeless feral bees and move them to another apiary. Or simply rebuild the apiary that you just deconstructed. The honeycombs harvested this way
are full of honey, you can grind them to process the liquid, then place it in a Condimaster to conserve it in a honey pot. Or you can just eat the honeycombs if you feel like it,
they are delicious. You can produce a high variety of flavoured honey by having your bees harvest various plants.
Collecting honeycombs is a relatively simple process that can be done by hand, but you'll need to make some preparations, such as getting a beekeeping suit and ways to calm down the bees.
The bees will become aggressive as soon as you start harvesting. After you calm them, they will naturally return to their apiary.
The honeycombs harvested this way are full of honey, you can grind them to process the liquid, then place it in a Condimaster to conserve it in a honey pot.
Or you can just eat the honeycombs if you feel like it, they are delicious. You can produce a high variety of flavoured honey by having your bees harvest various plants.
</body>

View File

@@ -443,9 +443,8 @@ var/global/global_cricket_population = 0
/obj/item/apiary/langstroth
name = "\improper Langstroth hive"
name = "\improper Langstroth hive kit"
desc = "A vertically-modular tray-based apiary. You can simply reach in with your hand and smokers will protect you while you harvest honeycombs."
icon = 'icons/obj/items_weird.dmi'
icon_state = "langstroth_item"
buildtype = /obj/machinery/apiary/langstroth
@@ -577,9 +576,25 @@ var/global/global_cricket_population = 0
/obj/machinery/apiary/langstroth
name = "\improper Langstroth hive"
icon_state = "langstroth"
apiary_icon = "langstroth"
kit_type = /obj/item/apiary/langstroth
/obj/machinery/apiary/langstroth/attack_hand(mob/user)
if(harvest_honeycombs())
playsound(loc, 'sound/effects/fan.ogg', 75, 1, -1)
visible_message("<span class='good'>\The [itemform] fans smoke, calming the residents for the harvest.</span>")
if(reagents.total_volume <= 0)
alert(user,"There's no honey to harvest yet!","[name]","Ok")
return
if(alert(user,"Harvest the honeycombs?[((queen_bees_inside || worker_bees_inside) && species.angery) ? " Be ready to handle some angry bees!" : ""]","[name]","Yes","No")== "Yes")
user.visible_message("<span class='notice'>\the [user] begins dismantling the apiary.</span>","<span class='danger'>You begin harvesting the honeycombs.</span>")
if((queen_bees_inside || worker_bees_inside) && species.angery)
playsound(loc, 'sound/effects/fan.ogg', 75, 1, -1)
anim(target = loc, a_icon = 'icons/effects/160x160.dmi', flick_anim = "incense", offX = -WORLD_ICON_SIZE*2+pixel_x, offY = -WORLD_ICON_SIZE*2+pixel_y)
visible_message("<span class='good'>\The hive fans smoke, calming the residents for the harvest.</span>")
if(do_after(user, loc, 50))
if(harvest_honeycombs())
to_chat(user, "<span class='notice'>You successfully harvest the honeycombs.</span>")
else
to_chat(user, "<span class='notice'>You somehow didn't find a single honeycomb in there.</span>")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 353 KiB

After

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 524 B

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 520 B

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 KiB

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@@ -185,18 +185,12 @@
if(istype(A,/mob/living/simple_animal))
var/mob/living/simple_animal/L = A
if(L.on_foot() && prob(33)) // If the mob is flying, nothing happens. But if it's walking, 33% chance to play a sound effect
if(prob(50))
playsound(src, 'sound/effects/sand_walk1.ogg', 50, 0)
else
playsound(src, 'sound/effects/sand_walk2.ogg', 50, 0)
playsound(src, "sand", 50, 0)
if(istype(A,/mob/living/carbon))
var/mob/living/carbon/M = A
if(M.on_foot() && prob(33)) // If the mob is flying, nothing happens. But if it's walking, 33% chance to play a sound effect
if(prob(50))
playsound(src, 'sound/effects/sand_walk1.ogg', 50, 0)
else
playsound(src, 'sound/effects/sand_walk2.ogg', 50, 0)
playsound(src, "sand", 50, 0)
/turf/unsimulated/floor/lab_asteroid
name = "Asteroid"