diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index f167da47aed1..65e5c3782247 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -494,6 +494,17 @@ to destroy them and players will be able to make replacements. /obj/item/weapon/stock_parts/micro_laser = 2, /obj/item/weapon/stock_parts/console_screen = 1) +/obj/item/weapon/circuitboard/spiderbot_fabricator + name = "Circuit board (Spiderbot Fabricator)" + desc = "A circuit board used to run a spiderbot fabricator." + build_path = /obj/machinery/spiderbot_fabricator + board_type = MACHINE + origin_tech = Tc_PROGRAMMING + "=4;" + Tc_ENGINEERING + "=4" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/weapon/stock_parts/micro_laser = 1) + /obj/item/weapon/circuitboard/podfab name = "Circuit board (Spacepod Fabricator)" desc = "A circuit board used to run a spacepod fabricator." diff --git a/code/game/machinery/spiderbot_spawner.dm b/code/game/machinery/spiderbot_spawner.dm new file mode 100644 index 000000000000..33383b49222c --- /dev/null +++ b/code/game/machinery/spiderbot_spawner.dm @@ -0,0 +1,206 @@ +/obj/machinery/spiderbot_fabricator + name = "\improper spiderbot fabricator" + desc = "A large pad sunk into the ground that brains with legs occasionally crawl out of." + icon = 'icons/obj/robotics.dmi' + icon_state = "mommispawner-idle" + density = TRUE + anchored = TRUE + machine_flags = SCREWTOGGLE | CROWDESTROY | WRENCHMOVE | FIXED2WORK + var/building = FALSE + var/brains = 0 + use_power = MACHINE_POWER_USE_IDLE + idle_power_usage = 20 + active_power_usage = 5000 + var/recharge_time = 120 SECONDS + var/recharge_time_reduction = 0 + var/last_built_time = -120 SECONDS + var/build_time = 20 SECONDS + var/build_time_reduction = 0 + +/obj/machinery/spiderbot_fabricator/proc/get_recharge_time() + return max(recharge_time - recharge_time_reduction, 0) + +/obj/machinery/spiderbot_fabricator/proc/get_build_time() + return max(build_time - build_time_reduction, 0) + +/obj/machinery/spiderbot_fabricator/New() + . = ..() + component_parts = newlist( + /obj/item/weapon/circuitboard/spiderbot_fabricator, + /obj/item/weapon/stock_parts/matter_bin, + /obj/item/weapon/stock_parts/manipulator, + /obj/item/weapon/stock_parts/manipulator, + /obj/item/weapon/stock_parts/micro_laser) + RefreshParts() + +//parent already calls spillContents for us +/obj/machinery/spiderbot_fabricator/crowbarDestroy(mob/user, obj/item/tool/crowbar/I) + if(building) + to_chat(user, "You cannot disassemble \the [src] while it is building something.") + return FALSE + return ..() + +/obj/machinery/spiderbot_fabricator/proc/eject_occupant() + for(var/atom/movable/I in src) + if(istype(I, /mob/living/simple_animal/mouse) || istype(I, /obj/item/device/mmi)) + I.forceMove(src.loc) + +/obj/machinery/spiderbot_fabricator/spillContents(destroy_chance = 0) + eject_occupant() + var/i + for(i=0, iThe machine is holding [brains] inactive positronic brains.") + +/obj/machinery/spiderbot_fabricator/process() + ..() + update_icon() + +/obj/machinery/spiderbot_fabricator/power_change() + if(powered()) + stat &= ~NOPOWER + else + stat |= NOPOWER + eject_occupant() + update_icon() + +/obj/machinery/spiderbot_fabricator/proc/isRecharging() + return (world.time - last_built_time) < get_recharge_time() + +/obj/machinery/spiderbot_fabricator/proc/canSpawn() + return !(stat & (FORCEDISABLE|NOPOWER)) && !building && !isRecharging() && brains + +/obj/machinery/spiderbot_fabricator/proc/is_valid_user(var/mob/user) + if(!user) + return FALSE + + if(building) + to_chat(user, "\The [src] is busy building something already.") + return FALSE + + if(isRecharging()) + to_chat(user, "\The [src] is still recharging from its last activation.") + return FALSE + + if(brains <= 0) + to_chat(user, "\The [name] doesn't contain any positronic brains.") + return FALSE + + if(istype(user, /mob/living/simple_animal/mouse)) + return TRUE + //Any checks below here should be specific to whether the user can spawn in as a posibrain-based spiderbot. + + if(jobban_isbanned(user, ROLE_POSIBRAIN)) + to_chat(user, "\The [name] lets out an annoyed buzz.") + return FALSE + + return TRUE + +/obj/machinery/spiderbot_fabricator/attack_ghost(var/mob/dead/observer/user) + if(is_valid_user(user)) + if(alert(user, "Do you wish to be turned into a spiderbot at this position?", "Confirm", "Yes", "No") != "Yes") + return + makeSpiderbot(user) + +/obj/machinery/spiderbot_fabricator/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(!..()) + if(istype(O,/obj/item/device/mmi)) + var/obj/item/device/mmi/mmi = O + if(!mmi.brainmob || (!mmi.brainmob.key && !mind_can_reenter(mmi.brainmob.mind))) + brains += 1 + to_chat(user, "You insert \the [mmi] into \the [src]'s storage bay'.") + qdel(mmi) + return TRUE + + if(mmi.brainmob.stat == DEAD) + to_chat(user, "Yeah, good idea. Give something deader than the pizza in your fridge legs. Mom would be so proud.") + return TRUE + + if(!is_valid_user(mmi.brainmob)) + return TRUE + + if(user.drop_item(O, src)) + makeSpiderbot(mmi.brainmob, mmi) + return TRUE + return FALSE + +/obj/machinery/spiderbot_fabricator/attack_animal(var/mob/user as mob) + if(istype(user, /mob/living/simple_animal/mouse) && is_valid_user(user)) + if(do_after(user, user, 2 SECONDS)) + user.visible_message("\The [user] scrambles into \the [src].", "You scramble into \the [src].") + makeSpiderbot(user) + return TRUE + + +/obj/machinery/spiderbot_fabricator/proc/makeSpiderbot(var/mob/user, var/obj/item/device/mmi/use_mmi) + if(!user || !istype(user) || !user.client) + return + + log_admin("([user.ckey]/[user]) became a spiderbot from \the [src] located in [get_area_name(src)] ([loc]).") + var/atom/movable/M = null + if(use_mmi) + M = use_mmi + else if(istype(user, /mob/living/simple_animal/mouse)) + M = user + M.forceMove(src) + else + var/obj/item/device/mmi/posibrain/mmi = new(src) + brains -= 1 + M = mmi + mmi.transfer_personality(user) + building = TRUE + update_icon() + visible_message("\The [src] buzzes and whirrs as it starts manufacturing a spiderbot.") + spawn(get_build_time()) + if(!building || M.loc != src) + //Whatever we were building escaped somehow + return + if(stat & (FORCEDISABLE|NOPOWER)) + //we got interrupted + eject_occupant() //just to make sure nothing is stuck inside + return + building = FALSE + update_icon() + var/mob/living/simple_animal/spiderbot/S = new(loc) + M.forceMove(S) + if(istype(M, /mob/living/simple_animal/mouse)) + user.mind.transfer_to(S) + S.name = "Spider-bot ([user.name])" + S.mouse = user + S.add_language(LANGUAGE_MOUSE) + else + S.mmi = M + S.transfer_personality(M) + to_chat(S, "You are now a spiderbot. Seek out the roboticist to be turned into something more useful.") + S.update_icon() + last_built_time = world.time + +/obj/machinery/spiderbot_fabricator/update_icon() + if(stat & (FORCEDISABLE|NOPOWER)) + icon_state="mommispawner-nopower" + else if(building) + icon_state="mommispawner-building" + else if(isRecharging()) + icon_state="mommispawner-recharging" + else if(!brains) + icon_state="mommispawner-nopower" + else + icon_state="mommispawner-idle" diff --git a/code/modules/research/designs/boards/machine_science.dm b/code/modules/research/designs/boards/machine_science.dm index aafe061efd1e..5338dc9ee2d3 100644 --- a/code/modules/research/designs/boards/machine_science.dm +++ b/code/modules/research/designs/boards/machine_science.dm @@ -153,4 +153,13 @@ materials = list(MAT_GLASS = 2000, SACID = 15) category = "Machine Boards" build_path = /obj/item/weapon/circuitboard/suit_storage_unit - \ No newline at end of file + +/datum/design/spiderbotfabricator + name = "Circuit Design(Spiderbot Fabricator)" + desc = "The circuit board for a Spiderbot Fabricator." + id = "spiderbotfab" + req_tech = list(Tc_PROGRAMMING = 4, Tc_ENGINEERING = 4) + build_type = IMPRINTER + materials = list(MAT_GLASS = 2000, SACID = 20) + category = "Machine Boards" + build_path = /obj/item/weapon/circuitboard/spiderbot_fabricator diff --git a/vgstation13.dme b/vgstation13.dme index ac9bdb2ebf0b..f21907cadb17 100644 --- a/vgstation13.dme +++ b/vgstation13.dme @@ -778,6 +778,7 @@ #include "code\game\machinery\singularity_beacon.dm" #include "code\game\machinery\Sleeper.dm" #include "code\game\machinery\smartglass.dm" +#include "code\game\machinery\spiderbot_spawner.dm" #include "code\game\machinery\station_map.dm" #include "code\game\machinery\status_display.dm" #include "code\game\machinery\suit_dispenser.dm"