diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 45931d44b89..0c250f3d1cd 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -208,7 +208,8 @@ var/mob/living/carbon/human/occupant = null var/possible_chems = list(list("epinephrine", "ether", "salbutamol", "styptic_powder"), list("epinephrine", "ether", "salbutamol", "styptic_powder", "oculine"), - list("epinephrine", "ether", "salbutamol", "styptic_powder", "oculine", "charcoal", "mutadone", "mannitol")) + list("epinephrine", "ether", "salbutamol", "styptic_powder", "oculine", "charcoal", "mutadone", "mannitol"), + list("epinephrine", "ether", "salbutamol", "styptic_powder", "oculine", "charcoal", "mutadone", "mannitol", "pen_acid", "omnizine")) var/amounts = list(5, 10) var/obj/item/weapon/reagent_containers/glass/beaker = null var/filtering = 0 diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index c36c8ad20ca..40859fed3b6 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -14,6 +14,7 @@ var/menustat = "menu" var/efficiency = 0 var/productivity = 0 + var/max_items = 40 /obj/machinery/biogenerator/New() ..() @@ -25,7 +26,7 @@ component_parts += new /obj/item/weapon/stock_parts/console_screen(null) component_parts += new /obj/item/stack/cable_coil(null, 1) RefreshParts() - + /obj/machinery/biogenerator/upgraded/New() ..() component_parts = list() @@ -39,12 +40,15 @@ /obj/machinery/biogenerator/RefreshParts() var/E = 0 var/P = 0 + var/max_storage = 40 for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) P += B.rating + max_storage = 40 * B.rating for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) E += M.rating efficiency = E productivity = P + max_items = max_storage /obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well. update_icon() @@ -94,15 +98,15 @@ var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) i++ - if(i >= 10) + if(i >= max_items) user << "The biogenerator is already full! Activate it." else for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents) - if(i >= 10) + if(i >= max_items) break G.loc = src i++ - if(i<10) + if(i < max_items) user << "You empty the plant bag into the biogenerator." else if(O.contents.len == 0) user << "You empty the plant bag into the biogenerator, filling it to its capacity." @@ -115,7 +119,7 @@ var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) i++ - if(i >= 10) + if(i >= max_items) user << "The biogenerator is full! Activate it." else user.unEquip(O) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index d2ef16a903a..80073eb1d9a 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -225,6 +225,14 @@ to destroy them and players will be able to make replacements. /obj/item/weapon/stock_parts/cell = 5, /obj/item/weapon/stock_parts/capacitor = 1) +/obj/item/weapon/circuitboard/emitter + name = "circuit board (Emitter)" + build_path = /obj/machinery/power/emitter + board_type = "machine" + origin_tech = "programming=4;powerstorage=5;engineering=5" + req_components = list( + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/weapon/stock_parts/manipulator = 1) /obj/item/weapon/circuitboard/thermomachine name = "circuit board (Freezer)" @@ -316,6 +324,49 @@ to destroy them and players will be able to make replacements. /obj/item/stack/cable_coil = 5, /obj/item/weapon/stock_parts/console_screen = 1) +/obj/item/weapon/circuitboard/processor + name = "circuit board (Food processor)" + build_path = /obj/machinery/processor + board_type = "machine" + origin_tech = "programming=1" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1) + +/obj/item/weapon/circuitboard/seed_extractor + name = "circuit board (Seed Extractor)" + build_path = /obj/machinery/seed_extractor + board_type = "machine" + origin_tech = "programming=1" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1) + +/obj/item/weapon/circuitboard/smartfridge + name = "circuit board (Smartfridge)" + build_path = /obj/machinery/smartfridge + board_type = "machine" + origin_tech = "programming=1" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1) + +/obj/item/weapon/circuitboard/monkey_recycler + name = "circuit board (Monkey Recycler)" + build_path = /obj/machinery/monkey_recycler + board_type = "machine" + origin_tech = "programming=1" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1) + +/obj/item/weapon/circuitboard/holopad + name = "circuit board (AI Holopad)" + build_path = /obj/machinery/hologram/holopad + board_type = "machine" + origin_tech = "programming=1" + req_components = list( + /obj/item/weapon/stock_parts/capacitor = 1) + /obj/item/weapon/circuitboard/chem_dispenser name = "circuit board (Portable Chem Dispenser)" build_path = /obj/machinery/chem_dispenser/constructable diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 5aca702524e..4c492d20cf2 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -40,6 +40,32 @@ var/const/HOLOPAD_MODE = 0 var/last_request = 0 //to prevent request spam. ~Carn var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating. +/obj/machinery/hologram/holopad/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/holopad(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor(null) + RefreshParts() + +/obj/machinery/hologram/holopad/RefreshParts() + var/holograph_range = 4 + for(var/obj/item/weapon/stock_parts/capacitor/B in component_parts) + holograph_range += 1 * B.rating + holo_range = holograph_range + +/obj/machinery/hologram/holopad/attackby(obj/item/P as obj, mob/user as mob, params) + if(default_deconstruction_screwdriver(user, "holopad_open", "holopad0", P)) + return + + if(exchange_parts(user, P)) + return + + if(default_unfasten_wrench(user, P)) + return + + default_deconstruction_crowbar(P) + + /obj/machinery/hologram/holopad/attack_hand(var/mob/living/carbon/human/user) //Carn: Hologram requests. if(!istype(user)) return diff --git a/code/game/machinery/kitchen/monkeyrecycler.dm b/code/game/machinery/kitchen/monkeyrecycler.dm index 73d79fc6f65..01b4968d909 100644 --- a/code/game/machinery/kitchen/monkeyrecycler.dm +++ b/code/game/machinery/kitchen/monkeyrecycler.dm @@ -10,9 +10,40 @@ idle_power_usage = 5 active_power_usage = 50 var/grinded = 0 + var/required_grind = 5 + var/cube_production = 1 +/obj/machinery/monkey_recycler/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/monkey_recycler(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + RefreshParts() + +/obj/machinery/monkey_recycler/RefreshParts() + var/req_grind = 5 + var/cubes_made = 1 + for(var/obj/item/weapon/stock_parts/manipulator/B in component_parts) + req_grind -= B.rating + for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) + cubes_made = M.rating + cube_production = cubes_made + required_grind = req_grind /obj/machinery/monkey_recycler/attackby(var/obj/item/O as obj, var/mob/user as mob, params) + if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) + return + + if(exchange_parts(user, O)) + return + + if(default_unfasten_wrench(user, O)) + power_change() + return + + default_deconstruction_crowbar(O) + if (src.stat != 0) //NOPOWER etc return if (istype(O, /obj/item/weapon/grab)) @@ -44,12 +75,12 @@ /obj/machinery/monkey_recycler/attack_hand(var/mob/user as mob) if (src.stat != 0) //NOPOWER etc return - if(grinded >=5) + if(grinded >= required_grind) user << "\blue The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube." playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1) grinded -= 5 new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src.loc) user << "\blue The machine's display flashes that it has [grinded] monkeys worth of material left." else - user << "\red The machine needs at least 5 monkeys worth of material to produce a monkey cube. It only has [grinded]." + user << "\red The machine needs at least [required_grind] monkey\s worth of material to produce a monkey cube. It only has [grinded]." return diff --git a/code/game/machinery/kitchen/processor.dm b/code/game/machinery/kitchen/processor.dm index a331175c8c7..d9f101b27f0 100644 --- a/code/game/machinery/kitchen/processor.dm +++ b/code/game/machinery/kitchen/processor.dm @@ -12,7 +12,22 @@ use_power = 1 idle_power_usage = 5 active_power_usage = 50 + var/rating_speed = 1 + var/rating_amount = 1 +/obj/machinery/processor/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/processor(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + RefreshParts() + +/obj/machinery/processor/RefreshParts() + for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) + rating_amount = B.rating + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + rating_speed = M.rating //RECIPE DATUMS /datum/food_processor_process @@ -20,9 +35,10 @@ var/output var/time = 40 -/datum/food_processor_process/proc/process(loc, what) - if (src.output && loc) - new src.output(loc) +/datum/food_processor_process/proc/process_food(loc, what, obj/machinery/processor/processor) + if (src.output && loc && processor) + for(var/i = 0, i < processor.rating_amount, i++) + new src.output(loc) if (what) qdel(what) @@ -56,7 +72,7 @@ ///END OBJECT RECIPIES/// ///////////////////////// -/datum/food_processor_process/mob/process(loc, what) +/datum/food_processor_process/mob/process_food(loc, what, processor) ..() ////////////////////// @@ -66,14 +82,14 @@ input = /mob/living/carbon/slime output = null -/datum/food_processor_process/mob/slime/process(loc, what) +/datum/food_processor_process/mob/slime/process_food(loc, what, obj/machinery/processor/processor) var/mob/living/carbon/slime/S = what var/C = S.cores if(S.stat != DEAD) S.loc = loc S.visible_message("[S] crawls free of the processor!") return - for(var/i = 1, i <= C, i++) + for(var/i = 1, i <= C + processor.rating_amount, i++) new S.coretype(loc) feedback_add_details("slime_core_harvested","[replacetext(S.colour," ","_")]") ..() @@ -82,7 +98,7 @@ input = /mob/living/carbon/human/monkey output = null -/datum/food_processor_process/mob/monkey/process(loc, what) +/datum/food_processor_process/mob/monkey/process_food(loc, what, processor) var/mob/living/carbon/human/monkey/O = what if (O.client) //grief-proof O.loc = loc @@ -130,6 +146,17 @@ user << "\the [src] is already processing something!" return 1 + if(default_deconstruction_screwdriver(user, "processor1", "processor", O)) + return + + if(exchange_parts(user, O)) + return + + if(default_unfasten_wrench(user, O)) + return + + default_deconstruction_crowbar(O) + if(src.contents.len > 0) //TODO: several items at once? several different items? user << "Something is already in the processing chamber." return 1 @@ -164,28 +191,28 @@ if(src.contents.len == 0) user << "\the [src] is empty." return 1 + src.processing = 1 + user.visible_message("[user] turns on [src].", \ + "You turn on [src].", \ + "You hear a food processor.") + playsound(src.loc, 'sound/machines/blender.ogg', 50, 1) + use_power(500) + var/total_time = 0 + for(var/O in src.contents) + var/datum/food_processor_process/P = select_recipe(O) + if (!P) + log_admin("DEBUG: The [O] in processor([src]) does not have a suitable recipe, but it was somehow put inside of the processor anyways.") + continue + total_time += P.time + sleep(total_time / rating_speed) for(var/O in src.contents) var/datum/food_processor_process/P = select_recipe(O) if (!P) - log_admin("DEBUG: WARNING: The [O] in processor([src]) does not have a suitable recipe, but it was somehow put inside of the processor anyways.") //-rastaf0 + log_admin("DEBUG: The [O] in processor([src]) does not have a suitable recipe, but it was somehow put inside of the processor anyways.") continue - - src.processing = 1 - user.visible_message(" \the [user] turns on \the [src].", \ - "You turn on \the [src].", \ - "You hear a food processor.") - - playsound(src.loc, 'sound/machines/blender.ogg', 50, 1) - var/offset = prob(50) ? -2 : 2 - animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = P.time*5) //start shaking - use_power(500) - - sleep(P.time) - - pixel_x = initial(pixel_x) //return to its spot after shaking - P.process(src.loc, O) - src.processing = 0 + P.process_food(src.loc, O, src) + src.processing = 0 src.visible_message("\the [src] has finished processing.", \ "\the [src] has finished processing.", \ diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index df4a9110205..e4c952bdcb2 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -11,7 +11,7 @@ idle_power_usage = 5 active_power_usage = 100 flags = NOREACT - var/global/max_n_of_items = 999 // Sorry but the BYOND infinite loop detector doesn't look things over 1000. + var/max_n_of_items = 999 //No, this should NOT be a global var. var/icon_on = "smartfridge" var/icon_off = "smartfridge-off" var/icon_panel = "smartfridge-panel" @@ -22,7 +22,7 @@ var/scan_id = 1 var/is_secure = 0 var/datum/wires/smartfridge/wires = null - + /obj/machinery/smartfridge/secure is_secure = 1 @@ -60,7 +60,7 @@ desc = "A refrigerated storage unit for storing medicine and chemicals." icon_state = "smartfridge" //To fix the icon in the map editor. icon_on = "smartfridge_chem" - + /obj/machinery/smartfridge/medbay/accept_check(var/obj/item/O as obj) if(istype(O,/obj/item/weapon/reagent_containers/glass/)) return 1 @@ -79,7 +79,7 @@ if(istype(O,/obj/item/slime_extract)) return 1 return 0 - + /obj/machinery/smartfridge/secure/medbay name = "\improper Secure Refrigerated Medicine Storage" desc = "A refrigerated storage unit for storing medicine and chemicals." @@ -117,7 +117,7 @@ icon_state = "smartfridge" //To fix the icon in the map editor. icon_on = "smartfridge_chem" req_access_txt = "33" - + /obj/machinery/smartfridge/chemistry/accept_check(var/obj/item/O as obj) if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers)) return 1 @@ -262,12 +262,12 @@ if(P.contents.len > 0) user << "Some items are refused." nanomanager.update_uis(src) - -/obj/machinery/smartfridge/secure/emag_act(user as mob) + +/obj/machinery/smartfridge/secure/emag_act(user as mob) emagged = 1 locked = -1 user << "You short out the product lock on [src]." - + /******************* * SmartFridge Menu ********************/ @@ -361,7 +361,7 @@ *************************/ /obj/machinery/smartfridge/secure/Topic(href, href_list) - if(stat & (NOPOWER|BROKEN)) + if(stat & (NOPOWER|BROKEN)) return 0 if(usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) if(!allowed(usr) && !emagged && locked != -1 && href_list["vend"]) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 14c72f6ee9c..23d726a2980 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -179,8 +179,8 @@ Class Procs: //sets the use_power var and then forces an area power update /obj/machinery/proc/update_use_power(var/new_use_power) - use_power = new_use_power - + use_power = new_use_power + /obj/machinery/proc/auto_use_power() if(!powered(power_channel)) return 0 @@ -298,7 +298,7 @@ Class Procs: /obj/machinery/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/state = default_state) if(..(href, href_list, nowindow, state)) return 1 - + handle_multitool_topic(href,href_list,usr) add_fingerprint(usr) return 0 @@ -308,7 +308,7 @@ Class Procs: /obj/machinery/proc/inoperable(var/additional_flags = 0) return (stat & (NOPOWER|BROKEN|additional_flags)) - + /obj/machinery/CanUseTopic(var/mob/user) if(!interact_offline && (stat & (NOPOWER|BROKEN))) return STATUS_CLOSE @@ -431,9 +431,13 @@ Class Procs: /obj/machinery/proc/exchange_parts(mob/user, obj/item/weapon/storage/part_replacer/W) var/shouldplaysound = 0 if(istype(W) && component_parts) - if(panel_open) + if(panel_open || W.works_from_distance) var/obj/item/weapon/circuitboard/CB = locate(/obj/item/weapon/circuitboard) in component_parts var/P + if(W.works_from_distance) + user << "Following parts detected in the machine:" + for(var/var/obj/item/C in component_parts) + user << " [C.name]" for(var/obj/item/weapon/stock_parts/A in component_parts) for(var/D in CB.req_components) if(ispath(A.type, D)) @@ -498,8 +502,8 @@ Class Procs: threatcount -= 2 if(check_access && !allowed(perp)) - threatcount += 4 - + threatcount += 4 + if(auth_weapons && !src.allowed(perp)) if(istype(perp.l_hand, /obj/item/weapon/gun) || istype(perp.l_hand, /obj/item/weapon/melee)) threatcount += 4 @@ -526,7 +530,7 @@ Class Procs: threatcount += 4 return threatcount - + /obj/machinery/proc/shock(mob/user, prb) if(inoperable()) diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index 1756935eacb..1bde9648905 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -85,6 +85,19 @@ ..() charge = 0 +/obj/item/weapon/stock_parts/cell/bluespace + name = "bluespace power cell" + origin_tech = "powerstorage=7" + icon_state = "bscell" + maxcharge = 40000 + g_amt = 80 + rating = 6 + construction_cost = list("metal"=800,"gold"=300,"silver"=300,"glass"=160,"diamond"=160) + +/obj/item/weapon/stock_parts/cell/bluespace/empty/New() + ..() + charge = 0 + /obj/item/weapon/stock_parts/cell/infinite name = "infinite-capacity power cell!" icon_state = "icell" diff --git a/code/game/objects/items/weapons/stock_parts.dm b/code/game/objects/items/weapons/stock_parts.dm index 758486872a4..915cb5428b6 100644 --- a/code/game/objects/items/weapons/stock_parts.dm +++ b/code/game/objects/items/weapons/stock_parts.dm @@ -16,10 +16,40 @@ display_contents_with_number = 1 max_w_class = 3 max_combined_w_class = 100 + var/works_from_distance = 0 + var/primary_sound = 'sound/items/rped.ogg' + var/alt_sound = null + +/obj/item/weapon/storage/part_replacer/afterattack(obj/machinery/T as obj, mob/living/carbon/human/user as mob, flag, params) + if(flag) + return + else + if(works_from_distance) + if(istype(T)) + if(T.component_parts) + T.exchange_parts(user, src) + user.Beam(T,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5) + return + +/obj/item/weapon/storage/part_replacer/bluespace + name = "bluespace rapid part exchange device" + desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts." + icon_state = "BS_RPED" + item_state = "BS_RPED" + w_class = 3 + storage_slots = 400 + max_w_class = 3 + max_combined_w_class = 800 + works_from_distance = 1 + primary_sound = 'sound/items/PSHOOM.ogg' + alt_sound = 'sound/items/PSHOOM_2.ogg' /obj/item/weapon/storage/part_replacer/proc/play_rped_sound() //Plays the sound for RPED exchanging or installing parts. - playsound(src, 'sound/items/rped.ogg', 40, 1) + if(alt_sound && prob(30)) + playsound(src, alt_sound, 40, 1) + else + playsound(src, primary_sound, 40, 1) //Sorts stock parts inside an RPED by their rating. //Only use /obj/item/weapon/stock_parts/ with this sort proc! @@ -174,6 +204,51 @@ rating = 3 m_amt = 80 +//Rating 4 + +/obj/item/weapon/stock_parts/capacitor/quadratic + name = "quadratic capacitor" + desc = "An capacity capacitor used in the construction of a variety of devices." + icon_state = "quadratic_capacitor" + origin_tech = "powerstorage=6;materials=5" + rating = 4 + m_amt = 50 + g_amt = 50 + +/obj/item/weapon/stock_parts/scanning_module/triphasic + name = "triphasic scanning module" + desc = "A compact, ultra resolution triphasic scanning module used in the construction of certain devices." + icon_state = "triphasic_scan_module" + origin_tech = "magnets=6" + rating = 4 + m_amt = 50 + g_amt = 20 + +/obj/item/weapon/stock_parts/manipulator/femto + name = "femto-manipulator" + desc = "A tiny little manipulator used in the construction of certain devices." + icon_state = "femto_mani" + origin_tech = "materials=6;programming=3" + rating = 4 + m_amt = 30 + +/obj/item/weapon/stock_parts/micro_laser/quadultra + name = "quad-ultra micro-laser" + icon_state = "quadultra_micro_laser" + desc = "A tiny laser used in certain devices." + origin_tech = "magnets=6" + rating = 4 + m_amt = 10 + g_amt = 20 + +/obj/item/weapon/stock_parts/matter_bin/bluespace + name = "bluespace matter bin" + desc = "A container for hold compressed matter awaiting re-construction." + icon_state = "bluespace_matter_bin" + origin_tech = "materials=6" + rating = 4 + m_amt = 80 + // Subspace stock parts /obj/item/weapon/stock_parts/subspace/ansible diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index e004a7b0d83..821732b113e 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -150,7 +150,8 @@ var/list/admin_verbs_debug = list( /client/proc/debugNatureMapGenerator, /client/proc/check_bomb_impacts, /client/proc/test_movable_UI, - /client/proc/test_snap_UI + /client/proc/test_snap_UI, + /proc/machine_upgrade ) var/list/admin_verbs_possess = list( /proc/possess, @@ -203,7 +204,7 @@ var/list/admin_verbs_mentor = list( if(holder.rights & R_SPAWN) verbs += admin_verbs_spawn if(holder.rights & R_MOD) verbs += admin_verbs_mod if(holder.rights & R_MENTOR) verbs += admin_verbs_mentor - + /client/proc/remove_admin_verbs() verbs.Remove( admin_verbs_default, @@ -244,7 +245,7 @@ var/list/admin_verbs_mentor = list( add_admin_verbs() src << "All of your adminverbs are now visible." - feedback_add_details("admin_verb","TAVVS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + feedback_add_details("admin_verb","TAVVS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/admin_ghost() set category = "Admin" @@ -576,7 +577,7 @@ var/list/admin_verbs_mentor = list( deadmins += ckey src << "You are now a normal player." feedback_add_details("admin_verb","DAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - + /client/proc/readmin() set name = "Re-admin self" set category = "Admin" diff --git a/code/modules/admin/machine_upgrade.dm b/code/modules/admin/machine_upgrade.dm new file mode 100644 index 00000000000..9f2039fdd0f --- /dev/null +++ b/code/modules/admin/machine_upgrade.dm @@ -0,0 +1,10 @@ +/proc/machine_upgrade(obj/machinery/M in world) + set name = "Tweak Component Ratings" + set category = "Debug" + var/new_rating = input("Enter new rating:","Num") as num + if(new_rating && M.component_parts) + for(var/obj/item/weapon/stock_parts/P in M.component_parts) + P.rating = new_rating + M.RefreshParts() + + feedback_add_details("admin_verb","MU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 4b2763c0d86..43d66d02855 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -16,6 +16,8 @@ var/active = 0 var/powered = 0 var/fire_delay = 100 + var/maximum_fire_delay = 100 + var/minimum_fire_delay = 20 var/last_shot = 0 var/shot_number = 0 var/state = 0 @@ -25,6 +27,30 @@ var/id_tag = null var/datum/radio_frequency/radio_connection +/obj/machinery/power/emitter/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/emitter(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + RefreshParts() + +/obj/machinery/power/emitter/RefreshParts() + var/max_firedelay = 120 + var/firedelay = 120 + var/min_firedelay = 24 + var/power_usage = 350 + for(var/obj/item/weapon/stock_parts/micro_laser/L in component_parts) + max_firedelay -= 20 * L.rating + min_firedelay -= 4 * L.rating + firedelay -= 20 * L.rating + maximum_fire_delay = max_firedelay + minimum_fire_delay = min_firedelay + fire_delay = firedelay + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + power_usage -= 50 * M.rating + active_power_usage = power_usage + //Radio remote control /obj/machinery/power/emitter/proc/set_frequency(new_frequency) radio_controller.remove_object(src, frequency) @@ -114,7 +140,7 @@ src.active = 1 user << "You turn on the [src]." src.shot_number = 0 - src.fire_delay = 100 + src.fire_delay = maximum_fire_delay message_admins("Emitter turned on by [key_name_admin(user)] in ([x],[y],[z] - JMP)",0,1) log_game("Emitter turned on by [key_name(user)] in ([x],[y],[z])") investigate_log("turned on by [key_name(usr)]","singulo") @@ -162,7 +188,7 @@ src.fire_delay = 2 src.shot_number ++ else - src.fire_delay = rand(20,100) + src.fire_delay = rand(minimum_fire_delay,maximum_fire_delay) src.shot_number = 0 var/obj/item/projectile/beam/emitter/A = PoolOrNew(/obj/item/projectile/beam/emitter,src.loc) @@ -269,6 +295,14 @@ user << "\red Access denied." return + if(default_deconstruction_screwdriver(user, "emitter_open", "emitter", W)) + return + + if(exchange_parts(user, W)) + return + + default_deconstruction_crowbar(W) + ..() return diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index ffe87160b5c..fdefe8f487e 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -242,6 +242,36 @@ build_path = /obj/item/weapon/circuitboard/rdserver category = list("Research Machinery") +/datum/design/monkey_recycler + name = "Machine Design (Monkey Recycler Board)" + desc = "The circuit board for a monkey recycler." + id = "smartfridge" + req_tech = list("programming" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/monkey_recycler + category = list ("Misc. Machinery") + +/datum/design/processor + name = "Machine Design (Processor Board)" + desc = "The circuit board for a processor." + id = "processor" + req_tech = list("programming" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/processor + category = list ("Misc. Machinery") + +/datum/design/holopad + name = "Machine Design (AI Holopad Board)" + desc = "The circuit board for a holopad." + id = "holopad" + req_tech = list("programming" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/holopad + category = list ("Misc. Machinery") + /datum/design/arcadebattle name = "Machine Board (Battle Arcade Machine)" desc = "Allows for the construction of circuit boards used to build a new Arcade Machine." diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm index ec67de5717a..70be59438fa 100644 --- a/code/modules/research/designs/power_designs.dm +++ b/code/modules/research/designs/power_designs.dm @@ -48,6 +48,18 @@ build_path = /obj/item/weapon/stock_parts/cell/super category = list("Misc","Power") +/datum/design/bluespace_cell + name = "Bluespace Power Cell" + desc = "A power cell that holds 40000 units of energy." + id = "bluespace_cell" + req_tech = list("powerstorage" = 6, "materials" = 5) + reliability_base = 70 + build_type = PROTOLATHE | MECHFAB + materials = list("$metal" = 800, "$gold" = 300, "$silver" = 300, "$glass" = 160, "$diamond" = 160) + construction_time=100 + build_path = /obj/item/weapon/stock_parts/cell/bluespace + category = list("Misc","Power") + /datum/design/pacman name = "Machine Board (PACMAN-type Generator)" desc = "The circuit board that for a PACMAN-type portable generator." diff --git a/code/modules/research/designs/stock_parts_designs.dm b/code/modules/research/designs/stock_parts_designs.dm index c98376f66e0..6f8ff421069 100644 --- a/code/modules/research/designs/stock_parts_designs.dm +++ b/code/modules/research/designs/stock_parts_designs.dm @@ -156,13 +156,78 @@ reliability_base = 75 build_path = /obj/item/weapon/stock_parts/matter_bin/super category = list("Stock Parts") - + +/datum/design/quadratic_capacitor + name = "Quadratic Capacitor" + desc = "A stock part used in the construction of various devices." + id = "quadratic_capacitor" + req_tech = list("powerstorage" = 6, "materials" = 5) + build_type = PROTOLATHE + reliability_base = 71 + materials = list("$metal" = 100, "$glass" = 100, "$diamond" = 40) + build_path = /obj/item/weapon/stock_parts/capacitor/quadratic + category = list("Stock Parts") + +/datum/design/triphasic_scanning + name = "Triphasic Scanning Module" + desc = "A stock part used in the construction of various devices." + id = "triphasic_scanning" + req_tech = list("magnets" = 6, "materials" = 4) + build_type = PROTOLATHE + materials = list("$metal" = 100, "$glass" = 40, "$diamond" = 20) + reliability_base = 72 + build_path = /obj/item/weapon/stock_parts/scanning_module/triphasic + category = list("Stock Parts") + +/datum/design/femto_mani + name = "Femto Manipulator" + desc = "A stock part used in the construction of various devices." + id = "femto_mani" + req_tech = list("materials" = 6, "programming" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 60, "$diamond" = 30) + reliability_base = 73 + build_path = /obj/item/weapon/stock_parts/manipulator/femto + category = list("Stock Parts") + +/datum/design/quadultra_micro_laser + name = "Quad-Ultra Micro-Laser" + desc = "A stock part used in the construction of various devices." + id = "quadultra_micro_laser" + req_tech = list("magnets" = 6, "materials" = 6) + build_type = PROTOLATHE + materials = list("$metal" = 20, "$glass" = 40, "$uranium" = 20, "$diamond" = 20) + reliability_base = 70 + build_path = /obj/item/weapon/stock_parts/micro_laser/quadultra + category = list("Stock Parts") + +/datum/design/bluespace_matter_bin + name = "Bluespace Matter Bin" + desc = "A stock part used in the construction of various devices." + id = "bluespace_matter_bin" + req_tech = list("materials" = 6) + build_type = PROTOLATHE + materials = list("$metal" = 160, "$diamond" = 200) + reliability_base = 75 + build_path = /obj/item/weapon/stock_parts/matter_bin/bluespace + category = list("Stock Parts") + /datum/design/RPED name = "Rapid Part Exchange Device" desc = "Special mechanical module made to store, sort, and apply standard machine parts." id = "rped" req_tech = list("engineering" = 3, "materials" = 3) build_type = PROTOLATHE - materials = list("$metal" = 15000, "$glass" = 5000) //hardcore + materials = list("$metal" = 10000, "$glass" = 5000) //hardcore build_path = /obj/item/weapon/storage/part_replacer + category = list("Stock Parts") + +/datum/design/BS_RPED + name = "Bluespace RPED" + desc = "Powered by bluespace technology, this RPED variant can upgrade buildings from a distance, without needing to remove the panel first." + id = "bs_rped" + req_tech = list("engineering" = 3, "materials" = 5, "programming" = 3, "bluespace" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 15000, "$glass" = 5000, "$silver" = 2500) //hardcore + build_path = /obj/item/weapon/storage/part_replacer/bluespace category = list("Stock Parts") \ No newline at end of file diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 299c0a12e65..9e6b8ad7130 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index b13d335712c..17d798b595b 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index 19e56047c76..105a6a04bd4 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/icons/obj/singularity.dmi b/icons/obj/singularity.dmi index 1124662d10f..29426aebbd8 100644 Binary files a/icons/obj/singularity.dmi and b/icons/obj/singularity.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index e20d878e3b0..5e025cdb38e 100755 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi index d263d057cbc..6c24ded6f48 100644 Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index a2fe52b8847..4a3c4172c7f 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/paradise.dme b/paradise.dme index 2126b1b0b21..d1241346eb8 100644 --- a/paradise.dme +++ b/paradise.dme @@ -902,6 +902,7 @@ #include "code\modules\admin\create_turf.dm" #include "code\modules\admin\holder2.dm" #include "code\modules\admin\IsBanned.dm" +#include "code\modules\admin\machine_upgrade.dm" #include "code\modules\admin\NewBan.dm" #include "code\modules\admin\newbanjob.dm" #include "code\modules\admin\player_notes.dm" diff --git a/sound/items/PSHOOM.ogg b/sound/items/PSHOOM.ogg new file mode 100644 index 00000000000..5628842f534 Binary files /dev/null and b/sound/items/PSHOOM.ogg differ diff --git a/sound/items/PSHOOM_2.ogg b/sound/items/PSHOOM_2.ogg new file mode 100644 index 00000000000..480b302fad8 Binary files /dev/null and b/sound/items/PSHOOM_2.ogg differ