diff --git a/code/game/objects/items/grenades/clusterbuster.dm b/code/game/objects/items/grenades/clusterbuster.dm
index 167c3114ec..7064bf6015 100644
--- a/code/game/objects/items/grenades/clusterbuster.dm
+++ b/code/game/objects/items/grenades/clusterbuster.dm
@@ -6,28 +6,31 @@
name = "clusterbang"
icon = 'icons/obj/grenade.dmi'
icon_state = "clusterbang"
+ var/base_state = "clusterbang"
var/payload = /obj/item/grenade/flashbang/cluster
+ var/payload_spawner = /obj/effect/payload_spawner
+ var/prime_sound = 'sound/weapons/armbomb.ogg'
+ var/min_spawned = 4
+ var/max_spawned = 8
+ var/segment_chance = 35
/obj/item/grenade/clusterbuster/prime()
update_mob()
- var/numspawned = rand(4,8)
+ var/numspawned = rand(min_spawned,max_spawned)
var/again = 0
for(var/more = numspawned,more > 0,more--)
- if(prob(35))
+ if(prob(segment_chance))
again++
numspawned--
- for(var/loop = again ,loop > 0, loop--)
- new /obj/item/grenade/clusterbuster/segment(loc, payload)//Creates 'segments' that launches a few more payloads
-
- new /obj/effect/payload_spawner(loc, payload, numspawned)//Launches payload
-
- playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
+ for(var/loop in 1 to again)
+ new /obj/item/grenade/clusterbuster/segment(drop_location(), src)//Creates 'segments' that launches a few more payloads
+ new payload_spawner(drop_location(), payload, numspawned)//Launches payload
+ playsound(src, prime_sound, 75, 1, -3)
qdel(src)
-
//////////////////////
//Clusterbang segment
//////////////////////
@@ -36,38 +39,64 @@
name = "clusterbang segment"
icon = 'icons/obj/grenade.dmi'
icon_state = "clusterbang_segment"
+ base_state = "clusterbang_segment"
-/obj/item/grenade/clusterbuster/segment/New(var/loc, var/payload_type = /obj/item/grenade/flashbang/cluster)
- ..()
- icon_state = "clusterbang_segment_active"
- payload = payload_type
- active = 1
+/obj/item/grenade/clusterbuster/segment/Initialize(mapload, obj/item/grenade/clusterbuster/base)
+ . = ..()
+ if(base)
+ name = "[base.name] segment"
+ base_state = "[base.base_state]_segment"
+ icon_state = base_state
+ payload_spawner = base.payload_spawner
+ payload = base.payload
+ prime_sound = base.prime_sound
+ min_spawned = base.min_spawned
+ max_spawned = base.max_spawned
+ icon_state = "[base_state]_active"
+ active = TRUE
walk_away(src,loc,rand(1,4))
addtimer(CALLBACK(src, .proc/prime), rand(15,60))
/obj/item/grenade/clusterbuster/segment/prime()
-
- new /obj/effect/payload_spawner(loc, payload, rand(4,8))
-
- playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
-
+ new payload_spawner(drop_location(), payload, rand(min_spawned,max_spawned))
+ playsound(src, prime_sound, 75, 1, -3)
qdel(src)
//////////////////////////////////
//The payload spawner effect
/////////////////////////////////
-/obj/effect/payload_spawner/New(var/turf/newloc,var/type, var/numspawned as num)
+/obj/effect/payload_spawner/Initialize(mapload, type, numspawned)
+ ..()
+ spawn_payload(type, numspawned)
+ return INITIALIZE_HINT_QDEL
- for(var/loop = numspawned ,loop > 0, loop--)
+/obj/effect/payload_spawner/proc/spawn_payload(type, numspawned)
+ for(var/loop in 1 to numspawned)
var/obj/item/grenade/P = new type(loc)
- P.active = 1
+ if(istype(P))
+ P.active = TRUE
+ addtimer(CALLBACK(P, /obj/item/grenade/proc/prime), rand(15,60))
walk_away(P,loc,rand(1,4))
- spawn(rand(15,60))
- if(P && !QDELETED(P))
- P.prime()
- qdel(src)
+/obj/effect/payload_spawner/random_slime
+ var/volatile = FALSE
+/obj/effect/payload_spawner/random_slime/volatile
+ volatile = TRUE
+
+/obj/item/slime_extract/proc/activate_slime()
+ var/list/slime_chems = list("plasma","water","blood")
+ for(var/i in 1 to slime_chems.len)
+ if(!QDELETED(src))
+ reagents.add_reagent(pick_n_take(slime_chems),5) //Add them in random order so we get all effects
+
+/obj/effect/payload_spawner/random_slime/spawn_payload(type, numspawned)
+ for(var/loop = numspawned ,loop > 0, loop--)
+ var/chosen = pick(subtypesof(/obj/item/slime_extract))
+ var/obj/item/slime_extract/P = new chosen(loc)
+ if(volatile)
+ addtimer(CALLBACK(P, /obj/item/slime_extract/proc/activate_slime), rand(15,60))
+ walk_away(P,loc,rand(1,4))
//////////////////////////////////
//Custom payload clusterbusters
@@ -127,7 +156,6 @@
name = "WELCOME TO HELL"
payload = /obj/item/grenade/chem_grenade/clf3
-
//random clusterbuster spawner
/obj/item/grenade/clusterbuster/random
icon_state = "random_clusterbang"
@@ -136,3 +164,14 @@
var/real_type = pick(subtypesof(/obj/item/grenade/clusterbuster))
new real_type(loc)
qdel(src)
+
+//rainbow slime effect
+/obj/item/grenade/clusterbuster/slime
+ name = "Blorble Blorble"
+ icon_state = "slimebang"
+ base_state = "slimebang"
+ payload_spawner = /obj/effect/payload_spawner/random_slime
+ prime_sound = 'sound/effects/bubbles.ogg'
+
+/obj/item/grenade/clusterbuster/slime/volatile
+ payload_spawner = /obj/effect/payload_spawner/random_slime/volatile
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index 52d12e8eb1..bf698300e8 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -609,9 +609,33 @@
required_other = 1
required_container = /obj/item/slime_extract/rainbow
-/datum/chemical_reaction/slime/slimeRNG/on_reaction(datum/reagents/holder)
- var/mob/living/simple_animal/slime/random/S = new (get_turf(holder.my_atom))
- S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!")
+/datum/chemical_reaction/slime/slimeRNG/on_reaction(datum/reagents/holder, created_volume)
+ if(created_volume >= 5)
+ var/obj/item/grenade/clusterbuster/slime/S = new (holder.my_atom.loc)
+ S.visible_message("Infused with plasma, the core begins to expand uncontrollably!")
+ S.icon_state = "[S.base_state]_active"
+ S.active = TRUE
+ addtimer(CALLBACK(S, /obj/item/grenade.proc/prime), rand(15,60))
+ qdel(holder.my_atom) //deleto
+ else
+ var/mob/living/simple_animal/slime/random/S = new (holder.my_atom.loc)
+ S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!")
+ ..()
+
+/datum/chemical_reaction/slime/slimebomb
+ name = "Clusterblorble"
+ id = "slimebomb"
+ required_reagents = list("slimejelly" = 1)
+ required_other = 1
+ required_container = /obj/item/slime_extract/rainbow
+
+/datum/chemical_reaction/slime/slimebomb/on_reaction(datum/reagents/holder, created_volume)
+ var/obj/item/grenade/clusterbuster/slime/volatile/S = new (holder.my_atom.loc)
+ S.visible_message("Infused with slime jelly, the core begins to expand uncontrollably!")
+ S.icon_state = "[S.base_state]_active"
+ S.active = TRUE
+ addtimer(CALLBACK(S, /obj/item/grenade.proc/prime), rand(15,60))
+ qdel(holder.my_atom) //deleto
..()
/datum/chemical_reaction/slime/slime_transfer
diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi
index 7f4d65e081..9be47e5ef2 100644
Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ