From 4d105bb50fe4935986bb1cd1bac70f51274f41ea Mon Sep 17 00:00:00 2001
From: SandPoot <43283559+SandPoot@users.noreply.github.com>
Date: Tue, 18 Aug 2020 01:22:14 -0300
Subject: [PATCH] A few fixes and stuff (#51)
---
.../mob/living/carbon/human/examine.dm | 2 +-
sandcode/code/game/mecha/mech_fabricator.dm | 487 ------------------
.../circuitboards/machine_circuitboards.dm | 9 -
sandcode/code/modules/admin/verbs/fix_air.dm | 2 +-
.../research/designs/machine_designs.dm | 8 -
.../modules/research/techweb/all_nodes.dm | 8 -
sandcode/icons/obj/robotics.dmi | Bin 11376 -> 0 bytes
tgstation.dme | 1 -
8 files changed, 2 insertions(+), 515 deletions(-)
delete mode 100644 sandcode/code/game/mecha/mech_fabricator.dm
delete mode 100644 sandcode/icons/obj/robotics.dmi
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 7d6c5c7986..1f3e4ad458 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -371,7 +371,7 @@
if(!key)
msg += "[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely.\n"
else if(!client)
- msg += "[t_He] [t_has] a blank, absent-minded stare and appears completely unresponsive to anything. [t_He] may snap out of it soon.\n"
+ msg += "[t_He] [t_has] a blank, absent-minded stare and [t_has] been completely unresponsive to anything for [round(((world.time - lastclienttime) / (1 MINUTES)), 1)] minutes. [t_He] may snap out of it soon.\n" //SKYRAT CHANGE - ssd indicator
if(digitalcamo)
msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\n"
diff --git a/sandcode/code/game/mecha/mech_fabricator.dm b/sandcode/code/game/mecha/mech_fabricator.dm
deleted file mode 100644
index 396da01ed5..0000000000
--- a/sandcode/code/game/mecha/mech_fabricator.dm
+++ /dev/null
@@ -1,487 +0,0 @@
-/obj/machinery/mecha_part_fabricator_adv
- icon = 'sandcode/icons/obj/robotics.dmi'
- icon_state = "fab-idle"
- name = "advanced exosuit fabricator"
- desc = "Nothing is being built."
- density = TRUE
- use_power = IDLE_POWER_USE
- idle_power_usage = 20
- active_power_usage = 5000
- req_access = list(ACCESS_ROBOTICS)
- circuit = /obj/item/circuitboard/machine/mechfab_adv
- var/time_coeff = 1
- var/component_coeff = 1
- var/datum/techweb/specialized/autounlocking/exofab/stored_research
- var/sync = 0
- var/part_set
- var/datum/design/being_built
- var/list/queue = list()
- var/processing_queue = 0
- var/screen = "main"
- var/link_on_init = TRUE
- var/temp
- var/offstation_security_levels = TRUE
- var/datum/component/remote_materials/rmat
- var/list/part_sets = list(
- "Cyborg",
- "Ripley",
- "Firefighter",
- "Odysseus",
- "Gygax",
- "Medical-Spec Gygax",
- "Durand",
- "H.O.N.K",
- "Phazon",
- "Exosuit Equipment",
- "Exosuit Ammunition",
- "Cyborg Upgrade Modules",
- "Misc"
- )
-
-/obj/machinery/mecha_part_fabricator_adv/Initialize(mapload)
- stored_research = new
- rmat = AddComponent(/datum/component/remote_materials, "mechfab", mapload && link_on_init)
- RefreshParts() //Recalculating local material sizes if the fab isn't linked
- return ..()
-
-/obj/machinery/mecha_part_fabricator_adv/examine(mob/user)
- . = ..()
- if(in_range(user, src) || isobserver(user))
- . += "The status display reads: Storing up to [rmat.local_size] material units.
Material consumption at [component_coeff*100]%.
Build time reduced by [100-time_coeff*100]%."
-
-/obj/machinery/mecha_part_fabricator_adv/RefreshParts()
- var/T = 0
-
- //maximum stocking amount (default 300000, 600000 at T4)
- for(var/obj/item/stock_parts/matter_bin/M in component_parts)
- T += M.rating
- rmat.set_local_size((200000 + (T*50000)))
-
- //resources adjustment coefficient (1 -> 0.85 -> 0.7 -> 0.55)
- T = 1.15
- for(var/obj/item/stock_parts/micro_laser/Ma in component_parts)
- T -= Ma.rating*0.15
- component_coeff = T
-
- //building time adjustment coefficient (1 -> 0.8 -> 0.6)
- T = -1
- for(var/obj/item/stock_parts/manipulator/Ml in component_parts)
- T += Ml.rating
- time_coeff = round(initial(time_coeff) - (initial(time_coeff)*(T))/5,0.01)
-
-/obj/machinery/mecha_part_fabricator_adv/emag_act()
- . = ..()
- if(obj_flags & EMAGGED)
- return
- obj_flags |= EMAGGED
- req_access = list()
- INVOKE_ASYNC(src, .proc/error_action_sucessful)
- return TRUE
-
-/obj/machinery/mecha_part_fabricator_adv/proc/error_action_sucessful()
- say("DB error \[Code 0x00F1\]")
- sleep(10)
- say("Attempting auto-repair...")
- sleep(15)
- say("User DB corrupted \[Code 0x00FA\]. Truncating data structure...")
- sleep(30)
- say("User DB truncated. Please contact your Nanotrasen system operator for future assistance.")
-
-
-/obj/machinery/mecha_part_fabricator_adv/proc/output_parts_list(set_name)
- var/output = ""
- for(var/v in stored_research.researched_designs)
- var/datum/design/D = SSresearch.techweb_design_by_id(v)
- if(D.build_type & MECHFAB)
- if(!(set_name in D.category))
- continue
- output += "
[output_part_info(D)]
\["
- if(check_clearance(D) && check_resources(D))
- output += "
Build | "
- output += "
Add to queue\]\[
?\]
"
- return output
-
-/obj/machinery/mecha_part_fabricator_adv/proc/check_clearance(datum/design/D)
- if(!(obj_flags & EMAGGED) && (offstation_security_levels || is_station_level(z)) && !ISINRANGE(GLOB.security_level, D.min_security_level, D.max_security_level))
- return FALSE
- return TRUE
-
-/obj/machinery/mecha_part_fabricator_adv/proc/output_part_info(datum/design/D)
- var/clearance = !(obj_flags & EMAGGED) && (offstation_security_levels || is_station_level(z))
- var/sec_text = ""
- if(clearance && (D.min_security_level > SEC_LEVEL_GREEN || D.max_security_level < SEC_LEVEL_DELTA))
- sec_text = " (Allowed security levels: "
- for(var/n in D.min_security_level to D.max_security_level)
- sec_text += NUM2SECLEVEL(n)
- if(n + 1 <= D.max_security_level)
- sec_text += ", "
- sec_text += ") "
- var/output = "[initial(D.name)] (Cost: [output_part_cost(D)]) [sec_text][get_construction_time_w_coeff(D)/10]sec"
- return output
-
-/obj/machinery/mecha_part_fabricator_adv/proc/output_part_cost(datum/design/D)
- var/i = 0
- var/output
- for(var/c in D.materials)
- var/datum/material/M = c
- output += "[i?" | ":null][get_resource_cost_w_coeff(D, M)] [M.name]"
- i++
- return output
-
-/obj/machinery/mecha_part_fabricator_adv/proc/output_available_resources()
- var/output
- var/datum/component/material_container/materials = rmat.mat_container
-
- if(materials)
- for(var/mat_id in materials.materials)
- var/datum/material/M = mat_id
- var/amount = materials.materials[mat_id]
- var/ref = REF(M)
- output += "[M.name]: [amount] cm³"
- if(amount >= MINERAL_MATERIAL_AMOUNT)
- output += "- Remove \[1\]"
- if(amount >= (MINERAL_MATERIAL_AMOUNT * 10))
- output += " | \[10\]"
- output += " | \[50\]"
- output += "
"
- else
- output += "No material storage connected, please contact the quartermaster.
"
- return output
-
-/obj/machinery/mecha_part_fabricator_adv/proc/get_resources_w_coeff(datum/design/D)
- var/list/resources = list()
- for(var/R in D.materials)
- resources[R] = get_resource_cost_w_coeff(D, R)
- return resources
-
-/obj/machinery/mecha_part_fabricator_adv/proc/check_resources(datum/design/D)
- if(D.reagents_list.len) // No reagents storage - no reagent designs.
- return FALSE
- var/datum/component/material_container/materials = rmat.mat_container
- if(materials.has_materials(get_resources_w_coeff(D)))
- return TRUE
- return FALSE
-
-/obj/machinery/mecha_part_fabricator_adv/proc/build_part(datum/design/D)
- var/list/res_coef = get_resources_w_coeff(D)
-
- var/datum/component/material_container/materials = rmat.mat_container
- if (!materials)
- say("No access to material storage, please contact the quartermaster.")
- return FALSE
- if (rmat.on_hold())
- say("Mineral access is on hold, please contact the quartermaster.")
- return FALSE
- if(!check_resources(D))
- say("Not enough resources. Queue processing stopped.")
- return FALSE
- being_built = D
- desc = "It's building \a [initial(D.name)]."
- materials.use_materials(res_coef)
- rmat.silo_log(src, "built", -1, "[D.name]", res_coef)
-
- add_overlay("fab-active")
- use_power = ACTIVE_POWER_USE
- updateUsrDialog()
- sleep(get_construction_time_w_coeff(D))
- use_power = IDLE_POWER_USE
- cut_overlay("fab-active")
- desc = initial(desc)
-
- var/location = get_step(src,(dir))
- var/obj/item/I = new D.build_path(location)
- I.set_custom_materials(res_coef)
- say("\The [I] is complete.")
- being_built = null
-
- updateUsrDialog()
-
- return TRUE
-
-/obj/machinery/mecha_part_fabricator_adv/proc/update_queue_on_page()
- send_byjax(usr,"mecha_fabricator.browser","queue",list_queue())
- return
-
-/obj/machinery/mecha_part_fabricator_adv/proc/add_part_set_to_queue(set_name)
- if(set_name in part_sets)
- for(var/v in stored_research.researched_designs)
- var/datum/design/D = SSresearch.techweb_design_by_id(v)
- if(D.build_type & MECHFAB)
- if(set_name in D.category)
- add_to_queue(D)
-
-/obj/machinery/mecha_part_fabricator_adv/proc/add_to_queue(D)
- if(!istype(queue))
- queue = list()
- if(D)
- queue[++queue.len] = D
- return queue.len
-
-/obj/machinery/mecha_part_fabricator_adv/proc/remove_from_queue(index)
- if(!isnum(index) || !ISINTEGER(index) || !istype(queue) || (index<1 || index>queue.len))
- return FALSE
- queue.Cut(index,++index)
- return TRUE
-
-/obj/machinery/mecha_part_fabricator_adv/proc/process_queue()
- var/datum/design/D = queue[1]
- if(!D)
- remove_from_queue(1)
- if(queue.len)
- return process_queue()
- else
- return
- temp = null
- while(D)
- if(stat&(NOPOWER|BROKEN))
- return FALSE
- if(!check_clearance(D))
- say("Security level not met. Queue processing stopped.")
- temp = {"Security level not met to build next part.
- Try again | Return"}
- return FALSE
- if(!check_resources(D))
- say("Not enough resources. Queue processing stopped.")
- temp = {"Not enough resources to build next part.
- Try again | Return"}
- return FALSE
- remove_from_queue(1)
- build_part(D)
- D = listgetindex(queue, 1)
- say("Queue processing finished successfully.")
-
-/obj/machinery/mecha_part_fabricator_adv/proc/list_queue()
- var/output = "Queue contains:"
- if(!istype(queue) || !queue.len)
- output += "
Nothing"
- else
- output += ""
- var/i = 0
- for(var/datum/design/D in queue)
- i++
- var/obj/part = D.build_path
- output += "- "
- output += initial(part.name) + " - "
- output += "[i>1?"↑":null] "
- output += "[i↓
":null] "
- output += "Remove"
-
- output += ""
- output += "\[Process queue | Clear queue\]"
- return output
-
-/obj/machinery/mecha_part_fabricator_adv/proc/sync()
- temp = "Updating local R&D database..."
- updateUsrDialog()
- sleep(30) //only sleep if called by user
-
- for(var/obj/machinery/computer/rdconsole/RDC in oview(7,src))
- RDC.stored_research.copy_research_to(stored_research)
- temp = "Processed equipment designs.
"
- //check if the tech coefficients have changed
- temp += "Return"
-
- updateUsrDialog()
- say("Successfully synchronized with R&D server.")
- return
-
- temp = "Unable to connect to local R&D Database.
Please check your connections and try again.
Return"
- updateUsrDialog()
- return
-
-/obj/machinery/mecha_part_fabricator_adv/proc/get_resource_cost_w_coeff(datum/design/D, resource, roundto = 1)
- return round(D.materials[resource]*component_coeff, roundto)
-
-/obj/machinery/mecha_part_fabricator_adv/proc/get_construction_time_w_coeff(datum/design/D, roundto = 1) //aran
- return round(initial(D.construction_time)*time_coeff, roundto)
-
-/obj/machinery/mecha_part_fabricator_adv/ui_interact(mob/user as mob)
- . = ..()
- var/dat, left_part
- user.set_machine(src)
- var/turf/exit = get_step(src,(dir))
- if(exit.density)
- say("Error! Part outlet is obstructed.")
- return
- if(temp)
- left_part = temp
- else if(being_built)
- var/obj/I = being_built.build_path
- left_part = {"Building [initial(I.name)].
- Please wait until completion..."}
- else
- switch(screen)
- if("main")
- left_part = output_available_resources()+"
"
- left_part += "Sync with R&D servers
"
- for(var/part_set in part_sets)
- left_part += "[part_set] - \[Add all parts to queue\]
"
- if("parts")
- left_part += output_parts_list(part_set)
- left_part += "
Return"
- dat = {"
-
-
- [name] data
-
-
-
-
-
-
- |
- [left_part]
- |
-
- [list_queue()]
- |
-
-
-
- "}
- user << browse(dat, "window=mecha_fabricator;size=1000x430")
- onclose(user, "mecha_fabricator")
- return
-
-/obj/machinery/mecha_part_fabricator_adv/Topic(href, href_list)
- if(..())
- return
- if(href_list["part_set"])
- var/tpart_set = href_list["part_set"]
- if(tpart_set)
- if(tpart_set=="clear")
- part_set = null
- else
- part_set = tpart_set
- screen = "parts"
- if(href_list["part"])
- var/T = href_list["part"]
- for(var/v in stored_research.researched_designs)
- var/datum/design/D = SSresearch.techweb_design_by_id(v)
- if(D.build_type & MECHFAB)
- if(D.id == T)
- if(!processing_queue)
- build_part(D)
- else
- add_to_queue(D)
- break
- if(href_list["add_to_queue"])
- var/T = href_list["add_to_queue"]
- for(var/v in stored_research.researched_designs)
- var/datum/design/D = SSresearch.techweb_design_by_id(v)
- if(D.build_type & MECHFAB)
- if(D.id == T)
- add_to_queue(D)
- break
- return update_queue_on_page()
- if(href_list["remove_from_queue"])
- remove_from_queue(text2num(href_list["remove_from_queue"]))
- return update_queue_on_page()
- if(href_list["partset_to_queue"])
- add_part_set_to_queue(href_list["partset_to_queue"])
- return update_queue_on_page()
- if(href_list["process_queue"])
- spawn(0)
- if(processing_queue || being_built)
- return FALSE
- processing_queue = 1
- process_queue()
- processing_queue = 0
- if(href_list["clear_temp"])
- temp = null
- if(href_list["screen"])
- screen = href_list["screen"]
- if(href_list["queue_move"] && href_list["index"])
- var/index = text2num(href_list["index"])
- var/new_index = index + text2num(href_list["queue_move"])
- if(isnum(index) && isnum(new_index) && ISINTEGER(index) && ISINTEGER(new_index))
- if(ISINRANGE(new_index,1,queue.len))
- queue.Swap(index,new_index)
- return update_queue_on_page()
- if(href_list["clear_queue"])
- queue = list()
- return update_queue_on_page()
- if(href_list["sync"])
- sync()
- if(href_list["part_desc"])
- var/T = href_list["part_desc"]
- for(var/v in stored_research.researched_designs)
- var/datum/design/D = SSresearch.techweb_design_by_id(v)
- if(D.build_type & MECHFAB)
- if(D.id == T)
- var/obj/part = D.build_path
- temp = {"[initial(part.name)] description:
- [initial(part.desc)]
- Return
- "}
- break
-
- if(href_list["remove_mat"] && href_list["material"])
- var/datum/material/Mat = locate(href_list["material"])
- eject_sheets(Mat, text2num(href_list["remove_mat"]))
-
- updateUsrDialog()
- return
-
-/obj/machinery/mecha_part_fabricator_adv/proc/do_process_queue()
- if(processing_queue || being_built)
- return FALSE
- processing_queue = 1
- process_queue()
- processing_queue = 0
-
-/obj/machinery/mecha_part_fabricator_adv/proc/eject_sheets(eject_sheet, eject_amt)
- var/datum/component/material_container/mat_container = rmat.mat_container
- if (!mat_container)
- say("No access to material storage, please contact the quartermaster.")
- return 0
- if (rmat.on_hold())
- say("Mineral access is on hold, please contact the quartermaster.")
- return 0
- var/count = mat_container.retrieve_sheets(text2num(eject_amt), eject_sheet, drop_location())
- var/list/matlist = list()
- matlist[eject_sheet] = text2num(eject_amt)
- rmat.silo_log(src, "ejected", -count, "sheets", matlist)
- return count
-
-/obj/machinery/mecha_part_fabricator_adv/proc/AfterMaterialInsert(type_inserted, id_inserted, amount_inserted)
- var/stack_name = material2name(id_inserted)
- add_overlay("fab-load-[stack_name]")
- addtimer(CALLBACK(src, /atom/proc/cut_overlay, "fab-load-[stack_name]"), 10)
- updateUsrDialog()
-
-/obj/machinery/mecha_part_fabricator_adv/attackby(obj/item/W, mob/user, params)
- if(default_deconstruction_screwdriver(user, "fab-o", "fab-idle", W))
- return TRUE
-
- if(default_deconstruction_crowbar(W))
- return TRUE
-
- return ..()
-
-/obj/machinery/mecha_part_fabricator_adv/proc/material2name(ID)
- return copytext(ID,2)
-
-/obj/machinery/mecha_part_fabricator_adv/proc/is_insertion_ready(mob/user)
- if(panel_open)
- to_chat(user, "You can't load [src] while it's opened!")
- return FALSE
- if(being_built)
- to_chat(user, "\The [src] is currently processing! Please wait until completion.")
- return FALSE
-
- return TRUE
-
-/obj/machinery/mecha_part_fabricator_adv/maint
- link_on_init = FALSE
diff --git a/sandcode/code/game/objects/items/circuitboards/machine_circuitboards.dm b/sandcode/code/game/objects/items/circuitboards/machine_circuitboards.dm
index 3dd6a9ada6..ab97d07d54 100644
--- a/sandcode/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/sandcode/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -1,12 +1,3 @@
-/obj/item/circuitboard/machine/mechfab_adv
- name = "advanced exosuit fabricator (Machine board)"
- build_path = /obj/machinery/mecha_part_fabricator_adv
- req_components = list(
- /obj/item/stock_parts/matter_bin = 2,
- /obj/item/stock_parts/manipulator = 1,
- /obj/item/stock_parts/micro_laser = 1,
- /obj/item/stack/sheet/glass = 1)
-
/obj/item/circuitboard/machine/pacman/mclunky
name = "McLunky-type Generator (Machine Board)"
build_path = /obj/machinery/power/port_gen/pacman/mclunky
diff --git a/sandcode/code/modules/admin/verbs/fix_air.dm b/sandcode/code/modules/admin/verbs/fix_air.dm
index 2798d5543f..4281491e39 100644
--- a/sandcode/code/modules/admin/verbs/fix_air.dm
+++ b/sandcode/code/modules/admin/verbs/fix_air.dm
@@ -1,7 +1,7 @@
// Proc taken from yogstation, credit to nichlas0010 for the original
/client/proc/fix_air(turf/open/T in world)
set name = "Fix Air"
- set category = "Admin - Game"
+ set category = "Admin"
set desc = "Fixes air in specified radius."
if(!holder)
diff --git a/sandcode/code/modules/research/designs/machine_designs.dm b/sandcode/code/modules/research/designs/machine_designs.dm
index f073c4fd89..fa8cac12f7 100644
--- a/sandcode/code/modules/research/designs/machine_designs.dm
+++ b/sandcode/code/modules/research/designs/machine_designs.dm
@@ -14,14 +14,6 @@
category = list("Teleportation Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
-/datum/design/board/mecha_part_fabricator_adv
- name= "Machine Design (Advanced exosuit fabricator)"
- desc = "An advanced version of the exosuit fabricator that can link to oresilos!"
- id = "mech_fab_adv"
- build_path = /obj/item/circuitboard/machine/mechfab_adv
- category = list("Research Machinery")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
/datum/design/mclunky_electronics
name = "Machine Design (McLunky Circuit Board)"
desc = "Now just give the parts to the botanist and they could perhaps be making power for you!"
diff --git a/sandcode/code/modules/research/techweb/all_nodes.dm b/sandcode/code/modules/research/techweb/all_nodes.dm
index f3a8a03924..890d423bcd 100644
--- a/sandcode/code/modules/research/techweb/all_nodes.dm
+++ b/sandcode/code/modules/research/techweb/all_nodes.dm
@@ -23,14 +23,6 @@
design_ids = list("telepad", "telesci_console")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
-/datum/techweb_node/adv_mechfab
- id = "advanced_mechfab"
- display_name = "Advanced Exosuit Fabricator"
- description = "Studying more about devices you get to know how to make a linkable exosuit fabricator"
- prereq_ids = list("datatheory")
- design_ids = list("mech_fab_adv")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
-
/datum/techweb_node/adv_toolset_implant
id = "adv_toolset_implant"
display_name = "Advanced Toolset Implant"
diff --git a/sandcode/icons/obj/robotics.dmi b/sandcode/icons/obj/robotics.dmi
deleted file mode 100644
index aa1c02010e6a96233c8936abae89fe21bed62dd0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 11376
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
diff --git a/tgstation.dme b/tgstation.dme
index d6ea1a846e..0497784ce4 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3584,7 +3584,6 @@
#include "sandcode\code\game\machinery\posialert.dm"
#include "sandcode\code\game\machinery\computer\arcade\tetris.dm"
#include "sandcode\code\game\machinery\pipe\construction.dm"
-#include "sandcode\code\game\mecha\mech_fabricator.dm"
#include "sandcode\code\game\mecha\mecha_construction_paths.dm"
#include "sandcode\code\game\mecha\mecha_parts.dm"
#include "sandcode\code\game\objects\effects\contraband.dm"