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