mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-09 16:05:07 +00:00
Adds 5 Bond-tier gadgets to the Spy's reward pool (#92481)
## About The Pull Request 1. Penbang A flashbang disguised as a pen. Clicking the pen arms the flashbang and has no other visual or audio tell besides the pen clicking. The fuse's length is based on the angle the pen cap is twisted. Works as a normal pen otherwise. 2. Camera Flash A camera with a high power flash. Clicking on an adjacent target will flash them, ie, as a handheld flash. Works as a normal camera otherwise - no tell. 3. Dagger Boot A pair of jackboots with a blade embedded in them. Makes your kicks sharp, meaning they will cause bleeding. Looks like normal jackboots otherwise, though has a tell on double-examine 4. Monster Cube Box A box containing 5 monster cubes, which spawn into a random monster when wet. Monsters include Migos, Carps, Bears, Spiders, Wolves... 5. Spider Bite Scroll A martial art focused around kicks and grabs. - Punches against standing, staggered targets will instead kick them, applying the bonus accuracy and damage that you'd expect from a kick. (Also combos with the dagger boots) - All kicks have a chance to disarm the target's active weapon. Chance increases per sequential kick. - Grants you the innate ability to tackle. This form of tackling has a very high skill modifier, meaning you are very likely to get a positive outcome (or at least, not fail). You also get up fast from it. - Your grabs are 20% harder to escape from and deal an additional 10 stam damage on fail. ## Why It's Good For The Game 1, 2, 3: Just some random flavorful items, giving them some more toys to use to complete bounties. 4: Shenanigans, for people who just wanna do "funny thing" instead of focusing on big loot. 5: I figured it would fill a fun niche: Spies are commonly depicted as martial artists, and the only martial arts they can obtain is Krav Maga (it's not unique to Spies) and Sleeping Carp (it's not unique to Spies). This gives them their own thing that people may look forward to acquiring and playing around with. As for the design of it, I wanted to add something that synergizes with one of the other other items, so in the field if you notice both of them pop up you really want to go for both. The rest of the design I just filled in as vaguely useful and flavorful tools a spy might want for kidnapping or detaining people: Better grabs, tackling, and disarms. Then I just went with the flavor of it being something the Spider Clan used to teach to their Spies / Ninjas, kinda like an analog to the real life Ninjutsu. (Maybe we can give it to Space Ninjas as well later... since it doesn't especially benefit Ninjas in any way.) ## Changelog 🆑 Melbert add: Adds 5 rewards to the Spy item pool: Penbang, Camera Flash, Dagger-Boot, Monster Cube Box, and the Spider Bite martial art /🆑
This commit is contained in:
@@ -170,6 +170,8 @@
|
||||
|
||||
/// Called from /datum/species/proc/harm(): (mob/living/carbon/human/attacker, damage, attack_type, obj/item/bodypart/affecting, final_armor_block, kicking)
|
||||
#define COMSIG_HUMAN_GOT_PUNCHED "human_got_punched"
|
||||
/// Called from /datum/species/proc/harm(): (mob/living/carbon/human/attacked, damage, attack_type, obj/item/bodypart/affecting, final_armor_block, kicking)
|
||||
#define COMSIG_HUMAN_PUNCHED "human_punched"
|
||||
|
||||
/// Called at the very end of human character setup
|
||||
/// At this point all quirks are assigned and the mob has a mind / client
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#define MARTIALART_SLEEPINGCARP "sleeping carp"
|
||||
#define MARTIALART_WRESTLING "wrestling"
|
||||
#define MARTIALART_JUNGLEARTS "jungle arts"
|
||||
#define MARTIALART_SPIDERSBITE "spider's bite"
|
||||
|
||||
/// The number of hits required to crit a target
|
||||
#define HITS_TO_CRIT(damage) round(100 / (damage), 0.1)
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
///A wearkef to the throwdatum we're currently dealing with, if we need it
|
||||
var/datum/weakref/tackle_ref
|
||||
|
||||
/datum/component/tackler/Initialize(stamina_cost = 25, base_knockdown = 1 SECONDS, range = 4, speed = 1, skill_mod = 0, min_distance = min_distance)
|
||||
/datum/component/tackler/Initialize(stamina_cost = 25, base_knockdown = 1 SECONDS, range = 4, speed = 1, skill_mod = 0, min_distance = min_distance, silent_gain = FALSE)
|
||||
if(!iscarbon(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
@@ -42,8 +42,9 @@
|
||||
src.skill_mod = skill_mod
|
||||
src.min_distance = min_distance
|
||||
|
||||
var/mob/P = parent
|
||||
to_chat(P, span_notice("You are now able to launch tackles! You can do so by activating throw mode, and ") + span_boldnotice("RIGHT-CLICKING on your target with an empty hand."))
|
||||
if(!silent_gain)
|
||||
var/mob/P = parent
|
||||
to_chat(P, span_notice("You are now able to launch tackles! You can do so by activating throw mode, and ") + span_boldnotice("RIGHT-CLICKING on your target with an empty hand."))
|
||||
|
||||
addtimer(CALLBACK(src, PROC_REF(resetTackle)), base_knockdown, TIMER_STOPPABLE)
|
||||
|
||||
|
||||
@@ -35,6 +35,15 @@
|
||||
/// If TRUE, the user is locked to using this martial art, and can't swap to other ones they know.
|
||||
/// If the mob has two locked martial arts, it's first come first serve.
|
||||
var/locked_to_use = FALSE
|
||||
/// A modifier to the effective grab state for resist grabs of users of this martial art.
|
||||
/// IE: grab_state_modifier = 1 means passive grabs are aggro grab difficulty, and aggro grabs are neckgrab difficulty.
|
||||
var/grab_state_modifier = 0
|
||||
/// A modifier to the damage dealt on a failed grab resist.
|
||||
/// IE: grab_damage_modifier = 10 means 10 more stamina damage dealt
|
||||
var/grab_damage_modifier = 0
|
||||
/// A modifier to the chance of escaping a grab.
|
||||
/// IE: grab_escape_chance_modifier = -10 means 10% less chance to escape a grab
|
||||
var/grab_escape_chance_modifier = 0
|
||||
|
||||
/datum/martial_art/serialize_list(list/options, list/semvers)
|
||||
. = ..()
|
||||
@@ -217,6 +226,43 @@
|
||||
/datum/martial_art/proc/can_use(mob/living/martial_artist)
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* Gets what limb is being used going when punching with this martial art.
|
||||
*
|
||||
* Override get_prefered_attacking_limb() to change the limb used.
|
||||
*
|
||||
* Arguments
|
||||
* * mob/living/martial_artist - The mob using the martial art
|
||||
* * mob/living/target - The target of the attack
|
||||
*
|
||||
* Returns
|
||||
* A bodypart, or null if we want to use default behavior (brain determines, or active hand).
|
||||
*/
|
||||
/datum/martial_art/proc/get_attacking_limb(mob/living/martial_artist, mob/living/target)
|
||||
SHOULD_NOT_OVERRIDE(TRUE)
|
||||
if(!can_use(martial_artist))
|
||||
return null
|
||||
var/preferred_zone = get_prefered_attacking_limb(martial_artist, target)
|
||||
if(!preferred_zone)
|
||||
return null
|
||||
return martial_artist.get_bodypart(preferred_zone)
|
||||
|
||||
/**
|
||||
* Allows martial arts to have a say which limb the user should be striking with.
|
||||
*
|
||||
*
|
||||
* Arguments
|
||||
* * mob/living/martial_artist - The mob using the martial art
|
||||
* * mob/living/target - The target of the attack
|
||||
*
|
||||
* Returns
|
||||
* * A body zone, or null if we have no preference.
|
||||
*/
|
||||
/datum/martial_art/proc/get_prefered_attacking_limb(mob/living/martial_artist, mob/living/target)
|
||||
SHOULD_CALL_PARENT(FALSE)
|
||||
PROTECTED_PROC(TRUE)
|
||||
return null
|
||||
|
||||
/**
|
||||
* Adds the passed element to the current streak, resetting it if the target is not the same as the last target.
|
||||
*
|
||||
|
||||
@@ -231,7 +231,7 @@
|
||||
set desc = "Remember the martial techniques of the Sleeping Carp clan."
|
||||
set category = "Sleeping Carp"
|
||||
|
||||
to_chat(usr, "<b><i>You retreat inward and recall the teachings of the Sleeping Carp...</i></b>\n\
|
||||
to_chat(usr, span_info("<b><i>You retreat inward and recall the teachings of the Sleeping Carp...</i></b>\n\
|
||||
[span_notice("Gnashing Teeth")]: Punch Punch. Deal additional damage every second (consecutive) punch! Very good chance to wound!\n\
|
||||
[span_notice("Crashing Wave Kick")]: Punch Shove. Launch your opponent away from you with incredible force!\n\
|
||||
[span_notice("Keelhaul")]: Shove Shove. Nonlethally kick an opponent to the floor, knocking them down, discombobulating them and dealing substantial stamina damage. If they're already prone, disarm them as well.\n\
|
||||
@@ -239,7 +239,7 @@
|
||||
<span class='notice'>While in combat mode (and not stunned, not a hulk, and not in a mech), you can reflect all projectiles that come your way, sending them back at the people who fired them! \n\
|
||||
Also, you are more resilient against suffering wounds in combat, and your limbs cannot be dismembered. This grants you extra staying power during extended combat, especially against slashing and other bleeding weapons. \n\
|
||||
You are not invincible, however- while you may not suffer debilitating wounds often, you must still watch your health and should have appropriate medical supplies for use during downtime. \n\
|
||||
In addition, your training has imbued you with a loathing of guns, and you can no longer use them.</span>")
|
||||
In addition, your training has imbued you with a loathing of guns, and you can no longer use them.</span>"))
|
||||
|
||||
|
||||
/obj/item/staff/bostaff
|
||||
|
||||
72
code/datums/martial/spiders_bite.dm
Normal file
72
code/datums/martial/spiders_bite.dm
Normal file
@@ -0,0 +1,72 @@
|
||||
/datum/martial_art/spiders_bite
|
||||
name = "Spider's Bite"
|
||||
id = MARTIALART_SPIDERSBITE
|
||||
help_verb = /mob/living/proc/spiders_bite_help
|
||||
grab_damage_modifier = 10
|
||||
grab_escape_chance_modifier = -20
|
||||
/// REF() to the last mob we kicked
|
||||
var/last_hit_ref
|
||||
/// Counts the number of sequential kicks the user has landed on a target
|
||||
var/last_hit_count = 0
|
||||
/// Reference to the tackling component applied
|
||||
var/datum/component/tackler/tackle_comp
|
||||
|
||||
/datum/martial_art/spiders_bite/activate_style(mob/living/new_holder)
|
||||
. = ..()
|
||||
RegisterSignal(new_holder, COMSIG_HUMAN_PUNCHED, PROC_REF(kick_disarm))
|
||||
tackle_comp = new_holder.AddComponent(/datum/component/tackler, \
|
||||
stamina_cost = 20, \
|
||||
base_knockdown = 0.2 SECONDS, \
|
||||
range = 5, \
|
||||
speed = 1.5, \
|
||||
skill_mod = 6, \
|
||||
min_distance = 1, \
|
||||
silent_gain = TRUE, \
|
||||
)
|
||||
|
||||
/datum/martial_art/spiders_bite/deactivate_style(mob/living/old_holder)
|
||||
. = ..()
|
||||
UnregisterSignal(old_holder, COMSIG_HUMAN_PUNCHED)
|
||||
QDEL_NULL(tackle_comp)
|
||||
|
||||
/datum/martial_art/spiders_bite/proc/kick_disarm(mob/living/source, mob/living/target, damage, attack_type, obj/item/bodypart/affecting, final_armor_block, kicking, limb_sharpness)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(!kicking)
|
||||
last_hit_ref = null
|
||||
return
|
||||
var/new_hit_ref = REF(target)
|
||||
if(last_hit_ref == new_hit_ref)
|
||||
last_hit_count++
|
||||
else
|
||||
last_hit_count = 1
|
||||
last_hit_ref = new_hit_ref
|
||||
|
||||
if(!prob(33 * last_hit_count))
|
||||
return
|
||||
|
||||
var/obj/item/weapon = target.get_active_held_item()
|
||||
if(isnull(weapon) || !target.dropItemToGround(weapon))
|
||||
return
|
||||
source.visible_message(
|
||||
span_warning("[source] knocks [target]'s [weapon.name] out of [target.p_their()] hands with a kick!"),
|
||||
span_notice("You channel the flow of gravity and knock [target]'s [weapon.name] out of [target.p_their()] hands with a kick!"),
|
||||
span_hear("You hear a thud, followed by a clatter."),
|
||||
)
|
||||
|
||||
/datum/martial_art/spiders_bite/get_prefered_attacking_limb(mob/living/martial_artist, mob/living/target)
|
||||
if(!target.has_status_effect(/datum/status_effect/staggered))
|
||||
return null
|
||||
|
||||
return IS_LEFT_INDEX(martial_artist.active_hand_index) ? BODY_ZONE_L_LEG : BODY_ZONE_R_LEG
|
||||
|
||||
/mob/living/proc/spiders_bite_help()
|
||||
set name = "Recall Teachings"
|
||||
set desc = "Remember the Spider Bite technique used by the Spider Clan."
|
||||
set category = "Spider's Bite"
|
||||
|
||||
to_chat(usr, span_info("<b><i>You retreat inward and recall the Spider Clan's techniques...</i></b>\n\
|
||||
• Remember, <b>Many Legged Spider</b>: Unarmed attacks against staggered opponents will always be kicks - granting you greater accuracy and damage.\n\
|
||||
• Remember, <b>Jump and Climb</b>: Right clicking on throw mode will perform a tackle which is far far less likely to fail.\n\
|
||||
• Remember, <b>Flow of Gravity</b>: Kicking opponents will have a chance to knock their weapons to the floor. The chance increases for each sequential kick.\n\
|
||||
• Remember, <b>Wrap in Web</b>: Your grabs will be harder to escape from."))
|
||||
@@ -501,3 +501,98 @@ effective or pretty fucking useless.
|
||||
/obj/projectile/bullet/toolbox_turret
|
||||
damage = 10
|
||||
speed = 1.6
|
||||
|
||||
/// Flashbang disguised as a pen
|
||||
/obj/item/pen/penbang
|
||||
degrees = 90
|
||||
|
||||
/obj/item/pen/penbang/on_transform(obj/item/source, mob/user, active)
|
||||
. = ..()
|
||||
var/det_time = 1 SECONDS + (4 SECONDS * (degrees / 90))
|
||||
if(user)
|
||||
to_chat(user, span_warning("You prime the penbang! [capitalize(DisplayTimeText(det_time))]!"))
|
||||
log_bomber(user, "has primed a", src, "(penbang) for detonation")
|
||||
addtimer(CALLBACK(src, PROC_REF(detonate), user), det_time)
|
||||
|
||||
/obj/item/pen/penbang/proc/detonate(mob/user)
|
||||
var/obj/item/grenade/flashbang/bang = new(get_turf(src))
|
||||
bang.detonate()
|
||||
qdel(src)
|
||||
|
||||
/// A camera disguised as a flash
|
||||
/obj/item/camera/flash
|
||||
/// The flash we use to flash people with
|
||||
var/obj/item/assembly/flash/handheld/internal_flash
|
||||
|
||||
/obj/item/camera/flash/Initialize(mapload)
|
||||
. = ..()
|
||||
internal_flash = new(src)
|
||||
|
||||
/obj/item/camera/flash/Destroy()
|
||||
QDEL_NULL(internal_flash)
|
||||
return ..()
|
||||
|
||||
/obj/item/camera/flash/Exited(atom/movable/gone, direction)
|
||||
. = ..()
|
||||
// i guess this is a normal camera now. shouldn't happen, though
|
||||
if(gone == internal_flash)
|
||||
internal_flash = null
|
||||
|
||||
/obj/item/camera/flash/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
|
||||
if(isliving(interacting_with))
|
||||
return ITEM_INTERACT_SKIP_TO_ATTACK
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/camera/flash/attack(mob/living/M, mob/user)
|
||||
return internal_flash?.attack(M, user)
|
||||
|
||||
/// Jackboots with a dagger embedded into them - changes your kicks to be stab attacks, potetnially causing bleeding
|
||||
/obj/item/clothing/shoes/jackboots/dagger
|
||||
/// List of bodyparts modified by the dagger
|
||||
var/list/modified_bodyparts = list()
|
||||
|
||||
/obj/item/clothing/shoes/jackboots/dagger/equipped(mob/living/user, slot)
|
||||
. = ..()
|
||||
if(!(slot & ITEM_SLOT_FEET) || !istype(user))
|
||||
modified_bodyparts += user.get_bodypart(BODY_ZONE_L_LEG)
|
||||
modified_bodyparts += user.get_bodypart(BODY_ZONE_R_LEG)
|
||||
for(var/obj/item/bodypart/bodypart in modified_bodyparts)
|
||||
bodypart.unarmed_sharpness |= SHARP_EDGED
|
||||
bodypart.unarmed_attack_effect = ATTACK_EFFECT_SLASH
|
||||
RegisterSignals(bodypart, list(COMSIG_BODYPART_REMOVED, COMSIG_QDELETING), PROC_REF(clear_modification))
|
||||
RegisterSignal(user, COMSIG_CARBON_POST_ATTACH_LIMB, PROC_REF(modify_legs))
|
||||
|
||||
/obj/item/clothing/shoes/jackboots/dagger/dropped(mob/user)
|
||||
. = ..()
|
||||
UnregisterSignal(user, COMSIG_CARBON_POST_ATTACH_LIMB)
|
||||
for(var/obj/item/bodypart/bodypart in modified_bodyparts)
|
||||
clear_modification(bodypart)
|
||||
|
||||
/obj/item/clothing/shoes/jackboots/dagger/handle_deconstruct(disassembled)
|
||||
. = ..()
|
||||
new /obj/item/switchblade/extended(drop_location())
|
||||
|
||||
/obj/item/clothing/shoes/jackboots/dagger/proc/clear_modification(obj/item/bodypart/bodypart, ...)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
UnregisterSignal(bodypart, list(COMSIG_BODYPART_REMOVED, COMSIG_QDELETING))
|
||||
bodypart.unarmed_sharpness = initial(bodypart.unarmed_sharpness)
|
||||
bodypart.unarmed_attack_effect = initial(bodypart.unarmed_attack_effect)
|
||||
modified_bodyparts -= bodypart
|
||||
|
||||
/obj/item/clothing/shoes/jackboots/dagger/proc/modify_legs(datum/source, obj/item/bodypart/bodypart, ...)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(bodypart in modified_bodyparts)
|
||||
return
|
||||
if(!istype(bodypart, /obj/item/bodypart/leg))
|
||||
return
|
||||
|
||||
modified_bodyparts += bodypart
|
||||
bodypart.unarmed_sharpness |= SHARP_EDGED
|
||||
RegisterSignal(bodypart, list(COMSIG_BODYPART_REMOVED, COMSIG_QDELETING), PROC_REF(clear_modification))
|
||||
|
||||
/obj/item/clothing/shoes/jackboots/dagger/examine_more(mob/user)
|
||||
. = ..()
|
||||
. += span_notice("Upon closer inspection, you notice a dagger embedded into the sole.")
|
||||
|
||||
@@ -124,3 +124,37 @@
|
||||
)
|
||||
tastes = list("the loss of 5 TC" = 1, "eaten friend" = 1)
|
||||
spawned_mob = /mob/living/basic/pony/dangerous
|
||||
|
||||
/obj/item/food/monkeycube/random
|
||||
name = "monster cube"
|
||||
desc = "A cube that, when water is added, creates a random creature. Who knows what's inside?"
|
||||
food_reagents = list(
|
||||
/datum/reagent/toxin = 15,
|
||||
/datum/reagent/medicine/strange_reagent = 1,
|
||||
)
|
||||
|
||||
/obj/item/food/monkeycube/random/Initialize(mapload)
|
||||
. = ..()
|
||||
spawned_mob = pick_weight(list(
|
||||
/mob/living/basic/bear = 4,
|
||||
/mob/living/basic/bear/snow = 1,
|
||||
/mob/living/basic/blankbody = 2,
|
||||
/mob/living/basic/blob_minion/blobbernaut = 2,
|
||||
/mob/living/basic/blob_minion/spore = 2,
|
||||
/mob/living/basic/carp = 4,
|
||||
/mob/living/basic/carp/mega = 1,
|
||||
/mob/living/basic/creature = 2,
|
||||
/mob/living/basic/eyeball = 1,
|
||||
/mob/living/basic/gorilla = 5,
|
||||
/mob/living/basic/migo = 2,
|
||||
/mob/living/basic/mining/basilisk = 5,
|
||||
/mob/living/basic/mining/lobstrosity = 1,
|
||||
/mob/living/basic/mining/lobstrosity/lava = 4,
|
||||
/mob/living/basic/mining/wolf = 4,
|
||||
/mob/living/basic/pet/cat/feral = 1,
|
||||
/mob/living/basic/spider/giant = 5,
|
||||
/mob/living/basic/spider/giant/hunter = 1,
|
||||
/mob/living/basic/spider/giant/tank = 1,
|
||||
/mob/living/basic/spider/giant/tarantula = 1,
|
||||
/mob/living/basic/spider/giant/viper = 1,
|
||||
))
|
||||
|
||||
36
code/game/objects/items/granters/martial_arts/spider_bite.dm
Normal file
36
code/game/objects/items/granters/martial_arts/spider_bite.dm
Normal file
@@ -0,0 +1,36 @@
|
||||
/obj/item/book/granter/martial/spider_bite
|
||||
martial = /datum/martial_art/spiders_bite
|
||||
|
||||
name = "mysterious scroll"
|
||||
martial_name = "spider's bite"
|
||||
desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art."
|
||||
greet = span_sciradio("You have learned the Spider Clan's historic technique, The Spider's Bite. \
|
||||
You are now able to kick standing targets who are staggered, potentially disarming them of their weapons. \
|
||||
You can also tackle targets with great effectiveness, and have more solid grabs.")
|
||||
icon = 'icons/obj/scrolls.dmi'
|
||||
icon_state = "sleepingcarp"
|
||||
worn_icon_state = "scroll"
|
||||
remarks = list(
|
||||
"Float like spider silk, sting like a spider's bite.",
|
||||
"I must be one with the spider.",
|
||||
"I've never seen this language in my life. At least it has pictures.",
|
||||
"The Flow of Gravity technique... can I harness the power of gravity?",
|
||||
"The Jump and Climb technique... is my body that flexible?",
|
||||
"The Many Legged Spider technique... are my kicks really that powerful?",
|
||||
"The Wrap in Web technique... I just need to wrap my targets in my arms?",
|
||||
)
|
||||
|
||||
/obj/item/book/granter/martial/spider_bite/on_reading_finished(mob/living/carbon/user)
|
||||
. = ..()
|
||||
update_appearance()
|
||||
|
||||
/obj/item/book/granter/martial/spider_bite/update_appearance(updates)
|
||||
. = ..()
|
||||
if(uses <= 0)
|
||||
name = "empty scroll"
|
||||
desc = "It's completely blank."
|
||||
icon_state = "blankscroll"
|
||||
else
|
||||
name = initial(name)
|
||||
desc = initial(desc)
|
||||
icon_state = initial(icon_state)
|
||||
@@ -50,6 +50,11 @@
|
||||
desc = "Waffle Corp. brand monkey cubes. Just add water and a dash of subterfuge!"
|
||||
cube_type = /obj/item/food/monkeycube/syndicate
|
||||
|
||||
/obj/item/storage/box/monkeycubes/random
|
||||
name = "monster cube box"
|
||||
desc = "A box containing a bunch of random cubes. Add water and see what you get!"
|
||||
cube_type = /obj/item/food/monkeycube/random
|
||||
|
||||
/obj/item/storage/box/gorillacubes
|
||||
name = "gorilla cube box"
|
||||
desc = "Waffle Corp. brand gorilla cubes. Do not taunt."
|
||||
|
||||
@@ -847,11 +847,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
|
||||
return FALSE
|
||||
|
||||
var/obj/item/organ/brain/brain = user.get_organ_slot(ORGAN_SLOT_BRAIN)
|
||||
var/obj/item/bodypart/attacking_bodypart
|
||||
if(brain)
|
||||
attacking_bodypart = brain.get_attacking_limb(target)
|
||||
if(!attacking_bodypart)
|
||||
attacking_bodypart = user.get_active_hand()
|
||||
var/obj/item/bodypart/attacking_bodypart = attacker_style?.get_attacking_limb(user, target) || brain?.get_attacking_limb(target) || user.get_active_hand()
|
||||
|
||||
// Whether or not we get some protein for a successful attack. Nom.
|
||||
var/biting = FALSE
|
||||
@@ -997,6 +993,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
|
||||
tasty_meal.trans_to(user, tasty_meal.total_volume, transferred_by = user, methods = INGEST)
|
||||
|
||||
SEND_SIGNAL(target, COMSIG_HUMAN_GOT_PUNCHED, user, damage, attack_type, affecting, final_armor_block, kicking, limb_sharpness)
|
||||
SEND_SIGNAL(user, COMSIG_HUMAN_PUNCHED, target, damage, attack_type, affecting, final_armor_block, kicking, limb_sharpness)
|
||||
|
||||
// If our target is staggered and has sustained enough damage, we can apply a randomly determined status effect to inflict when we punch them.
|
||||
// The effects are based on the punching effectiveness of our attacker. Some effects are not reachable by the average human, and require augmentation to reach or being a species with a heavy punch effectiveness.
|
||||
|
||||
@@ -1170,6 +1170,8 @@
|
||||
var/effective_grab_state = pulledby.grab_state
|
||||
//The amount of damage inflicted on a failed resist attempt.
|
||||
var/damage_on_resist_fail = rand(7, 13)
|
||||
// Base chance to escape a grab. Divided by effective grab state
|
||||
var/escape_chance = BASE_GRAB_RESIST_CHANCE
|
||||
|
||||
if(body_position == LYING_DOWN) //If prone, treat the grab state as one higher
|
||||
effective_grab_state++
|
||||
@@ -1194,13 +1196,19 @@
|
||||
var/puller_drunkenness = human_puller.get_drunk_amount()
|
||||
if(puller_drunkenness && HAS_TRAIT(human_puller, TRAIT_DRUNKEN_BRAWLER))
|
||||
damage_on_resist_fail += clamp((human_puller.getFireLoss() + human_puller.getBruteLoss()) / 10, 3, 20)
|
||||
effective_grab_state ++
|
||||
effective_grab_state++
|
||||
|
||||
var/datum/martial_art/puller_art = GET_ACTIVE_MARTIAL_ART(human_puller)
|
||||
if(puller_art?.can_use(human_puller))
|
||||
damage_on_resist_fail += puller_art.grab_damage_modifier
|
||||
effective_grab_state += puller_art.grab_state_modifier
|
||||
escape_chance += puller_art.grab_escape_chance_modifier
|
||||
|
||||
//We only resist our grab state if we are currently in a grab equal to or greater than GRAB_AGGRESSIVE (1). Otherwise, break out immediately!
|
||||
if(effective_grab_state >= GRAB_AGGRESSIVE)
|
||||
// see defines/combat.dm, this should be baseline 60%
|
||||
// Resist chance divided by the value imparted by your grab state. It isn't until you reach neckgrab that you gain a penalty to escaping a grab.
|
||||
var/resist_chance = clamp(BASE_GRAB_RESIST_CHANCE / effective_grab_state, 0, 100)
|
||||
var/resist_chance = clamp(escape_chance / effective_grab_state, 0, 100)
|
||||
if(prob(resist_chance))
|
||||
visible_message(span_danger("[src] breaks free of [pulledby]'s grip!"), \
|
||||
span_danger("You break free of [pulledby]'s grip!"), null, null, pulledby)
|
||||
|
||||
@@ -155,3 +155,40 @@
|
||||
item = /obj/item/melee/baton/nunchaku
|
||||
cost = SPY_UPPER_COST_THRESHOLD
|
||||
uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND
|
||||
|
||||
/datum/uplink_item/spy_unique/penbang
|
||||
name = "Penbang"
|
||||
desc = "A flashbang disguised as a normal pen - click and throw! Has no other warning upon being activated. \
|
||||
Fuse duration depends on how far the cap is twisted."
|
||||
item = /obj/item/pen/penbang
|
||||
cost = 1
|
||||
|
||||
/datum/uplink_item/spy_unique/cameraflash
|
||||
name = "Camera Flash"
|
||||
desc = "A camera with a high-powered flash. Can be used as a normal flash when in close proximity to a target."
|
||||
item = /obj/item/camera/flash
|
||||
cost = 1
|
||||
|
||||
/datum/uplink_item/spy_unique/daggerboot
|
||||
name = "Boot Dagger"
|
||||
desc = "A pair of boots with a dagger embedded into the sole. Kicks with these will stab the target, potentially causing bleeding."
|
||||
item = /obj/item/clothing/shoes/jackboots/dagger
|
||||
cost = 1
|
||||
|
||||
/datum/uplink_item/spy_unique/monster_cube_box
|
||||
name = "Random Monster Cubes"
|
||||
desc = "A box containing a bunch of random monster cubes. Add water and see what you get!"
|
||||
item = /obj/item/storage/box/monkeycubes/random
|
||||
cost = SPY_LOWER_COST_THRESHOLD // There's some really bad stuff in here but also some really mild stuff
|
||||
|
||||
/datum/uplink_item/spy_unique/sleeping_carp
|
||||
name = "Sleeping Carp Technique"
|
||||
desc = "A scroll teaching you the basics of the Sleeping Carp martial art."
|
||||
item = /datum/uplink_item/stealthy_weapons/martialarts::item
|
||||
cost = /datum/uplink_item/stealthy_weapons/martialarts::cost
|
||||
|
||||
/datum/uplink_item/spy_unique/spider_bite
|
||||
name = "Spider Bite Technique"
|
||||
desc = "A scroll teaching you the basics of the Spider Bite martial art."
|
||||
item = /obj/item/book/granter/martial/spider_bite
|
||||
cost = SPY_UPPER_COST_THRESHOLD // While SCarp is firmly in the upper threshold, Spider Bite can be in either middle or upper.
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
population_minimum = TRAITOR_POPULATION_LOWPOP
|
||||
cost = 17
|
||||
surplus = 0
|
||||
purchasable_from = ~UPLINK_ALL_SYNDIE_OPS
|
||||
purchasable_from = ~(UPLINK_ALL_SYNDIE_OPS|UPLINK_SPY)
|
||||
|
||||
/datum/uplink_item/stealthy_weapons/crossbow
|
||||
name = "Miniature Energy Crossbow"
|
||||
|
||||
@@ -1744,6 +1744,7 @@
|
||||
#include "code\datums\martial\plasma_fist.dm"
|
||||
#include "code\datums\martial\psychotic_brawl.dm"
|
||||
#include "code\datums\martial\sleeping_carp.dm"
|
||||
#include "code\datums\martial\spiders_bite.dm"
|
||||
#include "code\datums\martial\wrestling.dm"
|
||||
#include "code\datums\materials\_material.dm"
|
||||
#include "code\datums\materials\alloys.dm"
|
||||
@@ -2675,6 +2676,7 @@
|
||||
#include "code\game\objects\items\granters\martial_arts\cqc.dm"
|
||||
#include "code\game\objects\items\granters\martial_arts\plasma_fist.dm"
|
||||
#include "code\game\objects\items\granters\martial_arts\sleeping_carp.dm"
|
||||
#include "code\game\objects\items\granters\martial_arts\spider_bite.dm"
|
||||
#include "code\game\objects\items\grenades\_grenade.dm"
|
||||
#include "code\game\objects\items\grenades\antigravity.dm"
|
||||
#include "code\game\objects\items\grenades\atmos_grenades.dm"
|
||||
|
||||
Reference in New Issue
Block a user