diff --git a/code/datums/beepsky_fashion.dm b/code/datums/beepsky_fashion.dm
index bbf3812770..25b9a750aa 100644
--- a/code/datums/beepsky_fashion.dm
+++ b/code/datums/beepsky_fashion.dm
@@ -8,7 +8,8 @@
var/obj_alpha
var/obj_color
- var/stun_sound //sound that replaces the stun attack when set
+ var/list/stun_sounds //sound that replaces the stun attack when set
+ var/ignore_sound = FALSE //whether to ignore sounds entirely or not
//emotes
var/death_emote
@@ -18,6 +19,9 @@
var/taunt
var/attack_one
var/attack_two
+ var/patrol_emote
+ var/list/arrest_texts //first is for not-cuffing, second is for cuffing
+ var/arrest_emote
/datum/beepsky_fashion/proc/get_overlay(var/dir)
if(icon_file && obj_icon_state)
@@ -53,6 +57,15 @@
if(attack_two)
beepers.attack_two = attack_two
+ if(patrol_emote)
+ beepers.patrol_emote = patrol_emote
+
+ if(arrest_texts)
+ beepers.arrest_texts = arrest_texts
+
+ if(arrest_emote)
+ beepers.arrest_emote = arrest_emote
+
/datum/beepsky_fashion/proc/stun_attack(mob/living/carbon/C) //fired when beepsky does a stun attack with the fashion worn, for sounds/overlays/etc
return
@@ -67,6 +80,15 @@
infraction = "Magical disturbance of magnitude THREAT_LEVEL detected!"
attack_one = "BOT casts magic missile on CRIMINAL!"
attack_two = "BOT casts magic missile on you!"
+ patrol_emote = "Beginning search for magical disturbances."
+ arrest_emote = "ARREST_TYPE level THREAT_LEVEL magical practitioner CRIMINAL in LOCATION."
+ stun_sounds = list('sound/magic/lightningbolt.ogg',
+ 'sound/magic/fireball.ogg',
+ 'sound/weapons/zapbang.ogg',
+ 'sound/magic/knock.ogg',
+ 'sound/magic/fleshtostone.ogg',
+ 'sound/effects/magic.ogg',
+ 'sound/magic/disintegrate.ogg')
/datum/beepsky_fashion/cowboy
obj_icon_state = "cowboy"
@@ -77,6 +99,12 @@
infraction = "Outlaws with a bounty of THREAT_LEVEL000 space dollars detected!"
attack_one = "BOT unloads his revolver onto CRIMINAL!"
attack_two = "BOT unloads his revolver onto you!"
+ patrol_emote = "Engaging bounty hunting protocols."
+ arrest_emote = "ARREST_TYPE outlaw CRIMINAL with a bounty of THREAT_LEVEL000 in LOCATION."
+ stun_sounds = list('sound/weapons/Gunshot.ogg',
+ 'sound/weapons/Gunshot2.ogg',
+ 'sound/weapons/Gunshot3.ogg',
+ 'sound/weapons/Gunshot4.ogg')
/datum/beepsky_fashion/chef
obj_icon_state = "chef"
@@ -84,8 +112,13 @@
desc = "Cooking up the finest foods the station has ever seen."
death_emote = "Mamma-mia!"
infraction = "Grade THREAT_LEVEL prosciutto detected!"
- attack_one = "BOT slices wildly with a cleaver towards CRIMINAL!"
- attack_two = "BOT slices wildly with a cleaver towards you!"
+ attack_one = "BOT CQCs CRIMINAL!"
+ attack_two = "BOT CQCs you!"
+ patrol_emote = "Beginning search for the bad prosciutto."
+ arrest_texts = list("Frying", "Grilling") //any good secoff knows the difference
+ arrest_emote = "ARREST_TYPE grade THREAT_LEVEL prosciutto CRIMINAL in LOCATION."
+ stun_sounds = list('sound/weapons/cqchit1.ogg',
+ 'sound/weapons/cqchit2.ogg')
/datum/beepsky_fashion/cat
obj_icon_state = "cat"
@@ -97,9 +130,25 @@
infraction = "Wevel THREAT_LEVEL infwactwion awert!!!"
attack_one = "BOT shoves CRIMINAL onto a table!"
attack_two = "BOT shoves you onto a table!"
+ patrol_emote = "Enwgagwing patwol mwode."
+ arrest_texts = list("Dwetwaining", "Awwesting")
+ arrest_emote = "ARREST_TYPE wevel THREAT_LEVEL scwumbwag CRIMINAL in LOCATION. Nya."
+ ignore_sound = TRUE //we instead make the stunned person fire the nya emote
+
+/datum/beepsky_fashion/cat/stun_attack(var/mob/living/carbon/C) //makes a fake table under you on hit, makes cat people nya when hit
+ if(iscatperson(C))
+ C.emote("nya")
+ var/turf/target_turf = get_turf(C)
+ if(target_turf && !(C.lying)) //slams you on a table if you're standing up
+ playsound(src, 'sound/weapons/tap.ogg', 50, 1)
+ var/obj/effect/overlay_holder = new(target_turf)
+ var/image/table_overlay = image('icons/obj/smooth_structures/table.dmi', "table")
+ overlay_holder.add_overlay(table_overlay)
+ QDEL_IN(1, overlay_holder)
/datum/beepsky_fashion/cake //nothing else. it's just beepsky. with a cake on his head.
obj_icon_state = "cake"
+ desc = "It's a secbot, wearing a cake on his head!"
/datum/beepsky_fashion/captain
obj_icon_state = "captain"
@@ -110,6 +159,10 @@
infraction = "Level THREAT_LEVEL greytider detected."
attack_one = "BOT beats CRIMINAL with the chain of command!"
attack_two = "BOT beats you with the chain of command!"
+ patrol_emote = "Uselessness protocols engaged."
+ arrest_texts = list("Demoting", "Firing")
+ arrest_emote = "ARREST_TYPE level THREAT_LEVEL lesser crewmember CRIMINAL in LOCATION."
+ stun_sounds = list('sound/weapons/chainhit.ogg')
/datum/beepsky_fashion/king
obj_icon_state = "king"
@@ -120,6 +173,13 @@
infraction = "Treason of level THREAT_LEVEL detected!"
attack_one = "BOT strikes CRIMINAL with his kingly authority!"
attack_two = "BOT strikes you with his kingly authority!"
+ patrol_emote = "Searching for peasants to beat up."
+ arrest_texts = list("Knighting", "Executing")
+ arrest_emote = "ARREST_TYPE level THREAT_LEVEL peasant CRIMINAL in LOCATION."
+ stun_sounds = list('sound/weapons/punch1.ogg',
+ 'sound/weapons/punch2.ogg',
+ 'sound/weapons/punch3.ogg',
+ 'sound/weapons/punch4.ogg')
/datum/beepsky_fashion/pirate
obj_icon_state = "pirate"
@@ -130,3 +190,23 @@
infraction = "Enemy vessel spotted with threat level THREAT_LEVEL!"
attack_one = "BOT strikes CRIMINAL with his cutlass!"
attack_two = "BOT strikes you with his cutlass!"
+ patrol_emote = "Searching for enemy vessels to board."
+ arrest_texts = list("Boarding" "Sinking")
+ arrest_emote = "ARREST_TYPE level THREAT_LEVEL vessel CRIMINAL in LOCATION."
+ stun_sounds = list('sound/weapons/bladeslice.ogg')
+
+/datum/beepsky_fashion/engineer
+ obj_icon_state = "engineer"
+ desc = "He fixes criminals with a wrench to the face."
+ capture_one = "BOT is tying CRIMINAL up!"
+ capture_two = "BOT is tying you up!"
+ infraction = "Structural integrity issue spotted with threat level THREAT_LEVEL"
+ attack_one = "BOT strikes CRIMINAL with his wrench!"
+ attack_two = "BOT strikes you with his wrench!"
+ arrest_texts = list("Fixing", "Repairing")
+ arrest_emote = "ARREST_TYPE level THREAT_LEVEL structural issue in LOCATION"
+ stun_sounds = list('sound/weapons/genhit.ogg')
+
+/datum/beepsky_fashion/tophat
+ obj_icon_state = "tophat"
+ desc = "It's a secbot, wearing a top hat! How fancy."
\ No newline at end of file
diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm
index 71b3e2e144..20cb7cc824 100644
--- a/code/modules/clothing/head/collectable.dm
+++ b/code/modules/clothing/head/collectable.dm
@@ -27,7 +27,9 @@
icon_state = "chef"
item_state = "chef"
dynamic_hair_suffix = ""
+
dog_fashion = /datum/dog_fashion/head/chef
+ beepsky_fashion = /datum/beepsky_fashion/chef
/obj/item/clothing/head/collectable/paper
name = "collectable paper hat"
@@ -42,6 +44,8 @@
icon_state = "tophat"
item_state = "that"
+ beepsky_fashion = /datum/beepsky_fashion/tophat
+
/obj/item/clothing/head/collectable/captain
name = "collectable captain's hat"
desc = "A collectable hat that'll make you look just like a real comdom!"
@@ -49,6 +53,7 @@
item_state = "caphat"
dog_fashion = /datum/dog_fashion/head/captain
+ beepsky_fashion = /datum/beepsky_fashion/captain
/obj/item/clothing/head/collectable/police
name = "collectable police officer's hat"
@@ -91,6 +96,7 @@
item_state = "pirate"
dog_fashion = /datum/dog_fashion/head/pirate
+ beepsky_fashion = /datum/beepsky_fashion/pirate
/obj/item/clothing/head/collectable/kitty
name = "collectable kitty ears"
@@ -100,6 +106,7 @@
dynamic_hair_suffix = ""
dog_fashion = /datum/dog_fashion/head/kitty
+ beepsky_fashion = /datum/beepsky_fashion/cat
/obj/item/clothing/head/collectable/rabbitears
name = "collectable rabbit ears"
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index 80d0b7c8a8..10ea027610 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -15,6 +15,7 @@
dynamic_hair_suffix = "+generic"
dog_fashion = /datum/dog_fashion/head
+ beepsky_fashion = /datum/beepsky_fashion/hardhat
/obj/item/clothing/head/hardhat/ComponentInitialize()
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 638a0c2f23..5af694ea1b 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -13,7 +13,9 @@
strip_delay = 10
equip_delay_other = 10
dynamic_hair_suffix = ""
+
dog_fashion = /datum/dog_fashion/head/chef
+ beepsky_fashion = /datum/beepsky_fashion/chef
/obj/item/clothing/head/chefhat/suicide_act(mob/user)
user.visible_message("[user] is donning [src]! It looks like [user.p_theyre()] trying to become a chef.")
@@ -33,7 +35,9 @@
flags_inv = 0
armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
strip_delay = 60
+
dog_fashion = /datum/dog_fashion/head/captain
+ beepsky_fashion = /datum/beepsky_fashion/captain
//Captain: This is no longer space-worthy
/obj/item/clothing/head/caphat/parade
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 73675257e4..5e6124b23d 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -20,9 +20,11 @@
desc = "It's an amish looking hat."
icon_state = "tophat"
item_state = "that"
- dog_fashion = /datum/dog_fashion/head
throwforce = 1
+ dog_fashion = /datum/dog_fashion/head
+ beepsky_fashion = /datum/beepsky_fashion/tophat
+
/obj/item/clothing/head/canada
name = "striped red tophat"
desc = "It smells like fresh donut holes. / Il sent comme des trous de beignets frais."
@@ -126,7 +128,9 @@
desc = "Yarr."
icon_state = "pirate"
item_state = "pirate"
+
dog_fashion = /datum/dog_fashion/head/pirate
+ beepsky_fashion = /datum/beepsky_fashion/pirate
/obj/item/clothing/head/pirate/captain
name = "pirate captain hat"
@@ -205,6 +209,7 @@
item_state = "sombrero"
desc = "You can practically taste the fiesta."
flags_inv = HIDEHAIR
+
dog_fashion = /datum/dog_fashion/head/sombrero
/obj/item/clothing/head/sombrero/green
@@ -213,6 +218,7 @@
item_state = "greensombrero"
desc = "As elegant as a dancing cactus."
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
+
dog_fashion = null
/obj/item/clothing/head/sombrero/shamebrero
@@ -220,6 +226,7 @@
icon_state = "shamebrero"
item_state = "shamebrero"
desc = "Once it's on, it never comes off."
+
dog_fashion = null
/obj/item/clothing/head/sombrero/shamebrero/Initialize()
@@ -248,6 +255,7 @@
item_state = "that"
cold_protection = HEAD
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
+
dog_fashion = /datum/dog_fashion/head/santa
/obj/item/clothing/head/jester
@@ -286,6 +294,8 @@
resistance_flags = FIRE_PROOF
dynamic_hair_suffix = ""
+ beepsky_fashion = /datum/beepsky_fashion/king
+
/obj/item/clothing/head/crown/fancy
name = "magnificent crown"
desc = "A crown worn by only the highest emperors of the land space."
@@ -391,7 +401,9 @@
name = "cowboy hat"
desc = "A standard brown cowboy hat, yeehaw."
icon_state = "cowboyhat"
- item_state= "cowboyhat"
+ item_state = "cowboyhat"
+
+ beepsky_fashion = /datum/beepsky_fashion/cowboy
/obj/item/clothing/head/cowboyhat/black
name = "black cowboy hat"
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 54561c8a24..1d9c3dd325 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -50,6 +50,8 @@
flags_cover = HEADCOVERSEYES
heat = 1000
+ beepsky_fashion = /datum/beepsky_fashion/cake
+
/obj/item/clothing/head/hardhat/cakehat/process()
var/turf/location = src.loc
if(ishuman(location))
@@ -131,6 +133,7 @@
dynamic_hair_suffix = ""
dog_fashion = /datum/dog_fashion/head/kitty
+ beepsky_fashion = /datum/beepsky_fashion/cat
/obj/item/clothing/head/kitty/equipped(mob/living/carbon/human/user, slot)
if(ishuman(user) && slot == SLOT_HEAD)
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index a347b04e50..ac995bdeaf 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -102,6 +102,9 @@
var/can_salute = TRUE
var/salute_delay = 60 SECONDS
+ //emotes/speech stuff
+ var/patrol_emote = "Engaging patrol mode."
+
/mob/living/simple_animal/bot/proc/get_mode()
if(client) //Player bots do not have modes, thus the override. Also an easy way for PDA users/AI to know when a bot is a player.
if(paicard)
@@ -628,7 +631,7 @@ Pass a positive integer as an argument to override a bot's default speed.
return
mode = BOT_PATROL
else // no patrol target, so need a new one
- speak("Engaging patrol mode.")
+ speak(patrol_emote)
find_patrol_target()
tries++
return
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 752644dbb5..e2ab01b7bd 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -44,8 +44,8 @@
var/taunt = "BOT points at CRIMINAL!"
var/attack_one = "BOT has stunned CRIMINAL!"
var/attack_two = "BOT has stunned you!"
-
- var/stun_sound =
+ var/list/arrest_texts = list("Detaining", "Arresting")
+ var/arrest_emote = "ARREST_TYPE level THREAT_LEVEL scumbag CRIMINAL in LOCATION."
/mob/living/simple_animal/bot/secbot/beepsky
name = "Officer Beep O'sky"
@@ -63,7 +63,7 @@
resize = 0.8
update_transform()
-/mob/living/simple_animal/bot/secbot/proc/process_emote(var/emote_type, var/atom/criminal, var/threat)
+/mob/living/simple_animal/bot/secbot/proc/process_emote(var/emote_type, var/atom/criminal, var/threat, var/arrest = -1, var/location)
var/emote = "The continuity of space itself collapses around [src]. You should probably report that to someone higher up."
switch(emote_type)
if("DEATH")
@@ -80,16 +80,22 @@
emote = attack_one
if("ATTACK_TWO")
emote = attack_two
+ if("ARREST")
+ emote = arrest_emote
//now replace pieces of the text with the information we have
- if(!taunt)
+ if(emote_type != "TAUNT" && emote_type != "ARREST")
emote = replacetext(emote, "BOT", name)
else
- emote = replacetext(emote, "BOT", "[name]") //needs to be bold if its a taunt
+ emote = replacetext(emote, "BOT", "[name]") //needs to be bold if its a taunt or an arrest text
if(criminal)
emote = replacetext(emote, "CRIMINAL", criminal.name)
if(threat)
emote = replacetext(emote, "THREAT_LEVEL", threat)
+ if(arrest > -1)
+ emote = replacetext(emote, "ARREST_TYPE", arrest_texts[arrest + 1])
+ if(location)
+ emote = replacetext(emote, "LOCATION", location)
return emote
/mob/living/simple_animal/bot/secbot/beepsky/explode()
@@ -303,6 +309,9 @@ Auto Patrol: []"},
taunt = initial(taunt)
attack_one = initial(attack_one)
attack_two = initial(attack_two)
+ arrest_texts = initial(arrest_texts)
+ arrest_emote = initial(arrest_emote)
+ patrol_emote = initial(patrol_emote)
bot_hat = null
qdel(stored_fashion)
var/mob/living/carbon/C = A
@@ -348,8 +357,8 @@ Auto Patrol: []"},
if(ishuman(C))
if(stored_fashion)
stored_fashion.stun_attack(C)
- if(stored_fashion.stun_sound)
- playsound(src, stored_fashion.stun_sound, 50, TRUE, -1)
+ if(stored_fashion.stun_sounds && !stored_fashion.ignore_sound)
+ playsound(src, pick(stored_fashion.stun_sounds), 50, TRUE, -1)
else
playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1)
C.stuttering = 5
@@ -365,7 +374,7 @@ Auto Patrol: []"},
log_combat(src,C,"stunned")
if(declare_arrests)
var/area/location = get_area(src)
- speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag [C] in [location].", radio_channel)
+ speak(process_emote("ARREST", C, threat, arrest_type, location), radio_channel)
C.visible_message("[process_emote("ATTACK_ONE", C)]",\
"[process_emote("ATTACK_TWO", C)]")
diff --git a/icons/mob/secbot_head.dmi b/icons/mob/secbot_head.dmi
index 6a41392bdf..09b28cad68 100644
Binary files a/icons/mob/secbot_head.dmi and b/icons/mob/secbot_head.dmi differ