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