diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 933cf12dcfc..f4aca3c4aeb 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -198,6 +198,7 @@
#define isdiona(A) (is_species(A, /datum/species/diona))
#define ismachineperson(A) (is_species(A, /datum/species/machine))
#define isdrask(A) (is_species(A, /datum/species/drask))
+#define iswryn(A) (is_species(A, /datum/species/wryn))
#define isanimal(A) (istype((A), /mob/living/simple_animal))
#define isdog(A) (istype((A), /mob/living/simple_animal/pet/dog))
diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm
index 1583bc62c70..3759109019f 100644
--- a/code/modules/mob/living/carbon/human/body_accessories.dm
+++ b/code/modules/mob/living/carbon/human/body_accessories.dm
@@ -78,7 +78,7 @@ GLOBAL_LIST_INIT(body_accessory_by_species, list("None" = null))
return TRUE
return FALSE
-
+//Tajaran
/datum/body_accessory/tail/wingler_tail // Jay wingler fluff tail
name = "Striped Tail"
icon_state = "winglertail"
@@ -115,3 +115,10 @@ GLOBAL_LIST_INIT(body_accessory_by_species, list("None" = null))
icon_state = "straightbushy"
animated_icon_state = "straightbushy_a"
allowed_species = list("Vulpkanin")
+
+//Wryn
+/datum/body_accessory/tail/wryn
+ name = "Bee Tail"
+ icon_state = "wryntail"
+ allowed_species = list("Wryn")
+
diff --git a/code/modules/mob/living/carbon/human/species/wryn.dm b/code/modules/mob/living/carbon/human/species/wryn.dm
index 9040e651749..e977022d0d3 100644
--- a/code/modules/mob/living/carbon/human/species/wryn.dm
+++ b/code/modules/mob/living/carbon/human/species/wryn.dm
@@ -49,6 +49,102 @@
//Default styles for created mobs.
default_hair = "Antennae"
+ var/datum/action/innate/wryn_sting/wryn_sting
+
+/datum/species/wryn/on_species_gain(mob/living/carbon/human/H)
+ ..()
+ wryn_sting = new
+ wryn_sting.Grant(H)
+
+/datum/species/wryn/on_species_loss(mob/living/carbon/human/H)
+ ..()
+ if(wryn_sting)
+ wryn_sting.Remove(H)
+
+/* Wryn Sting Action Begin */
+
+//Define the Sting Action
+/datum/action/innate/wryn_sting
+ name = "Wryn Sting"
+ desc = "Readies Wryn Sting for stinging."
+ button_icon_state = "wryn_sting_off" //Default Button State
+ check_flags = AB_CHECK_LYING | AB_CHECK_CONSCIOUS | AB_CHECK_STUNNED
+ var/button_on = FALSE
+
+//What happens when you click the Button?
+/datum/action/innate/wryn_sting/Trigger()
+ if(!..())
+ return
+ var/mob/living/carbon/user = owner
+ if((user.restrained() && user.pulledby) || user.buckled) //Is your Wryn restrained, pulled, or buckled? No stinging!
+ to_chat(user, "You need freedom of movement to sting someone!")
+ return
+ if(user.wear_suit) //Is your Wryn wearing a Hardsuit or a Laboat that's blocking their Stinger?
+ to_chat(user, "You must remove your hardsuit, labcoat, or jacket before using your Wryn stinger.")
+ return
+ if(user.getStaminaLoss() >= 50) //Does your Wryn have enough Stamina to sting?
+ to_chat(user, "You feel too tired to use your Wryn Stinger at the moment.")
+ return
+ else
+ button_on = TRUE
+ UpdateButtonIcon()
+ select_target(user)
+
+//Update the Button Icon
+/datum/action/innate/wryn_sting/UpdateButtonIcon()
+ if(button_on)
+ button_icon_state = "wryn_sting_on"
+ name = "Wryn Stinger \[READY\]"
+ button.name = name
+ else
+ button_icon_state = "wryn_sting_off"
+ name = "Wryn Stinger"
+ button.name = name
+ ..()
+
+//Select a Target from a List
+/datum/action/innate/wryn_sting/proc/select_target(var/mob/living/carbon/human/user)
+ var/list/names = list()
+ for(var/mob/living/carbon/human/M in orange(1))
+ names += M
+ var/target = input("Select a Target: ", "Sting Target", null) as null|anything in names
+ if(!target) //No one's around!
+ to_chat(user, "There's no one around to sting so you retract your stinger.")
+ user.visible_message("")
+ button_on = FALSE
+ UpdateButtonIcon()
+ return
+ else //Get ready, aim, fire!
+ user.visible_message(" [user] prepares to use their Wryn stinger!")
+ sting_target(user, target)
+ return
+
+//What does the Wryn Sting do?
+/datum/action/innate/wryn_sting/proc/sting_target(mob/living/carbon/human/user, mob/living/carbon/human/target)
+ button_on = FALSE //For when we Update the Button Icon
+ if(!(target in orange(1, user))) //Dang, did they get away?
+ to_chat(user, "You are no longer adjacent to [target]. You retract your stinger for now.")
+ user.visible_message("")
+ UpdateButtonIcon()
+ return
+ else //Nah, that chump is still here! Sting 'em! Sting 'em good!
+ var/obj/item/organ/external/organ = target.get_organ(pick("l_leg", "r_leg", "l_foot", "r_foot", "groin"))
+ to_chat(user, " You sting [target] in their [organ] with your stinger!")
+ user.visible_message("[user] stings [target] in [organ] with their stinger! ")
+ user.adjustStaminaLoss(20) //You can't sting infinitely, Wryn - take some Stamina loss
+ var/dam = rand(3, 7)
+ target.apply_damage(dam, BRUTE, organ)
+ playsound(user.loc, 'sound/weapons/bladeslice.ogg', 50, 0)
+ add_attack_logs(user, target, "Stung by Wryn Stinger - [dam] Brute damage to [organ].")
+ if(target.restrained()) //Apply tiny BURN damage if target is restrained
+ if(prob(50))
+ user.apply_damage(2, BURN, target)
+ to_chat(target, "You feel a little burnt! Yowch!")
+ user.visible_message("[user] is looking a little burnt!")
+ UpdateButtonIcon()
+ return
+
+/* Wryn Sting Action End */
/datum/species/wryn/handle_death(gibbed, mob/living/carbon/human/H)
for(var/mob/living/carbon/C in GLOB.alive_mob_list)
diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi
index 87c047f397a..7bac1bdbe48 100644
Binary files a/icons/effects/species.dmi and b/icons/effects/species.dmi differ
diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi
index 7238ef6072e..e270095cbd6 100644
Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ
diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi
index 4a9c56c8280..7ae9721d4b3 100644
Binary files a/icons/mob/body_accessory.dmi and b/icons/mob/body_accessory.dmi differ