Unexpected Alraune Love (#18077)

Spruced up some flavourful abilities for alraune.
Added a new "Poison Fruit" ability to Alraune. It applies any poison that can be used by the injecting venom ability to fruit grown from the Alraune. There is a notice attached to the selection that states this is intended for scenes and to not leave the poisoned fruit out for people who do not OOC consent, as well as admin logging when this fruit is produced.
Added a new thorns ability for alraune that will cause anyone touching them, or simple mobs attacking them, to take a small amount of brute damage. This starts off and can be toggled off and on at will.
Added variables to seed harvesting so that code can force them to spawn with specific reagents inside.
Allowed alraune to change the type of fruit they spawn more than once.
This commit is contained in:
SatinIsle
2025-07-26 06:41:12 -07:00
committed by GitHub
parent bb1e380f98
commit 195aa07b3a
7 changed files with 103 additions and 4 deletions
+4 -1
View File
@@ -767,7 +767,7 @@
return (P ? P : 0)
//Place the plant products at the feet of the user.
/datum/seed/proc/harvest(var/mob/user,var/yield_mod,var/harvest_sample,var/force_amount)
/datum/seed/proc/harvest(var/mob/user,var/yield_mod,var/harvest_sample,var/force_amount,var/reagent_mod,var/reagent_mod_amount)
if(!user)
return
@@ -824,6 +824,9 @@
var/obj/item/reagent_containers/food/food = product
food.filling_color = get_trait(TRAIT_PRODUCT_COLOUR)
if(reagent_mod && reagent_mod_amount)
product.reagents.add_reagent(reagent_mod,reagent_mod_amount)
if(mysterious)
product.name += "?"
product.desc += " On second thought, something about this one looks strange."
+10
View File
@@ -53,7 +53,17 @@
..()
/mob/living/carbon/attack_hand(mob/M as mob)
if(touch_reaction_flags & SPECIES_TRAIT_THORNS)
if(src != M)
if(istype(M,/mob/living))
var/mob/living/L = M
L.apply_damage(3, BRUTE)
L.visible_message( \
span_warning("[L] is hurt by sharp body parts when touching [src]!"), \
span_warning("[src] is covered in sharp bits and it hurt when you touched them!"), )
if(!istype(M, /mob/living/carbon)) return
if (ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/temp = H.organs_by_name[BP_R_HAND]
@@ -417,6 +417,14 @@
return
/mob/living/carbon/human/attack_generic(var/mob/user, var/damage, var/attack_message, var/armor_type = "melee", var/armor_pen = 0, var/a_sharp = 0, var/a_edge = 0)
if(istype(user,/mob/living))
var/mob/living/L = user
if(touch_reaction_flags & SPECIES_TRAIT_THORNS)
if((src != L))
L.apply_damage(3, BRUTE)
L.visible_message( \
span_warning("[L] is hurt by sharp body parts when touching [src]!"), \
span_warning("[src] is covered in sharp bits and it hurt when you touched them!"), )
if(!damage)
return
@@ -48,7 +48,8 @@
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
inherent_verbs = list(/mob/living/carbon/human/proc/alraune_fruit_select, //Give them the voremodes related to wrapping people in vines and sapping their fluids
/mob/living/carbon/human/proc/tie_hair)
/mob/living/carbon/human/proc/tie_hair,
/mob/living/proc/toggle_thorns)
color_mult = 1
icobase = 'icons/mob/human_races/r_human_vr.dmi'
@@ -351,6 +352,21 @@
var/fruit_type = PLANT_APPLE
var/mob/living/organ_owner = null
var/gen_cost = 0.5
var/poison_reagent
var/list/poison_options = list(
REAGENT_ID_MICROCILLIN,
REAGENT_ID_MACROCILLIN,
REAGENT_ID_NORMALCILLIN,
REAGENT_ID_NUMBENZYME,
REAGENT_ID_ANDROROVIR,
REAGENT_ID_GYNOROVIR,
REAGENT_ID_ANDROGYNOROVIR,
REAGENT_ID_STOXIN,
REAGENT_ID_RAINBOWTOXIN,
REAGENT_ID_PARALYSISTOXIN,
REAGENT_ID_PAINENZYME
)
/obj/item/organ/internal/fruitgland/Initialize(mapload, internal)
. = ..()
@@ -394,7 +410,8 @@
if(selection)
fruit_gland.fruit_type = selection
add_verb(src, /mob/living/carbon/human/proc/alraune_fruit_pick)
remove_verb(src, /mob/living/carbon/human/proc/alraune_fruit_select)
add_verb(src, /mob/living/carbon/human/proc/alraune_fruit_reagent)
// remove_verb(src, /mob/living/carbon/human/proc/alraune_fruit_select) //We are allowing them to switch fruits now.
fruit_gland.organ_owner = src
fruit_gland.emote_descriptor = list("fruit right off of [fruit_gland.organ_owner]!", "a fruit from [fruit_gland.organ_owner]!")
@@ -426,7 +443,12 @@
return
var/datum/seed/S = SSplants.seeds["[fruit_gland.fruit_type]"]
S.harvest(usr,0,0,1)
if(fruit_gland.poison_reagent)
S.harvest(usr,0,0,1,fruit_gland.poison_reagent,10)
log_admin("[src] played by [src.ckey] has produced a fruit containing [fruit_gland.poison_reagent]. It was picked by [usr].")
else
S.harvest(usr,0,0,1)
var/index = rand(0,2)
@@ -442,6 +464,34 @@
fruit_gland.reagents.remove_any(fruit_gland.transfer_amount)
/mob/living/carbon/human/proc/alraune_fruit_reagent()
set name = "Poison Fruit"
set desc = "Select a reagent to be placed in your fruit."
set category = "Abilities.Alraune"
if(!isliving(usr) || !usr.checkClickCooldown())
return
if(usr.incapacitated() || usr.stat > CONSCIOUS)
return
var/obj/item/organ/internal/fruitgland/fruit_gland
for(var/I in contents)
if(istype(I, /obj/item/organ/internal/fruitgland))
fruit_gland = I
break
if(fruit_gland)
var/poison_choice = tgui_input_list(src, "Choose which reagent to poison your fruit with! Be aware, this option is intended for use in scenes and ERP. This is not for use as pranks or to change the gender of unsuspecting crew, and you must be aware of the preferences of the people who eat it. Do not just leave it out unattended.", "Select reagent", fruit_gland.poison_options)
if(!poison_choice)
to_chat(src, span_notice("You have chosen no poison to add, any previously chosen poisons have been cleared and no poison will be added to produced fruits."))
fruit_gland.poison_reagent = null
return
else
fruit_gland.poison_reagent = poison_choice
to_chat(src, span_notice("Fruit that you produce will now contain [poison_choice]. Be aware of out of character consent."))
return
//End of fruit gland code.
/datum/species/alraune/get_race_key()
+15
View File
@@ -98,6 +98,12 @@
if(istype(L) && L.a_intent != I_HELP)
if(ai_holder) // Using disarm, grab, or harm intent is considered a hostile action to the mob's AI.
ai_holder.react_to_attack(L)
if(touch_reaction_flags & SPECIES_TRAIT_THORNS)
if(src != L)
L.apply_damage(3, BRUTE)
L.visible_message( \
span_warning("[L] is hurt by sharp body parts when touching [src]!"), \
span_warning("[src] is covered in sharp bits and it hurt when you touched them!"), )
/mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone)
@@ -393,6 +399,15 @@
// End BS12 momentum-transfer code.
/mob/living/attack_generic(var/mob/user, var/damage, var/attack_message)
if(istype(user,/mob/living))
var/mob/living/L = user
if(touch_reaction_flags & SPECIES_TRAIT_THORNS)
if((src != L))
L.apply_damage(3, BRUTE)
L.visible_message( \
span_warning("[L] is hurt by sharp body parts when touching [src]!"), \
span_warning("[src] is covered in sharp bits and it hurt when you touched them!"), )
if(!damage)
return
+12
View File
@@ -55,6 +55,18 @@
touch_reaction_flags |= SPECIES_TRAIT_PERSONAL_BUBBLE
to_chat(src,span_notice("You will now dodge all attempts at hugging, patting, booping, licking, smelling and hand shaking."))
/mob/living/proc/toggle_thorns()
set name = "Toggle Thorns"
set desc = "Toggles defensive thorns across your body."
set category = "Abilities.General"
if(touch_reaction_flags & SPECIES_TRAIT_THORNS)
touch_reaction_flags &= ~(SPECIES_TRAIT_THORNS)
to_chat(src,span_notice("You will no longer be covered in defensive thorns."))
else
touch_reaction_flags |= SPECIES_TRAIT_THORNS
to_chat(src,span_notice("You will now be covered in defensive thorns that may hurt those who touch you."))
/mob/living/proc/toggle_sparkles()
set name = "Toggle Sparkles"
set desc = "Toggle fancy glowing sparkles!"