Files
Aurora.3/code/modules/hydroponics/grown.dm
Cody Brittain 4e2b58f02a Added new drugs from lore and otherwise (#16773)
* Initial commit of new drugs

Start on caromeg and oracle

Further work on caromeg

Fix nicotine and caromeg

Begin populating map

Designer cocaine effects

Weaken heroin, Joy now causes genetic damage

Added an artificial alternative to morphine, tramarine, that can be used in its place.

Nerf new opioids, fix tramaline recipe

Added special mentholated adhomian cigarettes, for NKA cigarettes

General fixes

Fix recipe pathing

Add coca leaves, cocaine recipes, and coca drinks

Update Chemistry-Reagents-Medicine.dm

Null name for abstract drug class

Remove abstract_class from reagents (shouldn't be used there)

* Oracle sprites by Wezzy

* .

* Begin resolving issues from code review

* Remove all per-player data from drug singletons

* Resolve Arrow's code review

* Apply suggestions from code review

Co-authored-by: SleepyGemmy <99297919+SleepyGemmy@users.noreply.github.com>

Update code/modules/hydroponics/seed_datums/smokables.dm

Co-authored-by: SleepyGemmy <99297919+SleepyGemmy@users.noreply.github.com>

* Removed coca plants from the standard garden and hydroponics vendors (they remain as contraband and in the xenobotany garden)

* Fix merge conflict errors caused by snack PR

---------

Co-authored-by: SleepyGemmy <99297919+SleepyGemmy@users.noreply.github.com>
Co-authored-by: Cody Brittain <cbrittain10@live.com>
2023-10-20 17:55:13 +00:00

370 lines
13 KiB
Plaintext

//Grown foods.
/obj/item/reagent_containers/food/snacks/grown
name = "fruit"
icon = 'icons/obj/hydroponics_products.dmi'
icon_state = "blank"
desc = "Nutritious! Probably."
slot_flags = SLOT_HOLSTER
drop_sound = 'sound/items/drop/herb.ogg'
pickup_sound = 'sound/items/pickup/herb.ogg'
var/plantname
var/datum/seed/seed
var/potency = -1
/obj/item/reagent_containers/food/snacks/grown/Initialize(loca, planttype)
. = ..()
if(!dried_type)
dried_type = type
src.pixel_x = rand(-5.0, 5)
src.pixel_y = rand(-5.0, 5)
// Fill the object up with the appropriate reagents.
if(planttype)
plantname = planttype
if(!plantname)
return
if(!SSplants)
to_world("<span class='danger'>Plant controller does not exist and [src] requires it. Aborting.</span>")
qdel(src)
return
seed = SSplants.seeds[plantname]
if(!seed)
return
name = "[seed.seed_name]"
trash = seed.get_trash_type()
update_icon()
if(!seed.chems)
return
potency = seed.get_trait(TRAIT_POTENCY)
for(var/rid in seed.chems)
var/list/reagent_data = seed.chems[rid]
if(reagent_data && reagent_data.len)
var/rtotal = reagent_data[1]
var/list/data = list()
if(reagent_data.len > 1 && potency > 0)
rtotal += round(potency/reagent_data[2])
if(rid == /singleton/reagent/nutriment)
data[seed.seed_name] = max(1,rtotal)
reagents.add_reagent(rid,max(1,rtotal),data)
update_desc()
if(reagents.total_volume > 0)
bitesize = 1+round(reagents.total_volume / 2, 1)
/obj/item/reagent_containers/food/snacks/grown/proc/update_desc()
if(!seed)
return
if(!SSplants)
to_world("<span class='danger'>Plant controller does not exist and [src] requires it. Aborting.</span>")
qdel(src)
return
if(SSplants.product_descs["[seed.uid]"])
desc = SSplants.product_descs["[seed.uid]"]
else
var/list/descriptors = list()
if(reagents.has_reagent(/singleton/reagent/sugar) || reagents.has_reagent(/singleton/reagent/nutriment/cherryjelly) || reagents.has_reagent(/singleton/reagent/nutriment/honey) || reagents.has_reagent(/singleton/reagent/drink/berryjuice))
descriptors |= "sweet"
if(reagents.has_reagent(/singleton/reagent/dylovene))
descriptors |= "astringent"
if(reagents.has_reagent(/singleton/reagent/frostoil))
descriptors |= "numbing"
if(reagents.has_reagent(/singleton/reagent/nutriment))
descriptors |= "nutritious"
if(reagents.has_reagent(/singleton/reagent/capsaicin/condensed) || reagents.has_reagent(/singleton/reagent/capsaicin))
descriptors |= "spicy"
if(reagents.has_reagent(/singleton/reagent/nutriment/coco))
descriptors |= "bitter"
if(reagents.has_reagent(/singleton/reagent/drink/orangejuice) || reagents.has_reagent(/singleton/reagent/drink/lemonjuice) || reagents.has_reagent(/singleton/reagent/drink/limejuice))
descriptors |= "sweet-sour"
if(reagents.has_reagent(/singleton/reagent/radium) || reagents.has_reagent(/singleton/reagent/uranium))
descriptors |= "radioactive"
if(reagents.has_reagent(/singleton/reagent/toxin/amatoxin) || reagents.has_reagent(/singleton/reagent/toxin))
descriptors |= "poisonous"
if(reagents.has_reagent(/singleton/reagent/drugs/psilocybin) || reagents.has_reagent(/singleton/reagent/drugs/ambrosia_extract) || reagents.has_reagent(/singleton/reagent/drugs/mms) || reagents.has_reagent(/singleton/reagent/drugs/mindbreaker))
descriptors |= "hallucinogenic"
if(reagents.has_reagent(/singleton/reagent/bicaridine) || reagents.has_reagent(/singleton/reagent/dylovene))
descriptors |= "medicinal"
if(reagents.has_reagent(/singleton/reagent/gold))
descriptors |= "shiny"
if(reagents.has_reagent(/singleton/reagent/lube))
descriptors |= "slippery"
if(reagents.has_reagent(/singleton/reagent/acid/polyacid) || reagents.has_reagent(/singleton/reagent/acid) || reagents.has_reagent(/singleton/reagent/acid/hydrochloric))
descriptors |= "acidic"
if(seed.get_trait(TRAIT_JUICY))
descriptors |= "juicy"
if(seed.get_trait(TRAIT_STINGS))
descriptors |= "stinging"
if(seed.get_trait(TRAIT_TELEPORTING))
descriptors |= "glowing"
if(seed.get_trait(TRAIT_EXPLOSIVE))
descriptors |= "bulbous"
var/descriptor_num = rand(2,4)
var/descriptor_count = descriptor_num
desc = "A"
while(descriptors.len && descriptor_num > 0)
var/chosen = pick(descriptors)
descriptors -= chosen
desc += "[(descriptor_count>1 && descriptor_count!=descriptor_num) ? "," : "" ] [chosen]"
descriptor_num--
if(seed.seed_noun == SEED_NOUN_SPORES)
desc += " mushroom"
else
desc += " fruit"
SSplants.product_descs["[seed.uid]"] = desc
desc += ". Delicious! Probably."
/obj/item/reagent_containers/food/snacks/grown/update_icon()
if(!seed || !SSplants || !SSplants.plant_icon_cache)
return
cut_overlays()
var/image/plant_icon
var/icon_key = "fruit-[seed.get_trait(TRAIT_PRODUCT_ICON)]-[seed.get_trait(TRAIT_PRODUCT_COLOUR)]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"
if(SSplants.plant_icon_cache[icon_key])
plant_icon = SSplants.plant_icon_cache[icon_key]
else
plant_icon = image('icons/obj/hydroponics_products.dmi',"blank")
var/image/fruit_base = image('icons/obj/hydroponics_products.dmi',"[seed.get_trait(TRAIT_PRODUCT_ICON)]-product")
fruit_base.color = "[seed.get_trait(TRAIT_PRODUCT_COLOUR)]"
plant_icon.overlays |= fruit_base
if("[seed.get_trait(TRAIT_PRODUCT_ICON)]-leaf" in icon_states('icons/obj/hydroponics_products.dmi'))
var/image/fruit_leaves = image('icons/obj/hydroponics_products.dmi',"[seed.get_trait(TRAIT_PRODUCT_ICON)]-leaf")
fruit_leaves.color = "[seed.get_trait(TRAIT_PLANT_COLOUR)]"
plant_icon.overlays |= fruit_leaves
SSplants.plant_icon_cache[icon_key] = plant_icon
add_overlay(plant_icon)
/obj/item/reagent_containers/food/snacks/grown/Crossed(var/mob/living/M)
if(seed && seed.get_trait(TRAIT_JUICY) == 2)
if(istype(M))
if(M.buckled_to)
return
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.shoes && H.shoes.item_flags & NOSLIP)
return
M.stop_pulling()
to_chat(M, "<span class='notice'>You slipped on the [name]!</span>")
playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
M.Stun(8)
M.Weaken(5)
seed.thrown_at(src,M)
sleep(-1)
if(src) qdel(src)
return
/obj/item/reagent_containers/food/snacks/grown/throw_impact(atom/hit_atom)
if(seed) seed.thrown_at(src,hit_atom)
..()
/obj/item/reagent_containers/food/snacks/grown/attackby(var/obj/item/W, var/mob/user)
if(seed)
if(seed.get_trait(TRAIT_PRODUCES_POWER) && W.iscoil())
var/obj/item/stack/cable_coil/C = W
if(C.use(5))
//TODO: generalize this.
to_chat(user, "<span class='notice'>You add some cable to the [src.name] and slide it inside the battery casing.</span>")
var/obj/item/cell/potato/pocell = new /obj/item/cell/potato(get_turf(user))
if(src.loc == user && !(user.l_hand && user.r_hand) && istype(user,/mob/living/carbon/human))
user.put_in_hands(pocell)
pocell.maxcharge = src.potency * 10
pocell.charge = pocell.maxcharge
qdel(src)
return
else if(W.sharp && !W.noslice)
if(seed.kitchen_tag == "pumpkin") // Ugggh these checks are awful.
user.show_message("<span class='notice'>You carve a face into [src]!</span>", 1)
user.put_in_hands(new /obj/item/clothing/head/pumpkin)
qdel(src)
return
else if(seed.chems)
if(istype(W,/obj/item/material/hatchet) && !isnull(seed.chems[/singleton/reagent/woodpulp]))
user.show_message("<span class='notice'>You make planks out of \the [src]!</span>", 1)
playsound(loc, 'sound/effects/woodcutting.ogg', 50, 1)
var/flesh_colour = seed.get_trait(TRAIT_FLESH_COLOUR)
if(!flesh_colour) flesh_colour = seed.get_trait(TRAIT_PRODUCT_COLOUR)
for(var/i=0,i<2,i++)
var/obj/item/stack/material/wood/NG = new (user.loc)
if(flesh_colour) NG.color = flesh_colour
for (var/obj/item/stack/material/wood/G in user.loc)
if(G==NG)
continue
if(G.amount>=G.max_amount)
continue
G.attackby(NG, user)
to_chat(user, "You add the newly-formed wood to the stack. It now contains [NG.amount] planks.")
qdel(src)
return
else if(!isnull(seed.chems[/singleton/reagent/drink/potatojuice]))
to_chat(user, "You slice \the [src] into sticks.")
new /obj/item/reagent_containers/food/snacks/rawsticks(get_turf(src))
qdel(src)
return
else if(!isnull(seed.chems[/singleton/reagent/drink/carrotjuice]))
to_chat(user, "You slice \the [src] into sticks.")
new /obj/item/reagent_containers/food/snacks/carrotfries(get_turf(src))
qdel(src)
return
else if(!isnull(seed.chems[/singleton/reagent/drink/earthenrootjuice]))
to_chat(user, "You slice \the [src] into sticks.")
new /obj/item/reagent_containers/food/snacks/earthenroot_chopped(get_turf(src))
qdel(src)
return
else if(!isnull(seed.chems[/singleton/reagent/drink/milk/soymilk]))
to_chat(user, "You roughly chop up \the [src].")
new /obj/item/reagent_containers/food/snacks/soydope(get_turf(src))
qdel(src)
return
else if(seed.get_trait(TRAIT_FLESH_COLOUR))
if (reagents.total_volume)
to_chat(user, "You slice up \the [src].")
var/slices = rand(3,5)
var/reagents_to_transfer = reagents.total_volume/slices
for(var/i=0;i<slices;i++)
var/obj/item/reagent_containers/food/snacks/fruit_slice/F = new(get_turf(src),seed)
reagents.trans_to_obj(F,reagents_to_transfer)
if(dry)
F.on_dry()
qdel(src)
return
..()
/obj/item/reagent_containers/food/snacks/grown/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
. = ..()
if(seed && seed.get_trait(TRAIT_STINGS))
if(!reagents || reagents.total_volume <= 0)
return
reagents.remove_any(rand(1,3))
seed.thrown_at(src, target)
sleep(-1)
if(!src)
return
if(prob(35))
if(user)
to_chat(user, "<span class='danger'>\The [src] has fallen to bits.</span>")
qdel(src)
/obj/item/reagent_containers/food/snacks/grown/attack_self(mob/user as mob)
if(!seed)
return
if(istype(user.loc,/turf/space))
return
if(user.a_intent == I_HURT)
user.visible_message("<span class='danger'>\The [user] squashes \the [src]!</span>")
seed.thrown_at(src,user)
sleep(-1)
if(src) qdel(src)
return
if(seed.kitchen_tag == "grass")
user.show_message("<span class='notice'>You make a grass tile out of \the [src]!</span>", 1)
var/flesh_colour = seed.get_trait(TRAIT_FLESH_COLOUR)
if(!flesh_colour) flesh_colour = seed.get_trait(TRAIT_PRODUCT_COLOUR)
for(var/i=0,i<2,i++)
var/obj/item/stack/tile/grass/G = new (user.loc)
if(flesh_colour) G.color = flesh_colour
for (var/obj/item/stack/tile/grass/NG in user.loc)
if(G==NG)
continue
if(NG.amount>=NG.max_amount)
continue
NG.attackby(G, user)
to_chat(user, "You add the newly-formed grass to the stack. It now contains [G.amount] tiles.")
user.drop_from_inventory(src)
qdel(src)
return
if(seed.get_trait(TRAIT_SPREAD) > 0)
to_chat(user, "<span class='notice'>You plant the [src.name].</span>")
new /obj/machinery/portable_atmospherics/hydroponics/soil/invisible(get_turf(user),src.seed)
qdel(src)
return
/*
if(seed.kitchen_tag)
switch(seed.kitchen_tag)
if("shand")
var/obj/item/stack/medical/bruise_pack/tajaran/poultice = new /obj/item/stack/medical/bruise_pack/tajaran(user.loc)
poultice.heal_brute = potency
to_chat(user, "<span class='notice'>You mash the leaves into a poultice.</span>")
qdel(src)
return
if("mtear")
var/obj/item/stack/medical/ointment/tajaran/poultice = new /obj/item/stack/medical/ointment/tajaran(user.loc)
poultice.heal_burn = potency
to_chat(user, "<span class='notice'>You mash the petals into a poultice.</span>")
qdel(src)
return
*/
/obj/item/reagent_containers/food/snacks/grown/pickup(mob/user)
..()
if(!seed)
return
if(seed.get_trait(TRAIT_STINGS))
var/mob/living/carbon/human/H = user
if(istype(H) && H.gloves)
return
if(!reagents || reagents.total_volume <= 0)
return
reagents.remove_any(rand(1,3)) //Todo, make it actually remove the reagents the seed uses.
seed.do_thorns(H,src)
seed.do_sting(H,src,pick(BP_R_HAND,BP_L_HAND))
/obj/item/reagent_containers/food/snacks/fruit_slice
name = "fruit slice"
desc = "A slice of some tasty fruit."
icon = 'icons/obj/hydroponics_misc.dmi'
icon_state = ""
drop_sound = 'sound/items/drop/herb.ogg'
pickup_sound = 'sound/items/pickup/herb.ogg'
dried_type = /obj/item/reagent_containers/food/snacks/fruit_slice
var/datum/seed/seed
var/list/fruit_icon_cache = list()
/obj/item/reagent_containers/food/snacks/fruit_slice/Initialize(mapload, datum/seed/S)
. = ..()
// Need to go through and make a general image caching controller. Todo.
if(!istype(S))
qdel(src)
return
name = "[S.seed_name] slice"
desc = "A slice of \a [S.seed_name]. Tasty, probably."
seed = S
var/rind_colour = seed.get_trait(TRAIT_PRODUCT_COLOUR)
var/flesh_colour = seed.get_trait(TRAIT_FLESH_COLOUR)
if(!flesh_colour) flesh_colour = rind_colour
if(!fruit_icon_cache["rind-[rind_colour]"])
var/image/I = image(icon,"fruit_rind")
I.color = rind_colour
fruit_icon_cache["rind-[rind_colour]"] = I
add_overlay(fruit_icon_cache["rind-[rind_colour]"])
if(!fruit_icon_cache["slice-[rind_colour]"])
var/image/I = image(icon,"fruit_slice")
I.color = flesh_colour
fruit_icon_cache["slice-[rind_colour]"] = I
add_overlay(fruit_icon_cache["slice-[rind_colour]"])