mirror of
https://github.com/Citadel-Station-13/Citadel-Station-13-RP.git
synced 2026-08-20 13:56:57 +01:00
183 lines
5.6 KiB
Plaintext
183 lines
5.6 KiB
Plaintext
GLOBAL_LIST_BOILERPLATE(all_mops, /obj/item/mop)
|
|
#define MOPMODE_TILE 1
|
|
#define MOPMODE_SWEEP 2
|
|
|
|
/obj/item/mop
|
|
desc = "The world of janitalia wouldn't be complete without a mop."
|
|
name = "mop"
|
|
icon = 'icons/obj/janitor.dmi'
|
|
icon_state = "mop"
|
|
damage_force = 5.0
|
|
throw_force = 10.0
|
|
throw_speed = 5
|
|
throw_range = 10
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
attack_verb = list("mopped", "bashed", "bludgeoned", "whacked")
|
|
materials_base = list(MAT_PLASTIC = 3)
|
|
var/mopping = 0
|
|
var/mopcount = 0
|
|
var/mopspeed = 23
|
|
|
|
var/mopmode = MOPMODE_TILE
|
|
var/sweep_time = 7
|
|
|
|
/obj/item/mop/Initialize(mapload)
|
|
. = ..()
|
|
create_reagents(30)
|
|
|
|
|
|
/obj/item/mop/attack_self(mob/user, datum/event_args/actor/actor)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
.=..()
|
|
if (mopmode == MOPMODE_TILE)
|
|
mopmode = MOPMODE_SWEEP
|
|
to_chat(user, "<span class='warning'>You will now clean with broad sweeping motions</span>")
|
|
else if (mopmode == MOPMODE_SWEEP)
|
|
mopmode = MOPMODE_TILE
|
|
to_chat(user, "<span class='warning'>You will now thoroughly clean a single tile at a time</span>")
|
|
|
|
/obj/item/mop/afterattack(atom/target, mob/user, clickchain_flags, list/params)
|
|
if(!(clickchain_flags & CLICKCHAIN_HAS_PROXIMITY)) return
|
|
if(istype(target, /turf) || istype(target, /obj/effect/debris/cleanable) || istype(target, /obj/effect/overlay))
|
|
if(reagents.total_volume < 1)
|
|
to_chat(user, "<span class='warning'>Your mop is dry!</span>")
|
|
return
|
|
var/turf/T = get_turf(target)
|
|
if(!T)
|
|
return
|
|
spawn()
|
|
user.do_attack_animation(T)
|
|
if (mopmode == MOPMODE_TILE)
|
|
//user.visible_message(SPAN_WARNING("[user] begins to clean \the [T]."))
|
|
user.setClickCooldownLegacy(3)
|
|
if(do_after(user, mopspeed, T))
|
|
if(T)
|
|
T.clean(src, user)
|
|
to_chat(user, "<span class='warning'>You have finished mopping!</span>")
|
|
//Sweep mopmode. Light and fast aoe cleaning
|
|
else if (mopmode == MOPMODE_SWEEP)
|
|
sweep(user, T)
|
|
else
|
|
makeWet(target, user)
|
|
|
|
// TO DO : MAKE SWEEPING WORK
|
|
|
|
/obj/item/mop/proc/sweep(var/mob/user, var/turf/target)
|
|
user.setClickCooldownLegacy(sweep_time)
|
|
var/direction = get_dir(get_turf(src),target)
|
|
var/list/turfs
|
|
if (direction in GLOB.cardinal)
|
|
turfs = list(target, get_step(target,turn(direction, 90)), get_step(target,turn(direction, -90)))
|
|
else
|
|
turfs = list(target, get_step(target,turn(direction, 135)), get_step(target,turn(direction, -135)))
|
|
|
|
//Lets do a fancy animation of the mop sweeping over the tiles. Code copied from attack animation
|
|
var/turf/start = turfs[2]
|
|
var/turf/end = turfs[3]
|
|
var/obj/effect/mopimage = new /obj/effect(start)
|
|
mopimage.appearance = appearance
|
|
mopimage.alpha = 200
|
|
// Who can see the attack?
|
|
var/list/viewing = list()
|
|
for (var/mob/M in viewers(start))
|
|
if (M.client)
|
|
viewing |= M.client
|
|
//flick_overlay(I, viewing, 5) // 5 ticks/half a second
|
|
// Scale the icon.
|
|
mopimage.transform *= 0.75
|
|
// And animate the attack!
|
|
animate(mopimage, alpha = 50, time = sweep_time*1.2)
|
|
var/sweep_step = (sweep_time - 1) * 0.5
|
|
spawn(1)
|
|
mopimage.forceMove(target)
|
|
sleep(sweep_step)
|
|
mopimage.forceMove(end)
|
|
spawn(sweep_time+1)
|
|
qdel(mopimage)
|
|
|
|
if(!do_after(user, sweep_time,target))
|
|
to_chat(user, "<span class='warning'>Mopping cancelled</span>")
|
|
return
|
|
|
|
for (var/t in turfs)
|
|
var/turf/T = t
|
|
|
|
//Get out of the way, ankles!
|
|
for (var/mob/living/L in T)
|
|
melee_interaction_chain(L, user)
|
|
|
|
if (!is_blocked_turf(T))
|
|
T.clean(src, user, 1)
|
|
|
|
else if (user)
|
|
//You hit a wall!
|
|
user.setClickCooldownLegacy(2)
|
|
user.afflict_stun(20 * 2)
|
|
shake_camera(user, 1, 1)
|
|
playsound(T,"thud", 20, 1, -3)
|
|
to_chat(user, "<span class='warning'>There's not enough space for broad sweeps here!</span>")
|
|
return
|
|
|
|
/obj/item/mop/proc/makeWet(atom/A, mob/user)
|
|
if(A.is_open_container())
|
|
if(A.reagents)
|
|
if(A.reagents.total_volume < 1)
|
|
to_chat(user, "<span class='warning'>\The [A] is out of water!</span>")
|
|
return
|
|
A.reagents.trans_to_obj(src, reagents.maximum_volume)
|
|
else
|
|
reagents.add_reagent("water", reagents.maximum_volume)
|
|
|
|
to_chat(user, "<span class='warning'>You wet \the [src] with \the [A].</span>")
|
|
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
|
|
|
|
|
|
|
|
/obj/effect/attackby(obj/item/I, mob/user)
|
|
if(istype(I, /obj/item/mop) || istype(I, /obj/item/soap))
|
|
return
|
|
..()
|
|
|
|
/obj/item/mop/advanced
|
|
desc = "The most advanced tool in a custodian's arsenal, with a cleaner synthesizer to boot! Just think of all the viscera you will clean up with this!"
|
|
name = "advanced mop"
|
|
icon_state = "advmop"
|
|
item_state = "mop"
|
|
damage_force = 6
|
|
throw_force = 11
|
|
mopspeed = 15
|
|
var/refill_enabled = TRUE //Self-refill toggle for when a janitor decides to mop with something other than water.
|
|
var/refill_rate = 1 //Rate per process() tick mop refills itself
|
|
var/refill_reagent = "cleaner" //Determins what reagent to use for refilling, just in case someone wanted to make a HOLY MOP OF PURGING
|
|
|
|
/obj/item/mop/advanced/Initialize()
|
|
. = ..()
|
|
START_PROCESSING(SSobj, src)
|
|
|
|
/obj/item/mop/advanced/AltClick(var/mob/user)
|
|
refill_enabled = !refill_enabled
|
|
if(refill_enabled)
|
|
START_PROCESSING(SSobj, src)
|
|
else
|
|
STOP_PROCESSING(SSobj,src)
|
|
to_chat(user, "<span class='notice'>You set the condenser switch to the '[refill_enabled ? "ON" : "OFF"]' position.</span>")
|
|
playsound(user, 'sound/machines/click.ogg', 30, 1)
|
|
|
|
/obj/item/mop/advanced/process(delta_time)
|
|
if(reagents.total_volume < 30)
|
|
reagents.add_reagent(refill_reagent, refill_rate)
|
|
|
|
/obj/item/mop/advanced/examine(mob/user, dist)
|
|
. = ..()
|
|
. += "The condenser switch is set to <b>[refill_enabled ? "ON" : "OFF"]</b>."
|
|
|
|
/obj/item/mop/advanced/Destroy()
|
|
if(refill_enabled)
|
|
STOP_PROCESSING(SSobj, src)
|
|
return ..()
|
|
|
|
#undef MOPMODE_TILE
|
|
#undef MOPMODE_SWEEP
|