From 7d9213e0c2a79fedef0eaf37f8eab2309c118e30 Mon Sep 17 00:00:00 2001 From: Qwertytoforty <52090703+Qwertytoforty@users.noreply.github.com> Date: Wed, 7 Sep 2022 08:36:29 -0400 Subject: [PATCH] Ports TG cursed katana to replace our cursed katana. (#18757) * Ports TG cursed katana to replace our cursed katana. * OH, IT'S JUST A SIMPLE NUMBERS GAME! * More changes / additions / removals * unneeded comments * more things * Apply suggestions from code review Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> * Update code/__HELPERS/lists.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> * Update code/modules/mining/lavaland/necropolis_chests.dm Co-authored-by: Sirryan2002 <80364400+Sirryan2002@users.noreply.github.com> * should have commited this too Co-authored-by: Sirryan2002 <80364400+Sirryan2002@users.noreply.github.com> * Update code/game/gamemodes/wizard/spellbook.dm Co-authored-by: Charlie <69320440+hal9000PR@users.noreply.github.com> * removes status, death signal, turf rename, return true * sprites my hated * Hal / steel requested changes * built in * quest 1/2 * Extra spacing / github instantly resolved status_effects and did not let me change it. Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Co-authored-by: Sirryan2002 <80364400+Sirryan2002@users.noreply.github.com> Co-authored-by: Charlie <69320440+hal9000PR@users.noreply.github.com> --- code/__DEFINES/status_effects.dm | 2 + code/__HELPERS/lists.dm | 14 + code/datums/status_effects/buffs.dm | 14 +- code/datums/status_effects/debuffs.dm | 9 +- code/game/gamemodes/wizard/spellbook.dm | 8 + code/game/objects/items/weapons/weaponry.dm | 2 - code/modules/mining/abandonedcrates.dm | 2 +- .../mining/lavaland/necropolis_chests.dm | 282 +++++++++++++++++- icons/mob/inhands/items_lefthand.dmi | Bin 210753 -> 210971 bytes icons/mob/inhands/items_righthand.dmi | Bin 208925 -> 209143 bytes icons/obj/lavaland/artefacts.dmi | Bin 27148 -> 28569 bytes 11 files changed, 324 insertions(+), 9 deletions(-) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 4c1ac003864..a270bd5a302 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -71,6 +71,8 @@ #define STATUS_EFFECT_SAWBLEED /datum/status_effect/saw_bleed //if the bleed builds up enough, takes a ton of damage +#define STATUS_EFFECT_BLOODLETTING /datum/status_effect/saw_bleed/bloodletting //nerfed version + #define STATUS_EFFECT_GROUNDPOUND /datum/status_effect/stacking/ground_pound //if hit twice, the third attack will fling the target #define STATUS_EFFECT_TELEPORTSICK /datum/status_effect/teleport_sickness //increasing debuffs as you rapidly teleport. diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 3eaf5356dd5..bff94ef67f0 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -900,3 +900,17 @@ proc/dd_sortedObjectList(list/incoming) . = list() for(var/thing in flat_list) .[thing] = TRUE + +///compare two lists, returns TRUE if they are the same +/proc/compare_list(list/l, list/d) + if(!islist(l) || !islist(d)) + return FALSE + + if(length(l) != length(d)) + return FALSE + + for(var/i in 1 to length(l)) + if(l[i] != d[i]) + return FALSE + + return TRUE diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 12628c3addb..214852e1799 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -55,7 +55,7 @@ /datum/status_effect/shadow_mend id = "shadow_mend" - duration = 30 + duration = 3 SECONDS alert_type = /obj/screen/alert/status_effect/shadow_mend /obj/screen/alert/status_effect/shadow_mend @@ -80,9 +80,11 @@ /datum/status_effect/void_price id = "void_price" - duration = 300 - tick_interval = 30 + duration = 30 SECONDS + tick_interval = 3 SECONDS + status_type = STATUS_EFFECT_REFRESH alert_type = /obj/screen/alert/status_effect/void_price + var/price = 3 //This is how much hp you lose per tick. Each time the buff is refreshed, it increased by 1. Healing too much in a short period of time will cause your swift demise /obj/screen/alert/status_effect/void_price name = "Void Price" @@ -91,8 +93,12 @@ /datum/status_effect/void_price/tick() playsound(owner, 'sound/weapons/bite.ogg', 50, 1) - owner.adjustBruteLoss(3) + owner.adjustBruteLoss(price) +/datum/status_effect/void_price/refresh() + price++ + return ..() + /datum/status_effect/blooddrunk id = "blooddrunk" duration = 10 diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 75e8fd87a1e..900c1a62eb4 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -77,6 +77,7 @@ var/delay_before_decay = 5 var/bleed_damage = 200 var/needs_to_bleed = FALSE + var/bleed_cap = 10 /datum/status_effect/saw_bleed/Destroy() if(owner) @@ -113,7 +114,7 @@ owner.underlays -= bleed_underlay bleed_amount += amount if(bleed_amount) - if(bleed_amount >= 10) + if(bleed_amount >= bleed_cap) needs_to_bleed = TRUE qdel(src) else @@ -137,6 +138,12 @@ else new /obj/effect/temp_visual/bleed(get_turf(owner)) +/datum/status_effect/saw_bleed/bloodletting + id = "bloodletting" + bleed_cap = 7 + bleed_damage = 25 //Seems weak (it is) but it also works on humans and bypasses armor SOOOO + bleed_amount = 6 + /datum/status_effect/stacking/ground_pound id = "ground_pound" tick_interval = 5 SECONDS diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 8f03ced04f9..eef025e45d0 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -496,6 +496,14 @@ log_name = "SI" category = "Weapons and Armors" +/datum/spellbook_entry/item/cursed_katana + name = "Cursed Katana" + desc = "A cursed artefact, used to seal a horrible being inside the katana, which has now reformed. Can be used to make multiple powerful combos, examine it to see them. Can not be dropped. On death, you will dust." + item_path = /obj/item/organ/internal/cyberimp/arm/katana + cost = 1 + log_name = "CK" + category = "Weapons and Armors" + /datum/spellbook_entry/item/spell_blade name = "Spellblade" desc = "A magical sword that can be enchanted by using it in hand to have a unique on-hit effect. Lighting: arcs electricity between nearby targets, stunning and damaging them. Fire: creates a massive ball of fire on hit, and makes the wielder immune to fire. Bluespace: allows you to strike people from a range, teleporting you to them. Forceshield: on hit, makes you stun immune for 3 seconds and reduces damage by half." diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index be234ebaa07..2f91305ed3f 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -88,8 +88,6 @@ resistance_flags = FIRE_PROOF needs_permit = TRUE -/obj/item/katana/cursed - slot_flags = null /obj/item/katana/suicide_act(mob/user) user.visible_message("[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku.") diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index ad83f635888..b88771835e5 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -143,7 +143,7 @@ new /obj/item/gun/projectile/automatic/pistol(src) new /obj/item/ammo_box/magazine/m10mm(src) if(98) - new /obj/item/katana/cursed(src) + new /obj/item/organ/internal/cyberimp/arm/katana(src) if(99) new /obj/item/storage/belt/champion(src) new /obj/item/clothing/mask/luchador(src) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 4dfb3f4eaf9..7647d23f33f 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -22,7 +22,7 @@ if(3) new /obj/item/soulstone/anybody(src) if(4) - new /obj/item/katana/cursed(src) + new /obj/item/organ/internal/cyberimp/arm/katana(src) if(5) new /obj/item/clothing/glasses/godeye(src) if(6) @@ -417,3 +417,283 @@ #undef RIGHT_HAND #undef LEFT_HAND + +/obj/item/organ/internal/cyberimp/arm/katana + name = "dark shard" + desc = "An eerie metal shard surrounded by dark energies." + icon = 'icons/obj/lavaland/artefacts.dmi' + icon_state = "cursed_katana_organ" + status = 0 + contents = newlist(/obj/item/cursed_katana) + + +/obj/item/organ/internal/cyberimp/arm/katana/attack_self(mob/living/carbon/user, modifiers) + . = ..() + to_chat(user,"The mass goes up your arm and inside it!") + playsound(user, 'sound/misc/demon_consume.ogg', 50, TRUE) + RegisterSignal(user, COMSIG_MOB_DEATH, .proc/user_death) + + user.drop_item() + insert(user) + +/obj/item/organ/internal/cyberimp/arm/katana/emp_act() //Organic, no emp stuff + return + +/obj/item/organ/internal/cyberimp/arm/katana/Retract() + var/obj/item/cursed_katana/katana = holder + if(!katana || katana.shattered) + return FALSE + if(!katana.drew_blood) + to_chat(owner, "[katana] lashes out at you in hunger!") + playsound(owner, 'sound/misc/demon_attack1.ogg', 50, TRUE) + if(parent_organ) + owner.apply_damage(25, BRUTE, parent_organ, TRUE) + katana.drew_blood = FALSE + katana.clean_blood() + return ..() + +/obj/item/organ/internal/cyberimp/arm/katana/Extend() + for(var/obj/item/cursed_katana/katana in contents) + if(katana.shattered) + to_chat(owner, " Your cursed katana has not reformed yet!") + return FALSE + return ..() + +/obj/item/organ/internal/cyberimp/arm/katana/proc/user_death(mob/user) + SIGNAL_HANDLER + INVOKE_ASYNC(src, .proc/user_death_async, user) + +/obj/item/organ/internal/cyberimp/arm/katana/proc/user_death_async(mob/user) + Retract() + user.visible_message("[user] begins to turn to dust, his soul being contained within [src]!", + "You feel your body begin to turn to dust, your soul being drawn into [src]!") + forceMove(get_turf(owner)) + remove(user) + addtimer(CALLBACK(user, /mob/.proc/dust), 1 SECONDS) + + +/obj/item/organ/internal/cyberimp/arm/katana/remove(mob/living/carbon/M, special) + UnregisterSignal(M, COMSIG_MOB_DEATH) + . = ..() + + +#define LEFT_SLASH "Harm" +#define RIGHT_SLASH "Disarm" +#define COMBO_STEPS "steps" +#define COMBO_PROC "proc" +#define ATTACK_STRIKE "Hilt Strike" +#define ATTACK_SLICE "Wide Slice" +#define ATTACK_DASH "Dash Attack" +#define ATTACK_CUT "Tendon Cut" +#define ATTACK_HEAL "Dark Heal" +#define ATTACK_SHATTER "Shatter" + + +/obj/item/cursed_katana + name = "cursed katana" + desc = "A katana used to seal something vile away long ago. \ + Even with the weapon destroyed, all the pieces containing the creature have coagulated back together to find a new host." + icon = 'icons/obj/lavaland/artefacts.dmi' + icon_state = "cursed_katana" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + force = 15 + armour_penetration_percentage = 40 + armour_penetration_flat = 10 + block_chance = 50 + sharp = TRUE + w_class = WEIGHT_CLASS_HUGE + attack_verb = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") + hitsound = 'sound/weapons/bladeslice.ogg' + var/shattered = FALSE + var/drew_blood = FALSE + var/timerid + var/list/input_list = list() + var/list/combo_strings = list() + var/static/list/combo_list = list( + ATTACK_STRIKE = list(COMBO_STEPS = list(LEFT_SLASH, LEFT_SLASH, RIGHT_SLASH), COMBO_PROC = .proc/strike), + ATTACK_SLICE = list(COMBO_STEPS = list(RIGHT_SLASH, LEFT_SLASH, LEFT_SLASH), COMBO_PROC = .proc/slice), + ATTACK_DASH = list(COMBO_STEPS = list(LEFT_SLASH, RIGHT_SLASH, RIGHT_SLASH), COMBO_PROC = .proc/dash), + ATTACK_CUT = list(COMBO_STEPS = list(RIGHT_SLASH, RIGHT_SLASH, LEFT_SLASH), COMBO_PROC = .proc/cut), + ATTACK_HEAL = list(COMBO_STEPS = list(LEFT_SLASH, RIGHT_SLASH, LEFT_SLASH, RIGHT_SLASH), COMBO_PROC = .proc/heal), + ATTACK_SHATTER = list(COMBO_STEPS = list(RIGHT_SLASH, LEFT_SLASH, RIGHT_SLASH, LEFT_SLASH), COMBO_PROC = .proc/shatter), + ) + +/obj/item/cursed_katana/Initialize(mapload) + . = ..() + for(var/combo in combo_list) + var/list/combo_specifics = combo_list[combo] + var/step_string = english_list(combo_specifics[COMBO_STEPS]) + combo_strings += ("[combo] - [step_string]") + +/obj/item/cursed_katana/examine(mob/user) + . = ..() + . += drew_blood ? ("It's sated... for now.") : ("It will not be sated until it tastes blood.") + . += combo_strings + +/obj/item/cursed_katana/dropped(mob/user) + . = ..() + reset_inputs(null, TRUE) + +/obj/item/cursed_katana/attack_self(mob/user) + . = ..() + reset_inputs(user, TRUE) + +/obj/item/cursed_katana/attack(mob/living/target, mob/user, click_parameters) + if(target.stat == DEAD || target == user) //No, you can not stab yourself to cloak / not take the penalty for not drawing blood + return ..() + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + to_chat(user, "You don't want to harm [target]!") + return TRUE + drew_blood = TRUE + if(user.a_intent == INTENT_DISARM) + input_list += RIGHT_SLASH + if(user.a_intent == INTENT_HARM) + input_list += LEFT_SLASH + if(ishostile(target)) + user.changeNext_move(CLICK_CD_RAPID) + if(length(input_list) > 4) + reset_inputs(user, TRUE) + if(check_input(target, user)) + reset_inputs(null, TRUE) + return TRUE + else + timerid = addtimer(CALLBACK(src, .proc/reset_inputs, user, FALSE), 5 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) + return ..() + +/obj/item/cursed_katana/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + if(attack_type == PROJECTILE_ATTACK) + final_block_chance = 0 //Don't bring a sword to a gunfight + return ..() + +/obj/item/cursed_katana/proc/check_input(mob/living/target, mob/user) + for(var/combo in combo_list) + var/list/combo_specifics = combo_list[combo] + if(compare_list(input_list,combo_specifics[COMBO_STEPS])) + INVOKE_ASYNC(src, combo_specifics[COMBO_PROC], target, user) + return TRUE + return FALSE + +/obj/item/cursed_katana/proc/reset_inputs(mob/user, deltimer) + input_list.Cut() + if(user) + to_chat(user, "You return to neutral stance.") + if(deltimer && timerid) + deltimer(timerid) + +/obj/item/cursed_katana/proc/strike(mob/living/target, mob/user) + user.visible_message("[user] strikes [target] with [src]'s hilt!", + "You hilt strike [target]!") + to_chat(target, "You've been struck by [user]!") + playsound(src, 'sound/weapons/genhit3.ogg', 50, TRUE) + RegisterSignal(target, COMSIG_MOVABLE_IMPACT, .proc/strike_throw_impact) + var/atom/throw_target = get_edge_target_turf(target, user.dir) + target.throw_at(throw_target, 5, 3, user, FALSE, callback = CALLBACK(/datum/.proc/UnregisterSignal, target, COMSIG_MOVABLE_IMPACT)) + target.apply_damage(17, BRUTE, BODY_ZONE_CHEST) + to_chat(target, "You've been struck by [user]!") + user.do_attack_animation(target, ATTACK_EFFECT_PUNCH) + +/obj/item/cursed_katana/proc/strike_throw_impact(mob/living/source, atom/hit_atom, datum/thrownthing/thrownthing) + SIGNAL_HANDLER + + UnregisterSignal(source, COMSIG_MOVABLE_IMPACT) + source.apply_damage(5, BRUTE, BODY_ZONE_CHEST) + if(ishostile(source)) + var/mob/living/simple_animal/hostile/target = source + target.ranged_cooldown += 2 SECONDS + else if(iscarbon(source)) + var/mob/living/carbon/target = source + target.AdjustConfused(8 SECONDS) + return NONE + +/obj/item/cursed_katana/proc/slice(mob/living/target, mob/user) + user.visible_message("[user] does a wide slice!", + "You do a wide slice!") + playsound(src, 'sound/weapons/bladeslice.ogg', 50, TRUE) + var/turf/user_turf = get_turf(user) + var/dir_to_target = get_dir(user_turf, get_turf(target)) + var/static/list/cursed_katana_slice_angles = list(0, -45, 45, -90, 90) //so that the animation animates towards the target clicked and not towards a side target + for(var/iteration in cursed_katana_slice_angles) + var/turf/T = get_step(user_turf, turn(dir_to_target, iteration)) + user.do_attack_animation(T, ATTACK_EFFECT_CLAW) + for(var/mob/living/additional_target in T) + if(user.Adjacent(additional_target) && additional_target.density) + additional_target.apply_damage(15, BRUTE, BODY_ZONE_CHEST, TRUE) + to_chat(additional_target, "You've been sliced by [user]!") + target.apply_damage(5, BRUTE, BODY_ZONE_CHEST, TRUE) + +/obj/item/cursed_katana/proc/heal(mob/living/target, mob/living/user) + user.visible_message("[user] lets [src] feast on [target]'s blood!", + "You let [src] feast on [target], and it heals you, at a price!") + target.apply_damage(15, BRUTE, BODY_ZONE_CHEST, TRUE) + user.apply_status_effect(STATUS_EFFECT_SHADOW_MEND) + +/obj/item/cursed_katana/proc/cut(mob/living/target, mob/user) + user.visible_message("[user] cuts [target]'s tendons!", + "You tendon cut [target]!") + to_chat(target, "Your tendons have been cut by [user]!") + target.apply_damage(15, BRUTE, BODY_ZONE_CHEST, TRUE) + user.do_attack_animation(target, ATTACK_EFFECT_DISARM) + playsound(src, 'sound/weapons/rapierhit.ogg', 50, TRUE) + var/datum/status_effect/saw_bleed/bloodletting/A = target.has_status_effect(STATUS_EFFECT_BLOODLETTING) + if(!A) + target.apply_status_effect(STATUS_EFFECT_BLOODLETTING) + else + A.add_bleed(6) + +/obj/item/cursed_katana/proc/dash(mob/living/target, mob/user) + var/turf/dash_target = get_turf(target) + var/turf/user_turf = get_turf(user) + if(!is_teleport_allowed(dash_target.z)) //No teleporting at CC + to_chat(user, ("You can not dash here!")) + return + user.visible_message("[user] dashes through [target]!", + "You dash through [target]!") + to_chat(target, ("[user] dashes through you!")) + playsound(src, 'sound/magic/blink.ogg', 50, TRUE) + target.apply_damage(17, BRUTE, BODY_ZONE_CHEST, TRUE) + for(var/distance in 0 to 8) + var/turf/current_dash_target = dash_target + current_dash_target = get_step(current_dash_target, user.dir) + if(!is_blocked_turf(current_dash_target, TRUE)) + dash_target = current_dash_target + else + break + for(var/mob/living/additional_target in dash_target) //Slash through every mob you cut through + additional_target.apply_damage(15, BRUTE, BODY_ZONE_CHEST, TRUE) + to_chat(additional_target, "You've been sliced by [user]!") + user_turf.Beam(dash_target, icon_state = "warp_beam", time = 0.3 SECONDS, maxdistance = INFINITY) + user.forceMove(dash_target) + +/obj/item/cursed_katana/proc/shatter(mob/living/target, mob/user) + user.visible_message("[user] shatters [src] over [target]!", + "You shatter [src] over [target]!") + to_chat(target, "[user] shatters [src] over you!") + target.apply_damage((ishostile(target) ? 75 : 35), BRUTE, BODY_ZONE_CHEST, TRUE) + target.KnockDown(5 SECONDS) + target.adjustStaminaLoss(60) //Takes 4 hits to do, breaks your weapon. Perfectly fine. + user.do_attack_animation(target, ATTACK_EFFECT_SMASH) + playsound(src, 'sound/effects/glassbr3.ogg', 100, TRUE) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + for(var/obj/item/organ/internal/cyberimp/arm/katana/O in H.internal_organs) + if(O.holder == src) + O.Retract() + shattered = TRUE + addtimer(CALLBACK(src, .proc/coagulate, user), 45 SECONDS) + +/obj/item/cursed_katana/proc/coagulate(mob/user) + to_chat(user, "[src] reforms!") + shattered = FALSE + playsound(src, 'sound/misc/demon_consume.ogg', 50, TRUE) + +#undef LEFT_SLASH +#undef RIGHT_SLASH +#undef COMBO_STEPS +#undef COMBO_PROC +#undef ATTACK_STRIKE +#undef ATTACK_SLICE +#undef ATTACK_DASH +#undef ATTACK_CUT +#undef ATTACK_HEAL +#undef ATTACK_SHATTER diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 196b266990cc95710adb8118fd1c279038518bb4..621b769c085f2798a7df18dcc44b40f2f5daa6de 100644 GIT binary patch delta 3031 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 W^=tF3^2gGsjs*$b$ delta 2811 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 delta 4782 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 diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi index 32eeb480a37ab0b1493782055b06ec987ce4bd9e..5244f3667a837a308797a1d1402584c76507f762 100644 GIT binary patch delta 7536 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