diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index 34c68ebd089..f6ca0ea5655 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -68,7 +68,7 @@ #define LANGUAGE_ALAI "Alai" #define LANGUAGE_ZADDAT "Vedahq" #define LANGUAGE_PROMETHEAN "Promethean Biolinguistics" -#define LANGUAGE_BLOB "Blob" +#define LANGUAGE_BLOB "Chemosense Transmission" #define LANGUAGE_GIBBERISH "Babel" // Language flags. diff --git a/code/modules/blob2/blobs/base_blob.dm b/code/modules/blob2/blobs/base_blob.dm index 71d4ad72543..f9c9eb588d8 100644 --- a/code/modules/blob2/blobs/base_blob.dm +++ b/code/modules/blob2/blobs/base_blob.dm @@ -22,6 +22,7 @@ GLOBAL_LIST_EMPTY(all_blobs) /obj/structure/blob/Initialize(newloc, new_overmind) if(new_overmind) overmind = new_overmind + faction = overmind.blob_type.faction update_icon() if(!integrity) integrity = max_integrity @@ -47,19 +48,24 @@ GLOBAL_LIST_EMPTY(all_blobs) color = null set_light(0) +/obj/structure/blob/update_transform() + var/matrix/M = matrix() + M.Scale(icon_scale_x, icon_scale_y) + animate(src, transform = M, time = 10) + // Blob tiles are not actually dense so we need Special Code(tm). /obj/structure/blob/CanPass(atom/movable/mover, turf/target) if(istype(mover) && mover.checkpass(PASSBLOB)) return TRUE else if(istype(mover, /mob/living)) var/mob/living/L = mover - if(L.faction == "blob") + if(L.faction == faction) return TRUE else if(istype(mover, /obj/item/projectile)) var/obj/item/projectile/P = mover if(istype(P.firer, /obj/structure/blob)) return TRUE - if(istype(P.firer) && P.firer.faction == "blob") + if(istype(P.firer) && P.firer.faction == faction) return TRUE return FALSE @@ -88,6 +94,7 @@ GLOBAL_LIST_EMPTY(all_blobs) update_icon() pulse_timestamp = world.time + 1 SECOND if(overmind) + faction = overmind.blob_type.faction overmind.blob_type.on_pulse(src) return TRUE //we did it, we were pulsed! return FALSE //oh no we failed @@ -106,6 +113,9 @@ GLOBAL_LIST_EMPTY(all_blobs) for(var/L in blobs_to_affect) var/obj/structure/blob/B = L + if(B.faction != faction) + continue + if(!B.overmind && !istype(B, /obj/structure/blob/core) && prob(30)) B.overmind = pulsing_overmind //reclaim unclaimed, non-core blobs. B.update_icon() @@ -138,7 +148,8 @@ GLOBAL_LIST_EMPTY(all_blobs) var/dirn = pick(dirs) dirs.Remove(dirn) T = get_step(src, dirn) - if(!(locate(/obj/structure/blob) in T)) + var/obj/structure/blob/B = locate(/obj/structure/blob) in T + if(!B || B.faction != faction) // Allow opposing blobs to fight. break else T = null @@ -164,6 +175,7 @@ GLOBAL_LIST_EMPTY(all_blobs) if(make_blob) //well, can we? var/obj/structure/blob/B = new /obj/structure/blob/normal(src.loc) + B.faction = faction if(controller) B.overmind = controller else @@ -340,7 +352,7 @@ GLOBAL_LIST_EMPTY(all_blobs) if(!P) return - if(istype(P.firer) && P.firer.faction == "blob") + if(istype(P.firer) && P.firer.faction == faction) return var/damage = P.get_structure_damage() // So tasers don't hurt the blob. @@ -366,6 +378,31 @@ GLOBAL_LIST_EMPTY(all_blobs) if(overmind) overmind.blob_type.on_water(src, amount) +/obj/structure/blob/blob_act(var/obj/structure/blob/B) + . = ..() + + if(B) + + if(!B.overmind) + return + + if(B.faction != faction) + var/damage = rand(B.overmind.blob_type.damage_lower, B.overmind.blob_type.damage_upper) + var/inc_damage_type = B.overmind.blob_type.damage_type + + if(overmind) + damage = overmind.blob_type.on_received_damage(src, damage, inc_damage_type, B) + + else + faction = B.faction + overmind = B.overmind + update_icon() + return + + adjust_integrity(-1 * damage) + + return + /obj/structure/blob/proc/adjust_integrity(amount) integrity = between(0, integrity + amount, max_integrity) if(integrity == 0) diff --git a/code/modules/blob2/blobs/factory.dm b/code/modules/blob2/blobs/factory.dm index f9415a6e663..464f89f7606 100644 --- a/code/modules/blob2/blobs/factory.dm +++ b/code/modules/blob2/blobs/factory.dm @@ -35,7 +35,7 @@ var/mob/living/simple_mob/blob/spore/S = null if(overmind) S = new overmind.blob_type.spore_type(src.loc, src) - S.faction = "blob" + S.faction = overmind.blob_type.faction if(istype(S)) S.overmind = overmind overmind.blob_mobs.Add(S) diff --git a/code/modules/blob2/blobs/normal.dm b/code/modules/blob2/blobs/normal.dm index a6e841d4ddc..cf25ff5c1bf 100644 --- a/code/modules/blob2/blobs/normal.dm +++ b/code/modules/blob2/blobs/normal.dm @@ -19,4 +19,13 @@ if(overmind) name = "[overmind.blob_type.name]" else - name = "inert [base_name]" \ No newline at end of file + name = "inert [base_name]" + +/obj/structure/blob/normal/pulsed() + ..() + + if(prob(30)) + adjust_scale((rand(10, 13) / 10), (rand(10, 13) / 10)) + + else + adjust_scale(1) diff --git a/code/modules/blob2/core_chunk.dm b/code/modules/blob2/core_chunk.dm index 7d8f588568e..4abc06843eb 100644 --- a/code/modules/blob2/core_chunk.dm +++ b/code/modules/blob2/core_chunk.dm @@ -5,6 +5,7 @@ description_info = "Some blob types will have core effects when the chunk is used in-hand, toggled with an alt click, or constantly active." icon = 'icons/mob/blob.dmi' icon_state = "blobcore" + flags = OPENCONTAINER var/datum/blob_type/blob_type // The blob type this dropped from. var/active_ability_cooldown = 20 SECONDS @@ -15,11 +16,17 @@ var/passive_ability_cooldown = 5 SECONDS var/last_passive_use = 0 + var/can_genesis = TRUE // Can the core chunk be used to grow a new blob? + drop_sound = 'sound/effects/slime_squish.ogg' +/obj/item/weapon/blobcore_chunk/is_open_container() + return 1 + /obj/item/weapon/blobcore_chunk/New(var/atom/newloc, var/datum/blob_type/parentblob = null) ..(newloc) + create_reagents(120) setup_blobtype(parentblob) /obj/item/weapon/blobcore_chunk/Destroy() @@ -91,10 +98,57 @@ blob_type.on_chunk_tick(src) /obj/item/weapon/blobcore_chunk/AltClick(mob/living/carbon/user) - if(blob_type &&blob_type.chunk_active_type == BLOB_CHUNK_TOGGLE) + if(blob_type && blob_type.chunk_active_type == BLOB_CHUNK_TOGGLE) should_tick = !should_tick if(should_tick) to_chat(user, "\The [src] shudders with life.") else to_chat(user, "\The [src] stills, returning to a death-like state.") + +/obj/item/weapon/blobcore_chunk/proc/regen(var/newfaction = null) + if(istype(blob_type)) + if(newfaction) + blob_type.faction = newfaction + + var/obj/structure/blob/core/NC = new (get_turf(src)) + NC.overmind.blob_type = blob_type + NC.overmind.blob_core.update_icon() + return TRUE + + return FALSE + +/datum/chemical_reaction/blob_reconstitution + name = "Hostile Blob Revival" + id = "blob_revival" + result = null + required_reagents = list("phoron" = 60) + result_amount = 1 + +/datum/chemical_reaction/blob_reconstitution/can_happen(var/datum/reagents/holder) + if(holder.my_atom && istype(holder.my_atom, /obj/item/weapon/blobcore_chunk)) + return ..() + return FALSE + +/datum/chemical_reaction/blob_reconstitution/on_reaction(var/datum/reagents/holder) + var/obj/item/weapon/blobcore_chunk/chunk = holder.my_atom + if(chunk.can_genesis && chunk.regen()) + chunk.visible_message("[chunk] bubbles, surrounding itself with a rapidly expanding mass of [chunk.blob_type.name]!") + chunk.can_genesis = FALSE + else + chunk.visible_message("[chunk] shifts strangely, but falls still.") + +/datum/chemical_reaction/blob_reconstitution/domination + name = "Allied Blob Revival" + id = "blob_friend" + result = null + required_reagents = list("hydrophoron" = 40, "peridaxon" = 20, "mutagen" = 20) + result_amount = 1 + +/datum/chemical_reaction/blob_reconstitution/domination/on_reaction(var/datum/reagents/holder) + var/obj/item/weapon/blobcore_chunk/chunk = holder.my_atom + if(chunk.can_genesis && chunk.regen("neutral")) + chunk.visible_message("[chunk] bubbles, surrounding itself with a rapidly expanding mass of [chunk.blob_type.name]!") + chunk.can_genesis = FALSE + else + chunk.visible_message("[chunk] shifts strangely, but falls still.") diff --git a/code/modules/blob2/overmind/overmind.dm b/code/modules/blob2/overmind/overmind.dm index ffcd347dd81..6df0cba6295 100644 --- a/code/modules/blob2/overmind/overmind.dm +++ b/code/modules/blob2/overmind/overmind.dm @@ -23,6 +23,14 @@ var/list/overminds = list() var/ai_controlled = TRUE var/auto_pilot = FALSE // If true, and if a client is attached, the AI routine will continue running. + universal_understand = TRUE + + var/list/has_langs = list(LANGUAGE_BLOB) + var/datum/language/default_language = null + +/mob/observer/blob/get_default_language() + return default_language + /mob/observer/blob/Initialize(newloc, pre_placed = 0, starting_points = 60, desired_blob_type = null) blob_points = starting_points if(pre_placed) //we already have a core! @@ -41,6 +49,11 @@ var/list/overminds = list() if(blob_core) blob_core.update_icon() + for(var/L in has_langs) + languages |= GLOB.all_languages[L] + if(languages.len) + default_language = languages[1] + return ..(newloc) /mob/observer/blob/Destroy() @@ -67,9 +80,9 @@ var/list/overminds = list() stat(null, "Power Stored: [blob_points]/[max_blob_points]") stat(null, "Total Blobs: [GLOB.all_blobs.len]") -/mob/observer/blob/Move(NewLoc, Dir = 0) +/mob/observer/blob/Move(var/atom/NewLoc, Dir = 0) if(placed) - var/obj/structure/blob/B = locate() in range("3x3", NewLoc) + var/obj/structure/blob/B = (locate() in view("5x5", NewLoc)) if(B) forceMove(NewLoc) return TRUE @@ -93,3 +106,62 @@ var/list/overminds = list() if(blob_points >= 100) if(!auto_factory() && !auto_resource()) auto_node() + +/mob/observer/blob/say(var/message, var/datum/language/speaking = null, var/whispering = 0) + message = sanitize(message) + + if(!message) + return + + //If you're muted for IC chat + if(client) + if(message) + client.handle_spam_prevention(MUTE_IC) + if((client.prefs.muted & MUTE_IC) || say_disabled) + to_chat(src, "You cannot speak in IC (Muted).") + return + + //These will contain the main receivers of the message + var/list/listening = list() + var/list/listening_obj = list() + + var/turf/T = get_turf(src) + if(T) + //Obtain the mobs and objects in the message range + var/list/results = get_mobs_and_objs_in_view_fast(T, world.view, remote_ghosts = client ? TRUE : FALSE) + listening = results["mobs"] + listening_obj = results["objs"] + else + return 1 //If we're in nullspace, then forget it. + + var/list/message_pieces = parse_languages(message) + if(istype(message_pieces, /datum/multilingual_say_piece)) // Little quirk for dealing with hivemind/signlang languages. + var/datum/multilingual_say_piece/S = message_pieces // Yay for BYOND's hilariously broken typecasting for allowing us to do this. + S.speaking.broadcast(src, S.message) + return 1 + + if(!LAZYLEN(message_pieces)) + log_runtime(EXCEPTION("Message failed to generate pieces. [message] - [json_encode(message_pieces)]")) + return 0 + + //Handle nonverbal languages here + for(var/datum/multilingual_say_piece/S in message_pieces) + if(S.speaking.flags & NONVERBAL) + custom_emote(1, "[pick(S.speaking.signlang_verb)].") + + for(var/mob/M in listening) + spawn() + if(M && src) + if(get_dist(M, src) <= world.view || (M.stat == DEAD && !forbid_seeing_deadchat)) + M.hear_say(message_pieces, "conveys", (M.faction == blob_type.faction), src) + + //Object message delivery + for(var/obj/O in listening_obj) + spawn(0) + if(O && src) //If we still exist, when the spawn processes + var/dst = get_dist(get_turf(O),get_turf(src)) + if(dst <= world.view) + O.hear_talk(src, message_pieces, "conveys") + + log_say(message, src) + return 1 diff --git a/code/modules/blob2/overmind/powers.dm b/code/modules/blob2/overmind/powers.dm index f5727e94bfe..4177bac9912 100644 --- a/code/modules/blob2/overmind/powers.dm +++ b/code/modules/blob2/overmind/powers.dm @@ -80,8 +80,8 @@ potential_blobs -= temp // Don't take up the core's shield spot. else if(!istype(temp, /obj/structure/blob/normal)) potential_blobs -= temp // Not a normal blob. - else if(temp.overmind != src) - potential_blobs -= temp // Not our blob. + else if(temp.overmind != src || temp.overmind.blob_type.faction != blob_type.faction) + potential_blobs -= temp // Not our blob, or even an ally. else B = temp break @@ -123,8 +123,8 @@ potential_blobs -= temp // Don't take up the core's shield spot. else if(!istype(temp, /obj/structure/blob/normal)) potential_blobs -= temp // Not a normal blob. - else if(temp.overmind != src) - potential_blobs -= temp // Not our blob. + else if(temp.overmind != src || temp.overmind.blob_type.faction != blob_type.faction) + potential_blobs -= temp // Not our blob, or even an ally else B = temp break @@ -165,8 +165,8 @@ potential_blobs -= temp else if(!istype(temp, /obj/structure/blob/normal)) potential_blobs -= temp - else if(temp.overmind != src) - potential_blobs -= temp // Not our blob. + else if(temp.overmind != src || temp.overmind.blob_type.faction != blob_type.faction) + potential_blobs -= temp // Not our blob, or even our ally. else B = temp break @@ -216,7 +216,7 @@ for(var/mob/living/L in view(src)) if(L.stat == DEAD) continue // Already dying or dead. - if(L.faction == "blob") + if(L.faction == blob_type.faction) continue // No friendly fire. if(locate(/obj/structure/blob) in L.loc) continue // Already has a blob over them. diff --git a/code/modules/blob2/overmind/types.dm b/code/modules/blob2/overmind/types.dm index 79df541aae5..8fffbcdbcae 100644 --- a/code/modules/blob2/overmind/types.dm +++ b/code/modules/blob2/overmind/types.dm @@ -9,6 +9,8 @@ var/color = "#FFFFFF" // The actual blob's color. var/complementary_color = "#000000" //a color that's complementary to the normal blob color. Blob mobs are colored in this. + var/faction = "blob" // The blob's faction. + var/attack_message = "The blob attacks you" // Base message the mob gets when blob_act() gets called on them by the blob. An exclaimation point is added to the end. var/attack_message_living = null // Appended to attack_message, if the target fails isSynthetic() check. var/attack_message_synth = null // Ditto, but if they pass isSynthetic(). diff --git a/code/modules/blob2/overmind/types/blazing_oil.dm b/code/modules/blob2/overmind/types/blazing_oil.dm index 094083e7780..7d8c9f307d5 100644 --- a/code/modules/blob2/overmind/types/blazing_oil.dm +++ b/code/modules/blob2/overmind/types/blazing_oil.dm @@ -33,6 +33,8 @@ env.add_thermal_energy(10 * 1000) /datum/blob_type/blazing_oil/on_chunk_tick(obj/item/weapon/blobcore_chunk/B) + B.reagents.add_reagent("thermite_v", 0.5) + var/turf/T = get_turf(B) if(!T) return diff --git a/code/modules/blob2/overmind/types/cryogenic_goo.dm b/code/modules/blob2/overmind/types/cryogenic_goo.dm index 32684ed58f3..564516a71dd 100644 --- a/code/modules/blob2/overmind/types/cryogenic_goo.dm +++ b/code/modules/blob2/overmind/types/cryogenic_goo.dm @@ -46,6 +46,8 @@ env.add_thermal_energy(-10 * 1000) /datum/blob_type/cryogenic_goo/on_chunk_tick(obj/item/weapon/blobcore_chunk/B) + B.reagents.add_reagent("cryoslurry", 0.5) + var/turf/simulated/T = get_turf(B) if(!istype(T)) return diff --git a/code/modules/blob2/overmind/types/ectoplasmic_horror.dm b/code/modules/blob2/overmind/types/ectoplasmic_horror.dm index f7689847cde..a528ce83889 100644 --- a/code/modules/blob2/overmind/types/ectoplasmic_horror.dm +++ b/code/modules/blob2/overmind/types/ectoplasmic_horror.dm @@ -35,7 +35,7 @@ listclearnulls(active_beams) var/atom/movable/beam_origin = B for(var/mob/living/L in oview(world.view, B)) - if(L.stat == DEAD || L.faction == "blob") + if(L.stat == DEAD || L.faction == faction) continue if(prob(5)) var/beamtarget_exists = FALSE @@ -82,7 +82,7 @@ if(nearby_mobs.len) listclearnulls(active_beams) for(var/mob/living/L in nearby_mobs) - if(L.stat == DEAD || L.faction == "blob") + if(L.stat == DEAD || L.faction == faction) continue if(prob(5)) var/beamtarget_exists = FALSE diff --git a/code/modules/blob2/overmind/types/explosive_lattice.dm b/code/modules/blob2/overmind/types/explosive_lattice.dm index d0484c37254..aec6787eab1 100644 --- a/code/modules/blob2/overmind/types/explosive_lattice.dm +++ b/code/modules/blob2/overmind/types/explosive_lattice.dm @@ -30,7 +30,7 @@ for(var/mob/living/L in range(get_turf(victim), 1)) // We don't use orange(), in case there is more than one mob on the target tile. if(L == victim) // Already hit. continue - if(L.faction == "blob") // No friendly fire + if(L.faction == faction) // No friendly fire continue L.blob_act() diff --git a/code/modules/blob2/overmind/types/fulminant_organism.dm b/code/modules/blob2/overmind/types/fulminant_organism.dm index 2d940f93599..4f3788b787f 100644 --- a/code/modules/blob2/overmind/types/fulminant_organism.dm +++ b/code/modules/blob2/overmind/types/fulminant_organism.dm @@ -24,9 +24,10 @@ var/mob/living/simple_mob/blob/spore/S = new spore_type(T) if(istype(S)) S.overmind = O + S.faction = faction O.blob_mobs.Add(S) else - S.faction = "blob" + S.faction = faction S.update_icons() /datum/blob_type/fulminant_organism/on_death(obj/structure/blob/B) @@ -35,9 +36,10 @@ B.visible_message("\The [S] floats free from the [name]!") if(istype(S)) S.overmind = B.overmind + S.faction = faction B.overmind.blob_mobs.Add(S) else - S.faction = "blob" + S.faction = faction S.update_icons() /datum/blob_type/fulminant_organism/on_chunk_use(obj/item/weapon/blobcore_chunk/B, mob/living/user) diff --git a/code/modules/blob2/overmind/types/grey_goo.dm b/code/modules/blob2/overmind/types/grey_goo.dm index 5c93fb46c87..558f624e96f 100644 --- a/code/modules/blob2/overmind/types/grey_goo.dm +++ b/code/modules/blob2/overmind/types/grey_goo.dm @@ -14,6 +14,7 @@ attack_message = "The tide tries to swallow you" attack_message_living = ", and you feel your skin dissolve" attack_message_synth = ", and your external plating dissolves" + faction = "nanomachines" /datum/blob_type/grey_goo/on_emp(obj/structure/blob/B, severity) B.adjust_integrity(-(20 / severity)) diff --git a/code/modules/blob2/overmind/types/roiling_mold.dm b/code/modules/blob2/overmind/types/roiling_mold.dm index e909d060868..4594ad1c9f6 100644 --- a/code/modules/blob2/overmind/types/roiling_mold.dm +++ b/code/modules/blob2/overmind/types/roiling_mold.dm @@ -44,7 +44,7 @@ if(!istype(L)) return - if(istype(B, /obj/structure/blob/factory) && L.stat != DEAD && prob(ai_aggressiveness) && L.faction != "blob") + if(istype(B, /obj/structure/blob/factory) && L.stat != DEAD && prob(ai_aggressiveness) && L.faction != faction) var/obj/item/projectile/arc/spore/P = new(get_turf(B)) P.launch_projectile(L, BP_TORSO, B) diff --git a/code/modules/mob/language/outsider.dm b/code/modules/mob/language/outsider.dm index 43ccb5bb7ee..1d73c4640c4 100644 --- a/code/modules/mob/language/outsider.dm +++ b/code/modules/mob/language/outsider.dm @@ -154,3 +154,31 @@ key = "]" flags = RESTRICTED syllables = list("chan","ange","thi","se") + +//Bloblang. +/datum/language/blob + name = LANGUAGE_BLOB + desc = "The massive processing power of the Blob's core gives the overmind finely tuned abilities to transmit messages to nearby life-forms through chemical signals." + speech_verb = "resonates" + ask_verb = "reverberates" + exclaim_verb = "shudders" + colour = "blob" + key = "}" + machine_understands = TRUE + flags = RESTRICTED + + syllables = list("^", "˅", "-", "°", "~") + +/datum/language/corticalborer/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) + + var/mob/living/simple_mob/animal/borer/B + + if(istype(speaker,/mob/living/carbon)) + var/mob/living/carbon/M = speaker + B = M.has_brain_worms() + else if(istype(speaker,/mob/living/simple_mob/animal/borer)) + B = speaker + + if(B) + speaker_mask = B.true_name + ..(speaker,message,speaker_mask) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index a8137a8a89e..11158d89a1f 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -181,7 +181,7 @@ ..() /mob/living/blob_act(var/obj/structure/blob/B) - if(stat == DEAD || faction == "blob") + if(stat == DEAD || faction == B.faction) return var/damage = rand(30, 40) diff --git a/code/modules/mob/living/simple_mob/subtypes/blob/blob.dm b/code/modules/mob/living/simple_mob/subtypes/blob/blob.dm index 44ab4fdd09b..752211812d7 100644 --- a/code/modules/mob/living/simple_mob/subtypes/blob/blob.dm +++ b/code/modules/mob/living/simple_mob/subtypes/blob/blob.dm @@ -50,9 +50,13 @@ /mob/living/simple_mob/blob/blob_act(obj/structure/blob/B) if(!overmind && B.overmind) overmind = B.overmind + faction = B.overmind.blob_type.faction update_icon() - if(stat != DEAD && health < maxHealth) + if(faction != B.faction && B.overmind) + adjustBruteLoss(rand(B.overmind.blob_type.damage_lower, B.overmind.blob_type.damage_upper)) + + else if(stat != DEAD && health < maxHealth) adjustBruteLoss(-maxHealth*0.0125) adjustFireLoss(-maxHealth*0.0125) @@ -73,7 +77,7 @@ for(var/obj/item/I in items) if(istype(I, /obj/item/weapon/blobcore_chunk)) var/obj/item/weapon/blobcore_chunk/BC = I - if(!overmind || (BC.blob_type && overmind.blob_type.type == BC.blob_type.type)) + if(!overmind || (BC.blob_type && overmind.blob_type.type == BC.blob_type.type) || BC.blob_type.faction == faction) ally = TRUE break diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 75b2ccd07f2..95732bad6aa 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -289,7 +289,7 @@ // If we have a grab var/list/grablist = my_mob.ret_grab() - if(grablist.len) + if(LAZYLEN(grablist)) grablist -= my_mob // Just in case we're in a circular grab chain // It's just us and another person diff --git a/code/modules/vchat/css/ss13styles.css b/code/modules/vchat/css/ss13styles.css index 2cddefb0ca5..6c0a4e40673 100644 --- a/code/modules/vchat/css/ss13styles.css +++ b/code/modules/vchat/css/ss13styles.css @@ -172,7 +172,11 @@ h1.alert, h2.alert {color: #000000;} .say_quote {font-family: Georgia, Verdana, sans-serif;} .terminus {font-family: "Times New Roman", Times, serif, sans-serif} .interface {color: #330033;} +<<<<<<< HEAD .spacer {color: #9c660b;} /* VOREStation Add */ +======= +.blob {color: #ff950d; font-weight: bold; font-style: italic;} +>>>>>>> 89adcb0... Blob Genesis (#7781) .black {color: #000000;} .darkgray {color: #808080;} diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 4ca8fb9436b..8f0298e7c20 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -111,7 +111,11 @@ h1.alert, h2.alert {color: #000000;} .say_quote {font-family: Georgia, Verdana, sans-serif;} .terminus {font-family: "Times New Roman", Times, serif, sans-serif} .interface {color: #330033;} +<<<<<<< HEAD .spacer {color: #9c660b;} +======= +.blob {color: #ff950d; font-weight: bold; font-style: italic;} +>>>>>>> 89adcb0... Blob Genesis (#7781) BIG IMG.icon {width: 32px; height: 32px;}