From 82bab45f2bf5ccc1653f222a0cc34b332f7de538 Mon Sep 17 00:00:00 2001 From: Geeves Date: Tue, 30 Jun 2020 22:18:11 +0200 Subject: [PATCH] Inductive Chargers (#9188) Added power efficient inductive chargers to cyborgs, maintenance-, construction- and mining drones, allowing them to charge power cells, and things that contain power cells. --- .../mob/living/silicon/robot/robot_items.dm | 85 ++++++++++++++++++ .../mob/living/silicon/robot/robot_modules.dm | 2 + .../geeves-stationbound_charger.yml | 6 ++ icons/obj/robot_items.dmi | Bin 9194 -> 9732 bytes 4 files changed, 93 insertions(+) create mode 100644 html/changelogs/geeves-stationbound_charger.yml diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index b1fb8a59422..13b745fa27c 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -392,3 +392,88 @@ /obj/item/weldingtool/robotic icon = 'icons/obj/robot_items.dmi' + +/obj/item/inductive_charger + name = "inductive charger" + desc = "A phoron-enhanced induction charger hooked up to its attached stationbound's internal cell." + desc_fluff = "Harnessing the energy potential found in phoron structures, Nanotrasen engineers have created a portable device capable of highly efficient wireless charging. The expense and limit of energy output of using this method of charging prevents it from being used on a large scale, being far outclassed by Phoron-Supermatter charging systems." + desc_info = "Click on an adjacent object that contains or is a power cell to attempt to find and charge it. After a successful charge, the inductive charger recharge in a few minutes. The amount transfered can be adjusted by alt clicking it." + icon = 'icons/obj/robot_items.dmi' + icon_state = "inductive_charger" + var/ready_to_use = TRUE + var/recharge_time = 300 + var/transfer_rate = 5000 + var/efficiency_mod = 0.9 + maptext_x = 3 + maptext_y = 2 + +/obj/item/inductive_charger/Initialize() + . = ..() + maptext = "Ready" + +/obj/item/inductive_charger/AltClick(mob/user) + . = ..() + var/set_rate = input(user, "How much do you want to transfer per use? (Limit: 1 - 5000)", "Induction Transfer Rate", 5000) as num + if(set_rate > 5000) + set_rate = 5000 + else if(set_rate < 1) + set_rate = 1 + transfer_rate = set_rate + to_chat(user, SPAN_NOTICE("You set the transfer rate of \the [src] to [transfer_rate].")) + +/obj/item/inductive_charger/attack(mob/living/M, mob/living/user, target_zone) + return + +/obj/item/inductive_charger/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + var/mob/living/silicon/robot/R = user + if(!istype(R)) + to_chat(user, SPAN_WARNING("Only cyborgs can use this!")) + return + if(!ready_to_use) + to_chat(user, SPAN_WARNING("\The [src] is still gathering charge!")) + return + + user.visible_message("[user] begins waving \the [src] around \the [target]...", SPAN_NOTICE("You prepare to wirelessly charge \the [target]..."), range = 3) + if(!do_after(user, 50, TRUE, target)) + return + if(R.cell.charge < 1000) + to_chat(user, SPAN_WARNING("You have no spare charge in your internal cell to give!")) + return + + if(isipc(target)) + var/mob/living/carbon/human/IPC = target + if(IPC.nutrition == IPC.max_nutrition) + to_chat(user, SPAN_WARNING("\The [IPC] is already fully charged!")) + return + var/charge_amount = min(IPC.max_nutrition - IPC.nutrition, transfer_rate) + var/charge_value = R.cell.use(charge_amount / efficiency_mod) * efficiency_mod + IPC.nutrition = min(IPC.max_nutrition, charge_value) + message_and_use(user, "[user] holds \the [src] over \the [IPC], topping up their battery.", SPAN_NOTICE("You wirelessly transmit [charge_value] units of power to \the [IPC], using [charge_value / efficiency_mod] of internal cell power.")) + else if(isobj(target)) + var/obj/item/cell/C + if(istype(target, /obj/item/cell)) + C = target + else + C = locate() in target + if(!C) + to_chat(user, SPAN_WARNING("\The [target] doesn't contain a cell, or it's buried too deep for you to reach!")) + return + if(C.fully_charged()) + to_chat(user, SPAN_WARNING("\The [C] is already fully charged!")) + return + var/charge_amount = min(C.maxcharge - C.charge, transfer_rate) + var/charge_value = R.cell.use(charge_amount / efficiency_mod) * efficiency_mod + C.give(charge_value) + message_and_use(user, "[user] holds \the [src] over \the [target], topping up its battery.", SPAN_NOTICE("You wirelessly transmit [charge_value] units of power to \the [target], using [charge_value / efficiency_mod] of internal cell power.")) + else + to_chat(user, SPAN_WARNING("\The [src] cannot be used on \the [target]!")) + +/obj/item/inductive_charger/proc/message_and_use(mob/user, var/others_message, var/self_message) + user.visible_message(others_message, self_message, range = 3) + addtimer(CALLBACK(src, .proc/recharge), recharge_time) + ready_to_use = FALSE + maptext = "Charge" + +/obj/item/inductive_charger/proc/recharge() + ready_to_use = TRUE + maptext = "Ready" \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index af03da1cc3e..055ae5bc151 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -55,6 +55,8 @@ var/global/list/robot_modules = list( ..() R.module = src + src.modules += new /obj/item/inductive_charger(src) + add_camera_networks(R) add_languages(R) add_subsystems(R) diff --git a/html/changelogs/geeves-stationbound_charger.yml b/html/changelogs/geeves-stationbound_charger.yml new file mode 100644 index 00000000000..c73ed84bf0e --- /dev/null +++ b/html/changelogs/geeves-stationbound_charger.yml @@ -0,0 +1,6 @@ +author: Geeves + +delete-after: True + +changes: + - rscadd: "Added power efficient inductive chargers to cyborgs, maintenance-, construction- and mining drones, allowing them to charge power cells, and things that contain power cells." diff --git a/icons/obj/robot_items.dmi b/icons/obj/robot_items.dmi index a43a0cc27b889174e234385fe3dea7ccae571640..8a495202f7f407b16770531d5d36dbeb71f1b0f6 100644 GIT binary patch literal 9732 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 literal 9194 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