diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index f59f388482a..44bfb8b7be2 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -21,6 +21,7 @@
var/name = ""
var/severity = 1
var/hue
+ var/quality
/datum/spacevine_mutation/proc/process_mutation(obj/effect/spacevine/holder)
return
@@ -55,9 +56,84 @@
/datum/spacevine_mutation/proc/on_buckle(obj/effect/spacevine/holder, mob/living/buckled)
return
+
+/datum/spacevine_mutation/space_covering
+ name = "space protective"
+ hue = "#aa77aa"
+ quality = POSITIVE
+
+/turf/simulated/floor/vines
+ color = "#aa77aa"
+ icon_state = "vinefloor"
+ broken_states = list()
+ ignoredirt = 1
+
+
+//All of this shit is useless for vines
+
+/turf/simulated/floor/vines/attackby()
+ return
+
+/turf/simulated/floor/vines/burn_tile()
+ return
+
+/turf/simulated/floor/vines/break_tile()
+ return
+
+/turf/simulated/floor/vines/make_plating()
+ return
+
+/turf/simulated/floor/vines/break_tile_to_plating()
+ return
+
+/turf/simulated/floor/vines/ex_act(severity, target)
+ if(severity < 3 || target == src)
+ ChangeTurf(/turf/space)
+
+/turf/simulated/floor/vines/narsie_act()
+ if(prob(20))
+ ChangeTurf(/turf/space) //nar sie eats this shit
+
+/turf/simulated/floor/vines/singularity_pull(S, current_size)
+ if(current_size >= STAGE_FIVE)
+ if(prob(50))
+ ChangeTurf(/turf/space)
+
+/turf/simulated/floor/vines/ChangeTurf(turf/simulated/floor/T)
+ for(var/obj/effect/spacevine/SV in src)
+ qdel(SV)
+ ..()
+ UpdateAffectingLights()
+
+/datum/spacevine_mutation/space_covering/on_grow(obj/effect/spacevine/holder)
+ if(istype(holder.loc, /turf/space))
+ var/turf/spaceturf = holder.loc
+ spaceturf.ChangeTurf(/turf/simulated/floor/vines)
+
+/datum/spacevine_mutation/space_covering/process_mutation(obj/effect/spacevine/holder)
+ if(istype(holder.loc, /turf/space))
+ var/turf/spaceturf = holder.loc
+ spaceturf.ChangeTurf(/turf/simulated/floor/vines)
+
+/datum/spacevine_mutation/space_covering/on_death(obj/effect/spacevine/holder)
+ if(istype(holder.loc, /turf/simulated/floor/vines))
+ var/turf/spaceturf = holder.loc
+ spawn(0)
+ spaceturf.ChangeTurf(/turf/space)
+
+/datum/spacevine_mutation/bluespace
+ name = "bluespace"
+ hue = "#3333ff"
+ quality = MINOR_NEGATIVE
+
+/datum/spacevine_mutation/bluespace/on_spread(obj/effect/spacevine/holder, turf/target)
+ if(holder.energy > 1 && !locate(/obj/effect/spacevine) in target)
+ holder.master.spawn_spacevine_piece(target, holder)
+
/datum/spacevine_mutation/light
name = "light"
hue = "#ffff00"
+ quality = POSITIVE
/datum/spacevine_mutation/light/on_grow(obj/effect/spacevine/holder)
if(prob(10*severity))
@@ -66,13 +142,14 @@
/datum/spacevine_mutation/toxicity
name = "toxic"
hue = "#ff00ff"
+ severity = 10
+ quality = NEGATIVE
/datum/spacevine_mutation/toxicity/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
if(issilicon(crosser))
return
- if(prob(severity))
- if(crosser.client)
- crosser << "You accidently touch the vine and feel a strange sensation."
+ if(prob(severity) && istype(crosser))
+ crosser << "You accidently touch the vine and feel a strange sensation."
crosser.adjustToxLoss(5)
/datum/spacevine_mutation/toxicity/on_eat(obj/effect/spacevine/holder, mob/living/eater)
@@ -81,14 +158,18 @@
/datum/spacevine_mutation/explosive //OH SHIT IT CAN CHAINREACT RUN!!!
name = "explosive"
hue = "#ff0000"
+ quality = NEGATIVE
/datum/spacevine_mutation/explosive/on_death(obj/effect/spacevine/holder, mob/hitter, obj/item/I)
- sleep(10)
- explosion(holder.loc, 0, 0, 2, 0, 0)
+ var/turf/T = holder.loc
+ src = T
+ spawn(10)
+ explosion(T, 0, 0, 2, 0, 0)
/datum/spacevine_mutation/fire_proof
name = "fire proof"
hue = "#ff8888"
+ quality = MINOR_NEGATIVE
/datum/spacevine_mutation/fire_proof/process_temperature(obj/effect/spacevine/holder, temp, volume)
return 1
@@ -96,16 +177,18 @@
/datum/spacevine_mutation/vine_eating
name = "vine eating"
hue = "#ff7700"
+ quality = MINOR_NEGATIVE
/datum/spacevine_mutation/vine_eating/on_spread(obj/effect/spacevine/holder, turf/target)
var/obj/effect/spacevine/prey = locate() in target
if(prey && !prey.mutations.Find(src)) //Eat all vines that are not of the same origin
- prey.Destroy()
+ qdel(prey)
/datum/spacevine_mutation/aggressive_spread //very OP, but im out of other ideas currently
name = "aggressive spreading"
hue = "#333333"
severity = 3
+ quality = NEGATIVE
/datum/spacevine_mutation/aggressive_spread/on_spread(obj/effect/spacevine/holder, turf/target)
for(var/atom/A in target)
@@ -118,6 +201,7 @@
/datum/spacevine_mutation/transparency
name = "transparent"
hue = ""
+ quality = POSITIVE
/datum/spacevine_mutation/transparency/on_grow(obj/effect/spacevine/holder)
holder.SetOpacity(0)
@@ -126,9 +210,11 @@
/datum/spacevine_mutation/oxy_eater
name = "oxygen consuming"
hue = "#ffff88"
+ severity = 3
+ quality = NEGATIVE
/datum/spacevine_mutation/oxy_eater/process_mutation(obj/effect/spacevine/holder)
- var/turf/simulated/T = holder.loc
+ var/turf/simulated/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
GM.oxygen = max(0, GM.oxygen - severity * holder.energy)
@@ -136,9 +222,11 @@
/datum/spacevine_mutation/nitro_eater
name = "nitrogen consuming"
hue = "#8888ff"
+ severity = 3
+ quality = NEGATIVE
/datum/spacevine_mutation/nitro_eater/process_mutation(obj/effect/spacevine/holder)
- var/turf/simulated/T = holder.loc
+ var/turf/simulated/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
GM.nitrogen = max(0, GM.nitrogen - severity * holder.energy)
@@ -146,9 +234,11 @@
/datum/spacevine_mutation/carbondioxide_eater
name = "CO2 consuming"
hue = "#00ffff"
+ severity = 3
+ quality = POSITIVE
/datum/spacevine_mutation/carbondioxide_eater/process_mutation(obj/effect/spacevine/holder)
- var/turf/simulated/T = holder.loc
+ var/turf/simulated/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
GM.carbon_dioxide = max(0, GM.carbon_dioxide - severity * holder.energy)
@@ -156,9 +246,11 @@
/datum/spacevine_mutation/plasma_eater
name = "toxins consuming"
hue = "#ffbbff"
+ severity = 3
+ quality = POSITIVE
/datum/spacevine_mutation/plasma_eater/process_mutation(obj/effect/spacevine/holder)
- var/turf/simulated/T = holder.loc
+ var/turf/simulated/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
GM.toxins = max(0, GM.toxins - severity * holder.energy)
@@ -166,22 +258,25 @@
/datum/spacevine_mutation/thorns
name = "thorny"
hue = "#666666"
+ severity = 10
+ quality = NEGATIVE
-/datum/spacevine_mutation/thorns/on_cross(obj/effect/spacevine/holder, crosser)
- if(isliving(crosser) && prob(severity))
+/datum/spacevine_mutation/thorns/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
+ if(prob(severity) && istype(crosser))
var/mob/living/M = crosser
M.adjustBruteLoss(5)
M << "You cut yourself on the thorny vines."
-/datum/spacevine_mutation/thorns/on_hit(obj/effect/spacevine/holder, hitter)
- if(ismob(hitter) && prob(severity))
+/datum/spacevine_mutation/thorns/on_hit(obj/effect/spacevine/holder, mob/living/hitter)
+ if(prob(severity) && istype(hitter))
var/mob/living/M = hitter
M.adjustBruteLoss(5)
M << "You cut yourself on the thorny vines."
/datum/spacevine_mutation/woodening
- name = "hardening"
+ name = "hardened"
hue = "#997700"
+ quality = NEGATIVE
/datum/spacevine_mutation/woodening/on_grow(obj/effect/spacevine/holder)
if(holder.energy)
@@ -195,7 +290,7 @@
else
chance = 8
if(prob(chance))
- holder.Destroy()
+ qdel(holder)
return 1
@@ -225,6 +320,8 @@
if(!master.vines.len)
var/obj/item/seeds/kudzuseed/KZ = new(loc)
KZ.mutations |= mutations
+ KZ.potency = min(100, master.mutativness * 10)
+ KZ.production = (master.spread_cap / initial(master.spread_cap)) * 50
mutations = list()
SetOpacity(0)
..()
@@ -235,7 +332,7 @@
override += SM.on_chem(src, R)
if(!override && istype(R, /datum/reagent/toxin/plantbgone))
if(prob(50))
- Destroy()
+ qdel(src)
/obj/effect/spacevine/proc/eat(mob/eater)
var/override = 0
@@ -244,7 +341,7 @@
if(!override)
if(prob(10))
eater.say("Nom")
- Destroy()
+ qdel(src)
/obj/effect/spacevine/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if (!W || !user || !W.type) return
@@ -311,22 +408,29 @@
/obj/effect/spacevine_controller
var/list/obj/effect/spacevine/vines = list()
var/list/growth_queue = list()
- var/reached_collapse_size
- var/reached_slowdown_size
+ var/spread_multiplier = 5
+ var/spread_cap = 30
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.
-
-/obj/effect/spacevine_controller/New(loc, list/muts, mttv)
- if(!istype(loc, /turf/simulated) || loc:density)
- qdel(src)
+/obj/effect/spacevine_controller/New(loc, list/muts, mttv, spreading)
spawn_spacevine_piece(loc, , muts)
SSobj.processing |= src
init_subtypes(/datum/spacevine_mutation/, mutations_list)
if(mttv != null)
- mutativness = mttv
+ mutativness = mttv / 10
+ if(spreading != null)
+ spread_cap *= spreading / 50
+ spread_multiplier /= spreading / 50
+
+/obj/effect/spacevine_controller/ex_act() //only killing all vines will end this suffering
+ return
+
+/obj/effect/spacevine_controller/singularity_act()
+ return
+
+/obj/effect/spacevine_controller/singularity_pull()
+ return
/obj/effect/spacevine_controller/Destroy()
SSobj.processing.Remove(src)
@@ -362,26 +466,15 @@
if(!growth_queue)
qdel(src) //Sanity check
return
- if(vines.len >= 250 && !reached_collapse_size)
- reached_collapse_size = 1
- if(vines.len >= 30 && !reached_slowdown_size )
- reached_slowdown_size = 1
var/length = 0
- if(reached_collapse_size)
- length = 0
- else if(reached_slowdown_size)
- if(prob(25))
- length = 1
- else
- length = 0
- else
- length = 1
- length = min( 30 , max( length , vines.len / 5 ) )
+
+ length = min( spread_cap , max( 1 , vines.len / spread_multiplier ) )
var/i = 0
var/list/obj/effect/spacevine/queue_end = list()
for( var/obj/effect/spacevine/SV in growth_queue )
+ if(SV.gc_destroyed) continue
i++
queue_end += SV
growth_queue -= SV
@@ -427,15 +520,14 @@
/obj/effect/spacevine/proc/spread()
var/direction = pick(cardinal)
- var/step = get_step(src,direction)
+ var/turf/stepturf = get_step(src,direction)
for(var/datum/spacevine_mutation/SM in mutations)
- SM.on_spread(src, step)
- if(istype(step,/turf/simulated) && !step:density)
- var/turf/simulated/F = step
- if(!locate(/obj/effect/spacevine,F))
- if(F.Enter(src))
- if(master)
- master.spawn_spacevine_piece(F, src)
+ SM.on_spread(src, stepturf)
+ stepturf = get_step(src,direction) //in case turf changes, to make sure no runtimes happen
+ if(!locate(/obj/effect/spacevine, stepturf))
+ if(stepturf.Enter(src))
+ if(master)
+ master.spawn_spacevine_piece(stepturf, src)
/*
/obj/effect/spacevine/proc/Life()
@@ -474,15 +566,15 @@
/obj/effect/spacevine/ex_act(severity, target)
switch(severity)
if(1.0)
- Destroy()
+ qdel(src)
return
if(2.0)
if (prob(90))
- Destroy()
+ qdel(src)
return
if(3.0)
if (prob(50))
- Destroy()
+ qdel(src)
return
return
@@ -491,4 +583,4 @@
for(var/datum/spacevine_mutation/SM in mutations)
override += SM.process_temperature(src, temp, volume)
if(!override)
- Destroy()
\ No newline at end of file
+ qdel(src)
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 1b37bde3680..3606153be97 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -861,7 +861,6 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice()
desc = "Pueraria Virallis: An invasive species with vines that rapidly creep and wrap around whatever they contact."
icon_state = "kudzupod"
var/list/mutations = list()
- var/mutating = 0
filling_color = "#6B8E23"
/obj/item/weapon/reagent_containers/food/snacks/grown/kudzupod/add_juice()
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index da3bc6eb6b2..0e8bbfc0da3 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -402,6 +402,8 @@ obj/machinery/hydroponics/proc/mutatepest()
obj/machinery/hydroponics/proc/applyChemicals(var/datum/reagents/S)
+ myseed.on_chem_reaction(S) //In case seeds have some special interactions with special chems, currently only used by vines
+
// Requires 5 mutagen to possibly change species.// Poor man's mutagen.
if(S.has_reagent("mutagen", 5) || S.has_reagent("radium", 10) || S.has_reagent("uranium", 10))
switch(rand(100))
@@ -671,20 +673,18 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob, p
user << "-Plant Production: [myseed.production]"
if(myseed.potency != -1)
user << "-Plant Potency: [myseed.potency]"
- user << "-Weed level: [weedlevel] / 10"
- user << "-Pest level: [pestlevel] / 10"
- user << "-Toxicity level: [toxic] / 100"
- user << "-Water level: [waterlevel] / [maxwater]"
- user << "-Nutrition level: [nutrilevel] / [maxnutri]"
- user << ""
+ var/list/text_strings = myseed.get_analyzer_text()
+ if(text_strings)
+ for(var/string in text_strings)
+ user << string
else
user << "No plant found."
- user << "-Weed level: [weedlevel] / 10"
- user << "-Pest level: [pestlevel] / 10"
- user << "-Toxicity level: [toxic] / 100"
- user << "-Water level: [waterlevel] / [maxwater]"
- user << "-Nutrition level: [nutrilevel] / [maxnutri]"
- user << ""
+ user << "-Weed level: [weedlevel] / 10"
+ user << "-Pest level: [pestlevel] / 10"
+ user << "-Toxicity level: [toxic] / 100"
+ user << "-Water level: [waterlevel] / [maxwater]"
+ user << "-Nutrition level: [nutrilevel] / [maxnutri]"
+ user << ""
else if(istype(O, /obj/item/weapon/minihoe))
if(weedlevel > 0)
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 86fe5ae8c7e..d0f5597cea8 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -27,6 +27,12 @@
pixel_x = rand(-8, 8)
pixel_y = rand(-8, 8)
+/obj/item/seeds/proc/get_analyzer_text() //in case seeds have something special to tell to the analyzer
+ return
+
+/obj/item/seeds/proc/on_chem_reaction(var/datum/reagents/S) //in case seeds have some special interaction with special chems
+ return
+
/obj/item/seeds/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if (istype(O, /obj/item/device/analyzer/plant_analyzer))
user << "*** [plantname] ***"
@@ -38,6 +44,10 @@
user << "-Plant Production: [production]"
if(potency != -1)
user << "-Plant Potency: [potency]"
+ var/list/text_strings = get_analyzer_text()
+ if(text_strings)
+ for(var/string in text_strings)
+ user << string
return
..() // Fallthrough to item/attackby() so that bags can pick seeds up
@@ -1073,27 +1083,65 @@
plant_type = 1
rarity = 30
var/list/mutations = list()
- var/mutating
/obj/item/seeds/kudzuseed/New(loc, obj/item/weapon/reagent_containers/food/snacks/grown/kudzupod/parent)
..()
if(parent)
mutations = parent.mutations
- mutating = parent.mutating
/obj/item/seeds/kudzuseed/harvest()
var/list/prod = ..()
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/kudzupod/K in prod)
K.mutations = mutations
- K.mutating = prob(15)
/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, mutations)
+ new /obj/effect/spacevine_controller(user.loc, mutations, potency, production)
qdel(src)
+/obj/item/seeds/kudzuseed/get_analyzer_text()
+ var/list/mut_text = list()
+ var/text_string = ""
+ for(var/datum/spacevine_mutation/SM in mutations)
+ text_string += "[(text_string == "") ? "" : ", "][SM.name]"
+ mut_text += "-Plant Mutations: [(text_string == "") ? "None" : text_string]"
+ return mut_text
+
+/obj/item/seeds/kudzuseed/on_chem_reaction(var/datum/reagents/S)
+
+ var/list/temp_mut_list = list()
+
+ if(S.has_reagent("sterilizine", 5))
+ for(var/datum/spacevine_mutation/SM in mutations)
+ if(SM.quality == NEGATIVE)
+ temp_mut_list += SM
+ if(prob(20))
+ mutations.Remove(pick(temp_mut_list))
+ temp_mut_list.Cut()
+ if(S.has_reagent("fuel", 5))
+ for(var/datum/spacevine_mutation/SM in mutations)
+ if(SM.quality == POSITIVE)
+ temp_mut_list += SM
+ if(prob(20))
+ mutations.Remove(pick(temp_mut_list))
+ temp_mut_list.Cut()
+ if(S.has_reagent("phenol", 5))
+ for(var/datum/spacevine_mutation/SM in mutations)
+ if(SM.quality == MINOR_NEGATIVE)
+ temp_mut_list += SM
+ if(prob(20))
+ mutations.Remove(pick(temp_mut_list))
+ if(S.has_reagent("blood", 15))
+ production += rand(15, -5)
+ if(S.has_reagent("amatoxin", 5))
+ production += rand(5, -15)
+ if(S.has_reagent("plasma", 5))
+ potency += rand(5, -15)
+ if(S.has_reagent("holywater", 10))
+ potency += rand(15, -5)
+
/obj/item/seeds/chilighost
name = "pack of ghost chili seeds"
desc = "These seeds grow into a chili said to be the hottest in the galaxy."
diff --git a/html/changelogs/Razharas.yml b/html/changelogs/Razharas.yml
new file mode 100644
index 00000000000..b7f2e8aaf79
--- /dev/null
+++ b/html/changelogs/Razharas.yml
@@ -0,0 +1,15 @@
+
+author: Razharas
+
+delete-after: False
+
+changes:
+ - rscadd: "Vines now can grow on any tiles that is not dense, including space, shuttles, centcomm tiles and so on."
+ - rscadd: "Added 'Bluespace' mutation to vines, makes them be able to grow through absolutely everything."
+ - rscadd: "Added 'Space Proofing' mutation to vines, after they grow if the tile under them is space it will become special vinetile, which is just resprited regular floor, if the vine on the vinetile dies the vineturf changes back to space."
+ - rscadd: "Made vines spreading speed depend on the seed's production, can be both slower and faster than current."
+ - rscadd: "Made vines mutation chance be 1/10th of the potency of the seed it is spawned from."
+ - rscadd: "Special chemicals added to vine seeds durning their growth can increase/decrease their potency and productivity."
+ - rscadd: "Special chemicals now can remove good, bad or neutral mutations from vine seeds while they are growing, cultivating actually helpful vines is now possible."
+ - rscadd: "Plant analyzers now show the vine seeds mutations."
+ - tweak: "Buffed numbers in some of the more useless mutations."
\ No newline at end of file
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index e5bc983f5c5..75a11015b5f 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ