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