mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-19 21:46:42 +00:00
* Zombies can be decapped again, un-nerfs esword/armblade/etc wounding power, improvised cauterization tweaks (#53349) #53117 introduced a few minor bugs with the health system, in this case, zombies being un-decappable due to an oversight in the head/chest dismember requiring full death rather than either full crit or death. As zombies (or anything with TRAIT_NODEATH) can only reach hard crit and not death, this meant they couldn't be decapped/disemboweled. This fixes that. It also fixes krokodil addict zombies being unwoundable due to not having flesh or bone traits. Next up, I originally set really high negative wound bonuses for high damage weapons like eswords and armblades since they already had high damage and dismember power by themselves. Now that dismembering is tied to wounding power (and I have a better sense of balance values), these harsh nerfs are no longer needed or wanted, and you can actually dismember people worth a damn with an esword again. I also punched up the wounding power of a few other weapons like saws and scalpels to less awful (but still not optimal) against armor. Attacks currently have an 80% chance to hit the limb you're aiming at, which can make destroying a limb a complete pain even if the target is already down and out. As such, attacks against prone targets now have a 90% chance to hit the targeted limb, cutting the miss rate in half. Lastly, trying to cauterize bleeding wounds with improvised tools (anything hot that isn't a cautery) is now slightly less efficient than a real cautery and requires an aggro grab on the patient to apply. No more trying to cauterize the person you just attacked with an esword because you were on help intent! * Zombies can be decapped again, un-nerfs esword/armblade/etc wounding power, improvised cauterization tweaks Co-authored-by: Ryll Ryll <3589655+Ryll-Ryll@users.noreply.github.com>
202 lines
6.6 KiB
Plaintext
202 lines
6.6 KiB
Plaintext
/*
|
|
* Double-Bladed Energy Swords - Cheridan
|
|
*/
|
|
/obj/item/dualsaber
|
|
icon = 'icons/obj/transforming_energy.dmi'
|
|
icon_state = "dualsaber0"
|
|
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
|
name = "double-bladed energy sword"
|
|
desc = "Handle with care."
|
|
force = 3
|
|
throwforce = 5
|
|
throw_speed = 3
|
|
throw_range = 5
|
|
sharpness = SHARP_EDGED
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
hitsound = "swing_hit"
|
|
armour_penetration = 35
|
|
light_system = MOVABLE_LIGHT
|
|
light_range = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD
|
|
light_color = LIGHT_COLOR_ELECTRIC_GREEN
|
|
light_on = FALSE
|
|
attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts")
|
|
attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut")
|
|
block_chance = 75
|
|
max_integrity = 200
|
|
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70)
|
|
resistance_flags = FIRE_PROOF
|
|
wound_bonus = -10
|
|
bare_wound_bonus = 20
|
|
var/w_class_on = WEIGHT_CLASS_BULKY
|
|
var/saber_color = "green"
|
|
var/two_hand_force = 34
|
|
var/hacked = FALSE
|
|
var/list/possible_colors = list("red", "blue", "green", "purple")
|
|
var/wielded = FALSE // track wielded status on item
|
|
|
|
/obj/item/dualsaber/ComponentInitialize()
|
|
. = ..()
|
|
AddComponent(/datum/component/two_handed, force_unwielded=force, force_wielded=two_hand_force, wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg')
|
|
|
|
/// Triggered on wield of two handed item
|
|
/// Specific hulk checks due to reflection chance for balance issues and switches hitsounds.
|
|
/obj/item/dualsaber/proc/on_wield(obj/item/source, mob/living/carbon/user)
|
|
SIGNAL_HANDLER
|
|
|
|
if(user && user.has_dna())
|
|
if(user.dna.check_mutation(HULK))
|
|
to_chat(user, "<span class='warning'>You lack the grace to wield this!</span>")
|
|
return COMPONENT_TWOHANDED_BLOCK_WIELD
|
|
wielded = TRUE
|
|
w_class = w_class_on
|
|
hitsound = 'sound/weapons/blade1.ogg'
|
|
START_PROCESSING(SSobj, src)
|
|
set_light_on(TRUE)
|
|
|
|
|
|
/// Triggered on unwield of two handed item
|
|
/// switch hitsounds
|
|
/obj/item/dualsaber/proc/on_unwield(obj/item/source, mob/living/carbon/user)
|
|
SIGNAL_HANDLER
|
|
|
|
wielded = FALSE
|
|
w_class = initial(w_class)
|
|
hitsound = "swing_hit"
|
|
STOP_PROCESSING(SSobj, src)
|
|
set_light_on(FALSE)
|
|
|
|
|
|
/obj/item/dualsaber/get_sharpness()
|
|
return wielded * sharpness
|
|
|
|
/obj/item/dualsaber/update_icon_state()
|
|
if(wielded)
|
|
icon_state = "dualsaber[saber_color][wielded]"
|
|
else
|
|
icon_state = "dualsaber0"
|
|
|
|
/obj/item/dualsaber/suicide_act(mob/living/carbon/user)
|
|
if(wielded)
|
|
user.visible_message("<span class='suicide'>[user] begins spinning way too fast! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
|
|
|
var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)//stole from chainsaw code
|
|
var/obj/item/organ/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN)
|
|
B.organ_flags &= ~ORGAN_VITAL //this cant possibly be a good idea
|
|
var/randdir
|
|
for(var/i in 1 to 24)//like a headless chicken!
|
|
if(user.is_holding(src))
|
|
randdir = pick(GLOB.alldirs)
|
|
user.Move(get_step(user, randdir),randdir)
|
|
user.emote("spin")
|
|
if (i == 3 && myhead)
|
|
myhead.drop_limb()
|
|
sleep(3)
|
|
else
|
|
user.visible_message("<span class='suicide'>[user] panics and starts choking to death!</span>")
|
|
return OXYLOSS
|
|
|
|
else
|
|
user.visible_message("<span class='suicide'>[user] begins beating [user.p_them()]self to death with \the [src]'s handle! It probably would've been cooler if [user.p_they()] turned it on first!</span>")
|
|
return BRUTELOSS
|
|
|
|
/obj/item/dualsaber/Initialize()
|
|
. = ..()
|
|
RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield)
|
|
RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield)
|
|
if(LAZYLEN(possible_colors))
|
|
saber_color = pick(possible_colors)
|
|
switch(saber_color)
|
|
if("red")
|
|
set_light_color(COLOR_SOFT_RED)
|
|
if("green")
|
|
set_light_color(LIGHT_COLOR_GREEN)
|
|
if("blue")
|
|
set_light_color(LIGHT_COLOR_LIGHT_CYAN)
|
|
if("purple")
|
|
set_light_color(LIGHT_COLOR_LAVENDER)
|
|
|
|
/obj/item/dualsaber/Destroy()
|
|
STOP_PROCESSING(SSobj, src)
|
|
. = ..()
|
|
|
|
/obj/item/dualsaber/attack(mob/target, mob/living/carbon/human/user)
|
|
if(user.has_dna())
|
|
if(user.dna.check_mutation(HULK))
|
|
to_chat(user, "<span class='warning'>You grip the blade too hard and accidentally drop it!</span>")
|
|
if(wielded)
|
|
user.dropItemToGround(src, force=TRUE)
|
|
return
|
|
..()
|
|
if(wielded && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40))
|
|
impale(user)
|
|
return
|
|
if(wielded && prob(50))
|
|
INVOKE_ASYNC(src, .proc/jedi_spin, user)
|
|
|
|
/obj/item/dualsaber/proc/jedi_spin(mob/living/user)
|
|
dance_rotate(user, CALLBACK(user, /mob.proc/dance_flip))
|
|
|
|
/obj/item/dualsaber/proc/impale(mob/living/user)
|
|
to_chat(user, "<span class='warning'>You twirl around a bit before losing your balance and impaling yourself on [src].</span>")
|
|
if(wielded)
|
|
user.take_bodypart_damage(20,25,check_armor = TRUE)
|
|
else
|
|
user.adjustStaminaLoss(25)
|
|
|
|
/obj/item/dualsaber/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(wielded)
|
|
return ..()
|
|
return 0
|
|
|
|
/obj/item/dualsaber/process()
|
|
if(wielded)
|
|
if(hacked)
|
|
set_light_color(pick(COLOR_SOFT_RED, LIGHT_COLOR_GREEN, LIGHT_COLOR_LIGHT_CYAN, LIGHT_COLOR_LAVENDER))
|
|
open_flame()
|
|
else
|
|
STOP_PROCESSING(SSobj, src)
|
|
|
|
/obj/item/dualsaber/IsReflect()
|
|
if(wielded)
|
|
return 1
|
|
|
|
/obj/item/dualsaber/ignition_effect(atom/A, mob/user)
|
|
// same as /obj/item/melee/transforming/energy, mostly
|
|
if(!wielded)
|
|
return ""
|
|
var/in_mouth = ""
|
|
if(iscarbon(user))
|
|
var/mob/living/carbon/C = user
|
|
if(C.wear_mask)
|
|
in_mouth = ", barely missing [user.p_their()] nose"
|
|
. = "<span class='warning'>[user] swings [user.p_their()] [name][in_mouth]. [user.p_they(TRUE)] light[user.p_s()] [A.loc == user ? "[user.p_their()] [A.name]" : A] in the process.</span>"
|
|
playsound(loc, hitsound, get_clamped_volume(), TRUE, -1)
|
|
add_fingerprint(user)
|
|
// Light your candles while spinning around the room
|
|
INVOKE_ASYNC(src, .proc/jedi_spin, user)
|
|
|
|
/obj/item/dualsaber/green
|
|
possible_colors = list("green")
|
|
|
|
/obj/item/dualsaber/red
|
|
possible_colors = list("red")
|
|
|
|
/obj/item/dualsaber/blue
|
|
possible_colors = list("blue")
|
|
|
|
/obj/item/dualsaber/purple
|
|
possible_colors = list("purple")
|
|
|
|
/obj/item/dualsaber/attackby(obj/item/W, mob/user, params)
|
|
if(W.tool_behaviour == TOOL_MULTITOOL)
|
|
if(!hacked)
|
|
hacked = TRUE
|
|
to_chat(user, "<span class='warning'>2XRNBW_ENGAGE</span>")
|
|
saber_color = "rainbow"
|
|
update_icon()
|
|
else
|
|
to_chat(user, "<span class='warning'>It's starting to look like a triple rainbow - no, nevermind.</span>")
|
|
else
|
|
return ..()
|