From 34748701774d8da9d35bad5df43976104d64e05e Mon Sep 17 00:00:00 2001 From: TheFurryFeline <38586851+TheFurryFeline@users.noreply.github.com> Date: Mon, 16 Dec 2019 10:34:54 -0500 Subject: [PATCH] Light Replacer QOL Tweaks light replacers to allow automatic replacing of broken bulbs in a light fixture. Also lets you shove bulbs into said objects. Ported from Yogastation with code used from https://github.com/CHOMPstation/CHOMPstation/pull/517. If there's a better way to code this, do tell me. It works, however. Changelog notes: - Light replacer now uses broken lights instead of dropping them - Every 4 broken lights switched refills the light replacer with 1 new bulb - You can now also use a box of lights on the light replacer to refill it (the old method of using the light replacer on the box still works) --- .../objects/items/devices/lightreplacer.dm | 106 +++++++++++++++--- .../TheFurryFeline - Bulbs_Recycling.yml | 36 ++++++ 2 files changed, 126 insertions(+), 16 deletions(-) create mode 100644 html/changelogs/TheFurryFeline - Bulbs_Recycling.yml diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 4686aee807..f85e424604 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -54,6 +54,11 @@ var/failmsg = "" var/charge = 0 + // Eating used bulbs gives us bulb shards + var/bulb_shards = 0 + // when we get this many shards, we get a free bulb. + var/shards_required = 4 + /obj/item/device/lightreplacer/New() failmsg = "The [name]'s refill light blinks red." ..() @@ -76,18 +81,55 @@ to_chat(user, "You need one sheet of glass to replace lights.") if(istype(W, /obj/item/weapon/light)) + var/new_bulbs = 0 var/obj/item/weapon/light/L = W if(L.status == 0) // LIGHT OKAY if(uses < max_uses) + if(!user.unEquip(W)) + return add_uses(1) - to_chat(user, "You insert \the [L.name] into \the [src.name]. You have [uses] light\s remaining.") - user.drop_item() qdel(L) - return else - to_chat(user, "You need a working light.") + if(!user.unEquip(W)) + return + new_bulbs += AddShards(1) + qdel(L) + if(new_bulbs != 0) + playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + to_chat(user, "You insert \the [L.name] into \the [src.name]. You have [uses] light\s remaining.") + return + + if(istype(W, /obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = W + var/found_lightbulbs = FALSE + var/replaced_something = TRUE + + for(var/obj/item/I in S.contents) + if(istype(I,/obj/item/weapon/light)) + var/obj/item/weapon/light/L = I + found_lightbulbs = TRUE + if(src.uses >= max_uses) + break + if(L.status == LIGHT_OK) + replaced_something = TRUE + add_uses(1) + qdel(L) + + else if(L.status == LIGHT_BROKEN || L.status == LIGHT_BURNED) + replaced_something = TRUE + AddShards(1) + qdel(L) + + if(!found_lightbulbs) + to_chat(user, "\The [S] contains no bulbs.") return + if(!replaced_something && src.uses == max_uses) + to_chat(user, "\The [src] is full!") + return + + to_chat(user, "You fill \the [src] with lights from \the [S].") + /obj/item/device/lightreplacer/attack_self(mob/user) /* // This would probably be a bit OP. If you want it though, uncomment the code. if(isrobot(user)) @@ -113,6 +155,15 @@ /obj/item/device/lightreplacer/proc/add_uses(var/amount = 1) uses = min(max(uses + amount, 0), max_uses) + +/obj/item/device/lightreplacer/proc/AddShards(amount = 1) + bulb_shards += amount + var/new_bulbs = round(bulb_shards / shards_required) + if(new_bulbs > 0) + add_uses(new_bulbs) + bulb_shards = bulb_shards % shards_required + return new_bulbs + /obj/item/device/lightreplacer/proc/Charge(var/mob/user, var/amount = 1) charge += amount if(charge > 6) @@ -121,18 +172,41 @@ /obj/item/device/lightreplacer/proc/ReplaceLight(var/obj/machinery/light/target, var/mob/living/U) - if(target.status == LIGHT_OK) + if(target.status != LIGHT_OK) + if(CanUse(U)) + if(!Use(U)) return + to_chat(U, "You replace the [target.get_fitting_name()] with the [src].") + + if(target.status != LIGHT_EMPTY) + var/new_bulbs = AddShards(1) + if(new_bulbs != 0) + to_chat(U, "\The [src] has fabricated a new bulb from the broken bulbs it has stored. It now has [uses] uses.") + playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + target.status = LIGHT_EMPTY + target.update() + + var/obj/item/weapon/light/L2 = new target.light_type() + + target.status = L2.status + target.switchcount = L2.switchcount + target.rigged = emagged + target.brightness_range = L2.brightness_range + target.brightness_power = L2.brightness_power + target.brightness_color = L2.brightness_color + target.on = target.has_power() + target.update() + qdel(L2) + + if(target.on && target.rigged) + target.explode() + return + + else + to_chat(U, failmsg) + return + else to_chat(U, "There is a working [target.get_fitting_name()] already inserted.") - else if(!CanUse(U)) - to_chat(U, failmsg) - else if(Use(U)) - to_chat(U, "You replace the [target.get_fitting_name()] with the [src].") - - if(target.status != LIGHT_EMPTY) - target.remove_bulb() - - var/obj/item/weapon/light/L = new target.light_type() - target.insert_bulb(L) + return /obj/item/device/lightreplacer/emag_act(var/remaining_charges, var/mob/user) emagged = !emagged @@ -153,4 +227,4 @@ #undef LIGHT_OK #undef LIGHT_EMPTY #undef LIGHT_BROKEN -#undef LIGHT_BURNED +#undef LIGHT_BURNED \ No newline at end of file diff --git a/html/changelogs/TheFurryFeline - Bulbs_Recycling.yml b/html/changelogs/TheFurryFeline - Bulbs_Recycling.yml new file mode 100644 index 0000000000..3e887d8d87 --- /dev/null +++ b/html/changelogs/TheFurryFeline - Bulbs_Recycling.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: TheFurryFeline + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - tweak: "Changes light replacers to allow you to automatically transfer used bulbs into the item and get a new one every 4 bulbs replaced. Additionally, this allows you to both use the replacer on a box of bulbs to get the bulbs added as well as clicking the item with a box of bulbs to put them inside it." \ No newline at end of file