mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-12 03:02:54 +00:00
New machines, adjusted Cael's seeds, rewrote space vines.
This commit is contained in:
@@ -5,26 +5,39 @@
|
||||
/obj/item/weapon/grown // Grown weapons
|
||||
name = "grown_weapon"
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
var/seed = ""
|
||||
var/plantname = ""
|
||||
var/productname = ""
|
||||
var/species = ""
|
||||
var/lifespan = 20
|
||||
var/endurance = 15
|
||||
var/maturation = 7
|
||||
var/production = 7
|
||||
var/yield = 2
|
||||
var/plantname
|
||||
var/potency = 1
|
||||
var/plant_type = 0
|
||||
New()
|
||||
|
||||
/obj/item/weapon/grown/New()
|
||||
|
||||
..()
|
||||
|
||||
var/datum/reagents/R = new/datum/reagents(50)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
|
||||
//Handle some post-spawn var stuff.
|
||||
spawn(1)
|
||||
// Fill the object up with the appropriate reagents.
|
||||
if(!isnull(plantname))
|
||||
var/datum/seed/S = seed_types[plantname]
|
||||
if(!S || !S.chems)
|
||||
return
|
||||
|
||||
potency = S.potency
|
||||
|
||||
for(var/rid in S.chems)
|
||||
var/list/reagent_data = S.chems[rid]
|
||||
var/rtotal = reagent_data[1]
|
||||
if(reagent_data.len > 1 && potency > 0)
|
||||
rtotal += round(potency/reagent_data[2])
|
||||
reagents.add_reagent(rid,max(1,rtotal))
|
||||
|
||||
/obj/item/weapon/grown/proc/changePotency(newValue) //-QualityVan
|
||||
potency = newValue
|
||||
|
||||
/obj/item/weapon/grown/log
|
||||
name = "towercap"
|
||||
name = "tower-cap log"
|
||||
desc = "It's better than bad, it's good!"
|
||||
icon = 'icons/obj/harvest.dmi'
|
||||
@@ -35,9 +48,7 @@
|
||||
w_class = 3.0
|
||||
throw_speed = 3
|
||||
throw_range = 3
|
||||
plant_type = 2
|
||||
origin_tech = "materials=1"
|
||||
seed = "/obj/item/seeds/towermycelium"
|
||||
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
@@ -55,8 +66,8 @@
|
||||
del(src)
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/grown/sunflower // FLOWER POWER!
|
||||
plantname = "sunflowers"
|
||||
name = "sunflower"
|
||||
desc = "It's beautiful! A certain person might beat you to death if you trample these."
|
||||
icon = 'icons/obj/harvest.dmi'
|
||||
@@ -68,40 +79,13 @@
|
||||
w_class = 1.0
|
||||
throw_speed = 1
|
||||
throw_range = 3
|
||||
plant_type = 1
|
||||
seed = "/obj/item/seeds/sunflower"
|
||||
|
||||
|
||||
/obj/item/weapon/grown/sunflower/attack(mob/M as mob, mob/user as mob)
|
||||
M << "<font color='green'><b> [user] smacks you with a sunflower!</font><font color='yellow'><b>FLOWER POWER<b></font>"
|
||||
user << "<font color='green'> Your sunflower's </font><font color='yellow'><b>FLOWER POWER</b></font><font color='green'> strikes [M]</font>"
|
||||
|
||||
/*
|
||||
/obj/item/weapon/grown/gibtomato
|
||||
desc = "A plump tomato."
|
||||
icon = 'icons/obj/harvest.dmi'
|
||||
name = "Gib Tomato"
|
||||
icon_state = "gibtomato"
|
||||
damtype = "fire"
|
||||
force = 0
|
||||
flags = TABLEPASS
|
||||
throwforce = 1
|
||||
w_class = 2.0
|
||||
throw_speed = 1
|
||||
throw_range = 3
|
||||
plant_type = 1
|
||||
seed = "/obj/item/seeds/gibtomato"
|
||||
New()
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/weapon/grown/gibtomato/New()
|
||||
..()
|
||||
src.gibs = new /obj/effect/gibspawner/human(get_turf(src))
|
||||
src.gibs.attach(src)
|
||||
src.smoke.set_up(10, 0, usr.loc)
|
||||
*/
|
||||
/obj/item/weapon/grown/nettle // -- Skie
|
||||
plantname = "nettle"
|
||||
desc = "It's probably <B>not</B> wise to touch it with bare hands..."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
name = "nettle"
|
||||
@@ -113,17 +97,12 @@
|
||||
w_class = 2.0
|
||||
throw_speed = 1
|
||||
throw_range = 3
|
||||
plant_type = 1
|
||||
origin_tech = "combat=1"
|
||||
seed = "/obj/item/seeds/nettleseed"
|
||||
New()
|
||||
..()
|
||||
spawn(5) //So potency can be set in the proc that creates these crops
|
||||
reagents.add_reagent("nutriment", 1+round((potency / 50), 1))
|
||||
reagents.add_reagent("sacid", round(potency, 1))
|
||||
spawn(5)
|
||||
force = round((5+potency/5), 1)
|
||||
|
||||
|
||||
/obj/item/weapon/grown/nettle/pickup(mob/living/carbon/human/user as mob)
|
||||
if(!user.gloves)
|
||||
user << "\red The nettle burns your bare hand!"
|
||||
@@ -135,7 +114,6 @@
|
||||
else
|
||||
user.take_organ_damage(0,force)
|
||||
|
||||
|
||||
/obj/item/weapon/grown/nettle/afterattack(atom/A as mob|obj, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
if(force > 0)
|
||||
@@ -145,14 +123,12 @@
|
||||
usr << "All the leaves have fallen off the nettle from violent whacking."
|
||||
del(src)
|
||||
|
||||
|
||||
/obj/item/weapon/grown/nettle/changePotency(newValue) //-QualityVan
|
||||
potency = newValue
|
||||
force = round((5+potency/5), 1)
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/grown/deathnettle // -- Skie
|
||||
plantname = "deathnettle"
|
||||
desc = "The \red glowing \black nettle incites \red<B>rage</B>\black in you just from looking at it!"
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
name = "deathnettle"
|
||||
@@ -164,22 +140,17 @@
|
||||
w_class = 2.0
|
||||
throw_speed = 1
|
||||
throw_range = 3
|
||||
plant_type = 1
|
||||
seed = "/obj/item/seeds/deathnettleseed"
|
||||
origin_tech = "combat=3"
|
||||
attack_verb = list("stung")
|
||||
New()
|
||||
..()
|
||||
spawn(5) //So potency can be set in the proc that creates these crops
|
||||
reagents.add_reagent("nutriment", 1+round((potency / 50), 1))
|
||||
reagents.add_reagent("pacid", round(potency, 1))
|
||||
spawn(5)
|
||||
force = round((5+potency/2.5), 1)
|
||||
|
||||
suicide_act(mob/user)
|
||||
viewers(user) << "\red <b>[user] is eating some of the [src.name]! It looks like \he's trying to commit suicide.</b>"
|
||||
return (BRUTELOSS|TOXLOSS)
|
||||
|
||||
|
||||
/obj/item/weapon/grown/deathnettle/pickup(mob/living/carbon/human/user as mob)
|
||||
if(!user.gloves)
|
||||
if(istype(user, /mob/living/carbon/human))
|
||||
@@ -193,7 +164,6 @@
|
||||
user.Paralyse(5)
|
||||
user << "\red You are stunned by the Deathnettle when you try picking it up!"
|
||||
|
||||
|
||||
/obj/item/weapon/grown/deathnettle/attack(mob/living/carbon/M as mob, mob/user as mob)
|
||||
if(!..()) return
|
||||
if(istype(M, /mob/living))
|
||||
@@ -211,7 +181,6 @@
|
||||
M.Weaken(force/15)
|
||||
M.drop_item()
|
||||
|
||||
|
||||
/obj/item/weapon/grown/deathnettle/afterattack(atom/A as mob|obj, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
if (force > 0)
|
||||
@@ -221,13 +190,10 @@
|
||||
usr << "All the leaves have fallen off the deathnettle from violent whacking."
|
||||
del(src)
|
||||
|
||||
|
||||
/obj/item/weapon/grown/deathnettle/changePotency(newValue) //-QualityVan
|
||||
potency = newValue
|
||||
force = round((5+potency/2.5), 1)
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/corncob
|
||||
name = "corn cob"
|
||||
desc = "A reminder of meals gone by."
|
||||
@@ -239,7 +205,6 @@
|
||||
throw_speed = 4
|
||||
throw_range = 20
|
||||
|
||||
|
||||
/obj/item/weapon/corncob/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
..()
|
||||
if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/kitchen/utensil/knife) || istype(W, /obj/item/weapon/kitchenknife) || istype(W, /obj/item/weapon/kitchenknife/ritual))
|
||||
|
||||
@@ -1,105 +1,210 @@
|
||||
//Analyzer, pestkillers, weedkillers, nutrients, hatchets.
|
||||
|
||||
|
||||
/obj/item/device/analyzer/plant_analyzer
|
||||
name = "plant analyzer"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "hydro"
|
||||
item_state = "analyzer"
|
||||
|
||||
attack_self(mob/user as mob)
|
||||
/obj/item/device/analyzer/plant_analyzer/attack_self(mob/user as mob)
|
||||
return 0
|
||||
|
||||
/obj/item/device/analyzer/plant_analyzer/afterattack(obj/target, mob/user, flag)
|
||||
if(!flag) return
|
||||
|
||||
// *************************************
|
||||
// Pestkiller defines for hydroponics
|
||||
// *************************************
|
||||
var/datum/seed/grown_seed
|
||||
var/datum/reagents/grown_reagents
|
||||
if(istype(target,/obj/item/weapon/reagent_containers/food/snacks/grown))
|
||||
|
||||
/obj/item/pestkiller
|
||||
name = "bottle of pestkiller"
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle16"
|
||||
flags = FPRINT | TABLEPASS
|
||||
var/toxicity = 0
|
||||
var/PestKillStr = 0
|
||||
New()
|
||||
src.pixel_x = rand(-5.0, 5)
|
||||
src.pixel_y = rand(-5.0, 5)
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/grown/G = target
|
||||
grown_seed = seed_types[G.plantname]
|
||||
grown_reagents = G.reagents
|
||||
|
||||
/obj/item/pestkiller/carbaryl
|
||||
name = "bottle of carbaryl"
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle16"
|
||||
flags = FPRINT | TABLEPASS
|
||||
toxicity = 4
|
||||
PestKillStr = 2
|
||||
New()
|
||||
src.pixel_x = rand(-5.0, 5)
|
||||
src.pixel_y = rand(-5.0, 5)
|
||||
else if(istype(target,/obj/item/weapon/grown))
|
||||
|
||||
/obj/item/pestkiller/lindane
|
||||
name = "bottle of lindane"
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle18"
|
||||
flags = FPRINT | TABLEPASS
|
||||
toxicity = 6
|
||||
PestKillStr = 4
|
||||
New()
|
||||
src.pixel_x = rand(-5.0, 5)
|
||||
src.pixel_y = rand(-5.0, 5)
|
||||
var/obj/item/weapon/grown/G = target
|
||||
grown_seed = seed_types[G.plantname]
|
||||
grown_reagents = G.reagents
|
||||
|
||||
/obj/item/pestkiller/phosmet
|
||||
name = "bottle of phosmet"
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle15"
|
||||
flags = FPRINT | TABLEPASS
|
||||
toxicity = 8
|
||||
PestKillStr = 7
|
||||
New()
|
||||
src.pixel_x = rand(-5.0, 5)
|
||||
src.pixel_y = rand(-5.0, 5)
|
||||
else if(istype(target,/obj/item/seeds))
|
||||
|
||||
var/obj/item/seeds/S = target
|
||||
grown_seed = S.seed
|
||||
|
||||
else if(istype(target,/obj/machinery/hydroponics))
|
||||
|
||||
var/obj/machinery/hydroponics/H = target
|
||||
grown_seed = H.seed
|
||||
grown_reagents = H.reagents
|
||||
|
||||
if(!grown_seed)
|
||||
user << "\red [src] can tell you nothing about [target]."
|
||||
return
|
||||
|
||||
var/dat = "<h3>Plant data for [target]</h3>"
|
||||
user.visible_message("\blue [user] runs the scanner over [target].")
|
||||
|
||||
dat += "<h2>General Data</h2>"
|
||||
|
||||
dat += "<table>"
|
||||
dat += "<tr><td><b>Endurance</b></td><td>[grown_seed.endurance]</td></tr>"
|
||||
dat += "<tr><td><b>Yield</b></td><td>[grown_seed.yield]</td></tr>"
|
||||
dat += "<tr><td><b>Lifespan</b></td><td>[grown_seed.lifespan]</td></tr>"
|
||||
dat += "<tr><td><b>Maturation time</b></td><td>[grown_seed.maturation]</td></tr>"
|
||||
dat += "<tr><td><b>Production time</b></td><td>[grown_seed.production]</td></tr>"
|
||||
dat += "<tr><td><b>Potency</b></td><td>[grown_seed.potency]</td></tr>"
|
||||
dat += "</table>"
|
||||
|
||||
if(grown_reagents && grown_reagents.reagent_list && grown_reagents.reagent_list.len)
|
||||
dat += "<h2>Reagent Data</h2>"
|
||||
|
||||
dat += "<br>This sample contains: "
|
||||
for(var/datum/reagent/R in grown_reagents.reagent_list)
|
||||
dat += "<br>- [R.id], [grown_reagents.get_reagent_amount(R.id)] unit(s)"
|
||||
|
||||
dat += "<h2>Other Data</h2>"
|
||||
|
||||
if(grown_seed.harvest_repeat)
|
||||
dat += "This plant can be harvested repeatedly.<br>"
|
||||
|
||||
if(grown_seed.immutable)
|
||||
dat += "This plant does not possess genetics that are alterable.<br>"
|
||||
|
||||
if(grown_seed.products && grown_seed.products.len)
|
||||
dat += "The mature plant will produce [grown_seed.products.len == 1 ? "fruit" : "[grown_seed.products.len] varieties of fruit"].<br>"
|
||||
|
||||
if(grown_seed.requires_nutrients)
|
||||
if(grown_seed.nutrient_consumption < 0.05)
|
||||
dat += "It consumes a small amount of nutrient fluid.<br>"
|
||||
else if(grown_seed.nutrient_consumption > 0.2)
|
||||
dat += "It requires a heavy supply of nutrient fluid.<br>"
|
||||
else
|
||||
dat += "It requires a supply of nutrient fluid.<br>"
|
||||
|
||||
if(grown_seed.requires_water)
|
||||
if(grown_seed.water_consumption < 1)
|
||||
dat += "It requires very little water.<br>"
|
||||
else if(grown_seed.water_consumption > 5)
|
||||
dat += "It requires a large amount of water.<br>"
|
||||
else
|
||||
dat += "It requires a stable supply of water.<br>"
|
||||
|
||||
if(grown_seed.mutants && grown_seed.mutants.len)
|
||||
dat += "It exhibits a high degree of potential subspecies shift.<br>"
|
||||
|
||||
dat += "It thrives in a temperature of [grown_seed.ideal_heat] Kelvin."
|
||||
|
||||
if(grown_seed.lowkpa_tolerance < 20)
|
||||
dat += "<br>It is well adapted to low pressure levels."
|
||||
if(grown_seed.highkpa_tolerance > 220)
|
||||
dat += "<br>It is well adapted to high pressure levels."
|
||||
|
||||
if(grown_seed.heat_tolerance > 30)
|
||||
dat += "<br>It is well adapted to a range of temperatures."
|
||||
else if(grown_seed.heat_tolerance < 10)
|
||||
dat += "<br>It is very sensitive to temperature shifts."
|
||||
|
||||
dat += "<br>It thrives in a light level of [grown_seed.ideal_light] lumen[grown_seed.ideal_light == 1 ? "" : "s"]."
|
||||
|
||||
if(grown_seed.light_tolerance > 10)
|
||||
dat += "<br>It is well adapted to a range of light levels."
|
||||
else if(grown_seed.light_tolerance < 3)
|
||||
dat += "<br>It is very sensitive to light level shifts."
|
||||
|
||||
if(grown_seed.toxins_tolerance < 3)
|
||||
dat += "<br>It is highly sensitive to toxins."
|
||||
else if(grown_seed.toxins_tolerance > 6)
|
||||
dat += "<br>It is remarkably resistant to toxins."
|
||||
|
||||
if(grown_seed.pest_tolerance < 3)
|
||||
dat += "<br>It is highly sensitive to pests."
|
||||
else if(grown_seed.pest_tolerance > 6)
|
||||
dat += "<br>It is remarkably resistant to pests."
|
||||
|
||||
if(grown_seed.weed_tolerance < 3)
|
||||
dat += "<br>It is highly sensitive to weeds."
|
||||
else if(grown_seed.weed_tolerance > 6)
|
||||
dat += "<br>It is remarkably resistant to weeds."
|
||||
|
||||
switch(grown_seed.spread)
|
||||
if(1)
|
||||
dat += "<br>It is capable of growing beyond the confines of a tray."
|
||||
if(2)
|
||||
dat += "<br>It is a robust and vigorous vine that will spread rapidly."
|
||||
|
||||
switch(grown_seed.carnivorous)
|
||||
if(1)
|
||||
dat += "<br>It is carniovorous and will eat tray pests for sustenance."
|
||||
if(2)
|
||||
dat += "<br>It is carnivorous and poses a significant threat to living things around it."
|
||||
|
||||
if(grown_seed.parasite)
|
||||
dat += "<br>It is capable of parisitizing and gaining sustenance from tray weeds."
|
||||
if(grown_seed.alter_temp)
|
||||
dat += "<br>It will periodically alter the local temperature by [grown_seed.alter_temp] degrees Kelvin."
|
||||
|
||||
if(grown_seed.biolum)
|
||||
dat += "<br>It is [grown_seed.biolum_colour ? "<font color='[grown_seed.biolum_colour]'>bio-luminescent</font>" : "bio-luminescent"]."
|
||||
if(grown_seed.flowers)
|
||||
dat += "<br>It has [grown_seed.flower_colour ? "<font color='[grown_seed.flower_colour]'>flowers</font>" : "flowers"]."
|
||||
|
||||
if(dat)
|
||||
user << browse(dat,"window=plant_analyzer")
|
||||
|
||||
return
|
||||
|
||||
// *************************************
|
||||
// Hydroponics Tools
|
||||
// *************************************
|
||||
|
||||
/obj/item/weapon/weedspray // -- Skie
|
||||
desc = "It's a toxic mixture, in spray form, to kill small weeds."
|
||||
/obj/item/weapon/plantspray
|
||||
icon = 'icons/obj/hydroponics.dmi'
|
||||
item_state = "spray"
|
||||
flags = TABLEPASS | OPENCONTAINER | FPRINT | NOBLUDGEON
|
||||
slot_flags = SLOT_BELT
|
||||
throwforce = 4
|
||||
w_class = 2.0
|
||||
throw_speed = 2
|
||||
throw_range = 10
|
||||
var/toxicity = 4
|
||||
var/pest_kill_str = 0
|
||||
var/weed_kill_str = 0
|
||||
|
||||
/obj/item/weapon/plantspray/weeds // -- Skie
|
||||
|
||||
name = "weed-spray"
|
||||
desc = "It's a toxic mixture, in spray form, to kill small weeds."
|
||||
icon_state = "weedspray"
|
||||
item_state = "spray"
|
||||
flags = TABLEPASS | OPENCONTAINER | FPRINT | NOBLUDGEON
|
||||
slot_flags = SLOT_BELT
|
||||
throwforce = 4
|
||||
w_class = 2.0
|
||||
throw_speed = 2
|
||||
throw_range = 10
|
||||
var/toxicity = 4
|
||||
var/WeedKillStr = 2
|
||||
weed_kill_str = 2
|
||||
|
||||
suicide_act(mob/user)
|
||||
viewers(user) << "\red <b>[user] is huffing the [src.name]! It looks like \he's trying to commit suicide.</b>"
|
||||
return (TOXLOSS)
|
||||
|
||||
/obj/item/weapon/pestspray // -- Skie
|
||||
desc = "It's some pest eliminator spray! <I>Do not inhale!</I>"
|
||||
icon = 'icons/obj/hydroponics.dmi'
|
||||
/obj/item/weapon/plantspray/pests
|
||||
name = "pest-spray"
|
||||
desc = "It's some pest eliminator spray! <I>Do not inhale!</I>"
|
||||
icon_state = "pestspray"
|
||||
item_state = "spray"
|
||||
flags = TABLEPASS | OPENCONTAINER | FPRINT | NOBLUDGEON
|
||||
slot_flags = SLOT_BELT
|
||||
throwforce = 4
|
||||
w_class = 2.0
|
||||
throw_speed = 2
|
||||
throw_range = 10
|
||||
var/toxicity = 4
|
||||
var/PestKillStr = 2
|
||||
pest_kill_str = 2
|
||||
|
||||
suicide_act(mob/user)
|
||||
viewers(user) << "\red <b>[user] is huffing the [src.name]! It looks like \he's trying to commit suicide.</b>"
|
||||
return (TOXLOSS)
|
||||
/obj/item/weapon/plantspray/pests/old
|
||||
name = "bottle of pestkiller"
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle16"
|
||||
|
||||
/obj/item/weapon/plantspray/pests/old/carbaryl
|
||||
name = "bottle of carbaryl"
|
||||
icon_state = "bottle16"
|
||||
toxicity = 4
|
||||
pest_kill_str = 2
|
||||
|
||||
/obj/item/weapon/plantspray/pests/old/lindane
|
||||
name = "bottle of lindane"
|
||||
icon_state = "bottle18"
|
||||
toxicity = 6
|
||||
pest_kill_str = 4
|
||||
|
||||
/obj/item/weapon/plantspray/pests/old/phosmet
|
||||
name = "bottle of phosmet"
|
||||
icon_state = "bottle15"
|
||||
toxicity = 8
|
||||
pest_kill_str = 7
|
||||
|
||||
/obj/item/weapon/minihoe // -- Numbers
|
||||
name = "mini hoe"
|
||||
@@ -125,7 +230,7 @@
|
||||
icon_state = "bottle16"
|
||||
flags = FPRINT | TABLEPASS
|
||||
var/toxicity = 0
|
||||
var/WeedKillStr = 0
|
||||
var/weed_kill_str = 0
|
||||
|
||||
/obj/item/weedkiller/triclopyr
|
||||
name = "bottle of glyphosate"
|
||||
@@ -133,7 +238,7 @@
|
||||
icon_state = "bottle16"
|
||||
flags = FPRINT | TABLEPASS
|
||||
toxicity = 4
|
||||
WeedKillStr = 2
|
||||
weed_kill_str = 2
|
||||
|
||||
/obj/item/weedkiller/lindane
|
||||
name = "bottle of triclopyr"
|
||||
@@ -141,7 +246,7 @@
|
||||
icon_state = "bottle18"
|
||||
flags = FPRINT | TABLEPASS
|
||||
toxicity = 6
|
||||
WeedKillStr = 4
|
||||
weed_kill_str = 4
|
||||
|
||||
/obj/item/weedkiller/D24
|
||||
name = "bottle of 2,4-D"
|
||||
@@ -149,7 +254,7 @@
|
||||
icon_state = "bottle15"
|
||||
flags = FPRINT | TABLEPASS
|
||||
toxicity = 8
|
||||
WeedKillStr = 7
|
||||
weed_kill_str = 7
|
||||
|
||||
|
||||
// *************************************
|
||||
@@ -175,9 +280,6 @@
|
||||
flags = FPRINT | TABLEPASS
|
||||
mutmod = 1
|
||||
yieldmod = 1
|
||||
New()
|
||||
src.pixel_x = rand(-5.0, 5)
|
||||
src.pixel_y = rand(-5.0, 5)
|
||||
|
||||
/obj/item/nutrient/l4z
|
||||
name = "bottle of Left 4 Zed"
|
||||
@@ -185,22 +287,13 @@
|
||||
icon_state = "bottle18"
|
||||
flags = FPRINT | TABLEPASS
|
||||
mutmod = 2
|
||||
yieldmod = 0
|
||||
New()
|
||||
src.pixel_x = rand(-5.0, 5)
|
||||
src.pixel_y = rand(-5.0, 5)
|
||||
|
||||
/obj/item/nutrient/rh
|
||||
name = "bottle of Robust Harvest"
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle15"
|
||||
flags = FPRINT | TABLEPASS
|
||||
mutmod = 0
|
||||
yieldmod = 2
|
||||
New()
|
||||
src.pixel_x = rand(-5.0, 5)
|
||||
src.pixel_y = rand(-5.0, 5)
|
||||
|
||||
|
||||
//Hatchets and things to kill kudzu
|
||||
/obj/item/weapon/hatchet
|
||||
@@ -232,7 +325,6 @@
|
||||
icon_state = "unathiknife"
|
||||
attack_verb = list("ripped", "torn", "cut")
|
||||
|
||||
|
||||
/obj/item/weapon/scythe
|
||||
icon_state = "scythe0"
|
||||
name = "scythe"
|
||||
@@ -249,8 +341,8 @@
|
||||
|
||||
/obj/item/weapon/scythe/afterattack(atom/A, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
if(istype(A, /obj/effect/spacevine))
|
||||
for(var/obj/effect/spacevine/B in orange(A,1))
|
||||
if(istype(A, /obj/effect/plantsegment))
|
||||
for(var/obj/effect/plantsegment/B in orange(A,1))
|
||||
if(prob(80))
|
||||
del B
|
||||
del A
|
||||
File diff suppressed because it is too large
Load Diff
1403
code/modules/hydroponics/seed_datums.dm
Normal file
1403
code/modules/hydroponics/seed_datums.dm
Normal file
File diff suppressed because it is too large
Load Diff
324
code/modules/hydroponics/seed_machines.dm
Normal file
324
code/modules/hydroponics/seed_machines.dm
Normal file
@@ -0,0 +1,324 @@
|
||||
/obj/item/weapon/disk/botany
|
||||
name = "flora data disk"
|
||||
desc = "A small disk used for carrying data on plant genetics."
|
||||
icon = 'icons/obj/hydroponics.dmi'
|
||||
icon_state = "disk"
|
||||
var/list/genes = list()
|
||||
var/genesource = "unknown"
|
||||
|
||||
/obj/item/weapon/disk/botany/attack_self(var/mob/user as mob)
|
||||
if(genes.len)
|
||||
user << "You wipe the disk data."
|
||||
name = initial(name)
|
||||
desc = initial(name)
|
||||
genes = list()
|
||||
genesource = "unknown"
|
||||
|
||||
/obj/item/weapon/storage/box/botanydisk
|
||||
name = "flora disk box"
|
||||
desc = "A box of flora data disks, apparently."
|
||||
|
||||
/obj/item/weapon/storage/box/botanydisk/New()
|
||||
..()
|
||||
for(var/i = 0;i<7;i++)
|
||||
new /obj/item/weapon/disk/botany(src)
|
||||
/obj/machinery/botany
|
||||
icon = 'icons/obj/hydroponics.dmi'
|
||||
icon_state = "hydrotray3"
|
||||
density = 1
|
||||
anchored = 1
|
||||
use_power = 1
|
||||
|
||||
var/obj/item/seeds/seed // Currently loaded seed packet.
|
||||
var/obj/item/weapon/disk/botany/loaded_disk //Currently loaded data disk.
|
||||
|
||||
var/open = 0
|
||||
var/active = 0
|
||||
var/action_time = 100
|
||||
var/last_action = 0
|
||||
var/eject_disk = 0
|
||||
var/failed_task = 0
|
||||
var/disk_needs_genes = 0
|
||||
|
||||
/obj/machinery/botany/process()
|
||||
|
||||
..()
|
||||
if(!active) return
|
||||
|
||||
if(world.time > last_action + action_time)
|
||||
finished_task()
|
||||
|
||||
/obj/machinery/botany/attack_paw(mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/botany/attack_ai(mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/botany/attack_hand(mob/user as mob)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/botany/proc/finished_task()
|
||||
active = 0
|
||||
if(failed_task)
|
||||
failed_task = 0
|
||||
visible_message("\icon[src] [src] pings unhappily, flashing a red warning light.")
|
||||
else
|
||||
visible_message("\icon[src] [src] pings happily.")
|
||||
|
||||
if(eject_disk)
|
||||
eject_disk = 0
|
||||
if(loaded_disk)
|
||||
loaded_disk.loc = get_turf(src)
|
||||
visible_message("\icon[src] [src] beeps and spits out [loaded_disk].")
|
||||
loaded_disk = null
|
||||
|
||||
/obj/machinery/botany/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W,/obj/item/seeds))
|
||||
if(seed)
|
||||
if(seed.seed.immutable)
|
||||
user << "That seed is not compatible with our genetics technology."
|
||||
else
|
||||
user << "There is already a seed loaded."
|
||||
else
|
||||
user.drop_item(W)
|
||||
W.loc = src
|
||||
seed = W
|
||||
user << "You load [W] into [src]."
|
||||
return
|
||||
if(istype(W,/obj/item/weapon/screwdriver))
|
||||
open = !open
|
||||
user << "\blue You [open ? "open" : "close"] the maintenance panel."
|
||||
return
|
||||
|
||||
if(open)
|
||||
if(istype(W, /obj/item/weapon/crowbar))
|
||||
dismantle()
|
||||
return
|
||||
|
||||
if(istype(W,/obj/item/weapon/disk/botany))
|
||||
if(loaded_disk)
|
||||
user << "There is already a data disk loaded."
|
||||
return
|
||||
else
|
||||
var/obj/item/weapon/disk/botany/B = W
|
||||
|
||||
if(B.genes && B.genes.len)
|
||||
if(!disk_needs_genes)
|
||||
user << "That disk already has gene data loaded."
|
||||
return
|
||||
else
|
||||
if(disk_needs_genes)
|
||||
user << "That disk does not have any gene data loaded."
|
||||
return
|
||||
|
||||
user.drop_item(W)
|
||||
W.loc = src
|
||||
loaded_disk = W
|
||||
user << "You load [W] into [src]."
|
||||
|
||||
return
|
||||
..()
|
||||
|
||||
// Allows for a trait to be extracted from a seed packet, destroying that seed.
|
||||
/obj/machinery/botany/extractor
|
||||
name = "lysis-isolation centrifuge"
|
||||
icon_state = "traitcopier"
|
||||
|
||||
var/datum/seed/genetics // Currently scanned seed genetic structure.
|
||||
var/degradation = 0 // Increments with each scan, stops allowing gene mods after a certain point.
|
||||
|
||||
/obj/machinery/botany/extractor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
|
||||
if(!user)
|
||||
return
|
||||
|
||||
var/list/data = list()
|
||||
|
||||
var/list/geneMasks[0]
|
||||
for(var/gene_tag in gene_tag_masks)
|
||||
geneMasks.Add(list(list("tag" = gene_tag, "mask" = gene_tag_masks[gene_tag])))
|
||||
data["geneMasks"] = geneMasks
|
||||
|
||||
data["activity"] = active
|
||||
data["degradation"] = degradation
|
||||
|
||||
if(loaded_disk)
|
||||
data["disk"] = 1
|
||||
else
|
||||
data["disk"] = 0
|
||||
|
||||
if(seed)
|
||||
data["loaded"] = "[seed.name]"
|
||||
else
|
||||
data["loaded"] = 0
|
||||
|
||||
if(genetics)
|
||||
data["hasGenetics"] = 1
|
||||
data["sourceName"] = genetics.display_name
|
||||
if(!genetics.roundstart)
|
||||
data["sourceName"] += " (variety #[genetics.uid])"
|
||||
else
|
||||
data["hasGenetics"] = 0
|
||||
data["sourceName"] = 0
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "botany_isolator.tmpl", "Lysis-isolation Centrifuge UI", 470, 450)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
|
||||
/obj/machinery/botany/Topic(href, href_list)
|
||||
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(href_list["eject_packet"])
|
||||
if(!seed) return
|
||||
seed.loc = get_turf(src)
|
||||
|
||||
if(seed.seed.name == "new line" || isnull(seed_types[seed.seed.name]))
|
||||
seed.seed.uid = seed_types.len + 1
|
||||
seed.seed.name = "[uid]"
|
||||
seed_types[seed.seed.name] = seed.seed
|
||||
|
||||
seed.update_seed()
|
||||
visible_message("\icon[src] [src] beeps and spits out [seed].")
|
||||
|
||||
seed = null
|
||||
|
||||
if(href_list["eject_disk"])
|
||||
if(!loaded_disk) return
|
||||
loaded_disk.loc = get_turf(src)
|
||||
visible_message("\icon[src] [src] beeps and spits out [loaded_disk].")
|
||||
loaded_disk = null
|
||||
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
/obj/machinery/botany/extractor/Topic(href, href_list)
|
||||
|
||||
if(..())
|
||||
return
|
||||
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
if(href_list["scan_genome"])
|
||||
|
||||
if(!seed) return
|
||||
|
||||
last_action = world.time
|
||||
active = 1
|
||||
|
||||
if(seed && seed.seed)
|
||||
genetics = seed.seed
|
||||
del(seed)
|
||||
seed = null
|
||||
|
||||
if(href_list["get_gene"])
|
||||
|
||||
if(!genetics || !loaded_disk) return
|
||||
|
||||
last_action = world.time
|
||||
active = 1
|
||||
|
||||
var/datum/plantgene/P = genetics.get_gene(href_list["get_gene"])
|
||||
if(!P) return
|
||||
loaded_disk.genes += P
|
||||
|
||||
loaded_disk.genesource = "[genetics.display_name]"
|
||||
if(!genetics.roundstart)
|
||||
loaded_disk.genesource += " (variety #[genetics.uid])"
|
||||
|
||||
loaded_disk.name += " ([gene_tag_masks[href_list["get_gene"]]])"
|
||||
loaded_disk.desc += " The label reads \'gene [gene_tag_masks[href_list["get_gene"]]], sampled from [genetics.display_name]\'."
|
||||
eject_disk = 1
|
||||
|
||||
degradation += rand(20,60)
|
||||
if(degradation >= 100)
|
||||
failed_task = 1
|
||||
genetics = null
|
||||
degradation = 0
|
||||
|
||||
if(href_list["clear_buffer"])
|
||||
if(!genetics) return
|
||||
genetics = null
|
||||
degradation = 0
|
||||
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
// Fires an extracted trait into another packet of seeds with a chance
|
||||
// of destroying it based on the size/complexity of the plasmid.
|
||||
/obj/machinery/botany/editor
|
||||
name = "bioballistic delivery system"
|
||||
icon_state = "traitgun"
|
||||
disk_needs_genes = 1
|
||||
|
||||
/obj/machinery/botany/editor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
|
||||
if(!user)
|
||||
return
|
||||
|
||||
var/list/data = list()
|
||||
|
||||
data["activity"] = active
|
||||
|
||||
if(seed)
|
||||
data["degradation"] = seed.modified
|
||||
else
|
||||
data["degradation"] = 0
|
||||
|
||||
if(loaded_disk && loaded_disk.genes.len)
|
||||
data["disk"] = 1
|
||||
data["sourceName"] = loaded_disk.genesource
|
||||
data["locus"] = ""
|
||||
|
||||
for(var/datum/plantgene/P in loaded_disk.genes)
|
||||
if(data["locus"] != "") data["locus"] += ", "
|
||||
data["locus"] += "[gene_tag_masks[P.genetype]]"
|
||||
|
||||
else
|
||||
data["disk"] = 0
|
||||
data["sourceName"] = 0
|
||||
data["locus"] = 0
|
||||
|
||||
if(seed)
|
||||
data["loaded"] = "[seed.name]"
|
||||
else
|
||||
data["loaded"] = 0
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "botany_editor.tmpl", "Bioballistic Delivery UI", 470, 450)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
|
||||
/obj/machinery/botany/editor/Topic(href, href_list)
|
||||
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(href_list["apply_gene"])
|
||||
if(!loaded_disk || !seed) return
|
||||
|
||||
last_action = world.time
|
||||
active = 1
|
||||
|
||||
if(!isnull(seed_types[seed.seed.name]))
|
||||
seed.seed = seed.seed.diverge(1)
|
||||
seed.seed_type = seed.seed.name
|
||||
seed.update_seed()
|
||||
|
||||
if(prob(seed.modified))
|
||||
failed_task = 1
|
||||
seed.modified = 101
|
||||
|
||||
for(var/datum/plantgene/gene in loaded_disk.genes)
|
||||
seed.seed.apply_gene(gene)
|
||||
seed.modified += rand(5,10)
|
||||
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
80
code/modules/hydroponics/seed_mobs.dm
Normal file
80
code/modules/hydroponics/seed_mobs.dm
Normal file
@@ -0,0 +1,80 @@
|
||||
/datum/seed
|
||||
var/product_requires_player // If yes, product will ask for a player among the ghosts.
|
||||
var/list/currently_querying // Used to avoid asking the same ghost repeatedly.
|
||||
|
||||
// The following procs are used to grab players for mobs produced by a seed (mostly for dionaea).
|
||||
/datum/seed/proc/handle_living_product(var/mob/living/host)
|
||||
|
||||
if(!host || !istype(host)) return
|
||||
|
||||
if(product_requires_player)
|
||||
spawn(0)
|
||||
request_player(host)
|
||||
spawn(75)
|
||||
if(!host.ckey && !host.client)
|
||||
host.death() // This seems redundant, but a lot of mobs don't
|
||||
host.stat = 2 // handle death() properly. Better safe than etc.
|
||||
host.visible_message("\red <b>[host] is malformed and unable to survive. It expires pitifully, leaving behind some seeds.")
|
||||
|
||||
var/total_yield = rand(1,3)
|
||||
for(var/j = 0;j<=total_yield;j++)
|
||||
var/obj/item/seeds/S = new(get_turf(host))
|
||||
S.seed_type = name
|
||||
S.update_seed()
|
||||
|
||||
/datum/seed/proc/request_player(var/mob/living/host)
|
||||
if(!host) return
|
||||
for(var/mob/dead/observer/O in player_list)
|
||||
if(jobban_isbanned(O, "Dionaea") || (!is_alien_whitelisted(src, "Diona") && config.usealienwhitelist))
|
||||
continue
|
||||
if(O.client)
|
||||
if(O.client.prefs.be_special & BE_PLANT && !(O.client in currently_querying))
|
||||
currently_querying |= O.client
|
||||
question(O.client,host)
|
||||
|
||||
/datum/seed/proc/question(var/client/C,var/mob/living/host)
|
||||
spawn(0)
|
||||
|
||||
if(!C || !host || !(C.mob && istype(C.mob,/mob/dead))) return // We don't want to spam them repeatedly if they're already in a mob.
|
||||
|
||||
var/response = alert(C, "Someone is harvesting [display_name]. Would you like to play as one?", "Sentient plant harvest", "Yes", "No", "Never for this round.")
|
||||
|
||||
if(!C || !host || !(C.mob && istype(C.mob,/mob/dead))) return // ...or accidentally accept an invalid argument for transfer.
|
||||
|
||||
if(response == "Yes")
|
||||
transfer_personality(C,host)
|
||||
else if (response == "Never for this round")
|
||||
C.prefs.be_special ^= BE_PLANT
|
||||
|
||||
currently_querying -= C
|
||||
|
||||
/datum/seed/proc/transfer_personality(var/client/player,var/mob/living/host)
|
||||
|
||||
//Something is wrong, abort.
|
||||
if(!player || !host) return
|
||||
|
||||
//Host already has a controller, pike off slowpoke.
|
||||
if(host.client && host.ckey) return
|
||||
|
||||
//Transfer them over.
|
||||
host.ckey = player.ckey
|
||||
if(player.mob && player.mob.mind)
|
||||
player.mob.mind.transfer_to(host)
|
||||
|
||||
if(host.dna) host.dna.real_name = host.real_name
|
||||
|
||||
// Update mode specific HUD icons.
|
||||
callHook("harvest_podman", list(host))
|
||||
|
||||
host << "\green <B>You awaken slowly, stirring into sluggish motion as the air caresses you.</B>"
|
||||
|
||||
// This is a hack, replace with some kind of species blurb proc.
|
||||
if(istype(host,/mob/living/carbon/monkey/diona))
|
||||
host << "<B>You are [host], one of a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders.</B>"
|
||||
host << "<B>Too much darkness will send you into shock and starve you, but light will help you heal.</B>"
|
||||
|
||||
var/newname = input(host,"Enter a name, or leave blank for the default name.", "Name change","") as text
|
||||
newname = sanitize(newname)
|
||||
if (newname != "")
|
||||
host.real_name = newname
|
||||
host.name = host.real_name
|
||||
File diff suppressed because it is too large
Load Diff
386
code/modules/hydroponics/vines.dm
Normal file
386
code/modules/hydroponics/vines.dm
Normal file
@@ -0,0 +1,386 @@
|
||||
// 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
|
||||
|
||||
// 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/attack_paw(mob/user as mob)
|
||||
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.potency),100) : 50))
|
||||
if(buckled_mob.buckled == src)
|
||||
if(buckled_mob != user)
|
||||
buckled_mob.visible_message(\
|
||||
"<span class='notice'>[user.name] frees [buckled_mob.name] from [src].</span>",\
|
||||
"<span class='notice'>[user.name] frees you from [src].</span>",\
|
||||
"<span class='warning'>You hear shredding and ripping.</span>")
|
||||
else
|
||||
buckled_mob.visible_message(\
|
||||
"<span class='notice'>[buckled_mob.name] struggles free of [src].</span>",\
|
||||
"<span class='notice'>You untangle [src] from around yourself.</span>",\
|
||||
"<span class='warning'>You hear shredding and ripping.</span>")
|
||||
unbuckle()
|
||||
else
|
||||
var/text = pick("rips","tears","pulls")
|
||||
user.visible_message(\
|
||||
"<span class='notice'>[user.name] [text] at [src].</span>",\
|
||||
"<span class='notice'>You [text] at [src].</span>",\
|
||||
"<span class='warning'>You hear shredding and ripping.</span>")
|
||||
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.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 << "<span class='danger'>The vines [pick("wind", "tangle", "tighten")] around you!</span>"
|
||||
|
||||
// FEED ME, SEYMOUR.
|
||||
if(buckled_mob && seed && (buckled_mob.stat != DEAD)) //Don't bother with a dead mob.
|
||||
|
||||
var/mob/living/M = buckled_mob
|
||||
if(!istype(M)) return
|
||||
var/mob/living/carbon/human/H = buckled_mob
|
||||
|
||||
// Drink some blood/cause some brute.
|
||||
if(seed.carnivorous == 2)
|
||||
buckled_mob << "<span class='danger'>\The [src] pierces your flesh greedily!</span>"
|
||||
|
||||
var/damage = rand(round(seed.potency/2),seed.potency)
|
||||
if(!istype(H))
|
||||
H.adjustBruteLoss(damage)
|
||||
return
|
||||
|
||||
var/datum/organ/external/affecting = H.get_organ(pick("l_foot","r_foot","l_leg","r_leg","l_hand","r_hand","l_arm", "r_arm","head","chest","groin"))
|
||||
|
||||
if(affecting)
|
||||
affecting.take_damage(damage, 0)
|
||||
if(affecting.parent)
|
||||
affecting.parent.add_autopsy_data("[plant_damage_noun]", damage)
|
||||
else
|
||||
H.adjustBruteLoss(damage)
|
||||
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
|
||||
// Inject some chems.
|
||||
if(seed.chems && seed.chems.len && istype(H))
|
||||
H << "<span class='danger'>You feel something seeping into your skin!</span>"
|
||||
for(var/rid in seed.chems)
|
||||
var/injecting = min(5,max(1,seed.potency/5))
|
||||
H.reagents.add_reagent(rid,injecting)
|
||||
|
||||
/obj/effect/plantsegment/proc/update()
|
||||
if(!seed) return
|
||||
|
||||
// Update bioluminescence.
|
||||
if(seed.biolum)
|
||||
SetLuminosity(1+round(seed.potency/10))
|
||||
if(seed.biolum_colour)
|
||||
l_color = seed.biolum_colour
|
||||
else
|
||||
l_color = null
|
||||
return
|
||||
else
|
||||
SetLuminosity(0)
|
||||
|
||||
// Update flower/product overlay.
|
||||
overlays.Cut()
|
||||
if(age >= seed.maturation)
|
||||
if(prob(20) && seed.products && seed.products.len && !harvest && ((age-lastproduce) > seed.production))
|
||||
harvest = 1
|
||||
lastproduce = age
|
||||
|
||||
if(harvest)
|
||||
var/image/fruit_overlay = image('icons/obj/hydroponics.dmi',"")
|
||||
if(seed.product_colour)
|
||||
fruit_overlay.color = seed.product_colour
|
||||
overlays += fruit_overlay
|
||||
|
||||
if(seed.flowers)
|
||||
var/image/flower_overlay = image('icons/obj/hydroponics.dmi',"[seed.flower_icon]")
|
||||
if(seed.flower_colour)
|
||||
flower_overlay.color = seed.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)
|
||||
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.lowkpa_tolerance || pressure > seed.highkpa_tolerance)
|
||||
die()
|
||||
return
|
||||
|
||||
if(abs(environment.temperature - seed.ideal_heat) > seed.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.ideal_light) > seed.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 = 50
|
||||
slowdown_limit = 5
|
||||
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.potency * collapse_limit : 250) && !reached_collapse_size)
|
||||
reached_collapse_size = 1
|
||||
if(vines.len >= (seed ? seed.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.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.energy < 2) //If tile isn't fully grown
|
||||
var/chance
|
||||
if(seed)
|
||||
chance = limited_growth ? round(seed.potency/2,1) : seed.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
|
||||
@@ -0,0 +1,139 @@
|
||||
/datum/seed/telriis
|
||||
|
||||
name = "telriis"
|
||||
seed_name = "telriis"
|
||||
display_name = "telriis grass"
|
||||
products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/telriis_clump)
|
||||
packet_icon = "seed-alien1"
|
||||
plant_icon = "telriis"
|
||||
|
||||
lifespan = 50
|
||||
endurance = 50
|
||||
maturation = 5
|
||||
production = 5
|
||||
yield = 4
|
||||
potency = 5
|
||||
growth_stages = 4
|
||||
|
||||
/datum/seed/thaadra
|
||||
|
||||
name = "thaadra"
|
||||
seed_name = "thaa'dra"
|
||||
display_name = "thaa'dra lichen"
|
||||
products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/thaadrabloom)
|
||||
packet_icon = "seed-alien3"
|
||||
plant_icon = "thaadra"
|
||||
|
||||
lifespan = 20
|
||||
endurance = 10
|
||||
maturation = 5
|
||||
production = 9
|
||||
yield = 2
|
||||
potency = 5
|
||||
growth_stages = 4
|
||||
|
||||
/datum/seed/jurlmah
|
||||
|
||||
name = "jurlmah"
|
||||
seed_name = "jurl'mah"
|
||||
display_name = "jurl'mah reeds"
|
||||
products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/jurlmah)
|
||||
packet_icon = "seed-alien3"
|
||||
plant_icon = "jurlmah"
|
||||
|
||||
lifespan = 20
|
||||
endurance = 12
|
||||
maturation = 8
|
||||
production = 9
|
||||
yield = 3
|
||||
potency = 10
|
||||
growth_stages = 5
|
||||
|
||||
/datum/seed/amauri
|
||||
|
||||
name = "amauri"
|
||||
seed_name = "amauri"
|
||||
display_name = "amauri plant"
|
||||
products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/amauri)
|
||||
packet_icon = "seed-alien3"
|
||||
plant_icon = "amauri"
|
||||
|
||||
lifespan = 30
|
||||
endurance = 10
|
||||
maturation = 8
|
||||
production = 9
|
||||
yield = 4
|
||||
potency = 10
|
||||
growth_stages = 3
|
||||
|
||||
/datum/seed/gelthi
|
||||
|
||||
name = "gelthi"
|
||||
seed_name = "gelthi"
|
||||
display_name = "gelthi plant"
|
||||
products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/gelthi)
|
||||
packet_icon = "seed-alien2"
|
||||
plant_icon = "gelthi"
|
||||
|
||||
lifespan = 20
|
||||
endurance = 15
|
||||
maturation = 6
|
||||
production = 6
|
||||
yield = 2
|
||||
potency = 1
|
||||
growth_stages = 3
|
||||
|
||||
/datum/seed/vale
|
||||
|
||||
name = "vale"
|
||||
seed_name = "vale"
|
||||
display_name = "vale bush"
|
||||
products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/vale)
|
||||
packet_icon = "seed-alien2"
|
||||
plant_icon = "vale"
|
||||
|
||||
lifespan = 25
|
||||
endurance = 15
|
||||
maturation = 8
|
||||
production = 10
|
||||
yield = 3
|
||||
potency = 3
|
||||
growth_stages = 4
|
||||
|
||||
/datum/seed/surik
|
||||
|
||||
name = "surik"
|
||||
seed_name = "surik"
|
||||
display_name = "surik vine"
|
||||
products = list(/obj/item/weapon/reagent_containers/food/snacks/grown/surik)
|
||||
packet_icon = "seed-alien3"
|
||||
plant_icon = "surik"
|
||||
|
||||
lifespan = 30
|
||||
endurance = 18
|
||||
maturation = 7
|
||||
production = 7
|
||||
yield = 3
|
||||
potency = 3
|
||||
growth_stages = 4
|
||||
|
||||
/obj/item/seeds/jurlmah
|
||||
seed_type = "jurlmah"
|
||||
|
||||
/obj/item/seeds/amauri
|
||||
seed_type = "amauri"
|
||||
|
||||
/obj/item/seeds/gelthi
|
||||
seed_type = "gelthi"
|
||||
|
||||
/obj/item/seeds/vale
|
||||
seed_type = "vale"
|
||||
|
||||
/obj/item/seeds/surik
|
||||
seed_type = "surik"
|
||||
|
||||
/obj/item/seeds/telriis
|
||||
seed_type = "telriis"
|
||||
|
||||
/obj/item/seeds/thaadra
|
||||
seed_type = "thaadra"
|
||||
Reference in New Issue
Block a user