Grab Tweaks (#7465)

Grabs have been lightly buffed across the board. It should be slightly more effective now.
    It is now more difficult to resist out of grabs, and doing so while you're on the floor is much more difficult.
    Various species has had their grab mod modified, making them easier or harder to grab.
    Using the grab in hand will now cause you to stop strangling the person, but you maintain the strong grab. No longer do you have to drop someone to stop choking them out.
    You can no longer strangle people with airtight helmets. (voidsuits, rigs, etc)
This commit is contained in:
Geeves
2019-12-29 12:14:25 +02:00
committed by Erki
parent 2f1336e0ee
commit 00e20ba0fe
19 changed files with 132 additions and 43 deletions

View File

@@ -153,3 +153,6 @@
return null
return O
/mob/living/carbon/human/get_resist_power()
return species.resist_mod

View File

@@ -74,6 +74,7 @@
var/flash_mod = 1 // Stun from blindness modifier.
var/fall_mod = 1 // Fall damage modifier, further modified by brute damage modifier
var/grab_mod = 1 // How easy it is to grab the species. Higher is harder to grab.
var/resist_mod = 1 // How easy it is for the species to resist out of a grab.
var/metabolism_mod = 1 // Reagent metabolism modifier
var/bleed_mod = 1 // How fast this species bleeds.
var/blood_volume = DEFAULT_BLOOD_AMOUNT // Blood volume.

View File

@@ -38,7 +38,8 @@
even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \
water and other radiation."
grab_mod = 1.1
grab_mod = 0.8 // Viney Tentacles and shit to cling onto
resist_mod = 3 // Pretty stronk tho, can break out
has_organ = list(
"nutrient channel" = /obj/item/organ/internal/diona/nutrients,

View File

@@ -28,6 +28,7 @@
burn_mod = 4
virus_immune = 1
grab_mod = 2
resist_mod = 2
warning_low_pressure = 50 //golems can into space now
hazard_low_pressure = 0

View File

@@ -33,6 +33,7 @@
sprint_speed_factor = 0.9
sprint_cost_factor = 0.5
grab_mod = 1.25 //humans are wily fuckers - geeves
climb_coeff = 1
inherent_verbs = list(

View File

@@ -9,11 +9,13 @@
deform = 'icons/mob/human_races/human/r_offworlder.dmi'
preview_icon = 'icons/mob/human_races/human/offworlder_preview.dmi'
flash_mod = 1.2
oxy_mod = 0.8
brute_mod = 1.2
toxins_mod = 1.2
flash_mod = 1.2
oxy_mod = 0.8
brute_mod = 1.2
toxins_mod = 1.2
bleed_mod = 0.5
grab_mod = 1.1
resist_mod = 0.75
warning_low_pressure = 30
hazard_low_pressure = 10

View File

@@ -38,6 +38,10 @@
brute_mod = 1.0
burn_mod = 1.2
grab_mod = 1.1 // Smooth, no real edges to grab onto
resist_mod = 2 // Robotic strength
show_ssd = "flashing a 'system offline' glyph on their monitor"
death_message = "gives one shrill beep before falling lifeless."

View File

@@ -7,6 +7,7 @@
neuter_ipc = FALSE
burn_mod = 1.2
grab_mod = 1
blurb = "IPCs with humanlike properties. Their focus is on service, civilian, and medical, but there are no \
job restrictions. Created in the late days of 2457, the Shell is a controversial IPC model equipped with a synthskin weave applied over its metal chassis \
@@ -111,6 +112,10 @@
brute_mod = 0.8
burn_mod = 1.1
grab_mod = 0.8 // Big, easy to grab onto
resist_mod = 10 // Good luck wrestling against this powerhouse.
slowdown = 4
blurb = "The first commercialized attempt Hephaestus Industries made at an industrial-type IPC. Designed for extra durability and increased weight loads, the first generation Industrial was considered a success, though it possessed some issues. A limited power cell and actuators designed for heavy lifting and not locomotion resulted in a slow and frequently charging machine. A special addition to the chassis makes up for these drawbacks - the ability to simply slot a suit cooling unit onto the model's back and make use of its built-in heat transferal conduits, allowing the Industrial to perform EVA without any extra peripherals such as a voidsuit."
@@ -188,6 +193,10 @@
brute_mod = 0.3
burn_mod = 0.5
grab_mod = 0.9
resist_mod = 10
flash_mod = 0
siemens_coefficient = 0
breakcuffs = list(MALE,FEMALE,NEUTER)
@@ -352,6 +361,9 @@
brute_mod = 1.5
sprint_speed_factor = 1.5
grab_mod = 1.1 // Smooth, fast
resist_mod = 4 // Not super strong, but still rather strong
appearance_flags = HAS_EYE_COLOR
examine_color = "#ff00ff"
@@ -395,6 +407,8 @@
max_nutrition_factor = 1.75
brute_mod = 1.2
grab_mod = 1.1
resist_mod = 4
appearance_flags = HAS_EYE_COLOR
@@ -436,6 +450,7 @@
eyes = "eyes_s"
bald = 1
grab_mod = 1.1 //pity points - geeves
appearance_flags = HAS_EYE_COLOR
spawn_flags = IS_RESTRICTED
@@ -460,4 +475,4 @@
/datum/species/machine/unbranded/get_light_color(mob/living/carbon/human/H)
if (istype(H))
return rgb(H.r_eyes, H.g_eyes, H.b_eyes)
return rgb(H.r_eyes, H.g_eyes, H.b_eyes)

View File

@@ -36,7 +36,8 @@
brute_mod = 1.5
burn_mod = 1.5
fall_mod = 0.5
grab_mod = 2
grab_mod = 1.25
resist_mod = 0.25
natural_climbing = 1
spawn_flags = IS_RESTRICTED

View File

@@ -24,7 +24,8 @@
name_language = LANGUAGE_SKRELLIAN
rarity_value = 3
grab_mod = 1.25
grab_mod = 2
resist_mod = 0.5 // LIKE BABBY
spawn_flags = CAN_JOIN | IS_WHITELISTED
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_SOCKS

View File

@@ -15,6 +15,8 @@
rarity_value = 5
virus_immune = 1
fall_mod = 0
grab_mod = 1.5
resist_mod = 0.25
blood_color = "#05FF9B"
flesh_color = "#05FFFB"

View File

@@ -16,8 +16,12 @@
)
darksight = 8
slowdown = -1
brute_mod = 1.2
fall_mod = 0.5
grab_mod = 1.25 // Fur easy to cling onto
num_alternate_languages = 2
secondary_langs = list(LANGUAGE_SIIK_MAAS, LANGUAGE_SIIK_TAJR, LANGUAGE_YA_SSA)
name_language = LANGUAGE_SIIK_MAAS

View File

@@ -18,6 +18,8 @@
ethanol_resistance = 1 // Default value
climb_coeff = 1.1
resist_mod = 2 // ZHAN POWERRRRRR
cold_level_1 = 160 //RaceDefault 200 Default 260
cold_level_2 = 100 //RaceDefault 140 Default 200
cold_level_3 = 50 //RaceDefault 80 Default 120

View File

@@ -18,9 +18,12 @@
darksight = 3
gluttonous = 2
slowdown = 0.5
brute_mod = 0.8
grab_mod = 0.75
fall_mod = 1.2
grab_mod = 1.25 // Huge, usually have horns
resist_mod = 2.5 // Arguably our strongest organic species
ethanol_resistance = 0.4
taste_sensitivity = TASTE_SENSITIVE
economic_modifier = 7
@@ -28,11 +31,14 @@
num_alternate_languages = 2
secondary_langs = list(LANGUAGE_UNATHI, LANGUAGE_AZAZIBA)
name_language = LANGUAGE_UNATHI
stamina = 120 // Unathi have the shortest but fastest sprint of all
sprint_speed_factor = 3.2
stamina_recovery = 5
sprint_cost_factor = 1.45
sprint_speed_factor = 3.2
exhaust_threshold = 65
rarity_value = 3
breakcuffs = list(MALE)
mob_size = 10

View File

@@ -25,12 +25,17 @@
darksight = 8 //USELESS
eyes = "vaurca_eyes" //makes it so that eye colour is not changed when skin colour is.
eyes_are_impermeable = TRUE
brute_mod = 0.5
burn_mod = 1.5 //2x was a bit too much. we'll see how this goes.
toxins_mod = 2 //they're not used to all our weird human bacteria.
oxy_mod = 0.6
radiation_mod = 0.2 //almost total radiation protection
bleed_mod = 2.2
grab_mod = 1.1
resist_mod = 1.75
warning_low_pressure = 50
hazard_low_pressure = 0
ethanol_resistance = 2

View File

@@ -7,11 +7,15 @@
greater_form = "Vaurca Breeder"
icobase = 'icons/mob/human_races/vaurca/r_vaurcab.dmi'
slowdown = 0
brute_mod = 0.7
burn_mod = 1.2
oxy_mod = 1
radiation_mod = 0.5
grab_mod = 1.25
resist_mod = 1.75
mob_size = 10 //fairly lighter than the worker type.
taste_sensitivity = TASTE_DULL
blurb = "Type BA, a sub-type of the generic Type B Warriors, are the second most prominent type of Vaurca society, taking the form of hive security and military grunts. \

View File

@@ -697,7 +697,7 @@ default behaviour is:
/mob/living/var/last_resist
/mob/living/proc/resist_grab()
if (last_resist + 4 > world.time)
if(last_resist + 8 > world.time)
return
last_resist = world.time
if(stunned > 10)
@@ -708,23 +708,39 @@ default behaviour is:
requests.Remove(O)
qdel(O)
resisting++
var/resist_power = get_resist_power() // How easily the mob can break out of a grab
for(var/obj/item/grab/G in grabbed_by)
resisting++
var/resist_chance
var/resist_msg
switch(G.state)
if(GRAB_PASSIVE)
qdel(G)
if(incapacitated(INCAPACITATION_DISABLED) || src.lying)
resist_chance = 30 * resist_power
else
resist_chance = 70 * resist_power //only a bit difficult to break out of a passive grab
resist_msg = span("warning", "[src] pulls away from [G.assailant]'s grip!")
if(GRAB_AGGRESSIVE)
if(incapacitated(INCAPACITATION_KNOCKDOWN)? prob(15) : prob(60))
visible_message("<span class='warning'>[src] has broken free of [G.assailant]'s grip!</span>")
qdel(G)
if(incapacitated(INCAPACITATION_DISABLED) || src.lying)
resist_chance = 15 * resist_power
else
resist_chance = 50 * resist_power
resist_msg = span("warning", "[src] has broken free of [G.assailant]'s grip!")
if(GRAB_NECK)
//If the you move when grabbing someone then it's easier for them to break free. Same if the affected mob is immune to stun.
if (((world.time - G.assailant.l_move_time < 30 || !stunned) && prob(15)) || prob(3))
visible_message("<span class='warning'>[src] has broken free of [G.assailant]'s headlock!</span>")
qdel(G)
if(world.time - G.assailant.l_move_time < 30 || !stunned || !src.lying || incapacitated(INCAPACITATION_DISABLED))
resist_chance = 15 * resist_power
else
resist_chance = 3 * resist_power
resist_msg = span("danger", "[src] has broken free of [G.assailant]'s headlock!")
if(prob(resist_chance))
visible_message(resist_msg)
qdel(G)
if(resisting)
visible_message("<span class='danger'>[src] resists!</span>")
setClickCooldown(20)
visible_message(span("warning", "[src] resists!"))
setClickCooldown(25)
/mob/living/verb/lay_down()
set name = "Rest"
@@ -876,6 +892,8 @@ default behaviour is:
src.composition_reagent_quantity = size_reagent
#undef PPM
/mob/living/proc/get_resist_power()
return 1
/mob/living/proc/seizure()
if(!paralysis && stat == CONSCIOUS)

View File

@@ -146,7 +146,7 @@
if(affecting.loc != assailant.loc)
force_down = 0
else
affecting.Weaken(2)
affecting.Weaken(4)
if(state >= GRAB_NECK)
affecting.Stun(3)
@@ -155,13 +155,13 @@
L.adjustOxyLoss(1)
if(state >= GRAB_KILL)
//affecting.apply_effect(STUTTER, 5) //would do this, but affecting isn't declared as mob/living for some stupid reason.
affecting.stuttering = max(affecting.stuttering, 5) //It will hamper your voice, being choked and all.
affecting.Weaken(5) //Should keep you down unless you get help.
affecting.Weaken(7) //Should keep you down unless you get help.
if(ishuman(affecting))
var/mob/living/carbon/human/A = affecting
if (!(A.species.flags & NO_BREATHE))
A.losebreath = max(A.losebreath + 2, 3)
if(!(A.species.flags & NO_BREATHE))
A.losebreath = max(A.losebreath + 3, 5)
A.adjustOxyLoss(3)
adjust_position()
@@ -172,12 +172,12 @@
switch(target_zone)
if(BP_MOUTH)
if(announce)
user.visible_message("<span class='warning'>\The [user] covers [target]'s face!</span>")
user.visible_message(span("warning", "\The [user] covers [target]'s face!"))
if(target.silent < 3)
target.silent = 3
if(BP_EYES)
if(announce)
assailant.visible_message("<span class='warning'>[assailant] covers [affecting]'s eyes!</span>")
assailant.visible_message(span("warning", "[assailant] covers [affecting]'s eyes!"))
if(affecting.eye_blind < 3)
affecting.eye_blind = 3
@@ -188,7 +188,7 @@
//Updating pixelshift, position and direction
//Gets called on process, when the grab gets upgraded or the assailant moves
/obj/item/grab/proc/adjust_position()
if (!affecting)
if(!affecting)
return
if(affecting.buckled)
animate(affecting, pixel_x = 0, pixel_y = 0, 4, 1, LINEAR_EASING)
@@ -257,9 +257,9 @@
if(!allow_upgrade)
return
if(!affecting.lying)
assailant.visible_message("<span class='warning'>[assailant] has grabbed [affecting] aggressively (now hands)!</span>")
assailant.visible_message(span("warning", "[assailant] grabs [affecting] aggressively by the hands!"))
else
assailant.visible_message("<span class='warning'>[assailant] pins [affecting] down to the ground (now hands)!</span>")
assailant.visible_message(span("warning", "[assailant] pins [affecting] down to the ground by the hands!"))
apply_pinning(affecting, assailant)
state = GRAB_AGGRESSIVE
@@ -267,13 +267,11 @@
hud.icon_state = "reinforce1"
else if(state < GRAB_NECK)
if(isslime(affecting))
to_chat(assailant, "<span class='notice'>You squeeze [affecting], but nothing interesting happens.</span>")
to_chat(assailant, span("notice", "You try to squeeze [affecting], but your hands sink right through!"))
return
assailant.visible_message("<span class='warning'>[assailant] has reinforced \his grip on [affecting] (now neck)!</span>")
assailant.visible_message(span("warning", "[assailant] reinforces \his grip on [affecting]'s neck'!"))
state = GRAB_NECK
icon_state = "grabbed+1"
assailant.set_dir(get_dir(assailant, affecting))
affecting.attack_log += "\[[time_stamp()]\] <font color='orange'>Has had their neck grabbed by [assailant.name] ([assailant.ckey])</font>"
assailant.attack_log += "\[[time_stamp()]\] <font color='red'>Grabbed the neck of [affecting.name] ([affecting.ckey])</font>"
msg_admin_attack("[key_name_admin(assailant)] grabbed the neck of [key_name_admin(affecting)]",ckey=key_name(assailant),ckey_target=key_name(affecting))
@@ -281,21 +279,31 @@
hud.name = "kill"
affecting.Stun(10) //10 ticks of ensured grab
else if(state < GRAB_UPGRADING)
assailant.visible_message("<span class='danger'>[assailant] starts to tighten \his grip on [affecting]'s neck!</span>")
if(ishuman(affecting))
var/mob/living/carbon/human/H = affecting
if(H.head && (H.head.item_flags & AIRTIGHT))
to_chat(assailant, span("warning", "[H]'s headgear prevents you from choking them out!"))
return
hud.icon_state = "kill1"
hud.name = "loosen"
state = GRAB_KILL
assailant.visible_message("<span class='danger'>[assailant] has tightened \his grip on [affecting]'s neck!</span>")
affecting.attack_log += "\[[time_stamp()]\] <font color='orange'>Has been strangled (kill intent) by [assailant.name] ([assailant.ckey])</font>"
assailant.attack_log += "\[[time_stamp()]\] <font color='red'>Strangled (kill intent) [affecting.name] ([affecting.ckey])</font>"
msg_admin_attack("[key_name_admin(assailant)] strangled (kill intent) [key_name_admin(affecting)]",ckey=key_name(assailant),ckey_target=key_name(affecting))
assailant.visible_message(span("danger", "[assailant] starts strangling [affecting]!"))
affecting.attack_log += "\[[time_stamp()]\] <font color='orange'>is being strangled by [assailant.name] ([assailant.ckey])</font>"
assailant.attack_log += "\[[time_stamp()]\] <font color='red'>is strangling [affecting.name] ([affecting.ckey])</font>"
msg_admin_attack("[key_name_admin(assailant)] is strangling [key_name_admin(affecting)]",ckey=key_name(assailant),ckey_target=key_name(affecting))
affecting.setClickCooldown(10)
if(ishuman(affecting))
var/mob/living/carbon/human/A = affecting
if (!(A.species.flags & NO_BREATHE))
A.losebreath += 1
A.losebreath += 4
affecting.set_dir(WEST)
else if(state == GRAB_KILL)
hud.icon_state = "kill"
hud.name = "kill"
state = GRAB_NECK
assailant.visible_message(span("warning", "[assailant] stops strangling [affecting]!"))
adjust_position()
//This is used to make sure the victim hasn't managed to yackety sax away before using the grab.
@@ -334,7 +342,7 @@
switch(assailant.a_intent)
if(I_HELP)
if(force_down)
to_chat(assailant, "<span class='warning'>You are no longer pinning [affecting] to the ground.</span>")
to_chat(assailant, span("warning", "You are no longer pinning [affecting] to the ground."))
force_down = 0
return
inspect_organ(affecting, assailant, hit_zone)
@@ -367,7 +375,7 @@
/obj/item/grab/proc/reset_kill_state()
if(state == GRAB_KILL)
assailant.visible_message("<span class='warning'>[assailant] lost \his tight grip on [affecting]'s neck!</span>")
assailant.visible_message(span("danger", "[assailant] stops strangling [affecting] to move."))
hud.icon_state = "kill"
state = GRAB_NECK