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