From 1648bcc47ed350b36cb04d2fac7a60955b79343b Mon Sep 17 00:00:00 2001 From: Nick <42454181+Momo8289@users.noreply.github.com> Date: Tue, 13 Jun 2023 23:29:00 -0400 Subject: [PATCH] Plasma flower MOD core from the lavaland patch of eden ruin (#75959) This PR gives a small update to the patch of eden lavaland ruin, and adds a new item that can be used as an upgrade to the plasma mod core. The idea around this item is that it's a flower that has absorbed all the plasma and bad-vibes in the small area around the ruin, leaving an area full of plants, and a flower full of energy. This flower can be taken from the oasis and turned into a functional MOD core using some wires. As a MOD core, it is the same as the plasma mod core, but has a higher energy capacity, being equivalent to a super power cell. It also gives you a cool pollen effect, and spawns butterflies around you while your suit is active. These butterflies disappear when they get too far away, or if the suit deactivates. They also don't leave corpses, so they shouldn't cause too much clutter. --- .../LavaRuins/lavaland_surface_gaia.dmm | 115 +++++++++++++----- .../signals_mob/signals_mob_spawner.dm | 3 + code/datums/components/spawner.dm | 2 + .../mob/living/basic/vermin/butterfly.dm | 49 ++++++++ code/modules/mod/mod_construction.dm | 29 +++++ code/modules/mod/mod_core.dm | 72 +++++++++++ .../obj/clothing/modsuit/mod_construction.dmi | Bin 4745 -> 5262 bytes tgstation.dme | 1 + 8 files changed, 238 insertions(+), 33 deletions(-) create mode 100644 code/__DEFINES/dcs/signals/signals_mob/signals_mob_spawner.dm diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm index b34c93c8210..697a9a34e72 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm @@ -39,6 +39,10 @@ /mob/living/basic/butterfly/lavaland, /turf/open/misc/grass/lavaland, /area/ruin/unpowered/gaia) +"k" = ( +/obj/item/food/grown/mushroom/amanita, +/turf/open/floor/bronze/filled/lavaland, +/area/ruin/unpowered/gaia) "l" = ( /obj/item/food/grown/mushroom/angel, /turf/open/misc/grass/lavaland, @@ -51,6 +55,10 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/misc/grass/lavaland, /area/ruin/unpowered/gaia) +"o" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/bronze/filled/lavaland, +/area/ruin/unpowered/gaia) "p" = ( /mob/living/basic/lightgeist{ light_color = "#42ECFF" @@ -82,6 +90,11 @@ "w" = ( /turf/closed/mineral/volcanic/lava_land_surface, /area/ruin/unpowered/gaia) +"x" = ( +/obj/structure/flora/bush/sunny/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/misc/grass/lavaland, +/area/ruin/unpowered/gaia) "A" = ( /obj/structure/flora/bush/stalky/style_random, /turf/open/misc/grass/lavaland, @@ -101,6 +114,42 @@ /obj/item/food/grown/mushroom/chanterelle, /turf/open/misc/grass/lavaland, /area/ruin/unpowered/gaia) +"E" = ( +/turf/open/floor/bronze/filled/lavaland, +/area/ruin/unpowered/gaia) +"I" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/floor/bronze/filled/lavaland, +/area/ruin/unpowered/gaia) +"J" = ( +/turf/closed/wall/mineral/bronze, +/area/ruin/unpowered/gaia) +"K" = ( +/obj/structure/flora/bush/stalky/style_random, +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/floor/bronze/filled/lavaland, +/area/ruin/unpowered/gaia) +"N" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/floor/bronze/filled/lavaland, +/area/ruin/unpowered/gaia) +"P" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/misc/grass/lavaland, +/area/ruin/unpowered/gaia) +"T" = ( +/obj/structure/flora/grass/jungle/a/style_random, +/turf/open/floor/bronze/filled/lavaland, +/area/ruin/unpowered/gaia) +"V" = ( +/obj/item/mod/construction/lavalandcore, +/turf/open/misc/grass/lavaland, +/area/ruin/unpowered/gaia) +"Z" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/turf/closed/wall/mineral/bronze, +/area/ruin/unpowered/gaia) (1,1,1) = {" a @@ -128,7 +177,7 @@ a w w c -b +N c b c @@ -165,7 +214,7 @@ c d c i -d +T C n c @@ -200,9 +249,9 @@ g d c c -c +E v -d +T c c h @@ -236,9 +285,9 @@ d c n c -b +N B -c +n d m d @@ -256,7 +305,7 @@ d c d h -c +o f j c @@ -267,19 +316,19 @@ w (10,1,1) = {" w c -c +I h b +I c +J +x +Z +T c -q -t +K b -d -c -A -b -c +I w "} (11,1,1) = {" @@ -287,14 +336,14 @@ w d e i -n +o d c -t -c -c +x +V +I n -c +I c q c @@ -302,20 +351,20 @@ w "} (12,1,1) = {" w -c +I b c p g -s -c -b -j +k +J +P +J h -d +T n c -b +N w "} (13,1,1) = {" @@ -328,7 +377,7 @@ d b c c -n +o c c b @@ -345,9 +394,9 @@ n c c b -c +I b -c +j h i C @@ -362,7 +411,7 @@ l j c n -c +I c g c @@ -382,7 +431,7 @@ c c g c -c +I c n c @@ -417,7 +466,7 @@ c b n c -c +I j g c diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_spawner.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_spawner.dm new file mode 100644 index 00000000000..a5f66788b86 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_spawner.dm @@ -0,0 +1,3 @@ +// signals for use by mob spawners +/// called when a spawner spawns a mob +#define COMSIG_SPAWNER_SPAWNED "spawner_spawned" diff --git a/code/datums/components/spawner.dm b/code/datums/components/spawner.dm index 48630cdc7ab..5753b05896f 100644 --- a/code/datums/components/spawner.dm +++ b/code/datums/components/spawner.dm @@ -55,9 +55,11 @@ created_mob.faction = src.faction RegisterSignal(created, COMSIG_MOB_STATCHANGE, PROC_REF(mob_stat_changed)) + if (spawn_text) spawner.visible_message(span_danger("[created] [spawn_text] [spawner].")) + SEND_SIGNAL(src, COMSIG_SPAWNER_SPAWNED, created) RegisterSignal(created, COMSIG_QDELETING, PROC_REF(on_deleted)) /// Remove weakrefs to atoms which have been killed or deleted without us picking it up somehow diff --git a/code/modules/mob/living/basic/vermin/butterfly.dm b/code/modules/mob/living/basic/vermin/butterfly.dm index 06e853b935f..77f89d4d4d1 100644 --- a/code/modules/mob/living/basic/vermin/butterfly.dm +++ b/code/modules/mob/living/basic/vermin/butterfly.dm @@ -44,3 +44,52 @@ /mob/living/basic/butterfly/lavaland unsuitable_atmos_damage = 0 + +/mob/living/basic/butterfly/lavaland/temporary + name = "strange butterfly" + basic_mob_flags = DEL_ON_DEATH + /// The atom that's spawning the butterflies + var/atom/source = null + /// Max distance in tiles before the butterfly despawns + var/max_distance = 5 + /// Whether the butterfly will be destroyed at the end of its despawn timer + var/will_be_destroyed = FALSE + /// Despawn timer of the butterfly + var/despawn_timer = 0 + +/mob/living/basic/butterfly/lavaland/temporary/Initialize(mapload) + . = ..() + START_PROCESSING(SSprocessing, src) + +/mob/living/basic/butterfly/lavaland/temporary/Destroy() + STOP_PROCESSING(SSprocessing, src) + return ..() + +/mob/living/basic/butterfly/lavaland/temporary/process() + if(should_despawn()) + if(will_be_destroyed) + return + will_be_destroyed = TRUE + despawn_timer = addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living/basic/butterfly/lavaland/temporary, fadeout)), 5 SECONDS, TIMER_STOPPABLE) + return + + if(will_be_destroyed) + // Cancels the butterfly being destroyed + will_be_destroyed = FALSE + deltimer(despawn_timer) + +/// Checks whether the butterfly should be despawned after the next check, based on distance from source +/mob/living/basic/butterfly/lavaland/temporary/proc/should_despawn() + if(get_dist(source, src) > max_distance) + return TRUE + return FALSE + +/// Fade the butterfly out before deleting it. +/// Looks much better than it just blipping out of existence +/mob/living/basic/butterfly/lavaland/temporary/proc/fadeout() + animate(src, alpha = 0, 1 SECONDS) + QDEL_IN(src, 1 SECONDS) + +/mob/living/basic/butterfly/lavaland/temporary/examine(mob/user) + . = ..() + . += span_notice("Something about it seems unreal...") diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index bbba270a6fd..a79d216039c 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -51,6 +51,35 @@ new /obj/item/mod/core/standard(drop_location()) qdel(src) +/obj/item/mod/construction/lavalandcore + name = "plasma flower" + icon_state = "plasma-flower" + desc = "A strange flower from the desolate wastes of lavaland. It pulses with a bright purple glow. \ + Its shape is remarkably similar to that of a MOD core." + light_system = MOVABLE_LIGHT + light_color = "#cc00cc" + light_range = 2 + +/obj/item/mod/construction/lavalandcore/examine(mob/user) + . = ..() + . += span_notice("You could probably attach some wires to it...") + +/obj/item/mod/construction/lavalandcore/attackby(obj/item/weapon, mob/user, params) + if(!istype(weapon, /obj/item/stack/cable_coil)) + return + + if(!weapon.tool_start_check(user, amount=2)) + return + + to_chat(user, span_notice("You start pushing the wires into the core...")) + if(!weapon.use_tool(src, user, 5 SECONDS, amount = 2, volume = 30)) + return + + to_chat(user, span_notice("You add the wires to the core.")) + new /obj/item/mod/core/plasma/lavaland(drop_location()) + qdel(src) + + /obj/item/mod/construction/plating name = "MOD external plating" desc = "External plating used to finish a MOD control unit." diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm index 7b05db45175..6b67d735a29 100644 --- a/code/modules/mod/mod_core.dm +++ b/code/modules/mod/mod_core.dm @@ -355,3 +355,75 @@ add_charge(uses_needed * charge_given) balloon_alert(user, "core refueled") return TRUE + +/obj/item/mod/core/plasma/lavaland + name = "MOD plasma flower core" + icon_state = "mod-core-plasma-flower" + desc = "A strange flower from the desolate wastes of lavaland. It pulses with a strange purple glow. \ + The wires coming out of it could be hooked into a MODsuit." + light_system = MOVABLE_LIGHT + light_color = "#cc00cc" + light_range = 2 + + // Slightly better than the normal plasma core. + // Not super sure if this should just be the same, but will see. + maxcharge = 15000 + charge = 15000 + + /// The mob to be spawned by the core + var/mob/living/spawned_mob_type = /mob/living/basic/butterfly/lavaland/temporary + /// Max number of mobs it can spawn + var/max_spawns = 3 + + /// Mob spawner for the core + var/datum/component/spawner/mob_spawner + + +/obj/item/mod/core/plasma/lavaland/Destroy() + if(mod?.wearer) + mod.wearer.particles = null + return ..() + +/obj/item/mod/core/plasma/lavaland/proc/new_mob(spawner, mob/living/basic/butterfly/lavaland/temporary/spawned) + SIGNAL_HANDLER + if(spawned) + spawned.source = src + +/obj/item/mod/core/plasma/lavaland/proc/on_toggle() + SIGNAL_HANDLER + if(mod.active) + START_PROCESSING(SSprocessing, src) + mod.wearer.particles = new /particles/pollen() + mob_spawner = mod.wearer.AddComponent(/datum/component/spawner, spawn_types=list(spawned_mob_type), spawn_time=5 SECONDS, max_spawned=3) + RegisterSignal(mob_spawner, COMSIG_SPAWNER_SPAWNED, PROC_REF(new_mob)) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(flowas)) + + else + STOP_PROCESSING(SSprocessing, src) + mod.wearer.particles = null + UnregisterSignal(mob_spawner, COMSIG_SPAWNER_SPAWNED) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_PRE_MOVE) + for(var/datum/mob in mob_spawner.spawned_things) + qdel(mob) + qdel(mob_spawner) + +/obj/item/mod/core/plasma/lavaland/install(obj/item/mod/control/mod_unit) + . = ..() + RegisterSignal(mod_unit, COMSIG_MOD_TOGGLED, PROC_REF(on_toggle)) + +/obj/item/mod/core/plasma/lavaland/uninstall(obj/item/mod/control/mod_unit) + . = ..() + UnregisterSignal(mod_unit, COMSIG_MOD_TOGGLED) + +/obj/item/mod/core/plasma/lavaland/proc/flowas(mob/living/wearer) + SIGNAL_HANDLER + var/static/list/possible_flower_types = list( + /obj/structure/flora/bush/lavendergrass/style_random, + /obj/structure/flora/bush/flowers_yw/style_random, + /obj/structure/flora/bush/flowers_br/style_random, + /obj/structure/flora/bush/flowers_pp/style_random, + ) + var/chosen_type = pick(possible_flower_types) + var/flower_boots = new chosen_type(get_turf(wearer)) + animate(flower_boots, alpha = 0, 1 SECONDS) + QDEL_IN(flower_boots, 1 SECONDS) diff --git a/icons/obj/clothing/modsuit/mod_construction.dmi b/icons/obj/clothing/modsuit/mod_construction.dmi index a6be94284af8d96539c3772144636e1d08158b12..dedcb3f838d6491a1896c87f0664c3b1ec02a67c 100644 GIT binary patch delta 5098 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

p;y{y0IU*I-L6E}Vwt+6fs`7j(zS z`qX!4ZDFuwo3uIykck4yXRcrO75-er!r);+rm>?m9Or76Au%3KuQc@2F{nD8|9*gU MHH|dN)$GIn2aEg4Q2+n{ diff --git a/tgstation.dme b/tgstation.dme index c04ae5457a2..c1f887d0a1d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -331,6 +331,7 @@ #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_main.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_silicon.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_simple.dm" +#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_spawner.dm" #include "code\__DEFINES\research\anomalies.dm" #include "code\__DEFINES\research\research_categories.dm" #include "code\__HELPERS\_auxtools_api.dm"