diff --git a/code/__DEFINES/~monkestation/martial_arts.dm b/code/__DEFINES/~monkestation/martial_arts.dm new file mode 100644 index 000000000000..b7dc5a04264e --- /dev/null +++ b/code/__DEFINES/~monkestation/martial_arts.dm @@ -0,0 +1,3 @@ +//Monkestation exclusive martial arts defines. + +#define MARTIALART_TRIBALCLAW "tribal claw" diff --git a/monkestation/code/modules/martial_arts/granters/tribal_claw_gr.dm b/monkestation/code/modules/martial_arts/granters/tribal_claw_gr.dm new file mode 100644 index 000000000000..d4767ed45ff3 --- /dev/null +++ b/monkestation/code/modules/martial_arts/granters/tribal_claw_gr.dm @@ -0,0 +1,38 @@ +/obj/item/book/granter/martial/tribal_claw + martial = /datum/martial_art/tribal_claw + name = "old scroll" + martial_name = "tribal claw" + desc = "A scroll filled with ancient draconic markings." + greet = span_sciradio("You have learned the ancient martial art of the Tribal Claw! You are now able to use your tail and claws in a fight much better than before. \ + Check the combos you are now able to perform using the Recall Teachings verb in the Tribal Claw tab") + icon = 'icons/obj/wizard.dmi' + icon_state = "scroll2" + remarks = list("I must prove myself worthy to the masters of the Knoises clan...", + "Use your tail to surprise any enemy...", + "Your sharp claws can disorient them...", + "I don't think this would combine with other martial arts...", + "Ooga Booga..." + ) + +/obj/item/book/granter/martial/tribal_claw/on_reading_finished(mob/living/carbon/user) + . = ..() + update_appearance() + +/obj/item/book/granter/martial/tribal_claw/update_appearance(updates) + . = ..() + if(uses <= 0) + name = "empty scroll" + desc = "It's completely blank." + icon_state = "blankscroll" + else + name = initial(name) + desc = initial(desc) + icon_state = initial(icon_state) + +/obj/item/book/granter/martial/tribal_claw/can_learn(mob/user) + if(!islizard(user)) + to_chat(user, span_warning("You try to read the scroll but can't comprehend any of it.")) + return FALSE + else + return TRUE + diff --git a/monkestation/code/modules/martial_arts/spells/spells.dm b/monkestation/code/modules/martial_arts/spells/spells.dm new file mode 100644 index 000000000000..f44af1fa61c0 --- /dev/null +++ b/monkestation/code/modules/martial_arts/spells/spells.dm @@ -0,0 +1,29 @@ + +//tribal claw +/datum/action/cooldown/spell/aoe/repulse/martial/lizard + name = "martial Tail Sweep" + desc = "You should probably tell an admin if you can see this." + background_icon_state = "bg_alien" + overlay_icon_state = "bg_alien_border" + button_icon = 'icons/mob/actions/actions_xeno.dmi' + button_icon_state = "tailsweep" + panel = "Alien" + sound = 'sound/magic/tail_swing.ogg' + + cooldown_time = 0 + spell_requirements = NONE + + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + invocation_type = INVOCATION_NONE + antimagic_flags = NONE + aoe_radius = 2 + + sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep + +/datum/action/cooldown/spell/aoe/repulse/martial/cast(atom/cast_on) + if(iscarbon(cast_on)) + var/mob/living/carbon/carbon_caster = cast_on + playsound(get_turf(carbon_caster), 'sound/voice/hiss5.ogg', 80, TRUE, TRUE) + carbon_caster.spin(6, 1) + + return ..() diff --git a/monkestation/code/modules/martial_arts/tribal_claw.dm b/monkestation/code/modules/martial_arts/tribal_claw.dm new file mode 100644 index 000000000000..307820d8d9f5 --- /dev/null +++ b/monkestation/code/modules/martial_arts/tribal_claw.dm @@ -0,0 +1,119 @@ +//ported directly from Bee, cleaned up and updated to function with TG. thanks bee! + +#define TAIL_SWEEP_COMBO "DH" +#define FACE_SCRATCH_COMBO "HH" +#define JUGULAR_CUT_COMBO "HD" +#define TAIL_GRAB_COMBO "DDG" + +/datum/martial_art/tribal_claw + name = "Tribal Claw" + id = MARTIALART_TRIBALCLAW + allow_temp_override = FALSE + help_verb = /mob/living/carbon/human/proc/tribal_claw_help + +/datum/martial_art/tribal_claw/proc/check_streak(mob/living/carbon/human/attacker, mob/living/carbon/human/target) + if(findtext(streak,TAIL_SWEEP_COMBO)) + streak = "" + tailSweep(attacker,target) + return TRUE + if(findtext(streak,FACE_SCRATCH_COMBO)) + streak = "" + faceScratch(attacker,target) + return TRUE + if(findtext(streak,JUGULAR_CUT_COMBO)) + streak = "" + jugularCut(attacker,target) + return TRUE + if(findtext(streak,TAIL_GRAB_COMBO)) + streak = "" + tailGrab(attacker,target) + return TRUE + return FALSE + +//Tail Sweep, triggers an effect similar to Alien Queen's tail sweep but only affects stuff 1 tile next to you, basically 3x3. +/datum/martial_art/tribal_claw/proc/tailSweep(mob/living/carbon/human/attacker, mob/living/carbon/human/target) + if(attacker == current_target) + return + log_combat(attacker, target, "tail sweeped(Tribal Claw)", name) + target.visible_message(span_warning("[attacker] sweeps [target]'s legs with their tail!"), \ + span_userdanger("[attacker] sweeps your legs with their tail!")) + var/static/datum/action/cooldown/spell/aoe/repulse/martial/lizard/tail_sweep = new + tail_sweep.cast(attacker) + +//Face Scratch, deals 10 brute to head(reduced by armor), blurs the target's vision and gives them the confused effect for a short time. +/datum/martial_art/tribal_claw/proc/faceScratch(mob/living/carbon/human/attacker, mob/living/carbon/human/target) + var/def_check = target.getarmor(BODY_ZONE_HEAD, MELEE) + log_combat(attacker, target, "face scratched (Tribal Claw)", name) + target.visible_message(span_warning("[attacker] scratches [target]'s face with their claws!"), \ + span_userdanger("[attacker] scratches your face with their claws!")) + target.apply_damage(10, BRUTE, BODY_ZONE_HEAD, def_check) + target.adjust_confusion(5 SECONDS) + target.adjust_eye_blur(5 SECONDS) + attacker.do_attack_animation(target, ATTACK_EFFECT_CLAW) + playsound(get_turf(target), 'sound/weapons/slash.ogg', 50, 1, -1) + +/* +Jugular Cut, can only be done if the target is in crit, being held in a tier 3 grab by the user or if they are sleeping. +Deals 15 brute to head(reduced by armor) and causes a rapid bleeding effect similar to throat slicing someone with a sharp item. +*/ +//LIES!! TG completely FUCKED throat slitting and it's EXTREMELY DIFFICULT to replicate. This absolutely sucked to code. + + +/datum/martial_art/tribal_claw/proc/jugularCut(mob/living/carbon/attacker, mob/living/carbon/target) + var/def_check = target.getarmor(BODY_ZONE_HEAD, MELEE) + var/wound_type = /datum/wound/slash/flesh/critical + var/obj/item/bodypart/head = target.get_bodypart(BODY_ZONE_HEAD) + var/datum/wound/slash/flesh/jugcut = new wound_type() + + if((target.health <= target.crit_threshold || (attacker.pulling == target && attacker.grab_state >= GRAB_NECK) || target.IsSleeping())) + log_combat(attacker, target, "jugular cut (Tribal Claw)", name) + target.visible_message(span_warning("[attacker] cuts [target]'s jugular vein with their claws!"), \ + span_userdanger("[attacker] cuts your jugular vein!")) + target.apply_damage(15, BRUTE, BODY_ZONE_HEAD, def_check) + jugcut.apply_wound(head) + attacker.do_attack_animation(target, ATTACK_EFFECT_CLAW) + playsound(get_turf(target), 'sound/weapons/slash.ogg', 50, 1, -1) + else + //the original code says that this should be a basic attack instead, but not quite sure I could get that to work without fanangling + return MARTIAL_ATTACK_FAIL + + +//Tail Grab, instantly puts your target in a T3 grab and makes them unable to talk for a short time. +/datum/martial_art/tribal_claw/proc/tailGrab(mob/living/carbon/human/attacker, mob/living/carbon/human/target) + log_combat(attacker, target, "tail grabbed (Tribal Claw)", name) + target.visible_message(span_warning("[attacker] grabs [target] with their tail!"), \ + span_userdanger("[attacker] grabs you with their tail!6")) + target.grabbedby(attacker, 1) + target.Knockdown(5) //Without knockdown target still stands up while T3 grabbed. + attacker.setGrabState(GRAB_NECK) + target.adjust_silence_up_to(10 SECONDS, 10 SECONDS) + +/datum/martial_art/tribal_claw/harm_act(mob/living/carbon/human/attacker, mob/living/carbon/human/target) + add_to_streak("H",target) + if(check_streak(attacker,target)) + return TRUE + return FALSE + +/datum/martial_art/tribal_claw/disarm_act(mob/living/carbon/human/attacker, mob/living/carbon/human/target) + add_to_streak("D",target) + if(check_streak(attacker,target)) + return TRUE + return FALSE + +/datum/martial_art/tribal_claw/grab_act(mob/living/carbon/human/attacker, mob/living/carbon/human/target) + add_to_streak("G",target) + if(check_streak(attacker,target)) + return TRUE + return FALSE + +/mob/living/carbon/human/proc/tribal_claw_help() + set name = "Recall Teachings" + set desc = "Remember the martial techniques of the Tribal Claw" + set category = "Tribal Claw" + + to_chat(usr, "You retreat inward and recall the teachings of the Tribal Claw...") + + to_chat(usr, span_notice("Tail Sweep: Disarm Harm. Pushes everyone around you away and knocks them down.")) + to_chat(usr, span_notice("Face Scratch: Harm Harm. Damages your target's head and confuses them for a short time.")) + to_chat(usr, span_notice("Jugular Cut: Harm Disarm. Causes your target to rapidly lose blood, works only if you grab your target by their neck, if they are sleeping, or in critical condition.")) + to_chat(usr, span_notice("Tail Grab: Disarm Disarm Grab. Grabs your target by their neck and makes them unable to talk for a short time.")) diff --git a/monkestation/code/modules/uplink/uplink_items/species.dm b/monkestation/code/modules/uplink/uplink_items/species.dm index db1ee12eac86..adb036254d37 100644 --- a/monkestation/code/modules/uplink/uplink_items/species.dm +++ b/monkestation/code/modules/uplink/uplink_items/species.dm @@ -9,17 +9,23 @@ restricted_species = list(SPECIES_MOTH) surplus = 0 -/datum/uplink_item/race_restricted/monkey_barrel +/datum/uplink_item/species_restricted/monkey_barrel name = "Angry Monkey Barrel" desc = "Expert Syndicate Scientists put pissed a couple monkeys off and put them in a barrel. It isn't that complicated, but it's very effective" cost = 7 item = /obj/item/grenade/monkey_barrel restricted_species = list(SPECIES_SIMIAN) -/datum/uplink_item/race_restricted/monkey_ball +/datum/uplink_item/species_restricted/monkey_ball name = "Monkey Ball" desc = "Stolen experimental MonkeTech designed to bring a monkey's speed to dangerous levels." cost = 12 item = /obj/vehicle/ridden/monkey_ball restricted_species = list(SPECIES_SIMIAN) +/datum/uplink_item/species_restricted/tribal_claw_scroll + name = "Silver-Scale Scroll" + desc = "A scroll with ancient heritage. It can teach the user the secrets of Tribal Claw, an offensive martial art reliant on one's claws and tail." + cost = 7 + item = /obj/item/book/granter/martial/tribal_claw + restricted_species = list(SPECIES_LIZARD) diff --git a/tgstation.dme b/tgstation.dme index e7120e853863..5e7dc7cf37fa 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -412,6 +412,7 @@ #include "code\__DEFINES\~monkestation\logging.dm" #include "code\__DEFINES\~monkestation\maps.dm" #include "code\__DEFINES\~monkestation\market.dm" +#include "code\__DEFINES\~monkestation\martial_arts.dm" #include "code\__DEFINES\~monkestation\materials.dm" #include "code\__DEFINES\~monkestation\mecha.dm" #include "code\__DEFINES\~monkestation\microfusion.dm" @@ -6568,6 +6569,9 @@ #include "monkestation\code\modules\mapping\access_helpers.dm" #include "monkestation\code\modules\mapping\mapping_helpers.dm" #include "monkestation\code\modules\maptext\maptext_image_helper.dm" +#include "monkestation\code\modules\martial_arts\tribal_claw.dm" +#include "monkestation\code\modules\martial_arts\granters\tribal_claw_gr.dm" +#include "monkestation\code\modules\martial_arts\spells\spells.dm" #include "monkestation\code\modules\mech_comp\_interface.dm" #include "monkestation\code\modules\mech_comp\_message.dm" #include "monkestation\code\modules\mech_comp\vending_machine.dm"