diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index ceab50c77f6..17417104463 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -107,7 +107,7 @@
descriptors |= "sweet-sour"
if(reagents.has_reagent("radium") || reagents.has_reagent("uranium"))
descriptors |= "radioactive"
- if(reagents.has_reagent("amanitin") || reagents.has_reagent("toxin"))
+ if(reagents.has_reagent("amanitin") || reagents.has_reagent("toxin") || reagents.has_reagent("carpotoxin"))
descriptors |= "poisonous"
if(reagents.has_reagent("lsd") || reagents.has_reagent("space_drugs") || reagents.has_reagent("psilocybin"))
descriptors |= "hallucinogenic"
@@ -119,6 +119,10 @@
descriptors |= "slippery"
if(reagents.has_reagent("facid") || reagents.has_reagent("sacid"))
descriptors |= "acidic"
+ if(reagents.has_reagent("fuel"))
+ descriptors |= "flammable"
+ if(reagents.has_reagent("moonshine"))
+ descriptors |= "intoxicating"
if(seed.get_trait(TRAIT_JUICY))
descriptors |= "juicy"
if(seed.get_trait(TRAIT_STINGS))
diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm
index 079feb33229..eb3a2a89fc1 100644
--- a/code/modules/hydroponics/seed.dm
+++ b/code/modules/hydroponics/seed.dm
@@ -733,8 +733,9 @@
else
product = new /obj/item/weapon/reagent_containers/food/snacks/grown(get_turf(user),name)
if(get_trait(TRAIT_PRODUCT_COLOUR))
- if(!has_mob_product || (has_mob_product && has_mob_product != /mob/living/carbon/primitive/diona))
- product.color = get_trait(TRAIT_PRODUCT_COLOUR)
+ if(modular_icon == 1)
+ if(!has_mob_product || (has_mob_product && has_mob_product != /mob/living/carbon/primitive/diona))
+ product.color = get_trait(TRAIT_PRODUCT_COLOUR)
if(istype(product,/obj/item/weapon/reagent_containers/food))
var/obj/item/weapon/reagent_containers/food/food = product
food.filling_color = get_trait(TRAIT_PRODUCT_COLOUR)
@@ -775,6 +776,8 @@
if(chems) new_seed.chems = chems.Copy()
if(consume_gasses) new_seed.consume_gasses = consume_gasses.Copy()
if(exude_gasses) new_seed.exude_gasses = exude_gasses.Copy()
+ new_seed.modular_icon = modular_icon
+ new_seed.preset_icon = preset_icon
new_seed.seed_name = "[(roundstart ? "[(modified ? "modified" : "mutant")] " : "")][seed_name]"
new_seed.display_name = "[(roundstart ? "[(modified ? "modified" : "mutant")] " : "")][display_name]"
diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm
index 52c84e6d266..919b2e5cbbc 100644
--- a/code/modules/hydroponics/seed_datums.dm
+++ b/code/modules/hydroponics/seed_datums.dm
@@ -4,7 +4,7 @@
seed_name = "chili"
display_name = "chili plants"
chems = list("capsaicin" = list(3,5), "plantmatter" = list(1,25))
- mutants = list("icechili")
+ mutants = list("icechili", "ghostchili")
kitchen_tag = "chili"
preset_icon = "chilipepper"
@@ -34,6 +34,21 @@
set_trait(TRAIT_PRODUCTION,4)
set_trait(TRAIT_PRODUCT_COLOUR,"#00EDC6")
+/datum/seed/chili/ghost
+ name = "ghostchili"
+ seed_name = "ghost pepper"
+ display_name = "ghost pepper plants"
+ mutants = null
+ chems = list("capsaicin" = list(8,2), "condensedcapsaicin" = list(4,4), "plantmatter" = list(1,50))
+ kitchen_tag = "ghostchili"
+ preset_icon = "ghostchilipepper"
+
+/datum/seed/chili/ice/New()
+ ..()
+ set_trait(TRAIT_MATURATION,4)
+ set_trait(TRAIT_PRODUCTION,4)
+ set_trait(TRAIT_PRODUCT_COLOUR,"#00EDC6")
+
// Berry plants/variants.
/datum/seed/berry
name = "berries"
@@ -671,9 +686,11 @@
set_trait(TRAIT_PRODUCT_COLOUR,"#B33715")
set_trait(TRAIT_PLANT_ICON,"flower3")
+//Sunflowers/varieties
/datum/seed/flower/sunflower
name = "sunflowers"
seed_name = "sunflower"
+ mutants = list("moonflowers", "novaflowers")
display_name = "sunflowers"
preset_icon = "sunflower"
@@ -684,6 +701,36 @@
set_trait(TRAIT_PRODUCT_COLOUR,"#FFF700")
set_trait(TRAIT_PLANT_ICON,"flower2")
+/datum/seed/flower/moonflower
+ name = "moonflowers"
+ seed_name = "moonflowers"
+ chems = list("plantmatter" = list(1,50), "moonshine" = list(1,10))
+ mutants = null
+ display_name = "moonflowers"
+ preset_icon = "moonflower"
+
+/datum/seed/flower/moonflower/New()
+ ..()
+ set_trait(TRAIT_MATURATION,6)
+ set_trait(TRAIT_PRODUCT_ICON,"flower2")
+ set_trait(TRAIT_PRODUCT_COLOUR,"#B5ABDD")
+ set_trait(TRAIT_PLANT_ICON,"flower2")
+
+/datum/seed/flower/novaflower
+ name = "novaflowers"
+ seed_name = "novaflower"
+ mutants = null
+ chems = list("fuel" = list(1,10))
+ display_name = "novaflowers"
+ preset_icon = "novaflower"
+
+/datum/seed/flower/novaflower/New()
+ ..()
+ set_trait(TRAIT_MATURATION,6)
+ set_trait(TRAIT_PRODUCT_ICON,"flower2")
+ set_trait(TRAIT_PRODUCT_COLOUR,"#E2A932")
+ set_trait(TRAIT_PLANT_ICON,"flower2")
+
//Grapes/varieties
/datum/seed/grapes
name = "grapes"
@@ -717,6 +764,47 @@
..()
set_trait(TRAIT_PRODUCT_COLOUR,"42ed2f")
+//Soybeans/varieties
+/datum/seed/soybean
+ name = "soybean"
+ seed_name = "soybean"
+ display_name = "soybeans"
+ chems = list("plantmatter" = list(1,20), "soybeanoil" = list(1,20))
+ mutants = list("koibean")
+ kitchen_tag = "soybeans"
+ preset_icon = "soybeans"
+
+/datum/seed/soybean/New()
+ ..()
+ set_trait(TRAIT_HARVEST_REPEAT,1)
+ set_trait(TRAIT_MATURATION,4)
+ set_trait(TRAIT_PRODUCTION,4)
+ set_trait(TRAIT_YIELD,3)
+ set_trait(TRAIT_POTENCY,5)
+ set_trait(TRAIT_PRODUCT_ICON,"bean")
+ set_trait(TRAIT_PRODUCT_COLOUR,"#EBE7C0")
+ set_trait(TRAIT_PLANT_ICON,"stalk")
+
+/datum/seed/soybean/koi
+ name = "koibean"
+ seed_name = "koibean"
+ display_name = "koi beans"
+ chems = list("plantmatter" = list(1,30), "carpotoxin" = list(1,20))
+ mutants = null
+ kitchen_tag = "koibean"
+ preset_icon = "koibeans"
+
+/datum/seed/soybean/koi/New()
+ ..()
+ set_trait(TRAIT_HARVEST_REPEAT,1)
+ set_trait(TRAIT_MATURATION,4)
+ set_trait(TRAIT_PRODUCTION,4)
+ set_trait(TRAIT_YIELD,3)
+ set_trait(TRAIT_POTENCY,5)
+ set_trait(TRAIT_PRODUCT_ICON,"bean")
+ set_trait(TRAIT_PRODUCT_COLOUR,"#EBE7C0")
+ set_trait(TRAIT_PLANT_ICON,"stalk")
+
//Everything else
/datum/seed/peanuts
name = "peanut"
@@ -815,25 +903,6 @@
set_trait(TRAIT_PRODUCT_COLOUR,"#D4CAB4")
set_trait(TRAIT_PLANT_ICON,"bush2")
-/datum/seed/soybean
- name = "soybean"
- seed_name = "soybean"
- display_name = "soybeans"
- chems = list("plantmatter" = list(1,20), "soybeanoil" = list(1,20))
- kitchen_tag = "soybeans"
- preset_icon = "soybeans"
-
-/datum/seed/soybean/New()
- ..()
- set_trait(TRAIT_HARVEST_REPEAT,1)
- set_trait(TRAIT_MATURATION,4)
- set_trait(TRAIT_PRODUCTION,4)
- set_trait(TRAIT_YIELD,3)
- set_trait(TRAIT_POTENCY,5)
- set_trait(TRAIT_PRODUCT_ICON,"bean")
- set_trait(TRAIT_PRODUCT_COLOUR,"#EBE7C0")
- set_trait(TRAIT_PLANT_ICON,"stalk")
-
/datum/seed/wheat
name = "wheat"
seed_name = "wheat"
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
index 4e9f6d76b77..077ad9ce444 100644
--- a/code/modules/hydroponics/trays/tray.dm
+++ b/code/modules/hydroponics/trays/tray.dm
@@ -324,6 +324,10 @@
seed.harvest(user,yield_mod)
else
seed.harvest(get_turf(src),yield_mod)
+ //Increases harvest count for round-end score
+ //Currently per-plant (not per-item) harvested
+ // --FalseIncarnate
+ score_stuffharvested++
// Reset values.
harvest = 0
diff --git a/code/modules/mob/living/carbon/primitive/dionaold.dm b/code/modules/mob/living/carbon/primitive/dionaold.dm
index 6f0b20ce04a..c5a7b5a5b70 100644
--- a/code/modules/mob/living/carbon/primitive/dionaold.dm
+++ b/code/modules/mob/living/carbon/primitive/dionaold.dm
@@ -237,3 +237,25 @@
/mob/living/carbon/primitive/diona/put_in_active_hand(obj/item/W)
src << "\red You don't have any hands!"
return
+
+/mob/living/carbon/primitive/diona/say(var/message)
+ if(client)
+ if(client.prefs.muted & MUTE_IC)
+ src << "\red You cannot speak in IC (Muted)."
+ return
+
+ message = trim_strip_html_properly(message)
+
+ if(stat)
+ if(stat == 2)
+ return say_dead(message)
+ return
+
+ if (is_muzzled())
+ src << "You're muzzled and cannot speak!"
+ return
+
+ if(copytext(message,1,2) == "*")
+ return emote(copytext(message,2))
+
+ ..(message)
diff --git a/code/modules/mob/living/carbon/primitive/emote.dm b/code/modules/mob/living/carbon/primitive/emote.dm
new file mode 100644
index 00000000000..970c4664afc
--- /dev/null
+++ b/code/modules/mob/living/carbon/primitive/emote.dm
@@ -0,0 +1,182 @@
+/mob/living/carbon/primitive/emote(var/act,var/m_type=1,var/message = null)
+
+ var/param = null
+ if (findtext(act, "-", 1, null))
+ var/t1 = findtext(act, "-", 1, null)
+ param = copytext(act, t1 + 1, length(act) + 1)
+ act = copytext(act, 1, t1)
+
+ if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
+ act = copytext(act,1,length(act))
+
+ var/muzzled = is_muzzled()
+
+ //Emote Cooldown System (it's so simple!)
+ // proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
+ var/on_CD = 0
+ switch(act)
+ //Cooldown-inducing emotes
+ if("chirp")
+ if(istype(src,/mob/living/carbon/primitive/diona)) //Only Diona Nymphs can chirp
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
+ else //Everyone else fails, skip the emote attempt
+ return
+ if("flip")
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
+ //Everything else, including typos of the above emotes
+ else
+ on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown
+
+ if(on_CD == 1) // Check if we need to suppress the emote attempt.
+ return // Suppress emote, you're still cooling off.
+ //--FalseIncarnate
+
+ switch(act)
+ if ("me")
+ if(silent)
+ return
+ if (src.client)
+ if (client.prefs.muted & MUTE_IC)
+ src << "\red You cannot send IC messages (muted)."
+ return
+ if (src.client.handle_spam_prevention(message,MUTE_IC))
+ return
+ if (stat)
+ return
+ if(!(message))
+ return
+ return custom_emote(m_type, message)
+
+
+ if ("custom")
+ return custom_emote(m_type, message)
+
+ if ("chirp")
+ message = "The [src.name] chirps!"
+ playsound(src.loc, 'sound/misc/nymphchirp.ogg', 50, 0)
+ m_type = 2
+ if("sign")
+ if (!src.restrained())
+ message = text("The [src.name] signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null))
+ m_type = 1
+ if("scratch")
+ if (!src.restrained())
+ message = "The [src.name] scratches."
+ m_type = 1
+ if("whimper")
+ if (!muzzled)
+ message = "The [src.name] whimpers."
+ m_type = 2
+ if("roar")
+ if (!muzzled)
+ message = "The [src.name] roars."
+ m_type = 2
+ if("tail")
+ message = "The [src.name] waves his tail."
+ m_type = 1
+ if("gasp")
+ message = "The [src.name] gasps."
+ m_type = 2
+ if("shiver")
+ message = "The [src.name] shivers."
+ m_type = 2
+ if("drool")
+ message = "The [src.name] drools."
+ m_type = 1
+ if("paw")
+ if (!src.restrained())
+ message = "The [src.name] flails his paw."
+ m_type = 1
+ if("scretch")
+ if (!muzzled)
+ message = "The [src.name] scretches."
+ m_type = 2
+ if("choke")
+ message = "The [src.name] chokes."
+ m_type = 2
+ if("moan")
+ message = "The [src.name] moans!"
+ m_type = 2
+ if("nod")
+ message = "The [src.name] nods his head."
+ m_type = 1
+ if("sit")
+ message = "The [src.name] sits down."
+ m_type = 1
+ if("sway")
+ message = "The [src.name] sways around dizzily."
+ m_type = 1
+ if("sulk")
+ message = "The [src.name] sulks down sadly."
+ m_type = 1
+ if("twitch")
+ message = "The [src.name] twitches violently."
+ m_type = 1
+ if("dance")
+ if (!src.restrained())
+ message = "The [src.name] dances around happily."
+ m_type = 1
+ if("roll")
+ if (!src.restrained())
+ message = "The [src.name] rolls."
+ m_type = 1
+ if("shake")
+ message = "The [src.name] shakes his head."
+ m_type = 1
+ if("gnarl")
+ if (!muzzled)
+ message = "The [src.name] gnarls and shows his teeth.."
+ m_type = 2
+ if("jump")
+ message = "The [src.name] jumps!"
+ m_type = 1
+ if("collapse")
+ Paralyse(2)
+ message = "[src.name] collapses!"
+ m_type = 2
+ if("deathgasp")
+ message = "The [src.name] lets out a faint chimper as it collapses and stops moving..."
+ m_type = 1
+ if ("flip")
+ m_type = 1
+ if (!src.restrained())
+ var/M = null
+ if (param)
+ for (var/mob/A in view(1, null))
+ if (param == A.name)
+ M = A
+ break
+ if (M == src)
+ M = null
+ if (M)
+ if(src.lying || src.weakened)
+ message = "[src] flops and flails around on the floor."
+ else
+ message = "[src] flips in [M]'s general direction."
+ src.SpinAnimation(5,1)
+ else
+ if(src.lying || src.weakened)
+ message = "[src] flops and flails around on the floor."
+ else
+ message = "[src] does a flip!"
+ src.SpinAnimation(5,1)
+ if("help")
+ var/text = "choke, "
+ if(istype(src,/mob/living/carbon/primitive/diona))
+ text += "chirp, "
+ text += "flip, collapse, dance, deathgasp, drool, gasp, shiver, gnarl, jump, paw, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper"
+ src << text
+ else
+ src << text("Invalid Emote: []", act)
+ if ((message && src.stat == 0))
+ if(src.client)
+ log_emote("[name]/[key] : [message]")
+ if (m_type & 1)
+ for(var/mob/O in viewers(src, null))
+ O.show_message(message, m_type)
+ //Foreach goto(703)
+ else
+ for(var/mob/O in hearers(src, null))
+ O.show_message(message, m_type)
+ //Foreach goto(746)
+ return
\ No newline at end of file
diff --git a/paradise.dme b/paradise.dme
index 4c6733710e9..05bf2766401 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1351,6 +1351,7 @@
#include "code\modules\mob\living\carbon\metroid\subtypes.dm"
#include "code\modules\mob\living\carbon\metroid\update_icons.dm"
#include "code\modules\mob\living\carbon\primitive\dionaold.dm"
+#include "code\modules\mob\living\carbon\primitive\emote.dm"
#include "code\modules\mob\living\silicon\death.dm"
#include "code\modules\mob\living\silicon\login.dm"
#include "code\modules\mob\living\silicon\say.dm"