diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index fc8faea243b..d33e9987416 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -295,6 +295,90 @@ won't update every console in existence) but it's more of a hassle to do. Also, clear_wait_message() SStgui.update_uis(src) +/obj/machinery/computer/rdconsole/proc/start_destroyer(usr) + if(!linked_destroy || !usr) + return + + if(linked_destroy.busy) + to_chat(usr, "[linked_destroy] is busy at the moment.") + return + + if(!linked_destroy.loaded_item) + to_chat(usr, "[linked_destroy] appears to be empty.") + return + + var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech) + var/pointless = FALSE + + for(var/T in temp_tech) + if(files.IsTechHigher(T, temp_tech[T])) + pointless = TRUE + break + + if(!pointless) + var/choice = input("This item does not raise tech levels. Proceed destroying loaded item anyway?") in list("Proceed", "Cancel") + if(choice == "Cancel" || !linked_destroy) + return + + linked_destroy.busy = TRUE + add_wait_message("Processing and Updating Database...", DECONSTRUCT_DELAY) + flick("d_analyzer_process", linked_destroy) + addtimer(CALLBACK(src, .proc/finish_destroyer, usr, temp_tech), DECONSTRUCT_DELAY) + +// Sends salvaged materials to a linked protolathe, if any. +/obj/machinery/computer/rdconsole/proc/send_mats() + if(!linked_lathe || !linked_destroy || !linked_destroy.loaded_item) + return + + for(var/material in linked_destroy.loaded_item.materials) + var/space = linked_lathe.materials.max_amount - linked_lathe.materials.total_amount + // as item rating increases, amount salvageable increases + var/salvageable = linked_destroy.loaded_item.materials[material] * (linked_destroy.decon_mod / 10) + // but you shouldn't salvage more than the raw materials amount + var/available = linked_destroy.loaded_item.materials[material] + var/can_insert = min(space, salvageable, available) + linked_lathe.materials.insert_amount(can_insert, material) + +/obj/machinery/computer/rdconsole/proc/finish_destroyer(usr, list/temp_tech) + clear_wait_message() + if(!linked_destroy || !usr || !temp_tech) + return + + if(!linked_destroy.hacked) + if(!linked_destroy.loaded_item) + to_chat(usr, "[linked_destroy] appears to be empty.") + else + for(var/T in temp_tech) + var/datum/tech/KT = files.known_tech[T] //For stat logging of high levels + if(files.IsTechHigher(T, temp_tech[T]) && KT.level >= 5) //For stat logging of high levels + feedback_add_details("high_research_level","[KT][KT.level + 1]") //+1 to show the level which we're about to get + files.UpdateTech(T, temp_tech[T]) + send_mats() + linked_destroy.loaded_item = null + + for(var/obj/I in linked_destroy.contents) + for(var/mob/M in I.contents) + M.death() + if(istype(I, /obj/item/stack/sheet))//Only deconstructs one sheet at a time instead of the entire stack + var/obj/item/stack/sheet/S = I + if(S.amount > 1) + S.amount-- + linked_destroy.loaded_item = S + else + qdel(S) + linked_destroy.icon_state = "d_analyzer" + else if(!(I in linked_destroy.component_parts)) + qdel(I) + linked_destroy.icon_state = "d_analyzer" + + linked_destroy.busy = FALSE + use_power(DECONSTRUCT_POWER) + menu = MENU_MAIN + submenu = SUBMENU_MAIN + SStgui.update_uis(src) + + + /obj/machinery/computer/rdconsole/tgui_act(action, list/params) if(..()) return @@ -415,73 +499,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, griefProtection() //Update centcomm too if("deconstruct") //Deconstruct the item in the destructive analyzer and update the research holder. - if(linked_destroy) - if(linked_destroy.busy) - to_chat(usr, "[linked_destroy] is busy at the moment.") - return - if(!linked_destroy.loaded_item) - to_chat(usr, "[linked_destroy] appears to be empty.") - return - var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech) - var/cancontinue = FALSE - for(var/T in temp_tech) - if(files.IsTechHigher(T, temp_tech[T])) - cancontinue = TRUE - break - if(!cancontinue) - var/choice = input("This item does not raise tech levels. Proceed destroying loaded item anyway?") in list("Proceed", "Cancel") - if(choice == "Cancel" || !linked_destroy) - return - linked_destroy.busy = TRUE - add_wait_message("Processing and Updating Database...", DECONSTRUCT_DELAY) - flick("d_analyzer_process", linked_destroy) - spawn(DECONSTRUCT_DELAY) - clear_wait_message() - if(linked_destroy) - linked_destroy.busy = FALSE - if(!linked_destroy.hacked) - if(!linked_destroy.loaded_item) - to_chat(usr, "[linked_destroy] appears to be empty.") - menu = MENU_MAIN - submenu = SUBMENU_MAIN - return - for(var/T in temp_tech) - var/datum/tech/KT = files.known_tech[T] //For stat logging of high levels - if(files.IsTechHigher(T, temp_tech[T]) && KT.level >= 5) //For stat logging of high levels - feedback_add_details("high_research_level","[KT][KT.level + 1]") //+1 to show the level which we're about to get - files.UpdateTech(T, temp_tech[T]) - menu = MENU_MAIN - submenu = SUBMENU_MAIN - if(linked_lathe) //Also sends salvaged materials to a linked protolathe, if any. - for(var/material in linked_destroy.loaded_item.materials) - var/space = linked_lathe.materials.max_amount - linked_lathe.materials.total_amount - // as item rating increases, amount salvageable increases - var/salvageable = linked_destroy.loaded_item.materials[material] * (linked_destroy.decon_mod / 10) - // but you shouldn't salvage more than the raw materials amount - var/available = linked_destroy.loaded_item.materials[material] - var/can_insert = min(space, salvageable, available) - linked_lathe.materials.insert_amount(can_insert, material) - linked_destroy.loaded_item = null - else - menu = MENU_MAIN - submenu = SUBMENU_MAIN - for(var/obj/I in linked_destroy.contents) - for(var/mob/M in I.contents) - M.death() - if(istype(I, /obj/item/stack/sheet))//Only deconsturcts one sheet at a time instead of the entire stack - var/obj/item/stack/sheet/S = I - if(S.amount > 1) - S.amount-- - linked_destroy.loaded_item = S - else - qdel(S) - linked_destroy.icon_state = "d_analyzer" - else - if(!(I in linked_destroy.component_parts)) - qdel(I) - linked_destroy.icon_state = "d_analyzer" - use_power(DECONSTRUCT_POWER) - SStgui.update_uis(src) + start_destroyer(usr) if("sync") //Sync the research holder with all the R&D consoles in the game that aren't sync protected. if(!sync)