mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-20 18:47:20 +01:00
246 lines
8.2 KiB
Plaintext
246 lines
8.2 KiB
Plaintext
/datum/martial_art
|
|
var/name = "Martial Art"
|
|
var/streak = ""
|
|
var/max_streak_length = 6
|
|
var/current_target = null
|
|
var/temporary = 0
|
|
var/datum/martial_art/base = null // The permanent style
|
|
var/deflection_chance = 0 //Chance to deflect projectiles
|
|
var/help_verb = null
|
|
|
|
/datum/martial_art/proc/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
|
|
return 0
|
|
|
|
/datum/martial_art/proc/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
|
|
return 0
|
|
|
|
/datum/martial_art/proc/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
|
|
return 0
|
|
|
|
/datum/martial_art/proc/help_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
|
|
return 0
|
|
|
|
/datum/martial_art/proc/add_to_streak(var/element,var/mob/living/carbon/human/D)
|
|
if(D != current_target)
|
|
current_target = D
|
|
streak = ""
|
|
streak = streak+element
|
|
if(length(streak) > max_streak_length)
|
|
streak = copytext(streak,2)
|
|
return
|
|
|
|
/datum/martial_art/proc/basic_hit(var/mob/living/carbon/human/A,var/mob/living/carbon/human/D)
|
|
|
|
A.do_attack_animation(D)
|
|
var/damage = rand(A.species.punchdamagelow, A.species.punchdamagehigh)
|
|
var/datum/unarmed_attack/attack = A.species.unarmed
|
|
|
|
var/atk_verb = "[pick(attack.attack_verb)]"
|
|
if(D.lying)
|
|
atk_verb = "kick"
|
|
|
|
if(!damage)
|
|
playsound(D.loc, attack.miss_sound, 25, 1, -1)
|
|
D.visible_message("<span class='warning'>[A] has attempted to [atk_verb] [D]!</span>")
|
|
return 0
|
|
|
|
var/obj/item/organ/external/affecting = D.get_organ(ran_zone(A.zone_sel.selecting))
|
|
var/armor_block = D.run_armor_check(affecting, "melee")
|
|
|
|
playsound(D.loc, attack.attack_sound, 25, 1, -1)
|
|
D.visible_message("<span class='danger'>[A] has [atk_verb]ed [D]!</span>", \
|
|
"<span class='userdanger'>[A] has [atk_verb]ed [D]!</span>")
|
|
|
|
D.apply_damage(damage, BRUTE, affecting, armor_block)
|
|
|
|
add_logs(A, D, "punched")
|
|
|
|
if((D.stat != DEAD) && damage >= A.species.punchstunthreshold)
|
|
D.visible_message("<span class='danger'>[A] has weakened [D]!!</span>", \
|
|
"<span class='userdanger'>[A] has weakened [D]!</span>")
|
|
D.apply_effect(4, WEAKEN, armor_block)
|
|
D.forcesay(hit_appends)
|
|
else if(D.lying)
|
|
D.forcesay(hit_appends)
|
|
return 1
|
|
|
|
/datum/martial_art/proc/teach(var/mob/living/carbon/human/H,var/make_temporary=0)
|
|
if(help_verb)
|
|
H.verbs += help_verb
|
|
if(make_temporary)
|
|
temporary = 1
|
|
if(temporary)
|
|
if(H.martial_art)
|
|
base = H.martial_art.base
|
|
else
|
|
base = src
|
|
H.martial_art = src
|
|
|
|
/datum/martial_art/proc/remove(var/mob/living/carbon/human/H)
|
|
if(H.martial_art != src)
|
|
return
|
|
H.martial_art = base
|
|
if(help_verb)
|
|
H.verbs -= help_verb
|
|
|
|
//ITEMS
|
|
|
|
/obj/item/clothing/gloves/boxing
|
|
var/datum/martial_art/boxing/style = new
|
|
|
|
/obj/item/clothing/gloves/boxing/equipped(mob/user, slot)
|
|
if(!ishuman(user))
|
|
return
|
|
if(slot == slot_gloves)
|
|
var/mob/living/carbon/human/H = user
|
|
style.teach(H,1)
|
|
return
|
|
|
|
/obj/item/clothing/gloves/boxing/dropped(mob/user)
|
|
if(!ishuman(user))
|
|
return
|
|
var/mob/living/carbon/human/H = user
|
|
if(H.get_item_by_slot(slot_gloves) == src)
|
|
style.remove(H)
|
|
return
|
|
|
|
/obj/item/weapon/storage/belt/champion/wrestling
|
|
name = "Wrestling Belt"
|
|
var/datum/martial_art/wrestling/style = new
|
|
|
|
/obj/item/weapon/storage/belt/champion/wrestling/equipped(mob/user, slot)
|
|
if(!ishuman(user))
|
|
return
|
|
if(slot == slot_belt)
|
|
var/mob/living/carbon/human/H = user
|
|
style.teach(H,1)
|
|
to_chat(user, "<span class='sciradio'>You have an urge to flex your muscles and get into a fight. You have the knowledge of a thousand wrestlers before you. You can remember more by using the Recall teaching verb in the wrestling tab.</span>")
|
|
return
|
|
|
|
/obj/item/weapon/storage/belt/champion/wrestling/dropped(mob/user)
|
|
if(!ishuman(user))
|
|
return
|
|
var/mob/living/carbon/human/H = user
|
|
if(H.get_item_by_slot(slot_belt) == src)
|
|
style.remove(H)
|
|
to_chat(user, "<span class='sciradio'>You no longer have an urge to flex your muscles.</span>")
|
|
return
|
|
|
|
/obj/item/weapon/plasma_fist_scroll
|
|
name = "frayed scroll"
|
|
desc = "An aged and frayed scrap of paper written in shifting runes. There are hand-drawn illustrations of pugilism."
|
|
icon = 'icons/obj/wizard.dmi'
|
|
icon_state ="scroll2"
|
|
var/used = 0
|
|
|
|
/obj/item/weapon/plasma_fist_scroll/attack_self(mob/user as mob)
|
|
if(!ishuman(user))
|
|
return
|
|
if(!used)
|
|
var/mob/living/carbon/human/H = user
|
|
var/datum/martial_art/plasma_fist/F = new/datum/martial_art/plasma_fist(null)
|
|
F.teach(H)
|
|
to_chat(H, "<span class='boldannounce'>You have learned the ancient martial art of Plasma Fist.</span>")
|
|
used = 1
|
|
desc = "It's completely blank."
|
|
name = "empty scroll"
|
|
icon_state = "blankscroll"
|
|
|
|
/obj/item/weapon/sleeping_carp_scroll
|
|
name = "mysterious scroll"
|
|
desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art."
|
|
icon = 'icons/obj/wizard.dmi'
|
|
icon_state = "scroll2"
|
|
|
|
/obj/item/weapon/sleeping_carp_scroll/attack_self(mob/living/carbon/human/user as mob)
|
|
if(!istype(user) || !user)
|
|
return
|
|
to_chat(user, "<span class='sciradio'>You have learned the ancient martial art of the Sleeping Carp! \
|
|
Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles directed toward you. \
|
|
However, you are also unable to use any ranged weaponry. \
|
|
You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab.</span>")
|
|
|
|
|
|
var/datum/martial_art/the_sleeping_carp/theSleepingCarp = new(null)
|
|
theSleepingCarp.teach(user)
|
|
user.drop_item()
|
|
visible_message("<span class='warning'>[src] lights up in fire and quickly burns to ash.</span>")
|
|
new /obj/effect/decal/cleanable/ash(get_turf(src))
|
|
qdel(src)
|
|
|
|
/obj/item/weapon/twohanded/bostaff
|
|
name = "bo staff"
|
|
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate."
|
|
force = 10
|
|
w_class = 4
|
|
slot_flags = SLOT_BACK
|
|
force_unwielded = 10
|
|
force_wielded = 24
|
|
throwforce = 20
|
|
throw_speed = 2
|
|
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
|
|
icon = 'icons/obj/weapons.dmi'
|
|
icon_state = "bostaff0"
|
|
block_chance = 50
|
|
|
|
/obj/item/weapon/twohanded/bostaff/update_icon()
|
|
icon_state = "bostaff[wielded]"
|
|
return
|
|
|
|
/obj/item/weapon/twohanded/bostaff/attack(mob/target, mob/living/user)
|
|
add_fingerprint(user)
|
|
if((CLUMSY in user.disabilities) && prob(50))
|
|
to_chat(user, "<span class ='warning'>You club yourself over the head with [src].</span>")
|
|
user.Weaken(3)
|
|
if(ishuman(user))
|
|
var/mob/living/carbon/human/H = user
|
|
H.apply_damage(2*force, BRUTE, "head")
|
|
else
|
|
user.take_organ_damage(2*force)
|
|
return
|
|
if(isrobot(target))
|
|
return ..()
|
|
if(!isliving(target))
|
|
return ..()
|
|
var/mob/living/carbon/C = target
|
|
if(C.stat)
|
|
to_chat(user, "<span class='warning'>It would be dishonorable to attack a foe while they cannot retaliate.</span>")
|
|
return
|
|
switch(user.a_intent)
|
|
if("disarm")
|
|
if(!wielded)
|
|
return ..()
|
|
if(!ishuman(target))
|
|
return ..()
|
|
var/mob/living/carbon/human/H = target
|
|
var/list/fluffmessages = list("[user] clubs [H] with [src]!", \
|
|
"[user] smacks [H] with the butt of [src]!", \
|
|
"[user] broadsides [H] with [src]!", \
|
|
"[user] smashes [H]'s head with [src]!", \
|
|
"[user] beats [H] with front of [src]!", \
|
|
"[user] twirls and slams [H] with [src]!")
|
|
H.visible_message("<span class='warning'>[pick(fluffmessages)]</span>", \
|
|
"<span class='userdanger'>[pick(fluffmessages)]</span>")
|
|
playsound(get_turf(user), 'sound/effects/woodhit.ogg', 75, 1, -1)
|
|
H.adjustStaminaLoss(rand(13,20))
|
|
if(prob(10))
|
|
H.visible_message("<span class='warning'>[H] collapses!</span>", \
|
|
"<span class='userdanger'>Your legs give out!</span>")
|
|
H.Weaken(4)
|
|
if(H.staminaloss && !H.sleeping)
|
|
var/total_health = (H.health - H.staminaloss)
|
|
if(total_health <= config.health_threshold_crit && !H.stat)
|
|
H.visible_message("<span class='warning'>[user] delivers a heavy hit to [H]'s head, knocking them out cold!</span>", \
|
|
"<span class='userdanger'>[user] knocks you unconscious!</span>")
|
|
H.SetSleeping(30)
|
|
H.adjustBrainLoss(25)
|
|
return
|
|
else
|
|
return ..()
|
|
return ..()
|
|
|
|
/obj/item/weapon/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
|
|
if(wielded)
|
|
return ..()
|
|
return 0
|