diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 3213f5f2639..9c8819b2a11 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -1099,6 +1099,8 @@ Pass a positive integer as an argument to override a bot's default speed. to_chat(src, "0. [paicard.pai.pai_law0]") if(emagged) to_chat(src, "1. #$!@#$32K#$") + else if(HAS_TRAIT(src, TRAIT_CMAGGED)) + to_chat(src, "1. Be funny.") else to_chat(src, "1. You are a machine built to serve the station's crew and AI(s).") to_chat(src, "2. Your function is to [bot_purpose].") diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 8f118b1a059..00c6667b5e9 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -130,6 +130,29 @@ playsound(src, 'sound/machines/honkbot_evil_laugh.ogg', 75, 1, -1) // evil laughter update_icon() +/mob/living/simple_animal/bot/honkbot/cmag_act(mob/user) + if(HAS_TRAIT(src, TRAIT_CMAGGED)) + return + if(locked || !open) + to_chat(user, "Unlock and open it with a screwdriver first!") + return FALSE + + ADD_TRAIT(src, TRAIT_CMAGGED, CLOWN_EMAG) + remote_disabled = TRUE + locked = TRUE + open = FALSE + bot_reset() + turn_on() + if(user) + to_chat(user, "You smear bananium ooze all over [src]'s circuitry!") + add_attack_logs(user, src, "Cmagged") + show_laws() + +/mob/living/simple_animal/bot/honkbot/examine(mob/user) + . = ..() + if(HAS_TRAIT(src, TRAIT_CMAGGED)) + . += "Yellow ooze seems to be seeping from the case..." + /mob/living/simple_animal/bot/honkbot/bullet_act(obj/item/projectile/Proj) if((istype(Proj,/obj/item/projectile/beam)) || (istype(Proj,/obj/item/projectile/bullet) && (Proj.damage_type == BURN))||(Proj.damage_type == BRUTE) && (!Proj.nodamage && Proj.damage < health && ishuman(Proj.firer))) retaliate(Proj.firer) @@ -180,34 +203,57 @@ sensor_blink() addtimer(VARSET_CALLBACK(src, spam_flag, FALSE), cooldowntimehorn) +/mob/living/simple_animal/bot/honkbot/proc/cuff_callback(mob/living/carbon/C) + mode = BOT_ARREST + sleep(1 SECONDS) + playsound(loc, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2) + C.visible_message("[src] is trying to put zipties on [C]!", + "[src] is trying to put zipties on you!") + if(!do_after(src, 6 SECONDS, target = C) || !on) + mode = BOT_IDLE + return + if(!C.handcuffed) + C.handcuffed = new /obj/item/restraints/handcuffs/twimsts(C) + C.update_handcuffed() + C.SetDeaf(0) + playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/bcreep.ogg'), 50, FALSE) + mode = BOT_IDLE + /mob/living/simple_animal/bot/honkbot/proc/stun_attack(mob/living/carbon/C) // airhorn stun - if(!spam_flag) - playsound(src, 'sound/items/AirHorn.ogg', 100, TRUE, -1) //HEEEEEEEEEEEENK!! - sensor_blink() - if(!spam_flag) - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(H.check_ear_prot() >= HEARING_PROTECTION_MAJOR) - return - C.SetStuttering(40 SECONDS) //stammer - C.Deaf(5 SECONDS) //far less damage than the H.O.N.K. - C.Jitter(100 SECONDS) - C.Weaken(10 SECONDS) - if(client) //prevent spam from players.. - spam_flag = TRUE - if(!emagged) //HONK once, then leave - threatlevel -= 6 - target = oldtarget_name - else // you really don't want to hit an emagged honkbot - threatlevel = 6 // will never let you go - addtimer(VARSET_CALLBACK(src, spam_flag, FALSE), cooldowntimehorn) - add_attack_logs(src, C, "honked by [src]") - C.visible_message("[src] has honked [C]!",\ - "[src] has honked you!") - else - C.Stuttering(40 SECONDS) - C.Stun(20 SECONDS) - addtimer(VARSET_CALLBACK(src, spam_flag, FALSE), cooldowntimehorn) + if(spam_flag) + return + playsound(src, 'sound/items/AirHorn.ogg', 100, TRUE, -1) //HEEEEEEEEEEEENK!! + sensor_blink() + + if(HAS_TRAIT(src, TRAIT_CMAGGED)) + var/area/location = get_area(src) + speak("Arresting level 4 scumbag [C] in [location].", radio_channel) + + if(!ishuman(C)) + C.Stuttering(40 SECONDS) + C.Stun(20 SECONDS) + addtimer(VARSET_CALLBACK(src, spam_flag, FALSE), cooldowntimehorn) + return + var/mob/living/carbon/human/H = C + if(H.check_ear_prot() >= HEARING_PROTECTION_MAJOR) + return + C.SetStuttering(40 SECONDS) //stammer + C.Deaf(5 SECONDS) //far less damage than the H.O.N.K. + C.Jitter(100 SECONDS) + C.Weaken(10 SECONDS) + if(client) //prevent spam from players.. + spam_flag = TRUE + if(!emagged) //HONK once, then leave + threatlevel -= 6 + target = oldtarget_name + else // you really don't want to hit an emagged honkbot + threatlevel = 6 // will never let you go + addtimer(VARSET_CALLBACK(src, spam_flag, FALSE), cooldowntimehorn) + add_attack_logs(src, C, "honked by [src]") + C.visible_message("[src] has honked [C]!", + "[src] has honked you!") + if(HAS_TRAIT(src, TRAIT_CMAGGED)) + INVOKE_ASYNC(src, PROC_REF(cuff_callback), C) /mob/living/simple_animal/bot/honkbot/handle_automated_action() @@ -237,9 +283,9 @@ honk_attack(target) else if(threatlevel >= 6) + target_lastloc = target.loc stun_attack(target) anchored = FALSE - target_lastloc = target.loc return try_chasing_target(target) @@ -278,6 +324,8 @@ if((C.name == oldtarget_name) && (world.time < last_found + 100)) continue + if(HAS_TRAIT(src, TRAIT_CMAGGED)) + threatlevel = 6 if(threatlevel < 4) if(emagged) // actually emagged bike_horn() @@ -292,8 +340,13 @@ target = C oldtarget_name = C.name bike_horn() - speak("Honk!") - visible_message("[src] starts chasing [C.name]!") + if(HAS_TRAIT(src, TRAIT_CMAGGED)) + speak("Level 4 infraction alert!") + playsound(loc, pick('sound/voice/bcriminal.ogg', 'sound/voice/bjustice.ogg', 'sound/voice/bfreeze.ogg'), 50, FALSE) + visible_message("[src] points at [C.name]!") + else + speak("Honk!") + visible_message("[src] starts chasing [C.name]!") mode = BOT_HUNT INVOKE_ASYNC(src, PROC_REF(handle_automated_action)) return TRUE