diff --git a/beestation.dme b/beestation.dme index cd1d8971373aa..25f0303efa8f0 100644 --- a/beestation.dme +++ b/beestation.dme @@ -3774,6 +3774,10 @@ #include "monkestation\code\game\objects\items\grenades\monkey_barrel.dm" #include "monkestation\code\game\objects\items\implants\implant_hard_spear.dm" #include "monkestation\code\game\objects\items\melee\misc.dm" +#include "monkestation\code\game\objects\items\melee\armaments\armament.dm" +#include "monkestation\code\game\objects\items\melee\armaments\blood_scythe.dm" +#include "monkestation\code\game\objects\items\melee\armaments\daemon_blade.dm" +#include "monkestation\code\game\objects\items\melee\armaments\hell_hammer.dm" #include "monkestation\code\game\objects\items\stacks\ammonia_crystals.dm" #include "monkestation\code\game\objects\items\stacks\hot_ice.dm" #include "monkestation\code\game\objects\items\stacks\sheets\mineral.dm" @@ -3816,6 +3820,7 @@ #include "monkestation\code\modules\clothing\head\misc.dm" #include "monkestation\code\modules\clothing\head\misc_special.dm" #include "monkestation\code\modules\clothing\masks\breath.dm" +#include "monkestation\code\modules\clothing\masks\daemon_mask.dm" #include "monkestation\code\modules\clothing\masks\miscellaneous.dm" #include "monkestation\code\modules\clothing\outfits\special.dm" #include "monkestation\code\modules\clothing\shoes\magboots.dm" diff --git a/monkestation/code/game/objects/items/melee/armaments/armament.dm b/monkestation/code/game/objects/items/melee/armaments/armament.dm new file mode 100644 index 0000000000000..d8b2bf115d353 --- /dev/null +++ b/monkestation/code/game/objects/items/melee/armaments/armament.dm @@ -0,0 +1,29 @@ +/obj/item/armament + name = "armament" + desc = "a daemon weapon." + force = 30 + throwforce = 10 + w_class = WEIGHT_CLASS_BULKY + hitsound = 'sound/weapons/bladeslice.ogg' + icon = 'monkestation/icons/obj/items_and_weapons.dmi' + attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") + slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT + sharpness = IS_SHARP + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF | INDESTRUCTIBLE + var/ability_cooldown = 5 SECONDS + COOLDOWN_DECLARE(armament_cooldown) + +/obj/item/armament/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!COOLDOWN_FINISHED(src,armament_cooldown)) + to_chat(user, "You must wait [COOLDOWN_TIMELEFT(src, armament_cooldown)*0.1] seconds to use [src] again!") + return TRUE + COOLDOWN_START(src,armament_cooldown,ability_cooldown) + + +/obj/item/armament/attack_self(mob/user) + . = ..() + if(!COOLDOWN_FINISHED(src,armament_cooldown)) + to_chat(user, "You must wait [COOLDOWN_TIMELEFT(src, armament_cooldown)*0.1] seconds to use [src] again!") + return TRUE + COOLDOWN_START(src,armament_cooldown,ability_cooldown) diff --git a/monkestation/code/game/objects/items/melee/armaments/blood_scythe.dm b/monkestation/code/game/objects/items/melee/armaments/blood_scythe.dm new file mode 100644 index 0000000000000..062725dea1b4b --- /dev/null +++ b/monkestation/code/game/objects/items/melee/armaments/blood_scythe.dm @@ -0,0 +1,29 @@ +/obj/item/armament/blood_scythe + name = "blood scythe" + desc = "A scythe created from the blood of demons. Click on a distant target to bring them closer." + icon_state = "blood_scythe" + item_state = "blood_scythe" + lefthand_file = 'monkestation/icons/mob/inhands/polearms_lefthand.dmi' + righthand_file = 'monkestation/icons/mob/inhands/polearms_righthand.dmi' + force = 15 + ability_cooldown = 15 SECONDS + +/obj/item/armament/blood_scythe/Initialize(mapload) + . = ..() + +/obj/item/armament/blood_scythe/attack_self(mob/user) + . = ..() + +/obj/item/armament/blood_scythe/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(!proximity_flag && get_dist(user,target) < 7) + if(!isliving(target)) + return + . = ..() + if(.) + return + var/target_turf = get_step(user, user.dir) + var/mob/living/living_target = target + if(isopenturf(target_turf)) + do_teleport(living_target, target_turf, channel = TELEPORT_CHANNEL_FREE, no_effects = TRUE, teleport_mode = TELEPORT_MODE_DEFAULT) + living_target.Stun(1 SECONDS) + living_target.Knockdown(3 SECONDS) diff --git a/monkestation/code/game/objects/items/melee/armaments/daemon_blade.dm b/monkestation/code/game/objects/items/melee/armaments/daemon_blade.dm new file mode 100644 index 0000000000000..d4580e22f0cd6 --- /dev/null +++ b/monkestation/code/game/objects/items/melee/armaments/daemon_blade.dm @@ -0,0 +1,63 @@ +/obj/item/armament/daemon_blade + name = "daemon blade" + desc = "A blade formed out of demonic energy. Activate in hand to throw flames." + icon_state = "daemon_blade" + item_state = "daemon_blade" + lefthand_file = 'monkestation/icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'monkestation/icons/mob/inhands/weapons/swords_righthand.dmi' + force = 12 + ability_cooldown = 20 SECONDS + var/flame_toggle = FALSE + +/obj/item/armament/daemon_blade/Initialize(mapload) + . = ..() + +/obj/item/armament/daemon_blade/attack_self(mob/user) + if(!COOLDOWN_FINISHED(src,armament_cooldown)) //Can't turn it on if its on cooldown + to_chat(user, "You must wait [COOLDOWN_TIMELEFT(src, armament_cooldown)*0.1] seconds to use [src] again!") + flame_toggle = FALSE + return + flame_toggle = !flame_toggle + if (flame_toggle) + icon_state = "daemon_blade_fire" + to_chat(user, "[src] glows bright with mysterious runes. Click a target to burn it") + else + icon_state = "daemon_blade" + to_chat(user, "[src] stops glowing.") + return + +/obj/item/armament/daemon_blade/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(!flame_toggle) + return + . = ..() + if(.) + return + var/turflist = get_line(user, get_turf(target)) + flame_turf(turflist) + flame_toggle = FALSE + icon_state = "daemon_blade" + to_chat(user, "[src] stops glowing.") + +/obj/item/armament/daemon_blade/proc/flame_turf(turflist) + var/turf/previous_turf = get_turf(src) + for(var/turf/current_turf in turflist) + if(current_turf == get_turf(src)) + continue + if(previous_turf == get_turf(src)) + previous_turf = current_turf + continue + if(isclosedturf(previous_turf)) //Can't fire fire through walls + break + new /obj/effect/hotspot(previous_turf) + for(var/mob/living/hit_creature in previous_turf) + hit_creature.adjustFireLoss(6) + hit_creature.throw_at(current_turf, 1, 2) + hit_creature.Stun(0.5 SECONDS) + previous_turf = current_turf + sleep(1) + //Once last hit for the final turf + if(!isclosedturf(previous_turf)) + new /obj/effect/hotspot(previous_turf) + for(var/mob/living/hit_creature in previous_turf) + hit_creature.adjustFireLoss(12) + hit_creature.Stun(1 SECONDS) diff --git a/monkestation/code/game/objects/items/melee/armaments/hell_hammer.dm b/monkestation/code/game/objects/items/melee/armaments/hell_hammer.dm new file mode 100644 index 0000000000000..c5bed38f889d1 --- /dev/null +++ b/monkestation/code/game/objects/items/melee/armaments/hell_hammer.dm @@ -0,0 +1,34 @@ +/obj/item/armament/hell_hammer + name = "hell hammer" + desc = "A hammer forged from the rocks of hell. Activate in hand to trigger a shockwave." + icon_state = "hell_hammer" + item_state = "hell_hammer" + lefthand_file = 'monkestation/icons/mob/inhands/weapons/hammers_lefthand.dmi' + righthand_file = 'monkestation/icons/mob/inhands/weapons/hammers_lefthand.dmi' + sharpness = IS_BLUNT + hitsound = "swing_hit" + attack_weight = 2 + force = 20 + ability_cooldown = 25 SECONDS + +/obj/item/armament/hell_hammer/Initialize(mapload) + . = ..() + +/obj/item/armament/hell_hammer/attack_self(mob/user) + . = ..() + if(.) + return + user.visible_message("[user] slams [src] onto the ground, creating a shockwave.", "You slam [src] into the ground, creating a shockwave.") + playsound(src, 'sound/effects/grillehit.ogg', 100) + for(var/atom/movable/shockwave_target as mob|obj in oview(5,user)) + if(shockwave_target.anchored) + continue + var/throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(shockwave_target, user))) + shockwave_target.throw_at(throwtarget, 5, 2) + if(isliving(shockwave_target)) + var/mob/living/living_target = shockwave_target + living_target.Knockdown(3 SECONDS) + living_target.Stun(3 SECONDS) + +/obj/item/armament/hell_hammer/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + return diff --git a/monkestation/code/modules/clothing/masks/daemon_mask.dm b/monkestation/code/modules/clothing/masks/daemon_mask.dm new file mode 100644 index 0000000000000..e591636302986 --- /dev/null +++ b/monkestation/code/modules/clothing/masks/daemon_mask.dm @@ -0,0 +1,322 @@ +//Daemon Mask +/obj/item/clothing/mask/daemon_mask + name = "daemon mask" + desc = "A cursed mask recovered from the ruins of an ancient cult, found to summon and house spirits." + icon = 'monkestation/icons/obj/clothing/masks.dmi' + worn_icon = 'monkestation/icons/mob/mask.dmi' + icon_state = "daemon_mask" + item_state = "daemon_mask" + clothing_flags = SHOWEROKAY + resistance_flags = FIRE_PROOF | ACID_PROOF + //Whether a spirit is in the mask or not + var/possessed = FALSE + var/mob/living/simple_animal/shade/spirit = null + + //spells only while you possess someone + var/list/possession_spells = list(/obj/effect/proc_holder/spell/targeted/mask_lunge, + /obj/effect/proc_holder/spell/self/mask_fear, + /obj/effect/proc_holder/spell/self/summon_armament) + + //spells only while youre a mask + var/list/mask_spells = list(/obj/effect/proc_holder/spell/self/mask_commune, + /obj/effect/proc_holder/spell/self/truesight) + + //spells that you always have + var/list/constant_spells = list(/obj/effect/proc_holder/spell/self/mask_possession) + + var/obj/item/armament + var/obj/item/summoned_armament + +/obj/item/clothing/mask/daemon_mask/Initialize(mapload) + . = ..() + armament = pick(subtypesof(/obj/item/armament)) + +/obj/item/clothing/mask/daemon_mask/attack_self(mob/user) + if(possessed) + return + if(!(GLOB.ghost_role_flags & GHOSTROLE_STATION_SENTIENCE)) + to_chat(user, "The mask doesn't react, it must be broken!") + return + + to_chat(user, "[src] starts glowing...") + + possessed = TRUE + + var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the spirit of the daemon mask?", ROLE_PAI, null, FALSE, 15 SECONDS, POLL_IGNORE_POSSESSED_BLADE) + + if(LAZYLEN(candidates)) + var/mob/dead/observer/candidate = pick(candidates) + var/mob/living/simple_animal/shade/new_spirit = new(src) + spirit = new_spirit + new_spirit.key = candidate.key + new_spirit.fully_replace_character_name(null, "The spirit of [src]") + new_spirit.status_flags |= GODMODE + new_spirit.mind.assigned_role = "daemon mask" + new_spirit.set_stat(CONSCIOUS) + new_spirit.remove_from_dead_mob_list() + new_spirit.add_to_alive_mob_list() + grant_all_languages() + + // new_spirit.mind.add_antag_datum(/datum/antagonist/survivalist/daemon_mask) + + for(var/ability in constant_spells) //Constant Spells + var/obj/effect/proc_holder/spell/spell_to_add = new ability + new_spirit.mind.AddSpell(spell_to_add) + + enter_mask_mode() + + to_chat(user, "[src] shines brighter and it's eyes glow red, a spirit has been summoned!") + icon_state = "daemon_mask_on" + item_state = "daemon_mask_on" + + else + to_chat(user, "[src] stops glowing. Maybe you can try again later.") + possessed = FALSE + +/obj/item/clothing/mask/daemon_mask/Destroy() + . = ..() + qdel(spirit) //if the mask dies you die + spirit = null + +/obj/item/clothing/mask/daemon_mask/proc/enter_mask_mode() + if(HAS_TRAIT(src,TRAIT_NODROP)) + REMOVE_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT) + for(var/ability in possession_spells) + spirit.mind.RemoveSpell(ability) + for(var/ability in mask_spells) + var/obj/effect/proc_holder/spell/spell = new ability + spirit.mind.AddSpell(spell) + +/obj/item/clothing/mask/daemon_mask/proc/enter_possession_mode() + if(!HAS_TRAIT(src,TRAIT_NODROP)) + ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT) //Can't take the mask off while you are in control + for(var/ability in mask_spells) + spirit.mind.RemoveSpell(ability) + for(var/ability in possession_spells) + var/obj/effect/proc_holder/spell/spell = new ability + spirit.mind.AddSpell(spell) + +//Daemon Mask - Spells +/obj/effect/proc_holder/spell/self/mask_possession + name = "Take Control" + desc = "possess of your wearer for a short time. Possessing your wearer makes them unable to go into crit until possession ends." + clothes_req = FALSE + charge_max = 3 MINUTES //1 minute for possession + 2 minutes for the cooldown after + action_icon = 'monkestation/icons/obj/clothing/masks.dmi' + action_icon_state = "daemon_mask" + invocation = "none" + invocation_type = "none" + school = "transmutation" + +/obj/effect/proc_holder/spell/self/mask_possession/cast(mob/living/user) + var/obj/item/clothing/mask/daemon_mask/mask = user.loc + if(!ishuman(mask.loc)) + to_chat(user,"No one is wearing you!") + revert_cast() + return + + var/mob/living/carbon/wearer = mask.loc + + if(mask != wearer.wear_mask) + to_chat(user,"No one is wearing you!") + revert_cast() + return + + if(!wearer.ckey) + to_chat(user,"There's no mind to possess!") + revert_cast() + return + + playsound(user, 'sound/spookoween/insane_low_laugh.ogg', 75) + + to_chat(wearer,"[mask] takes control!") + + var/mob/living/spirit = user + + mask.enter_possession_mode() + //MIND TRANSFER BEGIN + var/mob/dead/observer/ghost = wearer.ghostize(0) + spirit.mind.transfer_to(wearer) + + ghost.mind.transfer_to(spirit) + if(ghost.key) + spirit.key = ghost.key + qdel(ghost) + + //Ends stuns + wearer.SetAllImmobility(0) + wearer.adjustStaminaLoss(-100) + wearer.set_resting(FALSE) + + ADD_TRAIT(wearer, TRAIT_NODEATH, "daemon_mask") + ADD_TRAIT(wearer, TRAIT_NOSOFTCRIT, "daemon_mask") + ADD_TRAIT(wearer, TRAIT_NOHARDCRIT, "daemon_mask") + + addtimer(CALLBACK(src, .proc/undo_possession, user, wearer, mask), 60 SECONDS) + +/obj/effect/proc_holder/spell/self/mask_possession/proc/undo_possession(mob/living/swapper, mob/living/carbon/victim, obj/item/clothing/mask/daemon_mask/mask) + if(mask.summoned_armament) + qdel(mask.summoned_armament) + mask.summoned_armament = null + + var/mob/dead/observer/ghost = swapper.ghostize(0) + victim.mind.transfer_to(swapper) + + ghost.mind.transfer_to(victim) + if(ghost.key) + victim.key = ghost.key + qdel(ghost) + mask.enter_mask_mode() + + to_chat(swapper,"Your control wears off.") + to_chat(victim,"You regain control of your body.") + + REMOVE_TRAIT(victim, TRAIT_NODEATH, "daemon_mask") + REMOVE_TRAIT(victim, TRAIT_NOSOFTCRIT, "daemon_mask") + REMOVE_TRAIT(victim, TRAIT_NOHARDCRIT, "daemon_mask") + +/obj/effect/proc_holder/spell/self/mask_commune + name = "Commune" + desc = "Send a message to your wearer." + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "hivemind_link" + clothes_req = FALSE + charge_max = 1 SECONDS + invocation = "none" + invocation_type = "none" + school = "transmutation" + +/obj/effect/proc_holder/spell/self/mask_commune/cast(mob/living/user) + var/obj/item/clothing/mask/daemon_mask/mask = user.loc + + if(!ishuman(mask.loc)) + to_chat(user,"No one is wearing you!") + return + var/input = stripped_input(usr, "Talk to your wielder.", "Voice of the mask", "") + if(!input) + return + if(CHAT_FILTER_CHECK(input)) + to_chat(usr, "You cannot send a message that contains a word prohibited in IC chat!") + return + + var/mob/living/wearer = mask.loc + + to_chat(wearer, "The Daemon Mask whispers to you: [input]") + to_chat(user, "You whisper to your wielder: [input]") + user.log_talk(input, LOG_SAY, tag="daemon mask") + +//Mask Mode Spells + +/obj/effect/proc_holder/spell/self/truesight + name = "Truesight" + desc = "Gain sight into the unknown for a short time." + clothes_req = FALSE + charge_max = 45 SECONDS + action_icon = 'monkestation/icons/obj/clothing/masks.dmi' + action_icon_state = "daemon_mask_on" + invocation = "none" + invocation_type = "none" + school = "transmutation" + +/obj/effect/proc_holder/spell/self/truesight/cast(mob/living/user) + to_chat(user,"Your eyes glow brighter as you see through walls.") + user.sight |= SEE_THRU + + addtimer(CALLBACK(src, .proc/undo_cast, user), 10 SECONDS) + +/obj/effect/proc_holder/spell/self/truesight/proc/undo_cast(mob/living/user) + to_chat(user,"Your vision fades.") + user.sight &= ~SEE_THRU + +//Possession Spells + +/obj/effect/proc_holder/spell/targeted/mask_lunge + name = "Lunge" + desc = "Use daemonic power to appear on a person nearby, knocking them down." + school = "abjuration" + charge_max = 20 SECONDS + clothes_req = FALSE + invocation = "none" + invocation_type = "none" + ranged_mousepointer = 'icons/mob/actions/actions_spells.dmi' + action_icon_state = "teleport" + range = 6 + selection_type = "range" + +/obj/effect/proc_holder/spell/targeted/mask_lunge/cast(list/targets, mob/user = usr) + if(!length(targets)) + to_chat(user, "No target found in range.") + revert_cast() + return + + var/mob/living/carbon/target = targets[1] + + if(!isliving(target)) + revert_cast() + return + + if(!(target in oview(range))) + to_chat(user, "[target.p_theyre(TRUE)] too far away!") + revert_cast() + return + + + playsound(get_turf(user), 'sound/magic/blink.ogg', 50, 1) + target.Knockdown(5 SECONDS) + target.Stun(3 SECONDS) + target.visible_message("[user] appears above [target], knocking them down!", \ + "You fall violently as [user] appears above you!") + do_teleport(user, target, channel = TELEPORT_CHANNEL_FREE, no_effects = TRUE, teleport_mode = TELEPORT_MODE_DEFAULT) + +/obj/effect/proc_holder/spell/self/mask_fear + name = "Fear" + desc = "Strike fear into those who dare challenge your status." + action_icon = 'icons/mob/actions/actions_changeling.dmi' + action_icon_state = "resonant_shriek" + clothes_req = FALSE + charge_max = 20 SECONDS + invocation = "none" + invocation_type = "none" + school = "transmutation" + var/list/noises = list('sound/hallucinations/i_see_you2.ogg','sound/hallucinations/look_up1.ogg','sound/hallucinations/look_up2.ogg','sound/hallucinations/behind_you1.ogg') + +/obj/effect/proc_holder/spell/self/mask_fear/cast(mob/living/user) + var/obj/item/clothing/mask/daemon_mask/mask = user.loc + playsound(get_turf(mask), pick(noises), 200, 1) + for(var/mob/living/carbon/target in oviewers(7,mask)) + if(HAS_TRAIT(target, TRAIT_FEARLESS)) + return + + if(HAS_TRAIT(target, TRAIT_STUNIMMUNE)) + to_chat(target,"A chill runs through your body as you stare into [mask].") + return + + if(target.mind?.assigned_role == "Chaplain") + to_chat(target,"Your faith protects you as you stare into [mask].") + return + + to_chat(target,"Your joints lock up as you stare into [mask].") + target.Immobilize(5 SECONDS) + + if(prob(50)) + target.emote("scream") + +/obj/effect/proc_holder/spell/self/summon_armament + name = "Summon Armament" + desc = "Summon your weapon. Examine it to see what it does." + action_icon = 'monkestation/icons/obj/items_and_weapons.dmi' + action_icon_state = "daemon_blade" + clothes_req = FALSE + charge_max = 60 SECONDS + invocation = "none" + invocation_type = "none" + school = "transmutation" + +/obj/effect/proc_holder/spell/self/summon_armament/cast(mob/living/user) + var/obj/item/clothing/mask/daemon_mask/mask = user.get_item_by_slot(ITEM_SLOT_MASK) + if(!istype(mask)) + return + + var/obj/item/armament/new_armament = new mask.armament(loc) + mask.summoned_armament = new_armament + user.put_in_hands(new_armament) diff --git a/monkestation/code/modules/uplink/uplink_items.dm b/monkestation/code/modules/uplink/uplink_items.dm index 0b10474c7af32..9cc701afe0c65 100644 --- a/monkestation/code/modules/uplink/uplink_items.dm +++ b/monkestation/code/modules/uplink/uplink_items.dm @@ -35,6 +35,15 @@ desc = "This serum made by BEAR Co (A group of very wealthy bears) will give other species the chance to be bear." item = /obj/item/bearserum cost = 12 + +//Job Specific Items + +/datum/uplink_item/role_restricted/daemon_mask + name = "Daemon Mask" + desc = "This seemingly normal, albeit edgy, mask has the ability to summon a powerful demonic spirit that can control your body and fight for you." + item = /obj/item/clothing/mask/daemon_mask + cost = 14 + restricted_roles = list("Curator") //Species Specific Items diff --git a/monkestation/icons/mob/inhands/polearms_lefthand.dmi b/monkestation/icons/mob/inhands/polearms_lefthand.dmi index bd7e8dea452ab..bf1d0c7ba13ec 100644 Binary files a/monkestation/icons/mob/inhands/polearms_lefthand.dmi and b/monkestation/icons/mob/inhands/polearms_lefthand.dmi differ diff --git a/monkestation/icons/mob/inhands/polearms_righthand.dmi b/monkestation/icons/mob/inhands/polearms_righthand.dmi index 1f63e5eb78c28..1ec2ba3a89bb3 100644 Binary files a/monkestation/icons/mob/inhands/polearms_righthand.dmi and b/monkestation/icons/mob/inhands/polearms_righthand.dmi differ diff --git a/monkestation/icons/mob/inhands/weapons/hammers_lefthand.dmi b/monkestation/icons/mob/inhands/weapons/hammers_lefthand.dmi new file mode 100644 index 0000000000000..723ce1c79ed92 Binary files /dev/null and b/monkestation/icons/mob/inhands/weapons/hammers_lefthand.dmi differ diff --git a/monkestation/icons/mob/inhands/weapons/hammers_righthand.dmi b/monkestation/icons/mob/inhands/weapons/hammers_righthand.dmi new file mode 100644 index 0000000000000..1766f7797556d Binary files /dev/null and b/monkestation/icons/mob/inhands/weapons/hammers_righthand.dmi differ diff --git a/monkestation/icons/mob/inhands/weapons/swords_lefthand.dmi b/monkestation/icons/mob/inhands/weapons/swords_lefthand.dmi new file mode 100644 index 0000000000000..74fdb28a0efdd Binary files /dev/null and b/monkestation/icons/mob/inhands/weapons/swords_lefthand.dmi differ diff --git a/monkestation/icons/mob/inhands/weapons/swords_righthand.dmi b/monkestation/icons/mob/inhands/weapons/swords_righthand.dmi new file mode 100644 index 0000000000000..e0595ddfcbdda Binary files /dev/null and b/monkestation/icons/mob/inhands/weapons/swords_righthand.dmi differ diff --git a/monkestation/icons/mob/mask.dmi b/monkestation/icons/mob/mask.dmi index f3a222bd2c9c3..0b75de30ef06c 100644 Binary files a/monkestation/icons/mob/mask.dmi and b/monkestation/icons/mob/mask.dmi differ diff --git a/monkestation/icons/obj/clothing/masks.dmi b/monkestation/icons/obj/clothing/masks.dmi index 15e9b21b64ac6..0fb34df0fee52 100644 Binary files a/monkestation/icons/obj/clothing/masks.dmi and b/monkestation/icons/obj/clothing/masks.dmi differ diff --git a/monkestation/icons/obj/items_and_weapons.dmi b/monkestation/icons/obj/items_and_weapons.dmi index f44b956c10c0a..02f95d61aa436 100644 Binary files a/monkestation/icons/obj/items_and_weapons.dmi and b/monkestation/icons/obj/items_and_weapons.dmi differ