mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-26 01:52:15 +00:00
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:
@@ -153,3 +153,6 @@
|
||||
return null
|
||||
|
||||
return O
|
||||
|
||||
/mob/living/carbon/human/get_resist_power()
|
||||
return species.resist_mod
|
||||
@@ -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.
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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. \
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user