From 3a4b5d415eb6c31a14710c3bb99f9d09ea3a6fba Mon Sep 17 00:00:00 2001 From: forest2001 Date: Sat, 29 Jul 2023 20:11:05 +0100 Subject: [PATCH 01/23] scythe bleed --- code/modules/cm_preds/yaut_weapons.dm | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index fbbe6c183aaa..ab8d142e9dfa 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -216,11 +216,20 @@ xenomorph.interference = 15 if(prob(15)) - user.visible_message(SPAN_DANGER("An opening in combat presents itself!"),SPAN_DANGER("You manage to strike at your foe once more!")) - user.spin(5, 1) - ..() //Do it again! CRIT! This will be replaced by a bleed effect. + if(isxeno(target)) + user.visible_message(SPAN_DANGER("An opening in combat presents itself!"),SPAN_DANGER("You manage to strike at your foe once more!")) + user.spin(5, 1) + ..() + return - return + if(ishuman(target)) + user.visible_message(SPAN_DANGER("An opening in combat presents itself!"),SPAN_DANGER("You manage to carve a deep cut on your opponent!")) + user.spin(5, 1) + var/mob/living/carbon/human/human_target = target + var/obj/limb/target_limb = human_target.get_limb(check_zone(user.zone_selected)) + var/datum/wound/new_wound = target_limb.createwound(CUT, (force / 2)) + target_limb.add_bleeding(new_wound, FALSE, 10) + return /obj/item/weapon/yautja/scythe/alt name = "double war scythe" From 374968a0870164711442ae24251a805221335b3f Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 2 Aug 2023 00:58:39 +0100 Subject: [PATCH 02/23] unique_action suuuuuucks --- code/_onclick/hud/screen_objects.dm | 2 +- code/datums/keybinding/human_combat.dm | 2 +- code/game/objects/items/weapons/weapon.dm | 6 ++ code/modules/cm_preds/yaut_weapons.dm | 69 +++++++++++++++-------- code/modules/projectiles/gun.dm | 1 + code/modules/projectiles/gun_helpers.dm | 22 ++++---- 6 files changed, 65 insertions(+), 37 deletions(-) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 9643d0f652ae..982ef68b128a 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -283,7 +283,7 @@ return 1 if("Use unique action") - var/obj/item/weapon/gun/held_item = user.get_held_item() + var/obj/item/weapon/held_item = user.get_held_item() if(istype(held_item)) held_item.use_unique_action() return 1 diff --git a/code/datums/keybinding/human_combat.dm b/code/datums/keybinding/human_combat.dm index 003fba3b00bd..f8f639cdaf60 100644 --- a/code/datums/keybinding/human_combat.dm +++ b/code/datums/keybinding/human_combat.dm @@ -102,7 +102,7 @@ if(.) return var/mob/living/carbon/human/human = user.mob - var/obj/item/weapon/gun/held_item = human.get_held_item() + var/obj/item/weapon/held_item = human.get_held_item() held_item.use_unique_action() return TRUE diff --git a/code/game/objects/items/weapons/weapon.dm b/code/game/objects/items/weapons/weapon.dm index 3d53dfb86b73..34d04b9cff65 100644 --- a/code/game/objects/items/weapons/weapon.dm +++ b/code/game/objects/items/weapons/weapon.dm @@ -3,6 +3,12 @@ name = "weapon" icon = 'icons/obj/items/weapons/weapons.dmi' hitsound = "swing_hit" + var/has_unique_action = FALSE + +/obj/item/weapon/Initialize(mapload, ...) + . = ..() + if(!has_unique_action) + verbs -= /obj/item/weapon/verb/use_unique_action /obj/item/get_examine_text(mob/user) . = ..() diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index ab8d142e9dfa..25cb0087fede 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -2,6 +2,20 @@ #define FLAY_STAGE_STRIP 2 #define FLAY_STAGE_SKIN 3 +#define ABILITY_COST_DEFAULT 1 +#define ABILITY_COST_CHAIN 0 +#define ABILITY_COST_SCYTHE 5 +#define ABILITY_COST_SWORD 0 +#define ABILITY_COST_GLAIVE 0 + +#define ABILITY_CHARGE_SMALL 0.5 +#define ABILITY_CHARGE_NORMAL 1 +#define ABILITY_CHARGE_LARGE 2 + +#define ABILITY_MAX_SMALL 1 +#define ABILITY_MAX_DEFAULT 2 +#define ABILITY_MAX_LARGE 5 + /*######################################### ########### Weapon Reused Procs ########### #########################################*/ @@ -141,6 +155,12 @@ ) var/human_adapted = FALSE + ///The amount of charges towards use of special abilities. + var/ability_charge = 0 + var/ability_charge_max = ABILITY_MAX_DEFAULT + var/ability_charge_rate = ABILITY_CHARGE_NORMAL + var/ability_cost = ABILITY_COST_DEFAULT + /obj/item/weapon/yautja/chain name = "chainwhip" desc = "A segmented, lightweight whip made of durable, acid-resistant metal. Not very common among Yautja Hunters, but still a dangerous weapon capable of shredding prey." @@ -209,6 +229,10 @@ attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") unacidable = TRUE + ability_cost = ABILITY_COST_SCYTHE + ability_charge_max = ABILITY_COST_SCYTHE + ability_charge_rate = ABILITY_CHARGE_NORMAL + /obj/item/weapon/yautja/scythe/attack(mob/living/target as mob, mob/living/carbon/human/user as mob) ..() if((human_adapted || isyautja(user)) && isxeno(target)) @@ -242,6 +266,7 @@ name = "combi-stick" desc = "A compact yet deadly personal weapon. Can be concealed when folded. Functions well as a throwing weapon or defensive tool. A common sight in Yautja packs due to its versatility." icon_state = "combistick" + has_unique_action = TRUE flags_atom = FPRINT|CONDUCT flags_equip_slot = SLOT_BACK flags_item = TWOHANDED|ITEM_PREDATOR @@ -257,33 +282,29 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("speared", "stabbed", "impaled") - var/on = 1 - var/charged + var/on = TRUE var/force_wielded = MELEE_FORCE_TIER_6 var/force_unwielded = MELEE_FORCE_TIER_2 var/force_storage = MELEE_FORCE_TIER_1 + ability_cost = ABILITY_COST_DEFAULT + ability_charge_max = ABILITY_MAX_DEFAULT + ability_charge_rate = ABILITY_CHARGE_SMALL + /obj/item/weapon/yautja/combistick/try_to_throw(mob/living/user) - if(!charged) + if(ability_charge < ability_cost) to_chat(user, SPAN_WARNING("Your combistick refuses to leave your hand. You must charge it with blood from prey before throwing it.")) return FALSE - charged = FALSE - remove_filter("combistick_charge") + ability_charge -= ability_cost + if(ability_charge < ability_cost) + remove_filter("combistick_charge") unwield(user) //Otherwise stays wielded even when thrown return TRUE - /obj/item/weapon/yautja/combistick/IsShield() return on -/obj/item/weapon/yautja/combistick/verb/use_unique_action() - set category = "Weapons" - set name = "Unique Action" - set desc = "Activate or deactivate the combistick." - set src in usr - unique_action(usr) - /obj/item/weapon/yautja/combistick/attack_self(mob/user) ..() if(on) @@ -376,13 +397,15 @@ if(isanimal(target)) return - if(!charged) - to_chat(user, SPAN_DANGER("Your combistick's reservoir fills up with your opponent's blood! You may now throw it!")) - charged = TRUE - var/color = target.get_blood_color() - var/alpha = 70 - color += num2text(alpha, 2, 16) - add_filter("combistick_charge", 1, list("type" = "outline", "color" = color, "size" = 2)) + if((ability_charge < ability_charge_max)) + to_chat(user, SPAN_DANGER("Your combistick's reservoir fills up with your opponent's blood!")) + ability_charge += ability_charge_rate + if(ability_charge > ability_cost) + to_chat(user, SPAN_DANGER("You may now throw your combistick!")) + var/color = target.get_blood_color() + var/alpha = 70 + color += num2text(alpha, 2, 16) + add_filter("combistick_charge", 1, list("type" = "outline", "color" = color, "size" = 2)) /obj/item/weapon/yautja/combistick/attack_hand(mob/user) //Prevents marines from instantly picking it up via pickup macros. if(!human_adapted && !HAS_TRAIT(user, TRAIT_SUPER_STRONG)) @@ -747,6 +770,7 @@ var/last_regen flags_gun_features = GUN_UNUSUAL_DESIGN flags_item = ITEM_PREDATOR|TWOHANDED + has_unique_action = FALSE /obj/item/weapon/gun/launcher/spike/process() if(spikes < max_spikes && world.time > last_regen + 100 && prob(70)) @@ -762,7 +786,6 @@ verbs -= /obj/item/weapon/gun/verb/field_strip verbs -= /obj/item/weapon/gun/verb/use_toggle_burst verbs -= /obj/item/weapon/gun/verb/empty_mag - verbs -= /obj/item/weapon/gun/verb/use_unique_action /obj/item/weapon/gun/launcher/spike/set_gun_config_values() ..() @@ -846,6 +869,7 @@ var/last_regen = 0 flags_gun_features = GUN_UNUSUAL_DESIGN flags_item = ITEM_PREDATOR + has_unique_action = FALSE /obj/item/weapon/gun/energy/yautja/plasmarifle/Initialize(mapload, spawn_empty) . = ..() @@ -856,7 +880,6 @@ verbs -= /obj/item/weapon/gun/verb/field_strip verbs -= /obj/item/weapon/gun/verb/use_toggle_burst verbs -= /obj/item/weapon/gun/verb/empty_mag - verbs -= /obj/item/weapon/gun/verb/use_unique_action /obj/item/weapon/gun/energy/yautja/plasmarifle/process() if(charge_time < 100) @@ -954,7 +977,6 @@ verbs -= /obj/item/weapon/gun/verb/empty_mag - /obj/item/weapon/gun/energy/yautja/plasmapistol/Destroy() . = ..() STOP_PROCESSING(SSobj, src) @@ -967,7 +989,6 @@ if(ismob(loc)) to_chat(loc, SPAN_NOTICE("[src] hums as it achieves maximum charge.")) - /obj/item/weapon/gun/energy/yautja/plasmapistol/set_gun_config_values() ..() set_fire_delay(FIRE_DELAY_TIER_7) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 54e066e05544..c45f8f620243 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -7,6 +7,7 @@ icon = 'icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi' icon_state = "" item_state = "gun" + has_unique_action = TRUE pickup_sound = "gunequip" drop_sound = "gunrustle" pickupvol = 7 diff --git a/code/modules/projectiles/gun_helpers.dm b/code/modules/projectiles/gun_helpers.dm index a60773c88be7..53c641718f6f 100644 --- a/code/modules/projectiles/gun_helpers.dm +++ b/code/modules/projectiles/gun_helpers.dm @@ -768,19 +768,19 @@ DEFINES in setup.dm, referenced here. unload(user, FALSE, drop_to_ground) //We want to drop the mag on the ground. -/obj/item/weapon/gun/verb/use_unique_action() +/obj/item/weapon/verb/use_unique_action() set category = "Weapons" set name = "Unique Action" - set desc = "Use anything unique your firearm is capable of. Includes pumping a shotgun or spinning a revolver. If you have an active attachment, this will activate on the attachment instead." - set src = usr.contents - - var/obj/item/weapon/gun/active_firearm = get_active_firearm(usr) - if(!active_firearm) - return - if(active_firearm.active_attachable) - src = active_firearm.active_attachable - else - src = active_firearm + set desc = "Use anything unique your weapon is capable of. Includes pumping a shotgun or spinning a revolver. If you have an active gun attachment, this will activate on the attachment instead." + set src in usr + + var/obj/item/weapon/gun/active_firearm = src + if(istype(active_firearm)) + active_firearm.get_active_firearm(usr) + if(active_firearm.active_attachable) + src = active_firearm.active_attachable + else + src = active_firearm unique_action(usr) From c19b842a698aa8b28aa6931014465bf105debbda Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 2 Aug 2023 16:10:24 +0100 Subject: [PATCH 03/23] scythe ability --- code/modules/cm_preds/yaut_weapons.dm | 127 +++++++++++------- code/modules/projectiles/gun_helpers.dm | 12 +- .../humans/onmob/hunter/items_lefthand.dmi | Bin 7540 -> 7695 bytes .../humans/onmob/hunter/items_righthand.dmi | Bin 7432 -> 7573 bytes 4 files changed, 87 insertions(+), 52 deletions(-) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 25cb0087fede..9b25752a048d 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -154,12 +154,44 @@ WEAR_R_HAND = 'icons/mob/humans/onmob/hunter/items_righthand.dmi' ) var/human_adapted = FALSE + ///The amount this weapon interrupts hivemind link on Xenomorphs. + var/xeno_interfere_amount = 30 ///The amount of charges towards use of special abilities. var/ability_charge = 0 var/ability_charge_max = ABILITY_MAX_DEFAULT var/ability_charge_rate = ABILITY_CHARGE_NORMAL var/ability_cost = ABILITY_COST_DEFAULT + ///Whether the ability is ready to trigger + var/ability_primed = FALSE + + +/obj/item/weapon/yautja/dropped() + if(ability_primed) + ability_primed = FALSE + ..() + +/obj/item/weapon/yautja/attack(mob/living/target, mob/living/carbon/human/user) + . = ..() + if(!.) + return + if((human_adapted || isspeciesyautja(user)) && isxeno(target)) + var/mob/living/carbon/xenomorph/xenomorph = target + xenomorph.interference = xeno_interfere_amount + + if(target == user || target.stat == DEAD || isanimal(target)) + to_chat(user, SPAN_DANGER("You think you're smart?")) //very funny + return + + if(ability_charge < ability_charge_max) + ability_charge += ability_charge_rate + +/obj/item/weapon/yautja/unique_action(mob/user) + if(user.get_active_hand() != src) + return FALSE + if(ability_charge < ability_cost) + to_chat(user, SPAN_WARNING("The blood reservoir is not full enough to do this!")) + return FALSE /obj/item/weapon/yautja/chain name = "chainwhip" @@ -183,9 +215,6 @@ /obj/item/weapon/yautja/chain/attack(mob/target, mob/living/user) . = ..() - if((human_adapted || isyautja(user)) && isxeno(target)) - var/mob/living/carbon/xenomorph/xenomorph = target - xenomorph.interference = 30 /obj/item/weapon/yautja/sword name = "clan sword" @@ -205,12 +234,6 @@ attack_speed = 1 SECONDS unacidable = TRUE -/obj/item/weapon/yautja/sword/attack(mob/target, mob/living/user) - . = ..() - if((human_adapted || isyautja(user)) && isxeno(target)) - var/mob/living/carbon/xenomorph/xenomorph = target - xenomorph.interference = 30 - /obj/item/weapon/yautja/scythe name = "dual war scythe" desc = "A huge, incredibly sharp dual blade used for hunting dangerous prey. This weapon is commonly carried by Yautja who wish to disable and slice apart their foes." @@ -228,6 +251,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") unacidable = TRUE + has_unique_action = TRUE ability_cost = ABILITY_COST_SCYTHE ability_charge_max = ABILITY_COST_SCYTHE @@ -235,25 +259,53 @@ /obj/item/weapon/yautja/scythe/attack(mob/living/target as mob, mob/living/carbon/human/user as mob) ..() - if((human_adapted || isyautja(user)) && isxeno(target)) - var/mob/living/carbon/xenomorph/xenomorph = target - xenomorph.interference = 15 + if(ability_charge >= ability_cost) + var/color = BLOOD_COLOR_HUMAN + var/alpha = 70 + color += num2text(alpha, 2, 16) + add_filter("scythe_ready", 1, list("type" = "outline", "color" = color, "size" = 2)) - if(prob(15)) - if(isxeno(target)) - user.visible_message(SPAN_DANGER("An opening in combat presents itself!"),SPAN_DANGER("You manage to strike at your foe once more!")) - user.spin(5, 1) - ..() - return +/obj/item/weapon/yautja/scythe/attack_self(mob/user) + ..() + ability_primed = !ability_primed + var/message = "You tighten your grip on [src], preparing to whirl it in a spin." + if(!ability_primed) + message = "You relax your grip on [src]." + to_chat(user, SPAN_WARNING(message)) - if(ishuman(target)) - user.visible_message(SPAN_DANGER("An opening in combat presents itself!"),SPAN_DANGER("You manage to carve a deep cut on your opponent!")) - user.spin(5, 1) - var/mob/living/carbon/human/human_target = target - var/obj/limb/target_limb = human_target.get_limb(check_zone(user.zone_selected)) - var/datum/wound/new_wound = target_limb.createwound(CUT, (force / 2)) - target_limb.add_bleeding(new_wound, FALSE, 10) - return +/obj/item/weapon/yautja/scythe/unique_action(mob/user) + . = ..() + if(!.) + return + + if(!ability_primed) + to_chat(user, SPAN_WARNING("You need a stronger grip for this!")) + return FALSE + user.spin_circle(2) + for(var/mob/living/carbon/target in orange(1, user)) + if(!isxeno_human(target) || isyautja(target)) + continue + + if(target.stat == DEAD) + continue + + if(!check_clear_path_to_target(user, target)) + continue + + user.visible_message(SPAN_HIGHDANGER("[user] slices open the guts of [target]!"), SPAN_HIGHDANGER("You slice open the guts of [target]!")) + target.spawn_gibs() + playsound(get_turf(target), 'sound/effects/gibbed.ogg', 30, 1) + target.apply_effect(get_xeno_stun_duration(target, 1), WEAKEN) + target.apply_armoured_damage(get_xeno_damage_slash(target, (force * 1.5)), ARMOR_MELEE, BRUTE, "chest", 40) + + user.attack_log += text("\[[time_stamp()]\] [key_name(user)] sliced [key_name(target)] with their whirling scythe.") + target.attack_log += text("\[[time_stamp()]\] [key_name(target)] was sliced by [key_name(user)] whirling their scythe.") + log_attack("[key_name(target)] was sliced by [key_name(user)] whirling their scythe.") + + ability_charge -= ability_cost + ability_primed = FALSE + remove_filter("scythe_ready") + return TRUE /obj/item/weapon/yautja/scythe/alt name = "double war scythe" @@ -387,20 +439,11 @@ . = ..() if(!.) return - if((human_adapted || isspeciesyautja(user)) && isxeno(target)) - var/mob/living/carbon/xenomorph/xenomorph = target - xenomorph.interference = 30 - - if(target == user || target.stat == DEAD) - to_chat(user, SPAN_DANGER("You think you're smart?")) //very funny - return - if(isanimal(target)) - return if((ability_charge < ability_charge_max)) to_chat(user, SPAN_DANGER("Your combistick's reservoir fills up with your opponent's blood!")) ability_charge += ability_charge_rate - if(ability_charge > ability_cost) + if(ability_charge >= ability_cost) to_chat(user, SPAN_DANGER("You may now throw your combistick!")) var/color = target.get_blood_color() var/alpha = 70 @@ -716,14 +759,6 @@ attack_verb = list("sliced", "slashed", "carved", "diced", "gored") attack_speed = 14 //Default is 7. -/obj/item/weapon/twohanded/yautja/glaive/attack(mob/living/target, mob/living/carbon/human/user) - . = ..() - if(!.) - return - if((human_adapted || isyautja(user)) && isxeno(target)) - var/mob/living/carbon/xenomorph/xenomorph = target - xenomorph.interference = 30 - /obj/item/weapon/twohanded/yautja/glaive/alt icon_state = "glaive_alt" item_state = "glaive_alt" @@ -1042,7 +1077,7 @@ log_debug("Plasma Pistol refunded shot.") return TRUE -/obj/item/weapon/gun/energy/yautja/plasmapistol/use_unique_action() +/obj/item/weapon/gun/energy/yautja/plasmapistol/unique_action() switch(mode) if(FIRE_MODE_STANDARD) mode = FIRE_MODE_INCENDIARY @@ -1165,7 +1200,7 @@ to_chat(user, SPAN_NOTICE("[src] will now fire [strength].")) ammo = GLOB.ammo_list[/datum/ammo/energy/yautja/caster/bolt] -/obj/item/weapon/gun/energy/yautja/plasma_caster/use_unique_action() +/obj/item/weapon/gun/energy/yautja/plasma_caster/unique_action() switch(mode) if("stun") mode = "lethal" diff --git a/code/modules/projectiles/gun_helpers.dm b/code/modules/projectiles/gun_helpers.dm index 53c641718f6f..aa86b5b446fb 100644 --- a/code/modules/projectiles/gun_helpers.dm +++ b/code/modules/projectiles/gun_helpers.dm @@ -774,13 +774,13 @@ DEFINES in setup.dm, referenced here. set desc = "Use anything unique your weapon is capable of. Includes pumping a shotgun or spinning a revolver. If you have an active gun attachment, this will activate on the attachment instead." set src in usr - var/obj/item/weapon/gun/active_firearm = src - if(istype(active_firearm)) - active_firearm.get_active_firearm(usr) - if(active_firearm.active_attachable) - src = active_firearm.active_attachable + var/obj/item/weapon/current_weapon = src + if(isgun(current_weapon)) + var/obj/item/weapon/gun/firearm = current_weapon + if(firearm.active_attachable) + src = firearm.active_attachable else - src = active_firearm + src = firearm unique_action(usr) diff --git a/icons/mob/humans/onmob/hunter/items_lefthand.dmi b/icons/mob/humans/onmob/hunter/items_lefthand.dmi index f3379c469113fe940620032a822c0f09b630d57e..44d00a9634cf47e8da2b03fdfcc212b9a203f700 100644 GIT binary patch delta 7529 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 diff --git a/icons/mob/humans/onmob/hunter/items_righthand.dmi b/icons/mob/humans/onmob/hunter/items_righthand.dmi index fbca4cfed5bb0fe4046d3da4699ec00338161e1a..c26da80d04967ac0c4bdb3c7fa5472dbc43b1f61 100644 GIT binary patch delta 7413 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� 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 From 5b304676fb04e6b0aab7549113f0b802b5194b36 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 2 Aug 2023 16:17:17 +0100 Subject: [PATCH 04/23] combi block probability --- code/modules/mob/living/carbon/human/human_defense.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index a8734afd7301..9b329e334214 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -95,7 +95,7 @@ Contains most of the procs that are called when a mob is attacked by something /mob/living/carbon/human/proc/check_shields(damage = 0, attack_text = "the attack", combistick=0) if(l_hand && istype(l_hand, /obj/item/weapon))//Current base is the prob(50-d/3) - if(combistick && istype(l_hand,/obj/item/weapon/yautja/combistick) && prob(66)) + if(combistick && istype(l_hand,/obj/item/weapon/yautja/combistick) && prob(33)) var/obj/item/weapon/yautja/combistick/C = l_hand if(C.on) return TRUE @@ -120,7 +120,7 @@ Contains most of the procs that are called when a mob is attacked by something return TRUE if(r_hand && istype(r_hand, /obj/item/weapon)) - if(combistick && istype(r_hand,/obj/item/weapon/yautja/combistick) && prob(66)) + if(combistick && istype(r_hand,/obj/item/weapon/yautja/combistick) && prob(33)) var/obj/item/weapon/yautja/combistick/C = r_hand if(C.on) return TRUE From ea2022cf440de87305098fc53b44ec2257feb071 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 2 Aug 2023 19:59:27 +0100 Subject: [PATCH 05/23] icon removal --- .../humans/onmob/hunter/items_lefthand.dmi | Bin 7695 -> 7540 bytes .../humans/onmob/hunter/items_righthand.dmi | Bin 7573 -> 7432 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/humans/onmob/hunter/items_lefthand.dmi b/icons/mob/humans/onmob/hunter/items_lefthand.dmi index 44d00a9634cf47e8da2b03fdfcc212b9a203f700..f3379c469113fe940620032a822c0f09b630d57e 100644 GIT binary patch delta 7354 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 delta 7529 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 delta 7413 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� zN(mLxi#3w}%Y2DJ9I+6i24ca?y z4%g)oHF!@teJ*QjiTHTrv+d1z$@dVD?Y&pbx1}WWe@FOfCND zO1j601OfD~^83wsHlO?QpYBNvpeYx$3IbnO)Y2YIP!|h zyztSL1)ai0JsOmr-Uj5ClS}!$5k5m>F7QCWU<8|q$&1aa*>oSTi`m-JCGy^iG^85f z-huJjcS^P0YbiyS!sVMiyU=Nrwnw5VGz%SH0_c4~j@kgf0wS({_&PwG{L-q&W!t@2 z!3kb)C1t!u5;>xR#HFOw_()|H*5%n+Y1GEg&mzy)vl$&i`ebHP!TvW8P$5j|5w947O^nKhX-`(a_rl? zGYF}>I_jiaXcHKij z<{6#eaff%Lpq2OB?u<*lVcwyBPSVf$p)c%WTjJ@6ZNKQZYp4}VL-8t4C=zrY{}8?@ z9v-oBT@LwqAntFX0UI*%^pz=NM{J)FHQ=?N|6yQQ+XUKeYZu53)>imiY4A*c3C9j(KAEK%PpDgTe zyWH6!#%ii$6Mr-Y`g%s8{x_h5fSGgS)KqQqDtI*R^$jJEwWZpLGJVwP{M|Y>oyFYD zDgIo81-$fpige!h6LR8i>pQnvhOb#qNONdgVAE~!_4R%OWh7>LYUUHtfZ`gJ8pRRP zDp9Yjy(}elgenT^`|pK3{!lxgw>=?+1NHE`)|&StM}We%Y{Fl0zX+)JNzDm`&taFl z)M3Ct(fummZpi!|Ke>6-P7V6a1(Opm{^Bge4tcl5jUgOt!>CC*@D$ZojO6;nncLqr z^m$T{zU1PTf|DtS03Q#oYsX*-{m1p z-&4J#03Dso>6g@yCh}2b%#ApnNoOGUhtyJNwMGuW|EJ~=5GB0rly>MP-e*UE|1gdP zcY4$vPw&Tg`I%3x?xee2h$hhXW zs|-YnzAOtpTQ1+;dpQ52;j8yP(Q#_=$1Wty6@7A2rdcM_qHo6O!br!t(ieTQ0kt#O zv65uhi#4}Ak&u`Vow|^%q&$l7@m7*~@p@&uO$@nDOEToRO^7$%?~P`g<4SH6`Mce$ zI!ka|+rl7LQPdpBn)Y|7SYvje8^t0N3#MOM&7V%(P!-S!j(>T-sQHYy+zG^Wv%Vc# oXWAkli?LJ@{`Z;rNMv9n(QLQJwyhiG%D=UeoVsj Date: Wed, 2 Aug 2023 20:28:52 +0100 Subject: [PATCH 06/23] fixed --- code/modules/cm_preds/yaut_weapons.dm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 9b25752a048d..ac2be5bfd600 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -274,10 +274,7 @@ to_chat(user, SPAN_WARNING(message)) /obj/item/weapon/yautja/scythe/unique_action(mob/user) - . = ..() - if(!.) - return - + ..() if(!ability_primed) to_chat(user, SPAN_WARNING("You need a stronger grip for this!")) return FALSE From 68003deca8d8d91e5ee6b7698ef92d476f15c050 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 2 Aug 2023 22:21:59 +0100 Subject: [PATCH 07/23] check fix --- code/modules/cm_preds/yaut_weapons.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index ac2be5bfd600..d5f009912b6a 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -192,6 +192,7 @@ if(ability_charge < ability_cost) to_chat(user, SPAN_WARNING("The blood reservoir is not full enough to do this!")) return FALSE + return TRUE /obj/item/weapon/yautja/chain name = "chainwhip" @@ -274,7 +275,9 @@ to_chat(user, SPAN_WARNING(message)) /obj/item/weapon/yautja/scythe/unique_action(mob/user) - ..() + . = ..() + if(!.) + return if(!ability_primed) to_chat(user, SPAN_WARNING("You need a stronger grip for this!")) return FALSE @@ -300,7 +303,6 @@ log_attack("[key_name(target)] was sliced by [key_name(user)] whirling their scythe.") ability_charge -= ability_cost - ability_primed = FALSE remove_filter("scythe_ready") return TRUE From 6cb0eb85e90f88fcedd6925c220e34516e1d13ef Mon Sep 17 00:00:00 2001 From: John Doe Date: Wed, 2 Aug 2023 14:48:58 -0700 Subject: [PATCH 08/23] mirroring fix --- code/datums/keybinding/human_combat.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/keybinding/human_combat.dm b/code/datums/keybinding/human_combat.dm index f8f639cdaf60..70d78437ae03 100644 --- a/code/datums/keybinding/human_combat.dm +++ b/code/datums/keybinding/human_combat.dm @@ -7,7 +7,7 @@ if(!.) return var/mob/user_mob = user.mob - return isgun(user_mob.get_held_item()) + return isweapon(user_mob.get_held_item()) /datum/keybinding/human/combat/field_strip_weapon hotkey_keys = list("Unbound") From 824ab485580f7a78809bd102f27442df15ba0480 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Thu, 10 Aug 2023 16:34:43 +0100 Subject: [PATCH 09/23] fixes unique action popup --- code/modules/projectiles/gun_helpers.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/projectiles/gun_helpers.dm b/code/modules/projectiles/gun_helpers.dm index aa86b5b446fb..45b0be408ced 100644 --- a/code/modules/projectiles/gun_helpers.dm +++ b/code/modules/projectiles/gun_helpers.dm @@ -772,9 +772,11 @@ DEFINES in setup.dm, referenced here. set category = "Weapons" set name = "Unique Action" set desc = "Use anything unique your weapon is capable of. Includes pumping a shotgun or spinning a revolver. If you have an active gun attachment, this will activate on the attachment instead." - set src in usr - var/obj/item/weapon/current_weapon = src + var/obj/item/weapon/current_weapon = usr.get_held_item() + if(!current_weapon) + to_chat(usr, SPAN_WARNING("Your weapon must be in your hand to do that.")) + return if(isgun(current_weapon)) var/obj/item/weapon/gun/firearm = current_weapon if(firearm.active_attachable) From 051a21c7c53852579c60b0956af8c523a8a53405 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Thu, 10 Aug 2023 19:13:00 +0100 Subject: [PATCH 10/23] fixes mask chance going over intended max --- code/modules/mob/living/carbon/xenomorph/attack_alien.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm index 8e64afa3f733..ad428915b200 100644 --- a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm +++ b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm @@ -107,7 +107,8 @@ knock_chance += 2 * M.frenzy_aura if(M.caste && M.caste.is_intelligent) knock_chance += 2 - knock_chance += min(round(damage * 0.25), 10) //Maximum of 15% chance. + knock_chance += min(round(damage * 0.25), 10) + knock_chance = min(knock_chance, 15)//Maximum of 15% chance. if(prob(knock_chance)) playsound(loc, "alien_claw_metal", 25, 1) M.visible_message(SPAN_DANGER("The [M] smashes off [src]'s [wear_mask.name]!"), \ From d3d813cd831ae42fb0f596681daf5a883e47276a Mon Sep 17 00:00:00 2001 From: forest2001 Date: Tue, 12 Sep 2023 00:35:46 +0100 Subject: [PATCH 11/23] changes --- code/modules/cm_preds/yaut_weapons.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index f57e04fcc074..9c2ad8bd6ae8 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -333,6 +333,10 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("speared", "stabbed", "impaled") + ability_cost = ABILITY_COST_DEFAULT + ability_charge_max = ABILITY_MAX_DEFAULT + ability_charge_rate = ABILITY_CHARGE_SMALL + var/on = TRUE var/force_wielded = MELEE_FORCE_TIER_6 @@ -341,10 +345,6 @@ /// Ref to the tether effect when thrown var/datum/effects/tethering/chain - ability_cost = ABILITY_COST_DEFAULT - ability_charge_max = ABILITY_MAX_DEFAULT - ability_charge_rate = ABILITY_CHARGE_SMALL - /obj/item/weapon/yautja/combistick/Destroy() cleanup_chain() return ..() From cf061b2ce81dbf3bb2bc505249049c30f5acbe78 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 13 Sep 2023 19:53:59 +0100 Subject: [PATCH 12/23] EXPERIMENTAL: DAMAGE CHANGES --- code/modules/cm_preds/smartdisc.dm | 4 ++-- code/modules/cm_preds/yaut_weapons.dm | 17 ++++++++--------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/code/modules/cm_preds/smartdisc.dm b/code/modules/cm_preds/smartdisc.dm index f0262f5f140a..7925e7193269 100644 --- a/code/modules/cm_preds/smartdisc.dm +++ b/code/modules/cm_preds/smartdisc.dm @@ -17,8 +17,8 @@ unacidable = TRUE embeddable = FALSE - force = 15 - throwforce = 25 + force = MELEE_FORCE_WEAK + throwforce = MELEE_FORCE_NORMAL /obj/item/explosive/grenade/spawnergrenade/smartdisc/launch_towards(datum/launch_metadata/LM) ..() diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 9c2ad8bd6ae8..56e165ac4931 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -141,7 +141,8 @@ item_state = "scim" attack_speed = 5 attack_verb = list("sliced", "slashed", "jabbed", "torn", "gored") - force = MELEE_FORCE_TIER_5 + force = MELEE_FORCE_TIER_6 + has_speed_bonus = FALSE /*######################################### ########### One Handed Weapons ############ @@ -205,8 +206,8 @@ embeddable = FALSE w_class = SIZE_MEDIUM unacidable = TRUE - force = MELEE_FORCE_TIER_6 - throwforce = MELEE_FORCE_TIER_5 + force = MELEE_FORCE_TIER_7 + throwforce = MELEE_FORCE_TIER_4 sharp = IS_SHARP_ITEM_SIMPLE edge = TRUE attack_verb = list("whipped", "slashed","sliced","diced","shredded") @@ -243,7 +244,7 @@ flags_atom = FPRINT|CONDUCT flags_item = ITEM_PREDATOR flags_equip_slot = SLOT_WAIST - force = MELEE_FORCE_TIER_6 + force = MELEE_FORCE_TIER_7 throwforce = MELEE_FORCE_TIER_5 sharp = IS_SHARP_ITEM_SIMPLE edge = TRUE @@ -327,7 +328,7 @@ throw_range = 4 unacidable = TRUE force = MELEE_FORCE_TIER_6 - throwforce = MELEE_FORCE_TIER_6 + throwforce = MELEE_FORCE_TIER_7 sharp = IS_SHARP_ITEM_SIMPLE edge = TRUE hitsound = 'sound/weapons/bladeslice.ogg' @@ -472,7 +473,6 @@ flags_item |= TWOHANDED w_class = SIZE_LARGE force = force_unwielded - throwforce = MELEE_FORCE_TIER_6 attack_verb = list("speared", "stabbed", "impaled") if(blood_overlay && blood_color) @@ -489,7 +489,6 @@ flags_item &= ~TWOHANDED w_class = SIZE_TINY force = force_storage - throwforce = MELEE_FORCE_TIER_6 attack_verb = list("thwacked", "smacked") overlays.Cut() on = FALSE @@ -765,7 +764,7 @@ icon_state = "spearhunter" item_state = "spearhunter" flags_item = NOSHIELD|TWOHANDED - force = MELEE_FORCE_TIER_3 + force = MELEE_FORCE_TIER_4 force_wielded = MELEE_FORCE_TIER_7 sharp = IS_SHARP_ITEM_SIMPLE attack_verb = list("attacked", "stabbed", "jabbed", "torn", "gored") @@ -820,7 +819,7 @@ icon_state = "glaive" item_state = "glaive" force = MELEE_FORCE_TIER_3 - force_wielded = MELEE_FORCE_TIER_9 + force_wielded = MELEE_FORCE_TIER_10 throwforce = MELEE_FORCE_TIER_3 embeddable = FALSE //so predators don't lose their glaive when thrown. sharp = IS_SHARP_ITEM_BIG From 7f045423c88c8f414918c721886bc5f063a301ae Mon Sep 17 00:00:00 2001 From: forest2001 Date: Mon, 12 Feb 2024 20:27:46 +0000 Subject: [PATCH 13/23] filter check --- code/modules/cm_preds/yaut_weapons.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 818153e10192..caeac5c4f24d 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -304,7 +304,8 @@ log_attack("[key_name(target)] was sliced by [key_name(user)] whirling their scythe.") ability_charge -= ability_cost - remove_filter("scythe_ready") + if(ability_charge < ability_cost) + remove_filter("scythe_ready") return TRUE /obj/item/weapon/yautja/scythe/alt From a104f394fa960ad44fe49abbffb6b3b2f39168b0 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 14 Feb 2024 21:23:16 +0000 Subject: [PATCH 14/23] Scythe tweak --- code/modules/cm_preds/yaut_weapons.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index caeac5c4f24d..4b8663d42419 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -296,8 +296,8 @@ user.visible_message(SPAN_HIGHDANGER("[user] slices open the guts of [target]!"), SPAN_HIGHDANGER("You slice open the guts of [target]!")) target.spawn_gibs() playsound(get_turf(target), 'sound/effects/gibbed.ogg', 30, 1) - target.apply_effect(get_xeno_stun_duration(target, 1), WEAKEN) - target.apply_armoured_damage(get_xeno_damage_slash(target, (force * 1.5)), ARMOR_MELEE, BRUTE, "chest", 40) + target.apply_effect(get_xeno_stun_duration(target, 3), SLOW) + target.apply_armoured_damage(get_xeno_damage_slash(target, (force * 1.3)), ARMOR_MELEE, BRUTE, "chest", 25) user.attack_log += text("\[[time_stamp()]\] [key_name(user)] sliced [key_name(target)] with their whirling scythe.") target.attack_log += text("\[[time_stamp()]\] [key_name(target)] was sliced by [key_name(user)] whirling their scythe.") From 719c1eb221644f337056bf2daeae479188941495 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 14 Feb 2024 21:23:24 +0000 Subject: [PATCH 15/23] var tidy up --- code/modules/cm_preds/yaut_weapons.dm | 89 +++++++++++---------------- 1 file changed, 36 insertions(+), 53 deletions(-) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 4b8663d42419..968362f52a12 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -16,6 +16,8 @@ #define ABILITY_MAX_DEFAULT 2 #define ABILITY_MAX_LARGE 5 +#define ABILITY_FILTER_NAME "ability_charge" + /*######################################### ########### Weapon Reused Procs ########### #########################################*/ @@ -48,7 +50,7 @@ attack_verb = list("jabbed","stabbed","ripped", "skewered") throw_range = 4 unacidable = TRUE - edge = 1 + edge = TRUE hitsound = 'sound/weapons/bladeslice.ogg' sharp = IS_SHARP_ITEM_BIG @@ -154,6 +156,14 @@ WEAR_L_HAND = 'icons/mob/humans/onmob/hunter/items_lefthand.dmi', WEAR_R_HAND = 'icons/mob/humans/onmob/hunter/items_righthand.dmi' ) + + flags_atom = FPRINT|CONDUCT + flags_item = ITEM_PREDATOR + unacidable = TRUE + edge = TRUE + w_class = SIZE_LARGE + embeddable = FALSE + var/human_adapted = FALSE ///The amount this weapon interrupts hivemind link on Xenomorphs. var/xeno_interfere_amount = 30 @@ -166,7 +176,6 @@ ///Whether the ability is ready to trigger var/ability_primed = FALSE - /obj/item/weapon/yautja/dropped() if(ability_primed) ability_primed = FALSE @@ -185,7 +194,11 @@ return if(ability_charge < ability_charge_max) - ability_charge += ability_charge_rate + ability_charge = min(ability_charge_max, ability_charge + ability_charge_rate) + to_chat(user, SPAN_DANGER("[src]'s reservoir fills up with your opponent's blood!")) + + if(ability_charge >= ability_cost) + ready_ability(target, user) /obj/item/weapon/yautja/unique_action(mob/user) if(user.get_active_hand() != src) @@ -195,21 +208,31 @@ return FALSE return TRUE +/obj/item/weapon/yautja/get_examine_text(mob/user) + . = ..() + if(isyautja(user) && ability_cost) + . += SPAN_WARNING("It currently has [ability_charge]/[ability_charge_max] blood charge(s).") + . += SPAN_ORANGE("It requires [ability_cost] blood charge(s) to use its ability.") + +/obj/item/weapon/yautja/proc/ready_ability(mob/living/target as mob, mob/living/carbon/human/user as mob) + if(ability_charge >= ability_cost) + var/color = target.get_blood_color() + var/alpha = 70 + color += num2text(alpha, 2, 16) + add_filter(ABILITY_FILTER_NAME, 1, list("type" = "outline", "color" = color, "size" = 2)) + return TRUE + return FALSE + /obj/item/weapon/yautja/chain name = "chainwhip" desc = "A segmented, lightweight whip made of durable, acid-resistant metal. Not very common among Yautja Hunters, but still a dangerous weapon capable of shredding prey." icon_state = "whip" item_state = "whip" - flags_atom = FPRINT|CONDUCT - flags_item = ITEM_PREDATOR flags_equip_slot = SLOT_WAIST - embeddable = FALSE w_class = SIZE_MEDIUM - unacidable = TRUE force = MELEE_FORCE_TIER_7 throwforce = MELEE_FORCE_TIER_4 sharp = IS_SHARP_ITEM_SIMPLE - edge = TRUE attack_verb = list("whipped", "slashed","sliced","diced","shredded") attack_speed = 0.8 SECONDS hitsound = 'sound/weapons/chain_whip.ogg' @@ -222,51 +245,31 @@ name = "clan sword" desc = "An expertly crafted Yautja blade carried by hunters who wish to fight up close. Razor sharp and capable of cutting flesh into ribbons. Commonly carried by aggressive and lethal hunters." icon_state = "clansword" - flags_atom = FPRINT|CONDUCT - flags_item = ITEM_PREDATOR flags_equip_slot = SLOT_BACK force = MELEE_FORCE_TIER_7 throwforce = MELEE_FORCE_TIER_5 sharp = IS_SHARP_ITEM_ACCURATE - edge = TRUE - embeddable = FALSE - w_class = SIZE_LARGE - hitsound = "clan_sword_hit" attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") attack_speed = 1 SECONDS - unacidable = TRUE + hitsound = "clan_sword_hit" /obj/item/weapon/yautja/scythe name = "dual war scythe" desc = "A huge, incredibly sharp dual blade used for hunting dangerous prey. This weapon is commonly carried by Yautja who wish to disable and slice apart their foes." icon_state = "predscythe" item_state = "scythe_dual" - flags_atom = FPRINT|CONDUCT - flags_item = ITEM_PREDATOR flags_equip_slot = SLOT_WAIST force = MELEE_FORCE_TIER_7 throwforce = MELEE_FORCE_TIER_5 sharp = IS_SHARP_ITEM_SIMPLE - edge = TRUE - embeddable = FALSE - w_class = SIZE_LARGE - hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - unacidable = TRUE + hitsound = 'sound/weapons/bladeslice.ogg' has_unique_action = TRUE ability_cost = ABILITY_COST_SCYTHE ability_charge_max = ABILITY_COST_SCYTHE ability_charge_rate = ABILITY_CHARGE_NORMAL -/obj/item/weapon/yautja/scythe/attack(mob/living/target as mob, mob/living/carbon/human/user as mob) - ..() - if(ability_charge >= ability_cost) - var/color = BLOOD_COLOR_HUMAN - var/alpha = 70 - color += num2text(alpha, 2, 16) - add_filter("scythe_ready", 1, list("type" = "outline", "color" = color, "size" = 2)) - /obj/item/weapon/yautja/scythe/attack_self(mob/user) ..() ability_primed = !ability_primed @@ -305,7 +308,7 @@ ability_charge -= ability_cost if(ability_charge < ability_cost) - remove_filter("scythe_ready") + remove_filter(ABILITY_FILTER_NAME) return TRUE /obj/item/weapon/yautja/scythe/alt @@ -320,20 +323,16 @@ desc = "A compact yet deadly personal weapon. Can be concealed when folded. Functions well as a throwing weapon or defensive tool. A common sight in Yautja packs due to its versatility." icon_state = "combistick" has_unique_action = TRUE - flags_atom = FPRINT|CONDUCT flags_equip_slot = SLOT_BACK flags_item = TWOHANDED|ITEM_PREDATOR - w_class = SIZE_LARGE embeddable = FALSE //It shouldn't embed so that the Yautja can actually use the yank combi verb, and so that it's not useless upon throwing it at someone. throw_speed = SPEED_VERY_FAST throw_range = 4 - unacidable = TRUE force = MELEE_FORCE_TIER_6 throwforce = MELEE_FORCE_TIER_7 sharp = IS_SHARP_ITEM_SIMPLE - edge = TRUE - hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("speared", "stabbed", "impaled") + hitsound = 'sound/weapons/bladeslice.ogg' ability_cost = ABILITY_COST_DEFAULT ability_charge_max = ABILITY_MAX_DEFAULT @@ -364,7 +363,7 @@ return FALSE ability_charge -= ability_cost if(ability_charge < ability_cost) - remove_filter("combistick_charge") + remove_filter(ABILITY_FILTER_NAME) unwield(user) //Otherwise stays wielded even when thrown return TRUE @@ -520,21 +519,6 @@ return -/obj/item/weapon/yautja/combistick/attack(mob/living/target, mob/living/carbon/human/user) - . = ..() - if(!.) - return - - if((ability_charge < ability_charge_max)) - to_chat(user, SPAN_DANGER("Your combistick's reservoir fills up with your opponent's blood!")) - ability_charge += ability_charge_rate - if(ability_charge >= ability_cost) - to_chat(user, SPAN_DANGER("You may now throw your combistick!")) - var/color = target.get_blood_color() - var/alpha = 70 - color += num2text(alpha, 2, 16) - add_filter("combistick_charge", 1, list("type" = "outline", "color" = color, "size" = 2)) - /obj/item/weapon/yautja/combistick/attack_hand(mob/user) //Prevents marines from instantly picking it up via pickup macros. if(!human_adapted && !HAS_TRAIT(user, TRAIT_SUPER_STRONG)) user.visible_message(SPAN_DANGER("[user] starts to untangle the chain on \the [src]..."), SPAN_NOTICE("You start to untangle the chain on \the [src]...")) @@ -838,7 +822,6 @@ force = MELEE_FORCE_TIER_3 force_wielded = MELEE_FORCE_TIER_10 throwforce = MELEE_FORCE_TIER_3 - embeddable = FALSE //so predators don't lose their glaive when thrown. sharp = IS_SHARP_ITEM_BIG flags_atom = FPRINT|CONDUCT attack_verb = list("sliced", "slashed", "carved", "diced", "gored") From b54290dad5836a944dd958037b466fd6618e2ad8 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Thu, 15 Feb 2024 19:13:22 +0000 Subject: [PATCH 16/23] overlay fix --- code/modules/cm_preds/yaut_weapons.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 968362f52a12..318e596d50ec 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -168,6 +168,7 @@ ///The amount this weapon interrupts hivemind link on Xenomorphs. var/xeno_interfere_amount = 30 + var/has_ability = FALSE ///The amount of charges towards use of special abilities. var/ability_charge = 0 var/ability_charge_max = ABILITY_MAX_DEFAULT @@ -189,6 +190,9 @@ var/mob/living/carbon/xenomorph/xenomorph = target xenomorph.interference = xeno_interfere_amount + if(!has_ability) + return + if(target == user || target.stat == DEAD || isanimal(target)) to_chat(user, SPAN_DANGER("You think you're smart?")) //very funny return @@ -269,6 +273,7 @@ ability_cost = ABILITY_COST_SCYTHE ability_charge_max = ABILITY_COST_SCYTHE ability_charge_rate = ABILITY_CHARGE_NORMAL + has_ability = TRUE /obj/item/weapon/yautja/scythe/attack_self(mob/user) ..() @@ -337,6 +342,7 @@ ability_cost = ABILITY_COST_DEFAULT ability_charge_max = ABILITY_MAX_DEFAULT ability_charge_rate = ABILITY_CHARGE_SMALL + has_ability = TRUE var/on = TRUE @@ -540,7 +546,6 @@ desc = "A viciously sharp dagger inscribed with ancient Yautja markings. Smells thickly of blood. Carried by some hunters." icon_state = "predknife" item_state = "knife" - flags_atom = FPRINT|CONDUCT flags_item = ITEM_PREDATOR|CAN_DIG_SHRAPNEL flags_equip_slot = SLOT_STORE sharp = IS_SHARP_ITEM_ACCURATE @@ -552,7 +557,6 @@ hitsound = 'sound/weapons/slash.ogg' attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") actions_types = list(/datum/action/item_action) - unacidable = TRUE /obj/item/weapon/yautja/knife/attack(mob/living/target, mob/living/carbon/human/user) if(target.stat != DEAD) From f164a729d34fcb6696addd4b1c1fc5fba0d185e3 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Thu, 15 Feb 2024 19:16:50 +0000 Subject: [PATCH 17/23] better fix --- code/modules/cm_preds/yaut_weapons.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 318e596d50ec..425691507e15 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -168,7 +168,6 @@ ///The amount this weapon interrupts hivemind link on Xenomorphs. var/xeno_interfere_amount = 30 - var/has_ability = FALSE ///The amount of charges towards use of special abilities. var/ability_charge = 0 var/ability_charge_max = ABILITY_MAX_DEFAULT @@ -190,7 +189,7 @@ var/mob/living/carbon/xenomorph/xenomorph = target xenomorph.interference = xeno_interfere_amount - if(!has_ability) + if(!ability_cost) return if(target == user || target.stat == DEAD || isanimal(target)) @@ -240,6 +239,7 @@ attack_verb = list("whipped", "slashed","sliced","diced","shredded") attack_speed = 0.8 SECONDS hitsound = 'sound/weapons/chain_whip.ogg' + ability_cost = ABILITY_COST_CHAIN /obj/item/weapon/yautja/chain/attack(mob/target, mob/living/user) @@ -256,6 +256,7 @@ attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") attack_speed = 1 SECONDS hitsound = "clan_sword_hit" + ability_cost = ABILITY_COST_SWORD /obj/item/weapon/yautja/scythe name = "dual war scythe" @@ -273,7 +274,6 @@ ability_cost = ABILITY_COST_SCYTHE ability_charge_max = ABILITY_COST_SCYTHE ability_charge_rate = ABILITY_CHARGE_NORMAL - has_ability = TRUE /obj/item/weapon/yautja/scythe/attack_self(mob/user) ..() @@ -342,7 +342,6 @@ ability_cost = ABILITY_COST_DEFAULT ability_charge_max = ABILITY_MAX_DEFAULT ability_charge_rate = ABILITY_CHARGE_SMALL - has_ability = TRUE var/on = TRUE From 8b3a45ba146318be10ec2d7954b5cf457d6643eb Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 24 Apr 2024 12:28:45 +0100 Subject: [PATCH 18/23] start on chainwhip --- code/modules/cm_preds/yaut_weapons.dm | 79 ++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 3 deletions(-) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index efd82dd3aee4..3f5dbd80f1bd 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -3,7 +3,7 @@ #define FLAY_STAGE_SKIN 3 #define ABILITY_COST_DEFAULT 1 -#define ABILITY_COST_CHAIN 0 +#define ABILITY_COST_CHAIN 3 #define ABILITY_COST_SCYTHE 5 #define ABILITY_COST_SWORD 0 #define ABILITY_COST_GLAIVE 0 @@ -192,9 +192,12 @@ if(!ability_cost) return + progress_ability(target, user) + +/obj/item/weapon/yautja/proc/progress_ability(mob/living/target, mob/living/carbon/human/user) if(target == user || target.stat == DEAD || isanimal(target)) to_chat(user, SPAN_DANGER("You think you're smart?")) //very funny - return + return FALSE if(ability_charge < ability_charge_max) ability_charge = min(ability_charge_max, ability_charge + ability_charge_rate) @@ -202,6 +205,7 @@ if(ability_charge >= ability_cost) ready_ability(target, user) + return TRUE /obj/item/weapon/yautja/unique_action(mob/user) if(user.get_active_hand() != src) @@ -239,12 +243,81 @@ attack_verb = list("whipped", "slashed","sliced","diced","shredded") attack_speed = 0.8 SECONDS hitsound = 'sound/weapons/chain_whip.ogg' + ability_cost = ABILITY_COST_CHAIN + ability_charge_max = ABILITY_COST_CHAIN + + var/chain_range = 3 + var/mob/trapped_mob + var/datum/effects/tethering/tether_effect +/obj/item/weapon/yautja/chain/progress_ability(mob/living/target, mob/living/carbon/human/user) + if(trapped_mob) + return FALSE//No recharging ability while a mob is already captured. + ..() -/obj/item/weapon/yautja/chain/attack(mob/target, mob/living/user) +/obj/item/weapon/yautja/chain/attack_self(mob/user) + ..() + if(trapped_mob) + var/choice = tgui_alert(user, "Do you wish to release your captive?", "Confirmation", list("Yes", "No")) + if(choice != "Yes") + return FALSE + release_capture(user) + return TRUE + if(!(ability_charge >= ability_cost)) + return FALSE + ability_primed = !ability_primed + var/message = "You tighten your grip on [src], preparing to whirl it around your target." + if(!ability_primed) + message = "You relax your grip on [src]." + to_chat(user, SPAN_WARNING(message)) + return TRUE + +/obj/item/weapon/yautja/chain/attack(mob/living/target, mob/living/carbon/human/user) + . = ..() + if(!.) + return + if(ability_primed) + capture_target(user, target) + +/obj/item/weapon/yautja/chain/proc/capture_target(mob/living/user, mob/living/target) + var/list/tether_effects = apply_tether(user, target, range = chain_range, resistable = TRUE) + tether_effect = tether_effects["tetherer_tether"] + RegisterSignal(tether_effect, COMSIG_PARENT_QDELETING, PROC_REF(release_capture)) + trapped_mob = target + ability_primed = FALSE + ability_charge = max(ability_charge - ability_cost, 0) + +/obj/item/weapon/yautja/chain/dropped(mob/user) + release_capture(user) + . = ..() + +/obj/item/weapon/yautja/chain/proc/release_capture(mob/user) + SIGNAL_HANDLER + anchored = FALSE + if(user) + to_chat(user, SPAN_WARNING("[src] is no longer wrapped around [trapped_mob]!")) + user.attack_log += text("\[[time_stamp()]\] [key_name(user)] has disarmed \the [src] at [get_location_in_text(user)].") + log_attack("[key_name(user)] has disarmed \a [src] at [get_location_in_text(user)].") + if(trapped_mob) + if (isxeno(trapped_mob)) + var/mob/living/carbon/xenomorph/X = trapped_mob + UnregisterSignal(X, COMSIG_XENO_PRE_HEAL) + trapped_mob = null + cleanup_tether() + remove_filter(ABILITY_FILTER_NAME) + +/obj/item/weapon/yautja/chain/Destroy() + cleanup_tether() + trapped_mob = null . = ..() +/obj/item/weapon/yautja/chain/proc/cleanup_tether() + if(tether_effect) + UnregisterSignal(tether_effect, COMSIG_PARENT_QDELETING) + qdel(tether_effect) + tether_effect = null + /obj/item/weapon/yautja/sword name = "clan sword" desc = "An expertly crafted Yautja blade carried by hunters who wish to fight up close. Razor sharp and capable of cutting flesh into ribbons. Commonly carried by aggressive and lethal hunters." From 49f0f361cd13b67f2488a517adad2fcf81c90cf5 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Fri, 26 Apr 2024 20:40:07 +0100 Subject: [PATCH 19/23] x --- code/modules/cm_preds/yaut_weapons.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 3f5dbd80f1bd..ac32d7f3cd89 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -189,7 +189,7 @@ var/mob/living/carbon/xenomorph/xenomorph = target xenomorph.interference = xeno_interfere_amount - if(!ability_cost) + if(!ability_cost || !(HAS_TRAIT(user, TRAIT_YAUTJA_TECH))) return progress_ability(target, user) From 79cf5eb2bef57b3800eb67cc3d9f94f694b85ac7 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 8 May 2024 15:34:53 +0100 Subject: [PATCH 20/23] chainwhip chain the chaining --- code/modules/cm_preds/yaut_weapons.dm | 31 +++++++++++++++++---------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index ac32d7f3cd89..55130e545ee4 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -263,6 +263,7 @@ if(choice != "Yes") return FALSE release_capture(user) + reset_tether() return TRUE if(!(ability_charge >= ability_cost)) return FALSE @@ -283,39 +284,47 @@ /obj/item/weapon/yautja/chain/proc/capture_target(mob/living/user, mob/living/target) var/list/tether_effects = apply_tether(user, target, range = chain_range, resistable = TRUE) tether_effect = tether_effects["tetherer_tether"] - RegisterSignal(tether_effect, COMSIG_PARENT_QDELETING, PROC_REF(release_capture)) + RegisterSignal(tether_effect, COMSIG_PARENT_QDELETING, PROC_REF(reset_tether)) + RegisterSignal(target, COMSIG_MOB_DEATH, PROC_REF(reset_tether)) + /// Uncertain if I want this in place, as would make the chainwhip decidedly more powerful vs xenos. + //if(isxeno(target)) + // RegisterSignal(target, COMSIG_XENO_PRE_HEAL, PROC_REF(block_heal)) trapped_mob = target ability_primed = FALSE ability_charge = max(ability_charge - ability_cost, 0) /obj/item/weapon/yautja/chain/dropped(mob/user) release_capture(user) + reset_tether() . = ..() /obj/item/weapon/yautja/chain/proc/release_capture(mob/user) SIGNAL_HANDLER - anchored = FALSE if(user) to_chat(user, SPAN_WARNING("[src] is no longer wrapped around [trapped_mob]!")) user.attack_log += text("\[[time_stamp()]\] [key_name(user)] has disarmed \the [src] at [get_location_in_text(user)].") log_attack("[key_name(user)] has disarmed \a [src] at [get_location_in_text(user)].") if(trapped_mob) - if (isxeno(trapped_mob)) - var/mob/living/carbon/xenomorph/X = trapped_mob - UnregisterSignal(X, COMSIG_XENO_PRE_HEAL) - trapped_mob = null - cleanup_tether() + //if(isxeno(trapped_mob)) + // var/mob/living/carbon/xenomorph/xeno = trapped_mob + // UnregisterSignal(xeno, COMSIG_XENO_PRE_HEAL) + UnregisterSignal(trapped_mob, COMSIG_MOB_DEATH) + trapped_mob = null remove_filter(ABILITY_FILTER_NAME) /obj/item/weapon/yautja/chain/Destroy() - cleanup_tether() - trapped_mob = null + release_capture() + reset_tether() . = ..() -/obj/item/weapon/yautja/chain/proc/cleanup_tether() +/obj/item/weapon/yautja/chain/proc/reset_tether() + SIGNAL_HANDLER + if(trapped_mob) + release_capture() if(tether_effect) UnregisterSignal(tether_effect, COMSIG_PARENT_QDELETING) - qdel(tether_effect) + if(!QDESTROYING(tether_effect)) + qdel(tether_effect) tether_effect = null /obj/item/weapon/yautja/sword From 1b61578868d6b69b6549546c30c1e4b393c190c9 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 8 May 2024 16:40:54 +0100 Subject: [PATCH 21/23] log fix --- code/modules/cm_preds/yaut_weapons.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 55130e545ee4..8667735c0394 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -294,8 +294,9 @@ ability_charge = max(ability_charge - ability_cost, 0) /obj/item/weapon/yautja/chain/dropped(mob/user) - release_capture(user) - reset_tether() + if(trapped_mob || tether_effect) + release_capture(user) + reset_tether() . = ..() /obj/item/weapon/yautja/chain/proc/release_capture(mob/user) From 1f8b4ff606e17d83eb536cdb8d2621f3b9ab676e Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 8 May 2024 16:59:05 +0100 Subject: [PATCH 22/23] d --- code/modules/cm_preds/yaut_weapons.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 8667735c0394..3fb0a093e37a 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -387,8 +387,8 @@ user.visible_message(SPAN_HIGHDANGER("[user] slices open the guts of [target]!"), SPAN_HIGHDANGER("You slice open the guts of [target]!")) target.spawn_gibs() playsound(get_turf(target), 'sound/effects/gibbed.ogg', 30, 1) - target.apply_effect(get_xeno_stun_duration(target, 3), SLOW) - target.apply_armoured_damage(get_xeno_damage_slash(target, (force * 1.3)), ARMOR_MELEE, BRUTE, "chest", 25) + target.Slow(get_xeno_stun_duration(target, 3)) + target.apply_armoured_damage(get_xeno_damage_slash(target, (force * 1.25)), ARMOR_MELEE, BRUTE, "chest", 25) user.attack_log += text("\[[time_stamp()]\] [key_name(user)] sliced [key_name(target)] with their whirling scythe.") target.attack_log += text("\[[time_stamp()]\] [key_name(target)] was sliced by [key_name(user)] whirling their scythe.") From 63d75af8859f4ef0b2bf45bf66e4250d997011eb Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 8 May 2024 17:40:09 +0100 Subject: [PATCH 23/23] chain decay --- code/modules/cm_preds/yaut_weapons.dm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 3fb0a093e37a..02efde8051df 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -248,6 +248,7 @@ ability_charge_max = ABILITY_COST_CHAIN var/chain_range = 3 + var/chain_duration = 30 SECONDS var/mob/trapped_mob var/datum/effects/tethering/tether_effect @@ -286,9 +287,7 @@ tether_effect = tether_effects["tetherer_tether"] RegisterSignal(tether_effect, COMSIG_PARENT_QDELETING, PROC_REF(reset_tether)) RegisterSignal(target, COMSIG_MOB_DEATH, PROC_REF(reset_tether)) - /// Uncertain if I want this in place, as would make the chainwhip decidedly more powerful vs xenos. - //if(isxeno(target)) - // RegisterSignal(target, COMSIG_XENO_PRE_HEAL, PROC_REF(block_heal)) + addtimer(CALLBACK(src, PROC_REF(reset_tether), user), chain_duration) trapped_mob = target ability_primed = FALSE ability_charge = max(ability_charge - ability_cost, 0) @@ -303,8 +302,8 @@ SIGNAL_HANDLER if(user) to_chat(user, SPAN_WARNING("[src] is no longer wrapped around [trapped_mob]!")) - user.attack_log += text("\[[time_stamp()]\] [key_name(user)] has disarmed \the [src] at [get_location_in_text(user)].") - log_attack("[key_name(user)] has disarmed \a [src] at [get_location_in_text(user)].") + //user.attack_log += text("\[[time_stamp()]\] [key_name(user)] has disarmed \the [src] at [get_location_in_text(user)].") + //log_attack("[key_name(user)] has disarmed \a [src] at [get_location_in_text(user)].") if(trapped_mob) //if(isxeno(trapped_mob)) // var/mob/living/carbon/xenomorph/xeno = trapped_mob