")
- t = replacetext(t, "\[br\]", " ")
- t = replacetext(t, "\n", " ")
- t = replacetext(t, "\[b\]", "")
- t = replacetext(t, "\[/b\]", "")
- t = replacetext(t, "\[i\]", "")
- t = replacetext(t, "\[/i\]", "")
- t = replacetext(t, "\[u\]", "")
- t = replacetext(t, "\[/u\]", "")
- t = replacetext(t, "\[time\]", "[station_time_timestamp()]")
- t = replacetext(t, "\[date\]", "[time2text(world.realtime, "MMM DD")] [GLOB.year_integer+540]")
- t = replacetext(t, "\[large\]", "")
- t = replacetext(t, "\[/large\]", "")
- t = replacetext(t, "\[h1\]", "
")
- t = replacetext(t, "\[/h1\]", "
")
- t = replacetext(t, "\[h2\]", "
")
- t = replacetext(t, "\[/h2\]", "
")
- t = replacetext(t, "\[h3\]", "
")
- t = replacetext(t, "\[/h3\]", "
")
- t = replacetext(t, "\[*\]", "
")
- t = replacetext(t, "\[hr\]", "")
- t = replacetext(t, "\[small\]", "")
- t = replacetext(t, "\[/small\]", "")
- t = replacetext(t, "\[list\]", "
")
- t = replacetext(t, "\[/list\]", "
")
- t = replacetext(t, "\[table\]", "
")
- t = replacetext(t, "\[/table\]", "
")
- t = replacetext(t, "\[grid\]", "
")
- t = replacetext(t, "\[/grid\]", "
")
- t = replacetext(t, "\[row\]", "
")
- t = replacetext(t, "\[tr\]", "
")
- t = replacetext(t, "\[td\]", "
")
- t = replacetext(t, "\[cell\]", "
")
- t = replacetext(t, "\[tab\]", " ")
-
- t = parsemarkdown_basic(t)
-
- return t
-
-/datum/computer_file/program/filemanager/proc/prepare_printjob(t) // Additional stuff to parse if we want to print it and make a happy Head of Personnel. Forms FTW.
- t = replacetext(t, "\[field\]", "")
- t = replacetext(t, "\[sign\]", "")
-
- t = parse_tags(t)
-
- t = replacetext(t, regex("(?:%s(?:ign)|%f(?:ield))(?=\\s|$)", "ig"), "")
-
- return t
+ return TRUE
/datum/computer_file/program/filemanager/ui_data(mob/user)
var/list/data = get_header_data()
@@ -192,41 +73,28 @@
var/obj/item/computer_hardware/hard_drive/portable/RHDD = computer.all_components[MC_SDD]
if(error)
data["error"] = error
- if(open_file)
- var/datum/computer_file/data/file
-
- if(!computer || !HDD)
- data["error"] = "I/O ERROR: Unable to access hard drive."
- else
- file = HDD.find_file_by_name(open_file)
- if(!istype(file))
- data["error"] = "I/O ERROR: Unable to open file."
- else
- data["filedata"] = parse_tags(file.stored_data)
- data["filename"] = "[file.filename].[file.filetype]"
+ if(!computer || !HDD)
+ data["error"] = "I/O ERROR: Unable to access hard drive."
else
- if(!computer || !HDD)
- data["error"] = "I/O ERROR: Unable to access hard drive."
- else
- var/list/files[0]
- for(var/datum/computer_file/F in HDD.stored_files)
- files.Add(list(list(
+ var/list/files = list()
+ for(var/datum/computer_file/F in HDD.stored_files)
+ files += list(list(
+ "name" = F.filename,
+ "type" = F.filetype,
+ "size" = F.size,
+ "undeletable" = F.undeletable
+ ))
+ data["files"] = files
+ if(RHDD)
+ data["usbconnected"] = TRUE
+ var/list/usbfiles = list()
+ for(var/datum/computer_file/F in RHDD.stored_files)
+ usbfiles += list(list(
"name" = F.filename,
"type" = F.filetype,
"size" = F.size,
"undeletable" = F.undeletable
- )))
- data["files"] = files
- if(RHDD)
- data["usbconnected"] = 1
- var/list/usbfiles[0]
- for(var/datum/computer_file/F in RHDD.stored_files)
- usbfiles.Add(list(list(
- "name" = F.filename,
- "type" = F.filetype,
- "size" = F.size,
- "undeletable" = F.undeletable
- )))
- data["usbfiles"] = usbfiles
+ ))
+ data["usbfiles"] = usbfiles
return data
diff --git a/code/modules/modular_computers/file_system/programs/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/ntmonitor.dm
index 226686fc042..1932f671f9b 100644
--- a/code/modules/modular_computers/file_system/programs/ntmonitor.dm
+++ b/code/modules/modular_computers/file_system/programs/ntmonitor.dm
@@ -4,58 +4,48 @@
program_icon_state = "comm_monitor"
extended_desc = "This program monitors stationwide NTNet network, provides access to logging systems, and allows for configuration changes"
size = 12
- requires_ntnet = 1
+ requires_ntnet = TRUE
required_access = ACCESS_NETWORK //NETWORK CONTROL IS A MORE SECURE PROGRAM.
- available_on_ntnet = 1
+ available_on_ntnet = TRUE
tgui_id = "ntos_net_monitor"
/datum/computer_file/program/ntnetmonitor/ui_act(action, params)
if(..())
- return 1
+ return
switch(action)
if("resetIDS")
- . = 1
if(SSnetworks.station_network)
SSnetworks.station_network.resetIDS()
- return 1
+ return TRUE
if("toggleIDS")
- . = 1
if(SSnetworks.station_network)
SSnetworks.station_network.toggleIDS()
- return 1
+ return TRUE
if("toggleWireless")
- . = 1
if(!SSnetworks.station_network)
- return 1
+ return
// NTNet is disabled. Enabling can be done without user prompt
if(SSnetworks.station_network.setting_disabled)
- SSnetworks.station_network.setting_disabled = 0
- return 1
+ SSnetworks.station_network.setting_disabled = FALSE
+ return TRUE
- // NTNet is enabled and user is about to shut it down. Let's ask them if they really want to do it, as wirelessly connected computers won't connect without NTNet being enabled (which may prevent people from turning it back on)
- var/mob/user = usr
- if(!user)
- return 1
- var/response = alert(user, "Really disable NTNet wireless? If your computer is connected wirelessly you won't be able to turn it back on! This will affect all connected wireless devices.", "NTNet shutdown", "Yes", "No")
- if(response == "Yes")
- SSnetworks.station_network.setting_disabled = 1
- return 1
+ SSnetworks.station_network.setting_disabled = TRUE
+ return TRUE
if("purgelogs")
- . = 1
if(SSnetworks.station_network)
SSnetworks.station_network.purge_logs()
+ return TRUE
if("updatemaxlogs")
- . = 1
- var/mob/user = usr
- var/logcount = text2num(input(user,"Enter amount of logs to keep in memory ([MIN_NTNET_LOGS]-[MAX_NTNET_LOGS]):"))
+ var/logcount = params["new_number"]
if(SSnetworks.station_network)
SSnetworks.station_network.update_max_log_count(logcount)
+ return TRUE
if("toggle_function")
- . = 1
if(!SSnetworks.station_network)
- return 1
+ return
SSnetworks.station_network.toggle_function(text2num(params["id"]))
+ return TRUE
/datum/computer_file/program/ntnetmonitor/ui_data(mob/user)
if(!SSnetworks.station_network)
@@ -73,6 +63,8 @@
data["config_systemcontrol"] = SSnetworks.station_network.setting_systemcontrol
data["ntnetlogs"] = list()
+ data["minlogs"] = MIN_NTNET_LOGS
+ data["maxlogs"] = MAX_NTNET_LOGS
for(var/i in SSnetworks.station_network.logs)
data["ntnetlogs"] += list(list("entry" = i))
diff --git a/code/modules/modular_computers/file_system/programs/nttransfer.dm b/code/modules/modular_computers/file_system/programs/nttransfer.dm
deleted file mode 100644
index eef2eedd531..00000000000
--- a/code/modules/modular_computers/file_system/programs/nttransfer.dm
+++ /dev/null
@@ -1,183 +0,0 @@
-/datum/computer_file/program/nttransfer
- filename = "nttransfer"
- filedesc = "P2P Transfer Client"
- extended_desc = "This program allows for simple file transfer via direct peer to peer connection."
- program_icon_state = "comm_logs"
- size = 7
- requires_ntnet = 1
- requires_ntnet_feature = NTNET_PEERTOPEER
- network_destination = "other device via P2P tunnel"
- available_on_ntnet = 1
- tgui_id = "ntos_net_transfer"
-
- var/error = "" // Error screen
- var/server_password = "" // Optional password to download the file.
- var/datum/computer_file/provided_file = null // File which is provided to clients.
- var/datum/computer_file/downloaded_file = null // File which is being downloaded
- var/list/connected_clients = list() // List of connected clients.
- var/datum/computer_file/program/nttransfer/remote // Client var, specifies who are we downloading from.
- var/download_completion = 0 // Download progress in GQ
- var/download_netspeed = 0 // Our connectivity speed in GQ/s
- var/actual_netspeed = 0 // Displayed in the UI, this is the actual transfer speed.
- var/unique_token // UID of this program
- var/upload_menu = 0 // Whether we show the program list and upload menu
- var/static/nttransfer_uid = 0
-
-/datum/computer_file/program/nttransfer/New()
- unique_token = nttransfer_uid++
- ..()
-
-/datum/computer_file/program/nttransfer/process_tick()
- // Server mode
- update_netspeed()
- if(provided_file)
- for(var/datum/computer_file/program/nttransfer/C in connected_clients)
- // Transfer speed is limited by device which uses slower connectivity.
- // We can have multiple clients downloading at same time, but let's assume we use some sort of multicast transfer
- // so they can all run on same speed.
- C.actual_netspeed = min(C.download_netspeed, download_netspeed)
- C.download_completion += C.actual_netspeed
- if(C.download_completion >= provided_file.size)
- C.finish_download()
- else if(downloaded_file) // Client mode
- if(!remote)
- crash_download("Connection to remote server lost")
-
-/datum/computer_file/program/nttransfer/kill_program(forced = FALSE)
- if(downloaded_file) // Client mode, clean up variables for next use
- finalize_download()
-
- if(provided_file) // Server mode, disconnect all clients
- for(var/datum/computer_file/program/nttransfer/P in connected_clients)
- P.crash_download("Connection terminated by remote server")
- downloaded_file = null
- ..(forced)
-
-/datum/computer_file/program/nttransfer/proc/update_netspeed()
- download_netspeed = 0
- switch(ntnet_status)
- if(1)
- download_netspeed = NTNETSPEED_LOWSIGNAL
- if(2)
- download_netspeed = NTNETSPEED_HIGHSIGNAL
- if(3)
- download_netspeed = NTNETSPEED_ETHERNET
-
-// Finishes download and attempts to store the file on HDD
-/datum/computer_file/program/nttransfer/proc/finish_download()
- var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
- if(!computer || !hard_drive || !hard_drive.store_file(downloaded_file))
- error = "I/O Error: Unable to save file. Check your hard drive and try again."
- finalize_download()
-
-// Crashes the download and displays specific error message
-/datum/computer_file/program/nttransfer/proc/crash_download(var/message)
- error = message ? message : "An unknown error has occurred during download"
- finalize_download()
-
-// Cleans up variables for next use
-/datum/computer_file/program/nttransfer/proc/finalize_download()
- if(remote)
- remote.connected_clients.Remove(src)
- downloaded_file = null
- remote = null
- download_completion = 0
-
-/datum/computer_file/program/nttransfer/ui_act(action, params)
- if(..())
- return 1
- switch(action)
- if("PRG_downloadfile")
- for(var/datum/computer_file/program/nttransfer/P in SSnetworks.station_network.fileservers)
- if("[P.unique_token]" == params["id"])
- remote = P
- break
- if(!remote || !remote.provided_file)
- return
- if(remote.server_password)
- var/pass = reject_bad_text(input(usr, "Code 401 Unauthorized. Please enter password:", "Password required"))
- if(pass != remote.server_password)
- error = "Incorrect Password"
- return
- downloaded_file = remote.provided_file.clone()
- remote.connected_clients.Add(src)
- return 1
- if("PRG_reset")
- error = ""
- upload_menu = 0
- finalize_download()
- if(src in SSnetworks.station_network.fileservers)
- SSnetworks.station_network.fileservers.Remove(src)
- for(var/datum/computer_file/program/nttransfer/T in connected_clients)
- T.crash_download("Remote server has forcibly closed the connection")
- provided_file = null
- return 1
- if("PRG_setpassword")
- var/pass = reject_bad_text(input(usr, "Enter new server password. Leave blank to cancel, input 'none' to disable password.", "Server security", "none"))
- if(!pass)
- return
- if(pass == "none")
- server_password = ""
- return
- server_password = pass
- return 1
- if("PRG_uploadfile")
- var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
- for(var/datum/computer_file/F in hard_drive.stored_files)
- if("[F.uid]" == params["id"])
- if(F.unsendable)
- error = "I/O Error: File locked."
- return
- if(istype(F, /datum/computer_file/program))
- var/datum/computer_file/program/P = F
- if(!P.can_run(usr,transfer = 1))
- error = "Access Error: Insufficient rights to upload file."
- provided_file = F
- SSnetworks.station_network.fileservers.Add(src)
- return
- error = "I/O Error: Unable to locate file on hard drive."
- return 1
- if("PRG_uploadmenu")
- upload_menu = 1
-
-
-/datum/computer_file/program/nttransfer/ui_data(mob/user)
-
- var/list/data = get_header_data()
-
- if(error)
- data["error"] = error
- else if(downloaded_file)
- data["downloading"] = 1
- data["download_size"] = downloaded_file.size
- data["download_progress"] = download_completion
- data["download_netspeed"] = actual_netspeed
- data["download_name"] = "[downloaded_file.filename].[downloaded_file.filetype]"
- else if (provided_file)
- data["uploading"] = 1
- data["upload_uid"] = unique_token
- data["upload_clients"] = connected_clients.len
- data["upload_haspassword"] = server_password ? 1 : 0
- data["upload_filename"] = "[provided_file.filename].[provided_file.filetype]"
- else if (upload_menu)
- var/list/all_files[0]
- var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
- for(var/datum/computer_file/F in hard_drive.stored_files)
- all_files.Add(list(list(
- "uid" = F.uid,
- "filename" = "[F.filename].[F.filetype]",
- "size" = F.size
- )))
- data["upload_filelist"] = all_files
- else
- var/list/all_servers[0]
- for(var/datum/computer_file/program/nttransfer/P in SSnetworks.station_network.fileservers)
- all_servers.Add(list(list(
- "uid" = P.unique_token,
- "filename" = "[P.provided_file.filename].[P.provided_file.filetype]",
- "size" = P.provided_file.size,
- "haspassword" = P.server_password ? 1 : 0
- )))
- data["servers"] = all_servers
-
- return data
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index ef862aa9fab..367aaca851f 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -22,11 +22,10 @@ Contents:
armor = list("melee" = 60, "bullet" = 50, "laser" = 30,"energy" = 40, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 100, "acid" = 100)
strip_delay = 12
- actions_types = list(/datum/action/item_action/initialize_ninja_suit, /datum/action/item_action/ninjasmoke, /datum/action/item_action/ninjaboost, /datum/action/item_action/ninjapulse, /datum/action/item_action/ninjastar, /datum/action/item_action/ninjanet, /datum/action/item_action/ninja_sword_recall, /datum/action/item_action/ninja_stealth, /datum/action/item_action/toggle_glove)
+ actions_types = list(/datum/action/item_action/toggle_spacesuit, /datum/action/item_action/initialize_ninja_suit, /datum/action/item_action/ninjasmoke, /datum/action/item_action/ninjaboost, /datum/action/item_action/ninjapulse, /datum/action/item_action/ninjastar, /datum/action/item_action/ninjanet, /datum/action/item_action/ninja_sword_recall, /datum/action/item_action/ninja_stealth, /datum/action/item_action/toggle_glove)
//Important parts of the suit.
var/mob/living/carbon/human/affecting = null
- var/obj/item/stock_parts/cell/cell
var/datum/effect_system/spark_spread/spark_system
var/datum/techweb/stored_research
var/obj/item/disk/tech_disk/t_disk//To copy design onto disk.
@@ -72,10 +71,15 @@ Contents:
//Cell Init
cell = new/obj/item/stock_parts/cell/high
- cell.charge = 9000
+ cell.charge = 60000 // larger as it now heats
+ cell.maxcharge = 60000
cell.name = "black power cell"
cell.icon_state = "bscell"
+// seal the cell in the ninja outfit
+/obj/item/clothing/suit/space/space_ninja/toggle_spacesuit_cell(mob/user)
+ return
+
//Simply deletes all the attachments and self, killing all related procs.
/obj/item/clothing/suit/space/space_ninja/proc/terminate()
qdel(n_hood)
diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm
index 2bcd2ad4f3e..62ff1f78950 100644
--- a/code/modules/photography/camera/camera.dm
+++ b/code/modules/photography/camera/camera.dm
@@ -180,8 +180,14 @@
var/list/mobs = list()
var/blueprints = FALSE
var/clone_area = SSmapping.RequestBlockReservation(size_x * 2 + 1, size_y * 2 + 1)
- for(var/turf/T in block(locate(target_turf.x - size_x, target_turf.y - size_y, target_turf.z), locate(target_turf.x + size_x, target_turf.y + size_y, target_turf.z)))
- if((ai_user && GLOB.cameranet.checkTurfVis(T)) || (T in seen))
+ for(var/turf/placeholder in block(locate(target_turf.x - size_x, target_turf.y - size_y, target_turf.z), locate(target_turf.x + size_x, target_turf.y + size_y, target_turf.z)))
+ var/turf/T = placeholder
+ while(istype(T, /turf/open/openspace)) //Multi-z photography
+ T = SSmapping.get_turf_below(T)
+ if(!T)
+ break
+
+ if(T && ((ai_user && GLOB.cameranet.checkTurfVis(placeholder)) || (placeholder in seen)))
turfs += T
for(var/mob/M in T)
mobs += M
diff --git a/code/modules/photography/camera/camera_image_capturing.dm b/code/modules/photography/camera/camera_image_capturing.dm
index 685f6c49c73..bec09abb542 100644
--- a/code/modules/photography/camera/camera_image_capturing.dm
+++ b/code/modules/photography/camera/camera_image_capturing.dm
@@ -5,7 +5,7 @@
if(istype(A))
appearance = A.appearance
dir = A.dir
- if(ismovableatom(A))
+ if(ismovable(A))
var/atom/movable/AM = A
step_x = AM.step_x
step_y = AM.step_y
@@ -72,7 +72,7 @@
for(var/atom/A in sorted)
var/xo = (A.x - center.x) * world.icon_size + A.pixel_x + xcomp
var/yo = (A.y - center.y) * world.icon_size + A.pixel_y + ycomp
- if(ismovableatom(A))
+ if(ismovable(A))
var/atom/movable/AM = A
xo += AM.step_x
yo += AM.step_y
diff --git a/code/modules/plumbing/plumbers/pumps.dm b/code/modules/plumbing/plumbers/pumps.dm
index da10728b674..dd0b709be9e 100644
--- a/code/modules/plumbing/plumbers/pumps.dm
+++ b/code/modules/plumbing/plumbers/pumps.dm
@@ -1,16 +1,17 @@
///We pump liquids from activated(plungerated) geysers to a plumbing outlet. We need to be wired.
-/obj/machinery/power/liquid_pump
+/obj/machinery/plumbing/liquid_pump
name = "liquid pump"
- desc = "Pump up those sweet liquids from under the surface."
+ desc = "Pump up those sweet liquids from under the surface. Uses thermal energy from geysers to power itself." //better than placing 200 cables, because it wasnt fun
icon = 'icons/obj/plumbing/plumbers.dmi'
icon_state = "pump"
anchored = FALSE
density = TRUE
- circuit = /obj/item/circuitboard/machine/pump
idle_power_usage = 10
active_power_usage = 1000
- ///Are we powered?
- var/powered = FALSE
+
+ rcd_cost = 30
+ rcd_delay = 40
+
///units we pump per process (2 seconds)
var/pump_power = 2
///set to true if the loop couldnt find a geyser in process, so it remembers and stops checking every loop until moved. more accurate name would be absolutely_no_geyser_under_me_so_dont_try
@@ -20,63 +21,42 @@
///volume of our internal buffer
var/volume = 200
-/obj/machinery/power/liquid_pump/Initialize()
+/obj/machinery/plumbing/liquid_pump/Initialize(mapload, bolt)
. = ..()
- create_reagents(volume)
- AddComponent(/datum/component/plumbing/simple_supply, TRUE)
+ AddComponent(/datum/component/plumbing/simple_supply, bolt)
-/obj/machinery/power/liquid_pump/attackby(obj/item/W, mob/user, params)
- if(!powered)
- if(!anchored)
- if(default_deconstruction_screwdriver(user, "[initial(icon_state)]_open", "[initial(icon_state)]",W))
- return
- if(default_deconstruction_crowbar(W))
- return
- return ..()
-
-/obj/machinery/power/liquid_pump/wrench_act(mob/living/user, obj/item/I)
- ..()
- default_unfasten_wrench(user, I)
- return TRUE
///please note that the component has a hook in the parent call, wich handles activating and deactivating
-/obj/machinery/power/liquid_pump/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
+/obj/machinery/plumbing/liquid_pump/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
. = ..()
if(. == SUCCESSFUL_UNFASTEN)
geyser = null
update_icon()
- powered = FALSE
geyserless = FALSE //we switched state, so lets just set this back aswell
-/obj/machinery/power/liquid_pump/process()
- if(!anchored || panel_open)
+/obj/machinery/plumbing/liquid_pump/process()
+ if(!anchored || panel_open || geyserless)
return
- if(!geyser && !geyserless)
+
+ if(!geyser)
for(var/obj/structure/geyser/G in loc.contents)
geyser = G
+ update_icon()
if(!geyser) //we didnt find one, abort
- anchored = FALSE
geyserless = TRUE
visible_message("The [name] makes a sad beep!")
playsound(src, 'sound/machines/buzz-sigh.ogg', 50)
return
- if(avail(active_power_usage))
- if(!powered) //we werent powered before this tick so update our sprite
- powered = TRUE
- update_icon()
- add_load(active_power_usage)
- pump()
- else if(powered) //we were powered, but now we arent
- powered = FALSE
- update_icon()
+ pump()
+
///pump up that sweet geyser nectar
-/obj/machinery/power/liquid_pump/proc/pump()
+/obj/machinery/plumbing/liquid_pump/proc/pump()
if(!geyser || !geyser.reagents)
return
geyser.reagents.trans_to(src, pump_power)
-/obj/machinery/power/liquid_pump/update_icon_state()
- if(powered)
+/obj/machinery/plumbing/liquid_pump/update_icon_state()
+ if(geyser)
icon_state = initial(icon_state) + "-on"
else if(panel_open)
icon_state = initial(icon_state) + "-open"
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index ccbe8a06461..cf087e4eb8d 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -959,7 +959,7 @@
. = UI_INTERACTIVE
/obj/machinery/power/apc/ui_act(action, params)
- if(..() || !can_use(usr, 1) || (locked && !usr.has_unlimited_silicon_privilege && !failure_timer))
+ if(..() || !can_use(usr, 1) || (locked && !usr.has_unlimited_silicon_privilege && !failure_timer && action != "toggle_nightshift"))
return
switch(action)
if("lock")
diff --git a/code/modules/power/multiz.dm b/code/modules/power/multiz.dm
index d5f28462930..6ad239d3b88 100644
--- a/code/modules/power/multiz.dm
+++ b/code/modules/power/multiz.dm
@@ -1,42 +1,106 @@
+#define RELAY_OK 1
+#define RELAY_ADD_CABLE 2
+#define RELAY_ADD_METAL 3
+
/obj/machinery/power/deck_relay //This bridges powernets
name = "Multi-deck power adapter"
desc = "A huge bundle of double insulated cabling which seems to run up into the ceiling."
icon = 'icons/obj/power.dmi'
icon_state = "cablerelay-off"
+ max_integrity = 350
+ integrity_failure = 0.25
+ var/broken_status = RELAY_OK
var/obj/machinery/power/deck_relay/below ///The relay that's below us (for bridging powernets)
var/obj/machinery/power/deck_relay/above ///The relay that's above us (for bridging powernets)
anchored = TRUE
density = FALSE
-/obj/machinery/power/deck_relay/attackby(obj/item/I,mob/user)
+/obj/machinery/power/deck_relay/examine(mob/user)
+ . += ..()
+ if(!anchored)
+ . += "The securing bolts are undone."
+ if(broken_status == RELAY_ADD_CABLE)
+ . += "The cable insulation is torn apart and the wires are frayed beyond use."
+ if(broken_status == RELAY_ADD_METAL)
+ . += "The cable insulation is torn apart and the wiring is exposed."
+
+/obj/machinery/power/deck_relay/attackby(obj/item/I, mob/user, params)
if(default_unfasten_wrench(user, I))
+ if(!anchored && broken_status == RELAY_OK)
+ break_connections()
+ return
return FALSE
+ . = ..()
+ if(istype(I, /obj/item/stack/cable_coil) && broken_status == RELAY_ADD_CABLE)
+ var/obj/item/stack/C = I
+ if(C.use(15))
+ to_chat(user, "You fix the frayed wires inside [src].")
+ icon_state = "cablerelay-broken-cable"
+ broken_status = RELAY_ADD_METAL
+ return
+ else
+ to_chat(user, "You need 15 cables to rewire [src].")
+ return
+ if(istype(I, /obj/item/stack/sheet/metal) && broken_status == RELAY_ADD_METAL)
+ var/obj/item/stack/S = I
+ if(S.use(10))
+ to_chat(user, "You reseal the insulation for [src].")
+ icon_state = "cablerelay"
+ broken_status = RELAY_OK
+ obj_integrity = max_integrity
+ return
+ else
+ to_chat(user, "You need 10 metal to mend [src].")
+ return
. = ..()
-/obj/machinery/power/deck_relay/process()
- if(!anchored)
- icon_state = "cablerelay-off"
- if(above) //Lose connections
- above.below = null
- if(below)
- below.above = null
- return
- refresh() //Sometimes the powernets get lost, so we need to keep checking.
- if(powernet && (powernet.avail <= 0)) // is it powered?
- icon_state = "cablerelay-off"
- else
- icon_state = "cablerelay-on"
- if(!below || QDELETED(below) || !above || QDELETED(above))
- icon_state = "cablerelay-off"
- find_relays()
+/obj/machinery/power/deck_relay/obj_break()
+ ..()
+ if(broken_status == RELAY_OK)
+ break_connections()
+ visible_message("[src]'s insulation breaks, fraying and severing the cable bundle!")
+ playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE)
+ icon_state = "cablerelay-broken"
+ broken_status = RELAY_ADD_CABLE
-///Allows you to scan the relay with a multitool to see stats.
+/obj/machinery/power/deck_relay/obj_destruction()
+ return //this shouldn't break under usual means
+
+/obj/machinery/power/deck_relay/Destroy()
+ break_connections()
+ return ..()
+
+///Lose connections and reset the merged powernet so it makes 2 new seperated ones
+/obj/machinery/power/deck_relay/proc/break_connections()
+ if(above)
+ var/turf/above_deck_relay = get_turf(above)
+ var/obj/structure/cable/above_cable = above_deck_relay.get_cable_node()
+ if(above_cable)
+ var/datum/powernet/above_powernet = new()
+ propagate_network(above_cable, above_powernet)
+ above.below = null
+ above = null
+ if(below)
+ var/turf/below_deck_relay = get_turf(below)
+ var/obj/structure/cable/below_cable = below_deck_relay.get_cable_node()
+ if(below_cable)
+ var/datum/powernet/below_powernet = new()
+ propagate_network(below_cable, below_powernet)
+ below.above = null
+ below = null
+
+///Allows you to scan the relay with a multitool to see stats/reconnect relays
/obj/machinery/power/deck_relay/multitool_act(mob/user, obj/item/I)
- if(powernet && (powernet.avail > 0)) // is it powered?
+ if(!anchored)
+ to_chat(user, "You need to wrench this into place before getting a reading!")
+ return TRUE
+ if(broken_status == RELAY_ADD_CABLE || broken_status == RELAY_ADD_METAL)
+ to_chat(user, "The [src] isn't in proper shape to get a reading!")
+ return TRUE
+ if(powernet && (above || below))//we have a powernet and at least one connected relay
to_chat(user, "Total power: [DisplayPower(powernet.avail)]\nLoad: [DisplayPower(powernet.load)]\nExcess power: [DisplayPower(surplus())]")
- if(!powernet || below.powernet != powernet)
- icon_state = "cablerelay-off"
- to_chat(user, "Powernet connection lost. Attempting to re-establish. Ensure the relays below this one are connected too.")
+ if(!above && !below)
+ to_chat(user, "Cannot access valid powernet. Attempting to re-establish. Ensure any relays above and below are aligned properly and on cable nodes.")
find_relays()
addtimer(CALLBACK(src, .proc/refresh), 20) //Wait a bit so we can find the one below, then get powering
return TRUE
@@ -53,6 +117,7 @@
if(below)
below.merge(src)
+///Merges the two powernets connected to the deck relays
/obj/machinery/power/deck_relay/proc/merge(var/obj/machinery/power/deck_relay/DR)
if(!DR)
return
@@ -69,6 +134,7 @@
if(!T || !istype(T))
return FALSE
below = null //in case we're re-establishing
+ above = null
var/obj/structure/cable/C = T.get_cable_node() //check if we have a node cable on the machine turf, the first found is picked
if(C && C.powernet)
C.powernet.add_machine(src) //Nice we're in.
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 4552bdc9346..d9eb4ac9fb7 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -292,6 +292,7 @@
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
if(G.siemens_coefficient == 0)
+ SEND_SIGNAL(M, COMSIG_LIVING_SHOCK_PREVENTED, power_source, source, siemens_coeff, dist_check)
return 0 //to avoid spamming with insulated glvoes on
var/area/source_area
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index 2a4cd291ed7..7ad94005381 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -218,7 +218,7 @@
// if(defer_powernet_rebuild != 2)
// defer_powernet_rebuild = 1
for(var/atom/X in urange(consume_range,src,1))
- if(isturf(X) || ismovableatom(X))
+ if(isturf(X) || ismovable(X))
consume(X)
// if(defer_powernet_rebuild != 2)
// defer_powernet_rebuild = 0
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 5b75c55f492..8e5985bd3a7 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -26,10 +26,8 @@
/obj/machinery/power/solar/Initialize(mapload, obj/item/solar_assembly/S)
. = ..()
panel = new()
-#if DM_VERSION >= 513
panel.vis_flags = VIS_INHERIT_ID|VIS_INHERIT_ICON|VIS_INHERIT_PLANE
vis_contents += panel
-#endif
panel.icon = icon
panel.icon_state = "solar_panel"
panel.layer = FLY_LAYER
@@ -116,9 +114,6 @@
panel.icon_state = "solar_panel-b"
else
panel.icon_state = "solar_panel"
-#if DM_VERSION <= 512
- . += new /mutable_appearance(panel)
-#endif
/obj/machinery/power/solar/proc/queue_turn(azimuth)
needs_to_turn = TRUE
@@ -213,6 +208,16 @@
anchored = FALSE
var/tracker = 0
var/glass_type = null
+ var/random_offset = 6 //amount in pixels an unanchored assembly may be offset by
+
+/obj/item/solar_assembly/Initialize(mapload)
+ . = ..()
+ if(!anchored && !pixel_x && !pixel_y)
+ randomise_offset(random_offset)
+
+/obj/item/solar_assembly/proc/randomise_offset(amount)
+ pixel_x = rand(-amount,amount)
+ pixel_y = rand(-amount,amount)
// Give back the glass type we were supplied with
/obj/item/solar_assembly/proc/give_glass(device_broken)
@@ -234,9 +239,12 @@
if(anchored)
user.visible_message("[user] wrenches the solar assembly into place.", "You wrench the solar assembly into place.")
W.play_tool_sound(src, 75)
+ pixel_x = 0
+ pixel_y = 0
else
user.visible_message("[user] unwrenches the solar assembly from its place.", "You unwrench the solar assembly from its place.")
W.play_tool_sound(src, 75)
+ randomise_offset(random_offset)
return 1
if(istype(W, /obj/item/stack/sheet/glass) || istype(W, /obj/item/stack/sheet/rglass))
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 3f537e4364e..989bdd03833 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -90,6 +90,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
critical_machine = TRUE
+ //If we ever start to care about all gasses, make this based on type and apply it as a for loop
+ var/list/gas_trans = list("PL" = PLASMA_TRANSMIT_MODIFIER, "O2" = OXYGEN_TRANSMIT_MODIFIER, "TRIT" = TRITIUM_TRANSMIT_MODIFIER, "PLX" = PLUOXIUM_TRANSMIT_MODIFIER, "BZ" = BZ_TRANSMIT_MODIFIER)
var/gasefficency = 0.15
var/base_icon_state = "darkmatter"
@@ -114,15 +116,15 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
var/lastwarning = 0 // Time in 1/10th of seconds since the last sent warning
var/power = 0
+ var/gas_change_rate = 0.05
var/n2comp = 0 // raw composition of each gas in the chamber, ranges from 0 to 1
-
var/plasmacomp = 0
var/o2comp = 0
var/co2comp = 0
- var/pluoxiumcomp = 0
+ var/n2ocomp = 0
var/tritiumcomp = 0
var/bzcomp = 0
- var/n2ocomp = 0
+ var/pluoxiumcomp = 0
var/pluoxiumbonus = 0
@@ -354,7 +356,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
var/datum/gas_mixture/env = T.return_air()
var/datum/gas_mixture/removed
-
if(produces_gas)
//Remove gas from surrounding area
removed = env.remove(gasefficency * env.total_moles())
@@ -400,17 +401,18 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
//This is more error prevention, according to all known laws of atmos, gas_mix.remove() should never make negative mol values.
//But this is tg
- //Lets get the proportions of the gasses in the mix
+ //Lets get the proportions of the gasses in the mix and then slowly move our comp to that value
+ //Can cause an overestimation of mol count, should stabalize things though.
+ //Prevents huge bursts of gas/heat when a large amount of something is introduced
//They range between 0 and 1
- plasmacomp = max(removed.gases[/datum/gas/plasma][MOLES]/combined_gas, 0)
- o2comp = max(removed.gases[/datum/gas/oxygen][MOLES]/combined_gas, 0)
- co2comp = max(removed.gases[/datum/gas/carbon_dioxide][MOLES]/combined_gas, 0)
- pluoxiumcomp = max(removed.gases[/datum/gas/pluoxium][MOLES]/combined_gas, 0)
- tritiumcomp = max(removed.gases[/datum/gas/tritium][MOLES]/combined_gas, 0)
- bzcomp = max(removed.gases[/datum/gas/bz][MOLES]/combined_gas, 0)
-
- n2ocomp = max(removed.gases[/datum/gas/nitrous_oxide][MOLES]/combined_gas, 0)
- n2comp = max(removed.gases[/datum/gas/nitrogen][MOLES]/combined_gas, 0)
+ plasmacomp += CLAMP(max(removed.gases[/datum/gas/plasma][MOLES]/combined_gas, 0) - plasmacomp, -1, gas_change_rate)
+ o2comp += CLAMP(max(removed.gases[/datum/gas/oxygen][MOLES]/combined_gas, 0) - o2comp, -1, gas_change_rate)
+ co2comp += CLAMP(max(removed.gases[/datum/gas/carbon_dioxide][MOLES]/combined_gas, 0) - co2comp, -1, gas_change_rate)
+ pluoxiumcomp += CLAMP(max(removed.gases[/datum/gas/pluoxium][MOLES]/combined_gas, 0) - pluoxiumcomp, -1, gas_change_rate)
+ tritiumcomp += CLAMP(max(removed.gases[/datum/gas/tritium][MOLES]/combined_gas, 0) - tritiumcomp, -1, gas_change_rate)
+ bzcomp += CLAMP(max(removed.gases[/datum/gas/bz][MOLES]/combined_gas, 0) - bzcomp, -1, gas_change_rate)
+ n2ocomp += CLAMP(max(removed.gases[/datum/gas/nitrous_oxide][MOLES]/combined_gas, 0) - n2ocomp, -1, gas_change_rate)
+ n2comp += CLAMP(max(removed.gases[/datum/gas/nitrogen][MOLES]/combined_gas, 0) - n2comp, -1, gas_change_rate)
//We're concerned about pluoxium being too easy to abuse at low percents, so we make sure there's a substantial amount.
if(pluoxiumcomp >= 0.15)
@@ -425,7 +427,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
//Value between 6 and 1
dynamic_heat_resistance = max((n2ocomp * N2O_HEAT_RESISTANCE) + ((pluoxiumcomp * PLUOXIUM_HEAT_RESISTANCE) * pluoxiumbonus), 1)
//Value between 30 and -5, used to determine radiation output as it concerns things like collecters
- power_transmission_bonus = (plasmacomp * PLASMA_TRANSMIT_MODIFIER) + (o2comp * OXYGEN_TRANSMIT_MODIFIER) + (bzcomp * BZ_TRANSMIT_MODIFIER) + (tritiumcomp * TRITIUM_TRANSMIT_MODIFIER) + ((pluoxiumcomp * PLUOXIUM_TRANSMIT_MODIFIER) * pluoxiumbonus)
+ power_transmission_bonus = (plasmacomp * gas_trans["PL"]) + (o2comp * gas_trans["O2"]) + (bzcomp * gas_trans["BZ"]) + (tritiumcomp * gas_trans["TRIT"]) + ((pluoxiumcomp * gas_trans["PLX"]) * pluoxiumbonus)
//more moles of gases are harder to heat than fewer, so let's scale heat damage around them
mole_heat_penalty = max(combined_gas / MOLE_HEAT_PENALTY, 0.25)
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index dab74c0031e..636486ed471 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -85,6 +85,7 @@
var/tac_reloads = TRUE //Snowflake mechanic no more.
///Whether the gun can be sawn off by sawing tools
var/can_be_sawn_off = FALSE
+ var/flip_cooldown = 0
/obj/item/gun/ballistic/Initialize()
. = ..()
@@ -339,6 +340,18 @@
return ..()
/obj/item/gun/ballistic/attack_self(mob/living/user)
+ if(HAS_TRAIT(user, TRAIT_GUNFLIP))
+ if(flip_cooldown <= world.time)
+ if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40))
+ to_chat(user, "While trying to flip the [src] you pull the trigger and accidently shoot yourself!")
+ var/flip_mistake = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_CHEST)
+ process_fire(user, user, FALSE, flip_mistake)
+ user.dropItemToGround(src, TRUE)
+ return
+ flip_cooldown = (world.time + 30)
+ user.visible_message("[user] spins the [src] around their finger by the trigger. That’s pretty badass.")
+ playsound(src, 'sound/items/handling/ammobox_pickup.ogg', 20, FALSE)
+ return
if(!internal_magazine && magazine)
if(!magazine.ammo_count())
eject_magazine(user)
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index 79c8346468b..7b8e2c79dfb 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -1,6 +1,6 @@
/obj/item/gun/magic/wand
name = "wand of nothing"
- desc = "It's not just a stick, it's a MAGIC stick!"
+ desc = "It's not just a stick, it's a MAGIC stick! You shouldn't have this."
ammo_type = /obj/item/ammo_casing/magic
icon_state = "nothingwand"
item_state = "wand"
@@ -233,4 +233,7 @@
/////////////////////////////////////
/obj/item/gun/magic/wand/nothing
+ desc = "It's not just a stick, it's a MAGIC stick?"
ammo_type = /obj/item/ammo_casing/magic/nothing
+
+
diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
index 099d6db4f50..2ca43bca448 100644
--- a/code/modules/projectiles/guns/misc/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -464,7 +464,7 @@
else
target.ex_act(EXPLODE_HEAVY)
return TRUE
- if(ismovableatom(target))
+ if(ismovable(target))
var/atom/movable/AM = target
if(AM.density && !AM.CanPass(src, get_turf(target)) && !ismob(AM))
if(structure_pierce < structure_pierce_amount)
diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm
index d291da83ecd..551e4ebc4f1 100644
--- a/code/modules/projectiles/projectile/bullets/shotgun.dm
+++ b/code/modules/projectiles/projectile/bullets/shotgun.dm
@@ -36,7 +36,7 @@
/obj/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE)
. = ..()
- if(ismovableatom(target))
+ if(ismovable(target))
var/atom/movable/M = target
var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src)))
M.safe_throw_at(throw_target, 3, 2)
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index abe386a511e..1fb04012245 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -31,12 +31,11 @@
var/datum/chemical_reaction/D = new path()
var/list/reaction_ids = list()
- if(!D.id)
+ if(!D.required_reagents || !D.required_reagents.len) //Skip impossible reactions
continue
- if(D.required_reagents && D.required_reagents.len)
- for(var/reaction in D.required_reagents)
- reaction_ids += reaction
+ for(var/reaction in D.required_reagents)
+ reaction_ids += reaction
// Create filters based on each reagent id in the required reagents list
for(var/id in reaction_ids)
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index b2f142a2071..d7b8f3958ec 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -41,6 +41,14 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
var/reagent_weight = 1 //affects how far it travels when sprayed
var/metabolizing = FALSE
var/harmful = FALSE //is it bad for you? Currently only used for borghypo. C2s and Toxins have it TRUE by default.
+ //Are we from a material? We might wanna know that for special stuff. Like metalgen. Is replaced with a ref of the material on New()
+ var/datum/material/material
+
+/datum/reagent/New()
+ . = ..()
+
+ if(material)
+ material = SSmaterials.GetMaterialRef(material)
/datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
. = ..()
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index f473bdfd21b..81d1b463707 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -1115,6 +1115,17 @@ All effects don't start immediately, but rather get worse over time; the rate is
playsound(get_turf(M), 'sound/effects/explosionfar.ogg', 100, TRUE)
return ..()
+/datum/reagent/consumable/ethanol/hiveminderaser
+ name = "Hivemind Eraser"
+ description = "A vessel of pure flavor."
+ color = "#FF80FC" // rgb: 255, 128, 252
+ boozepwr = 40
+ quality = DRINK_GOOD
+ taste_description = "psychic links"
+ glass_icon_state = "hiveminderaser"
+ glass_name = "Hivemind Eraser"
+ glass_desc = "For when even mindshields can't save you."
+
/datum/reagent/consumable/ethanol/erikasurprise
name = "Erika Surprise"
description = "The surprise is, it's green!"
diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
index 3999f3bb892..4980c0f2a77 100644
--- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
@@ -344,7 +344,7 @@
//Has to be at less than TRESHOLD_UNHUSK burn damage and have 100 isntabitaluri before unhusking. Corpses dont metabolize.
if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && Carbies.getFireLoss() < TRESHOLD_UNHUSK && Carbies.reagents.has_reagent(/datum/reagent/medicine/C2/instabitaluri, 100))
Carbies.cure_husk("burn")
- Carbies.visible_message("You successfully replace most of the burnt off flesh of [Carbies].")
+ Carbies.visible_message("With most of the burnt off flesh replaced, [Carbies] looks a lot healthier.")
..()
return TRUE
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index 87c1fe954a0..c04a1d618bd 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -199,7 +199,7 @@
. = 1
/datum/reagent/drug/methamphetamine/overdose_process(mob/living/M)
- if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc))
for(var/i in 1 to 4)
step(M, pick(GLOB.cardinals))
if(prob(20))
@@ -226,7 +226,7 @@
..()
/datum/reagent/drug/methamphetamine/addiction_act_stage3(mob/living/M)
- if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc))
for(var/i = 0, i < 4, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(15)
@@ -236,7 +236,7 @@
..()
/datum/reagent/drug/methamphetamine/addiction_act_stage4(mob/living/carbon/human/M)
- if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc))
for(var/i = 0, i < 8, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(20)
@@ -281,7 +281,7 @@
M.adjustStaminaLoss(-5, 0)
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4)
M.hallucination += 5
- if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc))
step(M, pick(GLOB.cardinals))
step(M, pick(GLOB.cardinals))
..()
@@ -289,7 +289,7 @@
/datum/reagent/drug/bath_salts/overdose_process(mob/living/M)
M.hallucination += 5
- if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc))
for(var/i in 1 to 8)
step(M, pick(GLOB.cardinals))
if(prob(20))
@@ -300,7 +300,7 @@
/datum/reagent/drug/bath_salts/addiction_act_stage1(mob/living/M)
M.hallucination += 10
- if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc))
for(var/i = 0, i < 8, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(5)
@@ -311,7 +311,7 @@
/datum/reagent/drug/bath_salts/addiction_act_stage2(mob/living/M)
M.hallucination += 20
- if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc))
for(var/i = 0, i < 8, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(10)
@@ -323,7 +323,7 @@
/datum/reagent/drug/bath_salts/addiction_act_stage3(mob/living/M)
M.hallucination += 30
- if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc))
for(var/i = 0, i < 12, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(15)
@@ -335,7 +335,7 @@
/datum/reagent/drug/bath_salts/addiction_act_stage4(mob/living/carbon/human/M)
M.hallucination += 30
- if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc))
+ if((M.mobility_flags & MOBILITY_MOVE) && !ismovable(M.loc))
for(var/i = 0, i < 16, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(50)
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index ca70b354c48..d067d2899ec 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -321,12 +321,13 @@
color = "#DCDCDC"
metabolization_rate = 0.25 * REAGENTS_METABOLISM
overdose_threshold = 30
+ var/healing = 0.5
/datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M)
- M.adjustToxLoss(-0.5*REM, 0)
- M.adjustOxyLoss(-0.5*REM, 0)
- M.adjustBruteLoss(-0.5*REM, 0)
- M.adjustFireLoss(-0.5*REM, 0)
+ M.adjustToxLoss(-healing*REM, 0)
+ M.adjustOxyLoss(-healing*REM, 0)
+ M.adjustBruteLoss(-healing*REM, 0)
+ M.adjustFireLoss(-healing*REM, 0)
..()
. = 1
@@ -338,6 +339,12 @@
..()
. = 1
+/datum/reagent/medicine/omnizine/protozine
+ name = "Protozine"
+ description = "A less environmentally friendly and somewhat weaker variant of omnizine."
+ color = "#d8c7b7"
+ healing = 0.2
+
/datum/reagent/medicine/calomel
name = "Calomel"
description = "Quickly purges the body of all chemicals. Toxin damage is dealt if the patient is in good condition."
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 3638ddb4d8c..21d30148e4e 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -252,6 +252,12 @@
qdel(R)
T.Bless()
+/datum/reagent/water/hollowwater
+ name = "Hollow Water"
+ description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen, but it looks kinda hollow."
+ color = "#88878777"
+ taste_description = "emptyiness"
+
/datum/reagent/hydrogen_peroxide
name = "Hydrogen peroxide"
description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen and oxygen." //intended intended
@@ -846,6 +852,7 @@
description = "Pure iron is a metal."
reagent_state = SOLID
taste_description = "iron"
+ material = /datum/material/iron
color = "#606060" //pure iron? let's make it violet of course
@@ -866,6 +873,7 @@
reagent_state = SOLID
color = "#F7C430" // rgb: 247, 196, 48
taste_description = "expensive metal"
+ material = /datum/material/gold
/datum/reagent/silver
name = "Silver"
@@ -873,6 +881,7 @@
reagent_state = SOLID
color = "#D0D0D0" // rgb: 208, 208, 208
taste_description = "expensive yet reasonable metal"
+ material = /datum/material/silver
/datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(M.has_bane(BANE_SILVER))
@@ -886,6 +895,7 @@
color = "#5E9964" //this used to be silver, but liquid uranium can still be green and it's more easily noticeable as uranium like this so why bother?
taste_description = "the inside of a reactor"
var/irradiation_level = 1
+ material = /datum/material/uranium
/datum/reagent/uranium/on_mob_life(mob/living/carbon/M)
M.apply_effect(irradiation_level/M.metabolism_efficiency,EFFECT_IRRADIATE,0)
@@ -914,6 +924,7 @@
reagent_state = SOLID
color = "#0000CC"
taste_description = "fizzling blue"
+ material = /datum/material/bluespace
/datum/reagent/bluespace/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(method == TOUCH || method == VAPOR)
@@ -944,6 +955,7 @@
reagent_state = SOLID
color = "#A8A8A8" // rgb: 168, 168, 168
taste_mult = 0
+ material = /datum/material/glass
/datum/reagent/fuel
name = "Welding fuel"
@@ -2021,6 +2033,67 @@
taste_description = "bananas"
can_synth = TRUE
+/datum/reagent/wittel
+ name = "Wittel"
+ description = "An extremely rare metallic-white substance only found on demon-class planets."
+ color = "#FFFFFF" // rgb: 255, 255, 255
+ taste_mult = 0 // oderless and tasteless
+
+/datum/reagent/metalgen
+ name = "Metalgen"
+ data = list("material"=null)
+ description = "A purple metal morphic liquid, said to impose it's metallic properties on whatever it touches."
+ color = "#b000aa"
+ taste_mult = 0 // oderless and tasteless
+ var/applied_material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR
+ var/minumum_material_amount = 100
+
+/datum/reagent/metalgen/reaction_obj(obj/O, volume)
+ metal_morph(O)
+ return
+
+/datum/reagent/metalgen/reaction_turf(turf/T, volume)
+ metal_morph(T)
+ return
+
+///turn an object into a special material
+/datum/reagent/metalgen/proc/metal_morph(atom/A)
+ var/metal_ref = data["material"]
+ if(!metal_ref)
+ return
+ var/metal_amount = 0
+
+ for(var/B in A.custom_materials) //list with what they're made of
+ metal_amount += A.custom_materials[B]
+
+ if(!metal_amount)
+ metal_amount = minumum_material_amount //some stuff doesn't have materials at all. To still give them properties, we give them a material. Basically doesnt exist
+
+ var/list/metal_dat = list()
+ metal_dat[metal_ref] = metal_amount //if we pass the list directly, byond turns metal_ref into "metal_ref" kjewrg8fwcyvf
+
+ A.material_flags = applied_material_flags
+ A.set_custom_materials(metal_dat)
+
+/datum/reagent/gravitum
+ name = "Gravitum"
+ description = "A rare kind of null fluid, capable of temporalily removing all weight of whatever it touches." //i dont even
+ color = "#050096" // rgb: 5, 0, 150
+ taste_mult = 0 // oderless and tasteless
+ metabolization_rate = 0.1 * REAGENTS_METABOLISM //20 times as long, so it's actually viable to use
+ var/time_multiplier = 1 MINUTES //1 minute per unit of gravitum on objects. Seems overpowered, but the whole thing is very niche
+
+/datum/reagent/gravitum/reaction_obj(obj/O, volume)
+ O.AddElement(/datum/element/forced_gravity, 0)
+
+ addtimer(CALLBACK(O, .proc/_RemoveElement, list(/datum/element/forced_gravity, 0)), volume * time_multiplier)
+
+/datum/reagent/gravitum/on_mob_add(mob/living/L)
+ L.AddElement(/datum/element/forced_gravity, 0) //0 is the gravity, and in this case weightless
+
+/datum/reagent/gravitum/on_mob_end_metabolize(mob/living/L)
+ L.RemoveElement(/datum/element/forced_gravity, 0)
+
/datum/reagent/cellulose
name = "Cellulose Fibers"
description = "A crystaline polydextrose polymer, plants swear by this stuff."
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 80141a3ec73..11a48cb7ee6 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -61,6 +61,7 @@
taste_mult = 1.5
color = "#8228A0"
toxpwr = 3
+ material = /datum/material/plasma
/datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C)
if(holder.has_reagent(/datum/reagent/medicine/epinephrine))
diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm
index 802b1c109ec..7ca683dac98 100644
--- a/code/modules/reagents/chemistry/recipes.dm
+++ b/code/modules/reagents/chemistry/recipes.dm
@@ -1,6 +1,4 @@
/datum/chemical_reaction
- var/name = null
- var/id = null
var/list/results = new/list()
var/list/required_reagents = new/list()
var/list/required_catalysts = new/list()
@@ -24,7 +22,7 @@
if(holder && holder.my_atom)
var/atom/A = holder.my_atom
var/turf/T = get_turf(A)
- var/message = "A [reaction_name] reaction has occurred in [ADMIN_VERBOSEJMP(T)]"
+ var/message = "Mobs have been spawned in [ADMIN_VERBOSEJMP(T)] by a [reaction_name] reaction."
message += " (VV)"
var/mob/M = get(A, /mob)
diff --git a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm
index 7fa667e7797..1b85aa6bb2d 100644
--- a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm
+++ b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm
@@ -3,45 +3,33 @@
/*****BRUTE*****/
/datum/chemical_reaction/helbital
- name = "helbital"
- id = /datum/reagent/medicine/C2/helbital
results = list(/datum/reagent/medicine/C2/helbital = 3)
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fluorine = 1, /datum/reagent/carbon = 1)
mix_message = "The mixture turns into a thick, yellow powder."
/datum/chemical_reaction/libital
- name = "Libital"
- id = /datum/reagent/medicine/C2/libital
results = list(/datum/reagent/medicine/C2/libital = 3)
required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/oxygen = 1, /datum/reagent/nitrogen = 1)
/*****BURN*****/
/datum/chemical_reaction/lenturi
- name = "Lenturi"
- id = /datum/reagent/medicine/C2/lenturi
results = list(/datum/reagent/medicine/C2/lenturi = 5)
required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/silver = 1, /datum/reagent/sulfur = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1)
/datum/chemical_reaction/aiuri
- name = "Aiuri"
- id = /datum/reagent/medicine/C2/aiuri
results = list(/datum/reagent/medicine/C2/aiuri = 4)
required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/hydrogen = 2)
/*****OXY*****/
/datum/chemical_reaction/convermol
- name = "Convermol"
- id = /datum/reagent/medicine/C2/convermol
results = list(/datum/reagent/medicine/C2/convermol = 3)
required_reagents = list(/datum/reagent/hydrogen = 1, /datum/reagent/fluorine = 1, /datum/reagent/fuel/oil = 1)
required_temp = 370
mix_message = "The mixture rapidly turns into a dense pink liquid."
/datum/chemical_reaction/tirimol
- name = "Tirimol"
- id = /datum/reagent/medicine/C2/tirimol
results = list(/datum/reagent/medicine/C2/tirimol = 5)
required_reagents = list(/datum/reagent/nitrogen = 3, /datum/reagent/acetone = 2)
required_catalysts = list(/datum/reagent/toxin/acid = 1)
@@ -49,27 +37,19 @@
/*****TOX*****/
/datum/chemical_reaction/seiver
- name = "Seiver"
- id = /datum/reagent/medicine/C2/seiver
results = list(/datum/reagent/medicine/C2/seiver = 3)
required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/potassium = 1, /datum/reagent/aluminium = 1)
/datum/chemical_reaction/multiver
- name = "Multiver"
- id = /datum/reagent/medicine/C2/multiver
results = list(/datum/reagent/medicine/C2/multiver = 2)
required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/sodiumchloride = 1)
mix_message = "The mixture yields a fine black powder."
required_temp = 380
/datum/chemical_reaction/syriniver
- name = "Syriniver"
- id = /datum/reagent/medicine/C2/syriniver
results = list(/datum/reagent/medicine/C2/syriniver = 5)
required_reagents = list(/datum/reagent/sulfur = 1, /datum/reagent/fluorine = 1, /datum/reagent/toxin = 1, /datum/reagent/nitrous_oxide = 2)
/datum/chemical_reaction/penthrite
- name = "Penthrite"
- id = /datum/reagent/medicine/C2/penthrite
results = list(/datum/reagent/medicine/C2/penthrite = 4)
required_reagents = list(/datum/reagent/pentaerythritol = 4, /datum/reagent/acetone = 1, /datum/reagent/toxin/acid/nitracid = 1)
diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm
index 0b66c232c85..6d3d1f794ff 100644
--- a/code/modules/reagents/chemistry/recipes/drugs.dm
+++ b/code/modules/reagents/chemistry/recipes/drugs.dm
@@ -1,12 +1,8 @@
/datum/chemical_reaction/space_drugs
- name = "Space Drugs"
- id = /datum/reagent/drug/space_drugs
results = list(/datum/reagent/drug/space_drugs = 3)
required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/lithium = 1)
/datum/chemical_reaction/crank
- name = "Crank"
- id = /datum/reagent/drug/crank
results = list(/datum/reagent/drug/crank = 5)
required_reagents = list(/datum/reagent/medicine/diphenhydramine = 1, /datum/reagent/ammonia = 1, /datum/reagent/lithium = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/fuel = 1)
mix_message = "The mixture violently reacts, leaving behind a few crystalline shards."
@@ -14,42 +10,30 @@
/datum/chemical_reaction/krokodil
- name = "Krokodil"
- id = /datum/reagent/drug/krokodil
results = list(/datum/reagent/drug/krokodil = 6)
required_reagents = list(/datum/reagent/medicine/diphenhydramine = 1, /datum/reagent/medicine/morphine = 1, /datum/reagent/space_cleaner = 1, /datum/reagent/potassium = 1, /datum/reagent/phosphorus = 1, /datum/reagent/fuel = 1)
mix_message = "The mixture dries into a pale blue powder."
required_temp = 380
/datum/chemical_reaction/methamphetamine
- name = /datum/reagent/drug/methamphetamine
- id = /datum/reagent/drug/methamphetamine
results = list(/datum/reagent/drug/methamphetamine = 4)
required_reagents = list(/datum/reagent/medicine/ephedrine = 1, /datum/reagent/iodine = 1, /datum/reagent/phosphorus = 1, /datum/reagent/hydrogen = 1)
required_temp = 374
/datum/chemical_reaction/bath_salts
- name = /datum/reagent/drug/bath_salts
- id = /datum/reagent/drug/bath_salts
results = list(/datum/reagent/drug/bath_salts = 7)
required_reagents = list(/datum/reagent/toxin/bad_food = 1, /datum/reagent/saltpetre = 1, /datum/reagent/consumable/nutriment = 1, /datum/reagent/space_cleaner = 1, /datum/reagent/consumable/enzyme = 1, /datum/reagent/consumable/tea = 1, /datum/reagent/mercury = 1)
required_temp = 374
/datum/chemical_reaction/aranesp
- name = /datum/reagent/drug/aranesp
- id = /datum/reagent/drug/aranesp
results = list(/datum/reagent/drug/aranesp = 3)
required_reagents = list(/datum/reagent/medicine/epinephrine = 1, /datum/reagent/medicine/atropine = 1, /datum/reagent/medicine/morphine = 1)
/datum/chemical_reaction/happiness
- name = "Happiness"
- id = /datum/reagent/drug/happiness
results = list(/datum/reagent/drug/happiness = 4)
required_reagents = list(/datum/reagent/nitrous_oxide = 2, /datum/reagent/medicine/epinephrine = 1, /datum/reagent/consumable/ethanol = 1)
required_catalysts = list(/datum/reagent/toxin/plasma = 5)
/datum/chemical_reaction/pumpup
- name = "Pump-Up"
- id = /datum/reagent/drug/pumpup
results = list(/datum/reagent/drug/pumpup = 5)
required_reagents = list(/datum/reagent/medicine/epinephrine = 2, /datum/reagent/consumable/coffee = 5)
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index 095ba220827..c3e0186be74 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -1,242 +1,170 @@
/datum/chemical_reaction/leporazine
- name = "Leporazine"
- id = /datum/reagent/medicine/leporazine
results = list(/datum/reagent/medicine/leporazine = 2)
required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/copper = 1)
required_catalysts = list(/datum/reagent/toxin/plasma = 5)
/datum/chemical_reaction/rezadone
- name = "Rezadone"
- id = /datum/reagent/medicine/rezadone
results = list(/datum/reagent/medicine/rezadone = 3)
required_reagents = list(/datum/reagent/toxin/carpotoxin = 1, /datum/reagent/cryptobiolin = 1, /datum/reagent/copper = 1)
/datum/chemical_reaction/spaceacillin
- name = "Spaceacillin"
- id = /datum/reagent/medicine/spaceacillin
results = list(/datum/reagent/medicine/spaceacillin = 2)
required_reagents = list(/datum/reagent/cryptobiolin = 1, /datum/reagent/medicine/epinephrine = 1)
/datum/chemical_reaction/oculine
- name = "Oculine"
- id = /datum/reagent/medicine/oculine
results = list(/datum/reagent/medicine/oculine = 3)
required_reagents = list(/datum/reagent/medicine/C2/multiver = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1)
mix_message = "The mixture bubbles noticeably and becomes a dark grey color!"
/datum/chemical_reaction/inacusiate
- name = /datum/reagent/medicine/inacusiate
- id = /datum/reagent/medicine/inacusiate
results = list(/datum/reagent/medicine/inacusiate = 2)
required_reagents = list(/datum/reagent/water = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/C2/multiver = 1)
mix_message = "The mixture sputters loudly and becomes a light grey color!"
/datum/chemical_reaction/synaptizine
- name = "Synaptizine"
- id = /datum/reagent/medicine/synaptizine
results = list(/datum/reagent/medicine/synaptizine = 3)
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/lithium = 1, /datum/reagent/water = 1)
/datum/chemical_reaction/salglu_solution
- name = "Saline-Glucose Solution"
- id = /datum/reagent/medicine/salglu_solution
results = list(/datum/reagent/medicine/salglu_solution = 3)
required_reagents = list(/datum/reagent/consumable/sodiumchloride = 1, /datum/reagent/water = 1, /datum/reagent/consumable/sugar = 1)
/datum/chemical_reaction/mine_salve
- name = "Miner's Salve"
- id = /datum/reagent/medicine/mine_salve
results = list(/datum/reagent/medicine/mine_salve = 3)
required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/water = 1, /datum/reagent/iron = 1)
/datum/chemical_reaction/mine_salve2
- name = "Miner's Salve"
- id = /datum/reagent/medicine/mine_salve
results = list(/datum/reagent/medicine/mine_salve = 15)
required_reagents = list(/datum/reagent/toxin/plasma = 5, /datum/reagent/iron = 5, /datum/reagent/consumable/sugar = 1) // A sheet of plasma, a twinkie and a sheet of metal makes four of these
/datum/chemical_reaction/instabitaluri
- name = "Synthflesh (Instabitaluri)"
- id = /datum/reagent/medicine/C2/instabitaluri
results = list(/datum/reagent/medicine/C2/instabitaluri = 3)
required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/C2/libital = 1)
/datum/chemical_reaction/calomel
- name = "Calomel"
- id = /datum/reagent/medicine/calomel
results = list(/datum/reagent/medicine/calomel = 2)
required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/chlorine = 1)
required_temp = 374
/datum/chemical_reaction/potass_iodide
- name = "Potassium Iodide"
- id = /datum/reagent/medicine/potass_iodide
results = list(/datum/reagent/medicine/potass_iodide = 2)
required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/iodine = 1)
/datum/chemical_reaction/pen_acid
- name = "Pentetic Acid"
- id = /datum/reagent/medicine/pen_acid
results = list(/datum/reagent/medicine/pen_acid = 6)
required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/chlorine = 1, /datum/reagent/ammonia = 1, /datum/reagent/toxin/formaldehyde = 1, /datum/reagent/sodium = 1, /datum/reagent/toxin/cyanide = 1)
/datum/chemical_reaction/sal_acid
- name = "Salicylic Acid"
- id = /datum/reagent/medicine/sal_acid
results = list(/datum/reagent/medicine/sal_acid = 5)
required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/phenol = 1, /datum/reagent/carbon = 1, /datum/reagent/oxygen = 1, /datum/reagent/toxin/acid = 1)
/datum/chemical_reaction/oxandrolone
- name = "Oxandrolone"
- id = /datum/reagent/medicine/oxandrolone
results = list(/datum/reagent/medicine/oxandrolone = 6)
required_reagents = list(/datum/reagent/carbon = 3, /datum/reagent/phenol = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1)
/datum/chemical_reaction/salbutamol
- name = "Salbutamol"
- id = /datum/reagent/medicine/salbutamol
results = list(/datum/reagent/medicine/salbutamol = 5)
required_reagents = list(/datum/reagent/medicine/sal_acid = 1, /datum/reagent/lithium = 1, /datum/reagent/aluminium = 1, /datum/reagent/bromine = 1, /datum/reagent/ammonia = 1)
/datum/chemical_reaction/ephedrine
- name = "Ephedrine"
- id = /datum/reagent/medicine/ephedrine
results = list(/datum/reagent/medicine/ephedrine = 4)
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fuel/oil = 1, /datum/reagent/hydrogen = 1, /datum/reagent/diethylamine = 1)
mix_message = "The solution fizzes and gives off toxic fumes."
/datum/chemical_reaction/diphenhydramine
- name = "Diphenhydramine"
- id = /datum/reagent/medicine/diphenhydramine
results = list(/datum/reagent/medicine/diphenhydramine = 4)
required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/carbon = 1, /datum/reagent/bromine = 1, /datum/reagent/diethylamine = 1, /datum/reagent/consumable/ethanol = 1)
mix_message = "The mixture dries into a pale blue powder."
/datum/chemical_reaction/atropine
- name = "Atropine"
- id = /datum/reagent/medicine/atropine
results = list(/datum/reagent/medicine/atropine = 5)
required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/phenol = 1, /datum/reagent/toxin/acid = 1)
/datum/chemical_reaction/epinephrine
- name = "Epinephrine"
- id = /datum/reagent/medicine/epinephrine
results = list(/datum/reagent/medicine/epinephrine = 6)
required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1, /datum/reagent/hydrogen = 1)
/datum/chemical_reaction/strange_reagent
- name = "Strange Reagent"
- id = /datum/reagent/medicine/strange_reagent
results = list(/datum/reagent/medicine/strange_reagent = 3)
required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1)
+/datum/chemical_reaction/strange_reagent/alt
+ results = list(/datum/reagent/medicine/strange_reagent = 2)
+ required_reagents = list(/datum/reagent/medicine/omnizine/protozine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1)
+
/datum/chemical_reaction/mannitol
- name = "Mannitol"
- id = /datum/reagent/medicine/mannitol
results = list(/datum/reagent/medicine/mannitol = 3)
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/hydrogen = 1, /datum/reagent/water = 1)
mix_message = "The solution slightly bubbles, becoming thicker."
/datum/chemical_reaction/neurine
- name = "Neurine"
- id = /datum/reagent/medicine/neurine
results = list(/datum/reagent/medicine/neurine = 3)
required_reagents = list(/datum/reagent/medicine/mannitol = 1, /datum/reagent/acetone = 1, /datum/reagent/oxygen = 1)
/datum/chemical_reaction/mutadone
- name = "Mutadone"
- id = /datum/reagent/medicine/mutadone
results = list(/datum/reagent/medicine/mutadone = 3)
required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/acetone = 1, /datum/reagent/bromine = 1)
/datum/chemical_reaction/antihol
- name = /datum/reagent/medicine/antihol
- id = /datum/reagent/medicine/antihol
results = list(/datum/reagent/medicine/antihol = 3)
required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/medicine/C2/multiver = 1, /datum/reagent/copper = 1)
/datum/chemical_reaction/cryoxadone
- name = "Cryoxadone"
- id = /datum/reagent/medicine/cryoxadone
results = list(/datum/reagent/medicine/cryoxadone = 3)
required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/mutagen = 1)
/datum/chemical_reaction/pyroxadone
- name = "Pyroxadone"
- id = /datum/reagent/medicine/pyroxadone
results = list(/datum/reagent/medicine/pyroxadone = 2)
required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/toxin/slimejelly = 1)
/datum/chemical_reaction/clonexadone
- name = "Clonexadone"
- id = /datum/reagent/medicine/clonexadone
results = list(/datum/reagent/medicine/clonexadone = 2)
required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/sodium = 1)
required_catalysts = list(/datum/reagent/toxin/plasma = 5)
/datum/chemical_reaction/haloperidol
- name = "Haloperidol"
- id = /datum/reagent/medicine/haloperidol
results = list(/datum/reagent/medicine/haloperidol = 5)
required_reagents = list(/datum/reagent/chlorine = 1, /datum/reagent/fluorine = 1, /datum/reagent/aluminium = 1, /datum/reagent/medicine/potass_iodide = 1, /datum/reagent/fuel/oil = 1)
/datum/chemical_reaction/regen_jelly
- name = "Regenerative Jelly"
- id = /datum/reagent/medicine/regen_jelly
results = list(/datum/reagent/medicine/regen_jelly = 2)
required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/toxin/slimejelly = 1)
/datum/chemical_reaction/higadrite
- name = "Higadrite"
- id = /datum/reagent/medicine/higadrite
results = list(/datum/reagent/medicine/higadrite = 3)
required_reagents = list(/datum/reagent/phenol = 2, /datum/reagent/lithium = 1)
/datum/chemical_reaction/morphine
- name = "Morphine"
- id = /datum/reagent/medicine/morphine
results = list(/datum/reagent/medicine/morphine = 2)
required_reagents = list(/datum/reagent/carbon = 2, /datum/reagent/hydrogen = 2, /datum/reagent/consumable/ethanol = 1, /datum/reagent/oxygen = 1)
required_temp = 480
/datum/chemical_reaction/modafinil
- name = "Modafinil"
- id = /datum/reagent/medicine/modafinil
results = list(/datum/reagent/medicine/modafinil = 5)
required_reagents = list(/datum/reagent/diethylamine = 1, /datum/reagent/ammonia = 1, /datum/reagent/phenol = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/acid = 1)
required_catalysts = list(/datum/reagent/bromine = 1) // as close to the real world synthesis as possible
/datum/chemical_reaction/psicodine
- name = "Psicodine"
- id = /datum/reagent/medicine/psicodine
results = list(/datum/reagent/medicine/psicodine = 5)
required_reagents = list( /datum/reagent/medicine/mannitol = 2, /datum/reagent/water = 2, /datum/reagent/impedrezene = 1)
/datum/chemical_reaction/rhigoxane
- name = "Rhigoxane"
- id = /datum/reagent/medicine/rhigoxane
results = list(/datum/reagent/medicine/rhigoxane/ = 5)
required_reagents = list(/datum/reagent/cryostylane = 3, /datum/reagent/bromine = 1, /datum/reagent/lye = 1)
required_temp = 47
is_cold_recipe = TRUE
/datum/chemical_reaction/trophazole
- name = "Trophazole"
- id = /datum/reagent/medicine/trophazole
results = list(/datum/reagent/medicine/trophazole = 4)
required_reagents = list(/datum/reagent/copper = 1, /datum/reagent/acetone = 2, /datum/reagent/phosphorus = 1)
/datum/chemical_reaction/granibitaluri
- name = "Granibitaluri"
- id = /datum/reagent/medicine/granibitaluri
results = list(/datum/reagent/medicine/granibitaluri = 3)
required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/phenol = 1, /datum/reagent/nitrogen = 1)
required_catalysts = list(/datum/reagent/iron = 5)
/datum/chemical_reaction/medsuture
- name = "Medicated Suture"
- id = "med_suture"
required_reagents = list(/datum/reagent/cellulose = 10, /datum/reagent/toxin/formaldehyde = 30, /datum/reagent/medicine/polypyr = 30) //This might be a bit much, reagent cost should be reviewed after implementation.
/datum/chemical_reaction/medsuture/on_reaction(datum/reagents/holder, created_volume)
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index 7270eff2ab7..cb800c6a62f 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -1,55 +1,37 @@
/datum/chemical_reaction/sterilizine
- name = "Sterilizine"
- id = /datum/reagent/space_cleaner/sterilizine
results = list(/datum/reagent/space_cleaner/sterilizine = 3)
required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/medicine/C2/multiver = 1, /datum/reagent/chlorine = 1)
/datum/chemical_reaction/lube
- name = "Space Lube"
- id = /datum/reagent/lube
results = list(/datum/reagent/lube = 4)
required_reagents = list(/datum/reagent/water = 1, /datum/reagent/silicon = 1, /datum/reagent/oxygen = 1)
/datum/chemical_reaction/spraytan
- name = "Spray Tan"
- id = /datum/reagent/spraytan
results = list(/datum/reagent/spraytan = 2)
required_reagents = list(/datum/reagent/consumable/orangejuice = 1, /datum/reagent/fuel/oil = 1)
/datum/chemical_reaction/spraytan2
- name = "Spray Tan"
- id = /datum/reagent/spraytan
results = list(/datum/reagent/spraytan = 2)
required_reagents = list(/datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/cornoil = 1)
/datum/chemical_reaction/impedrezene
- name = "Impedrezene"
- id = /datum/reagent/impedrezene
results = list(/datum/reagent/impedrezene = 2)
required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1)
/datum/chemical_reaction/cryptobiolin
- name = "Cryptobiolin"
- id = /datum/reagent/cryptobiolin
results = list(/datum/reagent/cryptobiolin = 3)
required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1)
/datum/chemical_reaction/glycerol
- name = "Glycerol"
- id = /datum/reagent/glycerol
results = list(/datum/reagent/glycerol = 1)
required_reagents = list(/datum/reagent/consumable/cornoil = 3, /datum/reagent/toxin/acid = 1)
/datum/chemical_reaction/sodiumchloride
- name = "Sodium Chloride"
- id = /datum/reagent/consumable/sodiumchloride
results = list(/datum/reagent/consumable/sodiumchloride = 3)
required_reagents = list(/datum/reagent/water = 1, /datum/reagent/sodium = 1, /datum/reagent/chlorine = 1)
/datum/chemical_reaction/plasmasolidification
- name = "Solid Plasma"
- id = "solidplasma"
required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/consumable/frostoil = 5, /datum/reagent/toxin/plasma = 20)
mob_react = FALSE
@@ -59,8 +41,6 @@
new /obj/item/stack/sheet/mineral/plasma(location)
/datum/chemical_reaction/goldsolidification
- name = "Solid Gold"
- id = "solidgold"
required_reagents = list(/datum/reagent/consumable/frostoil = 5, /datum/reagent/gold = 20, /datum/reagent/iron = 1)
mob_react = FALSE
@@ -70,14 +50,10 @@
new /obj/item/stack/sheet/mineral/gold(location)
/datum/chemical_reaction/capsaicincondensation
- name = "Capsaicincondensation"
- id = "capsaicincondensation"
results = list(/datum/reagent/consumable/condensedcapsaicin = 5)
required_reagents = list(/datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/ethanol = 5)
/datum/chemical_reaction/soapification
- name = "Soapification"
- id = "soapification"
required_reagents = list(/datum/reagent/liquidgibs = 10, /datum/reagent/lye = 10) // requires two scooped gib tiles
required_temp = 374
mob_react = FALSE
@@ -88,8 +64,6 @@
new /obj/item/soap/homemade(location)
/datum/chemical_reaction/omegasoapification
- name = "Omega Soap"
- id = "omegasoap"
required_reagents = list(/datum/reagent/consumable/potato_juice = 10, /datum/reagent/consumable/ethanol/lizardwine = 10, /datum/reagent/monkey_powder = 10, /datum/reagent/drug/krokodil = 10, /datum/reagent/toxin/acid/nitracid = 10, /datum/reagent/baldium = 10, /datum/reagent/consumable/ethanol/hooch = 10, /datum/reagent/bluespace = 10, /datum/reagent/drug/pumpup = 10, /datum/reagent/consumable/space_cola = 10)
required_temp = 999
mob_react = FALSE
@@ -100,8 +74,6 @@
new /obj/item/soap/omega(location)
/datum/chemical_reaction/candlefication
- name = "Candlefication"
- id = "candlefication"
required_reagents = list(/datum/reagent/liquidgibs = 5, /datum/reagent/oxygen = 5) //
required_temp = 374
mob_react = FALSE
@@ -112,8 +84,6 @@
new /obj/item/candle(location)
/datum/chemical_reaction/meatification
- name = "Meatification"
- id = "meatification"
required_reagents = list(/datum/reagent/liquidgibs = 10, /datum/reagent/consumable/nutriment = 10, /datum/reagent/carbon = 10)
mob_react = FALSE
@@ -124,23 +94,17 @@
return
/datum/chemical_reaction/carbondioxide
- name = "Direct Carbon Oxidation"
- id = "burningcarbon"
results = list(/datum/reagent/carbondioxide = 3)
required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/oxygen = 2)
required_temp = 777 // pure carbon isn't especially reactive.
/datum/chemical_reaction/nitrous_oxide
- name = "Nitrous Oxide"
- id = /datum/reagent/nitrous_oxide
results = list(/datum/reagent/nitrous_oxide = 5)
required_reagents = list(/datum/reagent/ammonia = 2, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 2)
required_temp = 525
//Technically a mutation toxin
/datum/chemical_reaction/mulligan
- name = "Mulligan"
- id = /datum/reagent/mulligan
results = list(/datum/reagent/mulligan = 1)
required_reagents = list(/datum/reagent/mutationtoxin/jelly = 1, /datum/reagent/toxin/mutagen = 1)
@@ -148,74 +112,50 @@
////////////////////////////////// VIROLOGY //////////////////////////////////////////
/datum/chemical_reaction/virus_food
- name = "Virus Food"
- id = /datum/reagent/consumable/virus_food
results = list(/datum/reagent/consumable/virus_food = 15)
required_reagents = list(/datum/reagent/water = 5, /datum/reagent/consumable/milk = 5)
/datum/chemical_reaction/virus_food_mutagen
- name = "mutagenic agar"
- id = /datum/reagent/toxin/mutagen/mutagenvirusfood
results = list(/datum/reagent/toxin/mutagen/mutagenvirusfood = 1)
required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/consumable/virus_food = 1)
/datum/chemical_reaction/virus_food_synaptizine
- name = "virus rations"
- id = /datum/reagent/medicine/synaptizine/synaptizinevirusfood
results = list(/datum/reagent/medicine/synaptizine/synaptizinevirusfood = 1)
required_reagents = list(/datum/reagent/medicine/synaptizine = 1, /datum/reagent/consumable/virus_food = 1)
/datum/chemical_reaction/virus_food_plasma
- name = "virus plasma"
- id = /datum/reagent/toxin/plasma/plasmavirusfood
results = list(/datum/reagent/toxin/plasma/plasmavirusfood = 1)
required_reagents = list(/datum/reagent/toxin/plasma = 1, /datum/reagent/consumable/virus_food = 1)
/datum/chemical_reaction/virus_food_plasma_synaptizine
- name = "weakened virus plasma"
- id = /datum/reagent/toxin/plasma/plasmavirusfood/weak
results = list(/datum/reagent/toxin/plasma/plasmavirusfood/weak = 2)
required_reagents = list(/datum/reagent/medicine/synaptizine = 1, /datum/reagent/toxin/plasma/plasmavirusfood = 1)
/datum/chemical_reaction/virus_food_mutagen_sugar
- name = "sucrose agar"
- id = /datum/reagent/toxin/mutagen/mutagenvirusfood/sugar
results = list(/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar = 2)
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/toxin/mutagen/mutagenvirusfood = 1)
/datum/chemical_reaction/virus_food_mutagen_salineglucose
- name = "sucrose agar"
- id = "salineglucosevirusfood"
results = list(/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar = 2)
required_reagents = list(/datum/reagent/medicine/salglu_solution = 1, /datum/reagent/toxin/mutagen/mutagenvirusfood = 1)
/datum/chemical_reaction/virus_food_uranium
- name = "Decaying uranium gel"
- id = /datum/reagent/uranium/uraniumvirusfood
results = list(/datum/reagent/uranium/uraniumvirusfood = 1)
required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/consumable/virus_food = 1)
/datum/chemical_reaction/virus_food_uranium_plasma
- name = "Unstable uranium gel"
- id = "uraniumvirusfood_plasma"
results = list(/datum/reagent/uranium/uraniumvirusfood/unstable = 1)
required_reagents = list(/datum/reagent/uranium = 5, /datum/reagent/toxin/plasma/plasmavirusfood = 1)
/datum/chemical_reaction/virus_food_uranium_plasma_gold
- name = "Stable uranium gel"
- id = "uraniumvirusfood_gold"
results = list(/datum/reagent/uranium/uraniumvirusfood/stable = 1)
required_reagents = list(/datum/reagent/uranium = 10, /datum/reagent/gold = 10, /datum/reagent/toxin/plasma = 1)
/datum/chemical_reaction/virus_food_uranium_plasma_silver
- name = "Stable uranium gel"
- id = "uraniumvirusfood_silver"
results = list(/datum/reagent/uranium/uraniumvirusfood/stable = 1)
required_reagents = list(/datum/reagent/uranium = 10, /datum/reagent/silver = 10, /datum/reagent/toxin/plasma = 1)
/datum/chemical_reaction/mix_virus
- name = "Mix Virus"
- id = "mixvirus"
results = list(/datum/reagent/blood = 1)
required_reagents = list(/datum/reagent/consumable/virus_food = 1)
required_catalysts = list(/datum/reagent/blood = 1)
@@ -223,7 +163,6 @@
var/level_max = 2
/datum/chemical_reaction/mix_virus/on_reaction(datum/reagents/holder, created_volume)
-
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
if(B && B.data)
var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
@@ -232,102 +171,65 @@
/datum/chemical_reaction/mix_virus/mix_virus_2
-
- name = "Mix Virus 2"
- id = "mixvirus2"
required_reagents = list(/datum/reagent/toxin/mutagen = 1)
level_min = 2
level_max = 4
/datum/chemical_reaction/mix_virus/mix_virus_3
-
- name = "Mix Virus 3"
- id = "mixvirus3"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
level_min = 4
level_max = 6
/datum/chemical_reaction/mix_virus/mix_virus_4
-
- name = "Mix Virus 4"
- id = "mixvirus4"
required_reagents = list(/datum/reagent/uranium = 1)
level_min = 5
level_max = 6
/datum/chemical_reaction/mix_virus/mix_virus_5
-
- name = "Mix Virus 5"
- id = "mixvirus5"
required_reagents = list(/datum/reagent/toxin/mutagen/mutagenvirusfood = 1)
level_min = 3
level_max = 3
/datum/chemical_reaction/mix_virus/mix_virus_6
-
- name = "Mix Virus 6"
- id = "mixvirus6"
required_reagents = list(/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar = 1)
level_min = 4
level_max = 4
/datum/chemical_reaction/mix_virus/mix_virus_7
-
- name = "Mix Virus 7"
- id = "mixvirus7"
required_reagents = list(/datum/reagent/toxin/plasma/plasmavirusfood/weak = 1)
level_min = 5
level_max = 5
/datum/chemical_reaction/mix_virus/mix_virus_8
-
- name = "Mix Virus 8"
- id = "mixvirus8"
required_reagents = list(/datum/reagent/toxin/plasma/plasmavirusfood = 1)
level_min = 6
level_max = 6
/datum/chemical_reaction/mix_virus/mix_virus_9
-
- name = "Mix Virus 9"
- id = "mixvirus9"
required_reagents = list(/datum/reagent/medicine/synaptizine/synaptizinevirusfood = 1)
level_min = 1
level_max = 1
/datum/chemical_reaction/mix_virus/mix_virus_10
-
- name = "Mix Virus 10"
- id = "mixvirus10"
required_reagents = list(/datum/reagent/uranium/uraniumvirusfood = 1)
level_min = 6
level_max = 7
/datum/chemical_reaction/mix_virus/mix_virus_11
-
- name = "Mix Virus 11"
- id = "mixvirus11"
required_reagents = list(/datum/reagent/uranium/uraniumvirusfood/unstable = 1)
level_min = 7
level_max = 7
/datum/chemical_reaction/mix_virus/mix_virus_12
-
- name = "Mix Virus 12"
- id = "mixvirus12"
required_reagents = list(/datum/reagent/uranium/uraniumvirusfood/stable = 1)
level_min = 8
level_max = 8
/datum/chemical_reaction/mix_virus/rem_virus
-
- name = "Devolve Virus"
- id = "remvirus"
required_reagents = list(/datum/reagent/medicine/synaptizine = 1)
required_catalysts = list(/datum/reagent/blood = 1)
/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(datum/reagents/holder, created_volume)
-
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
if(B && B.data)
var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
@@ -335,13 +237,10 @@
D.Devolve()
/datum/chemical_reaction/mix_virus/neuter_virus
- name = "Neuter Virus"
- id = "neutervirus"
required_reagents = list(/datum/reagent/toxin/formaldehyde = 1)
required_catalysts = list(/datum/reagent/blood = 1)
/datum/chemical_reaction/mix_virus/neuter_virus/on_reaction(datum/reagents/holder, created_volume)
-
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
if(B && B.data)
var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
@@ -354,14 +253,10 @@
/datum/chemical_reaction/surfactant
- name = "Foam surfactant"
- id = "foam surfactant"
results = list(/datum/reagent/fluorosurfactant = 5)
required_reagents = list(/datum/reagent/fluorine = 2, /datum/reagent/carbon = 2, /datum/reagent/toxin/acid = 1)
/datum/chemical_reaction/foam
- name = "Foam"
- id = "foam"
required_reagents = list(/datum/reagent/fluorosurfactant = 1, /datum/reagent/water = 1)
mob_react = FALSE
@@ -369,8 +264,6 @@
holder.create_foam(/datum/effect_system/foam_spread,2*created_volume,notification="The solution spews out foam!")
/datum/chemical_reaction/metalfoam
- name = "Metal Foam"
- id = "metalfoam"
required_reagents = list(/datum/reagent/aluminium = 3, /datum/reagent/foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1)
mob_react = FALSE
@@ -378,8 +271,6 @@
holder.create_foam(/datum/effect_system/foam_spread/metal,5*created_volume,1,"The solution spews out a metallic foam!")
/datum/chemical_reaction/smart_foam
- name = "Smart Metal Foam"
- id = "smart_metal_foam"
required_reagents = list(/datum/reagent/aluminium = 3, /datum/reagent/smart_foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1)
mob_react = TRUE
@@ -387,8 +278,6 @@
holder.create_foam(/datum/effect_system/foam_spread/metal/smart,5*created_volume,1,"The solution spews out metallic foam!")
/datum/chemical_reaction/ironfoam
- name = "Iron Foam"
- id = "ironlfoam"
required_reagents = list(/datum/reagent/iron = 3, /datum/reagent/foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1)
mob_react = FALSE
@@ -396,14 +285,10 @@
holder.create_foam(/datum/effect_system/foam_spread/metal,5*created_volume,2,"The solution spews out a metallic foam!")
/datum/chemical_reaction/foaming_agent
- name = "Foaming Agent"
- id = /datum/reagent/foaming_agent
results = list(/datum/reagent/foaming_agent = 1)
required_reagents = list(/datum/reagent/lithium = 1, /datum/reagent/hydrogen = 1)
/datum/chemical_reaction/smart_foaming_agent
- name = "Smart foaming Agent"
- id = /datum/reagent/smart_foaming_agent
results = list(/datum/reagent/smart_foaming_agent = 3)
required_reagents = list(/datum/reagent/foaming_agent = 3, /datum/reagent/acetone = 1, /datum/reagent/iron = 1)
mix_message = "The solution mixes into a frothy metal foam and conforms to the walls of its container."
@@ -412,147 +297,101 @@
/////////////////////////////// Cleaning and hydroponics /////////////////////////////////////////////////
/datum/chemical_reaction/ammonia
- name = "Ammonia"
- id = /datum/reagent/ammonia
results = list(/datum/reagent/ammonia = 3)
required_reagents = list(/datum/reagent/hydrogen = 3, /datum/reagent/nitrogen = 1)
/datum/chemical_reaction/diethylamine
- name = "Diethylamine"
- id = /datum/reagent/diethylamine
results = list(/datum/reagent/diethylamine = 2)
required_reagents = list (/datum/reagent/ammonia = 1, /datum/reagent/consumable/ethanol = 1)
/datum/chemical_reaction/space_cleaner
- name = "Space cleaner"
- id = /datum/reagent/space_cleaner
results = list(/datum/reagent/space_cleaner = 2)
required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/water = 1)
/datum/chemical_reaction/plantbgone
- name = "Plant-B-Gone"
- id = /datum/reagent/toxin/plantbgone
results = list(/datum/reagent/toxin/plantbgone = 5)
required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/water = 4)
/datum/chemical_reaction/weedkiller
- name = "Weed Killer"
- id = /datum/reagent/toxin/plantbgone/weedkiller
results = list(/datum/reagent/toxin/plantbgone/weedkiller = 5)
required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/ammonia = 4)
/datum/chemical_reaction/pestkiller
- name = "Pest Killer"
- id = /datum/reagent/toxin/pestkiller
results = list(/datum/reagent/toxin/pestkiller = 5)
required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/consumable/ethanol = 4)
/datum/chemical_reaction/drying_agent
- name = "Drying agent"
- id = /datum/reagent/drying_agent
results = list(/datum/reagent/drying_agent = 3)
required_reagents = list(/datum/reagent/stable_plasma = 2, /datum/reagent/consumable/ethanol = 1, /datum/reagent/sodium = 1)
//////////////////////////////////// Other goon stuff ///////////////////////////////////////////
/datum/chemical_reaction/acetone
- name = /datum/reagent/acetone
- id = /datum/reagent/acetone
results = list(/datum/reagent/acetone = 3)
required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/fuel = 1, /datum/reagent/oxygen = 1)
/datum/chemical_reaction/carpet
- name = /datum/reagent/carpet
- id = /datum/reagent/carpet
results = list(/datum/reagent/carpet = 2)
required_reagents = list(/datum/reagent/drug/space_drugs = 1, /datum/reagent/blood = 1)
/datum/chemical_reaction/carpet/black
- name = /datum/reagent/carpet/black
- id = /datum/reagent/carpet/black
results = list(/datum/reagent/carpet/black = 2)
required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/fuel/oil = 1)
/datum/chemical_reaction/carpet/blue
- name = /datum/reagent/carpet/blue
- id = /datum/reagent/carpet/blue
results = list(/datum/reagent/carpet/blue = 2)
required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/cryostylane = 1)
/datum/chemical_reaction/carpet/cyan
- name = /datum/reagent/carpet/cyan
- id = /datum/reagent/carpet/cyan
results = list(/datum/reagent/carpet/cyan = 2)
required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/toxin/cyanide = 1)
//cyan = cyanide get it huehueuhuehuehheuhe
/datum/chemical_reaction/carpet/green
- name = /datum/reagent/carpet/green
- id = /datum/reagent/carpet/green
results = list(/datum/reagent/carpet/green = 2)
required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/ethanol/beer/green = 1)
//make green beer by grinding up green crayons and mixing with beer
/datum/chemical_reaction/carpet/orange
- name = /datum/reagent/carpet/orange
- id = /datum/reagent/carpet/orange
results = list(/datum/reagent/carpet/orange = 2)
required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/orangejuice = 1)
/datum/chemical_reaction/carpet/purple
- name = /datum/reagent/carpet/purple
- id = /datum/reagent/carpet/purple
results = list(/datum/reagent/carpet/purple = 2)
required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/medicine/regen_jelly = 1)
//slimes only party
/datum/chemical_reaction/carpet/red
- name = /datum/reagent/carpet/red
- id = /datum/reagent/carpet/red
results = list(/datum/reagent/carpet/red = 2)
required_reagents = list(/datum/reagent/carpet/ = 1, /datum/reagent/liquidgibs = 1)
/datum/chemical_reaction/carpet/royalblack
- name = /datum/reagent/carpet/royal/black
- id = /datum/reagent/carpet/royal/black
results = list(/datum/reagent/carpet/royal/black = 2)
required_reagents = list(/datum/reagent/carpet/black = 1, /datum/reagent/royal_bee_jelly = 1)
/datum/chemical_reaction/carpet/royalblue
- name = /datum/reagent/carpet/royal/blue
- id = /datum/reagent/carpet/royal/blue
results = list(/datum/reagent/carpet/royal/blue = 2)
required_reagents = list(/datum/reagent/carpet/blue = 1, /datum/reagent/royal_bee_jelly = 1)
/datum/chemical_reaction/oil
- name = "Oil"
- id = /datum/reagent/fuel/oil
results = list(/datum/reagent/fuel/oil = 3)
required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1)
/datum/chemical_reaction/phenol
- name = /datum/reagent/phenol
- id = /datum/reagent/phenol
results = list(/datum/reagent/phenol = 3)
required_reagents = list(/datum/reagent/water = 1, /datum/reagent/chlorine = 1, /datum/reagent/fuel/oil = 1)
/datum/chemical_reaction/ash
- name = "Ash"
- id = /datum/reagent/ash
results = list(/datum/reagent/ash = 1)
required_reagents = list(/datum/reagent/fuel/oil = 1)
required_temp = 480
/datum/chemical_reaction/colorful_reagent
- name = /datum/reagent/colorful_reagent
- id = /datum/reagent/colorful_reagent
results = list(/datum/reagent/colorful_reagent = 5)
required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1, /datum/reagent/medicine/cryoxadone = 1, /datum/reagent/consumable/triple_citrus = 1)
/datum/chemical_reaction/life
- name = "Life"
- id = "life"
required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/C2/instabitaluri = 1, /datum/reagent/blood = 1)
required_temp = 374
@@ -560,8 +399,6 @@
chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (hostile)") //defaults to HOSTILE_SPAWN
/datum/chemical_reaction/life_friendly
- name = "Life (Friendly)"
- id = "life_friendly"
required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/C2/instabitaluri = 1, /datum/reagent/consumable/sugar = 1)
required_temp = 374
@@ -569,8 +406,6 @@
chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (friendly)", FRIENDLY_SPAWN)
/datum/chemical_reaction/corgium
- name = "corgium"
- id = "corgium"
required_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/blood = 1)
required_temp = 374
@@ -582,14 +417,10 @@
//monkey powder heehoo
/datum/chemical_reaction/monkey_powder
- name = /datum/reagent/monkey_powder
- id = /datum/reagent/monkey_powder
results = list(/datum/reagent/monkey_powder = 3)
required_reagents = list(/datum/reagent/consumable/banana = 1, /datum/reagent/consumable/nutriment=2,/datum/reagent/liquidgibs = 1)
/datum/chemical_reaction/monkey
- name = "monkey"
- id = "monkey"
required_reagents = list(/datum/reagent/monkey_powder = 30, /datum/reagent/water = 1)
/datum/chemical_reaction/monkey/on_reaction(datum/reagents/holder, created_volume)
@@ -597,16 +428,13 @@
new /mob/living/carbon/monkey(location)
//water electrolysis
/datum/chemical_reaction/electrolysis
- name = "electrolysis"
- id = "electrolysis"
results = list(/datum/reagent/oxygen = 10, /datum/reagent/hydrogen = 20)
required_reagents = list(/datum/reagent/consumable/liquidelectricity = 1, /datum/reagent/water = 5)
//butterflium
/datum/chemical_reaction/butterflium
- name = "butterflium"
- id = "butterflium"
required_reagents = list(/datum/reagent/colorful_reagent = 1, /datum/reagent/medicine/omnizine = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/consumable/nutriment = 1)
+
/datum/chemical_reaction/butterflium/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = rand(1, created_volume), i <= created_volume, i++)
@@ -614,8 +442,6 @@
..()
//scream powder
/datum/chemical_reaction/scream
- name = "scream"
- id = "scream"
required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/consumable/cream = 5, /datum/reagent/consumable/ethanol/lizardwine = 5 )
required_temp = 374
@@ -623,63 +449,43 @@
playsound(holder.my_atom, pick(list( 'sound/voice/human/malescream_1.ogg', 'sound/voice/human/malescream_2.ogg', 'sound/voice/human/malescream_3.ogg', 'sound/voice/human/malescream_4.ogg', 'sound/voice/human/malescream_5.ogg', 'sound/voice/human/malescream_6.ogg', 'sound/voice/human/femalescream_1.ogg', 'sound/voice/human/femalescream_2.ogg', 'sound/voice/human/femalescream_3.ogg', 'sound/voice/human/femalescream_4.ogg', 'sound/voice/human/femalescream_5.ogg', 'sound/voice/human/wilhelm_scream.ogg')), created_volume*5,TRUE)
/datum/chemical_reaction/hair_dye
- name = /datum/reagent/hair_dye
- id = /datum/reagent/hair_dye
results = list(/datum/reagent/hair_dye = 5)
required_reagents = list(/datum/reagent/colorful_reagent = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1)
/datum/chemical_reaction/barbers_aid
- name = /datum/reagent/barbers_aid
- id = /datum/reagent/barbers_aid
results = list(/datum/reagent/barbers_aid = 5)
required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1)
/datum/chemical_reaction/concentrated_barbers_aid
- name = /datum/reagent/concentrated_barbers_aid
- id = /datum/reagent/concentrated_barbers_aid
results = list(/datum/reagent/concentrated_barbers_aid = 2)
required_reagents = list(/datum/reagent/barbers_aid = 1, /datum/reagent/toxin/mutagen = 1)
/datum/chemical_reaction/baldium
- name = /datum/reagent/baldium
- id = /datum/reagent/baldium
results = list(/datum/reagent/baldium = 1)
required_reagents = list(/datum/reagent/uranium/radium = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/lye = 1)
required_temp = 395
/datum/chemical_reaction/saltpetre
- name = /datum/reagent/saltpetre
- id = /datum/reagent/saltpetre
results = list(/datum/reagent/saltpetre = 3)
required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 3)
/datum/chemical_reaction/lye
- name = /datum/reagent/lye
- id = /datum/reagent/lye
results = list(/datum/reagent/lye = 3)
required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1)
/datum/chemical_reaction/lye2
- name = /datum/reagent/lye
- id = /datum/reagent/lye
results = list(/datum/reagent/lye = 2)
required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/water = 1, /datum/reagent/carbon = 1)
/datum/chemical_reaction/royal_bee_jelly
- name = "royal bee jelly"
- id = /datum/reagent/royal_bee_jelly
results = list(/datum/reagent/royal_bee_jelly = 5)
required_reagents = list(/datum/reagent/toxin/mutagen = 10, /datum/reagent/consumable/honey = 40)
/datum/chemical_reaction/laughter
- name = /datum/reagent/consumable/laughter
- id = /datum/reagent/consumable/laughter
results = list(/datum/reagent/consumable/laughter = 10) // Fuck it. I'm not touching this one.
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/banana = 1)
/datum/chemical_reaction/plastic_polymers
- name = "plastic polymers"
- id = /datum/reagent/plastic_polymers
required_reagents = list(/datum/reagent/fuel/oil = 5, /datum/reagent/toxin/acid = 2, /datum/reagent/ash = 3)
required_temp = 374 //lazily consistent with soap & other crafted objects generically created with heat.
@@ -689,30 +495,22 @@
new /obj/item/stack/sheet/plastic(location)
/datum/chemical_reaction/pax
- name = /datum/reagent/pax
- id = /datum/reagent/pax
results = list(/datum/reagent/pax = 3)
required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/medicine/synaptizine = 1, /datum/reagent/water = 1)
/datum/chemical_reaction/yuck
- name = "Organic Fluid"
- id = /datum/reagent/yuck
results = list(/datum/reagent/yuck = 4)
required_reagents = list(/datum/reagent/fuel = 3)
required_container = /obj/item/reagent_containers/food/snacks/deadmouse
/datum/chemical_reaction/slimejelly
- name = "artificial slime jelly"
- id = /datum/reagent/toxin/slimejelly
results = list(/datum/reagent/toxin/slimejelly = 5)
required_reagents = list(/datum/reagent/fuel/oil = 3, /datum/reagent/uranium/radium = 2, /datum/reagent/consumable/tinlux =1)
required_container = /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom
mix_message = "The mushroom's insides bubble and pop and it becomes very limp."
/datum/chemical_reaction/slime_extractification
- name = "slime extractification"
- id = "slime extractification"
required_reagents = list(/datum/reagent/toxin/slimejelly = 30, /datum/reagent/consumable/frostoil = 5, /datum/reagent/toxin/plasma = 5)
mix_message = "The mixture condenses into a ball."
@@ -720,35 +518,48 @@
var/location = get_turf(holder.my_atom)
new /obj/item/slime_extract/grey(location)
+/datum/chemical_reaction/metalgen
+ required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/bluespace = 1, /datum/reagent/toxin/mutagen = 1)
+ results = list(/datum/reagent/metalgen = 1)
+
+/datum/chemical_reaction/metalgen_imprint
+ required_reagents = list(/datum/reagent/metalgen = 1, /datum/reagent/liquid_dark_matter = 1)
+ results = list(/datum/reagent/metalgen = 1)
+
+/datum/chemical_reaction/metalgen_imprint/on_reaction(datum/reagents/holder, created_volume)
+ var/datum/reagent/metalgen/MM = holder.get_reagent(/datum/reagent/metalgen)
+ for(var/datum/reagent/R in holder.reagent_list)
+ if(R.material && R.volume >= 40)
+ MM.data["material"] = R.material
+ holder.remove_reagent(R.type, 40)
+
+/datum/chemical_reaction/gravitum
+ required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/sorium = 10)
+ results = list(/datum/reagent/gravitum = 10)
+
/datum/chemical_reaction/cellulose_carbonization
- name = "Cellulose_Carbonization"
- id = /datum/reagent/carbon
results = list(/datum/reagent/carbon = 1)
required_reagents = list(/datum/reagent/cellulose = 1)
required_temp = 512
/datum/chemical_reaction/hydrogen_peroxide
- name = "Hydrogen peroxide"
- id = /datum/reagent/hydrogen_peroxide
results = list(/datum/reagent/hydrogen_peroxide = 3)
required_reagents = list(/datum/reagent/water = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1)
/datum/chemical_reaction/acetone_oxide
- name = "Acetone peroxide"
- id = /datum/reagent/acetone_oxide
results = list(/datum/reagent/acetone_oxide = 2)
required_reagents = list(/datum/reagent/acetone = 2, /datum/reagent/oxygen = 1, /datum/reagent/hydrogen_peroxide = 1)
/datum/chemical_reaction/pentaerythritol
- name = "Pentaerythritol"
- id = /datum/reagent/pentaerythritol
results = list(/datum/reagent/pentaerythritol = 2)
required_reagents = list(/datum/reagent/acetaldehyde = 1, /datum/reagent/toxin/formaldehyde = 3, /datum/reagent/water = 1 )
/datum/chemical_reaction/acetaldehyde
- name = "Acetaldehyde"
- id = /datum/reagent/acetaldehyde
results = list(/datum/reagent/acetaldehyde = 3)
required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/toxin/formaldehyde = 1, /datum/reagent/water = 1)
required_temp = 450
+/datum/chemical_reaction/holywater
+ results = list(/datum/reagent/water/holywater = 1)
+ required_reagents = list(/datum/reagent/water/hollowwater = 1)
+ required_catalysts = list(/datum/reagent/water/holywater = 1)
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 121ab55ee48..a69dbc86866 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -1,6 +1,4 @@
/datum/chemical_reaction/reagent_explosion
- name = "Generic explosive"
- id = "reagent_explosion"
var/strengthdiv = 10
var/modifier = 0
@@ -27,8 +25,6 @@
/datum/chemical_reaction/reagent_explosion/nitroglycerin
- name = "Nitroglycerin"
- id = /datum/reagent/nitroglycerin
results = list(/datum/reagent/nitroglycerin = 2)
required_reagents = list(/datum/reagent/glycerol = 1, /datum/reagent/toxin/acid/nitracid = 1, /datum/reagent/toxin/acid = 1)
strengthdiv = 2
@@ -40,15 +36,11 @@
..()
/datum/chemical_reaction/reagent_explosion/nitroglycerin_explosion
- name = "Nitroglycerin explosion"
- id = "nitroglycerin_explosion"
required_reagents = list(/datum/reagent/nitroglycerin = 1)
required_temp = 474
strengthdiv = 2
/datum/chemical_reaction/reagent_explosion/rdx
- name = "RDX"
- id = /datum/reagent/rdx
results = list(/datum/reagent/rdx= 2)
required_reagents = list(/datum/reagent/phenol = 2, /datum/reagent/toxin/acid/nitracid = 1, /datum/reagent/acetone_oxide = 1 )
required_temp = 404
@@ -61,15 +53,11 @@
..()
/datum/chemical_reaction/reagent_explosion/rdx_explosion
- name = "Heat RDX explosion"
- id = "rdx_explosion"
required_reagents = list(/datum/reagent/rdx = 1)
required_temp = 474
strengthdiv = 8
/datum/chemical_reaction/reagent_explosion/rdx_explosion2 //makes rdx unique , on its own it is a good bomb, but when combined with liquid electricity it becomes truly destructive
- name = "Electric RDX explosion"
- id = "rdx_explosion2"
required_reagents = list(/datum/reagent/rdx = 1 , /datum/reagent/consumable/liquidelectricity = 1)
strengthdiv = 4
modifier = 2
@@ -83,8 +71,6 @@
..()
/datum/chemical_reaction/reagent_explosion/rdx_explosion3
- name = "Teslium RDX explosion"
- id = "rdx_explosion3"
required_reagents = list(/datum/reagent/rdx = 1 , /datum/reagent/teslium = 1)
modifier = 4
strengthdiv = 4
@@ -98,8 +84,6 @@
..()
/datum/chemical_reaction/reagent_explosion/tatp
- name = "TaTP"
- id = /datum/reagent/tatp
results = list(/datum/reagent/tatp= 1)
required_reagents = list(/datum/reagent/acetone_oxide = 1, /datum/reagent/toxin/acid/nitracid = 1, /datum/reagent/pentaerythritol = 1 )
required_temp = 450
@@ -119,8 +103,6 @@
..()
/datum/chemical_reaction/reagent_explosion/tatp_explosion
- name = "TaTP explosion"
- id = "tatp_explosion"
required_reagents = list(/datum/reagent/tatp = 1)
required_temp = 550 // this makes making tatp before pyro nades, and extreme pain in the ass to make
strengthdiv = 3
@@ -134,21 +116,15 @@
/datum/chemical_reaction/reagent_explosion/penthrite_explosion
- name = "Penthrite explosion"
- id = "penthrite_explosion"
required_reagents = list(/datum/reagent/medicine/C2/penthrite = 1, /datum/reagent/phenol = 1, /datum/reagent/acetone_oxide = 1)
required_temp = 315
strengthdiv = 5
/datum/chemical_reaction/reagent_explosion/potassium_explosion
- name = "Explosion"
- id = "potassium_explosion"
required_reagents = list(/datum/reagent/water = 1, /datum/reagent/potassium = 1)
strengthdiv = 20
/datum/chemical_reaction/reagent_explosion/potassium_explosion/holyboom
- name = "Holy Explosion"
- id = "holyboom"
required_reagents = list(/datum/reagent/water/holywater = 1, /datum/reagent/potassium = 1)
/datum/chemical_reaction/reagent_explosion/potassium_explosion/holyboom/on_reaction(datum/reagents/holder, created_volume)
@@ -176,14 +152,10 @@
/datum/chemical_reaction/gunpowder
- name = "Gunpowder"
- id = /datum/reagent/gunpowder
results = list(/datum/reagent/gunpowder = 3)
required_reagents = list(/datum/reagent/saltpetre = 1, /datum/reagent/medicine/C2/multiver = 1, /datum/reagent/sulfur = 1)
/datum/chemical_reaction/reagent_explosion/gunpowder_explosion
- name = "Gunpowder Kaboom"
- id = "gunpowder_explosion"
required_reagents = list(/datum/reagent/gunpowder = 1)
required_temp = 474
strengthdiv = 6
@@ -195,14 +167,10 @@
..()
/datum/chemical_reaction/thermite
- name = "Thermite"
- id = /datum/reagent/thermite
results = list(/datum/reagent/thermite = 3)
required_reagents = list(/datum/reagent/aluminium = 1, /datum/reagent/iron = 1, /datum/reagent/oxygen = 1)
/datum/chemical_reaction/emp_pulse
- name = "EMP Pulse"
- id = "emp_pulse"
required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/iron = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense
/datum/chemical_reaction/emp_pulse/on_reaction(datum/reagents/holder, created_volume)
@@ -214,8 +182,6 @@
/datum/chemical_reaction/beesplosion
- name = "Bee Explosion"
- id = "beesplosion"
required_reagents = list(/datum/reagent/consumable/honey = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/uranium/radium = 1)
/datum/chemical_reaction/beesplosion/on_reaction(datum/reagents/holder, created_volume)
@@ -237,14 +203,10 @@
/datum/chemical_reaction/stabilizing_agent
- name = /datum/reagent/stabilizing_agent
- id = /datum/reagent/stabilizing_agent
results = list(/datum/reagent/stabilizing_agent = 3)
required_reagents = list(/datum/reagent/iron = 1, /datum/reagent/oxygen = 1, /datum/reagent/hydrogen = 1)
/datum/chemical_reaction/clf3
- name = "Chlorine Trifluoride"
- id = /datum/reagent/clf3
results = list(/datum/reagent/clf3 = 4)
required_reagents = list(/datum/reagent/chlorine = 1, /datum/reagent/fluorine = 3)
required_temp = 424
@@ -256,8 +218,6 @@
holder.chem_temp = 1000 // hot as shit
/datum/chemical_reaction/reagent_explosion/methsplosion
- name = "Meth explosion"
- id = "methboom1"
required_temp = 380 //slightly above the meth mix time.
required_reagents = list(/datum/reagent/drug/methamphetamine = 1)
strengthdiv = 6
@@ -272,13 +232,10 @@
..()
/datum/chemical_reaction/reagent_explosion/methsplosion/methboom2
- id = "methboom2"
required_reagents = list(/datum/reagent/diethylamine = 1, /datum/reagent/iodine = 1, /datum/reagent/phosphorus = 1, /datum/reagent/hydrogen = 1) //diethylamine is often left over from mixing the ephedrine.
required_temp = 300 //room temperature, chilling it even a little will prevent the explosion
/datum/chemical_reaction/sorium
- name = "Sorium"
- id = /datum/reagent/sorium
results = list(/datum/reagent/sorium = 4)
required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/oxygen = 1, /datum/reagent/nitrogen = 1, /datum/reagent/carbon = 1)
@@ -291,8 +248,6 @@
goonchem_vortex(T, 1, range)
/datum/chemical_reaction/sorium_vortex
- name = "sorium_vortex"
- id = "sorium_vortex"
required_reagents = list(/datum/reagent/sorium = 1)
required_temp = 474
@@ -302,8 +257,6 @@
goonchem_vortex(T, 1, range)
/datum/chemical_reaction/liquid_dark_matter
- name = "Liquid Dark Matter"
- id = /datum/reagent/liquid_dark_matter
results = list(/datum/reagent/liquid_dark_matter = 3)
required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/carbon = 1)
@@ -316,8 +269,6 @@
goonchem_vortex(T, 0, range)
/datum/chemical_reaction/ldm_vortex
- name = "LDM Vortex"
- id = "ldm_vortex"
required_reagents = list(/datum/reagent/liquid_dark_matter = 1)
required_temp = 474
@@ -327,8 +278,6 @@
goonchem_vortex(T, 0, range)
/datum/chemical_reaction/flash_powder
- name = "Flash powder"
- id = /datum/reagent/flash_powder
results = list(/datum/reagent/flash_powder = 3)
required_reagents = list(/datum/reagent/aluminium = 1, /datum/reagent/potassium = 1, /datum/reagent/sulfur = 1 )
@@ -350,8 +299,6 @@
holder.remove_reagent(/datum/reagent/flash_powder, created_volume*3)
/datum/chemical_reaction/flash_powder_flash
- name = "Flash powder activation"
- id = "flash_powder_flash"
required_reagents = list(/datum/reagent/flash_powder = 1)
required_temp = 374
@@ -370,8 +317,6 @@
C.Stun(100)
/datum/chemical_reaction/smoke_powder
- name = /datum/reagent/smoke_powder
- id = /datum/reagent/smoke_powder
results = list(/datum/reagent/smoke_powder = 3)
required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/phosphorus = 1)
@@ -391,8 +336,6 @@
holder.clear_reagents()
/datum/chemical_reaction/smoke_powder_smoke
- name = "smoke_powder_smoke"
- id = "smoke_powder_smoke"
required_reagents = list(/datum/reagent/smoke_powder = 1)
required_temp = 374
mob_react = FALSE
@@ -410,8 +353,6 @@
holder.clear_reagents()
/datum/chemical_reaction/sonic_powder
- name = /datum/reagent/sonic_powder
- id = /datum/reagent/sonic_powder
results = list(/datum/reagent/sonic_powder = 3)
required_reagents = list(/datum/reagent/oxygen = 1, /datum/reagent/consumable/space_cola = 1, /datum/reagent/phosphorus = 1)
@@ -425,8 +366,6 @@
C.soundbang_act(1, 100, rand(0, 5))
/datum/chemical_reaction/sonic_powder_deafen
- name = "sonic_powder_deafen"
- id = "sonic_powder_deafen"
required_reagents = list(/datum/reagent/sonic_powder = 1)
required_temp = 374
@@ -437,8 +376,6 @@
C.soundbang_act(1, 100, rand(0, 5))
/datum/chemical_reaction/phlogiston
- name = /datum/reagent/phlogiston
- id = /datum/reagent/phlogiston
results = list(/datum/reagent/phlogiston = 3)
required_reagents = list(/datum/reagent/phosphorus = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/stable_plasma = 1)
@@ -452,14 +389,10 @@
return
/datum/chemical_reaction/napalm
- name = "Napalm"
- id = /datum/reagent/napalm
results = list(/datum/reagent/napalm = 3)
required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/fuel = 1, /datum/reagent/consumable/ethanol = 1 )
/datum/chemical_reaction/cryostylane
- name = /datum/reagent/cryostylane
- id = /datum/reagent/cryostylane
results = list(/datum/reagent/cryostylane = 3)
required_reagents = list(/datum/reagent/water = 1, /datum/reagent/stable_plasma = 1, /datum/reagent/nitrogen = 1)
@@ -468,8 +401,6 @@
return
/datum/chemical_reaction/cryostylane_oxygen
- name = "ephemeral cryostylane reaction"
- id = "cryostylane_oxygen"
results = list(/datum/reagent/cryostylane = 1)
required_reagents = list(/datum/reagent/cryostylane = 1, /datum/reagent/oxygen = 1)
mob_react = FALSE
@@ -478,8 +409,6 @@
holder.chem_temp = max(holder.chem_temp - 10*created_volume,0)
/datum/chemical_reaction/pyrosium_oxygen
- name = "ephemeral pyrosium reaction"
- id = "pyrosium_oxygen"
results = list(/datum/reagent/pyrosium = 1)
required_reagents = list(/datum/reagent/pyrosium = 1, /datum/reagent/oxygen = 1)
mob_react = FALSE
@@ -488,8 +417,6 @@
holder.chem_temp += 10*created_volume
/datum/chemical_reaction/pyrosium
- name = /datum/reagent/pyrosium
- id = /datum/reagent/pyrosium
results = list(/datum/reagent/pyrosium = 3)
required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/phosphorus = 1)
@@ -498,23 +425,17 @@
return
/datum/chemical_reaction/teslium
- name = "Teslium"
- id = /datum/reagent/teslium
results = list(/datum/reagent/teslium = 3)
required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/silver = 1, /datum/reagent/gunpowder = 1)
mix_message = "A jet of sparks flies from the mixture as it merges into a flickering slurry."
required_temp = 400
/datum/chemical_reaction/energized_jelly
- name = "Energized Jelly"
- id = /datum/reagent/teslium/energized_jelly
results = list(/datum/reagent/teslium/energized_jelly = 2)
required_reagents = list(/datum/reagent/toxin/slimejelly = 1, /datum/reagent/teslium = 1)
mix_message = "The slime jelly starts glowing intermittently."
/datum/chemical_reaction/reagent_explosion/teslium_lightning
- name = "Teslium Destabilization"
- id = "teslium_lightning"
required_reagents = list(/datum/reagent/teslium = 1, /datum/reagent/water = 1)
strengthdiv = 100
modifier = -100
@@ -541,21 +462,16 @@
..()
/datum/chemical_reaction/reagent_explosion/teslium_lightning/heat
- id = "teslium_lightning2"
required_temp = 474
required_reagents = list(/datum/reagent/teslium = 1)
/datum/chemical_reaction/reagent_explosion/nitrous_oxide
- name = "N2O explosion"
- id = "n2o_explosion"
required_reagents = list(/datum/reagent/nitrous_oxide = 1)
strengthdiv = 7
required_temp = 575
modifier = 1
/datum/chemical_reaction/firefighting_foam
- name = "Firefighting Foam"
- id = /datum/reagent/firefighting_foam
results = list(/datum/reagent/firefighting_foam = 3)
required_reagents = list(/datum/reagent/stabilizing_agent = 1,/datum/reagent/fluorosurfactant = 1,/datum/reagent/carbon = 1)
required_temp = 200
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index 153130b5ea5..afe035e42d4 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -14,8 +14,6 @@
//Grey
/datum/chemical_reaction/slime/slimespawn
- name = "Slime Spawn"
- id = "m_spawn"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/grey
required_other = TRUE
@@ -26,16 +24,12 @@
..()
/datum/chemical_reaction/slime/slimeinaprov
- name = "Slime epinephrine"
- id = "m_inaprov"
results = list(/datum/reagent/medicine/epinephrine = 3)
required_reagents = list(/datum/reagent/water = 5)
required_other = TRUE
required_container = /obj/item/slime_extract/grey
/datum/chemical_reaction/slime/slimemonkey
- name = "Slime Monkey"
- id = "m_monkey"
required_reagents = list(/datum/reagent/blood = 1)
required_container = /obj/item/slime_extract/grey
required_other = TRUE
@@ -47,24 +41,18 @@
//Green
/datum/chemical_reaction/slime/slimemutate
- name = "Mutation Toxin"
- id = "slimetoxin"
results = list(/datum/reagent/mutationtoxin/jelly = 1)
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_other = TRUE
required_container = /obj/item/slime_extract/green
/datum/chemical_reaction/slime/slimehuman
- name = "Human Mutation Toxin"
- id = "humanmuttoxin"
results = list(/datum/reagent/mutationtoxin = 1)
required_reagents = list(/datum/reagent/blood = 1)
required_other = TRUE
required_container = /obj/item/slime_extract/green
/datum/chemical_reaction/slime/slimelizard
- name = "Lizard Mutation Toxin"
- id = "lizardmuttoxin"
results = list(/datum/reagent/mutationtoxin/lizard = 1)
required_reagents = list(/datum/reagent/uranium/radium = 1)
required_other = TRUE
@@ -72,8 +60,6 @@
//Metal
/datum/chemical_reaction/slime/slimemetal
- name = "Slime Metal"
- id = "m_metal"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/metal
required_other = TRUE
@@ -85,8 +71,6 @@
..()
/datum/chemical_reaction/slime/slimeglass
- name = "Slime Glass"
- id = "m_glass"
required_reagents = list(/datum/reagent/water = 1)
required_container = /obj/item/slime_extract/metal
required_other = TRUE
@@ -99,8 +83,6 @@
//Gold
/datum/chemical_reaction/slime/slimemobspawn
- name = "Slime Crit"
- id = "m_tele"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/gold
required_other = TRUE
@@ -119,8 +101,6 @@
addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 5, "Gold Slime", HOSTILE_SPAWN), 50)
/datum/chemical_reaction/slime/slimemobspawn/lesser
- name = "Slime Crit Lesser"
- id = "m_tele3"
required_reagents = list(/datum/reagent/blood = 1)
/datum/chemical_reaction/slime/slimemobspawn/lesser/summon_mobs(datum/reagents/holder, turf/T)
@@ -128,8 +108,6 @@
addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 3, "Lesser Gold Slime", HOSTILE_SPAWN, "neutral"), 50)
/datum/chemical_reaction/slime/slimemobspawn/friendly
- name = "Slime Crit Friendly"
- id = "m_tele5"
required_reagents = list(/datum/reagent/water = 1)
/datum/chemical_reaction/slime/slimemobspawn/friendly/summon_mobs(datum/reagents/holder, turf/T)
@@ -137,8 +115,6 @@
addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 1, "Friendly Gold Slime", FRIENDLY_SPAWN, "neutral"), 50)
/datum/chemical_reaction/slime/slimemobspawn/spider
- name = "Slime Crit Traitor Spider"
- id = "m_tele6"
required_reagents = list(/datum/reagent/spider_extract = 1)
/datum/chemical_reaction/slime/slimemobspawn/spider/summon_mobs(datum/reagents/holder, turf/T)
@@ -148,8 +124,6 @@
//Silver
/datum/chemical_reaction/slime/slimebork
- name = "Slime Bork"
- id = "m_tele2"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/silver
required_other = TRUE
@@ -180,8 +154,6 @@
return get_random_food()
/datum/chemical_reaction/slime/slimebork/drinks
- name = "Slime Bork 2"
- id = "m_tele4"
required_reagents = list(/datum/reagent/water = 1)
/datum/chemical_reaction/slime/slimebork/drinks/getbork()
@@ -189,16 +161,12 @@
//Blue
/datum/chemical_reaction/slime/slimefrost
- name = "Slime Frost Oil"
- id = "m_frostoil"
results = list(/datum/reagent/consumable/frostoil = 10)
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/blue
required_other = TRUE
/datum/chemical_reaction/slime/slimestabilizer
- name = "Slime Stabilizer"
- id = "m_slimestabilizer"
required_reagents = list(/datum/reagent/blood = 1)
required_container = /obj/item/slime_extract/blue
required_other = TRUE
@@ -208,8 +176,6 @@
..()
/datum/chemical_reaction/slime/slimefoam
- name = "Slime Foam"
- id = "m_foam"
required_reagents = list(/datum/reagent/water = 5)
required_container = /obj/item/slime_extract/blue
required_other = TRUE
@@ -219,8 +185,6 @@
//Dark Blue
/datum/chemical_reaction/slime/slimefreeze
- name = "Slime Freeze"
- id = "m_freeze"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/darkblue
required_other = TRUE
@@ -243,8 +207,6 @@
T.atmos_spawn_air("[initial(gastype.id)]=50;TEMP=2.7")
/datum/chemical_reaction/slime/slimefireproof
- name = "Slime Fireproof"
- id = "m_fireproof"
required_reagents = list(/datum/reagent/water = 1)
required_container = /obj/item/slime_extract/darkblue
required_other = TRUE
@@ -255,16 +217,12 @@
//Orange
/datum/chemical_reaction/slime/slimecasp
- name = "Slime Capsaicin Oil"
- id = "m_capsaicinoil"
results = list(/datum/reagent/consumable/capsaicin = 10)
required_reagents = list(/datum/reagent/blood = 1)
required_container = /obj/item/slime_extract/orange
required_other = TRUE
/datum/chemical_reaction/slime/slimefire
- name = "Slime fire"
- id = "m_fire"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/orange
required_other = TRUE
@@ -287,8 +245,6 @@
/datum/chemical_reaction/slime/slimesmoke
- name = "Slime Smoke"
- id = "m_smoke"
results = list(/datum/reagent/phosphorus = 10, /datum/reagent/potassium = 10, /datum/reagent/consumable/sugar = 10)
required_reagents = list(/datum/reagent/water = 5)
required_container = /obj/item/slime_extract/orange
@@ -296,8 +252,6 @@
//Yellow
/datum/chemical_reaction/slime/slimeoverload
- name = "Slime EMP"
- id = "m_emp"
required_reagents = list(/datum/reagent/blood = 1)
required_container = /obj/item/slime_extract/yellow
required_other = TRUE
@@ -307,8 +261,6 @@
..()
/datum/chemical_reaction/slime/slimecell
- name = "Slime Powercell"
- id = "m_cell"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/yellow
required_other = TRUE
@@ -318,8 +270,6 @@
..()
/datum/chemical_reaction/slime/slimeglow
- name = "Slime Glow"
- id = "m_glow"
required_reagents = list(/datum/reagent/water = 1)
required_container = /obj/item/slime_extract/yellow
required_other = TRUE
@@ -332,8 +282,6 @@
//Purple
/datum/chemical_reaction/slime/slimepsteroid
- name = "Slime Steroid"
- id = "m_steroid"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/purple
required_other = TRUE
@@ -343,8 +291,6 @@
..()
/datum/chemical_reaction/slime/slimeregen
- name = "Slime Regen"
- id = "m_regen"
results = list(/datum/reagent/medicine/regen_jelly = 5)
required_reagents = list(/datum/reagent/blood = 1)
required_container = /obj/item/slime_extract/purple
@@ -352,8 +298,6 @@
//Dark Purple
/datum/chemical_reaction/slime/slimeplasma
- name = "Slime Plasma"
- id = "m_plasma"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/darkpurple
required_other = TRUE
@@ -364,8 +308,6 @@
//Red
/datum/chemical_reaction/slime/slimemutator
- name = "Slime Mutator"
- id = "m_slimemutator"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/red
required_other = TRUE
@@ -375,8 +317,6 @@
..()
/datum/chemical_reaction/slime/slimebloodlust
- name = "Bloodlust"
- id = "m_bloodlust"
required_reagents = list(/datum/reagent/blood = 1)
required_container = /obj/item/slime_extract/red
required_other = TRUE
@@ -393,8 +333,6 @@
..()
/datum/chemical_reaction/slime/slimespeed
- name = "Slime Speed"
- id = "m_speed"
required_reagents = list(/datum/reagent/water = 1)
required_container = /obj/item/slime_extract/red
required_other = TRUE
@@ -405,8 +343,6 @@
//Pink
/datum/chemical_reaction/slime/docility
- name = "Docility Potion"
- id = "m_potion"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/pink
required_other = TRUE
@@ -416,8 +352,6 @@
..()
/datum/chemical_reaction/slime/gender
- name = "Gender Potion"
- id = "m_gender"
required_reagents = list(/datum/reagent/blood = 1)
required_container = /obj/item/slime_extract/pink
required_other = TRUE
@@ -428,8 +362,6 @@
//Black
/datum/chemical_reaction/slime/slimemutate2
- name = "Advanced Mutation Toxin"
- id = "mutationtoxin2"
results = list(/datum/reagent/aslimetoxin = 1)
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_other = TRUE
@@ -437,8 +369,6 @@
//Oil
/datum/chemical_reaction/slime/slimeexplosion
- name = "Slime Explosion"
- id = "m_explosion"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/oil
required_other = TRUE
@@ -466,8 +396,6 @@
/datum/chemical_reaction/slime/slimecornoil
- name = "Slime Corn Oil"
- id = "m_cornoil"
results = list(/datum/reagent/consumable/cornoil = 10)
required_reagents = list(/datum/reagent/blood = 1)
required_container = /obj/item/slime_extract/oil
@@ -475,8 +403,6 @@
//Light Pink
/datum/chemical_reaction/slime/slimepotion2
- name = "Slime Potion 2"
- id = "m_potion2"
required_container = /obj/item/slime_extract/lightpink
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_other = TRUE
@@ -486,8 +412,6 @@
..()
/datum/chemical_reaction/slime/renaming
- name = "Renaming Potion"
- id = "m_renaming_potion"
required_container = /obj/item/slime_extract/lightpink
required_reagents = list(/datum/reagent/water = 1)
required_other = TRUE
@@ -499,8 +423,6 @@
//Adamantine
/datum/chemical_reaction/slime/adamantine
- name = "Adamantine"
- id = "adamantine"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/adamantine
required_other = TRUE
@@ -511,8 +433,6 @@
//Bluespace
/datum/chemical_reaction/slime/slimefloor2
- name = "Bluespace Floor"
- id = "m_floor2"
required_reagents = list(/datum/reagent/blood = 1)
required_container = /obj/item/slime_extract/bluespace
required_other = TRUE
@@ -523,8 +443,6 @@
/datum/chemical_reaction/slime/slimecrystal
- name = "Slime Crystal"
- id = "m_crystal"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/bluespace
required_other = TRUE
@@ -535,8 +453,6 @@
..()
/datum/chemical_reaction/slime/slimeradio
- name = "Slime Radio"
- id = "m_radio"
required_reagents = list(/datum/reagent/water = 1)
required_container = /obj/item/slime_extract/bluespace
required_other = TRUE
@@ -547,8 +463,6 @@
//Cerulean
/datum/chemical_reaction/slime/slimepsteroid2
- name = "Slime Steroid 2"
- id = "m_steroid2"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/cerulean
required_other = TRUE
@@ -558,8 +472,6 @@
..()
/datum/chemical_reaction/slime/slime_territory
- name = "Slime Territory"
- id = "s_territory"
required_reagents = list(/datum/reagent/blood = 1)
required_container = /obj/item/slime_extract/cerulean
required_other = TRUE
@@ -570,8 +482,6 @@
//Sepia
/datum/chemical_reaction/slime/slimestop
- name = "Slime Stop"
- id = "m_stop"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/sepia
required_other = TRUE
@@ -590,8 +500,6 @@
..()
/datum/chemical_reaction/slime/slimecamera
- name = "Slime Camera"
- id = "m_camera"
required_reagents = list(/datum/reagent/water = 1)
required_container = /obj/item/slime_extract/sepia
required_other = TRUE
@@ -602,8 +510,6 @@
..()
/datum/chemical_reaction/slime/slimefloor
- name = "Sepia Floor"
- id = "m_floor"
required_reagents = list(/datum/reagent/blood = 1)
required_container = /obj/item/slime_extract/sepia
required_other = TRUE
@@ -614,8 +520,6 @@
//Pyrite
/datum/chemical_reaction/slime/slimepaint
- name = "Slime Paint"
- id = "s_paint"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_container = /obj/item/slime_extract/pyrite
required_other = TRUE
@@ -626,8 +530,6 @@
..()
/datum/chemical_reaction/slime/slimecrayon
- name = "Slime Crayon"
- id = "s_crayon"
required_reagents = list(/datum/reagent/blood = 1)
required_container = /obj/item/slime_extract/pyrite
required_other = TRUE
@@ -639,8 +541,6 @@
//Rainbow :o)
/datum/chemical_reaction/slime/slimeRNG
- name = "Random Core"
- id = "slimerng"
required_reagents = list(/datum/reagent/toxin/plasma = 1)
required_other = TRUE
required_container = /obj/item/slime_extract/rainbow
@@ -658,8 +558,6 @@
..()
/datum/chemical_reaction/slime/slimebomb
- name = "Clusterblorble"
- id = "slimebomb"
required_reagents = list(/datum/reagent/toxin/slimejelly = 1)
required_other = TRUE
required_container = /obj/item/slime_extract/rainbow
@@ -681,8 +579,6 @@
..()
/datum/chemical_reaction/slime/slime_transfer
- name = "Transfer Potion"
- id = "slimetransfer"
required_reagents = list(/datum/reagent/blood = 1)
required_other = TRUE
required_container = /obj/item/slime_extract/rainbow
@@ -692,8 +588,6 @@
..()
/datum/chemical_reaction/slime/flight_potion
- name = "Flight Potion"
- id = /datum/reagent/flightpotion
required_reagents = list(/datum/reagent/water/holywater = 5, /datum/reagent/uranium = 5)
required_other = TRUE
required_container = /obj/item/slime_extract/rainbow
diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm
index 891d75962d4..2549257946e 100644
--- a/code/modules/reagents/chemistry/recipes/special.dm
+++ b/code/modules/reagents/chemistry/recipes/special.dm
@@ -24,7 +24,6 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related
#define RNGCHEM_OUTPUT "output"
/datum/chemical_reaction/randomized
- name = "semi randomized reaction"
var/persistent = FALSE
var/persistence_period = 7 //Will reset every x days
@@ -147,8 +146,6 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related
return TRUE
/datum/chemical_reaction/randomized/secret_sauce
- name = "secret sauce creation"
- id = "secretsauce"
persistent = TRUE
persistence_period = 7 //Reset every week
randomize_container = TRUE
diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm
index 2e64c5b4166..2f42ed6f4c0 100644
--- a/code/modules/reagents/chemistry/recipes/toxins.dm
+++ b/code/modules/reagents/chemistry/recipes/toxins.dm
@@ -1,128 +1,88 @@
/datum/chemical_reaction/formaldehyde
- name = /datum/reagent/toxin/formaldehyde
- id = "Formaldehyde"
results = list(/datum/reagent/toxin/formaldehyde = 3)
required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/oxygen = 1, /datum/reagent/silver = 1)
required_temp = 420
/datum/chemical_reaction/fentanyl
- name = /datum/reagent/toxin/fentanyl
- id = /datum/reagent/toxin/fentanyl
results = list(/datum/reagent/toxin/fentanyl = 1)
required_reagents = list(/datum/reagent/drug/space_drugs = 1)
required_temp = 674
/datum/chemical_reaction/cyanide
- name = "Cyanide"
- id = /datum/reagent/toxin/cyanide
results = list(/datum/reagent/toxin/cyanide = 3)
required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/ammonia = 1, /datum/reagent/oxygen = 1)
required_temp = 380
/datum/chemical_reaction/itching_powder
- name = "Itching Powder"
- id = /datum/reagent/toxin/itching_powder
results = list(/datum/reagent/toxin/itching_powder = 3)
required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/ammonia = 1, /datum/reagent/medicine/C2/multiver = 1)
/datum/chemical_reaction/facid
- name = "Fluorosulfuric acid"
- id = /datum/reagent/toxin/acid/fluacid
results = list(/datum/reagent/toxin/acid/fluacid = 4)
required_reagents = list(/datum/reagent/toxin/acid = 1, /datum/reagent/fluorine = 1, /datum/reagent/hydrogen = 1, /datum/reagent/potassium = 1)
required_temp = 380
/datum/chemical_reaction/nitracid
- name = "Nitric Acid"
- id = /datum/reagent/toxin/acid/nitracid
results = list(/datum/reagent/toxin/acid/nitracid = 2)
required_reagents = list(/datum/reagent/toxin/acid/fluacid = 1, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 1)
required_temp = 380
/datum/chemical_reaction/sulfonal
- name = /datum/reagent/toxin/sulfonal
- id = /datum/reagent/toxin/sulfonal
results = list(/datum/reagent/toxin/sulfonal = 3)
required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/sulfur = 1)
/datum/chemical_reaction/lipolicide
- name = /datum/reagent/toxin/lipolicide
- id = /datum/reagent/toxin/lipolicide
results = list(/datum/reagent/toxin/lipolicide = 3)
required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/diethylamine = 1, /datum/reagent/medicine/ephedrine = 1)
/datum/chemical_reaction/mutagen
- name = "Unstable mutagen"
- id = /datum/reagent/toxin/mutagen
results = list(/datum/reagent/toxin/mutagen = 3)
required_reagents = list(/datum/reagent/uranium/radium = 1, /datum/reagent/phosphorus = 1, /datum/reagent/chlorine = 1)
/datum/chemical_reaction/lexorin
- name = "Lexorin"
- id = /datum/reagent/toxin/lexorin
results = list(/datum/reagent/toxin/lexorin = 3)
required_reagents = list(/datum/reagent/toxin/plasma = 1, /datum/reagent/hydrogen = 1, /datum/reagent/medicine/salbutamol = 1)
/datum/chemical_reaction/chloralhydrate
- name = "Chloral Hydrate"
- id = /datum/reagent/toxin/chloralhydrate
results = list(/datum/reagent/toxin/chloralhydrate = 1)
required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/chlorine = 3, /datum/reagent/water = 1)
/datum/chemical_reaction/mutetoxin //i'll just fit this in here snugly between other unfun chemicals :v
- name = "Mute Toxin"
- id = /datum/reagent/toxin/mutetoxin
results = list(/datum/reagent/toxin/mutetoxin = 2)
required_reagents = list(/datum/reagent/uranium = 2, /datum/reagent/water = 1, /datum/reagent/carbon = 1)
/datum/chemical_reaction/zombiepowder
- name = "Zombie Powder"
- id = /datum/reagent/toxin/zombiepowder
results = list(/datum/reagent/toxin/zombiepowder = 2)
required_reagents = list(/datum/reagent/toxin/carpotoxin = 5, /datum/reagent/medicine/morphine = 5, /datum/reagent/copper = 5)
/datum/chemical_reaction/ghoulpowder
- name = "Ghoul Powder"
- id = /datum/reagent/toxin/ghoulpowder
results = list(/datum/reagent/toxin/ghoulpowder = 2)
required_reagents = list(/datum/reagent/toxin/zombiepowder = 1, /datum/reagent/medicine/epinephrine = 1)
/datum/chemical_reaction/mindbreaker
- name = "Mindbreaker Toxin"
- id = /datum/reagent/toxin/mindbreaker
results = list(/datum/reagent/toxin/mindbreaker = 5)
required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/hydrogen = 1, /datum/reagent/medicine/C2/multiver = 1)
/datum/chemical_reaction/heparin
- name = "Heparin"
- id = "Heparin"
results = list(/datum/reagent/toxin/heparin = 4)
required_reagents = list(/datum/reagent/toxin/formaldehyde = 1, /datum/reagent/sodium = 1, /datum/reagent/chlorine = 1, /datum/reagent/lithium = 1)
mix_message = "The mixture thins and loses all color."
/datum/chemical_reaction/rotatium
- name = "Rotatium"
- id = "Rotatium"
results = list(/datum/reagent/toxin/rotatium = 3)
required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/teslium = 1, /datum/reagent/toxin/fentanyl = 1)
mix_message = "After sparks, fire, and the smell of mindbreaker, the mix is constantly spinning with no stop in sight."
/datum/chemical_reaction/anacea
- name = "Anacea"
- id = /datum/reagent/toxin/anacea
results = list(/datum/reagent/toxin/anacea = 3)
required_reagents = list(/datum/reagent/medicine/haloperidol = 1, /datum/reagent/impedrezene = 1, /datum/reagent/uranium/radium = 1)
/datum/chemical_reaction/mimesbane
- name = "Mime's Bane"
- id = /datum/reagent/toxin/mimesbane
results = list(/datum/reagent/toxin/mimesbane = 3)
required_reagents = list(/datum/reagent/uranium/radium = 1, /datum/reagent/toxin/mutetoxin = 1, /datum/reagent/consumable/nothing = 1)
/datum/chemical_reaction/bonehurtingjuice
- name = "Bone Hurting Juice"
- id = /datum/reagent/toxin/bonehurtingjuice
results = list(/datum/reagent/toxin/bonehurtingjuice = 5)
required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/toxin/itching_powder = 3, /datum/reagent/consumable/milk = 1)
mix_message = "The mixture suddenly becomes clear and looks a lot like water. You feel a strong urge to drink it."
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index d8573ee7030..7560cd0eba8 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -82,7 +82,7 @@
return ..()
/obj/structure/bigDelivery/relay_container_resist(mob/living/user, obj/O)
- if(ismovableatom(loc))
+ if(ismovable(loc))
var/atom/movable/AM = loc //can't unwrap the wrapped container if it's inside something.
AM.relay_container_resist(user, O)
return
diff --git a/code/modules/research/bepis.dm b/code/modules/research/bepis.dm
index 6e0b22e0118..dcf9be28e91 100644
--- a/code/modules/research/bepis.dm
+++ b/code/modules/research/bepis.dm
@@ -36,7 +36,8 @@
var/minor_rewards = list(/obj/item/stack/circuit_stack/full, //To add a new minor reward, add it here.
/obj/item/airlock_painter/decal,
/obj/item/pen/survival,
- /obj/item/circuitboard/machine/sleeper/party)
+ /obj/item/circuitboard/machine/sleeper/party,
+ /obj/item/toy/sprayoncan)
var/static/list/item_list = list()
/obj/machinery/rnd/bepis/attackby(obj/item/O, mob/user, params)
diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm
index 9e8f5dd2078..b5ad324b110 100644
--- a/code/modules/research/designs/biogenerator_designs.dm
+++ b/code/modules/research/designs/biogenerator_designs.dm
@@ -10,6 +10,14 @@
make_reagents = list(/datum/reagent/consumable/milk = 10)
category = list("initial","Food")
+/datum/design/soymilk
+ name = "10u Soy Milk"
+ id = "soymilk"
+ build_type = BIOGENERATOR
+ materials = list(/datum/material/biomass= 20)
+ make_reagents = list(/datum/reagent/consumable/soymilk = 10)
+ category = list("initial","Food")
+
/datum/design/ethanol
name = "10u Ethanol"
id = "ethanol"
@@ -56,7 +64,7 @@
build_type = BIOGENERATOR
materials = list(/datum/material/biomass= 250)
build_path = /obj/item/reagent_containers/food/snacks/monkeycube
- category = list("initial", "Food")
+ category = list("initial","Food")
/datum/design/ez_nut //easy nut :)
name = "30u E-Z Nutrient"
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index ee4bae4af32..a6f18906b11 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -186,6 +186,14 @@
build_path = /obj/item/circuitboard/machine/dnascanner
category = list("Medical Machinery")
+/datum/design/board/hypnochair
+ name = "Machine Design (Enhanced Interrogation Chamber)"
+ desc = "Allows for the construction of circuit boards used to build an Enhanced Interrogation Chamber."
+ id = "hypnochair"
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+ build_path = /obj/item/circuitboard/machine/hypnochair
+ category = list("Misc. Machinery")
+
/datum/design/board/biogenerator
name = "Machine Design (Biogenerator Board)"
desc = "The circuit board for a biogenerator."
@@ -594,3 +602,11 @@
build_path = /obj/item/circuitboard/machine/medical_kiosk
category = list ("Medical Machinery")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
+/datum/design/board/medipen_refiller
+ name = "Machine Design (Medipen Refiller)"
+ desc = "The circuit board for a Medipen Refiller."
+ id = "medipen_refiller"
+ build_path = /obj/item/circuitboard/machine/medipen_refiller
+ category = list ("Medical Machinery")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm
index 147a6911ca0..3d552d1ca82 100644
--- a/code/modules/research/designs/misc_designs.dm
+++ b/code/modules/research/designs/misc_designs.dm
@@ -1,552 +1,562 @@
-
-/////////////////////////////////////////
-/////////////////HUDs////////////////////
-/////////////////////////////////////////
-
-/datum/design/health_hud
- name = "Health Scanner HUD"
- desc = "A heads-up display that scans the humans in view and provides accurate data about their health status."
- id = "health_hud"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
- build_path = /obj/item/clothing/glasses/hud/health
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
-
-/datum/design/health_hud_night
- name = "Night Vision Health Scanner HUD"
- desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness."
- id = "health_hud_night"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/silver = 350)
- build_path = /obj/item/clothing/glasses/hud/health/night
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
-
-/datum/design/security_hud
- name = "Security HUD"
- desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status."
- id = "security_hud"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
- build_path = /obj/item/clothing/glasses/hud/security
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/security_hud_night
- name = "Night Vision Security HUD"
- desc = "A heads-up display which provides id data and vision in complete darkness."
- id = "security_hud_night"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/gold = 350)
- build_path = /obj/item/clothing/glasses/hud/security/night
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/diagnostic_hud
- name = "Diagnostic HUD"
- desc = "A HUD used to analyze and determine faults within robotic machinery."
- id = "diagnostic_hud"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
- build_path = /obj/item/clothing/glasses/hud/diagnostic
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/diagnostic_hud_night
- name = "Night Vision Diagnostic HUD"
- desc = "Upgraded version of the diagnostic HUD designed to function during a power failure."
- id = "diagnostic_hud_night"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/plasma = 300)
- build_path = /obj/item/clothing/glasses/hud/diagnostic/night
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/////////////////////////////////////////
-//////////////////Misc///////////////////
-/////////////////////////////////////////
-
-/datum/design/welding_goggles
- name = "Welding Goggles"
- desc = "Protects the eyes from bright flashes; approved by the mad scientist association."
- id = "welding_goggles"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
- build_path = /obj/item/clothing/glasses/welding
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/welding_mask
- name = "Welding Gas Mask"
- desc = "A gas mask with built in welding goggles and face shield. Looks like a skull, clearly designed by a nerd."
- id = "weldingmask"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 3000, /datum/material/glass = 1000)
- build_path = /obj/item/clothing/mask/gas/welding
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/bright_helmet
- name = "Workplace-Ready Firefighter Helmet"
- desc = "By applying state of the art lighting technology to a fire helmet with industry standard photo-chemical hardening methods, this hardhat will protect you from robust workplace hazards."
- id = "bright_helmet"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/plastic = 3000, /datum/material/silver = 500)
- build_path = /obj/item/clothing/head/hardhat/red/upgraded
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_CARGO
-
-/datum/design/mauna_mug
- name = "Mauna Mug"
- desc = "This awesome mug will ensure your coffee never stays cold!"
- id = "mauna_mug"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 1000, /datum/material/glass = 100)
- build_path = /obj/item/reagent_containers/glass/maunamug
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ALL
-
-/datum/design/portaseeder
- name = "Portable Seed Extractor"
- desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant."
- id = "portaseeder"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 1000, /datum/material/glass = 400)
- build_path = /obj/item/storage/bag/plants/portaseeder
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/air_horn
- name = "Air Horn"
- desc = "Damn son, where'd you find this?"
- id = "air_horn"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 4000, /datum/material/bananium = 1000)
- build_path = /obj/item/bikehorn/airhorn
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ALL //HONK!
-
-/datum/design/mesons
- name = "Optical Meson Scanners"
- desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
- id = "mesons"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
- build_path = /obj/item/clothing/glasses/meson
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/engine_goggles
- name = "Engineering Scanner Goggles"
- desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes."
- id = "engine_goggles"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/plasma = 100)
- build_path = /obj/item/clothing/glasses/meson/engine
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/tray_goggles
- name = "Optical T-Ray Scanners"
- desc = "Used by engineering staff to see underfloor objects such as cables and pipes."
- id = "tray_goggles"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
- build_path = /obj/item/clothing/glasses/meson/engine/tray
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/nvgmesons
- name = "Night Vision Optical Meson Scanners"
- desc = "Prototype meson scanners fitted with an extra sensor which amplifies the visible light spectrum and overlays it to the UHD display."
- id = "nvgmesons"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/plasma = 350, /datum/material/uranium = 1000)
- build_path = /obj/item/clothing/glasses/meson/night
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO
-
-/datum/design/night_vision_goggles
- name = "Night Vision Goggles"
- desc = "Goggles that let you see through darkness unhindered."
- id = "night_visision_goggles"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/plasma = 350, /datum/material/uranium = 1000)
- build_path = /obj/item/clothing/glasses/night
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/magboots
- name = "Magnetic Boots"
- desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle."
- id = "magboots"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 4500, /datum/material/silver = 1500, /datum/material/gold = 2500)
- build_path = /obj/item/clothing/shoes/magboots
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/forcefield_projector
- name = "Forcefield Projector"
- desc = "A device which can project temporary forcefields to seal off an area."
- id = "forcefield_projector"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 2500, /datum/material/glass = 1000)
- build_path = /obj/item/forcefield_projector
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/sci_goggles
- name = "Science Goggles"
- desc = "Goggles fitted with a portable analyzer capable of determining the research worth of an item or components of a machine."
- id = "scigoggles"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
- build_path = /obj/item/clothing/glasses/science
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/diskplantgene
- name = "Plant Data Disk"
- desc = "A disk for storing plant genetic data."
- id = "diskplantgene"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron=200, /datum/material/glass = 100)
- build_path = /obj/item/disk/plantgene
- category = list("Electronics")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/roastingstick
- name = "Advanced Roasting Stick"
- desc = "A roasting stick for cooking sausages in exotic ovens."
- id = "roastingstick"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron=1000, /datum/material/glass = 500, /datum/material/bluespace = 250)
- build_path = /obj/item/melee/roastingstick
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/locator
- name = "Bluespace Locator"
- desc = "Used to track portable teleportation beacons and targets with embedded tracking implants."
- id = "locator"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron=1000, /datum/material/glass = 500, /datum/material/silver = 500)
- build_path = /obj/item/locator
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/quantum_keycard
- name = "Quantum Keycard"
- desc = "Allows for the construction of a quantum keycard."
- id = "quantum_keycard"
- build_type = PROTOLATHE
- materials = list(/datum/material/glass = 500, /datum/material/iron = 500, /datum/material/silver = 500, /datum/material/bluespace = 1000)
- build_path = /obj/item/quantum_keycard
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/anomaly_neutralizer
- name = "Anomaly Neutralizer"
- desc = "An advanced tool capable of instantly neutralizing anomalies, designed to capture the fleeting aberrations created by the engine."
- id = "anomaly_neutralizer"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 2000, /datum/material/gold = 2000, /datum/material/plasma = 5000, /datum/material/uranium = 2000)
- build_path = /obj/item/anomaly_neutralizer
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/donksoft_refill
- name = "Donksoft Toy Vendor Refill"
- desc = "A refill canister for Donksoft Toy Vendors."
- id = "donksoft_refill"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 25000, /datum/material/glass = 15000, /datum/material/plasma = 20000, /datum/material/gold = 10000, /datum/material/silver = 10000)
- build_path = /obj/item/vending_refill/donksoft
- category = list("Equipment")
-
-/datum/design/oxygen_tank
- name = "Oxygen Tank"
- desc = "An empty oxygen tank."
- id = "oxygen_tank"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 2000)
- build_path = /obj/item/tank/internals/oxygen/empty
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/plasma_tank
- name = "Plasma Tank"
- desc = "An empty oxygen tank."
- id = "plasma_tank"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 2000)
- build_path = /obj/item/tank/internals/plasma/empty
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/id
- name = "Identification Card"
- desc = "A card used to provide ID and determine access across the station."
- id = "idcard"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron=200, /datum/material/glass = 100)
- build_path = /obj/item/card/id
- category = list("Electronics")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/eng_gloves
- name = "Tinkers Gloves"
- desc = "Overdesigned engineering gloves that have automated construction subroutines dialed in, allowing for faster construction while worn."
- id = "eng_gloves"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron=2000, /datum/material/silver=1500, /datum/material/gold = 1000)
- build_path = /obj/item/clothing/gloves/color/latex/engineering
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/lavarods
- name = "Lava-Resistant Metal Rods"
- id = "lava_rods"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron=1000, /datum/material/plasma=500, /datum/material/titanium=2000)
- build_path = /obj/item/stack/rods/lava
- category = list("initial", "Stock Parts")
- departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/plasticducky
- name = "Rubber Ducky"
- desc = "The classic Nanotrasen design for competitively priced bath based duck toys. No need for fancy Waffle co. rubber, buy Plastic Ducks today!"
- id = "plasticducky"
- build_type = PROTOLATHE
- materials = list(/datum/material/plastic = 1000)
- build_path = /obj/item/bikehorn/rubberducky/plasticducky
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ALL
-
-/////////////////////////////////////////
-////////////Janitor Designs//////////////
-/////////////////////////////////////////
-
-/datum/design/advmop
- name = "Advanced Mop"
- desc = "An upgraded mop with a large internal capacity for holding water or other cleaning chemicals."
- id = "advmop"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 2500, /datum/material/glass = 200)
- build_path = /obj/item/mop/advanced
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/blutrash
- name = "Trashbag of Holding"
- desc = "An advanced trash bag with bluespace properties; capable of holding a plethora of garbage."
- id = "blutrash"
- build_type = PROTOLATHE
- materials = list(/datum/material/gold = 1500, /datum/material/uranium = 250, /datum/material/plasma = 1500)
- build_path = /obj/item/storage/bag/trash/bluespace
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/buffer
- name = "Floor Buffer Upgrade"
- desc = "A floor buffer that can be attached to vehicular janicarts."
- id = "buffer"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 3000, /datum/material/glass = 200)
- build_path = /obj/item/janiupgrade
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/spraybottle
- name = "Spray Bottle"
- desc = "A spray bottle, with an unscrewable top."
- id = "spraybottle"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 3000, /datum/material/glass = 200)
- build_path = /obj/item/reagent_containers/spray
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/beartrap
- name = "Bear Trap"
- desc = "A trap used to catch space bears and other legged creatures."
- id = "beartrap"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 5000, /datum/material/titanium = 1000)
- build_path = /obj/item/restraints/legcuffs/beartrap
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/////////////////////////////////////////
-/////////////Holobarriers////////////////
-/////////////////////////////////////////
-
-/datum/design/holosign
- name = "Holographic Sign Projector"
- desc = "A holograpic projector used to project various warning signs."
- id = "holosign"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000)
- build_path = /obj/item/holosign_creator
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-/datum/design/holobarrier_jani
- name = "Custodial Holobarrier Projector"
- desc = "A holograpic projector used to project hard light wet floor barriers."
- id = "holobarrier_jani"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000, /datum/material/silver = 1000)
- build_path = /obj/item/holosign_creator/janibarrier
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
-
-/datum/design/holosignsec
- name = "Security Holobarrier Projector"
- desc = "A holographic projector that creates holographic security barriers."
- id = "holosignsec"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000)
- build_path = /obj/item/holosign_creator/security
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/holosignengi
- name = "Engineering Holobarrier Projector"
- desc = "A holographic projector that creates holographic engineering barriers."
- id = "holosignengi"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000)
- build_path = /obj/item/holosign_creator/engineering
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/holosignatmos
- name = "ATMOS Holofan Projector"
- desc = "A holographic projector that creates holographic barriers that prevent changes in atmospheric conditions."
- id = "holosignatmos"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000)
- build_path = /obj/item/holosign_creator/atmos
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/holobarrier_med
- name = "PENLITE Holobarrier Projector"
- desc = "PENLITE holobarriers, a device that halts individuals with malicious diseases."
- build_type = PROTOLATHE
- build_path = /obj/item/holosign_creator/medical
- materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 100) //a hint of silver since it can troll 2 antags (bad viros and sentient disease)
- id = "holobarrier_med"
- category = list("Medical Designs")
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
-
-/////////////////////////////////////////
-////////////////Armour///////////////////
-/////////////////////////////////////////
-
-/datum/design/reactive_armour
- name = "Reactive Armour Shell"
- desc = "An experimental suit of armour capable of utilizing an implanted anomaly core to protect the user."
- id = "reactive_armour"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 10000, /datum/material/diamond = 5000, /datum/material/uranium = 8000, /datum/material/silver = 4500, /datum/material/gold = 5000)
- build_path = /obj/item/reactive_armour_shell
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
-
-/datum/design/knight_armour
- name = "Knight Armour"
- desc = "A royal knight's favorite garments. Can be trimmed by any friendly person."
- id = "knight_armour"
- build_type = AUTOLATHE
- materials = list(MAT_CATEGORY_RIGID = 10000)
- build_path = /obj/item/clothing/suit/armor/riot/knight/greyscale
- category = list("Imported")
-
-/datum/design/knight_helmet
- name = "Knight Helmet"
- desc = "A royal knight's favorite hat. If you hold it upside down it's actually a bucket."
- id = "knight_helmet"
- build_type = AUTOLATHE
- materials = list(MAT_CATEGORY_RIGID = 5000)
- build_path = /obj/item/clothing/head/helmet/knight/greyscale
- category = list("Imported")
-
-
-
-/////////////////////////////////////////
-/////////////Security////////////////////
-/////////////////////////////////////////
-
-/datum/design/seclite
- name = "Seclite"
- desc = "A robust flashlight used by security."
- id = "seclite"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 2500)
- build_path = /obj/item/flashlight/seclite
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/detective_scanner
- name = "Forensic Scanner"
- desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings."
- id = "detective_scanner"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 2500, /datum/material/silver = 2000)
- build_path = /obj/item/detective_scanner
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/pepperspray
- name = "Pepper Spray"
- desc = "Manufactured by UhangInc, used to blind and down an opponent quickly. Printed pepper sprays do not contain reagents."
- id = "pepperspray"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000)
- build_path = /obj/item/reagent_containers/spray/pepper/empty
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/bola_energy
- name = "Energy Bola"
- desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests."
- id = "bola_energy"
- build_type = PROTOLATHE
- materials = list(/datum/material/silver = 500, /datum/material/plasma = 500, /datum/material/titanium = 500)
- build_path = /obj/item/restraints/legcuffs/bola/energy
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/zipties
- name = "Zipties"
- desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use."
- id = "zipties"
- build_type = PROTOLATHE
- materials = list(/datum/material/plastic = 250)
- build_path = /obj/item/restraints/handcuffs/cable/zipties
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/evidencebag
- name = "Evidence Bag"
- desc = "An empty evidence bag."
- id = "evidencebag"
- build_type = PROTOLATHE
- materials = list(/datum/material/plastic = 100)
- build_path = /obj/item/evidencebag
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/plumbing_rcd
- name = "Plumbing Constructor"
- id = "plumbing_rcd"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 75000, /datum/material/glass = 37500, /datum/material/plastic = 1000)
- build_path = /obj/item/construction/plumbing
- category = list("Equipment")
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
+/////////////////////////////////////////
+/////////////////HUDs////////////////////
+/////////////////////////////////////////
+
+/datum/design/health_hud
+ name = "Health Scanner HUD"
+ desc = "A heads-up display that scans the humans in view and provides accurate data about their health status."
+ id = "health_hud"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
+ build_path = /obj/item/clothing/glasses/hud/health
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
+/datum/design/health_hud_night
+ name = "Night Vision Health Scanner HUD"
+ desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness."
+ id = "health_hud_night"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/silver = 350)
+ build_path = /obj/item/clothing/glasses/hud/health/night
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
+/datum/design/security_hud
+ name = "Security HUD"
+ desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status."
+ id = "security_hud"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
+ build_path = /obj/item/clothing/glasses/hud/security
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/security_hud_night
+ name = "Night Vision Security HUD"
+ desc = "A heads-up display which provides id data and vision in complete darkness."
+ id = "security_hud_night"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/gold = 350)
+ build_path = /obj/item/clothing/glasses/hud/security/night
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/diagnostic_hud
+ name = "Diagnostic HUD"
+ desc = "A HUD used to analyze and determine faults within robotic machinery."
+ id = "diagnostic_hud"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
+ build_path = /obj/item/clothing/glasses/hud/diagnostic
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/diagnostic_hud_night
+ name = "Night Vision Diagnostic HUD"
+ desc = "Upgraded version of the diagnostic HUD designed to function during a power failure."
+ id = "diagnostic_hud_night"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/plasma = 300)
+ build_path = /obj/item/clothing/glasses/hud/diagnostic/night
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+/////////////////////////////////////////
+//////////////////Misc///////////////////
+/////////////////////////////////////////
+
+/datum/design/welding_goggles
+ name = "Welding Goggles"
+ desc = "Protects the eyes from bright flashes; approved by the mad scientist association."
+ id = "welding_goggles"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
+ build_path = /obj/item/clothing/glasses/welding
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/welding_mask
+ name = "Welding Gas Mask"
+ desc = "A gas mask with built in welding goggles and face shield. Looks like a skull, clearly designed by a nerd."
+ id = "weldingmask"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 3000, /datum/material/glass = 1000)
+ build_path = /obj/item/clothing/mask/gas/welding
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/bright_helmet
+ name = "Workplace-Ready Firefighter Helmet"
+ desc = "By applying state of the art lighting technology to a fire helmet with industry standard photo-chemical hardening methods, this hardhat will protect you from robust workplace hazards."
+ id = "bright_helmet"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/plastic = 3000, /datum/material/silver = 500)
+ build_path = /obj/item/clothing/head/hardhat/red/upgraded
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_CARGO
+
+/datum/design/mauna_mug
+ name = "Mauna Mug"
+ desc = "This awesome mug will ensure your coffee never stays cold!"
+ id = "mauna_mug"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 1000, /datum/material/glass = 100)
+ build_path = /obj/item/reagent_containers/glass/maunamug
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ALL
+
+/datum/design/rolling_table
+ name = "Rolly poly"
+ desc = "We duct-taped some wheels to the bottom of a table. It's goddamn science alright?"
+ id = "rolling_table"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 4000)
+ build_path = /obj/structure/table/rolling
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ALL
+
+/datum/design/portaseeder
+ name = "Portable Seed Extractor"
+ desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant."
+ id = "portaseeder"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 1000, /datum/material/glass = 400)
+ build_path = /obj/item/storage/bag/plants/portaseeder
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/air_horn
+ name = "Air Horn"
+ desc = "Damn son, where'd you find this?"
+ id = "air_horn"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 4000, /datum/material/bananium = 1000)
+ build_path = /obj/item/bikehorn/airhorn
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ALL //HONK!
+
+/datum/design/mesons
+ name = "Optical Meson Scanners"
+ desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
+ id = "mesons"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
+ build_path = /obj/item/clothing/glasses/meson
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/engine_goggles
+ name = "Engineering Scanner Goggles"
+ desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes."
+ id = "engine_goggles"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/plasma = 100)
+ build_path = /obj/item/clothing/glasses/meson/engine
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/tray_goggles
+ name = "Optical T-Ray Scanners"
+ desc = "Used by engineering staff to see underfloor objects such as cables and pipes."
+ id = "tray_goggles"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
+ build_path = /obj/item/clothing/glasses/meson/engine/tray
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/nvgmesons
+ name = "Night Vision Optical Meson Scanners"
+ desc = "Prototype meson scanners fitted with an extra sensor which amplifies the visible light spectrum and overlays it to the UHD display."
+ id = "nvgmesons"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/plasma = 350, /datum/material/uranium = 1000)
+ build_path = /obj/item/clothing/glasses/meson/night
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO
+
+/datum/design/night_vision_goggles
+ name = "Night Vision Goggles"
+ desc = "Goggles that let you see through darkness unhindered."
+ id = "night_visision_goggles"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/plasma = 350, /datum/material/uranium = 1000)
+ build_path = /obj/item/clothing/glasses/night
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/magboots
+ name = "Magnetic Boots"
+ desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle."
+ id = "magboots"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 4500, /datum/material/silver = 1500, /datum/material/gold = 2500)
+ build_path = /obj/item/clothing/shoes/magboots
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/forcefield_projector
+ name = "Forcefield Projector"
+ desc = "A device which can project temporary forcefields to seal off an area."
+ id = "forcefield_projector"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 2500, /datum/material/glass = 1000)
+ build_path = /obj/item/forcefield_projector
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/sci_goggles
+ name = "Science Goggles"
+ desc = "Goggles fitted with a portable analyzer capable of determining the research worth of an item or components of a machine."
+ id = "scigoggles"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
+ build_path = /obj/item/clothing/glasses/science
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/diskplantgene
+ name = "Plant Data Disk"
+ desc = "A disk for storing plant genetic data."
+ id = "diskplantgene"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron=200, /datum/material/glass = 100)
+ build_path = /obj/item/disk/plantgene
+ category = list("Electronics")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/roastingstick
+ name = "Advanced Roasting Stick"
+ desc = "A roasting stick for cooking sausages in exotic ovens."
+ id = "roastingstick"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron=1000, /datum/material/glass = 500, /datum/material/bluespace = 250)
+ build_path = /obj/item/melee/roastingstick
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/locator
+ name = "Bluespace Locator"
+ desc = "Used to track portable teleportation beacons and targets with embedded tracking implants."
+ id = "locator"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron=1000, /datum/material/glass = 500, /datum/material/silver = 500)
+ build_path = /obj/item/locator
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/quantum_keycard
+ name = "Quantum Keycard"
+ desc = "Allows for the construction of a quantum keycard."
+ id = "quantum_keycard"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/glass = 500, /datum/material/iron = 500, /datum/material/silver = 500, /datum/material/bluespace = 1000)
+ build_path = /obj/item/quantum_keycard
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/anomaly_neutralizer
+ name = "Anomaly Neutralizer"
+ desc = "An advanced tool capable of instantly neutralizing anomalies, designed to capture the fleeting aberrations created by the engine."
+ id = "anomaly_neutralizer"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 2000, /datum/material/gold = 2000, /datum/material/plasma = 5000, /datum/material/uranium = 2000)
+ build_path = /obj/item/anomaly_neutralizer
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/donksoft_refill
+ name = "Donksoft Toy Vendor Refill"
+ desc = "A refill canister for Donksoft Toy Vendors."
+ id = "donksoft_refill"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 25000, /datum/material/glass = 15000, /datum/material/plasma = 20000, /datum/material/gold = 10000, /datum/material/silver = 10000)
+ build_path = /obj/item/vending_refill/donksoft
+ category = list("Equipment")
+
+/datum/design/oxygen_tank
+ name = "Oxygen Tank"
+ desc = "An empty oxygen tank."
+ id = "oxygen_tank"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 2000)
+ build_path = /obj/item/tank/internals/oxygen/empty
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/plasma_tank
+ name = "Plasma Tank"
+ desc = "An empty oxygen tank."
+ id = "plasma_tank"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 2000)
+ build_path = /obj/item/tank/internals/plasma/empty
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/id
+ name = "Identification Card"
+ desc = "A card used to provide ID and determine access across the station."
+ id = "idcard"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron=200, /datum/material/glass = 100)
+ build_path = /obj/item/card/id
+ category = list("Electronics")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/eng_gloves
+ name = "Tinkers Gloves"
+ desc = "Overdesigned engineering gloves that have automated construction subroutines dialed in, allowing for faster construction while worn."
+ id = "eng_gloves"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron=2000, /datum/material/silver=1500, /datum/material/gold = 1000)
+ build_path = /obj/item/clothing/gloves/color/latex/engineering
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/lavarods
+ name = "Lava-Resistant Metal Rods"
+ id = "lava_rods"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron=1000, /datum/material/plasma=500, /datum/material/titanium=2000)
+ build_path = /obj/item/stack/rods/lava
+ category = list("initial", "Stock Parts")
+ departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/plasticducky
+ name = "Rubber Ducky"
+ desc = "The classic Nanotrasen design for competitively priced bath based duck toys. No need for fancy Waffle co. rubber, buy Plastic Ducks today!"
+ id = "plasticducky"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/plastic = 1000)
+ build_path = /obj/item/bikehorn/rubberducky/plasticducky
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ALL
+
+/////////////////////////////////////////
+////////////Janitor Designs//////////////
+/////////////////////////////////////////
+
+/datum/design/advmop
+ name = "Advanced Mop"
+ desc = "An upgraded mop with a large internal capacity for holding water or other cleaning chemicals."
+ id = "advmop"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 2500, /datum/material/glass = 200)
+ build_path = /obj/item/mop/advanced
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/blutrash
+ name = "Trashbag of Holding"
+ desc = "An advanced trash bag with bluespace properties; capable of holding a plethora of garbage."
+ id = "blutrash"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/gold = 1500, /datum/material/uranium = 250, /datum/material/plasma = 1500)
+ build_path = /obj/item/storage/bag/trash/bluespace
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/buffer
+ name = "Floor Buffer Upgrade"
+ desc = "A floor buffer that can be attached to vehicular janicarts."
+ id = "buffer"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 3000, /datum/material/glass = 200)
+ build_path = /obj/item/janiupgrade
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/spraybottle
+ name = "Spray Bottle"
+ desc = "A spray bottle, with an unscrewable top."
+ id = "spraybottle"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 3000, /datum/material/glass = 200)
+ build_path = /obj/item/reagent_containers/spray
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/beartrap
+ name = "Bear Trap"
+ desc = "A trap used to catch space bears and other legged creatures."
+ id = "beartrap"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 5000, /datum/material/titanium = 1000)
+ build_path = /obj/item/restraints/legcuffs/beartrap
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/////////////////////////////////////////
+/////////////Holobarriers////////////////
+/////////////////////////////////////////
+
+/datum/design/holosign
+ name = "Holographic Sign Projector"
+ desc = "A holograpic projector used to project various warning signs."
+ id = "holosign"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000)
+ build_path = /obj/item/holosign_creator
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/holobarrier_jani
+ name = "Custodial Holobarrier Projector"
+ desc = "A holograpic projector used to project hard light wet floor barriers."
+ id = "holobarrier_jani"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000, /datum/material/silver = 1000)
+ build_path = /obj/item/holosign_creator/janibarrier
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+
+/datum/design/holosignsec
+ name = "Security Holobarrier Projector"
+ desc = "A holographic projector that creates holographic security barriers."
+ id = "holosignsec"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000)
+ build_path = /obj/item/holosign_creator/security
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/holosignengi
+ name = "Engineering Holobarrier Projector"
+ desc = "A holographic projector that creates holographic engineering barriers."
+ id = "holosignengi"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000)
+ build_path = /obj/item/holosign_creator/engineering
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/holosignatmos
+ name = "ATMOS Holofan Projector"
+ desc = "A holographic projector that creates holographic barriers that prevent changes in atmospheric conditions."
+ id = "holosignatmos"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000)
+ build_path = /obj/item/holosign_creator/atmos
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/holobarrier_med
+ name = "PENLITE Holobarrier Projector"
+ desc = "PENLITE holobarriers, a device that halts individuals with malicious diseases."
+ build_type = PROTOLATHE
+ build_path = /obj/item/holosign_creator/medical
+ materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 100) //a hint of silver since it can troll 2 antags (bad viros and sentient disease)
+ id = "holobarrier_med"
+ category = list("Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
+/////////////////////////////////////////
+////////////////Armour///////////////////
+/////////////////////////////////////////
+
+/datum/design/reactive_armour
+ name = "Reactive Armour Shell"
+ desc = "An experimental suit of armour capable of utilizing an implanted anomaly core to protect the user."
+ id = "reactive_armour"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 10000, /datum/material/diamond = 5000, /datum/material/uranium = 8000, /datum/material/silver = 4500, /datum/material/gold = 5000)
+ build_path = /obj/item/reactive_armour_shell
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/knight_armour
+ name = "Knight Armour"
+ desc = "A royal knight's favorite garments. Can be trimmed by any friendly person."
+ id = "knight_armour"
+ build_type = AUTOLATHE
+ materials = list(MAT_CATEGORY_RIGID = 10000)
+ build_path = /obj/item/clothing/suit/armor/riot/knight/greyscale
+ category = list("Imported")
+
+/datum/design/knight_helmet
+ name = "Knight Helmet"
+ desc = "A royal knight's favorite hat. If you hold it upside down it's actually a bucket."
+ id = "knight_helmet"
+ build_type = AUTOLATHE
+ materials = list(MAT_CATEGORY_RIGID = 5000)
+ build_path = /obj/item/clothing/head/helmet/knight/greyscale
+ category = list("Imported")
+
+
+
+/////////////////////////////////////////
+/////////////Security////////////////////
+/////////////////////////////////////////
+
+/datum/design/seclite
+ name = "Seclite"
+ desc = "A robust flashlight used by security."
+ id = "seclite"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 2500)
+ build_path = /obj/item/flashlight/seclite
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/detective_scanner
+ name = "Forensic Scanner"
+ desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings."
+ id = "detective_scanner"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 2500, /datum/material/silver = 2000)
+ build_path = /obj/item/detective_scanner
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/pepperspray
+ name = "Pepper Spray"
+ desc = "Manufactured by UhangInc, used to blind and down an opponent quickly. Printed pepper sprays do not contain reagents."
+ id = "pepperspray"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000)
+ build_path = /obj/item/reagent_containers/spray/pepper/empty
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/bola_energy
+ name = "Energy Bola"
+ desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests."
+ id = "bola_energy"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/silver = 500, /datum/material/plasma = 500, /datum/material/titanium = 500)
+ build_path = /obj/item/restraints/legcuffs/bola/energy
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/zipties
+ name = "Zipties"
+ desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use."
+ id = "zipties"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/plastic = 250)
+ build_path = /obj/item/restraints/handcuffs/cable/zipties
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/evidencebag
+ name = "Evidence Bag"
+ desc = "An empty evidence bag."
+ id = "evidencebag"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/plastic = 100)
+ build_path = /obj/item/evidencebag
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/plumbing_rcd
+ name = "Plumbing Constructor"
+ id = "plumbing_rcd"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 75000, /datum/material/glass = 37500, /datum/material/plastic = 1000)
+ build_path = /obj/item/construction/plumbing
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
diff --git a/code/modules/research/nanites/nanite_cloud_controller.dm b/code/modules/research/nanites/nanite_cloud_controller.dm
index 1a11e1ecdfa..208f562c12a 100644
--- a/code/modules/research/nanites/nanite_cloud_controller.dm
+++ b/code/modules/research/nanites/nanite_cloud_controller.dm
@@ -48,7 +48,7 @@
return
var/datum/nanite_cloud_backup/backup = new(src)
- var/datum/component/nanites/cloud_copy = new(backup)
+ var/datum/component/nanites/cloud_copy = backup.AddComponent(/datum/component/nanites)
backup.cloud_id = cloud_id
backup.nanites = cloud_copy
investigate_log("[key_name(user)] created a new nanite cloud backup with id #[cloud_id]", INVESTIGATE_NANITES)
@@ -213,7 +213,7 @@
var/datum/component/nanites/nanites = backup.nanites
var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])]
var/datum/nanite_rule/rule = rule_template.make_rule(P)
-
+
investigate_log("[key_name(usr)] added rule [rule.display()] to program [P.name] in cloud #[current_view]", INVESTIGATE_NANITES)
. = TRUE
if("remove_rule")
@@ -224,7 +224,7 @@
var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])]
var/datum/nanite_rule/rule = P.rules[text2num(params["rule_id"])]
rule.remove()
-
+
investigate_log("[key_name(usr)] removed rule [rule.display()] from program [P.name] in cloud #[current_view]", INVESTIGATE_NANITES)
. = TRUE
diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm
index 4f5f80a4cfd..50ff6f4a846 100644
--- a/code/modules/research/nanites/nanite_programs.dm
+++ b/code/modules/research/nanites/nanite_programs.dm
@@ -170,14 +170,17 @@
if(timer_shutdown_next && world.time > timer_shutdown_next)
deactivate()
timer_shutdown_next = 0
+ return
if(timer_trigger && world.time > timer_trigger_next)
trigger()
timer_trigger_next = world.time + timer_trigger
+ return
if(timer_trigger_delay_next && world.time > timer_trigger_delay_next)
trigger(delayed = TRUE)
timer_trigger_delay_next = 0
+ return
if(check_conditions() && consume_nanites(use_rate))
if(!passive_enabled)
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 09e30d639cb..9f60ff84c69 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -65,7 +65,7 @@
display_name = "Biological Technology"
description = "What makes us tick." //the MC, silly!
prereq_ids = list("base")
- design_ids = list("chem_heater", "chem_master", "chem_dispenser", "pandemic", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "medigel","genescanner", "med_spray_bottle", "chem_pack", "blood_pack", "medical_kiosk", "crewpinpointerprox")
+ design_ids = list("chem_heater", "chem_master", "chem_dispenser", "pandemic", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "medigel","genescanner", "med_spray_bottle", "chem_pack", "blood_pack", "medical_kiosk", "crewpinpointerprox", "medipen_refiller")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
@@ -1087,6 +1087,17 @@
hidden = TRUE
experimental = TRUE
+/datum/techweb_node/rolling_table
+ id = "rolling_table"
+ display_name = "Advanced Wheel Applications"
+ description = "Adding wheels to things can lead to extremely beneficial outcomes."
+ prereq_ids = list("base")
+ design_ids = list("rolling_table")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 2500
+ hidden = TRUE
+ experimental = TRUE
+
/datum/techweb_node/Mauna_Mug
id = "mauna_mug"
display_name = "Mauna Mug"
@@ -1121,6 +1132,19 @@
hidden = TRUE
experimental = TRUE
+/datum/techweb_node/interrogation
+ id = "interrogation"
+ display_name = "Enhanced Interrogation Technology"
+ description = "By cross-referencing several declassified documents from past dictatorial regimes, we were able to develop an incredibly effective interrogation device. \
+ Ethical concerns about loss of free will do not apply to criminals, according to galactic law."
+ prereq_ids = list("base")
+ design_ids = list("hypnochair")
+
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
+ export_price = 3500
+ hidden = TRUE
+ experimental = TRUE
+
//Helpers for debugging/balancing the techweb in its entirety!
/proc/total_techweb_exports()
var/list/datum/techweb_node/processing = list()
diff --git a/code/modules/research/xenobiology/crossbreeding/_potions.dm b/code/modules/research/xenobiology/crossbreeding/_potions.dm
index 1fb17ea4d1f..3e15a818674 100644
--- a/code/modules/research/xenobiology/crossbreeding/_potions.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_potions.dm
@@ -118,6 +118,9 @@ Slimecrossing Potions
if(!istype(C))
to_chat(user, "The potion can only be used on clothing!")
return
+ if(istype(C, /obj/item/clothing/suit/space))
+ to_chat(user, "The [C] is already pressure-resistant!")
+ return ..()
if(C.min_cold_protection_temperature == SPACE_SUIT_MIN_TEMP_PROTECT && C.clothing_flags & STOPSPRESSUREDAMAGE)
to_chat(user, "The [C] is already pressure-resistant!")
return ..()
diff --git a/code/modules/ruins/spaceruin_code/hellfactory.dm b/code/modules/ruins/spaceruin_code/hellfactory.dm
new file mode 100644
index 00000000000..6f992fbff52
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/hellfactory.dm
@@ -0,0 +1,32 @@
+/obj/machinery/door/keycard/office
+ name = "management airlock"
+ desc = "The boss man gets the best stuff. Always and forever."
+ puzzle_id = "factory1"
+
+/obj/item/keycard/office
+ name = "management keycard"
+ desc = "The Brewzone, first rate brewing and packaging. This one is labeled 'office'."
+ color = "#f05812"
+ puzzle_id = "factory1"
+
+/obj/machinery/door/keycard/stockroom
+ name = "stockroom airlock"
+ desc = "The boss man gets the best stuff. Always and forever."
+ puzzle_id = "factory2"
+
+/obj/item/keycard/stockroom
+ name = "stockroom keycard"
+ desc = "The Heck Brewzone, first rate brewing and packaging. This one is labeled 'stockroom'."
+ color = "#1272f0"
+ puzzle_id = "factory2"
+
+/obj/machinery/door/keycard/entry
+ name = "secure airlock"
+ desc = "The boss man gets the best stuff. Always and forever."
+ puzzle_id = "factory3"
+
+/obj/item/keycard/entry
+ name = "secure keycard"
+ desc = "The Heck Brewzone, first rate brewing and packaging. This one is labeled 'front door'."
+ color = "#12f049"
+ puzzle_id = "factory3"
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index e9bdf785464..e532631a3af 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -704,7 +704,7 @@
if(timeleft > 1 HOURS)
return "--:--"
else if(timeleft > 0)
- return "[add_leading(num2text((timeleft / 60) % 60), 2, "0")]:[add_leading(num2text(timeleft % 60), 2, " ")]"
+ return "[add_leading(num2text((timeleft / 60) % 60), 2, "0")]:[add_leading(num2text(timeleft % 60), 2, "0")]"
else
return "00:00"
diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm
index 6f2513c9050..0cb92807c2b 100644
--- a/code/modules/spells/spell_types/godhand.dm
+++ b/code/modules/spells/spell_types/godhand.dm
@@ -33,7 +33,8 @@
. = ..()
if(!proximity)
return
- user.say(catchphrase, forced = "spell")
+ if(catchphrase)
+ user.say(catchphrase, forced = "spell")
playsound(get_turf(user), on_use_sound,50,TRUE)
charges--
if(charges <= 0)
diff --git a/code/modules/surgery/advanced/bioware/ligament_hook.dm b/code/modules/surgery/advanced/bioware/ligament_hook.dm
index 64739fa1339..244ec6ef630 100644
--- a/code/modules/surgery/advanced/bioware/ligament_hook.dm
+++ b/code/modules/surgery/advanced/bioware/ligament_hook.dm
@@ -16,7 +16,7 @@
name = "reshape ligaments"
accept_hand = TRUE
time = 125
- experience_given = 5
+ experience_given = MEDICAL_SKILL_ADVANCED
/datum/surgery_step/reshape_ligaments/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "You start reshaping [target]'s ligaments into a hook-like shape.",
diff --git a/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm b/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm
index ad483bd2be7..624306009b9 100644
--- a/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm
+++ b/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm
@@ -16,7 +16,7 @@
name = "reinforce ligaments"
accept_hand = TRUE
time = 125
- experience_given = 5
+ experience_given = MEDICAL_SKILL_ADVANCED
/datum/surgery_step/reinforce_ligaments/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "You start reinforcing [target]'s ligaments.",
diff --git a/code/modules/surgery/advanced/bioware/muscled_veins.dm b/code/modules/surgery/advanced/bioware/muscled_veins.dm
index 0ecec896b02..63f624d81f5 100644
--- a/code/modules/surgery/advanced/bioware/muscled_veins.dm
+++ b/code/modules/surgery/advanced/bioware/muscled_veins.dm
@@ -15,7 +15,7 @@
name = "shape vein muscles"
accept_hand = TRUE
time = 125
- experience_given = 5
+ experience_given = MEDICAL_SKILL_ADVANCED
/datum/surgery_step/muscled_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "You start wrapping muscles around [target]'s circulatory system.",
diff --git a/code/modules/surgery/advanced/bioware/nerve_grounding.dm b/code/modules/surgery/advanced/bioware/nerve_grounding.dm
index aec78edb080..a624422af0c 100644
--- a/code/modules/surgery/advanced/bioware/nerve_grounding.dm
+++ b/code/modules/surgery/advanced/bioware/nerve_grounding.dm
@@ -15,7 +15,7 @@
name = "ground nerves"
accept_hand = TRUE
time = 155
- experience_given = 5
+ experience_given = MEDICAL_SKILL_ADVANCED
/datum/surgery_step/ground_nerves/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "You start rerouting [target]'s nerves.",
diff --git a/code/modules/surgery/advanced/bioware/nerve_splicing.dm b/code/modules/surgery/advanced/bioware/nerve_splicing.dm
index 38be1a35174..f50d45dab67 100644
--- a/code/modules/surgery/advanced/bioware/nerve_splicing.dm
+++ b/code/modules/surgery/advanced/bioware/nerve_splicing.dm
@@ -15,7 +15,7 @@
name = "splice nerves"
accept_hand = TRUE
time = 155
- experience_given = 5
+ experience_given = MEDICAL_SKILL_ADVANCED
/datum/surgery_step/splice_nerves/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "You start splicing together [target]'s nerves.",
diff --git a/code/modules/surgery/advanced/bioware/vein_threading.dm b/code/modules/surgery/advanced/bioware/vein_threading.dm
index dd89dfa7a04..cf3fe0633a8 100644
--- a/code/modules/surgery/advanced/bioware/vein_threading.dm
+++ b/code/modules/surgery/advanced/bioware/vein_threading.dm
@@ -15,7 +15,7 @@
name = "thread veins"
accept_hand = TRUE
time = 125
- experience_given = 5
+ experience_given = MEDICAL_SKILL_ADVANCED
/datum/surgery_step/thread_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "You start weaving [target]'s circulatory system.",
diff --git a/code/modules/surgery/advanced/brainwashing.dm b/code/modules/surgery/advanced/brainwashing.dm
index 37c4cc0acdb..ab2df4a5559 100644
--- a/code/modules/surgery/advanced/brainwashing.dm
+++ b/code/modules/surgery/advanced/brainwashing.dm
@@ -29,6 +29,7 @@
name = "brainwash"
implements = list(TOOL_HEMOSTAT = 85, TOOL_WIRECUTTER = 50, /obj/item/stack/packageWrap = 35, /obj/item/stack/cable_coil = 15)
time = 200
+ experience_given = MEDICAL_SKILL_ADVANCED
var/objective
/datum/surgery_step/brainwash/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -39,7 +40,7 @@
"[user] begins to fix [target]'s brain.",
"[user] begins to perform surgery on [target]'s brain.")
-/datum/surgery_step/brainwash/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results)
+/datum/surgery_step/brainwash/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
if(!target.mind)
to_chat(user, "[target] doesn't respond to the brainwashing, as if [target.p_they()] lacked a mind...")
return FALSE
@@ -53,7 +54,7 @@
brainwash(target, objective)
message_admins("[ADMIN_LOOKUPFLW(user)] surgically brainwashed [ADMIN_LOOKUPFLW(target)] with the objective '[objective]'.")
log_game("[key_name(user)] surgically brainwashed [key_name(target)] with the objective '[objective]'.")
- return TRUE
+ return ..()
/datum/surgery_step/brainwash/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(target.getorganslot(ORGAN_SLOT_BRAIN))
diff --git a/code/modules/surgery/advanced/lobotomy.dm b/code/modules/surgery/advanced/lobotomy.dm
index 4ec56e046fa..fd02138a0cc 100644
--- a/code/modules/surgery/advanced/lobotomy.dm
+++ b/code/modules/surgery/advanced/lobotomy.dm
@@ -26,6 +26,7 @@
implements = list(TOOL_SCALPEL = 85, /obj/item/melee/transforming/energy/sword = 55, /obj/item/kitchen/knife = 35,
/obj/item/shard = 25, /obj/item = 20)
time = 100
+ experience_given = MEDICAL_SKILL_ADVANCED //lose XP if you end up giving them bad traumas
/datum/surgery_step/lobotomize/tool_check(mob/user, obj/item/tool)
if(implement_type == /obj/item && !tool.get_sharpness())
@@ -37,7 +38,7 @@
"[user] begins to perform a lobotomy on [target]'s brain.",
"[user] begins to perform surgery on [target]'s brain.")
-/datum/surgery_step/lobotomize/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results)
+/datum/surgery_step/lobotomize/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
display_results(user, target, "You succeed in lobotomizing [target].",
"[user] successfully lobotomizes [target]!",
"[user] completes the surgery on [target]'s brain.")
@@ -47,11 +48,14 @@
switch(rand(1,4))//Now let's see what hopefully-not-important part of the brain we cut off
if(1)
target.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_MAGIC)
+ experience_given = MEDICAL_SKILL_ADVANCED*0.9
if(2)
target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_MAGIC)
+ experience_given = MEDICAL_SKILL_ADVANCED*0.8
if(3)
target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC)
- return TRUE
+ experience_given = MEDICAL_SKILL_ADVANCED*0.5
+ return ..()
/datum/surgery_step/lobotomize/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN)
diff --git a/code/modules/surgery/advanced/necrotic_revival.dm b/code/modules/surgery/advanced/necrotic_revival.dm
index 495fe43d5bd..41f63b1a5f3 100644
--- a/code/modules/surgery/advanced/necrotic_revival.dm
+++ b/code/modules/surgery/advanced/necrotic_revival.dm
@@ -22,17 +22,18 @@
time = 50
chems_needed = list(/datum/reagent/toxin/zombiepowder, /datum/reagent/medicine/rezadone)
require_all_chems = FALSE
+ experience_given = MEDICAL_SKILL_ADVANCED
/datum/surgery_step/bionecrosis/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "You begin to grow a romerol tumor on [target]'s brain...",
"[user] begins to tinker with [target]'s brain...",
"[user] begins to perform surgery on [target]'s brain.")
-/datum/surgery_step/bionecrosis/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results)
+/datum/surgery_step/bionecrosis/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
display_results(user, target, "You succeed in growing a romerol tumor on [target]'s brain.",
"[user] successfully grows a romerol tumor on [target]'s brain!",
"[user] completes the surgery on [target]'s brain.")
if(!target.getorganslot(ORGAN_SLOT_ZOMBIE))
var/obj/item/organ/zombie_infection/ZI = new()
ZI.Insert(target)
- return TRUE
+ return ..()
diff --git a/code/modules/surgery/advanced/pacification.dm b/code/modules/surgery/advanced/pacification.dm
index bb41b7176ea..ccbb6325183 100644
--- a/code/modules/surgery/advanced/pacification.dm
+++ b/code/modules/surgery/advanced/pacification.dm
@@ -22,18 +22,19 @@
name = "rewire brain"
implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15)
time = 40
+ experience_given = MEDICAL_SKILL_ADVANCED
/datum/surgery_step/pacify/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "You begin to pacify [target]...",
"[user] begins to fix [target]'s brain.",
"[user] begins to perform surgery on [target]'s brain.")
-/datum/surgery_step/pacify/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results)
+/datum/surgery_step/pacify/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
display_results(user, target, "You succeed in neurologically pacifying [target].",
"[user] successfully fixes [target]'s brain!",
"[user] completes the surgery on [target]'s brain.")
target.gain_trauma(/datum/brain_trauma/severe/pacifism, TRAUMA_RESILIENCE_LOBOTOMY)
- return TRUE
+ return ..()
/datum/surgery_step/pacify/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "You screw up, rewiring [target]'s brain the wrong way around...",
diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm
index 3a1a8efcff4..815eaa93816 100644
--- a/code/modules/surgery/advanced/revival.dm
+++ b/code/modules/surgery/advanced/revival.dm
@@ -30,6 +30,7 @@
implements = list(/obj/item/twohanded/shockpaddles = 100, /obj/item/melee/baton = 75, /obj/item/gun/energy = 60)
repeatable = TRUE
time = 120
+ experience_given = MEDICAL_SKILL_ADVANCED
/datum/surgery_step/revive/tool_check(mob/user, obj/item/tool)
. = TRUE
diff --git a/code/modules/surgery/advanced/viral_bonding.dm b/code/modules/surgery/advanced/viral_bonding.dm
index cf0b1cc3d7e..006ebc947ce 100644
--- a/code/modules/surgery/advanced/viral_bonding.dm
+++ b/code/modules/surgery/advanced/viral_bonding.dm
@@ -23,6 +23,7 @@
implements = list(TOOL_CAUTERY = 100, TOOL_WELDER = 50, /obj/item = 30) // 30% success with any hot item.
time = 100
chems_needed = list(/datum/reagent/medicine/spaceacillin,/datum/reagent/consumable/virus_food,/datum/reagent/toxin/formaldehyde)
+ experience_given = MEDICAL_SKILL_ADVANCED
/datum/surgery_step/viral_bond/tool_check(mob/user, obj/item/tool)
if(implement_type == TOOL_WELDER || implement_type == /obj/item)
diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm
index 27d3e622a3a..4d9827a52b5 100644
--- a/code/modules/surgery/amputation.dm
+++ b/code/modules/surgery/amputation.dm
@@ -11,7 +11,7 @@
name = "sever limb"
implements = list(/obj/item/shears = 300, TOOL_SCALPEL = 100, TOOL_SAW = 100, /obj/item/melee/arm_blade = 80, /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 40, /obj/item/kitchen/knife/butcher = 25)
time = 64
- experience_given = 5
+ experience_given = MEDICAL_SKILL_ORGAN_FIX
/datum/surgery_step/sever_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "You begin to sever [target]'s [parse_zone(target_zone)]...",
diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm
index af8b3346b98..be09daf8ed0 100644
--- a/code/modules/surgery/brain_surgery.dm
+++ b/code/modules/surgery/brain_surgery.dm
@@ -38,7 +38,7 @@
target.mind.remove_antag_datum(/datum/antagonist/brainwashed)
target.setOrganLoss(ORGAN_SLOT_BRAIN, target.getOrganLoss(ORGAN_SLOT_BRAIN) - 50) //we set damage in this case in order to clear the "failing" flag
var/cured_num = target.cure_all_traumas(TRAUMA_RESILIENCE_SURGERY)
- experience_given = 2*cured_num
+ experience_given = (MEDICAL_SKILL_EASY*2*cured_num)
if(target.getOrganLoss(ORGAN_SLOT_BRAIN) > 0)
to_chat(user, "[target]'s brain looks like it could be fixed further.")
return ..()
diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm
index 5fb613e16e5..ebe735278ee 100644
--- a/code/modules/surgery/coronary_bypass.dm
+++ b/code/modules/surgery/coronary_bypass.dm
@@ -50,7 +50,7 @@
name = "graft coronary bypass"
implements = list(TOOL_HEMOSTAT = 90, TOOL_WIRECUTTER = 35, /obj/item/stack/packageWrap = 15, /obj/item/stack/cable_coil = 5)
time = 90
- experience_given = 20
+ experience_given = MEDICAL_SKILL_ORGAN_FIX
/datum/surgery_step/coronary_bypass/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "You begin to graft a bypass onto [target]'s heart...",
diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm
index 26d6f76ae84..478877ed357 100644
--- a/code/modules/surgery/dental_implant.dm
+++ b/code/modules/surgery/dental_implant.dm
@@ -7,6 +7,7 @@
name = "insert pill"
implements = list(/obj/item/reagent_containers/pill = 100)
time = 16
+ experience_given = (MEDICAL_SKILL_MEDIUM*0.4) //quick to do
/datum/surgery_step/insert_pill/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "You begin to wedge [tool] in [target]'s [parse_zone(target_zone)]...",
diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm
index f697d48fa83..491dfde8cf2 100644
--- a/code/modules/surgery/experimental_dissection.dm
+++ b/code/modules/surgery/experimental_dissection.dm
@@ -87,7 +87,7 @@
target.apply_damage(80, BRUTE, L)
ADD_TRAIT(target, TRAIT_DISSECTED, "[surgery.name]")
repeatable = FALSE
- experience_given = 1+(points_earned/(BASE_HUMAN_REWARD/10))//if BHR = 500, 10 XP on base surgery
+ experience_given = max(points_earned/(BASE_HUMAN_REWARD/MEDICAL_SKILL_MEDIUM),1)
return ..()
/datum/surgery_step/dissection/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm
index d50840291c2..40e9ceee34e 100644
--- a/code/modules/surgery/eye_surgery.dm
+++ b/code/modules/surgery/eye_surgery.dm
@@ -10,7 +10,7 @@
name = "fix eyes"
implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 45, /obj/item/pen = 25)
time = 64
- experience_given = 5
+ experience_given = (MEDICAL_SKILL_ORGAN_FIX*0.6) //repeatable and can be done at any damage
/datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target)
var/obj/item/organ/eyes/E = target.getorganslot(ORGAN_SLOT_EYES)
diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm
index 6e8e3e18015..e6f58159f5f 100644
--- a/code/modules/surgery/healing.dm
+++ b/code/modules/surgery/healing.dm
@@ -1,4 +1,4 @@
-#define PER_ITERATION_XP_CAP 3 //TW XP gain scales with repeated iterations.
+#define PER_ITERATION_XP_CAP MEDICAL_SKILL_MEDIUM //TW XP gain scales with repeated iterations so we cap it.
/datum/surgery/healing
steps = list(/datum/surgery_step/incise,
@@ -28,7 +28,6 @@
implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 65, /obj/item/pen = 55)
repeatable = TRUE
time = 25
- experience_given = 1 //scales with repeated iterations
var/brutehealing = 0
var/burnhealing = 0
var/missinghpbonus = 0 //heals an extra point of damager per X missing damage of type (burn damage for burn healing, brute for brute). Smaller Number = More Healing!
@@ -50,11 +49,11 @@
/datum/surgery_step/heal/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE)
if(..())
- experience_given = min(experience_given+0.25,PER_ITERATION_XP_CAP)
+ experience_given = min(experience_given+1,PER_ITERATION_XP_CAP)
while((brutehealing && target.getBruteLoss()) || (burnhealing && target.getFireLoss()))
if(!..())
break
- experience_given = min(experience_given+0.25,PER_ITERATION_XP_CAP)
+ experience_given = min(experience_given+1,PER_ITERATION_XP_CAP)
/datum/surgery_step/heal/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
var/umsg = "You succeed in fixing some of [target]'s wounds" //no period, add initial space to "addons"
diff --git a/code/modules/surgery/hepatectomy.dm b/code/modules/surgery/hepatectomy.dm
index ed04b918f03..c55db698c67 100644
--- a/code/modules/surgery/hepatectomy.dm
+++ b/code/modules/surgery/hepatectomy.dm
@@ -24,7 +24,7 @@
implements = list(TOOL_SCALPEL = 95, /obj/item/melee/transforming/energy/sword = 65, /obj/item/kitchen/knife = 45,
/obj/item/shard = 35)
time = 52
- experience_given = 10
+ experience_given = (MEDICAL_SKILL_ORGAN_FIX*0.8) //repeatable so not as much xp
/datum/surgery_step/hepatectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "You begin to cut out a damaged peice of [target]'s liver...",
diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm
index 2597464ea59..66658cf47a2 100644
--- a/code/modules/surgery/implant_removal.dm
+++ b/code/modules/surgery/implant_removal.dm
@@ -10,6 +10,7 @@
name = "extract implant"
implements = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 65)
time = 64
+ experience_given = MEDICAL_SKILL_MEDIUM
var/obj/item/implant/I = null
/datum/surgery_step/extract_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm
index 1ba0464fa7e..db53ad47aea 100644
--- a/code/modules/surgery/limb_augmentation.dm
+++ b/code/modules/surgery/limb_augmentation.dm
@@ -8,7 +8,7 @@
name = "replace limb"
implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100)
time = 32
- experience_given = 10
+ experience_given = MEDICAL_SKILL_MEDIUM
var/obj/item/bodypart/L = null // L because "limb"
diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm
index 3b164188fdc..2c3ea560cd2 100644
--- a/code/modules/surgery/lipoplasty.dm
+++ b/code/modules/surgery/lipoplasty.dm
@@ -14,7 +14,6 @@
name = "cut excess fat"
implements = list(TOOL_SAW = 100, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25)
time = 64
- experience_given = 2
/datum/surgery_step/cut_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] begins to cut away [target]'s excess fat.", "You begin to cut away [target]'s excess fat...")
@@ -48,7 +47,7 @@
var/removednutriment = target.nutrition
target.set_nutrition(NUTRITION_LEVEL_WELL_FED)
removednutriment -= NUTRITION_LEVEL_WELL_FED //whatever was removed goes into the meat
- experience_given = (round(removednutriment/30))
+ experience_given = (round(removednutriment/(MEDICAL_SKILL_EASY*5)))
var/mob/living/carbon/human/H = target
var/typeofmeat = /obj/item/reagent_containers/food/snacks/meat/slab/human
diff --git a/code/modules/surgery/lobectomy.dm b/code/modules/surgery/lobectomy.dm
index 156c1ab4913..6ca80fe13c7 100644
--- a/code/modules/surgery/lobectomy.dm
+++ b/code/modules/surgery/lobectomy.dm
@@ -18,7 +18,7 @@
implements = list(TOOL_SCALPEL = 95, /obj/item/melee/transforming/energy/sword = 65, /obj/item/kitchen/knife = 45,
/obj/item/shard = 35)
time = 42
- experience_given = 10
+ experience_given = MEDICAL_SKILL_ORGAN_FIX
/datum/surgery_step/lobectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "You begin to make an incision in [target]'s lungs...",
diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm
index e02df6b395f..340236ccc22 100644
--- a/code/modules/surgery/organ_manipulation.dm
+++ b/code/modules/surgery/organ_manipulation.dm
@@ -67,7 +67,7 @@
/datum/surgery_step/manipulate_organs
time = 64
name = "manipulate organs"
- repeatable = 1
+ repeatable = TRUE
implements = list(/obj/item/organ = 100, /obj/item/organ_storage = 100)
var/implements_extract = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 55)
var/current_type
diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm
index 8196217ee4b..7768846ff7e 100644
--- a/code/modules/surgery/organic_steps.dm
+++ b/code/modules/surgery/organic_steps.dm
@@ -103,7 +103,7 @@
/datum/surgery_step/saw
name = "saw bone"
implements = list(TOOL_SAW = 100,/obj/item/melee/arm_blade = 75,
- /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25)
+ /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25, /obj/item = 20) //20% success (sort of) with any sharp item with a force>=10
time = 54
/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -111,7 +111,12 @@
"[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].",
"[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].")
-/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
+/datum/surgery_step/saw/tool_check(mob/user, obj/item/tool)
+ if(implement_type == /obj/item && !(tool.get_sharpness() && (tool.force >= 10)))
+ return FALSE
+ return TRUE
+
+/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results)
target.apply_damage(50, BRUTE, "[target_zone]")
display_results(user, target, "You saw [target]'s [parse_zone(target_zone)] open.",
"[user] saws [target]'s [parse_zone(target_zone)] open!",
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index dcb11a7b567..15a51392606 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -164,10 +164,10 @@
desc = "A sleek, sturdy box."
icon_state = "cyber_implants"
var/list/boxed = list(
- /obj/item/autosurgeon/thermal_eyes,
- /obj/item/autosurgeon/xray_eyes,
- /obj/item/autosurgeon/anti_stun,
- /obj/item/autosurgeon/reviver)
+ /obj/item/autosurgeon/syndicate/thermal_eyes,
+ /obj/item/autosurgeon/syndicate/xray_eyes,
+ /obj/item/autosurgeon/syndicate/anti_stun,
+ /obj/item/autosurgeon/syndicate/reviver)
var/amount = 5
/obj/item/storage/box/cyber_implants/PopulateContents()
diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm
index fe4e7965d21..13bb0fb46ee 100644
--- a/code/modules/surgery/organs/autosurgeon.dm
+++ b/code/modules/surgery/organs/autosurgeon.dm
@@ -12,6 +12,10 @@
var/uses = INFINITE
var/starting_organ
+/obj/item/autosurgeon/syndicate
+ name = "suspicious autosurgeon"
+ icon_state = "syndicate_autoimplanter"
+
/obj/item/autosurgeon/Initialize(mapload)
. = ..()
if(starting_organ)
@@ -82,15 +86,19 @@
uses = 1
starting_organ = /obj/item/organ/cyberimp/eyes/hud/medical
+/obj/item/autosurgeon/syndicate/laser_arm
+ desc = "A single use autosurgeon that contains a combat arms-up laser augment. A screwdriver can be used to remove it, but implants can't be placed back in."
+ uses = 1
+ starting_organ = /obj/item/organ/cyberimp/arm/gun/laser
-/obj/item/autosurgeon/thermal_eyes
+/obj/item/autosurgeon/syndicate/thermal_eyes
starting_organ = /obj/item/organ/eyes/robotic/thermals
-/obj/item/autosurgeon/xray_eyes
+/obj/item/autosurgeon/syndicate/xray_eyes
starting_organ = /obj/item/organ/eyes/robotic/xray
-/obj/item/autosurgeon/anti_stun
+/obj/item/autosurgeon/syndicate/anti_stun
starting_organ = /obj/item/organ/cyberimp/brain/anti_stun
-/obj/item/autosurgeon/reviver
+/obj/item/autosurgeon/syndicate/reviver
starting_organ = /obj/item/organ/cyberimp/chest/reviver
diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm
index 135008f3f0b..0e64a08b349 100644
--- a/code/modules/surgery/plastic_surgery.dm
+++ b/code/modules/surgery/plastic_surgery.dm
@@ -8,7 +8,7 @@
name = "reshape face"
implements = list(TOOL_SCALPEL = 100, /obj/item/kitchen/knife = 50, TOOL_WIRECUTTER = 35)
time = 64
- experience_given = 5
+ experience_given = MEDICAL_SKILL_MEDIUM
/datum/surgery_step/reshape_face/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] begins to alter [target]'s appearance.", "You begin to alter [target]'s appearance...")
diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm
index 5f262b40709..0b701d194fc 100644
--- a/code/modules/surgery/prosthetic_replacement.dm
+++ b/code/modules/surgery/prosthetic_replacement.dm
@@ -19,7 +19,7 @@
name = "add prosthetic"
implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100, /obj/item/twohanded/required/chainsaw = 100, /obj/item/melee/synthetic_arm_blade = 100)
time = 32
- experience_given = 5 //won't get full XP if rejected
+ experience_given = MEDICAL_SKILL_ORGAN_FIX //won't get full XP if rejected
var/organ_rejection_dam = 0
/datum/surgery_step/add_prosthetic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm
index 30e08da31be..39f9bcfff54 100644
--- a/code/modules/surgery/remove_embedded_object.dm
+++ b/code/modules/surgery/remove_embedded_object.dm
@@ -8,7 +8,7 @@
name = "remove embedded objects"
time = 32
accept_hand = 1
- experience_given = 5
+ experience_given = MEDICAL_SKILL_MEDIUM
var/obj/item/bodypart/L = null
@@ -40,6 +40,7 @@
display_results(user, target, "You successfully remove [objects] objects from [H]'s [L.name].",
"[user] successfully removes [objects] objects from [H]'s [L]!",
"[user] successfully removes [objects] objects from [H]'s [L]!")
+ experience_given = MEDICAL_SKILL_MEDIUM*(objects*0.75)
else
to_chat(user, "You find no objects embedded in [H]'s [L]!")
diff --git a/code/modules/surgery/stomachpump.dm b/code/modules/surgery/stomachpump.dm
index 6e844940ce2..63bdfedff9d 100644
--- a/code/modules/surgery/stomachpump.dm
+++ b/code/modules/surgery/stomachpump.dm
@@ -11,6 +11,7 @@
possible_locs = list(BODY_ZONE_CHEST)
requires_bodypart_type = TRUE
ignore_clothes = FALSE
+ var/accumulated_experience = 0
/datum/surgery/stomach_pump/can_start(mob/user, mob/living/carbon/target)
var/obj/item/organ/stomach/S = target.getorganslot(ORGAN_SLOT_STOMACH)
@@ -28,6 +29,7 @@
accept_hand = TRUE
repeatable = TRUE
time = 20
+ experience_given = 0
/datum/surgery_step/stomach_pump/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "You begin pumping [target]'s stomach...",
@@ -37,10 +39,16 @@
/datum/surgery_step/stomach_pump/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
if(ishuman(target))
var/mob/living/carbon/human/H = target
+ var/reagents_volume_before_pump = H.reagents.total_volume
display_results(user, target, "[user] forces [H] to vomit, cleansing their stomach of some chemicals!",
"[user] forces [H] to vomit, cleansing their stomach of some chemicals!",
"[user] forces [H] to vomit!")
H.vomit(20, FALSE, TRUE, 1, TRUE, FALSE, purge = TRUE) //called with purge as true to lose more reagents
+ if(istype(surgery,/datum/surgery/stomach_pump))
+ var/datum/surgery/stomach_pump/stom_pump = surgery
+ if(stom_pump.accumulated_experience > MEDICAL_SKILL_MEDIUM*10) //capped so you can't dope bodies and purge for ezxp
+ experience_given = (H.reagents.total_volume - reagents_volume_before_pump)/(MEDICAL_SKILL_MEDIUM)
+ stom_pump.accumulated_experience += experience_given
return ..()
/datum/surgery_step/stomach_pump/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm
index 95507477c33..da43e384032 100644
--- a/code/modules/surgery/surgery_step.dm
+++ b/code/modules/surgery/surgery_step.dm
@@ -10,7 +10,7 @@
var/require_all_chems = TRUE //any on the list or all on the list?
var/silicons_obey_prob = FALSE
/// The amount of a experience given for successfully completing the step.
- var/experience_given = 1
+ var/experience_given = MEDICAL_SKILL_EASY
/datum/surgery_step/proc/try_op(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE)
var/success = FALSE
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 16a2b156cf6..b5dafecf530 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -632,6 +632,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
surplus = 10
exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
+/datum/uplink_item/stealthy_weapons/holster
+ name = "Syndicate Holster"
+ desc = "A useful little device that allows for inconspicuous carrying of guns using chameleon technology. It also allows for badass gun-spinning."
+ item = /obj/item/storage/belt/holster/chameleon
+ cost = 1
+
// Ammunition
/datum/uplink_item/ammo
category = "Ammunition"
@@ -841,10 +847,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 1
include_modes = list(/datum/game_mode/nuclear)
-/datum/uplink_item/ammo/dark_gygax/bag
- name = "Dark Gygax Ammo Bag"
- desc = "A duffel bag containing ammo for three full reloads of the incendiary carbine and flash bang launcher that are equipped on a standard Dark Gygax exosuit."
- item = /obj/item/storage/backpack/duffelbag/syndie/ammo/dark_gygax
+/datum/uplink_item/ammo/mech/bag
+ name = "Mech Support Kit Bag"
+ desc = "A duffel bag containing ammo for four full reloads of the scattershotm which is equipped on standard Dark Gygax and Mauler exosuits. Also comes with some support equipment for maintaining the mech, including tools and an inducer."
+ item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mech
cost = 4
include_modes = list(/datum/game_mode/nuclear)
@@ -1491,7 +1497,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/implants/antistun
name = "CNS Rebooter Implant"
desc = "This implant will help you get back up on your feet faster after being stunned. Comes with an autosurgeon."
- item = /obj/item/autosurgeon/anti_stun
+ item = /obj/item/autosurgeon/syndicate/anti_stun
cost = 12
surplus = 0
include_modes = list(/datum/game_mode/nuclear)
@@ -1532,7 +1538,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/implants/reviver
name = "Reviver Implant"
desc = "This implant will attempt to revive and heal you if you lose consciousness. Comes with an autosurgeon."
- item = /obj/item/autosurgeon/reviver
+ item = /obj/item/autosurgeon/syndicate/reviver
cost = 8
surplus = 0
include_modes = list(/datum/game_mode/nuclear)
@@ -1554,7 +1560,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/implants/thermals
name = "Thermal Eyes"
desc = "These cybernetic eyes will give you thermal vision. Comes with a free autosurgeon."
- item = /obj/item/autosurgeon/thermal_eyes
+ item = /obj/item/autosurgeon/syndicate/thermal_eyes
cost = 8
surplus = 0
include_modes = list(/datum/game_mode/nuclear)
@@ -1572,7 +1578,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/implants/xray
name = "X-ray Vision Implant"
desc = "These cybernetic eyes will give you X-ray vision. Comes with an autosurgeon."
- item = /obj/item/autosurgeon/xray_eyes
+ item = /obj/item/autosurgeon/syndicate/xray_eyes
cost = 10
surplus = 0
include_modes = list(/datum/game_mode/nuclear)
@@ -1786,6 +1792,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/storage/box/hug/reverse_revolver
restricted_roles = list("Clown")
+/datum/uplink_item/role_restricted/laser_arm
+ name = "Laser Arm Implant"
+ desc = "An implant that grants you a recharging laser gun inside your arm. Weak to EMPs. Comes with a syndicate autosurgeon for immediate self-application."
+ cost = 10
+ item = /obj/item/autosurgeon/syndicate/laser_arm
+ restricted_roles = list("Roboticist")
+
+
// Pointless
/datum/uplink_item/badass
category = "(Pointless) Badassery"
diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm
index 97ed066420d..8344aa045f1 100644
--- a/code/modules/vehicles/secway.dm
+++ b/code/modules/vehicles/secway.dm
@@ -8,6 +8,13 @@
key_type = /obj/item/key/security
integrity_failure = 0.5
+
+
+ ///This stores a banana that, when used on the secway, prevents the vehicle from moving until it is removed.
+ var/obj/item/reagent_containers/food/snacks/grown/banana/eddie_murphy
+ ///When jammed with a banana, the secway will make a stalling sound. This stores the last time it made a sound to prevent spam.
+ var/stall_cooldown
+
/obj/vehicle/ridden/secway/Initialize()
. = ..()
var/datum/component/riding/D = LoadComponent(/datum/component/riding)
@@ -36,8 +43,42 @@
if(obj_integrity == max_integrity)
to_chat(user, "It looks to be fully repaired now.")
return TRUE
+
+ if(istype(W, /obj/item/reagent_containers/food/snacks/grown/banana))
+ // ignore the occupants because they're presumably too distracted to notice the guy stuffing fruit into their vehicle's exhaust. do segways have exhausts? they do now!
+ user.visible_message("[user] begins stuffing [W] into [src]'s tailpipe.", "You begin stuffing [W] into [src]'s tailpipe...", ignored_mobs = occupants)
+ if(do_after(user, 30, TRUE, src))
+ if(user.transferItemToLoc(W, src))
+ user.visible_message("[user] stuffs [W] into [src]'s tailpipe.", "You stuff [W] into [src]'s tailpipe.", ignored_mobs = occupants)
+ eddie_murphy = W
+ return TRUE
return ..()
+/obj/vehicle/ridden/secway/attack_hand(mob/living/user)
+ if(eddie_murphy) // v lol
+ user.visible_message("[user] begins cleaning [eddie_murphy] out of [src].", "You begin cleaning [eddie_murphy] out of [src]...")
+ if(do_after(user, 60, target = src))
+ user.visible_message("[user] cleans [eddie_murphy] out of [src].", "You manage to get [eddie_murphy] out of [src].")
+ eddie_murphy.forceMove(drop_location())
+ eddie_murphy = null
+ return
+ return ..()
+
+/obj/vehicle/ridden/secway/driver_move(mob/user, direction)
+ if(is_key(inserted_key) && eddie_murphy)
+ if(stall_cooldown + 10 < world.time)
+ visible_message("[src] sputters and refuses to move!")
+ playsound(src, "sound/effects/stall.ogg", 70)
+ stall_cooldown = world.time
+ return FALSE
+ return ..()
+
+/obj/vehicle/ridden/secway/examine(mob/user)
+ . = ..()
+
+ if(eddie_murphy)
+ . += "Something appears to be stuck in its exhaust..."
+
/obj/vehicle/ridden/secway/obj_destruction()
explosion(src, -1, 0, 2, 4, flame_range = 3)
return ..()
diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm
index dd5a4b325dc..0c611a273bf 100644
--- a/code/modules/vehicles/speedbike.dm
+++ b/code/modules/vehicles/speedbike.dm
@@ -71,7 +71,7 @@
if(A.density && has_buckled_mobs())
var/atom/throw_target = get_edge_target_turf(A, dir)
if(crash_all)
- if(ismovableatom(A))
+ if(ismovable(A))
var/atom/movable/AM = A
AM.throw_at(throw_target, 4, 3)
visible_message("[src] crashes into [A]!")
diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm
index d75c4426559..da517e4ff7f 100644
--- a/code/modules/vending/autodrobe.dm
+++ b/code/modules/vending/autodrobe.dm
@@ -114,7 +114,6 @@
/obj/item/clothing/head/cueball = 1,
/obj/item/clothing/under/suit/white_on_white = 1,
/obj/item/clothing/under/costume/sailor = 1,
- /obj/item/clothing/ears/headphones = 2,
/obj/item/clothing/head/delinquent = 1,
/obj/item/clothing/head/wig/random = 3,
/obj/item/clothing/head/shrine_wig = 1,
@@ -126,7 +125,7 @@
/obj/item/gohei = 1)
contraband = list(/obj/item/clothing/suit/judgerobe = 1,
/obj/item/clothing/head/powdered_wig = 1,
- /obj/item/gun/magic/wand = 2,
+ /obj/item/gun/magic/wand/nothing = 2,
/obj/item/clothing/glasses/sunglasses/garb = 2,
/obj/item/clothing/glasses/blindfold = 1,
/obj/item/clothing/mask/muzzle = 2)
diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm
index 45867d5ec02..504a3572f8c 100644
--- a/code/modules/vending/clothesmate.dm
+++ b/code/modules/vending/clothesmate.dm
@@ -46,7 +46,6 @@
/obj/item/storage/belt/fannypack = 3,
/obj/item/storage/belt/fannypack/blue = 3,
/obj/item/storage/belt/fannypack/red = 3,
- /obj/item/clothing/ears/headphones = 2,
/obj/item/clothing/under/misc/overalls = 2,
/obj/item/clothing/under/pants/jeans = 2,
/obj/item/clothing/under/pants/classicjeans = 2,
@@ -127,7 +126,7 @@
/obj/item/clothing/under/pants/mustangjeans = 1,
/obj/item/clothing/neck/necklace/dope = 3,
/obj/item/clothing/suit/jacket/letterman_nanotrasen = 1,
- /obj/item/clothing/ears/earmuffs/spacepods = 1)
+ /obj/item/instrument/piano_synth/headphones/spacepods = 1)
refill_canister = /obj/item/vending_refill/clothing
default_price = 60
extra_price = 120
diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm
index ebc14a74e46..24a4744a7ec 100644
--- a/code/modules/vending/games.dm
+++ b/code/modules/vending/games.dm
@@ -8,6 +8,7 @@
/obj/item/toy/cards/deck/cas = 3,
/obj/item/toy/cards/deck/cas/black = 3,
/obj/item/hourglass = 2,
+ /obj/item/instrument/piano_synth/headphones = 4,
/obj/item/camera = 3)
contraband = list(/obj/item/dice/fudge = 9)
premium = list(/obj/item/melee/skateboard/pro = 3,
diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm
index 4b76ce03d1b..cf574c2fda6 100644
--- a/code/modules/vending/medical.dm
+++ b/code/modules/vending/medical.dm
@@ -36,7 +36,8 @@
/obj/item/sensor_device = 2,
/obj/item/pinpointer/crew = 2,
/obj/item/storage/firstaid/advanced = 2,
- /obj/item/shears = 1)
+ /obj/item/shears = 1,
+ /obj/item/plunger/reinforced = 2)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/medical
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index e4ef90ff75b..51446c8c980 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -283,6 +283,7 @@
/obj/item/clothing/under/rank/civilian/janitor/skirt = 2,
/obj/item/clothing/gloves/color/black = 2,
/obj/item/clothing/head/soft/purple = 2,
+ /obj/item/twohanded/broom = 2,
/obj/item/paint/paint_remover = 2,
/obj/item/melee/flyswatter = 2,
/obj/item/flashlight = 2,
diff --git a/config/config.txt b/config/config.txt
index 4cd17022a6a..d61d9b0f4a6 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -381,12 +381,6 @@ MAPROTATION
## When it's set to zero, the map will be randomly picked each round
PREFERENCE_MAP_VOTING 1
-## Map rotate chance delta
-## This is the chance of map rotation factored to the round length.
-## A value of 1 would mean the map rotation chance is the round length in minutes (hour long round == 60% rotation chance)
-## A value of 0.5 would mean the map rotation chance is half of the round length in minutes (hour long round == 30% rotation chance)
-#MAPROTATIONCHANCEDELTA 0.75
-
## AUTOADMIN
## The default admin rank
AUTOADMIN_RANK Game Master
diff --git a/config/game_options.txt b/config/game_options.txt
index 91b406be709..2e555cef8d0 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -249,6 +249,9 @@ MAX_TICKETS_PER_ROLL 100
## Uncomment to allow players to see the set odds of different rounds in secret/random in the get server revision screen. This will NOT tell the current roundtype.
#SHOW_GAME_TYPE_ODDS
+## Uncomment to prevent the nuclear operative leader from getting the war declaration item
+#DISABLE_WAROPS
+
## Uncomment to enable dynamic ruleset config file.
DYNAMIC_CONFIG_ENABLED
@@ -566,5 +569,8 @@ MONKEYCAP 64
## A cap on how many mice can be bred via cheese wedges
RATCAP 64
+## Maximum fine for a citation
+MAXFINE 2000
+
## Enable the capitalist agenda on your server.
ECONOMY
diff --git a/dependencies.sh b/dependencies.sh
index 488504b2887..4a950af3146 100755
--- a/dependencies.sh
+++ b/dependencies.sh
@@ -23,4 +23,4 @@ export NODE_VERSION=12
export PHP_VERSION=5.6
# SpacemanDMM git tag
-export SPACEMAN_DMM_VERSION=suite-1.2
+export SPACEMAN_DMM_VERSION=suite-1.3
diff --git a/html/changelog.html b/html/changelog.html
index 4775b242e2a..6dfe744a0c3 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -51,6 +51,537 @@
-->
+
19 February 2020
+
ATHATH updated:
+
+
All sharp items that have a force greater than or equal to 10 can be used to perform the saw bone surgery step with ghetto surgery, but they'll have a low success rate/step speed when doing so.
+
The biogenerator can now produce soy milk.
+
+
ArcaneMusic updated:
+
+
A new space ruin has been located in your sector. The previous owners have dubbed the place "The Hell Factory", despite the region being designated as an alcohol bottling facility.
+
Fixes accidentally reverting the puzzles/trapmaking tools PR.
+
The Syndicate has recently begun targeting a recently declassified piece of Nanotrasen hardware, the blackbox, located within the blackbox recorder on each station's telecommunication's array.
+
Human organs can once again be sold on the black market.
+
+
Arkatos updated:
+
+
Added broken chameleon belt to the broken chameleon kit.
+
Radioactive Microlaser now uses tgui.
+
+
Bokkiewokkie updated:
+
+
Fixes writing being on paper bags and some ammo boxes
+
+
Buggy123 updated:
+
+
fuck
+
+
Capsandi updated:
+
+
added a new mortar sprite
+
+
Dennok updated:
+
+
Now MultiZ Debug connected to neighbor space, in strange way.
+
+
EOBGames updated:
+
+
A few minor map fixes.
+
There's now enough medhuds in storage for everyone in med (except you, chemists).
+
+
Fikou updated:
+
+
glockroach
+
You can now choose your name and color as a holoparasite/guardian/holocarp!
+
Miner holoparasites are now hivelords!
+
fixes lings being able to get mechanical holoparasites
+
+
Iamgoofball updated:
+
+
You son of a bitch! I'm in.
+
+
Improvedname & JustRandomGuy updated:
+
+
Adds the syndicate laserarm implant to roboticist traitors
+
Syndicate implants now come in a suspicous autosurgeon
+
+
JAremko updated:
+
+
Added pyroclastic anomaly slime policy key
+
Fixed anomaly slime role
+
Now anomaly slimes can reproduce like other slimes do
+
+
JDawg1290 updated:
+
+
mech construction refactored
+
+
JJRcop updated:
+
+
Stasis now supports multiple sources.
+
+
Mickyan updated:
+
+
Added the broom. For sweeping.
+
Tweaked paramedic loadout, moved pinpointer to medical belt, moved medipen to suit storage
+
Cleaning messes with the mop and soap now correctly awards cleaning experience
+
+
NecromancerAnne and Kyrsonism updated:
+
+
Redid the claymore sprites to look a little better.
+
+
NikNak updated:
+
+
The powercrepe has been buffed
+
+
RaveRadbury updated:
+
+
Bottles and Flasks provide 5u on every gulp.
+
+
Skoglol updated:
+
+
Forced a basic keybind reset for everyone to fix some inconsistencies from various savefiles, as well as making the hotkey/classic toggle in game options work. Your emote keybinds should be untouched.
+
+
TheVekter updated:
+
+
Added the Vibebot
+
+
Thunder12345 updated:
+
+
Cult sacrifice objective now tells you to use Offer instead of a non-existent Sacrifice rune
+
Added missing attached tank sprites for TTVs
+
+
Time-Green updated:
+
+
Adds geysers to lavaland! They can be activated by using a reinforced plunger found in the medical vendor. They can be harvested by using a new plumbing device, magically powered liquid pumps!
+
Adds Hollow Water to geysers, wich can be combined with Holy Water as catalyst for more Holy Water
+
Adds Protozine to geyers, a very weak version of Omnizine. Can be used in Strange Reagent mixing
+
Adds Wittel, a very rare geyser chem. Can be processed into gravitum, wich removes gravity. Can also be processed into metalgen, wich has a strange tendency to transform objects into the imprinted material.
+
+
XDTM updated:
+
+
Added a new special brain trauma, Quantum Alignment.
+
Added the Enhanced Interrogation Chamber as a BEPIS researchable tech.
+
The EIC can be used to implant trigger phrases in subjects that cause an instant hypnotic trance.
+
+
cacogen updated:
+
+
RCD can now deconstruct airlock assemblies and firelock frames
+
Stun batons now respect shields again (e.g. riot shields, the wizard's shielded hardsuit)
+
Stun baton attacks that should've been stopped by clumsiness no longer go through
+
+
itseasytosee updated:
+
+
Having a holster now allows you to flip a gun on your fingers. Use in hand. If you want to eject your bullets repeat
+
The syndicate chameleon holster. Costs 1 tc and can be made to look like any belt. Stores all your fun shooty sticks
+
Operative holster, a free alternative to tactical webbing for storing two guns in a belt slot instead of alot of small items.
+
New drink! The Hivemind eraser. Can be made with two parts black Russian one part thirteen-loko and one part grenadine.
+
+
necromanceranne updated:
+
+
Removes the stun from Krav Maga and makes it a high duration knockdown with stamina damage (20-30), respecting chest armor for the damage.
+
Disarm intent is now a nonlethal jab that does (5-10) stamina damage. If used on people who are prone, it does (10-15) stamina damage. It also has a chance to completely disarm someone based on the amount of stamina damage they have.
+
Krav Maga harm stomps/punches now respect armor and have a variance of (5-10) for punches and (5-10+5) for stomps.
+
+
nightred updated:
+
+
Turn night mode off or on when the APC is locked
+
space suit turns off properly when there is no cell inserted
+
space ninja can now turn on the heater in the suit
+
space ninja can recharge properly
+
space suit now uses the cell as intended
+
+
plapatin updated:
+
+
Nanotrasen-brand spacepods can play music just like headphones now.
+
+
stylemistake updated:
+
+
Removed tgui
+
tgui-next is now the new tgui
+
Updated "interface not found" screen.
+
+
wesoda25 updated:
+
+
Gondola Asteroid is grassy now, also has some puddles
+
+
with thanks to HugBug and Buggy for helping with bug-squashing updated:
+
+
The effect of gas comp will now spin up and down, rather then jumping. Play around, don't break anything.
+
Fixed low pressure hell SMs
+
Allows var editing of SM gas rad effects
+
+
yeeyeh updated:
+
+
Nanotrasen's research division's recent science fair has given light to an amazing, electrically-insulated compound that can be sprayed directly onto the skin. The initial idea was for footwear, but we all know what you're really going to do with it. Research can be continued at your station's B.E.P.I.S. unit.
+
+
+
15 February 2020
+
BadSS13Player updated:
+
+
The Exosuit Fabricator's sync with R&D operation is now instant.
+
+
Buggy123 updated:
+
+
Random mineral turfs no longer cause large amounts of turf changes on initialization.
+
+
Cobby updated:
+
+
Buffs Surgery XP values
+
+
Krysonism updated:
+
+
The Cosa Nostra starter pack has been added to cargo as a contraband crate.
+
Added pictures of the virgin mary, burning one of these will let you pick a mafia nickname.
+
The beige suit, beige fedora and white fedora clothing items have been added to the game.
+
The non-job fedoras and the white suit have been resprited.
+
+
Skoglol updated:
+
+
Unhusking someone with synthflesh will no longer tell everyone they were the one to fix the corpse.
+
+
XDTM updated:
+
+
Fixed nanite shutdown timer not properly shutting down nanites.
+
+
actioninja updated:
+
+
tgui-next for NTOS: AI restorer, File Manager, NetDOS, Net Monitor, and Revelation
+
Creation of TXT Files on modular computer has been indefinitely removed
+
Due to architecture concerns, NTNet Transfer has been indefinitely removed from NTOS hardware.
+
+
nianjiilical updated:
+
+
Some weird shit happened in space, and now Ethereals are appearing in new colors. Scientists are baffled.
+
+
nightred updated:
+
+
Space Suits warm the wearer, and use Cells
+
Suit Storage charges Space Suits
+
EMP's cause Hard Suit's to burn the wearer
+
Engineering now has emp proof cells with the suits
+
Hud status for space suit power level
+
ERT hardsuits get EMP protection AND ONLY THEM
+
+
+
14 February 2020
+
Arkatos updated:
+
+
Infrared emitter now uses tgui-next.
+
Proximity sensor now uses tgui-next.
+
Geneticist now uses science selection color in the preferences menu.
+
+
Capsandi updated:
+
+
Fixed grammar in death-nettle attack and pickup messages
+
+
EOBGames updated:
+
+
The Lavaland Gulag has been rebuilt following repeated complaints about 'human rights violations'.
+
A hawaiian shirt, currently only in the beach bum ruin.
+
Fixed a couple of issues with the beach bum ruin.
+
+
Fikou updated:
+
+
the nuke op leader having access to the war declaration item is now a config
+
+
Mickyan updated:
+
+
Headphones can now play custom music
+
Moved headphones to the games vendor in the library
+
Added support for instruments with custom effects triggered by playing
+
+
Putnam and ninjanomnom updated:
+
+
Radioactive contamination now has a limited amount of material to be used to contaminate things.
+
+
Ryll/Shaps updated:
+
+
You can now sabotage secways by stuffing a banana in their tailpipe.
+
+
actioninja updated:
+
+
Traitor Uplink buy buttons properly disable when you don't have enough TC again
+
+
cacogen updated:
+
+
Soil no longer renames itself hydroponics tray while something is planted in it
+
Hydroponics planter names will update when weeds are mutated
+
Planters no longer change description to match that of what's planted in them
+
+
necromanceranne updated:
+
+
A mech support bag.
+
Combat wrench.
+
Made the dark gygax significantly better by adjusting equipment and stats.
+
+
nemvar updated:
+
+
Replaced the effect of the "two left feet" mutation with random knockdowns while moving.
+
+
+
13 February 2020
+
Arkatos updated:
+
+
HUDs for various simple mobs are now cleaner and consistent with each other.
+
+
Buggy123 updated:
+
+
Beware! The Syndicate have upgraded their stolen teleportation machinery, they are now capable of providing reinforcements to their elite operatives nearly anywhere, even in the middle of combat! Not that that would be wise, to say the least.
+
+
Dennok updated:
+
+
After rigorous training, Nanotrasen zoologists have observed a rise in the level of effectiveness with which non-sentient monkeys utilise certain hand-to-hand weapons.
+
+
Denton updated:
+
+
Moved duplicate CID/IP logging from log_access to log_admin_private.
+
+
Dingo-Dongler updated:
+
+
Examining people with sechuds will let you give someone an on the spot citation.
+
+
MMMiracles updated:
+
+
Multi-Z power relays can repaired but must be manually updated with a multi-tool when reinstalling/moving around.
+
+
PKPenguin321 updated:
+
+
Salt piles now get kicked around and eventually scattered to the wind when ran over too much.
+
+
Skoglol updated:
+
+
Initial ahelps are now multiline too.
+
Contractor tablet should now properly let you shop for rep.
+
+
Tlaltecuhtli updated:
+
+
adds medipen refiller machine
+
+
cacogen updated:
+
+
Swapped positions of Meta Morgue and chem factory
+
Resized the space now taken up by Meta chem factory to be slightly larger
+
Made Meta Morgue smaller
+
Moved Meta maint bar above the new Morgue where rest of the chem factory was
+
Moved Meta medbay alcove with NanoMed to opposite side of hall
+
Moved Meta Medical Surplus Storeroom above Virology, off maint across from alcove
+
Two new Meta maint Storage Rooms beneath robotics
+
Unanchored solar assemblies go off-centre to indicate they need securing. Secured ones centre themselves
+
+
ike709 updated:
+
+
Taking pictures of openspace turfs works now.
+
+
itseasytosee updated:
+
+
atmos helmets now properly protect you from pepper spray and face-huggers.
+
+
nemvar updated:
+
+
Fixed an issue where unstable people could regain sanity.
+
+
nightred updated:
+
+
Hugs are warm now
+
natural_bodytemperature_stabilization is now self contained.
+
adjust_bodytemperature to allow the use of insulation and change steps
+
+
+
11 February 2020
+
ArcaneMusic updated:
+
+
Nanotrasen's research division has gone ahead and scratched all possible plans of building new sleepers for the station, due to the discovery of old sleepers injecting crew with lead acetate.
+
In unrelated news, the research division is proud to announce the all new, "party pods"! Available at your local station B.E.P.I.S. platform as a minor reward.
+
Wooden Plank Floors no longer runtime.
+
+
Arkatos updated:
+
+
Mining Vendor now uses tgui-next.
+
+
Bokkiewokkie updated:
+
+
adds box icons for tons of boxes.
+
changes the toy and shotgun ammo boxes so they're in the new art style.
+
+
Cloneby updated:
+
+
Strange Reagent now requires a set amount to revive dependent on patient wellbeing and requires an excess to heal blood and organs. Does more damage on life. Basically loses one-click wonder status UNLESS you give a considerable amount and deal with the consequences.
+
+
Coconutwarrior97 updated:
+
+
Fixes meta armory external camera by naming it properly.
+
AI can use the carp hologram again.
+
Fixes a typo in mind.dm .
+
+
Dennok updated:
+
+
Now nanites don't die from illusions and placing unpowered cable by bare hands.
+
Now MultiZ Debug map has open space under floor instead of space.
+
+
Denton updated:
+
+
Constructed display cases no longer spawn with an alarm that bolts all nearby doors.
+
+
EOBGames updated:
+
+
The Beach Biodome Lavaland ruin has been revamped. Hit the beach and catch some waves, brah!
+
Fixed a few minor map problems.
+
+
Fikou updated:
+
+
You can now make lassos with a bone and 5 sinew and make saddles from 5 leather sheets, you can also tame goliaths with lavaland food (I think you know what those 3 things mean together)
+
xenos now keep their name consistent through evolutions
+
fixes humanoid xeno numbers being 0
+
royal xenos also get numbers
+
+
JJRcop updated:
+
+
Defibs and Defibbing Nanites act the same way again.
+
Fixed removing brains from changeling husks.
+
+
Krysonism updated:
+
+
4 new ice creams created using the crafting menu,
+
You can now make popsicle sticks by sticking logs in the processor.
+
+
Mickyan updated:
+
+
Blood dripping frequency now scales with blood loss
+
Fixed blood decals occasionally containing more blood than they should
+
The Delta Station stasis room has received a makeover
+
+
NoxVS updated:
+
+
Nanotrasen has properly relabeled all cyborg limbs following their rediscovery of which direction is left and which is right
+
+
OnlineGirlfriend updated:
+
+
crushed can sprite for Sol Dry
+
Sol Dry cans can be crushed
+
salami filling color
+
salami taste
+
+
Qustinnus updated:
+
+
there is now an edible component which will allow us to deprecate our hacky methods of making things such as organs edible
+
+
RaveRadbury updated:
+
+
Removed latejoin prisoner option
+
+
ShizCalev updated:
+
+
Emitters will now remain anchored when being constructed from an anchored machine frame.
+
Emitters will now properly turn off and be unwelded if unanchored via varediting.
+
Unanchored emitters will no longer be pulled towards non-harmful simple animals (ie butterflies, cats, ect) if they click on them.
+
Fixed a scenario where emitters could start welded and be turned on, but were not properly anchored to the ground.
+
Fixed a scenario where emitters could start anchored to the ground, but had to be resecured with a wrench to get them to work properly.
+
Emitters now properly use the anchored var. The state var has been renamed to welded, and only tracks welded status.
+
The anchored emitter map subtype has been changed to a fully welded one, since all utilized instances were editted to be welded as well anyway.
+
Added a bit more examine feedback to emitters.
+
Emitters will now show how often they fire a little more accurately.
+
Attacking the Supermatter crystal with a NODROP item (ie cyborgs with literally any item, ninjas, highlanders, ect) will now dust the user.
+
Fixed spell books becoming unreadable if you moved while reading them.
+
Fixed progress bars not showing up for spell books.
+
Fixed an exploit where spell books didn't always have to be in your hand to finish reading them.
+
+
Skoglol updated:
+
+
Removes cloning from the codebase. Cloning rooms have been converted to temporary wards and storage. Experimental cloner and its ruin is also gone.
+
Replica pod seed availability reduced. No longer available in megaseed vendors, seed crate contains one seed down from three. Mutate some cabbages if you want these.
+
Say should be less likely to break when under heavy server strain.
+
Brain death is no longer a thing, no arbitrary unhealable death. Uses organ damage like the rest.
+
Brains can now be attacked again.
+
Brains no longer report you SSD if you are in the brain and not ghosted out.
+
Brains healed with mannitol now heal 2 damage per unit at a 10 unit minimum, instead of a flat 10 damage for any amount over 10 units.
+
Defib faliure feedback is now more clear and hints at how to fix it.
+
Defibs now force the ghost back.
+
Improved brain feedback, no longer reports SSD.
+
Stomach pump and brain surgery are now repeatable surgeries.
+
Removed some forgotten references to defib time of death restrictions.
+
Beakers should no longer nullspace when quick swapped or alt clicked out of certain pieces of machinery.
+
Traitor adrenals buffed slightly. Now removes knockdown on activation, increases speed slightly more and has no oxyloss damage.
+
Changeling adrenals now last 20 seconds, up from 15 seconds.
+
Dynamic revs runtime and infinite loss announcement fixed.
+
+
SteelSlayer updated:
+
+
Adds the dunkable element. Converts items who were using the dunkable var to instead use this element and removes the dunkable var.
+
Adds a new "DUNKABLE" reagent flag for reagent containers. This determines whether or not the container can have items dunked into it.
+
+
TheChosenEvilOne updated:
+
+
Foamy beer stationwide event works again.
+
+
Thebleh updated:
+
+
Bodies with souls show the defib icon on medhuds.
+
+
Tlaltecuhtli updated:
+
+
grinder chem not grinding
+
dir of grinder chem
+
+
Vondiech updated:
+
+
There is no longer a light fixture attached to an airlock in the Experimentation Lab on Metastation.
+
+
armhulen fikou gang updated:
+
+
a lot of >32x32 mobs now have icons for their health dolls
+
+
cacogen updated:
+
+
The abductor baton is now a child of the regular stun baton. There shouldn't be a functional difference.
+
You need to be an abductor to change baton modes. Seemed like an oversight
+
Fixes some typos in the abductor baton's messages
+
Both regular stun baton and abductor baton have had a lot of vars exposed pertaining to their functionality so that could come in handy I guess
+
Cybernetic implant readouts on medHUD and health analyzer are more compact and show an icon of each
+
+
improvedname updated:
+
+
Chamkits now include an chameleon belt
+
+
imsxz updated:
+
+
skateboards now buckle you after activating them in hand.
+
+
itseasytosee updated:
+
+
Three more toys to find in your local arcade cabinet! Squeaky brain, trick blindfold, and a broken radio. Collect em all!
+
Plasmamen prisoners now use the proper helmet sprite.
+
Pacifists can now use the wand of nothing.
+
Shotgun in hands are no longer broken.
+
An ancient recipe for the ultimate soap can be had by janitors that carry family heirlooms and those who crawl maintenance.
+
+
nightred updated:
+
+
plastic water bottles can now spash
+
plastic water bottle caps render properly the first time
+
Fixes pulling button location on simple mobs
+
Polymorph kicks AI's out of shells
+
Changed custom material output on examine to be on a single line
+
+
optimumtact updated:
+
+
lawyer's department backpack... is a backpack again
+
+
peoplearestrange updated:
+
+
Removed Special Verbs Tab
+
New admin button Tabs
+
+
wesoda25 updated:
+
+
You will now cough if you have lung damage (no stun).
+
+
zxaber updated:
+
+
It is now possible to use an actual defibrillator unit as a stand-in for the borg defib upgrade, allowing medical borgs to revive crew without cloning at shift start.
+
Borgs now get a message when receiving any upgrade.
+
+
02 February 2020
AffectedArc07 updated:
@@ -1324,160 +1855,6 @@
Added logging for when an Exosuit Console is used to EMP a mech.
-
-
07 December 2019
-
Arkatos updated:
-
-
Gravity Generator now uses tgui-next UI.
-
-
Denton updated:
-
-
Added an (admin only) amputation arcade subtype that dispenses wrapped gifts instead of arcade prizes.
-
-
EdgeLordExe updated:
-
-
New room: Medbay Clinic , found in between lobby and mebday 'proper' on metastation
-
Removed the office near medbay entrance
-
Increased the size of security office in medbay del:public chem fridge removed, as the old 'private' one is in now public area
-
-
Firecage updated:
-
-
Updates the energy resistance armour values on several armours and helmets.
-
Absolute pathing inserted into timsorts.
-
-
Krysonism updated:
-
-
Several new burgers.
-
Fiesta skewer, corn chips & chicken meat.
-
some old burger sprites have been replaced.
-
The ghost burger is much spookier.
-
some burger recipes have been tweaked.
-
-
PepperPrepper updated:
-
-
Nightmares/Shadowpeople can be flashed
-
-
Ryll/Shaps updated:
-
-
Adds a new admin punishment, full immersion! Full immersion means having to manually *blink, *inhale, and *exhale, or else! Are you having fun yet?
-
-
Skoglol updated:
-
-
The "Start Now" verb can now be cancelled by using it again or setting a custom pre-game delay.
-
tgui-next: Meteor shield controller
-
Mindswap no longer force ghosts the target.
-
-
TheVekter updated:
-
-
Converted the smoke machine over to tgui-next.
-
-
Tlaltecuhtli updated:
-
-
plumbing machine to grind/juice objects and put it on duct net
-
-
actioninja updated:
-
-
Glide size now scales with movespeed. 60 fps won't jitter your camera around and slower moving mobs will appear to actually be slower.
-
60 fps is now the client default
-
research director id properly gets overlays
-
Nanite extra settings display a bit better on the cloud controller
-
Boolean extra settings on nanites function properly
-
Extra settings on nanites copy properly instead of copying a literal ref
-
-
stylemistake updated:
-
-
Fixed recipe button layout in Chem Dispenser.
-
Fixed the icon on the "Save" button in Chem Dispenser.
-
ChemMaster no longer rounds volume of chemicals, allowing to package 0.1 unit pills.
-
Air Alarm layout will no longer jump around when microscopic amounts of gases are present (less than 0.01%).
-
-
-
03 December 2019
-
Bumtickley00 updated:
-
-
Buffed granibitaluri to be a better top-off healer
-
Changed granibitaluri's recipe to be easier to make
-
-
Couls updated:
-
-
Birdboat can eat anything with plastic, but he'll choke on it! Keep him away from plastic.
-
(admin-spawned) mysterious water bottles now correctly have random reagent contents and show markings without runtiming
-
-
Firecage updated:
-
-
Mining Cyborgs are now able to choose which icon they want upon picking their module. Either the Lavaland Mining Cyborg icon, the Asteroid Mining Cyborg icon, or the Spider Mining Cyborg icon.
-
Mining Cyborg Lavaproof Tracks upgrade is renamed to Mining Cyborg Lavaproof Chassis.
-
Dead Goliath Broodmother no longer constantly spawns tentacles around them.
-
Mobs which can metabolize reagents can now properly metabolize crayon powder.
-
-
GuillaumePrata updated:
-
-
The pimpin ride hook now holds the trashbag open for easier trash disposal.
-
-
Indie-ana Jones updated:
-
-
Xenobiologists have noted a change in results from the gold slime core's reaction. Creatures previously thought to be useless are also notably more unique than before.
-
-
Ryll/Shaps updated:
-
-
You can now beat on vending machines to try and knock loose free stuff! You can also almost kill yourself doing it, so it's your call if your life is worth ten bucks.
-
-
Skoglol updated:
-
-
Bureaucratic error event has new effects!
-
Admins can now pick solo abductor in traitor panel.
-
Ian has found a comfier spawnpoint on metastation.
-
-
TheVekter updated:
-
-
Reworked the entrance to Engineering on PubbyStation to give Atmos techs access to the techfab on non-skeleton shift rounds.
-
-
actioninja updated:
-
-
All nanite interfaces have been completely reworked for tgui-next
-
Plumbing Reaction Chamber uses tgui-next
-
A couple of the other plumbing uis now use the Input component of tgui-next instead of having popup windows
-
fixes some drinks such as lizard wine being uncraftable
-
-
bobbahbrown updated:
-
-
References to IRC now better describe TGS' and Discord's existence.
-
Players will now be better informed that messages are sent through TGS to IRC/Discord/etc when attempting to adminhelp with no available admins/use adminwho verb.
-
-
fludd12 updated:
-
-
The pestle for the mortar and pestle now needs metal to craft, not plasteel.
-
The mortar and pestle can now grind food and such.
-
-
nemvar updated:
-
-
Wormhole jaunters work again.
-
-
nightred updated:
-
-
Scanner Gate uses TGUI-NEXT now
-
-
oranges updated:
-
-
Budget payouts are gone
-
Felinids no longer react to cocoa
-
-
plapatin updated:
-
-
adds glockroaches, try getting them from gold slime reactions. if that guy from event hall i was talking with is reading this, i made this for you.
-
-
spookydonut updated:
-
-
jungle fever monkeys now speak monkey
-
TRAIT_NOMETABOLISM species are now immune to clone damage
-
-
zxaber updated:
-
-
Heads of staff can now connect to holopads without the other side answering the call.
-
Secure holopads, which do not allow auto-connect, have replaced holopads in a very small number of places.
-
Placements of holopads in various areas on various stations have been slightly adjusted.
-
Holopads now ping when a connection from another pad is established.
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index bb3399bae10..8a875661a77 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -36888,3 +36888,431 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- imageadd: fugu background fugu background
zxaber:
- bugfix: Positronics no longer have MMIs visually spawn on them.
+2020-02-11:
+ ArcaneMusic:
+ - rscadd: Nanotrasen's research division has gone ahead and scratched all possible
+ plans of building new sleepers for the station, due to the discovery of old
+ sleepers injecting crew with lead acetate.
+ - rscadd: In unrelated news, the research division is proud to announce the all
+ new, "party pods"! Available at your local station B.E.P.I.S. platform as a
+ minor reward.
+ - bugfix: Wooden Plank Floors no longer runtime.
+ Arkatos:
+ - rscadd: Mining Vendor now uses tgui-next.
+ Bokkiewokkie:
+ - imageadd: adds box icons for tons of boxes.
+ - imageadd: changes the toy and shotgun ammo boxes so they're in the new art style.
+ Cloneby:
+ - balance: Strange Reagent now requires a set amount to revive dependent on patient
+ wellbeing and requires an excess to heal blood and organs. Does more damage
+ on life. Basically loses one-click wonder status UNLESS you give a considerable
+ amount and deal with the consequences.
+ Coconutwarrior97:
+ - bugfix: Fixes meta armory external camera by naming it properly.
+ - bugfix: AI can use the carp hologram again.
+ - bugfix: Fixes a typo in mind.dm .
+ Dennok:
+ - bugfix: Now nanites don't die from illusions and placing unpowered cable by bare
+ hands.
+ - bugfix: Now MultiZ Debug map has open space under floor instead of space.
+ Denton:
+ - tweak: Constructed display cases no longer spawn with an alarm that bolts all
+ nearby doors.
+ EOBGames:
+ - rscadd: The Beach Biodome Lavaland ruin has been revamped. Hit the beach and catch
+ some waves, brah!
+ - bugfix: Fixed a few minor map problems.
+ Fikou:
+ - rscadd: You can now make lassos with a bone and 5 sinew and make saddles from
+ 5 leather sheets, you can also tame goliaths with lavaland food (I think you
+ know what those 3 things mean together)
+ - tweak: xenos now keep their name consistent through evolutions
+ - bugfix: fixes humanoid xeno numbers being 0
+ - tweak: royal xenos also get numbers
+ JJRcop:
+ - refactor: Defibs and Defibbing Nanites act the same way again.
+ - bugfix: Fixed removing brains from changeling husks.
+ Krysonism:
+ - rscadd: 4 new ice creams created using the crafting menu,
+ - rscadd: You can now make popsicle sticks by sticking logs in the processor.
+ Mickyan:
+ - tweak: Blood dripping frequency now scales with blood loss
+ - bugfix: Fixed blood decals occasionally containing more blood than they should
+ - tweak: The Delta Station stasis room has received a makeover
+ NoxVS:
+ - bugfix: Nanotrasen has properly relabeled all cyborg limbs following their rediscovery
+ of which direction is left and which is right
+ OnlineGirlfriend:
+ - imageadd: crushed can sprite for Sol Dry
+ - bugfix: Sol Dry cans can be crushed
+ - bugfix: salami filling color
+ - tweak: salami taste
+ Qustinnus:
+ - code_imp: there is now an edible component which will allow us to deprecate our
+ hacky methods of making things such as organs edible
+ RaveRadbury:
+ - bugfix: Removed latejoin prisoner option
+ ShizCalev:
+ - bugfix: Emitters will now remain anchored when being constructed from an anchored
+ machine frame.
+ - bugfix: Emitters will now properly turn off and be unwelded if unanchored via
+ varediting.
+ - bugfix: Unanchored emitters will no longer be pulled towards non-harmful simple
+ animals (ie butterflies, cats, ect) if they click on them.
+ - bugfix: Fixed a scenario where emitters could start welded and be turned on, but
+ were not properly anchored to the ground.
+ - bugfix: Fixed a scenario where emitters could start anchored to the ground, but
+ had to be resecured with a wrench to get them to work properly.
+ - code_imp: Emitters now properly use the anchored var. The state var has been renamed
+ to welded, and only tracks welded status.
+ - code_imp: The anchored emitter map subtype has been changed to a fully welded
+ one, since all utilized instances were editted to be welded as well anyway.
+ - rscadd: Added a bit more examine feedback to emitters.
+ - bugfix: Emitters will now show how often they fire a little more accurately.
+ - bugfix: Attacking the Supermatter crystal with a NODROP item (ie cyborgs with
+ literally any item, ninjas, highlanders, ect) will now dust the user.
+ - bugfix: Fixed spell books becoming unreadable if you moved while reading them.
+ - bugfix: Fixed progress bars not showing up for spell books.
+ - bugfix: Fixed an exploit where spell books didn't always have to be in your hand
+ to finish reading them.
+ Skoglol:
+ - rscdel: Removes cloning from the codebase. Cloning rooms have been converted to
+ temporary wards and storage. Experimental cloner and its ruin is also gone.
+ - balance: Replica pod seed availability reduced. No longer available in megaseed
+ vendors, seed crate contains one seed down from three. Mutate some cabbages
+ if you want these.
+ - bugfix: Say should be less likely to break when under heavy server strain.
+ - balance: Brain death is no longer a thing, no arbitrary unhealable death. Uses
+ organ damage like the rest.
+ - bugfix: Brains can now be attacked again.
+ - bugfix: Brains no longer report you SSD if you are in the brain and not ghosted
+ out.
+ - balance: Brains healed with mannitol now heal 2 damage per unit at a 10 unit minimum,
+ instead of a flat 10 damage for any amount over 10 units.
+ - spellcheck: Defib faliure feedback is now more clear and hints at how to fix it.
+ - tweak: Defibs now force the ghost back.
+ - spellcheck: Improved brain feedback, no longer reports SSD.
+ - balance: Stomach pump and brain surgery are now repeatable surgeries.
+ - code_imp: Removed some forgotten references to defib time of death restrictions.
+ - bugfix: Beakers should no longer nullspace when quick swapped or alt clicked out
+ of certain pieces of machinery.
+ - balance: Traitor adrenals buffed slightly. Now removes knockdown on activation,
+ increases speed slightly more and has no oxyloss damage.
+ - balance: Changeling adrenals now last 20 seconds, up from 15 seconds.
+ - bugfix: Dynamic revs runtime and infinite loss announcement fixed.
+ SteelSlayer:
+ - code_imp: Adds the dunkable element. Converts items who were using the dunkable
+ var to instead use this element and removes the dunkable var.
+ - code_imp: Adds a new "DUNKABLE" reagent flag for reagent containers. This determines
+ whether or not the container can have items dunked into it.
+ TheChosenEvilOne:
+ - bugfix: Foamy beer stationwide event works again.
+ Thebleh:
+ - tweak: Bodies with souls show the defib icon on medhuds.
+ Tlaltecuhtli:
+ - bugfix: grinder chem not grinding
+ - bugfix: dir of grinder chem
+ Vondiech:
+ - tweak: There is no longer a light fixture attached to an airlock in the Experimentation
+ Lab on Metastation.
+ armhulen fikou gang:
+ - imageadd: a lot of >32x32 mobs now have icons for their health dolls
+ cacogen:
+ - refactor: The abductor baton is now a child of the regular stun baton. There shouldn't
+ be a functional difference.
+ - tweak: You need to be an abductor to change baton modes. Seemed like an oversight
+ - spellcheck: Fixes some typos in the abductor baton's messages
+ - admin: Both regular stun baton and abductor baton have had a lot of vars exposed
+ pertaining to their functionality so that could come in handy I guess
+ - spellcheck: Cybernetic implant readouts on medHUD and health analyzer are more
+ compact and show an icon of each
+ improvedname:
+ - tweak: Chamkits now include an chameleon belt
+ imsxz:
+ - tweak: skateboards now buckle you after activating them in hand.
+ itseasytosee:
+ - rscadd: Three more toys to find in your local arcade cabinet! Squeaky brain, trick
+ blindfold, and a broken radio. Collect em all!
+ - bugfix: Plasmamen prisoners now use the proper helmet sprite.
+ - bugfix: Pacifists can now use the wand of nothing.
+ - bugfix: Shotgun in hands are no longer broken.
+ - rscadd: An ancient recipe for the ultimate soap can be had by janitors that carry
+ family heirlooms and those who crawl maintenance.
+ nightred:
+ - bugfix: plastic water bottles can now spash
+ - bugfix: plastic water bottle caps render properly the first time
+ - bugfix: Fixes pulling button location on simple mobs
+ - bugfix: Polymorph kicks AI's out of shells
+ - refactor: Changed custom material output on examine to be on a single line
+ optimumtact:
+ - tweak: lawyer's department backpack... is a backpack again
+ peoplearestrange:
+ - rscdel: Removed Special Verbs Tab
+ - admin: New admin button Tabs
+ wesoda25:
+ - tweak: You will now cough if you have lung damage (no stun).
+ zxaber:
+ - balance: It is now possible to use an actual defibrillator unit as a stand-in
+ for the borg defib upgrade, allowing medical borgs to revive crew without cloning
+ at shift start.
+ - spellcheck: Borgs now get a message when receiving any upgrade.
+2020-02-13:
+ Arkatos:
+ - tweak: HUDs for various simple mobs are now cleaner and consistent with each other.
+ Buggy123:
+ - tweak: Beware! The Syndicate have upgraded their stolen teleportation machinery,
+ they are now capable of providing reinforcements to their elite operatives nearly
+ anywhere, even in the middle of combat! Not that that would be wise, to say
+ the least.
+ Dennok:
+ - bugfix: After rigorous training, Nanotrasen zoologists have observed a rise in
+ the level of effectiveness with which non-sentient monkeys utilise certain hand-to-hand
+ weapons.
+ Denton:
+ - admin: Moved duplicate CID/IP logging from log_access to log_admin_private.
+ Dingo-Dongler:
+ - rscadd: Examining people with sechuds will let you give someone an on the spot
+ citation.
+ MMMiracles:
+ - tweak: Multi-Z power relays can repaired but must be manually updated with a multi-tool
+ when reinstalling/moving around.
+ PKPenguin321:
+ - rscadd: Salt piles now get kicked around and eventually scattered to the wind
+ when ran over too much.
+ Skoglol:
+ - admin: Initial ahelps are now multiline too.
+ - bugfix: Contractor tablet should now properly let you shop for rep.
+ Tlaltecuhtli:
+ - rscadd: adds medipen refiller machine
+ cacogen:
+ - tweak: Swapped positions of Meta Morgue and chem factory
+ - tweak: Resized the space now taken up by Meta chem factory to be slightly larger
+ - tweak: Made Meta Morgue smaller
+ - tweak: Moved Meta maint bar above the new Morgue where rest of the chem factory
+ was
+ - tweak: Moved Meta medbay alcove with NanoMed to opposite side of hall
+ - tweak: Moved Meta Medical Surplus Storeroom above Virology, off maint across from
+ alcove
+ - rscadd: Two new Meta maint Storage Rooms beneath robotics
+ - tweak: Unanchored solar assemblies go off-centre to indicate they need securing.
+ Secured ones centre themselves
+ ike709:
+ - bugfix: Taking pictures of openspace turfs works now.
+ itseasytosee:
+ - bugfix: atmos helmets now properly protect you from pepper spray and face-huggers.
+ nemvar:
+ - bugfix: Fixed an issue where unstable people could regain sanity.
+ nightred:
+ - rscadd: Hugs are warm now
+ - refactor: natural_bodytemperature_stabilization is now self contained.
+ - refactor: adjust_bodytemperature to allow the use of insulation and change steps
+2020-02-14:
+ Arkatos:
+ - rscadd: Infrared emitter now uses tgui-next.
+ - rscadd: Proximity sensor now uses tgui-next.
+ - bugfix: Geneticist now uses science selection color in the preferences menu.
+ Capsandi:
+ - spellcheck: Fixed grammar in death-nettle attack and pickup messages
+ EOBGames:
+ - rscadd: The Lavaland Gulag has been rebuilt following repeated complaints about
+ 'human rights violations'.
+ - rscadd: A hawaiian shirt, currently only in the beach bum ruin.
+ - tweak: Fixed a couple of issues with the beach bum ruin.
+ Fikou:
+ - config: the nuke op leader having access to the war declaration item is now a
+ config
+ Mickyan:
+ - tweak: Headphones can now play custom music
+ - tweak: Moved headphones to the games vendor in the library
+ - code_imp: Added support for instruments with custom effects triggered by playing
+ Putnam and ninjanomnom:
+ - balance: Radioactive contamination now has a limited amount of material to be
+ used to contaminate things.
+ Ryll/Shaps:
+ - rscadd: You can now sabotage secways by stuffing a banana in their tailpipe.
+ actioninja:
+ - bugfix: Traitor Uplink buy buttons properly disable when you don't have enough
+ TC again
+ cacogen:
+ - bugfix: Soil no longer renames itself hydroponics tray while something is planted
+ in it
+ - bugfix: Hydroponics planter names will update when weeds are mutated
+ - rscdel: Planters no longer change description to match that of what's planted
+ in them
+ necromanceranne:
+ - rscadd: A mech support bag.
+ - rscadd: Combat wrench.
+ - balance: Made the dark gygax significantly better by adjusting equipment and stats.
+ nemvar:
+ - rscadd: Replaced the effect of the "two left feet" mutation with random knockdowns
+ while moving.
+2020-02-15:
+ BadSS13Player:
+ - tweak: The Exosuit Fabricator's sync with R&D operation is now instant.
+ Buggy123:
+ - tweak: Random mineral turfs no longer cause large amounts of turf changes on initialization.
+ Cobby:
+ - balance: Buffs Surgery XP values
+ Krysonism:
+ - rscadd: The Cosa Nostra starter pack has been added to cargo as a contraband
+ crate.
+ - rscadd: Added pictures of the virgin mary, burning one of these will let you pick
+ a mafia nickname.
+ - rscadd: The beige suit, beige fedora and white fedora clothing items have been
+ added to the game.
+ - imageadd: The non-job fedoras and the white suit have been resprited.
+ Skoglol:
+ - spellcheck: Unhusking someone with synthflesh will no longer tell everyone they
+ were the one to fix the corpse.
+ XDTM:
+ - bugfix: Fixed nanite shutdown timer not properly shutting down nanites.
+ actioninja:
+ - rscadd: 'tgui-next for NTOS: AI restorer, File Manager, NetDOS, Net Monitor, and
+ Revelation'
+ - rscdel: Creation of TXT Files on modular computer has been indefinitely removed
+ - rscdel: Due to architecture concerns, NTNet Transfer has been indefinitely removed
+ from NTOS hardware.
+ nianjiilical:
+ - rscadd: Some weird shit happened in space, and now Ethereals are appearing in
+ new colors. Scientists are baffled.
+ nightred:
+ - rscadd: Space Suits warm the wearer, and use Cells
+ - rscadd: Suit Storage charges Space Suits
+ - rscadd: EMP's cause Hard Suit's to burn the wearer
+ - rscadd: Engineering now has emp proof cells with the suits
+ - rscadd: Hud status for space suit power level
+ - rscadd: ERT hardsuits get EMP protection AND ONLY THEM
+2020-02-19:
+ ATHATH:
+ - balance: All sharp items that have a force greater than or equal to 10 can be
+ used to perform the saw bone surgery step with ghetto surgery, but they'll have
+ a low success rate/step speed when doing so.
+ - rscadd: The biogenerator can now produce soy milk.
+ ArcaneMusic:
+ - rscadd: A new space ruin has been located in your sector. The previous owners
+ have dubbed the place "The Hell Factory", despite the region being designated
+ as an alcohol bottling facility.
+ - bugfix: Fixes accidentally reverting the puzzles/trapmaking tools PR.
+ - rscadd: The Syndicate has recently begun targeting a recently declassified piece
+ of Nanotrasen hardware, the blackbox, located within the blackbox recorder on
+ each station's telecommunication's array.
+ - rscadd: Human organs can once again be sold on the black market.
+ Arkatos:
+ - tweak: Added broken chameleon belt to the broken chameleon kit.
+ - rscadd: Radioactive Microlaser now uses tgui.
+ Bokkiewokkie:
+ - bugfix: Fixes writing being on paper bags and some ammo boxes
+ Buggy123:
+ - bugfix: fuck
+ Capsandi:
+ - imageadd: added a new mortar sprite
+ Dennok:
+ - bugfix: Now MultiZ Debug connected to neighbor space, in strange way.
+ EOBGames:
+ - bugfix: A few minor map fixes.
+ - tweak: There's now enough medhuds in storage for everyone in med (except you,
+ chemists).
+ Fikou:
+ - refactor: glockroach
+ - rscadd: You can now choose your name and color as a holoparasite/guardian/holocarp!
+ - rscadd: Miner holoparasites are now hivelords!
+ - bugfix: fixes lings being able to get mechanical holoparasites
+ Iamgoofball:
+ - tweak: You son of a bitch! I'm in.
+ Improvedname & JustRandomGuy:
+ - rscadd: Adds the syndicate laserarm implant to roboticist traitors
+ - rscadd: Syndicate implants now come in a suspicous autosurgeon
+ JAremko:
+ - rscadd: Added pyroclastic anomaly slime policy key
+ - bugfix: Fixed anomaly slime role
+ - bugfix: Now anomaly slimes can reproduce like other slimes do
+ JDawg1290:
+ - code_imp: mech construction refactored
+ JJRcop:
+ - refactor: Stasis now supports multiple sources.
+ Mickyan:
+ - rscadd: Added the broom. For sweeping.
+ - tweak: Tweaked paramedic loadout, moved pinpointer to medical belt, moved medipen
+ to suit storage
+ - bugfix: Cleaning messes with the mop and soap now correctly awards cleaning experience
+ NecromancerAnne and Kyrsonism:
+ - imageadd: Redid the claymore sprites to look a little better.
+ NikNak:
+ - balance: The powercrepe has been buffed
+ RaveRadbury:
+ - balance: Bottles and Flasks provide 5u on every gulp.
+ Skoglol:
+ - bugfix: Forced a basic keybind reset for everyone to fix some inconsistencies
+ from various savefiles, as well as making the hotkey/classic toggle in game
+ options work. Your emote keybinds should be untouched.
+ TheVekter:
+ - rscadd: Added the Vibebot
+ Thunder12345:
+ - bugfix: Cult sacrifice objective now tells you to use Offer instead of a non-existent
+ Sacrifice rune
+ - imageadd: Added missing attached tank sprites for TTVs
+ Time-Green:
+ - rscadd: Adds geysers to lavaland! They can be activated by using a reinforced
+ plunger found in the medical vendor. They can be harvested by using a new plumbing
+ device, magically powered liquid pumps!
+ - rscadd: Adds Hollow Water to geysers, wich can be combined with Holy Water as
+ catalyst for more Holy Water
+ - rscadd: Adds Protozine to geyers, a very weak version of Omnizine. Can be used
+ in Strange Reagent mixing
+ - rscadd: Adds Wittel, a very rare geyser chem. Can be processed into gravitum,
+ wich removes gravity. Can also be processed into metalgen, wich has a strange
+ tendency to transform objects into the imprinted material.
+ XDTM:
+ - rscadd: Added a new special brain trauma, Quantum Alignment.
+ - rscadd: Added the Enhanced Interrogation Chamber as a BEPIS researchable tech.
+ - rscadd: The EIC can be used to implant trigger phrases in subjects that cause
+ an instant hypnotic trance.
+ cacogen:
+ - rscadd: RCD can now deconstruct airlock assemblies and firelock frames
+ - bugfix: Stun batons now respect shields again (e.g. riot shields, the wizard's
+ shielded hardsuit)
+ - bugfix: Stun baton attacks that should've been stopped by clumsiness no longer
+ go through
+ itseasytosee:
+ - rscadd: Having a holster now allows you to flip a gun on your fingers. Use in
+ hand. If you want to eject your bullets repeat
+ - rscadd: The syndicate chameleon holster. Costs 1 tc and can be made to look like
+ any belt. Stores all your fun shooty sticks
+ - rscadd: Operative holster, a free alternative to tactical webbing for storing
+ two guns in a belt slot instead of alot of small items.
+ - rscadd: New drink! The Hivemind eraser. Can be made with two parts black Russian
+ one part thirteen-loko and one part grenadine.
+ necromanceranne:
+ - balance: Removes the stun from Krav Maga and makes it a high duration knockdown
+ with stamina damage (20-30), respecting chest armor for the damage.
+ - rscadd: Disarm intent is now a nonlethal jab that does (5-10) stamina damage.
+ If used on people who are prone, it does (10-15) stamina damage. It also has
+ a chance to completely disarm someone based on the amount of stamina damage
+ they have.
+ - balance: Krav Maga harm stomps/punches now respect armor and have a variance of
+ (5-10) for punches and (5-10+5) for stomps.
+ nightred:
+ - tweak: Turn night mode off or on when the APC is locked
+ - bugfix: space suit turns off properly when there is no cell inserted
+ - bugfix: space ninja can now turn on the heater in the suit
+ - bugfix: space ninja can recharge properly
+ - bugfix: space suit now uses the cell as intended
+ plapatin:
+ - tweak: Nanotrasen-brand spacepods can play music just like headphones now.
+ stylemistake:
+ - rscdel: Removed tgui
+ - refactor: tgui-next is now the new tgui
+ - code_imp: Updated "interface not found" screen.
+ wesoda25:
+ - tweak: Gondola Asteroid is grassy now, also has some puddles
+ with thanks to HugBug and Buggy for helping with bug-squashing:
+ - balance: The effect of gas comp will now spin up and down, rather then jumping.
+ Play around, don't break anything.
+ - bugfix: Fixed low pressure hell SMs
+ - admin: Allows var editing of SM gas rad effects
+ yeeyeh:
+ - rscadd: Nanotrasen's research division's recent science fair has given light to
+ an amazing, electrically-insulated compound that can be sprayed directly onto
+ the skin. The initial idea was for footwear, but we all know what you're really
+ going to do with it. Research can be continued at your station's B.E.P.I.S.
+ unit.
diff --git a/html/changelogs/AutoChangeLog-pr-48596.yml b/html/changelogs/AutoChangeLog-pr-48596.yml
deleted file mode 100644
index 5d10cd766f5..00000000000
--- a/html/changelogs/AutoChangeLog-pr-48596.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Qustinnus"
-delete-after: True
-changes:
- - code_imp: "there is now an edible component which will allow us to deprecate our hacky methods of making things such as organs edible"
diff --git a/html/changelogs/AutoChangeLog-pr-48654.yml b/html/changelogs/AutoChangeLog-pr-48654.yml
deleted file mode 100644
index 85bbed5d9d6..00000000000
--- a/html/changelogs/AutoChangeLog-pr-48654.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "ArcaneMusic"
-delete-after: True
-changes:
- - rscadd: "Nanotrasen's research division has gone ahead and scratched all possible plans of building new sleepers for the station, due to the discovery of old sleepers injecting crew with lead acetate."
- - rscadd: "In unrelated news, the research division is proud to announce the all new, \"party pods\"! Available at your local station B.E.P.I.S. platform as a minor reward."
diff --git a/html/changelogs/AutoChangeLog-pr-48668.yml b/html/changelogs/AutoChangeLog-pr-48668.yml
deleted file mode 100644
index 548a2b2b9a2..00000000000
--- a/html/changelogs/AutoChangeLog-pr-48668.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Skoglol"
-delete-after: True
-changes:
- - rscdel: "Removes cloning from the codebase. Cloning rooms have been converted to temporary wards and storage. Experimental cloner and its ruin is also gone."
- - balance: "Replica pod seed availability reduced. No longer available in megaseed vendors, seed crate contains one seed down from three. Mutate some cabbages if you want these."
diff --git a/html/changelogs/AutoChangeLog-pr-48766.yml b/html/changelogs/AutoChangeLog-pr-48766.yml
deleted file mode 100644
index 5629ec01f2a..00000000000
--- a/html/changelogs/AutoChangeLog-pr-48766.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "cacogen"
-delete-after: True
-changes:
- - refactor: "The abductor baton is now a child of the regular stun baton. There shouldn't be a functional difference."
- - tweak: "You need to be an abductor to change baton modes. Seemed like an oversight"
- - spellcheck: "Fixes some typos in the abductor baton's messages"
- - admin: "Both regular stun baton and abductor baton have had a lot of vars exposed pertaining to their functionality so that could come in handy I guess"
diff --git a/html/changelogs/AutoChangeLog-pr-48805.yml b/html/changelogs/AutoChangeLog-pr-48805.yml
deleted file mode 100644
index 750c8a9d5bf..00000000000
--- a/html/changelogs/AutoChangeLog-pr-48805.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "zxaber"
-delete-after: True
-changes:
- - balance: "It is now possible to use an actual defibrillator unit as a stand-in for the borg defib upgrade, allowing medical borgs to revive crew without cloning at shift start."
- - spellcheck: "Borgs now get a message when receiving any upgrade."
diff --git a/html/changelogs/AutoChangeLog-pr-48991.yml b/html/changelogs/AutoChangeLog-pr-48991.yml
deleted file mode 100644
index 813ead38ff3..00000000000
--- a/html/changelogs/AutoChangeLog-pr-48991.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arkatos"
-delete-after: True
-changes:
- - rscadd: "Mining Vendor now uses tgui-next."
diff --git a/html/changelogs/AutoChangeLog-pr-48995.yml b/html/changelogs/AutoChangeLog-pr-48995.yml
deleted file mode 100644
index 625351e78ed..00000000000
--- a/html/changelogs/AutoChangeLog-pr-48995.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Krysonism"
-delete-after: True
-changes:
- - rscadd: "4 new ice creams created using the crafting menu,"
- - rscadd: "You can now make popsicle sticks by sticking logs in the processor."
diff --git a/html/changelogs/AutoChangeLog-pr-49003.yml b/html/changelogs/AutoChangeLog-pr-49003.yml
deleted file mode 100644
index 4dc3e9b0c2c..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49003.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Fikou"
-delete-after: True
-changes:
- - rscadd: "You can now make lassos with a bone and 5 sinew and make saddles from 5 leather sheets, you can also tame goliaths with lavaland food (I think you know what those 3 things mean together)"
diff --git a/html/changelogs/AutoChangeLog-pr-49004.yml b/html/changelogs/AutoChangeLog-pr-49004.yml
deleted file mode 100644
index f9dc0e131d1..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49004.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Skoglol"
-delete-after: True
-changes:
- - bugfix: "Say should be less likely to break when under heavy server strain."
diff --git a/html/changelogs/AutoChangeLog-pr-49014.yml b/html/changelogs/AutoChangeLog-pr-49014.yml
deleted file mode 100644
index 5c8a57dddf2..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49014.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "wesoda25"
-delete-after: True
-changes:
- - tweak: "You will now cough if you have lung damage (no stun)."
diff --git a/html/changelogs/AutoChangeLog-pr-49037.yml b/html/changelogs/AutoChangeLog-pr-49037.yml
deleted file mode 100644
index d055592a56b..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49037.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Tlaltecuhtli"
-delete-after: True
-changes:
- - bugfix: "grinder chem not grinding"
- - bugfix: "dir of grinder chem"
diff --git a/html/changelogs/AutoChangeLog-pr-49048.yml b/html/changelogs/AutoChangeLog-pr-49048.yml
deleted file mode 100644
index 26b7a9b70ea..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49048.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - tweak: "Constructed display cases no longer spawn with an alarm that bolts all nearby doors."
diff --git a/html/changelogs/AutoChangeLog-pr-49057.yml b/html/changelogs/AutoChangeLog-pr-49057.yml
deleted file mode 100644
index 1e529f3468f..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49057.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Bokkiewokkie"
-delete-after: True
-changes:
- - imageadd: "adds box icons for tons of boxes."
- - imageadd: "changes the toy and shotgun ammo boxes so they're in the new art style."
diff --git a/html/changelogs/AutoChangeLog-pr-49082.yml b/html/changelogs/AutoChangeLog-pr-49082.yml
deleted file mode 100644
index 7ff3df053ed..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49082.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Cloneby"
-delete-after: True
-changes:
- - balance: "Strange Reagent now requires a set amount to revive dependent on patient wellbeing and requires an excess to heal blood and organs. Does more damage on life. Basically loses one-click wonder status UNLESS you give a considerable amount and deal with the consequences."
diff --git a/html/changelogs/AutoChangeLog-pr-49087.yml b/html/changelogs/AutoChangeLog-pr-49087.yml
deleted file mode 100644
index 4bd32d8699b..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49087.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "cacogen"
-delete-after: True
-changes:
- - spellcheck: "Cybernetic implant readouts on medHUD and health analyzer are more compact and show an icon of each"
diff --git a/html/changelogs/AutoChangeLog-pr-49090.yml b/html/changelogs/AutoChangeLog-pr-49090.yml
deleted file mode 100644
index bd54e9731e8..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49090.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-author: "Skoglol"
-delete-after: True
-changes:
- - balance: "Brain death is no longer a thing, no arbitrary unhealable death. Uses organ damage like the rest."
- - bugfix: "Brains can now be attacked again."
- - bugfix: "Brains no longer report you SSD if you are in the brain and not ghosted out."
- - balance: "Brains healed with mannitol now heal 2 damage per unit at a 10 unit minimum, instead of a flat 10 damage for any amount over 10 units."
- - spellcheck: "Defib faliure feedback is now more clear and hints at how to fix it."
- - tweak: "Defibs now force the ghost back."
- - spellcheck: "Improved brain feedback, no longer reports SSD."
- - balance: "Stomach pump and brain surgery are now repeatable surgeries."
diff --git a/html/changelogs/AutoChangeLog-pr-49092.yml b/html/changelogs/AutoChangeLog-pr-49092.yml
deleted file mode 100644
index 05884614b4f..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49092.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Mickyan"
-delete-after: True
-changes:
- - tweak: "Blood dripping frequency now scales with blood loss"
- - bugfix: "Fixed blood decals occasionally containing more blood than they should"
diff --git a/html/changelogs/AutoChangeLog-pr-49104.yml b/html/changelogs/AutoChangeLog-pr-49104.yml
deleted file mode 100644
index 978e2a45314..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49104.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "armhulen fikou gang"
-delete-after: True
-changes:
- - imageadd: "a lot of >32x32 mobs now have icons for their health dolls"
diff --git a/html/changelogs/AutoChangeLog-pr-49109.yml b/html/changelogs/AutoChangeLog-pr-49109.yml
deleted file mode 100644
index 96937368dd9..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49109.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "nightred"
-delete-after: True
-changes:
- - bugfix: "plastic water bottles can now spash"
- - bugfix: "plastic water bottle caps render properly the first time"
diff --git a/html/changelogs/AutoChangeLog-pr-49122.yml b/html/changelogs/AutoChangeLog-pr-49122.yml
deleted file mode 100644
index be75970a722..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49122.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "itseasytosee"
-delete-after: True
-changes:
- - rscadd: "Three more toys to find in your local arcade cabinet! Squeaky brain, trick blindfold, and a broken radio. Collect em all!"
diff --git a/html/changelogs/AutoChangeLog-pr-49123.yml b/html/changelogs/AutoChangeLog-pr-49123.yml
deleted file mode 100644
index eb13b0adc23..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49123.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "TheChosenEvilOne"
-delete-after: True
-changes:
- - bugfix: "Foamy beer stationwide event works again."
diff --git a/html/changelogs/AutoChangeLog-pr-49124.yml b/html/changelogs/AutoChangeLog-pr-49124.yml
deleted file mode 100644
index 6e2cfb39912..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49124.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Skoglol"
-delete-after: True
-changes:
- - code_imp: "Removed some forgotten references to defib time of death restrictions."
diff --git a/html/changelogs/AutoChangeLog-pr-49126.yml b/html/changelogs/AutoChangeLog-pr-49126.yml
deleted file mode 100644
index 553bc184f15..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49126.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Skoglol"
-delete-after: True
-changes:
- - bugfix: "Beakers should no longer nullspace when quick swapped or alt clicked out of certain pieces of machinery."
diff --git a/html/changelogs/AutoChangeLog-pr-49129.yml b/html/changelogs/AutoChangeLog-pr-49129.yml
deleted file mode 100644
index ed5d664cb9c..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49129.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-author: "ShizCalev"
-delete-after: True
-changes:
- - bugfix: "Emitters will now remain anchored when being constructed from an anchored machine frame."
- - bugfix: "Emitters will now properly turn off and be unwelded if unanchored via varediting."
- - bugfix: "Unanchored emitters will no longer be pulled towards non-harmful simple animals (ie butterflies, cats, ect) if they click on them."
- - bugfix: "Fixed a scenario where emitters could start welded and be turned on, but were not properly anchored to the ground."
- - bugfix: "Fixed a scenario where emitters could start anchored to the ground, but had to be resecured with a wrench to get them to work properly."
- - code_imp: "Emitters now properly use the anchored var. The state var has been renamed to welded, and only tracks welded status."
- - code_imp: "The anchored emitter map subtype has been changed to a fully welded one, since all utilized instances were editted to be welded as well anyway."
- - rscadd: "Added a bit more examine feedback to emitters."
- - bugfix: "Emitters will now show how often they fire a little more accurately."
diff --git a/html/changelogs/AutoChangeLog-pr-49130.yml b/html/changelogs/AutoChangeLog-pr-49130.yml
deleted file mode 100644
index 300d1449c6d..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49130.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "nightred"
-delete-after: True
-changes:
- - bugfix: "Fixes pulling button location on simple mobs"
diff --git a/html/changelogs/AutoChangeLog-pr-49133.yml b/html/changelogs/AutoChangeLog-pr-49133.yml
deleted file mode 100644
index 24dd3b29cf5..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49133.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ShizCalev"
-delete-after: True
-changes:
- - bugfix: "Attacking the Supermatter crystal with a NODROP item (ie cyborgs with literally any item, ninjas, highlanders, ect) will now dust the user."
diff --git a/html/changelogs/AutoChangeLog-pr-49138.yml b/html/changelogs/AutoChangeLog-pr-49138.yml
deleted file mode 100644
index fa8b0679c1c..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49138.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Thebleh"
-delete-after: True
-changes:
- - tweak: "Bodies with souls show the defib icon on medhuds."
diff --git a/html/changelogs/AutoChangeLog-pr-49139.yml b/html/changelogs/AutoChangeLog-pr-49139.yml
deleted file mode 100644
index 1018a8c099e..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49139.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "ShizCalev"
-delete-after: True
-changes:
- - bugfix: "Fixed spell books becoming unreadable if you moved while reading them."
- - bugfix: "Fixed progress bars not showing up for spell books."
- - bugfix: "Fixed an exploit where spell books didn't always have to be in your hand to finish reading them."
diff --git a/html/changelogs/AutoChangeLog-pr-49140.yml b/html/changelogs/AutoChangeLog-pr-49140.yml
deleted file mode 100644
index 2eb49d5efaf..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49140.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Skoglol"
-delete-after: True
-changes:
- - balance: "Traitor adrenals buffed slightly. Now removes knockdown on activation, increases speed slightly more and has no oxyloss damage."
- - balance: "Changeling adrenals now last 20 seconds, up from 15 seconds."
diff --git a/html/changelogs/AutoChangeLog-pr-49144.yml b/html/changelogs/AutoChangeLog-pr-49144.yml
deleted file mode 100644
index 1f25e0dd73c..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49144.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "nightred"
-delete-after: True
-changes:
- - bugfix: "Polymorph kicks AI's out of shells"
diff --git a/html/changelogs/AutoChangeLog-pr-49146.yml b/html/changelogs/AutoChangeLog-pr-49146.yml
deleted file mode 100644
index 8a0cb462dd8..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49146.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "NoxVS"
-delete-after: True
-changes:
- - bugfix: "Nanotrasen has properly relabeled all cyborg limbs following their rediscovery of which direction is left and which is right"
diff --git a/html/changelogs/AutoChangeLog-pr-49150.yml b/html/changelogs/AutoChangeLog-pr-49150.yml
deleted file mode 100644
index 4a7689203c6..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49150.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Fikou"
-delete-after: True
-changes:
- - tweak: "xenos now keep their name consistent through evolutions"
diff --git a/html/changelogs/AutoChangeLog-pr-49154.yml b/html/changelogs/AutoChangeLog-pr-49154.yml
deleted file mode 100644
index 0522a0bd19c..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49154.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dennok"
-delete-after: True
-changes:
- - bugfix: "Now nanites don't die from illusions and placing unpowered cable by bare hands."
diff --git a/html/changelogs/AutoChangeLog-pr-49162.yml b/html/changelogs/AutoChangeLog-pr-49162.yml
deleted file mode 100644
index 49832ada40b..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49162.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "nightred"
-delete-after: True
-changes:
- - refactor: "Changed custom material output on examine to be on a single line"
diff --git a/html/changelogs/AutoChangeLog-pr-49165.yml b/html/changelogs/AutoChangeLog-pr-49165.yml
deleted file mode 100644
index f37d627ae7e..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49165.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "EOBGames"
-delete-after: True
-changes:
- - rscadd: "The Beach Biodome Lavaland ruin has been revamped. Hit the beach and catch some waves, brah!"
diff --git a/html/changelogs/AutoChangeLog-pr-49175.yml b/html/changelogs/AutoChangeLog-pr-49175.yml
deleted file mode 100644
index 7fafdde0a95..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49175.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "improvedname"
-delete-after: True
-changes:
- - tweak: "Chamkits now include an chameleon belt"
diff --git a/html/changelogs/AutoChangeLog-pr-49177.yml b/html/changelogs/AutoChangeLog-pr-49177.yml
deleted file mode 100644
index 2b8a71d3a72..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49177.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "RaveRadbury"
-delete-after: True
-changes:
- - bugfix: "Removed latejoin prisoner option"
diff --git a/html/changelogs/AutoChangeLog-pr-49178.yml b/html/changelogs/AutoChangeLog-pr-49178.yml
deleted file mode 100644
index 2e60651bcee..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49178.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "optimumtact"
-delete-after: True
-changes:
- - tweak: "lawyer's department backpack... is a backpack again"
diff --git a/html/changelogs/AutoChangeLog-pr-49180.yml b/html/changelogs/AutoChangeLog-pr-49180.yml
deleted file mode 100644
index c69d76145f2..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49180.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ArcaneMusic"
-delete-after: True
-changes:
- - bugfix: "Wooden Plank Floors no longer runtime."
diff --git a/html/changelogs/AutoChangeLog-pr-49182.yml b/html/changelogs/AutoChangeLog-pr-49182.yml
deleted file mode 100644
index b7a6053ea82..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49182.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Skoglol"
-delete-after: True
-changes:
- - bugfix: "Dynamic revs runtime and infinite loss announcement fixed."
diff --git a/html/changelogs/AutoChangeLog-pr-49184.yml b/html/changelogs/AutoChangeLog-pr-49184.yml
deleted file mode 100644
index 76fe78fb5b9..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49184.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "peoplearestrange"
-delete-after: True
-changes:
- - rscdel: "Removed Special Verbs Tab"
- - admin: "New admin button Tabs"
diff --git a/html/changelogs/AutoChangeLog-pr-49188.yml b/html/changelogs/AutoChangeLog-pr-49188.yml
deleted file mode 100644
index 56f2784f506..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49188.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "JJRcop"
-delete-after: True
-changes:
- - refactor: "Defibs and Defibbing Nanites act the same way again."
diff --git a/html/changelogs/AutoChangeLog-pr-49190.yml b/html/changelogs/AutoChangeLog-pr-49190.yml
deleted file mode 100644
index c3e40843508..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49190.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Vondiech"
-delete-after: True
-changes:
- - tweak: "There is no longer a light fixture attached to an airlock in the Experimentation Lab on Metastation."
diff --git a/html/changelogs/AutoChangeLog-pr-49192.yml b/html/changelogs/AutoChangeLog-pr-49192.yml
deleted file mode 100644
index e543a467c60..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49192.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "SteelSlayer"
-delete-after: True
-changes:
- - code_imp: "Adds the dunkable element. Converts items who were using the dunkable var to instead use this element and removes the dunkable var."
- - code_imp: "Adds a new \"DUNKABLE\" reagent flag for reagent containers. This determines whether or not the container can have items dunked into it."
diff --git a/html/changelogs/AutoChangeLog-pr-49194.yml b/html/changelogs/AutoChangeLog-pr-49194.yml
deleted file mode 100644
index 77d324bce81..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49194.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dennok"
-delete-after: True
-changes:
- - bugfix: "Now MultiZ Debug map has open space under floor instead of space."
diff --git a/html/changelogs/AutoChangeLog-pr-49204.yml b/html/changelogs/AutoChangeLog-pr-49204.yml
deleted file mode 100644
index f264198fbbd..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49204.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "imsxz"
-delete-after: True
-changes:
- - tweak: "skateboards now buckle you after activating them in hand."
diff --git a/html/changelogs/AutoChangeLog-pr-49210.yml b/html/changelogs/AutoChangeLog-pr-49210.yml
deleted file mode 100644
index d70e3d90483..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49210.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "EOBGames"
-delete-after: True
-changes:
- - bugfix: "Fixed a few minor map problems."
diff --git a/html/changelogs/AutoChangeLog-pr-49214.yml b/html/changelogs/AutoChangeLog-pr-49214.yml
deleted file mode 100644
index 4bbece15b79..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49214.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "JJRcop"
-delete-after: True
-changes:
- - bugfix: "Fixed removing brains from changeling husks."
diff --git a/html/changelogs/AutoChangeLog-pr-49218.yml b/html/changelogs/AutoChangeLog-pr-49218.yml
deleted file mode 100644
index e5bdc649b34..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49218.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Coconutwarrior97"
-delete-after: True
-changes:
- - bugfix: "Fixes meta armory external camera by naming it properly."
diff --git a/html/changelogs/AutoChangeLog-pr-49220.yml b/html/changelogs/AutoChangeLog-pr-49220.yml
deleted file mode 100644
index b10bf3a488a..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49220.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Coconutwarrior97"
-delete-after: True
-changes:
- - bugfix: "AI can use the carp hologram again."
diff --git a/html/changelogs/AutoChangeLog-pr-49223.yml b/html/changelogs/AutoChangeLog-pr-49223.yml
deleted file mode 100644
index a60b4c4265b..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49223.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "OnlineGirlfriend"
-delete-after: True
-changes:
- - imageadd: "crushed can sprite for Sol Dry"
- - bugfix: "Sol Dry cans can be crushed"
diff --git a/html/changelogs/AutoChangeLog-pr-49227.yml b/html/changelogs/AutoChangeLog-pr-49227.yml
deleted file mode 100644
index ab1ae51f437..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49227.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Mickyan"
-delete-after: True
-changes:
- - tweak: "The Delta Station stasis room has received a makeover"
diff --git a/html/changelogs/AutoChangeLog-pr-49228.yml b/html/changelogs/AutoChangeLog-pr-49228.yml
deleted file mode 100644
index 1f72ab5a337..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49228.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "OnlineGirlfriend"
-delete-after: True
-changes:
- - bugfix: "salami filling color"
- - tweak: "salami taste"
diff --git a/html/changelogs/AutoChangeLog-pr-49229.yml b/html/changelogs/AutoChangeLog-pr-49229.yml
deleted file mode 100644
index 989b9abc000..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49229.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "itseasytosee"
-delete-after: True
-changes:
- - bugfix: "Plasmamen prisoners now use the proper helmet sprite."
diff --git a/html/changelogs/AutoChangeLog-pr-49236.yml b/html/changelogs/AutoChangeLog-pr-49236.yml
deleted file mode 100644
index f1bdea4470f..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49236.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Coconutwarrior97"
-delete-after: True
-changes:
- - bugfix: "Fixes a typo in mind.dm ."
diff --git a/html/changelogs/AutoChangeLog-pr-49240.yml b/html/changelogs/AutoChangeLog-pr-49240.yml
deleted file mode 100644
index ef0cf0e9937..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49240.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "itseasytosee"
-delete-after: True
-changes:
- - bugfix: "Pacifists can now use the wand of nothing."
diff --git a/html/changelogs/AutoChangeLog-pr-49256.yml b/html/changelogs/AutoChangeLog-pr-49256.yml
deleted file mode 100644
index 0fd59bfb99a..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49256.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "itseasytosee"
-delete-after: True
-changes:
- - bugfix: "Shotgun in hands are no longer broken."
diff --git a/html/changelogs/AutoChangeLog-pr-49262.yml b/html/changelogs/AutoChangeLog-pr-49262.yml
deleted file mode 100644
index 2de6ada89b8..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49262.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Fikou"
-delete-after: True
-changes:
- - bugfix: "fixes humanoid xeno numbers being 0"
- - tweak: "royal xenos also get numbers"
diff --git a/html/changelogs/AutoChangeLog-pr-49265.yml b/html/changelogs/AutoChangeLog-pr-49265.yml
deleted file mode 100644
index 105002bd936..00000000000
--- a/html/changelogs/AutoChangeLog-pr-49265.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "itseasytosee"
-delete-after: True
-changes:
- - rscadd: "An ancient recipe for the ultimate soap can be had by janitors that carry family heirlooms and those who crawl maintenance."
diff --git a/icons/mob/actions/actions_spacesuit.dmi b/icons/mob/actions/actions_spacesuit.dmi
new file mode 100644
index 00000000000..0b77ed77335
Binary files /dev/null and b/icons/mob/actions/actions_spacesuit.dmi differ
diff --git a/icons/mob/aibots.dmi b/icons/mob/aibots.dmi
index 112a8da8383..c493402b8ec 100644
Binary files a/icons/mob/aibots.dmi and b/icons/mob/aibots.dmi differ
diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi
index f5ff53dfd5e..55ba2a1a4a9 100644
Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ
diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi
index efbea555c56..b89a2163471 100644
Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ
diff --git a/icons/mob/clothing/ears.dmi b/icons/mob/clothing/ears.dmi
index 7a2462874f0..33bbc4fb61c 100644
Binary files a/icons/mob/clothing/ears.dmi and b/icons/mob/clothing/ears.dmi differ
diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi
index c493483ce13..09966df4ec3 100644
Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ
diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi
index 9ec4bd9359c..f0ad20bcdc0 100644
Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ
diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi
index 9bd6467e2d2..ad44ec0d311 100644
Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ
diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi
index 009c8413048..522d9540657 100644
Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ
diff --git a/icons/mob/clothing/under/suits.dmi b/icons/mob/clothing/under/suits.dmi
index 2c3164114f2..1fb5f559bfe 100644
Binary files a/icons/mob/clothing/under/suits.dmi and b/icons/mob/clothing/under/suits.dmi differ
diff --git a/icons/mob/guardian.dmi b/icons/mob/guardian.dmi
index 3737e47f6ee..cce3aa7f01c 100644
Binary files a/icons/mob/guardian.dmi and b/icons/mob/guardian.dmi differ
diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi
index 56bfaf7178b..40d325eaed9 100644
Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi
index 1c3f09b6294..c361d7157d3 100644
Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/custodial_lefthand.dmi b/icons/mob/inhands/equipment/custodial_lefthand.dmi
index 9505e18d871..2c9f34af2e1 100644
Binary files a/icons/mob/inhands/equipment/custodial_lefthand.dmi and b/icons/mob/inhands/equipment/custodial_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/custodial_righthand.dmi b/icons/mob/inhands/equipment/custodial_righthand.dmi
index 499d94ae1ef..f166ba6076b 100644
Binary files a/icons/mob/inhands/equipment/custodial_righthand.dmi and b/icons/mob/inhands/equipment/custodial_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/tools_lefthand.dmi b/icons/mob/inhands/equipment/tools_lefthand.dmi
index 030d0db9d1d..b68526f472f 100644
Binary files a/icons/mob/inhands/equipment/tools_lefthand.dmi and b/icons/mob/inhands/equipment/tools_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/tools_righthand.dmi b/icons/mob/inhands/equipment/tools_righthand.dmi
index 37d53c92bdd..6bcfce314e2 100644
Binary files a/icons/mob/inhands/equipment/tools_righthand.dmi and b/icons/mob/inhands/equipment/tools_righthand.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index e0522d1f07e..b35d6cc5c0d 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 1c1220e75dc..d7d7470a5bc 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi
index d6950f4e1e4..d9a76955411 100644
Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi
index 96558291134..1e195323f4f 100644
Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ
diff --git a/icons/mob/screen_elite.dmi b/icons/mob/screen_elite.dmi
index f407fb79e41..115b1b0c0cb 100644
Binary files a/icons/mob/screen_elite.dmi and b/icons/mob/screen_elite.dmi differ
diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi
index d827a34c3cc..fd5acf71b44 100644
Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ
diff --git a/icons/mob/screen_slime.dmi b/icons/mob/screen_slime.dmi
index b9bc909c7ac..19bc7e1f737 100644
Binary files a/icons/mob/screen_slime.dmi and b/icons/mob/screen_slime.dmi differ
diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi
index 9cbc0856243..903449726cf 100644
Binary files a/icons/obj/assemblies.dmi and b/icons/obj/assemblies.dmi differ
diff --git a/icons/obj/blackmarket.dmi b/icons/obj/blackmarket.dmi
index 99f4811ea6b..7dcbe31fa63 100644
Binary files a/icons/obj/blackmarket.dmi and b/icons/obj/blackmarket.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index 717d8dd574e..38ce95b8c0e 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi
index 09ef91de788..4f9d288b921 100644
Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ
diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi
index 5946966d24d..e599a0a948c 100644
Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 398add03fc9..45c3091e54a 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index a90efcdfea1..7a3d72c8841 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 9f03c75982b..7188896730a 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 78d47339cff..d7f041a3948 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/under/suits.dmi b/icons/obj/clothing/under/suits.dmi
index f8e24376713..734d21f9d57 100644
Binary files a/icons/obj/clothing/under/suits.dmi and b/icons/obj/clothing/under/suits.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 1b10515d10a..7ca524b29f6 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/doors/doorpuzzle.dmi b/icons/obj/doors/doorpuzzle.dmi
new file mode 100644
index 00000000000..ec4fbed514b
Binary files /dev/null and b/icons/obj/doors/doorpuzzle.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 6329dbe3791..2d71873d078 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index fc2e4fc61f9..36c4e0763a3 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi
index 4996f06d8af..501370f823c 100644
Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ
diff --git a/icons/obj/machines/implantchair.dmi b/icons/obj/machines/implantchair.dmi
index e91f614fad6..4d67bca9261 100644
Binary files a/icons/obj/machines/implantchair.dmi and b/icons/obj/machines/implantchair.dmi differ
diff --git a/icons/obj/machines/medipen_refiller.dmi b/icons/obj/machines/medipen_refiller.dmi
new file mode 100644
index 00000000000..300d218d2d7
Binary files /dev/null and b/icons/obj/machines/medipen_refiller.dmi differ
diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi
index 9175252cd39..615621fcce3 100644
Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ
diff --git a/icons/obj/puzzle_small.dmi b/icons/obj/puzzle_small.dmi
new file mode 100644
index 00000000000..e9dc82925aa
Binary files /dev/null and b/icons/obj/puzzle_small.dmi differ
diff --git a/icons/obj/smooth_structures/rollingtable.dmi b/icons/obj/smooth_structures/rollingtable.dmi
new file mode 100644
index 00000000000..9e559a75d94
Binary files /dev/null and b/icons/obj/smooth_structures/rollingtable.dmi differ
diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi
index 3827c8fefe2..0d487ca493a 100644
Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index 2259f47dc5c..ba68af7e673 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/sound/effects/stall.ogg b/sound/effects/stall.ogg
new file mode 100644
index 00000000000..8d152076767
Binary files /dev/null and b/sound/effects/stall.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 154eb3e2de1..89d8b5501e5 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -34,7 +34,6 @@
#include "code\__DEFINES\cleaning.dm"
#include "code\__DEFINES\colors.dm"
#include "code\__DEFINES\combat.dm"
-#include "code\__DEFINES\components.dm"
#include "code\__DEFINES\configuration.dm"
#include "code\__DEFINES\construction.dm"
#include "code\__DEFINES\contracts.dm"
@@ -114,6 +113,9 @@
#include "code\__DEFINES\vv.dm"
#include "code\__DEFINES\wall_dents.dm"
#include "code\__DEFINES\wires.dm"
+#include "code\__DEFINES\dcs\flags.dm"
+#include "code\__DEFINES\dcs\helpers.dm"
+#include "code\__DEFINES\dcs\signals.dm"
#include "code\__HELPERS\_lists.dm"
#include "code\__HELPERS\_logging.dm"
#include "code\__HELPERS\_string_lists.dm"
@@ -697,6 +699,7 @@
#include "code\game\machinery\gulag_teleporter.dm"
#include "code\game\machinery\harvester.dm"
#include "code\game\machinery\hologram.dm"
+#include "code\game\machinery\hypnochair.dm"
#include "code\game\machinery\igniter.dm"
#include "code\game\machinery\iv_drip.dm"
#include "code\game\machinery\launch_pad.dm"
@@ -705,6 +708,7 @@
#include "code\game\machinery\magnet.dm"
#include "code\game\machinery\mass_driver.dm"
#include "code\game\machinery\medical_kiosk.dm"
+#include "code\game\machinery\medipen_refiller.dm"
#include "code\game\machinery\navbeacon.dm"
#include "code\game\machinery\newscaster.dm"
#include "code\game\machinery\PDApainter.dm"
@@ -937,6 +941,7 @@
#include "code\game\objects\items\plushes.dm"
#include "code\game\objects\items\pneumaticCannon.dm"
#include "code\game\objects\items\powerfist.dm"
+#include "code\game\objects\items\puzzle_pieces.dm"
#include "code\game\objects\items\RCD.dm"
#include "code\game\objects\items\RCL.dm"
#include "code\game\objects\items\religion.dm"
@@ -1065,6 +1070,7 @@
#include "code\game\objects\items\storage\briefcase.dm"
#include "code\game\objects\items\storage\fancy.dm"
#include "code\game\objects\items\storage\firstaid.dm"
+#include "code\game\objects\items\storage\holsters.dm"
#include "code\game\objects\items\storage\lockbox.dm"
#include "code\game\objects\items\storage\secure.dm"
#include "code\game\objects\items\storage\sixpack.dm"
@@ -1125,6 +1131,7 @@
#include "code\game\objects\structures\noticeboard.dm"
#include "code\game\objects\structures\petrified_statue.dm"
#include "code\game\objects\structures\plasticflaps.dm"
+#include "code\game\objects\structures\railings.dm"
#include "code\game\objects\structures\reflector.dm"
#include "code\game\objects\structures\safe.dm"
#include "code\game\objects\structures\showcase.dm"
@@ -1591,6 +1598,7 @@
#include "code\modules\cargo\exports\lavaland.dm"
#include "code\modules\cargo\exports\manifest.dm"
#include "code\modules\cargo\exports\materials.dm"
+#include "code\modules\cargo\exports\organs.dm"
#include "code\modules\cargo\exports\parts.dm"
#include "code\modules\cargo\exports\seeds.dm"
#include "code\modules\cargo\exports\sheets.dm"
@@ -2230,9 +2238,9 @@
#include "code\modules\mob\living\simple_animal\bot\mulebot.dm"
#include "code\modules\mob\living\simple_animal\bot\secbot.dm"
#include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm"
+#include "code\modules\mob\living\simple_animal\bot\vibebot.dm"
#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm"
#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
-#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm"
#include "code\modules\mob\living\simple_animal\friendly\crab.dm"
#include "code\modules\mob\living\simple_animal\friendly\dog.dm"
#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm"
@@ -2253,7 +2261,6 @@
#include "code\modules\mob\living\simple_animal\friendly\drone\verbs.dm"
#include "code\modules\mob\living\simple_animal\friendly\drone\visuals_icons.dm"
#include "code\modules\mob\living\simple_animal\guardian\guardian.dm"
-#include "code\modules\mob\living\simple_animal\guardian\guardiannaming.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\assassin.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\charger.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\dextrous.dm"
@@ -2270,11 +2277,11 @@
#include "code\modules\mob\living\simple_animal\hostile\bees.dm"
#include "code\modules\mob\living\simple_animal\hostile\carp.dm"
#include "code\modules\mob\living\simple_animal\hostile\cat_butcher.dm"
+#include "code\modules\mob\living\simple_animal\hostile\cockroach.dm"
#include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm"
#include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm"
#include "code\modules\mob\living\simple_animal\hostile\faithless.dm"
#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm"
-#include "code\modules\mob\living\simple_animal\hostile\glockroach.dm"
#include "code\modules\mob\living\simple_animal\hostile\goose.dm"
#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm"
#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm"
@@ -2371,7 +2378,6 @@
#include "code\modules\modular_computers\file_system\programs\ntdownloader.dm"
#include "code\modules\modular_computers\file_system\programs\ntmonitor.dm"
#include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm"
-#include "code\modules\modular_computers\file_system\programs\nttransfer.dm"
#include "code\modules\modular_computers\file_system\programs\powermonitor.dm"
#include "code\modules\modular_computers\file_system\programs\sm_monitor.dm"
#include "code\modules\modular_computers\file_system\programs\antagonist\contract_uplink.dm"
@@ -2769,6 +2775,7 @@
#include "code\modules\ruins\spaceruin_code\crashedship.dm"
#include "code\modules\ruins\spaceruin_code\deepstorage.dm"
#include "code\modules\ruins\spaceruin_code\DJstation.dm"
+#include "code\modules\ruins\spaceruin_code\hellfactory.dm"
#include "code\modules\ruins\spaceruin_code\hilbertshotel.dm"
#include "code\modules\ruins\spaceruin_code\listeningstation.dm"
#include "code\modules\ruins\spaceruin_code\oldstation.dm"
diff --git a/tgui-next/.gitattributes b/tgui-next/.gitattributes
deleted file mode 100644
index 0016cc3bf67..00000000000
--- a/tgui-next/.gitattributes
+++ /dev/null
@@ -1,10 +0,0 @@
-* text=auto
-
-## Enforce text mode and LF line breaks
-*.js text eol=lf
-*.css text eol=lf
-*.html text eol=lf
-*.json text eol=lf
-
-## Treat bundles as binary and ignore them during conflicts
-*.bundle.* binary merge=tgui-merge-bundle
diff --git a/tgui-next/.gitignore b/tgui-next/.gitignore
deleted file mode 100644
index 416ca3768da..00000000000
--- a/tgui-next/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-node_modules
-*.log
-package-lock.json
-
-/packages/tgui/public/.tmp/**/*
-/packages/tgui/public/**/*.hot-update.*
-/packages/tgui/public/**/*.map
diff --git a/tgui-next/README.md b/tgui-next/README.md
deleted file mode 100644
index beb7aaff804..00000000000
--- a/tgui-next/README.md
+++ /dev/null
@@ -1,855 +0,0 @@
-# tgui
-
-## Introduction
-
-tgui is a robust user interface framework of /tg/station.
-
-tgui is very different from most UIs you will encounter in BYOND programming.
-It is heavily reliant on Javascript and web technologies as opposed to DM.
-If you are familiar with NanoUI (a library which can be found on almost
-every other SS13 codebase), tgui should be fairly easy to pick up.
-
-## Learn tgui
-
-People come to tgui from different backgrounds and with different
-learning styles. Whether you prefer a more theoretical or a practical
-approach, we hope you’ll find this section helpful.
-
-### Practical tutorial
-
-If you are completely new to frontend and prefer to **learn by doing**,
-start with our [practical tutorial](docs/tutorial-and-examples.md).
-
-### Guides
-
-This project uses **Inferno** - a very fast UI rendering engine with a similar
-API to React. Take your time to read these guides:
-
-- [React guide](https://reactjs.org/docs/hello-world.html)
-- [Inferno documentation](https://infernojs.org/docs/guides/components) -
-highlights differences with React.
-
-If you were already familiar with an older, Ractive-based tgui, and want
-to translate concepts between old and new tgui, read this
-[interface conversion guide](docs/converting-old-tgui-interfaces.md).
-
-## Pre-requisites
-
-You will need these programs to start developing in tgui:
-
-- [Node v12.13+](https://nodejs.org/en/download/)
-- [Yarn v1.19+](https://yarnpkg.com/en/docs/install)
-- [MSys2](https://www.msys2.org/) (optional)
-
-> MSys2 closely replicates a unix-like environment which is necessary for
-> the `bin/tgui` script to run. It comes with a robust "mintty" terminal
-> emulator which is better than any standard Windows shell, it supports
-> "git" out of the box (almost like Git for Windows, but better), has
-> a "pacman" package manager, and you can install a text editor like "vim"
-> for a full boomer experience.
-
-## Usage
-
-**For MSys2, Git Bash, WSL, Linux or macOS users:**
-
-First and foremost, change your directory to `tgui-next`.
-
-Run `bin/tgui --install-git-hooks` (optional) to install merge drivers
-which will assist you in conflict resolution when rebasing your branches.
-
-Run one of the following:
-
-- `bin/tgui` - build the project in production mode.
-- `bin/tgui --dev` - launch a development server.
- - tgui development server provides you with incremental compilation,
- hot module replacement and logging facilities in all running instances
- of tgui. In short, this means that you will instantly see changes in the
- game as you code it. Very useful, highly recommended.
- In order to use, you should start the game server first, connect to it so dreamseeker is
- open, then start the dev server. You'll know if it's hooked correctly if data gets dumped
- to the log when tgui windows are opened.
-- `bin/tgui --dev --reload` - reload byond cache once.
-- `bin/tgui --dev --debug` - run server with debug logging enabled.
-- `bin/tgui --dev --no-hot` - disable hot module replacement (helps when
-doing development on IE8).
-- `bin/tgui --lint` - show problems with the code.
-- `bin/tgui --lint --fix` - auto-fix problems with the code.
-- `bin/tgui --analyze` - run a bundle analyzer.
-- `bin/tgui --clean` - clean up project repo.
-- `bin/tgui [webpack options]` - build the project with custom webpack
-options.
-
-**For everyone else:**
-
-If you haven't opened the console already, you can do that by holding
-Shift and right clicking on the `tgui-next` folder, then pressing
-either `Open command window here` or `Open PowerShell window here`.
-
-Run `yarn install` to install npm dependencies, then one of the following:
-
-- `yarn run build` - build the project in production mode.
-- `yarn run watch` - launch a development server.
-- `yarn run lint` - show problems with the code.
-- `yarn run lint --fix` - auto-fix problems with the code.
-- `yarn run analyze` - run a bundle analyzer.
-
-We also got some batch files in store, for those who don't like fiddling
-with the console:
-
-- `bin/tgui-build.bat` - build the project in production mode.
-- `bin/tgui-dev-server.bat` - launch a development server.
-
-> Remember to always run a full build before submitting a PR. It creates
-> a compressed javascript bundle which is then referenced from DM code.
-> We prefer to keep it version controlled, so that people could build the
-> game just by using Dream Maker.
-
-## Project structure
-
-- `/packages` - Each folder here represents a self-contained Node module.
-- `/packages/common` - Helper functions
-- `/packages/tgui/index.js` - Application entry point.
-- `/packages/tgui/components` - Basic UI building blocks.
-- `/packages/tgui/interfaces` - Actual in-game interfaces.
-Interface takes data via the `state` prop and outputs an html-like stucture,
-which you can build using existing UI components.
-- `/packages/tgui/routes.js` - This is where you want to register new
-interfaces, otherwise they simply won't load.
-- `/packages/tgui/layout.js` - A root-level component, holding the
-window elements, like the titlebar, buttons, resize handlers. Calls
-`routes.js` to decide which component to render.
-- `/packages/tgui/styles/main.scss` - CSS entry point.
-- `/packages/tgui/styles/atomic.scss` - Atomic CSS classes.
-These are very simple, tiny, reusable CSS classes which you can use and
-combine to change appearance of your elements. Keep them small.
-- `/packages/tgui/styles/components.scss` - CSS classes which are used
-in UI components, and most of the stylesheets referenced here are located
-in `/packages/tgui/components`. These stylesheets closely follow the
-[BEM](https://en.bem.info/methodology/) methodology.
-- `/packages/tgui/styles/functions.scss` - Useful SASS functions.
-Stuff like `lighten`, `darken`, `luminance` are defined here.
-
-## Component reference
-
-> Notice: This documentation might be out of date, so always check the source
-> code to see the most up-to-date information.
-
-These are the components which you can use for interface construction.
-If you have trouble finding the exact prop you need on a component,
-please note, that most of these components inherit from other basic
-components, such as `Box`. This component in particular provides a lot
-of styling options for all components, e.g. `color` and `opacity`, thus
-it is used a lot in this framework.
-
-There are a few important semantics you need to know about:
-
-- `content` prop is a synonym to a `children` prop.
- - `content` is better used when your element is a self-closing tag
- (like ``), and when content is small and simple
- enough to fit in a prop. Keep in mind, that this prop is **not** native
- to React, and is a feature of this component system.
- - `children` is better used when your element is a full tag (like
- ``), and when content is long and complex. This is
- a native React prop (unlike `content`), and contains all elements you
- defined between the opening and the closing tag of an element.
- - You should never use both on a same element.
- - You should never use `children` explicitly as a prop on an element.
-- Inferno supports both camelcase (`onClick`) and lowercase (`onclick`)
-event names.
- - Camel case names are what's called "synthetic" events, and are the
- *preferred way* of handling events in React, for efficiency and
- performance reasons. Please read
- [Inferno Event Handling](https://infernojs.org/docs/guides/event-handling)
- to understand what this is about.
- - Lower case names are native browser events and should be used sparingly,
- for example when you need an explicit IE8 support. **DO NOT** use
- lowercase event handlers unless you really know what you are doing.
- - [Button](#button) component straight up does not support lowercase event
- handlers. Use the camel case `onClick` instead.
-
-### `AnimatedNumber`
-
-This component provides animations for numeric values.
-
-Props:
-
-- `value: number` - Value to animate.
-- `initial: number` - Initial value to use in animation when element
-first appears. If you set initial to `0` for example, number will always
-animate starting from `0`, and if omitted, it will not play an initial
-animation.
-- `format: value => value` - Output formatter.
- - Example: `value => Math.round(value)`.
-- `children: (formattedValue, rawValue) => any` - Pull the animated number to
-animate more complex things deeper in the DOM tree.
- - Example: `(_, value) => `
-
-### `BlockQuote`
-
-Just a block quote, just like this example in markdown:
-
-> Here's an example of a block quote.
-
-Props:
-
-- See inherited props: [Box](#box)
-
-### `Box`
-
-The Box component serves as a wrapper component for most of the CSS utility
-needs. It creates a new DOM element, a `
` by default that can be changed
-with the `as` property. Let's say you want to use a `` instead:
-
-```jsx
-
-
-
-```
-
-This works great when the changes can be isolated to a new DOM element.
-For instance, you can change the margin this way.
-
-However, sometimes you have to target the underlying DOM element.
-For instance, you want to change the text color of the button. The Button
-component defines its own color. CSS inheritance doesn't help.
-
-To workaround this problem, the Box children accept a render props function.
-This way, `Button` can pull out the `className` generated by the `Box`.
-
-```jsx
-
- {props => }
-
-```
-
-`Box` units, like width, height and margins can be defined in two ways:
-- By plain numbers (1 unit equals `0.5em`);
-- In absolute measures, by providing a full unit string (e.g. `100px`).
-
-Units which are used in `Box` are `0.5em`, which are half font-size.
-Default font size is `12px`, so each unit is effectively `6px` in size.
-If you need more precision, you can always use fractional numbers.
-
-Props:
-
-- `as: string` - The component used for the root node.
-- `color: string` - Applies an atomic `color-` class to the element.
- - See `styles/atomic/color.scss`.
-- `width: number` - Box width.
-- `minWidth: number` - Box minimum width.
-- `maxWidth: number` - Box maximum width.
-- `height: number` - Box height.
-- `minHeight: number` - Box minimum height.
-- `maxHeight: number` - Box maximum height.
-- `fontSize: number` - Font size.
-- `fontFamily: string` - Font family.
-- `lineHeight: number` - Directly affects the height of text lines.
-Useful for adjusting button height.
-- `inline: boolean` - Forces the `Box` to appear as an `inline-block`,
-or in other words, makes the `Box` flow with the text instead of taking
-all available horizontal space.
-- `m: number` - Margin on all sides.
-- `mx: number` - Horizontal margin.
-- `my: number` - Vertical margin.
-- `mt: number` - Top margin.
-- `mb: number` - Bottom margin.
-- `ml: number` - Left margin.
-- `mr: number` - Right margin.
-- `opacity: number` - Opacity, from 0 to 1.
-- `bold: boolean` - Make text bold.
-- `italic: boolean` - Make text italic.
-- `nowrap: boolean` - Stops text from wrapping.
-- `textAlign: string` - Align text inside the box.
- - `left` (default)
- - `center`
- - `right`
-- `position: string` - A direct mapping to `position` CSS property.
- - `relative` - Relative positioning.
- - `absolute` - Absolute positioning.
- - `fixed` - Fixed positioning.
-- `color: string` - An alias to `textColor`.
-- `textColor: string` - Sets text color.
- - `#ffffff` - Hex format
- - `rgba(255, 255, 255, 1)` - RGB format
- - `purple` - Applies an atomic `color-` class to the element.
- See `styles/color-map.scss`.
-- `backgroundColor: string` - Sets background color.
- - `#ffffff` - Hex format
- - `rgba(255, 255, 255, 1)` - RGB format
-
-### `Button`
-
-Buttons allow users to take actions, and make choices, with a single click.
-
-Props:
-
-- See inherited props: [Box](#box)
-- `fluid: boolean` - Fill all available horizontal space.
-- `icon: string` - Adds an icon to the button.
-- `color: string` - Button color, as defined in `variables.scss`.
- - There is also a special color `transparent` - makes the button
- transparent and slightly dim when inactive.
-- `disabled: boolean` - Disables and greys out the button.
-- `selected: boolean` - Activates the button (gives it a green color).
-- `tooltip: string` - A fancy, boxy tooltip, which appears when hovering
-over the button.
-- `tooltipPosition: string` - Position of the tooltip.
- - `top` - Show tooltip above the button.
- - `bottom` (default) - Show tooltip below the button.
- - `left` - Show tooltip on the left of the button.
- - `right` - Show tooltip on the right of the button.
-- `ellipsis: boolean` - If button width is constrained, button text will
-be truncated with an ellipsis. Be careful however, because this prop breaks
-the baseline alignment.
-- `title: string` - A native browser tooltip, which appears when hovering
-over the button.
-- `content/children: any` - Content to render inside the button.
-- `onClick: function` - Called when element is clicked.
-
-### `Button.Checkbox`
-
-A ghetto checkbox, made entirely using existing Button API.
-
-Props:
-
-- See inherited props: [Button](#button)
-- `checked: boolean` - Boolean value, which marks the checkbox as checked.
-
-### `Button.Confirm`
-
-A button with a an extra confirmation step, using native button component.
-
-Props:
-
-- See inherited props: [Button](#button)
-- `confirmMessage: string` - Text to display after first click; defaults to "Confirm?"
-- `confirmColor: string` - Color to display after first click; default to "bad"
-
-### `Button.Input`
-
-A button that turns into an input box after the first click. Turns back into a button after the user hits enter, defocuses, or hits escape. Enter and defocus commit, while escape cancels.
-
-Props:
- - See inherited props: [Box](#box)
- - `fluid`: fill availible horizontal space
- - `onCommit: (e, value) => void`: function that is called after the user defocuses the input or presses enter
- - `currentValue: string`: default string to display when the input is shown
- - `defaultValue: string`: default value emitted if the user leaves the box blank when hitting enter or defocusing. If left undefined, will cancel the change on a blank defocus/enter
-
-### `Collapsible`
-
-Displays contents when open, acts as a fluid button when closed. Click to toggle, closed by default.
-
-Props:
- - See inherited props: [Box](#box)
- - `children: any` - What is collapsed when closed
- - `title: string` - Text to display on the button for collapsing
- - `color: string` - Color of the button; see [Button](#button)
- - `buttons: any` - Buttons or other content to render inline with the button
-
-### `ColorBox`
-
-Displays a 1-character wide colored square. Can be used as a status indicator,
-or for visually representing a color.
-
-If you want to set a background color on an element, use a plain
-[Box](#box) instead.
-
-Props:
-
-- See inherited props: [Box](#box)
-- `color: string` - Color of the box.
-
-### `Dimmer`
-
-Dims surrounding area to emphasize content placed inside.
-
-Props:
-
-- See inherited props: [Box](#box)
-
-### `Dropdown`
-
-A simple dropdown box component. Lets the user select from a list of options and displays selected entry.
-
-Props:
-
- - See inherited props: [Box](#box)
- - `options: string[]` - An array of strings which will be displayed in the dropdown when open
- - `selected: string` - Currently selected entry
- - `width: number` - Width of dropdown button and resulting menu
- - `over: boolean` - dropdown renders over instead of below
- - `color: string` - color of dropdown button
- - `onClick: (e) => void` - Called when dropdown button is clicked
- - `onSelected: (value) => void` - Called when a value is picked from the list, `value` is the value that was picked
-
-### `Flex`
-
-Quickly manage the layout, alignment, and sizing of grid columns, navigation, components, and more with a full suite of responsive flexbox utilities.
-
-If you are new to or unfamiliar with flexbox, we encourage you to read this
-[CSS-Tricks flexbox guide](https://css-tricks.com/snippets/css/a-guide-to-flexbox/).
-
-Consists of two elements: `` and ``. Both of them provide
-the most straight-forward mapping to flex CSS properties as possible.
-
-One of the most basic usage of flex, is to align certain elements
-to the left, and certain elements to the right:
-
-```jsx
-
-
- Button description
-
-
-
-
-
-
-```
-
-Flex item with `grow` property serves as a "filler", to separate the other
-two flex items as far as possible from each other.
-
-Props:
-
-- See inherited props: [Box](#box)
-- `spacing: number` - Spacing between flex items, in integer units
-(1 unit - 0.5em). Does not directly relate to a flex css property
-(adds a modifier class under the hood), and only integer numbers are
-supported.
-- `direction: string` - This establishes the main-axis, thus defining the
-direction flex items are placed in the flex container.
- - `row` (default) - left to right.
- - `row-reverse` - right to left.
- - `column` - top to bottom.
- - `column-reverse` - bottom to top.
-- `wrap: string` - By default, flex items will all try to fit onto one line.
-You can change that and allow the items to wrap as needed with this property.
- - `nowrap` (default) - all flex items will be on one line
- - `wrap` - flex items will wrap onto multiple lines, from top to bottom.
- - `wrap-reverse` - flex items will wrap onto multiple lines from bottom to top.
-- `align: string` - Default alignment of all children.
- - `stretch` (default) - stretch to fill the container.
- - `start` - items are placed at the start of the cross axis.
- - `end` - items are placed at the end of the cross axis.
- - `center` - items are centered on the cross axis.
- - `baseline` - items are aligned such as their baselines align.
-- `justify: string` - This defines the alignment along the main axis.
-It helps distribute extra free space leftover when either all the flex
-items on a line are inflexible, or are flexible but have reached their
-maximum size. It also exerts some control over the alignment of items
-when they overflow the line.
- - `flex-start` (default) - items are packed toward the start of the
- flex-direction.
- - `flex-end` - items are packed toward the end of the flex-direction.
- - `space-between` - items are evenly distributed in the line; first item is
- on the start line, last item on the end line
- - `space-around` - items are evenly distributed in the line with equal space
- around them. Note that visually the spaces aren't equal, since all the items
- have equal space on both sides. The first item will have one unit of space
- against the container edge, but two units of space between the next item
- because that next item has its own spacing that applies.
- - `space-evenly` - items are distributed so that the spacing between any two
- items (and the space to the edges) is equal.
- - TBD (not all properties are supported in IE11).
-
-### `Flex.Item`
-
-Props:
-
-- See inherited props: [Box](#box)
-- `order: number` - By default, flex items are laid out in the source order.
-However, the order property controls the order in which they appear in the
-flex container.
-- `grow: number` - This defines the ability for a flex item to grow if
-necessary. It accepts a unitless value that serves as a proportion. It
-dictates what amount of the available space inside the flex container the
-item should take up. This number is unit-less and is relative to other
-siblings.
-- `shrink: number` - This defines the ability for a flex item to shrink
-if necessary. Inverse of `grow`.
-- `basis: string` - This defines the default size of an element before the
-remaining space is distributed. It can be a length (e.g. `20%`, `5rem`, etc.),
-an `auto` or `content` keyword.
-- `align: string` - This allows the default alignment (or the one specified by align-items) to be overridden for individual flex items. See: [Flex](#flex).
-
-
-### `Grid`
-
-Helps you to divide horizontal space into two or more equal sections.
-It is essentially a single-row `Table`, but with some extra features.
-
-Example:
-
-```jsx
-
-
-
-
-
-
-
-
-```
-
-Props:
-
-- See inherited props: [Table](#table)
-
-### `Grid.Column`
-
-Props:
-
-- See inherited props: [Table.Cell](#tablecell)
-- `size: number` (default: 1) - Size of the column relative to other columns.
-
-### `Icon`
-
-Renders one of the FontAwesome icons of your choice.
-
-```jsx
-
-```
-
-To smoothen the transition from v4 to v5, we have added a v4 semantic to
-transform names with `-o` suffixes to FA Regular icons. For example:
-- `square` will get transformed to `fas square`
-- `square-o` will get transformed to `far square`
-
-Props:
-
-- See inherited props: [Box](#box)
-- `name: string` - Icon name.
-- `size: number` - Icon size. `1` is normal size, `2` is two times bigger.
-Fractional numbers are supported.
-- `rotation: number` - Icon rotation, in degrees.
-- `spin: boolean` - Whether an icon should be spinning. Good for load
-indicators.
-
-### `Input`
-
-A basic text input, which allow users to enter text into a UI.
-
-> Input does not support custom font size and height due to the way
-> it's implemented in CSS. Eventually, this needs to be fixed.
-
-Props:
-
-- See inherited props: [Box](#box)
-- `value: string` - Value of an input.
-- `placeholder: string` - Text placed into Input box when value is otherwise nothing. Clears automatically when focused.
-- `fluid: boolean` - Fill all available horizontal space.
-- `selfClear: boolean` - Clear after hitting enter, as well as remain focused when this happens. Useful for things like chat inputs
-- `onChange: (e, value) => void` - An event, which fires when you commit
-the text by either unfocusing the input box, or by pressing the Enter key.
-- `onInput: (e, value) => void` - An event, which fires on every keypress.
-
-### `LabeledList`
-
-LabeledList is a continuous, vertical list of text and other content, where
-every item is labeled. It works just like a two column table, where first
-column is labels, and second column is content.
-
-```jsx
-
-
- Content
-
-
-```
-
-If you want to have a button on the right side of an item (for example,
-to perform some sort of action), there is a way to do that:
-
-```jsx
-
-
- )}>
- Content
-
-
-```
-
-Props:
-
-- `children: LabeledList.Item` - Items to render.
-
-### `LabeledList.Item`
-
-Props:
-
-- `label: string` - Item label.
-- `color: string` - Sets the color of the text.
-- `buttons: any` - Buttons to render aside the content.
-- `content/children: any` - Content of this labeled item.
-
-### `LabeledList.Divider`
-
-Adds some empty space between LabeledList items.
-
-Example:
-
-```jsx
-
-
- Content
-
-
-
-```
-
-Props:
-
-- `size: number` - Size of the divider.
-
-### `NoticeBox`
-
-A notice box, which warns you about something very important.
-
-Props:
-
-- See inherited props: [Box](#box)
-
-### `NumberInput`
-
-A fancy, interactive number input, which you can either drag up and down
-to fine tune the value, or single click it to manually type a number.
-
-Props:
-
-- `animated: boolean` - Animates the value if it was changed externally.
-- `fluid: boolean` - Fill all available horizontal space.
-- `value: number` - Value itself.
-- `unit: string` - Unit to display to the right of value.
-- `minValue: number` - Lowest possible value.
-- `maxValue: number` - Highest possible value.
-- `step: number` (default: 1) - Adjust value by this amount when
-dragging the input.
-- `stepPixelSize: number` (default: 1) - Screen distance mouse needs
-to travel to adjust value by one `step`.
-- `width: string|number` - Width of the element, in `Box` units or pixels.
-- `height: string|numer` - Height of the element, in `Box` units or pixels.
-- `lineHeight: string|number` - lineHeight of the element, in `Box` units or pixels.
-- `fontSize: string|number` - fontSize of the element, in `Box` units or pixels.
-- `format: value => value` - Format value using this function before
-displaying it.
-- `suppressFlicker: number` - A number in milliseconds, for which the input
-will hold off from updating while events propagate through the backend.
-Default is about 250ms, increase it if you still see flickering.
-- `onChange: (e, value) => void` - An event, which fires when you release
-the input, or successfully enter a number.
-- `onDrag: (e, value) => void` - An event, which fires about every 500ms
-when you drag the input up and down, on release and on manual editing.
-
-### `ProgressBar`
-
-Progress indicators inform users about the status of ongoing processes.
-
-```jsx
-
-```
-
-Usage of `ranges` prop:
-
-```jsx
-
-```
-
-Props:
-
-- `value: number` - Current progress as a floating point number between
-`minValue` (default: 0) and `maxValue` (default: 1). Determines the
-percentage and how filled the bar is.
-- `minValue: number` - Lowest possible value.
-- `maxValue: number` - Highest possible value.
-- `ranges: { color: [from, to] }` - Applies a `color` to the progress bar
-based on whether the value lands in the range between `from` and `to`.
-- `color: string` - Color of the progress bar.
-- `content/children: any` - Content to render inside the progress bar.
-
-### `Section`
-
-Section is a surface that displays content and actions on a single topic.
-
-They should be easy to scan for relevant and actionable information.
-Elements, like text and images, should be placed in them in a way that
-clearly indicates hierarchy.
-
-Section can also be titled to clearly define its purpose.
-
-```jsx
-
- Here you can order supply crates.
-
-```
-
-If you want to have a button on the right side of an section title
-(for example, to perform some sort of action), there is a way to do that:
-
-```jsx
-
- )}>
- Here you can order supply crates.
-
-```
-
-- See inherited props: [Box](#box)
-- `title: string` - Title of the section.
-- `level: number` - Section level in hierarchy. Default is 1, higher number
-means deeper level of nesting. Must be an integer number.
-- `buttons: any` - Buttons to render aside the section title.
-- `content/children: any` - Content of this section.
-
-### `Table`
-
-A straight forward mapping to a standard html table, which is slightly
-simplified (does not need a `` tag) and with sane default styles
-(e.g. table width is 100% by default).
-
-Example:
-
-```jsx
-
-
-
- Hello world!
-
-
- Label
-
-
-
-```
-
-Props:
-
-- See inherited props: [Box](#box)
-- `collapsing: boolean` - Collapses table to the smallest possible size.
-
-### `Table.Row`
-
-A straight forward mapping to `
` element.
-
-Props:
-
-- See inherited props: [Box](#box)
-
-### `Table.Cell`
-
-A straight forward mapping to `
` element.
-
-Props:
-
-- See inherited props: [Box](#box)
-- `collapsing: boolean` - Collapses table cell to the smallest possible size,
-and stops any text inside from wrapping.
-
-### `Tabs`
-
-Tabs make it easy to explore and switch between different views.
-
-Here is an example of how you would construct a simple tabbed view:
-
-```jsx
-
-
- Content for Item one.
-
-
- Content for Item two.
-
-
-```
-
-This is a rather simple example. In the real world, you might be
-constructing very complex tabbed views which can tax UI performance.
-This is because your tabs are being rendered regardless of their
-visibility status!
-
-There is a simple fix however. Tabs accept functions as children, which
-will be called to retrieve content only when the tab is visible:
-
-```jsx
-
-
- {() => (
-
- Content for Item one.
-
- )}
-
-
- {() => (
-
- Content for Item two.
-
- )}
-
-
-```
-
-You might not always need this, but it is highly recommended to always
-use this method. Notice the `key` prop on tabs - it uniquely identifies
-the tab and is used for determining which tab is currently active. It can
-be either explicitly provided as a `key` prop, or if omitted, it will be
-implicitly derived from the tab's `label` prop.
-
-Props:
-
-- `vertical: boolean` - Use a vertical configuration, where tabs will appear
-stacked on the left side of the container.
-- `altSelection` - Whether the tab buttons select via standard select (color change) or by adding a white indicator to the selected tab.
- Intended for usage on interfaces where tab color has relevance.
-- `children: Tab[]` - This component only accepts tabs as its children.
-
-### `Tabs.Tab`
-
-An individual tab element. Tabs function like buttons, so they inherit
-a lot of `Button` props.
-
-Props:
-
-- See inherited props: [Button](#button)
-- `key: string` - A unique identifier for the tab.
-- `label: string` - Tab label.
-- `icon: string` - Tab icon.
-- `content/children: any` - Content to render inside the tab.
-- `onClick: function` - Called when element is clicked.
-
-### `Tooltip`
-
-A boxy tooltip from tgui 1. It is very hacky in its current state, and
-requires setting `position: relative` on the container.
-
-Please note, that [Button](#button) component has a `tooltip` prop, and
-it is recommended to use that prop instead.
-
-Usage:
-
-```jsx
-
- Sample text.
-
-
-```
-
-Props:
-
-- `position: string` - Tooltip position.
-- `content/children: string` - Content of the tooltip. Must be a plain string.
-Fragments or other elements are **not** supported.
diff --git a/tgui-next/package.json b/tgui-next/package.json
deleted file mode 100644
index 9b7253e131c..00000000000
--- a/tgui-next/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "private": true,
- "name": "tgui-next",
- "version": "0.1.0",
- "workspaces": [
- "packages/*"
- ],
- "scripts": {
- "build": "eslint packages && cd packages/tgui && npx webpack --mode=production",
- "watch": "cd packages/tgui-dev-server && node --experimental-modules index.js",
- "analyze": "cd packages/tgui && npx webpack --mode=production --env.analyze=1",
- "lint": "eslint packages"
- },
- "dependencies": {
- "babel-eslint": "^10.0.3",
- "eslint": "^6.7.2",
- "eslint-plugin-react": "^7.17.0"
- }
-}
diff --git a/tgui-next/packages/tgui/public/tgui-fallback.html b/tgui-next/packages/tgui/public/tgui-fallback.html
deleted file mode 100644
index b9757bac483..00000000000
--- a/tgui-next/packages/tgui/public/tgui-fallback.html
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-