/obj/machinery/beehive name = "beehive" icon = 'icons/obj/beekeeping.dmi' icon_state = "beehive" density = 1 anchored = 1 var/closed = 0 var/bee_count = 0 // Percent var/smoked = 0 // Timer var/honeycombs = 0 // Percent var/frames = 0 var/maxFrames = 5 /obj/machinery/beehive/update_icon() overlays.Cut() icon_state = "beehive" if(closed) overlays += "lid" if(frames) overlays += "empty[frames]" if(honeycombs >= 100) overlays += "full[round(honeycombs / 100)]" if(!smoked) switch(bee_count) if(1 to 40) overlays += "bees1" if(41 to 80) overlays += "bees2" if(81 to 100) overlays += "bees3" /obj/machinery/beehive/examine(var/mob/user) ..() if(!closed) user << "The lid is open." /obj/machinery/beehive/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/weapon/crowbar)) closed = !closed user.visible_message("[user] [closed ? "closes" : "opens"] \the [src].", "You [closed ? "close" : "open"] \the [src].") update_icon() return else if(istype(I, /obj/item/weapon/wrench)) anchored = !anchored playsound(loc, I.usesound, 50, 1) user.visible_message("[user] [anchored ? "wrenches" : "unwrenches"] \the [src].", "You [anchored ? "wrench" : "unwrench"] \the [src].") return else if(istype(I, /obj/item/bee_smoker)) if(closed) user << "You need to open \the [src] with a crowbar before smoking the bees." return user.visible_message("[user] smokes the bees in \the [src].", "You smoke the bees in \the [src].") smoked = 30 update_icon() return else if(istype(I, /obj/item/honey_frame)) if(closed) user << "You need to open \the [src] with a crowbar before inserting \the [I]." return if(frames >= maxFrames) user << "There is no place for an another frame." return var/obj/item/honey_frame/H = I if(H.honey) user << "\The [I] is full with beeswax and honey, empty it in the extractor first." return ++frames user.visible_message("[user] loads \the [I] into \the [src].", "You load \the [I] into \the [src].") update_icon() user.drop_from_inventory(I) qdel(I) return else if(istype(I, /obj/item/bee_pack)) var/obj/item/bee_pack/B = I if(B.full && bee_count) user << "\The [src] already has bees inside." return if(!B.full && bee_count < 90) user << "\The [src] is not ready to split." return if(!B.full && !smoked) user << "Smoke \the [src] first!" return if(closed) user << "You need to open \the [src] with a crowbar before moving the bees." return if(B.full) user.visible_message("[user] puts the queen and the bees from \the [I] into \the [src].", "You put the queen and the bees from \the [I] into \the [src].") bee_count = 20 B.empty() else user.visible_message("[user] puts bees and larvae from \the [src] into \the [I].", "You put bees and larvae from \the [src] into \the [I].") bee_count /= 2 B.fill() update_icon() return else if(istype(I, /obj/item/device/analyzer/plant_analyzer)) user << "Scan result of \the [src]..." user << "Beehive is [bee_count ? "[round(bee_count)]% full" : "empty"].[bee_count > 90 ? " Colony is ready to split." : ""]" if(frames) user << "[frames] frames installed, [round(honeycombs / 100)] filled." if(honeycombs < frames * 100) user << "Next frame is [round(honeycombs % 100)]% full." else user << "No frames installed." if(smoked) user << "The hive is smoked." return 1 else if(istype(I, /obj/item/weapon/screwdriver)) if(bee_count) user << "You can't dismantle \the [src] with these bees inside." return user << "You start dismantling \the [src]..." playsound(src, I.usesound, 50, 1) if(do_after(user, 30)) user.visible_message("[user] dismantles \the [src].", "You dismantle \the [src].") new /obj/item/beehive_assembly(loc) qdel(src) return /obj/machinery/beehive/attack_hand(var/mob/user) if(!closed) if(honeycombs < 100) user << "There are no filled honeycombs." return if(!smoked && bee_count) user << "The bees won't let you take the honeycombs out like this, smoke them first." return user.visible_message("[user] starts taking the honeycombs out of \the [src].", "You start taking the honeycombs out of \the [src]...") while(honeycombs >= 100 && do_after(user, 30)) new /obj/item/honey_frame/filled(loc) honeycombs -= 100 --frames update_icon() if(honeycombs < 100) user << "You take all filled honeycombs out." return /obj/machinery/beehive/process() if(closed && !smoked && bee_count) pollinate_flowers() update_icon() smoked = max(0, smoked - 1) if(!smoked && bee_count) bee_count = min(bee_count * 1.005, 100) update_icon() /obj/machinery/beehive/proc/pollinate_flowers() var/coef = bee_count / 100 var/trays = 0 for(var/obj/machinery/portable_atmospherics/hydroponics/H in view(7, src)) if(H.seed && !H.dead) H.health += 0.05 * coef ++trays honeycombs = min(honeycombs + 0.1 * coef * min(trays, 5), frames * 100) /obj/machinery/honey_extractor name = "honey extractor" desc = "A machine used to turn honeycombs on the frame into honey and wax." icon = 'icons/obj/virology.dmi' icon_state = "centrifuge" var/processing = 0 var/honey = 0 /obj/machinery/honey_extractor/attackby(var/obj/item/I, var/mob/user) if(processing) user << "\The [src] is currently spinning, wait until it's finished." return else if(istype(I, /obj/item/honey_frame)) var/obj/item/honey_frame/H = I if(!H.honey) user << "\The [H] is empty, put it into a beehive." return user.visible_message("[user] loads \the [H] into \the [src] and turns it on.", "You load \the [H] into \the [src] and turn it on.") processing = H.honey icon_state = "centrifuge_moving" qdel(H) spawn(50) new /obj/item/honey_frame(loc) new /obj/item/stack/wax(loc) honey += processing processing = 0 icon_state = "centrifuge" else if(istype(I, /obj/item/weapon/reagent_containers/glass)) if(!honey) user << "There is no honey in \the [src]." return var/obj/item/weapon/reagent_containers/glass/G = I var/transferred = min(G.reagents.maximum_volume - G.reagents.total_volume, honey) G.reagents.add_reagent("honey", transferred) honey -= transferred user.visible_message("[user] collects honey from \the [src] into \the [G].", "You collect [transferred] units of honey from \the [src] into \the [G].") return 1 /obj/item/bee_smoker name = "bee smoker" desc = "A device used to calm down bees before harvesting honey." icon = 'icons/obj/device.dmi' icon_state = "battererburnt" w_class = ITEMSIZE_SMALL /obj/item/honey_frame name = "beehive frame" desc = "A frame for the beehive that the bees will fill with honeycombs." icon = 'icons/obj/beekeeping.dmi' icon_state = "honeyframe" w_class = ITEMSIZE_SMALL var/honey = 0 /obj/item/honey_frame/filled name = "filled beehive frame" desc = "A frame for the beehive that the bees have filled with honeycombs." honey = 20 /obj/item/honey_frame/filled/New() ..() overlays += "honeycomb" /obj/item/beehive_assembly name = "beehive assembly" desc = "Contains everything you need to build a beehive." icon = 'icons/obj/apiary_bees_etc.dmi' icon_state = "apiary" /obj/item/beehive_assembly/attack_self(var/mob/user) user << "You start assembling \the [src]..." if(do_after(user, 30)) user.visible_message("[user] constructs a beehive.", "You construct a beehive.") new /obj/machinery/beehive(get_turf(user)) user.drop_from_inventory(src) qdel(src) return /obj/item/stack/wax name = "wax" singular_name = "wax piece" desc = "Soft substance produced by bees. Used to make candles." icon = 'icons/obj/beekeeping.dmi' icon_state = "wax" /obj/item/stack/wax/New() ..() recipes = wax_recipes var/global/list/datum/stack_recipe/wax_recipes = list( \ new/datum/stack_recipe("candle", /obj/item/weapon/flame/candle) \ ) /obj/item/bee_pack name = "bee pack" desc = "Contains a queen bee and some worker bees. Everything you'll need to start a hive!" icon = 'icons/obj/beekeeping.dmi' icon_state = "beepack" var/full = 1 /obj/item/bee_pack/New() ..() overlays += "beepack-full" /obj/item/bee_pack/proc/empty() full = 0 name = "empty bee pack" desc = "A stasis pack for moving bees. It's empty." overlays.Cut() overlays += "beepack-empty" /obj/item/bee_pack/proc/fill() full = initial(full) name = initial(name) desc = initial(desc) overlays.Cut() overlays += "beepack-full"