mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-16 17:43:35 +01:00
203105788c
* fixes * fuck my stupid chungus life * Minion limit, heal fix, dead sac fix * cooldown, no sacrificing star gazer or ascended alive heretics * blade debuff * oopsy * Update tgui.bundle.js * map diff bot what ya doing * fuck that chat spam * lets heretic armour hold a haunted longsword * why not it makes sense * do_after * god I hate this bullshit * other lewc stuff * push * heretic id card fix * she tg on my ui till I css * yes * spent * fix / ipc buff (real)™️ * moderate again * revert * no reserve * bringing up to master * update map files to master * didnt replace centcomm * beginning some rebalancing * aggressive spread tweaks * lots of tweaks and fixes * trying to un-key the maps * maybe this time * this time???? * oops * sql fix * basicmob conversion * paintings! and a critical influence fix * rust + tweaks * monster tweak * small change * removing this * more tweaks. no more dusting * added some examine_more * flower seeds * various tweaks. more to come * no more conduit spacing * fixed some dumb stuff * silly stuff * its always prettier * bugfixes and linters * linters, wow * oops * bah * linter * fuck you * temp check * hidden influence drain * influence visible message * tweak fix * void cloak bugfix * small fixes * fixes * do_after_once broken * fixes and tweaks * heretic blade potential fix + sacrifice changes * batch of fixes * tiny tweak * rebuilt TGUI * no greentext + rerolls * logging + bugfix * unused var * small fix * various fixes * comment * projectile change * tgui rebuild * tgui bundle redo * rune issue solved * influence visible now * fix ui reloading * new moon ascension + fixes + icons * tweaks, species sprites * tgui rebuild * small tweak + linter * harvester icon tweak * spans * fixes and tweaks * caretaker nerf + tweaks * potential fix for knowledge * roller fix * mad mask * Update tgui.bundle.js * void phase tweak * Update tgui.bundle.js * misc tweaks * fix heretic not retargeting correctly with cryo * simplify logic * this is better * lots of fixes and tweaks * Update tgui.bundle.js * linter * linter * fireshark and greyscale insanity * fish * Update tgui.bundle.js * linter * linter * tgui * no window shopping * fish fix * tgui rebundle * moon smile runtime fix * various fixes * sacrifice fixes * insanity is easier now, madness mask changes. * bugfixing + teleport change * linters + tweaks * Update code/modules/antagonists/heretic/status_effects/mark_effects.dm Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/antagonists/heretic/status_effects/mark_effects.dm Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> --------- Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> Co-authored-by: Qwertytoforty <52090703+Qwertytoforty@users.noreply.github.com> Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Co-authored-by: Paul <pmerkamp@gmail.com> Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
215 lines
7.3 KiB
Plaintext
215 lines
7.3 KiB
Plaintext
/**
|
|
* # Police Baton
|
|
*
|
|
* Knocks down the hit mob when not on harm intent and when [/obj/item/melee/classic_baton/var/on] is `TRUE`.
|
|
*
|
|
* A non-lethal attack has a cooldown to avoid spamming
|
|
*/
|
|
/obj/item/melee/classic_baton
|
|
name = "police baton"
|
|
desc = "A wooden truncheon for beating criminal scum."
|
|
icon = 'icons/obj/weapons/baton.dmi'
|
|
icon_state = "baton"
|
|
worn_icon_state = "classic_baton"
|
|
inhand_icon_state = "classic_baton"
|
|
slot_flags = ITEM_SLOT_BELT
|
|
force = 12 //9 hit crit
|
|
// Settings
|
|
/// Whether the baton can stun silicon mobs
|
|
var/affect_silicon = FALSE
|
|
/// The amount of stamina damage the baton does per swing
|
|
var/stamina_damage = 30
|
|
/// How much melee armour is ignored by the stamina damage
|
|
var/stamina_armor_pen = 0
|
|
/// The stun time (in seconds) for non-silicons
|
|
var/knockdown_duration = 6 SECONDS
|
|
/// The stun time (in seconds) for silicons
|
|
var/stun_time_silicon = 10 SECONDS
|
|
/// Cooldown in seconds between two knockdowns
|
|
var/cooldown = 4 SECONDS
|
|
/// Sound to play when knocking someone down
|
|
var/stun_sound = 'sound/effects/woodhit.ogg'
|
|
// Variables
|
|
/// Whether the baton is on cooldown
|
|
var/on_cooldown = FALSE
|
|
/// Whether the baton is toggled on (to allow attacking)
|
|
var/on = TRUE
|
|
|
|
/obj/item/melee/classic_baton/attack__legacy__attackchain(mob/living/target, mob/living/user)
|
|
if(!on)
|
|
return ..()
|
|
|
|
add_fingerprint(user)
|
|
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
|
|
user.visible_message(SPAN_DANGER("[user] accidentally clubs [user.p_themselves()] with [src]!"), \
|
|
SPAN_USERDANGER("You accidentally club yourself with [src]!"))
|
|
user.KnockDown(knockdown_duration)
|
|
if(ishuman(user))
|
|
var/mob/living/carbon/human/H = user
|
|
H.apply_damage(force * 2, BRUTE, "head")
|
|
else
|
|
user.take_organ_damage(force * 2)
|
|
return
|
|
|
|
if(user.a_intent == INTENT_HARM)
|
|
return ..()
|
|
if(on_cooldown)
|
|
return
|
|
if((issilicon(target) || isbot(target)) && !affect_silicon)
|
|
return ..()
|
|
baton_knockdown(target, user)
|
|
|
|
/**
|
|
* Called when a target is about to be hit non-lethally.
|
|
*
|
|
* Arguments:
|
|
* * target - The mob about to be hit
|
|
* * user - The attacking user
|
|
*/
|
|
/obj/item/melee/classic_baton/proc/baton_knockdown(mob/living/target, mob/living/user)
|
|
if(user.mind?.martial_art?.no_baton && user.mind?.martial_art?.can_use(user))
|
|
to_chat(user, user.mind.martial_art.no_baton_reason)
|
|
return
|
|
var/user_UID = user.UID()
|
|
if(HAS_TRAIT_FROM(target, TRAIT_WAS_BATONNED, user_UID)) // prevents double baton cheese.
|
|
return FALSE
|
|
if(issilicon(target))
|
|
user.visible_message(SPAN_DANGER("[user] pulses [target]'s sensors with [src]!"),\
|
|
SPAN_DANGER("You pulse [target]'s sensors with [src]!"))
|
|
on_silicon_stun(target, user)
|
|
|
|
// Check for shield/countering
|
|
else if(ishuman(target))
|
|
var/mob/living/carbon/human/H = target
|
|
if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK))
|
|
return FALSE
|
|
user.visible_message(SPAN_DANGER("[user] knocks down [target] with [src]!"),\
|
|
SPAN_DANGER("You knock down [target] with [src]!"))
|
|
on_non_silicon_stun(target, user)
|
|
|
|
else if(isbot(target))
|
|
user.visible_message(SPAN_DANGER("[user] pulses [target]'s sensors with [src]!"),\
|
|
SPAN_DANGER("You pulse [target]'s sensors with [src]!"))
|
|
var/mob/living/simple_animal/bot/H = target
|
|
H.disable(stun_time_silicon)
|
|
// Visuals and sound
|
|
user.do_attack_animation(target)
|
|
playsound(target, stun_sound, 75, TRUE, -1)
|
|
add_attack_logs(user, target, "Knocked down with [src]")
|
|
// Hit 'em
|
|
if(!HAS_TRAIT(target, TRAIT_BATON_RESISTANCE))
|
|
target.KnockDown(knockdown_duration)
|
|
target.KnockDown(knockdown_duration)
|
|
on_cooldown = TRUE
|
|
addtimer(VARSET_CALLBACK(src, on_cooldown, FALSE), cooldown)
|
|
ADD_TRAIT(target, TRAIT_WAS_BATONNED, user_UID) // so one person cannot hit the same person with two separate batons
|
|
addtimer(CALLBACK(src, PROC_REF(baton_delay), target, user_UID), 2 SECONDS)
|
|
return TRUE
|
|
|
|
/**
|
|
* Called when a silicon has been stunned.
|
|
*
|
|
* Arguments:
|
|
* * target - The hit mob
|
|
* * user - The attacking user
|
|
*/
|
|
/obj/item/melee/classic_baton/proc/on_silicon_stun(mob/living/silicon/target, mob/living/user)
|
|
target.flash_eyes(affect_silicon = TRUE)
|
|
target.Weaken(stun_time_silicon)
|
|
|
|
/**
|
|
* Called when a non-silicon has been stunned.
|
|
*
|
|
* Arguments:
|
|
* * target - The hit mob
|
|
* * user - The attacking user
|
|
*/
|
|
/obj/item/melee/classic_baton/proc/on_non_silicon_stun(mob/living/target, mob/living/user)
|
|
var/armour = target.run_armor_check(BODY_ZONE_CHEST, armor_penetration_percentage = stamina_armor_pen) // returns their chest melee armour
|
|
var/percentage_reduction = 0
|
|
if(ishuman(target))
|
|
percentage_reduction = (100 - ARMOUR_VALUE_TO_PERCENTAGE(armour)) / 100
|
|
else
|
|
percentage_reduction = (100 - armour) / 100 // converts the % into a decimal
|
|
target.apply_damage(stamina_damage * percentage_reduction, STAMINA)
|
|
|
|
/obj/item/melee/classic_baton/proc/baton_delay(mob/living/target, user_UID)
|
|
REMOVE_TRAIT(target, TRAIT_WAS_BATONNED, user_UID)
|
|
|
|
/**
|
|
* # Fancy Cane
|
|
*/
|
|
/obj/item/melee/classic_baton/ntcane
|
|
name = "fancy cane"
|
|
desc = "A cane with special engraving on it. It seems well suited for fending off assailants..."
|
|
icon_state = "cane_nt"
|
|
worn_icon_state = null
|
|
inhand_icon_state = null
|
|
|
|
/obj/item/melee/classic_baton/ntcane/get_crutch_efficiency()
|
|
return 2
|
|
|
|
/**
|
|
* # Telescopic Baton
|
|
*/
|
|
/obj/item/melee/classic_baton/telescopic
|
|
name = "telescopic baton"
|
|
desc = "A compact yet robust personal defense weapon. Can be concealed when folded."
|
|
icon_state = "telebaton_0" // For telling what it is when mapping
|
|
worn_icon_state = null
|
|
inhand_icon_state = null
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
on = FALSE
|
|
/// Force when concealed
|
|
var/force_off = 0
|
|
/// Force when extended
|
|
var/force_on = 10
|
|
/// Worn icon state when extended
|
|
var/worn_icon_state_on = "tele_baton"
|
|
/// Inhand icon state when extended
|
|
var/inhand_icon_state_on = "tele_baton"
|
|
/// Icon state when concealed
|
|
var/icon_state_off = "telebaton_0"
|
|
/// Icon state when extended
|
|
var/icon_state_on = "telebaton_1"
|
|
/// Sound to play when concealing or extending
|
|
var/extend_sound = 'sound/weapons/batonextend.ogg'
|
|
/// Attack verbs when concealed (created on Initialize)
|
|
var/static/list/attack_verb_off
|
|
/// Attack verbs when extended (created on Initialize)
|
|
var/static/list/attack_verb_on
|
|
|
|
/obj/item/melee/classic_baton/telescopic/Initialize(mapload)
|
|
. = ..()
|
|
if(!attack_verb_off)
|
|
attack_verb_off = list("hit", "poked")
|
|
attack_verb_on = list("smacked", "struck", "cracked", "beaten")
|
|
icon_state = icon_state_off
|
|
force = force_off
|
|
attack_verb = on ? attack_verb_on : attack_verb_off
|
|
|
|
/obj/item/melee/classic_baton/telescopic/attack_self__legacy__attackchain(mob/user)
|
|
on = !on
|
|
icon_state = on ? icon_state_on : icon_state_off
|
|
if(on)
|
|
to_chat(user, SPAN_WARNING("You extend [src]."))
|
|
worn_icon_state = worn_icon_state_on
|
|
inhand_icon_state = inhand_icon_state_on
|
|
w_class = WEIGHT_CLASS_BULKY //doesnt fit in backpack when its on for balance
|
|
force = force_on //stunbaton damage
|
|
attack_verb = attack_verb_on
|
|
else
|
|
to_chat(user, SPAN_NOTICE("You collapse [src]."))
|
|
worn_icon_state = null
|
|
inhand_icon_state = null //no sprite for concealment even when in hand
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
force = force_off //not so robust now
|
|
attack_verb = attack_verb_off
|
|
// Update mob hand visuals
|
|
if(ishuman(user))
|
|
var/mob/living/carbon/human/H = user
|
|
H.update_inv_l_hand()
|
|
H.update_inv_r_hand()
|
|
playsound(loc, extend_sound, 50, TRUE)
|
|
add_fingerprint(user)
|