diff --git a/code/__DEFINES/blob.dm b/code/__DEFINES/blob.dm index cbdd01ac82c..b9e70680e5f 100644 --- a/code/__DEFINES/blob.dm +++ b/code/__DEFINES/blob.dm @@ -76,8 +76,8 @@ GLOBAL_LIST_EMPTY(blob_nodes) #define BLOB_FIRE_RESIST 1 // Burn damage taken gets multiplied by this value #define BLOB_EXPAND_CHANCE_MULTIPLIER 1 // Increase this value to make blobs naturally expand faster #define BLOB_REINFORCE_CHANCE 2.5 // The seconds_per_tick chance for cores/nodes to reinforce their surroundings -#define BLOB_REAGENTATK_VOL 25 // Amount of strain-reagents that get injected when the blob attacks: main source of blob damage -#define BLOB_REAGENSPORE_VOL 10 +#define BLOB_REAGENT_ATK_VOL 25 // Amount of strain-reagents that get injected when the blob attacks: main source of blob damage +#define BLOB_REAGENT_SPORE_VOL 10 #define BLOB_BONUS_POINTS 60 #define BLOB_REAGENTS_METABOLISM 1 @@ -182,7 +182,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) #define BLOBMOB_BLOBBERNAUT_DMG_SOLO_UPPER 20 #define BLOBMOB_BLOBBERNAUT_DMG_LOWER 4 // Damage dealt with active overmind (most damage comes from strain chems) #define BLOBMOB_BLOBBERNAUT_DMG_UPPER 4 -#define BLOBMOB_BLOBBERNAUT_REAGENTATK_VOL 20 // Amounts of strain reagents applied on attack -- basically the main damage stat +#define BLOBMOB_BLOBBERNAUT_REAGENT_ATK_VOL 20 // Amounts of strain reagents applied on attack -- basically the main damage stat #define BLOBMOB_BLOBBERNAUT_DMG_OBJ 60 // Damage dealth to objects/machines #define BLOBMOB_BLOBBERNAUT_HEALING_CORE 0.05 // Percentage multiplier HP restored on Life() when within 2 tiles of the blob core #define BLOBMOB_BLOBBERNAUT_HEALING_NODE 0.025 // Same, but for a nearby node diff --git a/code/datums/components/blob_minion.dm b/code/datums/components/blob_minion.dm index adc1085aa57..a5ad2d247e7 100644 --- a/code/datums/components/blob_minion.dm +++ b/code/datums/components/blob_minion.dm @@ -7,18 +7,15 @@ var/mob/camera/blob/overmind /// Callback to run if overmind strain changes var/datum/callback/on_strain_changed - var/datum/action/innate/blob/minion_talk/mob_talk /datum/component/blob_minion/Initialize(mob/camera/blob/overmind, datum/callback/on_strain_changed) . = ..() if(!isminion(parent)) return COMPONENT_INCOMPATIBLE src.on_strain_changed = on_strain_changed - mob_talk = new() register_overlord(overmind) /datum/component/blob_minion/Destroy(force) - qdel(mob_talk) . = ..() /datum/component/blob_minion/InheritComponent(datum/component/new_comp, i_am_original, mob/camera/blob/overmind, datum/callback/on_strain_changed) @@ -64,7 +61,6 @@ RegisterSignal(parent, COMSIG_MOB_TRY_SPEECH, PROC_REF(on_try_speech)) RegisterSignal(parent, COMSIG_MOB_CHANGED_TYPE, PROC_REF(on_transformed)) living_parent.update_appearance(UPDATE_ICON) - mob_talk.Grant(living_parent) GLOB.blob_telepathy_mobs |= parent /datum/component/blob_minion/UnregisterFromParent() @@ -85,7 +81,6 @@ COMSIG_MOB_MIND_INITIALIZED, COMSIG_MOVABLE_SPACEMOVE, )) - mob_talk.Remove(living_parent) GLOB.blob_telepathy_mobs -= parent /// Become blobpilled when we gain a mind diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index f674ccd52c7..83b8f3e819d 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -76,7 +76,7 @@ text += "
[blob.key] был [blob.name]" if(minions?.len) - text += "

Миньен[(minions.len > 1 ? "ами были" : "ом был")]:" + text += "

Миньoн[(minions.len > 1 ? "ами были" : "ом был")]:" for(var/datum/mind/blob in minions) text += "
[blob.key] был [blob.name]" diff --git a/code/modules/antagonists/blob/blob_minion.dm b/code/modules/antagonists/blob/blob_minion.dm index 9f496c87ef6..0fbbc574d51 100644 --- a/code/modules/antagonists/blob/blob_minion.dm +++ b/code/modules/antagonists/blob/blob_minion.dm @@ -9,6 +9,8 @@ show_in_orbit = FALSE /// The blob core that this minion is attached to var/datum/weakref/overmind + /// Action to talk with nearby mobs + var/datum/action/innate/blob/minion_talk/mob_talk /datum/antagonist/blob_minion/can_be_owned(datum/mind/new_owner) . = ..() && isminion(new_owner?.current) @@ -28,6 +30,23 @@ mode.blobs["minions"] -= owner +/datum/antagonist/blob_minion/apply_innate_effects(mob/living/mob_override) + var/mob/living/user = ..(mob_override) + if(!user) + return + if(!mob_talk) + mob_talk = new + mob_talk.Grant(user) + return user + + +/datum/antagonist/blob_minion/remove_innate_effects(mob/living/mob_override) + var/mob/living/user = ..(mob_override) + if(!user) + return + mob_talk?.Remove(user) + return user + /datum/antagonist/blob_minion/roundend_report_header() return diff --git a/code/modules/antagonists/blob/blob_minions/blob_spore.dm b/code/modules/antagonists/blob/blob_minions/blob_spore.dm index 5a41e7307a9..183f609ad90 100644 --- a/code/modules/antagonists/blob/blob_minions/blob_spore.dm +++ b/code/modules/antagonists/blob/blob_minions/blob_spore.dm @@ -47,7 +47,7 @@ /// Create an explosion of spores on death /mob/living/simple_animal/hostile/blob_minion/spore/proc/death_burst() - do_blob_chem_smoke(range = death_cloud_size, reagent_volume = BLOB_REAGENSPORE_VOL, holder = src, location = get_turf(src), reagent_type = /datum/reagent/toxin/spore) + do_blob_chem_smoke(range = death_cloud_size, reagent_volume = BLOB_REAGENT_SPORE_VOL, holder = src, location = get_turf(src), reagent_type = /datum/reagent/toxin/spore) /mob/living/simple_animal/hostile/blob_minion/spore/CanAllowThrough(atom/movable/mover, border_dir) . = ..() diff --git a/code/modules/antagonists/blob/blob_minions/blob_zombie.dm b/code/modules/antagonists/blob/blob_minions/blob_zombie.dm index f1303f1a95b..e1373040feb 100644 --- a/code/modules/antagonists/blob/blob_minions/blob_zombie.dm +++ b/code/modules/antagonists/blob/blob_minions/blob_zombie.dm @@ -72,7 +72,7 @@ /// Create an explosion of spores on death /mob/living/simple_animal/hostile/blob_minion/zombie/proc/death_burst() - do_blob_chem_smoke(range = 1, holder = src, reagent_volume = BLOB_REAGENSPORE_VOL, location = get_turf(src), reagent_type = /datum/reagent/toxin/spore) + do_blob_chem_smoke(range = 1, holder = src, reagent_volume = BLOB_REAGENT_SPORE_VOL, location = get_turf(src), reagent_type = /datum/reagent/toxin/spore) /// Store a body so that we can drop it on death /mob/living/simple_animal/hostile/blob_minion/zombie/proc/consume_corpse(mob/living/carbon/human/new_corpse) @@ -84,9 +84,7 @@ new_corpse.change_hair("Bald") new_corpse.forceMove(src) corpse = new_corpse - update_appearance(UPDATE_ICON) - overlays += new_corpse.overlays - set_up_zombie_appearance() + update_icon(UPDATE_OVERLAYS) RegisterSignal(corpse, COMSIG_LIVING_REVIVE, PROC_REF(on_corpse_revived)) /// Dynamic changeling reentry diff --git a/code/modules/antagonists/blob/blobstrains/_blobstrain.dm b/code/modules/antagonists/blob/blobstrains/_blobstrain.dm index 6dd8e2ebfc8..f484cb31495 100644 --- a/code/modules/antagonists/blob/blobstrains/_blobstrain.dm +++ b/code/modules/antagonists/blob/blobstrains/_blobstrain.dm @@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ for(var/mob/living/blob_mob as anything in overmind.blob_mobs) blob_mob.maxHealth *= max_mob_health_multiplier blob_mob.health *= max_mob_health_multiplier - blob_mob.update_icons() // If it's getting a new strain, tell it what it does! + blob_mob.update_icon() // If it's getting a new strain, tell it what it does! var/list/messages = list() messages += "Штамм вашего надразума: [name]!" messages += "Штамм [name] [shortdesc ? "[shortdesc]" : "[description]"]" diff --git a/code/modules/antagonists/blob/blobstrains/_reagent.dm b/code/modules/antagonists/blob/blobstrains/_reagent.dm index 3cf4101b3dd..666b0f38f94 100644 --- a/code/modules/antagonists/blob/blobstrains/_reagent.dm +++ b/code/modules/antagonists/blob/blobstrains/_reagent.dm @@ -8,8 +8,8 @@ /datum/blobstrain/reagent/attack_living(mob/living/L) var/mob_protection = L.getarmor(null, BIO) * 0.01 - reagent.reaction_mob(L, REAGENT_TOUCH, BLOB_REAGENTATK_VOL, TRUE, mob_protection, overmind) - send_message(L) + reagent.reaction_mob(L, REAGENT_TOUCH, BLOB_REAGENT_ATK_VOL, TRUE, mob_protection, overmind) + send_message(L) /datum/blobstrain/reagent/blobbernaut_attack(atom/attacking, mob/living/simple_animal/hostile/blobbernaut) if(!isliving(attacking)) @@ -17,11 +17,11 @@ var/mob/living/living_attacking = attacking var/mob_protection = living_attacking.getarmor(null, BIO) * 0.01 - reagent.reaction_mob(living_attacking, REAGENT_TOUCH, BLOBMOB_BLOBBERNAUT_REAGENTATK_VOL + blobbernaut_reagentatk_bonus, FALSE, mob_protection, overmind)//this will do between 10 and 20 damage(reduced by mob protection), depending on chemical, plus 4 from base brute damage. + reagent.reaction_mob(living_attacking, REAGENT_TOUCH, BLOBMOB_BLOBBERNAUT_REAGENT_ATK_VOL + blobbernaut_reagentatk_bonus, FALSE, mob_protection, overmind)//this will do between 10 and 20 damage(reduced by mob protection), depending on chemical, plus 4 from base brute damage. /datum/blobstrain/reagent/on_sporedeath(mob/living/simple_animal/hostile/blob_minion/spore/spore) var/burst_range = (istype(spore)) ? spore.death_cloud_size : 1 - do_blob_chem_smoke(range = burst_range, holder = spore, reagent_volume = BLOB_REAGENSPORE_VOL, location = get_turf(spore), reagent_type = reagent.type) + do_blob_chem_smoke(range = burst_range, holder = spore, reagent_volume = BLOB_REAGENT_SPORE_VOL, location = get_turf(spore), reagent_type = reagent.type) /proc/do_blob_chem_smoke(range = 0, amount = DIAMOND_AREA(range), atom/holder = null, location = null, reagent_type = /datum/reagent/water, reagent_volume = 10, log = FALSE) diff --git a/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm b/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm index 4d75bcac826..c0a80fa033f 100644 --- a/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm +++ b/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm @@ -24,7 +24,7 @@ for(var/mob/living/actor in orange(get_turf(spore), 1)) if(ROLE_BLOB in actor.faction) // No friendly fire continue - actor.take_overall_damage(10, 10) + actor.take_overall_damage(BLOB_REAGENT_SPORE_VOL, BLOB_REAGENT_SPORE_VOL) /datum/reagent/blob/explosive_lattice name = "Взрывная решетка" @@ -45,14 +45,14 @@ ex_effect.alpha = 150 // Total damage to epicenter mob of 0.7*reac_volume, like a mid-tier strain - brute_loss = reac_volume*0.35 + brute_loss = reac_volume*0.4 bomb_armor = exposed_mob.getarmor(null, BOMB) if(bomb_armor) // Same calculation and proc that ex_act uses on mobs brute_loss = brute_loss*(2 - round(bomb_armor*0.01, 0.05)) burn_loss = brute_loss - + exposed_mob.take_overall_damage(brute_loss, burn_loss) for(var/mob/living/nearby_mob in orange(epicenter_turf, 1)) @@ -61,7 +61,7 @@ if(nearby_mob == exposed_mob) // We've already hit the epicenter mob continue // AoE damage of 0.5*reac_volume to everyone in a 1 tile range - brute_loss = reac_volume*0.25 + brute_loss = reac_volume * 0.25 burn_loss = brute_loss bomb_armor = nearby_mob.getarmor(null, BOMB) @@ -70,6 +70,6 @@ burn_loss = brute_loss nearby_mob.take_overall_damage(brute_loss, burn_loss) - + else exposed_mob.apply_damage(0.6*reac_volume, BRUTE, forced = TRUE) diff --git a/code/modules/antagonists/blob/blobstrains/radioactive_gel.dm b/code/modules/antagonists/blob/blobstrains/radioactive_gel.dm index 8a10420836a..88d3da953ac 100644 --- a/code/modules/antagonists/blob/blobstrains/radioactive_gel.dm +++ b/code/modules/antagonists/blob/blobstrains/radioactive_gel.dm @@ -14,7 +14,7 @@ /datum/blobstrain/reagent/radioactive_gel/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if((damage_flag == ENERGY || damage_flag == LASER) && prob(damage)) + if((damage_flag == ENERGY || damage_flag == LASER) && prob(40)) for(var/mob/living/l in range(5, B)) l.apply_effect(damage, IRRADIATE) return ..() @@ -31,4 +31,4 @@ exposed_mob.apply_damage(0.3 * reac_volume, TOX) exposed_mob.apply_damage(0.2 * reac_volume, BRUTE) // lets not have IPC / plasmaman only take 7.5 damage from this if(exposed_mob.reagents) - exposed_mob.reagents.add_reagent("uranium", 0.3 * reac_volume) + exposed_mob.reagents.add_reagent("uranium", 0.35 * reac_volume) diff --git a/code/modules/antagonists/blob/blobstrains/replicating_foam.dm b/code/modules/antagonists/blob/blobstrains/replicating_foam.dm index 3fe529635a9..f7a64a9f456 100644 --- a/code/modules/antagonists/blob/blobstrains/replicating_foam.dm +++ b/code/modules/antagonists/blob/blobstrains/replicating_foam.dm @@ -13,11 +13,11 @@ /datum/blobstrain/reagent/replicating_foam/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) if(damage_type == BRUTE) damage = damage * 2 - else if(damage_type == BURN && damage > 0 && B.get_integrity() - damage > 0 && prob(45)) + else if(damage_type == BURN && damage > 0 && B.get_integrity() - damage > 0 && prob(50)) var/obj/structure/blob/newB = B.expand(null, null, 0) if(newB) newB.update_integrity(B.get_integrity() - damage) - newB.update_appearance() + newB.update_blob() return ..() diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index 2568444e4c6..a9404425e50 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -174,7 +174,7 @@ T = null if(!T) return - + if(!is_location_within_transition_boundaries(T)) return var/make_blob = TRUE //can we make a blob? @@ -246,7 +246,7 @@ /obj/structure/blob/emp_act(severity) . = ..() // tgstation emp protection - //if(. & EMP_PROTECT_SELF) + //if(. & EMP_PROTECT_SELF) //return if(severity > 0) if(overmind) diff --git a/code/modules/antagonists/blob/structures/factory.dm b/code/modules/antagonists/blob/structures/factory.dm index 6c42e4c770b..478811aae90 100644 --- a/code/modules/antagonists/blob/structures/factory.dm +++ b/code/modules/antagonists/blob/structures/factory.dm @@ -91,7 +91,7 @@ blobbernaut = new_naut blobbernaut.link_to_factory(src) RegisterSignal(new_naut, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(on_blobbernaut_death)) - update_appearance(UPDATE_ICON) + update_blob() /// When our brave soldier dies, reset our max integrity /obj/structure/blob/special/factory/proc/on_blobbernaut_death(mob/living/death_naut) @@ -100,4 +100,4 @@ return blobbernaut = null max_integrity = initial(max_integrity) - update_appearance(UPDATE_ICON) + update_blob()