mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-02-06 22:39:04 +00:00
cl cacogen balance: Space cleaner in spray bottles travels 5 tiles instead of 3 (doesn't affect other reagents) balance: Trash bag fits in exosuit slot of janitor biosuit balance: All soaps are faster balance: Soaps now clean all decals on a tile instead of just one balance: Soap now has limited uses (100 for most, 300 for NT brand which janitor gets) balance: Mops are considerably faster balance: Basic mop holds twice the reagents balance: Janitorial cart now refills mops completely with one click balance: Basic and advanced mops are more robust (8 force and 12 force) balance: Galoshes no longer leave bloody footprints balance: Chameleon noslips no longer leave bloody footprints fix: Bulb boxes can be used on light replacers refill them in bulk balance: Light replacer can be used in-hand to change all bulbs on a tile add: Custodial barrier projector which creates solid wet floor signs that force people to walk to pass (available through service protolathe) /cl Janitor's been an exercise in futility for years, and the job is made redundant by janitor cyborgs who can't even keep up with the mess themselves. Spreading blood is instant, but takes a lot longer to clean. The goal here is to make it easier to keep up with the mess and make the controls less finicky while avoiding affecting combat too much (the mop and spray bottle are is a good weapons after all).
273 lines
8.0 KiB
Plaintext
273 lines
8.0 KiB
Plaintext
|
|
// Light Replacer (LR)
|
|
//
|
|
// ABOUT THE DEVICE
|
|
//
|
|
// This is a device supposedly to be used by Janitors and Janitor Cyborgs which will
|
|
// allow them to easily replace lights. This was mostly designed for Janitor Cyborgs since
|
|
// they don't have hands or a way to replace lightbulbs.
|
|
//
|
|
// HOW IT WORKS
|
|
//
|
|
// You attack a light fixture with it, if the light fixture is broken it will replace the
|
|
// light fixture with a working light; the broken light is then placed on the floor for the
|
|
// user to then pickup with a trash bag. If it's empty then it will just place a light in the fixture.
|
|
//
|
|
// HOW TO REFILL THE DEVICE
|
|
//
|
|
// It will need to be manually refilled with lights.
|
|
// If it's part of a robot module, it will charge when the Robot is inside a Recharge Station.
|
|
//
|
|
// EMAGGED FEATURES
|
|
//
|
|
// NOTICE: The Cyborg cannot use the emagged Light Replacer and the light's explosion was nerfed. It cannot create holes in the station anymore.
|
|
//
|
|
// I'm not sure everyone will react the emag's features so please say what your opinions are of it.
|
|
//
|
|
// When emagged it will rig every light it replaces, which will explode when the light is on.
|
|
// This is VERY noticable, even the device's name changes when you emag it so if anyone
|
|
// examines you when you're holding it in your hand, you will be discovered.
|
|
// It will also be very obvious who is setting all these lights off, since only Janitor Borgs and Janitors have easy
|
|
// access to them, and only one of them can emag their device.
|
|
//
|
|
// The explosion cannot insta-kill anyone with 30% or more health.
|
|
|
|
#define LIGHT_OK 0
|
|
#define LIGHT_EMPTY 1
|
|
#define LIGHT_BROKEN 2
|
|
#define LIGHT_BURNED 3
|
|
|
|
|
|
/obj/item/lightreplacer
|
|
|
|
name = "light replacer"
|
|
desc = "A device to automatically replace lights. Refill with broken or working light bulbs, or sheets of glass."
|
|
|
|
icon = 'icons/obj/janitor.dmi'
|
|
icon_state = "lightreplacer0"
|
|
item_state = "electronic"
|
|
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
|
|
|
flags_1 = CONDUCT_1
|
|
slot_flags = ITEM_SLOT_BELT
|
|
force = 8
|
|
|
|
var/max_uses = 20
|
|
var/uses = 0
|
|
var/failmsg = ""
|
|
// How much to increase per each glass?
|
|
var/increment = 5
|
|
// How much to take from the glass?
|
|
var/decrement = 1
|
|
var/charge = 1
|
|
|
|
// 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/lightreplacer/New()
|
|
uses = max_uses / 2
|
|
failmsg = "The [name]'s refill light blinks red."
|
|
..()
|
|
|
|
/obj/item/lightreplacer/examine(mob/user)
|
|
..()
|
|
to_chat(user, status_string())
|
|
|
|
/obj/item/lightreplacer/attackby(obj/item/W, mob/user, params)
|
|
|
|
if(istype(W, /obj/item/stack/sheet/glass))
|
|
var/obj/item/stack/sheet/glass/G = W
|
|
if(uses >= max_uses)
|
|
to_chat(user, "<span class='warning'>[src.name] is full.</span>")
|
|
return
|
|
else if(G.use(decrement))
|
|
AddUses(increment)
|
|
to_chat(user, "<span class='notice'>You insert a piece of glass into the [src.name]. You have [uses] light\s remaining.</span>")
|
|
return
|
|
else
|
|
to_chat(user, "<span class='warning'>You need one sheet of glass to replace lights!</span>")
|
|
|
|
if(istype(W, /obj/item/shard))
|
|
if(uses >= max_uses)
|
|
to_chat(user, "<span class='warning'>[src.name] is full.</span>")
|
|
return
|
|
if(!user.temporarilyRemoveItemFromInventory(W))
|
|
return
|
|
AddUses(round(increment*0.75))
|
|
to_chat(user, "<span class='notice'>You insert a shard of glass into [src]. You have [uses] light\s remaining.</span>")
|
|
qdel(W)
|
|
return
|
|
|
|
if(istype(W, /obj/item/light))
|
|
var/obj/item/light/L = W
|
|
if(L.status == 0) // LIGHT OKAY
|
|
if(uses < max_uses)
|
|
if(!user.temporarilyRemoveItemFromInventory(W))
|
|
return
|
|
AddUses(1)
|
|
qdel(L)
|
|
else
|
|
if(!user.temporarilyRemoveItemFromInventory(W))
|
|
return
|
|
to_chat(user, "<span class='notice'>You insert [L] into [src].</span>")
|
|
AddShards(1, user)
|
|
qdel(L)
|
|
return
|
|
|
|
if(istype(W, /obj/item/storage))
|
|
var/obj/item/storage/S = W
|
|
var/found_lightbulbs = FALSE
|
|
var/replaced_something = TRUE
|
|
|
|
for(var/obj/item/I in S.contents)
|
|
if(istype(I, /obj/item/light))
|
|
var/obj/item/light/L = I
|
|
found_lightbulbs = TRUE
|
|
if(src.uses >= max_uses)
|
|
break
|
|
if(L.status == LIGHT_OK)
|
|
replaced_something = TRUE
|
|
AddUses(1)
|
|
qdel(L)
|
|
|
|
else if(L.status == LIGHT_BROKEN || L.status == LIGHT_BURNED)
|
|
replaced_something = TRUE
|
|
AddShards(1, user)
|
|
qdel(L)
|
|
|
|
if(!found_lightbulbs)
|
|
to_chat(user, "<span class='warning'>\The [S] contains no bulbs.</span>")
|
|
return
|
|
|
|
if(!replaced_something && src.uses == max_uses)
|
|
to_chat(user, "<span class='warning'>\The [src] is full!</span>")
|
|
return
|
|
|
|
to_chat(user, "<span class='notice'>You fill \the [src] with lights from \the [S]. " + status_string() + "</span>")
|
|
|
|
/obj/item/lightreplacer/emag_act()
|
|
if(obj_flags & EMAGGED)
|
|
return
|
|
Emag()
|
|
|
|
/obj/item/lightreplacer/attack_self(mob/user)
|
|
for(var/obj/machinery/light/target in user.loc)
|
|
ReplaceLight(target, user)
|
|
to_chat(user, status_string())
|
|
|
|
/obj/item/lightreplacer/update_icon()
|
|
icon_state = "lightreplacer[(obj_flags & EMAGGED ? 1 : 0)]"
|
|
|
|
/obj/item/lightreplacer/proc/status_string()
|
|
return "It has [uses] light\s remaining (plus [bulb_shards] fragment\s)."
|
|
|
|
/obj/item/lightreplacer/proc/Use(mob/user)
|
|
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
|
|
AddUses(-1)
|
|
return 1
|
|
|
|
// Negative numbers will subtract
|
|
/obj/item/lightreplacer/proc/AddUses(amount = 1)
|
|
uses = CLAMP(uses + amount, 0, max_uses)
|
|
|
|
/obj/item/lightreplacer/proc/AddShards(amount = 1, user)
|
|
bulb_shards += amount
|
|
var/new_bulbs = round(bulb_shards / shards_required)
|
|
if(new_bulbs > 0)
|
|
AddUses(new_bulbs)
|
|
bulb_shards = bulb_shards % shards_required
|
|
if(new_bulbs != 0)
|
|
to_chat(user, "<span class='notice'>\The [src] has fabricated a new bulb from the broken glass it has stored. It now has [uses] uses.</span>")
|
|
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
|
|
return new_bulbs
|
|
|
|
/obj/item/lightreplacer/proc/Charge(var/mob/user)
|
|
charge += 1
|
|
if(charge > 3)
|
|
AddUses(1)
|
|
charge = 1
|
|
|
|
/obj/item/lightreplacer/proc/ReplaceLight(obj/machinery/light/target, mob/living/U)
|
|
|
|
if(target.status != LIGHT_OK)
|
|
if(CanUse(U))
|
|
if(!Use(U))
|
|
return
|
|
to_chat(U, "<span class='notice'>You replace the [target.fitting] with \the [src].</span>")
|
|
|
|
if(target.status != LIGHT_EMPTY)
|
|
AddShards(1, U)
|
|
target.status = LIGHT_EMPTY
|
|
target.update()
|
|
|
|
var/obj/item/light/L2 = new target.light_type()
|
|
|
|
target.status = L2.status
|
|
target.switchcount = L2.switchcount
|
|
target.rigged = (obj_flags & EMAGGED ? 1 : 0)
|
|
target.brightness = L2.brightness
|
|
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, "<span class='warning'>There is a working [target.fitting] already inserted!</span>")
|
|
return
|
|
|
|
/obj/item/lightreplacer/proc/Emag()
|
|
obj_flags ^= EMAGGED
|
|
playsound(src.loc, "sparks", 100, 1)
|
|
if(obj_flags & EMAGGED)
|
|
name = "shortcircuited [initial(name)]"
|
|
else
|
|
name = initial(name)
|
|
update_icon()
|
|
|
|
/obj/item/lightreplacer/proc/CanUse(mob/living/user)
|
|
src.add_fingerprint(user)
|
|
if(uses > 0)
|
|
return 1
|
|
else
|
|
return 0
|
|
|
|
/obj/item/lightreplacer/afterattack(atom/T, mob/U, proximity)
|
|
. = ..()
|
|
if(!proximity)
|
|
return
|
|
if(!isturf(T))
|
|
return
|
|
|
|
var/used = FALSE
|
|
for(var/atom/A in T)
|
|
if(!CanUse(U))
|
|
break
|
|
used = TRUE
|
|
if(istype(A, /obj/machinery/light))
|
|
ReplaceLight(A, U)
|
|
|
|
if(!used)
|
|
to_chat(U, failmsg)
|
|
|
|
/obj/item/lightreplacer/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J)
|
|
J.put_in_cart(src, user)
|
|
J.myreplacer = src
|
|
J.update_icon()
|
|
|
|
/obj/item/lightreplacer/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J)
|
|
return
|
|
|
|
#undef LIGHT_OK
|
|
#undef LIGHT_EMPTY
|
|
#undef LIGHT_BROKEN
|
|
#undef LIGHT_BURNED
|