Lets you tape knives to cleanbots. You know, if you really want to. (#47590)

This PR lets you tape knives to cleanbots. Anyone who steps on the armed cleanbot will get stabbed in the ankle and fall over for a moment. If the person who got stabbed was someone with a title, the cleanbot will steal their title if they aren't already the victim's superior.

There are six "career tracks" for cleanbots, the first three grant prefixes, the last three grant suffixes

Command: HoP -> Captain -> Spec Ops Officer -> Admiral
Security: Officer -> Detective -> Warden -> HoS
Engineering: Atmos -> Engineer -> CE
Medical: MD -> CMO
Research: RD/Scientist (same thing)
Legal: Lawyer

The cleanbot in the above picture has stabbed the Captain, HoS, CE, an MD, the RD, and a lawyer. Busy little fella aren't they?

TODO:

    Make it so they don't show an attack message on top of the stab message (also make them actually target the legs)

Why It's Good For The Game

space roombas cleanbots with knives stuck to them are funny and sound like something a bored assistant would do
Changelog

cl Ryll/Shaps
add: You can now attach knives to cleanbots! Laugh as Officer Stabby sneaks up and jabs the HoS! Sigh because you are now outranked by a cleanbot! Fun for everyone!
/cl
This commit is contained in:
Shaps
2019-11-15 18:56:13 +13:00
committed by oranges
parent fa971d9010
commit ba135eed28
3 changed files with 98 additions and 1 deletions
@@ -91,6 +91,10 @@
var/ignorelistcleanuptimer = 1 // This ticks up every automated action, at 300 we clean the ignore list
var/robot_arm = /obj/item/bodypart/r_arm/robot
var/commissioned = FALSE // Will other (noncommissioned) bots salute this bot?
var/can_salute = TRUE
var/salute_delay = 60 SECONDS
hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD, DIAG_PATH_HUD = HUD_LIST_LIST) //Diagnostic HUD views
/mob/living/simple_animal/bot/proc/get_mode()
@@ -240,6 +244,14 @@
if(!on || client)
return
if(!commissioned && can_salute)
for(var/mob/living/simple_animal/bot/B in get_hearers_in_view(5, get_turf(src)))
if(B.commissioned)
visible_message("<b>[src]</b> performs an elaborate salute for [B]!")
can_salute = FALSE
addtimer(VARSET_CALLBACK(src, can_salute, TRUE), salute_delay)
break
switch(mode) //High-priority overrides are processed first. Bots can do nothing else while under direct command.
if(BOT_RESPONDING) //Called by the AI.
call_mode()
@@ -14,7 +14,7 @@
model = "Cleanbot"
bot_core_type = /obj/machinery/bot_core/cleanbot
window_id = "autoclean"
window_name = "Automatic Station Cleaner v1.3"
window_name = "Automatic Station Cleaner v1.4"
pass_flags = PASSMOB
path_image_color = "#993299"
@@ -33,6 +33,59 @@
var/next_dest
var/next_dest_loc
var/obj/item/weapon
var/weapon_orig_force = 0
var/list/stolen_valor
var/static/list/officers = list("Captain", "Head of Personnel", "Head of Security")
var/static/list/command = list("Captain" = "Cpt.","Head of Personnel" = "Lt.")
var/static/list/security = list("Head of Security" = "Maj.", "Warden" = "Sgt.", "Detective" = "Det.", "Security Officer" = "Officer")
var/static/list/engineering = list("Chief Engineer" = "Chief Engineer", "Station Engineer" = "Engineer", "Atmospherics Technician" = "Technician")
var/static/list/medical = list("Chief Medical Officer" = "C.M.O.", "Medical Doctor" = "M.D.", "Chemist" = "Pharm.D.")
var/static/list/research = list("Research Director" = "Ph.D.", "Roboticist" = "M.S.", "Scientist" = "B.S.")
var/static/list/legal = list("Lawyer" = "Esq.")
var/list/prefixes
var/list/suffixes
/mob/living/simple_animal/bot/cleanbot/proc/deputize(obj/item/W, mob/user)
if(in_range(src, user))
to_chat(user, "<span class='notice'>You attach \the [W] to \the [src].</span>")
user.transferItemToLoc(W, src)
weapon = W
weapon_orig_force = weapon.force
weapon.force = weapon.force / 2
icon_state = "cleanbot[on]"
add_overlay(image(icon=weapon.lefthand_file,icon_state=weapon.item_state))
/mob/living/simple_animal/bot/cleanbot/proc/update_titles()
var/working_title = ""
for(var/pref in prefixes)
for(var/title in pref)
if(title in stolen_valor)
working_title += pref[title] + " "
if(title in officers)
commissioned = TRUE
break
working_title += initial(name)
for(var/suf in suffixes)
for(var/title in suf)
if(title in stolen_valor)
working_title += " " + suf[title]
break
name = working_title
/mob/living/simple_animal/bot/cleanbot/examine(mob/user)
. = ..()
if(weapon)
. += " <span class='warning'>Is that \a [weapon] taped to it...?</span>"
/mob/living/simple_animal/bot/cleanbot/Initialize()
. = ..()
get_targets()
@@ -41,6 +94,17 @@
var/datum/job/janitor/J = new/datum/job/janitor
access_card.access += J.get_access()
prev_access = access_card.access
stolen_valor = list()
prefixes = list(command, security, engineering)
suffixes = list(research, medical, legal)
/mob/living/simple_animal/bot/cleanbot/Destroy()
if(weapon)
var/atom/Tsec = drop_location()
weapon.force = weapon_orig_force
drop_part(weapon, Tsec)
return ..()
/mob/living/simple_animal/bot/cleanbot/turn_on()
..()
@@ -63,6 +127,23 @@
text_dehack = "[name]'s software has been reset!"
text_dehack_fail = "[name] does not seem to respond to your repair code!"
/mob/living/simple_animal/bot/cleanbot/Crossed(atom/movable/AM)
. = ..()
zone_selected = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
if(weapon && has_gravity() && ismob(AM))
var/mob/living/carbon/C = AM
if(!istype(C))
return
weapon.attack(C, src)
C.Knockdown(20)
if(!(C.job in stolen_valor))
stolen_valor += C.job
update_titles()
return
/mob/living/simple_animal/bot/cleanbot/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/card/id)||istype(W, /obj/item/pda))
if(bot_core.allowed(user) && !open && !emagged)
@@ -75,6 +156,10 @@
to_chat(user, "<span class='warning'>Please close the access panel before locking it.</span>")
else
to_chat(user, "<span class='notice'>\The [src] doesn't seem to respect your authority.</span>")
else if(istype(W, /obj/item/kitchen/knife) && user.a_intent != INTENT_HARM)
to_chat(user, "<span class='notice'>You start attaching the [W] to \the [src]...</span>")
if(do_after(user, 40, target = src))
deputize(W, user)
else
return ..()
Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB