From dac57002ffba54c0650c25bdc96c2dbc67b4e347 Mon Sep 17 00:00:00 2001 From: Mira <42539014+MiraHell@users.noreply.github.com> Date: Fri, 17 Jan 2025 21:16:59 +0300 Subject: [PATCH] [PORT] Add mantis blades (new traitor item) (#27594) * add mantis blades * fix nuclear only * fix .dme edit * fix linter * new attack chain * maybe fix linter * add NT mantis blade to syndicate 6 * newline * add list * fix nested types * ability to pry open doors with two blades * Update code/game/machinery/doors/airlock.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> Signed-off-by: Mira <42539014+MiraHell@users.noreply.github.com> * requested changes * remove transform * replace sleep with addtimer * Update code/datums/uplink_items/uplink_general.dm Co-authored-by: PopeDaveThe3th <80988376+PopeDaveThe3th@users.noreply.github.com> Signed-off-by: Mira <42539014+MiraHell@users.noreply.github.com> * Update code/datums/uplink_items/uplink_general.dm Co-authored-by: PopeDaveThe3th <80988376+PopeDaveThe3th@users.noreply.github.com> Signed-off-by: Mira <42539014+MiraHell@users.noreply.github.com> * Update code/game/objects/items/weapons/storage/uplink_kits.dm Co-authored-by: PopeDaveThe3th <80988376+PopeDaveThe3th@users.noreply.github.com> Signed-off-by: Mira <42539014+MiraHell@users.noreply.github.com> * Update code/modules/research/designs/weapon_designs.dm Co-authored-by: PopeDaveThe3th <80988376+PopeDaveThe3th@users.noreply.github.com> Signed-off-by: Mira <42539014+MiraHell@users.noreply.github.com> * Update code/modules/research/designs/weapon_designs.dm Co-authored-by: PopeDaveThe3th <80988376+PopeDaveThe3th@users.noreply.github.com> Signed-off-by: Mira <42539014+MiraHell@users.noreply.github.com> * Update code/modules/surgery/organs/augments_arms.dm Co-authored-by: PopeDaveThe3th <80988376+PopeDaveThe3th@users.noreply.github.com> Signed-off-by: Mira <42539014+MiraHell@users.noreply.github.com> * Update code/modules/surgery/organs/augments_arms.dm Co-authored-by: PopeDaveThe3th <80988376+PopeDaveThe3th@users.noreply.github.com> Signed-off-by: Mira <42539014+MiraHell@users.noreply.github.com> * Update code/modules/surgery/organs/augments_arms.dm Co-authored-by: PopeDaveThe3th <80988376+PopeDaveThe3th@users.noreply.github.com> Signed-off-by: Mira <42539014+MiraHell@users.noreply.github.com> * Update code/modules/surgery/organs/augments_arms.dm Co-authored-by: PopeDaveThe3th <80988376+PopeDaveThe3th@users.noreply.github.com> Signed-off-by: Mira <42539014+MiraHell@users.noreply.github.com> * Update code/modules/surgery/organs/augments_arms.dm Co-authored-by: PopeDaveThe3th <80988376+PopeDaveThe3th@users.noreply.github.com> Signed-off-by: Mira <42539014+MiraHell@users.noreply.github.com> * Update code/modules/surgery/organs/augments_arms.dm Co-authored-by: PopeDaveThe3th <80988376+PopeDaveThe3th@users.noreply.github.com> Signed-off-by: Mira <42539014+MiraHell@users.noreply.github.com> * add safetys and some cleanup * return parry sound * snake case and replace CALLBACK with VARSET_CALLBACK * move attacking logic and update item and uplink description * cleanup * first attempt * fix conditional statement * update paradise.dme * edit whitespace * signal interceptors * improve some logic * oops * use COMSIG_INTERACTING * return one whitespace * subtype for mantis blades * replace .GetComponent() with signal * fix typo * better naming * attempt_cancel_message and some logic * split logic --------- Signed-off-by: Mira <42539014+MiraHell@users.noreply.github.com> Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> Co-authored-by: PopeDaveThe3th <80988376+PopeDaveThe3th@users.noreply.github.com> --- code/__DEFINES/dcs/datum_signals.dm | 2 + code/__HELPERS/trait_helpers.dm | 2 - code/_globalvars/traits.dm | 1 - code/datums/components/forces_doors_open.dm | 117 ++++++++++++++++++ code/datums/components/two_handed.dm | 10 ++ code/datums/uplink_items/uplink_general.dm | 9 ++ code/game/machinery/doors/airlock.dm | 28 ----- code/game/machinery/doors/door.dm | 3 - .../items/weapons/storage/uplink_kits.dm | 9 ++ code/game/objects/items/weapons/twohanded.dm | 4 +- .../changeling/powers/mutations.dm | 2 +- .../research/designs/weapon_designs.dm | 12 ++ code/modules/surgery/organs/augments_arms.dm | 96 ++++++++++++++ code/modules/surgery/organs/autosurgeon.dm | 6 + icons/mob/inhands/implants_lefthand.dmi | Bin 932 -> 1399 bytes icons/mob/inhands/implants_righthand.dmi | Bin 934 -> 1406 bytes icons/obj/weapons/melee.dmi | Bin 14062 -> 15968 bytes paradise.dme | 1 + 18 files changed, 265 insertions(+), 37 deletions(-) create mode 100644 code/datums/components/forces_doors_open.dm diff --git a/code/__DEFINES/dcs/datum_signals.dm b/code/__DEFINES/dcs/datum_signals.dm index e6e15a052db..19682ccd80d 100644 --- a/code/__DEFINES/dcs/datum_signals.dm +++ b/code/__DEFINES/dcs/datum_signals.dm @@ -68,6 +68,8 @@ #define COMPONENT_TWOHANDED_BLOCK_WIELD (1<<0) ///from base of datum/component/two_handed/proc/unwield(mob/living/carbon/user): (/mob/user) #define COMSIG_TWOHANDED_UNWIELD "twohanded_unwield" +///from base of /datum/component/forces_doors_open/proc/force_open_door(obj/item): (datum/source, mob/user, atom/target) +#define COMSIG_TWOHANDED_WIELDED_TRY_WIELD_INTERACT "twohanded_wielded_try_wield_interact" // /datum/action diff --git a/code/__HELPERS/trait_helpers.dm b/code/__HELPERS/trait_helpers.dm index 4b23a6c59af..5243e3473fd 100644 --- a/code/__HELPERS/trait_helpers.dm +++ b/code/__HELPERS/trait_helpers.dm @@ -280,8 +280,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_WIELDED "wielded" /// Wires on this will have their titles randomized for those with SHOW_WIRES #define TRAIT_OBSCURED_WIRES "obscured_wires" -/// Forces open doors after a delay specific to the item -#define TRAIT_FORCES_OPEN_DOORS_ITEM "forces_open_doors_item_varient" /// Makes the item no longer spit out a visible message when thrown #define TRAIT_NO_THROWN_MESSAGE "no_message_when_thrown" /// Makes the item not display a message on storage insertion diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index afd12fa9612..7e4d94bf4d1 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -133,7 +133,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SUPERMATTER_IMMUNE" = TRAIT_SUPERMATTER_IMMUNE, "TRAIT_BUTCHER_HUMANS" = TRAIT_BUTCHERS_HUMANS, "TRAIT_CMAGGED" = TRAIT_CMAGGED, - "TRAIT_FORCES_OPEN_DOORS" = TRAIT_FORCES_OPEN_DOORS_ITEM, "TRAIT_OBSCURED_WIRES" = TRAIT_OBSCURED_WIRES, "TRAIT_XENO_INTERACTABLE" = TRAIT_XENO_INTERACTABLE, "TRAIT_NO_THROWN_MESSAGE" = TRAIT_NO_THROWN_MESSAGE, diff --git a/code/datums/components/forces_doors_open.dm b/code/datums/components/forces_doors_open.dm new file mode 100644 index 00000000000..c099a927d92 --- /dev/null +++ b/code/datums/components/forces_doors_open.dm @@ -0,0 +1,117 @@ +/** + * /datum/component/forces_doors_open + * + * This component allows item to pry open doors. + * + */ + +/datum/component/forces_doors_open + /// The time it takes to open the airlock when forced + var/time_to_open + /// Whether the airlock can be forced open while powered. + var/can_force_open_while_powered + /// Whether the airlock can be forced open while unpowered. + var/can_force_open_while_unpowered + /// Whether the firedoor can be opened. + var/can_open_firedoors + /// The sound played when the airlock is forced open. + var/open_sound + /// Indicates whether no sound should be played when opening. + var/no_sound + +/datum/component/forces_doors_open/Initialize( + time_to_open = 5 SECONDS, + can_force_open_while_powered = TRUE, + can_force_open_while_unpowered = TRUE, + can_open_firedoors = TRUE, + open_sound = 'sound/machines/airlock_alien_prying.ogg', + no_sound = FALSE) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + src.time_to_open = time_to_open + src.can_force_open_while_powered = can_force_open_while_powered + src.can_force_open_while_unpowered = can_force_open_while_unpowered + src.can_open_firedoors = can_open_firedoors + src.open_sound = open_sound + src.no_sound = no_sound + + RegisterSignal(parent, COMSIG_INTERACTING, PROC_REF(on_interact)) + +/datum/component/forces_doors_open/proc/on_interact(datum/source, mob/user, atom/target) + SIGNAL_HANDLER // COMSIG_INTERACTING + + if(check_intent(user)) + return + + if(try_to_open_firedoor(target)) + return ITEM_INTERACT_COMPLETE + + if(try_to_force_open_airlock(user, target)) + return ITEM_INTERACT_COMPLETE + +/// check is user in harm intent +/datum/component/forces_doors_open/proc/check_intent(mob/user) + if(user.a_intent == INTENT_HARM) + return TRUE + +/// try to open firedoor +/datum/component/forces_doors_open/proc/try_to_open_firedoor(atom/target) + if(can_open_firedoors && istype(target, /obj/machinery/door/firedoor)) // open firedoor and dont open blastdoors and windowdoors + INVOKE_ASYNC(src, PROC_REF(open_unpowered_door), target) + return TRUE + +/// try to force open airlock +/datum/component/forces_doors_open/proc/try_to_force_open_airlock(mob/user, obj/machinery/door/airlock/airlock) + if(!istype(airlock, /obj/machinery/door/airlock)) // only airlocks have arePowerSystemsOn() + return + + if(SEND_SIGNAL(parent, COMSIG_TWOHANDED_WIELDED_TRY_WIELD_INTERACT) && airlock.arePowerSystemsOn()) + to_chat(user, "You need to be wielding [parent] to do that!") + return TRUE + + if(!airlock.density) + return TRUE + + // open unpowered + if(can_force_open_while_unpowered && !airlock.arePowerSystemsOn()) + INVOKE_ASYNC(src, PROC_REF(open_unpowered_door), airlock) + return TRUE + + // open powered + if(can_force_open_while_powered) + INVOKE_ASYNC(src, PROC_REF(open_powered_airlock), airlock, user) + return TRUE + +/// open airlock with delay +/datum/component/forces_doors_open/proc/open_powered_airlock(obj/machinery/door/airlock/airlock, mob/user) + if(!no_sound) + playsound(parent, open_sound, 100, 1) + + if(do_after_once(user, time_to_open, target = airlock, attempt_cancel_message = "You decide to stop prying [airlock] with [parent].")) + if(airlock.open(TRUE)) + return // successfully opened + + // opening failed + if(airlock.density) + to_chat(user, "Despite your attempts, [airlock] refuses to open.") + +/// open door without checks +/datum/component/forces_doors_open/proc/open_unpowered_door(obj/machinery/door/door) + door.open(TRUE) + +/// subtype for mantis blades +/datum/component/forces_doors_open/mantis/on_interact(datum/source, mob/user, atom/target) + if(check_intent(user)) + return + + if(try_to_open_firedoor(target)) + return ITEM_INTERACT_COMPLETE + + var/obj/item/melee/mantis_blade/secondblade = user.get_inactive_hand() + if(!istype(secondblade, /obj/item/melee/mantis_blade)) + to_chat(user, "You need a second [parent] to pry open doors!") + return ITEM_INTERACT_COMPLETE + + if(try_to_force_open_airlock(user, target)) + return ITEM_INTERACT_COMPLETE diff --git a/code/datums/components/two_handed.dm b/code/datums/components/two_handed.dm index df36672ac54..23e1856b65d 100644 --- a/code/datums/components/two_handed.dm +++ b/code/datums/components/two_handed.dm @@ -111,6 +111,7 @@ RegisterSignal(parent, COMSIG_ITEM_SHARPEN_ACT, PROC_REF(on_sharpen)) RegisterSignal(parent, COMSIG_CARBON_UPDATE_HANDCUFFED, PROC_REF(on_handcuff_user)) RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand)) + RegisterSignal(parent, COMSIG_TWOHANDED_WIELDED_TRY_WIELD_INTERACT, PROC_REF(check_unwielded)) // Remove all siginals registered to the parent item /datum/component/two_handed/UnregisterFromParent() @@ -307,6 +308,15 @@ // Clear any old refrence to an item that should be gone now offhand_item = null +/** + * Check if item is unwielded + * + * returns TRUE if unwielded + */ +/datum/component/two_handed/proc/check_unwielded() + SIGNAL_HANDLER // COMSIG_TWOHANDED_WIELDED_TRY_WIELD_INTERACT + return wielded ? FALSE : TRUE; + /** * on_attack triggers on attack with the parent item */ diff --git a/code/datums/uplink_items/uplink_general.dm b/code/datums/uplink_items/uplink_general.dm index ecbe37308bc..43de5d7988b 100644 --- a/code/datums/uplink_items/uplink_general.dm +++ b/code/datums/uplink_items/uplink_general.dm @@ -949,6 +949,15 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/autosurgeon/organ/syndicate/oneuse/scope_eyes cost = 10 +/datum/uplink_item/cyber_implants/mantis_kit + name = "'Naginata' Mantis Blades Kit" + desc = "A pair of devastating 'Naginata' concealable mantis blades, which retract into the arms of the user. \ + Their monomolecular edges will easily tear through flesh and armor alike, and can even pry open airlocks when used together. \ + When both blades are equipped, they enable the user to perform double attacks. \ + Can be used to parry incoming melee attacks." + reference = "MBK" + item = /obj/item/storage/box/syndie_kit/syndie_mantis + cost = 60 //////////////////////////////////////// // MARK: POINTLESS BADASSERY diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index df0d3bbd963..5fdc1775276 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1190,9 +1190,6 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) /obj/machinery/door/airlock/try_to_crowbar(mob/living/user, obj/item/I) if(operating) return - if(HAS_TRAIT(I, TRAIT_FORCES_OPEN_DOORS_ITEM)) - force_open_with_item(user, I) - return var/beingcrowbarred = FALSE if(I.tool_behaviour == TOOL_CROWBAR && I.tool_use_check(user, 0)) beingcrowbarred = TRUE @@ -1237,31 +1234,6 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) if(density && !open(1)) to_chat(user, "Despite your attempts, [src] refuses to open.") -/obj/machinery/door/airlock/proc/force_open_with_item(mob/living/user, obj/item/I) - /// Time it takes to open an airlock with an item with the TRAIT_FORCES_OPEN_DOORS_ITEM trait, 5 seconds for wielded items, 10 seconds for nonwielded items - var/time_to_open_airlock = 10 SECONDS - /// Can we open the airlock while unpowered? Wielded item's can't, but unwielded items can - var/can_force_open_while_unpowered = TRUE - if(I.GetComponent(/datum/component/two_handed)) - can_force_open_while_unpowered = FALSE - time_to_open_airlock = 5 SECONDS - if(!HAS_TRAIT(I, TRAIT_WIELDED)) - to_chat(user, "You need to be wielding [I] to do that!") - return - if(!density || prying_so_hard) - return - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, 1) //is it aliens or just the CE being a dick? - if(!arePowerSystemsOn() && can_force_open_while_unpowered) - open(TRUE) - return - prying_so_hard = TRUE //so you dont pry the door when you are already trying to pry it - var/result = do_after(user, time_to_open_airlock, target = src) - prying_so_hard = FALSE - if(result) - open(TRUE) - if(density && !open(TRUE)) - to_chat(user, "Despite your attempts, [src] refuses to open.") - /obj/machinery/door/airlock/open(forced=0) if(operating || welded || locked || emagged) return 0 diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index fd9fd32a64c..3ce720c1f8c 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -260,9 +260,6 @@ if(HAS_TRAIT(src, TRAIT_CMAGGED) && I.can_clean()) //If the cmagged door is being hit with cleaning supplies, don't open it, it's being cleaned! return - if(user.a_intent != INTENT_HARM && HAS_TRAIT(I, TRAIT_FORCES_OPEN_DOORS_ITEM)) - try_to_crowbar(user, I) - return TRUE else if(!(I.flags & NOBLUDGEON) && user.a_intent != INTENT_HARM) try_to_activate_door(user) return TRUE diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index ce5563fcb71..27366ab2e98 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -579,3 +579,12 @@ /obj/item/storage/box/syndie_kit/forgers_kit/populate_contents() new /obj/item/stamp/chameleon(src) new /obj/item/pen/chameleon(src) + +/obj/item/storage/box/syndie_kit/syndie_mantis + name = "\improper Mantis Blades kit" + desc = "A sleek box marked with a Cybersun logo. The label says it contains a pair of CX-12 'Naginata' mantis blades and accompanying autosurgeons." + +/obj/item/storage/box/syndie_kit/syndie_mantis/populate_contents() + new /obj/item/autosurgeon/organ/syndicate/oneuse/syndie_mantis(src) + new /obj/item/autosurgeon/organ/syndicate/oneuse/syndie_mantis/l(src) + diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 31f6bd289c6..72a5e86ec3e 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -28,7 +28,7 @@ /obj/item/fireaxe/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_FORCES_OPEN_DOORS_ITEM, ROUNDSTART_TRAIT) + AddComponent(/datum/component/forces_doors_open) AddComponent(/datum/component/parry, _stamina_constant = 2, _stamina_coefficient = 0.7, _parryable_attack_types = MELEE_ATTACK, _parry_cooldown = (10 / 3) SECONDS, _requires_two_hands = TRUE) // 2.3333 seconds of cooldown for 30% uptime AddComponent(/datum/component/two_handed, force_unwielded = force_unwielded, force_wielded = force_wielded, icon_wielded = "[base_icon_state]1") @@ -1070,8 +1070,8 @@ /obj/item/supermatter_halberd/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_FORCES_OPEN_DOORS_ITEM, ROUNDSTART_TRAIT) ADD_TRAIT(src, TRAIT_SUPERMATTER_IMMUNE, ROUNDSTART_TRAIT) //so it can't be dusted by the SM + AddComponent(/datum/component/forces_doors_open) AddComponent(/datum/component/parry, _stamina_constant = 2, _stamina_coefficient = 0.25, _parryable_attack_types = ALL_ATTACK_TYPES, _parry_cooldown = (4 / 3) SECONDS, _requires_two_hands = TRUE) // 0.3333 seconds of cooldown for 75% uptime AddComponent(/datum/component/two_handed, force_wielded = 40, force_unwielded = force, icon_wielded = "[base_icon_state]1") diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index c6fd006e472..b485eca0da4 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -149,7 +149,7 @@ /obj/item/melee/arm_blade/Initialize(mapload, silent, new_parent_action) . = ..() parent_action = new_parent_action - ADD_TRAIT(src, TRAIT_FORCES_OPEN_DOORS_ITEM, ROUNDSTART_TRAIT) + AddComponent(/datum/component/forces_doors_open, time_to_open = 10 SECONDS) /obj/item/melee/arm_blade/Destroy() if(parent_action) diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index a5e0ff230ee..24b5de832aa 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -399,3 +399,15 @@ reagents_list = list("fuel" = 30) build_path = /obj/item/chemical_canister/pyrotechnics category = list("Weapons") + +/datum/design/nt_mantis + name = "'Scylla' mantis blade implant" + desc = "A reverse-engineered mantis blade implant. While the monomolecular edge was lost, they remain deadly weapons." + id = "mantis_blade_nt" + req_tech = list("materials" = 7, "engineering" = 6, "combat" = 7, "syndicate" = 6) + build_type = PROTOLATHE | MECHFAB + construction_time = 6 SECONDS + materials = list(MAT_METAL = 10000, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_TITANIUM = 3000, MAT_DIAMOND = 4000) + build_path = /obj/item/organ/internal/cyberimp/arm/nt_mantis + category = list("Medical", "Weapons") + diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 03738d2aa37..d3a4834906d 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -836,3 +836,99 @@ if(emp_proof) return muscle_implant.emp_act(severity, owner) + +// Mantis blades + +/obj/item/melee/mantis_blade + name = "mantis blade" + desc = "A blade designed to be hidden just beneath the skin. The brain is directly linked to this bad boy, allowing it to spring into action. \ + When both blades are equipped, they enable the user to perform double attacks." + icon = 'icons/obj/weapons/melee.dmi' + lefthand_file = 'icons/mob/inhands/implants_lefthand.dmi' + righthand_file = 'icons/mob/inhands/implants_righthand.dmi' + hitsound = 'sound/weapons/bladeslice.ogg' + new_attack_chain = TRUE + var/double_attack = TRUE + var/double_attack_cd = 1.5 // seconds, so every second attack + sharp = TRUE + w_class = WEIGHT_CLASS_BULKY + attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "lacerated", "ripped", "diced", "cut") + +/obj/item/melee/mantis_blade/equipped(mob/user, slot, initial) + . = ..() + if(slot == ITEM_SLOT_LEFT_HAND) + transform = matrix(-1, 0, 0, 0, 1, 0) + else + transform = null + +// make double attack if blades in both hands and not on CD +/obj/item/melee/mantis_blade/attack(mob/living/target, mob/living/user, params) + var/obj/item/melee/mantis_blade/secondblade = user.get_inactive_hand() + if(!istype(secondblade, /obj/item/melee/mantis_blade) || !double_attack) + return ..() + + double_attack(target, user, params, secondblade) + return FINISH_ATTACK + +/obj/item/melee/mantis_blade/proc/double_attack(mob/living/target, mob/living/user, params, obj/item/melee/mantis_blade/secondblade) + // first attack + single_attack(target, user, params) + user.changeNext_move(CLICK_CD_MELEE) + // second attack + addtimer(CALLBACK(secondblade, PROC_REF(single_attack), target, user, params), 0.2 SECONDS) // not instant second attack + +/obj/item/melee/mantis_blade/proc/single_attack(mob/living/target, mob/living/user, params) + if(QDELETED(src)) + return + double_attack = FALSE + attack(target, user, params) + addtimer(VARSET_CALLBACK(src, double_attack, TRUE), double_attack_cd SECONDS) + +/obj/item/melee/mantis_blade/Initialize(mapload) + . = ..() + AddComponent(/datum/component/forces_doors_open/mantis) + +/obj/item/melee/mantis_blade/syndicate + name = "'Naginata' mantis blade" + icon_state = "syndie_mantis" + item_state = "syndie_mantis" + force = 20 + armour_penetration_percentage = 30 + +/obj/item/melee/mantis_blade/syndicate/Initialize(mapload) + . = ..() + AddComponent(/datum/component/parry, _stamina_constant = 2, _stamina_coefficient = 0.35, _parryable_attack_types = NON_PROJECTILE_ATTACKS, _parry_cooldown = (4 / 3) SECONDS) // 0.3333 seconds of cooldown for 75% uptime, non projectile + +/obj/item/melee/mantis_blade/nt + name = "'Scylla' mantis blade" + icon_state = "mantis" + item_state = "mantis" + force = 18 + +/obj/item/melee/mantis_blade/nt/Initialize(mapload) + . = ..() + AddComponent(/datum/component/parry, _stamina_constant = 2, _stamina_coefficient = 0.35, _parryable_attack_types = NON_PROJECTILE_ATTACKS, _parry_cooldown = (5 / 3) SECONDS) // 0.666667 seconds for 60% uptime, non projectile + +// Mantis blades implants +/obj/item/organ/internal/cyberimp/arm/syndie_mantis + name = "'Naginata' mantis blade implants" + desc = "A powerful and concealable mantis blade with a monomolecular edge, produced by Cybersun Industries. Cuts through flesh and armor alike with ease." + origin_tech = "materials=5;combat=5;biotech=5;syndicate=4" + contents = newlist(/obj/item/melee/mantis_blade/syndicate) + icon_state = "syndie_mantis" + icon = 'icons/obj/weapons/melee.dmi' + +/obj/item/organ/internal/cyberimp/arm/syndie_mantis/l + parent_organ = "l_arm" + +/obj/item/organ/internal/cyberimp/arm/nt_mantis + name = "'Scylla' mantis blade implant" + desc = "A reverse-engineered mantis blade design produced by Nanotrasen. While still quite deadly, the loss of the monomolecular blade has drastically reduced its armor penetration capability." + origin_tech = "materials=5;combat=5;biotech=5;syndicate=4" + contents = newlist(/obj/item/melee/mantis_blade/nt) + icon_state = "mantis" + icon = 'icons/obj/weapons/melee.dmi' + +/obj/item/organ/internal/cyberimp/arm/nt_mantis/l + parent_organ = "l_arm" + diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index 92ee6f5ebfc..3c64e68538e 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -152,4 +152,10 @@ /obj/item/autosurgeon/organ/syndicate/oneuse/hardened_heart starting_organ = /obj/item/organ/internal/heart/cybernetic/upgraded/hardened +/obj/item/autosurgeon/organ/syndicate/oneuse/syndie_mantis + starting_organ = /obj/item/organ/internal/cyberimp/arm/syndie_mantis + +/obj/item/autosurgeon/organ/syndicate/oneuse/syndie_mantis/l + starting_organ = /obj/item/organ/internal/cyberimp/arm/syndie_mantis/l + #undef INFINITE diff --git a/icons/mob/inhands/implants_lefthand.dmi b/icons/mob/inhands/implants_lefthand.dmi index 74340cf1dc6b05619ad8604cda7cdfc5c585e343..5206dc0cb98aa89df212268df5edf6a66245806d 100644 GIT binary patch literal 1399 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 diff --git a/icons/obj/weapons/melee.dmi b/icons/obj/weapons/melee.dmi index 8ee6b5cd9ec1da601049c8c010a174f0842013de..87dfa467f41d6f317d16c38c9621865baa39010f 100644 GIT binary patch literal 15968 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 Y)?}+?>eC+Jo#TLvgu>SfF$4eq3k(8%3jhEB literal 14062 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 u6M=;?tKZTjre{lh!h95a5wz3akm