From 09e4be2b1b820e59be3d35618ac37fc8ce8f0e83 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 31 Jan 2015 14:34:41 +1030 Subject: [PATCH] Collapsed space vines, glowshrooms and biomass into one spreading-plant system. --- baystation12.dme | 3 - code/__HELPERS/unsorted.dm | 12 + code/datums/datacore.dm | 1 - code/datums/supplypacks.dm | 2 + code/game/gamemodes/events/biomass.dm | 176 --------- code/game/gamemodes/events/spacevines.dm | 16 - code/game/gamemodes/wizard/artifact.dm | 2 +- code/game/objects/effects/biomass_rift.dm | 126 ------- .../effects/decals/Cleanable/humans.dm | 6 +- code/global.dm | 3 - code/modules/admin/topic.dm | 5 - code/modules/events/spacevine.dm | 6 +- code/modules/hydroponics/_hydro_setup.dm | 9 +- code/modules/hydroponics/hydro_tools.dm | 8 +- code/modules/hydroponics/hydro_tray.dm | 42 ++- code/modules/hydroponics/seed_datums.dm | 174 ++++----- code/modules/hydroponics/seeds.dm | 9 +- code/modules/hydroponics/spread_plant.dm | 158 ++++++-- code/modules/hydroponics/spread_vine.dm | 355 ------------------ .../simple_animal/friendly/farm_animals.dm | 17 +- code/modules/reagents/Chemistry-Reagents.dm | 6 +- icons/obj/biomass.dmi | Bin 7246 -> 0 bytes icons/obj/hydroponics_vines.dmi | Bin 10381 -> 18093 bytes icons/obj/magic.dmi | Bin 4266 -> 4253 bytes icons/obj/wizard.dmi | Bin 9118 -> 12565 bytes 25 files changed, 266 insertions(+), 870 deletions(-) delete mode 100644 code/game/gamemodes/events/biomass.dm delete mode 100644 code/game/gamemodes/events/spacevines.dm delete mode 100644 code/game/objects/effects/biomass_rift.dm delete mode 100644 code/modules/hydroponics/spread_vine.dm delete mode 100644 icons/obj/biomass.dmi diff --git a/baystation12.dme b/baystation12.dme index fe79d1a4e1..265b12f047 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -237,14 +237,12 @@ #include "code\game\gamemodes\cult\ritual.dm" #include "code\game\gamemodes\cult\runes.dm" #include "code\game\gamemodes\cult\talisman.dm" -#include "code\game\gamemodes\events\biomass.dm" #include "code\game\gamemodes\events\black_hole.dm" #include "code\game\gamemodes\events\clang.dm" #include "code\game\gamemodes\events\dust.dm" #include "code\game\gamemodes\events\miniblob.dm" #include "code\game\gamemodes\events\power_failure.dm" #include "code\game\gamemodes\events\space_ninja.dm" -#include "code\game\gamemodes\events\spacevines.dm" #include "code\game\gamemodes\events\wormholes.dm" #include "code\game\gamemodes\events\holidays\Christmas.dm" #include "code\game\gamemodes\events\holidays\Holidays.dm" @@ -971,7 +969,6 @@ #include "code\modules\hydroponics\seed_storage.dm" #include "code\modules\hydroponics\seeds.dm" #include "code\modules\hydroponics\spread_plant.dm" -#include "code\modules\hydroponics\spread_vine.dm" #include "code\modules\library\lib_items.dm" #include "code\modules\library\lib_machines.dm" #include "code\modules\library\lib_readme.dm" diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index d78f3e7a9d..e0de9b857f 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1378,3 +1378,15 @@ var/list/WALLITEMS = list( if(istype(arglist,/list)) arglist = list2params(arglist) return "[content]" + +/proc/get_random_colour(var/simple, var/lower, var/upper) + var/colour + if(simple) + colour = pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF")) + else + for(var/i=1;i<=3;i++) + var/temp_col = "[num2hex(rand(lower,upper))]" + if(length(temp_col )<2) + temp_col = "0[temp_col]" + colour += temp_col + return colour \ No newline at end of file diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 0045dabec9..2e3d2cc544 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -51,7 +51,6 @@ assignment = "Unassigned" var/id = add_zero(num2hex(rand(1, 1.6777215E7)), 6) //this was the best they could come up with? A large random number? *sigh* - var/icon/front = new(get_id_photo(H), dir = SOUTH) var/icon/side = new(get_id_photo(H), dir = WEST) //General Record diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index e029b524a7..14a86aed13 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -257,6 +257,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/hydroponics // -- Skie name = "Hydroponics Supply Crate" contains = list(/obj/item/weapon/reagent_containers/spray/plantbgone, + /obj/item/weapon/reagent_containers/spray/plantbgone, + /obj/item/weapon/reagent_containers/spray/plantbgone, /obj/item/weapon/reagent_containers/spray/plantbgone, /obj/item/weapon/reagent_containers/glass/bottle/ammonia, /obj/item/weapon/reagent_containers/glass/bottle/ammonia, diff --git a/code/game/gamemodes/events/biomass.dm b/code/game/gamemodes/events/biomass.dm deleted file mode 100644 index b758c85019..0000000000 --- a/code/game/gamemodes/events/biomass.dm +++ /dev/null @@ -1,176 +0,0 @@ -// BIOMASS (Note that this code is very similar to Space Vine code) -/obj/effect/biomass - name = "biomass" - desc = "Space barf from another dimension. It just keeps spreading!" - icon = 'icons/obj/biomass.dmi' - icon_state = "stage1" - anchored = 1 - density = 0 - layer = 5 - pass_flags = PASSTABLE | PASSGRILLE - var/energy = 0 - var/obj/effect/biomass_controller/master = null - - New() - return - - Del() - if(master) - master.vines -= src - master.growth_queue -= src - ..() - -/obj/effect/biomass/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (!W || !user || !W.type) return - switch(W.type) - if(/obj/item/weapon/circular_saw) del src - if(/obj/item/weapon/kitchen/utensil/knife) del src - if(/obj/item/weapon/scalpel) del src - if(/obj/item/weapon/twohanded/fireaxe) del src - if(/obj/item/weapon/hatchet) del src - if(/obj/item/weapon/melee/energy) del src - if(/obj/item/weapon/pickaxe/plasmacutter) del src - - //less effective weapons - if(/obj/item/weapon/wirecutters) - if(prob(25)) del src - if(/obj/item/weapon/shard) - if(prob(25)) del src - - else //weapons with subtypes - if(istype(W, /obj/item/weapon/melee/energy/sword)) del src - else if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if(WT.remove_fuel(0, user)) del src - else - return - ..() - -/obj/effect/biomass_controller - var/list/obj/effect/biomass/vines = list() - var/list/growth_queue = list() - var/reached_collapse_size - var/reached_slowdown_size - //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 biomasssss..s' size to something less than 20 plots, it won't grow anymore. - - New() - if(!istype(src.loc,/turf/simulated/floor)) - del(src) - - spawn_biomass_piece(src.loc) - processing_objects.Add(src) - - Del() - processing_objects.Remove(src) - ..() - - proc/spawn_biomass_piece(var/turf/location) - var/obj/effect/biomass/BM = new(location) - growth_queue += BM - vines += BM - BM.master = src - - process() - if(!vines) - del(src) //space vines exterminated. Remove the controller - return - if(!growth_queue) - del(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/maxgrowth = 0 - if(reached_collapse_size) - maxgrowth = 0 - else if(reached_slowdown_size) - if(prob(25)) - maxgrowth = 1 - else - maxgrowth = 0 - else - maxgrowth = 4 - var/length = min( 30 , vines.len / 5 ) - var/i = 0 - var/growth = 0 - var/list/obj/effect/biomass/queue_end = list() - - for( var/obj/effect/biomass/BM in growth_queue ) - i++ - queue_end += BM - growth_queue -= BM - if(BM.energy < 2) //If tile isn't fully grown - if(prob(20)) - BM.grow() - - if(BM.spread()) - growth++ - if(growth >= maxgrowth) - break - if(i >= length) - break - - growth_queue = growth_queue + queue_end - -/obj/effect/biomass/proc/grow() - if(!energy) - src.icon_state = "stage2" - energy = 1 - src.opacity = 0 - src.density = 0 - layer = 5 - else - src.icon_state = "stage3" - src.opacity = 0 - src.density = 1 - energy = 2 - -/obj/effect/biomass/proc/spread() - var/direction = pick(cardinal) - var/step = get_step(src,direction) - if(istype(step,/turf/simulated/floor)) - var/turf/simulated/floor/F = step - if(!locate(/obj/effect/biomass,F)) - if(F.Enter(src)) - if(master) - master.spawn_biomass_piece( F ) - return 1 - return 0 - -/obj/effect/biomass/ex_act(severity) - switch(severity) - if(1.0) - del(src) - return - if(2.0) - if (prob(90)) - del(src) - return - if(3.0) - if (prob(50)) - del(src) - return - return - -/obj/effect/biomass/fire_act(null, temp, volume) //hotspots kill biomass - del src - - -/proc/biomass_infestation() - - spawn() //to stop the secrets panel hanging - var/list/turf/simulated/floor/turfs = list() //list of all the empty floor turfs in the hallway areas - for(var/areapath in typesof(/area/hallway)) - var/area/A = locate(areapath) - for(var/area/B in A.related) - for(var/turf/simulated/floor/F in B.contents) - if(!F.contents.len) - turfs += F - - if(turfs.len) //Pick a turf to spawn at if we can - var/turf/simulated/floor/T = pick(turfs) - new/obj/effect/biomass_controller(T) //spawn a controller at turf - message_admins("\blue Event: Biomass spawned at [T.loc.loc] ([T.x],[T.y],[T.z])") diff --git a/code/game/gamemodes/events/spacevines.dm b/code/game/gamemodes/events/spacevines.dm deleted file mode 100644 index d095f19d56..0000000000 --- a/code/game/gamemodes/events/spacevines.dm +++ /dev/null @@ -1,16 +0,0 @@ -//Carn: Spacevines random event. -/proc/spacevine_infestation() - - spawn() //to stop the secrets panel hanging - var/list/turf/simulated/floor/turfs = list() //list of all the empty floor turfs in the hallway areas - for(var/areapath in typesof(/area/hallway)) - var/area/A = locate(areapath) - for(var/area/B in A.related) - for(var/turf/simulated/floor/F in B.contents) - if(!F.contents.len) - turfs += F - - if(turfs.len) //Pick a turf to spawn at if we can - var/turf/simulated/floor/T = pick(turfs) - new/obj/effect/plant_controller(T) //spawn a controller at turf - message_admins("\blue Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])") diff --git a/code/game/gamemodes/wizard/artifact.dm b/code/game/gamemodes/wizard/artifact.dm index 15ac80ced4..8c1cff5fcc 100644 --- a/code/game/gamemodes/wizard/artifact.dm +++ b/code/game/gamemodes/wizard/artifact.dm @@ -15,7 +15,7 @@ /obj/effect/rend name = "Tear in the fabric of reality" desc = "You should run now" - icon = 'icons/obj/biomass.dmi' + icon = 'icons/obj/wizard.dmi' icon_state = "rift" density = 1 unacidable = 1 diff --git a/code/game/objects/effects/biomass_rift.dm b/code/game/objects/effects/biomass_rift.dm deleted file mode 100644 index c619ccb1e7..0000000000 --- a/code/game/objects/effects/biomass_rift.dm +++ /dev/null @@ -1,126 +0,0 @@ -/* -/obj/effect/biomass - icon = 'icons/obj/biomass.dmi' - icon_state = "stage1" - opacity = 0 - density = 0 - anchored = 1 - layer = 20 //DEBUG - var/health = 10 - var/stage = 1 - var/obj/effect/rift/originalRift = null //the originating rift of that biomass - var/maxDistance = 15 //the maximum length of a thread - var/newSpreadDistance = 10 //the length of a thread at which new ones are created - var/curDistance = 1 //the current length of a thread - var/continueChance = 3 //weighed chance of continuing in the same direction. turning left or right has 1 weight both - var/spreadDelay = 1 //will change to something bigger later, but right now I want it to spread as fast as possible for testing - -/obj/effect/rift - icon = 'icons/obj/biomass.dmi' - icon_state = "rift" - var/list/obj/effect/biomass/linkedBiomass = list() //all the biomass patches that have spread from it - var/newicon = 1 //DEBUG - -/obj/effect/rift/New() - set background = 1 - - ..() - - for(var/turf/T in orange(1,src)) - if(!IsValidBiomassLoc(T)) - continue - var/obj/effect/biomass/starting = new /obj/effect/biomass(T) - starting.set_dir(get_dir(src,starting)) - starting.originalRift = src - linkedBiomass += starting - spawn(1) //DEBUG - starting.icon_state = "[newicon]" - -/obj/effect/rift/Del() - for(var/obj/effect/biomass/biomass in linkedBiomass) - del(biomass) - ..() - -/obj/effect/biomass/New() - set background = 1 - - ..() - if(!IsValidBiomassLoc(loc,src)) - del(src) - return - spawn(1) //so that the dir and stuff can be set by the source first - if(curDistance >= maxDistance) - return - switch(dir) - if(NORTHWEST) - set_dir(NORTH) - if(NORTHEAST) - set_dir(EAST) - if(SOUTHWEST) - set_dir(WEST) - if(SOUTHEAST) - set_dir(SOUTH) - sleep(spreadDelay) - Spread() - -/obj/effect/biomass/proc/Spread(var/direction = dir) - set background = 1 - var/possibleDirsInt = 0 - - for(var/newDirection in cardinal) - if(newDirection == turn(direction,180)) //can't go backwards - continue - var/turf/T = get_step(loc,newDirection) - if(!IsValidBiomassLoc(T,src)) - continue - possibleDirsInt |= newDirection - - var/list/possibleDirs = list() - - if(possibleDirsInt & direction) - for(var/i=0 , ibio-luminescent" : "bio-luminescent"]." - if(grown_seed.get_trait(TRAIT_FLOWERS)) - dat += "
It has [grown_seed.get_trait(TRAIT_FLOWER_COLOUR) ? "flowers" : "flowers"]." if(grown_seed.get_trait(TRAIT_PRODUCES_POWER)) dat += "
The fruit will function as a battery if prepared appropriately." @@ -366,8 +364,8 @@ /obj/item/weapon/scythe/afterattack(atom/A, mob/user as mob, proximity) if(!proximity) return - if(istype(A, /obj/effect/plantsegment)) - for(var/obj/effect/plantsegment/B in orange(A,1)) + if(istype(A, /obj/effect/plant)) + for(var/obj/effect/plant/B in orange(A,1)) if(prob(80)) - del B + B.die_off(1) del A \ No newline at end of file diff --git a/code/modules/hydroponics/hydro_tray.dm b/code/modules/hydroponics/hydro_tray.dm index 78b12378e0..e8414b59da 100644 --- a/code/modules/hydroponics/hydro_tray.dm +++ b/code/modules/hydroponics/hydro_tray.dm @@ -139,6 +139,9 @@ nymph.visible_message("[nymph] rolls around in [src] for a bit.","You roll around in [src] for a bit.") return +/obj/machinery/portable_atmospherics/hydroponics/proc/can_label() + return 1 + /obj/machinery/portable_atmospherics/hydroponics/New() ..() temp_chem_holder = new() @@ -629,20 +632,12 @@ return user << "You plant the [S.seed.seed_name] [S.seed.seed_noun]." - - if(S.seed.get_trait(TRAIT_SPREAD) == 2) - msg_admin_attack("[key_name(user)] has planted a spreading vine packet.") - var/obj/effect/plant_controller/PC = new(get_turf(src)) - if(PC) - PC.seed = S.seed - else - seed = S.seed //Grab the seed datum. - dead = 0 - age = 1 - //Snowflakey, maybe move this to the seed datum - health = (istype(S, /obj/item/seeds/cutting) ? round(seed.get_trait(TRAIT_ENDURANCE)/rand(2,5)) : seed.get_trait(TRAIT_ENDURANCE)) - - lastcycle = world.time + seed = S.seed //Grab the seed datum. + dead = 0 + age = 1 + //Snowflakey, maybe move this to the seed datum + health = (istype(S, /obj/item/seeds/cutting) ? round(seed.get_trait(TRAIT_ENDURANCE)/rand(2,5)) : seed.get_trait(TRAIT_ENDURANCE)) + lastcycle = world.time del(O) @@ -798,10 +793,7 @@ mechanical = 0 /obj/machinery/portable_atmospherics/hydroponics/soil/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O, /obj/item/weapon/shovel)) - user << "You clear up [src]!" - del(src) - else if(istype(O,/obj/item/weapon/shovel) || istype(O,/obj/item/weapon/tank)) + if(istype(O,/obj/item/weapon/tank)) return else ..() @@ -810,6 +802,9 @@ ..() verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/close_lid +/obj/machinery/portable_atmospherics/hydroponics/soil/can_label() + return 0 + /obj/machinery/portable_atmospherics/hydroponics/soil/CanPass() return 1 @@ -840,10 +835,21 @@ if(!seed) del(src) +/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/die() + del(src) + /obj/machinery/portable_atmospherics/hydroponics/soil/invisible/process() if(!seed) del(src) return else if(name=="plant") name = seed.display_name + ..() + +/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/Del() + // Check if we're masking a decal that needs to be visible again. + for(var/obj/effect/plant/plant in get_turf(src)) + if(plant.invisibility == INVISIBILITY_MAXIMUM) + plant.invisibility = initial(plant.invisibility) + plant.die_off() ..() \ No newline at end of file diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index b0fe9784f1..fd453f7f22 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -2,6 +2,27 @@ var/global/list/plant_sprites = list() // List of all harvested product sprites. var/global/list/plant_product_sprites = list() // List of all growth sprites plus number of growth stages. +// Proc for creating a random seed type. +/proc/create_random_seed(var/survive_on_station) + var/datum/seed/seed = new() + seed.randomize() + seed.uid = seed_types.len + 1 + seed.name = "[seed.uid]" + seed_types[seed.name] = seed + + if(survive_on_station) + if(seed.consume_gasses) + seed.consume_gasses["phoron"] = null + seed.consume_gasses["carbon_dioxide"] = null + seed.set_trait(TRAIT_IDEAL_HEAT,293) + seed.set_trait(TRAIT_HEAT_TOLERANCE,20) + seed.set_trait(TRAIT_IDEAL_LIGHT,8) + seed.set_trait(TRAIT_LIGHT_TOLERANCE,5) + seed.set_trait(TRAIT_LOWKPA_TOLERANCE,25) + seed.set_trait(TRAIT_HIGHKPA_TOLERANCE,200) + + return seed + // Debug for testing seed genes. /client/proc/show_plant_genes() set category = "Debug" @@ -58,7 +79,7 @@ proc/populate_seed_list() //Might as well mask the gene types while we're at it. var/list/used_masks = list() - var/list/plant_traits = ALL_TRAITS + var/list/plant_traits = ALL_GENES while(plant_traits && plant_traits.len) var/gene_tag = pick(plant_traits) var/gene_mask = "[num2hex(rand(0,255))]" @@ -94,6 +115,48 @@ proc/populate_seed_list() var/list/exude_gasses // The plant will exude these gasses during its life. var/splat_type = /obj/effect/decal/cleanable/fruit_smudge // Graffiti decal. +/datum/seed/New() + + set_trait(TRAIT_IMMUTABLE, 0) // If set, plant will never mutate. If -1, plant is highly mutable. + set_trait(TRAIT_HARVEST_REPEAT, 0) // If 1, this plant will fruit repeatedly. + set_trait(TRAIT_PRODUCES_POWER, 0) // Can be used to make a battery. + set_trait(TRAIT_JUICY, 0) // When thrown, causes a splatter decal. + set_trait(TRAIT_EXPLOSIVE, 0) // When thrown, acts as a grenade. + set_trait(TRAIT_CARNIVOROUS, 0) // 0 = none, 1 = eat pests in tray, 2 = eat living things (when a vine). + set_trait(TRAIT_PARASITE, 0) // 0 = no, 1 = gain health from weed level. + set_trait(TRAIT_STINGS, 0) // Can cause damage/inject reagents when thrown or handled. + set_trait(TRAIT_YIELD, 0) // Amount of product. + set_trait(TRAIT_SPREAD, 0) // 0 limits plant to tray, 1 = creepers, 2 = vines. + set_trait(TRAIT_MATURATION, 0) // Time taken before the plant is mature. + set_trait(TRAIT_PRODUCTION, 0) // Time before harvesting can be undertaken again. + set_trait(TRAIT_TELEPORTING, 0) // Uses the bluespace tomato effect. + set_trait(TRAIT_BIOLUM, 0) // Plant is bioluminescent. + set_trait(TRAIT_ALTER_TEMP, 0) // If set, the plant will periodically alter local temp by this amount. + set_trait(TRAIT_PRODUCT_ICON, 0) // Icon to use for fruit coming from this plant. + set_trait(TRAIT_PLANT_ICON, 0) // Icon to use for the plant growing in the tray. + set_trait(TRAIT_PRODUCT_COLOUR, 0) // Colour to apply to product icon. + set_trait(TRAIT_BIOLUM_COLOUR, 0) // The colour of the plant's radiance. + set_trait(TRAIT_POTENCY, 1) // General purpose plant strength value. + set_trait(TRAIT_REQUIRES_NUTRIENTS, 1) // The plant can starve. + set_trait(TRAIT_REQUIRES_WATER, 1) // The plant can become dehydrated. + set_trait(TRAIT_WATER_CONSUMPTION, 3) // Plant drinks this much per tick. + set_trait(TRAIT_LIGHT_TOLERANCE, 5) // Departure from ideal that is survivable. + set_trait(TRAIT_TOXINS_TOLERANCE, 5) // Resistance to poison. + set_trait(TRAIT_PEST_TOLERANCE, 5) // Threshold for pests to impact health. + set_trait(TRAIT_WEED_TOLERANCE, 5) // Threshold for weeds to impact health. + set_trait(TRAIT_IDEAL_LIGHT, 8) // Preferred light level in luminosity. + set_trait(TRAIT_HEAT_TOLERANCE, 20) // Departure from ideal that is survivable. + set_trait(TRAIT_LOWKPA_TOLERANCE, 25) // Low pressure capacity. + set_trait(TRAIT_ENDURANCE, 100) // Maximum plant HP when growing. + set_trait(TRAIT_HIGHKPA_TOLERANCE, 200) // High pressure capacity. + set_trait(TRAIT_IDEAL_HEAT, 293) // Preferred temperature in Kelvin. + set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25) // Plant eats this much per tick. + set_trait(TRAIT_PLANT_COLOUR, "#6EF86A") // Colour of the plant icon. + + spawn(5) + sleep(-1) + update_growth_stages() + /datum/seed/proc/get_trait(var/trait) return traits["[trait]"] @@ -198,43 +261,14 @@ proc/populate_seed_list() continue // Check for windows. var/no_los + var/turf/last_turf = origin_turf for(var/turf/target_turf in getline(origin_turf,neighbor)) - if(target_turf.density) + if(!last_turf.Enter(target_turf) || target_turf.density) no_los = 1 break - - if(!no_los) - var/los_dir = get_dir(neighbor,origin_turf) - var/list/blocked = list() - for(var/obj/machinery/door/D in neighbor.contents) - if(istype(D,/obj/machinery/door/window)) - blocked |= D.dir - else - if(D.density) - no_los = 1 - break - for(var/obj/structure/window/W in neighbor.contents) - if(W.is_fulltile()) - no_los = 1 - break - blocked |= W.dir - if(!no_los) - switch(los_dir) - if(NORTHEAST) - if((NORTH in blocked) && (EAST in blocked)) - no_los = 1 - if(SOUTHEAST) - if((SOUTH in blocked) && (EAST in blocked)) - no_los = 1 - if(NORTHWEST) - if((NORTH in blocked) && (WEST in blocked)) - no_los = 1 - if(SOUTHWEST) - if((SOUTH in blocked) && (WEST in blocked)) - no_los = 1 - else - if(los_dir in blocked) - no_los = 1 + last_turf = target_turf + if(!no_los && !origin_turf.Enter(neighbor)) + no_los = 1 if(no_los) closed_turfs |= neighbor continue @@ -348,8 +382,8 @@ proc/populate_seed_list() set_trait(TRAIT_POTENCY,rand(5,30),200,0) set_trait(TRAIT_PRODUCT_ICON,pick(plant_product_sprites)) set_trait(TRAIT_PLANT_ICON,pick(plant_sprites)) - set_trait(TRAIT_PLANT_COLOUR,"#[pick(rainbow)]") - set_trait(TRAIT_PRODUCT_COLOUR,"#[pick(rainbow)]") + set_trait(TRAIT_PLANT_COLOUR,"#[get_random_colour(0,75,190)]") + set_trait(TRAIT_PRODUCT_COLOUR,"#[get_random_colour(0,75,190)]") update_growth_stages() if(prob(20)) @@ -478,7 +512,7 @@ proc/populate_seed_list() if(prob(5)) set_trait(TRAIT_BIOLUM,1) - set_trait(TRAIT_BIOLUM_COLOUR,"#[pick(rainbow)]") + set_trait(TRAIT_BIOLUM_COLOUR,"#[get_random_colour(0,75,190)]") set_trait(TRAIT_ENDURANCE,rand(60,100)) set_trait(TRAIT_YIELD,rand(3,15)) @@ -500,7 +534,7 @@ proc/populate_seed_list() //This looks like shit, but it's a lot easier to read/change this way. var/total_mutations = rand(1,1+degree) for(var/i = 0;i\The [display_name] withers rapidly!") @@ -550,21 +584,11 @@ proc/populate_seed_list() if(get_trait(TRAIT_BIOLUM)) source_turf.visible_message("\The [display_name] begins to glow!") if(prob(degree*2)) - set_trait(TRAIT_BIOLUM_COLOUR,"#[pick(rainbow)]") + set_trait(TRAIT_BIOLUM_COLOUR,"#[get_random_colour(0,75,190)]") source_turf.visible_message("\The [display_name]'s glow changes colour!") else source_turf.visible_message("\The [display_name]'s glow dims...") if(11) - if(prob(degree*2)) - set_trait(TRAIT_FLOWERS,!get_trait(TRAIT_FLOWERS)) - if(get_trait(TRAIT_FLOWERS)) - source_turf.visible_message("\The [display_name] sprouts a bevy of flowers!") - if(prob(degree*2)) - set_trait(TRAIT_FLOWER_COLOUR,"#[pick(rainbow)]") - source_turf.visible_message("\The [display_name]'s flowers changes colour!") - else - source_turf.visible_message("\The [display_name]'s flowers wither and fall off.") - if(12) set_trait(TRAIT_TELEPORTING,1) return @@ -640,8 +664,8 @@ proc/populate_seed_list() traits_to_copy = list(TRAIT_TOXINS_TOLERANCE,TRAIT_PEST_TOLERANCE,TRAIT_WEED_TOLERANCE) if(GENE_VIGOUR) traits_to_copy = list(TRAIT_ENDURANCE,TRAIT_YIELD,TRAIT_SPREAD,TRAIT_MATURATION,TRAIT_PRODUCTION,TRAIT_TELEPORTING) - if(GENE_FLOWERS) - traits_to_copy = list(TRAIT_PLANT_COLOUR,TRAIT_PRODUCT_COLOUR,TRAIT_BIOLUM,TRAIT_BIOLUM_COLOUR,TRAIT_FLOWERS,TRAIT_FLOWER_ICON,TRAIT_FLOWER_COLOUR) + if(GENE_PIGMENT) + traits_to_copy = list(TRAIT_PLANT_COLOUR,TRAIT_PRODUCT_COLOUR,TRAIT_BIOLUM,TRAIT_BIOLUM_COLOUR) for(var/trait in traits_to_copy) P.values["[trait]"] = get_trait(trait) @@ -748,52 +772,6 @@ proc/populate_seed_list() else growth_stages = 0 -/datum/seed/New() - - set_trait(TRAIT_IMMUTABLE, 0) // If set, plant will never mutate. If -1, plant is highly mutable. - set_trait(TRAIT_HARVEST_REPEAT, 0) // If 1, this plant will fruit repeatedly. - set_trait(TRAIT_PRODUCES_POWER, 0) // Can be used to make a battery. - set_trait(TRAIT_JUICY, 0) // When thrown, causes a splatter decal. - set_trait(TRAIT_EXPLOSIVE, 0) // When thrown, acts as a grenade. - set_trait(TRAIT_CARNIVOROUS, 0) // 0 = none, 1 = eat pests in tray, 2 = eat living things (when a vine). - set_trait(TRAIT_PARASITE, 0) // 0 = no, 1 = gain health from weed level. - set_trait(TRAIT_STINGS, 0) // Can cause damage/inject reagents when thrown or handled. - set_trait(TRAIT_YIELD, 0) // Amount of product. - set_trait(TRAIT_SPREAD, 0) // 0 limits plant to tray, 1 = creepers, 2 = vines. - set_trait(TRAIT_MATURATION, 0) // Time taken before the plant is mature. - set_trait(TRAIT_PRODUCTION, 0) // Time before harvesting can be undertaken again. - set_trait(TRAIT_TELEPORTING, 0) // Uses the bluespace tomato effect. - set_trait(TRAIT_BIOLUM, 0) // Plant is bioluminescent. - set_trait(TRAIT_FLOWERS, 0) // Plant has a flower overlay. - set_trait(TRAIT_ALTER_TEMP, 0) // If set, the plant will periodically alter local temp by this amount. - set_trait(TRAIT_PRODUCT_ICON, 0) // Icon to use for fruit coming from this plant. - set_trait(TRAIT_PLANT_ICON, 0) // Icon to use for the plant growing in the tray. - set_trait(TRAIT_PRODUCT_COLOUR, 0) // Colour to apply to product icon. - set_trait(TRAIT_BIOLUM_COLOUR, 0) // The colour of the plant's radiance. - set_trait(TRAIT_FLOWER_COLOUR, 0) // Which colour to use. - set_trait(TRAIT_POTENCY, 1) // General purpose plant strength value. - set_trait(TRAIT_REQUIRES_NUTRIENTS, 1) // The plant can starve. - set_trait(TRAIT_REQUIRES_WATER, 1) // The plant can become dehydrated. - set_trait(TRAIT_WATER_CONSUMPTION, 3) // Plant drinks this much per tick. - set_trait(TRAIT_LIGHT_TOLERANCE, 5) // Departure from ideal that is survivable. - set_trait(TRAIT_TOXINS_TOLERANCE, 5) // Resistance to poison. - set_trait(TRAIT_PEST_TOLERANCE, 5) // Threshold for pests to impact health. - set_trait(TRAIT_WEED_TOLERANCE, 5) // Threshold for weeds to impact health. - set_trait(TRAIT_IDEAL_LIGHT, 8) // Preferred light level in luminosity. - set_trait(TRAIT_HEAT_TOLERANCE, 20) // Departure from ideal that is survivable. - set_trait(TRAIT_LOWKPA_TOLERANCE, 25) // Low pressure capacity. - set_trait(TRAIT_ENDURANCE, 100) // Maximum plant HP when growing. - set_trait(TRAIT_HIGHKPA_TOLERANCE, 200) // High pressure capacity. - set_trait(TRAIT_IDEAL_HEAT, 293) // Preferred temperature in Kelvin. - set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25) // Plant eats this much per tick. - set_trait(TRAIT_PLANT_COLOUR, "#6EF86A") // Colour of the plant icon. - set_trait(TRAIT_FLOWER_ICON, "vine_fruit") // Which overlay to use. - - spawn(5) - sleep(-1) - update_growth_stages() - - // Actual roundstart seed types after this point. // Chili plants/variants. /datum/seed/chili diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 2194bf97db..c8c1f7ee37 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -74,13 +74,8 @@ var/global/list/plant_seed_sprites = list() seed_type = null /obj/item/seeds/random/New() - seed = new() - seed.randomize() - - seed.uid = seed_types.len + 1 - seed.name = "[seed.uid]" - seed_types[seed.name] = seed - + seed = create_random_seed() + seed_type = seed.name update_seed() /obj/item/seeds/replicapod diff --git a/code/modules/hydroponics/spread_plant.dm b/code/modules/hydroponics/spread_plant.dm index fdecb335aa..9130726789 100644 --- a/code/modules/hydroponics/spread_plant.dm +++ b/code/modules/hydroponics/spread_plant.dm @@ -1,4 +1,34 @@ #define DEFAULT_SEED "glowshroom" +#define VINE_GROWTH_STAGES 4 + +/proc/spacevine_infestation() + spawn() //to stop the secrets panel hanging + var/list/turf/simulated/floor/turfs = list() //list of all the empty floor turfs in the hallway areas + for(var/areapath in typesof(/area/hallway)) + var/area/A = locate(areapath) + for(var/area/B in A.related) + for(var/turf/simulated/floor/F in B.contents) + if(!F.contents.len) + turfs += F + + if(turfs.len) //Pick a turf to spawn at if we can + var/turf/simulated/floor/T = pick(turfs) + var/datum/seed/seed = create_random_seed(1) + seed.set_trait(TRAIT_SPREAD,2) // So it will function properly as vines. + seed.set_trait(TRAIT_POTENCY,rand(40,50)) // Guarantee a wide spread and powerful effects. + new /obj/effect/plant(T,seed) + message_admins("Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])") + +/obj/effect/dead_plant + anchored = 1 + opacity = 0 + density = 0 + +/obj/effect/dead_plant/attackby() + ..() + for(var/obj/effect/plant/neighbor in view(1,src)) + neighbor.hibernating = 0 + del(src) /obj/effect/plant name = "plant" @@ -7,16 +37,21 @@ density = 0 icon = 'icons/obj/hydroponics_growing.dmi' icon_state = "bush4-1" - layer = 2.1 + layer = 2 - var/health = 100 + var/health = 10 var/max_health = 100 + var/growth_threshold = 0 + var/growth_type = 0 + var/max_growth = 0 + var/list/children = list() var/obj/effect/plant/parent var/datum/seed/seed var/floor = 0 - var/spread_chance = 100 //40 - var/spread_into_adjacent = 100 //60 + var/spread_chance = 40 + var/spread_distance = 3 + var/spread_into_adjacent = 60 var/evolve_chance = 2 var/last_tick = 0 var/hibernating = 0 @@ -33,9 +68,31 @@ del(src) return + layer = rand(3,4) // Will display over pipes/machines at all times and mobs half the time. name = seed.display_name max_health = round(seed.get_trait(TRAIT_ENDURANCE)/2) - health = max_health + if(seed.get_trait(TRAIT_SPREAD)==2) + max_growth = VINE_GROWTH_STAGES + growth_threshold = round(max_health/VINE_GROWTH_STAGES) + icon = 'icons/obj/hydroponics_vines.dmi' + growth_type = 2 // Vines by default. + if(seed.get_trait(TRAIT_CARNIVOROUS) == 2) + growth_type = 1 // WOOOORMS. + else if(!(seed.seed_noun in list("seeds","pits"))) + if(seed.seed_noun == "nodes") + growth_type = 3 // Biomass + else + growth_type = 4 // Mold + else + max_growth = seed.growth_stages + growth_threshold = round(max_health/seed.growth_stages) + + if(max_growth > 2 && prob(50)) + max_growth-- //Ensure some variation in final sprite, makes the carpet of crap look less wonky. + + spread_into_adjacent = round(seed.get_trait(TRAIT_POTENCY)/2) + spread_distance = ((growth_type>0) ? round(spread_into_adjacent/2) : round(spread_into_adjacent/15)) + spread_chance = round(spread_into_adjacent/2) set_dir(calc_dir()) update_icon() @@ -44,14 +101,11 @@ /obj/effect/plant/update_icon() - // TODO: convert this to an icon cache. - icon_state = "[seed.get_trait(TRAIT_PLANT_ICON)]-[rand(1,max(1,seed.growth_stages-1))]" - color = seed.get_trait(TRAIT_PLANT_COLOUR) - if(!floor) - // This should make the plant grow flush against the wall it's meant to be growing from. - pixel_y = -(rand(8,12)) + refresh_icon() + if(growth_type == 0 && !floor) src.transform = null var/matrix/M = matrix() + M.Translate(0,-(rand(12,14))) // should make the plant flush against the wall it's meant to be growing from. switch(dir) if(WEST) M.Turn(90) @@ -60,10 +114,12 @@ if(EAST) M.Turn(270) src.transform = M - + var/icon_colour = seed.get_trait(TRAIT_PLANT_COLOUR) + if(icon_colour) + color = icon_colour // Apply colour and light from seed datum. if(seed.get_trait(TRAIT_BIOLUM)) - SetLuminosity(1+round(seed.get_trait(TRAIT_POTENCY)/10)) + SetLuminosity(1+round(seed.get_trait(TRAIT_POTENCY)/20)) if(seed.get_trait(TRAIT_BIOLUM_COLOUR)) l_color = seed.get_trait(TRAIT_BIOLUM_COLOUR) else @@ -72,26 +128,54 @@ else SetLuminosity(0) +/obj/effect/plant/proc/refresh_icon() + var/growth = min(max_growth,max(1,round(health/growth_threshold))) + if(growth_type > 0) + switch(growth_type) + if(1) + icon_state = "worms" + if(2) + icon_state = "vines-[growth]" + if(3) + icon_state = "mass-[growth]" + if(4) + icon_state = "mold-[growth]" + else + icon_state = "[seed.get_trait(TRAIT_PLANT_ICON)]-[growth]" + /obj/effect/plant/Del() processing_objects -= src ..() -/obj/effect/plant/examine() - ..() - usr << "Max dist from parent is [round(seed.get_trait(TRAIT_POTENCY)/15)]." - usr << "Current dist is [get_dist(get_root(),src)]." -/obj/effect/plant/proc/die_off() +/obj/effect/plant/proc/die_off(var/no_remains) + // Remove ourselves from our parent. + if(parent && parent.children) + parent.children -= src // Kill off any of our children (and add an added bonus, other plants in this area) for(var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/plant in get_turf(src)) plant.dead = 1 plant.update_icon() // Cause the plants around us to update. + if(children && children.len) + for(var/obj/effect/plant/child in children) + child.die_off() for(var/obj/effect/plant/neighbor in view(1,src)) neighbor.hibernating = 0 + if(!no_remains && !(locate(/obj/effect/dead_plant) in get_turf(src))) + var/obj/effect/dead_plant/plant_remains = new(get_turf(src)) + plant_remains.icon = src.icon + plant_remains.icon_state = src.icon_state del(src) +/obj/effect/plant/proc/get_dist_to_parent(var/current_count) + if(!parent) + return current_count + current_count++ + return parent.get_dist_to_parent(current_count) + /obj/effect/plant/process() + // Something is very wrong, kill ourselves. if(!seed) die_off() @@ -99,27 +183,35 @@ var/turf/simulated/T = get_turf(src) if(istype(T)) health -= seed.handle_environment(T, T.return_air(),1) + if(health < max_health) + health += rand(3,5) + if(health > max_health) + health = max_health + refresh_icon() - // Hibernating or too far from parent, no chance of spreading. - if(hibernating || (parent && (get_dist(get_root(),src) > round(seed.get_trait(TRAIT_POTENCY)/15)))) + // Damaged, young hibernating or too far from parent, no chance of spreading. + if(health < (max_health/2) || hibernating || (parent && (get_dist_to_parent(0) > spread_distance))) return // Count our neighbors and possible locations for spreading. var/list/possible_locs = list() var/count = 0 for(var/turf/simulated/floor/floor in view(1,src)) - if(!floor.Adjacent(src) || floor.density || (locate(/obj/effect/plant) in floor.contents)) + if((locate(/obj/effect/dead_plant) in floor.contents) || !floor.Enter(src) || floor.density) + continue + if(locate(/obj/effect/plant) in floor.contents) count++ continue possible_locs |= floor - //Entirely surrounded, spawn an actual plant. - if(count>=8) - hibernating = 1 // Suspend processing for now. + //Entirely surrounded, try to spawn an actual plant. + if(count>=8 && prob(5)) if(!(locate(/obj/machinery/portable_atmospherics/hydroponics/soil/invisible) in T.contents)) var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/new_plant = new(T,seed) - new_plant.age = seed.get_trait(TRAIT_MATURATION) + new_plant.age = seed.get_trait(TRAIT_MATURATION)-5 new_plant.update_icon() + if(growth_type==0) //Vines do not become invisible. + invisibility = INVISIBILITY_MAXIMUM if(prob(spread_chance)) for(var/i=1,i<=seed.get_trait(TRAIT_YIELD),i++) @@ -130,6 +222,14 @@ possible_locs -= target_turf var/obj/effect/plant/child = new(target_turf, seed) child.parent = get_root() + child.parent.children |= child + + /* + var/need_hibernate = 0 + if(need_hibernate) + hibernating = 1 + world << "[src] at [x],[y] is hibernating" + */ /obj/effect/plant/proc/get_root() if(parent) @@ -188,19 +288,19 @@ /obj/effect/plant/ex_act(severity) switch(severity) if(1.0) - del(src) + die_off() return if(2.0) if (prob(50)) - del(src) + die_off() return if(3.0) if (prob(5)) - del(src) + die_off() return else return /obj/effect/plant/proc/check_health() if(health <= 0) - del(src) \ No newline at end of file + die_off() \ No newline at end of file diff --git a/code/modules/hydroponics/spread_vine.dm b/code/modules/hydroponics/spread_vine.dm deleted file mode 100644 index c06ca4fba5..0000000000 --- a/code/modules/hydroponics/spread_vine.dm +++ /dev/null @@ -1,355 +0,0 @@ -// SPACE VINES (Note that this code is very similar to Biomass code) -/obj/effect/plantsegment - name = "space vines" - desc = "An extremely expansionistic species of vine." - icon = 'icons/effects/spacevines.dmi' - icon_state = "Light1" - anchored = 1 - density = 0 - layer = 5 - pass_flags = PASSTABLE | PASSGRILLE - - // Vars used by vines with seed data. - var/age = 0 - var/lastproduce = 0 - var/harvest = 0 - var/list/chems - var/plant_damage_noun = "Thorns" - var/limited_growth = 0 - - // Life vars/ - var/energy = 0 - var/obj/effect/plant_controller/master = null - var/mob/living/buckled_mob - var/datum/seed/seed - -/obj/effect/plantsegment/New() - return - -/obj/effect/plantsegment/Del() - if(master) - master.vines -= src - master.growth_queue -= src - ..() - -/obj/effect/plantsegment/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (!W || !user || !W.type) return - switch(W.type) - if(/obj/item/weapon/circular_saw) del src - if(/obj/item/weapon/kitchen/utensil/knife) del src - if(/obj/item/weapon/scalpel) del src - if(/obj/item/weapon/twohanded/fireaxe) del src - if(/obj/item/weapon/hatchet) del src - if(/obj/item/weapon/melee/energy) del src - if(/obj/item/weapon/pickaxe/plasmacutter) del src - - // Less effective weapons - if(/obj/item/weapon/wirecutters) - if(prob(25)) del src - if(/obj/item/weapon/shard) - if(prob(25)) del src - - // Weapons with subtypes - else - if(istype(W, /obj/item/weapon/melee/energy/sword)) del src - else if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if(WT.remove_fuel(0, user)) del src - else - manual_unbuckle(user) - return - // Plant-b-gone damage is handled in its entry in chemistry-reagents.dm - ..() - - -/obj/effect/plantsegment/attack_hand(mob/user as mob) - - if(user.a_intent == "help" && seed && harvest) - seed.harvest(user,1) - harvest = 0 - lastproduce = age - update() - return - - manual_unbuckle(user) - -/obj/effect/plantsegment/proc/unbuckle() - if(buckled_mob) - if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt - buckled_mob.buckled = null - buckled_mob.anchored = initial(buckled_mob.anchored) - buckled_mob.update_canmove() - buckled_mob = null - return - -/obj/effect/plantsegment/proc/manual_unbuckle(mob/user as mob) - if(buckled_mob) - if(prob(seed ? min(max(0,100 - seed.get_trait(TRAIT_POTENCY)),100) : 50)) - if(buckled_mob.buckled == src) - if(buckled_mob != user) - buckled_mob.visible_message(\ - "[user.name] frees [buckled_mob.name] from [src].",\ - "[user.name] frees you from [src].",\ - "You hear shredding and ripping.") - else - buckled_mob.visible_message(\ - "[buckled_mob.name] struggles free of [src].",\ - "You untangle [src] from around yourself.",\ - "You hear shredding and ripping.") - unbuckle() - else - var/text = pick("rips","tears","pulls") - user.visible_message(\ - "[user.name] [text] at [src].",\ - "You [text] at [src].",\ - "You hear shredding and ripping.") - return - -/obj/effect/plantsegment/proc/grow() - - if(!energy) - src.icon_state = pick("Med1", "Med2", "Med3") - energy = 1 - - //Low-lying creepers do not block vision or grow thickly. - if(limited_growth) - energy = 2 - return - - src.opacity = 1 - layer = 5 - else if(!limited_growth) - src.icon_state = pick("Hvy1", "Hvy2", "Hvy3") - energy = 2 - -/obj/effect/plantsegment/proc/entangle_mob() - - if(limited_growth) - return - - if(prob(seed ? seed.get_trait(TRAIT_POTENCY) : 25)) - - if(!buckled_mob) - var/mob/living/carbon/V = locate() in src.loc - if(V && (V.stat != DEAD) && (V.buckled != src)) // If mob exists and is not dead or captured. - V.buckled = src - V.loc = src.loc - V.update_canmove() - src.buckled_mob = V - V << "The vines [pick("wind", "tangle", "tighten")] around you!" - - // FEED ME, SEYMOUR. - if(buckled_mob && seed && (buckled_mob.stat != DEAD)) //Don't bother with a dead mob. - seed.do_thorns(buckled_mob,src) - seed.do_sting(buckled_mob,src) - -/obj/effect/plantsegment/proc/update() - if(!seed) return - - // Update bioluminescence. - if(seed.get_trait(TRAIT_BIOLUM)) - SetLuminosity(1+round(seed.get_trait(TRAIT_POTENCY)/10)) - if(seed.get_trait(TRAIT_BIOLUM_COLOUR)) - l_color = seed.get_trait(TRAIT_BIOLUM_COLOUR) - else - l_color = null - return - else - SetLuminosity(0) - - // Update flower/product overlay. - overlays.Cut() - if(age >= seed.get_trait(TRAIT_MATURATION)) - if(prob(20) && seed.products && seed.products.len && !harvest && ((age-lastproduce) > seed.get_trait(TRAIT_PRODUCTION))) - harvest = 1 - lastproduce = age - - if(harvest) - var/image/fruit_overlay = image('icons/obj/hydroponics_vines.dmi',"") - if(seed.get_trait(TRAIT_PRODUCT_COLOUR)) - fruit_overlay.color = seed.get_trait(TRAIT_PRODUCT_COLOUR) - overlays += fruit_overlay - - if(seed.get_trait(TRAIT_FLOWERS)) - var/image/flower_overlay = image('icons/obj/hydroponics_vines.dmi',"[seed.get_trait(TRAIT_FLOWER_ICON)]") - if(seed.get_trait(TRAIT_FLOWER_COLOUR)) - flower_overlay.color = seed.get_trait(TRAIT_FLOWER_COLOUR) - overlays += flower_overlay - -/obj/effect/plantsegment/proc/spread() - var/direction = pick(cardinal) - var/step = get_step(src,direction) - if(istype(step,/turf/simulated/floor)) - var/turf/simulated/floor/F = step - if(!locate(/obj/effect/plantsegment,F)) - if(F.Enter(src)) - if(master) - master.spawn_piece( F ) - -// Explosion damage. -/obj/effect/plantsegment/ex_act(severity) - switch(severity) - if(1.0) - die() - return - if(2.0) - if (prob(90)) - die() - return - if(3.0) - if (prob(50)) - die() - return - return - -// Hotspots kill vines. -/obj/effect/plantsegment/fire_act(null, temp, volume) - del src - -/obj/effect/plantsegment/proc/die() - if(seed && harvest && rand(5)) - seed.harvest(src,1) - del(src) - -/obj/effect/plantsegment/proc/life() - - if(!seed) - return - - if(prob(30)) - age++ - - var/turf/T = loc - var/datum/gas_mixture/environment - if(T) environment = T.return_air() - - if(!environment) - return - - var/pressure = environment.return_pressure() - if(pressure < seed.get_trait(TRAIT_LOWKPA_TOLERANCE) || pressure > seed.get_trait(TRAIT_HIGHKPA_TOLERANCE)) - die() - return - - if(abs(environment.temperature - seed.get_trait(TRAIT_IDEAL_HEAT)) > seed.get_trait(TRAIT_HEAT_TOLERANCE)) - die() - return - - var/area/A = T.loc - if(A) - var/light_available - if(A.lighting_use_dynamic) - light_available = max(0,min(10,T.lighting_lumcount)-5) - else - light_available = 5 - if(abs(light_available - seed.get_trait(TRAIT_IDEAL_LIGHT)) > seed.get_trait(TRAIT_LIGHT_TOLERANCE)) - die() - return - -/obj/effect/plant_controller - - //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. - - var/list/obj/effect/plantsegment/vines = list() - var/list/growth_queue = list() - var/reached_collapse_size - var/reached_slowdown_size - var/datum/seed/seed - - var/collapse_limit = 250 - var/slowdown_limit = 30 - var/limited_growth = 0 - -/obj/effect/plant_controller/creeper - collapse_limit = 6 - slowdown_limit = 3 - limited_growth = 1 - -/obj/effect/plant_controller/New() - if(!istype(src.loc,/turf/simulated/floor)) - del(src) - - spawn(0) - spawn_piece(src.loc) - - processing_objects.Add(src) - -/obj/effect/plant_controller/Del() - processing_objects.Remove(src) - ..() - -/obj/effect/plant_controller/proc/spawn_piece(var/turf/location) - var/obj/effect/plantsegment/SV = new(location) - SV.limited_growth = src.limited_growth - growth_queue += SV - vines += SV - SV.master = src - if(seed) - SV.seed = seed - SV.name = "[seed.seed_name] vines" - SV.update() - -/obj/effect/plant_controller/process() - - // Space vines exterminated. Remove the controller - if(!vines) - del(src) - return - - // Sanity check. - if(!growth_queue) - del(src) - return - - // Check if we're too big for our own good. - if(vines.len >= (seed?seed.get_trait(TRAIT_POTENCY)*collapse_limit : 250)&&!reached_collapse_size) - reached_collapse_size = 1 - if(vines.len >= (seed?seed.get_trait(TRAIT_POTENCY)*slowdown_limit : 30)&&!reached_slowdown_size) - reached_slowdown_size = 1 - - var/length = 0 - if(reached_collapse_size) - length = 0 - else if(reached_slowdown_size) - if(prob(seed ? seed.get_trait(TRAIT_POTENCY) : 25)) - length = 1 - else - length = 0 - else - length = 1 - - length = min(30, max(length, vines.len/5)) - - // Update as many pieces of vine as we're allowed to. - // Append updated vines to the end of the growth queue. - var/i = 0 - var/list/obj/effect/plantsegment/queue_end = list() - for(var/obj/effect/plantsegment/SV in growth_queue) - i++ - queue_end += SV - growth_queue -= SV - - SV.life() - - if(!SV) continue - - if(SV.energy < 2) //If tile isn't fully grown - var/chance - if(seed) - chance = limited_growth ? round(seed.get_trait(TRAIT_POTENCY)/2,1) : seed.get_trait(TRAIT_POTENCY) - else - chance = 20 - - if(prob(chance)) - SV.grow() - - else if(!seed || !limited_growth) //If tile is fully grown and not just a creeper. - SV.entangle_mob() - - SV.update() - SV.spread() - if(i >= length) - break - - growth_queue = growth_queue + queue_end \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index b40e6fb819..4442e8caf0 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -45,17 +45,15 @@ if(udder && prob(5)) udder.add_reagent("milk", rand(5, 10)) - if(locate(/obj/effect/plantsegment) in loc) - var/obj/effect/plantsegment/SV = locate(/obj/effect/plantsegment) in loc - del(SV) - if(prob(10)) - say("Nom") + if(locate(/obj/effect/plant) in loc) + var/obj/effect/plant/SV = locate() in loc + SV.die_off(1) if(!pulledby) for(var/direction in shuffle(list(1,2,4,8,5,6,9,10))) var/step = get_step(src, direction) if(step) - if(locate(/obj/effect/plantsegment) in step) + if(locate(/obj/effect/plant) in step) Move(step) /mob/living/simple_animal/hostile/retaliate/goat/Retaliate() @@ -65,11 +63,8 @@ /mob/living/simple_animal/hostile/retaliate/goat/Move() ..() if(!stat) - if(locate(/obj/effect/plantsegment) in loc) - var/obj/effect/plantsegment/SV = locate(/obj/effect/plantsegment) in loc - del(SV) - if(prob(10)) - say("Nom") + for(var/obj/effect/plant/SV in loc) + SV.die_off(1) /mob/living/simple_animal/hostile/retaliate/goat/attackby(var/obj/item/O as obj, var/mob/user as mob) var/obj/item/weapon/reagent_containers/glass/G = O diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 4f2135be98..a34d6e4d7c 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1846,8 +1846,10 @@ datum alien_weeds.healthcheck() else if(istype(O,/obj/effect/plant)) //even a small amount is enough to kill it del(O) - else if(istype(O,/obj/effect/plantsegment)) - if(prob(50)) del(O) //Kills kudzu too. + else if(istype(O,/obj/effect/plant)) + if(prob(50)) + var/obj/effect/plant/plant = O + plant.die_off() else if(istype(O,/obj/machinery/portable_atmospherics/hydroponics)) var/obj/machinery/portable_atmospherics/hydroponics/tray = O diff --git a/icons/obj/biomass.dmi b/icons/obj/biomass.dmi deleted file mode 100644 index ffb133f7682c0ba4749e93bcdcdf9332099c128e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7246 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 Npe(O0S1Dr|_CNP{CHVjV diff --git a/icons/obj/magic.dmi b/icons/obj/magic.dmi index 141b2df3f816e966912aaa0f476fd0147e18493e..f92243d6bc1afce4da6b4551974c8c64ccc1a4e6 100644 GIT binary patch delta 4093 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 IM6N<$f(Cc=_y7O^ diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi index b659bdc23ec64efbd2ac790c1f16503d0d7e2188..1d6bad4c507774f871c1d52ef47fbc4999fe2f32 100644 GIT binary patch literal 12565 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 literal 9118 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 YAa~s3^2w}(%hzx8v