Blob Chunks 2 (#9143)

* Restore blob chunks to the world.

Blobs have chunks they spawn on death, carrying an artifact effect related to the blob type. The chunk carries a copy of the parent blob's type datum, to prevent modification of a blob causing issues with the chunk, and vice versa, if both somehow exist at the same time.

* Organization, origin tech.

* Convert to List Based system, drop transferring type datums directly as discussed in DMs

* Added Volatile Alluvium chunk effect.

Nanite swarm chunks exist, but don't do anything special for now.

Blob Chunks can sniff a mob to take their faction.

* Copy requires static

* Chunk and effect code cleanliness
lifemerger now utilizes a timer&callback instead of spawn()
This commit is contained in:
Mechoid
2023-12-27 21:40:25 -08:00
committed by GitHub
parent b54652baf6
commit 14c681720d
30 changed files with 616 additions and 19 deletions

View File

@@ -8,6 +8,3 @@
#define BLOB_DIFFICULTY_MEDIUM 1
#define BLOB_DIFFICULTY_HARD 2
#define BLOB_DIFFICULTY_SUPERHARD 3
#define BLOB_CHUNK_CONSTANT 0
#define BLOB_CHUNK_TOGGLE 1

View File

@@ -113,6 +113,7 @@ var/global/list/blob_cores = list()
blob_cores -= src
if(overmind)
overmind.blob_core = null
overmind.blob_type.make_chunk(get_turf(src))
qdel(overmind)
overmind = null
STOP_PROCESSING(SSobj, src)

View File

@@ -0,0 +1,117 @@
// Blob Type Modification to allow for chunks. //
/datum/blob_type
var/list/core_tech = list(TECH_BIO = 4, TECH_MATERIAL = 3) // Tech for the item created when a core is destroyed.
var/chunk_type = /obj/item/blob_chunk
var/chunk_effect_cooldown = 10
var/chunk_effect_range = 1 // Tile range of the effect.
var/generation = 0 // How many times has this blob been chunked
/datum/blob_type/proc/make_chunk(var/turf/T)
if(!T)
return
if(ispath(chunk_type, /obj/item/blob_chunk))
return new chunk_type(T, listify_vars())
return new chunk_type(T)
// Base chunk. //
/obj/item/blob_chunk
name = "chunk"
desc = "A piece of a blob's core."
description_info = "Blob core chunks can be 'revived' with the help of Xenobio. \
40 units of Blood, 40 units of Phoron, and 10 units of Slime Jelly will cause the chunk \
to produce a new core on the turf it is on. The chunk remains, but unable to produce another. \
You can change the faction of the blob created pre-emptively by using the chunk on a mob, imprinting \
its faction upon the chunk."
icon = 'icons/mob/blob.dmi'
icon_state = "blobcore"
unacidable = TRUE
var/can_revive = TRUE
var/list/blob_type_vars
var/datum/blob_type/default_blob = /datum/blob_type/classic
var/blob_effect_master_type = /datum/component/artifact_master/blob
/obj/item/blob_chunk/Initialize(var/newloc, var/list/transfer_vars)
. = ..()
create_reagents(120)
if(!transfer_vars)
default_blob = new default_blob()
transfer_vars = default_blob.listify_vars()
blob_type_vars = transfer_vars
color = transfer_vars["color"]
name = "[blob_type_vars["name"]] [initial(name)]"
AddComponent(blob_effect_master_type)
/obj/item/blob_chunk/is_open_container()
return TRUE
/obj/item/blob_chunk/afterattack(var/atom/target, var/mob/user, var/proximity)
if(proximity && Adjacent(target))
user.visible_message(SPAN_WARNING("[user] holds \the [src] toward [target]."))
if(isliving(target) && do_after(user, 3 SECONDS, target))
var/mob/living/L = target
user.visible_message(SPAN_WARNING("[bicon(src)] \the [src] inflates slighty, before it releases a puff of gas toward [L]."))
to_chat(user, SPAN_NOTICE("[bicon(src)] [src] has registered \the [L.faction] pheromone as its own, forgetting \the [blob_type_vars["faction"]] pheromone."))
blob_type_vars["faction"] = L.faction
return
/obj/item/blob_chunk/proc/reviveBlob(var/ask_player = FALSE)
var/turf/T = get_turf(src)
var/obj/structure/blob/core/C = new(T, null, 2, 0)
C.desired_blob_type = blob_type_vars["blob_type"]
C.create_overmind()
var/datum/blob_type/to_modify = C.overmind.blob_type
to_modify.apply_vars(blob_type_vars)
C.update_icon()
if(!can_revive)
name = "weakened [name]"
desc += " It can no longer reproduce."
if(C?.overmind)
return TRUE
return
// Artifact master solely for blobs. //
/datum/component/artifact_master/blob
make_effects = list(
/datum/artifact_effect/uncommon/fortify
)
/datum/component/artifact_master/blob/do_setup()
..()
if(istype(holder, /obj/item/blob_chunk))
var/obj/item/blob_chunk/type_source = holder
for(var/datum/artifact_effect/AE in my_effects)
AE.trigger = TRIGGER_TOUCH
AE.effect = EFFECT_PULSE
AE.effectrange = type_source.blob_type_vars["chunk_effect_range"]
AE.chargelevelmax = type_source.blob_type_vars["chunk_effect_cooldown"]

View File

@@ -47,10 +47,6 @@
var/node_type = /obj/structure/blob/node
var/shield_type = /obj/structure/blob/shield
var/list/core_tech = list(TECH_BIO = 4, TECH_MATERIAL = 3) // Tech for the item created when a core is destroyed.
var/chunk_active_type = BLOB_CHUNK_TOGGLE
var/chunk_active_ability_cooldown = 20 SECONDS
var/chunk_passive_ability_cooldown = 5 SECONDS
// Called when a blob receives damage. This needs to return the final damage or blobs will be immortal.
/datum/blob_type/proc/on_received_damage(var/obj/structure/blob/B, damage, damage_type)
@@ -95,3 +91,112 @@
// Spore handle_special call.
/datum/blob_type/proc/on_spore_lifetick(mob/living/simple_mob/blob/spore/S)
return
/datum/blob_type/proc/listify_vars()
var/list/transfer_vars = list()
transfer_vars["blob_type"] = type
transfer_vars["name"] = name
transfer_vars["desc"] = desc
transfer_vars["effect_desc"] = effect_desc
transfer_vars["ai_desc"] = ai_desc
transfer_vars["color"] = color
transfer_vars["complementary_color"] = complementary_color
transfer_vars["faction"] = faction
transfer_vars["attack_message"] = attack_message
transfer_vars["attack_message_living"] = attack_message_living
transfer_vars["attack_message_synth"] = attack_message_synth
transfer_vars["attack_verb"] = attack_verb
transfer_vars["damage_type"] = damage_type
transfer_vars["armor_check"] = armor_check
transfer_vars["armor_pen"] = armor_pen
transfer_vars["damage_lower"] = damage_lower
transfer_vars["damage_upper"] = damage_upper
transfer_vars["brute_multiplier"] = brute_multiplier
transfer_vars["burn_multiplier"] = burn_multiplier
transfer_vars["spread_modifier"] = spread_modifier
transfer_vars["slow_spread_with_size"] = slow_spread_with_size
transfer_vars["ai_aggressiveness"] = ai_aggressiveness
transfer_vars["can_build_factories"] = can_build_factories
transfer_vars["can_build_resources"] = can_build_resources
transfer_vars["can_build_nodes"] = can_build_nodes
transfer_vars["spore_type"] = spore_type
transfer_vars["ranged_spores"] = ranged_spores
transfer_vars["spore_firesound"] = spore_firesound
transfer_vars["spore_range"] = spore_range
transfer_vars["spore_projectile"] = spore_projectile
transfer_vars["spore_accuracy"] = spore_accuracy
transfer_vars["spore_dispersion"] = spore_dispersion
transfer_vars["factory_type"] = factory_type
transfer_vars["resource_type"] = resource_type
transfer_vars["node_type"] = node_type
transfer_vars["shield_type"] = shield_type
transfer_vars["core_tech"] = core_tech.Copy()
transfer_vars["chunk_type"] = chunk_type
transfer_vars["chunk_effect_cooldown"] = chunk_effect_cooldown
transfer_vars["chunk_effect_range"] = chunk_effect_range
transfer_vars["generation"] = generation
return transfer_vars
/datum/blob_type/proc/apply_vars(var/list/incoming_vars)
if(LAZYLEN(incoming_vars))
name = incoming_vars["name"]
desc = incoming_vars["desc"]
effect_desc = incoming_vars["effect_desc"]
ai_desc = incoming_vars["ai_desc"]
color = incoming_vars["color"]
complementary_color = incoming_vars["complementary_color"]
faction = incoming_vars["faction"]
attack_message = incoming_vars["attack_message"]
attack_message_living = incoming_vars["attack_message_living"]
attack_message_synth = incoming_vars["attack_message_synth"]
attack_verb = incoming_vars["attack_verb"]
damage_type = incoming_vars["damage_type"]
armor_check = incoming_vars["armor_check"]
armor_pen = incoming_vars["armor_pen"]
damage_lower = incoming_vars["damage_lower"]
damage_upper = incoming_vars["damage_upper"]
brute_multiplier = incoming_vars["brute_multiplier"]
burn_multiplier = incoming_vars["burn_multiplier"]
spread_modifier = incoming_vars["spread_modifier"]
slow_spread_with_size = incoming_vars["slow_spread_with_size"]
ai_aggressiveness = incoming_vars["ai_aggressiveness"]
can_build_factories = incoming_vars["can_build_factories"]
can_build_resources = incoming_vars["can_build_resources"]
can_build_nodes = incoming_vars["can_build_nodes"]
spore_type = incoming_vars["spore_type"]
ranged_spores = incoming_vars["ranged_spores"]
spore_firesound = incoming_vars["spore_firesound"]
spore_range = incoming_vars["spore_range"]
spore_projectile = incoming_vars["spore_projectile"]
spore_accuracy = incoming_vars["spore_accuracy"]
spore_dispersion = incoming_vars["spore_dispersion"]
factory_type = incoming_vars["factory_type"]
resource_type = incoming_vars["resource_type"]
node_type = incoming_vars["node_type"]
shield_type = incoming_vars["shield_type"]
var/list/new_core_tech = incoming_vars["core_tech"]
core_tech = islist(new_core_tech) ? new_core_tech : list()
chunk_type = incoming_vars["chunk_type"]
chunk_effect_cooldown = incoming_vars["chunk_effect_cooldown"]
chunk_effect_range = incoming_vars["chunk_effect_range"]
generation = incoming_vars["generation"] + 1

View File

@@ -13,3 +13,9 @@
brute_multiplier = 0.35
burn_multiplier = 0.8
chunk_type = /obj/item/blob_chunk/barnacle
/obj/item/blob_chunk/barnacle
default_blob = /datum/blob_type/barnacle
blob_effect_master_type = /datum/component/artifact_master/blob

View File

@@ -11,15 +11,26 @@
ai_aggressiveness = 50
damage_type = BURN
burn_multiplier = 0 // Fire immunity
chunk_active_ability_cooldown = 4 MINUTES
chunk_effect_cooldown = 4 MINUTES
attack_message = "The blazing oil splashes you with its burning oil"
attack_message_living = ", and you feel your skin char and melt"
attack_message_synth = ", and your external plating melts"
attack_verb = "splashes"
chunk_type = /obj/item/blob_chunk/blazing_oil
/obj/item/blob_chunk/blazing_oil
default_blob = /datum/blob_type/blazing_oil
blob_effect_master_type = /datum/component/artifact_master/blob/blazing_oil
/datum/blob_type/blazing_oil/on_attack(obj/structure/blob/B, mob/living/victim)
victim.fire_act() // Burn them.
/datum/blob_type/blazing_oil/on_water(obj/structure/blob/B, amount)
spawn(1)
B.adjust_integrity(-(amount * 5))
/datum/component/artifact_master/blob/blazing_oil
make_effects = list(
/datum/artifact_effect/common/heat
)

View File

@@ -10,3 +10,14 @@
can_build_nodes = FALSE
spread_modifier = 1.0
ai_aggressiveness = 0
chunk_type = /obj/item/blob_chunk/classic
/obj/item/blob_chunk/classic
default_blob = /datum/blob_type/classic
blob_effect_master_type = /datum/component/artifact_master/blob/classic
/datum/component/artifact_master/blob/classic
make_effects = list(
/datum/artifact_effect/common/sweating
)

View File

@@ -14,12 +14,18 @@
burn_multiplier = 1.2
spread_modifier = 0.5
ai_aggressiveness = 50
chunk_active_ability_cooldown = 4 MINUTES
chunk_effect_cooldown = 4 MINUTES
attack_message = "The goo stabs you"
attack_message_living = ", and you feel an intense chill from within"
attack_message_synth = ", and your system reports lower internal temperatures"
attack_verb = "stabs"
chunk_type = /obj/item/blob_chunk/cryogenic_goo
/obj/item/blob_chunk/cryogenic_goo
default_blob = /datum/blob_type/cryogenic_goo
blob_effect_master_type = /datum/component/artifact_master/blob/cryogenic_goo
/datum/blob_type/cryogenic_goo/on_attack(obj/structure/blob/B, mob/living/victim)
if(ishuman(victim))
var/mob/living/carbon/human/H = victim
@@ -35,3 +41,8 @@
H.bodytemperature = max(H.bodytemperature - temp_change, temp_cap)
else // Just do some extra burn for mobs who don't process bodytemp
victim.adjustFireLoss(20)
/datum/component/artifact_master/blob/cryogenic_goo
make_effects = list(
/datum/artifact_effect/common/cold
)

View File

@@ -25,6 +25,13 @@
var/list/active_beams = list()
chunk_effect_range = 6
chunk_type = /obj/item/blob_chunk/ectoplasmic_horror
/obj/item/blob_chunk/ectoplasmic_horror
default_blob = /datum/blob_type/ectoplasmic_horror
blob_effect_master_type = /datum/component/artifact_master/blob/ectoplasmic_horror
/datum/blob_type/ectoplasmic_horror/on_pulse(var/obj/structure/blob/B)
if(B.type == /obj/structure/blob && (locate(/obj/structure/blob/node) in oview(2, get_turf(B))))
B.visible_message("<span class='alien'>The [name] quakes, before hardening.</span>")
@@ -67,3 +74,8 @@
animate(B,alpha = 10, alpha = initial_alpha, time = 10)
return 0
return ..()
/datum/component/artifact_master/blob/ectoplasmic_horror
make_effects = list(
/datum/artifact_effect/rare/lifedrain
)

View File

@@ -13,14 +13,25 @@
brute_multiplier = 3
burn_multiplier = 2
ai_aggressiveness = 60
chunk_active_type = BLOB_CHUNK_CONSTANT
attack_message = "The web lashes you"
attack_message_living = ", and you hear a faint buzzing"
attack_message_synth = ", and your electronics get badly damaged"
attack_verb = "lashes"
chunk_effect_range = 3
chunk_type = /obj/item/blob_chunk/electromagnetic_web
/obj/item/blob_chunk/electromagnetic_web
default_blob = /datum/blob_type/electromagnetic_web
blob_effect_master_type = /datum/component/artifact_master/blob/electromagnetic_web
/datum/blob_type/electromagnetic_web/on_death(obj/structure/blob/B)
empulse(B.loc, 0, 1, 2)
/datum/blob_type/electromagnetic_web/on_attack(obj/structure/blob/B, mob/living/victim)
victim.emp_act(2)
/datum/component/artifact_master/blob/electromagnetic_web
make_effects = list(
/datum/artifact_effect/rare/emp
)

View File

@@ -20,6 +20,17 @@
attack_verb = "prods"
spore_projectile = /obj/item/projectile/beam/shock
chunk_type = /obj/item/blob_chunk/energized_jelly
/obj/item/blob_chunk/energized_jelly
default_blob = /datum/blob_type/energized_jelly
blob_effect_master_type = /datum/component/artifact_master/blob/energized_jelly
/datum/blob_type/energized_jelly/on_attack(obj/structure/blob/B, mob/living/victim, def_zone)
victim.electrocute_act(10, src, 1, def_zone)
victim.stun_effect_act(0, 40, BP_TORSO, src)
/datum/component/artifact_master/blob/energized_jelly
make_effects = list(
/datum/artifact_effect/uncommon/faraday
)

View File

@@ -22,6 +22,12 @@
attack_verb = "blasts"
var/exploding = FALSE
chunk_type = /obj/item/blob_chunk/explosive_lattice
/obj/item/blob_chunk/explosive_lattice
default_blob = /datum/blob_type/explosive_lattice
blob_effect_master_type = /datum/component/artifact_master/blob/explosive_lattice
/datum/blob_type/explosive_lattice/on_attack(obj/structure/blob/B, mob/living/victim, def_zone) // This doesn't use actual bombs since they're too strong and it would hurt the blob.
if(exploding) // We're busy, don't infinite loop us.
return
@@ -48,3 +54,8 @@
M << 'sound/effects/explosionfar.ogg'
exploding = FALSE
/datum/component/artifact_master/blob/explosive_lattice
make_effects = list(
/datum/artifact_effect/uncommon/blast_shielding
)

View File

@@ -22,6 +22,12 @@
ai_aggressiveness = 50 //Really doesn't like you near it.
spore_type = /mob/living/simple_mob/mechanical/hivebot/swarm
chunk_type = /obj/item/blob_chunk/fabrication_swarm
/obj/item/blob_chunk/fabrication_swarm
default_blob = /datum/blob_type/fabrication_swarm
blob_effect_master_type = /datum/component/artifact_master/blob
/datum/blob_type/fabrication_swarm/on_received_damage(var/obj/structure/blob/B, damage, damage_type, mob/living/attacker)
if(istype(B, /obj/structure/blob/normal))
if(damage > 0)

View File

@@ -17,7 +17,13 @@
ai_aggressiveness = 30 // The spores do most of the fighting.
can_build_factories = TRUE
spore_type = /mob/living/simple_mob/blob/spore/weak
chunk_active_ability_cooldown = 60 SECONDS
chunk_effect_cooldown = 60
chunk_type = /obj/item/blob_chunk/fulminant_organism
/obj/item/blob_chunk/fulminant_organism
default_blob = /datum/blob_type/fulminant_organism
blob_effect_master_type = /datum/component/artifact_master/blob/fulminant_organism
/datum/blob_type/fulminant_organism/on_expand(var/obj/structure/blob/B, var/obj/structure/blob/new_B, var/turf/T, var/mob/observer/blob/O)
if(prob(10)) // 10% chance to make a weak spore when expanding.
@@ -41,3 +47,8 @@
else
S.faction = faction
S.update_icons()
/datum/component/artifact_master/blob/fulminant_organism
make_effects = list(
/datum/artifact_effect/uncommon/berserk
)

View File

@@ -16,7 +16,12 @@
ai_aggressiveness = 40
can_build_factories = TRUE
spore_type = /mob/living/simple_mob/blob/spore/infesting
chunk_active_ability_cooldown = 2 MINUTES
chunk_type = /obj/item/blob_chunk/fungal_bloom
/obj/item/blob_chunk/fungal_bloom
default_blob = /datum/blob_type/fungal_bloom
blob_effect_master_type = /datum/component/artifact_master/blob/fungal_bloom
/datum/blob_type/fungal_bloom/on_spore_death(mob/living/simple_mob/blob/spore/S)
if(S.is_infesting)
@@ -28,3 +33,8 @@
else
B = new /obj/structure/blob/normal(T, S.overmind) // Otherwise spread it.
B.visible_message("<span class='danger'>\A [B] forms on \the [T] as \the [S] bursts!</span>")
/datum/component/artifact_master/blob/fungal_bloom
make_effects = list(
/datum/artifact_effect/extreme/resurrect
)

View File

@@ -16,5 +16,13 @@
attack_message_synth = ", and your external plating dissolves"
faction = "nanomachines"
core_tech = list(TECH_ENGINEERING = 10, TECH_MATERIAL = 10, TECH_ILLEGAL = 10)
chunk_type = /obj/item/blob_chunk/grey_goo
/obj/item/blob_chunk/grey_goo
default_blob = /datum/blob_type/grey_goo
blob_effect_master_type = /datum/component/artifact_master/blob
/datum/blob_type/grey_goo/on_emp(obj/structure/blob/B, severity)
B.adjust_integrity(-(20 / severity))

View File

@@ -20,6 +20,12 @@
attack_message_synth = ", and the fluid wears down on your components"
attack_verb = "splashes"
chunk_type = /obj/item/blob_chunk/pressurized_slime
/obj/item/blob_chunk/pressurized_slime
default_blob = /datum/blob_type/pressurized_slime
blob_effect_master_type = /datum/component/artifact_master/blob/pressurized_slime
/datum/blob_type/pressurized_slime/on_attack(obj/structure/blob/B, mob/living/victim, def_zone)
victim.water_act(5)
var/turf/simulated/T = get_turf(victim)
@@ -46,3 +52,8 @@
T.wet_floor()
for(var/atom/movable/AM in T)
AM.water_act(2)
/datum/component/artifact_master/blob/pressurized_slime
make_effects = list(
/datum/artifact_effect/common/extinguisher
)

View File

@@ -20,5 +20,16 @@
attack_message_synth = ", and your internal systems are bombarded by ionizing radiation"
attack_verb = "splashes"
chunk_type = /obj/item/blob_chunk/radioactive_ooze
/obj/item/blob_chunk/radioactive_ooze
default_blob = /datum/blob_type/radioactive_ooze
blob_effect_master_type = /datum/component/artifact_master/blob/radioactive_ooze
/datum/blob_type/radioactive_ooze/on_pulse(var/obj/structure/blob/B)
SSradiation.radiate(B, 200)
/datum/component/artifact_master/blob/radioactive_ooze
make_effects = list(
/datum/artifact_effect/rare/radiate
)

View File

@@ -21,6 +21,12 @@
attack_message_synth = ", and your body begins to corrode"
attack_verb = "splashes"
chunk_type = /obj/item/blob_chunk/ravenous_macrophage
/obj/item/blob_chunk/ravenous_macrophage
default_blob = /datum/blob_type/ravenous_macrophage
blob_effect_master_type = /datum/component/artifact_master/blob/ravenous_macrophage
/datum/blob_type/ravenous_macrophage/on_pulse(var/obj/structure/blob/B)
var/mob/living/L = locate() in range(world.view, B)
if(L && prob(1) && L.mind && !L.stat) // There's some active living thing nearby, produce offgas.
@@ -37,3 +43,8 @@
B.visible_message("<span class='danger'>The dying mass is rapidly consumed by the nearby [other]!</span>")
if(other.overmind)
other.overmind.add_points(rand(1,4))
/datum/component/artifact_master/blob/ravenous_macrophage
make_effects = list(
/datum/artifact_effect/common/noxious
)

View File

@@ -16,13 +16,20 @@
brute_multiplier = 2.0
spread_modifier = 0.35 // Ranged projectiles tend to have a higher material cost, so ease up on the spreading.
ai_aggressiveness = 40
chunk_passive_ability_cooldown = 0.5 SECONDS
chunk_effect_cooldown = 0.5 SECONDS
attack_message = "The blob stabs you"
attack_message_living = ", and you feel sharp spines pierce your flesh"
attack_message_synth = ", and your external plating is pierced by sharp spines"
attack_verb = "stabs"
spore_projectile = /obj/item/projectile/bullet/thorn
chunk_effect_range = 3
chunk_type = /obj/item/blob_chunk/reactive_spines
/obj/item/blob_chunk/reactive_spines
default_blob = /datum/blob_type/reactive_spines
blob_effect_master_type = /datum/component/artifact_master/blob/reactive_spines
// Even if the melee attack is enough to one-shot this blob, it gets to retaliate at least once.
/datum/blob_type/reactive_spines/on_received_damage(var/obj/structure/blob/B, damage, damage_type, mob/living/attacker)
if(damage > 0 && attacker && get_dist(B, attacker) <= 1)
@@ -30,3 +37,8 @@
B.blob_attack_animation(attacker, B.overmind)
attacker.blob_act(B)
return ..()
/datum/component/artifact_master/blob/reactive_spines
make_effects = list(
/datum/artifact_effect/extreme/spines
)

View File

@@ -22,3 +22,15 @@
attack_verb = "lashes"
spore_projectile = /obj/item/projectile/arc/spore
factory_type = /obj/structure/blob/factory/turret
chunk_effect_range = 2
chunk_type = /obj/item/blob_chunk/roiling_mold
/obj/item/blob_chunk/roiling_mold
default_blob = /datum/blob_type/roiling_mold
blob_effect_master_type = /datum/component/artifact_master/blob/roiling_mold
/datum/component/artifact_master/blob/roiling_mold
make_effects = list(
/datum/artifact_effect/extreme/spines/spore
)

View File

@@ -13,10 +13,16 @@
burn_multiplier = 0.5
spread_modifier = 0.5
ai_aggressiveness = 30
chunk_active_ability_cooldown = 3 MINUTES
chunk_effect_cooldown = 3 MINUTES
attack_message = "A fragment strikes you"
attack_verb = "strikes"
chunk_type = /obj/item/blob_chunk/shifting_fragments
/obj/item/blob_chunk/shifting_fragments
default_blob = /datum/blob_type/shifting_fragments
blob_effect_master_type = /datum/component/artifact_master/blob/shifting_fragments
/datum/blob_type/shifting_fragments/on_received_damage(var/obj/structure/blob/B, damage, damage_type)
if(damage > 0 && prob(60))
var/list/available_blobs = list()
@@ -34,3 +40,8 @@
if(istype(B, /obj/structure/blob/normal) || (istype(B, /obj/structure/blob/shield) && prob(25)))
new_B.forceMove(get_turf(B))
B.forceMove(T)
/datum/component/artifact_master/blob/shifting_fragments
make_effects = list(
/datum/artifact_effect/common/sprinting
)

View File

@@ -18,6 +18,13 @@
attack_verb = "synchronously strikes"
var/synchronously_attacking = FALSE
chunk_effect_range = 3
chunk_type = /obj/item/blob_chunk/synchronous_mesh
/obj/item/blob_chunk/synchronous_mesh
default_blob = /datum/blob_type/synchronous_mesh
blob_effect_master_type = /datum/component/artifact_master/blob/synchronous_mesh
/datum/blob_type/synchronous_mesh/on_attack(obj/structure/blob/B, mob/living/victim)
if(synchronously_attacking)
return
@@ -42,3 +49,8 @@
C.adjust_integrity(-(damage / blobs_to_hurt.len))
return damage / max(blobs_to_hurt.len, 1) // To hurt the blob that got hit.
/datum/component/artifact_master/blob/synchronous_mesh
make_effects = list(
/datum/artifact_effect/extreme/lifemerger
)

View File

@@ -26,7 +26,13 @@
spore_dispersion = 45
factory_type = /obj/structure/blob/factory/sluggish
resource_type = /obj/structure/blob/resource/sluggish
chunk_active_ability_cooldown = 2 MINUTES
chunk_effect_range = 3
chunk_type = /obj/item/blob_chunk/volatile_alluvium
/obj/item/blob_chunk/volatile_alluvium
default_blob = /datum/blob_type/volatile_alluvium
blob_effect_master_type = /datum/component/artifact_master/blob/volatile_alluvium
/datum/blob_type/volatile_alluvium/on_received_damage(var/obj/structure/blob/B, damage, damage_type, mob/living/attacker)
if(damage > 0 && attacker && get_dist(B, attacker) <= 2 && prob(min(damage, 70)) && istype(attacker, /mob/living/carbon/human)) // Melee weapons of any type carried by a human will have a high chance of being stolen.
@@ -49,3 +55,8 @@
B.adjust_integrity(-(damage))
if(B && prob(damage))
B.visible_message("<span class='danger'>The [name] begins to crumble!</span>")
/datum/component/artifact_master/blob/volatile_alluvium
make_effects = list(
/datum/artifact_effect/uncommon/disarmament
)