Merge pull request #812 from TheDZD/punch-me-i-dare-you

Martial Arts Port from /tg/
This commit is contained in:
Fox-McCloud
2015-04-16 00:18:02 -04:00
6 changed files with 455 additions and 161 deletions
@@ -1,6 +1,6 @@
/mob/living/carbon/alien/hitby(atom/movable/AM)
..(AM, 1)
/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other.
As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble.
In all, this is a lot like the monkey code. /N
@@ -25,23 +25,8 @@ In all, this is a lot like the monkey code. /N
visible_message("<span class='notice'>[M.name] nuzzles [src] trying to wake it up!</span>")
if ("grab")
if (M == src || anchored)
return
if (!(status_flags & CANPUSH))
return
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
M.put_in_active_hand(G)
grabbed_by += G
G.synch()
LAssailant = M
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("\red [] has grabbed [] passively!", M, src), 1)
src.grabbedby(M)
return 1
else
if (health > 0)
@@ -69,23 +54,7 @@ In all, this is a lot like the monkey code. /N
if("help")
help_shake_act(M)
if("grab")
if (M == src || anchored)
return
if (!(status_flags & CANPUSH))
return
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
M.put_in_active_hand(G)
grabbed_by += G
G.synch()
LAssailant = M
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("\red [] has grabbed [] passively!", M, src), 1)
src.grabbedby(M)
if ("harm", "disarm")
return 1
return 0
@@ -53,6 +53,8 @@
// log_debug("No gloves, [M] is truing to infect [src]")
M.spread_disease_to(src, "Contact")
var/datum/martial_art/attacker_style = M.martial_art
switch(M.a_intent)
if("help")
if(health >= config.health_threshold_crit)
@@ -81,149 +83,142 @@
return 1
if("grab")
if(M == src || anchored)
return 0
if(w_uniform)
w_uniform.add_fingerprint(M)
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src)
if(buckled)
M << "<span class='notice'>You cannot grab [src], \he is buckled in!</span>"
if(!G) //the grab will delete itself in New if affecting is anchored
return
M.put_in_active_hand(G)
grabbed_by += G
G.synch()
LAssailant = M
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
visible_message("<span class='warning'>[M] has grabbed [src] passively!</span>")
add_logs(src, M, "grabbed", addition="passively")
return 1
if(attacker_style && attacker_style.grab_act(H, src))
return 1
else
src.grabbedby(M)
return 1
if("harm")
var/datum/unarmed_attack/attack = M.species.unarmed
//Vampire code
if(M.zone_sel && M.zone_sel.selecting == "head" && src != M)
if(M.mind && M.mind.vampire && (M.mind in ticker.mode.vampires) && !M.mind.vampire.draining)
if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH)))
M << "\red Remove their mask!"
return 0
if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))
M << "\red Remove your mask!"
return 0
if(mind && mind.vampire && (mind in ticker.mode.vampires))
M << "\red Your fangs fail to pierce [src.name]'s cold flesh"
return 0
if(SKELETON in mutations)
M << "\red There is no blood in a skeleton!"
return 0
//we're good to suck the blood, blaah
M.handle_bloodsucking(src)
add_logs(src, M, "vampirebit")
message_admins("[M.name] ([M.ckey]) vampirebit [src.name] ([src.ckey])")
return
//end vampire codes
M.do_attack_animation(src)
add_logs(src, M, "[pick(attack.attack_verb)]ed")
if(!iscarbon(M))
LAssailant = null
if(attacker_style && attacker_style.harm_act(H, src))
return 1
else
LAssailant = M
var/datum/unarmed_attack/attack = M.species.unarmed
var/damage = rand(0, M.species.max_hurt_damage)//BS12 EDIT
if(!damage)
playsound(loc, attack.miss_sound, 25, 1, -1)
visible_message("\red <B>[M] tried to [pick(attack.attack_verb)] [src]!</B>")
return 0
//Vampire code
if(M.zone_sel && M.zone_sel.selecting == "head" && src != M)
if(M.mind && M.mind.vampire && (M.mind in ticker.mode.vampires) && !M.mind.vampire.draining)
if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH)))
M << "\red Remove their mask!"
return 0
if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))
M << "\red Remove your mask!"
return 0
if(mind && mind.vampire && (mind in ticker.mode.vampires))
M << "\red Your fangs fail to pierce [src.name]'s cold flesh"
return 0
if(SKELETON in mutations)
M << "\red There is no blood in a skeleton!"
return 0
//we're good to suck the blood, blaah
M.handle_bloodsucking(src)
add_logs(src, M, "vampirebit")
message_admins("[M.name] ([M.ckey]) vampirebit [src.name] ([src.ckey])")
return
//end vampire codes
M.do_attack_animation(src)
add_logs(src, M, "[pick(attack.attack_verb)]ed")
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/armor_block = run_armor_check(affecting, "melee")
if(HULK in M.mutations)
damage += 5
Weaken(4)
playsound(loc, attack.attack_sound, 25, 1, -1)
visible_message("\red <B>[M] [pick(attack.attack_verb)]ed [src]!</B>")
damage += attack.damage
apply_damage(damage, BRUTE, affecting, armor_block, sharp=attack.sharp, edge=attack.edge) //moving this back here means Armalis are going to knock you down 70% of the time, but they're pure adminbus anyway.
if((stat != DEAD) && damage >= 9)
visible_message("<span class='danger'>[M] has weakened [src]!</span>", \
"<span class='userdanger'>[M] has weakened [src]!</span>")
apply_effect(4, WEAKEN, armor_block)
forcesay(hit_appends)
else if(lying)
forcesay(hit_appends)
if("disarm")
add_logs(src, M, "disarmed")
if(w_uniform)
w_uniform.add_fingerprint(M)
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/randn = rand(1, 100)
if (randn <= 25)
apply_effect(2, WEAKEN, run_armor_check(affecting, "melee"))
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
visible_message("\red <B>[M] has pushed [src]!</B>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Pushed [src.name] ([src.ckey])</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been pushed by [M.name] ([M.ckey])</font>")
if(!iscarbon(M))
LAssailant = null
else
LAssailant = M
log_attack("[M.name] ([M.ckey]) pushed [src.name] ([src.ckey])")
return
var/damage = rand(0, M.species.max_hurt_damage)//BS12 EDIT
if(!damage)
playsound(loc, attack.miss_sound, 25, 1, -1)
visible_message("\red <B>[M] tried to [pick(attack.attack_verb)] [src]!</B>")
return 0
/* if(randn <= 45 && !lying)
if(head)
var/obj/item/clothing/head/H = head
if(!istype(H) || prob(H.loose))
if(unEquip(H))
if(prob(60))
step_away(H,M)
visible_message("<span class='warning'>[M] has knocked [src]'s [H] off!</span>",
"<span class='warning'>[M] knocked \the [H] clean off your head!</span>") */
var/talked = 0 // BubbleWrap
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/armor_block = run_armor_check(affecting, "melee")
if(randn <= 60)
//BubbleWrap: Disarming breaks a pull
if(pulling)
visible_message("\red <b>[M] has broken [src]'s grip on [pulling]!</B>")
talked = 1
stop_pulling()
if(HULK in M.mutations)
damage += 5
Weaken(4)
//BubbleWrap: Disarming also breaks a grab - this will also stop someone being choked, won't it?
if(istype(l_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/lgrab = l_hand
if(lgrab.affecting)
visible_message("\red <b>[M] has broken [src]'s grip on [lgrab.affecting]!</B>")
playsound(loc, attack.attack_sound, 25, 1, -1)
visible_message("\red <B>[M] [pick(attack.attack_verb)]ed [src]!</B>")
damage += attack.damage
apply_damage(damage, BRUTE, affecting, armor_block, sharp=attack.sharp, edge=attack.edge) //moving this back here means Armalis are going to knock you down 70% of the time, but they're pure adminbus anyway.
if((stat != DEAD) && damage >= 9)
visible_message("<span class='danger'>[M] has weakened [src]!</span>", \
"<span class='userdanger'>[M] has weakened [src]!</span>")
apply_effect(4, WEAKEN, armor_block)
forcesay(hit_appends)
else if(lying)
forcesay(hit_appends)
if("disarm")
if(attacker_style && attacker_style.disarm_act(H, src))
return 1
else
add_logs(src, M, "disarmed")
if(w_uniform)
w_uniform.add_fingerprint(M)
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/randn = rand(1, 100)
if (randn <= 25)
apply_effect(2, WEAKEN, run_armor_check(affecting, "melee"))
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
visible_message("\red <B>[M] has pushed [src]!</B>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Pushed [src.name] ([src.ckey])</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been pushed by [M.name] ([M.ckey])</font>")
if(!iscarbon(M))
LAssailant = null
else
LAssailant = M
log_attack("[M.name] ([M.ckey]) pushed [src.name] ([src.ckey])")
return
/* if(randn <= 45 && !lying)
if(head)
var/obj/item/clothing/head/H = head
if(!istype(H) || prob(H.loose))
if(unEquip(H))
if(prob(60))
step_away(H,M)
visible_message("<span class='warning'>[M] has knocked [src]'s [H] off!</span>",
"<span class='warning'>[M] knocked \the [H] clean off your head!</span>") */
var/talked = 0 // BubbleWrap
if(randn <= 60)
//BubbleWrap: Disarming breaks a pull
if(pulling)
visible_message("\red <b>[M] has broken [src]'s grip on [pulling]!</B>")
talked = 1
spawn(1)
del(lgrab)
if(istype(r_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/rgrab = r_hand
if(rgrab.affecting)
visible_message("\red <b>[M] has broken [src]'s grip on [rgrab.affecting]!</B>")
talked = 1
spawn(1)
del(rgrab)
//End BubbleWrap
stop_pulling()
if(!talked) //BubbleWrap
if(drop_item())
visible_message("\red <B>[M] has disarmed [src]!</B>")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
return
//BubbleWrap: Disarming also breaks a grab - this will also stop someone being choked, won't it?
if(istype(l_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/lgrab = l_hand
if(lgrab.affecting)
visible_message("\red <b>[M] has broken [src]'s grip on [lgrab.affecting]!</B>")
talked = 1
spawn(1)
del(lgrab)
if(istype(r_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/rgrab = r_hand
if(rgrab.affecting)
visible_message("\red <b>[M] has broken [src]'s grip on [rgrab.affecting]!</B>")
talked = 1
spawn(1)
del(rgrab)
//End BubbleWrap
if(!talked) //BubbleWrap
if(drop_item())
visible_message("\red <B>[M] has disarmed [src]!</B>")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
return
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
@@ -55,6 +55,8 @@
var/speech_problem_flag = 0
var/datum/martial_art/martial_art = null
var/miming = null //Toggle for the mime's abilities.
var/special_voice = "" // For changing our voice. Used by a symptom.
var/said_last_words=0
+21
View File
@@ -257,3 +257,24 @@
IgniteMob()
//Mobs on Fire end
/mob/living/proc/grabbedby(mob/living/carbon/user,var/supress_message = 0)
if(user == src || anchored)
return 0
if(!(status_flags & CANPUSH))
return 0
add_logs(user, src, "grabbed", addition="passively")
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(user, src)
if(buckled)
user << "<span class='notice'>You cannot grab [src], \he is buckled in!</span>"
if(!G) //the grab will delete itself in New if src is anchored
return 0
user.put_in_active_hand(G)
G.synch()
LAssailant = user
playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
if(!supress_message)
visible_message("<span class='warning'>[user] has grabbed [src] passively!</span>")