diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index a0e24f81570..35162d4ded4 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -17,6 +17,107 @@
spawn(0) new/obj/effect/spacevine_controller(T) //spawn a controller at turf
+/datum/spacevine_mutation
+ var/name = ""
+ var/severity = 1
+ var/hue
+
+/datum/spacevine_mutation/proc/process_mutation(obj/effect/spacevine/holder)
+ return
+
+/datum/spacevine_mutation/proc/on_birth(obj/effect/spacevine/holder)
+ return
+
+/datum/spacevine_mutation/proc/on_grow(obj/effect/spacevine/holder)
+ return
+
+/datum/spacevine_mutation/proc/on_death(obj/effect/spacevine/holder)
+ return
+
+/datum/spacevine_mutation/proc/on_hit(obj/effect/spacevine/holder, mob/hitter, obj/item/I)
+ return
+
+/datum/spacevine_mutation/proc/on_cross(obj/effect/spacevine/holder, mob/crosser)
+ return
+
+/datum/spacevine_mutation/oxy_eater
+ name = "oxygen consumption"
+ hue = "#ffff00"
+
+/datum/spacevine_mutation/transparency
+ name = "oxygen consumption"
+ hue = ""
+
+/datum/spacevine_mutation/transparency/on_grow(obj/effect/spacevine/holder)
+ holder.SetOpacity(0)
+ holder.alpha = 125
+
+/datum/spacevine_mutation/oxy_eater/process_mutation(obj/effect/spacevine/holder)
+ var/turf/simulated/floor/T = holder.loc
+ var/datum/gas_mixture/GM = T.air
+ GM.oxygen = max(0, GM.oxygen - severity * 0.5 * holder.energy)
+
+/datum/spacevine_mutation/nitro_eater
+ name = "nitrogen consumption"
+ hue = "#ffff00"
+
+/datum/spacevine_mutation/nitro_eater/process_mutation(obj/effect/spacevine/holder)
+ var/turf/simulated/floor/T = holder.loc
+ var/datum/gas_mixture/GM = T.air
+ GM.nitrogen = max(0, GM.nitrogen - severity * 0.5 * holder.energy)
+
+/datum/spacevine_mutation/carbondioxide_eater
+ name = "CO2 consumption"
+ hue = "#00ffff"
+
+/datum/spacevine_mutation/carbondioxide_eater/process_mutation(obj/effect/spacevine/holder)
+ var/turf/simulated/floor/T = holder.loc
+ var/datum/gas_mixture/GM = T.air
+ GM.carbon_dioxide = max(0, GM.carbon_dioxide - severity * 0.5 * holder.energy)
+
+/datum/spacevine_mutation/plasma_eater
+ name = "toxins consumption"
+ hue = "#dd00dd"
+
+/datum/spacevine_mutation/plasma_eater/process_mutation(obj/effect/spacevine/holder)
+ var/turf/simulated/floor/T = holder.loc
+ var/datum/gas_mixture/GM = T.air
+ GM.toxins = max(0, GM.toxins - severity * 0.5 * holder.energy)
+
+/datum/spacevine_mutation/thorns
+ name = "thorns"
+ hue = "#666666"
+
+/datum/spacevine_mutation/thorns/on_cross(obj/effect/spacevine/holder, crosser)
+ if(isliving(crosser) && prob(severity))
+ var/mob/living/M = crosser
+ M.adjustBruteLoss(5)
+ M << "You cut yourself on all these vines."
+
+/datum/spacevine_mutation/thorns/on_hit(obj/effect/spacevine/holder, hitter)
+ if(ismob(hitter) && prob(severity))
+ var/mob/living/M = hitter
+ M.adjustBruteLoss(5)
+ M << "You cut yourself on all these vines."
+
+/datum/spacevine_mutation/woodening
+ name = "hardening"
+ hue = "#997700"
+
+/datum/spacevine_mutation/woodening/on_grow(obj/effect/spacevine/holder)
+ if(holder.energy)
+ holder.density = 1
+
+/datum/spacevine_mutation/woodening/on_hit(obj/effect/spacevine/holder, mob/hitter, obj/item/I)
+ if(hitter)
+ var/chance
+ if(I)
+ chance = I.force
+ else
+ chance = 4
+ if(prob(chance))
+ qdel(holder)
+ return 1
// SPACE VINES (Note that this code is very similar to Biomass code)
@@ -32,19 +133,35 @@
var/energy = 0
var/obj/effect/spacevine_controller/master = null
var/mob/living/buckled_mob
+ var/list/mutations = list()
New()
return
Destroy()
+ for(var/datum/spacevine_mutation/SM in mutations)
+ SM.on_death(src)
if(master)
master.vines -= src
master.growth_queue -= src
+ if(!master.vines.len)
+ var/obj/item/seeds/kudzuseed/KZ = new(loc)
+ KZ.mutations |= mutations
..()
/obj/effect/spacevine/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (!W || !user || !W.type) return
+
+ var/override = 0
+
+ for(var/datum/spacevine_mutation/SM in mutations)
+ override += SM.on_hit(src, user)
+
+ if(override)
+ ..()
+ return
+
switch(W.type)
if(/obj/item/weapon/circular_saw) qdel(src)
if(/obj/item/weapon/kitchen/utensil/knife) qdel(src)
@@ -70,12 +187,20 @@
//Plant-b-gone damage is handled in its entry in chemistry-reagents.dm
..()
+/obj/effect/spacevine/Crossed(mob/crosser)
+ if(isliving(crosser))
+ for(var/datum/spacevine_mutation/SM in mutations)
+ SM.on_cross(src, crosser)
/obj/effect/spacevine/attack_hand(mob/user as mob)
+ for(var/datum/spacevine_mutation/SM in mutations)
+ SM.on_hit(src, user)
manual_unbuckle(user)
/obj/effect/spacevine/attack_paw(mob/user as mob)
+ for(var/datum/spacevine_mutation/SM in mutations)
+ SM.on_hit(src, user)
manual_unbuckle(user)
/obj/effect/spacevine/proc/unbuckle()
@@ -115,25 +240,42 @@
var/list/growth_queue = list()
var/reached_collapse_size
var/reached_slowdown_size
+ var/list/mutations_list = list()
+ var/mutativness = 1
//What this does is that instead of having the grow minimum of 1, required to start growing, the minimum will be 0,
//meaning if you get the spacevines' size to something less than 20 plots, it won't grow anymore.
- New()
+ New(loc, list/muts, mttv)
if(!istype(src.loc,/turf/simulated/floor))
qdel(src)
- spawn_spacevine_piece(src.loc)
+ spawn_spacevine_piece(src.loc, , muts)
processing_objects.Add(src)
+ init_subtypes(/datum/spacevine_mutation/, mutations_list)
+ if(mttv != null)
+ mutativness = mttv
Destroy()
processing_objects.Remove(src)
..()
- proc/spawn_spacevine_piece(var/turf/location)
+ proc/spawn_spacevine_piece(var/turf/location, obj/effect/spacevine/parent, list/muts)
var/obj/effect/spacevine/SV = new(location)
growth_queue += SV
vines += SV
SV.master = src
+ if(muts && muts.len)
+ SV.mutations |= muts
+ if(parent)
+ SV.mutations |= parent.mutations
+ SV.color = parent.color
+ if(prob(mutativness))
+ SV.mutations |= pick(mutations_list)
+ var/datum/spacevine_mutation/randmut = pick(SV.mutations)
+ SV.color = randmut.hue
+
+ for(var/datum/spacevine_mutation/SM in SV.mutations)
+ SM.on_birth(SV)
process()
if(!vines)
@@ -165,6 +307,8 @@
i++
queue_end += SV
growth_queue -= SV
+ for(var/datum/spacevine_mutation/SM in SV.mutations)
+ SM.process_mutation(SV)
if(SV.energy < 2) //If tile isn't fully grown
if(prob(20))
SV.grow()
@@ -190,6 +334,9 @@
src.icon_state = pick("Hvy1", "Hvy2", "Hvy3")
energy = 2
+ for(var/datum/spacevine_mutation/SM in mutations)
+ SM.on_grow(src)
+
/obj/effect/spacevine/proc/buckle_mob()
if(!buckled_mob && prob(25))
for(var/mob/living/carbon/V in src.loc)
@@ -209,7 +356,7 @@
if(!locate(/obj/effect/spacevine,F))
if(F.Enter(src))
if(master)
- master.spawn_spacevine_piece( F )
+ master.spawn_spacevine_piece(F, src)
/*
/obj/effect/spacevine/proc/Life()
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 442624ca632..d3c26f73806 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -1033,12 +1033,13 @@
growthstages = 4
plant_type = 1
rarity = 30
+ var/list/mutations = list()
/obj/item/seeds/kudzuseed/attack_self(mob/user as mob)
if(istype(user.loc,/turf/space))
return
user << "You plant the kudzu. You monster."
- new /obj/effect/spacevine_controller(user.loc)
+ new /obj/effect/spacevine_controller(user.loc, mutations, 1)
qdel(src)
/obj/item/seeds/chillighost