diff --git a/code/datums/components/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm index b9e3c379b4..6fc84409e4 100644 --- a/code/datums/components/crafting/recipes/recipes_clothing.dm +++ b/code/datums/components/crafting/recipes/recipes_clothing.dm @@ -39,6 +39,30 @@ time = 10 reqs = list(/obj/item/paper = 20) category = CAT_CLOTHING + +/datum/crafting_recipe/armwraps + name = "armwraps" + result = /obj/item/clothing/gloves/fingerless/pugilist + time = 60 + tools = list(TOOL_WIRECUTTER) + reqs = list(/obj/item/stack/sheet/cloth = 4, + /obj/item/stack/sheet/silk = 2, + /obj/item/stack/sheet/leather = 2) + category = CAT_CLOTHING + +/datum/crafting_recipe/armwrapsplusone + name = "armwraps of mighty fists" + result = /obj/item/clothing/gloves/fingerless/pugilist/magic + time = 300 + tools = list(TOOL_WIRECUTTER, /obj/item/book/codex_gigas, /obj/item/clothing/head/wizard, /obj/item/clothing/suit/wizrobe) + reqs = list(/obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/leather = 2, + /obj/item/stack/sheet/durathread = 2, + /datum/reagent/consumable/ethanol/sake = 100, + /datum/reagent/consumable/ethanol/wizz_fizz = 100, + /obj/item/stack/sheet/sinew = 1, + /obj/item/stack/sheet/mineral/gold = 50) + category = CAT_CLOTHING //////// //Huds// diff --git a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm index aa3f2d3969..b037f02f80 100644 --- a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm +++ b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm @@ -298,7 +298,7 @@ subcategory = CAT_AMMO /datum/crafting_recipe/ashen_arrow - name = "Fire Hardened Arrow" + name = "Ashen Arrow" result = /obj/item/ammo_casing/caseless/arrow/ash tools = list(TOOL_WELDER) time = 30 diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 39fac11129..4b19ae25ca 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -168,24 +168,29 @@ return FALSE add_to_streak("D",D) var/obj/item/I = null - var/damage = (damage_roll(A,D)*0.5) + var/damage = damage_roll(A,D) + var/stunthreshold = A.dna.species.punchstunthreshold if(check_streak(A,D)) return TRUE - if(prob(65)) - if(CHECK_MOBILITY(D, MOBILITY_MOVE) || !restraining) + if(CHECK_MOBILITY(D, MOBILITY_MOVE) || !restraining) + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + if(damage >= stunthreshold) I = D.get_active_held_item() D.visible_message("[A] strikes [D]'s jaw with their hand!", \ - "[A] strikes your jaw, disorienting you!") + "[A] strikes your jaw, disorienting you!") playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - if(I && D.temporarilyRemoveItemFromInventory(I)) - A.put_in_hands(I) + D.drop_all_held_items() D.Jitter(2) - D.apply_damage(damage, BRUTE) - else - D.visible_message("[A] attempted to disarm [D]!", \ - "[A] attempted to disarm [D]!") - playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - log_combat(A, D, "disarmed (CQC)", "[I ? " grabbing \the [I]" : ""]") + D.Dizzy(damage) + D.apply_damage(damage*2 + 20, STAMINA) + D.apply_damage(damage*0.5, BRUTE) + else + D.visible_message("[A] strikes [D] in the chest!", \ + "[A] strikes in chest!") + playsound(D, 'sound/weapons/cqchit1.ogg', 25, 1, -1) + D.apply_damage(damage + 15, STAMINA) + D.apply_damage(damage*0.5, BRUTE) + log_combat(A, D, "disarmed (CQC)", "[I ? " grabbing \the [I]" : ""]") if(restraining && A.pulling == D) log_combat(A, D, "knocked out (Chokehold)(CQC)") D.visible_message("[A] puts [D] into a chokehold!", \ diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index df42fba07d..6b3e2d3dc8 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -98,13 +98,13 @@ /datum/martial_art/krav_maga/proc/leg_sweep(mob/living/carbon/human/A, mob/living/carbon/human/D) var/obj/item/bodypart/affecting = D.get_bodypart(BODY_ZONE_CHEST) var/armor_block = D.run_armor_check(affecting, "melee") - var/damage = damage_roll(A,D) + var/damage = (damage_roll(A,D)*2 + 25) if(!CHECK_MOBILITY(D, MOBILITY_STAND)) return FALSE D.visible_message("[A] leg sweeps [D]!", \ "[A] leg sweeps you!") playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1) - D.apply_damage(damage + 25, STAMINA, affecting, armor_block) + D.apply_damage(damage, STAMINA, affecting, armor_block) D.DefaultCombatKnockdown(80, override_hardstun = 1, override_stamdmg = 0) log_combat(A, D, "leg sweeped") return TRUE @@ -165,14 +165,15 @@ return TRUE var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) var/armor_block = D.run_armor_check(affecting, "melee") - var/damage = (damage_roll(A,D)*2) - if(D.mobility_flags & MOBILITY_STAND) + var/damage = damage_roll(A,D) + var/stunthreshold = A.dna.species.punchstunthreshold + if(CHECK_MOBILITY(D, MOBILITY_STAND)) D.visible_message("[A] reprimands [D]!", \ "You're slapped by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) to_chat(A, "You jab [D]!") A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) playsound(D, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) - D.apply_damage(damage + 5, STAMINA, affecting, armor_block) + D.apply_damage(damage*2 + 15, STAMINA, affecting, armor_block) log_combat(A, D, "punched nonlethally") else D.visible_message("[A] reprimands [D]!", \ @@ -180,11 +181,12 @@ to_chat(A, "You stomp [D]!") A.do_attack_animation(D, ATTACK_EFFECT_KICK) playsound(D, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) - D.apply_damage(damage + 10, STAMINA, affecting, armor_block) + D.apply_damage(damage*2 + 20, STAMINA, affecting, armor_block) log_combat(A, D, "stomped nonlethally") - if(prob(D.getStaminaLoss())) + if(damage >= stunthreshold) D.visible_message("[D] sputters and recoils in pain!", "You recoil in pain as you are jabbed in a nerve!") D.drop_all_held_items() + return TRUE //Krav Maga Gloves diff --git a/code/datums/martial/rising_bass.dm b/code/datums/martial/rising_bass.dm index 2d760fc10a..4602d47f11 100644 --- a/code/datums/martial/rising_bass.dm +++ b/code/datums/martial/rising_bass.dm @@ -1,5 +1,5 @@ -#define REPULSE_PUNCH_COMBO "HDHD" -#define SHOULDER_FLIP_COMBO "GHDGHH" +#define REPULSE_PUNCH_COMBO "HDD" +#define SHOULDER_FLIP_COMBO "DHDHG" #define FOOT_SMASH_COMBO "HH" #define SIDE_KICK_COMBO "skick" #define DEFT_SWITCH_COMBO "deft" @@ -37,7 +37,6 @@ return FALSE -//Repulse Punch - Slams the opponent far away from you. /datum/action/risingbassmove name = "" icon_icon = 'icons/mob/actions/actions_items.dmi' @@ -89,7 +88,7 @@ "[A] kicks you in the side, forcing you to step away!") playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1) D.apply_damage(damage, BRUTE, BODY_ZONE_CHEST) - D.DefaultCombatKnockdown(60) + D.DefaultCombatKnockdown(60, override_hardstun = 1, override_stam = damage) var/L = !checkfordensity(H,D) ? (!checkfordensity(K,D) ? D.loc : K) : H D.forceMove(L) log_combat(A, D, "side kicked (Rising Bass)") @@ -97,24 +96,25 @@ return TRUE /datum/martial_art/the_rising_bass/proc/shoulderFlip(mob/living/carbon/human/A, mob/living/carbon/human/D) - var/damage = (damage_roll(A,D) + 25) - if(CHECK_MOBILITY(D, MOBILITY_STAND)) - var/turf/H = get_step(A, get_dir(D,A)) - var/L = checkfordensity(H,D) ? H : A.loc - A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) - D.visible_message("[A] flips [D] over their shoulder, slamming them into the ground!", \ - "[A] flips you over their shoulder, slamming you into the ground!") - playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - D.emote("scream") - D.apply_damage(damage, BRUTE, BODY_ZONE_CHEST) - D.apply_damage(damage, BRUTE, BODY_ZONE_HEAD) + var/damage = damage_roll(A,D) + var/stunthreshold = A.dna.species.punchstunthreshold + var/turf/H = get_step(A, get_dir(D,A)) + var/L = checkfordensity(H,D) ? H : A.loc + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + D.visible_message("[A] flips [D] over their shoulder, slamming them into the ground!", \ + "[A] flips you over their shoulder, slamming you into the ground!") + playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + D.emote("scream") + D.apply_damage(damage + 10, BRUTE, BODY_ZONE_CHEST) + D.apply_damage(damage + 10, BRUTE, BODY_ZONE_HEAD) + if(damage >= stunthreshold) D.Sleeping(60) - D.DefaultCombatKnockdown(300) - D.forceMove(L) - log_combat(A, D, "shoulder flipped (Rising Bass)") - return TRUE - return FALSE + D.DefaultCombatKnockdown(300, override_hardstun = 1, override_stam = 50) + D.forceMove(L) + log_combat(A, D, "shoulder flipped (Rising Bass)") + return TRUE +//Repulse Punch - Slams the opponent far away from you. /datum/martial_art/the_rising_bass/proc/repulsePunch(mob/living/carbon/human/A, mob/living/carbon/human/D) var/damage = damage_roll(A,D) if(CHECK_MOBILITY(D, MOBILITY_STAND) && repulsecool < world.time) @@ -125,7 +125,8 @@ var/atom/F = get_edge_target_turf(D, get_dir(A, get_step_away(D, A))) D.throw_at(F, 10, 1) D.apply_damage(damage, BRUTE, BODY_ZONE_CHEST) - D.DefaultCombatKnockdown(90) + D.DefaultCombatKnockdown(90, override_hardstun = 1, override_stam = damage*2) + D.confused += min(damage, 20) log_combat(A, D, "repulse punched (Rising Bass)") repulsecool = world.time + 3 SECONDS return TRUE @@ -162,7 +163,23 @@ add_to_streak("D",D) if(check_streak(A,D)) return TRUE - return ..() + var/damage = damage_roll(A,D) + var/stunthreshold = A.dna.species.punchstunthreshold + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + if(CHECK_MOBILITY(D, MOBILITY_STAND) && damage >= stunthreshold) + D.visible_message("[A] trips [D]!", \ + "You're tripped by [A]!", "You hear something thump against the floor!", COMBAT_MESSAGE_RANGE, A) + to_chat(A, "You trip [D]!") + D.DefaultCombatKnockdown(10, override_hardstun = 0.01, override_stam = damage) + D.Dizzy(damage) + else + D.visible_message("[A] jabs [D] in the stomach!", \ + "You're jabbed in the stomach by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) + to_chat(A, "You jab [D] in the stomach!") + D.apply_damage(damage*2 + 10, STAMINA) + D.disgust = min(damage, 20) + playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + return TRUE /datum/martial_art/the_rising_bass/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) add_to_streak("H",D) @@ -203,9 +220,9 @@ to_chat(usr, "You retreat inward and recall the teachings of the Rising Bass...") to_chat(usr, "Side Kick: Forces opponent to step to the side.") - to_chat(usr, "Shoulder Flip: Grab Harm Disarm Grab Harm Harm. Flips opponent over your shoulder and stuns.") - to_chat(usr, "Repulse Punch: Harm Disarm Harm Disarm. Slams the opponent far away from you.") - to_chat(usr, "Foot Smash: Harm Harm. Stuns opponent, minor damage.") + to_chat(usr, "Shoulder Flip: Disarm Harm Disarm Harm Grab. Flips opponent over your shoulder and stuns.") + to_chat(usr, "Repulse Punch: Harm Disarm Disarm. Slams the opponent far away from you.") + to_chat(usr, "Foot Smash: Harm Harm. Knocks opponent prone, minor damage.") to_chat(usr, "Deft Switch: Switches the opponent's held item for your own. Most useful with nothing in your hand.") /datum/martial_art/the_rising_bass/teach(mob/living/carbon/human/H, make_temporary = FALSE) diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 527ee01206..9a3f16351f 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -23,7 +23,7 @@ return TRUE return FALSE -///Gnashing Teeth: Harm Harm, consistent 20 force punch on every second harm punch, has a chance to crit +///Gnashing Teeth: Harm Harm, high force punch on every second harm punch, has a chance to crit for near triple damage /datum/martial_art/the_sleeping_carp/proc/strongPunch(mob/living/carbon/human/A, mob/living/carbon/human/D) ///this var is so that the strong punch is always aiming for the body part the user is targeting and not trying to apply to the chest before deviating var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) @@ -44,7 +44,7 @@ playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1) log_combat(A, D, "strong punched (Sleeping Carp)")//so as to not double up on logging D.apply_damage((damage + 15) + crit_damage, BRUTE, affecting) - return + return TRUE ///Crashing Wave Kick: Harm Disarm combo, throws people seven tiles backwards /datum/martial_art/the_sleeping_carp/proc/launchKick(mob/living/carbon/human/A, mob/living/carbon/human/D) @@ -57,7 +57,7 @@ D.throw_at(throw_target, 7, 14, A) D.apply_damage(damage, BRUTE, BODY_ZONE_CHEST) log_combat(A, D, "launchkicked (Sleeping Carp)") - return + return TRUE ///Keelhaul: Harm Grab combo, knocks people down, deals stamina damage while they're on the floor /datum/martial_art/the_sleeping_carp/proc/dropKick(mob/living/carbon/human/A, mob/living/carbon/human/D) @@ -77,7 +77,7 @@ D.visible_message("[A] kicks [D] in the head!", \ "You are kicked in the head by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) log_combat(A, D, "dropkicked (Sleeping Carp)") - return + return TRUE /datum/martial_art/the_sleeping_carp/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) add_to_streak("G",D) @@ -89,6 +89,7 @@ /datum/martial_art/the_sleeping_carp/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) add_to_streak("H",D) var/damage = (damage_roll(A,D) + 5) + var/stunthreshold = A.dna.species.punchstunthreshold if(check_streak(A,D)) return TRUE var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) @@ -99,6 +100,9 @@ to_chat(A, "You [atk_verb] [D]!") D.apply_damage(damage, BRUTE, affecting) playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1) + if(CHECK_MOBILITY(D, MOBILITY_STAND) && damage >= stunthreshold) + to_chat(D, "You stumble and fall!") + D.DefaultCombatKnockdown(10, override_hardstun = 0.01, override_stam = damage) log_combat(A, D, "punched (Sleeping Carp)") return TRUE diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index f78a05244e..2d9880578c 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -55,7 +55,7 @@ /obj/item/stack/tile/fakespace/loaded = ARCADE_WEIGHT_TRICK, /obj/item/stack/tile/fakepit/loaded = ARCADE_WEIGHT_TRICK, /obj/item/restraints/handcuffs/fake = ARCADE_WEIGHT_TRICK, - /obj/item/clothing/gloves/fingerless/pugilist/rapid/hug = ARCADE_WEIGHT_TRICK, + /obj/item/clothing/gloves/fingerless/pugilist/hug = ARCADE_WEIGHT_TRICK, /obj/item/grenade/chem_grenade/glitter/pink = ARCADE_WEIGHT_TRICK, /obj/item/grenade/chem_grenade/glitter/blue = ARCADE_WEIGHT_TRICK, diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index a37dc8b638..d537e2fb60 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -52,7 +52,7 @@ name = "armwraps of unyielding resolve" desc = "A series of armwraps, soaked in holy water. Makes you pretty keen to smite evil magic users." resistance_flags = FIRE_PROOF | ACID_PROOF - enhancement = 1 //It is not magic that makes you punch harder, but force of will. Trust me. + enhancement = 2 //It is not magic that makes you punch harder, but force of will. Trust me. secondary_trait = TRAIT_ANTIMAGIC var/chaplain_spawnable = TRUE @@ -115,14 +115,15 @@ if(input) warcry = input -/obj/item/clothing/gloves/fingerless/pugilist/rapid/hug +/obj/item/clothing/gloves/fingerless/pugilist/hug name = "Hugs of the North Star" desc = "The armbands of a humble friend. Makes you pretty keen to go let everyone know how much you appreciate them!" - warcry = "owo" //Shouldn't ever come into play + icon_state = "rapid" + item_state = "rapid" enhancement = 0 secondary_trait = TRAIT_PACIFISM //You are only here to hug and be friends! -/obj/item/clothing/gloves/fingerless/pugilist/rapid/hug/Touch(mob/target, proximity = TRUE) +/obj/item/clothing/gloves/fingerless/pugilist/hug/Touch(mob/target, proximity = TRUE) if(!isliving(target)) return @@ -137,9 +138,6 @@ return FALSE -/obj/item/clothing/gloves/fingerless/pugilist/rapid/hug/AltClick(mob/user) - return FALSE - /obj/item/clothing/gloves/botanic_leather name = "botanist's leather gloves" desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin. They're also quite warm." diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index e39ce7d488..0d42bd036f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1499,10 +1499,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/miss_chance = 100//calculate the odds that a punch misses entirely. considers stamina and brute damage of the puncher. punches miss by default to prevent weird cases if(user.dna.species.punchdamagelow) + if(HAS_TRAIT(user, TRAIT_PUGILIST)) //pugilists have a flat 10% miss chance + miss_chance = 10 if(atk_verb == ATTACK_EFFECT_KICK) //kicks never miss (provided your species deals more than 0 damage) miss_chance = 0 else - miss_chance = min(10 + ((puncherstam + puncherbrute)*0.5), 100) //probability of miss has a base of 10, and modified based on half your stamina and brute total. Capped at max 100 and min 0 to prevent weirdness in prob() + miss_chance = min(10 + ((puncherstam + puncherbrute)*0.5), 100) //probability of miss has a base of 10, and modified based on half brute total. Capped at max 100 to prevent weirdness in prob() if(!damage || !affecting || prob(miss_chance))//future-proofing for species that have 0 damage/weird cases where no zone is targeted playsound(target.loc, user.dna.species.miss_sound, 25, TRUE, -1) @@ -1618,7 +1620,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) else user.do_attack_animation(target, ATTACK_EFFECT_DISARM) - user.adjustStaminaLossBuffered(3) //CITADEL CHANGE - makes disarmspam cause staminaloss + if(HAS_TRAIT(user, TRAIT_PUGILIST))//CITADEL CHANGE - makes disarmspam cause staminaloss, pugilists can do it almost effortlessly + user.adjustStaminaLossBuffered(1) + else + user.adjustStaminaLossBuffered(3) if(target.w_uniform) target.w_uniform.add_fingerprint(user) @@ -1647,8 +1652,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!(target.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) //CITADEL CHANGE randn += 25 //CITADEL CHANGE - Makes it harder to disarm outside of combat mode if(user.pulling == target) - randn += -20 //If you have the time to get someone in a grab, you should have a greater chance at snatching the thing in their hand. Will be made completely obsolete by the grab rework but i've got a poor track record for releasing big projects on time so w/e i guess - + randn -= 20 //If you have the time to get someone in a grab, you should have a greater chance at snatching the thing in their hand. Will be made completely obsolete by the grab rework but i've got a poor track record for releasing big projects on time so w/e i guess + if(HAS_TRAIT(user, TRAIT_PUGILIST)) + randn -= 25 //if you are a pugilist, you're slapping that item from them pretty reliably + if(HAS_TRAIT(target, TRAIT_PUGILIST)) + randn += 25 //meanwhile, pugilists are less likely to get disarmed + if(randn <= 35)//CIT CHANGE - changes this back to a 35% chance to accomodate for the above being commented out in favor of right-click pushing var/obj/item/I = null if(target.pulling)