diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm index 56d9754eb42f..013d4315813b 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm @@ -139,3 +139,8 @@ ///from mind/transfer_to. Sent after the mind has been transferred: (mob/previous_body) #define COMSIG_MIND_TRANSFERRED "mind_transferred" + +///from /mob/create_typing_indicator() +#define COMSIG_MOB_CREATE_TYPING_INDICATOR "create_typing_indicator" + ///Icon used for the typing indicator + #define BUBBLE_ICON_STATE 1 diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index 456467a56761..33ed99d829aa 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -112,3 +112,18 @@ //Used in visible_message_flags, audible_message_flags and runechat_flags #define EMOTE_MESSAGE (1<<0) + +//Typing indicator defines, used in /mob/create_typing_indicator() +#define BUBBLE_DEFAULT "default" +#define BUBBLE_LAWYER "lawyer" +#define BUBBLE_ROBOT "robot" +#define BUBBLE_MACHINE "machine" +#define BUBBLE_SYNDIBOT "syndibot" +#define BUBBLE_SWARMER "swarmer" +#define BUBBLE_SLIME "slime" +#define BUBBLE_CLOCK "clock" +#define BUBBLE_ALIEN "alien" +#define BUBBLE_ALIENROYAL "alienroyal" +#define BUBBLE_DARKSPAWN "darkspawn" +#define BUBBLE_GUARDIAN "guardian" +#define BUBBLE_BLOB "blob" diff --git a/code/datums/elements/speech_bubble_override.dm b/code/datums/elements/speech_bubble_override.dm new file mode 100644 index 000000000000..6a72bf3b97fa --- /dev/null +++ b/code/datums/elements/speech_bubble_override.dm @@ -0,0 +1,27 @@ +/datum/element/speech_bubble_override + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH_ON_HOST_DESTROY + argument_hash_start_idx = 2 + var/bubble_type + +/datum/element/speech_bubble_override/Attach(datum/target, bubble_type) + . = ..() + if(!ismob(target)) + return ELEMENT_INCOMPATIBLE + + src.bubble_type = bubble_type + + RegisterSignal(target, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + RegisterSignal(target, COMSIG_MOB_CREATE_TYPING_INDICATOR, PROC_REF(handle_typing_indicator)) + +/datum/element/speech_bubble_override/Detach(datum/source, ...) + UnregisterSignal(source, COMSIG_MOB_SAY) + UnregisterSignal(source, COMSIG_MOB_CREATE_TYPING_INDICATOR) + return ..() + +/datum/element/speech_bubble_override/proc/handle_speech(mob/target, list/speech_args) + SIGNAL_HANDLER + speech_args[SPEECH_BUBBLE_TYPE] = bubble_type + +/datum/element/speech_bubble_override/proc/handle_typing_indicator(mob/target, list/bubble_args) + SIGNAL_HANDLER + bubble_args[BUBBLE_ICON_STATE] = bubble_type diff --git a/code/modules/antagonists/blob/blob_mobs.dm b/code/modules/antagonists/blob/blob_mobs.dm index 3c9b7fa82a2e..cc7ee9ee71eb 100644 --- a/code/modules/antagonists/blob/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob_mobs.dm @@ -8,7 +8,7 @@ icon = 'icons/mob/blob.dmi' pass_flags = PASSBLOB faction = list(ROLE_BLOB) - bubble_icon = "blob" + bubble_icon = BUBBLE_BLOB speak_emote = null //so we use verb_yell/verb_say/etc atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 diff --git a/code/modules/antagonists/clockcult/clock_mobs.dm b/code/modules/antagonists/clockcult/clock_mobs.dm index 0a080e94fe02..019cd68bfad0 100644 --- a/code/modules/antagonists/clockcult/clock_mobs.dm +++ b/code/modules/antagonists/clockcult/clock_mobs.dm @@ -16,7 +16,7 @@ verb_whisper = "imparts" verb_yell = "harangues" initial_language_holder = /datum/language_holder/clockmob - bubble_icon = "clock" + bubble_icon = BUBBLE_CLOCK light_color = "#E42742" deathsound = 'sound/magic/clockwork/anima_fragment_death.ogg' speech_span = SPAN_ROBOT diff --git a/code/modules/antagonists/nukeop/equipment/borgchameleon.dm b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm index 27f710613846..f4d6d8f46324 100644 --- a/code/modules/antagonists/nukeop/equipment/borgchameleon.dm +++ b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm @@ -134,7 +134,7 @@ savedName = user.name user.name = friendlyName user.module.cyborg_base_icon = initial(selected_module.cyborg_base_icon) - user.bubble_icon = "robot" + user.bubble_icon = BUBBLE_ROBOT user.module.name = input_module active = TRUE user.update_icons() diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 3822fcb73be4..d182a5b3362e 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -316,13 +316,12 @@ /obj/item/clothing/accessory/lawyers_badge/on_clothing_equip(obj/item/clothing/U, user) var/mob/living/L = user if(L) - L.bubble_icon = "lawyer" + L.AddElement(/datum/element/speech_bubble_override, BUBBLE_LAWYER) /obj/item/clothing/accessory/lawyers_badge/on_clothing_dropped(obj/item/clothing/U, user) var/mob/living/L = user if(L) - L.bubble_icon = initial(L.bubble_icon) - + L.RemoveElement(/datum/element/speech_bubble_override, BUBBLE_LAWYER) //////////////// //HA HA! NERD!// diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 995728c0f2ad..c28a07153c06 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -9,7 +9,7 @@ see_in_dark = 4 verb_say = "hisses" initial_language_holder = /datum/language_holder/alien - bubble_icon = "alien" + bubble_icon = BUBBLE_ALIEN type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno var/obj/item/card/id/wear_id = null // Fix for station bounced radios -- Skie diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 4ccdde632602..24e3d79584c4 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -5,7 +5,7 @@ ventcrawler = VENTCRAWLER_NONE //pull over that ass too fat unique_name = 0 pixel_x = -16 - bubble_icon = "alienroyal" + bubble_icon = BUBBLE_ALIENROYAL mob_size = MOB_SIZE_LARGE layer = LARGE_MOB_LAYER //above most mobs, but below speechbubbles pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper. diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 1694da2f6b43..6157cf4c7eb0 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -162,6 +162,9 @@ GLOBAL_LIST_EMPTY(features_by_species) ///what type of gas is breathed var/breathid = "o2" + /// Special typing indicators + var/bubble_icon = BUBBLE_DEFAULT + /// The icon_state of the fire overlay added when sufficently ablaze and standing. see onfire.dmi var/fire_overlay = "human" //not used until monkey is added as a species type rather than a mob @@ -434,6 +437,7 @@ GLOBAL_LIST_EMPTY(features_by_species) C.Digitigrade_Leg_Swap(FALSE) C.mob_biotypes = inherent_biotypes + C.bubble_icon = bubble_icon regenerate_organs(C,old_species) diff --git a/code/modules/mob/living/carbon/human/species_types/IPC.dm b/code/modules/mob/living/carbon/human/species_types/IPC.dm index 49ed03017109..e22d4936abc7 100644 --- a/code/modules/mob/living/carbon/human/species_types/IPC.dm +++ b/code/modules/mob/living/carbon/human/species_types/IPC.dm @@ -4,6 +4,7 @@ name = "IPC" //inherited from the real species, for health scanners and things id = "ipc" say_mod = "states" //inherited from a user's real species + bubble_icon = BUBBLE_ROBOT // beep boop sexes = FALSE species_traits = list(NOTRANSSTING,NOEYESPRITES,NO_DNA_COPY,NOZOMBIE,MUTCOLORS,NOHUSK,AGENDER,NOBLOOD,NO_UNDERWEAR) inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOBREATH,TRAIT_LIMBATTACHMENT,TRAIT_EASYDISMEMBER,TRAIT_NOCRITDAMAGE,TRAIT_GENELESS,TRAIT_MEDICALIGNORE,TRAIT_NOCLONE,TRAIT_TOXIMMUNE,TRAIT_EASILY_WOUNDED,TRAIT_NODEFIB,TRAIT_POWERHUNGRY) diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm index f47e803cf76d..f61de46f7d57 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -2,6 +2,7 @@ name = "Android" id = "android" say_mod = "states" + bubble_icon = BUBBLE_ROBOT sexes = FALSE species_traits = list(NOBLOOD, NOZOMBIE, NOHUSK, NO_DNA_COPY, NOTRANSSTING) inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_COLDBLOODED,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_NOCLONE,TRAIT_TOXIMMUNE,TRAIT_GENELESS,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT,TRAIT_MEDICALIGNORE) diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index ec31ef5643ae..f1cfac0ca393 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -5,6 +5,7 @@ id = "jelly" default_color = "00FF90" say_mod = "chirps" + bubble_icon = BUBBLE_SLIME species_traits = list(MUTCOLORS, EYECOLOR, NOBLOOD, HAIR) inherent_traits = list(TRAIT_TOXINLOVER) meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime diff --git a/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm b/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm index f956aa83e266..d6f44556a682 100644 --- a/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm +++ b/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm @@ -11,6 +11,7 @@ liked_food = GROSS | MEAT | MICE disliked_food = GRAIN | DAIRY | VEGETABLES | FRUIT say_mod = "hisses" + bubble_icon = BUBBLE_ALIEN species_language_holder = /datum/language_holder/polysmorph brutemod = 0.9 //exoskeleton protects against brute burnmod = 1.35 //residual plasma inside them, highly flammable diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 4288d6291183..d051a4a06371 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -77,8 +77,6 @@ var/health_doll_icon //if this exists AND the normal sprite is bigger than 32x32, this is the replacement icon state (because health doll size limitations). the icon will always be screen_gen.dmi - var/bubble_icon = "default" //what icon the mob uses for speechbubbles - var/last_bumped = 0 var/unique_name = 0 //if a mob's name should be appended with an id when created e.g. Mob (666) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 0aa25a9049cc..e1053df195df 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -320,6 +320,8 @@ GLOBAL_LIST_INIT(special_radio_keys, list( if(M.client) speech_bubble_recipients.Add(M.client) var/image/I = image('icons/mob/talk.dmi', src, "[bubble_type][say_test(message)]", FLY_LAYER) + if(a_intent == INTENT_HARM) // ANGRY!!!! + I.add_overlay("angry") I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(flick_overlay), I, speech_bubble_recipients, 30) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index ea28cd315e22..8fec9665d8f4 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -5,7 +5,7 @@ icon_state = "robot" maxHealth = 100 health = 100 - bubble_icon = "robot" + bubble_icon = BUBBLE_ROBOT designation = "Default" ///used for displaying the prefix & getting the current module of cyborg has_limbs = 1 hud_type = /datum/hud/robot @@ -920,7 +920,7 @@ /mob/living/silicon/robot/modules/syndicate icon_state = "synd_sec" faction = list(ROLE_SYNDICATE) - bubble_icon = "syndibot" + bubble_icon = BUBBLE_SYNDIBOT req_access = list(ACCESS_SYNDICATE) lawupdate = FALSE scrambledcodes = TRUE // These are rogue borgs. diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 7e2cb6838954..1478a4ca9dd1 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -8,7 +8,7 @@ initial_language_holder = /datum/language_holder/synthetic see_in_dark = 8 infra_luminosity = 0 - bubble_icon = "machine" + bubble_icon = BUBBLE_MACHINE weather_immunities = list("ash") possible_a_intents = list(INTENT_HELP, INTENT_HARM) mob_biotypes = MOB_ROBOTIC diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index bf7a61cc67bb..2546137dd38f 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -18,7 +18,7 @@ verb_exclaim = "declares" verb_yell = "alarms" initial_language_holder = /datum/language_holder/synthetic - bubble_icon = "machine" + bubble_icon = BUBBLE_MACHINE speech_span = SPAN_ROBOT faction = list("neutral", "silicon" , "turret") light_system = MOVABLE_LIGHT diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 3f28397fa82e..82b2fa7b11c1 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -38,7 +38,7 @@ mob_biotypes = MOB_ROBOTIC speak_emote = list("chirps") speech_span = SPAN_ROBOT - bubble_icon = "machine" + bubble_icon = BUBBLE_MACHINE initial_language_holder = /datum/language_holder/drone mob_size = MOB_SIZE_SMALL has_unlimited_silicon_privilege = 1 diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index 37ec4d0c6b6e..ac1d69f45af9 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -20,7 +20,7 @@ initial_language_holder = /datum/language_holder/drone/syndicate faction = list(ROLE_SYNDICATE) speak_emote = list("hisses") - bubble_icon = "syndibot" + bubble_icon = BUBBLE_SYNDIBOT heavy_emp_damage = 10 laws = \ "1. Interfere.\n"+\ @@ -122,7 +122,7 @@ verb_exclaim = "proclaims" verb_whisper = "imparts" verb_yell = "harangues" - bubble_icon = "clock" + bubble_icon = BUBBLE_CLOCK initial_language_holder = /datum/language_holder/clockmob light_color = "#E42742" heavy_emp_damage = 0 diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 096ac89b188b..7829e7bd6cf5 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -12,7 +12,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians speak_emote = list("hisses") gender = NEUTER mob_biotypes = MOB_INORGANIC|MOB_SPIRIT - bubble_icon = "guardian" + bubble_icon = BUBBLE_GUARDIAN response_help = "passes through" response_disarm = "flails at" response_harm = "punches" diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index ead1ba836cb9..a6247ee1dfcc 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -23,7 +23,7 @@ attack_vis_effect = ATTACK_EFFECT_CLAW attacktext = "slashes" speak_emote = list("hisses") - bubble_icon = "alien" + bubble_icon = BUBBLE_ALIEN a_intent = INTENT_HARM attack_sound = 'sound/weapons/bladeslice.ogg' atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) @@ -133,7 +133,7 @@ icon_state = "alienq" icon_living = "alienq" icon_dead = "alienq_dead" - bubble_icon = "alienroyal" + bubble_icon = BUBBLE_ALIENROYAL move_to_delay = 4 maxHealth = 400 health = 400 diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index c44e2bee1c25..faa427b89fb3 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -29,7 +29,7 @@ verb_ask = "queries" verb_exclaim = "declares" verb_yell = "alarms" - bubble_icon = "machine" + bubble_icon = BUBBLE_MACHINE speech_span = SPAN_ROBOT gold_core_spawnable = HOSTILE_SPAWN del_on_death = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index b1856d13a14a..148c663989e1 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -312,7 +312,7 @@ movement_type = FLYING limb_destroyer = 1 speak_emote = list("states") - bubble_icon = "syndibot" + bubble_icon = BUBBLE_SYNDIBOT gold_core_spawnable = HOSTILE_SPAWN del_on_death = 1 deathmessage = "is smashed into pieces!" diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 9ac936d89d9a..d319a177765f 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -19,7 +19,7 @@ response_harm = "stomps on" emote_see = list("jiggles", "bounces in place") speak_emote = list("blorbles") - bubble_icon = "slime" + bubble_icon = BUBBLE_SLIME initial_language_holder = /datum/language_holder/slime atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index d1a482ed007f..7047659c1d6a 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -141,6 +141,8 @@ var/datum/hud/hud_used = null /// I have no idea tbh var/research_scanner = FALSE + /// What icon the mob uses for typing indicators + var/bubble_icon = BUBBLE_DEFAULT /// Is the mob throw intent on var/in_throw_mode = 0 diff --git a/code/modules/swarmers/swarmer.dm b/code/modules/swarmers/swarmer.dm index a803253f031a..81595e1991d3 100644 --- a/code/modules/swarmers/swarmer.dm +++ b/code/modules/swarmers/swarmer.dm @@ -20,7 +20,7 @@ desc = "Robotic constructs of unknown design, swarmers seek only to consume materials and replicate themselves indefinitely." speak_emote = list("tones") initial_language_holder = /datum/language_holder/swarmer - bubble_icon = "swarmer" + bubble_icon = BUBBLE_SWARMER mob_biotypes = MOB_ROBOTIC health = 40 maxHealth = 40 diff --git a/icons/mob/talk.dmi b/icons/mob/talk.dmi index 772d4bc6f930..e0648a5af0a1 100644 Binary files a/icons/mob/talk.dmi and b/icons/mob/talk.dmi differ diff --git a/yogstation.dme b/yogstation.dme index 32e2e31a62c3..01b68af6edd2 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -679,6 +679,7 @@ #include "code\datums\elements\movetype_handler.dm" #include "code\datums\elements\regenerator.dm" #include "code\datums\elements\rust.dm" +#include "code\datums\elements\speech_bubble_override.dm" #include "code\datums\elements\squish.dm" #include "code\datums\elements\update_icon_blocker.dm" #include "code\datums\elements\decals\_decals.dm" @@ -2999,6 +3000,7 @@ #include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\stalwart.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ambusher.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\curse_blob.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\drakeling.dm" @@ -3010,7 +3012,6 @@ #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\polarbear.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\wasp.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\wolf.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ambusher.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\elite.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\goliath_broodmother.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\herald.dm" diff --git a/yogstation/code/modules/guardian/guardian.dm b/yogstation/code/modules/guardian/guardian.dm index d2d02ad0f4e6..26db957c857d 100644 --- a/yogstation/code/modules/guardian/guardian.dm +++ b/yogstation/code/modules/guardian/guardian.dm @@ -19,7 +19,7 @@ GLOBAL_LIST_INIT(guardian_projectile_damage, list( speak_emote = list("hisses") gender = NEUTER mob_biotypes = MOB_INORGANIC|MOB_SPIRIT - bubble_icon = "guardian" + bubble_icon = BUBBLE_GUARDIAN response_help = "passes through" response_disarm = "flails at" response_harm = "punches" diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/darkspawn.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/darkspawn.dm index 6d9808c035f0..02f5d9a800f1 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/darkspawn.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/darkspawn.dm @@ -4,6 +4,7 @@ name = "Darkspawn" id = "darkspawn" limbs_id = "darkspawn" + bubble_icon = BUBBLE_DARKSPAWN sexes = FALSE nojumpsuit = TRUE changesource_flags = MIRROR_BADMIN | MIRROR_MAGIC | WABBAJACK | ERT_SPAWN //never put this in the pride pool because they look super valid @@ -46,7 +47,6 @@ /datum/species/darkspawn/spec_life(mob/living/carbon/human/H) handle_upgrades(H) - H.bubble_icon = "darkspawn" var/turf/T = H.loc if(istype(T)) var/light_amount = T.get_lumcount() diff --git a/yogstation/code/modules/mob/say.dm b/yogstation/code/modules/mob/say.dm index 2969b40947d9..e883d6e90373 100644 --- a/yogstation/code/modules/mob/say.dm +++ b/yogstation/code/modules/mob/say.dm @@ -31,7 +31,7 @@ else bar_typing = FALSE remove_typing_indicator() - + /mob/proc/create_typing_indicator() if(typing_overlay) @@ -43,17 +43,20 @@ for(var/mob/M in listening) if(M.client && M.client.prefs.chat_toggles & CHAT_TYPING_INDICATOR) speech_bubble_recipients.Add(M.client) - var/bubble = "default" - if(isliving(src)) - var/mob/living/L = src - bubble = L.bubble_icon - typing_overlay = image('yogstation/icons/mob/talk.dmi', src, "[bubble]_talking", FLY_LAYER) - typing_overlay.appearance_flags = APPEARANCE_UI - typing_overlay.invisibility = invisibility - typing_overlay.alpha = alpha + typing_overlay = get_bubble_icon(bubble_icon) for(var/client/C in speech_bubble_recipients) C.images += typing_overlay +/mob/proc/get_bubble_icon(bubble) + bubble = bubble_icon + SEND_SIGNAL(src, COMSIG_MOB_CREATE_TYPING_INDICATOR, args) + typing_overlay = image('yogstation/icons/mob/talk.dmi', src, "[bubble]_talking", FLY_LAYER) + if(a_intent == INTENT_HARM) // ANGRY!!!! + typing_overlay.add_overlay("angry") + typing_overlay.appearance_flags = APPEARANCE_UI + typing_overlay.invisibility = invisibility + typing_overlay.alpha = alpha + return typing_overlay /mob/proc/remove_typing_indicator() if(!typing_overlay) diff --git a/yogstation/icons/mob/talk.dmi b/yogstation/icons/mob/talk.dmi index 9411d2a99826..edbbc1a8f473 100644 Binary files a/yogstation/icons/mob/talk.dmi and b/yogstation/icons/mob/talk.dmi differ