/obj/item/banhammer desc = "A banhammer." name = "banhammer" icon = 'icons/obj/items_and_weapons.dmi' icon_state = "toyhammer" slot_flags = ITEM_SLOT_BELT throwforce = 0 force = 1 w_class = WEIGHT_CLASS_TINY throw_speed = 3 throw_range = 7 attack_verb = list("banned") max_integrity = 200 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70) resistance_flags = FIRE_PROOF /obj/item/banhammer/suicide_act(mob/user) user.visible_message("[user] is hitting [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to ban [user.p_them()]self from life.") return (BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS) /* oranges says: This is a meme relating to the english translation of the ss13 russian wiki page on lurkmore. mrdoombringer sez: and remember kids, if you try and PR a fix for this item's grammar, you are admitting that you are, indeed, a newfriend. for further reading, please see: https://github.com/tgstation/tgstation/pull/30173 and https://translate.google.com/translate?sl=auto&tl=en&js=y&prev=_t&hl=en&ie=UTF-8&u=%2F%2Flurkmore.to%2FSS13&edit-text=&act=url */ /obj/item/banhammer/attack(mob/M, mob/user) if(user.zone_selected == BODY_ZONE_HEAD) M.visible_message("[user] are stroking the head of [M] with a bangammer", "[user] are stroking the head with a bangammer", "you hear a bangammer stroking a head"); else M.visible_message("[M] has been banned FOR NO REISIN by [user]", "You have been banned FOR NO REISIN by [user]", "you hear a banhammer banning someone") playsound(loc, 'sound/effects/adminhelp.ogg', 15) //keep it at 15% volume so people don't jump out of their skin too much if(user.a_intent != INTENT_HELP) return ..(M, user) /obj/item/sord name = "\improper SORD" desc = "This thing is so unspeakably shitty you are having a hard time even holding it." icon_state = "sord" item_state = "sord" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' slot_flags = ITEM_SLOT_BELT force = 2 throwforce = 1 w_class = WEIGHT_CLASS_NORMAL hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") /obj/item/sord/suicide_act(mob/user) user.visible_message("[user] is trying to impale [user.p_them()]self with [src]! It might be a suicide attempt if it weren't so shitty.", \ "You try to impale yourself with [src], but it's USELESS...") return SHAME /obj/item/claymore name = "claymore" desc = "What are you standing around staring at this for? Get to killing!" icon_state = "claymore" item_state = "claymore" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' hitsound = 'sound/weapons/bladeslice.ogg' flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK force = 40 throwforce = 10 w_class = WEIGHT_CLASS_NORMAL attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") block_chance = 50 sharpness = SHARP_EDGED max_integrity = 200 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF total_mass = TOTAL_MASS_MEDIEVAL_WEAPON /obj/item/claymore/Initialize() . = ..() AddComponent(/datum/component/butchering, 40, 105) AddElement(/datum/element/sword_point) /obj/item/claymore/suicide_act(mob/user) user.visible_message("[user] is falling on [src]! It looks like [user.p_theyre()] trying to commit suicide!") return(BRUTELOSS) /obj/item/claymore/purified name = "purified longsword" desc = "A hastily-purified longsword. While not as holy as it could be, it's still a formidable weapon against those who would rather see you dead." force = 25 block_chance = 0 /obj/item/claymore/highlander //ALL COMMENTS MADE REGARDING THIS SWORD MUST BE MADE IN ALL CAPS desc = "THERE CAN BE ONLY ONE, AND IT WILL BE YOU!!!\nActivate it in your hand to point to the nearest victim." flags_1 = CONDUCT_1 item_flags = DROPDEL slot_flags = null block_chance = 0 //RNG WON'T HELP YOU NOW, PANSY light_range = 3 attack_verb = list("brutalized", "eviscerated", "disemboweled", "hacked", "carved", "cleaved") //ONLY THE MOST VISCERAL ATTACK VERBS var/notches = 0 //HOW MANY PEOPLE HAVE BEEN SLAIN WITH THIS BLADE var/obj/item/disk/nuclear/nuke_disk //OUR STORED NUKE DISK /obj/item/claymore/highlander/Initialize() . = ..() ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER) START_PROCESSING(SSobj, src) /obj/item/claymore/highlander/Destroy() if(nuke_disk) nuke_disk.forceMove(get_turf(src)) nuke_disk.visible_message("The nuke disk is vulnerable!") nuke_disk = null STOP_PROCESSING(SSobj, src) return ..() /obj/item/claymore/highlander/process() if(ishuman(loc)) var/mob/living/carbon/human/H = loc loc.layer = LARGE_MOB_LAYER //NO HIDING BEHIND PLANTS FOR YOU, DICKWEED (HA GET IT, BECAUSE WEEDS ARE PLANTS) H.bleedsuppress = TRUE //AND WE WON'T BLEED OUT LIKE COWARDS H.adjustStaminaLoss(-50) //CIT CHANGE - AND MAY HE NEVER SUCCUMB TO EXHAUSTION else if(!(flags_1 & ADMIN_SPAWNED_1)) qdel(src) /obj/item/claymore/highlander/pickup(mob/living/user) . = ..() to_chat(user, "The power of Scotland protects you! You are shielded from all stuns and knockdowns.") user.add_stun_absorption("highlander", INFINITY, 1, " is protected by the power of Scotland!", "The power of Scotland absorbs the stun!", " is protected by the power of Scotland!") user.ignore_slowdown(HIGHLANDER) /obj/item/claymore/highlander/dropped(mob/living/user) . = ..() user.unignore_slowdown(HIGHLANDER) if(!QDELETED(src)) qdel(src) //If this ever happens, it's because you lost an arm /obj/item/claymore/highlander/examine(mob/user) . = ..() . += "It has [!notches ? "nothing" : "[notches] notches"] scratched into the blade." if(nuke_disk) . += "It's holding the nuke disk!" /obj/item/claymore/highlander/attack(mob/living/target, mob/living/user) . = ..() if(!QDELETED(target) && iscarbon(target) && target.stat == DEAD && target.mind && target.mind.special_role == "highlander") user.fully_heal() //STEAL THE LIFE OF OUR FALLEN FOES add_notch(user) target.visible_message("[target] crumbles to dust beneath [user]'s blows!", "As you fall, your body crumbles to dust!") target.dust() /obj/item/claymore/highlander/attack_self(mob/living/user) var/closest_victim var/closest_distance = 255 for(var/mob/living/carbon/human/H in GLOB.player_list - user) if(H.client && H.mind.special_role == "highlander" && (!closest_victim || get_dist(user, closest_victim) < closest_distance)) closest_victim = H if(!closest_victim) to_chat(user, "[src] thrums for a moment and falls dark. Perhaps there's nobody nearby.") return to_chat(user, "[src] thrums and points to the [dir2text(get_dir(user, closest_victim))].") /obj/item/claymore/highlander/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) if((attack_type & ATTACK_TYPE_PROJECTILE) && is_energy_reflectable_projectile(object)) return BLOCK_SUCCESS | BLOCK_SHOULD_REDIRECT | BLOCK_PHYSICAL_EXTERNAL | BLOCK_REDIRECTED return ..() /obj/item/claymore/highlander/proc/add_notch(mob/living/user) //DYNAMIC CLAYMORE PROGRESSION SYSTEM - THIS IS THE FUTURE notches++ force++ var/new_name = name switch(notches) if(1) to_chat(user, "Your first kill - hopefully one of many. You scratch a notch into [src]'s blade.") to_chat(user, "You feel your fallen foe's soul entering your blade, restoring your wounds!") new_name = "notched claymore" if(2) to_chat(user, "Another falls before you. Another soul fuses with your own. Another notch in the blade.") new_name = "double-notched claymore" add_atom_colour(rgb(255, 235, 235), ADMIN_COLOUR_PRIORITY) if(3) to_chat(user, "You're beginning to relish the thrill of battle.") new_name = "triple-notched claymore" add_atom_colour(rgb(255, 215, 215), ADMIN_COLOUR_PRIORITY) if(4) to_chat(user, "You've lost count of how many you've killed.") new_name = "many-notched claymore" add_atom_colour(rgb(255, 195, 195), ADMIN_COLOUR_PRIORITY) if(5) to_chat(user, "Five voices now echo in your mind, cheering the slaughter.") new_name = "battle-tested claymore" add_atom_colour(rgb(255, 175, 175), ADMIN_COLOUR_PRIORITY) if(6) to_chat(user, "Is this what the vikings felt like? Visions of glory fill your head as you slay your sixth foe.") new_name = "battle-scarred claymore" add_atom_colour(rgb(255, 155, 155), ADMIN_COLOUR_PRIORITY) if(7) to_chat(user, "Kill. Butcher. Conquer.") new_name = "vicious claymore" add_atom_colour(rgb(255, 135, 135), ADMIN_COLOUR_PRIORITY) if(8) to_chat(user, "IT NEVER GETS OLD. THE SCREAMING. THE BLOOD AS IT SPRAYS ACROSS YOUR FACE.") new_name = "bloodthirsty claymore" add_atom_colour(rgb(255, 115, 115), ADMIN_COLOUR_PRIORITY) if(9) to_chat(user, "ANOTHER ONE FALLS TO YOUR BLOWS. ANOTHER WEAKLING UNFIT TO LIVE.") new_name = "gore-stained claymore" add_atom_colour(rgb(255, 95, 95), ADMIN_COLOUR_PRIORITY) if(10) user.visible_message("[user]'s eyes light up with a vengeful fire!", \ "YOU FEEL THE POWER OF VALHALLA FLOWING THROUGH YOU! THERE CAN BE ONLY ONE!!!") user.update_icons() new_name = "GORE-DRENCHED CLAYMORE OF [pick("THE WHIMSICAL SLAUGHTER", "A THOUSAND SLAUGHTERED CATTLE", "GLORY AND VALHALLA", "ANNIHILATION", "OBLITERATION")]" icon_state = "claymore_valhalla" item_state = "cultblade" remove_atom_colour(ADMIN_COLOUR_PRIORITY) name = new_name playsound(user, 'sound/items/screwdriver2.ogg', 50, 1) /obj/item/katana name = "katana" desc = "Woefully underpowered in D20." icon_state = "katana" item_state = "katana" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK force = 40 throwforce = 10 w_class = WEIGHT_CLASS_BULKY hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") block_chance = 50 sharpness = SHARP_EDGED max_integrity = 200 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF total_mass = TOTAL_MASS_MEDIEVAL_WEAPON /obj/item/katana/lavaland desc = "Woefully underpowered in Lavaland." block_chance = 30 force = 25 //Like a fireaxe but one handed and can block! /obj/item/katana/cursed slot_flags = null /obj/item/katana/cursed/Initialize() . = ..() ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT) /obj/item/katana/suicide_act(mob/user) user.visible_message("[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku!") playsound(src, 'sound/weapons/bladeslice.ogg', 50, 1) return(BRUTELOSS) /obj/item/katana/timestop name = "temporal katana" desc = "Delicately balanced, this finely-crafted blade hums with barely-restrained potential." icon_state = "temporalkatana" item_state = "temporalkatana" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' block_chance = 0 // oops force = 27.5 // oops item_flags = ITEM_CAN_PARRY block_parry_data = /datum/block_parry_data/bokken/quick_parry/proj /obj/item/katana/timestop/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time) if(ishuman(owner)) var/mob/living/carbon/human/flynn = owner flynn.emote("smirk") new /obj/effect/timestop/magic(get_turf(owner), 1, 50, list(owner)) // null roddies counter /obj/item/katana/timestop/suicide_act(mob/living/user) // stolen from hierophant staff new /obj/effect/timestop/magic(get_turf(user), 1, 50, list(user)) // free usage for dying user.visible_message("[user] poses menacingly with the [src]! It looks like [user.p_theyre()] trying to teleport behind someone!") user.say("Heh.. Nothing personnel, kid..", forced = "temporal katana suicide") sleep(20) if(!user) return user.visible_message("[user] vanishes into a cloud of falling dust and burning embers, likely off to style on some poor sod in the distance!") playsound(user,'sound/magic/blink.ogg', 75, TRUE) for(var/obj/item/I in user) if(I != src) user.dropItemToGround(I) user.dropItemToGround(src) //Drop us last, so it goes on top of their stuff qdel(user) /obj/item/melee/bokken // parrying stick name = "bokken" desc = "A space-Japanese training sword made of wood and shaped like a katana." icon_state = "bokken" item_state = "bokken" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK w_class = WEIGHT_CLASS_BULKY force = 10 //how much harm mode damage we do var/stamina_damage_increment = 5 //how much extra damage do we do when in non-harm mode throwforce = 10 damtype = STAMINA attack_verb = list("whacked", "smacked", "struck") total_mass = TOTAL_MASS_MEDIEVAL_WEAPON hitsound = 'sound/weapons/grenadelaunch.ogg' // no good wood thunk sounds var/harm = FALSE // TRUE = brute, FALSE = stam var/reinforced = FALSE var/burnt = FALSE var/burned_in // text you burned in (with a welder) var/quick_parry = FALSE // false = default parry, true = really small parry window item_flags = ITEM_CAN_PARRY block_parry_data = /datum/block_parry_data/bokken var/default_parry_data = /datum/block_parry_data/bokken var/quick_parry_data = /datum/block_parry_data/bokken/quick_parry bare_wound_bonus = 0 wound_bonus = 0 /datum/block_parry_data/bokken // fucked up parry data, emphasizing quicker, shorter parries parry_stamina_cost = 10 // be wise about when you parry, though, else you won't be able to fight enough to make it count parry_time_windup = 0 parry_time_active = 10 // small parry window parry_time_spindown = 0 // parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK // bokken users can no longer strike while parrying parry_time_perfect = 1.5 parry_time_perfect_leeway = 1 parry_imperfect_falloff_percent = 7.5 parry_efficiency_to_counterattack = 120 parry_efficiency_considered_successful = 65 // VERY generous parry_efficiency_perfect = 120 parry_efficiency_perfect_override = list( TEXT_ATTACK_TYPE_PROJECTILE = 30, ) parry_failed_stagger_duration = 3 SECONDS parry_data = list( PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 10*2.5 = 25, 11*2.5 = 27.5, 12*2.5 = 30, 13*2.5 = 32.5 ) /datum/block_parry_data/bokken/quick_parry // emphasizing REALLY SHORT PARRIES parry_stamina_cost = 8 // still more costly than most parries, but less than a full bokken parry parry_time_active = 5 // REALLY small parry window parry_time_perfect = 2.5 // however... parry_time_perfect_leeway = 2 // the entire time, the parry is perfect parry_failed_stagger_duration = 1 SECONDS parry_failed_clickcd_duration = 1 SECONDS // more forgiving punishments for missed parries // still, don't fucking miss your parries or you're down stamina and staggered to shit /datum/block_parry_data/bokken/quick_parry/proj parry_efficiency_perfect_override = list() /obj/item/melee/bokken/Initialize() . = ..() AddElement(/datum/element/sword_point) if(!harm) //if initialised in non-harm mode, setup force accordingly force = force + stamina_damage_increment /obj/item/melee/bokken/attack_self(mob/user) harm = !harm if(harm) force -= stamina_damage_increment damtype = BRUTE attack_verb = list("bashed", "smashed", "attacked") bare_wound_bonus = 15 // having your leg smacked by a wooden stick is probably not great for it if it's naked wound_bonus = 0 else force += stamina_damage_increment damtype = STAMINA attack_verb = list("whacked", "smacked", "struck") bare_wound_bonus = 0 wound_bonus = 0 to_chat(user, "[src] is now [harm ? "harmful" : "not quite as harmful"].") /obj/item/melee/bokken/AltClick(mob/user) . = ..() quick_parry = !quick_parry if(quick_parry) block_parry_data = quick_parry_data else block_parry_data = default_parry_data to_chat(user, "[src] is now [quick_parry ? "emphasizing shorter parries, forcing you to riposte or be staggered" : "emphasizing longer parries, with a shorter window to riposte but more forgiving parries"].") /obj/item/melee/bokken/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/pen)) var/new_name = stripped_input(user, "What do you wish to name [src]?", "New Name", "bokken", 30) if(new_name) name = new_name if(I.tool_behaviour == TOOL_WELDER) var/new_burn = stripped_input(user, "What do you wish to burn into [src]?", "Burnt Inscription","", 140) if(new_burn) burned_in = new_burn if(!burnt) icon_state += "_burnt" item_state += "_burnt" burnt = TRUE update_icon() update_icon_state() if(istype(I, /obj/item/stack/rods)) var/obj/item/stack/rods/R = I if(!reinforced) if(R.use(1)) force++ reinforced = TRUE to_chat(user, "You slide a metal rod into [src]\'s hilt. It feels a little heftier in your hands.") else to_chat(user, "[src] already has a weight slid into the hilt.") /obj/item/melee/bokken/examine(mob/user) . = ..() if(quick_parry) . += " [src] is gripped in a way to emphasize quicker parries." if(reinforced) . += " There's a metal rod shoved into the base." if(burnt) . += " Burned into the \"blade\" is [burned_in]." /obj/item/melee/bokken/steelwood name = "steelwood bokken" desc = "A misnomer of sorts, this is effectively a blunt katana made from steelwood, a dense organic wood derived from steelcaps. Why steelwood? Druids can use it. Duh." icon_state = "bokken_steel" item_state = "bokken_steel" force = 12 stamina_damage_increment = 3 /obj/item/melee/bokken/waki name = "wakizashi bokken" desc = "A space-Japanese training sword made of wood and shaped like a wakizashi." icon_state = "wakibokken" item_state = "wakibokken" slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_NORMAL force = 6 stamina_damage_increment = 4 block_parry_data = /datum/block_parry_data/bokken/waki default_parry_data = /datum/block_parry_data/bokken/waki quick_parry_data = /datum/block_parry_data/bokken/waki/quick_parry /datum/block_parry_data/bokken/waki // weaker parries than the bigger variant, but cheaper and faster recovery, like quick parry parry_stamina_cost = 4 parry_time_windup = 0 parry_time_active = 6 parry_time_spindown = 0 parry_time_perfect = 1.5 parry_time_perfect_leeway = 1 parry_imperfect_falloff_percent = 7.5 parry_efficiency_to_counterattack = 120 parry_efficiency_considered_successful = 65 parry_efficiency_perfect = 120 parry_efficiency_perfect_override = list( TEXT_ATTACK_TYPE_PROJECTILE = 30, ) parry_failed_stagger_duration = 2 SECONDS parry_data = list( PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 1.5, // 6*1.5 = 9, 7*1.5 = 10.5, 8*1.5 = 12, 9*1.5 = 13.5 ) /datum/block_parry_data/bokken/waki/quick_parry //For the parry spammer in you parry_stamina_cost = 2 // Slam that parry button parry_time_active = 2.5 parry_time_perfect = 1 parry_time_perfect_leeway = 1 parry_failed_stagger_duration = 1 SECONDS parry_failed_clickcd_duration = 1 SECONDS /datum/block_parry_data/bokken/waki/quick_parry/proj parry_efficiency_perfect_override = list() /obj/item/melee/bokken/waki/steelwood name = "wakizashi steelwood bokken" desc = "A misnomer of sorts, this is effectively a blunt wakizashi made from steelwood, a dense organic wood derived from steelcaps. Why steelwood? Druids can use it. Duh." icon_state = "wakibokken_steel" item_state = "wakibokken_steel" force = 8 stamina_damage_increment = 2 /obj/item/melee/bokken/debug name = "funny debug parrying stick" desc = "if you see this you've fucked up somewhere my good man" block_parry_data = /datum/block_parry_data/bokken/debug default_parry_data = /datum/block_parry_data/bokken/debug quick_parry_data = /datum/block_parry_data/bokken/quick_parry/debug /datum/block_parry_data/bokken/debug parry_efficiency_perfect_override = list() parry_data = list( PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 10*2.5 = 25, 11*2.5 = 27.5, 12*2.5 = 30, 13*2.5 = 32.5 PARRY_DISARM_ATTACKER = TRUE, PARRY_KNOCKDOWN_ATTACKER = 10, PARRY_STAGGER_ATTACKER = 10, PARRY_DAZE_ATTACKER = 10, ) /datum/block_parry_data/bokken/quick_parry/debug parry_efficiency_perfect_override = list() parry_data = list( PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 10*2.5 = 25, 11*2.5 = 27.5, 12*2.5 = 30, 13*2.5 = 32.5 PARRY_DISARM_ATTACKER = TRUE, PARRY_KNOCKDOWN_ATTACKER = 10, PARRY_STAGGER_ATTACKER = 10, PARRY_DAZE_ATTACKER = 10, ) /// BOKKEN CRAFTNG PIECES /obj/item/bokken_blade name = "training bokken wooden blade" desc = "The blade piece of a bokken katana." icon = 'icons/obj/smith.dmi' icon_state = "bokken" item_state = "bone_dagger" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' w_class = WEIGHT_CLASS_NORMAL /obj/item/bokken_steelblade name = "training bokken steelwood blade" desc = "The blade piece of a steelwood bokken katana." icon = 'icons/obj/smith.dmi' icon_state = "bokken_steel" item_state = "switchblade_ext" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' w_class = WEIGHT_CLASS_NORMAL /obj/item/wakibokken_blade name = "training bokken wooden wakizashi blade" desc = "The blade piece of a bokken wakizashi." icon = 'icons/obj/smith.dmi' icon_state = "wakibokken" item_state = "bone_dagger" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' w_class = WEIGHT_CLASS_NORMAL /obj/item/wakibokken_steelblade name = "training bokken steelwood wakizashi blade" desc = "The blade piece of a steelwood bokken katana." icon = 'icons/obj/smith.dmi' icon_state = "wakibokken_steel" item_state = "switchblade_ext" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' w_class = WEIGHT_CLASS_NORMAL /obj/item/bokken_hilt name = "training bokken hilt" desc = "The hilt piece of a bokken. This hilt is appropriate for any potential blade length or material." icon = 'icons/obj/smith.dmi' icon_state = "bokken_hilt" item_state = "bone_dagger" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' /obj/item/wirerod name = "wired rod" desc = "A rod with some wire wrapped around the top. It'd be easy to attach something to the top bit." icon_state = "wiredrod" item_state = "rods" flags_1 = CONDUCT_1 force = 9 throwforce = 10 w_class = WEIGHT_CLASS_NORMAL custom_materials = list(/datum/material/iron=1150, /datum/material/glass=75) attack_verb = list("hit", "bludgeoned", "whacked", "bonked") wound_bonus = -10 /obj/item/wirerod/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/shard)) var/obj/item/spear/S = new /obj/item/spear remove_item_from_storage(user) if (!user.transferItemToLoc(I, S)) return S.CheckParts(list(I)) qdel(src) user.put_in_hands(S) to_chat(user, "You fasten the glass shard to the top of the rod with the cable.") else if(istype(I, /obj/item/assembly/igniter) && !HAS_TRAIT(I, TRAIT_NODROP)) var/obj/item/melee/baton/cattleprod/P = new /obj/item/melee/baton/cattleprod remove_item_from_storage(user) to_chat(user, "You fasten [I] to the top of the rod with the cable.") qdel(I) qdel(src) user.put_in_hands(P) else return ..() /obj/item/throwing_star name = "throwing star" desc = "An ancient weapon still used to this day, due to its ease of lodging itself into its victim's body parts." icon_state = "throwingstar" item_state = "eshield0" lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' force = 2 throwforce = 10 //This is never used on mobs since this has a 100% embed chance. throw_speed = 4 embedding = list("pain_mult" = 4, "embed_chance" = 100, "fall_chance" = 0, "embed_chance_turf_mod" = 15) armour_penetration = 40 w_class = WEIGHT_CLASS_SMALL sharpness = SHARP_EDGED custom_materials = list(/datum/material/iron=500, /datum/material/glass=500) resistance_flags = FIRE_PROOF /obj/item/throwing_star/stamina name = "shock throwing star" desc = "An aerodynamic disc designed to cause excruciating pain when stuck inside fleeing targets, hopefully without causing fatal harm." throwforce = 5 embedding = list("pain_chance" = 5, "embed_chance" = 100, "fall_chance" = 0, "jostle_chance" = 10, "pain_stam_pct" = 0.8, "jostle_pain_mult" = 3) /obj/item/throwing_star/toy name = "toy throwing star" desc = "An aerodynamic disc strapped with adhesive for sticking to people, good for playing pranks and getting yourself killed by security." sharpness = SHARP_NONE force = 0 throwforce = 0 embedding = list("pain_mult" = 0, "jostle_pain_mult" = 0, "embed_chance" = 100, "fall_chance" = 0) /obj/item/switchblade name = "switchblade" icon_state = "switchblade" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' desc = "A sharp, concealable, spring-loaded knife." flags_1 = CONDUCT_1 force = 3 w_class = WEIGHT_CLASS_SMALL throwforce = 5 throw_speed = 3 throw_range = 6 custom_materials = list(/datum/material/iron=12000) hitsound = 'sound/weapons/genhit.ogg' attack_verb = list("stubbed", "poked") resistance_flags = FIRE_PROOF var/extended = 0 var/extended_force = 20 var/extended_throwforce = 23 var/extended_icon_state = "switchblade_ext" var/retracted_icon_state = "switchblade" /obj/item/switchblade/attack_self(mob/user) extended = !extended playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, 1) if(extended) force = extended_force w_class = WEIGHT_CLASS_NORMAL throwforce = extended_throwforce icon_state = extended_icon_state attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = SHARP_EDGED else force = initial(force) w_class = WEIGHT_CLASS_SMALL throwforce = initial(throwforce) icon_state = retracted_icon_state attack_verb = list("stubbed", "poked") hitsound = 'sound/weapons/genhit.ogg' sharpness = SHARP_NONE /obj/item/switchblade/suicide_act(mob/user) user.visible_message("[user] is slitting [user.p_their()] own throat with [src]! It looks like [user.p_theyre()] trying to commit suicide!") return (BRUTELOSS) /obj/item/phone name = "red phone" desc = "Should anything ever go wrong..." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "red_phone" force = 3 throwforce = 2 throw_speed = 3 throw_range = 4 w_class = WEIGHT_CLASS_SMALL attack_verb = list("called", "rang") hitsound = 'sound/weapons/ring.ogg' /obj/item/phone/suicide_act(mob/user) if(locate(/obj/structure/chair/stool) in user.loc) user.visible_message("[user] begins to tie a noose with [src]'s cord! It looks like [user.p_theyre()] trying to commit suicide!") else user.visible_message("[user] is strangling [user.p_them()]self with [src]'s cord! It looks like [user.p_theyre()] trying to commit suicide!") return(OXYLOSS) /obj/item/cane name = "cane" desc = "A cane used by a true gentleman. Or a clown." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "cane" item_state = "stick" lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' force = 5 throwforce = 5 w_class = WEIGHT_CLASS_SMALL custom_materials = list(/datum/material/iron=50) attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed") /obj/item/staff name = "wizard staff" desc = "Apparently a staff used by the wizard." icon = 'icons/obj/wizard.dmi' icon_state = "staff" lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' force = 3 throwforce = 5 throw_speed = 2 throw_range = 5 w_class = WEIGHT_CLASS_SMALL armour_penetration = 100 attack_verb = list("bludgeoned", "whacked", "disciplined") resistance_flags = FLAMMABLE /obj/item/staff/broom name = "broom" desc = "Used for sweeping, and flying into the night while cackling. Black cat not included." icon = 'icons/obj/wizard.dmi' icon_state = "broom" resistance_flags = FLAMMABLE /obj/item/staff/stick name = "stick" desc = "A great tool to drag someone else's drinks across the bar." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "cane" item_state = "stick" lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' force = 3 throwforce = 5 throw_speed = 2 throw_range = 5 w_class = WEIGHT_CLASS_SMALL /obj/item/ectoplasm name = "ectoplasm" desc = "Spooky." gender = PLURAL icon = 'icons/obj/wizard.dmi' icon_state = "ectoplasm" /obj/item/ectoplasm/suicide_act(mob/user) user.visible_message("[user] is inhaling [src]! It looks like [user.p_theyre()] trying to visit the astral plane!") return (OXYLOSS) /obj/item/mounted_chainsaw name = "mounted chainsaw" desc = "A chainsaw that has replaced your arm." icon_state = "chainsaw_on" item_state = "mounted_chainsaw" lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' item_flags = ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_BULKY force = 24 throwforce = 0 throw_range = 0 throw_speed = 0 sharpness = SHARP_EDGED attack_verb = list("sawed", "torn", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsawhit.ogg' total_mass = TOTAL_MASS_HAND_REPLACEMENT tool_behaviour = TOOL_SAW toolspeed = 1 /obj/item/mounted_chainsaw/Initialize() . = ..() ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) /obj/item/mounted_chainsaw/Destroy() var/obj/item/bodypart/part new /obj/item/chainsaw(get_turf(src)) if(iscarbon(loc)) var/mob/living/carbon/holder = loc var/index = holder.get_held_index_of_item(src) if(index) part = holder.hand_bodyparts[index] . = ..() if(part) part.drop_limb() /obj/item/statuebust name = "bust" desc = "A priceless ancient marble bust, the kind that belongs in a museum." //or you can hit people with it icon = 'icons/obj/statue.dmi' icon_state = "bust" force = 15 throwforce = 10 throw_speed = 5 throw_range = 2 attack_verb = list("busted") var/impressiveness = 45 /obj/item/statuebust/Initialize() . = ..() AddElement(/datum/element/art, impressiveness) addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, 1000)), 0) /obj/item/tailclub name = "tail club" desc = "For the beating to death of lizards with their own tails." icon_state = "tailclub" force = 14 throwforce = 1 // why are you throwing a club do you even weapon throw_speed = 1 throw_range = 1 attack_verb = list("clubbed", "bludgeoned") /obj/item/melee/chainofcommand/tailwhip name = "liz o' nine tails" desc = "A whip fashioned from the severed tails of lizards." icon_state = "tailwhip" item_flags = NONE /obj/item/melee/chainofcommand/tailwhip/kitty name = "cat o' nine tails" desc = "A whip fashioned from the severed tails of cats." icon_state = "catwhip" /obj/item/melee/skateboard name = "improvised skateboard" desc = "A skateboard. It can be placed on its wheels and ridden, or used as a strong weapon." icon_state = "skateboard" item_state = "skateboard" force = 12 throwforce = 4 w_class = WEIGHT_CLASS_NORMAL attack_verb = list("smacked", "whacked", "slammed", "smashed") ///The vehicle counterpart for the board var/board_item_type = /obj/vehicle/ridden/scooter/skateboard /obj/item/melee/skateboard/attack_self(mob/user) if(!user.canUseTopic(src, TRUE, FALSE, TRUE)) return var/obj/vehicle/ridden/scooter/skateboard/S = new board_item_type(get_turf(user)) S.buckle_mob(user) qdel(src) /obj/item/melee/skateboard/pro name = "skateboard" desc = "A RaDSTORMz brand professional skateboard. It looks sturdy and well made." icon_state = "skateboard2" item_state = "skateboard2" board_item_type = /obj/vehicle/ridden/scooter/skateboard/pro custom_premium_price = 500 /obj/item/melee/skateboard/hoverboard name = "hoverboard" desc = "A blast from the past, so retro!" icon_state = "hoverboard_red" item_state = "hoverboard_red" board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard custom_premium_price = 2015 /obj/item/melee/skateboard/hoverboard/admin name = "\improper Board Of Directors" desc = "The engineering complexity of a spaceship concentrated inside of a board. Just as expensive, too." icon_state = "hoverboard_nt" item_state = "hoverboard_nt" board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard/admin /obj/item/melee/baseball_bat name = "baseball bat" desc = "There ain't a skull in the league that can withstand a swatter." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "baseball_bat" item_state = "baseball_bat" lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' force = 10 wound_bonus = -10 throwforce = 12 attack_verb = list("beat", "smacked") custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 3.5) w_class = WEIGHT_CLASS_BULKY var/homerun_ready = 0 var/homerun_able = 0 total_mass = 2.7 //a regular wooden major league baseball bat weighs somewhere between 2 to 3.4 pounds, according to google /obj/item/melee/baseball_bat/chaplain name = "blessed baseball bat" desc = "There ain't a cult in the league that can withstand a swatter." force = 14 throwforce = 14 obj_flags = UNIQUE_RENAME var/chaplain_spawnable = TRUE total_mass = TOTAL_MASS_MEDIEVAL_WEAPON wound_bonus = -5 /obj/item/melee/baseball_bat/chaplain/Initialize() . = ..() AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE) /obj/item/melee/baseball_bat/homerun name = "home run bat" desc = "This thing looks dangerous... Dangerously good at baseball, that is." homerun_able = 1 /obj/item/melee/baseball_bat/attack_self(mob/user) if(!homerun_able) ..() return if(homerun_ready) to_chat(user, "You're already ready to do a home run!") ..() return to_chat(user, "You begin gathering strength...") playsound(get_turf(src), 'sound/magic/lightning_chargeup.ogg', 65, 1) if(do_after(user, 90, target = src)) to_chat(user, "You gather power! Time for a home run!") homerun_ready = 1 ..() /obj/item/melee/baseball_bat/attack(mob/living/target, mob/living/user) . = ..() var/atom/throw_target = get_edge_target_turf(target, user.dir) if(homerun_ready) user.visible_message("It's a home run!") target.throw_at(throw_target, rand(8,10), 14, user) target.ex_act(EXPLODE_HEAVY) playsound(get_turf(src), 'sound/weapons/homerun.ogg', 100, 1) homerun_ready = 0 return else if(!target.anchored) var/whack_speed = (prob(60) ? 1 : 4) target.throw_at(throw_target, rand(1, 2), whack_speed, user) // sorry friends, 7 speed batting caused wounds to absolutely delete whoever you knocked your target into (and said target) /obj/item/melee/baseball_bat/ablative name = "metal baseball bat" desc = "This bat is made of highly reflective, highly armored material." icon_state = "baseball_bat_metal" item_state = "baseball_bat_metal" force = 12 throwforce = 15 /obj/item/melee/baseball_bat/ablative/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) //some day this will reflect thrown items instead of lasers if(is_energy_reflectable_projectile(object) && (attack_type == ATTACK_TYPE_PROJECTILE)) var/turf = get_turf(src) playsound(turf, pick('sound/weapons/effects/batreflect1.ogg', 'sound/weapons/effects/batreflect2.ogg'), 50, 1) return BLOCK_SUCCESS | BLOCK_SHOULD_REDIRECT | BLOCK_PHYSICAL_EXTERNAL | BLOCK_REDIRECTED return ..() /obj/item/melee/baseball_bat/ablative/syndi name = "syndicate major league bat" desc = "A metal bat made by the syndicate for the major league team." force = 18 //Spear damage... throwforce = 30 /obj/item/melee/flyswatter name = "flyswatter" desc = "Useful for killing insects of all sizes." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "flyswatter" item_state = "flyswatter" lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' force = 1 throwforce = 1 attack_verb = list("swatted", "smacked") hitsound = 'sound/effects/snap.ogg' w_class = WEIGHT_CLASS_SMALL //Things in this list will be instantly splatted. Flyman weakness is handled in the flyman species weakness proc. var/list/strong_against var/list/spider_panic /obj/item/melee/flyswatter/Initialize() . = ..() strong_against = typecacheof(list( /mob/living/simple_animal/hostile/poison/bees/, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/cockroach, /obj/item/queen_bee )) spider_panic = typecacheof(list( /mob/living/simple_animal/banana_spider, /mob/living/simple_animal/hostile/poison/giant_spider, )) /obj/item/melee/flyswatter/afterattack(atom/target, mob/user, proximity_flag) . = ..() if(proximity_flag) if(is_type_in_typecache(target, strong_against)) new /obj/effect/decal/cleanable/insectguts(target.drop_location()) to_chat(user, "You easily splat the [target].") if(istype(target, /mob/living/)) var/mob/living/bug = target bug.death(1) if(is_type_in_typecache(target, spider_panic)) to_chat(user, "You easily land a critical blow on the [target].") if(istype(target, /mob/living/)) var/mob/living/bug = target bug.adjustBruteLoss(35) //What kinda mad man would go into melee with a spider?! else qdel(target) /obj/item/circlegame name = "circled hand" desc = "If somebody looks at this while it's below your waist, you get to bop them." icon_state = "madeyoulook" force = 0 throwforce = 0 item_flags = DROPDEL | ABSTRACT attack_verb = list("bopped") /obj/item/circlegame/Initialize() . = ..() var/mob/living/owner = loc if(!istype(owner)) return RegisterSignal(owner, COMSIG_PARENT_EXAMINE, .proc/ownerExamined) /obj/item/circlegame/Destroy() var/mob/owner = loc if(istype(owner)) UnregisterSignal(owner, COMSIG_PARENT_EXAMINE) return ..() /obj/item/circlegame/dropped(mob/user) UnregisterSignal(user, COMSIG_PARENT_EXAMINE) //loc will have changed by the time this is called, so Destroy() can't catch it // this is a dropdel item. return ..() /// Stage 1: The mistake is made /obj/item/circlegame/proc/ownerExamined(mob/living/owner, mob/living/sucker) if(!istype(sucker) || !in_range(owner, sucker)) return addtimer(CALLBACK(src, .proc/waitASecond, owner, sucker), 4) /// Stage 2: Fear sets in /obj/item/circlegame/proc/waitASecond(mob/living/owner, mob/living/sucker) if(QDELETED(sucker) || QDELETED(src) || QDELETED(owner)) return if(owner == sucker) // big mood to_chat(owner, "Wait a second... you just looked at your own [src.name]!") addtimer(CALLBACK(src, .proc/selfGottem, owner), 10) else to_chat(sucker, "Wait a second... was that a-") addtimer(CALLBACK(src, .proc/GOTTEM, owner, sucker), 6) /// Stage 3A: We face our own failures /obj/item/circlegame/proc/selfGottem(mob/living/owner) if(QDELETED(src) || QDELETED(owner)) return playsound(get_turf(owner), 'sound/effects/hit_punch.ogg', 50, TRUE, -1) owner.visible_message("[owner] shamefully bops [owner.p_them()]self with [owner.p_their()] [src.name].", "You shamefully bop yourself with your [src.name].", \ "You hear a dull thud!") log_combat(owner, owner, "bopped", src.name, "(self)") owner.do_attack_animation(owner) owner.apply_damage(100, STAMINA) owner.Knockdown(10) qdel(src) /// Stage 3B: We face our reckoning (unless we moved away or they're incapacitated) /obj/item/circlegame/proc/GOTTEM(mob/living/owner, mob/living/sucker) if(QDELETED(sucker)) return if(QDELETED(src) || QDELETED(owner)) to_chat(sucker, "Nevermind... must've been your imagination...") return if(!in_range(owner, sucker) || !(owner.mobility_flags & MOBILITY_USE)) to_chat(sucker, "Phew... you moved away before [owner] noticed you saw [owner.p_their()] [src.name]...") return to_chat(owner, "[sucker] looks down at your [src.name] before trying to avert [sucker.p_their()] eyes, but it's too late!") to_chat(sucker, "[owner] sees the fear in your eyes as you try to look away from [owner.p_their()] [src.name]!") playsound(get_turf(owner), 'sound/effects/hit_punch.ogg', 50, TRUE, -1) owner.do_attack_animation(sucker) if(HAS_TRAIT(owner, TRAIT_HULK)) owner.visible_message("[owner] bops [sucker] with [owner.p_their()] [src.name] much harder than intended, sending [sucker.p_them()] flying!", \ "You bop [sucker] with your [src.name] much harder than intended, sending [sucker.p_them()] flying!", "You hear a sickening sound of flesh hitting flesh!", ignored_mobs=list(sucker)) to_chat(sucker, "[owner] bops you incredibly hard with [owner.p_their()] [src.name], sending you flying!") sucker.apply_damage(50, STAMINA) sucker.Knockdown(50) log_combat(owner, sucker, "bopped", src.name, "(setup- Hulk)") var/atom/throw_target = get_edge_target_turf(sucker, owner.dir) sucker.throw_at(throw_target, 6, 3, owner) else owner.visible_message("[owner] bops [sucker] with [owner.p_their()] [src.name]!", "You bop [sucker] with your [src.name]!", \ "You hear a dull thud!", ignored_mobs=list(sucker)) sucker.apply_damage(15, STAMINA) log_combat(owner, sucker, "bopped", src.name, "(setup)") to_chat(sucker, "[owner] bops you with [owner.p_their()] [src.name]!") qdel(src) /obj/item/slapper name = "slapper" desc = "This is how real men fight." icon_state = "latexballon" item_state = "nothing" force = 0 throwforce = 0 item_flags = DROPDEL | ABSTRACT attack_verb = list("slapped") hitsound = 'sound/effects/snap.ogg' /obj/item/slapper/attack(mob/M, mob/living/carbon/human/user) if(ishuman(M)) var/mob/living/carbon/human/L = M if(L && L.dna && L.dna.species) L.dna.species.stop_wagging_tail(M) if(user.a_intent != INTENT_HARM && ((user.zone_selected == BODY_ZONE_PRECISE_MOUTH) || (user.zone_selected == BODY_ZONE_PRECISE_EYES) || (user.zone_selected == BODY_ZONE_HEAD))) user.do_attack_animation(M) playsound(M, 'sound/weapons/slap.ogg', 50, 1, -1) user.visible_message("[user] slaps [M]!", "You slap [M]!",\ "You hear a slap.") return else ..() /obj/item/proc/can_trigger_gun(mob/living/user) if(!user.can_use_guns(src)) return FALSE return TRUE /obj/item/extendohand name = "extendo-hand" desc = "Futuristic tech has allowed these classic spring-boxing toys to essentially act as a fully functional hand-operated hand prosthetic." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "extendohand" item_state = "extendohand" lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' force = 0 throwforce = 5 reach = 2 /obj/item/extendohand/acme name = "\improper ACME Extendo-Hand" desc = "A novelty extendo-hand produced by the ACME corporation. Originally designed to knock out roadrunners." /obj/item/extendohand/attack(atom/M, mob/living/carbon/human/user) var/dist = get_dist(M, user) if(dist < reach) to_chat(user, "[M] is too close to use [src] on.") return M.attack_hand(user) //HF blade /obj/item/vibro_weapon icon_state = "hfrequency0" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' name = "vibro sword" desc = "A potent weapon capable of cutting through nearly anything. Wielding it in two hands will allow you to deflect gunfire." armour_penetration = 100 block_chance = 40 throwforce = 20 throw_speed = 4 sharpness = SHARP_EDGED attack_verb = list("cut", "sliced", "diced") w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK hitsound = 'sound/weapons/bladeslice.ogg' var/wielded = FALSE // track wielded status on item /obj/item/vibro_weapon/Initialize() . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) /obj/item/vibro_weapon/ComponentInitialize() . = ..() AddComponent(/datum/component/butchering, 20, 105) AddComponent(/datum/component/two_handed, force_multiplier=2, icon_wielded="hfrequency1") AddElement(/datum/element/sword_point) /// triggered on wield of two handed item /obj/item/vibro_weapon/proc/on_wield(obj/item/source, mob/user) wielded = TRUE /// triggered on unwield of two handed item /obj/item/vibro_weapon/proc/on_unwield(obj/item/source, mob/user) wielded = FALSE /obj/item/vibro_weapon/update_icon_state() icon_state = "hfrequency0" /obj/item/vibro_weapon/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) if(wielded) final_block_chance *= 2 if(wielded || !(attack_type & ATTACK_TYPE_PROJECTILE)) if(prob(final_block_chance)) if(attack_type & ATTACK_TYPE_PROJECTILE) owner.visible_message("[owner] deflects [attack_text] with [src]!") playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1) block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT | BLOCK_PHYSICAL_EXTERNAL else owner.visible_message("[owner] parries [attack_text] with [src]!") return BLOCK_SUCCESS | BLOCK_PHYSICAL_EXTERNAL return NONE