Files
The Sharkening 4a5104e4a0 Turns janitor borgs into walking crew operated vacuum cleaners. (#96724)
## About The Pull Request
Allows people to detach a cleaner and vacuum (uses the trash bag) from
janitor borgs. This option uses zero water management and doesn't create
slip tiles.

The module can be locked with alt click.

<img width="342" height="681" alt="image"
src="https://github.com/user-attachments/assets/0fe53f8b-d850-4354-aa70-382ca40dcd37"
/>

<img width="590" height="581" alt="image"
src="https://github.com/user-attachments/assets/70fea653-ad20-479a-8986-fed0e15af4b1"
/>


https://github.com/user-attachments/assets/ff81a214-1bfb-4a33-a660-ccb563e310af

Sounds are from soundsnap and properly licenced.
https://soundsnap.zendesk.com/hc/en-us/articles/115003916431-Legal


## Why It's Good For The Game

I think co-op mechanics are fun. If you manage to get a friend, this is
an option with zero water management. I feel like janitor borgs don't
really have much the way to cooperate with their base mechanics. You can
walk into a department and clean it wordlessly. This gives the option
where you can clean with your friend (or the crime scene you're trying
to scrub)

## Changelog
🆑 StrangeWeirdKitten, Toriate (sprites)
add: Janitor borgs now have a crew operated end that allows their
squishy overlords to do some cleaning themselves.
/🆑
2026-07-12 10:50:41 -06:00

264 lines
8.0 KiB
Plaintext

/datum/keybinding/living
category = CATEGORY_HUMAN
weight = WEIGHT_MOB
/datum/keybinding/living/can_use(client/user)
return isliving(user.mob)
/datum/keybinding/living/resist
hotkey_keys = list("B")
name = "resist"
full_name = "Resist"
description = "Break free of your current state. Handcuffed? on fire? Resist!"
keybind_signal = COMSIG_KB_LIVING_RESIST_DOWN
/datum/keybinding/living/resist/down(client/user, turf/target, mousepos_x, mousepos_y)
. = ..()
if(.)
return
var/mob/living/owner = user.mob
owner.resist()
if (owner.hud_used?.screen_objects[HUD_MOB_RESIST])
owner.hud_used.screen_objects[HUD_MOB_RESIST].icon_state = "[owner.hud_used.screen_objects[HUD_MOB_RESIST].base_icon_state]_on"
return TRUE
/datum/keybinding/living/resist/up(client/user, turf/target)
. = ..()
if(.)
return
var/mob/living/owner = user.mob
if (owner.hud_used?.screen_objects[HUD_MOB_RESIST])
owner.hud_used.screen_objects[HUD_MOB_RESIST].icon_state = owner.hud_used.screen_objects[HUD_MOB_RESIST].base_icon_state
/datum/keybinding/living/look_up
// hotkey_keys = list("L") // ORIGINAL
hotkey_keys = list("P") //SKYRAT EDIT CHANGE - CUSTOMIZATION
name = "look up"
full_name = "Look Up"
description = "Look up at the next z-level. Only works if directly below open space."
keybind_signal = COMSIG_KB_LIVING_LOOKUP_DOWN
/datum/keybinding/living/look_up/down(client/user, turf/target, mousepos_x, mousepos_y)
. = ..()
if(.)
return
var/mob/living/L = user.mob
L.look_up()
return TRUE
/datum/keybinding/living/look_up/up(client/user, turf/target)
. = ..()
var/mob/living/L = user.mob
L.end_look()
return TRUE
/datum/keybinding/living/look_down
// hotkey_keys = list(";") // ORIGINAL
hotkey_keys = list("\[") //SKYRAT EDIT CHANGE - CUSTOMIZATION
name = "look down"
full_name = "Look Down"
description = "Look down at the previous z-level. Only works if directly above open space."
keybind_signal = COMSIG_KB_LIVING_LOOKDOWN_DOWN
/datum/keybinding/living/look_down/down(client/user, turf/target, mousepos_x, mousepos_y)
. = ..()
if(.)
return
var/mob/living/L = user.mob
L.look_down()
return TRUE
/datum/keybinding/living/look_down/up(client/user, turf/target)
. = ..()
var/mob/living/L = user.mob
L.end_look()
return TRUE
/datum/keybinding/living/rest
hotkey_keys = list("U")
name = "rest"
full_name = "Rest"
description = "Lay down, or get up."
keybind_signal = COMSIG_KB_LIVING_REST_DOWN
/datum/keybinding/living/rest/down(client/user, turf/target, mousepos_x, mousepos_y)
. = ..()
if(.)
return
var/mob/living/living_mob = user.mob
living_mob.toggle_resting()
return TRUE
/datum/keybinding/living/toggle_combat_mode
hotkey_keys = list("F")
name = "toggle_combat_mode"
full_name = "Toggle Combat Mode"
description = "Toggles combat mode. Like Help/Harm but cooler."
keybind_signal = COMSIG_KB_LIVING_TOGGLE_COMBAT_DOWN
/datum/keybinding/living/toggle_combat_mode/down(client/user, turf/target, mousepos_x, mousepos_y)
. = ..()
if(.)
return
var/mob/living/user_mob = user.mob
user_mob.set_combat_mode(!user_mob.combat_mode, FALSE)
/datum/keybinding/living/enable_combat_mode
hotkey_keys = list("4")
name = "enable_combat_mode"
full_name = "Enable Combat Mode"
description = "Enable combat mode."
keybind_signal = COMSIG_KB_LIVING_ENABLE_COMBAT_DOWN
/datum/keybinding/living/enable_combat_mode/down(client/user, turf/target, mousepos_x, mousepos_y)
. = ..()
if(.)
return
var/mob/living/user_mob = user.mob
user_mob.set_combat_mode(TRUE, silent = FALSE)
/datum/keybinding/living/disable_combat_mode
hotkey_keys = list("1")
name = "disable_combat_mode"
full_name = "Disable Combat Mode"
description = "Disable combat mode."
keybind_signal = COMSIG_KB_LIVING_DISABLE_COMBAT_DOWN
/datum/keybinding/living/disable_combat_mode/down(client/user, turf/target, mousepos_x, mousepos_y)
. = ..()
if(.)
return
var/mob/living/user_mob = user.mob
user_mob.set_combat_mode(FALSE, silent = FALSE)
/datum/keybinding/living/toggle_move_intent
hotkey_keys = list("Alt") //SKYRAT EDIT CHANGE - C IS FOR COMBAT INDICATOR - ORIGINAL: hotkey_keys = list("C")
name = "toggle_move_intent"
full_name = "Hold to toggle move intent"
description = "Held down to cycle to the other move intent, release to cycle back"
keybind_signal = COMSIG_KB_LIVING_TOGGLEMOVEINTENT_DOWN
/datum/keybinding/living/toggle_move_intent/down(client/user, turf/target, mousepos_x, mousepos_y)
. = ..()
if(.)
return
var/mob/living/M = user.mob
M.toggle_move_intent()
return TRUE
/datum/keybinding/living/toggle_move_intent/up(client/user, turf/target)
. = ..()
var/mob/living/M = user.mob
M.toggle_move_intent()
return TRUE
/datum/keybinding/living/toggle_move_intent_alternative
hotkey_keys = list(UNBOUND_KEY)
name = "toggle_move_intent_alt"
full_name = "press to cycle move intent"
description = "Pressing this cycle to the opposite move intent, does not cycle back"
keybind_signal = COMSIG_KB_LIVING_TOGGLEMOVEINTENTALT_DOWN
/datum/keybinding/living/toggle_move_intent_alternative/down(client/user, turf/target, mousepos_x, mousepos_y)
. = ..()
if(.)
return
var/mob/living/M = user.mob
M.toggle_move_intent()
return TRUE
/datum/keybinding/living/toggle_throw_mode
hotkey_keys = list("R", "Southwest") // END
name = "toggle_throw_mode"
full_name = "Toggle throw mode"
description = "Toggle throwing the current item or not."
keybind_signal = COMSIG_KB_LIVING_TOGGLETHROWMODE_DOWN
/datum/keybinding/living/toggle_throw_mode/down(client/user)
. = ..()
if(.)
return
var/mob/living/living_user = user.mob
living_user.toggle_throw_mode()
return TRUE
/datum/keybinding/living/hold_throw_mode
hotkey_keys = list("Space")
name = "hold_throw_mode"
full_name = "Hold throw mode"
description = "Hold this to turn on throw mode, and release it to turn off throw mode"
keybind_signal = COMSIG_KB_LIVING_HOLDTHROWMODE_DOWN
/datum/keybinding/living/hold_throw_mode/down(client/user, turf/target, mousepos_x, mousepos_y)
. = ..()
if(.)
return
var/mob/living/living_user = user.mob
living_user.throw_mode_on(THROW_MODE_HOLD)
/datum/keybinding/living/hold_throw_mode/up(client/user, turf/target)
. = ..()
if(.)
return
var/mob/living/living_user = user.mob
living_user.throw_mode_off(THROW_MODE_HOLD)
/datum/keybinding/living/give
hotkey_keys = list("G")
name = "Give_Item"
full_name = "Give item"
description = "Give the item you're currently holding"
keybind_signal = COMSIG_KB_LIVING_GIVEITEM_DOWN
/datum/keybinding/living/give/can_use(client/user)
. = ..()
if (!.)
return FALSE
if(!user.mob)
return FALSE
var/obj/item/object = user.mob.get_active_held_item()
if(isnull(object))
return FALSE
if(HAS_TRAIT(object, TRAIT_BORG_GIVE))
return TRUE
if(!HAS_TRAIT(user.mob, TRAIT_CAN_HOLD_ITEMS))
return FALSE
return TRUE
/datum/keybinding/living/give/down(client/user, turf/target, mousepos_x, mousepos_y)
. = ..()
if(.)
return
var/mob/living/living_user = user.mob
var/obj/item/held_item = living_user.get_active_held_item()
if(isnull(held_item))
return
if(!HAS_TRAIT(living_user, TRAIT_CAN_HOLD_ITEMS) && !HAS_TRAIT(held_item, TRAIT_BORG_GIVE))
return
living_user.give()
/datum/keybinding/living/view_pet_data
hotkey_keys = list("Shift")
name = "view_pet_commands"
full_name = "View Pet Commands"
description = "Hold down to see all the commands you can give your pets!"
keybind_signal = COMSIG_KB_LIVING_VIEW_PET_COMMANDS
/datum/keybinding/living/cancel_interactions
name = "stop_interactions"
full_name = "Cancel Interactions"
description = "Cancels any ongoing interactions (such as using a tool, performing surgery, or climbing). \
Note that some interactions cannot be interrupted, and you can't cancel other player's interaction with this hotkey."
keybind_signal = COMSIG_KB_LIVING_STOP_INTERACTIONS_DOWN
/datum/keybinding/living/cancel_interactions/down(client/user, turf/target, mousepos_x, mousepos_y)
. = ..()
if(.)
return
var/mob/living/mob_user = user.mob
if(!LAZYLEN(mob_user.do_afters) || HAS_TRAIT(mob_user, TRAIT_INCAPACITATED))
return
// this is currently the best way to stop all ongoing doafters
mob_user.incapacitate(0.1 SECONDS, ignore_canstun = TRUE)