/obj/item/banhammer desc = "A banhammer." name = "banhammer" icon = 'icons/obj/weapons/hammer.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_continuous = list("bans") attack_verb_simple = list("ban") max_integrity = 200 armor_type = /datum/armor/item_banhammer resistance_flags = FIRE_PROOF /datum/armor/item_banhammer fire = 100 acid = 70 /obj/item/banhammer/Initialize(mapload) . = ..() AddElement(/datum/element/kneejerk) /obj/item/banhammer/suicide_act(mob/living/user) user.visible_message(span_suicide("[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/living/user) if(user.zone_selected == BODY_ZONE_HEAD) M.visible_message(span_danger("[user] are stroking the head of [M] with a bangammer."), span_userdanger("[user] are stroking your head with a bangammer."), span_hear("You hear a bangammer stroking a head.")) // see above comment else M.visible_message(span_danger("[M] has been banned FOR NO REISIN by [user]!"), span_userdanger("You have been banned FOR NO REISIN by [user]!"), span_hear("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.combat_mode) return ..(M, user) /obj/item/balloon_mallet name = "balloon mallet" desc = "It's a mallet, a weapon known for being heavy, but made from notoriously light balloons. Air inside removes any force from the swings. It'd be quite embarrassing to get hit by this." icon = 'icons/obj/weapons/hammer.dmi' icon_state = "balloon_mallet" inhand_icon_state = "balloon_mallet" lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi' siemens_coefficient = 0 force = 1 throw_speed = 1 throwforce = 1 throw_range = 1 w_class = WEIGHT_CLASS_HUGE attack_verb_continuous = list("mallets", "smoother") attack_verb_simple = list("mallet", "smoother") max_integrity = 20 armor_type = /datum/armor/item_banhammer resistance_flags = FIRE_PROOF /obj/item/balloon_mallet/examine(mob/user) . = ..() if(HAS_TRAIT(user,TRAIT_BALLOON_SUTRA)) . = "A sacred weapon of the higher castes from the clown planet, used to strike fear into the hearts of their foes. Wield it with care." /obj/item/balloon_mallet/attack(mob/living/target, mob/living/user) playsound(loc, 'sound/mobs/non-humanoids/clown/hehe.ogg', 20) if (!isliving(target)) return switch(target.mob_mood.sanity) if (SANITY_INSANE to SANITY_CRAZY) force = 8 if (SANITY_UNSTABLE to SANITY_DISTURBED) force = 4 target.add_mood_event("humiliated", /datum/mood_event/mallet_humiliation) if (SANITY_NEUTRAL to SANITY_GREAT) target.add_mood_event("humiliated", /datum/mood_event/mallet_humiliation) if(user.combat_mode) return ..(target, user) /obj/item/sord name = "\improper SORD" desc = "This thing is so unspeakably shitty you are having a hard time even holding it." icon = 'icons/obj/weapons/sword.dmi' icon_state = "sord" inhand_icon_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/items/weapons/bladeslice.ogg' attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") /obj/item/sord/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is trying to impale [user.p_them()]self with [src]! It might be a suicide attempt if it weren't so shitty."), \ span_suicide("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 = 'icons/obj/weapons/sword.dmi' icon_state = "claymore" inhand_icon_state = "claymore" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' hitsound = 'sound/items/weapons/bladeslice.ogg' obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK force = 40 throwforce = 10 w_class = WEIGHT_CLASS_NORMAL attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") block_chance = 50 block_sound = 'sound/items/weapons/parry.ogg' sharpness = SHARP_EDGED max_integrity = 200 armor_type = /datum/armor/item_claymore resistance_flags = FIRE_PROOF /datum/armor/item_claymore fire = 100 acid = 50 /obj/item/claymore/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, \ speed = 4 SECONDS, \ effectiveness = 105, \ ) /obj/item/claymore/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is falling on [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS /obj/item/claymore/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK) final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword return ..() //statistically similar to e-cutlasses /obj/item/claymore/cutlass name = "cutlass" desc = "A piratey sword used by buckaneers to \"negotiate\" the transfer of treasure." icon_state = "cutlass" inhand_icon_state = "cutlass" worn_icon_state = "cutlass" slot_flags = ITEM_SLOT_BACK force = 30 throwforce = 20 throw_speed = 3 throw_range = 5 armour_penetration = 35 /obj/item/claymore/cutlass/old name = "old cutlass" desc = parent_type::desc + " This one seems a tad old." force = 24 throwforce = 17 armour_penetration = 20 block_chance = 30 /obj/item/claymore/carrot name = "carrot sword" desc = "A full-sized carrot sword. Definitely not good for the eyes, not anymore." icon_state = "carrot_sword" inhand_icon_state = "carrot_sword" worn_icon_state = "carrot_sword" flags_1 = NONE force = 19 throwforce = 7 throw_speed = 3 throw_range = 7 armour_penetration = 5 block_chance = 10 resistance_flags = NONE //bootleg claymore /obj/item/claymore/shortsword name = "shortsword" desc = "A mercenary's sword, chipped and worn from battles long gone. You could say it is a swordsman's shortsword short sword." icon_state = "shortsword" inhand_icon_state = "shortsword" worn_icon_state = "shortsword" slot_flags = ITEM_SLOT_BELT force = 20 demolition_mod = 0.75 block_chance = 30 /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." obj_flags = CONDUCTS_ELECTRICITY item_flags = DROPDEL //WOW BRO YOU LOST AN ARM, GUESS WHAT YOU DONT GET YOUR SWORD ANYMORE //I CANT BELIEVE SPOOKYDONUT WOULD BREAK THE REQUIREMENTS slot_flags = null block_chance = 0 //RNG WON'T HELP YOU NOW, PANSY light_range = 3 attack_verb_continuous = list("brutalizes", "eviscerates", "disembowels", "hacks", "carves", "cleaves") //ONLY THE MOST VISCERAL ATTACK VERBS attack_verb_simple = list("brutalize", "eviscerate", "disembowel", "hack", "carve", "cleave") 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(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER_TRAIT) START_PROCESSING(SSobj, src) /obj/item/claymore/highlander/Destroy() if(nuke_disk) nuke_disk.forceMove(get_turf(src)) nuke_disk.visible_message(span_warning("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/holder = loc holder.layer = ABOVE_ALL_MOB_LAYER //NO HIDING BEHIND PLANTS FOR YOU, DICKWEED (HA GET IT, BECAUSE WEEDS ARE PLANTS) ADD_TRAIT(holder, TRAIT_NOBLOOD, HIGHLANDER_TRAIT) //AND WE WON'T BLEED OUT LIKE COWARDS else if(!(flags_1 & ADMIN_SPAWNED_1)) qdel(src) /obj/item/claymore/highlander/pickup(mob/living/user) . = ..() to_chat(user, span_notice("The power of Scotland protects you! You are shielded from all stuns and knockdowns.")) user.ignore_slowdown(HIGHLANDER_TRAIT) user.add_stun_absorption( source = HIGHLANDER_TRAIT, message = span_warning("%EFFECT_OWNER is protected by the power of Scotland!"), self_message = span_boldwarning("The power of Scotland absorbs the stun!"), examine_message = span_warning("%EFFECT_OWNER_THEYRE protected by the power of Scotland!"), ) /obj/item/claymore/highlander/dropped(mob/living/user) . = ..() user.unignore_slowdown(HIGHLANDER_TRAIT) user.remove_stun_absorption(HIGHLANDER_TRAIT) /obj/item/claymore/highlander/examine(mob/user) . = ..() . += "It has [!notches ? "nothing" : "[notches] notches"] scratched into the blade." if(nuke_disk) . += span_boldwarning("It's holding the nuke disk!") /obj/item/claymore/highlander/attack(mob/living/target, mob/living/user) . = ..() if(!QDELETED(target) && target.stat == DEAD && target.mind?.has_antag_datum(/datum/antagonist/highlander)) user.fully_heal() //STEAL THE LIFE OF OUR FALLEN FOES add_notch(user) target.visible_message(span_warning("[target] crumbles to dust beneath [user]'s blows!"), span_userdanger("As you fall, your body crumbles to dust!")) target.investigate_log("has been dusted by a highlander claymore.", INVESTIGATE_DEATHS) target.dust() /obj/item/claymore/highlander/attack_self(mob/living/user) var/closest_victim var/closest_distance = 255 for(var/mob/living/carbon/human/scot in GLOB.player_list - user) if(scot.mind?.has_antag_datum(/datum/antagonist/highlander) && (!closest_victim || get_dist(user, closest_victim) < closest_distance)) closest_victim = scot for(var/mob/living/silicon/robot/siliscot in GLOB.player_list - user) if(siliscot.mind?.has_antag_datum(/datum/antagonist/highlander) && (!closest_victim || get_dist(user, closest_victim) < closest_distance)) closest_victim = siliscot if(!closest_victim) to_chat(user, span_warning("[src] thrums for a moment and falls dark. Perhaps there's nobody nearby.")) return to_chat(user, span_danger("[src] thrums and points to the [dir2text(get_dir(user, closest_victim))].")) /obj/item/claymore/highlander/IsReflect() return 1 //YOU THINK YOUR PUNY LASERS CAN STOP ME? /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, span_notice("Your first kill - hopefully one of many. You scratch a notch into [src]'s blade.")) to_chat(user, span_warning("You feel your fallen foe's soul entering your blade, restoring your wounds!")) new_name = "notched claymore" if(2) to_chat(user, span_notice("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, span_notice("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, span_notice("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, span_boldannounce("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, span_boldannounce("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, span_boldannounce("Kill. Butcher. Conquer.")) new_name = "vicious claymore" add_atom_colour(rgb(255, 135, 135), ADMIN_COLOUR_PRIORITY) if(8) to_chat(user, span_userdanger("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, span_userdanger("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(span_warning("[user]'s eyes light up with a vengeful fire!"), \ span_userdanger("YOU FEEL THE POWER OF VALHALLA FLOWING THROUGH YOU! THERE CAN BE ONLY ONE!!!")) new_name = "GORE-DRENCHED CLAYMORE OF [pick("THE WHIMSICAL SLAUGHTER", "A THOUSAND SLAUGHTERED CATTLE", "GLORY AND VALHALLA", "ANNIHILATION", "OBLITERATION")]" icon_state = "claymore_gold" inhand_icon_state = "cultblade" lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' remove_atom_colour(ADMIN_COLOUR_PRIORITY) user.update_held_items() name = new_name playsound(user, 'sound/items/tools/screwdriver2.ogg', 50, TRUE) /obj/item/claymore/highlander/robot //BLOODTHIRSTY BORGS NOW COME IN PLAID icon = 'icons/obj/items_cyborg.dmi' icon_state = "claymore_cyborg" var/mob/living/silicon/robot/robot /obj/item/claymore/highlander/robot/Initialize(mapload) var/obj/item/robot_model/kiltkit = loc robot = kiltkit.loc . = ..() if(!istype(robot)) return INITIALIZE_HINT_QDEL /obj/item/claymore/highlander/robot/process() loc.layer = ABOVE_ALL_MOB_LAYER /obj/item/katana name = "katana" desc = "Woefully underpowered in D20." icon = 'icons/obj/weapons/sword.dmi' icon_state = "katana" inhand_icon_state = "katana" worn_icon_state = "katana" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK force = 40 throwforce = 10 w_class = WEIGHT_CLASS_HUGE hitsound = 'sound/items/weapons/bladeslice.ogg' attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") block_chance = 50 block_sound = 'sound/items/weapons/parry.ogg' sharpness = SHARP_EDGED max_integrity = 200 armor_type = /datum/armor/item_katana resistance_flags = FIRE_PROOF /datum/armor/item_katana fire = 100 acid = 50 /obj/item/katana/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku!")) return BRUTELOSS /obj/item/katana/cursed //used by wizard events, see the tendril_loot.dm file for the miner one slot_flags = null /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 = 'icons/obj/weapons/thrown.dmi' icon_state = "throwingstar" inhand_icon_state = "eshield" lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' force = 2 throwforce = 10 //10 + 2 (WEIGHT_CLASS_SMALL) * 4 (EMBEDDED_IMPACT_PAIN_MULTIPLIER) = 18 damage on hit due to guaranteed embedding throw_speed = 4 embed_type = /datum/embed_data/throwing_star armour_penetration = 40 w_class = WEIGHT_CLASS_SMALL sharpness = SHARP_POINTY custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 5) resistance_flags = FIRE_PROOF /datum/embed_data/throwing_star pain_mult = 4 embed_chance = 100 fall_chance = 0 /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 embed_type = /datum/embed_data/throwing_star/stamina /datum/embed_data/throwing_star/stamina pain_mult = 5 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 = NONE force = 0 throwforce = 0 embed_type = /datum/embed_data/throwing_star/toy /datum/embed_data/throwing_star/toy pain_mult = 0 jostle_pain_mult = 0 /obj/item/switchblade name = "switchblade" icon = 'icons/obj/weapons/sword.dmi' icon_state = "switchblade" base_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." obj_flags = CONDUCTS_ELECTRICITY force = 3 w_class = WEIGHT_CLASS_SMALL throwforce = 5 throw_speed = 3 throw_range = 6 custom_materials = list(/datum/material/iron= SHEET_MATERIAL_AMOUNT * 6) hitsound = 'sound/items/weapons/genhit.ogg' attack_verb_continuous = list("stubs", "pokes") attack_verb_simple = list("stub", "poke") resistance_flags = FIRE_PROOF /// Whether the switchblade starts extended or not. var/start_extended = FALSE /obj/item/switchblade/get_all_tool_behaviours() return list(TOOL_KNIFE) /obj/item/switchblade/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) AddComponent(/datum/component/butchering, \ speed = 7 SECONDS, \ effectiveness = 100, \ ) AddComponent( \ /datum/component/transforming, \ start_transformed = start_extended, \ force_on = 20, \ throwforce_on = 23, \ throw_speed_on = throw_speed, \ sharpness_on = SHARP_EDGED, \ hitsound_on = 'sound/items/weapons/bladeslice.ogg', \ w_class_on = WEIGHT_CLASS_NORMAL, \ attack_verb_continuous_on = list("slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts"), \ attack_verb_simple_on = list("slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut"), \ ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /obj/item/switchblade/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER tool_behaviour = (active ? TOOL_KNIFE : NONE) /obj/item/switchblade/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is slitting [user.p_their()] own throat with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS /obj/item/switchblade/extended start_extended = TRUE /obj/item/phone name = "red phone" desc = "Should anything ever go wrong..." icon = 'icons/obj/devices/voice.dmi' icon_state = "red_phone" force = 3 throwforce = 2 throw_speed = 3 throw_range = 4 w_class = WEIGHT_CLASS_SMALL attack_verb_continuous = list("calls", "rings") attack_verb_simple = list("call", "ring") hitsound = 'sound/items/weapons/ring.ogg' /obj/item/phone/suicide_act(mob/living/user) if(locate(/obj/structure/chair/stool) in user.loc) user.visible_message(span_suicide("[user] begins to tie a noose with [src]'s cord! It looks like [user.p_theyre()] trying to commit suicide!")) else user.visible_message(span_suicide("[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/bambostaff name = "Bamboo Staff" desc = "A long bamboo-made staff with steel-capped ends. It is rumoured that initiates of Spider Clan train with such before getting to learn how to use a katana." force = 10 block_chance = 45 block_sound = 'sound/items/weapons/genhit.ogg' slot_flags = ITEM_SLOT_BACK w_class = WEIGHT_CLASS_BULKY hitsound = SFX_SWING_HIT attack_verb_continuous = list("smashes", "slams", "whacks", "thwacks") attack_verb_simple = list("smash", "slam", "whack", "thwack") icon = 'icons/obj/weapons/staff.dmi' icon_state = "bambostaff0" base_icon_state = "bambostaff" inhand_icon_state = "bambostaff0" worn_icon_state = "bambostaff0" lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' /obj/item/bambostaff/Initialize(mapload) . = ..() AddComponent(/datum/component/two_handed, \ force_unwielded = 10, \ force_wielded = 14, \ ) /obj/item/bambostaff/update_icon_state() icon_state = inhand_icon_state = "[base_icon_state][HAS_TRAIT(src, TRAIT_WIELDED)]" return ..() /obj/item/cane name = "cane" desc = "A cane used by a true gentleman. Or a clown." icon = 'icons/obj/weapons/staff.dmi' icon_state = "cane" inhand_icon_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= SMALL_MATERIAL_AMOUNT * 0.5) attack_verb_continuous = list("bludgeons", "whacks", "disciplines", "thrashes") attack_verb_simple = list("bludgeon", "whack", "discipline", "thrash") /obj/item/cane/examine(mob/user, thats) . = ..() . += span_notice("This item can be used to support your weight, preventing limping from any broken bones on your legs you may have.") /obj/item/cane/equipped(mob/living/user, slot, initial) ..() if(!(slot & ITEM_SLOT_HANDS)) return movement_support_add(user) /obj/item/cane/dropped(mob/living/user, silent = FALSE) . = ..() movement_support_del(user) /obj/item/cane/proc/movement_support_add(mob/living/user) RegisterSignal(user, COMSIG_CARBON_LIMPING, PROC_REF(handle_limping)) return TRUE /obj/item/cane/proc/movement_support_del(mob/living/user) UnregisterSignal(user, list(COMSIG_CARBON_LIMPING)) return TRUE /obj/item/cane/proc/handle_limping(mob/living/user) SIGNAL_HANDLER return COMPONENT_CANCEL_LIMP /obj/item/cane/crutch name = "medical crutch" desc = "A medical crutch used by people missing a leg. Not all that useful if you're missing both of them, though." icon = 'icons/obj/weapons/staff.dmi' icon_state = "crutch_med" inhand_icon_state = "crutch_med" lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' force = 12 throwforce = 8 w_class = WEIGHT_CLASS_BULKY custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5) attack_verb_continuous = list("bludgeons", "whacks", "thrashes") attack_verb_simple = list("bludgeon", "whack", "thrash") /obj/item/cane/crutch/examine(mob/user, thats) . = ..() // tacked on after the cane string . += span_notice("As a crutch, it can also help lessen the slowdown incurred by missing a leg.") /obj/item/cane/crutch/movement_support_add(mob/living/user) . = ..() if(!.) return RegisterSignal(user, COMSIG_LIVING_LIMBLESS_SLOWDOWN, PROC_REF(handle_slowdown)) user.update_usable_leg_status() user.AddElementTrait(TRAIT_WADDLING, REF(src), /datum/element/waddling) /obj/item/cane/crutch/movement_support_del(mob/living/user) . = ..() if(!.) return UnregisterSignal(user, list(COMSIG_LIVING_LIMBLESS_SLOWDOWN, COMSIG_CARBON_LIMPING)) user.update_usable_leg_status() REMOVE_TRAIT(user, TRAIT_WADDLING, REF(src)) /obj/item/cane/crutch/proc/handle_slowdown(mob/living/user, limbless_slowdown, list/slowdown_mods) SIGNAL_HANDLER var/leg_amount = user.usable_legs // Don't do anything if the number is equal (or higher) to the usual. if(leg_amount >= user.default_num_legs) return // If we have at least one leg and it's less than the default, reduce slowdown by 60%. if(leg_amount && (leg_amount < user.default_num_legs)) slowdown_mods += 0.4 /obj/item/cane/crutch/wood name = "wooden crutch" desc = "A handmade crutch. Also makes a decent bludgeon if you need it." icon_state = "crutch_wood" inhand_icon_state = "crutch_wood" custom_materials = list(/datum/material/wood = SMALL_MATERIAL_AMOUNT * 0.5) /obj/item/cane/white name = "white cane" desc = "Traditionally used by the blind to help them see. Folds down to be easier to transport." icon_state = "cane_white" inhand_icon_state = "cane_white" lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' force = 1 w_class = WEIGHT_CLASS_SMALL custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 6) /obj/item/cane/white/Initialize(mapload) . = ..() AddComponent( \ /datum/component/transforming, \ force_on = 7, \ hitsound_on = hitsound, \ w_class_on = WEIGHT_CLASS_BULKY, \ clumsy_check = FALSE, \ attack_verb_continuous_on = list("smacks", "strikes", "cracks", "beats"), \ attack_verb_simple_on = list("smack", "strike", "crack", "beat"), \ ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) ADD_TRAIT(src, TRAIT_BLIND_TOOL, INNATE_TRAIT) /obj/item/cane/white/handle_limping(mob/living/user) return HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) ? COMPONENT_CANCEL_LIMP : NONE /* * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. * * Gives feedback to the user and makes it show up inhand. */ /obj/item/cane/white/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER if(user) balloon_alert(user, active ? "extended" : "collapsed") playsound(src, 'sound/items/weapons/batonextend.ogg', 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/staff name = "wizard staff" desc = "Apparently a staff used by the wizard." icon = 'icons/obj/weapons/guns/magic.dmi' icon_state = "staff" inhand_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_continuous = list("bludgeons", "whacks", "disciplines") attack_verb_simple = list("bludgeon", "whack", "discipline") 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_state = "broom" inhand_icon_state = "broom" resistance_flags = FLAMMABLE /obj/item/staff/tape name = "tape staff" desc = "A roll of tape snugly attached to a stick." icon_state = "tapestaff" inhand_icon_state = "tapestaff" 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/weapons/staff.dmi' icon_state = "cane" inhand_icon_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/effects/magic.dmi' icon_state = "ectoplasm" grind_results = list(/datum/reagent/hauntium = 25) //can be ground into hauntium /obj/item/ectoplasm/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is inhaling [src]! It looks like [user.p_theyre()] trying to visit the astral plane!")) return OXYLOSS /obj/item/ectoplasm/angelic icon = 'icons/effects/magic.dmi' icon_state = "angelplasm" /obj/item/ectoplasm/mystic icon_state = "mysticplasm" /obj/item/tailclub name = "tail club" desc = "For the beating to death of lizards with their own tails." icon = 'icons/obj/weapons/club.dmi' 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_continuous = list("clubs", "bludgeons") attack_verb_simple = list("club", "bludgeon") /obj/item/melee/chainofcommand/tailwhip name = "liz o' nine tails" desc = "A whip fashioned from the severed tails of lizards." icon_state = "tailwhip" inhand_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" inhand_icon_state = "catwhip" /obj/item/melee/skateboard name = "skateboard" desc = "A skateboard. It can be placed on its wheels and ridden, or used as a radical weapon." icon = 'icons/mob/rideables/vehicles.dmi' icon_state = "skateboard_held" inhand_icon_state = "skateboard" force = 12 throwforce = 4 w_class = WEIGHT_CLASS_NORMAL attack_verb_continuous = list("smacks", "whacks", "slams", "smashes") attack_verb_simple = list("smack", "whack", "slam", "smash") ///The vehicle counterpart for the board var/board_item_type = /obj/vehicle/ridden/scooter/skateboard /obj/item/melee/skateboard/attack_self(mob/user) var/obj/vehicle/ridden/scooter/skateboard/S = new board_item_type(get_turf(user))//this probably has fucky interactions with telekinesis but for the record it wasn't my fault S.buckle_mob(user) qdel(src) /obj/item/melee/skateboard/improvised name = "improvised skateboard" desc = "A jury-rigged skateboard. It can be placed on its wheels and ridden, or used as a radical weapon." board_item_type = /obj/vehicle/ridden/scooter/skateboard/improvised /obj/item/melee/skateboard/pro name = "skateboard" desc = "An EightO brand professional skateboard. It looks sturdy and well made." icon_state = "skateboard2_held" inhand_icon_state = "skateboard2" board_item_type = /obj/vehicle/ridden/scooter/skateboard/pro custom_premium_price = PAYCHECK_COMMAND * 5 /obj/item/melee/skateboard/hoverboard name = "hoverboard" desc = "A blast from the past, so retro!" icon_state = "hoverboard_red_held" inhand_icon_state = "hoverboard_red" board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard custom_premium_price = PAYCHECK_COMMAND * 5.4 //If I can't make it a meme I'll make it RAD /obj/item/melee/skateboard/hoverboard/admin name = "Board Of Directors" desc = "The engineering complexity of a spaceship concentrated inside of a board. Just as expensive, too." icon_state = "hoverboard_nt_held" inhand_icon_state = "hoverboard_nt" board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard/admin /obj/item/melee/skateboard/holyboard name = "holy skateboard" desc = "A board blessed by the gods with the power to grind for our sins. Has the initials 'J.C.' on the underside." icon_state = "hoverboard_holy_held" inhand_icon_state = "hoverboard_holy" force = 18 throwforce = 6 w_class = WEIGHT_CLASS_NORMAL attack_verb_continuous = list("bashes", "crashes", "grinds", "skates") attack_verb_simple = list("bash", "crash", "grind", "skate") board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard/holyboarded /obj/item/melee/skateboard/holyboard/Initialize(mapload) . = ..() AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY) AddComponent(/datum/component/effect_remover, \ success_feedback = "You disrupt the magic of %THEEFFECT with %THEWEAPON.", \ success_forcesay = "BEGONE FOUL MAGICKS!!", \ tip_text = "Clear rune", \ on_clear_callback = CALLBACK(src, PROC_REF(on_cult_rune_removed)), \ effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune) \ ) AddElement(/datum/element/bane, target_type = /mob/living/basic/revenant, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE) /obj/item/melee/skateboard/holyboard/proc/on_cult_rune_removed(obj/effect/target, mob/living/user) SIGNAL_HANDLER if(!istype(target, /obj/effect/rune)) return var/obj/effect/rune/target_rune = target if(target_rune.log_when_erased) user.log_message("erased [target_rune.cultist_name] rune using [src]", LOG_GAME) SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] = TRUE /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/weapons/bat.dmi' icon_state = "baseball_bat" inhand_icon_state = "baseball_bat" lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' force = 12 wound_bonus = -10 throwforce = 12 demolition_mod = 1.25 attack_verb_continuous = list("beats", "smacks") attack_verb_simple = list("beat", "smack") custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 3.5) resistance_flags = FLAMMABLE w_class = WEIGHT_CLASS_HUGE /// Are we able to do a homerun? var/homerun_able = FALSE /// Are we ready to do a homerun? var/homerun_ready = FALSE /// Can we launch mobs thrown at us away? var/mob_thrower = FALSE /// List of all thrown datums we sent. var/list/thrown_datums = list() /obj/item/melee/baseball_bat/Initialize(mapload) . = ..() if(prob(1)) name = "cricket bat" icon_state = "baseball_bat_brit" inhand_icon_state = "baseball_bat_brit" desc = pick("You've got red on you.", "You gotta know what a crumpet is to understand cricket.") AddElement(/datum/element/kneecapping) /obj/item/melee/baseball_bat/attack_self(mob/user) if(!homerun_able) return ..() if(homerun_ready) to_chat(user, span_warning("You're already ready to do a home run!")) return ..() to_chat(user, span_warning("You begin gathering strength...")) playsound(get_turf(src), 'sound/effects/magic/lightning_chargeup.ogg', 65, TRUE) if(do_after(user, 9 SECONDS, target = src)) to_chat(user, span_userdanger("You gather power! Time for a home run!")) homerun_ready = TRUE return ..() /obj/item/melee/baseball_bat/attack(mob/living/target, mob/living/user) // we obtain the relative direction from the bat itself to the target var/relative_direction = get_cardinal_dir(src, target) var/atom/throw_target = get_edge_target_turf(target, relative_direction) . = ..() if(HAS_TRAIT(user, TRAIT_PACIFISM)) return if(homerun_ready) user.visible_message(span_userdanger("It's a home run!")) if(!QDELETED(target)) target.throw_at(throw_target, rand(8,10), 14, user) SSexplosions.medturf += throw_target playsound(get_turf(src), 'sound/items/weapons/homerun.ogg', 100, TRUE) homerun_ready = FALSE return else if(!QDELETED(target) && !target.anchored) var/whack_speed = (prob(60) ? 1 : 4) target.throw_at(throw_target, rand(1, 2), whack_speed, user, gentle = TRUE) // sorry friends, 7 speed batting caused wounds to absolutely delete whoever you knocked your target into (and said target) /obj/item/melee/baseball_bat/Destroy(force) for(var/target in thrown_datums) var/datum/thrownthing/throw_datum = thrown_datums[target] throw_datum.callback.Invoke() thrown_datums.Cut() return ..() /obj/item/melee/baseball_bat/pre_attack(atom/movable/target, mob/living/user, params) var/turf/target_turf = get_turf(target) if(!target_turf) return ..() for(var/atom/movable/atom as anything in target_turf) if(!try_launch(atom, user)) continue return TRUE return ..() /obj/item/melee/baseball_bat/proc/try_launch(atom/movable/target, mob/living/user) if(!target.throwing || (ismob(target) && !mob_thrower)) return FALSE var/datum/thrownthing/throw_datum = target.throwing var/datum_throw_speed = throw_datum.speed var/angle = 0 var/target_to_user = get_dir(target, user) if(target.dir & turn(target_to_user, 90)) angle = 270 if(target.dir & turn(target_to_user, 270)) angle = 90 if(target.dir & REVERSE_DIR(target_to_user)) angle = 180 if(target.dir & target_to_user) angle = 360 var/turf/return_to_sender = get_ranged_target_turf_direct(user, throw_datum.starting_turf, round(target.throw_range * 1.5, 1), offset = angle + (rand(-1, 1) * 10)) throw_datum.finalize(hit = FALSE) target.mouse_opacity = MOUSE_OPACITY_TRANSPARENT //dont mess with our ball target.color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,3) //make them super light animate(target, 0.5 SECONDS, color = null, flags = ANIMATION_PARALLEL) user.color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,3) animate(user, 0.5 SECONDS, color = null, flags = ANIMATION_PARALLEL) playsound(src, 'sound/items/baseballhit.ogg', 100, TRUE) user.do_attack_animation(target, used_item = src) ADD_TRAIT(user, TRAIT_IMMOBILIZED, type) addtimer(CALLBACK(src, PROC_REF(launch_back), target, user, return_to_sender, datum_throw_speed), 0.5 SECONDS) return TRUE /obj/item/melee/baseball_bat/proc/launch_back(atom/movable/target, mob/living/user, turf/target_turf, datum_throw_speed) playsound(target, 'sound/effects/magic/tail_swing.ogg', 50, TRUE) REMOVE_TRAIT(user, TRAIT_IMMOBILIZED, type) target.mouse_opacity = initial(target.mouse_opacity) target.add_filter("baseball_launch", 3, motion_blur_filter(1, 3)) target.throwforce *= 2 target.throw_at(target_turf, get_dist(target, target_turf), datum_throw_speed + 1, user, callback = CALLBACK(src, PROC_REF(on_hit), target)) thrown_datums[target] = target.throwing /obj/item/melee/baseball_bat/proc/on_hit(atom/movable/target) target.remove_filter("baseball_launch") target.throwforce *= 0.5 thrown_datums -= target /obj/item/melee/baseball_bat/homerun name = "home run bat" desc = "This thing looks dangerous... Dangerously good at baseball, that is." icon_state = "baseball_bat_home" inhand_icon_state = "baseball_bat_home" homerun_able = TRUE mob_thrower = TRUE /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" inhand_icon_state = "baseball_bat_metal" custom_materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 3.5) resistance_flags = NONE force = 20 throwforce = 20 mob_thrower = TRUE block_sound = 'sound/items/weapons/effects/batreflect.ogg' /obj/item/melee/baseball_bat/ablative/IsReflect()//some day this will reflect thrown items instead of lasers return TRUE /obj/item/melee/flyswatter name = "flyswatter" desc = "Useful for killing pests of all sizes." icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "flyswatter" inhand_icon_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_continuous = list("swats", "smacks") attack_verb_simple = list("swat", "smack") 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/static/list/splattable /// Things in this list which take a lot more damage from the fly swatter, but not be necessarily killed by it. var/static/list/strong_against /// How much extra damage the fly swatter does against mobs it is strong against var/extra_strength_damage = 24 /obj/item/melee/flyswatter/Initialize(mapload) . = ..() if (isnull(splattable)) splattable = typecacheof(list( /mob/living/basic/ant, /mob/living/basic/butterfly, /mob/living/basic/cockroach, /mob/living/basic/spider/growing/spiderling, /mob/living/basic/bee, /obj/effect/decal/cleanable/ants, /obj/item/queen_bee, )) if (isnull(strong_against)) strong_against = typecacheof(list( /mob/living/basic/spider, )) /obj/item/melee/flyswatter/afterattack(atom/target, mob/user, click_parameters) if(is_type_in_typecache(target, splattable)) to_chat(user, span_warning("You easily splat [target].")) if(isliving(target)) new /obj/effect/decal/cleanable/insectguts(target.drop_location()) var/mob/living/bug = target bug.investigate_log("has been splatted by a flyswatter.", INVESTIGATE_DEATHS) bug.gib(DROP_ALL_REMAINS) else qdel(target) return if(is_type_in_typecache(target, strong_against) && isliving(target)) var/mob/living/living_target = target living_target.adjustBruteLoss(extra_strength_damage) /obj/item/proc/can_trigger_gun(mob/living/user, akimbo_usage) 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/toys/toy.dmi' icon_state = "extendohand" inhand_icon_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 var/min_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, params) var/dist = get_dist(M, user) if(dist < min_reach) to_chat(user, span_warning("[M] is too close to use [src] on.")) return var/list/modifiers = params2list(params) M.attack_hand(user, modifiers) /obj/item/gohei name = "gohei" desc = "A wooden stick with white streamers at the end. Originally used by shrine maidens to purify things. Now used by the station's valued weeaboos." resistance_flags = FLAMMABLE force = 5 throwforce = 5 hitsound = SFX_SWING_HIT attack_verb_continuous = list("whacks", "thwacks", "wallops", "socks") attack_verb_simple = list("whack", "thwack", "wallop", "sock") icon = 'icons/obj/weapons/club.dmi' icon_state = "gohei" inhand_icon_state = "gohei" lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' /obj/item/melee/moonlight_greatsword name = "moonlight greatsword" desc = "Don't tell anyone you put any points into dex, though." icon = 'icons/obj/weapons/sword.dmi' icon_state = "swordon" inhand_icon_state = "swordon" worn_icon_state = "swordon" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT block_chance = 20 block_sound = 'sound/items/weapons/parry.ogg' sharpness = SHARP_EDGED force = 14 throwforce = 12 hitsound = 'sound/items/weapons/bladeslice.ogg' attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") //High Frequency Blade /obj/item/highfrequencyblade name = "high frequency blade" desc = "A sword reinforced by a powerful alternating current and resonating at extremely high vibration frequencies. \ This oscillation weakens the molecular bonds of anything it cuts, thereby increasing its cutting ability." icon = 'icons/obj/weapons/sword.dmi' icon_state = "hfrequency0" worn_icon_state = "hfrequency0" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' force = 10 wound_bonus = 25 bare_wound_bonus = 50 throwforce = 25 throw_speed = 4 attack_speed = CLICK_CD_HYPER_RAPID embed_type = /datum/embed_data/hfr_blade block_chance = 25 block_sound = 'sound/items/weapons/parry.ogg' sharpness = SHARP_EDGED w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK /// The color of the slash we create var/slash_color = COLOR_BLUE /// Previous x position of where we clicked on the target's icon var/previous_x /// Previous y position of where we clicked on the target's icon var/previous_y /// The previous target we attacked var/datum/weakref/previous_target /datum/embed_data/hfr_blade embed_chance = 100 /obj/item/highfrequencyblade/Initialize(mapload) . = ..() AddComponent(/datum/component/two_handed, \ wield_callback = CALLBACK(src, PROC_REF(on_wield)), \ unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \ ) AddElement(/datum/element/update_icon_updates_onmob) /obj/item/highfrequencyblade/update_icon_state() icon_state = "hfrequency[HAS_TRAIT(src, TRAIT_WIELDED)]" return ..() /obj/item/highfrequencyblade/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) if(attack_type == PROJECTILE_ATTACK) if(HAS_TRAIT(src, TRAIT_WIELDED) || prob(final_block_chance)) owner.visible_message(span_danger("[owner] deflects [attack_text] with [src]!")) playsound(src, pick('sound/items/weapons/bulletflyby.ogg', 'sound/items/weapons/bulletflyby2.ogg', 'sound/items/weapons/bulletflyby3.ogg'), 75, TRUE) return TRUE return FALSE if(prob(final_block_chance * (HAS_TRAIT(src, TRAIT_WIELDED) ? 2 : 1))) owner.visible_message(span_danger("[owner] parries [attack_text] with [src]!")) return TRUE return FALSE /obj/item/highfrequencyblade/pre_attack(atom/A, mob/living/user, params) . = ..() if(.) return . if(!HAS_TRAIT(src, TRAIT_WIELDED)) return . // Default attack if(isliving(A) && HAS_TRAIT(src, TRAIT_PACIFISM)) return . // Default attack (ultimately nothing) return slash(A, user, params) /// triggered on wield of two handed item /obj/item/highfrequencyblade/proc/on_wield(obj/item/source, mob/user) update_icon(UPDATE_ICON_STATE) /// triggered on unwield of two handed item /obj/item/highfrequencyblade/proc/on_unwield(obj/item/source, mob/user) update_icon(UPDATE_ICON_STATE) /obj/item/highfrequencyblade/proc/slash(atom/target, mob/living/user, params) user.do_attack_animation(target, "nothing") var/list/modifiers = params2list(params) var/damage_mod = 1 var/x_slashed = text2num(modifiers[ICON_X]) || world.icon_size/2 //in case we arent called by a client var/y_slashed = text2num(modifiers[ICON_Y]) || world.icon_size/2 //in case we arent called by a client new /obj/effect/temp_visual/slash(get_turf(target), target, x_slashed, y_slashed, slash_color) if(target == previous_target?.resolve()) //if the same target, we calculate a damage multiplier if you swing your mouse around var/x_mod = previous_x - x_slashed var/y_mod = previous_y - y_slashed damage_mod = max(1, round((sqrt(x_mod ** 2 + y_mod ** 2) / 10), 0.1)) previous_target = WEAKREF(target) previous_x = x_slashed previous_y = y_slashed playsound(src, 'sound/items/weapons/bladeslice.ogg', 100, vary = TRUE) playsound(src, 'sound/items/weapons/zapbang.ogg', 50, vary = TRUE) if(isliving(target)) var/mob/living/living_target = target living_target.apply_damage(force*damage_mod, BRUTE, sharpness = SHARP_EDGED, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, def_zone = user.zone_selected) log_combat(user, living_target, "slashed", src) if(living_target.stat == DEAD && prob(force*damage_mod*0.5)) living_target.visible_message(span_danger("[living_target] explodes in a shower of gore!"), blind_message = span_hear("You hear organic matter ripping and tearing!")) living_target.investigate_log("has been gibbed by [src].", INVESTIGATE_DEATHS) living_target.gib(DROP_ALL_REMAINS) log_combat(user, living_target, "gibbed", src) return TRUE else if(target.uses_integrity) target.take_damage(force*damage_mod*3, BRUTE, MELEE, FALSE, null, 50) return TRUE else if(iswallturf(target) && prob(force*damage_mod*0.5)) var/turf/closed/wall/wall_target = target wall_target.dismantle_wall() return TRUE else if(ismineralturf(target) && prob(force*damage_mod)) var/turf/closed/mineral/mineral_target = target mineral_target.gets_drilled() return TRUE return FALSE /obj/effect/temp_visual/slash icon_state = "highfreq_slash" alpha = 150 duration = 0.5 SECONDS layer = ABOVE_ALL_MOB_LAYER plane = ABOVE_GAME_PLANE /obj/effect/temp_visual/slash/Initialize(mapload, atom/target, x_slashed, y_slashed, slash_color) . = ..() if(!target) return var/matrix/new_transform = matrix() new_transform.Turn(rand(1, 360)) // Random slash angle var/datum/decompose_matrix/decomp = target.transform.decompose() new_transform.Translate((x_slashed - world.icon_size/2) * decomp.scale_x, (y_slashed - world.icon_size/2) * decomp.scale_y) // Move to where we clicked //Follow target's transform while ignoring scaling new_transform.Turn(decomp.rotation) new_transform.Translate(decomp.shift_x, decomp.shift_y) new_transform.Translate(target.pixel_x, target.pixel_y) // Follow target's pixel offsets transform = new_transform //Double the scale of the matrix by doubling the 2x2 part without touching the translation part var/matrix/scaled_transform = new_transform + matrix(new_transform.a, new_transform.b, 0, new_transform.d, new_transform.e, 0) animate(src, duration*0.5, color = slash_color, transform = scaled_transform, alpha = 255) /obj/item/highfrequencyblade/wizard desc = "A blade that was mastercrafted by a legendary blacksmith. Its' enchantments let it slash through anything." force = 8 throwforce = 20 wound_bonus = 20 bare_wound_bonus = 25 /obj/item/highfrequencyblade/wizard/attack_self(mob/user, modifiers) if(!HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED)) balloon_alert(user, "you're too weak!") return return ..()