mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
Merge remote-tracking branch 'origin/master' into luciee
This commit is contained in:
@@ -58,9 +58,8 @@
|
||||
/turf/open/floor/wood,
|
||||
/area/ruin/powered)
|
||||
"aF" = (
|
||||
/obj/item/reagent_containers/glass/bottle/potass_iodide{
|
||||
/obj/item/reagent_containers/glass/bottle/radaway{
|
||||
desc = "War. War never changes. But this can take away your radiation problems!";
|
||||
name = "rad-away"
|
||||
},
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -362,7 +362,7 @@
|
||||
/obj/effect/decal/cleanable/cobweb,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/closed/wall,
|
||||
/area/janitor)
|
||||
/area/maintenance/starboard)
|
||||
"aaW" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -888,7 +888,7 @@
|
||||
"acd" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/closed/wall,
|
||||
/area/janitor)
|
||||
/area/maintenance/starboard)
|
||||
"ace" = (
|
||||
/obj/machinery/vending/sustenance{
|
||||
desc = "A vending machine normally reserved for work camps.";
|
||||
@@ -25062,10 +25062,10 @@
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
dir = 8
|
||||
},
|
||||
/mob/living/simple_animal/bot/floorbot,
|
||||
/obj/structure/cable{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/mob/living/simple_animal/bot/floorbot,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/turret_protected/aisat_interior)
|
||||
"bbA" = (
|
||||
@@ -26518,13 +26518,13 @@
|
||||
dir = 8;
|
||||
pixel_x = 26
|
||||
},
|
||||
/mob/living/simple_animal/bot/cleanbot,
|
||||
/obj/structure/cable{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-4"
|
||||
},
|
||||
/mob/living/simple_animal/bot/cleanbot,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/turret_protected/aisat_interior)
|
||||
"bfa" = (
|
||||
@@ -82818,7 +82818,6 @@
|
||||
/obj/machinery/atmospherics/pipe/manifold/yellow/hidden{
|
||||
dir = 8
|
||||
},
|
||||
/mob/living/simple_animal/bot/secbot/pingsky,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
|
||||
dir = 4
|
||||
},
|
||||
@@ -82828,6 +82827,7 @@
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/mob/living/simple_animal/bot/secbot/pingsky,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/ai_monitored/turret_protected/aisat_interior)
|
||||
"wMY" = (
|
||||
@@ -121459,7 +121459,7 @@ jqY
|
||||
alq
|
||||
hUl
|
||||
wqc
|
||||
bcd
|
||||
alq
|
||||
xLF
|
||||
xLF
|
||||
xLF
|
||||
@@ -121716,7 +121716,7 @@ bvx
|
||||
alq
|
||||
hUl
|
||||
alq
|
||||
bcd
|
||||
alq
|
||||
dvg
|
||||
dvg
|
||||
wPs
|
||||
@@ -121973,7 +121973,7 @@ bvy
|
||||
alq
|
||||
pHp
|
||||
vbc
|
||||
bcd
|
||||
alq
|
||||
dvg
|
||||
dvg
|
||||
dvg
|
||||
@@ -122230,7 +122230,7 @@ nFy
|
||||
sZb
|
||||
joF
|
||||
apc
|
||||
bcd
|
||||
alq
|
||||
dvg
|
||||
dvg
|
||||
dvg
|
||||
@@ -122487,7 +122487,7 @@ ukn
|
||||
jka
|
||||
xAq
|
||||
jNW
|
||||
bcd
|
||||
alq
|
||||
dvg
|
||||
dvg
|
||||
dvg
|
||||
@@ -122744,7 +122744,7 @@ acd
|
||||
acd
|
||||
acd
|
||||
acd
|
||||
bcd
|
||||
alq
|
||||
dvg
|
||||
dvg
|
||||
dvg
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
span_userdanger("[A] slams you into the ground!"))
|
||||
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1) //using hit_kick because for some stupid reason slam.ogg is delayed
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_SMASH)
|
||||
D.apply_damage(15, STAMINA)
|
||||
D.apply_damage(A.dna.species.punchdamagehigh+5, STAMINA) //15 damage
|
||||
D.Paralyze(30)
|
||||
D.Knockdown(80)
|
||||
log_combat(A, D, "slammed (CQC)")
|
||||
@@ -110,7 +110,7 @@
|
||||
span_userdanger("[A] kicks you back!"))
|
||||
playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
|
||||
step(D, A.dir)
|
||||
D.apply_damage(15, STAMINA)
|
||||
D.apply_damage(A.dna.species.punchdamagehigh+5, STAMINA) //15 damage
|
||||
log_combat(A, D, "kicked (CQC)")
|
||||
D.add_movespeed_modifier(MOVESPEED_ID_SHOVE, multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH)
|
||||
addtimer(CALLBACK(D, /mob/living/carbon/human/proc/clear_shove_slowdown), SHOVE_SLOWDOWN_LENGTH)
|
||||
@@ -119,8 +119,9 @@
|
||||
D.visible_message(span_warning("[A] firmly kicks [D] in the abdomen!"), \
|
||||
span_userdanger("[A] kicks you in the abdomen!"))
|
||||
playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1)
|
||||
var/kickdamage = A.dna.species.punchdamagehigh * 2 + 20 //40 damage
|
||||
D.Paralyze(5)
|
||||
D.apply_damage(40, STAMINA)
|
||||
D.apply_damage(kickdamage, STAMINA)
|
||||
D.silent += 2
|
||||
return TRUE
|
||||
|
||||
@@ -145,7 +146,7 @@
|
||||
D.visible_message(span_warning("[A] dislocates [D]'s [hit_limb]!"), \
|
||||
"<span class = 'userdanger'>[A] dislocates your [hit_limb]!</span>")
|
||||
D.drop_all_held_items()
|
||||
D.apply_damage(50, STAMINA, selected_zone)
|
||||
D.apply_damage(50, STAMINA, selected_zone) //not based on species damage since this should just disable the limb outright anyways, which caps at 50 damage
|
||||
playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
|
||||
return TRUE
|
||||
|
||||
@@ -182,13 +183,14 @@
|
||||
return FALSE
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
|
||||
if(D.mobility_flags & MOBILITY_STAND)
|
||||
var/consecutivedamage = A.dna.species.punchdamagehigh * 1.5 + 10 //25 damage
|
||||
log_combat(A, D, "consecutive CQC'd (CQC)")
|
||||
D.visible_message(span_warning("[A] delivers a firm blow to [D]'s head, knocking them down!"), \
|
||||
span_userdanger("[A] delivers a firm blow to your head, causing you to fall over!"))
|
||||
playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1)
|
||||
D.Paralyze(50)
|
||||
D.Knockdown(100)
|
||||
D.apply_damage(25, STAMINA)
|
||||
D.apply_damage(consecutivedamage, STAMINA)
|
||||
return TRUE
|
||||
|
||||
///CQC grab, stuns for 1.5 seconds on use
|
||||
@@ -215,7 +217,7 @@
|
||||
log_combat(A, D, "attacked (CQC)")
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
|
||||
var/picked_hit_type = pick("CQC'd", "Big Bossed")
|
||||
var/bonus_damage = 15
|
||||
var/bonus_damage = A.dna.species.punchdamagehigh + 5 //15 damage
|
||||
D.apply_damage(bonus_damage, STAMINA)
|
||||
playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
|
||||
D.visible_message(span_danger("[A] [picked_hit_type] [D]!"), \
|
||||
@@ -251,7 +253,7 @@
|
||||
if(I && D.temporarilyRemoveItemFromInventory(I))
|
||||
A.put_in_hands(I)
|
||||
D.Jitter(2)
|
||||
D.apply_damage(5, STAMINA)
|
||||
D.apply_damage(A.dna.species.punchdamagehigh/2, STAMINA) //5 damage
|
||||
else
|
||||
D.visible_message(span_danger("[A] grabs at [D]'s arm, but misses!"), \
|
||||
span_userdanger("[A] grabs at your arm, but misses!"))
|
||||
|
||||
@@ -38,10 +38,11 @@
|
||||
var/selected_zone = A.zone_selected
|
||||
var/obj/item/bodypart/affecting = D.get_bodypart(check_zone(A.zone_selected))
|
||||
var/armor_block = D.run_armor_check(affecting, "melee", armour_penetration = 50)
|
||||
var/slam_staminadamage = A.dna.species.punchdamagehigh * 1.5 + 10 //25 damage
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_DISARM)
|
||||
playsound(D, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
|
||||
D.apply_damage(25, STAMINA, selected_zone, armor_block)
|
||||
D.apply_damage(15, A.dna.species.attack_type, selected_zone, armor_block)
|
||||
D.apply_damage(slam_staminadamage, STAMINA, selected_zone, armor_block)
|
||||
D.apply_damage(A.dna.species.punchdamagehigh + 5, A.dna.species.attack_type, selected_zone, armor_block) //15 damage
|
||||
D.visible_message(span_danger("[A] slams into [D], knocking them off balance!"), \
|
||||
span_userdanger("[A] slams into you, knocking you off balance!"))
|
||||
D.add_movespeed_modifier("tail slap", update=TRUE, priority=101, multiplicative_slowdown=0.9)
|
||||
@@ -70,9 +71,10 @@
|
||||
var/selected_zone = A.zone_selected
|
||||
var/obj/item/bodypart/affecting = D.get_bodypart(check_zone(A.zone_selected))
|
||||
var/armor_block = D.run_armor_check(affecting, "melee", armour_penetration = 50)
|
||||
var/slap_staminadamage = A.dna.species.punchdamagehigh * 1.5 + 10 //25 damage
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_SMASH)
|
||||
D.apply_damage(25, STAMINA, selected_zone, armor_block)
|
||||
D.apply_damage(10, A.dna.species.attack_type, selected_zone, armor_block)
|
||||
D.apply_damage(slap_staminadamage, STAMINA, selected_zone, armor_block)
|
||||
D.apply_damage(A.dna.species.punchdamagehigh, A.dna.species.attack_type, selected_zone, armor_block) //10 damage
|
||||
D.Knockdown(5 SECONDS)
|
||||
D.Paralyze(2 SECONDS)
|
||||
D.visible_message(span_danger("[A] tail slaps [D]!"), \
|
||||
@@ -89,9 +91,10 @@
|
||||
return harm_act(A,D)
|
||||
var/obj/item/bodypart/affecting = D.get_bodypart(check_zone(BODY_ZONE_HEAD))
|
||||
var/armor_block = D.run_armor_check(affecting, "melee", 30)
|
||||
var/chomp_damage = A.dna.species.punchdamagehigh * 2 + 10 //30 damage
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_BITE)
|
||||
playsound(D, 'sound/weapons/bite.ogg', 50, TRUE, -1)
|
||||
D.apply_damage(30, A.dna.species.attack_type, BODY_ZONE_HEAD, armor_block, sharpness = SHARP_EDGED)
|
||||
D.apply_damage(chomp_damage, A.dna.species.attack_type, BODY_ZONE_HEAD, armor_block, sharpness = SHARP_EDGED)
|
||||
// D.bleed_rate += 10
|
||||
D.visible_message(span_danger("[A] takes a large bite out of [D]'s neck!"), \
|
||||
span_userdanger("[A] takes a large bite out of your neck!"))
|
||||
@@ -114,10 +117,11 @@
|
||||
return
|
||||
var/obj/item/bodypart/affecting = D.get_bodypart(check_zone(BODY_ZONE_HEAD))
|
||||
var/armor_block = D.run_armor_check(affecting, "melee")
|
||||
var/disarm_damage = A.dna.species.punchdamagehigh / 2 //5 damage
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_SMASH)
|
||||
playsound(D, 'sound/weapons/genhit1.ogg', 50, TRUE, -1)
|
||||
D.apply_damage(5, STAMINA, BODY_ZONE_HEAD, armor_block)
|
||||
D.apply_damage(5, A.dna.species.attack_type, BODY_ZONE_HEAD, armor_block)
|
||||
D.apply_damage(disarm_damage, STAMINA, BODY_ZONE_HEAD, armor_block)
|
||||
D.apply_damage(disarm_damage, A.dna.species.attack_type, BODY_ZONE_HEAD, armor_block)
|
||||
D.blur_eyes(4)
|
||||
if(!istype(D.head, /obj/item/clothing/head/helmet))
|
||||
ADD_TRAIT(D, TRAIT_POOR_AIM, "martial")
|
||||
@@ -143,7 +147,7 @@
|
||||
var/armor_block = D.run_armor_check(affecting, "melee", 10)
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_CLAW)
|
||||
playsound(D, 'sound/weapons/slash.ogg', 50, TRUE, -1)
|
||||
D.apply_damage(12, A.dna.species.attack_type, selected_zone, armor_block) //need wounds for sharpness to actually matter here
|
||||
D.apply_damage(A.dna.species.punchdamagehigh + 2, A.dna.species.attack_type, selected_zone, armor_block, sharpness = SHARP_EDGED) //+2 unarmed damage and sharp
|
||||
var/atk_verb = pick("rends", "claws", "slices", "tears at")
|
||||
D.visible_message(span_danger("[A] [atk_verb] [D]!"), \
|
||||
span_userdanger("[A] [atk_verb] you!"))
|
||||
|
||||
@@ -12,192 +12,195 @@
|
||||
allow_temp_override = TRUE
|
||||
var/old_grab_state = null
|
||||
|
||||
/datum/martial_art/hunterfu/proc/check_streak(mob/living/user, mob/living/target)
|
||||
/datum/martial_art/hunterfu/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(findtext(streak, BODYSLAM_COMBO))
|
||||
streak = ""
|
||||
body_slam(user, target)
|
||||
body_slam(A, D)
|
||||
return TRUE
|
||||
if(findtext(streak, STAKESTAB_COMBO))
|
||||
streak = ""
|
||||
stake_stab(user, target)
|
||||
stake_stab(A, D)
|
||||
return TRUE
|
||||
if(findtext(streak, NECKSNAP_COMBO))
|
||||
streak = ""
|
||||
neck_snap(user, target)
|
||||
neck_snap(A, D)
|
||||
return TRUE
|
||||
if(findtext(streak, HOLYKICK_COMBO))
|
||||
streak = ""
|
||||
holy_kick(user, target)
|
||||
holy_kick(A, D)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/martial_art/hunterfu/proc/body_slam(mob/living/user, mob/living/target)
|
||||
if(target.mobility_flags & MOBILITY_STAND)
|
||||
target.visible_message(
|
||||
span_danger("[user] slams both them and [target] into the ground!"),
|
||||
span_userdanger("You're slammed into the ground by [user]!"),
|
||||
/datum/martial_art/hunterfu/proc/body_slam(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(D.mobility_flags & MOBILITY_STAND)
|
||||
D.visible_message(
|
||||
span_danger("[A] slams both them and [D] into the ground!"),
|
||||
span_userdanger("You're slammed into the ground by [A]!"),
|
||||
span_hear("You hear a sickening sound of flesh hitting flesh!"),
|
||||
)
|
||||
to_chat(user, span_danger("You slam [target] into the ground!"))
|
||||
playsound(get_turf(user), 'sound/weapons/slam.ogg', 50, TRUE, -1)
|
||||
log_combat(user, target, "bodyslammed (Hunter-Fu)")
|
||||
if(!target.mind)
|
||||
target.Paralyze(40)
|
||||
user.Paralyze(25)
|
||||
to_chat(A, span_danger("You slam [D] into the ground!"))
|
||||
playsound(get_turf(A), 'sound/weapons/slam.ogg', 50, TRUE, -1)
|
||||
log_combat(A, D, "bodyslammed (Hunter-Fu)")
|
||||
if(!D.mind)
|
||||
D.Paralyze(40)
|
||||
A.Paralyze(25)
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/changeling))
|
||||
to_chat(target, span_cultlarge("Our DNA shakes as we are body slammed!"))
|
||||
target.apply_damage(15, BRUTE)
|
||||
target.Paralyze(60)
|
||||
user.Paralyze(25)
|
||||
if(D.mind.has_antag_datum(/datum/antagonist/changeling))
|
||||
to_chat(D, span_cultlarge("Our DNA shakes as we are body slammed!"))
|
||||
D.apply_damage(A.dna.species.punchdamagehigh + 5, BRUTE) //15 damage
|
||||
D.Paralyze(60)
|
||||
A.Paralyze(25)
|
||||
return TRUE
|
||||
else
|
||||
target.Paralyze(40)
|
||||
user.Paralyze(25)
|
||||
D.Paralyze(40)
|
||||
A.Paralyze(25)
|
||||
else
|
||||
harm_act(user, target)
|
||||
harm_act(A, D)
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/hunterfu/proc/stake_stab(mob/living/user, mob/living/target)
|
||||
target.visible_message(
|
||||
span_danger("[user] stabs [target] in the heart!"),
|
||||
span_userdanger("You're staked in the heart by [user]!"),
|
||||
/datum/martial_art/hunterfu/proc/stake_stab(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
D.visible_message(
|
||||
span_danger("[A] stabs [D] in the heart!"),
|
||||
span_userdanger("You're staked in the heart by [A]!"),
|
||||
span_hear("You hear a sickening sound of flesh hitting flesh!"),
|
||||
)
|
||||
to_chat(user, span_danger("You stab [target] viciously!"))
|
||||
playsound(get_turf(user), 'sound/weapons/bladeslice.ogg', 50, TRUE, -1)
|
||||
log_combat(user, target, "stakestabbed (Hunter-Fu)")
|
||||
if(!target.mind)
|
||||
target.apply_damage(15, BRUTE, BODY_ZONE_CHEST)
|
||||
to_chat(A, span_danger("You stab [D] viciously!"))
|
||||
playsound(get_turf(A), 'sound/weapons/bladeslice.ogg', 50, TRUE, -1)
|
||||
log_combat(A, D, "stakestabbed (Hunter-Fu)")
|
||||
var/stake_damagehigh = A.dna.species.punchdamagehigh * 1.5 + 10 //25 damage
|
||||
if(!D.mind)
|
||||
D.apply_damage(A.dna.species.punchdamagehigh + 5, BRUTE, BODY_ZONE_CHEST) //15 damage
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/changeling))
|
||||
to_chat(target, span_danger("Their arm tears through our monstrous form!"))
|
||||
target.apply_damage(25, BRUTE, BODY_ZONE_CHEST)
|
||||
if(D.mind.has_antag_datum(/datum/antagonist/changeling))
|
||||
to_chat(D, span_danger("Their arm tears through our monstrous form!"))
|
||||
D.apply_damage(stake_damagehigh, BRUTE, BODY_ZONE_CHEST)
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/bloodsucker))
|
||||
to_chat(target, span_cultlarge("Their arm stakes straight into our undead flesh!"))
|
||||
target.apply_damage(20, BURN)
|
||||
target.apply_damage(10, BRUTE, BODY_ZONE_CHEST)
|
||||
if(D.mind.has_antag_datum(/datum/antagonist/bloodsucker))
|
||||
to_chat(D, span_cultlarge("Their arm stakes straight into our undead flesh!"))
|
||||
D.apply_damage(A.dna.species.punchdamagehigh + 10, BURN) //20 damage
|
||||
D.apply_damage(A.dna.species.punchdamagehigh, BRUTE, BODY_ZONE_CHEST) //10 damage
|
||||
return TRUE
|
||||
else
|
||||
target.apply_damage(15, BRUTE, BODY_ZONE_CHEST)
|
||||
D.apply_damage(A.dna.species.punchdamagehigh + 5, BRUTE, BODY_ZONE_CHEST) //15 damage
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/hunterfu/proc/neck_snap(mob/living/user, mob/living/target)
|
||||
if(!target.stat)
|
||||
target.visible_message(
|
||||
span_danger("[user] snapped [target]'s neck!"),
|
||||
span_userdanger("Your neck is snapped by [user]!"),
|
||||
/datum/martial_art/hunterfu/proc/neck_snap(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!D.stat)
|
||||
D.visible_message(
|
||||
span_danger("[A] snapped [D]'s neck!"),
|
||||
span_userdanger("Your neck is snapped by [A]!"),
|
||||
span_hear("You hear a snap!"),
|
||||
)
|
||||
to_chat(user, span_danger("You snap [target]'s neck!"))
|
||||
playsound(get_turf(user), 'sound/effects/snap.ogg', 50, TRUE, -1)
|
||||
log_combat(user, target, "neck snapped (Hunter-Fu)")
|
||||
if(!target.mind)
|
||||
target.SetSleeping(30)
|
||||
playsound(get_turf(user), 'sound/effects/snap.ogg', 50, TRUE, -1)
|
||||
log_combat(user, target, "neck snapped (Hunter-Fu)")
|
||||
to_chat(A, span_danger("You snap [D]'s neck!"))
|
||||
playsound(get_turf(A), 'sound/effects/snap.ogg', 50, TRUE, -1)
|
||||
log_combat(A, D, "neck snapped (Hunter-Fu)")
|
||||
if(!D.mind)
|
||||
D.SetSleeping(30)
|
||||
playsound(get_turf(A), 'sound/effects/snap.ogg', 50, TRUE, -1)
|
||||
log_combat(A, D, "neck snapped (Hunter-Fu)")
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/changeling))
|
||||
to_chat(target, span_warning("Our monstrous form protects us from being put to sleep!"))
|
||||
if(D.mind.has_antag_datum(/datum/antagonist/changeling))
|
||||
to_chat(D, span_warning("Our monstrous form protects us from being put to sleep!"))
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/heretic))
|
||||
to_chat(target, span_cultlarge("The power of the Codex Cicatrix flares as we are swiftly put to sleep!"))
|
||||
target.apply_damage(15, BRUTE, BODY_ZONE_HEAD)
|
||||
target.SetSleeping(40)
|
||||
if(D.mind.has_antag_datum(/datum/antagonist/heretic))
|
||||
to_chat(D, span_cultlarge("The power of the Codex Cicatrix flares as we are swiftly put to sleep!"))
|
||||
D.apply_damage(A.dna.species.punchdamagehigh + 5, BRUTE, BODY_ZONE_HEAD) //15 damage
|
||||
D.SetSleeping(40)
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/bloodsucker))
|
||||
to_chat(target, span_warning("Our undead form protects us from being put to sleep!"))
|
||||
if(D.mind.has_antag_datum(/datum/antagonist/bloodsucker))
|
||||
to_chat(D, span_warning("Our undead form protects us from being put to sleep!"))
|
||||
return TRUE
|
||||
else
|
||||
target.SetSleeping(30)
|
||||
D.SetSleeping(30)
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/hunterfu/proc/holy_kick(mob/living/user, mob/living/target)
|
||||
target.visible_message(
|
||||
span_warning("[user] kicks [target], splashing holy water in every direction!"),
|
||||
span_userdanger("You're kicked by [user], with holy water dripping down on you!"),
|
||||
/datum/martial_art/hunterfu/proc/holy_kick(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
D.visible_message(
|
||||
span_warning("[A] kicks [D], splashing holy water in every direction!"),
|
||||
span_userdanger("You're kicked by [A], with holy water dripping down on you!"),
|
||||
span_hear("You hear a sickening sound of flesh hitting flesh!"),
|
||||
)
|
||||
to_chat(user, span_danger("You holy kick [target]!"))
|
||||
playsound(get_turf(user), 'sound/weapons/slash.ogg', 50, TRUE, -1)
|
||||
log_combat(user, target, "holy kicked (Hunter-Fu)")
|
||||
if(!target.mind)
|
||||
target.apply_damage(60, STAMINA)
|
||||
target.Paralyze(20)
|
||||
to_chat(A, span_danger("You holy kick [D]!"))
|
||||
playsound(get_turf(A), 'sound/weapons/slash.ogg', 50, TRUE, -1)
|
||||
log_combat(A, D, "holy kicked (Hunter-Fu)")
|
||||
var/holykick_staminadamage = A.dna.species.punchdamagehigh * 3 + 30 //60 damage (holy shit)
|
||||
var/holykick_hereticburn = A.dna.species.punchdamagehigh * 1.5 + 10 //25 damage
|
||||
if(!D.mind)
|
||||
D.apply_damage(holykick_staminadamage, STAMINA)
|
||||
D.Paralyze(20)
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/heretic))
|
||||
to_chat(target, span_cultlarge("The holy water burns our flesh!"))
|
||||
target.apply_damage(25, BURN)
|
||||
target.apply_damage(60, STAMINA)
|
||||
target.Paralyze(20)
|
||||
if(D.mind.has_antag_datum(/datum/antagonist/heretic))
|
||||
to_chat(D, span_cultlarge("The holy water burns our flesh!"))
|
||||
D.apply_damage(holykick_hereticburn, BURN)
|
||||
D.apply_damage(holykick_staminadamage, STAMINA)
|
||||
D.Paralyze(20)
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/bloodsucker))
|
||||
to_chat(target, span_warning("This just seems like regular water..."))
|
||||
if(D.mind.has_antag_datum(/datum/antagonist/bloodsucker))
|
||||
to_chat(D, span_warning("This just seems like regular water..."))
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/cult))
|
||||
for(var/datum/action/innate/cult/blood_magic/BD in target.actions)
|
||||
to_chat(target, span_cultlarge("Our blood rites falter as the holy water drips onto our body!"))
|
||||
if(D.mind.has_antag_datum(/datum/antagonist/cult))
|
||||
for(var/datum/action/innate/cult/blood_magic/BD in D.actions)
|
||||
to_chat(D, span_cultlarge("Our blood rites falter as the holy water drips onto our body!"))
|
||||
for(var/datum/action/innate/cult/blood_spell/BS in BD.spells)
|
||||
qdel(BS)
|
||||
target.apply_damage(60, STAMINA)
|
||||
target.Paralyze(20)
|
||||
D.apply_damage(holykick_staminadamage, STAMINA)
|
||||
D.Paralyze(20)
|
||||
return TRUE
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/wizard) || (/datum/antagonist/wizard/apprentice))
|
||||
to_chat(target, span_danger("The holy water seems to be muting us somehow!"))
|
||||
var/mob/living/carbon/human/human_target = target // I guess monkey wizards aren't getting affected.
|
||||
if(human_target.silent <= 10)
|
||||
human_target.silent = clamp(human_target.silent + 10, 0, 10)
|
||||
target.apply_damage(60, STAMINA)
|
||||
target.Paralyze(20)
|
||||
if(D.mind.has_antag_datum(/datum/antagonist/wizard) || (/datum/antagonist/wizard/apprentice))
|
||||
to_chat(D, span_danger("The holy water seems to be muting us somehow!"))
|
||||
if(D.silent <= 10)
|
||||
D.silent = clamp(D.silent + 10, 0, 10)
|
||||
D.apply_damage(holykick_staminadamage, STAMINA)
|
||||
D.Paralyze(20)
|
||||
return TRUE
|
||||
else
|
||||
target.apply_damage(60, STAMINA)
|
||||
target.Paralyze(20)
|
||||
D.apply_damage(holykick_staminadamage, STAMINA)
|
||||
D.Paralyze(20)
|
||||
return TRUE
|
||||
|
||||
/// Intents
|
||||
/datum/martial_art/hunterfu/disarm_act(mob/living/user, mob/living/target)
|
||||
add_to_streak("D", target)
|
||||
if(check_streak(user, target))
|
||||
/datum/martial_art/hunterfu/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
add_to_streak("D", D)
|
||||
if(check_streak(A, D))
|
||||
return TRUE
|
||||
log_combat(user, target, "disarmed (Hunter-Fu)")
|
||||
log_combat(A, D, "disarmed (Hunter-Fu)")
|
||||
return ..()
|
||||
|
||||
/datum/martial_art/hunterfu/harm_act(mob/living/user, mob/living/target)
|
||||
add_to_streak("H", target)
|
||||
if(check_streak(user, target))
|
||||
/datum/martial_art/hunterfu/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
add_to_streak("H", D)
|
||||
if(check_streak(A, D))
|
||||
return TRUE
|
||||
var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(user.zone_selected))
|
||||
user.do_attack_animation(target, ATTACK_EFFECT_PUNCH)
|
||||
var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected))
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
|
||||
var/atk_verb = pick("kick", "chop", "hit", "slam")
|
||||
target.visible_message(
|
||||
span_danger("[user] [atk_verb]s [target]!"),
|
||||
span_userdanger("[user] [atk_verb]s you!"),
|
||||
var/harm_damage = A.dna.species.punchdamagehigh + rand(0,5) //10-15 damage
|
||||
D.visible_message(
|
||||
span_danger("[A] [atk_verb]s [D]!"),
|
||||
span_userdanger("[A] [atk_verb]s you!"),
|
||||
)
|
||||
to_chat(user, span_danger("You [atk_verb] [target]!"))
|
||||
target.apply_damage(rand(10,15), BRUTE, affecting, wound_bonus = CANT_WOUND)
|
||||
playsound(get_turf(target), 'sound/weapons/punch1.ogg', 25, TRUE, -1)
|
||||
log_combat(user, target, "harmed (Hunter-Fu)")
|
||||
to_chat(A, span_danger("You [atk_verb] [D]!"))
|
||||
D.apply_damage(harm_damage, BRUTE, affecting, wound_bonus = CANT_WOUND)
|
||||
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1)
|
||||
log_combat(A, D, "harmed (Hunter-Fu)")
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/hunterfu/grab_act(mob/living/user, mob/living/target)
|
||||
if(user!=target && can_use(user))
|
||||
add_to_streak("G", target)
|
||||
if(check_streak(user, target)) // If a combo is made no grab upgrade is done
|
||||
/datum/martial_art/hunterfu/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(A!=D && can_use(A))
|
||||
add_to_streak("G", D)
|
||||
if(check_streak(A, D)) // If a combo is made no grab upgrade is done
|
||||
return TRUE
|
||||
old_grab_state = user.grab_state
|
||||
target.grabbedby(user, 1)
|
||||
old_grab_state = A.grab_state
|
||||
D.grabbedby(A, 1)
|
||||
if(old_grab_state == GRAB_PASSIVE)
|
||||
target.drop_all_held_items()
|
||||
user.grab_state = GRAB_AGGRESSIVE // Instant agressive grab
|
||||
log_combat(user, target, "grabbed (Hunter-Fu)")
|
||||
target.visible_message(
|
||||
span_warning("[user] violently grabs [target]!"),
|
||||
span_userdanger("You're grabbed violently by [user]!"),
|
||||
D.drop_all_held_items()
|
||||
A.grab_state = GRAB_AGGRESSIVE // Instant agressive grab
|
||||
log_combat(A, D, "grabbed (Hunter-Fu)")
|
||||
D.visible_message(
|
||||
span_warning("[A] violently grabs [D]!"),
|
||||
span_userdanger("You're grabbed violently by [A]!"),
|
||||
span_hear("You hear sounds of aggressive fondling!"),
|
||||
)
|
||||
to_chat(user, span_danger("You violently grab [target]!"))
|
||||
to_chat(A, span_danger("You violently grab [D]!"))
|
||||
return TRUE
|
||||
..()
|
||||
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
D.visible_message(span_warning("[A] leg sweeps [D]!"), \
|
||||
span_userdanger("[A] leg sweeps you!"))
|
||||
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1)
|
||||
D.apply_damage(5, BRUTE)
|
||||
D.apply_damage(A.dna.species.punchdamagehigh / 2, BRUTE) //5 damage
|
||||
D.Paralyze(40)
|
||||
log_combat(A, D, "leg sweeped")
|
||||
return 1
|
||||
@@ -111,7 +111,7 @@
|
||||
D.visible_message(span_warning("[A] karate chops [D]'s neck!"), \
|
||||
span_userdanger("[A] karate chops your neck, rendering you unable to speak!"))
|
||||
playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, 1, -1)
|
||||
D.apply_damage(5, A.dna.species.attack_type)
|
||||
D.apply_damage(A.dna.species.punchdamagehigh / 2, A.dna.species.attack_type) //5 damage
|
||||
if(D.silent <= 10)
|
||||
D.silent = clamp(D.silent + 10, 0, 10)
|
||||
log_combat(A, D, "neck chopped")
|
||||
@@ -122,7 +122,7 @@
|
||||
return 1
|
||||
log_combat(A, D, "punched")
|
||||
var/picked_hit_type = pick("punches", "kicks")
|
||||
var/bonus_damage = 10
|
||||
var/bonus_damage = A.dna.species.punchdamagehigh //10 damage
|
||||
if(!(D.mobility_flags & MOBILITY_STAND))
|
||||
bonus_damage += 5
|
||||
picked_hit_type = "stomps on"
|
||||
|
||||
@@ -43,8 +43,9 @@
|
||||
D.visible_message(span_danger("[A] [atk_verb] [D]!"), \
|
||||
span_userdanger("[A] [atk_verb] you!"))
|
||||
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 40, 1, -1)
|
||||
D.apply_damage(rand(5,10), A.dna.species.attack_type, BODY_ZONE_HEAD)
|
||||
A.apply_damage(rand(5,10), A.dna.species.attack_type, BODY_ZONE_HEAD)
|
||||
var/headbutt_damage = rand(A.dna.species.punchdamagehigh - 5, A.dna.species.punchdamagehigh) //5-10 damage
|
||||
D.apply_damage(headbutt_damage, A.dna.species.attack_type, BODY_ZONE_HEAD)
|
||||
A.apply_damage(headbutt_damage, A.dna.species.attack_type, BODY_ZONE_HEAD)
|
||||
if(!istype(D.head,/obj/item/clothing/head/helmet/) && !istype(D.head,/obj/item/clothing/head/hardhat))
|
||||
D.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5)
|
||||
A.Stun(rand(10,45))
|
||||
@@ -52,9 +53,10 @@
|
||||
if(5,6)
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
|
||||
atk_verb = pick("punches", "kicks", "hits", "slams into")
|
||||
var/punch_damage = rand(A.dna.species.punchdamagehigh + 5 , 2 * A.dna.species.punchdamagehigh + 10) //15-30 damage
|
||||
D.visible_message(span_danger("[A] [atk_verb] [D] with inhuman strength, sending [D.p_them()] flying backwards!"), \
|
||||
span_userdanger("[A] [atk_verb] you with inhuman strength, sending you flying backwards!"))
|
||||
D.apply_damage(rand(15,30), A.dna.species.attack_type)
|
||||
D.apply_damage(punch_damage, A.dna.species.attack_type)
|
||||
playsound(get_turf(D), 'sound/effects/meteorimpact.ogg', 25, 1, -1)
|
||||
var/throwtarget = get_edge_target_turf(A, get_dir(A, get_step_away(D, A)))
|
||||
D.throw_at(throwtarget, 4, 2, A)//So stuff gets tossed around at the same time.
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
D.emote("scream")
|
||||
D.dropItemToGround(D.get_active_held_item())
|
||||
D.apply_damage(5, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM), wound_bonus = CANT_WOUND)
|
||||
D.apply_damage(A.dna.species.punchdamagehigh / 2, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM), wound_bonus = CANT_WOUND) //5 damage
|
||||
D.Stun(60)
|
||||
return TRUE
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
D.Stun(40)
|
||||
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
|
||||
return TRUE
|
||||
return basic_hit(A,D)
|
||||
return basic_hit(A,D)
|
||||
|
||||
/datum/martial_art/the_sleeping_carp/proc/headKick(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!D.stat && !D.IsParalyzed())
|
||||
@@ -88,7 +88,7 @@
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
|
||||
D.visible_message(span_warning("[A] kicks [D] in the head!"), \
|
||||
span_userdanger("[A] kicks you in the jaw!"))
|
||||
D.apply_damage(20, A.dna.species.attack_type, BODY_ZONE_HEAD, wound_bonus = CANT_WOUND)
|
||||
D.apply_damage(A.dna.species.punchdamagehigh + 10, A.dna.species.attack_type, BODY_ZONE_HEAD, wound_bonus = CANT_WOUND) //20 damage
|
||||
D.drop_all_held_items()
|
||||
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
|
||||
D.Stun(80)
|
||||
@@ -98,12 +98,13 @@
|
||||
/datum/martial_art/the_sleeping_carp/proc/elbowDrop(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!(D.mobility_flags & MOBILITY_STAND))
|
||||
log_combat(A, D, "elbow dropped (Sleeping Carp)")
|
||||
var/dunk_damage = A.dna.species.punchdamagehigh * 3 + 20 //50 damage, get dunked on
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
|
||||
D.visible_message(span_warning("[A] elbow drops [D]!"), \
|
||||
span_userdanger("[A] piledrives you with their elbow!"))
|
||||
if(D.stat)
|
||||
D.death() //FINISH HIM!
|
||||
D.apply_damage(50, A.dna.species.attack_type, BODY_ZONE_CHEST, wound_bonus = CANT_WOUND)
|
||||
D.apply_damage(dunk_damage, A.dna.species.attack_type, BODY_ZONE_CHEST, wound_bonus = CANT_WOUND)
|
||||
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 75, 1, -1)
|
||||
return TRUE
|
||||
return basic_hit(A,D)
|
||||
@@ -131,9 +132,10 @@
|
||||
return TRUE
|
||||
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
|
||||
var/atk_verb = pick("punches", "kicks", "chops", "hits", "slams")
|
||||
var/harm_damage = A.dna.species.punchdamagehigh + rand(0,5) //10-15 damage
|
||||
D.visible_message(span_danger("[A] [atk_verb] [D]!"), \
|
||||
span_userdanger("[A] [atk_verb] you!"))
|
||||
D.apply_damage(rand(10,15), BRUTE, wound_bonus = CANT_WOUND)
|
||||
D.apply_damage(harm_damage, BRUTE, wound_bonus = CANT_WOUND)
|
||||
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, 1, -1)
|
||||
if(prob(D.getBruteLoss()) && (D.mobility_flags & MOBILITY_STAND))
|
||||
D.visible_message(span_warning("[D] stumbles and falls!"), span_userdanger("The blow sends you to the ground!"))
|
||||
|
||||
@@ -286,17 +286,18 @@
|
||||
|
||||
A.visible_message("<span class = 'danger'><B>[A] [fluff] [D]!</B></span>")
|
||||
playsound(A.loc, "swing_hit", 50, 1)
|
||||
var/bodyslam_damage = A.dna.species.punchdamagehigh * 1.5 + 5 //base damage of the slam, 20
|
||||
if (!D.stat)
|
||||
D.emote("scream")
|
||||
D.Paralyze(40)
|
||||
|
||||
switch(rand(1,3))
|
||||
if (2)
|
||||
D.adjustBruteLoss(rand(20,30))
|
||||
D.adjustBruteLoss(bodyslam_damage + rand(0,10)) //20-30 damage
|
||||
if (3)
|
||||
D.ex_act(EXPLODE_LIGHT)
|
||||
else
|
||||
D.adjustBruteLoss(rand(10,20))
|
||||
D.adjustBruteLoss(bodyslam_damage - rand(0,10)) //10-20 damage
|
||||
else
|
||||
D.ex_act(EXPLODE_LIGHT)
|
||||
|
||||
@@ -328,7 +329,7 @@
|
||||
addtimer(CALLBACK(src, .proc/CheckStrikeTurf, A, T), 4)
|
||||
|
||||
A.visible_message("<span class = 'danger'><b>[A] headbutts [D]!</b></span>")
|
||||
D.adjustBruteLoss(rand(10,20))
|
||||
D.adjustBruteLoss(A.dna.species.punchdamagehigh + rand(0,10)) //10-20 damage
|
||||
playsound(A.loc, "swing_hit", 50, 1)
|
||||
D.Unconscious(20)
|
||||
log_combat(A, D, "headbutted")
|
||||
@@ -342,7 +343,7 @@
|
||||
|
||||
A.visible_message("<span class = 'danger'><B>[A] roundhouse-kicks [D]!</B></span>")
|
||||
playsound(A.loc, "swing_hit", 50, 1)
|
||||
D.adjustBruteLoss(rand(10,20))
|
||||
D.adjustBruteLoss(A.dna.species.punchdamagehigh + rand(0,10)) //10-20 damage
|
||||
|
||||
var/turf/T = get_edge_target_turf(A, get_dir(A, get_step_away(D, A)))
|
||||
if (T && isturf(T))
|
||||
@@ -384,7 +385,7 @@
|
||||
A.pixel_y = 0
|
||||
if (falling == 1)
|
||||
A.visible_message("<span class = 'danger'><B>...and dives head-first into the ground, ouch!</b></span>")
|
||||
A.adjustBruteLoss(rand(10,20))
|
||||
A.adjustBruteLoss(A.dna.species.punchdamagehigh + rand(0,10)) //10-20 damage
|
||||
A.Paralyze(60)
|
||||
to_chat(A, "[D] is too far away!")
|
||||
return 0
|
||||
@@ -405,14 +406,15 @@
|
||||
A.visible_message("<span class = 'danger'><B>[A] leg-drops [D]!</B></span>")
|
||||
playsound(A.loc, "swing_hit", 50, 1)
|
||||
A.emote("scream")
|
||||
var/legdrop_damage = A.dna.species.punchdamagehigh * 2 + rand(0,10) //20-30 damage
|
||||
|
||||
if (falling == 1)
|
||||
if (prob(33) || D.stat)
|
||||
D.ex_act(EXPLODE_LIGHT)
|
||||
else
|
||||
D.adjustBruteLoss(rand(20,30))
|
||||
D.adjustBruteLoss(legdrop_damage)
|
||||
else
|
||||
D.adjustBruteLoss(rand(20,30))
|
||||
D.adjustBruteLoss(legdrop_damage)
|
||||
|
||||
D.Paralyze(40)
|
||||
|
||||
|
||||
@@ -390,7 +390,8 @@
|
||||
if(M.occupant.a_intent == INTENT_HARM)
|
||||
M.do_attack_animation(src)
|
||||
if(M.damtype == "brute")
|
||||
step_away(src,M,15)
|
||||
var/throwtarget = get_edge_target_turf(M, get_dir(M, get_step_away(src, M)))
|
||||
src.throw_at(throwtarget, 5, 2, src)//one tile further than mushroom punch/psycho brawling
|
||||
var/obj/item/bodypart/temp = get_bodypart(pick(BODY_ZONE_CHEST, BODY_ZONE_CHEST, BODY_ZONE_CHEST, BODY_ZONE_HEAD))
|
||||
if(temp)
|
||||
var/update = 0
|
||||
@@ -398,7 +399,7 @@
|
||||
switch(M.damtype)
|
||||
if("brute")
|
||||
if(M.force > 20)
|
||||
Unconscious(20)
|
||||
Knockdown(1.5 SECONDS)//the victim could get up before getting hit again
|
||||
update |= temp.receive_damage(dmg, 0)
|
||||
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
|
||||
if("fire")
|
||||
|
||||
@@ -95,7 +95,8 @@
|
||||
last_damage = "grand blunt trauma"
|
||||
M.do_attack_animation(src)
|
||||
if(M.damtype == "brute")
|
||||
step_away(src,M,15)
|
||||
var/throwtarget = get_edge_target_turf(M, get_dir(M, get_step_away(src, M)))
|
||||
src.throw_at(throwtarget, 5, 2, src)//one tile further than mushroom punch/psycho brawling
|
||||
switch(M.damtype)
|
||||
if(BRUTE)
|
||||
Unconscious(20)
|
||||
|
||||
@@ -914,7 +914,7 @@
|
||||
return 0
|
||||
|
||||
/mob/living/silicon/ai/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE, ignore_stasis = FALSE)
|
||||
if(aiRestorePowerRoutine)
|
||||
if(aiRestorePowerRoutine && !available_ai_cores())
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -46,6 +46,8 @@ GLOBAL_VAR_INIT(primary_data_core, null)
|
||||
|
||||
|
||||
for(var/mob/living/silicon/ai/AI in all_ais)
|
||||
if(AI.is_dying)
|
||||
continue
|
||||
if(!AI.mind && AI.deployed_shell.mind)
|
||||
to_chat(AI.deployed_shell, span_userdanger("Warning! Data Core brought offline in [get_area(src)]! Please verify that no malicious actions were taken."))
|
||||
else
|
||||
@@ -111,6 +113,8 @@ GLOBAL_VAR_INIT(primary_data_core, null)
|
||||
warning_sent = TRUE
|
||||
var/list/send_to = GLOB.ai_list.Copy()
|
||||
for(var/mob/living/silicon/ai/AI in send_to)
|
||||
if(AI.is_dying)
|
||||
continue
|
||||
if(!AI.mind && AI.deployed_shell.mind)
|
||||
to_chat(AI.deployed_shell, span_userdanger("Data core in [get_area(src)] is on the verge of failing! Immediate action required to prevent failure."))
|
||||
else
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
|
||||
|
||||
/mob/living/silicon/ai/proc/relocate(silent = FALSE)
|
||||
if(is_dying)
|
||||
return
|
||||
if(!silent)
|
||||
to_chat(src, span_userdanger("Connection to data core lost. Attempting to reaquire connection..."))
|
||||
|
||||
@@ -39,6 +41,7 @@
|
||||
|
||||
if(!new_data_core || (new_data_core && !new_data_core.can_transfer_ai()))
|
||||
INVOKE_ASYNC(src, /mob/living/silicon/ai.proc/death_prompt)
|
||||
is_dying = TRUE
|
||||
return
|
||||
|
||||
if(!silent)
|
||||
|
||||
@@ -112,7 +112,7 @@
|
||||
see_invisible = initial(see_invisible)
|
||||
see_in_dark = initial(see_in_dark)
|
||||
sight = initial(sight)
|
||||
if(aiRestorePowerRoutine)
|
||||
if(aiRestorePowerRoutine && !available_ai_cores())
|
||||
sight = sight&~SEE_TURFS
|
||||
sight = sight&~SEE_MOBS
|
||||
sight = sight&~SEE_OBJS
|
||||
@@ -127,8 +127,8 @@
|
||||
to_chat(src, "Backup battery online. Scanners, camera, and radio interface offline. Beginning fault-detection.")
|
||||
end_multicam()
|
||||
sleep(50)
|
||||
var/turf/T = get_turf(src)
|
||||
var/area/AIarea = get_area(src)
|
||||
var/turf/T = get_turf(loc)
|
||||
var/area/AIarea = get_area(loc)
|
||||
if(AIarea && AIarea.power_equip)
|
||||
if(!isspaceturf(T))
|
||||
ai_restore_power()
|
||||
@@ -137,7 +137,7 @@
|
||||
sleep(20)
|
||||
to_chat(src, "Emergency control system online. Verifying connection to power network.")
|
||||
sleep(50)
|
||||
T = get_turf(src)
|
||||
T = get_turf(loc)
|
||||
if(isspaceturf(T))
|
||||
to_chat(src, "Unable to verify! No power connection detected!")
|
||||
aiRestorePowerRoutine = POWER_RESTORATION_SEARCH_APC
|
||||
@@ -148,8 +148,8 @@
|
||||
|
||||
var/PRP //like ERP with the code, at least this stuff is no more 4x sametext
|
||||
for (PRP=1, PRP<=4, PRP++)
|
||||
T = get_turf(src)
|
||||
AIarea = get_area(src)
|
||||
T = get_turf(loc)
|
||||
AIarea = get_area(loc)
|
||||
if(AIarea)
|
||||
for (var/obj/machinery/power/apc/APC in AIarea)
|
||||
if (!(APC.stat & BROKEN))
|
||||
@@ -199,7 +199,9 @@
|
||||
/mob/living/silicon/ai/proc/ai_lose_power()
|
||||
disconnect_shell()
|
||||
aiRestorePowerRoutine = POWER_RESTORATION_START
|
||||
blind_eyes(1)
|
||||
if(!available_ai_cores())
|
||||
blind_eyes(1)
|
||||
|
||||
update_sight()
|
||||
to_chat(src, "You've lost power!")
|
||||
addtimer(CALLBACK(src, .proc/start_RestorePowerRoutine), 20)
|
||||
|
||||
@@ -1755,5 +1755,43 @@
|
||||
continue
|
||||
movable_content.wash(clean_types)
|
||||
|
||||
/datum/reagent/medicine/radaway
|
||||
name = "RadAway"
|
||||
description = "A potent but toxic chemical solution that binds with radioactive particles and render them inert. Applying this through spray or smoke will cleanse contaminanted surfaces."
|
||||
color = "#9f5a2f"
|
||||
var/old_insulation = RAD_NO_INSULATION
|
||||
taste_description = "metallic dust"
|
||||
self_consuming = TRUE
|
||||
|
||||
/datum/reagent/medicine/radaway/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
if(method == TOUCH || method == VAPOR)
|
||||
M.wash(CLEAN_RAD) //you only get decontaminated if it's spray based, can't spam out 100 1u pills
|
||||
|
||||
/datum/reagent/medicine/radaway/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustToxLoss(1*REM, 0)
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/radaway/on_mob_add(mob/living/L)
|
||||
..()
|
||||
//store the person's original insulation so they're only extra protected while it's in their system
|
||||
old_insulation = L.rad_insulation
|
||||
L.rad_insulation = RAD_LIGHT_INSULATION
|
||||
|
||||
/datum/reagent/medicine/radaway/on_mob_end_metabolize(mob/living/L)
|
||||
L.rad_insulation = old_insulation
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
C.vomit(stun = FALSE) //it binds with the radioactive particles inside you, and they have to come out somehow
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/radaway/reaction_obj(obj/O, reac_volume)
|
||||
//scrubs the contamination and applies a light treatment to it to mitigate immediate recontamination
|
||||
var/datum/component/radioactive/radiation = O.GetComponent(/datum/component/radioactive)
|
||||
if(radiation)
|
||||
radiation.strength -= max(0, reac_volume * (RAD_BACKGROUND_RADIATION * 5))
|
||||
O.wash(CLEAN_RAD | CLEAN_TYPE_WEAK)
|
||||
if(O.rad_insulation < RAD_LIGHT_INSULATION)
|
||||
O.rad_insulation = RAD_LIGHT_INSULATION
|
||||
|
||||
#undef PERF_BASE_DAMAGE
|
||||
#undef REQUIRED_STRANGE_REAGENT_FOR_REVIVAL
|
||||
|
||||
@@ -374,3 +374,11 @@
|
||||
var/location = get_turf(holder.my_atom)
|
||||
for(var/i in 1 to created_volume)
|
||||
new /obj/item/stack/medical/bone_gel(location)
|
||||
|
||||
/datum/chemical_reaction/radaway
|
||||
name = "RadAway"
|
||||
id = /datum/reagent/medicine/radaway
|
||||
results = list(/datum/reagent/medicine/radaway = 3)
|
||||
required_reagents = list(/datum/reagent/medicine/potass_iodide = 1, /datum/reagent/space_cleaner = 1, /datum/reagent/medicine/c2/seiver = 1)
|
||||
required_temp = 200
|
||||
is_cold_recipe = 1
|
||||
|
||||
@@ -215,6 +215,11 @@
|
||||
desc = "A small bottle of potassium iodide."
|
||||
list_reagents = list(/datum/reagent/medicine/potass_iodide = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/radaway
|
||||
name = "RadAway bottle"
|
||||
desc = "A small bottle of RadAway."
|
||||
list_reagents = list(/datum/reagent/medicine/radaway = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/salglu_solution
|
||||
name = "saline-glucose solution bottle"
|
||||
desc = "A small bottle of saline-glucose solution."
|
||||
|
||||
4
html/changelogs/AutoChangelog-pr-13635.yml
Normal file
4
html/changelogs/AutoChangelog-pr-13635.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: "Sniblet"
|
||||
delete-after: true
|
||||
changes:
|
||||
- tweak: "Being punched by a combat mech now knocks you off your feet and throws you across the room instead of sleeping you"
|
||||
5
html/changelogs/AutoChangelog-pr-13643.yml
Normal file
5
html/changelogs/AutoChangelog-pr-13643.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
author: "Chubbygummibear"
|
||||
delete-after: true
|
||||
changes:
|
||||
- rscadd: "New radiation treatment chem: RadAway. A radioactive contamination scrubbing chem that can clean contamination (the green glow) off of items and people that are sprayed or splashed with it"
|
||||
- tweak: "The lavaland ruin that had a bottle of potassium iodide renamed rad-away gets a bottle of this RadAway instead"
|
||||
5
html/changelogs/AutoChangelog-pr-13690.yml
Normal file
5
html/changelogs/AutoChangelog-pr-13690.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
author: "TheGamerdk"
|
||||
delete-after: true
|
||||
changes:
|
||||
- tweak: "AI is no longer blinded when their APC goes offline, provided they have another core online"
|
||||
- bugfix: "AI can restore their APC when it is offline"
|
||||
6
html/changelogs/AutoChangelog-pr-13719.yml
Normal file
6
html/changelogs/AutoChangelog-pr-13719.yml
Normal file
@@ -0,0 +1,6 @@
|
||||
author: "Mqiib"
|
||||
delete-after: true
|
||||
changes:
|
||||
- bugfix: "changes a bunch of hunter-fu stuff to be in-line with the rest of our martial arts"
|
||||
- tweak: "Most martial arts attacks now respect species punch damage modifications more or less depending on the attack used"
|
||||
- experiment: "The Ingot has found a new recipe, I hope you're hungry..."
|
||||
4
html/changelogs/AutoChangelog-pr-13744.yml
Normal file
4
html/changelogs/AutoChangelog-pr-13744.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: "Readystorm546"
|
||||
delete-after: true
|
||||
changes:
|
||||
- bugfix: "Janitor closet turf was no in the janitor closet."
|
||||
4
html/changelogs/AutoChangelog-pr-13747.yml
Normal file
4
html/changelogs/AutoChangelog-pr-13747.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: "ToasterBiome"
|
||||
delete-after: true
|
||||
changes:
|
||||
- rscadd: "re-adds the autopsy surgery area for detective and the incinerator expansion on box"
|
||||
4
html/changelogs/AutoChangelog-pr-13748.yml
Normal file
4
html/changelogs/AutoChangelog-pr-13748.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: "Chubbygummibear"
|
||||
delete-after: true
|
||||
changes:
|
||||
- bugfix: "Pods only get 2x light healing from sugar while it's processing"
|
||||
5
html/changelogs/AutoChangelog-pr-13751.yml
Normal file
5
html/changelogs/AutoChangelog-pr-13751.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
author: "Chubbygummibear"
|
||||
delete-after: true
|
||||
changes:
|
||||
- rscadd: "New Donator Item: Sad Horn, it's a bike horn that plays the boo-womp sound"
|
||||
- soundadd: "boowomp.ogg is canon"
|
||||
@@ -19,3 +19,12 @@
|
||||
/obj/item/bikehorn/rubber_pigeon/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/squeak, list('yogstation/sound/items/rubber_pigeon.ogg'=1), 50)
|
||||
|
||||
/obj/item/bikehorn/sad
|
||||
name = "sad horn"
|
||||
desc = "Thank you, Doktor."
|
||||
attack_verb = list("Boowomped")
|
||||
|
||||
/obj/item/bikehorn/sad/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/squeak, list('yogstation/sound/items/boowomp.ogg'=1), 50)
|
||||
|
||||
@@ -57,6 +57,8 @@ GLOBAL_LIST_EMPTY(antag_token_users)
|
||||
|
||||
|
||||
if(C in GLOB.antag_token_users) // If they're in the list take them out
|
||||
if(alert("Someone already approved this antag token. Are you sure you want to reject it?", "Confirm", "Yes", "No") != "Yes")
|
||||
return
|
||||
GLOB.antag_token_users -= C
|
||||
token = FALSE // Redundency if you clowns figure out how to break it
|
||||
else
|
||||
|
||||
@@ -432,6 +432,9 @@ Uncomment this and use atomproccall as necessary, then copypaste the output into
|
||||
/datum/donator_gear/air_horn
|
||||
name = "air horn"
|
||||
unlock_path = /obj/item/bikehorn/airhorn
|
||||
/datum/donator_gear/sad_horn
|
||||
name = "sad horn"
|
||||
unlock_path = /obj/item/bikehorn/sad
|
||||
/datum/donator_gear/camera
|
||||
name = "camera"
|
||||
unlock_path = /obj/item/camera
|
||||
|
||||
@@ -231,7 +231,12 @@
|
||||
light_heal_multiplier = 2
|
||||
dark_damage_multiplier = 3
|
||||
H.reagents.remove_reagent(chem.type, chem.metabolization_rate * REAGENTS_METABOLISM)
|
||||
//removal is handled in /datum/reagent/sugar/on_mob_delete()
|
||||
//removal is handled in /datum/reagent/sugar/on_mob_delete() //so that was a lie
|
||||
|
||||
//if there's none left after the removal, the light multiplier needs to go back to the default
|
||||
if(!H.reagents.has_reagent(/datum/reagent/consumable/sugar))
|
||||
light_heal_multiplier = initial(light_heal_multiplier)
|
||||
dark_damage_multiplier = initial(dark_damage_multiplier)
|
||||
return 1
|
||||
|
||||
if(istype(chem, /datum/reagent/consumable/ethanol)) //istype so all alcohols work
|
||||
|
||||
BIN
yogstation/sound/items/boowomp.ogg
Normal file
BIN
yogstation/sound/items/boowomp.ogg
Normal file
Binary file not shown.
Reference in New Issue
Block a user